kopia lustrzana https://gitlab.com/sane-project/backends
Some fixes for the Avision backend. (Brightness and contrast via gamma-table
clean up. First config option.)DEVEL_2_0_BRANCH-1
rodzic
83d084d8d3
commit
e2169ec4e0
|
@ -84,7 +84,7 @@
|
||||||
|
|
||||||
|
|
||||||
#define BACKEND_NAME avision
|
#define BACKEND_NAME avision
|
||||||
#define BACKEND_BUILD 12 /* avision backend BUILD version */
|
#define BACKEND_BUILD 13 /* avision backend BUILD version */
|
||||||
|
|
||||||
#define MAX_X_RANGE 8.5 /* used when scanner returns invaild ragne fields ... */
|
#define MAX_X_RANGE 8.5 /* used when scanner returns invaild ragne fields ... */
|
||||||
#define MAX_Y_RANGE 11.8
|
#define MAX_Y_RANGE 11.8
|
||||||
|
@ -101,6 +101,8 @@ static int num_devices;
|
||||||
static Avision_Device* first_dev;
|
static Avision_Device* first_dev;
|
||||||
static Avision_Scanner* first_handle;
|
static Avision_Scanner* first_handle;
|
||||||
|
|
||||||
|
static SANE_Bool force_a4 = SANE_FALSE; /* for scanable area to ISO(DIN) A4 */
|
||||||
|
|
||||||
static const SANE_String_Const mode_list[] =
|
static const SANE_String_Const mode_list[] =
|
||||||
{
|
{
|
||||||
"Line Art", "Dithered", "Gray", "Color", 0
|
"Line Art", "Dithered", "Gray", "Color", 0
|
||||||
|
@ -588,6 +590,14 @@ attach (const char* devname, Avision_Device** devp)
|
||||||
else
|
else
|
||||||
DBG (3, "Inquiry x/y-range is vaild?!?\n");
|
DBG (3, "Inquiry x/y-range is vaild?!?\n");
|
||||||
|
|
||||||
|
if (force_a4)
|
||||||
|
{
|
||||||
|
DBG (3, "option: \"force_a4\" found! Using defauld %fx%finch (ISO A4).\n",
|
||||||
|
MAX_X_RANGE, MAX_Y_RANGE);
|
||||||
|
dev->x_range.max = SANE_FIX (MAX_X_RANGE * MM_PER_INCH);
|
||||||
|
dev->y_range.max = SANE_FIX (MAX_Y_RANGE * MM_PER_INCH);
|
||||||
|
}
|
||||||
|
|
||||||
++num_devices;
|
++num_devices;
|
||||||
dev->next = first_dev;
|
dev->next = first_dev;
|
||||||
first_dev = dev;
|
first_dev = dev;
|
||||||
|
@ -692,7 +702,6 @@ set_gamma (Avision_Scanner* s)
|
||||||
|
|
||||||
double brightness;
|
double brightness;
|
||||||
double contrast;
|
double contrast;
|
||||||
/* double threshold; */
|
|
||||||
|
|
||||||
DBG (3, "set_gamma\n");
|
DBG (3, "set_gamma\n");
|
||||||
|
|
||||||
|
@ -704,9 +713,6 @@ set_gamma (Avision_Scanner* s)
|
||||||
|
|
||||||
DBG (3, "brightness: %f, contrast: %f\n", brightness, contrast);
|
DBG (3, "brightness: %f, contrast: %f\n", brightness, contrast);
|
||||||
|
|
||||||
/* threshold = SANE_UNFIX (s->val[OPT_THRESHOLD].w); */
|
|
||||||
/* threshold /= 100; */
|
|
||||||
|
|
||||||
/* should we sent a custom gamma-table ??
|
/* should we sent a custom gamma-table ??
|
||||||
* don't send anything if no - the scanner may not understand the gamma-table
|
* don't send anything if no - the scanner may not understand the gamma-table
|
||||||
*/
|
*/
|
||||||
|
@ -858,18 +864,12 @@ set_window (Avision_Scanner* s)
|
||||||
|
|
||||||
/* this is normaly unsupported by avsion scanner.
|
/* this is normaly unsupported by avsion scanner.
|
||||||
* I clear this only to be shure if an other scanner knows about it ...
|
* I clear this only to be shure if an other scanner knows about it ...
|
||||||
* we do this via the gamma table (soon) ...
|
* we do this via the gamma table ...
|
||||||
*/
|
*/
|
||||||
cmd.window_descriptor.thresh = 128;
|
cmd.window_descriptor.thresh = 128;
|
||||||
cmd.window_descriptor.brightness = 128;
|
cmd.window_descriptor.brightness = 128;
|
||||||
cmd.window_descriptor.contrast = 128;
|
cmd.window_descriptor.contrast = 128;
|
||||||
|
|
||||||
/*
|
|
||||||
* cmd.window_descriptor.thresh = 1 + 2.55 * (SANE_UNFIX (s->val[OPT_THRESHOLD].w));
|
|
||||||
* cmd.window_descriptor.brightness = 128 + 1.28 * (SANE_UNFIX (s->val[OPT_BRIGHTNESS].w));
|
|
||||||
* cmd.window_descriptor.contrast = 128 + 1.28 * (SANE_UNFIX (s->val[OPT_CONTRAST].w));
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* mode dependant settings */
|
/* mode dependant settings */
|
||||||
switch (s->mode)
|
switch (s->mode)
|
||||||
{
|
{
|
||||||
|
@ -1177,17 +1177,6 @@ init_options (Avision_Scanner* s)
|
||||||
s->opt[OPT_CONTRAST].constraint.range = &percentage_range;
|
s->opt[OPT_CONTRAST].constraint.range = &percentage_range;
|
||||||
s->val[OPT_CONTRAST].w = SANE_FIX(0);
|
s->val[OPT_CONTRAST].w = SANE_FIX(0);
|
||||||
|
|
||||||
/* Threshold */
|
|
||||||
s->opt[OPT_THRESHOLD].name = SANE_NAME_THRESHOLD;
|
|
||||||
s->opt[OPT_THRESHOLD].title = SANE_TITLE_THRESHOLD;
|
|
||||||
s->opt[OPT_THRESHOLD].desc = SANE_DESC_THRESHOLD;
|
|
||||||
s->opt[OPT_THRESHOLD].type = SANE_TYPE_FIXED;
|
|
||||||
s->opt[OPT_THRESHOLD].unit = SANE_UNIT_PERCENT;
|
|
||||||
s->opt[OPT_THRESHOLD].constraint_type = SANE_CONSTRAINT_RANGE;
|
|
||||||
s->opt[OPT_THRESHOLD].constraint.range = &abs_percentage_range;
|
|
||||||
s->opt[OPT_THRESHOLD].cap = SANE_CAP_INACTIVE;
|
|
||||||
s->val[OPT_THRESHOLD].w = SANE_FIX(50);
|
|
||||||
|
|
||||||
/* Quality Scan */
|
/* Quality Scan */
|
||||||
s->opt[OPT_QSCAN].name = "quality-scan";
|
s->opt[OPT_QSCAN].name = "quality-scan";
|
||||||
s->opt[OPT_QSCAN].title = "Quality scan";
|
s->opt[OPT_QSCAN].title = "Quality scan";
|
||||||
|
@ -1374,6 +1363,11 @@ sane_init (SANE_Int* version_code, SANE_Auth_Callback authorize)
|
||||||
size_t len;
|
size_t len;
|
||||||
FILE *fp;
|
FILE *fp;
|
||||||
|
|
||||||
|
char line[PATH_MAX];
|
||||||
|
const char* cp;
|
||||||
|
char* word;
|
||||||
|
int linenumber = 0;
|
||||||
|
|
||||||
DBG (3, "sane_init\n");
|
DBG (3, "sane_init\n");
|
||||||
|
|
||||||
DBG_INIT();
|
DBG_INIT();
|
||||||
|
@ -1388,18 +1382,57 @@ sane_init (SANE_Int* version_code, SANE_Auth_Callback authorize)
|
||||||
return SANE_STATUS_GOOD;
|
return SANE_STATUS_GOOD;
|
||||||
}
|
}
|
||||||
|
|
||||||
while (sanei_config_read (dev_name, sizeof (dev_name), fp) )
|
while (sanei_config_read (line, sizeof (line), fp))
|
||||||
{
|
{
|
||||||
if (dev_name[0] == '#') /* ignore line comments */
|
word = 0;
|
||||||
continue;
|
linenumber++;
|
||||||
len = strlen (dev_name);
|
|
||||||
if (dev_name[len - 1] == '\n')
|
|
||||||
dev_name[--len] = '\0';
|
|
||||||
|
|
||||||
if (!len)
|
DBG(5, "sane_init: parsing config line \"%s\"\n",
|
||||||
continue; /* ignore empty lines */
|
line);
|
||||||
|
|
||||||
sanei_config_attach_matching_devices (dev_name, attach_one);
|
cp = sanei_config_get_string (line, &word);
|
||||||
|
|
||||||
|
if (!word || cp == line)
|
||||||
|
{
|
||||||
|
DBG(5, "sane_init: config file line %d: ignoring empty line\n",
|
||||||
|
linenumber);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (word[0] == '#')
|
||||||
|
{
|
||||||
|
DBG(5, "sane_init: config file line %d: ignoring comment line\n",
|
||||||
|
linenumber);
|
||||||
|
free (word);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strcmp (word, "option") == 0)
|
||||||
|
{
|
||||||
|
free (word);
|
||||||
|
word = 0;
|
||||||
|
cp = sanei_config_get_string (cp, &word);
|
||||||
|
|
||||||
|
if (strcmp (word, "force-a4") == 0)
|
||||||
|
{
|
||||||
|
DBG(3, "sane_init: config file line %d: enabling force-a4\n",
|
||||||
|
linenumber);
|
||||||
|
force_a4 = SANE_TRUE;
|
||||||
|
|
||||||
|
if (word)
|
||||||
|
free (word);
|
||||||
|
word = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
DBG(4, "sane_init: config file line %d: trying to attach `%s'\n",
|
||||||
|
linenumber, line);
|
||||||
|
|
||||||
|
sanei_config_attach_matching_devices (line, attach_one);
|
||||||
|
if (word)
|
||||||
|
free (word);
|
||||||
|
word = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
fclose (fp);
|
fclose (fp);
|
||||||
return SANE_STATUS_GOOD;
|
return SANE_STATUS_GOOD;
|
||||||
|
@ -1585,7 +1618,6 @@ sane_control_option (SANE_Handle handle, SANE_Int option,
|
||||||
|
|
||||||
case OPT_BRIGHTNESS:
|
case OPT_BRIGHTNESS:
|
||||||
case OPT_CONTRAST:
|
case OPT_CONTRAST:
|
||||||
case OPT_THRESHOLD:
|
|
||||||
case OPT_QSCAN:
|
case OPT_QSCAN:
|
||||||
case OPT_QCALIB:
|
case OPT_QCALIB:
|
||||||
case OPT_TRANS:
|
case OPT_TRANS:
|
||||||
|
@ -1631,11 +1663,8 @@ sane_control_option (SANE_Handle handle, SANE_Int option,
|
||||||
*info |= SANE_INFO_RELOAD_PARAMS;
|
*info |= SANE_INFO_RELOAD_PARAMS;
|
||||||
/* fall through */
|
/* fall through */
|
||||||
case OPT_PREVIEW:
|
case OPT_PREVIEW:
|
||||||
|
|
||||||
case OPT_BRIGHTNESS:
|
case OPT_BRIGHTNESS:
|
||||||
case OPT_CONTRAST:
|
case OPT_CONTRAST:
|
||||||
case OPT_THRESHOLD:
|
|
||||||
|
|
||||||
case OPT_QSCAN:
|
case OPT_QSCAN:
|
||||||
case OPT_QCALIB:
|
case OPT_QCALIB:
|
||||||
case OPT_TRANS:
|
case OPT_TRANS:
|
||||||
|
@ -1658,17 +1687,20 @@ sane_control_option (SANE_Handle handle, SANE_Int option,
|
||||||
{
|
{
|
||||||
s->mode = make_mode (s->val[OPT_MODE].s);
|
s->mode = make_mode (s->val[OPT_MODE].s);
|
||||||
|
|
||||||
if (s->mode == GREYSCALE)
|
/* the mode specific stuff */
|
||||||
{
|
if (s->mode == TRUECOLOR)
|
||||||
s->opt[OPT_GAMMA_VECTOR].cap &= ~SANE_CAP_INACTIVE;
|
|
||||||
}
|
|
||||||
else if (s->mode == TRUECOLOR)
|
|
||||||
{
|
{
|
||||||
s->opt[OPT_GAMMA_VECTOR].cap &= ~SANE_CAP_INACTIVE;
|
s->opt[OPT_GAMMA_VECTOR].cap &= ~SANE_CAP_INACTIVE;
|
||||||
s->opt[OPT_GAMMA_VECTOR_R].cap &= ~SANE_CAP_INACTIVE;
|
s->opt[OPT_GAMMA_VECTOR_R].cap &= ~SANE_CAP_INACTIVE;
|
||||||
s->opt[OPT_GAMMA_VECTOR_G].cap &= ~SANE_CAP_INACTIVE;
|
s->opt[OPT_GAMMA_VECTOR_G].cap &= ~SANE_CAP_INACTIVE;
|
||||||
s->opt[OPT_GAMMA_VECTOR_B].cap &= ~SANE_CAP_INACTIVE;
|
s->opt[OPT_GAMMA_VECTOR_B].cap &= ~SANE_CAP_INACTIVE;
|
||||||
}
|
}
|
||||||
|
else /* grey or binary */
|
||||||
|
{
|
||||||
|
s->opt[OPT_GAMMA_VECTOR].cap &= ~SANE_CAP_INACTIVE;
|
||||||
|
}
|
||||||
|
s->opt[OPT_BRIGHTNESS].cap &= ~SANE_CAP_INACTIVE;
|
||||||
|
s->opt[OPT_CONTRAST].cap &= ~SANE_CAP_INACTIVE;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -1676,7 +1708,11 @@ sane_control_option (SANE_Handle handle, SANE_Int option,
|
||||||
s->opt[OPT_GAMMA_VECTOR_R].cap |= SANE_CAP_INACTIVE;
|
s->opt[OPT_GAMMA_VECTOR_R].cap |= SANE_CAP_INACTIVE;
|
||||||
s->opt[OPT_GAMMA_VECTOR_G].cap |= SANE_CAP_INACTIVE;
|
s->opt[OPT_GAMMA_VECTOR_G].cap |= SANE_CAP_INACTIVE;
|
||||||
s->opt[OPT_GAMMA_VECTOR_B].cap |= SANE_CAP_INACTIVE;
|
s->opt[OPT_GAMMA_VECTOR_B].cap |= SANE_CAP_INACTIVE;
|
||||||
}
|
|
||||||
|
/* we have to set this inacitve, cause we use the gamma-table for it! */
|
||||||
|
s->opt[OPT_BRIGHTNESS].cap |= SANE_CAP_INACTIVE;
|
||||||
|
s->opt[OPT_CONTRAST].cap |= SANE_CAP_INACTIVE;
|
||||||
|
}
|
||||||
if (info)
|
if (info)
|
||||||
*info |= SANE_INFO_RELOAD_OPTIONS;
|
*info |= SANE_INFO_RELOAD_OPTIONS;
|
||||||
return SANE_STATUS_GOOD;
|
return SANE_STATUS_GOOD;
|
||||||
|
@ -1686,44 +1722,43 @@ sane_control_option (SANE_Handle handle, SANE_Int option,
|
||||||
{
|
{
|
||||||
if (s->val[option].s)
|
if (s->val[option].s)
|
||||||
free (s->val[option].s);
|
free (s->val[option].s);
|
||||||
s->val[option].s = strdup (val);
|
|
||||||
|
|
||||||
|
s->val[option].s = strdup (val);
|
||||||
s->mode = make_mode (s->val[OPT_MODE].s);
|
s->mode = make_mode (s->val[OPT_MODE].s);
|
||||||
|
|
||||||
if (info)
|
/* set to mode specific values */
|
||||||
*info |= SANE_INFO_RELOAD_OPTIONS | SANE_INFO_RELOAD_PARAMS;
|
if (s->mode == TRUECOLOR)
|
||||||
|
{
|
||||||
s->opt[OPT_BRIGHTNESS].cap |= SANE_CAP_INACTIVE;
|
|
||||||
s->opt[OPT_CONTRAST].cap |= SANE_CAP_INACTIVE;
|
|
||||||
s->opt[OPT_THRESHOLD].cap |= SANE_CAP_INACTIVE;
|
|
||||||
|
|
||||||
s->opt[OPT_CUSTOM_GAMMA].cap |= SANE_CAP_INACTIVE;
|
|
||||||
s->opt[OPT_GAMMA_VECTOR].cap |= SANE_CAP_INACTIVE;
|
|
||||||
s->opt[OPT_GAMMA_VECTOR_R].cap |= SANE_CAP_INACTIVE;
|
|
||||||
s->opt[OPT_GAMMA_VECTOR_G].cap |= SANE_CAP_INACTIVE;
|
|
||||||
s->opt[OPT_GAMMA_VECTOR_B].cap |= SANE_CAP_INACTIVE;
|
|
||||||
|
|
||||||
if (strcmp (val, "Thresholded") == 0)
|
|
||||||
s->opt[OPT_THRESHOLD].cap &= ~SANE_CAP_INACTIVE;
|
|
||||||
else {
|
|
||||||
s->opt[OPT_BRIGHTNESS].cap &= ~SANE_CAP_INACTIVE;
|
|
||||||
s->opt[OPT_CONTRAST].cap &= ~SANE_CAP_INACTIVE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* if (!binary) */
|
|
||||||
s->opt[OPT_CUSTOM_GAMMA].cap &= ~SANE_CAP_INACTIVE;
|
|
||||||
|
|
||||||
if (s->val[OPT_CUSTOM_GAMMA].w) {
|
|
||||||
if (strcmp (val, "Gray") == 0)
|
|
||||||
s->opt[OPT_GAMMA_VECTOR].cap &= ~SANE_CAP_INACTIVE;
|
|
||||||
else if (strcmp (val, "Color") == 0) {
|
|
||||||
s->opt[OPT_GAMMA_VECTOR].cap &= ~SANE_CAP_INACTIVE;
|
s->opt[OPT_GAMMA_VECTOR].cap &= ~SANE_CAP_INACTIVE;
|
||||||
s->opt[OPT_GAMMA_VECTOR_R].cap &= ~SANE_CAP_INACTIVE;
|
s->opt[OPT_GAMMA_VECTOR_R].cap &= ~SANE_CAP_INACTIVE;
|
||||||
s->opt[OPT_GAMMA_VECTOR_G].cap &= ~SANE_CAP_INACTIVE;
|
s->opt[OPT_GAMMA_VECTOR_G].cap &= ~SANE_CAP_INACTIVE;
|
||||||
s->opt[OPT_GAMMA_VECTOR_B].cap &= ~SANE_CAP_INACTIVE;
|
s->opt[OPT_GAMMA_VECTOR_B].cap &= ~SANE_CAP_INACTIVE;
|
||||||
}
|
}
|
||||||
}
|
else /* grey or mono */
|
||||||
|
{
|
||||||
|
s->opt[OPT_GAMMA_VECTOR].cap &= ~SANE_CAP_INACTIVE;
|
||||||
|
s->opt[OPT_GAMMA_VECTOR_R].cap |= SANE_CAP_INACTIVE;
|
||||||
|
s->opt[OPT_GAMMA_VECTOR_G].cap |= SANE_CAP_INACTIVE;
|
||||||
|
s->opt[OPT_GAMMA_VECTOR_B].cap |= SANE_CAP_INACTIVE;
|
||||||
|
}
|
||||||
|
|
||||||
|
s->opt[OPT_BRIGHTNESS].cap &= ~SANE_CAP_INACTIVE;
|
||||||
|
s->opt[OPT_CONTRAST].cap &= ~SANE_CAP_INACTIVE;
|
||||||
|
|
||||||
|
/* overwrite if OPT_CUSTOM_GAMMA == false */
|
||||||
|
if (!s->val[OPT_CUSTOM_GAMMA].w)
|
||||||
|
{
|
||||||
|
s->opt[OPT_GAMMA_VECTOR].cap |= SANE_CAP_INACTIVE;
|
||||||
|
s->opt[OPT_GAMMA_VECTOR_R].cap |= SANE_CAP_INACTIVE;
|
||||||
|
s->opt[OPT_GAMMA_VECTOR_G].cap |= SANE_CAP_INACTIVE;
|
||||||
|
s->opt[OPT_GAMMA_VECTOR_B].cap |= SANE_CAP_INACTIVE;
|
||||||
|
|
||||||
|
/* we have to set this inacitve, cause we use the gamma-table for it! */
|
||||||
|
s->opt[OPT_BRIGHTNESS].cap |= SANE_CAP_INACTIVE;
|
||||||
|
s->opt[OPT_CONTRAST].cap |= SANE_CAP_INACTIVE;
|
||||||
|
}
|
||||||
|
if (info)
|
||||||
|
*info |= SANE_INFO_RELOAD_OPTIONS | SANE_INFO_RELOAD_PARAMS;
|
||||||
return SANE_STATUS_GOOD;
|
return SANE_STATUS_GOOD;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -78,7 +78,6 @@ enum Avision_Option
|
||||||
OPT_ENHANCEMENT_GROUP,
|
OPT_ENHANCEMENT_GROUP,
|
||||||
OPT_BRIGHTNESS,
|
OPT_BRIGHTNESS,
|
||||||
OPT_CONTRAST,
|
OPT_CONTRAST,
|
||||||
OPT_THRESHOLD,
|
|
||||||
OPT_QSCAN,
|
OPT_QSCAN,
|
||||||
OPT_QCALIB,
|
OPT_QCALIB,
|
||||||
OPT_TRANS, /* Transparency Mode */
|
OPT_TRANS, /* Transparency Mode */
|
||||||
|
|
Ładowanie…
Reference in New Issue