Sanitize option handling and add support for scanner buttons.

merge-requests/1/head
Jan Hauffa 2011-04-24 13:55:35 +02:00 zatwierdzone przez m. allan noah
rodzic b2b3cf767a
commit bc203e8aa1
6 zmienionych plików z 123 dodań i 41 usunięć

Wyświetl plik

@ -109,7 +109,7 @@ static const Scanner_Model mustek_A2nu2_model = {
"Mustek", /* device vendor string */ "Mustek", /* device vendor string */
"BearPaw 2448TA Pro", /* device model name */ "BearPaw 2448TA Pro", /* device model name */
{1200, 600, 300, 150, 75, 0}, /* possible resolutions */ {5 /* count */, 1200, 600, 300, 150, 75}, /* possible resolutions */
SANE_FIX (8.5 * MM_PER_INCH), /* size of scan area in mm (x) */ SANE_FIX (8.5 * MM_PER_INCH), /* size of scan area in mm (x) */
SANE_FIX (11.8 * MM_PER_INCH), /* size of scan area in mm (y) */ SANE_FIX (11.8 * MM_PER_INCH), /* size of scan area in mm (y) */
@ -117,7 +117,21 @@ static const Scanner_Model mustek_A2nu2_model = {
SANE_FIX (1.46 * MM_PER_INCH), /* size of scan area in TA mode in mm (x) */ SANE_FIX (1.46 * MM_PER_INCH), /* size of scan area in TA mode in mm (x) */
SANE_FIX (6.45 * MM_PER_INCH), /* size of scan area in TA mode in mm (y) */ SANE_FIX (6.45 * MM_PER_INCH), /* size of scan area in TA mode in mm (y) */
SANE_FALSE /* invert order of the CCD/CIS colors? */ SANE_FALSE, /* invert order of the CCD/CIS colors? */
5, /* number of buttons */
/* button names */
{SANE_NAME_SCAN, SANE_NAME_COPY, SANE_NAME_FAX, SANE_NAME_EMAIL,
"panel"},
/* button titles */
{SANE_TITLE_SCAN, SANE_TITLE_COPY, SANE_TITLE_FAX, SANE_TITLE_EMAIL,
"Panel button"},
/* button descriptions */
{SANE_DESC_SCAN, SANE_DESC_COPY, SANE_DESC_FAX, SANE_DESC_EMAIL,
SANE_I18N ("Panel button")}
}; };
@ -128,7 +142,7 @@ calc_parameters (Mustek_Scanner * s, TARGETIMAGE * pTarget)
float x1, y1, x2, y2; float x1, y1, x2, y2;
DBG_ENTER (); DBG_ENTER ();
if (s->val[OPT_PREVIEW].w) if (s->val[OPT_PREVIEW].b)
pTarget->wXDpi = 75; pTarget->wXDpi = 75;
else else
pTarget->wXDpi = s->val[OPT_RESOLUTION].w; pTarget->wXDpi = s->val[OPT_RESOLUTION].w;
@ -158,7 +172,7 @@ calc_parameters (Mustek_Scanner * s, TARGETIMAGE * pTarget)
val = s->val[OPT_MODE].s; val = s->val[OPT_MODE].s;
if (strcmp (val, mode_list[CM_RGB48]) == 0) if (strcmp (val, mode_list[CM_RGB48]) == 0)
{ {
if (s->val[OPT_PREVIEW].w) if (s->val[OPT_PREVIEW].b)
{ {
DBG (DBG_DET, "preview, set color mode CM_RGB24\n"); DBG (DBG_DET, "preview, set color mode CM_RGB24\n");
pTarget->cmColorMode = CM_RGB24; pTarget->cmColorMode = CM_RGB24;
@ -172,7 +186,7 @@ calc_parameters (Mustek_Scanner * s, TARGETIMAGE * pTarget)
} }
else if (strcmp (val, mode_list[CM_GRAY16]) == 0) else if (strcmp (val, mode_list[CM_GRAY16]) == 0)
{ {
if (s->val[OPT_PREVIEW].w) if (s->val[OPT_PREVIEW].b)
{ {
DBG (DBG_DET, "preview, set color mode CM_GRAY8\n"); DBG (DBG_DET, "preview, set color mode CM_GRAY8\n");
pTarget->cmColorMode = CM_GRAY8; pTarget->cmColorMode = CM_GRAY8;
@ -225,6 +239,14 @@ calc_parameters (Mustek_Scanner * s, TARGETIMAGE * pTarget)
DBG_LEAVE (); DBG_LEAVE ();
} }
static void
update_button_status (Mustek_Scanner * s)
{
SANE_Byte key;
if (Scanner_GetKeyStatus (&s->state, &key) == SANE_STATUS_GOOD)
s->val[OPT_BUTTON_1 + key].b = SANE_TRUE;
}
static size_t static size_t
max_string_size (SANE_String_Const *strings) max_string_size (SANE_String_Const *strings)
{ {
@ -245,8 +267,7 @@ init_options (Mustek_Scanner * s)
{ {
SANE_Status status; SANE_Status status;
SANE_Bool hasTA; SANE_Bool hasTA;
SANE_Int option, count = 0; SANE_Int i, option;
SANE_Word *dpi_list;
TARGETIMAGE target; TARGETIMAGE target;
DBG_ENTER (); DBG_ENTER ();
@ -298,14 +319,6 @@ init_options (Mustek_Scanner * s)
s->opt[OPT_SOURCE].cap |= SANE_CAP_INACTIVE; s->opt[OPT_SOURCE].cap |= SANE_CAP_INACTIVE;
/* resolution */ /* resolution */
while (s->model.dpi_values[count] != 0)
count++;
dpi_list = malloc ((count + 1) * sizeof (SANE_Word));
if (!dpi_list)
return SANE_STATUS_NO_MEM;
dpi_list[0] = count;
memcpy (&dpi_list[1], s->model.dpi_values, count * sizeof (SANE_Word));
s->opt[OPT_RESOLUTION].name = SANE_NAME_SCAN_RESOLUTION; s->opt[OPT_RESOLUTION].name = SANE_NAME_SCAN_RESOLUTION;
s->opt[OPT_RESOLUTION].title = SANE_TITLE_SCAN_RESOLUTION; s->opt[OPT_RESOLUTION].title = SANE_TITLE_SCAN_RESOLUTION;
s->opt[OPT_RESOLUTION].desc = SANE_DESC_SCAN_RESOLUTION; s->opt[OPT_RESOLUTION].desc = SANE_DESC_SCAN_RESOLUTION;
@ -313,8 +326,8 @@ init_options (Mustek_Scanner * s)
s->opt[OPT_RESOLUTION].unit = SANE_UNIT_DPI; s->opt[OPT_RESOLUTION].unit = SANE_UNIT_DPI;
s->opt[OPT_RESOLUTION].size = sizeof (SANE_Word); s->opt[OPT_RESOLUTION].size = sizeof (SANE_Word);
s->opt[OPT_RESOLUTION].constraint_type = SANE_CONSTRAINT_WORD_LIST; s->opt[OPT_RESOLUTION].constraint_type = SANE_CONSTRAINT_WORD_LIST;
s->opt[OPT_RESOLUTION].constraint.word_list = dpi_list; s->opt[OPT_RESOLUTION].constraint.word_list = s->model.dpi_values;
s->val[OPT_RESOLUTION].w = dpi_list[1]; s->val[OPT_RESOLUTION].w = s->model.dpi_values[1];
/* preview */ /* preview */
s->opt[OPT_PREVIEW].name = SANE_NAME_PREVIEW; s->opt[OPT_PREVIEW].name = SANE_NAME_PREVIEW;
@ -322,7 +335,7 @@ init_options (Mustek_Scanner * s)
s->opt[OPT_PREVIEW].desc = SANE_DESC_PREVIEW; s->opt[OPT_PREVIEW].desc = SANE_DESC_PREVIEW;
s->opt[OPT_PREVIEW].type = SANE_TYPE_BOOL; s->opt[OPT_PREVIEW].type = SANE_TYPE_BOOL;
s->opt[OPT_PREVIEW].size = sizeof (SANE_Word); s->opt[OPT_PREVIEW].size = sizeof (SANE_Word);
s->val[OPT_PREVIEW].w = SANE_FALSE; s->val[OPT_PREVIEW].b = SANE_FALSE;
/* "enhancement" group */ /* "enhancement" group */
s->opt[OPT_ENHANCEMENT_GROUP].name = SANE_NAME_ENHANCEMENT; s->opt[OPT_ENHANCEMENT_GROUP].name = SANE_NAME_ENHANCEMENT;
@ -399,7 +412,42 @@ init_options (Mustek_Scanner * s)
s->opt[OPT_BR_Y].constraint.range = &y_range; s->opt[OPT_BR_Y].constraint.range = &y_range;
s->val[OPT_BR_Y].w = y_range.max; s->val[OPT_BR_Y].w = y_range.max;
/* "sensors" group */
s->opt[OPT_SENSORS_GROUP].title = SANE_TITLE_SENSORS;
s->opt[OPT_SENSORS_GROUP].name = SANE_NAME_SENSORS;
s->opt[OPT_SENSORS_GROUP].desc = SANE_DESC_SENSORS;
s->opt[OPT_SENSORS_GROUP].type = SANE_TYPE_GROUP;
s->opt[OPT_SENSORS_GROUP].cap = SANE_CAP_ADVANCED;
s->opt[OPT_SENSORS_GROUP].constraint_type = SANE_CONSTRAINT_NONE;
/* scanner buttons */
for (i = OPT_BUTTON_1; i <= OPT_BUTTON_5; i++)
{
SANE_Int idx = i - OPT_BUTTON_1;
if (idx < s->model.buttons)
{
s->opt[i].name = s->model.button_name[idx];
s->opt[i].title = s->model.button_title[idx];
s->opt[i].desc = s->model.button_desc[idx];
s->opt[i].cap = SANE_CAP_HARD_SELECT | SANE_CAP_SOFT_DETECT |
SANE_CAP_ADVANCED;
}
else
{
s->opt[i].name = SANE_I18N ("unused");
s->opt[i].title = SANE_I18N ("unused button");
s->opt[i].cap |= SANE_CAP_INACTIVE;
}
s->opt[i].type = SANE_TYPE_BOOL;
s->opt[i].unit = SANE_UNIT_NONE;
s->opt[i].size = sizeof (SANE_Word);
s->opt[i].constraint_type = SANE_CONSTRAINT_NONE;
s->val[i].b = SANE_FALSE;
}
calc_parameters (s, &target); calc_parameters (s, &target);
update_button_status (s);
DBG_LEAVE (); DBG_LEAVE ();
return SANE_STATUS_GOOD; return SANE_STATUS_GOOD;
@ -453,9 +501,9 @@ sane_get_devices (const SANE_Device *** device_list,
if (!sane_device) if (!sane_device)
return SANE_STATUS_NO_MEM; return SANE_STATUS_NO_MEM;
sane_device->name = strdup (device_name); sane_device->name = strdup (device_name);
sane_device->vendor = strdup ("Mustek"); sane_device->vendor = "Mustek";
sane_device->model = strdup ("BearPaw 2448 TA Pro"); sane_device->model = "BearPaw 2448 TA Pro";
sane_device->type = strdup ("flatbed scanner"); sane_device->type = "flatbed scanner";
devlist[0] = sane_device; devlist[0] = sane_device;
} }
*device_list = devlist; *device_list = devlist;
@ -506,6 +554,9 @@ sane_close (SANE_Handle handle)
free (s->scan_buf); free (s->scan_buf);
s->scan_buf = NULL; s->scan_buf = NULL;
free (s->val[OPT_MODE].s);
free (s->val[OPT_SOURCE].s);
free (handle); free (handle);
DBG_LEAVE (); DBG_LEAVE ();
@ -568,7 +619,6 @@ sane_control_option (SANE_Handle handle, SANE_Int option,
/* word options: */ /* word options: */
case OPT_NUM_OPTS: case OPT_NUM_OPTS:
case OPT_RESOLUTION: case OPT_RESOLUTION:
case OPT_PREVIEW:
case OPT_THRESHOLD: case OPT_THRESHOLD:
case OPT_TL_X: case OPT_TL_X:
case OPT_TL_Y: case OPT_TL_Y:
@ -576,13 +626,33 @@ sane_control_option (SANE_Handle handle, SANE_Int option,
case OPT_BR_Y: case OPT_BR_Y:
*(SANE_Word *) val = s->val[option].w; *(SANE_Word *) val = s->val[option].w;
break; break;
/* boolean options: */
case OPT_PREVIEW:
*(SANE_Bool *) val = s->val[option].b;
break;
/* string options: */ /* string options: */
case OPT_MODE: case OPT_MODE:
strcpy (val, s->val[option].s);
break;
case OPT_SOURCE: case OPT_SOURCE:
strcpy (val, s->val[option].s); strcpy (val, s->val[option].s);
break; break;
/* buttons: */
case OPT_BUTTON_1:
case OPT_BUTTON_2:
case OPT_BUTTON_3:
case OPT_BUTTON_4:
case OPT_BUTTON_5:
if ((option - OPT_BUTTON_1) < s->model.buttons)
{
update_button_status (s);
*(SANE_Bool *) val = s->val[option].b;
s->val[option].b = SANE_FALSE;
}
else
{
DBG (DBG_WARN, "invalid button option %d\n", option);
*(SANE_Bool *) val = SANE_FALSE;
}
break;
default: default:
DBG (DBG_ERR, "unknown option %d\n", option); DBG (DBG_ERR, "unknown option %d\n", option);
} }
@ -605,9 +675,12 @@ sane_control_option (SANE_Handle handle, SANE_Int option,
switch (option) switch (option)
{ {
/* (mostly) side-effect-free word options: */ /* side-effect-free word options: */
case OPT_THRESHOLD:
s->val[option].w = *(SANE_Word *) val;
break;
/* word options with side effects: */
case OPT_RESOLUTION: case OPT_RESOLUTION:
case OPT_PREVIEW:
case OPT_TL_X: case OPT_TL_X:
case OPT_TL_Y: case OPT_TL_Y:
case OPT_BR_X: case OPT_BR_X:
@ -616,10 +689,13 @@ sane_control_option (SANE_Handle handle, SANE_Int option,
calc_parameters (s, &target); calc_parameters (s, &target);
myinfo |= SANE_INFO_RELOAD_PARAMS; myinfo |= SANE_INFO_RELOAD_PARAMS;
break; break;
case OPT_THRESHOLD: /* boolean options with side effects: */
s->val[option].w = *(SANE_Word *) val; case OPT_PREVIEW:
s->val[option].b = *(SANE_Bool *) val;
calc_parameters (s, &target);
myinfo |= SANE_INFO_RELOAD_PARAMS;
break; break;
/* side-effect-free word-array options: */ /* string array options with side effects: */
case OPT_MODE: case OPT_MODE:
free (s->val[option].s); free (s->val[option].s);
s->val[option].s = strdup (val); s->val[option].s = strdup (val);
@ -729,6 +805,7 @@ sane_start (SANE_Handle handle)
DBG (DBG_INFO, "target.cmColorMode=%d\n", target.cmColorMode); DBG (DBG_INFO, "target.cmColorMode=%d\n", target.cmColorMode);
DBG (DBG_INFO, "target.ssScanSource=%d\n", target.ssScanSource); DBG (DBG_INFO, "target.ssScanSource=%d\n", target.ssScanSource);
/* TODO: move to mustek_usb2_high */
s->bInvertImage = ((target.cmColorMode == CM_TEXT) ^ s->bInvertImage = ((target.cmColorMode == CM_TEXT) ^
(target.ssScanSource == SS_NEGATIVE)); (target.ssScanSource == SS_NEGATIVE));
s->read_rows = s->params.lines; s->read_rows = s->params.lines;

Wyświetl plik

@ -54,6 +54,7 @@
#define SCAN_BUFFER_SIZE (64 * 1024) #define SCAN_BUFFER_SIZE (64 * 1024)
#define MAX_RESOLUTIONS 12 #define MAX_RESOLUTIONS 12
#define MAX_BUTTONS 5
#define DEF_LINEARTTHRESHOLD 128 #define DEF_LINEARTTHRESHOLD 128
@ -75,6 +76,13 @@ enum
OPT_BR_X, /* bottom-right x */ OPT_BR_X, /* bottom-right x */
OPT_BR_Y, /* bottom-right y */ OPT_BR_Y, /* bottom-right y */
OPT_SENSORS_GROUP,
OPT_BUTTON_1,
OPT_BUTTON_2,
OPT_BUTTON_3,
OPT_BUTTON_4,
OPT_BUTTON_5,
/* must come last: */ /* must come last: */
NUM_OPTIONS NUM_OPTIONS
}; };
@ -101,6 +109,12 @@ typedef struct
SANE_Bool isRGBInvert; /* order of the CCD/CIS colors: SANE_Bool isRGBInvert; /* order of the CCD/CIS colors:
RGB if SANE_False, BGR otherwise */ RGB if SANE_False, BGR otherwise */
SANE_Int buttons; /* number of buttons on the scanner */
/* option names, titles, and descriptions for the buttons */
SANE_String_Const button_name[MAX_BUTTONS];
SANE_String_Const button_title[MAX_BUTTONS];
SANE_String_Const button_desc[MAX_BUTTONS];
/*@} */ /*@} */
} Scanner_Model; } Scanner_Model;

Wyświetl plik

@ -2435,7 +2435,6 @@ Asic_ReadImage (ASIC * chip, SANE_Byte * pBuffer, unsigned short LinesCount)
return status; return status;
} }
#if SANE_UNUSED
SANE_Status SANE_Status
Asic_CheckFunctionKey (ASIC * chip, SANE_Byte * key) Asic_CheckFunctionKey (ASIC * chip, SANE_Byte * key)
{ {
@ -2461,8 +2460,8 @@ Asic_CheckFunctionKey (ASIC * chip, SANE_Byte * key)
if (status != SANE_STATUS_GOOD) if (status != SANE_STATUS_GOOD)
return status; return status;
bBuffer_1 = ~bBuffer1; bBuffer_1 = ~bBuffer_1;
bBuffer_2 = ~bBuffer2; bBuffer_2 = ~bBuffer_2;
if (bBuffer_1 & 0x10) if (bBuffer_1 & 0x10)
*key = 1; /* Scan key pressed */ *key = 1; /* Scan key pressed */
@ -2481,7 +2480,6 @@ Asic_CheckFunctionKey (ASIC * chip, SANE_Byte * key)
DBG_ASIC_LEAVE (); DBG_ASIC_LEAVE ();
return SANE_STATUS_GOOD; return SANE_STATUS_GOOD;
} }
#endif
SANE_Status SANE_Status
Asic_IsTAConnected (ASIC * chip, SANE_Bool * hasTA) Asic_IsTAConnected (ASIC * chip, SANE_Bool * hasTA)

Wyświetl plik

@ -986,15 +986,11 @@ SANE_Status Asic_ScanStart (ASIC * chip);
SANE_Status Asic_ScanStop (ASIC * chip); SANE_Status Asic_ScanStop (ASIC * chip);
SANE_Status Asic_ReadImage (ASIC * chip, SANE_Byte * pBuffer, SANE_Status Asic_ReadImage (ASIC * chip, SANE_Byte * pBuffer,
unsigned short LinesCount); unsigned short LinesCount);
#if SANE_UNUSED
SANE_Status Asic_CheckFunctionKey (ASIC * chip, SANE_Byte * key); SANE_Status Asic_CheckFunctionKey (ASIC * chip, SANE_Byte * key);
#endif
SANE_Status Asic_IsTAConnected (ASIC * chip, SANE_Bool *hasTA); SANE_Status Asic_IsTAConnected (ASIC * chip, SANE_Bool *hasTA);
SANE_Status Asic_ReadCalibrationData (ASIC * chip, SANE_Byte * pBuffer, SANE_Status Asic_ReadCalibrationData (ASIC * chip, SANE_Byte * pBuffer,
unsigned int dwXferBytes, unsigned int dwXferBytes,
SANE_Bool separateColors); SANE_Bool separateColors);
SANE_Status Asic_MotorMove (ASIC * chip, SANE_Bool isForward, SANE_Status Asic_MotorMove (ASIC * chip, SANE_Bool isForward,
unsigned int dwTotalSteps); unsigned int dwTotalSteps);
SANE_Status Asic_CarriageHome (ASIC * chip); SANE_Status Asic_CarriageHome (ASIC * chip);

Wyświetl plik

@ -181,7 +181,6 @@ Scanner_IsTAConnected (Scanner_State * st, SANE_Bool * pHasTA)
return status; return status;
} }
#ifdef SANE_UNUSED
SANE_Status SANE_Status
Scanner_GetKeyStatus (Scanner_State * st, SANE_Byte * pKey) Scanner_GetKeyStatus (Scanner_State * st, SANE_Byte * pKey)
{ {
@ -204,7 +203,7 @@ Scanner_GetKeyStatus (Scanner_State * st, SANE_Byte * pKey)
DBG_LEAVE (); DBG_LEAVE ();
return status; return status;
} }
#endif
static SANE_Byte static SANE_Byte
QBET4 (SANE_Byte A, SANE_Byte B) QBET4 (SANE_Byte A, SANE_Byte B)

Wyświetl plik

@ -153,9 +153,7 @@ SANE_Status Scanner_PowerControl (Scanner_State * st, SANE_Bool isLampOn,
SANE_Bool isTALampOn); SANE_Bool isTALampOn);
SANE_Status Scanner_BackHome (Scanner_State * st); SANE_Status Scanner_BackHome (Scanner_State * st);
SANE_Status Scanner_IsTAConnected (Scanner_State * st, SANE_Bool * pHasTA); SANE_Status Scanner_IsTAConnected (Scanner_State * st, SANE_Bool * pHasTA);
#if SANE_UNUSED
SANE_Status Scanner_GetKeyStatus (Scanner_State * st, SANE_Byte * pKey); SANE_Status Scanner_GetKeyStatus (Scanner_State * st, SANE_Byte * pKey);
#endif
SANE_Status Scanner_GetRows (Scanner_State * st, SANE_Byte * pBlock, SANE_Status Scanner_GetRows (Scanner_State * st, SANE_Byte * pBlock,
unsigned short * pNumRows, unsigned short * pNumRows,
SANE_Bool isOrderInvert); SANE_Bool isOrderInvert);