diff options
Diffstat (limited to 'backend/pieusb_specific.h')
-rw-r--r-- | backend/pieusb_specific.h | 346 |
1 files changed, 346 insertions, 0 deletions
diff --git a/backend/pieusb_specific.h b/backend/pieusb_specific.h new file mode 100644 index 0000000..3928adf --- /dev/null +++ b/backend/pieusb_specific.h @@ -0,0 +1,346 @@ +/* sane - Scanner Access Now Easy. + + pieusb_specific.h + + Copyright (C) 2012-2015 Jan Vleeshouwers, Michael Rickmann, Klaus Kaempf + + 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 PIEUSB_SPECIFIC_H +#define PIEUSB_SPECIFIC_H + +#include "../include/sane/sanei_ir.h" +#include "../include/sane/sanei_backend.h" +#include "pieusb_scancmd.h" +#include "pieusb_buffer.h" + +/* Settings for scan modes available to SANE */ +/* In addition to those defined in sane.h */ +#define SANE_VALUE_SCAN_MODE_RGBI "RGBI" + +/* Scanner settings for colors to scan */ +#define SCAN_ONE_PASS_RGBI 0x90 +#define SCAN_ONE_PASS_COLOR 0x80 +#define SCAN_FILTER_INFRARED 0x10 +#define SCAN_FILTER_BLUE 0x08 +#define SCAN_FILTER_GREEN 0x04 +#define SCAN_FILTER_RED 0x02 +#define SCAN_FILTER_NEUTRAL 0x01 + +/* Settings for color depth of scan */ +#define SCAN_COLOR_DEPTH_16 0x20 +#define SCAN_COLOR_DEPTH_12 0x10 +#define SCAN_COLOR_DEPTH_10 0x08 +#define SCAN_COLOR_DEPTH_8 0x04 +#define SCAN_COLOR_DEPTH_4 0x02 +#define SCAN_COLOR_DEPTH_1 0x01 + +/* Settings for format of the scanned data */ +#define SCAN_COLOR_FORMAT_INDEX 0x04 +#define SCAN_COLOR_FORMAT_LINE 0x02 +#define SCAN_COLOR_FORMAT_PIXEL 0x01 + +/* Settings for calibration mode */ +#define SCAN_CALIBRATION_DEFAULT "default values" +#define SCAN_CALIBRATION_AUTO "from internal test" +#define SCAN_CALIBRATION_PREVIEW "from preview" +#define SCAN_CALIBRATION_OPTIONS "from options" + +/* Settings for additional gain */ +#define SCAN_GAIN_ADJUST_03 "* 0.3" +#define SCAN_GAIN_ADJUST_05 "* 0.5" +#define SCAN_GAIN_ADJUST_08 "* 0.8" +#define SCAN_GAIN_ADJUST_10 "* 1.0" +#define SCAN_GAIN_ADJUST_12 "* 1.2" +#define SCAN_GAIN_ADJUST_16 "* 1.6" +#define SCAN_GAIN_ADJUST_19 "* 1.9" +#define SCAN_GAIN_ADJUST_24 "* 2.4" +#define SCAN_GAIN_ADJUST_30 "* 3.0" + +/* Post-processing */ +#define POST_SW_COLORS (1 << 0) /* gain, negatives, ..., can be done at any time */ +#define POST_SW_IRED (1 << 1) /* remove spectral overlap, needs complete scan */ +#define POST_SW_DIRT (1 << 2) /* our digital lavabo, needs complete scan */ +#define POST_SW_GRAIN (1 << 3) /* smoothen a bit */ +#define POST_SW_CROP (1 << 4) /* trim whole image in sane_start + before sane_get_parameters() is answered */ +#define POST_SW_IRED_MASK (POST_SW_IRED | POST_SW_DIRT) +#define POST_SW_ACCUM_MASK (POST_SW_IRED_MASK | POST_SW_GRAIN | POST_SW_CROP) + +#define DEFAULT_GAIN 19 /* 0x13 */ +#define DEFAULT_EXPOSURE 2937 /* 0xb79 minimum value, see Pieusb_Settings */ +#define DEFAULT_OFFSET 0 +#define DEFAULT_LIGHT 4 +#define DEFAULT_ADDITIONAL_ENTRIES 1 +#define DEFAULT_DOUBLE_TIMES 0 + +/* -------------------------------------------------------------------------- + * + * DEVICE DEFINITION STRUCTURES + * + * --------------------------------------------------------------------------*/ + +/* Options supported by the scanner */ + +enum Pieusb_Option +{ + OPT_NUM_OPTS = 0, + /* ------------------------------------------- */ + OPT_MODE_GROUP, + OPT_MODE, /* scan mode */ + OPT_BIT_DEPTH, /* number of bits to encode a color */ + OPT_RESOLUTION, /* number of pixels per inch */ + OPT_HALFTONE_PATTERN, /* halftone pattern to use (see halftone_list) */ + OPT_THRESHOLD, /* halftone threshold */ + OPT_SHARPEN, /* create a sharper scan at the cost of scan time */ + OPT_SHADING_ANALYSIS, /* do shading analysis before the scan */ + OPT_FAST_INFRARED, /* scan infrared channel faster but less accurate */ + OPT_ADVANCE_SLIDE, /* auto-advance slide after scan */ + OPT_CALIBRATION_MODE, /* use auto-calibarion settings for scan */ + /* ------------------------------------------- */ + 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_CORRECT_SHADING, /* correct scanned data for lamp variations (shading) */ + OPT_CORRECT_INFRARED, /* correct infrared for red crosstalk */ + OPT_CLEAN_IMAGE, /* detect and remove dust and scratch artifacts */ + OPT_GAIN_ADJUST, /* adjust gain (a simpler option than setting gain, exposure and offset directly) */ + OPT_CROP_IMAGE, /* automatically crop image */ + OPT_SMOOTH_IMAGE, /* smoothen image */ + OPT_TRANSFORM_TO_SRGB, /* transform to approximate sRGB data */ + OPT_INVERT_IMAGE, /* transform negative to positive */ + /* ------------------------------------------- */ + OPT_ADVANCED_GROUP, + OPT_PREVIEW, /* scan a preview before the actual scan */ + OPT_SAVE_SHADINGDATA, /* output shading data */ + OPT_SAVE_CCDMASK, /* output CCD mask */ + OPT_LIGHT, + OPT_DOUBLE_TIMES, + OPT_SET_EXPOSURE_R, /* exposure times for R */ + OPT_SET_EXPOSURE_G, /* exposure times for G */ + OPT_SET_EXPOSURE_B, /* exposure times for B */ + OPT_SET_EXPOSURE_I, /* exposure times for I */ + OPT_SET_GAIN_R, /* gain for R */ + OPT_SET_GAIN_G, /* gain for G */ + OPT_SET_GAIN_B, /* gain for B */ + OPT_SET_GAIN_I, /* gain for I */ + OPT_SET_OFFSET_R, /* offset for R */ + OPT_SET_OFFSET_G, /* offset for G */ + OPT_SET_OFFSET_B, /* offset for B */ + OPT_SET_OFFSET_I, /* offset for I */ + /* must come last: */ + NUM_OPTIONS +}; + +/* Forward declaration (see pieusb_scancmd.h) */ +struct Pieusb_Shading_Parameters; + +/* Device characteristics of a Pieusb USB scanner */ +struct Pieusb_Device_Definition +{ + struct Pieusb_Device_Definition *next; + + SANE_Device sane; + /* name = string like "libusb:001:006" == NO! this should be "CrystalScan 7200" or "ProScan 7200"... + * vendor = "PIE/Pieusb" + * model = "CrystalScan 7200" or "ProScan 7200" + * type = "film scanner" */ + /* char *devicename; => sane->name */ + /* char *vendor; => sane->vendor */ + /* char *product; => sane->model */ + SANE_Word vendorId; + SANE_Word productId; + /* USB id's like 0x05e3 0x0145, see pieusb.conf */ + SANE_String version; /* INQUIRY productRevision */ + SANE_Byte model; /* INQUIRY model */ + + /* Ranges for various quantities */ + SANE_Range dpi_range; + SANE_Range x_range; + SANE_Range y_range; + SANE_Range exposure_range; /* Unit is a 8051 machine cycle, which is approximately 1 us. (Exactly: 12 cycles at 11.059 Mhz = 1.085 us.) */ + SANE_Range dust_range; + + SANE_Range shadow_range; + SANE_Range highlight_range; + + /* Enumerated ranges vor various quantities */ + SANE_String scan_mode_list[7]; /* names of scan modes (see saneopts.h) */ + SANE_String calibration_mode_list[6]; /* names of calibration modes */ + SANE_String gain_adjust_list[10]; /* gain adjustment values */ + SANE_Word bpp_list[5]; /* bit depths */ + SANE_String halftone_list[17]; /* names of the halftone patterns from the scanner */ + SANE_String speed_list[9]; /* names of available speeds */ + SANE_String ir_sw_list[4]; + SANE_String crop_sw_list[4]; + SANE_Word grain_sw_list[6]; + + /* Maximum resolution values */ + int maximum_resolution_x; /* maximum x-resolution */ + int maximum_resolution_y; /* maximum y-resolution */ + int maximum_resolution; + + /* Geometry */ + double scan_bed_width; /* flatbed width in inches (horizontal) */ + double scan_bed_height; /* flatbed height in inches (vertical) */ + int slide_top_left_x; /* top-left location of slide w.r.t. scan bed */ + int slide_top_left_y; /* top-left location of slide w.r.t. scan bed */ + double slide_width; /* transparency width in inches */ + double slide_height; /* transparency length in inches */ + + /* Integer and bit-encoded properties */ + int halftone_patterns; /* number of halftones supported */ + int color_filters; /* available colour filters: Infrared-0-0-OnePassColor-B-G-R-N */ + int color_depths; /* available colour depths: 0-0-16-12-10-8-4-1 */ + int color_formats; /* colour data format: 0-0-0-0-0-Index-Line-Pixel */ + int image_formats; /* image data format: 0-0-0-0-OKLine-BlkOne-Motorola-Intel */ + int scan_capabilities; /* additional scanner features, number of speeds: PowerSave-ExtCal-0-FastPreview-DisableCal-[CalSpeeds=3] */ + int optional_devices; /* optional devices: MultiPageLoad-?-?-0-0-TransModule1-TransModule-AutoDocFeeder */ + int enhancements; /* enhancements: unknown coding */ + int gamma_bits; /* no of bits used for gamma table */ + int fast_preview_resolution; /* fast preview resolution */ + int minimum_highlight; /* min highlight % that can be used */ + int maximum_shadow; /* max shadow % that can be used */ + int calibration_equation; /* which calibration equation to use */ + int minimum_exposure; /* min exposure */ + int maximum_exposure; /* max exposure */ + + struct Pieusb_Shading_Parameters_Info shading_parameters[4]; /* array with shading data parameters */ + + int x0, y0, x1, y1; + SANE_String production; + SANE_String timestamp; + SANE_String signature; +}; + +typedef struct Pieusb_Device_Definition Pieusb_Device_Definition; + +/* -------------------------------------------------------------------------- + * + * CURRENTLY ACTIVE DEVICES + * + * --------------------------------------------------------------------------*/ + +/* This structure holds information about an instance of an active scanner */ + +struct Pieusb_Scanner +{ + struct Pieusb_Scanner *next; + struct Pieusb_Device_Definition *device; /* pointer to device definition */ + + int device_number; /* scanner device number (as determined by USB) */ + + /* SANE option descriptions and settings for this scanner instance */ + SANE_Option_Descriptor opt[NUM_OPTIONS]; + Option_Value val[NUM_OPTIONS]; + + /* Scan state */ + struct Pieusb_Scanner_State state; + SANE_Int scanning; /* true if busy scanning */ + SANE_Int cancel_request; /* if true, scanner should terminate a scan */ + + /* Scan settings */ + struct Pieusb_Mode mode; + struct Pieusb_Settings settings; + struct Pieusb_Scan_Frame frame; + SANE_Parameters scan_parameters; + + /* Shading data and CCD-mask */ +#define PIEUSB_CCD_MASK_SIZE 0x1a1d /* pieusb 5340; */ /* cyberview: 6685 0x1a1d */ + SANE_Byte *ccd_mask; /* malloc'ed in sane_open */ + SANE_Int ccd_mask_size; + SANE_Bool shading_data_present; /* don't correct shading if not present */ + SANE_Int shading_mean[SHADING_PARAMETERS_INFO_COUNT]; /* mean shading value for each color (average all 45 lines) */ + SANE_Int shading_max[SHADING_PARAMETERS_INFO_COUNT]; /* maximum shading value for each color (for all 45 lines) */ + SANE_Int* shading_ref[SHADING_PARAMETERS_INFO_COUNT]; /* 4 arrays of shading references for each pixel on a line and for each color */ + + /* Calibration using preview */ + + SANE_Bool preview_done; + SANE_Int preview_exposure[4]; /* exposure values used in preview */ + SANE_Int preview_gain[4]; /* gain values used in preview */ + SANE_Int preview_offset[4]; /* offset values used in preview */ + SANE_Int preview_lower_bound[4]; /* lowest RGBI values in preview */ + SANE_Int preview_upper_bound[4]; /* highest RGBI values in preview */ + + /* Post processing options */ +/* + SANE_Int processing; +*/ + double *ln_lut; /* logarithmic lookup table */ + + /* Reading buffer */ + struct Pieusb_Read_Buffer buffer; +}; + +typedef struct Pieusb_Scanner Pieusb_Scanner; + +SANE_Status sanei_pieusb_parse_config_line(const char* config_line, SANE_Word* vendor_id, SANE_Word* product_id, SANE_Word* model_number); +/* sub to sane_start() */ +SANE_Status sanei_pieusb_post (Pieusb_Scanner *scanner, uint16_t **in_img, int planes); +void sanei_pieusb_correct_shading(struct Pieusb_Scanner *scanner, struct Pieusb_Read_Buffer *buffer); +SANE_Status sanei_pieusb_get_scan_data(Pieusb_Scanner * scanner, SANE_Int parameter_bytes); +SANE_Status sanei_pieusb_get_parameters(Pieusb_Scanner * scanner, SANE_Int *parameter_bytes); +SANE_Status sanei_pieusb_get_ccd_mask(Pieusb_Scanner * scanner); +SANE_Status sanei_pieusb_get_shading_data(Pieusb_Scanner * scanner); +SANE_Status sanei_pieusb_set_mode_from_options(Pieusb_Scanner * scanner); +SANE_Status sanei_pieusb_set_gain_offset(Pieusb_Scanner * scanner, const char* calibration_mode); +SANE_Status sanei_pieusb_set_frame_from_options(Pieusb_Scanner * scanner); +void sanei_pieusb_print_options(struct Pieusb_Scanner *scanner); +/* sub to sane_control_option() and sane_start() */ +int sanei_pieusb_analyse_options(struct Pieusb_Scanner *scanner); +SANE_Bool sanei_pieusb_supported_device_list_contains(SANE_Word vendor_id, SANE_Word product_id, SANE_Word model_number); +SANE_Status sanei_pieusb_supported_device_list_add(SANE_Word vendor_id, SANE_Word product_id, SANE_Word model_number); +/* sub to sane_init() and sane_open() */ +SANE_Status sanei_pieusb_find_device_callback (const char *devicename); +/* sub to sane_open() */ +SANE_Status sanei_pieusb_init_options (Pieusb_Scanner * scanner); +/* sub to sane_start(), sane_read() and sane_close() */ +SANE_Status sanei_pieusb_on_cancel (Pieusb_Scanner * scanner); + +SANE_Status sanei_pieusb_wait_ready(Pieusb_Scanner *scanner, SANE_Int device_number); +SANE_Status sanei_pieusb_analyze_preview(Pieusb_Scanner * scanner); + + + +#endif /* PIEUSB_SPECIFIC_H */ |