1 /* sane - Scanner Access Now Easy.
2 
3    pieusb_specific.h
4 
5    Copyright (C) 2012-2015 Jan Vleeshouwers, Michael Rickmann, Klaus Kaempf
6 
7    This file is part of the SANE package.
8 
9    This program is free software; you can redistribute it and/or
10    modify it under the terms of the GNU General Public License as
11    published by the Free Software Foundation; either version 2 of the
12    License, or (at your option) any later version.
13 
14    This program is distributed in the hope that it will be useful, but
15    WITHOUT ANY WARRANTY; without even the implied warranty of
16    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17    General Public License for more details.
18 
19    You should have received a copy of the GNU General Public License
20    along with this program.  If not, see <https://www.gnu.org/licenses/>.
21 
22    As a special exception, the authors of SANE give permission for
23    additional uses of the libraries contained in this release of SANE.
24 
25    The exception is that, if you link a SANE library with other files
26    to produce an executable, this does not by itself cause the
27    resulting executable to be covered by the GNU General Public
28    License.  Your use of that executable is in no way restricted on
29    account of linking the SANE library code into it.
30 
31    This exception does not, however, invalidate any other reasons why
32    the executable file might be covered by the GNU General Public
33    License.
34 
35    If you submit changes to SANE to the maintainers to be included in
36    a subsequent release, you agree by submitting the changes that
37    those changes may be distributed with this exception intact.
38 
39    If you write modifications of your own for SANE, it is your choice
40    whether to permit this exception to apply to your modifications.
41    If you do not wish that, delete this exception notice.  */
42 
43 #ifndef PIEUSB_SPECIFIC_H
44 #define	PIEUSB_SPECIFIC_H
45 
46 #include "../include/sane/sanei_ir.h"
47 #include "../include/sane/sanei_backend.h"
48 #include "pieusb_scancmd.h"
49 #include "pieusb_buffer.h"
50 
51 /* Settings for scan modes available to SANE */
52 /* In addition to those defined in sane.h */
53 #define SANE_VALUE_SCAN_MODE_RGBI    "RGBI"
54 
55 /* Scanner settings for colors to scan */
56 #define SCAN_ONE_PASS_RGBI           0x90
57 #define SCAN_ONE_PASS_COLOR          0x80
58 #define SCAN_FILTER_INFRARED         0x10
59 #define SCAN_FILTER_BLUE             0x08
60 #define SCAN_FILTER_GREEN            0x04
61 #define SCAN_FILTER_RED              0x02
62 #define SCAN_FILTER_NEUTRAL          0x01
63 
64 /* Settings for color depth of scan */
65 #define SCAN_COLOR_DEPTH_16          0x20
66 #define SCAN_COLOR_DEPTH_12          0x10
67 #define SCAN_COLOR_DEPTH_10          0x08
68 #define SCAN_COLOR_DEPTH_8           0x04
69 #define SCAN_COLOR_DEPTH_4           0x02
70 #define SCAN_COLOR_DEPTH_1           0x01
71 
72 /* Settings for format of the scanned data */
73 #define SCAN_COLOR_FORMAT_INDEX      0x04
74 #define SCAN_COLOR_FORMAT_LINE       0x02
75 #define SCAN_COLOR_FORMAT_PIXEL      0x01
76 
77 /* Settings for calibration mode */
78 #define SCAN_CALIBRATION_DEFAULT     "default values"
79 #define SCAN_CALIBRATION_AUTO        "from internal test"
80 #define SCAN_CALIBRATION_PREVIEW     "from preview"
81 #define SCAN_CALIBRATION_OPTIONS     "from options"
82 
83 /* Settings for additional gain */
84 #define SCAN_GAIN_ADJUST_03 "* 0.3"
85 #define SCAN_GAIN_ADJUST_05 "* 0.5"
86 #define SCAN_GAIN_ADJUST_08 "* 0.8"
87 #define SCAN_GAIN_ADJUST_10 "* 1.0"
88 #define SCAN_GAIN_ADJUST_12 "* 1.2"
89 #define SCAN_GAIN_ADJUST_16 "* 1.6"
90 #define SCAN_GAIN_ADJUST_19 "* 1.9"
91 #define SCAN_GAIN_ADJUST_24 "* 2.4"
92 #define SCAN_GAIN_ADJUST_30 "* 3.0"
93 
94 /* Post-processing */
95 #define POST_SW_COLORS          (1 << 0)        /* gain, negatives, ..., can be done at any time */
96 #define POST_SW_IRED            (1 << 1)        /* remove spectral overlap, needs complete scan */
97 #define POST_SW_DIRT            (1 << 2)        /* our digital lavabo, needs complete scan */
98 #define POST_SW_GRAIN           (1 << 3)        /* smoothen a bit */
99 #define POST_SW_CROP            (1 << 4)        /* trim whole image in sane_start
100                                                    before sane_get_parameters() is answered */
101 #define POST_SW_IRED_MASK       (POST_SW_IRED | POST_SW_DIRT)
102 #define POST_SW_ACCUM_MASK      (POST_SW_IRED_MASK | POST_SW_GRAIN | POST_SW_CROP)
103 
104 #define DEFAULT_GAIN                    19   /* 0x13 */
105 #define DEFAULT_EXPOSURE                2937 /* 0xb79 minimum value, see Pieusb_Settings */
106 #define DEFAULT_OFFSET                  0
107 #define DEFAULT_LIGHT                   4
108 #define DEFAULT_ADDITIONAL_ENTRIES      1
109 #define DEFAULT_DOUBLE_TIMES            0
110 
111 /* --------------------------------------------------------------------------
112  *
113  * DEVICE DEFINITION STRUCTURES
114  *
115  * --------------------------------------------------------------------------*/
116 
117 /* Options supported by the scanner */
118 
119 enum Pieusb_Option
120 {
121     OPT_NUM_OPTS = 0,
122     /* ------------------------------------------- */
123     OPT_MODE_GROUP,
124     OPT_MODE,                   /* scan mode */
125     OPT_BIT_DEPTH,              /* number of bits to encode a color */
126     OPT_RESOLUTION,             /* number of pixels per inch */
127     OPT_HALFTONE_PATTERN,       /* halftone pattern to use (see halftone_list) */
128     OPT_THRESHOLD,              /* halftone threshold */
129     OPT_SHARPEN,                /* create a sharper scan at the cost of scan time */
130     OPT_SHADING_ANALYSIS,       /* do shading analysis before the scan */
131     OPT_FAST_INFRARED,          /* scan infrared channel faster but less accurate */
132     OPT_ADVANCE_SLIDE,          /* auto-advance slide after scan */
133     OPT_CALIBRATION_MODE,       /* use auto-calibarion settings for scan */
134     /* ------------------------------------------- */
135     OPT_GEOMETRY_GROUP,
136     OPT_TL_X,			/* top-left x */
137     OPT_TL_Y,			/* top-left y */
138     OPT_BR_X,			/* bottom-right x */
139     OPT_BR_Y,			/* bottom-right y */
140     /* ------------------------------------------- */
141     OPT_ENHANCEMENT_GROUP,
142     OPT_CORRECT_SHADING,        /* correct scanned data for lamp variations (shading) */
143     OPT_CORRECT_INFRARED,       /* correct infrared for red crosstalk */
144     OPT_CLEAN_IMAGE,            /* detect and remove dust and scratch artifacts */
145     OPT_GAIN_ADJUST,            /* adjust gain (a simpler option than setting gain, exposure and offset directly) */
146     OPT_CROP_IMAGE,             /* automatically crop image */
147     OPT_SMOOTH_IMAGE,           /* smoothen image */
148     OPT_TRANSFORM_TO_SRGB,      /* transform to approximate sRGB data */
149     OPT_INVERT_IMAGE,           /* transform negative to positive */
150     /* ------------------------------------------- */
151     OPT_ADVANCED_GROUP,
152     OPT_PREVIEW,                /* scan a preview before the actual scan */
153     OPT_SAVE_SHADINGDATA,       /* output shading data */
154     OPT_SAVE_CCDMASK,           /* output CCD mask */
155     OPT_LIGHT,
156     OPT_DOUBLE_TIMES,
157     OPT_SET_EXPOSURE_R,           /* exposure times for R */
158     OPT_SET_EXPOSURE_G,           /* exposure times for G */
159     OPT_SET_EXPOSURE_B,           /* exposure times for B */
160     OPT_SET_EXPOSURE_I,           /* exposure times for I */
161     OPT_SET_GAIN_R,               /* gain for R */
162     OPT_SET_GAIN_G,               /* gain for G */
163     OPT_SET_GAIN_B,               /* gain for B */
164     OPT_SET_GAIN_I,               /* gain for I */
165     OPT_SET_OFFSET_R,             /* offset for R */
166     OPT_SET_OFFSET_G,             /* offset for G */
167     OPT_SET_OFFSET_B,             /* offset for B */
168     OPT_SET_OFFSET_I,             /* offset for I */
169     /* must come last: */
170     NUM_OPTIONS
171 };
172 
173 /* Forward declaration (see pieusb_scancmd.h) */
174 struct Pieusb_Shading_Parameters;
175 
176 /* Device characteristics of a Pieusb USB scanner */
177 struct Pieusb_Device_Definition
178 {
179     struct Pieusb_Device_Definition *next;
180 
181     SANE_Device sane;
182       /* name = string like "libusb:001:006" == NO! this should be "CrystalScan 7200" or "ProScan 7200"...
183        * vendor = "PIE/Pieusb"
184        * model = "CrystalScan 7200" or "ProScan 7200"
185        * type = "film scanner" */
186     /* char *devicename; => sane->name */
187     /* char *vendor; => sane->vendor */
188     /* char *product; => sane->model */
189     SANE_Word vendorId;
190     SANE_Word productId;
191       /* USB id's like 0x05e3 0x0145, see pieusb.conf */
192     SANE_String version; /* INQUIRY productRevision */
193     SANE_Byte model; /* INQUIRY model */
194     SANE_Byte flags; /* pieusb.conf flags */
195 
196     /* Ranges for various quantities */
197     SANE_Range dpi_range;
198     SANE_Range x_range;
199     SANE_Range y_range;
200     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.) */
201     SANE_Range dust_range;
202 
203     SANE_Range shadow_range;
204     SANE_Range highlight_range;
205 
206     /* Enumerated ranges vor various quantities */
207     SANE_String scan_mode_list[7]; /* names of scan modes (see saneopts.h) */
208     SANE_String calibration_mode_list[6]; /* names of calibration modes */
209     SANE_String gain_adjust_list[10]; /* gain adjustment values */
210     SANE_Word bpp_list[5];	   /* bit depths  */
211     SANE_String halftone_list[17]; /* names of the halftone patterns from the scanner */
212     SANE_String speed_list[9];	   /* names of available speeds */
213     SANE_String ir_sw_list[4];
214     SANE_String crop_sw_list[4];
215     SANE_Word grain_sw_list[6];
216 
217     /* Maximum resolution values */
218     int maximum_resolution_x;	   /* maximum x-resolution */
219     int maximum_resolution_y;	   /* maximum y-resolution */
220     int maximum_resolution;
221 
222     /* Geometry */
223     double scan_bed_width;	   /* flatbed width in inches (horizontal) */
224     double scan_bed_height;	   /* flatbed height in inches (vertical) */
225     int slide_top_left_x;          /* top-left location of slide w.r.t. scan bed */
226     int slide_top_left_y;          /* top-left location of slide w.r.t. scan bed */
227     double slide_width;	           /* transparency width in inches */
228     double slide_height;           /* transparency length in inches */
229 
230     /* Integer and bit-encoded properties */
231     int halftone_patterns;	   /* number of halftones supported */
232     int color_filters;	           /* available colour filters: Infrared-0-0-OnePassColor-B-G-R-N */
233     int color_depths;	           /* available colour depths: 0-0-16-12-10-8-4-1 */
234     int color_formats;	           /* colour data format: 0-0-0-0-0-Index-Line-Pixel */
235     int image_formats;	           /* image data format: 0-0-0-0-OKLine-BlkOne-Motorola-Intel */
236     int scan_capabilities;         /* additional scanner features, number of speeds: PowerSave-ExtCal-0-FastPreview-DisableCal-[CalSpeeds=3] */
237     int optional_devices;          /* optional devices: MultiPageLoad-?-?-0-0-TransModule1-TransModule-AutoDocFeeder */
238     int enhancements;	           /* enhancements: unknown coding */
239     int gamma_bits;	           /* no of bits used for gamma table */
240     int fast_preview_resolution;   /* fast preview resolution */
241     int minimum_highlight;	   /* min highlight % that can be used */
242     int maximum_shadow;  	   /* max shadow % that can be used */
243     int calibration_equation;      /* which calibration equation to use */
244     int minimum_exposure;	   /* min exposure */
245     int maximum_exposure;	   /* max exposure */
246 
247     struct Pieusb_Shading_Parameters_Info shading_parameters[4]; /* array with shading data parameters */
248 
249     int x0, y0, x1, y1;
250     SANE_String production;
251     SANE_String timestamp;
252     SANE_String signature;
253 };
254 
255 typedef struct Pieusb_Device_Definition Pieusb_Device_Definition;
256 
257 /* --------------------------------------------------------------------------
258  *
259  * CURRENTLY ACTIVE DEVICES
260  *
261  * --------------------------------------------------------------------------*/
262 
263 /* This structure holds information about an instance of an active scanner */
264 
265 struct Pieusb_Scanner
266 {
267     struct Pieusb_Scanner *next;
268     struct Pieusb_Device_Definition *device; /* pointer to device definition */
269 
270     int device_number; /* scanner device number (as determined by USB) */
271 
272     /* SANE option descriptions and settings for this scanner instance */
273     SANE_Option_Descriptor opt[NUM_OPTIONS];
274     Option_Value val[NUM_OPTIONS];
275 
276     /* Scan state */
277     struct Pieusb_Scanner_State state;
278     SANE_Int scanning; /* true if busy scanning */
279     SANE_Int cancel_request; /* if true, scanner should terminate a scan */
280 
281     /* Scan settings */
282     struct Pieusb_Mode mode;
283     struct Pieusb_Settings settings;
284     struct Pieusb_Scan_Frame frame;
285     SANE_Parameters scan_parameters;
286 
287     /* Shading data and CCD-mask */
288 #define PIEUSB_CCD_MASK_SIZE 0x1a1d  /* pieusb 5340; */ /* cyberview: 6685 0x1a1d */
289     SANE_Byte *ccd_mask; /* malloc'ed in sane_open */
290     SANE_Int ccd_mask_size;
291     SANE_Bool shading_data_present; /* don't correct shading if not present */
292     SANE_Int shading_mean[SHADING_PARAMETERS_INFO_COUNT]; /* mean shading value for each color (average all 45 lines)  */
293     SANE_Int shading_max[SHADING_PARAMETERS_INFO_COUNT]; /* maximum shading value for each color (for all 45 lines)  */
294     SANE_Int* shading_ref[SHADING_PARAMETERS_INFO_COUNT]; /* 4 arrays of shading references for each pixel on a line and for each color */
295 
296     /* Calibration using preview */
297 
298     SANE_Bool preview_done;
299     SANE_Int preview_exposure[4];    /* exposure values used in preview */
300     SANE_Int preview_gain[4];        /* gain values used in preview */
301     SANE_Int preview_offset[4];      /* offset values used in preview */
302     SANE_Int preview_lower_bound[4]; /* lowest RGBI values in preview */
303     SANE_Int preview_upper_bound[4]; /* highest RGBI values in preview */
304 
305     /* Post processing options */
306 /*
307     SANE_Int processing;
308 */
309     double *ln_lut; /* logarithmic lookup table */
310 
311     /* Reading buffer */
312     struct Pieusb_Read_Buffer buffer;
313 };
314 
315 typedef struct Pieusb_Scanner Pieusb_Scanner;
316 
317 SANE_Status sanei_pieusb_parse_config_line(const char* config_line,
318                                            SANE_Word* vendor_id,
319                                            SANE_Word* product_id,
320                                            SANE_Int* model_number,
321                                            SANE_Int* flags);
322 /* sub to sane_start() */
323 SANE_Status sanei_pieusb_post (Pieusb_Scanner *scanner,  uint16_t **in_img, int planes);
324 void sanei_pieusb_correct_shading(struct Pieusb_Scanner *scanner, struct Pieusb_Read_Buffer *buffer);
325 SANE_Status sanei_pieusb_get_scan_data(Pieusb_Scanner * scanner, SANE_Int parameter_bytes);
326 SANE_Status sanei_pieusb_get_parameters(Pieusb_Scanner * scanner, SANE_Int *parameter_bytes);
327 SANE_Status sanei_pieusb_get_ccd_mask(Pieusb_Scanner * scanner);
328 SANE_Status sanei_pieusb_get_shading_data(Pieusb_Scanner * scanner);
329 SANE_Status sanei_pieusb_set_mode_from_options(Pieusb_Scanner * scanner);
330 SANE_Status sanei_pieusb_set_gain_offset(Pieusb_Scanner * scanner, const char* calibration_mode);
331 SANE_Status sanei_pieusb_set_frame_from_options(Pieusb_Scanner * scanner);
332 void sanei_pieusb_print_options(struct Pieusb_Scanner *scanner);
333 /* sub to sane_control_option() and sane_start() */
334 int sanei_pieusb_analyse_options(struct Pieusb_Scanner *scanner);
335 SANE_Bool sanei_pieusb_supported_device_list_contains(SANE_Word vendor_id, SANE_Word product_id, SANE_Int model_number, SANE_Int flags);
336 SANE_Status sanei_pieusb_supported_device_list_add(SANE_Word vendor_id, SANE_Word product_id, SANE_Int model_number, SANE_Int flags);
337 /* sub to sane_init() and sane_open() */
338 SANE_Status sanei_pieusb_find_device_callback (const char *devicename);
339 /* sub to sane_open() */
340 SANE_Status sanei_pieusb_init_options (Pieusb_Scanner * scanner);
341 /* sub to sane_start(), sane_read() and sane_close() */
342 SANE_Status sanei_pieusb_on_cancel (Pieusb_Scanner * scanner);
343 
344 SANE_Status sanei_pieusb_wait_ready(Pieusb_Scanner *scanner, SANE_Int device_number);
345 SANE_Status sanei_pieusb_analyze_preview(Pieusb_Scanner * scanner);
346 
347 
348 
349 #endif	/* PIEUSB_SPECIFIC_H */
350