xref: /third_party/backends/backend/u12.h (revision 141cc406)
1/** @file u12.h
2 *  @brief Definitions for the backend.
3 *
4 * Copyright (c) 2003-2004 Gerhard Jaeger <gerhard@gjaeger.de>
5 *
6 * History:
7 * - 0.01 - initial version
8 * - 0.02 - added scaling variables to struct u12d
9 * .
10 * <hr>
11 * This file is part of the SANE package.
12 *
13 * This program is free software; you can redistribute it and/or
14 * modify it under the terms of the GNU General Public License as
15 * published by the Free Software Foundation; either version 2 of the
16 * License, or (at your option) any later version.
17 *
18 * This program is distributed in the hope that it will be useful, but
19 * WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
21 * General Public License for more details.
22 *
23 * You should have received a copy of the GNU General Public License
24 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
25 *
26 * As a special exception, the authors of SANE give permission for
27 * additional uses of the libraries contained in this release of SANE.
28 *
29 * The exception is that, if you link a SANE library with other files
30 * to produce an executable, this does not by itself cause the
31 * resulting executable to be covered by the GNU General Public
32 * License.  Your use of that executable is in no way restricted on
33 * account of linking the SANE library code into it.
34 *
35 * This exception does not, however, invalidate any other reasons why
36 * the executable file might be covered by the GNU General Public
37 * License.
38 *
39 * If you submit changes to SANE to the maintainers to be included in
40 * a subsequent release, you agree by submitting the changes that
41 * those changes may be distributed with this exception intact.
42 *
43 * If you write modifications of your own for SANE, it is your choice
44 * whether to permit this exception to apply to your modifications.
45 * If you do not wish that, delete this exception notice.
46 * <hr>
47 */
48#ifndef __U12_H__
49#define __U12_H__
50
51#ifndef SANE_OPTION
52/* for compatibility with older versions */
53typedef union
54{
55	SANE_Word w;
56	SANE_Word *wa;		/* word array */
57	SANE_String s;
58} Option_Value;
59#endif
60
61/************************ some definitions ***********************************/
62
63#define U12_CONFIG_FILE "u12.conf"
64
65#ifndef PATH_MAX
66# define PATH_MAX 1024
67#endif
68
69#define _MM_PER_INCH  25.4
70#define _MEASURE_BASE 300UL
71#define _DEF_DPI      50
72
73/** the default image
74 */
75#define _DEFAULT_TLX        0
76#define _DEFAULT_TLY        0
77#define _DEFAULT_BRX        126
78#define _DEFAULT_BRY        76
79
80#define _DEFAULT_TP_TLX     3.5
81#define _DEFAULT_TP_TLY     10.5
82#define _DEFAULT_TP_BRX     38.5
83#define _DEFAULT_TP_BRY     33.5
84
85#define _DEFAULT_NEG_TLX    1.5
86#define _DEFAULT_NEG_TLY    1.5
87#define _DEFAULT_NEG_BRX    37.5
88#define _DEFAULT_NEG_BRY    25.5
89
90/** image sizes for normal, transparent and negative modes
91 */
92#define _TPAPageWidth		500U
93#define _TPAPageHeight		510U
94#define _TPAMinDpi		    150
95#define _TPAModeSupportMin	COLOR_TRUE24
96
97#define _NegativePageWidth  460UL
98#define _NegativePageHeight 350UL
99
100#define _TP_X			((double)_TPAPageWidth/300.0 * _MM_PER_INCH)
101#define _TP_Y			((double)_TPAPageHeight/300.0 * _MM_PER_INCH)
102#define _NEG_X			((double)_NegativePageWidth/300.0 * _MM_PER_INCH)
103#define _NEG_Y			((double)_NegativePageHeight/300.0 * _MM_PER_INCH)
104
105/** scan modes
106 */
107#define COLOR_BW      0
108#define COLOR_256GRAY 1
109#define COLOR_TRUE24  2
110#define COLOR_TRUE42  3
111
112#define _VAR_NOT_USED(x)	((x)=(x))
113
114
115/** usb id buffer
116 */
117#define _MAX_ID_LEN	20
118
119/** Scanmodes
120 */
121#define _ScanMode_Color         0
122#define _ScanMode_AverageOut	1	/* CCD averaged 2 pixels value for output*/
123#define _ScanMode_Mono			2   /* not color mode						 */
124
125/** Scansource + additional flags
126 */
127#define _SCANDEF_PREVIEW        0x00000001
128#define _SCANDEF_Transparency   0x00000100
129#define _SCANDEF_Negative       0x00000200
130#define _SCANDEF_TPA            (_SCANDEF_Transparency | _SCANDEF_Negative)
131#define _SCANDEF_SCANNING       0x8000000
132
133/** for Gamma tables
134 */
135#define _MAP_RED    0
136#define _MAP_GREEN  1
137#define _MAP_BLUE   2
138#define _MAP_MASTER 3
139
140/** the ASIC modes */
141#define _PP_MODE_SPP 0
142#define _PP_MODE_EPP 1
143
144/************************ some structures ************************************/
145
146enum {
147	OPT_NUM_OPTS = 0,
148	OPT_MODE_GROUP,
149#ifdef ALL_MODES
150	OPT_MODE,
151	OPT_EXT_MODE,
152#endif
153	OPT_RESOLUTION,
154	OPT_PREVIEW,
155	OPT_GEOMETRY_GROUP,
156	OPT_TL_X,
157	OPT_TL_Y,
158	OPT_BR_X,
159	OPT_BR_Y,
160	OPT_ENHANCEMENT_GROUP,
161	OPT_BRIGHTNESS,
162	OPT_CONTRAST,
163	OPT_CUSTOM_GAMMA,
164	OPT_GAMMA_VECTOR,
165	OPT_GAMMA_VECTOR_R,
166	OPT_GAMMA_VECTOR_G,
167	OPT_GAMMA_VECTOR_B,
168	NUM_OPTIONS
169};
170
171/** for adjusting the scanner settings
172 */
173typedef struct {
174	int lampOff;
175	int lampOffOnEnd;
176	int warmup;
177
178	/* for adjusting the default gamma settings */
179	double  rgamma;
180	double  ggamma;
181	double  bgamma;
182	double  graygamma;
183
184	/* for adjusting scan-area */
185	long    upNormal;
186	long    upPositive;
187	long    upNegative;
188	long    leftNormal;
189
190} AdjDef, *pAdjDef;
191
192/** for holding basic capabilities
193 */
194typedef struct {
195	unsigned short scanAreaX;
196	unsigned short scanAreaY;
197	unsigned long  flag;
198#if 0
199	RANGE	    	rDataType;      /* available scan modes 			*/
200	unsigned short	wMaxExtentX;	/* scanarea width					*/
201	unsigned short	wMaxExtentY;	/* scanarea height					*/
202#endif
203} ScannerCaps, *pScannerCaps;
204
205
206/** for defining the scanmodes
207 */
208typedef const struct mode_param
209{
210	int color;
211	int depth;
212	int scanmode;
213} ModeParam, *pModeParam;
214
215/** Here we hold all device specific data
216 */
217typedef struct u12d
218{
219	SANE_Bool    initialized;       /* device already initialized?  */
220	struct u12d *next;              /* pointer to next dev in list  */
221	int          fd;                /* device handle                */
222	int          mode;
223	char        *name;              /* (to avoid compiler warnings!)*/
224	SANE_Device  sane;              /* info struct                  */
225
226	/* scan-area settings */
227	SANE_Int     max_x;             /* max XY-extension of the scan-*/
228	SANE_Int     max_y;             /* area                         */
229	SANE_Range   x_range;           /* x-range of the scan-area     */
230	SANE_Range   y_range;           /* y-range of the scan-area     */
231
232	/* resolution settings */
233	SANE_Int     dpi_max_x;         /* */
234	SANE_Int     dpi_max_y;         /* */
235	SANE_Range   dpi_range;         /* resolution range             */
236
237	SANE_Int    *res_list;          /* to hold the available phys.  */
238	SANE_Int     res_list_size;     /* resolution values            */
239	ScannerCaps  caps;              /* caps reported by the driver  */
240	AdjDef       adj;               /* for driver adjustment        */
241
242	char         usbId[_MAX_ID_LEN];/* to keep Vendor and product   */
243                                    /* ID string (from conf) file   */
244	/* our gamma tables */
245	SANE_Word    gamma_table[4][4096];
246	SANE_Range   gamma_range;
247	int          gamma_length;
248
249	/* the shading section */
250	pFnDACOffs   fnDarkOffset;   /**< ...                 */
251	ShadingDef   shade;          /**< shading parameters */
252
253	/* */
254	SANE_Byte    PCBID;         /**< which version of the PCB         */
255
256	/* motor control section */
257	SANE_Byte    MotorID;       /**< the type of the motor drivers    */
258	SANE_Byte    MotorPower;    /**< how to drive the motor           */
259	SANE_Bool    f2003;
260	SANE_Byte    XStepMono;
261	SANE_Byte    XStepColor;
262	SANE_Byte    XStepBack;
263	SANE_Bool    f0_8_16;
264	SANE_Byte    scanStates[_SCANSTATE_BYTES];
265
266	/* CCD section */
267	SANE_Byte    CCDID;         /**< what CCD do we have              */
268	RegDef      *CCDRegs;       /**< pointer to the register descr    */
269	u_short      numCCDRegs;    /**< number of values to write        */
270
271	/* DAC section */
272	SANE_Byte    DACType;       /**< what DAC do we have              */
273	RegDef      *DACRegs;       /**< pointer to DAC reg descr.        */
274	u_short      numDACRegs;    /**< number of values to write        */
275	pFnDACDark   fnDACDark;     /**<                                  */
276	RGBByteDef   RegDACOffset;
277	RGBByteDef   RegDACGain;
278
279	ShadowRegs   regs;       /**< for holding ASIC register values        */
280	DataInfo     DataInf;    /**< all static info about the current scan  */
281	ScanInfo     scan;       /**< buffer and motor management during scan */
282	BufferDef    bufs;
283	void        *scaleBuf;   /**< buffer for line scaling    */
284	int          scaleStep;  /**< step size for line scaling */
285	int          scaleIzoom; /**< factor for line scaling    */
286
287	u_long       ModelOriginY;
288	SANE_Byte    ModelCtrl;
289
290	SANE_Bool    Tpa;           /**< do we have a TPA                 */
291	SANE_Byte    Buttons;       /**< number of buttons                */
292
293	/* lamp control section */
294	SANE_Bool    warmupNeeded;
295	SANE_Byte    lastLampStatus;  /**< for keeping the lamp status   */
296
297#ifdef HAVE_SETITIMER
298	struct itimerval   saveSettings;    /**< for lamp timer           */
299#endif
300} U12_Device;
301
302typedef struct u12s
303{
304	struct u12s     *next;
305	SANE_Pid         reader_pid;     /* process id of reader          */
306	SANE_Status      exit_code;      /* status of the reader process  */
307	int              r_pipe;         /* pipe to reader process        */
308	int              w_pipe;         /* pipe from reader process      */
309	unsigned long    bytes_read;     /* number of bytes currently read*/
310	U12_Device      *hw;             /* pointer to current device     */
311	Option_Value     val[NUM_OPTIONS];
312	SANE_Byte       *buf;            /* the image buffer              */
313	SANE_Bool        scanning;       /* TRUE during scan-process      */
314	SANE_Parameters  params;         /* for keeping the parameter     */
315
316	SANE_Option_Descriptor opt[NUM_OPTIONS];
317
318} U12_Scanner;
319
320/** for collecting configuration info...
321 */
322typedef struct {
323
324	char devName[PATH_MAX];
325	char usbId[_MAX_ID_LEN];
326
327	/* contains the stuff to adjust... */
328	AdjDef   adj;
329
330} CnfDef, *pCnfDef;
331
332#endif	/* guard __U12_H__ */
333
334/* END U12.H ................................................................*/
335