kopia lustrzana https://gitlab.com/sane-project/backends
- split sane_control_option to make it more readable
rodzic
d9d44cbe72
commit
0239a8344a
|
@ -1,3 +1,7 @@
|
||||||
|
2008-04-05 Stéphane Voltz <stef.dev@free.fr>
|
||||||
|
* backend/rts8891.c:
|
||||||
|
split sane_control_option() to make it more readable
|
||||||
|
|
||||||
2008-04-02 Nicolas Martin <nicols-guest at users.alioth.debian.org>
|
2008-04-02 Nicolas Martin <nicols-guest at users.alioth.debian.org>
|
||||||
* backend/pixma_mp150.c, backend/pixma.c, doc/sane-pixma.man,
|
* backend/pixma_mp150.c, backend/pixma.c, doc/sane-pixma.man,
|
||||||
doc/descriptions/pixma.desc:
|
doc/descriptions/pixma.desc:
|
||||||
|
|
|
@ -626,81 +626,249 @@ sane_get_option_descriptor (SANE_Handle handle, SANE_Int option)
|
||||||
return &(scanner->opt[option]);
|
return &(scanner->opt[option]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets or sets an option value.
|
* sets automatic value for an option , called by sane_control_option after
|
||||||
*
|
* all checks have been done */
|
||||||
* From the SANE spec:
|
static SANE_Status
|
||||||
* This function is used to set or inquire the current value of option
|
set_automatic_value (Rts8891_Scanner * s, int option, SANE_Int * myinfo)
|
||||||
* number n of the device represented by handle h. The manner in which
|
|
||||||
* the option is controlled is specified by parameter action. The
|
|
||||||
* possible values of this parameter are described in more detail
|
|
||||||
* below. The value of the option is passed through argument val. It
|
|
||||||
* is a pointer to the memory that holds the option value. The memory
|
|
||||||
* area pointed to by v must be big enough to hold the entire option
|
|
||||||
* value (determined by member size in the corresponding option
|
|
||||||
* descriptor).
|
|
||||||
*
|
|
||||||
* The only exception to this rule is that when setting the value of a
|
|
||||||
* string option, the string pointed to by argument v may be shorter
|
|
||||||
* since the backend will stop reading the option value upon
|
|
||||||
* encountering the first NUL terminator in the string. If argument i
|
|
||||||
* is not NULL, the value of *i will be set to provide details on how
|
|
||||||
* well the request has been met.
|
|
||||||
* action is SANE_ACTION_GET_VALUE, SANE_ACTION_SET_VALUE or SANE_ACTION_SET_AUTO
|
|
||||||
*/
|
|
||||||
SANE_Status
|
|
||||||
sane_control_option (SANE_Handle handle, SANE_Int option,
|
|
||||||
SANE_Action action, void *val, SANE_Int * info)
|
|
||||||
{
|
{
|
||||||
Rts8891_Scanner *s = handle;
|
SANE_Status status = SANE_STATUS_GOOD;
|
||||||
SANE_Status status;
|
SANE_Int i, min;
|
||||||
SANE_Word cap, tmpw;
|
|
||||||
SANE_Int myinfo = 0, i, min;
|
|
||||||
SANE_Word *dpi_list;
|
SANE_Word *dpi_list;
|
||||||
|
|
||||||
DBG (DBG_io2,
|
switch (option)
|
||||||
"sane_control_option: start: action = %s, option = %s (%d)\n",
|
|
||||||
(action == SANE_ACTION_GET_VALUE) ? "get" : (action ==
|
|
||||||
SANE_ACTION_SET_VALUE) ?
|
|
||||||
"set" : (action == SANE_ACTION_SET_AUTO) ? "set_auto" : "unknown",
|
|
||||||
s->opt[option].name, option);
|
|
||||||
|
|
||||||
if (action != SANE_ACTION_SET_AUTO && action != SANE_ACTION_SET_VALUE
|
|
||||||
&& action != SANE_ACTION_GET_VALUE)
|
|
||||||
{
|
{
|
||||||
DBG (DBG_error0, "sane_control_option: invalid action %d\n", action);
|
case OPT_TL_X:
|
||||||
return SANE_STATUS_INVAL;
|
s->val[OPT_TL_X].w = x_range.min;
|
||||||
}
|
*myinfo |= SANE_INFO_RELOAD_PARAMS;
|
||||||
|
break;
|
||||||
if (info)
|
case OPT_TL_Y:
|
||||||
*info = 0;
|
s->val[OPT_TL_Y].w = y_range.min;
|
||||||
|
*myinfo |= SANE_INFO_RELOAD_PARAMS;
|
||||||
if (s->scanning)
|
break;
|
||||||
{
|
case OPT_BR_X:
|
||||||
DBG (DBG_warn, "sane_control_option: don't call this function while "
|
s->val[OPT_BR_X].w = x_range.max;
|
||||||
"scanning (option = %s (%d))\n", s->opt[option].name, option);
|
*myinfo |= SANE_INFO_RELOAD_PARAMS;
|
||||||
|
break;
|
||||||
return SANE_STATUS_DEVICE_BUSY;
|
case OPT_BR_Y:
|
||||||
}
|
s->val[OPT_BR_Y].w = y_range.max;
|
||||||
if (option >= NUM_OPTIONS || option < 0)
|
*myinfo |= SANE_INFO_RELOAD_PARAMS;
|
||||||
{
|
break;
|
||||||
DBG (DBG_warn,
|
case OPT_RESOLUTION:
|
||||||
"sane_control_option: option %d >= NUM_OPTIONS || option < 0\n",
|
/* we set up to the lowest available dpi value */
|
||||||
|
dpi_list = (SANE_Word *) s->opt[OPT_RESOLUTION].constraint.word_list;
|
||||||
|
min = 65536;
|
||||||
|
for (i = 1; i < dpi_list[0]; i++)
|
||||||
|
{
|
||||||
|
if (dpi_list[i] < min)
|
||||||
|
min = dpi_list[i];
|
||||||
|
}
|
||||||
|
s->val[OPT_RESOLUTION].w = min;
|
||||||
|
*myinfo |= SANE_INFO_RELOAD_PARAMS;
|
||||||
|
break;
|
||||||
|
case OPT_THRESHOLD:
|
||||||
|
s->val[OPT_THRESHOLD].w = SANE_FIX (50);
|
||||||
|
break;
|
||||||
|
case OPT_PREVIEW:
|
||||||
|
s->val[OPT_PREVIEW].w = SANE_FALSE;
|
||||||
|
*myinfo |= SANE_INFO_RELOAD_PARAMS;
|
||||||
|
break;
|
||||||
|
case OPT_MODE:
|
||||||
|
if (s->val[OPT_MODE].s)
|
||||||
|
free (s->val[OPT_MODE].s);
|
||||||
|
s->val[OPT_MODE].s = strdup (mode_list[0]);
|
||||||
|
*myinfo |= SANE_INFO_RELOAD_OPTIONS;
|
||||||
|
*myinfo |= SANE_INFO_RELOAD_PARAMS;
|
||||||
|
break;
|
||||||
|
case OPT_CUSTOM_GAMMA:
|
||||||
|
s->val[option].b = SANE_FALSE;
|
||||||
|
DISABLE (OPT_GAMMA_VECTOR);
|
||||||
|
DISABLE (OPT_GAMMA_VECTOR_R);
|
||||||
|
DISABLE (OPT_GAMMA_VECTOR_G);
|
||||||
|
DISABLE (OPT_GAMMA_VECTOR_B);
|
||||||
|
break;
|
||||||
|
case OPT_GAMMA_VECTOR:
|
||||||
|
case OPT_GAMMA_VECTOR_R:
|
||||||
|
case OPT_GAMMA_VECTOR_G:
|
||||||
|
case OPT_GAMMA_VECTOR_B:
|
||||||
|
if (s->dev->model->gamma != s->val[option].wa)
|
||||||
|
free (s->val[option].wa);
|
||||||
|
s->val[option].wa = s->dev->model->gamma;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
DBG (DBG_warn, "set_automatic_value: can't set unknown option %d\n",
|
||||||
option);
|
option);
|
||||||
return SANE_STATUS_INVAL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
cap = s->opt[option].cap;
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
if (!SANE_OPTION_IS_ACTIVE (cap))
|
/**
|
||||||
|
* sets an option , called by sane_control_option after all
|
||||||
|
* checks have been done */
|
||||||
|
static SANE_Status
|
||||||
|
set_option_value (Rts8891_Scanner * s, int option, void *val,
|
||||||
|
SANE_Int * myinfo)
|
||||||
|
{
|
||||||
|
SANE_Status status = SANE_STATUS_GOOD;
|
||||||
|
SANE_Int i;
|
||||||
|
SANE_Word tmpw;
|
||||||
|
|
||||||
|
switch (option)
|
||||||
{
|
{
|
||||||
DBG (DBG_warn, "sane_control_option: option %d is inactive\n", option);
|
case OPT_TL_X:
|
||||||
return SANE_STATUS_INVAL;
|
case OPT_TL_Y:
|
||||||
|
case OPT_BR_X:
|
||||||
|
case OPT_BR_Y:
|
||||||
|
s->val[option].w = *(SANE_Word *) val;
|
||||||
|
/* we ensure geometry is coherent */
|
||||||
|
/* this happens when user drags TL corner right or below the BR point */
|
||||||
|
if (s->val[OPT_BR_Y].w < s->val[OPT_TL_Y].w)
|
||||||
|
{
|
||||||
|
tmpw = s->val[OPT_BR_Y].w;
|
||||||
|
s->val[OPT_BR_Y].w = s->val[OPT_TL_Y].w;
|
||||||
|
s->val[OPT_TL_Y].w = tmpw;
|
||||||
|
}
|
||||||
|
if (s->val[OPT_BR_X].w < s->val[OPT_TL_X].w)
|
||||||
|
{
|
||||||
|
tmpw = s->val[OPT_BR_X].w;
|
||||||
|
s->val[OPT_BR_X].w = s->val[OPT_TL_X].w;
|
||||||
|
s->val[OPT_TL_X].w = tmpw;
|
||||||
|
}
|
||||||
|
|
||||||
|
*myinfo |= SANE_INFO_RELOAD_PARAMS;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case OPT_RESOLUTION:
|
||||||
|
case OPT_THRESHOLD:
|
||||||
|
case OPT_PREVIEW:
|
||||||
|
s->val[option].w = *(SANE_Word *) val;
|
||||||
|
*myinfo |= SANE_INFO_RELOAD_PARAMS;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case OPT_MODE:
|
||||||
|
if (s->val[option].s)
|
||||||
|
free (s->val[option].s);
|
||||||
|
s->val[option].s = strdup (val);
|
||||||
|
if (strcmp (s->val[option].s, LINEART_MODE) == 0)
|
||||||
|
{
|
||||||
|
ENABLE (OPT_THRESHOLD);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
DISABLE (OPT_THRESHOLD);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* if custom gamma, toggle gamma table options according to the mode */
|
||||||
|
if (s->val[OPT_CUSTOM_GAMMA].b == SANE_TRUE)
|
||||||
|
{
|
||||||
|
if (strcmp (s->val[option].s, COLOR_MODE) == 0)
|
||||||
|
{
|
||||||
|
DISABLE (OPT_GAMMA_VECTOR);
|
||||||
|
ENABLE (OPT_GAMMA_VECTOR_R);
|
||||||
|
ENABLE (OPT_GAMMA_VECTOR_G);
|
||||||
|
ENABLE (OPT_GAMMA_VECTOR_B);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ENABLE (OPT_GAMMA_VECTOR);
|
||||||
|
DISABLE (OPT_GAMMA_VECTOR_R);
|
||||||
|
DISABLE (OPT_GAMMA_VECTOR_G);
|
||||||
|
DISABLE (OPT_GAMMA_VECTOR_B);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*myinfo |= SANE_INFO_RELOAD_PARAMS | SANE_INFO_RELOAD_OPTIONS;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case OPT_CUSTOM_GAMMA:
|
||||||
|
*myinfo |= SANE_INFO_RELOAD_PARAMS | SANE_INFO_RELOAD_OPTIONS;
|
||||||
|
s->val[OPT_CUSTOM_GAMMA].b = *(SANE_Bool *) val;
|
||||||
|
|
||||||
|
if (s->val[OPT_CUSTOM_GAMMA].b == SANE_TRUE)
|
||||||
|
{
|
||||||
|
if (strcmp (s->val[OPT_MODE].s, COLOR_MODE) == 0)
|
||||||
|
{
|
||||||
|
DISABLE (OPT_GAMMA_VECTOR);
|
||||||
|
ENABLE (OPT_GAMMA_VECTOR_R);
|
||||||
|
ENABLE (OPT_GAMMA_VECTOR_G);
|
||||||
|
ENABLE (OPT_GAMMA_VECTOR_B);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ENABLE (OPT_GAMMA_VECTOR);
|
||||||
|
DISABLE (OPT_GAMMA_VECTOR_R);
|
||||||
|
DISABLE (OPT_GAMMA_VECTOR_G);
|
||||||
|
DISABLE (OPT_GAMMA_VECTOR_B);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
DISABLE (OPT_GAMMA_VECTOR);
|
||||||
|
DISABLE (OPT_GAMMA_VECTOR_R);
|
||||||
|
DISABLE (OPT_GAMMA_VECTOR_G);
|
||||||
|
DISABLE (OPT_GAMMA_VECTOR_B);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case OPT_GAMMA_VECTOR:
|
||||||
|
case OPT_GAMMA_VECTOR_R:
|
||||||
|
case OPT_GAMMA_VECTOR_G:
|
||||||
|
case OPT_GAMMA_VECTOR_B:
|
||||||
|
/* sanity checks */
|
||||||
|
for (i = 0; i < (int) (s->opt[option].size / sizeof (SANE_Word)); i++)
|
||||||
|
{
|
||||||
|
if (((SANE_Int *) val)[i] < 0 || ((SANE_Int *) val)[i] > 255)
|
||||||
|
{
|
||||||
|
DBG (2,
|
||||||
|
"sane_control_option: gamma value (%d) at index %d out of range\n",
|
||||||
|
((SANE_Int *) val)[i], i);
|
||||||
|
return SANE_STATUS_INVAL;
|
||||||
|
}
|
||||||
|
/* avoid aa values since they will be problematic */
|
||||||
|
if (((SANE_Int *) val)[i] == 0xaa)
|
||||||
|
((SANE_Int *) val)[i] = 0xab;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* free memory from previous set */
|
||||||
|
if (s->dev->model->gamma != s->val[option].wa)
|
||||||
|
free (s->val[option].wa);
|
||||||
|
|
||||||
|
/* then alloc memory */
|
||||||
|
s->val[option].wa = (SANE_Word *) malloc (256 * sizeof (SANE_Word));
|
||||||
|
if (s->val[option].wa == NULL)
|
||||||
|
{
|
||||||
|
s->val[option].wa = s->dev->model->gamma;
|
||||||
|
DBG (DBG_error0,
|
||||||
|
"set_option_value: not enough memory for %d bytes!\n",
|
||||||
|
256 * sizeof (SANE_Word));
|
||||||
|
return SANE_STATUS_NO_MEM;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* data copy */
|
||||||
|
memcpy (s->val[option].wa, val, s->opt[option].size);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case OPT_LAMP_ON:
|
||||||
|
return set_lamp_state (s, 1);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case OPT_LAMP_OFF:
|
||||||
|
return set_lamp_state (s, 0);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
DBG (DBG_warn, "set_option_value: can't set unknown option %d\n",
|
||||||
|
option);
|
||||||
}
|
}
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
if (action == SANE_ACTION_GET_VALUE)
|
/**
|
||||||
{
|
* gets an option , called by sane_control_option after all checks
|
||||||
|
* have been done */
|
||||||
|
static SANE_Status
|
||||||
|
get_option_value (Rts8891_Scanner * s, int option, void *val)
|
||||||
|
{
|
||||||
switch (option)
|
switch (option)
|
||||||
{
|
{
|
||||||
/* word or word equivalent options: */
|
/* word or word equivalent options: */
|
||||||
|
@ -731,7 +899,7 @@ sane_control_option (SANE_Handle handle, SANE_Int option,
|
||||||
if (option - OPT_BUTTON_1 > s->dev->model->buttons)
|
if (option - OPT_BUTTON_1 > s->dev->model->buttons)
|
||||||
{
|
{
|
||||||
DBG (DBG_warn,
|
DBG (DBG_warn,
|
||||||
"sane_control_option: invalid button option %d\n", option);
|
"get_option_value: invalid button option %d\n", option);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -741,7 +909,7 @@ sane_control_option (SANE_Handle handle, SANE_Int option,
|
||||||
/* clear the button state */
|
/* clear the button state */
|
||||||
s->val[option].w = SANE_FALSE;
|
s->val[option].w = SANE_FALSE;
|
||||||
DBG (DBG_io,
|
DBG (DBG_io,
|
||||||
"sane_control_option: button option %d=%d\n", option,
|
"get_option_value: button option %d=%d\n", option,
|
||||||
*(SANE_Word *) val);
|
*(SANE_Word *) val);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -756,12 +924,87 @@ sane_control_option (SANE_Handle handle, SANE_Int option,
|
||||||
memcpy (val, s->val[option].wa, s->opt[option].size);
|
memcpy (val, s->val[option].wa, s->opt[option].size);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
DBG (DBG_warn, "sane_control_option: can't get unknown option %d\n",
|
DBG (DBG_warn, "get_option_value: can't get unknown option %d\n",
|
||||||
option);
|
option);
|
||||||
}
|
}
|
||||||
}
|
return SANE_STATUS_GOOD;
|
||||||
else if (action == SANE_ACTION_SET_VALUE)
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets or sets an option value.
|
||||||
|
*
|
||||||
|
* From the SANE spec:
|
||||||
|
* This function is used to set or inquire the current value of option
|
||||||
|
* number n of the device represented by handle h. The manner in which
|
||||||
|
* the option is controlled is specified by parameter action. The
|
||||||
|
* possible values of this parameter are described in more detail
|
||||||
|
* below. The value of the option is passed through argument val. It
|
||||||
|
* is a pointer to the memory that holds the option value. The memory
|
||||||
|
* area pointed to by v must be big enough to hold the entire option
|
||||||
|
* value (determined by member size in the corresponding option
|
||||||
|
* descriptor).
|
||||||
|
*
|
||||||
|
* The only exception to this rule is that when setting the value of a
|
||||||
|
* string option, the string pointed to by argument v may be shorter
|
||||||
|
* since the backend will stop reading the option value upon
|
||||||
|
* encountering the first NUL terminator in the string. If argument i
|
||||||
|
* is not NULL, the value of *i will be set to provide details on how
|
||||||
|
* well the request has been met.
|
||||||
|
* action is SANE_ACTION_GET_VALUE, SANE_ACTION_SET_VALUE or SANE_ACTION_SET_AUTO
|
||||||
|
*/
|
||||||
|
SANE_Status
|
||||||
|
sane_control_option (SANE_Handle handle, SANE_Int option,
|
||||||
|
SANE_Action action, void *val, SANE_Int * info)
|
||||||
|
{
|
||||||
|
Rts8891_Scanner *s = handle;
|
||||||
|
SANE_Status status;
|
||||||
|
SANE_Word cap;
|
||||||
|
SANE_Int myinfo = 0;
|
||||||
|
|
||||||
|
DBG (DBG_io2,
|
||||||
|
"sane_control_option: start: action = %s, option = %s (%d)\n",
|
||||||
|
(action == SANE_ACTION_GET_VALUE) ? "get" : (action ==
|
||||||
|
SANE_ACTION_SET_VALUE) ?
|
||||||
|
"set" : (action == SANE_ACTION_SET_AUTO) ? "set_auto" : "unknown",
|
||||||
|
s->opt[option].name, option);
|
||||||
|
|
||||||
|
if (info)
|
||||||
|
*info = 0;
|
||||||
|
|
||||||
|
/* do checks before trying to apply action */
|
||||||
|
|
||||||
|
if (s->scanning)
|
||||||
{
|
{
|
||||||
|
DBG (DBG_warn, "sane_control_option: don't call this function while "
|
||||||
|
"scanning (option = %s (%d))\n", s->opt[option].name, option);
|
||||||
|
return SANE_STATUS_DEVICE_BUSY;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* option must be within existing range */
|
||||||
|
if (option >= NUM_OPTIONS || option < 0)
|
||||||
|
{
|
||||||
|
DBG (DBG_warn,
|
||||||
|
"sane_control_option: option %d >= NUM_OPTIONS || option < 0\n",
|
||||||
|
option);
|
||||||
|
return SANE_STATUS_INVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* don't access an inactive option */
|
||||||
|
cap = s->opt[option].cap;
|
||||||
|
if (!SANE_OPTION_IS_ACTIVE (cap))
|
||||||
|
{
|
||||||
|
DBG (DBG_warn, "sane_control_option: option %d is inactive\n", option);
|
||||||
|
return SANE_STATUS_INVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* now checks have been done, apply action */
|
||||||
|
switch (action)
|
||||||
|
{
|
||||||
|
case SANE_ACTION_GET_VALUE:
|
||||||
|
status = get_option_value (s, option, val);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SANE_ACTION_SET_VALUE:
|
||||||
if (!SANE_OPTION_IS_SETTABLE (cap))
|
if (!SANE_OPTION_IS_SETTABLE (cap))
|
||||||
{
|
{
|
||||||
DBG (DBG_warn, "sane_control_option: option %d is not settable\n",
|
DBG (DBG_warn, "sane_control_option: option %d is not settable\n",
|
||||||
|
@ -769,12 +1012,6 @@ sane_control_option (SANE_Handle handle, SANE_Int option,
|
||||||
return SANE_STATUS_INVAL;
|
return SANE_STATUS_INVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* return immediatly if no change */
|
|
||||||
if (s->opt[option].type == SANE_TYPE_INT
|
|
||||||
&& *(SANE_Word *) val == s->val[option].w)
|
|
||||||
return SANE_STATUS_GOOD;
|
|
||||||
|
|
||||||
/* check that the value to set conforms to the constraint */
|
|
||||||
status = sanei_constrain_value (s->opt + option, val, &myinfo);
|
status = sanei_constrain_value (s->opt + option, val, &myinfo);
|
||||||
if (status != SANE_STATUS_GOOD)
|
if (status != SANE_STATUS_GOOD)
|
||||||
{
|
{
|
||||||
|
@ -784,156 +1021,19 @@ sane_control_option (SANE_Handle handle, SANE_Int option,
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (option)
|
/* return immediatly if no change */
|
||||||
|
if (s->opt[option].type == SANE_TYPE_INT
|
||||||
|
&& *(SANE_Word *) val == s->val[option].w)
|
||||||
{
|
{
|
||||||
case OPT_TL_X:
|
status = SANE_STATUS_GOOD;
|
||||||
case OPT_TL_Y:
|
|
||||||
case OPT_BR_X:
|
|
||||||
case OPT_BR_Y:
|
|
||||||
s->val[option].w = *(SANE_Word *) val;
|
|
||||||
/* we ensure geometry is coherent */
|
|
||||||
/* this happens when user drags TL corner right or below the BR point */
|
|
||||||
if (s->val[OPT_BR_Y].w < s->val[OPT_TL_Y].w)
|
|
||||||
{
|
|
||||||
tmpw = s->val[OPT_BR_Y].w;
|
|
||||||
s->val[OPT_BR_Y].w = s->val[OPT_TL_Y].w;
|
|
||||||
s->val[OPT_TL_Y].w = tmpw;
|
|
||||||
}
|
|
||||||
if (s->val[OPT_BR_X].w < s->val[OPT_TL_X].w)
|
|
||||||
{
|
|
||||||
tmpw = s->val[OPT_BR_X].w;
|
|
||||||
s->val[OPT_BR_X].w = s->val[OPT_TL_X].w;
|
|
||||||
s->val[OPT_TL_X].w = tmpw;
|
|
||||||
}
|
|
||||||
|
|
||||||
myinfo |= SANE_INFO_RELOAD_PARAMS;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case OPT_RESOLUTION:
|
|
||||||
case OPT_THRESHOLD:
|
|
||||||
case OPT_PREVIEW:
|
|
||||||
s->val[option].w = *(SANE_Word *) val;
|
|
||||||
myinfo |= SANE_INFO_RELOAD_PARAMS;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case OPT_MODE:
|
|
||||||
if (s->val[option].s)
|
|
||||||
free (s->val[option].s);
|
|
||||||
s->val[option].s = strdup (val);
|
|
||||||
if (strcmp (s->val[option].s, LINEART_MODE) == 0)
|
|
||||||
{
|
|
||||||
ENABLE (OPT_THRESHOLD);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DISABLE (OPT_THRESHOLD);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* if custom gamma, toggle gamma table options according to the mode */
|
|
||||||
if (s->val[OPT_CUSTOM_GAMMA].b == SANE_TRUE)
|
|
||||||
{
|
|
||||||
if (strcmp (s->val[option].s, COLOR_MODE) == 0)
|
|
||||||
{
|
|
||||||
DISABLE (OPT_GAMMA_VECTOR);
|
|
||||||
ENABLE (OPT_GAMMA_VECTOR_R);
|
|
||||||
ENABLE (OPT_GAMMA_VECTOR_G);
|
|
||||||
ENABLE (OPT_GAMMA_VECTOR_B);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ENABLE (OPT_GAMMA_VECTOR);
|
|
||||||
DISABLE (OPT_GAMMA_VECTOR_R);
|
|
||||||
DISABLE (OPT_GAMMA_VECTOR_G);
|
|
||||||
DISABLE (OPT_GAMMA_VECTOR_B);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
myinfo |= SANE_INFO_RELOAD_PARAMS | SANE_INFO_RELOAD_OPTIONS;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case OPT_CUSTOM_GAMMA:
|
|
||||||
myinfo |= SANE_INFO_RELOAD_PARAMS | SANE_INFO_RELOAD_OPTIONS;
|
|
||||||
s->val[OPT_CUSTOM_GAMMA].b = *(SANE_Bool *) val;
|
|
||||||
|
|
||||||
if (s->val[OPT_CUSTOM_GAMMA].b == SANE_TRUE)
|
|
||||||
{
|
|
||||||
if (strcmp (s->val[OPT_MODE].s, COLOR_MODE) == 0)
|
|
||||||
{
|
|
||||||
DISABLE (OPT_GAMMA_VECTOR);
|
|
||||||
ENABLE (OPT_GAMMA_VECTOR_R);
|
|
||||||
ENABLE (OPT_GAMMA_VECTOR_G);
|
|
||||||
ENABLE (OPT_GAMMA_VECTOR_B);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ENABLE (OPT_GAMMA_VECTOR);
|
|
||||||
DISABLE (OPT_GAMMA_VECTOR_R);
|
|
||||||
DISABLE (OPT_GAMMA_VECTOR_G);
|
|
||||||
DISABLE (OPT_GAMMA_VECTOR_B);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DISABLE (OPT_GAMMA_VECTOR);
|
|
||||||
DISABLE (OPT_GAMMA_VECTOR_R);
|
|
||||||
DISABLE (OPT_GAMMA_VECTOR_G);
|
|
||||||
DISABLE (OPT_GAMMA_VECTOR_B);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case OPT_GAMMA_VECTOR:
|
|
||||||
case OPT_GAMMA_VECTOR_R:
|
|
||||||
case OPT_GAMMA_VECTOR_G:
|
|
||||||
case OPT_GAMMA_VECTOR_B:
|
|
||||||
/* sanity checks */
|
|
||||||
if (s->val[option].wa == NULL)
|
|
||||||
{
|
|
||||||
s->val[option].wa = s->dev->model->gamma;
|
|
||||||
DBG (DBG_error0,
|
|
||||||
"sane_control_option: not enough memory for %d bytes!\n",
|
|
||||||
256 * sizeof (SANE_Word));
|
|
||||||
return SANE_STATUS_NO_MEM;
|
|
||||||
}
|
|
||||||
for (i = 0; i < (int) (s->opt[option].size / sizeof (SANE_Word));
|
|
||||||
i++)
|
|
||||||
{
|
|
||||||
if (((SANE_Int *) val)[i] < 0 || ((SANE_Int *) val)[i] > 255)
|
|
||||||
{
|
|
||||||
DBG (2,
|
|
||||||
"sane_control_option: gamma value (%d) at index %d out of range\n",
|
|
||||||
((SANE_Int *) val)[i], i);
|
|
||||||
return SANE_STATUS_INVAL;
|
|
||||||
}
|
|
||||||
/* avoid aa values since they will be problematic */
|
|
||||||
if (((SANE_Int *) val)[i] == 0xaa)
|
|
||||||
((SANE_Int *) val)[i] = 0xab;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* free memory from previous set */
|
|
||||||
if (s->dev->model->gamma != s->val[option].wa)
|
|
||||||
free (s->val[option].wa);
|
|
||||||
|
|
||||||
/* then alloc memory */
|
|
||||||
s->val[option].wa = (SANE_Word *) malloc (256 * sizeof (SANE_Word));
|
|
||||||
|
|
||||||
/* data copy */
|
|
||||||
memcpy (s->val[option].wa, val, s->opt[option].size);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case OPT_LAMP_ON:
|
|
||||||
return set_lamp_state (s, 1);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case OPT_LAMP_OFF:
|
|
||||||
return set_lamp_state (s, 0);
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
DBG (DBG_warn, "sane_control_option: can't set unknown option %d\n",
|
|
||||||
option);
|
|
||||||
}
|
}
|
||||||
}
|
else
|
||||||
else if (action == SANE_ACTION_SET_AUTO)
|
{ /* apply change */
|
||||||
{
|
status = set_option_value (s, option, val, &myinfo);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SANE_ACTION_SET_AUTO:
|
||||||
/* sets automatic values */
|
/* sets automatic values */
|
||||||
if (!(cap & SANE_CAP_AUTOMATIC))
|
if (!(cap & SANE_CAP_AUTOMATIC))
|
||||||
{
|
{
|
||||||
|
@ -943,77 +1043,20 @@ sane_control_option (SANE_Handle handle, SANE_Int option,
|
||||||
return SANE_STATUS_INVAL;
|
return SANE_STATUS_INVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (option)
|
status = set_automatic_value (s, option, &myinfo);
|
||||||
{
|
break;
|
||||||
case OPT_TL_X:
|
|
||||||
s->val[OPT_TL_X].w = x_range.min;
|
default:
|
||||||
myinfo |= SANE_INFO_RELOAD_PARAMS;
|
DBG (DBG_error, "sane_control_option: invalid action %d\n", action);
|
||||||
break;
|
status = SANE_STATUS_INVAL;
|
||||||
case OPT_TL_Y:
|
break;
|
||||||
s->val[OPT_TL_Y].w = y_range.min;
|
|
||||||
myinfo |= SANE_INFO_RELOAD_PARAMS;
|
|
||||||
break;
|
|
||||||
case OPT_BR_X:
|
|
||||||
s->val[OPT_BR_X].w = x_range.max;
|
|
||||||
myinfo |= SANE_INFO_RELOAD_PARAMS;
|
|
||||||
break;
|
|
||||||
case OPT_BR_Y:
|
|
||||||
s->val[OPT_BR_Y].w = y_range.max;
|
|
||||||
myinfo |= SANE_INFO_RELOAD_PARAMS;
|
|
||||||
break;
|
|
||||||
case OPT_RESOLUTION:
|
|
||||||
/* we set up to the lowest available dpi value */
|
|
||||||
dpi_list =
|
|
||||||
(SANE_Word *) s->opt[OPT_RESOLUTION].constraint.word_list;
|
|
||||||
min = 65536;
|
|
||||||
for (i = 1; i < dpi_list[0]; i++)
|
|
||||||
{
|
|
||||||
if (dpi_list[i] < min)
|
|
||||||
min = dpi_list[i];
|
|
||||||
}
|
|
||||||
s->val[OPT_RESOLUTION].w = min;
|
|
||||||
myinfo |= SANE_INFO_RELOAD_PARAMS;
|
|
||||||
break;
|
|
||||||
case OPT_THRESHOLD:
|
|
||||||
s->val[OPT_THRESHOLD].w = SANE_FIX (50);
|
|
||||||
break;
|
|
||||||
case OPT_PREVIEW:
|
|
||||||
s->val[OPT_PREVIEW].w = SANE_FALSE;
|
|
||||||
myinfo |= SANE_INFO_RELOAD_PARAMS;
|
|
||||||
break;
|
|
||||||
case OPT_MODE:
|
|
||||||
if (s->val[OPT_MODE].s)
|
|
||||||
free (s->val[OPT_MODE].s);
|
|
||||||
s->val[OPT_MODE].s = strdup (mode_list[0]);
|
|
||||||
myinfo |= SANE_INFO_RELOAD_OPTIONS;
|
|
||||||
myinfo |= SANE_INFO_RELOAD_PARAMS;
|
|
||||||
break;
|
|
||||||
case OPT_CUSTOM_GAMMA:
|
|
||||||
s->val[option].b = SANE_FALSE;
|
|
||||||
DISABLE (OPT_GAMMA_VECTOR);
|
|
||||||
DISABLE (OPT_GAMMA_VECTOR_R);
|
|
||||||
DISABLE (OPT_GAMMA_VECTOR_G);
|
|
||||||
DISABLE (OPT_GAMMA_VECTOR_B);
|
|
||||||
break;
|
|
||||||
case OPT_GAMMA_VECTOR:
|
|
||||||
case OPT_GAMMA_VECTOR_R:
|
|
||||||
case OPT_GAMMA_VECTOR_G:
|
|
||||||
case OPT_GAMMA_VECTOR_B:
|
|
||||||
if (s->dev->model->gamma != s->val[option].wa)
|
|
||||||
free (s->val[option].wa);
|
|
||||||
s->val[option].wa = s->dev->model->gamma;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
DBG (DBG_warn, "sane_control_option: can't set unknown option %d\n",
|
|
||||||
option);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (info)
|
if (info)
|
||||||
*info = myinfo;
|
*info = myinfo;
|
||||||
|
|
||||||
DBG (DBG_io2, "sane_control_option: exit\n");
|
DBG (DBG_io2, "sane_control_option: exit\n");
|
||||||
return SANE_STATUS_GOOD;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Ładowanie…
Reference in New Issue