kopia lustrzana https://gitlab.com/sane-project/backends
1037 wiersze
28 KiB
C
1037 wiersze
28 KiB
C
/* sane - Scanner Access Now Easy.
|
|
Copyright (C) 1999,2000 Tom Martone
|
|
This file is part of a SANE backend for Bell and Howell Copiscan II
|
|
Scanners using the Remote SCSI Controller(RSC).
|
|
|
|
This file is part of the SANE package.
|
|
|
|
This program is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU General Public License as
|
|
published by the Free Software Foundation; either version 2 of the
|
|
License, or (at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful, but
|
|
WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 59 Temple Place - Suite 330, Boston,
|
|
MA 02111-1307, USA.
|
|
|
|
As a special exception, the authors of SANE give permission for
|
|
additional uses of the libraries contained in this release of SANE.
|
|
|
|
The exception is that, if you link a SANE library with other files
|
|
to produce an executable, this does not by itself cause the
|
|
resulting executable to be covered by the GNU General Public
|
|
License. Your use of that executable is in no way restricted on
|
|
account of linking the SANE library code into it.
|
|
|
|
This exception does not, however, invalidate any other reasons why
|
|
the executable file might be covered by the GNU General Public
|
|
License.
|
|
|
|
If you submit changes to SANE to the maintainers to be included in
|
|
a subsequent release, you agree by submitting the changes that
|
|
those changes may be distributed with this exception intact.
|
|
|
|
If you write modifications of your own for SANE, it is your choice
|
|
whether to permit this exception to apply to your modifications.
|
|
If you do not wish that, delete this exception notice. */
|
|
|
|
#ifndef BH_H
|
|
#define BH_H 1
|
|
|
|
#ifndef PATH_MAX
|
|
#define PATH_MAX (1024)
|
|
#endif
|
|
|
|
#define BH_CONFIG_FILE "bh.conf"
|
|
|
|
/* number of barcode types that can be searched at one time */
|
|
#define NUM_SEARCH_BARS 6
|
|
/* number of additional scanning/decoding sections supported */
|
|
#define NUM_SECTIONS 8
|
|
/* number of possible reads per scan plus the extra one for
|
|
* the barcode file
|
|
*/
|
|
#define NUM_READS 56 + 1
|
|
|
|
/* specify sanity limits for autoborder detection and barcode decoding */
|
|
#define BH_AUTOBORDER_TRIES 100
|
|
#define BH_DECODE_TRIES 100
|
|
/* specify a fudge factor in mm for border around decoded barcodes */
|
|
#define BH_DECODE_FUDGE 1.0
|
|
|
|
/* section flags - what operation(s) to perform on section */
|
|
#define BH_SECTION_FRONT_IMAGE (1 << 0)
|
|
#define BH_SECTION_BACK_IMAGE (1 << 1)
|
|
#define BH_SECTION_FRONT_BAR (1 << 2)
|
|
#define BH_SECTION_BACK_BAR (1 << 3)
|
|
#define BH_SECTION_FRONT_PATCH (1 << 4)
|
|
#define BH_SECTION_BACK_PATCH (1 << 5)
|
|
|
|
typedef enum
|
|
{
|
|
BH_UNIT_INCH,
|
|
BH_UNIT_MM,
|
|
BH_UNIT_POINT
|
|
} bh_measureUnit;
|
|
|
|
typedef enum
|
|
{
|
|
BH_COMP_NONE,
|
|
BH_COMP_G31D,
|
|
BH_COMP_G32D,
|
|
BH_COMP_G42D
|
|
} bh_compress;
|
|
|
|
typedef enum
|
|
{
|
|
BH_ROTATION_0,
|
|
BH_ROTATION_90,
|
|
BH_ROTATION_180,
|
|
BH_ROTATION_270
|
|
} bh_rotation;
|
|
|
|
typedef enum
|
|
{
|
|
OPT_NUM_OPTS = 0,
|
|
|
|
OPT_MODE_GROUP,
|
|
/* inquiry string */
|
|
OPT_INQUIRY,
|
|
/* preview mode */
|
|
OPT_PREVIEW,
|
|
/* scan mode */
|
|
OPT_SCAN_MODE,
|
|
/* resolution */
|
|
OPT_RESOLUTION,
|
|
/* hardware compression */
|
|
OPT_COMPRESSION,
|
|
|
|
OPT_GEOMETRY_GROUP,
|
|
/* automatic border detection */
|
|
OPT_AUTOBORDER,
|
|
/* hardware rotation */
|
|
OPT_ROTATION,
|
|
/* hardware deskew */
|
|
OPT_DESKEW,
|
|
/* paper size */
|
|
OPT_PAPER_SIZE,
|
|
/* top-left x */
|
|
OPT_TL_X,
|
|
/* top-left y */
|
|
OPT_TL_Y,
|
|
/* bottom-right x */
|
|
OPT_BR_X,
|
|
/* bottom-right y */
|
|
OPT_BR_Y,
|
|
|
|
OPT_FEEDER_GROUP,
|
|
/* scan source (eg. ADF) */
|
|
OPT_SCAN_SOURCE,
|
|
/* scan in batch mode */
|
|
OPT_BATCH,
|
|
/* scan both sides of the page */
|
|
OPT_DUPLEX,
|
|
/* timeout in seconds with manual feed */
|
|
OPT_TIMEOUT_MANUAL,
|
|
/* timeout in seconds with ADF */
|
|
OPT_TIMEOUT_ADF,
|
|
/* check for page in ADF before scanning */
|
|
OPT_CHECK_ADF,
|
|
|
|
OPT_ENHANCEMENT_GROUP,
|
|
/* Enables the scanner's control panel */
|
|
OPT_CONTROL_PANEL,
|
|
/* ACE Function */
|
|
OPT_ACE_FUNCTION,
|
|
/* ACE Sensitivity */
|
|
OPT_ACE_SENSITIVITY,
|
|
/* Brightness */
|
|
OPT_BRIGHTNESS,
|
|
/* Threshold */
|
|
OPT_THRESHOLD,
|
|
/* Contrast */
|
|
OPT_CONTRAST,
|
|
/* Negative (reverse image) */
|
|
OPT_NEGATIVE,
|
|
|
|
OPT_ICON_GROUP,
|
|
/* Width of icon (thumbnail) image in pixels */
|
|
OPT_ICON_WIDTH,
|
|
/* Length of icon (thumbnail) image in pixels */
|
|
OPT_ICON_LENGTH,
|
|
|
|
OPT_BARCODE_GROUP,
|
|
/* Add <name> to barcode search priority. */
|
|
OPT_BARCODE_SEARCH_BAR,
|
|
/* Barcode search count (1-7, default 3). */
|
|
OPT_BARCODE_SEARCH_COUNT,
|
|
/* Barcode search mode.
|
|
* (1 = horizontal,2 = vertical, 6 = v then h, 9 = h then v).
|
|
*/
|
|
OPT_BARCODE_SEARCH_MODE,
|
|
/* Patch code min height (def=127 (5mm)) */
|
|
OPT_BARCODE_HMIN,
|
|
/* Barcode search timeout in ms
|
|
* (20-65535,default is disabled).
|
|
*/
|
|
OPT_BARCODE_SEARCH_TIMEOUT,
|
|
/* Specify image sections and functions
|
|
*/
|
|
OPT_SECTION,
|
|
/* Specifies the maximum relation from the widest to
|
|
* the smallest bar
|
|
*/
|
|
OPT_BARCODE_RELMAX,
|
|
/* Specifies the minimum number of bars in Bar/Patch code */
|
|
OPT_BARCODE_BARMIN,
|
|
/* Specifies the maximum number of bars in a Bar/Patch code */
|
|
OPT_BARCODE_BARMAX,
|
|
/* Specifies the image contrast used in decoding.
|
|
* Use higher values when there are more white pixels
|
|
* in the code
|
|
*/
|
|
OPT_BARCODE_CONTRAST,
|
|
/* Controls Patch Code detection. */
|
|
OPT_BARCODE_PATCHMODE,
|
|
|
|
/* must come last: */
|
|
NUM_OPTIONS
|
|
|
|
} BH_Option;
|
|
|
|
/* macros for accessing the value for an option within a scanning context */
|
|
#define _OPT_VAL_WORD(s, o) ((s)->val[(o)].w)
|
|
#define _OPT_VAL_WORD_THOUSANDTHS(s, o) \
|
|
(SANE_UNFIX(_OPT_VAL_WORD((s), (o))) * 1000.0 / MM_PER_INCH)
|
|
#define _OPT_VAL_STRING(s, o) ((s)->val[(o)].s)
|
|
#define _OPT_VAL_WORD_ARRAY(s, o) ((s)->val[(o)].wa)
|
|
|
|
|
|
typedef struct _BH_Paper
|
|
{
|
|
SANE_String name;
|
|
|
|
/* paper dimensions in mm */
|
|
double width, length;
|
|
} BH_Paper;
|
|
|
|
typedef struct _BH_Section
|
|
{
|
|
/* section dimensions - in millimeters */
|
|
u_long top, left, width, length;
|
|
|
|
/* compression type/arg/frameformat */
|
|
SANE_Byte compressiontype;
|
|
SANE_Byte compressionarg;
|
|
SANE_Frame format;
|
|
|
|
/* Flags (see BH_SECTION_...) indicating operation(s) to perform
|
|
* on the section. If zero, the section is completely disabled
|
|
* and will not even be defined in set_window.
|
|
*/
|
|
SANE_Word flags;
|
|
|
|
} BH_Section;
|
|
|
|
typedef struct _BH_Info
|
|
{
|
|
SANE_Range x_range;
|
|
SANE_Range y_range;
|
|
|
|
SANE_Int res_default;
|
|
SANE_Bool autoborder_default;
|
|
SANE_Bool batch_default;
|
|
SANE_Bool deskew_default;
|
|
SANE_Bool check_adf_default;
|
|
SANE_Bool duplex_default;
|
|
SANE_Int timeout_adf_default;
|
|
SANE_Int timeout_manual_default;
|
|
SANE_Bool control_panel_default;
|
|
|
|
/* additional discovered/guessed capabilities */
|
|
SANE_Bool canACE;
|
|
SANE_Bool canDuplex;
|
|
SANE_Bool canCheckADF;
|
|
|
|
/* standard information */
|
|
SANE_Byte devtype;
|
|
SANE_Char vendor[9]; /* model name */
|
|
SANE_Char product[17]; /* product name */
|
|
SANE_Char revision[5]; /* revision */
|
|
|
|
/* VPD information */
|
|
SANE_Bool canADF; /* is there an ADF available */
|
|
SANE_Bool colorBandW; /* can scanner do black and white */
|
|
SANE_Bool colorHalftone; /* can scanner do Halftone */
|
|
SANE_Bool canWhiteFrame; /* data processing: White Framing */
|
|
SANE_Bool canBlackFrame; /* data processing: Black Framing */
|
|
SANE_Bool canEdgeExtract; /* data processing: ACE: Edge Extraction */
|
|
SANE_Bool canNoiseFilter; /* data processing: ACE: Noise Filtering */
|
|
SANE_Bool canSmooth; /* data processing: ACE: Smoothing */
|
|
SANE_Bool canLineBold; /* data processing: ACE: LineBolding */
|
|
SANE_Bool comprG3_1D; /* compression: Group 3, 1 dimensional */
|
|
SANE_Bool comprG3_2D; /* compression: Group 3, 2 dimensional */
|
|
SANE_Bool comprG4; /* compression: Group 4 */
|
|
SANE_Bool canBorderRecog; /* can do border recognition */
|
|
SANE_Bool canBarCode; /* bar code support available */
|
|
SANE_Bool canIcon; /* icon support available */
|
|
SANE_Bool canSection; /* section support available */
|
|
SANE_Int lineMaxBytes; /* maximum bytes per scan-line */
|
|
|
|
/* jis information */
|
|
SANE_Int resBasicX; /* basic X resolution */
|
|
SANE_Int resBasicY; /* basic Y resolution */
|
|
SANE_Int resMaxX; /* maximum X resolution */
|
|
SANE_Int resMaxY; /* maximum Y resolution */
|
|
SANE_Int resMinX; /* minimum X resolution */
|
|
SANE_Int resMinY; /* minimum Y resolution */
|
|
SANE_Int resStdList[16+1]; /* list of available standard resolutions
|
|
* (first slot is the length)
|
|
*/
|
|
SANE_Int winWidth; /* length of window (in BasicX res DPI) */
|
|
SANE_Int winHeight; /* height of window (in BasicY res DPI) */
|
|
} BH_Info;
|
|
|
|
typedef struct _BH_Device BH_Device;
|
|
|
|
struct _BH_Device
|
|
{
|
|
BH_Device *next;
|
|
SANE_Device sane;
|
|
BH_Info info;
|
|
};
|
|
|
|
|
|
typedef struct _BH_Scanner BH_Scanner;
|
|
struct _BH_Scanner
|
|
{
|
|
/* all the state needed to define a scan request: */
|
|
|
|
/* linked list for housekeeping */
|
|
BH_Scanner *next;
|
|
|
|
/* scanner dependent/low-level state: */
|
|
BH_Device *hw;
|
|
|
|
/* SCSI filedescriptor */
|
|
int fd;
|
|
|
|
/* tempfile which is used to send decoded barcode data */
|
|
FILE *barf;
|
|
char barfname[PATH_MAX+1];
|
|
|
|
/* SANE option descriptors and values */
|
|
SANE_Option_Descriptor opt[NUM_OPTIONS];
|
|
Option_Value val[NUM_OPTIONS];
|
|
|
|
/* additional values that don't fit into Option_Value representation */
|
|
SANE_Byte search_bars[NUM_SEARCH_BARS];
|
|
BH_Section sections[NUM_SECTIONS];
|
|
SANE_Int num_sections;
|
|
|
|
/* SANE image parameters */
|
|
SANE_Parameters params;
|
|
|
|
/* state information - not options */
|
|
|
|
/* Basic Measurement Unit */
|
|
SANE_Int bmu;
|
|
/* Measurement Unit Divisor */
|
|
SANE_Int mud;
|
|
|
|
/* track data to be read. ReadList contains the codes of the read types
|
|
* (see BH_READ_TYPE...) to perform, readcnt is the total number of reads
|
|
* for this scan and readptr points to the current read operation.
|
|
*/
|
|
SANE_Byte readlist[NUM_READS];
|
|
SANE_Int readcnt, readptr;
|
|
|
|
u_long InvalidBytes;
|
|
SANE_Bool scanning;
|
|
SANE_Bool cancelled;
|
|
SANE_Bool backpage;
|
|
SANE_Bool barcodes;
|
|
SANE_Bool patchcodes;
|
|
SANE_Bool icons;
|
|
u_long iconwidth, iconlength;
|
|
SANE_Bool barcode_not_found;
|
|
};
|
|
|
|
static const SANE_Range u8_range =
|
|
{
|
|
0, /* minimum */
|
|
255, /* maximum */
|
|
0 /* quantization */
|
|
};
|
|
|
|
static const SANE_Range u16_range =
|
|
{
|
|
0, /* minimum */
|
|
65535, /* maximum */
|
|
0 /* quantization */
|
|
};
|
|
|
|
static const SANE_Range icon_range =
|
|
{
|
|
0, /* minimum */
|
|
3600, /* maximum */
|
|
8 /* quantization */
|
|
};
|
|
|
|
static const SANE_Range barcode_search_timeout_range =
|
|
{
|
|
20, /* minimum */
|
|
65535, /* maximum */
|
|
0 /* quantization */
|
|
};
|
|
|
|
static const SANE_Range barcode_hmin_range =
|
|
{
|
|
1, /* minimum */
|
|
1660, /* maximum (when converted from mm
|
|
* to thousandths will still be less
|
|
* than 65536)
|
|
*/
|
|
0 /* quantization */
|
|
};
|
|
|
|
static const SANE_Range barcode_search_count_range =
|
|
{
|
|
1, /* minimum */
|
|
7, /* maximum */
|
|
0 /* quantization */
|
|
};
|
|
|
|
static const SANE_Range barcode_relmax_range =
|
|
{
|
|
0, /* minimum */
|
|
6, /* maximum */
|
|
0 /* quantization */
|
|
};
|
|
|
|
static const SANE_Range barcode_contrast_range =
|
|
{
|
|
0, /* minimum */
|
|
6, /* maximum */
|
|
0 /* quantization */
|
|
};
|
|
|
|
static const SANE_Range barcode_patchmode_range =
|
|
{
|
|
0, /* minimum */
|
|
1, /* maximum */
|
|
0 /* quantization */
|
|
};
|
|
|
|
static const SANE_Range ace_function_range =
|
|
{
|
|
-4, /* minimum */
|
|
4, /* maximum */
|
|
0 /* quantization */
|
|
};
|
|
|
|
static const SANE_Range ace_sensitivity_range =
|
|
{
|
|
0, /* minimum */
|
|
9, /* maximum */
|
|
0 /* quantization */
|
|
};
|
|
|
|
static SANE_String_Const scan_mode_list[] =
|
|
{
|
|
"lineart",
|
|
"halftone",
|
|
0
|
|
};
|
|
|
|
static SANE_String_Const scan_mode_min_list[] =
|
|
{
|
|
"lineart",
|
|
0
|
|
};
|
|
|
|
static SANE_String_Const barcode_search_mode_list[] =
|
|
{
|
|
"horiz-vert", /* 9 */
|
|
"horizontal", /* 1 */
|
|
"vertical", /* 2 */
|
|
"vert-horiz", /* 6 */
|
|
0
|
|
};
|
|
|
|
static SANE_String_Const scan_source_list[] =
|
|
{
|
|
"Automatic Document Feeder",
|
|
"Manual Feed Tray",
|
|
0
|
|
};
|
|
|
|
static SANE_String_Const compression_list[] =
|
|
{
|
|
"none",
|
|
"g31d",
|
|
"g32d",
|
|
"g42d",
|
|
0
|
|
};
|
|
|
|
/* list of supported bar/patch codes */
|
|
static SANE_String_Const barcode_search_bar_list[] =
|
|
{
|
|
"none",
|
|
"ean-8",
|
|
"ean-13",
|
|
"reserved-ean-add",
|
|
"code39",
|
|
"code2-5-interleaved",
|
|
"code2-5-3lines-matrix",
|
|
"code2-5-3lines-datalogic",
|
|
"code2-5-5lines-industrial",
|
|
"patchcode",
|
|
"codabar",
|
|
"codabar-with-start-stop",
|
|
"code39ascii",
|
|
"code128",
|
|
"code2-5-5lines-iata",
|
|
0
|
|
};
|
|
|
|
/* list of supported rotation angles */
|
|
static SANE_String_Const rotation_list[] =
|
|
{
|
|
"0",
|
|
"90",
|
|
"180",
|
|
"270",
|
|
0
|
|
};
|
|
|
|
/* list of support paper sizes */
|
|
/* 'custom' MUST be item 0; otherwise a width or length of 0 indicates
|
|
* the maximum value supported by the scanner
|
|
*/
|
|
static const BH_Paper paper_sizes[] =
|
|
{
|
|
{"Custom", 0.0, 0.0},
|
|
{"Letter", 215.9, 279.4},
|
|
{"Legal", 215.9, 355.6},
|
|
{"A3", 297, 420},
|
|
{"A4", 210, 297},
|
|
{"A5", 148.5, 210},
|
|
{"A6", 105, 148.5},
|
|
{"B4", 250, 353},
|
|
{"B5", 182, 257},
|
|
{"Full", 0.0, 0.0},
|
|
};
|
|
|
|
/* MUST be kept in sync with paper_sizes */
|
|
static SANE_String_Const paper_list[] =
|
|
{
|
|
"Custom",
|
|
"Letter",
|
|
"Legal",
|
|
"A3",
|
|
"A4",
|
|
"A5",
|
|
"A6",
|
|
"B4",
|
|
"B5",
|
|
"Full",
|
|
0
|
|
};
|
|
|
|
static /* inline */ int _is_host_little_endian(void);
|
|
static /* inline */ int
|
|
_is_host_little_endian()
|
|
{
|
|
SANE_Int val = 255;
|
|
unsigned char *firstbyte = (unsigned char *) &val;
|
|
|
|
return (*firstbyte == 255) ? SANE_TRUE : SANE_FALSE;
|
|
}
|
|
|
|
static /* inline */ void
|
|
_lto2b(u_long val, SANE_Byte *bytes)
|
|
{
|
|
bytes[0] = (val >> 8) & 0xff;
|
|
bytes[1] = val & 0xff;
|
|
}
|
|
|
|
static /* inline */ void
|
|
_lto3b(u_long val, SANE_Byte *bytes)
|
|
{
|
|
bytes[0] = (val >> 16) & 0xff;
|
|
bytes[1] = (val >> 8) & 0xff;
|
|
bytes[2] = val & 0xff;
|
|
}
|
|
|
|
static /* inline */ void
|
|
_lto4b(u_long val, SANE_Byte *bytes)
|
|
{
|
|
bytes[0] = (val >> 24) & 0xff;
|
|
bytes[1] = (val >> 16) & 0xff;
|
|
bytes[2] = (val >> 8) & 0xff;
|
|
bytes[3] = val & 0xff;
|
|
}
|
|
|
|
static /* inline */ u_long
|
|
_2btol(SANE_Byte *bytes)
|
|
{
|
|
u_long rv;
|
|
|
|
rv = (bytes[0] << 8) | bytes[1];
|
|
|
|
return rv;
|
|
}
|
|
|
|
static /* inline */ u_long
|
|
_4btol(SANE_Byte *bytes)
|
|
{
|
|
u_long rv;
|
|
|
|
rv = (bytes[0] << 24) |
|
|
(bytes[1] << 16) |
|
|
(bytes[2] << 8) |
|
|
bytes[3];
|
|
|
|
return rv;
|
|
}
|
|
|
|
#define SANE_TITLE_SCAN_MODE_GROUP "Scan Mode"
|
|
#define SANE_TITLE_GEOMETRY_GROUP "Geometry"
|
|
#define SANE_TITLE_FEEDER_GROUP "Feeder"
|
|
#define SANE_TITLE_ENHANCEMENT_GROUP "Enhancement"
|
|
#define SANE_TITLE_ICON_GROUP "Icon"
|
|
#define SANE_TITLE_BARCODE_GROUP "Barcode"
|
|
|
|
#define SANE_NAME_AUTOBORDER "autoborder"
|
|
#define SANE_TITLE_AUTOBORDER "Autoborder"
|
|
#define SANE_DESC_AUTOBORDER "Enable Automatic Border Detection"
|
|
|
|
#define SANE_NAME_COMPRESSION "compression"
|
|
#define SANE_TITLE_COMPRESSION "Data Compression"
|
|
#define SANE_DESC_COMPRESSION "Sets the compression mode of the scanner"
|
|
|
|
#define SANE_NAME_ROTATION "rotation"
|
|
#define SANE_TITLE_ROTATION "Page Rotation"
|
|
#define SANE_DESC_ROTATION "Sets the page rotation mode of the scanner"
|
|
|
|
#define SANE_NAME_DESKEW "deskew"
|
|
#define SANE_TITLE_DESKEW "Page Deskew"
|
|
#define SANE_DESC_DESKEW "Enable Deskew Mode"
|
|
|
|
#define SANE_NAME_TIMEOUT_ADF "timeout-adf"
|
|
#define SANE_TITLE_TIMEOUT_ADF "ADF Timeout"
|
|
#define SANE_DESC_TIMEOUT_ADF "Sets the timeout in seconds for the ADF"
|
|
|
|
#define SANE_NAME_TIMEOUT_MANUAL "timeout-manual"
|
|
#define SANE_TITLE_TIMEOUT_MANUAL "Manual Timeout"
|
|
#define SANE_DESC_TIMEOUT_MANUAL "Sets the timeout in seconds for manual feeder"
|
|
|
|
#define SANE_NAME_BATCH "batch"
|
|
#define SANE_TITLE_BATCH "Batch"
|
|
#define SANE_DESC_BATCH "Enable Batch Mode"
|
|
|
|
#define SANE_NAME_CHECK_ADF "check-adf"
|
|
#define SANE_TITLE_CHECK_ADF "Check ADF"
|
|
#define SANE_DESC_CHECK_ADF "Check ADF Status prior to starting scan"
|
|
|
|
#define SANE_NAME_DUPLEX "duplex"
|
|
#define SANE_TITLE_DUPLEX "Duplex"
|
|
#define SANE_DESC_DUPLEX "Enable Duplex (Dual-Sided) Scanning"
|
|
|
|
#define SANE_NAME_BARCODE_SEARCH_COUNT "barcode-search-count"
|
|
#define SANE_TITLE_BARCODE_SEARCH_COUNT "Barcode Search Count"
|
|
#define SANE_DESC_BARCODE_SEARCH_COUNT "Number of barcodes to search for in the scanned image"
|
|
|
|
#define SANE_NAME_BARCODE_HMIN "barcode-hmin"
|
|
#define SANE_TITLE_BARCODE_HMIN "Barcode Minimum Height"
|
|
#define SANE_DESC_BARCODE_HMIN "Sets the Barcode Minimun Height (larger values increase recognition speed)"
|
|
|
|
#define SANE_NAME_BARCODE_SEARCH_MODE "barcode-search-mode"
|
|
#define SANE_TITLE_BARCODE_SEARCH_MODE "Barcode Search Mode"
|
|
#define SANE_DESC_BARCODE_SEARCH_MODE "Chooses the orientation of barcodes to be searched"
|
|
|
|
#define SANE_NAME_BARCODE_SEARCH_TIMEOUT "barcode-search-timeout"
|
|
#define SANE_TITLE_BARCODE_SEARCH_TIMEOUT "Barcode Search Timeout"
|
|
#define SANE_DESC_BARCODE_SEARCH_TIMEOUT "Sets the timeout for barcode searching"
|
|
|
|
#define SANE_NAME_BARCODE_SEARCH_BAR "barcode-search-bar"
|
|
#define SANE_TITLE_BARCODE_SEARCH_BAR "Barcode Search Bar"
|
|
#define SANE_DESC_BARCODE_SEARCH_BAR "Specifies the barcode type to search for"
|
|
|
|
#define SANE_NAME_SECTION "section"
|
|
#define SANE_TITLE_SECTION "Image/Barcode Search Sections"
|
|
#define SANE_DESC_SECTION "Specifies an image section and/or a barcode search region"
|
|
|
|
#define SANE_NAME_BARCODE_RELMAX "barcode-relmax"
|
|
#define SANE_TITLE_BARCODE_RELMAX "Barcode RelMax"
|
|
#define SANE_DESC_BARCODE_RELMAX "Specifies the maximum relation from the widest to the smallest bar"
|
|
|
|
#define SANE_NAME_BARCODE_BARMIN "barcode-barmin"
|
|
#define SANE_TITLE_BARCODE_BARMIN "Barcode Bar Minimum"
|
|
#define SANE_DESC_BARCODE_BARMIN "Specifies the minimum number of bars in Bar/Patch code"
|
|
|
|
#define SANE_NAME_BARCODE_BARMAX "barcode-barmax"
|
|
#define SANE_TITLE_BARCODE_BARMAX "Barcode Bar Maximum"
|
|
#define SANE_DESC_BARCODE_BARMAX "Specifies the maximum number of bars in a Bar/Patch code"
|
|
|
|
#define SANE_NAME_BARCODE_CONTRAST "barcode-contrast"
|
|
#define SANE_TITLE_BARCODE_CONTRAST "Barcode Contrast"
|
|
#define SANE_DESC_BARCODE_CONTRAST "Specifies the image contrast used in decoding. Use higher values when " \
|
|
"there are more white pixels in the code"
|
|
|
|
#define SANE_NAME_BARCODE_PATCHMODE "barcode-patchmode"
|
|
#define SANE_TITLE_BARCODE_PATCHMODE "Barcode Patch Mode"
|
|
#define SANE_DESC_BARCODE_PATCHMODE "Controls Patch Code detection."
|
|
|
|
#define SANE_NAME_CONTROL_PANEL "control-panel"
|
|
#define SANE_TITLE_CONTROL_PANEL "Control Panel "
|
|
#define SANE_DESC_CONTROL_PANEL "Enables the scanner's control panel"
|
|
|
|
#define SANE_NAME_ACE_FUNCTION "ace-function"
|
|
#define SANE_TITLE_ACE_FUNCTION "ACE Function"
|
|
#define SANE_DESC_ACE_FUNCTION "ACE Function"
|
|
|
|
#define SANE_NAME_ACE_SENSITIVITY "ace-sensitivity"
|
|
#define SANE_TITLE_ACE_SENSITIVITY "ACE Sensitivity"
|
|
#define SANE_DESC_ACE_SENSITIVITY "ACE Sensitivity"
|
|
|
|
#define SANE_NAME_ICON_WIDTH "icon-width"
|
|
#define SANE_TITLE_ICON_WIDTH "Icon Width"
|
|
#define SANE_DESC_ICON_WIDTH "Width of icon (thumbnail) image in pixels"
|
|
|
|
#define SANE_NAME_ICON_LENGTH "icon-length"
|
|
#define SANE_TITLE_ICON_LENGTH "Icon Length"
|
|
#define SANE_DESC_ICON_LENGTH "Length of icon (thumbnail) image in pixels"
|
|
|
|
#define SANE_NAME_PAPER_SIZE "paper-size"
|
|
#define SANE_TITLE_PAPER_SIZE "Paper Size"
|
|
#define SANE_DESC_PAPER_SIZE "Specify the scan window geometry by specifying the paper size " \
|
|
"of the documents to be scanned"
|
|
|
|
#define SANE_NAME_INQUIRY "inquiry"
|
|
#define SANE_TITLE_INQUIRY "Inquiry Data"
|
|
#define SANE_DESC_INQUIRY "Displays scanner inquiry data"
|
|
|
|
/* low level SCSI commands and buffers */
|
|
|
|
/* SCSI commands */
|
|
#define BH_SCSI_TEST_UNIT_READY 0x00
|
|
#define BH_SCSI_SET_WINDOW 0x24
|
|
#define BH_SCSI_GET_WINDOW 0x25
|
|
#define BH_SCSI_READ_SCANNED_DATA 0x28
|
|
#define BH_SCSI_INQUIRY 0x12
|
|
#define BH_SCSI_MODE_SELECT 0x15
|
|
#define BH_SCSI_START_SCAN 0x1b
|
|
#define BH_SCSI_MODE_SENSE 0x1a
|
|
#define BH_SCSI_GET_BUFFER_STATUS 0x34
|
|
#define BH_SCSI_OBJECT_POSITION 0x31
|
|
|
|
/* page codes used with BH_SCSI_INQUIRY */
|
|
#define BH_INQUIRY_STANDARD_PAGE_CODE 0x00
|
|
#define BH_INQUIRY_VPD_PAGE_CODE 0xC0
|
|
#define BH_INQUIRY_JIS_PAGE_CODE 0xF0
|
|
|
|
/* page codes used with BH_SCSI_MODE_SELECT and BH_SCSI_MODE_SENSE */
|
|
#define BH_MODE_MEASUREMENT_PAGE_CODE 0x03
|
|
#define BH_MODE_TIMEOUT_PAGE_CODE 0x20
|
|
#define BH_MODE_ICON_PAGE_CODE 0x21
|
|
#define BH_MODE_BARCODE_PRIORITY_PAGE_CODE 0x30
|
|
#define BH_MODE_BARCODE_PARAM1_PAGE_CODE 0x31
|
|
#define BH_MODE_BARCODE_PARAM2_PAGE_CODE 0x32
|
|
#define BH_MODE_BARCODE_PARAM3_PAGE_CODE 0x32
|
|
|
|
/* data type codes used with BH_SCSI_READ_SCANNED_DATA */
|
|
#define BH_SCSI_READ_TYPE_FRONT 0x80
|
|
/* 0x81 thru 0x88 read front page sections 1 thru 8 respectively */
|
|
#define BH_SCSI_READ_TYPE_BACK 0x90
|
|
/* 0x91 thru 0x98 read back page sections 1 thru 8 respectively */
|
|
#define BH_SCSI_READ_TYPE_FRONT_BARCODE 0xA0
|
|
/* 0xA1 thru 0xA8 read front page barcodes in sections 1 thru 8 respectively */
|
|
#define BH_SCSI_READ_TYPE_BACK_BARCODE 0xB0
|
|
/* 0xB1 thru 0xB8 read back page barcodes in sections 1 thru 8 respectively */
|
|
#define BH_SCSI_READ_TYPE_FRONT_PATCHCODE 0xC0
|
|
/* 0xC1 thru 0xC8 read front page patchcodes in sections 1 thru 8 respectively */
|
|
#define BH_SCSI_READ_TYPE_BACK_PATCHCODE 0xD0
|
|
/* 0xD1 thru 0xD8 read back page patchcodes in sections 1 thru 8 respectively */
|
|
#define BH_SCSI_READ_TYPE_FRONT_ICON 0x89
|
|
#define BH_SCSI_READ_TYPE_BACK_ICON 0x99
|
|
|
|
/* this one is not a real readtype; it's used to help transfer the barcode file */
|
|
#define BH_SCSI_READ_TYPE_SENDBARFILE 0xBB
|
|
|
|
#define BH_HAS_IMAGE_DATA(i) ((i) >= BH_SCSI_READ_TYPE_FRONT && \
|
|
(i) <= BH_SCSI_READ_TYPE_BACK_ICON)
|
|
|
|
/* batchmode codes used with BH_SCSI_SET_WINDOW */
|
|
#define BH_BATCH_DISABLE 0x00
|
|
#define BH_BATCH_ENABLE 0x01
|
|
#define BH_BATCH_TERMINATE 0x02
|
|
#define BH_BATCH_ABORT 0x03
|
|
|
|
/* deskew mode codes used with BH_SCSI_SET_WINDOW */
|
|
#define BH_DESKEW_DISABLE 0x00 /* border detection is assumed, see page 3-37 of 8000 manual */
|
|
#define BH_DESKEW_ENABLE 0x04 /* deskew and border detection */
|
|
|
|
/* used with BH_SCSI_SET_WINDOW, BH_SCSI_GET_WINDOW */
|
|
typedef struct _BH_SectionBlock {
|
|
SANE_Byte ul_x[4];
|
|
SANE_Byte ul_y[4];
|
|
SANE_Byte width[4];
|
|
SANE_Byte length[4];
|
|
SANE_Byte compressiontype;
|
|
SANE_Byte compressionarg;
|
|
SANE_Byte reserved[6];
|
|
} BH_SectionBlock;
|
|
|
|
/* used with BH_SCSI_SET_WINDOW, BH_SCSI_GET_WINDOW */
|
|
struct window_data { /* window descriptor block byte layout */
|
|
SANE_Byte windowid; /* 0 */
|
|
SANE_Byte autoborder; /* 1 */
|
|
SANE_Byte xres[2]; /* 2,3 */
|
|
SANE_Byte yres[2]; /* 4,5 */
|
|
SANE_Byte ulx[4]; /* 6-9 */
|
|
SANE_Byte uly[4]; /* 10-13 */
|
|
SANE_Byte windowwidth[4]; /* 14-17 */
|
|
SANE_Byte windowlength[4]; /* 18-21 */
|
|
SANE_Byte brightness; /* 22 */
|
|
SANE_Byte threshold; /* 23 */
|
|
SANE_Byte contrast; /* 24 */
|
|
SANE_Byte imagecomposition; /* 25 */
|
|
SANE_Byte bitsperpixel; /* 26 */
|
|
SANE_Byte halftonecode; /* 27 */
|
|
SANE_Byte halftoneid; /* 28 */
|
|
SANE_Byte paddingtype; /* 29 */
|
|
SANE_Byte bitordering[2]; /* 30,31 */
|
|
SANE_Byte compressiontype; /* 32 */
|
|
SANE_Byte compressionarg; /* 33 */
|
|
SANE_Byte reserved2[6]; /* 34-39 */
|
|
SANE_Byte remote; /* 40 */
|
|
SANE_Byte acefunction; /* 41 */
|
|
SANE_Byte acesensitivity; /* 42 */
|
|
SANE_Byte batchmode; /* 43 */
|
|
SANE_Byte reserved3[2]; /* 44,45 */
|
|
SANE_Byte border_rotation; /* 46 added this for copiscan 8080 */
|
|
SANE_Byte reserved4[17]; /* 47-63 added this for copiscan 8080 */
|
|
BH_SectionBlock sectionblock[NUM_SECTIONS];
|
|
};
|
|
|
|
/* used with BH_SCSI_READ_SCANNED_DATA */
|
|
/* structure for returned decoded barcode data */
|
|
struct barcode_data {
|
|
SANE_Byte reserved1[2];
|
|
SANE_Byte barcodetype[2];
|
|
SANE_Byte statusflag[2];
|
|
SANE_Byte barcodeorientation[2];
|
|
SANE_Byte posxa[2];
|
|
SANE_Byte posya[2];
|
|
SANE_Byte posxb[2];
|
|
SANE_Byte posyb[2];
|
|
SANE_Byte posxc[2];
|
|
SANE_Byte posyc[2];
|
|
SANE_Byte posxd[2];
|
|
SANE_Byte posyd[2];
|
|
SANE_Byte barcodesearchtime[2];
|
|
SANE_Byte reserved2[13];
|
|
SANE_Byte barcodelen;
|
|
SANE_Byte barcodedata[160];
|
|
};
|
|
|
|
/* structure for returned icon data block */
|
|
struct icon_data {
|
|
SANE_Byte windowwidth[4];
|
|
SANE_Byte windowlength[4];
|
|
SANE_Byte iconwidth[4];
|
|
SANE_Byte iconwidthbytes[4];
|
|
SANE_Byte iconlength[4];
|
|
SANE_Byte bitordering;
|
|
SANE_Byte reserved[7];
|
|
SANE_Byte icondatalen[4];
|
|
};
|
|
|
|
|
|
/* used with BH_SCSI_INQUIRY */
|
|
|
|
/* Standard Data [EVPD=0] */
|
|
struct inquiry_standard_data {
|
|
SANE_Byte devtype;
|
|
SANE_Byte reserved[7];
|
|
SANE_Byte vendor[8];
|
|
SANE_Byte product[16];
|
|
SANE_Byte revision[4];
|
|
};
|
|
|
|
/* VPD Information [EVPD=1, PageCode=C0H] */
|
|
struct inquiry_vpd_data {
|
|
SANE_Byte devtype;
|
|
SANE_Byte pagecode;
|
|
SANE_Byte reserved1;
|
|
SANE_Byte alloclen;
|
|
SANE_Byte adf;
|
|
SANE_Byte reserved2[2];
|
|
SANE_Byte imagecomposition;
|
|
SANE_Byte imagedataprocessing[2];
|
|
SANE_Byte compression;
|
|
SANE_Byte reserved3;
|
|
SANE_Byte sizerecognition;
|
|
SANE_Byte optionalfeatures;
|
|
SANE_Byte xmaxoutputbytes[2];
|
|
};
|
|
|
|
|
|
/* JIS Information [EVPD=1, PageCode=F0H] */
|
|
struct inquiry_jis_data {
|
|
SANE_Byte devtype;
|
|
SANE_Byte pagecode;
|
|
SANE_Byte jisversion;
|
|
SANE_Byte reserved1;
|
|
SANE_Byte alloclen;
|
|
SANE_Byte basicxres[2];
|
|
SANE_Byte basicyres[2];
|
|
SANE_Byte resolutionstep;
|
|
SANE_Byte maxxres[2];
|
|
SANE_Byte maxyres[2];
|
|
SANE_Byte minxres[2];
|
|
SANE_Byte minyres[2];
|
|
SANE_Byte standardres[2];
|
|
SANE_Byte windowwidth[4];
|
|
SANE_Byte windowlength[4];
|
|
SANE_Byte functions;
|
|
SANE_Byte reserved2;
|
|
};
|
|
|
|
/* used with BH_SCSI_MODE_SELECT and BH_SCSI_MODE_SENSE */
|
|
|
|
/* Scanning Measurement Parameters PageCode=03H */
|
|
struct mode_page_03 {
|
|
SANE_Byte modedatalen;
|
|
SANE_Byte mediumtype;
|
|
SANE_Byte devicespecificparam;
|
|
SANE_Byte blockdescriptorlen;
|
|
|
|
SANE_Byte pagecode;
|
|
SANE_Byte paramlen;
|
|
SANE_Byte bmu;
|
|
SANE_Byte reserved1;
|
|
SANE_Byte mud[2];
|
|
SANE_Byte reserved2[2];
|
|
};
|
|
|
|
/* Scan Command Timeout PageCode=20H */
|
|
struct mode_page_20 {
|
|
SANE_Byte modedatalen;
|
|
SANE_Byte mediumtype;
|
|
SANE_Byte devicespecificparam;
|
|
SANE_Byte blockdescriptorlen;
|
|
|
|
SANE_Byte pagecode;
|
|
SANE_Byte paramlen;
|
|
SANE_Byte timeoutmanual;
|
|
SANE_Byte timeoutadf;
|
|
SANE_Byte reserved[4];
|
|
};
|
|
|
|
/* Icon Definition PageCode=21H */
|
|
struct mode_page_21 {
|
|
SANE_Byte modedatalen;
|
|
SANE_Byte mediumtype;
|
|
SANE_Byte devicespecificparam;
|
|
SANE_Byte blockdescriptorlen;
|
|
|
|
SANE_Byte pagecode;
|
|
SANE_Byte paramlen;
|
|
SANE_Byte iconwidth[2];
|
|
SANE_Byte iconlength[2];
|
|
SANE_Byte reserved[2];
|
|
};
|
|
|
|
/* Bar/Patch Code search priority order PageCode=30H */
|
|
struct mode_page_30 {
|
|
SANE_Byte modedatalen;
|
|
SANE_Byte mediumtype;
|
|
SANE_Byte devicespecificparam;
|
|
SANE_Byte blockdescriptorlen;
|
|
|
|
SANE_Byte pagecode;
|
|
SANE_Byte paramlen;
|
|
SANE_Byte priority[6];
|
|
};
|
|
|
|
/* Bar/Patch Code search parameters 1 of 3 PageCode=31H */
|
|
struct mode_page_31 {
|
|
SANE_Byte modedatalen;
|
|
SANE_Byte mediumtype;
|
|
SANE_Byte devicespecificparam;
|
|
SANE_Byte blockdescriptorlen;
|
|
|
|
SANE_Byte pagecode;
|
|
SANE_Byte paramlen;
|
|
SANE_Byte minbarheight[2];
|
|
SANE_Byte searchcount;
|
|
SANE_Byte searchmode;
|
|
SANE_Byte searchtimeout[2];
|
|
};
|
|
|
|
/* Bar/Patch Code search parameters 2 of 3 PageCode=32H */
|
|
struct mode_page_32 {
|
|
SANE_Byte modedatalen;
|
|
SANE_Byte mediumtype;
|
|
SANE_Byte devicespecificparam;
|
|
SANE_Byte blockdescriptorlen;
|
|
|
|
SANE_Byte pagecode;
|
|
SANE_Byte paramlen;
|
|
SANE_Byte relmax[2];
|
|
SANE_Byte barmin[2];
|
|
SANE_Byte barmax[2];
|
|
};
|
|
|
|
/* Bar/Patch Code search parameters 3 of 3 PageCode=33H */
|
|
struct mode_page_33 {
|
|
SANE_Byte modedatalen;
|
|
SANE_Byte mediumtype;
|
|
SANE_Byte devicespecificparam;
|
|
SANE_Byte blockdescriptorlen;
|
|
|
|
SANE_Byte pagecode;
|
|
SANE_Byte paramlen;
|
|
SANE_Byte barcodecontrast[2];
|
|
SANE_Byte patchmode[2];
|
|
SANE_Byte reserved[2];
|
|
};
|
|
|
|
#ifndef sane_isbasicframe
|
|
#define SANE_FRAME_TEXT 10
|
|
#define SANE_FRAME_JPEG 11
|
|
#define SANE_FRAME_G31D 12
|
|
#define SANE_FRAME_G32D 13
|
|
#define SANE_FRAME_G42D 14
|
|
#define sane_strframe(f) ( (f) == SANE_FRAME_GRAY ? "gray" : \
|
|
(f) == SANE_FRAME_RGB ? "RGB" : \
|
|
(f) == SANE_FRAME_RED ? "red" : \
|
|
(f) == SANE_FRAME_GREEN ? "green" : \
|
|
(f) == SANE_FRAME_BLUE ? "blue" : \
|
|
(f) == SANE_FRAME_TEXT ? "text" : \
|
|
(f) == SANE_FRAME_JPEG ? "jpeg" : \
|
|
(f) == SANE_FRAME_G31D ? "g31d" : \
|
|
(f) == SANE_FRAME_G32D ? "g32d" : \
|
|
(f) == SANE_FRAME_G42D ? "g42d" : \
|
|
"unknown" )
|
|
|
|
#define sane_isbasicframe(f) ( (f) == SANE_FRAME_GRAY || \
|
|
(f) == SANE_FRAME_RGB || \
|
|
(f) == SANE_FRAME_RED || \
|
|
(f) == SANE_FRAME_GREEN || \
|
|
(f) == SANE_FRAME_BLUE )
|
|
|
|
#endif
|
|
|
|
#endif /* BH_H */
|