summaryrefslogtreecommitdiff
path: root/src/scanner.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/scanner.c')
-rw-r--r--src/scanner.c48
1 files changed, 32 insertions, 16 deletions
diff --git a/src/scanner.c b/src/scanner.c
index daf1b15..9181868 100644
--- a/src/scanner.c
+++ b/src/scanner.c
@@ -99,6 +99,9 @@ struct ScannerPrivate
/* Last option read */
SANE_Int option_index;
+
+ /* Option index for scan area */
+ SANE_Int br_x_option_index, br_y_option_index;
/* Buffer for received line */
SANE_Byte *buffer;
@@ -869,6 +872,8 @@ do_open (Scanner *scanner)
scanner->priv->page_number = 0;
scanner->priv->notified_page = -1;
scanner->priv->option_index = 0;
+ scanner->priv->br_x_option_index = 0;
+ scanner->priv->br_y_option_index = 0;
if (!job->device && scanner->priv->default_device)
job->device = g_strdup (scanner->priv->default_device);
@@ -919,7 +924,7 @@ do_get_option (Scanner *scanner)
const SANE_Option_Descriptor *option;
SANE_Int option_index;
ScanJob *job;
-
+
job = (ScanJob *) scanner->priv->job_queue->data;
option = sane_get_option_descriptor (scanner->priv->handle, scanner->priv->option_index);
@@ -928,6 +933,28 @@ do_get_option (Scanner *scanner)
scanner->priv->option_index++;
if (!option) {
+ /* Always use maximum scan area - some scanners default to using partial areas. This should be patched in sane-backends */
+ if (scanner->priv->br_x_option_index) {
+ option = sane_get_option_descriptor (scanner->priv->handle, scanner->priv->br_x_option_index);
+ g_debug ("sane_get_option_descriptor (%d)", scanner->priv->br_x_option_index);
+ if (option->constraint_type == SANE_CONSTRAINT_RANGE) {
+ if (option->type == SANE_TYPE_FIXED)
+ set_fixed_option (scanner->priv->handle, option, scanner->priv->br_x_option_index, SANE_UNFIX (option->constraint.range->max), NULL);
+ else
+ set_int_option (scanner->priv->handle, option, scanner->priv->br_x_option_index, option->constraint.range->max, NULL);
+ }
+ }
+ if (scanner->priv->br_y_option_index) {
+ option = sane_get_option_descriptor (scanner->priv->handle, scanner->priv->br_y_option_index);
+ g_debug ("sane_get_option_descriptor (%d)", scanner->priv->br_y_option_index);
+ if (option->constraint_type == SANE_CONSTRAINT_RANGE) {
+ if (option->type == SANE_TYPE_FIXED)
+ set_fixed_option (scanner->priv->handle, option, scanner->priv->br_y_option_index, SANE_UNFIX (option->constraint.range->max), NULL);
+ else
+ set_int_option (scanner->priv->handle, option, scanner->priv->br_y_option_index, option->constraint.range->max, NULL);
+ }
+ }
+
scanner->priv->state = STATE_START;
return;
}
@@ -1091,21 +1118,10 @@ do_get_option (Scanner *scanner)
if (!set_constrained_string_option (scanner->priv->handle, option, option_index, disable_compression_names, NULL))
g_warning ("Unable to disable compression, please file a bug");
}
- /* Always use maximum scan area - some scanners default to using partial areas. This should be patched in sane-backends */
- else if (strcmp (option->name, SANE_NAME_SCAN_BR_X) == 0 ||
- strcmp (option->name, SANE_NAME_SCAN_BR_Y) == 0) {
- switch (option->constraint_type)
- {
- case SANE_CONSTRAINT_RANGE:
- if (option->type == SANE_TYPE_FIXED)
- set_fixed_option (scanner->priv->handle, option, option_index, SANE_UNFIX (option->constraint.range->max), NULL);
- else
- set_int_option (scanner->priv->handle, option, option_index, option->constraint.range->max, NULL);
- break;
- default:
- break;
- }
- }
+ else if (strcmp (option->name, SANE_NAME_SCAN_BR_X) == 0)
+ scanner->priv->br_x_option_index = option_index;
+ else if (strcmp (option->name, SANE_NAME_SCAN_BR_Y) == 0)
+ scanner->priv->br_y_option_index = option_index;
else if (strcmp (option->name, SANE_NAME_PAGE_WIDTH) == 0) {
if (job->page_width > 0.0) {
if (option->type == SANE_TYPE_FIXED)