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