Added threshold option for b&w.

DEVEL_2_0_BRANCH-1
Frank Zago 2002-09-07 21:32:25 +00:00
rodzic 1a62a5f0f0
commit da6aa74692
3 zmienionych plików z 70 dodań i 20 usunięć

Wyświetl plik

@ -48,7 +48,7 @@
/*--------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------*/
#define BUILD 7 /* 2002/08/30 */ #define BUILD 8 /* 2002/09/07 */
#define BACKEND_NAME teco1 #define BACKEND_NAME teco1
#define TECO_CONFIG_FILE "teco1.conf" #define TECO_CONFIG_FILE "teco1.conf"
@ -140,6 +140,14 @@ static const int dither_val[] = {
/*--------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------*/
static const SANE_Range threshold_range = {
0, /* minimum */
255, /* maximum */
0 /* quantization */
};
/*--------------------------------------------------------------------------*/
/* Define the supported scanners and their characteristics. */ /* Define the supported scanners and their characteristics. */
static const struct scanners_supported scanners[] = { static const struct scanners_supported scanners[] = {
{6, "TECO VM3510", /* *fake id*, see teco_identify_scanner */ {6, "TECO VM3510", /* *fake id*, see teco_identify_scanner */
@ -877,18 +885,43 @@ teco_send_gamma (Teco_Scanner * dev)
} }
else else
{ {
/*
* Shift is 1 for GAMMA_LENGTH == 256
* and 4 for GAMMA_LENGTH == 1024
*/
int shift = GAMMA_LENGTH >> 8;
for (i = 0; i < GAMMA_LENGTH; i++) if (dev->scan_mode == TECO_BW)
{ {
param.gamma[0 * GAMMA_LENGTH + i] = i / shift;
param.gamma[1 * GAMMA_LENGTH + i] = i / shift; int shift = GAMMA_LENGTH >> 8;
param.gamma[2 * GAMMA_LENGTH + i] = i / shift; /* Map threshold from a 0..255 scale to a
param.gamma[3 * GAMMA_LENGTH + i] = 0; * 0..GAMMA_LENGTH scale. */
unsigned int threshold =
dev->val[OPT_THRESHOLD].w * (GAMMA_LENGTH / 256);
for (i = 0; i < GAMMA_LENGTH; i++)
{
param.gamma[0 * GAMMA_LENGTH + i] = 0;
if (i < threshold)
param.gamma[1 * GAMMA_LENGTH + i] = 0;
else
param.gamma[1 * GAMMA_LENGTH + i] = 255;
param.gamma[2 * GAMMA_LENGTH + i] = 0;
param.gamma[3 * GAMMA_LENGTH + i] = 0;
}
}
else
{
/*
* Shift is 1 for GAMMA_LENGTH == 256
* and 4 for GAMMA_LENGTH == 1024
*/
int shift = GAMMA_LENGTH >> 8;
for (i = 0; i < GAMMA_LENGTH; i++)
{
param.gamma[0 * GAMMA_LENGTH + i] = i / shift;
param.gamma[1 * GAMMA_LENGTH + i] = i / shift;
param.gamma[2 * GAMMA_LENGTH + i] = i / shift;
param.gamma[3 * GAMMA_LENGTH + i] = 0;
}
} }
} }
@ -1167,6 +1200,18 @@ teco_init_options (Teco_Scanner * dev)
dev->opt[OPT_GAMMA_VECTOR_GRAY].constraint.range = &gamma_range; dev->opt[OPT_GAMMA_VECTOR_GRAY].constraint.range = &gamma_range;
dev->val[OPT_GAMMA_VECTOR_GRAY].wa = dev->gamma_GRAY; dev->val[OPT_GAMMA_VECTOR_GRAY].wa = dev->gamma_GRAY;
/* Threshold */
dev->opt[OPT_THRESHOLD].name = SANE_NAME_THRESHOLD;
dev->opt[OPT_THRESHOLD].title = SANE_TITLE_THRESHOLD;
dev->opt[OPT_THRESHOLD].desc = SANE_DESC_THRESHOLD;
dev->opt[OPT_THRESHOLD].type = SANE_TYPE_INT;
dev->opt[OPT_THRESHOLD].unit = SANE_UNIT_NONE;
dev->opt[OPT_THRESHOLD].size = sizeof (SANE_Int);
dev->opt[OPT_THRESHOLD].cap |= SANE_CAP_INACTIVE;
dev->opt[OPT_THRESHOLD].constraint_type = SANE_CONSTRAINT_RANGE;
dev->opt[OPT_THRESHOLD].constraint.range = &threshold_range;
dev->val[OPT_THRESHOLD].w = 128;
/* preview */ /* preview */
dev->opt[OPT_PREVIEW].name = SANE_NAME_PREVIEW; dev->opt[OPT_PREVIEW].name = SANE_NAME_PREVIEW;
dev->opt[OPT_PREVIEW].title = SANE_TITLE_PREVIEW; dev->opt[OPT_PREVIEW].title = SANE_TITLE_PREVIEW;
@ -1624,6 +1669,7 @@ sane_control_option (SANE_Handle handle, SANE_Int option,
case OPT_TL_X: case OPT_TL_X:
case OPT_BR_X: case OPT_BR_X:
case OPT_CUSTOM_GAMMA: case OPT_CUSTOM_GAMMA:
case OPT_THRESHOLD:
case OPT_PREVIEW: case OPT_PREVIEW:
*(SANE_Word *) val = dev->val[option].w; *(SANE_Word *) val = dev->val[option].w;
return SANE_STATUS_GOOD; return SANE_STATUS_GOOD;
@ -1679,6 +1725,7 @@ sane_control_option (SANE_Handle handle, SANE_Int option,
return SANE_STATUS_GOOD; return SANE_STATUS_GOOD;
/* Numeric side-effect free options */ /* Numeric side-effect free options */
case OPT_THRESHOLD:
case OPT_PREVIEW: case OPT_PREVIEW:
dev->val[option].w = *(SANE_Word *) val; dev->val[option].w = *(SANE_Word *) val;
return SANE_STATUS_GOOD; return SANE_STATUS_GOOD;
@ -1703,12 +1750,14 @@ sane_control_option (SANE_Handle handle, SANE_Int option,
dev->opt[OPT_GAMMA_VECTOR_G].cap |= SANE_CAP_INACTIVE; dev->opt[OPT_GAMMA_VECTOR_G].cap |= SANE_CAP_INACTIVE;
dev->opt[OPT_GAMMA_VECTOR_B].cap |= SANE_CAP_INACTIVE; dev->opt[OPT_GAMMA_VECTOR_B].cap |= SANE_CAP_INACTIVE;
dev->opt[OPT_GAMMA_VECTOR_GRAY].cap |= SANE_CAP_INACTIVE; dev->opt[OPT_GAMMA_VECTOR_GRAY].cap |= SANE_CAP_INACTIVE;
dev->opt[OPT_THRESHOLD].cap |= SANE_CAP_INACTIVE;
if (strcmp (dev->val[OPT_MODE].s, BLACK_WHITE_STR) == 0) if (strcmp (dev->val[OPT_MODE].s, BLACK_WHITE_STR) == 0)
{ {
dev->depth = 8; dev->depth = 8;
dev->scan_mode = TECO_BW; dev->scan_mode = TECO_BW;
dev->opt[OPT_DITHER].cap &= ~SANE_CAP_INACTIVE; dev->opt[OPT_DITHER].cap &= ~SANE_CAP_INACTIVE;
dev->opt[OPT_THRESHOLD].cap &= ~SANE_CAP_INACTIVE;
} }
else if (strcmp (dev->val[OPT_MODE].s, GRAY_STR) == 0) else if (strcmp (dev->val[OPT_MODE].s, GRAY_STR) == 0)
{ {

Wyświetl plik

@ -221,7 +221,7 @@ getbitfield (unsigned char *pageaddr, int mask, int shift)
/*--------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------*/
#define MAX_GAMMA_LENGTH 0x400 /* maximum number of value per color */ #define MAX_GAMMA_LENGTH 0x400 /* maximum number of value per color */
#define GAMMA_LENGTH (dev->def->num_gamma_color) /* number of value per color */ #define GAMMA_LENGTH (dev->def->num_gamma_color) /* number of value per color */
/*--------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------*/
enum Teco_Option enum Teco_Option
@ -245,6 +245,7 @@ enum Teco_Option
OPT_GAMMA_VECTOR_B, /* Custom Blue Gamma table */ OPT_GAMMA_VECTOR_B, /* Custom Blue Gamma table */
OPT_GAMMA_VECTOR_GRAY, /* Custom Grayscale Gamma table */ OPT_GAMMA_VECTOR_GRAY, /* Custom Grayscale Gamma table */
OPT_DITHER, OPT_DITHER,
OPT_THRESHOLD,
OPT_PREVIEW, OPT_PREVIEW,
/* must come last: */ /* must come last: */
@ -270,10 +271,10 @@ 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_VM3510, TECO_VM3510,
TECO_VM3520, TECO_VM3520,
TECO_VM353A, TECO_VM353A,
TECO_VM4542 TECO_VM4542
} }
tecoref; tecoref;
char *real_vendor; /* brand on the box */ char *real_vendor; /* brand on the box */
@ -285,10 +286,10 @@ struct scanners_supported
int y_resolution_max; /* maximum Y dpi */ int y_resolution_max; /* maximum Y dpi */
int pass; /* number of passes in color mode */ int pass; /* number of passes in color mode */
size_t num_gamma_color; /* number of value per color */
int window_size; /* size of the SCAN window */ size_t num_gamma_color; /* number of value per color */
int window_size; /* size of the SCAN window */
}; };

Wyświetl plik

@ -10,7 +10,7 @@
; ;
:backend "teco1" ; name of backend :backend "teco1" ; name of backend
:version "1.0-7" ; version of backend :version "1.0-8" ; version of backend
:status :beta ; :alpha, :beta, :stable, :new :status :beta ; :alpha, :beta, :stable, :new
:manpage "sane-teco1" ; name of manpage (if it exists) :manpage "sane-teco1" ; name of manpage (if it exists)
:url "http://fz.eryx.net/sane/#teco" ; backend's web page :url "http://fz.eryx.net/sane/#teco" ; backend's web page