add options and flag for software enhancements

merge-requests/1/head
Stphane Voltz 2010-09-06 21:02:32 +02:00
rodzic 48dce048db
commit abd0f36868
3 zmienionych plików z 93 dodań i 0 usunięć

Wyświetl plik

@ -117,6 +117,12 @@ static SANE_String_Const source_list[] = {
0
};
static SANE_Range swdespeck_range = {
0,
9,
1
};
static SANE_Range time_range = {
0, /* minimum */
60, /* maximum */
@ -611,6 +617,7 @@ sanei_genesys_get_status (Genesys_Device * dev, uint8_t * status)
return sanei_genesys_read_register (dev, 0x41, status);
}
#if 0
/* returns pixels per line from register set */
/*candidate for moving into chip specific files?*/
static int
@ -643,6 +650,7 @@ genesys_dpiset (Genesys_Register_Set * reg)
return dpiset;
}
#endif
/** read the number of valid words in scanner's RAM
* ie registers 42-43-44
@ -5913,6 +5921,16 @@ calc_parameters (Genesys_Scanner * s)
else
s->dev->settings.threshold_curve=0;
/* some digital processing requires the whole picture to be buffered */
if (s->val[OPT_SWDESPECK].b || s->val[OPT_SWCROP].b || s->val[OPT_SWDESKEW].b)
{
s->dev->buffer_image=SANE_TRUE;
}
else
{
s->dev->buffer_image=SANE_TRUE;
}
return status;
}
@ -6196,6 +6214,45 @@ init_options (Genesys_Scanner * s)
DBG (DBG_info, "init_options: custom gamma disabled\n");
}
/* software base image enhancements, these are consuming as many
* memory than used by the full scanned image and may fail at high
* resolution
*/
/* software deskew */
s->opt[OPT_SWDESKEW].name = "swdeskew";
s->opt[OPT_SWDESKEW].title = "Software deskew";
s->opt[OPT_SWDESKEW].desc = "Request backend to rotate skewed pages digitally";
s->opt[OPT_SWDESKEW].type = SANE_TYPE_BOOL;
s->opt->cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT | SANE_CAP_ADVANCED;
s->val[OPT_SWDESKEW].b = SANE_FALSE;
/* software deskew */
s->opt[OPT_SWDESPECK].name = "swdespeck";
s->opt[OPT_SWDESPECK].title = "Software despeck";
s->opt[OPT_SWDESPECK].desc = "Request backend to remove lone dots digitally";
s->opt[OPT_SWDESPECK].type = SANE_TYPE_BOOL;
s->opt->cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT | SANE_CAP_ADVANCED;
s->val[OPT_SWDESPECK].b = SANE_FALSE;
/* software despeckle radius */
s->opt[OPT_DESPECK].name = "despeck";
s->opt[OPT_DESPECK].title = "Software despeckle diameter";
s->opt[OPT_DESPECK].desc = "Maximum diameter of lone dots to remove from scan";
s->opt[OPT_DESPECK].type = SANE_TYPE_INT;
s->opt[OPT_DESPECK].unit = SANE_UNIT_NONE;
s->opt[OPT_DESPECK].constraint_type = SANE_CONSTRAINT_RANGE;
s->opt[OPT_DESPECK].constraint.range = &swdespeck_range;
s->opt[OPT_DESPECK].cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT | SANE_CAP_ADVANCED;
s->val[OPT_DESPECK].w= 1;
/* crop by software */
s->opt[OPT_SWCROP].name = "swcrop";
s->opt[OPT_SWCROP].title = "Software crop";
s->opt[OPT_SWCROP].desc = "Request backend to remove border from pages digitally";
s->opt[OPT_SWCROP].type = SANE_TYPE_BOOL;
s->opt[OPT_SWCROP].cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT | SANE_CAP_ADVANCED;
s->val[OPT_SWCROP].b = SANE_FALSE;
/* "Extras" group: */
s->opt[OPT_EXTRAS_GROUP].title = SANE_I18N ("Extras");
s->opt[OPT_EXTRAS_GROUP].desc = "";
@ -7195,6 +7252,10 @@ get_option_value (Genesys_Scanner * s, int option, void *val)
case OPT_DISABLE_DYNAMIC_LINEART:
case OPT_DISABLE_INTERPOLATION:
case OPT_LAMP_OFF_TIME:
case OPT_SWDESKEW:
case OPT_SWCROP:
case OPT_SWDESPECK:
case OPT_DESPECK:
*(SANE_Word *) val = s->val[option].w;
break;
case OPT_CUSTOM_GAMMA:
@ -7307,12 +7368,28 @@ set_option_value (Genesys_Scanner * s, int option, void *val,
case OPT_THRESHOLD:
case OPT_THRESHOLD_CURVE:
case OPT_DISABLE_DYNAMIC_LINEART:
case OPT_SWCROP:
case OPT_SWDESKEW:
case OPT_DESPECK:
case OPT_DISABLE_INTERPOLATION:
case OPT_PREVIEW:
s->val[option].w = *(SANE_Word *) val;
RIE (calc_parameters (s));
*myinfo |= SANE_INFO_RELOAD_PARAMS;
break;
case OPT_SWDESPECK:
s->val[option].w = *(SANE_Word *) val;
if (s->val[OPT_SWDESPECK].b == SANE_TRUE)
{
ENABLE(OPT_DESPECK);
}
else
{
DISABLE(OPT_DESPECK);
}
RIE (calc_parameters (s));
*myinfo |= SANE_INFO_RELOAD_PARAMS | SANE_INFO_RELOAD_OPTIONS;
break;
case OPT_SOURCE:
if (strcmp (s->val[option].s, val) != 0)
{ /* something changed */
@ -7707,6 +7784,15 @@ sane_start (SANE_Handle handle)
s->scanning = SANE_TRUE;
/* if one of the software enhancement option is selsected,
* we do the scan internally, process picture then put it an internall
* buffer. Since cropping may change scan parameters, we recompute them
* at the end */
if (s->dev->buffer_image)
{
/* scan image to buffer */
}
DBG (DBG_proc, "sane_start: exit\n");
return SANE_STATUS_GOOD;
}

Wyświetl plik

@ -93,6 +93,10 @@ enum Genesys_Option
OPT_GAMMA_VECTOR_R,
OPT_GAMMA_VECTOR_G,
OPT_GAMMA_VECTOR_B,
OPT_SWDESKEW,
OPT_SWCROP,
OPT_SWDESPECK,
OPT_DESPECK,
OPT_EXTRAS_GROUP,
OPT_LAMP_OFF_TIME,

Wyświetl plik

@ -650,6 +650,9 @@ struct Genesys_Device
size_t len; /**> number of even pixels */
size_t cur; /**> current pixel position within sub window */
Genesys_Buffer oe_buffer; /**> buffer to handle even/odd data */
SANE_Bool buffer_image; /**> when true the scanned picutre is first buffered
* to a software image enhancements */
};
typedef struct Genesys_USB_Device_Entry