kopia lustrzana https://gitlab.com/sane-project/backends
380 wiersze
13 KiB
C
380 wiersze
13 KiB
C
/***************************************************************************
|
|
* SANE - Scanner Access Now Easy.
|
|
|
|
microtek.h
|
|
|
|
This file Copyright 2002 Matthew Marjanovic
|
|
|
|
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.
|
|
|
|
***************************************************************************
|
|
|
|
This file implements a SANE backend for Microtek scanners.
|
|
|
|
(feedback to: mtek-bugs@mir.com)
|
|
(for latest info: http://www.mir.com/mtek/)
|
|
|
|
***************************************************************************/
|
|
|
|
|
|
#ifndef microtek_h
|
|
#define microtek_h
|
|
|
|
#include <sys/types.h>
|
|
|
|
|
|
/*******************************************************************/
|
|
/***** enumeration of Option Descriptors *****/
|
|
/*******************************************************************/
|
|
|
|
enum Mtek_Option
|
|
{
|
|
OPT_NUM_OPTS = 0,
|
|
|
|
OPT_MODE_GROUP,
|
|
OPT_MODE, /* -a,b,c,g */
|
|
OPT_HALFTONE_PATTERN, /* -H */
|
|
OPT_RESOLUTION, /* -r */
|
|
OPT_EXP_RES,
|
|
OPT_NEGATIVE, /* -n */
|
|
OPT_SPEED, /* -v */
|
|
OPT_SOURCE, /* -t */
|
|
OPT_PREVIEW,
|
|
OPT_CALIB_ONCE,
|
|
|
|
OPT_GEOMETRY_GROUP, /* -f .... */
|
|
OPT_TL_X, /* top-left x */
|
|
OPT_TL_Y, /* top-left y */
|
|
OPT_BR_X, /* bottom-right x */
|
|
OPT_BR_Y, /* bottom-right y */
|
|
|
|
OPT_ENHANCEMENT_GROUP,
|
|
OPT_EXPOSURE,
|
|
OPT_BRIGHTNESS, /* -d */
|
|
OPT_CONTRAST, /* -k */
|
|
OPT_HIGHLIGHT, /* -l */
|
|
OPT_SHADOW, /* -s */
|
|
OPT_MIDTONE, /* -m */
|
|
|
|
OPT_GAMMA_GROUP,
|
|
OPT_CUSTOM_GAMMA,
|
|
OPT_ANALOG_GAMMA,
|
|
OPT_ANALOG_GAMMA_R,
|
|
OPT_ANALOG_GAMMA_G,
|
|
OPT_ANALOG_GAMMA_B,
|
|
/* "The gamma vectors MUST appear in the order gray, red, green, blue." */
|
|
OPT_GAMMA_VECTOR,
|
|
OPT_GAMMA_VECTOR_R,
|
|
OPT_GAMMA_VECTOR_G,
|
|
OPT_GAMMA_VECTOR_B,
|
|
OPT_GAMMA_BIND,
|
|
|
|
NUM_OPTIONS,
|
|
|
|
OPT_BACKTRACK, /* -B */
|
|
|
|
/* must come last: */
|
|
RNUM_OPTIONS
|
|
};
|
|
|
|
|
|
/*******************************************************************/
|
|
/***** scanner hardware information (as discovered by INQUIRY) *****/
|
|
/*******************************************************************/
|
|
|
|
typedef struct Microtek_Info {
|
|
char vendor_id[9];
|
|
char model_name[17];
|
|
char revision_num[5];
|
|
char vendor_string[21];
|
|
SANE_Byte device_type;
|
|
SANE_Byte SCSI_firmware_ver_major;
|
|
SANE_Byte SCSI_firmware_ver_minor;
|
|
SANE_Byte scanner_firmware_ver_major;
|
|
SANE_Byte scanner_firmware_ver_minor;
|
|
SANE_Byte response_data_format;
|
|
#define MI_RESSTEP_1PER 0x01
|
|
#define MI_RESSTEP_5PER 0x02
|
|
SANE_Byte res_step;
|
|
#define MI_MODES_LINEART 0x01
|
|
#define MI_MODES_HALFTONE 0x02
|
|
#define MI_MODES_GRAY 0x04 /* ??????? or "MultiBit"??? XXXXX*/
|
|
#define MI_MODES_COLOR 0x08
|
|
#define MI_MODES_TRANSMSV 0x20
|
|
#define MI_MODES_ONEPASS 0x40
|
|
#define MI_MODES_NEGATIVE 0x80
|
|
SANE_Byte modes;
|
|
SANE_Int pattern_count;
|
|
SANE_Byte pattern_dwnld;
|
|
#define MI_FEED_FLATBED 0x01
|
|
#define MI_FEED_EDGEFEED 0x02
|
|
#define MI_FEED_AUTOSUPP 0x04
|
|
SANE_Byte feed_type;
|
|
#define MI_COMPRSS_HUFF 0x10
|
|
#define MI_COMPRSS_RD 0x20
|
|
SANE_Byte compress_type;
|
|
#define MI_UNIT_8TH_INCH 0x40
|
|
#define MI_UNIT_PIXELS 0x80
|
|
SANE_Byte unit_type;
|
|
SANE_Byte doc_size_code;
|
|
SANE_Int max_x; /* pixels */
|
|
SANE_Int max_y; /* pixels */
|
|
SANE_Range doc_x_range; /* mm */
|
|
SANE_Range doc_y_range; /* mm */
|
|
SANE_Int cont_settings;
|
|
SANE_Int exp_settings;
|
|
SANE_Byte model_code;
|
|
SANE_Int base_resolution; /* dpi, guessed by backend, per model code */
|
|
#define MI_SRC_FEED_SUPP 0x01 /* support for feeder */
|
|
#define MI_SRC_FEED_BT 0x02 /* support for feed backtracking control */
|
|
#define MI_SRC_HAS_FEED 0x04 /* feeder installed */
|
|
#define MI_SRC_FEED_RDY 0x08 /* feeder ready */
|
|
#define MI_SRC_GET_FEED 0x10 /* if opaque: get from feeder */
|
|
#define MI_SRC_GET_TRANS 0x20 /* get transparency (not opaque) */
|
|
#define MI_SRC_HAS_TRANS 0x40 /* transparency adapter installed */
|
|
SANE_Byte source_options;
|
|
SANE_Byte expanded_resolution;
|
|
#define MI_ENH_CAP_SHADOW 0x01 /* can adjust shadow/highlight */
|
|
#define MI_ENH_CAP_MIDTONE 0x02 /* can adjust midtone */
|
|
SANE_Byte enhance_cap;
|
|
SANE_Int max_lookup_size; /* max. size of gamma LUT */
|
|
SANE_Int max_gamma_bit_depth; /* max. bits of a gamma LUT element */
|
|
SANE_Int gamma_size; /* size (bytes) of each LUT element */
|
|
SANE_Byte fast_color_preview; /* allows fast color preview? */
|
|
SANE_Byte xfer_format_select; /* allows select of transfer format? */
|
|
#define MI_COLSEQ_PLANE 0x00
|
|
#define MI_COLSEQ_PIXEL 0x01
|
|
#define MI_COLSEQ_RGB 0x02
|
|
#define MI_COLSEQ_NONRGB 0x03
|
|
#define MI_COLSEQ_2PIXEL 0x11 /* Agfa StudioStar */
|
|
SANE_Byte color_sequence; /* color sequence spec. code */
|
|
SANE_Byte does_3pass; /* allows 3-pass scanning? */
|
|
SANE_Byte does_mode1; /* allows MODE1 sense/select comm's? */
|
|
#define MI_FMT_CAP_4BPP 0x01
|
|
#define MI_FMT_CAP_10BPP 0x02
|
|
#define MI_FMT_CAP_12BPP 0x04
|
|
#define MI_FMT_CAP_16BPP 0x08
|
|
SANE_Byte bit_formats; /* output bit formats capabilities */
|
|
#define MI_EXCAP_OFF_CTL 0x01
|
|
#define MI_EXCAP_DIS_LNTBL 0x02
|
|
#define MI_EXCAP_DIS_RECAL 0x04
|
|
SANE_Byte extra_cap;
|
|
/* SANE_Int contrast_vals; rolled into cont_settings */
|
|
SANE_Int min_contrast;
|
|
SANE_Int max_contrast;
|
|
/* SANE_Int exposure_vals; rolled into exp_settings */
|
|
SANE_Int min_exposure;
|
|
SANE_Int max_exposure;
|
|
SANE_Byte does_expansion; /* does expanded-mode expansion internally? */
|
|
} Microtek_Info;
|
|
|
|
|
|
|
|
/*******************************************************************/
|
|
/***** device structure (one for each device discovered) *****/
|
|
/*******************************************************************/
|
|
|
|
typedef struct Microtek_Device {
|
|
struct Microtek_Device *next; /* next, for linked list */
|
|
SANE_Device sane; /* SANE generic device block */
|
|
Microtek_Info info; /* detailed scanner spec */
|
|
} Microtek_Device;
|
|
|
|
|
|
|
|
/*******************************************************************/
|
|
/***** ring buffer structure *****/
|
|
/***** ....image workspace during scan *****/
|
|
/*******************************************************************/
|
|
|
|
typedef struct ring_buffer {
|
|
size_t bpl; /* bytes per line */
|
|
size_t ppl; /* pixels per line */
|
|
|
|
uint8_t *base; /* base address of buffer */
|
|
|
|
size_t size; /* size (bytes) of ring buffer */
|
|
size_t initial_size; /* initial size of ring buffer */
|
|
|
|
size_t tail_blue; /* byte index, next blue line */
|
|
size_t tail_green; /* byte index, next green line */
|
|
size_t tail_red; /* byte index, next red line */
|
|
|
|
size_t blue_extra; /* unmatched blue bytes */
|
|
size_t green_extra; /* unmatched green bytes */
|
|
size_t red_extra; /* unmatched red bytes */
|
|
|
|
size_t complete_count;
|
|
size_t head_complete;
|
|
|
|
} ring_buffer;
|
|
|
|
|
|
|
|
|
|
/*******************************************************************/
|
|
/***** scanner structure (one for each device in use) *****/
|
|
/***** ....all the state needed to define a scan request *****/
|
|
/*******************************************************************/
|
|
|
|
typedef struct Microtek_Scanner {
|
|
struct Microtek_Scanner *next; /* for linked list */
|
|
Microtek_Device *dev; /* raw device info */
|
|
|
|
SANE_Option_Descriptor sod[RNUM_OPTIONS]; /* option list for session */
|
|
Option_Value val[RNUM_OPTIONS]; /* option values for session */
|
|
|
|
/* SANE_Int gamma_table[4][256];*/
|
|
SANE_Int *gray_lut;
|
|
SANE_Int *red_lut;
|
|
SANE_Int *green_lut;
|
|
SANE_Int *blue_lut;
|
|
|
|
SANE_Range res_range; /* range desc. for resolution */
|
|
SANE_Range exp_res_range; /* range desc. for exp. resolution */
|
|
|
|
/* scan parameters, ready to toss to SCSI commands*/
|
|
|
|
/* ...set by sane_open (i.e. general/default scanner parameters) */
|
|
#define MS_UNIT_PIXELS 0
|
|
#define MS_UNIT_18INCH 1
|
|
SANE_Byte unit_type; /* pixels or 1/8" */
|
|
#define MS_RES_1PER 0
|
|
#define MS_RES_5PER 1
|
|
SANE_Byte res_type; /* 1% or 5% */
|
|
SANE_Bool midtone_support;
|
|
SANE_Int paper_length; /* whatever unit */
|
|
|
|
SANE_Bool do_clever_precal; /* calibrate scanner once, via fake scan */
|
|
SANE_Bool do_real_calib; /* calibrate via magic commands */
|
|
SANE_Bool calib_once; /* ...only calibrate magically once */
|
|
|
|
SANE_Bool allow_calibrate;
|
|
SANE_Bool onepass;
|
|
SANE_Bool prescan, allowbacktrack;
|
|
SANE_Bool reversecolors;
|
|
SANE_Bool fastprescan;
|
|
SANE_Int bits_per_color;
|
|
SANE_Int gamma_entries;
|
|
SANE_Int gamma_entry_size;
|
|
SANE_Int gamma_bit_depth;
|
|
/* SANE_Int gamma_max_entry;*/
|
|
|
|
SANE_Range gamma_entry_range;
|
|
SANE_Range contrast_range;
|
|
SANE_Range exposure_range;
|
|
|
|
/* ...set by sane_get_parameters (i.e. parameters specified by options) */
|
|
SANE_Parameters params; /* format, lastframe, lines, depth, ppl, bpl */
|
|
SANE_Int x1; /* in 'units' */
|
|
SANE_Int y1;
|
|
SANE_Int x2;
|
|
SANE_Int y2;
|
|
#define MS_MODE_LINEART 0
|
|
#define MS_MODE_HALFTONE 1
|
|
#define MS_MODE_GRAY 2
|
|
#define MS_MODE_COLOR 3
|
|
SANE_Int mode;
|
|
#define MS_FILT_CLEAR 0
|
|
#define MS_FILT_RED 1
|
|
#define MS_FILT_GREEN 2
|
|
#define MS_FILT_BLUE 3
|
|
SANE_Byte filter;
|
|
SANE_Bool onepasscolor, transparency, useADF;
|
|
SANE_Bool threepasscolor, expandedresolution;
|
|
SANE_Int resolution;
|
|
SANE_Byte resolution_code;
|
|
SANE_Byte exposure, contrast;
|
|
SANE_Byte pattern;
|
|
SANE_Byte velocity;
|
|
SANE_Byte shadow, highlight, midtone;
|
|
SANE_Byte bright_r, bright_g, bright_b; /* ??? XXXXXXXX signed char */
|
|
SANE_Bool multibit;
|
|
SANE_Byte color_seq;
|
|
|
|
/* ...stuff needed while in mid-scan */
|
|
#define MS_LNFMT_FLAT 0
|
|
#define MS_LNFMT_SEQ_RGB 1
|
|
#define MS_LNFMT_GOOFY_RGB 2
|
|
#define MS_LNFMT_SEQ_2R2G2B 3
|
|
SANE_Int line_format; /* specify how we need to repackage scanlines */
|
|
|
|
SANE_Int pixel_bpl; /* bytes per line, pixels */
|
|
SANE_Int header_bpl; /* bytes per line, headers */
|
|
SANE_Int ppl; /* pixels per line */
|
|
SANE_Int planes; /* color planes */
|
|
|
|
SANE_Bool doexpansion;
|
|
double exp_aspect;
|
|
SANE_Int dest_pixel_bpl;
|
|
SANE_Int dest_ppl;
|
|
|
|
SANE_Int unscanned_lines; /* lines still to be read from scanner */
|
|
SANE_Int undelivered_bytes; /* bytes still to be returned to frontend */
|
|
SANE_Int max_scsi_lines; /* max number of lines that fit in SCSI buffer */
|
|
|
|
|
|
int sfd; /* SCSI device file descriptor, -1 when not opened */
|
|
int scanning; /* true == mid-pass (between sane_start & sane_read=EOF) */
|
|
int scan_started; /* true == start_scan has scanner going... */
|
|
int woe; /* Woe! */
|
|
int this_pass; /* non-zero => in midst of a multipass scan (1,2,3) */
|
|
int cancel;
|
|
|
|
/* we cleverly compare mode_sense results between scans to detect
|
|
if the scanner may have been reset/power-cycled in the meantime */
|
|
SANE_Byte mode_sense_cache[10];
|
|
#define MS_PRECAL_NONE 0
|
|
#define MS_PRECAL_GRAY 1
|
|
#define MS_PRECAL_COLOR 2
|
|
#define MS_PRECAL_EXP_COLOR 3
|
|
SANE_Byte precal_record; /* record what precalibrations have been done */
|
|
|
|
#define MS_SENSE_IGNORE 1
|
|
int sense_flags; /* flags passed to the sense handler */
|
|
|
|
uint8_t *scsi_buffer;
|
|
ring_buffer *rb;
|
|
|
|
} Microtek_Scanner;
|
|
|
|
|
|
#endif /* microtek_h */
|
|
|