kopia lustrzana https://gitlab.com/sane-project/backends
From gerard Klaver and Michael Holler - Better detection of the scanner. Added white level. More work on some color resolutions.
rodzic
a44da4ed1e
commit
681c7e6efe
293
backend/teco2.c
293
backend/teco2.c
|
@ -91,7 +91,7 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* For debugging purposes: output a stream straight out from the
|
/* For debugging purposes: output a stream straight out from the
|
||||||
* scanner without reordering the colors. */
|
* scanner without reordering the colors, 0=normal, 1 = raw. */
|
||||||
static int raw_output = 0;
|
static int raw_output = 0;
|
||||||
|
|
||||||
/*--------------------------------------------------------------------------*/
|
/*--------------------------------------------------------------------------*/
|
||||||
|
@ -156,6 +156,14 @@ static const SANE_Range threshold_range = {
|
||||||
|
|
||||||
/*--------------------------------------------------------------------------*/
|
/*--------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
static const SANE_Range white_level_range = {
|
||||||
|
0, /* minimum */
|
||||||
|
64, /* maximum */
|
||||||
|
1 /* quantization */
|
||||||
|
};
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------*/
|
||||||
|
|
||||||
/* Gamma range */
|
/* Gamma range */
|
||||||
static const SANE_Range gamma_range = {
|
static const SANE_Range gamma_range = {
|
||||||
0, /* minimum */
|
0, /* minimum */
|
||||||
|
@ -168,21 +176,24 @@ static const SANE_Range gamma_range = {
|
||||||
static const struct dpi_color_adjust vm3564_dpi_color_adjust[] = {
|
static const struct dpi_color_adjust vm3564_dpi_color_adjust[] = {
|
||||||
|
|
||||||
/*dpi, x, y, z, color sequence R G or B, 0 (-) or 1 (+) color skewing, lines skewing */
|
/*dpi, x, y, z, color sequence R G or B, 0 (-) or 1 (+) color skewing, lines skewing */
|
||||||
{25, 1, 0, 2, 0, 0},
|
{25, 1, 0, 2, 0, 0}, /* Not tested */
|
||||||
{40, 1, 0, 2, 0, 0},
|
{50, 1, 2, 0, 0, 1}, /* Not tested */
|
||||||
{50, 1, 0, 2, 0, 1},
|
{75, 1, 0, 2, 1, 1}, /* Not tested */
|
||||||
{60, 1, 0, 2, 1, 0},
|
{150, 1, 0, 2, 1, 2}, /* Not tested */
|
||||||
{72, 1, 2, 0, 0, 1},
|
{160, 1, 0, 2, 1, 2}, /* Not tested */
|
||||||
{75, 1, 0, 2, 1, 1},
|
{225, 1, 0, 2, 1, 3}, /* Not tested */
|
||||||
{100, 2, 1, 0, 0, 1},
|
{300, 1, 0, 2, 1, 4}, /* Not tested */
|
||||||
{120, 1, 0, 2, 1, 1},
|
|
||||||
{150, 1, 0, 2, 1, 2},
|
/*{305, 1, 0, 2, 1, 4}, Not tested *
|
||||||
{160, 1, 0, 2, 1, 1},
|
*{310, 1, 0, 2, 1, 4}, Not tested *
|
||||||
{175, 1, 0, 2, 1, 1},
|
*{315, 1, 0, 2, 1, 4}, Not tested */
|
||||||
{180, 1, 0, 2, 1, 1},
|
{375, 1, 0, 2, 1, 5}, /* Not tested */
|
||||||
{200, 2, 1, 0, 0, 1},
|
/*{380, 1, 0, 2, 1, 5}, Not tested *
|
||||||
{225, 1, 0, 2, 1, 2},
|
*{385, 1, 0, 2, 1, 5}, Not tested */
|
||||||
{300, 1, 0, 2, 1, 2},
|
{450, 1, 0, 2, 1, 6}, /* Not tested */
|
||||||
|
/*{455, 1, 0, 2, 1, 6}, Not tested */
|
||||||
|
{525, 1, 0, 2, 1, 7}, /* Not tested */
|
||||||
|
{600, 1, 0, 2, 1, 8}, /* Not tested */
|
||||||
/* must be the last entry */
|
/* must be the last entry */
|
||||||
{0, 0, 0, 0, 0, 0}
|
{0, 0, 0, 0, 0, 0}
|
||||||
};
|
};
|
||||||
|
@ -190,53 +201,65 @@ static const struct dpi_color_adjust vm3564_dpi_color_adjust[] = {
|
||||||
/* Used for VM356A only */
|
/* Used for VM356A only */
|
||||||
|
|
||||||
static const struct dpi_color_adjust vm356a_dpi_color_adjust[] = {
|
static const struct dpi_color_adjust vm356a_dpi_color_adjust[] = {
|
||||||
|
|
||||||
|
/* All values with ydpi > 300 result in a wrong proportion for */
|
||||||
|
/* the scan. The proportion can be adjusted with the following */
|
||||||
|
/* command: convert -geometry (dpi/max_xdpi * 100%)x100% */
|
||||||
|
/* max_xdpi is for the vm356a constant with 300 dpi */
|
||||||
|
/* e.g. 600dpi adjust with: convert -geometry 200%x100% */
|
||||||
|
|
||||||
|
/* All resolutions in increments of 25 are testede, only the shown */
|
||||||
|
/* bring back good results */
|
||||||
|
|
||||||
|
/* all of the folowing values give good results */
|
||||||
|
|
||||||
/*dpi, x, y, z, color sequence R G or B, 0 (-) or 1 (+) color skewing, lines skewing */
|
/*dpi, x, y, z, color sequence R G or B, 0 (-) or 1 (+) color skewing, lines skewing */
|
||||||
{25, 1, 0, 2, 0, 0}, /* ok */
|
/* some values disabled because of choice of nearby values to keep usertable short */
|
||||||
{50, 1, 0, 2, 0, 1},
|
{25, 1, 0, 2, 0, 0},
|
||||||
{75, 1, 0, 2, 1, 1}, /* ok */
|
{50, 1, 2, 0, 0, 1},
|
||||||
{150, 1, 0, 2, 1, 2}, /* ok */
|
{75, 1, 0, 2, 1, 1},
|
||||||
{160, 1, 0, 2, 1, 2}, /* ok */
|
{150, 1, 0, 2, 1, 2},
|
||||||
{225, 1, 0, 2, 1, 2}, /* ok */
|
/* {160, 1, 0, 2, 1, 2}, ok */
|
||||||
{300, 1, 0, 2, 1, 2}, /* ok */
|
{225, 1, 0, 2, 1, 3},
|
||||||
|
{300, 1, 0, 2, 1, 4},
|
||||||
{305, 1, 0, 2, 1, 2}, /* ok, but wrong proportion */
|
/* {305, 1, 0, 2, 1, 4}, ok, *
|
||||||
{310, 1, 0, 2, 1, 2}, /* ok, but wrong proportion */
|
* {310, 1, 0, 2, 1, 4}, ok, *
|
||||||
{315, 1, 0, 2, 1, 2}, /* ok, but wrong proportion */
|
* {315, 1, 0, 2, 1, 4}, ok, */
|
||||||
{375, 1, 0, 2, 1, 2}, /* ok, but wrong proportion */
|
{375, 1, 0, 2, 1, 5},
|
||||||
{380, 1, 0, 2, 1, 2}, /* ok, but wrong proportion */
|
/* {380, 1, 0, 2, 1, 5}, ok, *
|
||||||
{385, 1, 0, 2, 1, 2}, /* ok, but wrong proportion */
|
* {385, 1, 0, 2, 1, 5}, ok, */
|
||||||
{450, 1, 0, 2, 1, 2}, /* ok, but wrong proportion */
|
{450, 1, 0, 2, 1, 6},
|
||||||
{455, 1, 0, 2, 1, 2}, /* ok, but wrong proportion */
|
/* {455, 1, 0, 2, 1, 6}, ok, */
|
||||||
{525, 1, 0, 2, 1, 2}, /* ok, but wrong proportion */
|
{525, 1, 0, 2, 1, 7},
|
||||||
{600, 1, 0, 2, 1, 2}, /* ok, but wrong proportion */
|
{600, 1, 0, 2, 1, 8},
|
||||||
|
|
||||||
/* text Michael Hoeller */
|
|
||||||
/* all increments by 5 from 20 to 600 are checked */
|
|
||||||
/* with 85, 165, 155 good picture but not colour setup works */
|
|
||||||
/* with 65, 200 and 320 crashes the driver */
|
|
||||||
|
|
||||||
/* {0, 1, 0, 2, 1, 1} general setup NOK for all dpi values */
|
|
||||||
/* 150, 225 and 300 should be OK*/
|
|
||||||
|
|
||||||
/* must be the last entry */
|
/* must be the last entry */
|
||||||
{0, 0, 0, 0, 0, 0}
|
{0, 0, 0, 0, 0, 0}
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Used for the VM3575 only */
|
/* Used for the VM3575 only */
|
||||||
|
|
||||||
static const struct dpi_color_adjust vm3575_dpi_color_adjust[] = {
|
static const struct dpi_color_adjust vm3575_dpi_color_adjust[] = {
|
||||||
|
|
||||||
|
/* All values with ydpi > 300 result in a wrong proportion for */
|
||||||
|
/* the scan. The proportion can be adjusted with the following */
|
||||||
|
/* command: convert -geometry (dpi/max_xdpi * 100%)x100% */
|
||||||
|
/* max_xdpi is for the vm3575 constant with 300 dpi */
|
||||||
|
/* e.g. 600dpi adjust with: convert -geometry 200%x100% */
|
||||||
|
|
||||||
{50, 2, 0, 1, 1, 1},
|
{50, 2, 0, 1, 1, 1},
|
||||||
{60, 2, 1, 0, 0, 2},
|
{60, 2, 1, 0, 0, 2},
|
||||||
|
/* {75, 2, 0, 1, 1, 2}, NOK, effects in scan, also with twain driver*/
|
||||||
{100, 2, 1, 0, 0, 3},
|
{100, 2, 1, 0, 0, 3},
|
||||||
{120, 2, 0, 1, 1, 3},
|
{120, 2, 0, 1, 1, 3},
|
||||||
{150, 2, 0, 1, 1, 4},
|
{150, 2, 0, 1, 1, 4},
|
||||||
|
/* {180, 2, 1, 0, 0, 4}, NOK, skewing problem*/
|
||||||
{225, 2, 0, 1, 1, 6},
|
{225, 2, 0, 1, 1, 6},
|
||||||
{300, 2, 0, 1, 1, 8},
|
{300, 2, 0, 1, 1, 8},
|
||||||
|
{375, 2, 0, 1, 1, 10},
|
||||||
{375, 2, 0, 1, 1, 10}, /* ok, but wrong y proportion */
|
{450, 2, 0, 1, 1, 12},
|
||||||
{450, 2, 0, 1, 1, 12}, /* ok, but wrong y proportion */
|
{525, 2, 0, 1, 1, 14},
|
||||||
{525, 2, 0, 1, 1, 14}, /* ok, but wrong y proportion */
|
{600, 2, 0, 1, 1, 16},
|
||||||
{600, 2, 0, 1, 1, 16}, /* ok, but wrong y proportion */
|
|
||||||
|
|
||||||
/* must be the last entry */
|
/* must be the last entry */
|
||||||
{0, 0, 0, 0, 0, 0}
|
{0, 0, 0, 0, 0, 0}
|
||||||
|
@ -302,15 +325,29 @@ static const struct scanners_supported scanners[] = {
|
||||||
{SANE_FIX (0), SANE_FIX (8.5 * MM_PER_INCH), 0},
|
{SANE_FIX (0), SANE_FIX (8.5 * MM_PER_INCH), 0},
|
||||||
{SANE_FIX (0), SANE_FIX (11.7 * MM_PER_INCH), 0},
|
{SANE_FIX (0), SANE_FIX (11.7 * MM_PER_INCH), 0},
|
||||||
vm3564_dpi_color_adjust},
|
vm3564_dpi_color_adjust},
|
||||||
|
|
||||||
{6, "TECO VM356A",
|
{6, "TECO VM356A",
|
||||||
TECO_VM356A,
|
TECO_VM356A,
|
||||||
"Relisys", "APOLLO Express 3",
|
"Relisys", "APOLLO Express 3",
|
||||||
{1, 600, 1}, /* resolution */
|
{1, 600, 1}, /* resolution */
|
||||||
300, 600, /* max x and Y resolution */
|
300, 600, /* max x and Y resolution */
|
||||||
2550, 12, 3, 0, /* calibration */
|
2550, 12, 3, 1, /* calibration */
|
||||||
|
/* dots/inch * x-length, calibration samples, tot.bytes for 3 colors, default SANE_TECO2_CAL_ALGO value */
|
||||||
{SANE_FIX (0), SANE_FIX (8.5 * MM_PER_INCH), 0},
|
{SANE_FIX (0), SANE_FIX (8.5 * MM_PER_INCH), 0},
|
||||||
{SANE_FIX (0), SANE_FIX (11.7 * MM_PER_INCH), 0},
|
{SANE_FIX (0), SANE_FIX (11.7 * MM_PER_INCH), 0},
|
||||||
vm356a_dpi_color_adjust},
|
vm356a_dpi_color_adjust},
|
||||||
|
|
||||||
|
{6, "TECO VM356A",
|
||||||
|
TECO_VM356A,
|
||||||
|
"Primax", "Jewel 4800",
|
||||||
|
{1, 600, 1}, /* resolution */
|
||||||
|
300, 600, /* max x and Y resolution */
|
||||||
|
2550, 12, 3, 1, /* calibration */
|
||||||
|
/* dots/inch * x-length, calibration samples, tot.bytes for 3 colors, default SANE_TECO2_CAL_ALGO value */
|
||||||
|
{SANE_FIX (0), SANE_FIX (8.5 * MM_PER_INCH), 0},
|
||||||
|
{SANE_FIX (0), SANE_FIX (11.7 * MM_PER_INCH), 0},
|
||||||
|
vm356a_dpi_color_adjust},
|
||||||
|
|
||||||
{6, "TECO VM3575",
|
{6, "TECO VM3575",
|
||||||
TECO_VM3575,
|
TECO_VM3575,
|
||||||
"Relisys", "SCORPIO Super 3",
|
"Relisys", "SCORPIO Super 3",
|
||||||
|
@ -320,6 +357,17 @@ static const struct scanners_supported scanners[] = {
|
||||||
{SANE_FIX (0), SANE_FIX (8.5 * MM_PER_INCH), 0},
|
{SANE_FIX (0), SANE_FIX (8.5 * MM_PER_INCH), 0},
|
||||||
{SANE_FIX (0), SANE_FIX (11.7 * MM_PER_INCH), 0},
|
{SANE_FIX (0), SANE_FIX (11.7 * MM_PER_INCH), 0},
|
||||||
vm3575_dpi_color_adjust},
|
vm3575_dpi_color_adjust},
|
||||||
|
|
||||||
|
{6, "TECO VM3575",
|
||||||
|
TECO_VM3575,
|
||||||
|
"Relisys", "AVEC Super 3",
|
||||||
|
{1, 600, 1}, /* resolution */
|
||||||
|
300, 600, /* max x and Y resolution */
|
||||||
|
2550, 12, 6, 1, /* calibration */
|
||||||
|
{SANE_FIX (0), SANE_FIX (8.5 * MM_PER_INCH), 0},
|
||||||
|
{SANE_FIX (0), SANE_FIX (11.7 * MM_PER_INCH), 0},
|
||||||
|
vm3575_dpi_color_adjust},
|
||||||
|
|
||||||
{6, "TECO VM656A",
|
{6, "TECO VM656A",
|
||||||
TECO_VM656A,
|
TECO_VM656A,
|
||||||
"Relisys", "APOLLO Express 6",
|
"Relisys", "APOLLO Express 6",
|
||||||
|
@ -329,6 +377,7 @@ static const struct scanners_supported scanners[] = {
|
||||||
{SANE_FIX (0), SANE_FIX (210), 0},
|
{SANE_FIX (0), SANE_FIX (210), 0},
|
||||||
{SANE_FIX (0), SANE_FIX (297), 0},
|
{SANE_FIX (0), SANE_FIX (297), 0},
|
||||||
vm656a_dpi_color_adjust},
|
vm656a_dpi_color_adjust},
|
||||||
|
|
||||||
{6, "TECO VM6575",
|
{6, "TECO VM6575",
|
||||||
TECO_VM6575,
|
TECO_VM6575,
|
||||||
"Relisys", "SCORPIO Pro",
|
"Relisys", "SCORPIO Pro",
|
||||||
|
@ -338,6 +387,17 @@ static const struct scanners_supported scanners[] = {
|
||||||
{SANE_FIX (0), SANE_FIX (8.5 * MM_PER_INCH), 0},
|
{SANE_FIX (0), SANE_FIX (8.5 * MM_PER_INCH), 0},
|
||||||
{SANE_FIX (0), SANE_FIX (11.7 * MM_PER_INCH), 0},
|
{SANE_FIX (0), SANE_FIX (11.7 * MM_PER_INCH), 0},
|
||||||
vm6575_dpi_color_adjust},
|
vm6575_dpi_color_adjust},
|
||||||
|
|
||||||
|
{6, "TECO VM6575",
|
||||||
|
TECO_VM6575,
|
||||||
|
"Primax", "Profi 9600",
|
||||||
|
{1, 600, 1}, /* resolution */
|
||||||
|
600, 1200, /* max x and Y resolution */
|
||||||
|
5100, 8, 6, 0, /* calibration */
|
||||||
|
{SANE_FIX (0), SANE_FIX (8.5 * MM_PER_INCH), 0},
|
||||||
|
{SANE_FIX (0), SANE_FIX (11.7 * MM_PER_INCH), 0},
|
||||||
|
vm6575_dpi_color_adjust},
|
||||||
|
|
||||||
{6, "TECO VM6586",
|
{6, "TECO VM6586",
|
||||||
TECO_VM6586,
|
TECO_VM6586,
|
||||||
"Relisys", "SCORPIO Pro-S",
|
"Relisys", "SCORPIO Pro-S",
|
||||||
|
@ -346,6 +406,16 @@ static const struct scanners_supported scanners[] = {
|
||||||
5100, 8, 6, 0, /* calibration */
|
5100, 8, 6, 0, /* calibration */
|
||||||
{SANE_FIX (0), SANE_FIX (8.5 * MM_PER_INCH), 0},
|
{SANE_FIX (0), SANE_FIX (8.5 * MM_PER_INCH), 0},
|
||||||
{SANE_FIX (0), SANE_FIX (11.7 * MM_PER_INCH), 0},
|
{SANE_FIX (0), SANE_FIX (11.7 * MM_PER_INCH), 0},
|
||||||
|
vm6586_dpi_color_adjust},
|
||||||
|
|
||||||
|
{6, "TECO VM6586",
|
||||||
|
TECO_VM6586,
|
||||||
|
"Primax", "Profi 19200",
|
||||||
|
{1, 600, 1}, /* resolution */
|
||||||
|
600, 1200, /* max x and Y resolution */
|
||||||
|
5100, 8, 6, 0, /* calibration */
|
||||||
|
{SANE_FIX (0), SANE_FIX (8.5 * MM_PER_INCH), 0},
|
||||||
|
{SANE_FIX (0), SANE_FIX (11.7 * MM_PER_INCH), 0},
|
||||||
vm6586_dpi_color_adjust}
|
vm6586_dpi_color_adjust}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -683,16 +753,36 @@ teco_identify_scanner (Teco_Scanner * dev)
|
||||||
* backend supports that one. */
|
* backend supports that one. */
|
||||||
for (i = 0; i < NELEMS (scanners); i++)
|
for (i = 0; i < NELEMS (scanners); i++)
|
||||||
{
|
{
|
||||||
|
|
||||||
if (dev->scsi_type == scanners[i].scsi_type &&
|
if (dev->scsi_type == scanners[i].scsi_type &&
|
||||||
strcmp (dev->scsi_teco_name, scanners[i].scsi_teco_name) == 0)
|
strcmp (dev->scsi_teco_name, scanners[i].scsi_teco_name) == 0)
|
||||||
{
|
{
|
||||||
|
|
||||||
DBG (DBG_error, "teco_identify_scanner: scanner supported\n");
|
DBG (DBG_error, "teco_identify_scanner: scanner supported\n");
|
||||||
|
|
||||||
dev->def = &(scanners[i]);
|
/*patch for VM356A Jewel or Apollo text in frontend-+ others-------------- */
|
||||||
|
|
||||||
|
if (strncmp (dev->scsi_vendor, "RELISYS", 1) == 0 ||
|
||||||
|
strncmp (dev->scsi_vendor, " ", 1) == 0)
|
||||||
|
{
|
||||||
|
DBG (DBG_error,
|
||||||
|
"teco_identify_scanner: scanner detected with this teco_name and first brand/name entry in table\n");
|
||||||
|
|
||||||
|
dev->def = &(scanners[i]);
|
||||||
|
|
||||||
|
return (SANE_TRUE);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
i++;
|
||||||
|
|
||||||
|
DBG (DBG_error,
|
||||||
|
"teco_identify_scanner: scanner detected with this teco_name and second brand/name entry in table\n");
|
||||||
|
|
||||||
|
dev->def = &(scanners[i]);
|
||||||
|
|
||||||
|
return (SANE_TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
return (SANE_TRUE);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1051,7 +1141,8 @@ teco_do_calibration (Teco_Scanner * dev)
|
||||||
size_t size;
|
size_t size;
|
||||||
int i;
|
int i;
|
||||||
int j;
|
int j;
|
||||||
int colsub;
|
int colsub0;
|
||||||
|
int colsub1;
|
||||||
int *tmp_buf; /* hold the temporary calibration */
|
int *tmp_buf; /* hold the temporary calibration */
|
||||||
size_t tmp_buf_size;
|
size_t tmp_buf_size;
|
||||||
const char *calibration_algo;
|
const char *calibration_algo;
|
||||||
|
@ -1075,14 +1166,22 @@ teco_do_calibration (Teco_Scanner * dev)
|
||||||
{
|
{
|
||||||
case TECO_VM3564:
|
case TECO_VM3564:
|
||||||
case TECO_VM356A:
|
case TECO_VM356A:
|
||||||
colsub = 0x110;
|
/* white level calibration correction */
|
||||||
|
/* 0x110 or 272 is middle value */
|
||||||
|
colsub0 = 240 + (dev->val[OPT_WHITE_LEVEL].w);
|
||||||
|
/* 14000 is middle value */
|
||||||
|
colsub1 = 12720 + (40 * dev->val[OPT_WHITE_LEVEL].w);
|
||||||
break;
|
break;
|
||||||
case TECO_VM3575:
|
case TECO_VM3575:
|
||||||
colsub = 0x1100;
|
/* 0x1100 or 4352 is middle value */
|
||||||
|
colsub0 = 4096 + (8 * dev->val[OPT_WHITE_LEVEL].w);
|
||||||
|
/* 4206639 is middle value */
|
||||||
|
colsub1 = 4142639 + (2000 * dev->val[OPT_WHITE_LEVEL].w);
|
||||||
break;
|
break;
|
||||||
/* For VM6575, 656A, 6586 until otherwise default value is used */
|
/* For VM6575, 656A, 6586 until otherwise default value is used */
|
||||||
default:
|
default:
|
||||||
colsub = 0x1000;
|
colsub0 = 0x1000;
|
||||||
|
colsub1 = 4206639;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1180,11 +1279,11 @@ teco_do_calibration (Teco_Scanner * dev)
|
||||||
|
|
||||||
if (cal_algo == 1)
|
if (cal_algo == 1)
|
||||||
{
|
{
|
||||||
tmp_buf[j] = (4206639 * dev->def->cal_lines) / tmp_buf[j];
|
tmp_buf[j] = (colsub1 * dev->def->cal_lines) / tmp_buf[j];
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
tmp_buf[j] = colsub - (tmp_buf[j] / dev->def->cal_lines);
|
tmp_buf[j] = colsub0 - (tmp_buf[j] / dev->def->cal_lines);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1789,6 +1888,18 @@ teco_init_options (Teco_Scanner * dev)
|
||||||
dev->opt[OPT_PREVIEW].cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT;
|
dev->opt[OPT_PREVIEW].cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT;
|
||||||
dev->val[OPT_PREVIEW].w = SANE_FALSE;
|
dev->val[OPT_PREVIEW].w = SANE_FALSE;
|
||||||
|
|
||||||
|
/* white level calibration manual correction */
|
||||||
|
dev->opt[OPT_WHITE_LEVEL].name = SANE_NAME_WHITE_LEVEL;
|
||||||
|
dev->opt[OPT_WHITE_LEVEL].title = SANE_TITLE_WHITE_LEVEL;
|
||||||
|
dev->opt[OPT_WHITE_LEVEL].desc = SANE_DESC_WHITE_LEVEL;
|
||||||
|
dev->opt[OPT_WHITE_LEVEL].type = SANE_TYPE_INT;
|
||||||
|
dev->opt[OPT_WHITE_LEVEL].unit = SANE_UNIT_NONE;
|
||||||
|
dev->opt[OPT_WHITE_LEVEL].constraint_type = SANE_CONSTRAINT_RANGE;
|
||||||
|
dev->opt[OPT_WHITE_LEVEL].constraint.range = &white_level_range;
|
||||||
|
dev->val[OPT_WHITE_LEVEL].w = 32; /* to get middle value */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* Lastly, set the default scan mode. This might change some
|
/* Lastly, set the default scan mode. This might change some
|
||||||
* values previously set here. */
|
* values previously set here. */
|
||||||
sane_control_option (dev, OPT_MODE, SANE_ACTION_SET_VALUE,
|
sane_control_option (dev, OPT_MODE, SANE_ACTION_SET_VALUE,
|
||||||
|
@ -2413,6 +2524,7 @@ sane_control_option (SANE_Handle handle, SANE_Int option,
|
||||||
case OPT_CUSTOM_GAMMA:
|
case OPT_CUSTOM_GAMMA:
|
||||||
case OPT_PREVIEW:
|
case OPT_PREVIEW:
|
||||||
case OPT_THRESHOLD:
|
case OPT_THRESHOLD:
|
||||||
|
case OPT_WHITE_LEVEL:
|
||||||
*(SANE_Word *) val = dev->val[option].w;
|
*(SANE_Word *) val = dev->val[option].w;
|
||||||
return SANE_STATUS_GOOD;
|
return SANE_STATUS_GOOD;
|
||||||
|
|
||||||
|
@ -2461,6 +2573,7 @@ sane_control_option (SANE_Handle handle, SANE_Int option,
|
||||||
case OPT_BR_X:
|
case OPT_BR_X:
|
||||||
case OPT_THRESHOLD:
|
case OPT_THRESHOLD:
|
||||||
case OPT_RESOLUTION:
|
case OPT_RESOLUTION:
|
||||||
|
case OPT_WHITE_LEVEL:
|
||||||
if (info)
|
if (info)
|
||||||
{
|
{
|
||||||
*info |= SANE_INFO_RELOAD_PARAMS;
|
*info |= SANE_INFO_RELOAD_PARAMS;
|
||||||
|
@ -2500,6 +2613,7 @@ sane_control_option (SANE_Handle handle, SANE_Int option,
|
||||||
dev->opt[OPT_DITHER].cap |= SANE_CAP_INACTIVE;
|
dev->opt[OPT_DITHER].cap |= SANE_CAP_INACTIVE;
|
||||||
dev->opt[OPT_FILTER_COLOR].cap |= SANE_CAP_INACTIVE;
|
dev->opt[OPT_FILTER_COLOR].cap |= SANE_CAP_INACTIVE;
|
||||||
dev->opt[OPT_THRESHOLD].cap |= SANE_CAP_INACTIVE;
|
dev->opt[OPT_THRESHOLD].cap |= SANE_CAP_INACTIVE;
|
||||||
|
dev->opt[OPT_WHITE_LEVEL].cap |= SANE_CAP_INACTIVE;
|
||||||
|
|
||||||
/* This the default resolution range, except for the
|
/* This the default resolution range, except for the
|
||||||
* VM3575, VM3564, VM356A and VM6586 in color mode. */
|
* VM3575, VM3564, VM356A and VM6586 in color mode. */
|
||||||
|
@ -2518,10 +2632,32 @@ sane_control_option (SANE_Handle handle, SANE_Int option,
|
||||||
{
|
{
|
||||||
dev->scan_mode = TECO_GRAYSCALE;
|
dev->scan_mode = TECO_GRAYSCALE;
|
||||||
dev->depth = 8;
|
dev->depth = 8;
|
||||||
dev->opt[OPT_CUSTOM_GAMMA].cap &= ~SANE_CAP_INACTIVE;
|
|
||||||
if (dev->val[OPT_CUSTOM_GAMMA].w)
|
switch (dev->def->tecoref)
|
||||||
{
|
{
|
||||||
dev->opt[OPT_GAMMA_VECTOR_GRAY].cap &= ~SANE_CAP_INACTIVE;
|
case TECO_VM3564:
|
||||||
|
case TECO_VM356A:
|
||||||
|
dev->opt[OPT_WHITE_LEVEL].cap &= ~SANE_CAP_INACTIVE;
|
||||||
|
break;
|
||||||
|
case TECO_VM3575:
|
||||||
|
dev->opt[OPT_WHITE_LEVEL].cap &= ~SANE_CAP_INACTIVE;
|
||||||
|
dev->opt[OPT_CUSTOM_GAMMA].cap &= ~SANE_CAP_INACTIVE;
|
||||||
|
if (dev->val[OPT_CUSTOM_GAMMA].w)
|
||||||
|
{
|
||||||
|
dev->opt[OPT_GAMMA_VECTOR_GRAY].cap &=
|
||||||
|
~SANE_CAP_INACTIVE;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case TECO_VM656A:
|
||||||
|
case TECO_VM6575:
|
||||||
|
case TECO_VM6586:
|
||||||
|
dev->opt[OPT_CUSTOM_GAMMA].cap &= ~SANE_CAP_INACTIVE;
|
||||||
|
if (dev->val[OPT_CUSTOM_GAMMA].w)
|
||||||
|
{
|
||||||
|
dev->opt[OPT_GAMMA_VECTOR_GRAY].cap &=
|
||||||
|
~SANE_CAP_INACTIVE;
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
dev->opt[OPT_FILTER_COLOR].cap &= ~SANE_CAP_INACTIVE;
|
dev->opt[OPT_FILTER_COLOR].cap &= ~SANE_CAP_INACTIVE;
|
||||||
}
|
}
|
||||||
|
@ -2529,14 +2665,35 @@ sane_control_option (SANE_Handle handle, SANE_Int option,
|
||||||
{
|
{
|
||||||
dev->scan_mode = TECO_COLOR;
|
dev->scan_mode = TECO_COLOR;
|
||||||
dev->depth = 8;
|
dev->depth = 8;
|
||||||
dev->opt[OPT_CUSTOM_GAMMA].cap &= ~SANE_CAP_INACTIVE;
|
|
||||||
if (dev->val[OPT_CUSTOM_GAMMA].w)
|
|
||||||
{
|
|
||||||
dev->opt[OPT_GAMMA_VECTOR_R].cap &= ~SANE_CAP_INACTIVE;
|
|
||||||
dev->opt[OPT_GAMMA_VECTOR_G].cap &= ~SANE_CAP_INACTIVE;
|
|
||||||
dev->opt[OPT_GAMMA_VECTOR_B].cap &= ~SANE_CAP_INACTIVE;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
switch (dev->def->tecoref)
|
||||||
|
{
|
||||||
|
case TECO_VM3564:
|
||||||
|
case TECO_VM356A:
|
||||||
|
dev->opt[OPT_WHITE_LEVEL].cap &= ~SANE_CAP_INACTIVE;
|
||||||
|
break;
|
||||||
|
case TECO_VM3575:
|
||||||
|
dev->opt[OPT_WHITE_LEVEL].cap &= ~SANE_CAP_INACTIVE;
|
||||||
|
dev->opt[OPT_CUSTOM_GAMMA].cap &= ~SANE_CAP_INACTIVE;
|
||||||
|
if (dev->val[OPT_CUSTOM_GAMMA].w)
|
||||||
|
{
|
||||||
|
dev->opt[OPT_GAMMA_VECTOR_R].cap &= ~SANE_CAP_INACTIVE;
|
||||||
|
dev->opt[OPT_GAMMA_VECTOR_G].cap &= ~SANE_CAP_INACTIVE;
|
||||||
|
dev->opt[OPT_GAMMA_VECTOR_B].cap &= ~SANE_CAP_INACTIVE;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case TECO_VM656A:
|
||||||
|
case TECO_VM6575:
|
||||||
|
case TECO_VM6586:
|
||||||
|
dev->opt[OPT_CUSTOM_GAMMA].cap &= ~SANE_CAP_INACTIVE;
|
||||||
|
if (dev->val[OPT_CUSTOM_GAMMA].w)
|
||||||
|
{
|
||||||
|
dev->opt[OPT_GAMMA_VECTOR_R].cap &= ~SANE_CAP_INACTIVE;
|
||||||
|
dev->opt[OPT_GAMMA_VECTOR_G].cap &= ~SANE_CAP_INACTIVE;
|
||||||
|
dev->opt[OPT_GAMMA_VECTOR_B].cap &= ~SANE_CAP_INACTIVE;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
/* The VM3575, VM3564, VM356A and VM6586 supports only a handful of resolution. Do that here.
|
/* The VM3575, VM3564, VM356A and VM6586 supports only a handful of resolution. Do that here.
|
||||||
* Ugly! */
|
* Ugly! */
|
||||||
if (dev->resolutions_list != NULL)
|
if (dev->resolutions_list != NULL)
|
||||||
|
@ -2634,7 +2791,7 @@ sane_get_parameters (SANE_Handle handle, SANE_Parameters * params)
|
||||||
* in the SET WINDOWS command. */
|
* in the SET WINDOWS command. */
|
||||||
if (dev->val[OPT_PREVIEW].w == SANE_TRUE)
|
if (dev->val[OPT_PREVIEW].w == SANE_TRUE)
|
||||||
{
|
{
|
||||||
/* for VM356A, no good 50 dpi scan possible */
|
/* for VM356A, no good 50 dpi scan possible, now leave as */
|
||||||
|
|
||||||
switch (dev->def->tecoref)
|
switch (dev->def->tecoref)
|
||||||
{
|
{
|
||||||
|
|
|
@ -293,9 +293,9 @@ enum Teco_Option
|
||||||
OPT_GAMMA_VECTOR_GRAY, /* Custom Grayscale Gamma table */
|
OPT_GAMMA_VECTOR_GRAY, /* Custom Grayscale Gamma table */
|
||||||
|
|
||||||
OPT_DITHER,
|
OPT_DITHER,
|
||||||
OPT_FILTER_COLOR, /* which color to filter */
|
OPT_FILTER_COLOR, /* which color to filter */
|
||||||
OPT_THRESHOLD, /* Threshold */
|
OPT_THRESHOLD, /* Threshold */
|
||||||
|
OPT_WHITE_LEVEL, /*white level correction */
|
||||||
|
|
||||||
OPT_PREVIEW,
|
OPT_PREVIEW,
|
||||||
|
|
||||||
|
@ -308,6 +308,8 @@ typedef union
|
||||||
SANE_Word w; /* word */
|
SANE_Word w; /* word */
|
||||||
SANE_Word *wa; /* word array */
|
SANE_Word *wa; /* word array */
|
||||||
SANE_String s; /* string */
|
SANE_String s; /* string */
|
||||||
|
SANE_Range white_level_range;
|
||||||
|
|
||||||
}
|
}
|
||||||
Option_Value;
|
Option_Value;
|
||||||
|
|
||||||
|
@ -322,7 +324,7 @@ struct scanners_supported
|
||||||
char scsi_teco_name[12]; /* real name of the scanner */
|
char scsi_teco_name[12]; /* real name of the scanner */
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
TECO_VM3564,
|
TECO_VM3564,
|
||||||
TECO_VM356A,
|
TECO_VM356A,
|
||||||
TECO_VM3575,
|
TECO_VM3575,
|
||||||
TECO_VM6575,
|
TECO_VM6575,
|
||||||
|
@ -340,8 +342,8 @@ struct scanners_supported
|
||||||
|
|
||||||
int cal_length; /* size of a calibration line in pixels */
|
int cal_length; /* size of a calibration line in pixels */
|
||||||
int cal_lines; /* number of calibration lines to read */
|
int cal_lines; /* number of calibration lines to read */
|
||||||
int cal_col_len; /* number of byte to code one color */
|
int cal_col_len; /* number of byte to code one color */
|
||||||
int cal_algo; /* default algo to use to compute calibration line */
|
int cal_algo; /* default algo to use to compute calibration line */
|
||||||
|
|
||||||
/* Minimum and maximum width and length supported. */
|
/* Minimum and maximum width and length supported. */
|
||||||
SANE_Range x_range;
|
SANE_Range x_range;
|
||||||
|
|
Ładowanie…
Reference in New Issue