1141cc406Sopenharmony_ci/* sane - Scanner Access Now Easy.
2141cc406Sopenharmony_ci
3141cc406Sopenharmony_ci   Copyright (C) 2005 Mustek.
4141cc406Sopenharmony_ci   Originally maintained by Mustek
5141cc406Sopenharmony_ci   Author:Jack Roy 2005.5.24
6141cc406Sopenharmony_ci
7141cc406Sopenharmony_ci   This file is part of the SANE package.
8141cc406Sopenharmony_ci
9141cc406Sopenharmony_ci   This program is free software; you can redistribute it and/or
10141cc406Sopenharmony_ci   modify it under the terms of the GNU General Public License as
11141cc406Sopenharmony_ci   published by the Free Software Foundation; either version 2 of the
12141cc406Sopenharmony_ci   License, or (at your option) any later version.
13141cc406Sopenharmony_ci
14141cc406Sopenharmony_ci   This program is distributed in the hope that it will be useful, but
15141cc406Sopenharmony_ci   WITHOUT ANY WARRANTY; without even the implied warranty of
16141cc406Sopenharmony_ci   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17141cc406Sopenharmony_ci   General Public License for more details.
18141cc406Sopenharmony_ci
19141cc406Sopenharmony_ci   You should have received a copy of the GNU General Public License
20141cc406Sopenharmony_ci   along with this program.  If not, see <https://www.gnu.org/licenses/>.
21141cc406Sopenharmony_ci
22141cc406Sopenharmony_ci   As a special exception, the authors of SANE give permission for
23141cc406Sopenharmony_ci   additional uses of the libraries contained in this release of SANE.
24141cc406Sopenharmony_ci
25141cc406Sopenharmony_ci   The exception is that, if you link a SANE library with other files
26141cc406Sopenharmony_ci   to produce an executable, this does not by itself cause the
27141cc406Sopenharmony_ci   resulting executable to be covered by the GNU General Public
28141cc406Sopenharmony_ci   License.  Your use of that executable is in no way restricted on
29141cc406Sopenharmony_ci   account of linking the SANE library code into it.
30141cc406Sopenharmony_ci
31141cc406Sopenharmony_ci   This exception does not, however, invalidate any other reasons why
32141cc406Sopenharmony_ci   the executable file might be covered by the GNU General Public
33141cc406Sopenharmony_ci   License.
34141cc406Sopenharmony_ci
35141cc406Sopenharmony_ci   If you submit changes to SANE to the maintainers to be included in
36141cc406Sopenharmony_ci   a subsequent release, you agree by submitting the changes that
37141cc406Sopenharmony_ci   those changes may be distributed with this exception intact.
38141cc406Sopenharmony_ci
39141cc406Sopenharmony_ci   If you write modifications of your own for SANE, it is your choice
40141cc406Sopenharmony_ci   whether to permit this exception to apply to your modifications.
41141cc406Sopenharmony_ci   If you do not wish that, delete this exception notice.
42141cc406Sopenharmony_ci
43141cc406Sopenharmony_ci   This file implements a SANE backend for the Mustek BearPaw 2448 TA Pro
44141cc406Sopenharmony_ci   and similar USB2 scanners. */
45141cc406Sopenharmony_ci
46141cc406Sopenharmony_ci/* forward declarations */
47141cc406Sopenharmony_ci
48141cc406Sopenharmony_cistatic SANE_Bool Reflective_Reset (void);
49141cc406Sopenharmony_cistatic SANE_Bool Reflective_ScanSuggest (PTARGETIMAGE pTarget, PSUGGESTSETTING pSuggest);
50141cc406Sopenharmony_cistatic SANE_Bool Reflective_SetupScan (COLORMODE ColorMode, unsigned short XDpi, unsigned short YDpi,
51141cc406Sopenharmony_ci				  SANE_Bool isInvert, unsigned short X, unsigned short Y, unsigned short Width,
52141cc406Sopenharmony_ci				  unsigned short Height);
53141cc406Sopenharmony_cistatic SANE_Bool Reflective_StopScan (void);
54141cc406Sopenharmony_cistatic SANE_Bool Reflective_GetRows (SANE_Byte * lpBlock, unsigned short * Rows, SANE_Bool isOrderInvert);
55141cc406Sopenharmony_cistatic SANE_Bool Reflective_AdjustAD (void);
56141cc406Sopenharmony_cistatic SANE_Bool Reflective_FindTopLeft (unsigned short * lpwStartX, unsigned short * lpwStartY);
57141cc406Sopenharmony_cistatic SANE_Bool Reflective_LineCalibration16Bits (void);
58141cc406Sopenharmony_cistatic SANE_Bool Reflective_PrepareScan (void);
59141cc406Sopenharmony_ci
60141cc406Sopenharmony_ci/*function description*/
61141cc406Sopenharmony_ci
62141cc406Sopenharmony_ci/**********************************************************************
63141cc406Sopenharmony_ciAuthor: Jack            Date: 2005/05/13
64141cc406Sopenharmony_ciRoutine Description:
65141cc406Sopenharmony_ci	reset the scanner status
66141cc406Sopenharmony_ciParameters:
67141cc406Sopenharmony_ci	none
68141cc406Sopenharmony_ciReturn value:
69141cc406Sopenharmony_ci	if operation is success
70141cc406Sopenharmony_ci	return TRUE
71141cc406Sopenharmony_ci	els
72141cc406Sopenharmony_ci	return FALSE
73141cc406Sopenharmony_ci***********************************************************************/
74141cc406Sopenharmony_cistatic SANE_Bool
75141cc406Sopenharmony_ciReflective_Reset ()
76141cc406Sopenharmony_ci{
77141cc406Sopenharmony_ci  DBG (DBG_FUNC, "Reflective_Reset: call in\n");
78141cc406Sopenharmony_ci
79141cc406Sopenharmony_ci  if (g_bOpened)
80141cc406Sopenharmony_ci    {
81141cc406Sopenharmony_ci      DBG (DBG_FUNC, "Reflective_Reset: scanner has been opened\n");
82141cc406Sopenharmony_ci      return FALSE;
83141cc406Sopenharmony_ci    }
84141cc406Sopenharmony_ci
85141cc406Sopenharmony_ci  if (SANE_STATUS_GOOD != Asic_Open (&g_chip, g_pDeviceFile))
86141cc406Sopenharmony_ci    {
87141cc406Sopenharmony_ci      DBG (DBG_FUNC, "Reflective_Reset: Asic_Open return error\n");
88141cc406Sopenharmony_ci      return FALSE;
89141cc406Sopenharmony_ci    }
90141cc406Sopenharmony_ci
91141cc406Sopenharmony_ci  if (SANE_STATUS_GOOD != Asic_Reset (&g_chip))
92141cc406Sopenharmony_ci    {
93141cc406Sopenharmony_ci      DBG (DBG_FUNC, "Reflective_Reset: Asic_Reset return error\n");
94141cc406Sopenharmony_ci      return FALSE;
95141cc406Sopenharmony_ci    }
96141cc406Sopenharmony_ci
97141cc406Sopenharmony_ci  if (SANE_STATUS_GOOD != Asic_SetSource (&g_chip, LS_REFLECTIVE))
98141cc406Sopenharmony_ci    {
99141cc406Sopenharmony_ci      DBG (DBG_FUNC, "Reflective_Reset: Asic_SetSource return error\n");
100141cc406Sopenharmony_ci      return FALSE;
101141cc406Sopenharmony_ci    }
102141cc406Sopenharmony_ci
103141cc406Sopenharmony_ci  if (SANE_STATUS_GOOD != Asic_TurnLamp (&g_chip, TRUE))
104141cc406Sopenharmony_ci    {
105141cc406Sopenharmony_ci      DBG (DBG_FUNC, "Reflective_Reset: Asic_TurnLamp return error\n");
106141cc406Sopenharmony_ci      return FALSE;
107141cc406Sopenharmony_ci    }
108141cc406Sopenharmony_ci
109141cc406Sopenharmony_ci  if (SANE_STATUS_GOOD != Asic_Close (&g_chip))
110141cc406Sopenharmony_ci    {
111141cc406Sopenharmony_ci      DBG (DBG_FUNC, "Reflective_Reset: Asic_Close return error\n");
112141cc406Sopenharmony_ci      return FALSE;
113141cc406Sopenharmony_ci    }
114141cc406Sopenharmony_ci
115141cc406Sopenharmony_ci  g_Y = 0;
116141cc406Sopenharmony_ci  g_X = 0;
117141cc406Sopenharmony_ci  g_Width = 0;
118141cc406Sopenharmony_ci  g_SWWidth = 0;
119141cc406Sopenharmony_ci  g_Height = 0;
120141cc406Sopenharmony_ci  g_SWHeight = 0;
121141cc406Sopenharmony_ci
122141cc406Sopenharmony_ci  g_wLineartThreshold = 128;
123141cc406Sopenharmony_ci  g_dwTotalTotalXferLines = 0;
124141cc406Sopenharmony_ci  g_bFirstReadImage = TRUE;
125141cc406Sopenharmony_ci
126141cc406Sopenharmony_ci  g_pGammaTable = NULL;
127141cc406Sopenharmony_ci
128141cc406Sopenharmony_ci  if (NULL != g_pDeviceFile)
129141cc406Sopenharmony_ci    {
130141cc406Sopenharmony_ci      free (g_pDeviceFile);
131141cc406Sopenharmony_ci      g_pDeviceFile = NULL;
132141cc406Sopenharmony_ci    }
133141cc406Sopenharmony_ci
134141cc406Sopenharmony_ci  DBG (DBG_FUNC, "Reflective_Reset: exit\n");
135141cc406Sopenharmony_ci
136141cc406Sopenharmony_ci  return TRUE;
137141cc406Sopenharmony_ci}
138141cc406Sopenharmony_ci
139141cc406Sopenharmony_ci/**********************************************************************
140141cc406Sopenharmony_ciAuthor: Jack            Date: 2005/05/13
141141cc406Sopenharmony_ciRoutine Description:
142141cc406Sopenharmony_ci	get the suggest parameter of scanning
143141cc406Sopenharmony_ciParameters:
144141cc406Sopenharmony_ci	pTarget: the information of scanning
145141cc406Sopenharmony_ci	pSuggest: suggest parameter of scanning
146141cc406Sopenharmony_ciReturn value:
147141cc406Sopenharmony_ci	if the operation is success
148141cc406Sopenharmony_ci	return TRUE
149141cc406Sopenharmony_ci	els
150141cc406Sopenharmony_ci	return FALSE
151141cc406Sopenharmony_ci***********************************************************************/
152141cc406Sopenharmony_cistatic SANE_Bool
153141cc406Sopenharmony_ciReflective_ScanSuggest (PTARGETIMAGE pTarget, PSUGGESTSETTING pSuggest)
154141cc406Sopenharmony_ci{
155141cc406Sopenharmony_ci  int i;
156141cc406Sopenharmony_ci  unsigned short wMaxWidth, wMaxHeight;
157141cc406Sopenharmony_ci
158141cc406Sopenharmony_ci  DBG (DBG_FUNC, "Reflective_ScanSuggest: call in\n");
159141cc406Sopenharmony_ci
160141cc406Sopenharmony_ci  if (NULL == pTarget || NULL == pSuggest)
161141cc406Sopenharmony_ci    {
162141cc406Sopenharmony_ci      DBG (DBG_FUNC, "Reflective_ScanSuggest: parameters error\n");
163141cc406Sopenharmony_ci      return FALSE;
164141cc406Sopenharmony_ci    }
165141cc406Sopenharmony_ci
166141cc406Sopenharmony_ci  /*1. Looking up Optical Y Resolution */
167141cc406Sopenharmony_ci  for (i = 0; s_wOpticalYDpi[i] != 0; i++)
168141cc406Sopenharmony_ci    {
169141cc406Sopenharmony_ci      if (s_wOpticalYDpi[i] <= pTarget->wDpi)
170141cc406Sopenharmony_ci	{
171141cc406Sopenharmony_ci	  pSuggest->wYDpi = s_wOpticalYDpi[i];
172141cc406Sopenharmony_ci	  break;
173141cc406Sopenharmony_ci	}
174141cc406Sopenharmony_ci    }
175141cc406Sopenharmony_ci  if (s_wOpticalYDpi[i] == 0)
176141cc406Sopenharmony_ci    {
177141cc406Sopenharmony_ci      i--;
178141cc406Sopenharmony_ci      pSuggest->wYDpi = s_wOpticalYDpi[i];
179141cc406Sopenharmony_ci    }
180141cc406Sopenharmony_ci
181141cc406Sopenharmony_ci  /*2. Looking up Optical X Resolution */
182141cc406Sopenharmony_ci  for (i = 0; s_wOpticalXDpi[i] != 0; i++)
183141cc406Sopenharmony_ci    {
184141cc406Sopenharmony_ci      if (s_wOpticalXDpi[i] <= pTarget->wDpi)
185141cc406Sopenharmony_ci	{
186141cc406Sopenharmony_ci	  pSuggest->wXDpi = s_wOpticalXDpi[i];
187141cc406Sopenharmony_ci	  break;
188141cc406Sopenharmony_ci	}
189141cc406Sopenharmony_ci    }
190141cc406Sopenharmony_ci  if (s_wOpticalXDpi[i] == 0)
191141cc406Sopenharmony_ci    {
192141cc406Sopenharmony_ci      i--;
193141cc406Sopenharmony_ci      pSuggest->wXDpi = s_wOpticalXDpi[i];
194141cc406Sopenharmony_ci    }
195141cc406Sopenharmony_ci
196141cc406Sopenharmony_ci  DBG (DBG_FUNC, "Reflective_ScanSuggest: pTarget->wDpi = %d\n",
197141cc406Sopenharmony_ci       pTarget->wDpi);
198141cc406Sopenharmony_ci  DBG (DBG_FUNC, "Reflective_ScanSuggest: pSuggest->wXDpi = %d\n",
199141cc406Sopenharmony_ci       pSuggest->wXDpi);
200141cc406Sopenharmony_ci
201141cc406Sopenharmony_ci
202141cc406Sopenharmony_ci
203141cc406Sopenharmony_ci
204141cc406Sopenharmony_ci
205141cc406Sopenharmony_ci
206141cc406Sopenharmony_ci
207141cc406Sopenharmony_ci  DBG (DBG_FUNC, "Reflective_ScanSuggest: pSuggest->wYDpi = %d\n",
208141cc406Sopenharmony_ci       pSuggest->wYDpi);
209141cc406Sopenharmony_ci
210141cc406Sopenharmony_ci  /*3. suggest scan area */
211141cc406Sopenharmony_ci  pSuggest->wX =
212141cc406Sopenharmony_ci    (unsigned short) (((unsigned int) (pTarget->wX) * (unsigned int) (pSuggest->wXDpi)) /
213141cc406Sopenharmony_ci	    (unsigned int) (pTarget->wDpi));
214141cc406Sopenharmony_ci  pSuggest->wY =
215141cc406Sopenharmony_ci    (unsigned short) (((unsigned int) (pTarget->wY) * (unsigned int) (pSuggest->wYDpi)) /
216141cc406Sopenharmony_ci	    (unsigned int) (pTarget->wDpi));
217141cc406Sopenharmony_ci  pSuggest->wWidth =
218141cc406Sopenharmony_ci    (unsigned short) (((unsigned int) (pTarget->wWidth) * (unsigned int) (pSuggest->wXDpi)) /
219141cc406Sopenharmony_ci	    (unsigned int) (pTarget->wDpi));
220141cc406Sopenharmony_ci  pSuggest->wHeight =
221141cc406Sopenharmony_ci    (unsigned short) (((unsigned int) (pTarget->wHeight) * (unsigned int) (pSuggest->wYDpi)) /
222141cc406Sopenharmony_ci	    (unsigned int) (pTarget->wDpi));
223141cc406Sopenharmony_ci
224141cc406Sopenharmony_ci  pSuggest->wWidth = (pSuggest->wWidth / 2) * 2;
225141cc406Sopenharmony_ci
226141cc406Sopenharmony_ci  DBG (DBG_FUNC, "Reflective_ScanSuggest: pTarget->wX = %d\n", pTarget->wX);
227141cc406Sopenharmony_ci  DBG (DBG_FUNC, "Reflective_ScanSuggest: pTarget->wY = %d\n", pTarget->wY);
228141cc406Sopenharmony_ci  DBG (DBG_FUNC, "Reflective_ScanSuggest: pTarget->wWidth = %d\n",
229141cc406Sopenharmony_ci       pTarget->wWidth);
230141cc406Sopenharmony_ci  DBG (DBG_FUNC, "Reflective_ScanSuggest: pTarget->wHeight = %d\n",
231141cc406Sopenharmony_ci       pTarget->wHeight);
232141cc406Sopenharmony_ci
233141cc406Sopenharmony_ci  DBG (DBG_FUNC, "Reflective_ScanSuggest: pSuggest->wX = %d\n", pSuggest->wX);
234141cc406Sopenharmony_ci  DBG (DBG_FUNC, "Reflective_ScanSuggest: pSuggest->wY = %d\n", pSuggest->wY);
235141cc406Sopenharmony_ci  DBG (DBG_FUNC, "Reflective_ScanSuggest: pSuggest->wWidth = %d\n",
236141cc406Sopenharmony_ci       pSuggest->wWidth);
237141cc406Sopenharmony_ci  DBG (DBG_FUNC, "Reflective_ScanSuggest: pSuggest->wHeight = %d\n",
238141cc406Sopenharmony_ci       pSuggest->wHeight);
239141cc406Sopenharmony_ci
240141cc406Sopenharmony_ci  if (pTarget->cmColorMode == CM_TEXT)
241141cc406Sopenharmony_ci    {
242141cc406Sopenharmony_ci      pSuggest->wWidth = ((pSuggest->wWidth + 7) >> 3) << 3;
243141cc406Sopenharmony_ci      if (pSuggest->wWidth < 8)
244141cc406Sopenharmony_ci	pSuggest->wWidth = 8;
245141cc406Sopenharmony_ci    }
246141cc406Sopenharmony_ci
247141cc406Sopenharmony_ci  /*4. check width and height */
248141cc406Sopenharmony_ci  wMaxWidth = (MAX_SCANNING_WIDTH * pSuggest->wXDpi) / 300;
249141cc406Sopenharmony_ci  wMaxHeight = (3480 * pSuggest->wYDpi) / 300;	/* 3480 for bumping */
250141cc406Sopenharmony_ci
251141cc406Sopenharmony_ci  DBG (DBG_FUNC, "Reflective_ScanSuggest: wMaxWidth = %d\n", wMaxWidth);
252141cc406Sopenharmony_ci  DBG (DBG_FUNC, "Reflective_ScanSuggest: wMaxHeight = %d\n", wMaxHeight);
253141cc406Sopenharmony_ci
254141cc406Sopenharmony_ci  if (CM_TEXT == pTarget->cmColorMode)
255141cc406Sopenharmony_ci    {
256141cc406Sopenharmony_ci      wMaxWidth = (wMaxWidth >> 3) << 3;
257141cc406Sopenharmony_ci    }
258141cc406Sopenharmony_ci  if (pSuggest->wWidth > wMaxWidth)
259141cc406Sopenharmony_ci    {
260141cc406Sopenharmony_ci      pSuggest->wWidth = wMaxWidth;
261141cc406Sopenharmony_ci    }
262141cc406Sopenharmony_ci
263141cc406Sopenharmony_ci
264141cc406Sopenharmony_ci  if (pSuggest->wHeight > wMaxHeight)
265141cc406Sopenharmony_ci    {
266141cc406Sopenharmony_ci      pSuggest->wHeight = wMaxHeight;
267141cc406Sopenharmony_ci    }
268141cc406Sopenharmony_ci
269141cc406Sopenharmony_ci  DBG (DBG_FUNC, "Reflective_ScanSuggest: g_Width=%d\n", g_Width);
270141cc406Sopenharmony_ci
271141cc406Sopenharmony_ci  g_Width = ((pSuggest->wWidth + 15) >> 4) << 4;	/*Real Scan Width */
272141cc406Sopenharmony_ci
273141cc406Sopenharmony_ci  DBG (DBG_FUNC, "Reflective_ScanSuggest: again, g_Width=%d\n", g_Width);
274141cc406Sopenharmony_ci
275141cc406Sopenharmony_ci  g_Height = pSuggest->wHeight;
276141cc406Sopenharmony_ci
277141cc406Sopenharmony_ci  if (pTarget->isOptimalSpeed)
278141cc406Sopenharmony_ci    {
279141cc406Sopenharmony_ci      switch (pTarget->cmColorMode)
280141cc406Sopenharmony_ci	{
281141cc406Sopenharmony_ci	case CM_RGB48:
282141cc406Sopenharmony_ci	  pSuggest->cmScanMode = CM_RGB48;
283141cc406Sopenharmony_ci	  pSuggest->dwBytesPerRow = (unsigned int) ((pSuggest->wWidth) * 6);
284141cc406Sopenharmony_ci	  break;
285141cc406Sopenharmony_ci	case CM_RGB24:
286141cc406Sopenharmony_ci	  pSuggest->cmScanMode = CM_RGB24ext;
287141cc406Sopenharmony_ci	  pSuggest->dwBytesPerRow = (unsigned int) ((pSuggest->wWidth) * 3);
288141cc406Sopenharmony_ci	  break;
289141cc406Sopenharmony_ci	case CM_GRAY16:
290141cc406Sopenharmony_ci	  pSuggest->cmScanMode = CM_GRAY16ext;
291141cc406Sopenharmony_ci	  pSuggest->dwBytesPerRow = (unsigned int) ((pSuggest->wWidth) * 2);
292141cc406Sopenharmony_ci	  break;
293141cc406Sopenharmony_ci	case CM_GRAY8:
294141cc406Sopenharmony_ci	  pSuggest->cmScanMode = CM_GRAY8ext;
295141cc406Sopenharmony_ci	  pSuggest->dwBytesPerRow = (unsigned int) ((pSuggest->wWidth));
296141cc406Sopenharmony_ci	  break;
297141cc406Sopenharmony_ci	case CM_TEXT:
298141cc406Sopenharmony_ci	  pSuggest->cmScanMode = CM_TEXT;
299141cc406Sopenharmony_ci	  pSuggest->dwBytesPerRow = (unsigned int) (pSuggest->wWidth) / 8;
300141cc406Sopenharmony_ci	  break;
301141cc406Sopenharmony_ci	default:
302141cc406Sopenharmony_ci	  break;
303141cc406Sopenharmony_ci	}
304141cc406Sopenharmony_ci    }
305141cc406Sopenharmony_ci  else
306141cc406Sopenharmony_ci    {
307141cc406Sopenharmony_ci      switch (pTarget->cmColorMode)
308141cc406Sopenharmony_ci	{
309141cc406Sopenharmony_ci	case CM_RGB48:
310141cc406Sopenharmony_ci	  pSuggest->cmScanMode = CM_RGB48;
311141cc406Sopenharmony_ci	  pSuggest->dwBytesPerRow = (unsigned int) ((pSuggest->wWidth) * 6);
312141cc406Sopenharmony_ci	  break;
313141cc406Sopenharmony_ci	case CM_RGB24:
314141cc406Sopenharmony_ci	  pSuggest->cmScanMode = CM_RGB24ext;
315141cc406Sopenharmony_ci	  pSuggest->dwBytesPerRow = (unsigned int) ((pSuggest->wWidth) * 3);
316141cc406Sopenharmony_ci	  break;
317141cc406Sopenharmony_ci	case CM_GRAY16:
318141cc406Sopenharmony_ci	  pSuggest->cmScanMode = CM_GRAY16ext;
319141cc406Sopenharmony_ci	  pSuggest->dwBytesPerRow = (unsigned int) ((pSuggest->wWidth) * 2);
320141cc406Sopenharmony_ci	  break;
321141cc406Sopenharmony_ci	case CM_GRAY8:
322141cc406Sopenharmony_ci	  pSuggest->cmScanMode = CM_GRAY8ext;
323141cc406Sopenharmony_ci	  pSuggest->dwBytesPerRow = (unsigned int) ((pSuggest->wWidth));
324141cc406Sopenharmony_ci	  break;
325141cc406Sopenharmony_ci	case CM_TEXT:
326141cc406Sopenharmony_ci	  pSuggest->cmScanMode = CM_TEXT;
327141cc406Sopenharmony_ci	  pSuggest->dwBytesPerRow = (unsigned int) (pSuggest->wWidth) / 8;
328141cc406Sopenharmony_ci	  break;
329141cc406Sopenharmony_ci	default:
330141cc406Sopenharmony_ci	  break;
331141cc406Sopenharmony_ci	}
332141cc406Sopenharmony_ci    }
333141cc406Sopenharmony_ci
334141cc406Sopenharmony_ci  DBG (DBG_FUNC, "Reflective_ScanSuggest: pSuggest->dwBytesPerRow = %d\n",
335141cc406Sopenharmony_ci       pSuggest->dwBytesPerRow);
336141cc406Sopenharmony_ci  DBG (DBG_FUNC, "Reflective_ScanSuggest: leave Reflective_ScanSuggest\n");
337141cc406Sopenharmony_ci  return TRUE;
338141cc406Sopenharmony_ci}
339141cc406Sopenharmony_ci
340141cc406Sopenharmony_ci/**********************************************************************
341141cc406Sopenharmony_ciAuthor: Jack            Date: 2005/05/13
342141cc406Sopenharmony_ciRoutine Description:
343141cc406Sopenharmony_ci	setup scanning process
344141cc406Sopenharmony_ciParameters:
345141cc406Sopenharmony_ci	ColorMode: ScanMode of Scanning, CM_RGB48, CM_GRAY and so on
346141cc406Sopenharmony_ci	XDpi: X Resolution
347141cc406Sopenharmony_ci	YDpi: Y Resolution
348141cc406Sopenharmony_ci	isInvert: the RGB order
349141cc406Sopenharmony_ci	X: X start coordinate
350141cc406Sopenharmony_ci	Y: Y start coordinate
351141cc406Sopenharmony_ci	Width: Width of Scan Image
352141cc406Sopenharmony_ci	Height: Height of Scan Image
353141cc406Sopenharmony_ciReturn value:
354141cc406Sopenharmony_ci	if the operation is success
355141cc406Sopenharmony_ci	return TRUE
356141cc406Sopenharmony_ci	else
357141cc406Sopenharmony_ci	return FALSE
358141cc406Sopenharmony_ci***********************************************************************/
359141cc406Sopenharmony_cistatic SANE_Bool
360141cc406Sopenharmony_ciReflective_SetupScan (COLORMODE ColorMode,
361141cc406Sopenharmony_ci		      unsigned short XDpi,
362141cc406Sopenharmony_ci		      unsigned short YDpi,
363141cc406Sopenharmony_ci		      SANE_Bool isInvert, unsigned short X, unsigned short Y, unsigned short Width, unsigned short Height)
364141cc406Sopenharmony_ci{
365141cc406Sopenharmony_ci  (void) isInvert;
366141cc406Sopenharmony_ci  DBG (DBG_FUNC, "Reflective_SetupScan: Call in\n");
367141cc406Sopenharmony_ci  if (g_bOpened)
368141cc406Sopenharmony_ci    {
369141cc406Sopenharmony_ci      DBG (DBG_FUNC, "Reflective_SetupScan: scanner has been opened\n");
370141cc406Sopenharmony_ci      return FALSE;
371141cc406Sopenharmony_ci    }
372141cc406Sopenharmony_ci  if (!g_bPrepared)
373141cc406Sopenharmony_ci    {
374141cc406Sopenharmony_ci      DBG (DBG_FUNC, "Reflective_SetupScan: scanner not prepared\n");
375141cc406Sopenharmony_ci      return FALSE;
376141cc406Sopenharmony_ci    }
377141cc406Sopenharmony_ci
378141cc406Sopenharmony_ci  g_ScanMode = ColorMode;
379141cc406Sopenharmony_ci  g_XDpi = XDpi;
380141cc406Sopenharmony_ci  g_YDpi = YDpi;
381141cc406Sopenharmony_ci  g_SWWidth = Width;
382141cc406Sopenharmony_ci  g_SWHeight = Height;
383141cc406Sopenharmony_ci
384141cc406Sopenharmony_ci  switch (g_YDpi)
385141cc406Sopenharmony_ci    {
386141cc406Sopenharmony_ci    case 1200:
387141cc406Sopenharmony_ci      g_wPixelDistance = 4;	/*even & odd sensor problem */
388141cc406Sopenharmony_ci      g_wLineDistance = 24;
389141cc406Sopenharmony_ci      g_Height += g_wPixelDistance;
390141cc406Sopenharmony_ci      break;
391141cc406Sopenharmony_ci    case 600:
392141cc406Sopenharmony_ci      g_wPixelDistance = 0;	/*no even & odd problem */
393141cc406Sopenharmony_ci      g_wLineDistance = 12;
394141cc406Sopenharmony_ci      break;
395141cc406Sopenharmony_ci    case 300:
396141cc406Sopenharmony_ci      g_wPixelDistance = 0;
397141cc406Sopenharmony_ci      g_wLineDistance = 6;
398141cc406Sopenharmony_ci      break;
399141cc406Sopenharmony_ci    case 150:
400141cc406Sopenharmony_ci      g_wPixelDistance = 0;
401141cc406Sopenharmony_ci      g_wLineDistance = 3;
402141cc406Sopenharmony_ci      break;
403141cc406Sopenharmony_ci
404141cc406Sopenharmony_ci    case 75:
405141cc406Sopenharmony_ci    case 50:
406141cc406Sopenharmony_ci      g_wPixelDistance = 0;
407141cc406Sopenharmony_ci      g_wLineDistance = 1;
408141cc406Sopenharmony_ci      break;
409141cc406Sopenharmony_ci    default:
410141cc406Sopenharmony_ci      g_wLineDistance = 0;
411141cc406Sopenharmony_ci    }
412141cc406Sopenharmony_ci
413141cc406Sopenharmony_ci  switch (g_ScanMode)
414141cc406Sopenharmony_ci    {
415141cc406Sopenharmony_ci    case CM_RGB48:
416141cc406Sopenharmony_ci      g_BytesPerRow = 6 * g_Width;
417141cc406Sopenharmony_ci      g_SWBytesPerRow = 6 * g_SWWidth;
418141cc406Sopenharmony_ci      g_bScanBits = 48;
419141cc406Sopenharmony_ci      g_Height += g_wLineDistance * 2;	/*add height to do line distance */
420141cc406Sopenharmony_ci      break;
421141cc406Sopenharmony_ci    case CM_RGB24ext:
422141cc406Sopenharmony_ci      g_BytesPerRow = 3 * g_Width;
423141cc406Sopenharmony_ci      g_SWBytesPerRow = 3 * g_SWWidth;
424141cc406Sopenharmony_ci      g_bScanBits = 24;
425141cc406Sopenharmony_ci      g_Height += g_wLineDistance * 2;	/*add height to do line distance */
426141cc406Sopenharmony_ci      break;
427141cc406Sopenharmony_ci    case CM_GRAY16ext:
428141cc406Sopenharmony_ci      g_BytesPerRow = 2 * g_Width;
429141cc406Sopenharmony_ci      g_SWBytesPerRow = 2 * g_SWWidth;
430141cc406Sopenharmony_ci      g_bScanBits = 16;
431141cc406Sopenharmony_ci      break;
432141cc406Sopenharmony_ci    case CM_GRAY8ext:
433141cc406Sopenharmony_ci    case CM_TEXT:
434141cc406Sopenharmony_ci      g_BytesPerRow = g_Width;
435141cc406Sopenharmony_ci      g_SWBytesPerRow = g_SWWidth;
436141cc406Sopenharmony_ci      g_bScanBits = 8;
437141cc406Sopenharmony_ci      break;
438141cc406Sopenharmony_ci    default:
439141cc406Sopenharmony_ci      break;
440141cc406Sopenharmony_ci    }
441141cc406Sopenharmony_ci
442141cc406Sopenharmony_ci  if (Asic_Open (&g_chip, g_pDeviceFile) != SANE_STATUS_GOOD)
443141cc406Sopenharmony_ci    {
444141cc406Sopenharmony_ci      DBG (DBG_FUNC, "Reflective_SetupScan: Asic_Open return error\n");
445141cc406Sopenharmony_ci      return FALSE;
446141cc406Sopenharmony_ci    }
447141cc406Sopenharmony_ci
448141cc406Sopenharmony_ci  DBG (DBG_FUNC, "Reflective_SetupScan: Asic_Open successfully\n");
449141cc406Sopenharmony_ci
450141cc406Sopenharmony_ci  g_bOpened = TRUE;
451141cc406Sopenharmony_ci
452141cc406Sopenharmony_ci  Asic_TurnLamp (&g_chip, FALSE);
453141cc406Sopenharmony_ci  Asic_TurnTA (&g_chip, FALSE);
454141cc406Sopenharmony_ci  Asic_TurnLamp (&g_chip, TRUE);
455141cc406Sopenharmony_ci
456141cc406Sopenharmony_ci  if (1200 == g_XDpi)
457141cc406Sopenharmony_ci    {
458141cc406Sopenharmony_ci      g_XDpi = 600;
459141cc406Sopenharmony_ci
460141cc406Sopenharmony_ci      if (Reflective_AdjustAD () == FALSE)
461141cc406Sopenharmony_ci	{
462141cc406Sopenharmony_ci
463141cc406Sopenharmony_ci	  DBG (DBG_FUNC,
464141cc406Sopenharmony_ci	       "Reflective_SetupScan: Reflective_AdjustAD return error\n");
465141cc406Sopenharmony_ci	  return FALSE;
466141cc406Sopenharmony_ci	}
467141cc406Sopenharmony_ci      DBG (DBG_FUNC,
468141cc406Sopenharmony_ci	   "Reflective_SetupScan: Reflective_AdjustAD successfully\n");
469141cc406Sopenharmony_ci
470141cc406Sopenharmony_ci      if (Reflective_FindTopLeft (&g_X, &g_Y) == FALSE)
471141cc406Sopenharmony_ci	{
472141cc406Sopenharmony_ci	  g_X = 187;
473141cc406Sopenharmony_ci	  g_Y = 43;
474141cc406Sopenharmony_ci	}
475141cc406Sopenharmony_ci
476141cc406Sopenharmony_ci      g_XDpi = 1200;
477141cc406Sopenharmony_ci
478141cc406Sopenharmony_ci      if (Reflective_AdjustAD () == FALSE)
479141cc406Sopenharmony_ci	{
480141cc406Sopenharmony_ci	  DBG (DBG_FUNC,
481141cc406Sopenharmony_ci	       "Reflective_SetupScan: Reflective_AdjustAD return error\n");
482141cc406Sopenharmony_ci	  return FALSE;
483141cc406Sopenharmony_ci	}
484141cc406Sopenharmony_ci      DBG (DBG_FUNC,
485141cc406Sopenharmony_ci	   "Reflective_SetupScan: Reflective_AdjustAD successfully\n");
486141cc406Sopenharmony_ci    }
487141cc406Sopenharmony_ci  else
488141cc406Sopenharmony_ci    {
489141cc406Sopenharmony_ci      if (Reflective_AdjustAD () == FALSE)
490141cc406Sopenharmony_ci	{
491141cc406Sopenharmony_ci	  DBG (DBG_FUNC,
492141cc406Sopenharmony_ci	       "Reflective_SetupScan: Reflective_AdjustAD return error\n");
493141cc406Sopenharmony_ci	  return FALSE;
494141cc406Sopenharmony_ci	}
495141cc406Sopenharmony_ci      DBG (DBG_FUNC,
496141cc406Sopenharmony_ci	   "Reflective_SetupScan: Reflective_AdjustAD successfully\n");
497141cc406Sopenharmony_ci      if (Reflective_FindTopLeft (&g_X, &g_Y) == FALSE)
498141cc406Sopenharmony_ci	{
499141cc406Sopenharmony_ci	  g_X = 187;
500141cc406Sopenharmony_ci	  g_Y = 43;
501141cc406Sopenharmony_ci	}
502141cc406Sopenharmony_ci    }
503141cc406Sopenharmony_ci
504141cc406Sopenharmony_ci
505141cc406Sopenharmony_ci  DBG (DBG_FUNC, "after find top left,g_X=%d,g_Y=%d\n", g_X, g_Y);
506141cc406Sopenharmony_ci
507141cc406Sopenharmony_ci  if (1200 == g_XDpi)
508141cc406Sopenharmony_ci    {
509141cc406Sopenharmony_ci      g_X =
510141cc406Sopenharmony_ci	g_X * 1200 / FIND_LEFT_TOP_CALIBRATE_RESOLUTION + X * 1200 / g_XDpi +
511141cc406Sopenharmony_ci	47;
512141cc406Sopenharmony_ci
513141cc406Sopenharmony_ci    }
514141cc406Sopenharmony_ci  else
515141cc406Sopenharmony_ci    {
516141cc406Sopenharmony_ci      if (75 == g_XDpi)
517141cc406Sopenharmony_ci	{
518141cc406Sopenharmony_ci	  g_X = g_X + X * 600 / g_XDpi;
519141cc406Sopenharmony_ci	}
520141cc406Sopenharmony_ci      else
521141cc406Sopenharmony_ci	{
522141cc406Sopenharmony_ci	  g_X = g_X + X * 600 / g_XDpi + 23;
523141cc406Sopenharmony_ci	}
524141cc406Sopenharmony_ci    }
525141cc406Sopenharmony_ci
526141cc406Sopenharmony_ci  g_Y =
527141cc406Sopenharmony_ci    g_Y * 1200 / FIND_LEFT_TOP_CALIBRATE_RESOLUTION + Y * 1200 / g_YDpi + 47;
528141cc406Sopenharmony_ci
529141cc406Sopenharmony_ci
530141cc406Sopenharmony_ci  DBG (DBG_FUNC, "before line calibration,g_X=%d,g_Y=%d\n", g_X, g_Y);
531141cc406Sopenharmony_ci
532141cc406Sopenharmony_ci  if (Reflective_LineCalibration16Bits () == FALSE)
533141cc406Sopenharmony_ci    {
534141cc406Sopenharmony_ci      DBG (DBG_FUNC,
535141cc406Sopenharmony_ci	   "Reflective_SetupScan: Reflective_LineCalibration16Bits return error\n");
536141cc406Sopenharmony_ci      return FALSE;
537141cc406Sopenharmony_ci    }
538141cc406Sopenharmony_ci
539141cc406Sopenharmony_ci  DBG (DBG_FUNC,
540141cc406Sopenharmony_ci       "Reflective_SetupScan: after Reflective_LineCalibration16Bits,g_X=%d,g_Y=%d\n",
541141cc406Sopenharmony_ci       g_X, g_Y);
542141cc406Sopenharmony_ci
543141cc406Sopenharmony_ci  DBG (DBG_FUNC, "Reflective_SetupScan: before Asic_SetWindow\n");
544141cc406Sopenharmony_ci
545141cc406Sopenharmony_ci  DBG (DBG_FUNC,
546141cc406Sopenharmony_ci       "Reflective_SetupScan: g_bScanBits=%d, g_XDpi=%d, g_YDpi=%d, g_X=%d, g_Y=%d, g_Width=%d, g_Height=%d\n",
547141cc406Sopenharmony_ci       g_bScanBits, g_XDpi, g_YDpi, g_X, g_Y, g_Width, g_Height);
548141cc406Sopenharmony_ci
549141cc406Sopenharmony_ci  if (g_Y > 300)
550141cc406Sopenharmony_ci    {
551141cc406Sopenharmony_ci      Asic_MotorMove (&g_chip, TRUE, g_Y - 300);
552141cc406Sopenharmony_ci    }
553141cc406Sopenharmony_ci  else
554141cc406Sopenharmony_ci    {
555141cc406Sopenharmony_ci      Asic_MotorMove (&g_chip, FALSE, 300 - g_Y);
556141cc406Sopenharmony_ci    }
557141cc406Sopenharmony_ci  g_Y = 300;
558141cc406Sopenharmony_ci
559141cc406Sopenharmony_ci  Asic_SetWindow (&g_chip, g_bScanBits, g_XDpi, g_YDpi, g_X, g_Y, g_Width,
560141cc406Sopenharmony_ci		  g_Height);
561141cc406Sopenharmony_ci
562141cc406Sopenharmony_ci  DBG (DBG_FUNC, "Reflective_SetupScan: leave Reflective_SetupScan\n");
563141cc406Sopenharmony_ci  return Reflective_PrepareScan ();
564141cc406Sopenharmony_ci}
565141cc406Sopenharmony_ci
566141cc406Sopenharmony_ci/**********************************************************************
567141cc406Sopenharmony_ciAuthor: Jack             Date: 2005/05/13
568141cc406Sopenharmony_ciRoutine Description:
569141cc406Sopenharmony_ci	To adjust the value of offset gain of R/G/B
570141cc406Sopenharmony_ciParameters:
571141cc406Sopenharmony_ci	none
572141cc406Sopenharmony_ciReturn value:
573141cc406Sopenharmony_ci	if operation is success
574141cc406Sopenharmony_ci	return TRUE
575141cc406Sopenharmony_ci	else
576141cc406Sopenharmony_ci	return FALSE
577141cc406Sopenharmony_ci***********************************************************************/
578141cc406Sopenharmony_cistatic SANE_Bool
579141cc406Sopenharmony_ciReflective_AdjustAD ()
580141cc406Sopenharmony_ci{
581141cc406Sopenharmony_ci  SANE_Byte * lpCalData;
582141cc406Sopenharmony_ci  unsigned short wCalWidth;
583141cc406Sopenharmony_ci  int nTimesOfCal;
584141cc406Sopenharmony_ci  unsigned short wMaxValueR, wMinValueR, wMaxValueG, wMinValueG, wMaxValueB, wMinValueB;
585141cc406Sopenharmony_ci#if 0
586141cc406Sopenharmony_ci  SANE_Byte bDarkMaxLevel;
587141cc406Sopenharmony_ci  SANE_Byte bDarkMinLevel;
588141cc406Sopenharmony_ci  SANE_Byte bLastMinR, bLastROffset, bROffsetUpperBound = 255, bROffsetLowerBound =
589141cc406Sopenharmony_ci    0;
590141cc406Sopenharmony_ci  SANE_Byte bLastMinG, bLastGOffset, bGOffsetUpperBound = 255, bGOffsetLowerBound =
591141cc406Sopenharmony_ci    0;
592141cc406Sopenharmony_ci  SANE_Byte bLastMinB, bLastBOffset, bBOffsetUpperBound = 255, bBOffsetLowerBound =
593141cc406Sopenharmony_ci    0;
594141cc406Sopenharmony_ci  float fRFactor = 1.0;
595141cc406Sopenharmony_ci  float fGFactor = 1.0;
596141cc406Sopenharmony_ci  float fBFactor = 1.0;
597141cc406Sopenharmony_ci#endif
598141cc406Sopenharmony_ci  unsigned short wAdjustADResolution;
599141cc406Sopenharmony_ci
600141cc406Sopenharmony_ci  DBG (DBG_FUNC, "Reflective_AdjustAD: call in\n");
601141cc406Sopenharmony_ci  if (!g_bOpened)
602141cc406Sopenharmony_ci    {
603141cc406Sopenharmony_ci      DBG (DBG_FUNC, "Reflective_AdjustAD: scanner has been opened\n");
604141cc406Sopenharmony_ci      return FALSE;
605141cc406Sopenharmony_ci    }
606141cc406Sopenharmony_ci  if (!g_bPrepared)
607141cc406Sopenharmony_ci    {
608141cc406Sopenharmony_ci      DBG (DBG_FUNC, "Reflective_AdjustAD: scanner not prepared\n");
609141cc406Sopenharmony_ci      return FALSE;
610141cc406Sopenharmony_ci    }
611141cc406Sopenharmony_ci
612141cc406Sopenharmony_ci
613141cc406Sopenharmony_ci  g_chip.AD.DirectionR = R_DIRECTION;
614141cc406Sopenharmony_ci  g_chip.AD.DirectionG = G_DIRECTION;
615141cc406Sopenharmony_ci  g_chip.AD.DirectionB = B_DIRECTION;
616141cc406Sopenharmony_ci  g_chip.AD.GainR = R_GAIN;
617141cc406Sopenharmony_ci  g_chip.AD.GainG = G_GAIN;
618141cc406Sopenharmony_ci  g_chip.AD.GainB = B_GAIN;
619141cc406Sopenharmony_ci  g_chip.AD.OffsetR = 152;
620141cc406Sopenharmony_ci  g_chip.AD.OffsetG = 56;
621141cc406Sopenharmony_ci  g_chip.AD.OffsetB = 8;
622141cc406Sopenharmony_ci
623141cc406Sopenharmony_ci  if (g_XDpi <= 600)
624141cc406Sopenharmony_ci    {
625141cc406Sopenharmony_ci      wAdjustADResolution = 600;
626141cc406Sopenharmony_ci    }
627141cc406Sopenharmony_ci  else
628141cc406Sopenharmony_ci    {
629141cc406Sopenharmony_ci      wAdjustADResolution = 1200;
630141cc406Sopenharmony_ci    }
631141cc406Sopenharmony_ci  wCalWidth = 10240;
632141cc406Sopenharmony_ci
633141cc406Sopenharmony_ci  lpCalData = (SANE_Byte *) malloc (sizeof (SANE_Byte) * wCalWidth * 3);
634141cc406Sopenharmony_ci  if (lpCalData == NULL)
635141cc406Sopenharmony_ci    {
636141cc406Sopenharmony_ci      DBG (DBG_FUNC, "Reflective_AdjustAD: lpCalData malloc error\n");
637141cc406Sopenharmony_ci      return FALSE;
638141cc406Sopenharmony_ci    }
639141cc406Sopenharmony_ci
640141cc406Sopenharmony_ci  Asic_SetMotorType (&g_chip, FALSE, TRUE);
641141cc406Sopenharmony_ci
642141cc406Sopenharmony_ci  Asic_SetCalibrate (&g_chip, 24, wAdjustADResolution, wAdjustADResolution, 0,
643141cc406Sopenharmony_ci		     0, wCalWidth, 1, FALSE);
644141cc406Sopenharmony_ci  MustScanner_PrepareCalculateMaxMin (wAdjustADResolution);
645141cc406Sopenharmony_ci  nTimesOfCal = 0;
646141cc406Sopenharmony_ci
647141cc406Sopenharmony_ci#ifdef DEBUG_SAVE_IMAGE
648141cc406Sopenharmony_ci  Asic_SetAFEGainOffset (&g_chip);
649141cc406Sopenharmony_ci  Asic_ScanStart (&g_chip);
650141cc406Sopenharmony_ci  Asic_ReadCalibrationData (&g_chip, lpCalData, wCalWidth * 3, 24);
651141cc406Sopenharmony_ci  Asic_ScanStop (&g_chip);
652141cc406Sopenharmony_ci
653141cc406Sopenharmony_ci  FILE *stream = NULL;
654141cc406Sopenharmony_ci  SANE_Byte * lpBuf = (SANE_Byte *) malloc (50);
655141cc406Sopenharmony_ci  if (NULL == lpBuf)
656141cc406Sopenharmony_ci    {
657141cc406Sopenharmony_ci      return FALSE;
658141cc406Sopenharmony_ci    }
659141cc406Sopenharmony_ci  memset (lpBuf, 0, 50);
660141cc406Sopenharmony_ci
661141cc406Sopenharmony_ci  stream = fopen ("/root/AD(Ref).pnm\n", "wb+\n");
662141cc406Sopenharmony_ci  sprintf (lpBuf, "P6\n%d %d\n255\n\n", wCalWidth, 1);
663141cc406Sopenharmony_ci  fwrite (lpBuf, sizeof (SANE_Byte), strlen (lpBuf), stream);
664141cc406Sopenharmony_ci  fwrite (lpCalData, sizeof (SANE_Byte), wCalWidth * 3, stream);
665141cc406Sopenharmony_ci  fclose (stream);
666141cc406Sopenharmony_ci  free (lpBuf);
667141cc406Sopenharmony_ci#endif
668141cc406Sopenharmony_ci
669141cc406Sopenharmony_ci  do
670141cc406Sopenharmony_ci    {
671141cc406Sopenharmony_ci      DBG (DBG_FUNC,
672141cc406Sopenharmony_ci	   "Reflective_AdjustAD: run in first adjust offset do-while\n");
673141cc406Sopenharmony_ci      Asic_SetAFEGainOffset (&g_chip);
674141cc406Sopenharmony_ci      Asic_ScanStart (&g_chip);
675141cc406Sopenharmony_ci      Asic_ReadCalibrationData (&g_chip, lpCalData, wCalWidth * 3, 24);
676141cc406Sopenharmony_ci      Asic_ScanStop (&g_chip);
677141cc406Sopenharmony_ci
678141cc406Sopenharmony_ci      MustScanner_CalculateMaxMin (lpCalData, &wMaxValueR, &wMinValueR,
679141cc406Sopenharmony_ci				   wAdjustADResolution);
680141cc406Sopenharmony_ci      MustScanner_CalculateMaxMin (lpCalData + wCalWidth, &wMaxValueG,
681141cc406Sopenharmony_ci				   &wMinValueG, wAdjustADResolution);
682141cc406Sopenharmony_ci      MustScanner_CalculateMaxMin (lpCalData + wCalWidth * 2, &wMaxValueB,
683141cc406Sopenharmony_ci				   &wMinValueB, wAdjustADResolution);
684141cc406Sopenharmony_ci
685141cc406Sopenharmony_ci      if (g_chip.AD.DirectionR == 0)
686141cc406Sopenharmony_ci	{
687141cc406Sopenharmony_ci	  if (wMinValueR > 15)
688141cc406Sopenharmony_ci	    {
689141cc406Sopenharmony_ci	      if (g_chip.AD.OffsetR < 8)
690141cc406Sopenharmony_ci		g_chip.AD.DirectionR = 1;
691141cc406Sopenharmony_ci	      else
692141cc406Sopenharmony_ci		g_chip.AD.OffsetR -= 8;
693141cc406Sopenharmony_ci	    }
694141cc406Sopenharmony_ci	  else if (wMinValueR < 5)
695141cc406Sopenharmony_ci	    g_chip.AD.OffsetR += 8;
696141cc406Sopenharmony_ci	}
697141cc406Sopenharmony_ci      else
698141cc406Sopenharmony_ci	{
699141cc406Sopenharmony_ci	  if (wMinValueR > 15)
700141cc406Sopenharmony_ci	    g_chip.AD.OffsetR += 8;
701141cc406Sopenharmony_ci	  else if (wMinValueR < 5)
702141cc406Sopenharmony_ci	    g_chip.AD.OffsetR -= 8;
703141cc406Sopenharmony_ci	}
704141cc406Sopenharmony_ci
705141cc406Sopenharmony_ci      if (g_chip.AD.DirectionG == 0)
706141cc406Sopenharmony_ci	{
707141cc406Sopenharmony_ci	  if (wMinValueG > 15)
708141cc406Sopenharmony_ci	    {
709141cc406Sopenharmony_ci	      if (g_chip.AD.OffsetG < 8)
710141cc406Sopenharmony_ci		g_chip.AD.DirectionG = 1;
711141cc406Sopenharmony_ci	      else
712141cc406Sopenharmony_ci		g_chip.AD.OffsetG -= 8;
713141cc406Sopenharmony_ci	    }
714141cc406Sopenharmony_ci	  else if (wMinValueG < 5)
715141cc406Sopenharmony_ci	    g_chip.AD.OffsetG += 8;
716141cc406Sopenharmony_ci	}
717141cc406Sopenharmony_ci      else
718141cc406Sopenharmony_ci	{
719141cc406Sopenharmony_ci	  if (wMinValueG > 15)
720141cc406Sopenharmony_ci	    g_chip.AD.OffsetG += 8;
721141cc406Sopenharmony_ci	  else if (wMinValueG < 5)
722141cc406Sopenharmony_ci	    g_chip.AD.OffsetG -= 8;
723141cc406Sopenharmony_ci	}
724141cc406Sopenharmony_ci
725141cc406Sopenharmony_ci      if (g_chip.AD.DirectionB == 0)
726141cc406Sopenharmony_ci	{
727141cc406Sopenharmony_ci	  if (wMinValueB > 15)
728141cc406Sopenharmony_ci	    {
729141cc406Sopenharmony_ci	      if (g_chip.AD.OffsetB < 8)
730141cc406Sopenharmony_ci		g_chip.AD.DirectionB = 1;
731141cc406Sopenharmony_ci	      else
732141cc406Sopenharmony_ci		g_chip.AD.OffsetB -= 8;
733141cc406Sopenharmony_ci	    }
734141cc406Sopenharmony_ci
735141cc406Sopenharmony_ci	  else if (wMinValueB < 5)
736141cc406Sopenharmony_ci	    g_chip.AD.OffsetB += 8;
737141cc406Sopenharmony_ci	}
738141cc406Sopenharmony_ci      else
739141cc406Sopenharmony_ci	{
740141cc406Sopenharmony_ci	  if (wMinValueB > 15)
741141cc406Sopenharmony_ci	    g_chip.AD.OffsetB += 8;
742141cc406Sopenharmony_ci	  else if (wMinValueB < 5)
743141cc406Sopenharmony_ci	    g_chip.AD.OffsetB -= 8;
744141cc406Sopenharmony_ci	}
745141cc406Sopenharmony_ci
746141cc406Sopenharmony_ci      nTimesOfCal++;
747141cc406Sopenharmony_ci      if (nTimesOfCal > 10)
748141cc406Sopenharmony_ci	break;
749141cc406Sopenharmony_ci    }
750141cc406Sopenharmony_ci  while (wMinValueR > 15 || wMinValueR < 5
751141cc406Sopenharmony_ci	 || wMinValueG > 15 || wMinValueG < 5
752141cc406Sopenharmony_ci	 || wMinValueB > 15 || wMinValueB < 5);
753141cc406Sopenharmony_ci
754141cc406Sopenharmony_ci  DBG (DBG_FUNC,
755141cc406Sopenharmony_ci       "Reflective_AdjustAD: run out first adjust offset do-while\n");
756141cc406Sopenharmony_ci
757141cc406Sopenharmony_ci  DBG (DBG_FUNC, "Reflective_AdjustAD: \
758141cc406Sopenharmony_ci					   g_chip.AD.OffsetR=%d,\
759141cc406Sopenharmony_ci					   g_chip.AD.OffsetG=%d,\
760141cc406Sopenharmony_ci					   g_chip.AD.OffsetB=%d\n", g_chip.AD.OffsetR, g_chip.AD.OffsetG, g_chip.AD.OffsetB);
761141cc406Sopenharmony_ci
762141cc406Sopenharmony_ci  g_chip.AD.GainR = 1 - (double) (wMaxValueR - wMinValueR) / 210 > 0 ?
763141cc406Sopenharmony_ci    (SANE_Byte) (((1 -
764141cc406Sopenharmony_ci	      (double) (wMaxValueR - wMinValueR) / 210)) * 63 * 6 / 5) : 0;
765141cc406Sopenharmony_ci  g_chip.AD.GainG =
766141cc406Sopenharmony_ci    1 - (double) (wMaxValueG - wMinValueG) / 210 >
767141cc406Sopenharmony_ci    0 ? (SANE_Byte) (((1 - (double) (wMaxValueG - wMinValueG) / 210)) * 63 * 6 /
768141cc406Sopenharmony_ci		5) : 0;
769141cc406Sopenharmony_ci  g_chip.AD.GainB =
770141cc406Sopenharmony_ci    1 - (double) (wMaxValueB - wMinValueB) / 210 >
771141cc406Sopenharmony_ci    0 ? (SANE_Byte) (((1 - (double) (wMaxValueB - wMinValueB) / 210)) * 63 * 6 /
772141cc406Sopenharmony_ci		5) : 0;
773141cc406Sopenharmony_ci
774141cc406Sopenharmony_ci  if (g_chip.AD.GainR > 63)
775141cc406Sopenharmony_ci    g_chip.AD.GainR = 63;
776141cc406Sopenharmony_ci  if (g_chip.AD.GainG > 63)
777141cc406Sopenharmony_ci    g_chip.AD.GainG = 63;
778141cc406Sopenharmony_ci  if (g_chip.AD.GainB > 63)
779141cc406Sopenharmony_ci    g_chip.AD.GainB = 63;
780141cc406Sopenharmony_ci
781141cc406Sopenharmony_ci  DBG (DBG_FUNC, "Reflective_AdjustAD: "
782141cc406Sopenharmony_ci       "g_chip.AD.GainR = %d,"
783141cc406Sopenharmony_ci       "g_chip.AD.GainG = %d,"
784141cc406Sopenharmony_ci       "g_chip.AD.GainB = %d\n",
785141cc406Sopenharmony_ci       g_chip.AD.GainR, g_chip.AD.GainG, g_chip.AD.GainB);
786141cc406Sopenharmony_ci
787141cc406Sopenharmony_ci  nTimesOfCal = 0;
788141cc406Sopenharmony_ci  do
789141cc406Sopenharmony_ci    {
790141cc406Sopenharmony_ci      Asic_SetAFEGainOffset (&g_chip);
791141cc406Sopenharmony_ci      Asic_ScanStart (&g_chip);
792141cc406Sopenharmony_ci      Asic_ReadCalibrationData (&g_chip, lpCalData, wCalWidth * 3, 24);
793141cc406Sopenharmony_ci      Asic_ScanStop (&g_chip);
794141cc406Sopenharmony_ci
795141cc406Sopenharmony_ci      MustScanner_CalculateMaxMin (lpCalData, &wMaxValueR, &wMinValueR,
796141cc406Sopenharmony_ci				   wAdjustADResolution);
797141cc406Sopenharmony_ci      MustScanner_CalculateMaxMin (lpCalData + wCalWidth, &wMaxValueG,
798141cc406Sopenharmony_ci				   &wMinValueG, wAdjustADResolution);
799141cc406Sopenharmony_ci      MustScanner_CalculateMaxMin (lpCalData + wCalWidth * 2, &wMaxValueB,
800141cc406Sopenharmony_ci				   &wMinValueB, wAdjustADResolution);
801141cc406Sopenharmony_ci
802141cc406Sopenharmony_ci      DBG (DBG_FUNC, "Reflective_AdjustAD: "
803141cc406Sopenharmony_ci	   "RGain=%d, ROffset=%d, RDir=%d  GGain=%d, GOffset=%d, GDir=%d  BGain=%d, BOffset=%d, BDir=%d\n",
804141cc406Sopenharmony_ci	   g_chip.AD.GainR, g_chip.AD.OffsetR, g_chip.AD.DirectionR,
805141cc406Sopenharmony_ci	   g_chip.AD.GainG, g_chip.AD.OffsetG, g_chip.AD.DirectionG,
806141cc406Sopenharmony_ci	   g_chip.AD.GainB, g_chip.AD.OffsetB, g_chip.AD.DirectionB);
807141cc406Sopenharmony_ci
808141cc406Sopenharmony_ci      DBG (DBG_FUNC, "Reflective_AdjustAD: "
809141cc406Sopenharmony_ci	   "MaxR=%d, MinR=%d  MaxG=%d, MinG=%d  MaxB=%d, MinB=%d\n",
810141cc406Sopenharmony_ci	   wMaxValueR, wMinValueR, wMaxValueG, wMinValueG, wMaxValueB,
811141cc406Sopenharmony_ci	   wMinValueB);
812141cc406Sopenharmony_ci
813141cc406Sopenharmony_ci      /*R Channel */
814141cc406Sopenharmony_ci      if ((wMaxValueR - wMinValueR) > REFL_MAX_LEVEL_RANGE)
815141cc406Sopenharmony_ci	{
816141cc406Sopenharmony_ci	  if (g_chip.AD.GainR > 0)
817141cc406Sopenharmony_ci	    g_chip.AD.GainR--;
818141cc406Sopenharmony_ci	}
819141cc406Sopenharmony_ci      else
820141cc406Sopenharmony_ci	{
821141cc406Sopenharmony_ci	  if ((wMaxValueR - wMinValueR) < REFL_MIN_LEVEL_RANGE)
822141cc406Sopenharmony_ci	    {
823141cc406Sopenharmony_ci	      if (wMaxValueR < REFL_WHITE_MIN_LEVEL)
824141cc406Sopenharmony_ci		{
825141cc406Sopenharmony_ci		  g_chip.AD.GainR++;
826141cc406Sopenharmony_ci		  if (g_chip.AD.GainR > 63)
827141cc406Sopenharmony_ci		    g_chip.AD.GainR = 63;
828141cc406Sopenharmony_ci		}
829141cc406Sopenharmony_ci	      else
830141cc406Sopenharmony_ci		{
831141cc406Sopenharmony_ci		  if (wMaxValueR > REFL_WHITE_MAX_LEVEL)
832141cc406Sopenharmony_ci		    {
833141cc406Sopenharmony_ci		      if (g_chip.AD.GainR < 1)
834141cc406Sopenharmony_ci			g_chip.AD.GainR = 0;
835141cc406Sopenharmony_ci		      else
836141cc406Sopenharmony_ci			g_chip.AD.GainR--;
837141cc406Sopenharmony_ci		    }
838141cc406Sopenharmony_ci		  else
839141cc406Sopenharmony_ci		    {
840141cc406Sopenharmony_ci		      if (g_chip.AD.GainR > 63)
841141cc406Sopenharmony_ci			g_chip.AD.GainR = 63;
842141cc406Sopenharmony_ci		      else
843141cc406Sopenharmony_ci			g_chip.AD.GainR++;
844141cc406Sopenharmony_ci		    }
845141cc406Sopenharmony_ci		}
846141cc406Sopenharmony_ci	    }
847141cc406Sopenharmony_ci	  else
848141cc406Sopenharmony_ci	    {
849141cc406Sopenharmony_ci	      if (wMaxValueR > REFL_WHITE_MAX_LEVEL)
850141cc406Sopenharmony_ci		{
851141cc406Sopenharmony_ci		  if (g_chip.AD.GainR < 1)
852141cc406Sopenharmony_ci		    g_chip.AD.GainR = 0;
853141cc406Sopenharmony_ci		  else
854141cc406Sopenharmony_ci		    g_chip.AD.GainR--;
855141cc406Sopenharmony_ci		}
856141cc406Sopenharmony_ci
857141cc406Sopenharmony_ci	      if (wMaxValueR < REFL_WHITE_MIN_LEVEL)
858141cc406Sopenharmony_ci		{
859141cc406Sopenharmony_ci		  if (g_chip.AD.GainR > 63)
860141cc406Sopenharmony_ci		    g_chip.AD.GainR = 63;
861141cc406Sopenharmony_ci		  else
862141cc406Sopenharmony_ci		    g_chip.AD.GainR++;
863141cc406Sopenharmony_ci		}
864141cc406Sopenharmony_ci	    }
865141cc406Sopenharmony_ci	}
866141cc406Sopenharmony_ci
867141cc406Sopenharmony_ci      /*G Channel */
868141cc406Sopenharmony_ci      if ((wMaxValueG - wMinValueG) > REFL_MAX_LEVEL_RANGE)
869141cc406Sopenharmony_ci	{
870141cc406Sopenharmony_ci	  if (g_chip.AD.GainG > 0)
871141cc406Sopenharmony_ci	    g_chip.AD.GainG--;
872141cc406Sopenharmony_ci	}
873141cc406Sopenharmony_ci      else
874141cc406Sopenharmony_ci	{
875141cc406Sopenharmony_ci	  if ((wMaxValueG - wMinValueG) < REFL_MIN_LEVEL_RANGE)
876141cc406Sopenharmony_ci	    {
877141cc406Sopenharmony_ci	      if (wMaxValueG < REFL_WHITE_MIN_LEVEL)
878141cc406Sopenharmony_ci		{
879141cc406Sopenharmony_ci		  g_chip.AD.GainG++;
880141cc406Sopenharmony_ci		  if (g_chip.AD.GainG > 63)
881141cc406Sopenharmony_ci		    g_chip.AD.GainG = 63;
882141cc406Sopenharmony_ci		}
883141cc406Sopenharmony_ci	      else
884141cc406Sopenharmony_ci		{
885141cc406Sopenharmony_ci		  if (wMaxValueG > REFL_WHITE_MAX_LEVEL)
886141cc406Sopenharmony_ci		    {
887141cc406Sopenharmony_ci		      if (g_chip.AD.GainG < 1)
888141cc406Sopenharmony_ci			g_chip.AD.GainG = 0;
889141cc406Sopenharmony_ci		      else
890141cc406Sopenharmony_ci			g_chip.AD.GainG--;
891141cc406Sopenharmony_ci		    }
892141cc406Sopenharmony_ci		  else
893141cc406Sopenharmony_ci		    {
894141cc406Sopenharmony_ci		      if (g_chip.AD.GainG > 63)
895141cc406Sopenharmony_ci			g_chip.AD.GainG = 63;
896141cc406Sopenharmony_ci		      else
897141cc406Sopenharmony_ci			g_chip.AD.GainG++;
898141cc406Sopenharmony_ci		    }
899141cc406Sopenharmony_ci		}
900141cc406Sopenharmony_ci	    }
901141cc406Sopenharmony_ci	  else
902141cc406Sopenharmony_ci	    {
903141cc406Sopenharmony_ci	      if (wMaxValueG > REFL_WHITE_MAX_LEVEL)
904141cc406Sopenharmony_ci		{
905141cc406Sopenharmony_ci		  if (g_chip.AD.GainG < 1)
906141cc406Sopenharmony_ci		    g_chip.AD.GainG = 0;
907141cc406Sopenharmony_ci		  else
908141cc406Sopenharmony_ci		    g_chip.AD.GainG--;
909141cc406Sopenharmony_ci		}
910141cc406Sopenharmony_ci
911141cc406Sopenharmony_ci	      if (wMaxValueG < REFL_WHITE_MIN_LEVEL)
912141cc406Sopenharmony_ci		{
913141cc406Sopenharmony_ci		  if (g_chip.AD.GainG > 63)
914141cc406Sopenharmony_ci		    g_chip.AD.GainG = 63;
915141cc406Sopenharmony_ci		  else
916141cc406Sopenharmony_ci		    g_chip.AD.GainG++;
917141cc406Sopenharmony_ci		}
918141cc406Sopenharmony_ci	    }
919141cc406Sopenharmony_ci	}
920141cc406Sopenharmony_ci
921141cc406Sopenharmony_ci      /* B Channel */
922141cc406Sopenharmony_ci      if ((wMaxValueB - wMinValueB) > REFL_MAX_LEVEL_RANGE)
923141cc406Sopenharmony_ci	{
924141cc406Sopenharmony_ci	  if (g_chip.AD.GainB > 0)
925141cc406Sopenharmony_ci	    g_chip.AD.GainB--;
926141cc406Sopenharmony_ci	}
927141cc406Sopenharmony_ci      else
928141cc406Sopenharmony_ci	{
929141cc406Sopenharmony_ci	  if ((wMaxValueB - wMinValueB) < REFL_MIN_LEVEL_RANGE)
930141cc406Sopenharmony_ci	    {
931141cc406Sopenharmony_ci	      if (wMaxValueB < REFL_WHITE_MIN_LEVEL)
932141cc406Sopenharmony_ci		{
933141cc406Sopenharmony_ci		  g_chip.AD.GainB++;
934141cc406Sopenharmony_ci		  if (g_chip.AD.GainB > 63)
935141cc406Sopenharmony_ci		    g_chip.AD.GainB = 63;
936141cc406Sopenharmony_ci		}
937141cc406Sopenharmony_ci	      else
938141cc406Sopenharmony_ci		{
939141cc406Sopenharmony_ci		  if (wMaxValueB > REFL_WHITE_MAX_LEVEL)
940141cc406Sopenharmony_ci		    {
941141cc406Sopenharmony_ci		      if (g_chip.AD.GainB < 1)
942141cc406Sopenharmony_ci			g_chip.AD.GainB = 0;
943141cc406Sopenharmony_ci		      else
944141cc406Sopenharmony_ci			g_chip.AD.GainB--;
945141cc406Sopenharmony_ci		    }
946141cc406Sopenharmony_ci		  else
947141cc406Sopenharmony_ci		    {
948141cc406Sopenharmony_ci		      if (g_chip.AD.GainB > 63)
949141cc406Sopenharmony_ci			g_chip.AD.GainB = 63;
950141cc406Sopenharmony_ci		      else
951141cc406Sopenharmony_ci			g_chip.AD.GainB++;
952141cc406Sopenharmony_ci		    }
953141cc406Sopenharmony_ci		}
954141cc406Sopenharmony_ci	    }
955141cc406Sopenharmony_ci	  else
956141cc406Sopenharmony_ci	    {
957141cc406Sopenharmony_ci	      if (wMaxValueB > REFL_WHITE_MAX_LEVEL)
958141cc406Sopenharmony_ci
959141cc406Sopenharmony_ci		{
960141cc406Sopenharmony_ci		  if (g_chip.AD.GainB < 1)
961141cc406Sopenharmony_ci		    g_chip.AD.GainB = 0;
962141cc406Sopenharmony_ci		  else
963141cc406Sopenharmony_ci		    g_chip.AD.GainB--;
964141cc406Sopenharmony_ci		}
965141cc406Sopenharmony_ci
966141cc406Sopenharmony_ci	      if (wMaxValueB < REFL_WHITE_MIN_LEVEL)
967141cc406Sopenharmony_ci		{
968141cc406Sopenharmony_ci		  if (g_chip.AD.GainB > 63)
969141cc406Sopenharmony_ci		    g_chip.AD.GainB = 63;
970141cc406Sopenharmony_ci		  else
971141cc406Sopenharmony_ci		    g_chip.AD.GainB++;
972141cc406Sopenharmony_ci		}
973141cc406Sopenharmony_ci	    }
974141cc406Sopenharmony_ci	}
975141cc406Sopenharmony_ci      nTimesOfCal++;
976141cc406Sopenharmony_ci      if (nTimesOfCal > 10)
977141cc406Sopenharmony_ci	break;
978141cc406Sopenharmony_ci    }
979141cc406Sopenharmony_ci  while ((wMaxValueR - wMinValueR) > REFL_MAX_LEVEL_RANGE
980141cc406Sopenharmony_ci	 || (wMaxValueR - wMinValueR) < REFL_MIN_LEVEL_RANGE
981141cc406Sopenharmony_ci	 || (wMaxValueG - wMinValueG) > REFL_MAX_LEVEL_RANGE
982141cc406Sopenharmony_ci	 || (wMaxValueG - wMinValueG) < REFL_MIN_LEVEL_RANGE
983141cc406Sopenharmony_ci	 || (wMaxValueB - wMinValueB) > REFL_MAX_LEVEL_RANGE
984141cc406Sopenharmony_ci	 || (wMaxValueB - wMinValueB) < REFL_MIN_LEVEL_RANGE);
985141cc406Sopenharmony_ci
986141cc406Sopenharmony_ci  /* Adjust Offset 2nd */
987141cc406Sopenharmony_ci  nTimesOfCal = 0;
988141cc406Sopenharmony_ci  do
989141cc406Sopenharmony_ci    {
990141cc406Sopenharmony_ci      DBG (DBG_FUNC,
991141cc406Sopenharmony_ci	   "Reflective_AdjustAD: run in second adjust offset do-while\n");
992141cc406Sopenharmony_ci      Asic_SetAFEGainOffset (&g_chip);
993141cc406Sopenharmony_ci      Asic_ScanStart (&g_chip);
994141cc406Sopenharmony_ci      Asic_ReadCalibrationData (&g_chip, lpCalData, wCalWidth * 3, 24);
995141cc406Sopenharmony_ci      Asic_ScanStop (&g_chip);
996141cc406Sopenharmony_ci
997141cc406Sopenharmony_ci      MustScanner_CalculateMaxMin (lpCalData, &wMaxValueR, &wMinValueR,
998141cc406Sopenharmony_ci				   wAdjustADResolution);
999141cc406Sopenharmony_ci      MustScanner_CalculateMaxMin (lpCalData + wCalWidth, &wMaxValueG,
1000141cc406Sopenharmony_ci				   &wMinValueG, wAdjustADResolution);
1001141cc406Sopenharmony_ci      MustScanner_CalculateMaxMin (lpCalData + wCalWidth * 2, &wMaxValueB,
1002141cc406Sopenharmony_ci				   &wMinValueB, wAdjustADResolution);
1003141cc406Sopenharmony_ci
1004141cc406Sopenharmony_ci      DBG (DBG_FUNC, "Reflective_AdjustAD: "
1005141cc406Sopenharmony_ci	   "RGain=%d, ROffset=%d, RDir=%d  GGain=%d, GOffset=%d, GDir=%d  BGain=%d, BOffset=%d, BDir=%d\n",
1006141cc406Sopenharmony_ci	   g_chip.AD.GainR, g_chip.AD.OffsetR, g_chip.AD.DirectionR,
1007141cc406Sopenharmony_ci	   g_chip.AD.GainG, g_chip.AD.OffsetG, g_chip.AD.DirectionG,
1008141cc406Sopenharmony_ci	   g_chip.AD.GainB, g_chip.AD.OffsetB, g_chip.AD.DirectionB);
1009141cc406Sopenharmony_ci
1010141cc406Sopenharmony_ci      DBG (DBG_FUNC, "Reflective_AdjustAD: "
1011141cc406Sopenharmony_ci	   "MaxR=%d, MinR=%d  MaxG=%d, MinG=%d  MaxB=%d, MinB=%d\n",
1012141cc406Sopenharmony_ci	   wMaxValueR, wMinValueR, wMaxValueG, wMinValueG, wMaxValueB,
1013141cc406Sopenharmony_ci	   wMinValueB);
1014141cc406Sopenharmony_ci
1015141cc406Sopenharmony_ci      if (g_chip.AD.DirectionR == 0)
1016141cc406Sopenharmony_ci	{
1017141cc406Sopenharmony_ci	  if (wMinValueR > 20)
1018141cc406Sopenharmony_ci	    {
1019141cc406Sopenharmony_ci	      if (g_chip.AD.OffsetR < 8)
1020141cc406Sopenharmony_ci		g_chip.AD.DirectionR = 1;
1021141cc406Sopenharmony_ci	      else
1022141cc406Sopenharmony_ci		g_chip.AD.OffsetR -= 8;
1023141cc406Sopenharmony_ci	    }
1024141cc406Sopenharmony_ci
1025141cc406Sopenharmony_ci	  else if (wMinValueR < 10)
1026141cc406Sopenharmony_ci	    g_chip.AD.OffsetR += 8;
1027141cc406Sopenharmony_ci	}
1028141cc406Sopenharmony_ci      else
1029141cc406Sopenharmony_ci	{
1030141cc406Sopenharmony_ci	  if (wMinValueR > 20)
1031141cc406Sopenharmony_ci	    g_chip.AD.OffsetR += 8;
1032141cc406Sopenharmony_ci	  else if (wMinValueR < 10)
1033141cc406Sopenharmony_ci	    g_chip.AD.OffsetR -= 8;
1034141cc406Sopenharmony_ci	}
1035141cc406Sopenharmony_ci
1036141cc406Sopenharmony_ci      if (g_chip.AD.DirectionG == 0)
1037141cc406Sopenharmony_ci	{
1038141cc406Sopenharmony_ci	  if (wMinValueG > 20)
1039141cc406Sopenharmony_ci	    {
1040141cc406Sopenharmony_ci	      if (g_chip.AD.OffsetG < 8)
1041141cc406Sopenharmony_ci		g_chip.AD.DirectionG = 1;
1042141cc406Sopenharmony_ci	      else
1043141cc406Sopenharmony_ci		g_chip.AD.OffsetG -= 8;
1044141cc406Sopenharmony_ci	    }
1045141cc406Sopenharmony_ci	  else if (wMinValueG < 10)
1046141cc406Sopenharmony_ci	    g_chip.AD.OffsetG += 8;
1047141cc406Sopenharmony_ci	}
1048141cc406Sopenharmony_ci      else
1049141cc406Sopenharmony_ci	{
1050141cc406Sopenharmony_ci	  if (wMinValueG > 20)
1051141cc406Sopenharmony_ci	    g_chip.AD.OffsetG += 8;
1052141cc406Sopenharmony_ci	  else if (wMinValueG < 10)
1053141cc406Sopenharmony_ci	    g_chip.AD.OffsetG -= 8;
1054141cc406Sopenharmony_ci	}
1055141cc406Sopenharmony_ci
1056141cc406Sopenharmony_ci      if (g_chip.AD.DirectionB == 0)
1057141cc406Sopenharmony_ci	{
1058141cc406Sopenharmony_ci	  if (wMinValueB > 20)
1059141cc406Sopenharmony_ci	    {
1060141cc406Sopenharmony_ci	      if (g_chip.AD.OffsetB < 8)
1061141cc406Sopenharmony_ci		g_chip.AD.DirectionB = 1;
1062141cc406Sopenharmony_ci	      else
1063141cc406Sopenharmony_ci		g_chip.AD.OffsetB -= 8;
1064141cc406Sopenharmony_ci	    }
1065141cc406Sopenharmony_ci	  else if (wMinValueB < 10)
1066141cc406Sopenharmony_ci	    g_chip.AD.OffsetB += 8;
1067141cc406Sopenharmony_ci	}
1068141cc406Sopenharmony_ci      else
1069141cc406Sopenharmony_ci	{
1070141cc406Sopenharmony_ci	  if (wMinValueB > 20)
1071141cc406Sopenharmony_ci	    g_chip.AD.OffsetB += 8;
1072141cc406Sopenharmony_ci	  else if (wMinValueB < 10)
1073141cc406Sopenharmony_ci	    g_chip.AD.OffsetB -= 8;
1074141cc406Sopenharmony_ci	}
1075141cc406Sopenharmony_ci
1076141cc406Sopenharmony_ci      nTimesOfCal++;
1077141cc406Sopenharmony_ci      if (nTimesOfCal > 8)
1078141cc406Sopenharmony_ci	break;
1079141cc406Sopenharmony_ci
1080141cc406Sopenharmony_ci    }
1081141cc406Sopenharmony_ci  while (wMinValueR > 20 || wMinValueR < 10
1082141cc406Sopenharmony_ci	 || wMinValueG > 20 || wMinValueG < 10
1083141cc406Sopenharmony_ci	 || wMinValueB > 20 || wMinValueB < 10);
1084141cc406Sopenharmony_ci
1085141cc406Sopenharmony_ci  DBG (DBG_FUNC,
1086141cc406Sopenharmony_ci       "Reflective_AdjustAD: run in second adjust offset do-while\n");
1087141cc406Sopenharmony_ci
1088141cc406Sopenharmony_ci  DBG (DBG_FUNC, "Reflective_AdjustAD:after ad gain\n");
1089141cc406Sopenharmony_ci  DBG (DBG_FUNC, "Reflective_AdjustAD: "
1090141cc406Sopenharmony_ci       "g_chip.AD.GainR = %d,"
1091141cc406Sopenharmony_ci       "g_chip.AD.GainG = %d,"
1092141cc406Sopenharmony_ci       "g_chip.AD.GainB = %d\n",
1093141cc406Sopenharmony_ci       g_chip.AD.GainR, g_chip.AD.GainG, g_chip.AD.GainB);
1094141cc406Sopenharmony_ci
1095141cc406Sopenharmony_ci  free (lpCalData);
1096141cc406Sopenharmony_ci
1097141cc406Sopenharmony_ci  DBG (DBG_FUNC, "Reflective_AdjustAD: leave Reflective_AdjustAD\n");
1098141cc406Sopenharmony_ci  return TRUE;
1099141cc406Sopenharmony_ci}
1100141cc406Sopenharmony_ci
1101141cc406Sopenharmony_ci/**********************************************************************
1102141cc406Sopenharmony_ciAuthor: Jack             Date: 2005/05/14
1103141cc406Sopenharmony_ciRoutine Description:
1104141cc406Sopenharmony_ci	Find top and left side
1105141cc406Sopenharmony_ciParameters:
1106141cc406Sopenharmony_ci	lpwStartX: the left side
1107141cc406Sopenharmony_ci	lpwStartY: the top side
1108141cc406Sopenharmony_ciReturn value:
1109141cc406Sopenharmony_ci	if operation is success
1110141cc406Sopenharmony_ci	return TRUE
1111141cc406Sopenharmony_ci	else
1112141cc406Sopenharmony_ci	return FALSE
1113141cc406Sopenharmony_ci***********************************************************************/
1114141cc406Sopenharmony_cistatic SANE_Bool
1115141cc406Sopenharmony_ciReflective_FindTopLeft (unsigned short * lpwStartX, unsigned short * lpwStartY)
1116141cc406Sopenharmony_ci{
1117141cc406Sopenharmony_ci  unsigned short wCalWidth = FIND_LEFT_TOP_WIDTH_IN_DIP;
1118141cc406Sopenharmony_ci  unsigned short wCalHeight = FIND_LEFT_TOP_HEIGHT_IN_DIP;
1119141cc406Sopenharmony_ci
1120141cc406Sopenharmony_ci  int i, j;
1121141cc406Sopenharmony_ci  unsigned short wLeftSide;
1122141cc406Sopenharmony_ci  unsigned short wTopSide;
1123141cc406Sopenharmony_ci  int nScanBlock;
1124141cc406Sopenharmony_ci  SANE_Byte * lpCalData;
1125141cc406Sopenharmony_ci  unsigned int dwTotalSize;
1126141cc406Sopenharmony_ci  unsigned short wXResolution, wYResolution;
1127141cc406Sopenharmony_ci
1128141cc406Sopenharmony_ci  DBG (DBG_FUNC, "Reflective_FindTopLeft: call in\n");
1129141cc406Sopenharmony_ci  if (!g_bOpened)
1130141cc406Sopenharmony_ci    {
1131141cc406Sopenharmony_ci      DBG (DBG_FUNC, "Reflective_FindTopLeft: scanner has been opened\n");
1132141cc406Sopenharmony_ci      return FALSE;
1133141cc406Sopenharmony_ci    }
1134141cc406Sopenharmony_ci  if (!g_bPrepared)
1135141cc406Sopenharmony_ci    {
1136141cc406Sopenharmony_ci      DBG (DBG_FUNC, "Reflective_FindTopLeft: scanner not prepared\n");
1137141cc406Sopenharmony_ci      return FALSE;
1138141cc406Sopenharmony_ci    }
1139141cc406Sopenharmony_ci
1140141cc406Sopenharmony_ci  wXResolution = wYResolution = FIND_LEFT_TOP_CALIBRATE_RESOLUTION;
1141141cc406Sopenharmony_ci
1142141cc406Sopenharmony_ci  lpCalData = (SANE_Byte *) malloc (sizeof (SANE_Byte) * wCalWidth * wCalHeight);
1143141cc406Sopenharmony_ci  if (lpCalData == NULL)
1144141cc406Sopenharmony_ci    {
1145141cc406Sopenharmony_ci      DBG (DBG_FUNC, "Reflective_FindTopLeft: lpCalData malloc error\n");
1146141cc406Sopenharmony_ci      return FALSE;
1147141cc406Sopenharmony_ci    }
1148141cc406Sopenharmony_ci
1149141cc406Sopenharmony_ci  dwTotalSize = wCalWidth * wCalHeight;
1150141cc406Sopenharmony_ci  nScanBlock = (int) (dwTotalSize / g_dwCalibrationSize);
1151141cc406Sopenharmony_ci
1152141cc406Sopenharmony_ci  Asic_SetMotorType (&g_chip, TRUE, TRUE);
1153141cc406Sopenharmony_ci  Asic_SetCalibrate (&g_chip, 8, wXResolution, wYResolution, 0, 0, wCalWidth,
1154141cc406Sopenharmony_ci		     wCalHeight, FALSE);
1155141cc406Sopenharmony_ci  Asic_SetAFEGainOffset (&g_chip);
1156141cc406Sopenharmony_ci  if (Asic_ScanStart (&g_chip) != SANE_STATUS_GOOD)
1157141cc406Sopenharmony_ci    {
1158141cc406Sopenharmony_ci      DBG (DBG_FUNC, "Reflective_FindTopLeft: Asic_ScanStart return error\n");
1159141cc406Sopenharmony_ci      free (lpCalData);
1160141cc406Sopenharmony_ci      return FALSE;
1161141cc406Sopenharmony_ci    }
1162141cc406Sopenharmony_ci
1163141cc406Sopenharmony_ci  for (i = 0; i < nScanBlock; i++)
1164141cc406Sopenharmony_ci    {
1165141cc406Sopenharmony_ci      if (SANE_STATUS_GOOD !=
1166141cc406Sopenharmony_ci	  Asic_ReadCalibrationData (&g_chip,
1167141cc406Sopenharmony_ci				    lpCalData + i * g_dwCalibrationSize,
1168141cc406Sopenharmony_ci				    g_dwCalibrationSize, 8))
1169141cc406Sopenharmony_ci	{
1170141cc406Sopenharmony_ci	  DBG (DBG_FUNC,
1171141cc406Sopenharmony_ci	       "Reflective_FindTopLeft: Asic_ReadCalibrationData return error\n");
1172141cc406Sopenharmony_ci	  free (lpCalData);
1173141cc406Sopenharmony_ci	  return FALSE;
1174141cc406Sopenharmony_ci	}
1175141cc406Sopenharmony_ci    }
1176141cc406Sopenharmony_ci
1177141cc406Sopenharmony_ci  if (SANE_STATUS_GOOD !=
1178141cc406Sopenharmony_ci      Asic_ReadCalibrationData (&g_chip,
1179141cc406Sopenharmony_ci				lpCalData +
1180141cc406Sopenharmony_ci				(nScanBlock) * g_dwCalibrationSize,
1181141cc406Sopenharmony_ci				(dwTotalSize -
1182141cc406Sopenharmony_ci				 g_dwCalibrationSize * nScanBlock), 8))
1183141cc406Sopenharmony_ci    {
1184141cc406Sopenharmony_ci
1185141cc406Sopenharmony_ci      DBG (DBG_FUNC,
1186141cc406Sopenharmony_ci	   "Reflective_FindTopLeft: Asic_ReadCalibrationData return error\n");
1187141cc406Sopenharmony_ci      free (lpCalData);
1188141cc406Sopenharmony_ci      return FALSE;
1189141cc406Sopenharmony_ci    }
1190141cc406Sopenharmony_ci
1191141cc406Sopenharmony_ci  Asic_ScanStop (&g_chip);
1192141cc406Sopenharmony_ci
1193141cc406Sopenharmony_ci#ifdef DEBUG_SAVE_IMAGE
1194141cc406Sopenharmony_ci  FILE *stream = NULL;
1195141cc406Sopenharmony_ci  stream = fopen ("/root/bound(Ref).pnm", "wb+\n");
1196141cc406Sopenharmony_ci  SANE_Byte * lpBuf = (SANE_Byte *) malloc (50);
1197141cc406Sopenharmony_ci  if (NULL == lpBuf)
1198141cc406Sopenharmony_ci    {
1199141cc406Sopenharmony_ci      return FALSE;
1200141cc406Sopenharmony_ci    }
1201141cc406Sopenharmony_ci  memset (lpBuf, 0, 50);
1202141cc406Sopenharmony_ci  sprintf (lpBuf, "P5\n%d %d\n255\n", wCalWidth, wCalHeight);
1203141cc406Sopenharmony_ci  fwrite (lpBuf, sizeof (SANE_Byte), strlen (lpBuf), stream);
1204141cc406Sopenharmony_ci  fwrite (lpCalData, sizeof (SANE_Byte), wCalWidth * wCalHeight, stream);
1205141cc406Sopenharmony_ci
1206141cc406Sopenharmony_ci  fclose (stream);
1207141cc406Sopenharmony_ci  free (lpBuf);
1208141cc406Sopenharmony_ci#endif
1209141cc406Sopenharmony_ci
1210141cc406Sopenharmony_ci  wLeftSide = 0;
1211141cc406Sopenharmony_ci  wTopSide = 0;
1212141cc406Sopenharmony_ci
1213141cc406Sopenharmony_ci  /* Find Left Side */
1214141cc406Sopenharmony_ci  for (i = wCalWidth - 1; i > 0; i--)
1215141cc406Sopenharmony_ci    {
1216141cc406Sopenharmony_ci      wLeftSide = *(lpCalData + i);
1217141cc406Sopenharmony_ci      wLeftSide += *(lpCalData + wCalWidth * 2 + i);
1218141cc406Sopenharmony_ci      wLeftSide += *(lpCalData + wCalWidth * 4 + i);
1219141cc406Sopenharmony_ci      wLeftSide += *(lpCalData + wCalWidth * 6 + i);
1220141cc406Sopenharmony_ci      wLeftSide += *(lpCalData + wCalWidth * 8 + i);
1221141cc406Sopenharmony_ci      wLeftSide /= 5;
1222141cc406Sopenharmony_ci      if (wLeftSide < 60)
1223141cc406Sopenharmony_ci	{
1224141cc406Sopenharmony_ci	  if (i == wCalWidth - 1)
1225141cc406Sopenharmony_ci	    {
1226141cc406Sopenharmony_ci	      break;
1227141cc406Sopenharmony_ci	    }
1228141cc406Sopenharmony_ci	  *lpwStartX = i;
1229141cc406Sopenharmony_ci	  {
1230141cc406Sopenharmony_ci	    break;
1231141cc406Sopenharmony_ci	  }
1232141cc406Sopenharmony_ci	}
1233141cc406Sopenharmony_ci    }
1234141cc406Sopenharmony_ci
1235141cc406Sopenharmony_ci  /*Find Top Side i=left side */
1236141cc406Sopenharmony_ci  for (j = 0; j < wCalHeight; j++)
1237141cc406Sopenharmony_ci    {
1238141cc406Sopenharmony_ci      wTopSide = *(lpCalData + wCalWidth * j + i - 2);
1239141cc406Sopenharmony_ci      wTopSide += *(lpCalData + wCalWidth * j + i - 4);
1240141cc406Sopenharmony_ci      wTopSide += *(lpCalData + wCalWidth * j + i - 6);
1241141cc406Sopenharmony_ci      wTopSide += *(lpCalData + wCalWidth * j + i - 8);
1242141cc406Sopenharmony_ci      wTopSide += *(lpCalData + wCalWidth * j + i - 10);
1243141cc406Sopenharmony_ci
1244141cc406Sopenharmony_ci      wTopSide /= 5;
1245141cc406Sopenharmony_ci      if (wTopSide > 60)
1246141cc406Sopenharmony_ci	{
1247141cc406Sopenharmony_ci	  if (j == 0)
1248141cc406Sopenharmony_ci	    {
1249141cc406Sopenharmony_ci	      break;
1250141cc406Sopenharmony_ci	    }
1251141cc406Sopenharmony_ci	  *lpwStartY = j;
1252141cc406Sopenharmony_ci	  {
1253141cc406Sopenharmony_ci	    break;
1254141cc406Sopenharmony_ci	  }
1255141cc406Sopenharmony_ci	}
1256141cc406Sopenharmony_ci    }
1257141cc406Sopenharmony_ci
1258141cc406Sopenharmony_ci  if ((*lpwStartX < 100) || (*lpwStartX > 250))
1259141cc406Sopenharmony_ci    {
1260141cc406Sopenharmony_ci      *lpwStartX = 187;
1261141cc406Sopenharmony_ci    }
1262141cc406Sopenharmony_ci
1263141cc406Sopenharmony_ci  if ((*lpwStartY < 10) || (*lpwStartY > 100))
1264141cc406Sopenharmony_ci    {
1265141cc406Sopenharmony_ci      *lpwStartY = 43;
1266141cc406Sopenharmony_ci    }
1267141cc406Sopenharmony_ci
1268141cc406Sopenharmony_ci  DBG (DBG_FUNC,
1269141cc406Sopenharmony_ci       "Reflective_FindTopLeft: *lpwStartY = %d, *lpwStartX = %d\n",
1270141cc406Sopenharmony_ci       *lpwStartY, *lpwStartX);
1271141cc406Sopenharmony_ci  Asic_MotorMove (&g_chip, FALSE,
1272141cc406Sopenharmony_ci		  (wCalHeight - *lpwStartY +
1273141cc406Sopenharmony_ci		   BEFORE_SCANNING_MOTOR_FORWARD_PIXEL) * 1200 /
1274141cc406Sopenharmony_ci		  wYResolution);
1275141cc406Sopenharmony_ci
1276141cc406Sopenharmony_ci  free (lpCalData);
1277141cc406Sopenharmony_ci
1278141cc406Sopenharmony_ci  DBG (DBG_FUNC, "Reflective_FindTopLeft: leave Reflective_FindTopLeft\n");
1279141cc406Sopenharmony_ci  return TRUE;
1280141cc406Sopenharmony_ci
1281141cc406Sopenharmony_ci}
1282141cc406Sopenharmony_ci
1283141cc406Sopenharmony_ci/**********************************************************************
1284141cc406Sopenharmony_ciAuthor: Jack             Date: 2005/05/14
1285141cc406Sopenharmony_ciRoutine Description:
1286141cc406Sopenharmony_ci	Stop scan
1287141cc406Sopenharmony_ciParameters:
1288141cc406Sopenharmony_ci	none
1289141cc406Sopenharmony_ciReturn value:
1290141cc406Sopenharmony_ci	if operation is success
1291141cc406Sopenharmony_ci	return TRUE
1292141cc406Sopenharmony_ci	else
1293141cc406Sopenharmony_ci	return FALSE
1294141cc406Sopenharmony_ci***********************************************************************/
1295141cc406Sopenharmony_cistatic SANE_Bool
1296141cc406Sopenharmony_ciReflective_StopScan ()
1297141cc406Sopenharmony_ci{
1298141cc406Sopenharmony_ci  DBG (DBG_FUNC, "Reflective_StopScan: call in\n");
1299141cc406Sopenharmony_ci  if (!g_bOpened)
1300141cc406Sopenharmony_ci    {
1301141cc406Sopenharmony_ci      DBG (DBG_FUNC, "Reflective_StopScan: scanner not opened\n");
1302141cc406Sopenharmony_ci
1303141cc406Sopenharmony_ci      return FALSE;
1304141cc406Sopenharmony_ci    }
1305141cc406Sopenharmony_ci  if (!g_bPrepared)
1306141cc406Sopenharmony_ci    {
1307141cc406Sopenharmony_ci      DBG (DBG_FUNC, "Reflective_StopScan: scanner not prepared\n");
1308141cc406Sopenharmony_ci
1309141cc406Sopenharmony_ci      return FALSE;
1310141cc406Sopenharmony_ci    }
1311141cc406Sopenharmony_ci
1312141cc406Sopenharmony_ci  g_isCanceled = TRUE;		/*tell parent process stop read image */
1313141cc406Sopenharmony_ci
1314141cc406Sopenharmony_ci  pthread_cancel (g_threadid_readimage);
1315141cc406Sopenharmony_ci  pthread_join (g_threadid_readimage, NULL);
1316141cc406Sopenharmony_ci
1317141cc406Sopenharmony_ci  DBG (DBG_FUNC, "Reflective_StopScan: thread exit\n");
1318141cc406Sopenharmony_ci
1319141cc406Sopenharmony_ci  Asic_ScanStop (&g_chip);
1320141cc406Sopenharmony_ci  Asic_Close (&g_chip);
1321141cc406Sopenharmony_ci
1322141cc406Sopenharmony_ci  g_bOpened = FALSE;
1323141cc406Sopenharmony_ci
1324141cc406Sopenharmony_ci  DBG (DBG_FUNC, "Reflective_StopScan: leave Reflective_StopScan\n");
1325141cc406Sopenharmony_ci  return TRUE;
1326141cc406Sopenharmony_ci}
1327141cc406Sopenharmony_ci
1328141cc406Sopenharmony_ci/**********************************************************************
1329141cc406Sopenharmony_ciAuthor: Jack             Date: 2005/05/15
1330141cc406Sopenharmony_ciRoutine Description:
1331141cc406Sopenharmony_ci	Get the calibration data
1332141cc406Sopenharmony_ciParameters:
1333141cc406Sopenharmony_ci	none
1334141cc406Sopenharmony_ciReturn value:
1335141cc406Sopenharmony_ci	if the operation is success
1336141cc406Sopenharmony_ci	return TRUE
1337141cc406Sopenharmony_ci	else
1338141cc406Sopenharmony_ci	return FALSE
1339141cc406Sopenharmony_ci***********************************************************************/
1340141cc406Sopenharmony_cistatic SANE_Bool
1341141cc406Sopenharmony_ciReflective_LineCalibration16Bits ()
1342141cc406Sopenharmony_ci{
1343141cc406Sopenharmony_ci  SANE_Status status;
1344141cc406Sopenharmony_ci  SANE_Byte * lpWhiteData;
1345141cc406Sopenharmony_ci  SANE_Byte * lpDarkData;
1346141cc406Sopenharmony_ci  unsigned int dwWhiteTotalSize;
1347141cc406Sopenharmony_ci  unsigned int dwDarkTotalSize;
1348141cc406Sopenharmony_ci  unsigned short wCalHeight = LINE_CALIBRATION__16BITS_HEIGHT;
1349141cc406Sopenharmony_ci  unsigned short wCalWidth;
1350141cc406Sopenharmony_ci
1351141cc406Sopenharmony_ci  unsigned short *lpWhiteShading;
1352141cc406Sopenharmony_ci  unsigned short *lpDarkShading;
1353141cc406Sopenharmony_ci  double wRWhiteLevel = 0;
1354141cc406Sopenharmony_ci  double wGWhiteLevel = 0;
1355141cc406Sopenharmony_ci  double wBWhiteLevel = 0;
1356141cc406Sopenharmony_ci  unsigned int dwRDarkLevel = 0;
1357141cc406Sopenharmony_ci  unsigned int dwGDarkLevel = 0;
1358141cc406Sopenharmony_ci  unsigned int dwBDarkLevel = 0;
1359141cc406Sopenharmony_ci  unsigned int dwREvenDarkLevel = 0;
1360141cc406Sopenharmony_ci  unsigned int dwGEvenDarkLevel = 0;
1361141cc406Sopenharmony_ci  unsigned int dwBEvenDarkLevel = 0;
1362141cc406Sopenharmony_ci  unsigned short * lpRWhiteSort;
1363141cc406Sopenharmony_ci  unsigned short * lpGWhiteSort;
1364141cc406Sopenharmony_ci  unsigned short * lpBWhiteSort;
1365141cc406Sopenharmony_ci  unsigned short * lpRDarkSort;
1366141cc406Sopenharmony_ci  unsigned short * lpGDarkSort;
1367141cc406Sopenharmony_ci  unsigned short * lpBDarkSort;
1368141cc406Sopenharmony_ci  int i, j;
1369141cc406Sopenharmony_ci
1370141cc406Sopenharmony_ci  DBG (DBG_FUNC, "Reflective_LineCalibration16Bits: call in\n");
1371141cc406Sopenharmony_ci  if (!g_bOpened)
1372141cc406Sopenharmony_ci    {
1373141cc406Sopenharmony_ci      DBG (DBG_FUNC,
1374141cc406Sopenharmony_ci	   "Reflective_LineCalibration16Bits: scanner not opened\n");
1375141cc406Sopenharmony_ci
1376141cc406Sopenharmony_ci      return FALSE;
1377141cc406Sopenharmony_ci    }
1378141cc406Sopenharmony_ci  if (!g_bPrepared)
1379141cc406Sopenharmony_ci    {
1380141cc406Sopenharmony_ci      DBG (DBG_FUNC,
1381141cc406Sopenharmony_ci	   "Reflective_LineCalibration16Bits: scanner not prepared\n");
1382141cc406Sopenharmony_ci
1383141cc406Sopenharmony_ci      return FALSE;
1384141cc406Sopenharmony_ci    }
1385141cc406Sopenharmony_ci
1386141cc406Sopenharmony_ci  wCalWidth = g_Width;
1387141cc406Sopenharmony_ci
1388141cc406Sopenharmony_ci  dwWhiteTotalSize = wCalWidth * wCalHeight * 3 * 2;
1389141cc406Sopenharmony_ci  dwDarkTotalSize = wCalWidth * wCalHeight * 3 * 2;
1390141cc406Sopenharmony_ci  lpWhiteData = (SANE_Byte *) malloc (sizeof (SANE_Byte) * dwWhiteTotalSize);
1391141cc406Sopenharmony_ci  lpDarkData = (SANE_Byte *) malloc (sizeof (SANE_Byte) * dwDarkTotalSize);
1392141cc406Sopenharmony_ci
1393141cc406Sopenharmony_ci  if (lpWhiteData == NULL || lpDarkData == NULL)
1394141cc406Sopenharmony_ci    {
1395141cc406Sopenharmony_ci      DBG (DBG_FUNC,
1396141cc406Sopenharmony_ci	   "Reflective_LineCalibration16Bits: lpWhiteData or lpDarkData malloc error \n");
1397141cc406Sopenharmony_ci
1398141cc406Sopenharmony_ci      return FALSE;
1399141cc406Sopenharmony_ci    }
1400141cc406Sopenharmony_ci
1401141cc406Sopenharmony_ci  Asic_SetMotorType (&g_chip, TRUE, TRUE);
1402141cc406Sopenharmony_ci  Asic_SetAFEGainOffset (&g_chip);
1403141cc406Sopenharmony_ci  status =
1404141cc406Sopenharmony_ci    Asic_SetCalibrate (&g_chip, 48, g_XDpi, g_YDpi, g_X, 0, wCalWidth,
1405141cc406Sopenharmony_ci		       wCalHeight, TRUE);
1406141cc406Sopenharmony_ci  if (status != SANE_STATUS_GOOD)
1407141cc406Sopenharmony_ci    {
1408141cc406Sopenharmony_ci      DBG (DBG_FUNC,
1409141cc406Sopenharmony_ci	   "Reflective_LineCalibration16Bits: Asic_SetCalibrate return error \n");
1410141cc406Sopenharmony_ci
1411141cc406Sopenharmony_ci      free (lpWhiteData);
1412141cc406Sopenharmony_ci
1413141cc406Sopenharmony_ci      free (lpDarkData);
1414141cc406Sopenharmony_ci      return FALSE;
1415141cc406Sopenharmony_ci    }
1416141cc406Sopenharmony_ci
1417141cc406Sopenharmony_ci  status = Asic_ScanStart (&g_chip);
1418141cc406Sopenharmony_ci  if (status != SANE_STATUS_GOOD)
1419141cc406Sopenharmony_ci    {
1420141cc406Sopenharmony_ci      DBG (DBG_FUNC,
1421141cc406Sopenharmony_ci	   "Reflective_LineCalibration16Bits: Asic_ScanStart return error \n");
1422141cc406Sopenharmony_ci
1423141cc406Sopenharmony_ci      free (lpWhiteData);
1424141cc406Sopenharmony_ci      free (lpDarkData);
1425141cc406Sopenharmony_ci      return FALSE;
1426141cc406Sopenharmony_ci    }
1427141cc406Sopenharmony_ci
1428141cc406Sopenharmony_ci  status =
1429141cc406Sopenharmony_ci    Asic_ReadCalibrationData (&g_chip, lpWhiteData, dwWhiteTotalSize, 8);
1430141cc406Sopenharmony_ci  if (status != SANE_STATUS_GOOD)
1431141cc406Sopenharmony_ci    {
1432141cc406Sopenharmony_ci      free (lpWhiteData);
1433141cc406Sopenharmony_ci      free (lpDarkData);
1434141cc406Sopenharmony_ci      return FALSE;
1435141cc406Sopenharmony_ci    }
1436141cc406Sopenharmony_ci
1437141cc406Sopenharmony_ci  Asic_ScanStop (&g_chip);
1438141cc406Sopenharmony_ci
1439141cc406Sopenharmony_ci  /*Read dark level data */
1440141cc406Sopenharmony_ci  status = Asic_SetMotorType (&g_chip, FALSE, TRUE);
1441141cc406Sopenharmony_ci  if (status != SANE_STATUS_GOOD)
1442141cc406Sopenharmony_ci    {
1443141cc406Sopenharmony_ci      DBG (DBG_FUNC,
1444141cc406Sopenharmony_ci	   "Reflective_LineCalibration16Bits: Asic_SetMotorType return error \n");
1445141cc406Sopenharmony_ci
1446141cc406Sopenharmony_ci      free (lpWhiteData);
1447141cc406Sopenharmony_ci      free (lpDarkData);
1448141cc406Sopenharmony_ci      return FALSE;
1449141cc406Sopenharmony_ci    }
1450141cc406Sopenharmony_ci
1451141cc406Sopenharmony_ci  status =
1452141cc406Sopenharmony_ci    Asic_SetCalibrate (&g_chip, 48, g_XDpi, g_YDpi, g_X, 0, wCalWidth,
1453141cc406Sopenharmony_ci		       wCalHeight, TRUE);
1454141cc406Sopenharmony_ci  if (status != SANE_STATUS_GOOD)
1455141cc406Sopenharmony_ci    {
1456141cc406Sopenharmony_ci      DBG (DBG_FUNC,
1457141cc406Sopenharmony_ci	   "Reflective_LineCalibration16Bits: Asic_SetCalibrate return error \n");
1458141cc406Sopenharmony_ci
1459141cc406Sopenharmony_ci      free (lpWhiteData);
1460141cc406Sopenharmony_ci      free (lpDarkData);
1461141cc406Sopenharmony_ci      return FALSE;
1462141cc406Sopenharmony_ci    }
1463141cc406Sopenharmony_ci
1464141cc406Sopenharmony_ci  status = Asic_TurnLamp (&g_chip, FALSE);
1465141cc406Sopenharmony_ci  if (status != SANE_STATUS_GOOD)
1466141cc406Sopenharmony_ci    {
1467141cc406Sopenharmony_ci      DBG (DBG_FUNC,
1468141cc406Sopenharmony_ci	   "Reflective_LineCalibration16Bits: Asic_TurnLamp return error \n");
1469141cc406Sopenharmony_ci
1470141cc406Sopenharmony_ci      free (lpWhiteData);
1471141cc406Sopenharmony_ci      free (lpDarkData);
1472141cc406Sopenharmony_ci      return FALSE;
1473141cc406Sopenharmony_ci    }
1474141cc406Sopenharmony_ci
1475141cc406Sopenharmony_ci  usleep (500000);
1476141cc406Sopenharmony_ci
1477141cc406Sopenharmony_ci  status = Asic_ScanStart (&g_chip);
1478141cc406Sopenharmony_ci  if (status != SANE_STATUS_GOOD)
1479141cc406Sopenharmony_ci    {
1480141cc406Sopenharmony_ci      DBG (DBG_FUNC,
1481141cc406Sopenharmony_ci	   "Reflective_LineCalibration16Bits: Asic_ScanStart return error \n");
1482141cc406Sopenharmony_ci
1483141cc406Sopenharmony_ci      free (lpWhiteData);
1484141cc406Sopenharmony_ci      free (lpDarkData);
1485141cc406Sopenharmony_ci      return FALSE;
1486141cc406Sopenharmony_ci    }
1487141cc406Sopenharmony_ci
1488141cc406Sopenharmony_ci  status = Asic_ReadCalibrationData (&g_chip, lpDarkData, dwDarkTotalSize, 8);
1489141cc406Sopenharmony_ci  if (status != SANE_STATUS_GOOD)
1490141cc406Sopenharmony_ci    {
1491141cc406Sopenharmony_ci      DBG (DBG_FUNC,
1492141cc406Sopenharmony_ci	   "Reflective_LineCalibration16Bits: Asic_ReadCalibrationData return error \n");
1493141cc406Sopenharmony_ci
1494141cc406Sopenharmony_ci      free (lpWhiteData);
1495141cc406Sopenharmony_ci      free (lpDarkData);
1496141cc406Sopenharmony_ci      return FALSE;
1497141cc406Sopenharmony_ci    }
1498141cc406Sopenharmony_ci
1499141cc406Sopenharmony_ci  Asic_ScanStop (&g_chip);
1500141cc406Sopenharmony_ci
1501141cc406Sopenharmony_ci  /* Turn on lamp */
1502141cc406Sopenharmony_ci  status = Asic_TurnLamp (&g_chip, TRUE);
1503141cc406Sopenharmony_ci  if (status != SANE_STATUS_GOOD)
1504141cc406Sopenharmony_ci    {
1505141cc406Sopenharmony_ci      DBG (DBG_FUNC,
1506141cc406Sopenharmony_ci	   "Reflective_LineCalibration16Bits: Asic_TurnLamp return error \n");
1507141cc406Sopenharmony_ci
1508141cc406Sopenharmony_ci      free (lpWhiteData);
1509141cc406Sopenharmony_ci      free (lpDarkData);
1510141cc406Sopenharmony_ci      return FALSE;
1511141cc406Sopenharmony_ci    }
1512141cc406Sopenharmony_ci
1513141cc406Sopenharmony_ci#ifdef DEBUG_SAVE_IMAGE
1514141cc406Sopenharmony_ci  FILE *stream = NULL;
1515141cc406Sopenharmony_ci  SANE_Byte * lpBuf = (SANE_Byte *) malloc (50);
1516141cc406Sopenharmony_ci  if (NULL == lpBuf)
1517141cc406Sopenharmony_ci    {
1518141cc406Sopenharmony_ci      return FALSE;
1519141cc406Sopenharmony_ci
1520141cc406Sopenharmony_ci    }
1521141cc406Sopenharmony_ci  memset (lpBuf, 0, 50);
1522141cc406Sopenharmony_ci  stream = fopen ("/root/whiteshading(Ref).pnm", "wb+\n");
1523141cc406Sopenharmony_ci  sprintf (lpBuf, "P6\n%d %d\n65535\n", wCalWidth, wCalHeight);
1524141cc406Sopenharmony_ci  fwrite (lpBuf, sizeof (SANE_Byte), strlen (lpBuf), stream);
1525141cc406Sopenharmony_ci  fwrite (lpWhiteData, sizeof (SANE_Byte), wCalWidth * wCalHeight * 3 * 2, stream);
1526141cc406Sopenharmony_ci  fclose (stream);
1527141cc406Sopenharmony_ci
1528141cc406Sopenharmony_ci  memset (lpBuf, 0, 50);
1529141cc406Sopenharmony_ci  stream = fopen ("/root/darkshading(Ref).pnm", "wb+\n");
1530141cc406Sopenharmony_ci  sprintf (lpBuf, "P6\n%d %d\n65535\n", wCalWidth, wCalHeight);
1531141cc406Sopenharmony_ci  fwrite (lpBuf, sizeof (SANE_Byte), strlen (lpBuf), stream);
1532141cc406Sopenharmony_ci  fwrite (lpDarkData, sizeof (SANE_Byte), wCalWidth * wCalHeight * 3 * 2, stream);
1533141cc406Sopenharmony_ci  fclose (stream);
1534141cc406Sopenharmony_ci  free (lpBuf);
1535141cc406Sopenharmony_ci#endif
1536141cc406Sopenharmony_ci
1537141cc406Sopenharmony_ci  sleep (1);
1538141cc406Sopenharmony_ci
1539141cc406Sopenharmony_ci  lpWhiteShading = (unsigned short *) malloc (sizeof (unsigned short) * wCalWidth * 3);
1540141cc406Sopenharmony_ci  lpDarkShading = (unsigned short *) malloc (sizeof (unsigned short) * wCalWidth * 3);
1541141cc406Sopenharmony_ci
1542141cc406Sopenharmony_ci  lpRWhiteSort = (unsigned short *) malloc (sizeof (unsigned short) * wCalHeight);
1543141cc406Sopenharmony_ci  lpGWhiteSort = (unsigned short *) malloc (sizeof (unsigned short) * wCalHeight);
1544141cc406Sopenharmony_ci  lpBWhiteSort = (unsigned short *) malloc (sizeof (unsigned short) * wCalHeight);
1545141cc406Sopenharmony_ci  lpRDarkSort = (unsigned short *) malloc (sizeof (unsigned short) * wCalHeight);
1546141cc406Sopenharmony_ci  lpGDarkSort = (unsigned short *) malloc (sizeof (unsigned short) * wCalHeight);
1547141cc406Sopenharmony_ci  lpBDarkSort = (unsigned short *) malloc (sizeof (unsigned short) * wCalHeight);
1548141cc406Sopenharmony_ci
1549141cc406Sopenharmony_ci  if (lpWhiteShading == NULL || lpDarkShading == NULL
1550141cc406Sopenharmony_ci      || lpRWhiteSort == NULL || lpGWhiteSort == NULL || lpBWhiteSort == NULL
1551141cc406Sopenharmony_ci      || lpRDarkSort == NULL || lpGDarkSort == NULL || lpBDarkSort == NULL)
1552141cc406Sopenharmony_ci    {
1553141cc406Sopenharmony_ci      DBG (DBG_FUNC, "Reflective_LineCalibration16Bits: malloc error \n");
1554141cc406Sopenharmony_ci
1555141cc406Sopenharmony_ci      free (lpWhiteData);
1556141cc406Sopenharmony_ci      free (lpDarkData);
1557141cc406Sopenharmony_ci      return FALSE;
1558141cc406Sopenharmony_ci    }
1559141cc406Sopenharmony_ci
1560141cc406Sopenharmony_ci  /* create dark level shading */
1561141cc406Sopenharmony_ci  dwRDarkLevel = 0;
1562141cc406Sopenharmony_ci  dwGDarkLevel = 0;
1563141cc406Sopenharmony_ci  dwBDarkLevel = 0;
1564141cc406Sopenharmony_ci  dwREvenDarkLevel = 0;
1565141cc406Sopenharmony_ci  dwGEvenDarkLevel = 0;
1566141cc406Sopenharmony_ci  dwBEvenDarkLevel = 0;
1567141cc406Sopenharmony_ci
1568141cc406Sopenharmony_ci  DBG (DBG_FUNC,
1569141cc406Sopenharmony_ci       "Reflective_LineCalibration16Bits: wCalWidth = %d, wCalHeight = %d\n",
1570141cc406Sopenharmony_ci       wCalWidth, wCalHeight);
1571141cc406Sopenharmony_ci
1572141cc406Sopenharmony_ci  for (i = 0; i < wCalWidth; i++)
1573141cc406Sopenharmony_ci    {
1574141cc406Sopenharmony_ci      for (j = 0; j < wCalHeight; j++)
1575141cc406Sopenharmony_ci	{
1576141cc406Sopenharmony_ci	  lpRDarkSort[j] =
1577141cc406Sopenharmony_ci	    (unsigned short) (*(lpDarkData + j * wCalWidth * 6 + i * 6 + 0));
1578141cc406Sopenharmony_ci	  lpRDarkSort[j] +=
1579141cc406Sopenharmony_ci	    (unsigned short) (*(lpDarkData + j * wCalWidth * 6 + i * 6 + 1) << 8);
1580141cc406Sopenharmony_ci
1581141cc406Sopenharmony_ci	  lpGDarkSort[j] =
1582141cc406Sopenharmony_ci	    (unsigned short) (*(lpDarkData + j * wCalWidth * 6 + i * 6 + 2));
1583141cc406Sopenharmony_ci	  lpGDarkSort[j] +=
1584141cc406Sopenharmony_ci	    (unsigned short) (*(lpDarkData + j * wCalWidth * 6 + i * 6 + 3) << 8);
1585141cc406Sopenharmony_ci
1586141cc406Sopenharmony_ci	  lpBDarkSort[j] =
1587141cc406Sopenharmony_ci	    (unsigned short) (*(lpDarkData + j * wCalWidth * 6 + i * 6 + 4));
1588141cc406Sopenharmony_ci	  lpBDarkSort[j] +=
1589141cc406Sopenharmony_ci	    (unsigned short) (*(lpDarkData + j * wCalWidth * 6 + i * 6 + 5) << 8);
1590141cc406Sopenharmony_ci	}
1591141cc406Sopenharmony_ci
1592141cc406Sopenharmony_ci      if (g_XDpi == 1200)
1593141cc406Sopenharmony_ci	{
1594141cc406Sopenharmony_ci
1595141cc406Sopenharmony_ci	  /*do dark shading table with mean */
1596141cc406Sopenharmony_ci	  if (i % 2)
1597141cc406Sopenharmony_ci	    {
1598141cc406Sopenharmony_ci	      dwRDarkLevel +=
1599141cc406Sopenharmony_ci		(unsigned int) MustScanner_FiltLower (lpRDarkSort, wCalHeight, 20,
1600141cc406Sopenharmony_ci					       30);
1601141cc406Sopenharmony_ci	      dwGDarkLevel +=
1602141cc406Sopenharmony_ci		(unsigned int) MustScanner_FiltLower (lpGDarkSort, wCalHeight, 20,
1603141cc406Sopenharmony_ci					       30);
1604141cc406Sopenharmony_ci	      dwBDarkLevel +=
1605141cc406Sopenharmony_ci		(unsigned int) MustScanner_FiltLower (lpBDarkSort, wCalHeight, 20,
1606141cc406Sopenharmony_ci					       30);
1607141cc406Sopenharmony_ci	    }
1608141cc406Sopenharmony_ci	  else
1609141cc406Sopenharmony_ci	    {
1610141cc406Sopenharmony_ci	      dwREvenDarkLevel +=
1611141cc406Sopenharmony_ci		(unsigned int) MustScanner_FiltLower (lpRDarkSort, wCalHeight, 20,
1612141cc406Sopenharmony_ci					       30);
1613141cc406Sopenharmony_ci
1614141cc406Sopenharmony_ci	      dwGEvenDarkLevel +=
1615141cc406Sopenharmony_ci		(unsigned int) MustScanner_FiltLower (lpGDarkSort, wCalHeight, 20,
1616141cc406Sopenharmony_ci					       30);
1617141cc406Sopenharmony_ci	      dwBEvenDarkLevel +=
1618141cc406Sopenharmony_ci		(unsigned int) MustScanner_FiltLower (lpBDarkSort, wCalHeight, 20,
1619141cc406Sopenharmony_ci					       30);
1620141cc406Sopenharmony_ci	    }
1621141cc406Sopenharmony_ci	}
1622141cc406Sopenharmony_ci      else
1623141cc406Sopenharmony_ci	{
1624141cc406Sopenharmony_ci
1625141cc406Sopenharmony_ci	  dwRDarkLevel +=
1626141cc406Sopenharmony_ci	    (unsigned int) MustScanner_FiltLower (lpRDarkSort, wCalHeight, 20, 30);
1627141cc406Sopenharmony_ci	  dwGDarkLevel +=
1628141cc406Sopenharmony_ci	    (unsigned int) MustScanner_FiltLower (lpGDarkSort, wCalHeight, 20, 30);
1629141cc406Sopenharmony_ci	  dwBDarkLevel +=
1630141cc406Sopenharmony_ci	    (unsigned int) MustScanner_FiltLower (lpBDarkSort, wCalHeight, 20, 30);
1631141cc406Sopenharmony_ci	}
1632141cc406Sopenharmony_ci    }
1633141cc406Sopenharmony_ci
1634141cc406Sopenharmony_ci  if (g_XDpi == 1200)
1635141cc406Sopenharmony_ci    {
1636141cc406Sopenharmony_ci      dwRDarkLevel = (unsigned int) (dwRDarkLevel / (wCalWidth / 2));
1637141cc406Sopenharmony_ci      dwGDarkLevel = (unsigned int) (dwGDarkLevel / (wCalWidth / 2));
1638141cc406Sopenharmony_ci      dwBDarkLevel = (unsigned int) (dwBDarkLevel / (wCalWidth / 2));
1639141cc406Sopenharmony_ci      dwREvenDarkLevel = (unsigned int) (dwREvenDarkLevel / (wCalWidth / 2));
1640141cc406Sopenharmony_ci      dwGEvenDarkLevel = (unsigned int) (dwGEvenDarkLevel / (wCalWidth / 2));
1641141cc406Sopenharmony_ci      dwBEvenDarkLevel = (unsigned int) (dwBEvenDarkLevel / (wCalWidth / 2));
1642141cc406Sopenharmony_ci    }
1643141cc406Sopenharmony_ci  else
1644141cc406Sopenharmony_ci    {
1645141cc406Sopenharmony_ci      dwRDarkLevel = (unsigned int) (dwRDarkLevel / wCalWidth);
1646141cc406Sopenharmony_ci      dwGDarkLevel = (unsigned int) (dwGDarkLevel / wCalWidth);
1647141cc406Sopenharmony_ci      dwBDarkLevel = (unsigned int) (dwBDarkLevel / wCalWidth);
1648141cc406Sopenharmony_ci    }
1649141cc406Sopenharmony_ci
1650141cc406Sopenharmony_ci  /*Create white shading */
1651141cc406Sopenharmony_ci  for (i = 0; i < wCalWidth; i++)
1652141cc406Sopenharmony_ci    {
1653141cc406Sopenharmony_ci      wRWhiteLevel = 0;
1654141cc406Sopenharmony_ci      wGWhiteLevel = 0;
1655141cc406Sopenharmony_ci      wBWhiteLevel = 0;
1656141cc406Sopenharmony_ci
1657141cc406Sopenharmony_ci      for (j = 0; j < wCalHeight; j++)
1658141cc406Sopenharmony_ci	{
1659141cc406Sopenharmony_ci	  lpRWhiteSort[j] =
1660141cc406Sopenharmony_ci	    (unsigned short) (*(lpWhiteData + j * wCalWidth * 2 * 3 + i * 6 + 0));
1661141cc406Sopenharmony_ci	  lpRWhiteSort[j] +=
1662141cc406Sopenharmony_ci	    (unsigned short) (*(lpWhiteData + j * wCalWidth * 2 * 3 + i * 6 + 1) << 8);
1663141cc406Sopenharmony_ci
1664141cc406Sopenharmony_ci	  lpGWhiteSort[j] =
1665141cc406Sopenharmony_ci	    (unsigned short) (*(lpWhiteData + j * wCalWidth * 2 * 3 + i * 6 + 2));
1666141cc406Sopenharmony_ci	  lpGWhiteSort[j] +=
1667141cc406Sopenharmony_ci	    (unsigned short) (*(lpWhiteData + j * wCalWidth * 2 * 3 + i * 6 + 3) << 8);
1668141cc406Sopenharmony_ci
1669141cc406Sopenharmony_ci	  lpBWhiteSort[j] =
1670141cc406Sopenharmony_ci	    (unsigned short) (*(lpWhiteData + j * wCalWidth * 2 * 3 + i * 6 + 4));
1671141cc406Sopenharmony_ci	  lpBWhiteSort[j] +=
1672141cc406Sopenharmony_ci	    (unsigned short) (*(lpWhiteData + j * wCalWidth * 2 * 3 + i * 6 + 5) << 8);
1673141cc406Sopenharmony_ci	}
1674141cc406Sopenharmony_ci
1675141cc406Sopenharmony_ci      if (g_XDpi == 1200)
1676141cc406Sopenharmony_ci	{
1677141cc406Sopenharmony_ci	  if (i % 2)
1678141cc406Sopenharmony_ci	    {
1679141cc406Sopenharmony_ci	      *(lpDarkShading + i * 3 + 0) = (unsigned short) dwRDarkLevel;
1680141cc406Sopenharmony_ci	      *(lpDarkShading + i * 3 + 1) = (unsigned short) dwGDarkLevel;
1681141cc406Sopenharmony_ci	      *(lpDarkShading + i * 3 + 2) = (unsigned short) dwBDarkLevel;
1682141cc406Sopenharmony_ci	    }
1683141cc406Sopenharmony_ci	  else
1684141cc406Sopenharmony_ci	    {
1685141cc406Sopenharmony_ci	      *(lpDarkShading + i * 3 + 0) = (unsigned short) dwREvenDarkLevel;
1686141cc406Sopenharmony_ci	      *(lpDarkShading + i * 3 + 1) = (unsigned short) dwGEvenDarkLevel;
1687141cc406Sopenharmony_ci	      *(lpDarkShading + i * 3 + 2) = (unsigned short) dwBEvenDarkLevel;
1688141cc406Sopenharmony_ci	    }
1689141cc406Sopenharmony_ci	}
1690141cc406Sopenharmony_ci      else
1691141cc406Sopenharmony_ci	{
1692141cc406Sopenharmony_ci	  *(lpDarkShading + i * 3 + 0) = (unsigned short) dwRDarkLevel;
1693141cc406Sopenharmony_ci	  *(lpDarkShading + i * 3 + 1) = (unsigned short) dwGDarkLevel;
1694141cc406Sopenharmony_ci	  *(lpDarkShading + i * 3 + 2) = (unsigned short) dwBDarkLevel;
1695141cc406Sopenharmony_ci	}
1696141cc406Sopenharmony_ci
1697141cc406Sopenharmony_ci
1698141cc406Sopenharmony_ci      /*Create white shading */
1699141cc406Sopenharmony_ci      wRWhiteLevel =
1700141cc406Sopenharmony_ci	(double) (MustScanner_FiltLower (lpRWhiteSort, wCalHeight, 20, 30) -
1701141cc406Sopenharmony_ci		  *(lpDarkShading + i * 3 + 0));
1702141cc406Sopenharmony_ci      wGWhiteLevel =
1703141cc406Sopenharmony_ci	(double) (MustScanner_FiltLower (lpGWhiteSort, wCalHeight, 20, 30) -
1704141cc406Sopenharmony_ci		  *(lpDarkShading + i * 3 + 1));
1705141cc406Sopenharmony_ci      wBWhiteLevel =
1706141cc406Sopenharmony_ci	(double) (MustScanner_FiltLower (lpBWhiteSort, wCalHeight, 20, 30) -
1707141cc406Sopenharmony_ci		  *(lpDarkShading + i * 3 + 2));
1708141cc406Sopenharmony_ci
1709141cc406Sopenharmony_ci      if (wRWhiteLevel > 0)
1710141cc406Sopenharmony_ci	*(lpWhiteShading + i * 3 + 0) =
1711141cc406Sopenharmony_ci	  (unsigned short) (((float) 65535 / wRWhiteLevel * 0x2000));
1712141cc406Sopenharmony_ci      else
1713141cc406Sopenharmony_ci	*(lpWhiteShading + i * 3 + 0) = 0x2000;
1714141cc406Sopenharmony_ci
1715141cc406Sopenharmony_ci      if (wGWhiteLevel > 0)
1716141cc406Sopenharmony_ci	*(lpWhiteShading + i * 3 + 1) =
1717141cc406Sopenharmony_ci	  (unsigned short) (((float) 65535 / wGWhiteLevel * 0x2000));
1718141cc406Sopenharmony_ci      else
1719141cc406Sopenharmony_ci	*(lpWhiteShading + i * 3 + 1) = 0x2000;
1720141cc406Sopenharmony_ci
1721141cc406Sopenharmony_ci      if (wBWhiteLevel > 0)
1722141cc406Sopenharmony_ci	*(lpWhiteShading + i * 3 + 2) =
1723141cc406Sopenharmony_ci	  (unsigned short) (((float) 65535 / wBWhiteLevel * 0x2000));
1724141cc406Sopenharmony_ci      else
1725141cc406Sopenharmony_ci	*(lpWhiteShading + i * 3 + 2) = 0x2000;
1726141cc406Sopenharmony_ci    }
1727141cc406Sopenharmony_ci
1728141cc406Sopenharmony_ci  free (lpWhiteData);
1729141cc406Sopenharmony_ci  free (lpDarkData);
1730141cc406Sopenharmony_ci  free (lpRWhiteSort);
1731141cc406Sopenharmony_ci  free (lpGWhiteSort);
1732141cc406Sopenharmony_ci  free (lpBWhiteSort);
1733141cc406Sopenharmony_ci  free (lpRDarkSort);
1734141cc406Sopenharmony_ci  free (lpGDarkSort);
1735141cc406Sopenharmony_ci  free (lpBDarkSort);
1736141cc406Sopenharmony_ci
1737141cc406Sopenharmony_ci  Asic_SetShadingTable (&g_chip, lpWhiteShading, lpDarkShading, g_XDpi,
1738141cc406Sopenharmony_ci			wCalWidth, 0);
1739141cc406Sopenharmony_ci
1740141cc406Sopenharmony_ci  free (lpWhiteShading);
1741141cc406Sopenharmony_ci  free (lpDarkShading);
1742141cc406Sopenharmony_ci
1743141cc406Sopenharmony_ci  DBG (DBG_FUNC,
1744141cc406Sopenharmony_ci       "Reflective_LineCalibration16Bits: leave Reflective_LineCalibration16Bits\n");
1745141cc406Sopenharmony_ci  return TRUE;
1746141cc406Sopenharmony_ci}
1747141cc406Sopenharmony_ci
1748141cc406Sopenharmony_ci/**********************************************************************
1749141cc406Sopenharmony_ciAuthor: Jack             Date: 2005/05/14
1750141cc406Sopenharmony_ciRoutine Description:
1751141cc406Sopenharmony_ci	Prepare scan image
1752141cc406Sopenharmony_ciParameters:
1753141cc406Sopenharmony_ci	none
1754141cc406Sopenharmony_ciReturn value:
1755141cc406Sopenharmony_ci	if operation is success
1756141cc406Sopenharmony_ci	return TRUE
1757141cc406Sopenharmony_ci	else
1758141cc406Sopenharmony_ci	return FALSE
1759141cc406Sopenharmony_ci***********************************************************************/
1760141cc406Sopenharmony_cistatic SANE_Bool
1761141cc406Sopenharmony_ciReflective_PrepareScan ()
1762141cc406Sopenharmony_ci{
1763141cc406Sopenharmony_ci  g_wScanLinesPerBlock = g_dwBufferSize / g_BytesPerRow;
1764141cc406Sopenharmony_ci  g_wMaxScanLines = g_dwImageBufferSize / g_BytesPerRow;
1765141cc406Sopenharmony_ci  g_wMaxScanLines =
1766141cc406Sopenharmony_ci    (g_wMaxScanLines / g_wScanLinesPerBlock) * g_wScanLinesPerBlock;
1767141cc406Sopenharmony_ci
1768141cc406Sopenharmony_ci  g_isCanceled = FALSE;
1769141cc406Sopenharmony_ci
1770141cc406Sopenharmony_ci  g_dwScannedTotalLines = 0;
1771141cc406Sopenharmony_ci  g_wReadedLines = 0;
1772141cc406Sopenharmony_ci  g_wtheReadyLines = 0;
1773141cc406Sopenharmony_ci  g_wReadImageLines = 0;
1774141cc406Sopenharmony_ci
1775141cc406Sopenharmony_ci  g_wReadyShadingLine = 0;
1776141cc406Sopenharmony_ci  g_wStartShadingLinePos = 0;
1777141cc406Sopenharmony_ci
1778141cc406Sopenharmony_ci  switch (g_ScanMode)
1779141cc406Sopenharmony_ci    {
1780141cc406Sopenharmony_ci    case CM_RGB48:
1781141cc406Sopenharmony_ci      g_wtheReadyLines = g_wLineDistance * 2 + g_wPixelDistance;
1782141cc406Sopenharmony_ci      DBG (DBG_FUNC, "Reflective_PrepareScan:g_wtheReadyLines=%d\n",
1783141cc406Sopenharmony_ci	   g_wtheReadyLines);
1784141cc406Sopenharmony_ci
1785141cc406Sopenharmony_ci      DBG (DBG_FUNC,
1786141cc406Sopenharmony_ci	   "Reflective_PrepareScan:g_lpReadImageHead malloc %d Bytes\n",
1787141cc406Sopenharmony_ci	   g_dwImageBufferSize);
1788141cc406Sopenharmony_ci      g_lpReadImageHead = (SANE_Byte *) malloc (g_dwImageBufferSize);
1789141cc406Sopenharmony_ci      if (g_lpReadImageHead == NULL)
1790141cc406Sopenharmony_ci	{
1791141cc406Sopenharmony_ci	  DBG (DBG_FUNC,
1792141cc406Sopenharmony_ci	       "Reflective_PrepareScan: g_lpReadImageHead malloc error \n");
1793141cc406Sopenharmony_ci	  return FALSE;
1794141cc406Sopenharmony_ci	}
1795141cc406Sopenharmony_ci      break;
1796141cc406Sopenharmony_ci
1797141cc406Sopenharmony_ci    case CM_RGB24ext:
1798141cc406Sopenharmony_ci      g_wtheReadyLines = g_wLineDistance * 2 + g_wPixelDistance;
1799141cc406Sopenharmony_ci      DBG (DBG_FUNC, "Reflective_PrepareScan:g_wtheReadyLines=%d\n",
1800141cc406Sopenharmony_ci	   g_wtheReadyLines);
1801141cc406Sopenharmony_ci
1802141cc406Sopenharmony_ci      DBG (DBG_FUNC,
1803141cc406Sopenharmony_ci	   "Reflective_PrepareScan:g_lpReadImageHead malloc %d Bytes\n",
1804141cc406Sopenharmony_ci	   g_dwImageBufferSize);
1805141cc406Sopenharmony_ci      g_lpReadImageHead = (SANE_Byte *) malloc (g_dwImageBufferSize);
1806141cc406Sopenharmony_ci      if (g_lpReadImageHead == NULL)
1807141cc406Sopenharmony_ci	{
1808141cc406Sopenharmony_ci	  DBG (DBG_FUNC,
1809141cc406Sopenharmony_ci	       "Reflective_PrepareScan: g_lpReadImageHead malloc error \n");
1810141cc406Sopenharmony_ci	  return FALSE;
1811141cc406Sopenharmony_ci	}
1812141cc406Sopenharmony_ci      break;
1813141cc406Sopenharmony_ci    case CM_GRAY16ext:
1814141cc406Sopenharmony_ci      g_wtheReadyLines = g_wPixelDistance;
1815141cc406Sopenharmony_ci      DBG (DBG_FUNC, "Reflective_PrepareScan:g_wtheReadyLines=%d\n",
1816141cc406Sopenharmony_ci	   g_wtheReadyLines);
1817141cc406Sopenharmony_ci
1818141cc406Sopenharmony_ci      DBG (DBG_FUNC,
1819141cc406Sopenharmony_ci	   "Reflective_PrepareScan:g_lpReadImageHead malloc %d Bytes\n",
1820141cc406Sopenharmony_ci	   g_dwImageBufferSize);
1821141cc406Sopenharmony_ci      g_lpReadImageHead = (SANE_Byte *) malloc (g_dwImageBufferSize);
1822141cc406Sopenharmony_ci      if (g_lpReadImageHead == NULL)
1823141cc406Sopenharmony_ci	{
1824141cc406Sopenharmony_ci	  DBG (DBG_FUNC,
1825141cc406Sopenharmony_ci	       "Reflective_PrepareScan: g_lpReadImageHead malloc error \n");
1826141cc406Sopenharmony_ci	  return FALSE;
1827141cc406Sopenharmony_ci	}
1828141cc406Sopenharmony_ci      break;
1829141cc406Sopenharmony_ci    case CM_GRAY8ext:
1830141cc406Sopenharmony_ci      g_wtheReadyLines = g_wPixelDistance;
1831141cc406Sopenharmony_ci      DBG (DBG_FUNC, "Reflective_PrepareScan:g_wtheReadyLines=%d\n",
1832141cc406Sopenharmony_ci	   g_wtheReadyLines);
1833141cc406Sopenharmony_ci
1834141cc406Sopenharmony_ci      DBG (DBG_FUNC,
1835141cc406Sopenharmony_ci	   "Reflective_PrepareScan:g_lpReadImageHead malloc %d Bytes\n",
1836141cc406Sopenharmony_ci	   g_dwImageBufferSize);
1837141cc406Sopenharmony_ci      g_lpReadImageHead = (SANE_Byte *) malloc (g_dwImageBufferSize);
1838141cc406Sopenharmony_ci      if (g_lpReadImageHead == NULL)
1839141cc406Sopenharmony_ci	{
1840141cc406Sopenharmony_ci	  DBG (DBG_FUNC,
1841141cc406Sopenharmony_ci	       "Reflective_PrepareScan: g_lpReadImageHead malloc error \n");
1842141cc406Sopenharmony_ci	  return FALSE;
1843141cc406Sopenharmony_ci	}
1844141cc406Sopenharmony_ci      break;
1845141cc406Sopenharmony_ci    case CM_TEXT:
1846141cc406Sopenharmony_ci      g_wtheReadyLines = g_wPixelDistance;
1847141cc406Sopenharmony_ci      DBG (DBG_FUNC, "Reflective_PrepareScan:g_wtheReadyLines=%d\n",
1848141cc406Sopenharmony_ci	   g_wtheReadyLines);
1849141cc406Sopenharmony_ci
1850141cc406Sopenharmony_ci      DBG (DBG_FUNC,
1851141cc406Sopenharmony_ci	   "Reflective_PrepareScan:g_lpReadImageHead malloc %d Bytes\n",
1852141cc406Sopenharmony_ci	   g_dwImageBufferSize);
1853141cc406Sopenharmony_ci      g_lpReadImageHead = (SANE_Byte *) malloc (g_dwImageBufferSize);
1854141cc406Sopenharmony_ci      if (g_lpReadImageHead == NULL)
1855141cc406Sopenharmony_ci	{
1856141cc406Sopenharmony_ci	  DBG (DBG_FUNC,
1857141cc406Sopenharmony_ci	       "Reflective_PrepareScan: g_lpReadImageHead malloc error \n");
1858141cc406Sopenharmony_ci	  return FALSE;
1859141cc406Sopenharmony_ci	}
1860141cc406Sopenharmony_ci      break;
1861141cc406Sopenharmony_ci    default:
1862141cc406Sopenharmony_ci      break;
1863141cc406Sopenharmony_ci    }
1864141cc406Sopenharmony_ci
1865141cc406Sopenharmony_ci  Asic_ScanStart (&g_chip);
1866141cc406Sopenharmony_ci  return TRUE;
1867141cc406Sopenharmony_ci}
1868141cc406Sopenharmony_ci
1869141cc406Sopenharmony_ci/**********************************************************************
1870141cc406Sopenharmony_ciAuthor: Jack             Date: 2005/05/15
1871141cc406Sopenharmony_ciRoutine Description:
1872141cc406Sopenharmony_ci	Get the data of image
1873141cc406Sopenharmony_ciParameters:
1874141cc406Sopenharmony_ci	lpBlock: the data of image
1875141cc406Sopenharmony_ci	Rows: the rows of image
1876141cc406Sopenharmony_ci
1877141cc406Sopenharmony_ci	isOrderInvert: the RGB order
1878141cc406Sopenharmony_ciReturn value:
1879141cc406Sopenharmony_ci	if the operation is success
1880141cc406Sopenharmony_ci	return TRUE
1881141cc406Sopenharmony_ci	else
1882141cc406Sopenharmony_ci	return FALSE
1883141cc406Sopenharmony_ci***********************************************************************/
1884141cc406Sopenharmony_cistatic SANE_Bool
1885141cc406Sopenharmony_ciReflective_GetRows (SANE_Byte * lpBlock, unsigned short * Rows, SANE_Bool isOrderInvert)
1886141cc406Sopenharmony_ci{
1887141cc406Sopenharmony_ci  DBG (DBG_FUNC, "Reflective_GetRows: call in \n");
1888141cc406Sopenharmony_ci  if (!g_bOpened)
1889141cc406Sopenharmony_ci    {
1890141cc406Sopenharmony_ci      DBG (DBG_FUNC, "Reflective_GetRows: scanner not opened \n");
1891141cc406Sopenharmony_ci      return FALSE;
1892141cc406Sopenharmony_ci    }
1893141cc406Sopenharmony_ci  if (!g_bPrepared)
1894141cc406Sopenharmony_ci    {
1895141cc406Sopenharmony_ci      DBG (DBG_FUNC, "Reflective_GetRows: scanner not prepared \n");
1896141cc406Sopenharmony_ci      return FALSE;
1897141cc406Sopenharmony_ci    }
1898141cc406Sopenharmony_ci
1899141cc406Sopenharmony_ci  switch (g_ScanMode)
1900141cc406Sopenharmony_ci    {
1901141cc406Sopenharmony_ci    case CM_RGB48:
1902141cc406Sopenharmony_ci      if (g_XDpi == 1200)
1903141cc406Sopenharmony_ci	return MustScanner_GetRgb48BitLine1200DPI (lpBlock, isOrderInvert,
1904141cc406Sopenharmony_ci						   Rows);
1905141cc406Sopenharmony_ci      else
1906141cc406Sopenharmony_ci	return MustScanner_GetRgb48BitLine (lpBlock, isOrderInvert, Rows);
1907141cc406Sopenharmony_ci
1908141cc406Sopenharmony_ci    case CM_RGB24ext:
1909141cc406Sopenharmony_ci      if (g_XDpi == 1200)
1910141cc406Sopenharmony_ci	return MustScanner_GetRgb24BitLine1200DPI (lpBlock, isOrderInvert,
1911141cc406Sopenharmony_ci						   Rows);
1912141cc406Sopenharmony_ci      else
1913141cc406Sopenharmony_ci	return MustScanner_GetRgb24BitLine (lpBlock, isOrderInvert, Rows);
1914141cc406Sopenharmony_ci
1915141cc406Sopenharmony_ci    case CM_GRAY16ext:
1916141cc406Sopenharmony_ci      if (g_XDpi == 1200)
1917141cc406Sopenharmony_ci	return MustScanner_GetMono16BitLine1200DPI (lpBlock, isOrderInvert,
1918141cc406Sopenharmony_ci						    Rows);
1919141cc406Sopenharmony_ci      else
1920141cc406Sopenharmony_ci	return MustScanner_GetMono16BitLine (lpBlock, isOrderInvert, Rows);
1921141cc406Sopenharmony_ci
1922141cc406Sopenharmony_ci    case CM_GRAY8ext:
1923141cc406Sopenharmony_ci      if (g_XDpi == 1200)
1924141cc406Sopenharmony_ci	return MustScanner_GetMono8BitLine1200DPI (lpBlock, isOrderInvert,
1925141cc406Sopenharmony_ci						   Rows);
1926141cc406Sopenharmony_ci      else
1927141cc406Sopenharmony_ci	return MustScanner_GetMono8BitLine (lpBlock, isOrderInvert, Rows);
1928141cc406Sopenharmony_ci
1929141cc406Sopenharmony_ci    case CM_TEXT:
1930141cc406Sopenharmony_ci      if (g_XDpi == 1200)
1931141cc406Sopenharmony_ci	return MustScanner_GetMono1BitLine1200DPI (lpBlock, isOrderInvert,
1932141cc406Sopenharmony_ci						   Rows);
1933141cc406Sopenharmony_ci      else
1934141cc406Sopenharmony_ci	return MustScanner_GetMono1BitLine (lpBlock, isOrderInvert, Rows);
1935141cc406Sopenharmony_ci    default:
1936141cc406Sopenharmony_ci      return FALSE;
1937141cc406Sopenharmony_ci    }
1938141cc406Sopenharmony_ci
1939141cc406Sopenharmony_ci  DBG (DBG_FUNC, "Reflective_GetRows: leave Reflective_GetRows \n");
1940141cc406Sopenharmony_ci  return FALSE;
1941141cc406Sopenharmony_ci}				/* end of the file ScannerReflective.c */
1942