diff --git a/backend/mustek_usb2.c b/backend/mustek_usb2.c index 59e112f76..f300b46cc 100644 --- a/backend/mustek_usb2.c +++ b/backend/mustek_usb2.c @@ -764,16 +764,12 @@ sane_start (SANE_Handle handle) DBG (DBG_INFO, "sane_start: setpara.ssScanSource=%d\n", s->setpara.ssScanSource); - MustScanner_Reset (s->setpara.ssScanSource); + MustScanner_Reset (); /* adjust parameters to the scanner's requirements */ - if (!MustScanner_ScanSuggest (&s->setpara)) - { - DBG (DBG_ERR, "sane_start: MustScanner_ScanSuggest error\n"); - return SANE_STATUS_INVAL; - } + MustScanner_ScanSuggest (&s->setpara); - /* update the scan parameters returned by sane_get_parameters */ + /* update the scan parameters to be returned by sane_get_parameters */ s->params.pixels_per_line = s->setpara.wWidth; s->params.lines = s->setpara.wHeight; s->params.bytes_per_line = s->setpara.dwBytesPerRow; diff --git a/backend/mustek_usb2_high.c b/backend/mustek_usb2_high.c index 4d3b3bdd0..a9c646be8 100644 --- a/backend/mustek_usb2_high.c +++ b/backend/mustek_usb2_high.c @@ -1051,71 +1051,13 @@ MustScanner_GetRows (SANE_Byte * pBlock, unsigned short * Rows, isOrderInvert, fixEvenOdd); } -SANE_Bool +void MustScanner_ScanSuggest (TARGETIMAGE * pTarget) { unsigned short wMaxWidth, wMaxHeight; DBG (DBG_FUNC, "MustScanner_ScanSuggest: call in\n"); - if (!pTarget) - { - DBG (DBG_FUNC, "MustScanner_ScanSuggest: parameters error\n"); - return SANE_FALSE; - } - - g_wLineartThreshold = pTarget->wLineartThreshold; - - /* create gamma table */ - if ((pTarget->cmColorMode == CM_GRAY8) || - (pTarget->cmColorMode == CM_RGB24)) - { - unsigned short i; - SANE_Byte bGammaData; - - g_pGammaTable = malloc (sizeof (unsigned short) * 4096 * 3); - if (!g_pGammaTable) - { - DBG (DBG_ERR, "MustScanner_ScanSuggest: gamma table malloc fail\n"); - return SANE_FALSE; - } - - for (i = 0; i < 4096; i++) - { - bGammaData = (SANE_Byte) (pow ((double) i / 4095, 0.625) * 255); - g_pGammaTable[i] = bGammaData; - g_pGammaTable[i + 4096] = bGammaData; - g_pGammaTable[i + 8192] = bGammaData; - } - } - else if ((pTarget->cmColorMode == CM_GRAY16) || - (pTarget->cmColorMode == CM_RGB48)) - { - unsigned int i; - unsigned short wGammaData; - - g_pGammaTable = malloc (sizeof (unsigned short) * 65536 * 3); - if (!g_pGammaTable) - { - DBG (DBG_ERR, "MustScanner_ScanSuggest: gamma table malloc fail\n"); - return SANE_FALSE; - } - - for (i = 0; i < 65536; i++) - { - wGammaData = (unsigned short) - (pow ((double) i / 65535, 0.625) * 65535); - g_pGammaTable[i] = wGammaData; - g_pGammaTable[i + 65536] = wGammaData; - g_pGammaTable[i + 65536 * 2] = wGammaData; - } - } - else - { - DBG (DBG_INFO, "MustScanner_ScanSuggest: set g_pGammaTable to NULL\n"); - g_pGammaTable = NULL; - } - /* check width and height */ wMaxWidth = (MAX_SCANNING_WIDTH * pTarget->wDpi) / 300; wMaxHeight = (MAX_SCANNING_HEIGHT * pTarget->wDpi) / 300; @@ -1126,10 +1068,6 @@ MustScanner_ScanSuggest (TARGETIMAGE * pTarget) pTarget->wWidth = _MIN (pTarget->wWidth, wMaxWidth); pTarget->wHeight = _MIN (pTarget->wHeight, wMaxHeight); - g_Width = (pTarget->wWidth + 15) & ~15; /* real scan width */ - g_Height = pTarget->wHeight; - DBG (DBG_FUNC, "MustScanner_ScanSuggest: g_Width=%d\n", g_Width); - switch (pTarget->cmColorMode) { case CM_RGB48: @@ -1152,7 +1090,6 @@ MustScanner_ScanSuggest (TARGETIMAGE * pTarget) pTarget->dwBytesPerRow); DBG (DBG_FUNC, "MustScanner_ScanSuggest: leave MustScanner_ScanSuggest\n"); - return SANE_TRUE; } SANE_Bool @@ -1197,7 +1134,7 @@ MustScanner_StopScan (void) return result; } -SANE_Bool +static SANE_Bool MustScanner_PrepareScan (void) { DBG (DBG_FUNC, "MustScanner_PrepareScan: call in\n"); @@ -1245,7 +1182,7 @@ MustScanner_PrepareScan (void) } SANE_Bool -MustScanner_Reset (SCANSOURCE ssScanSource) +MustScanner_Reset (void) { DBG (DBG_FUNC, "MustScanner_Reset: call in\n"); @@ -1255,18 +1192,6 @@ MustScanner_Reset (SCANSOURCE ssScanSource) return SANE_FALSE; } - if (ssScanSource == SS_REFLECTIVE) - { - if (!MustScanner_PowerControl (SANE_TRUE, SANE_FALSE)) - return SANE_FALSE; - } - else - { - if (!MustScanner_PowerControl (SANE_FALSE, SANE_TRUE)) - return SANE_FALSE; - } - - g_ssScanSource = ssScanSource; g_dwTotalTotalXferLines = 0; g_bFirstReadImage = SANE_TRUE; g_bPrepared = SANE_TRUE; @@ -1753,9 +1678,8 @@ MustScanner_FindTopLeft (unsigned short * pwStartX, unsigned short * pwStartY) *pwStartY = 43; if (Asic_MotorMove (&g_chip, SANE_FALSE, - (wCalHeight - *pwStartY + - BEFORE_SCANNING_MOTOR_FORWARD_PIXEL) * SENSOR_DPI / - FIND_LEFT_TOP_CALIBRATE_RESOLUTION) != + (wCalHeight - *pwStartY + LINE_CALIBRATION_HEIGHT) * + SENSOR_DPI / FIND_LEFT_TOP_CALIBRATE_RESOLUTION) != SANE_STATUS_GOOD) goto error; } @@ -1834,27 +1758,15 @@ MustScanner_FiltLower (unsigned short * pSort, unsigned short TotalCount, static SANE_Bool MustScanner_LineCalibration16Bits (void) { - SANE_Byte * pWhiteData; - SANE_Byte * pDarkData; + SANE_Byte * pWhiteData, * pDarkData; unsigned int dwTotalSize; unsigned short wCalWidth, wCalHeight; - unsigned short * pWhiteShading; - unsigned short * pDarkShading; - double wRWhiteLevel; - double wGWhiteLevel; - double wBWhiteLevel; - unsigned int dwRDarkLevel = 0; - unsigned int dwGDarkLevel = 0; - unsigned int dwBDarkLevel = 0; - unsigned int dwREvenDarkLevel = 0; - unsigned int dwGEvenDarkLevel = 0; - unsigned int dwBEvenDarkLevel = 0; - unsigned short * pRWhiteSort; - unsigned short * pGWhiteSort; - unsigned short * pBWhiteSort; - unsigned short * pRDarkSort; - unsigned short * pGDarkSort; - unsigned short * pBDarkSort; + unsigned short * pWhiteShading, * pDarkShading; + double wRWhiteLevel, wGWhiteLevel, wBWhiteLevel; + unsigned int dwRDarkLevel = 0, dwGDarkLevel = 0, dwBDarkLevel = 0; + unsigned int dwREvenDarkLevel = 0, dwGEvenDarkLevel = 0, dwBEvenDarkLevel = 0; + unsigned short * pRWhiteSort, * pGWhiteSort, * pBWhiteSort; + unsigned short * pRDarkSort, * pGDarkSort, * pBDarkSort; int i, j; #ifdef DEBUG_SAVE_IMAGE FILE * stream; @@ -1870,7 +1782,7 @@ MustScanner_LineCalibration16Bits (void) } wCalWidth = g_Width; - wCalHeight = LINE_CALIBRATION__16BITS_HEIGHT; + wCalHeight = LINE_CALIBRATION_HEIGHT; dwTotalSize = wCalWidth * wCalHeight * 3 * 2; DBG (DBG_FUNC, "MustScanner_LineCalibration16Bits: wCalWidth = %d, " \ "wCalHeight = %d\n", wCalWidth, wCalHeight); @@ -2183,8 +2095,62 @@ MustScanner_SetupScan (TARGETIMAGE * pTarget) g_ScanMode = pTarget->cmColorMode; g_XDpi = pTarget->wDpi; g_YDpi = pTarget->wDpi; + g_Width = (pTarget->wWidth + 15) & ~15; /* real scan width */ + g_Height = pTarget->wHeight; g_SWWidth = pTarget->wWidth; g_SWHeight = pTarget->wHeight; + g_wLineartThreshold = pTarget->wLineartThreshold; + g_ssScanSource = pTarget->ssScanSource; + + /* create gamma table */ + if ((pTarget->cmColorMode == CM_GRAY8) || + (pTarget->cmColorMode == CM_RGB24)) + { + unsigned short i; + SANE_Byte bGammaData; + + g_pGammaTable = malloc (sizeof (unsigned short) * 4096 * 3); + if (!g_pGammaTable) + { + DBG (DBG_ERR, "MustScanner_ScanSuggest: gamma table malloc fail\n"); + return SANE_FALSE; + } + + for (i = 0; i < 4096; i++) + { + bGammaData = (SANE_Byte) (pow ((double) i / 4095, 0.625) * 255); + g_pGammaTable[i] = bGammaData; + g_pGammaTable[i + 4096] = bGammaData; + g_pGammaTable[i + 8192] = bGammaData; + } + } + else if ((pTarget->cmColorMode == CM_GRAY16) || + (pTarget->cmColorMode == CM_RGB48)) + { + unsigned int i; + unsigned short wGammaData; + + g_pGammaTable = malloc (sizeof (unsigned short) * 65536 * 3); + if (!g_pGammaTable) + { + DBG (DBG_ERR, "MustScanner_ScanSuggest: gamma table malloc fail\n"); + return SANE_FALSE; + } + + for (i = 0; i < 65536; i++) + { + wGammaData = (unsigned short) + (pow ((double) i / 65535, 0.625) * 65535); + g_pGammaTable[i] = wGammaData; + g_pGammaTable[i + 65536] = wGammaData; + g_pGammaTable[i + 65536 * 2] = wGammaData; + } + } + else + { + DBG (DBG_INFO, "MustScanner_ScanSuggest: set g_pGammaTable to NULL\n"); + g_pGammaTable = NULL; + } switch (g_YDpi) { @@ -2249,6 +2215,17 @@ MustScanner_SetupScan (TARGETIMAGE * pTarget) break; } + if (g_ssScanSource == SS_REFLECTIVE) + { + if (!MustScanner_PowerControl (SANE_TRUE, SANE_FALSE)) + return SANE_FALSE; + } + else + { + if (!MustScanner_PowerControl (SANE_FALSE, SANE_TRUE)) + return SANE_FALSE; + } + if (Asic_Open (&g_chip) != SANE_STATUS_GOOD) return SANE_FALSE; diff --git a/backend/mustek_usb2_high.h b/backend/mustek_usb2_high.h index ca9de7f86..cdfc4bec6 100644 --- a/backend/mustek_usb2_high.h +++ b/backend/mustek_usb2_high.h @@ -92,12 +92,7 @@ typedef struct #define TA_FIND_LEFT_TOP_WIDTH_IN_DIP 2668 #define TA_FIND_LEFT_TOP_HEIGHT_IN_DIP 300 -/* must be a multiple of 8 */ -#define LINE_CALIBRATION__16BITS_HEIGHT 40 - -/* the length from block bar to start calibration position */ -#define BEFORE_SCANNING_MOTOR_FORWARD_PIXEL 40 - +#define LINE_CALIBRATION_HEIGHT 40 #define TRAN_START_POS 4550 /* 300 dpi */ @@ -121,10 +116,9 @@ SANE_Bool MustScanner_GetKeyStatus (SANE_Byte * pKey); #endif SANE_Bool MustScanner_GetRows (SANE_Byte * pBlock, unsigned short * Rows, SANE_Bool isOrderInvert); -SANE_Bool MustScanner_ScanSuggest (TARGETIMAGE * pTarget); +void MustScanner_ScanSuggest (TARGETIMAGE * pTarget); SANE_Bool MustScanner_StopScan (void); -SANE_Bool MustScanner_PrepareScan (void); -SANE_Bool MustScanner_Reset (SCANSOURCE ssScanSource); +SANE_Bool MustScanner_Reset (void); SANE_Bool MustScanner_SetupScan (TARGETIMAGE * pTarget);