diff options
Diffstat (limited to 'backend/umax.h')
-rw-r--r-- | backend/umax.h | 499 |
1 files changed, 499 insertions, 0 deletions
diff --git a/backend/umax.h b/backend/umax.h new file mode 100644 index 0000000..682e58b --- /dev/null +++ b/backend/umax.h @@ -0,0 +1,499 @@ +/* --------------------------------------------------------------------------------------------------------- */ + +/* umax.h - headerfile for SANE-backend for umax scanners + + (C) 1997-2002 Oliver Rauch + + 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 umax_h +#define umax_h + +#include "sys/types.h" + +/* --------------------------------------------------------------------------------------------------------- */ +/* COMPILER OPTIONS: */ + +#define UMAX_ENABLE_USB +#define UMAX_HIDE_UNUSED + +/* #define SANE_UMAX_DEBUG_S12 */ +/* #define UMAX_CALIBRATION_MODE_SELECTABLE */ + +/* --------------------------------------------------------------------------------------------------------- */ + +#define SANE_UMAX_SCSI_MAXQUEUE 8 + +/* --------------------------------------------------------------------------------------------------------- */ + +#define SANE_UMAX_FIX_ROUND(val) ((SANE_Word) ((val) * (1 << SANE_FIXED_SCALE_SHIFT) + 1.0 / (1 << (SANE_FIXED_SCALE_SHIFT+1)))) + +/* --------------------------------------------------------------------------------------------------------- */ + +enum Umax_Option +{ + OPT_NUM_OPTS = 0, + + /* ------------------------------------------- */ + + OPT_MODE_GROUP, + OPT_MODE, + OPT_SOURCE, + OPT_X_RESOLUTION, + OPT_Y_RESOLUTION, + + OPT_RESOLUTION_BIND, /* bind x and y resolution */ + OPT_NEGATIVE, + + /* ------------------------------------------- */ + + OPT_GEOMETRY_GROUP, + 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_BIT_DEPTH, /* output bit depth */ + OPT_QUALITY, /* quality calibration */ + OPT_DOR, /* double optical resolution */ + OPT_WARMUP, + OPT_RGB_BIND, /* use same rgb-values for each color in color-mode */ + + OPT_BRIGHTNESS, + OPT_CONTRAST, + OPT_THRESHOLD, + + OPT_HIGHLIGHT, /* highlight */ + OPT_HIGHLIGHT_R, + OPT_HIGHLIGHT_G, + OPT_HIGHLIGHT_B, + + OPT_SHADOW, /* shadow */ + OPT_SHADOW_R, + OPT_SHADOW_G, + OPT_SHADOW_B, + + OPT_ANALOG_GAMMA, /* analog gamma */ + OPT_ANALOG_GAMMA_R, + OPT_ANALOG_GAMMA_G, + OPT_ANALOG_GAMMA_B, + + OPT_CUSTOM_GAMMA, /* use custom gamma tables */ + /* 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_HALFTONE_DIMENSION, + OPT_HALFTONE_PATTERN, + + /* ------------------------------------------- */ + + OPT_ADVANCED_GROUP, + + OPT_CAL_EXPOS_TIME, /* exposure time for calibration */ + OPT_CAL_EXPOS_TIME_R, + OPT_CAL_EXPOS_TIME_G, + OPT_CAL_EXPOS_TIME_B, + OPT_SCAN_EXPOS_TIME, /* exposure time for scan */ + OPT_SCAN_EXPOS_TIME_R, + OPT_SCAN_EXPOS_TIME_G, + OPT_SCAN_EXPOS_TIME_B, + + OPT_DISABLE_PRE_FOCUS, + OPT_MANUAL_PRE_FOCUS, + OPT_FIX_FOCUS_POSITION, + OPT_LENS_CALIBRATION_DOC_POS, + OPT_HOLDER_FOCUS_POS_0MM, + + OPT_CAL_LAMP_DEN, + OPT_SCAN_LAMP_DEN, + + OPT_SELECT_EXPOSURE_TIME, + OPT_SELECT_CAL_EXPOSURE_TIME, + OPT_SELECT_LAMP_DENSITY, + + OPT_LAMP_ON, + OPT_LAMP_OFF, + OPT_LAMP_OFF_AT_EXIT, + + OPT_BATCH_SCAN_START, /* start batch scan function */ + OPT_BATCH_SCAN_LOOP, /* loop batch scan function */ + OPT_BATCH_SCAN_END, /* end batch scan function */ + OPT_BATCH_NEXT_TL_Y, /* batch scan function next y position */ + +#ifdef UMAX_CALIBRATION_MODE_SELECTABLE + OPT_CALIB_MODE, +#endif + + OPT_PREVIEW, /* preview, sets preview-bit and bind x/y-resolution */ + + /* must come last: */ + NUM_OPTIONS +}; + + +/* -------------------------------------------------------------------------------------------------------- */ + + +/* LIST OF AVAILABLE SCANNERS, THE VALUES LISTED HERE ARE THE SAME FOR DIFFERENT APPLICATIONS + THAT USE THE SAME DEVICE */ + +/* Umax_Device contains values relevant for the device that are not intersting for the sane interface */ + +typedef struct Umax_Device +{ + struct Umax_Device *next; + SANE_Device sane; + + int connection_type; +#define SANE_UMAX_UNKNOWN 0 +#define SANE_UMAX_SCSI 1 +#define SANE_UMAX_USB 2 + + SANE_Range x_dpi_range; + SANE_Range y_dpi_range; + SANE_Range x_range; + SANE_Range y_range; + SANE_Range analog_gamma_range; + unsigned flags; + + unsigned char *buffer[SANE_UMAX_SCSI_MAXQUEUE]; /* buffer used for scsi-transfer */ + void *queue_id[SANE_UMAX_SCSI_MAXQUEUE]; /* scsi queue id */ + size_t length_queued[SANE_UMAX_SCSI_MAXQUEUE]; /* length of queued data */ + size_t length_read[SANE_UMAX_SCSI_MAXQUEUE]; /* length of returned data */ + unsigned int bufsize; + unsigned int row_bufsize; + unsigned int request_scsi_maxqueue; + unsigned int request_preview_lines; + unsigned int request_scan_lines; + unsigned int handle_bad_sense_error; + unsigned int execute_request_sense; + unsigned int force_preview_bit_rgb; + unsigned int scsi_buffer_size_min; + unsigned int scsi_buffer_size_max; + unsigned int scsi_maxqueue; + + unsigned char *pixelbuffer; /* buffer used for pixel ordering */ + unsigned int pixelline_max; /* number of lines that fit into pixelbuffer */ + unsigned int pixelline_ready[3]; /* finished absolute line for each color */ + unsigned int pixelline_next[3]; /* next line to write for each color */ + unsigned int pixelline_del[3]; /* next line to delete in opt_res for col */ + unsigned int pixelline_optic[3]; /* scanned line in opt_res for each color */ + unsigned int pixelline_opt_res; /* number of scanned line in optical res */ + unsigned int pixelline_read; /* number of read pixel-lines */ + unsigned int pixelline_written; /* number of written pixel-lines */ + unsigned int CCD_distance; /* color line distance in optical resolution */ + unsigned int CCD_color[9]; /* color order */ + /* 0 / 1 2 / 3 4 5 / 6 7 / 8 */ +# define CCD_color_red 0 +# define CCD_color_green 1 +# define CCD_color_blue 2 + + char *devicename; /* name of the scanner device */ + int sfd; /* output file descriptor, scanner device */ + + char vendor[9]; /* will be UMAX */ + char product[17]; /* e.g. "SuperVista_S12" or so */ + char version[5]; /* e.g. V1.3 */ + + int three_pass; /* used in RGB-mode if 3-pass => 1 */ + int three_pass_color; /* select color for scanning in 3pass mode */ + unsigned int row_len; /* len of one scan-line in bytes */ + unsigned int lines_max; /* maximum number of lines to scan */ + unsigned int max_value; /* used for pnm-file */ + + /* data defined by inquiry */ + int inquiry_len; /* length of inquiry return block */ + int inquiry_wdb_len; /* length of window descriptor block */ + int inquiry_vidmem; /* size of video memory */ + int inquiry_optical_res; /* optical resolution */ + int inquiry_x_res; /* maximum x-resolution */ + int inquiry_y_res; /* maximum y-resolution */ + int inquiry_dor_optical_res; /* optical resolution for dor mode */ + int inquiry_dor_x_res; /* maximum x-resolution for dor mode */ + int inquiry_dor_y_res; /* maximum y-resolution for dor mode */ + double inquiry_fb_width; /* flatbed width in inches */ + double inquiry_fb_length; /* flatbed length in inches */ + double inquiry_uta_width; /* transparency width in inches */ + double inquiry_uta_length; /* transparency length in inches */ + double inquiry_uta_x_off; /* transparency x offset in inches */ + double inquiry_uta_y_off; /* transparency y offset in inches */ + double inquiry_dor_width; /* double resolution width in inches */ + double inquiry_dor_length; /* double resolution length in inches */ + double inquiry_dor_x_off; /* double resolution x offset in inches */ + double inquiry_dor_y_off; /* double resolution y offset in inches */ + + int inquiry_exposure_adj; /* 1 if exposure adjust is supported */ + int inquiry_exposure_time_step_unit; /* exposure time unit in micro sec */ + int inquiry_exposure_time_max; /* exposure time maximum */ + int inquiry_exposure_time_l_min; /* exposure tine minimum for lineart */ + int inquiry_exposure_time_l_fb_def; /* exposure time default for lineart/flatbed */ + int inquiry_exposure_time_l_uta_def; /* exposure time default for lineart/uta */ + int inquiry_exposure_time_h_min; /* exposure tine minimum for halftone */ + int inquiry_exposure_time_h_fb_def; /* exposure time default for halftone/flatbed */ + int inquiry_exposure_time_h_uta_def; /* exposure time default for halftone/uta */ + int inquiry_exposure_time_g_min; /* exposure tine minimum for grayscale */ + int inquiry_exposure_time_g_fb_def; /* exposure time default for grayscale/flatbed */ + int inquiry_exposure_time_g_uta_def; /* exposure time default for grayscale/uta */ + int inquiry_exposure_time_c_min; /* exposure tine minimum for color */ + int inquiry_exposure_time_c_fb_def_r; /* exposure time default for color red/flatbed */ + int inquiry_exposure_time_c_fb_def_g; /* exposure time default for color green/flatbed */ + int inquiry_exposure_time_c_fb_def_b; /* exposure time default for color blue/flatbed */ + int inquiry_exposure_time_c_uta_def_r; /* exposure time default for color red/uta */ + int inquiry_exposure_time_c_uta_def_g; /* exposure time default for color green/uta */ + int inquiry_exposure_time_c_uta_def_b; /* exposure time default for color blue/uta */ + + int inquiry_max_warmup_time; /* maximum lamp warmup time in sec */ + int inquiry_cbhs; /* 50, 255, 255+autoexp. */ + int inquiry_cbhs_min; /* minimum value for cbhs */ + int inquiry_cbhs_max; /* maximum value for cbhs */ + int inquiry_contrast_min; /* minimum value for c */ + int inquiry_contrast_max; /* maximum value for c */ + int inquiry_brightness_min; /* minimum value for b */ + int inquiry_brightness_max; /* maximum value for b */ + int inquiry_threshold_min; /* minimum value for t */ + int inquiry_threshold_max; /* maximum value for t */ + int inquiry_highlight_min; /* minimum value for h */ + int inquiry_highlight_max; /* maximum value for h */ + int inquiry_shadow_min; /* minimum value for s */ + int inquiry_shadow_max; /* maximum value for s */ + + int inquiry_quality_ctrl; /* 1 = supported */ + int inquiry_batch_scan; /* 1 = supported */ + int inquiry_preview; /* 1 = supported */ + int inquiry_lamp_ctrl; /* 1 = supported */ + int inquiry_transavail; /* 1 = uta available */ + int inquiry_adfmode; /* 1 = adf available */ + int inquiry_uta; /* 1 = uta supported */ + int inquiry_adf; /* 1 = adf supported */ + int inquiry_dor; /* 1 = dor supported */ + int inquiry_reverse; /* 1 = 1 bit reverse supported */ + int inquiry_reverse_multi; /* 1 = multi bit reverse supported */ + int inquiry_analog_gamma; /* 1 = analog gamma supported */ + int inquiry_lineart_order; /* 1 = LSB first, 0 = MSB first */ + + int inquiry_lens_cal_in_doc_pos; /* 1 = lens calibration in doc pos supported */ + int inquiry_manual_focus; /* 1 = manual focus supported */ + int inquiry_sel_uta_lens_cal_pos; /* 1 = selection of lens calib pos for uta supported */ + + int inquiry_gamma_dwload; /* 1 = gamma download supported */ + int inquiry_gamma_DCF; /* gamma download curve format */ + + int inquiry_one_pass_color; /* 1 = 1 pass supported */ + int inquiry_three_pass_color; /* 1 = 3 pass supported */ + int inquiry_color; /* 1 = color mode supported */ + int inquiry_gray; /* 1 = grayscale mode supported */ + int inquiry_halftone; /* 1 = halftone mode supported */ + int inquiry_lineart; /* 1 = lineart mode supported */ + + int inquiry_calibration; /* 1 = calibration mode control supported */ + int inquiry_highlight; /* 1 = highlight supported */ + int inquiry_shadow; /* 1 = shadow supported */ + int inquiry_GIB; /* gamma input bits */ + int inquiry_GOB; /* gamma output bits */ + int inquiry_max_calib_lines; /* maximum calibration lines */ + int inquiry_color_order; /* color ordering support */ + int inquiry_CCD_line_distance; /* color line distance */ + int inquiry_fb_uta_color_arrangement; /* line arrangement for fb & uta */ + int inquiry_adf_color_arrangement; /* line arrangement for adf */ + + unsigned int relevant_optical_res; /* optical resolution */ + unsigned int relevant_max_x_res; /* maximum x-resolution */ + unsigned int relevant_max_y_res; /* maximum y-resolution */ + + /* selected data */ + + int use_exposure_time_min; /* exposure tine minimum */ + int use_exposure_time_def_r; /* exposure time default */ + int use_exposure_time_def_g; /* exposure time default */ + int use_exposure_time_def_b; /* exposure time default */ + + int wdb_len; /* use this length of WDB */ + unsigned int width_in_pixels; /* thats the wanted width in pixels */ + unsigned int length_in_pixels; /* thats the wanted length in pixels */ + unsigned int scanwidth; /* thats the width in pixels at x_coordinate_base dpi */ + unsigned int scanlength; /* thats the length in pixels at y_coordinate_base dpi */ + unsigned int bytes_per_color; /* bytes per each color */ + + unsigned int x_resolution; /* scan-resolution for x in dpi */ + unsigned int y_resolution; /* scan-resolution for y in dpi */ + double scale_x; /* x-scaling of optical resolution */ + double scale_y; /* y-scaling of optical resolution */ + int upper_left_x; /* thats the left edge in points at 1200pt/inch */ + int upper_left_y; /* thats the top edge in points at 1200pt/inch */ + + unsigned int x_coordinate_base; /* x base in pixels/inch, normaly 1200 */ + unsigned int y_coordinate_base; /* y base in pixels/inch, normaly 1200 */ + + unsigned int bits_per_pixel; /* number of bits per pixel */ + int bits_per_pixel_code; /* 1 = 24bpp, 4 = 30 bpp, 8 = 36 bpp */ + int gamma_input_bits_code; /* 1 = 24bpp, 4 = 30 bpp, 8 = 36 bpp */ + int set_auto; /* 0 or 1, don't know what it is */ + int preview; /* 1 if preview */ + int batch_scan; /* 1 = batch scan, 0 = normal scan */ + int batch_end; /* 1 = reposition scanhead */ + int batch_next_tl_y; /* top left y position for next batch scan */ + int quality; /* 1 = quality_calibration, 0 = fast */ + int reverse; /* 1: exchange black and white */ + int reverse_multi; /* 1: invert color values */ + int WD_speed; /* is a combination of slow and smear */ + int slow; /* 1: slow scan speed */ + int smear; /* 1: don't care about image smearing problem */ + int dor; /* double resolution */ + int cbhs_range; /* 50,255 or 255+autoexposure */ + int fix_focus_position; /* fix focus position */ + int lens_cal_in_doc_pos; /* lens calibration in document position */ + int disable_pre_focus; /* disable pre focus */ + int holder_focus_pos_0mm; /* 0.6mm <-> 0.0mm holder focus position */ + int manual_focus; /* automatic <-> manual focus */ + int warmup; /* 1=set warmup-bit */ + int module; /* flatbed or transparency */ + int adf; /* 1 if ADF turned on */ + int uta; /* 1 if UTA turned on */ + int calibration; /* calibration :0=ignore, 1=driver, 2=by image */ + int low_byte_first; /* 10 bit mode: 0=high byte frist, 1=low byte frist */ + int colormode; /* LINEART, HALFTONE, GRAYSCALE or RGB */ +# define LINEART 1 +# define HALFTONE 2 +# define GRAYSCALE 3 +# define RGB_LINEART 4 +# define RGB_HALFTONE 5 +# define RGB 6 + + int exposure_time_calibration_r; /* red exposure time for calibration */ + int exposure_time_calibration_g; /* green exposure time for calibration */ + int exposure_time_calibration_b; /* blue exposure time for calibration */ + int exposure_time_scan_r; /* red exposure time for scan */ + int exposure_time_scan_g; /* green exposure time for scan */ + int exposure_time_scan_b; /* bue exposure time for scan */ + + int c_density; /* next calibration lamp density */ + int s_density; /* next scan lamp density */ + + int threshold; /* (128) 0-255, lineart mode */ + int brightness; /* (128) cbhs_range 0-255, halftone mode */ + int contrast; /* (128) cbhs_range 0-255, halftone-mode */ + int highlight_r; /* (255) cbhs_range 1-255, each mode */ + int highlight_g; /* (255) cbhs_range 1-255, each mode */ + int highlight_b; /* (255) cbhs_range 1-255, each mode */ + int shadow_r; /* (0) cbhs_range 0-254, each mode */ + int shadow_g; /* (0) cbhs_range 0-254, each mode */ + int shadow_b; /* (0) cbhs_range 0-254, each mode */ + int halftone; /* halftone pattern select */ + + int digital_gamma_r; /* gamma-select for red and gray */ + int digital_gamma_g; /* gamma-select value for green */ + int digital_gamma_b; /* gamma-select value for blue */ + + int analog_gamma_r; /* analog gamma red and gray */ + int analog_gamma_g; /* analog gamma green */ + int analog_gamma_b; /* analog gamma blue */ + + int calib_lines; /* request calibration lines */ + + int do_calibration; /* 1: do calibration by driver */ + int do_color_ordering; /* 1: order line-mode to pixel-mode */ + + int button0_pressed; /* scan-button 0 on scanner is pressed => 1 */ + int button1_pressed; /* scan-button 1 on scanner is pressed => 1 */ + int button2_pressed; /* scan-button 2 on scanner is pressed => 1 */ + + int calibration_area; /* define calibration area if no area is given */ + int calibration_width_offset; /* some scanners do calibrate with some additional pixels */ + int calibration_width_offset_batch; /* the same for batch scanning */ + int calibration_bytespp; /* correction of bytespp if driver knows about it */ + int exposure_time_rgb_bind; /* exposure time can not be defined for each color */ + int invert_shading_data; /* invert shading data before sending it to the scanner */ + int common_xy_resolutions; /* do not allow different x and y resolution */ + int pause_for_color_calibration; /* pause between start_scan and do_calibration in ms */ + int pause_for_gray_calibration; /* pause between start_scan and do_calibration in ms */ + int pause_after_calibration; /* pause between do_calibration and read data in ms */ + int pause_after_reposition; /* pause for repositioning in ms */ + int pause_for_moving; /* pause for moving scanhead over full scanarea in ms */ + int lamp_control_available; /* is set when scanner supportes lamp control */ + int gamma_lsb_padded; /* 16 bit gamma data is padded to lsb */ + int force_quality_calibration; /* always set quality calibration */ +} Umax_Device; + + +/* --------------------------------------------------------------------------------------------------------- */ + + +/* LIST OF OPEND DEVICES, A DEVICE MAY BE OPEND TWICE, ALL VALUES LISTED HERE MAY BE + DIFFERENT FOR DIFFERENT APPLICATIONS */ + +/* Umax_Scanner contains values relevant for the sane interface */ + +typedef struct Umax_Scanner +{ + struct Umax_Scanner *next; + Umax_Device *device; + + SANE_Option_Descriptor opt[NUM_OPTIONS]; + Option_Value val[NUM_OPTIONS]; + SANE_Int *gamma_table[4]; + SANE_Int halftone_pattern[64]; + SANE_Range gamma_range; + unsigned int gamma_length; + SANE_Range output_range; + unsigned int output_bytes; + SANE_Range exposure_time_range; + + int scanning; + SANE_Parameters params; + + SANE_Pid reader_pid; + int pipe_read_fd; + int pipe_write_fd; +} Umax_Scanner; + + +/* --------------------------------------------------------------------------------------------------------- */ + + +#endif /* umax-sane_h */ |