diff --git a/backend/plustek-usb.c b/backend/plustek-usb.c
index 4f6824109..d355e031a 100644
--- a/backend/plustek-usb.c
+++ b/backend/plustek-usb.c
@@ -7,7 +7,7 @@
* @brief The interface functions to the USB driver stuff.
*
* Based on sources acquired from Plustek Inc.
- * Copyright (C) 2001-2003 Gerhard Jaeger
+ * Copyright (C) 2001-2004 Gerhard Jaeger
*
* History:
* - 0.40 - starting version of the USB support
@@ -211,6 +211,16 @@ static void usb_initDev( pPlustek_Device dev, int idx, int handle, int vendor )
if( dev->adj.negShadingY >= 0 )
dev->usbDev.Caps.Negative.ShadingOriginY = dev->adj.negShadingY;
+ /* adjust the gamma settings... */
+ if( dev->adj.rgamma == 1.0 )
+ dev->adj.rgamma = dev->usbDev.HwSetting.gamma;
+ if( dev->adj.ggamma == 1.0 )
+ dev->adj.ggamma = dev->usbDev.HwSetting.gamma;
+ if( dev->adj.bgamma == 1.0 )
+ dev->adj.bgamma = dev->usbDev.HwSetting.gamma;
+ if( dev->adj.graygamma == 1.0 )
+ dev->adj.graygamma = dev->usbDev.HwSetting.gamma;
+
/* the following you normally get from the registry...
*/
bMaxITA = 0; /* Maximum integration time adjust */
@@ -641,7 +651,7 @@ static int usbDev_open( Plustek_Device *dev )
if( 0x400 == vendor ) {
if((dev->adj.mov < 0) || (dev->adj.mov > 1)) {
- DBG( _DBG_INFO, "BearPaw MOV ot of range: %d\n", dev->adj.mov );
+ DBG(_DBG_INFO, "BearPaw MOV out of range: %d\n", dev->adj.mov);
dev->adj.mov = 0;
}
sprintf( devStr, "%s-%d", dev->usbId, dev->adj.mov );
@@ -673,10 +683,10 @@ static int usbDev_open( Plustek_Device *dev )
*/
static int usbDev_close( Plustek_Device *dev )
{
- DBG( _DBG_INFO, "usbDev_close()\n" );
+ DBG( _DBG_INFO, "usbDev_close()\n" );
sanei_usb_close( dev->fd );
dev->fd = -1;
- return 0;
+ return 0;
}
/** convert the stuff
@@ -687,7 +697,7 @@ static int usbDev_getCaps( Plustek_Device *dev )
DBG( _DBG_INFO, "usbDev_getCaps()\n" );
- dev->caps.dwFlag = (SFLAG_SCANNERDEV + SFLAG_FLATBED + SFLAG_CUSTOM_GAMMA);
+ dev->caps.dwFlag = 0;
if(((DEVCAPSFLAG_Positive == scaps->wFlags) &&
(DEVCAPSFLAG_Negative == scaps->wFlags)) ||
@@ -697,7 +707,7 @@ static int usbDev_getCaps( Plustek_Device *dev )
dev->caps.wMaxExtentX = scaps->Normal.Size.x;
dev->caps.wMaxExtentY = scaps->Normal.Size.y;
- return 0;
+ return 0;
}
/** usbDev_getCropInfo
@@ -709,7 +719,7 @@ static int usbDev_getCropInfo( Plustek_Device *dev, pCropInfo ci )
DBG( _DBG_INFO, "usbDev_getCropInfo()\n" );
- _VAR_NOT_USED(dev);
+ _VAR_NOT_USED(dev);
usb_GetImageInfo( &ci->ImgDef, &size );
@@ -744,19 +754,19 @@ static int usbDev_setMap( Plustek_Device *dev, SANE_Word *map,
a_bMap[i] = (SANE_Byte)map[i];
a_bMap[length +i] = (SANE_Byte)map[i];
a_bMap[(length*2)+i] = (SANE_Byte)map[i];
- }
-
+ }
+
} else {
-
+
idx = 0;
if( channel == _MAP_GREEN )
idx = 1;
if( channel == _MAP_BLUE )
idx = 2;
-
+
for( i = 0; i < length; i++ ) {
a_bMap[(length * idx)+i] = (SANE_Byte)map[i];
- }
+ }
}
return 0;
diff --git a/backend/plustek-usb.h b/backend/plustek-usb.h
index d75b3b1cf..6cc79067a 100644
--- a/backend/plustek-usb.h
+++ b/backend/plustek-usb.h
@@ -7,7 +7,7 @@
* @brief Main defines for the USB devices.
*
* Based on sources acquired from Plustek Inc.
- * Copyright (C) 2001-2003 Gerhard Jaeger
+ * Copyright (C) 2001-2004 Gerhard Jaeger
*
* History:
* - 0.40 - starting version of the USB support
@@ -28,7 +28,8 @@
* - removed _WAF_FIX_GAIN and _WAF_FIX_OFS
* - added skipCoarseCalib to ScanDef
* - added additional defines for cis and epson-ccd sensor
- * - 0.47 - no changes
+ * - 0.47 - cleanup work
+ * - added gamma to struct HWDefault
* .
*
* This file is part of the SANE package.
@@ -368,26 +369,24 @@ typedef struct
*/
typedef struct HWDefault
{
- double dMaxMotorSpeed; /* Inches/second, max. scan speed */
- double dMaxMoveSpeed; /* Inches/second, max. move speed */
- double dIntegrationTimeLowLamp;
- double dIntegrationTimeHighLamp;
- u_short wMotorDpi; /* Full step DPI */
- u_short wDRAMSize; /* in KB */
- double dMinIntegrationTimeLowres;
- /* in ms. */
- double dMinIntegrationTimeHighres;
- /* in ms. */
- u_short wGreenPWMDutyCycleLow;
- u_short wGreenPWMDutyCycleHigh;
+ double dMaxMotorSpeed; /* Inches/second, max. scan speed */
+ double dMaxMoveSpeed; /* Inches/second, max. move speed */
+ double dIntegrationTimeLowLamp;
+ double dIntegrationTimeHighLamp;
+ u_short wMotorDpi; /* Full step DPI */
+ u_short wDRAMSize; /* in KB */
+ double dMinIntegrationTimeLowres; /*in ms. */
+ double dMinIntegrationTimeHighres; /* in ms. */
+ u_short wGreenPWMDutyCycleLow;
+ u_short wGreenPWMDutyCycleHigh;
/* Registers */
- u_char bSensorConfiguration; /* 0x0b */
+ u_char bSensorConfiguration; /* 0x0b */
/* Sensor control settings */
- u_char bReg_0x0c;
- u_char bReg_0x0d;
- u_char bReg_0x0e;
- u_char bReg_0x0f_Mono [10]; /* 0x0f to 0x18 */
- u_char bReg_0x0f_Color [10]; /* 0x0f to 0x18 */
+ u_char bReg_0x0c;
+ u_char bReg_0x0d;
+ u_char bReg_0x0e;
+ u_char bReg_0x0f_Mono [10]; /* 0x0f to 0x18 */
+ u_char bReg_0x0f_Color [10]; /* 0x0f to 0x18 */
/* color mode settings */
u_char bReg_0x26;
@@ -404,46 +403,46 @@ typedef struct HWDefault
* format, you have to pay your attention when you
* write this value to register.
*/
- u_short StepperPhaseCorrection;
+ u_short StepperPhaseCorrection;
/* Sensor Pixel Configuration
* Actually, the wActivePixelsStart will be set to 0 for shading purpose.
* We have to keep these values to adjust the origins when user does the
* scan. These settings are based on optic resolution.
*/
- u_char bOpticBlackStart; /* 0x1c */
- u_char bOpticBlackEnd; /* 0x1d */
- u_short wActivePixelsStart; /* 0x1e & 0x1f */
- u_short wLineEnd; /* 0x20 & 0x21 */
+ u_char bOpticBlackStart; /* 0x1c */
+ u_char bOpticBlackEnd; /* 0x1d */
+ u_short wActivePixelsStart; /* 0x1e & 0x1f */
+ u_short wLineEnd; /* 0x20 & 0x21 */
/* illumination settings (runtime) */
- u_short red_lamp_on; /* 0x2c & 0x2d */
- u_short red_lamp_off; /* 0x2e & 0x2f */
- u_short green_lamp_on; /* 0x30 & 0x31 */
- u_short green_lamp_off; /* 0x32 & 0x33 */
- u_short blue_lamp_on; /* 0x34 & 0x35 */
- u_short blue_lamp_off; /* 0x36 & 0x37 */
+ u_short red_lamp_on; /* 0x2c & 0x2d */
+ u_short red_lamp_off; /* 0x2e & 0x2f */
+ u_short green_lamp_on; /* 0x30 & 0x31 */
+ u_short green_lamp_off; /* 0x32 & 0x33 */
+ u_short blue_lamp_on; /* 0x34 & 0x35 */
+ u_short blue_lamp_off; /* 0x36 & 0x37 */
/* Misc */
- u_char bReg_0x45;
- u_short wStepsAfterPaperSensor2;/* 0x4c & 0x4d */
+ u_char bReg_0x45;
+ u_short wStepsAfterPaperSensor2;/* 0x4c & 0x4d */
u_char bStepsToReverse; /* 0x50 */
- u_char bReg_0x51;
- u_char bReg_0x54;
- u_char bReg_0x55;
- u_char bReg_0x56;
- u_char bReg_0x57;
- u_char bReg_0x58;
- u_char bReg_0x59;
- u_char bReg_0x5a;
- u_char bReg_0x5b;
- u_char bReg_0x5c;
- u_char bReg_0x5d;
- u_char bReg_0x5e;
+ u_char bReg_0x51;
+ u_char bReg_0x54;
+ u_char bReg_0x55;
+ u_char bReg_0x56;
+ u_char bReg_0x57;
+ u_char bReg_0x58;
+ u_char bReg_0x59;
+ u_char bReg_0x5a;
+ u_char bReg_0x5b;
+ u_char bReg_0x5c;
+ u_char bReg_0x5d;
+ u_char bReg_0x5e;
eChipDef chip; /* chiptype */
- eModelDef motorModel; /* to identify used motor */
-
+ eModelDef motorModel; /* to identify used motor */
+ double gamma; /* gamma setting */
} HWDef, *pHWDef;
/** device description during runtime
diff --git a/backend/plustek-usbcal.c b/backend/plustek-usbcal.c
index b2950f763..4098d7304 100644
--- a/backend/plustek-usbcal.c
+++ b/backend/plustek-usbcal.c
@@ -7,7 +7,7 @@
* @brief Calibration routines for CanoScan CIS devices.
*
* Based on sources acquired from Plustek Inc.
- * Copyright (C) 2001-2003 Gerhard Jaeger
+ * Copyright (C) 2001-2004 Gerhard Jaeger
* Large parts Copyright (C) 2003 Christopher Montgomery
*
* Montys' comment:
@@ -35,6 +35,8 @@
* - added the usage of the swGain and swOffset values, to allow
* tweaking the calibration results on a sensor base
* - 0.47 - moved usb_HostSwap() to plustek_usbhw.c
+ * - fixed problem in cano_AdjustLightsource(), so that it won't
+ * stop too early.
*
* This file is part of the SANE package.
*
@@ -164,9 +166,12 @@ static int cano_LampOnAfterCalibration( pPlustek_Device dev )
return 0;
}
-/** function to adjust the...
- * returns 0 if the value is fine, 1, if we need to adjust and 2 if we ran
- * against a limit...
+/** function to adjust the CIS lamp-off setting for a given channel.
+ * @param min - pointer to the ON point of the CIS-channel
+ * @param max - pointer to the max OFF point of the CIS-channel
+ * @param off - pointer to the current OFF point of the CIS-channel
+ * @param val - current value to check
+ * @return returns 0 if the value is fine, 1, if we need to adjust
*/
static int cano_adjLampSetting( u_short *min,
u_short *max, u_short *off, u_short val )
@@ -176,28 +181,31 @@ static int cano_adjLampSetting( u_short *min,
/* perfect value, no need to adjust
* val ¤ [53440..61440] is perfect
*/
- if((val < IDEAL_GainNormal) && (val > (IDEAL_GainNormal-8000)))
+ if((val < (IDEAL_GainNormal-6000)) && (val > (IDEAL_GainNormal-8000)))
return 0;
- if(val > (IDEAL_GainNormal-4000)) {
+ if(val > (IDEAL_GainNormal-6000)) {
- DBG(_DBG_INFO2, "TOO BRIGHT --> reduce\n" );
+ DBG(_DBG_INFO2, "* TOO BRIGHT --> reduce\n" );
*max = newoff;
*off = ((newoff + *min)>>1);
-
+
} else {
u_short bisect = (newoff + *max)>>1;
u_short twice = newoff*2;
- DBG(_DBG_INFO2, "TOO DARK --> up\n" );
+ DBG(_DBG_INFO2, "* TOO DARK --> up\n" );
*min = newoff;
*off = twice 0x3FFF ) {
- DBG( _DBG_INFO2, "lamp off limited (0x%04x --> 0x3FFF)\n", *off );
+ DBG( _DBG_INFO2, "* lamp off limited (0x%04x --> 0x3FFF)\n", *off);
*off = 0x3FFF;
- return 2;
+ return 0;
}
}
@@ -215,10 +223,11 @@ static int cano_adjLampSetting( u_short *min,
* where the lamp_off parameter is adjustable; I'd make it more general,
* but I only have the CIS hardware to test.
*/
-static int cano_AdjustLightsource( pPlustek_Device dev)
+static int cano_AdjustLightsource( pPlustek_Device dev )
{
char tmp[40];
- int i, adj, warmup_limit, limit;
+ int i;
+ int res_r, res_g, res_b;
u_long dw, dwR, dwG, dwB, dwDiv, dwLoop1, dwLoop2;
RGBUShortDef max_rgb, min_rgb, tmp_rgb;
@@ -254,11 +263,11 @@ static int cano_AdjustLightsource( pPlustek_Device dev)
300UL / scaps->OpticDpi.x);
m_ScanParam.bCalibration = PARAM_Gain;
- DBG( _DBG_INFO2, "Coarse Calibration Strip:\n" );
- DBG( _DBG_INFO2, "Lines = %lu\n", m_ScanParam.Size.dwLines );
- DBG( _DBG_INFO2, "Pixels = %lu\n", m_ScanParam.Size.dwPixels );
- DBG( _DBG_INFO2, "Bytes = %lu\n", m_ScanParam.Size.dwBytes );
- DBG( _DBG_INFO2, "Origin.X = %u\n", m_ScanParam.Origin.x );
+ DBG( _DBG_INFO2, "* Coarse Calibration Strip:\n" );
+ DBG( _DBG_INFO2, "* Lines = %lu\n", m_ScanParam.Size.dwLines );
+ DBG( _DBG_INFO2, "* Pixels = %lu\n", m_ScanParam.Size.dwPixels );
+ DBG( _DBG_INFO2, "* Bytes = %lu\n", m_ScanParam.Size.dwBytes );
+ DBG( _DBG_INFO2, "* Origin.X = %u\n", m_ScanParam.Origin.x );
max_rgb.Red = max_rgb.Green = max_rgb.Blue = 0xffff;
min_rgb.Red = hw->red_lamp_on;
@@ -273,14 +282,14 @@ static int cano_AdjustLightsource( pPlustek_Device dev)
}
if( !usb_ScanBegin( dev, SANE_FALSE) ||
- !usb_ScanReadImage( dev, pScanBuffer, m_ScanParam.Size.dwPhyBytes ) ||
+ !usb_ScanReadImage( dev,pScanBuffer,m_ScanParam.Size.dwPhyBytes ) ||
!usb_ScanEnd( dev )) {
- DBG( _DBG_ERROR, "cano_AdjustLightsource() failed\n" );
+ DBG( _DBG_ERROR, "* cano_AdjustLightsource() failed\n" );
return SANE_FALSE;
}
- DBG( _DBG_INFO2, "PhyBytes = %lu\n", m_ScanParam.Size.dwPhyBytes );
- DBG( _DBG_INFO2, "PhyPixels = %lu\n", m_ScanParam.Size.dwPhyPixels );
+ DBG( _DBG_INFO2, "* PhyBytes = %lu\n", m_ScanParam.Size.dwPhyBytes );
+ DBG( _DBG_INFO2, "* PhyPixels = %lu\n", m_ScanParam.Size.dwPhyPixels);
sprintf( tmp, "coarse-lamp-%u.raw", i );
@@ -297,7 +306,6 @@ static int cano_AdjustLightsource( pPlustek_Device dev)
dwDiv = 10;
dwLoop1 = m_ScanParam.Size.dwPhyPixels/dwDiv;
- adj = 0;
tmp_rgb.Red = tmp_rgb.Green = tmp_rgb.Blue = 0;
@@ -352,66 +360,57 @@ static int cano_AdjustLightsource( pPlustek_Device dev)
DBG(_DBG_INFO2, "CUR(R,G,B)= 0x%04x(%u), 0x%04x(%u), 0x%04x(%u)\n",
tmp_rgb.Red, tmp_rgb.Red, tmp_rgb.Green,
tmp_rgb.Green, tmp_rgb.Blue, tmp_rgb.Blue );
+ res_r = 0;
+ res_g = 0;
+ res_b = 0;
/* bisect */
- adj = 0;
- warmup_limit = 2;
- limit = 2;
-
if( m_ScanParam.bDataType == SCANDATATYPE_Color ) {
- adj += cano_adjLampSetting( &min_rgb.Red, &max_rgb.Red,
+ res_r = cano_adjLampSetting( &min_rgb.Red, &max_rgb.Red,
&hw->red_lamp_off, tmp_rgb.Red );
- adj += cano_adjLampSetting( &min_rgb.Blue, &max_rgb.Blue,
+ res_b = cano_adjLampSetting( &min_rgb.Blue, &max_rgb.Blue,
&hw->blue_lamp_off,tmp_rgb.Blue );
- warmup_limit = 6;
- limit = 10;
}
- adj += cano_adjLampSetting( &min_rgb.Green, &max_rgb.Green,
+ res_g = cano_adjLampSetting( &min_rgb.Green, &max_rgb.Green,
&hw->green_lamp_off, tmp_rgb.Green );
- if( 0 == adj )
+
+ /* nothing adjusted, so stop here */
+ if((res_r == 0) && (res_g == 0) && (res_b == 0))
break;
- /* it might be, that we need some warmup, if every adjustment
- * rans agaist the limit (cano_adjLampSetting returns 2!
- * allow at least 10 loops... */
- if( adj == warmup_limit ) {
- if( i >= limit ) {
- DBG(_DBG_INFO, "10 times limit reached, still too dark!!!\n" );
- break;
- } else {
- DBG(_DBG_INFO2, "CIS-Warmup, 1s!!!\n" );
- sleep( 1 );
- }
+ /* now decide what to do:
+ * if we were too bright, we have to rerun the loop in any
+ * case
+ * if we're too dark, we should rerun it too, but we can
+ * compensate that using higher gain values later
+ */
+ if( i >= 10 ) {
+ DBG(_DBG_INFO, "* 10 times limit reached, still too dark!!!\n");
+ break;
} else {
-
- /* not all channels ran against the limit... */
- if((adj % 2) == 0 ) {
- DBG( _DBG_INFO2,
- "Still %u channel(s) too dark, but proceeding\n", adj/2 );
- break;
- }
+ DBG(_DBG_INFO2, "* CIS-Warmup, 1s!!!\n" );
+ sleep( 1 );
}
-
+
usb_AdjustLamps(dev);
}
- DBG( _DBG_INFO2, "red_lamp_on = %u\n", hw->red_lamp_on );
- DBG( _DBG_INFO2, "red_lamp_off = %u\n", hw->red_lamp_off );
- DBG( _DBG_INFO2, "green_lamp_on = %u\n", hw->green_lamp_on );
- DBG( _DBG_INFO2, "green_lamp_off = %u\n", hw->green_lamp_off );
- DBG( _DBG_INFO2, "blue_lamp_on = %u\n", hw->blue_lamp_on );
- DBG( _DBG_INFO2, "blue_lamp_off = %u\n", hw->blue_lamp_off );
+ DBG( _DBG_INFO2, "* red_lamp_on = %u\n", hw->red_lamp_on );
+ DBG( _DBG_INFO2, "* red_lamp_off = %u\n", hw->red_lamp_off );
+ DBG( _DBG_INFO2, "* green_lamp_on = %u\n", hw->green_lamp_on );
+ DBG( _DBG_INFO2, "* green_lamp_off = %u\n", hw->green_lamp_off );
+ DBG( _DBG_INFO2, "* blue_lamp_on = %u\n", hw->blue_lamp_on );
+ DBG( _DBG_INFO2, "* blue_lamp_off = %u\n", hw->blue_lamp_off );
DBG( _DBG_INFO2, "cano_AdjustLightsource() done.\n" );
-
return SANE_TRUE;
}
/**
*/
-static int cano_adjGainSetting( u_char *min, u_char *max,
- u_char *gain,u_long val )
+static int
+cano_adjGainSetting( u_char *min, u_char *max, u_char *gain,u_long val )
{
u_long newgain = *gain;
@@ -595,17 +594,17 @@ static int cano_GetNewOffset( u_long *val, int channel, signed char *low,
signed char *now, signed char *high )
{
/* if we're too black, we're likely off the low end */
- if(val[channel]<=16) {
- low[channel]=now[channel];
- now[channel]=(now[channel]+high[channel])/2;
+ if( val[channel] <= 16 ) {
+ low[channel] = now[channel];
+ now[channel] = (now[channel]+high[channel])/2;
a_bRegs[0x38+channel]= (now[channel]&0x3f);
- if(low[channel]+1>=high[channel])
+ if( low[channel]+1 >= high[channel] )
return 0;
return 1;
- } else if (val[channel]>=2048) {
+ } else if ( val[channel]>=2048 ) {
high[channel]=now[channel];
now[channel]=(now[channel]+low[channel])/2;
@@ -793,7 +792,7 @@ static SANE_Bool cano_AdjustDarkShading( pPlustek_Device dev )
pHWDef hw = &dev->usbDev.HwSetting;
u_short *bufp;
unsigned int i, j;
- int step, stepW;
+ int step, stepW, val;
u_long red, green, blue, gray;
DBG( _DBG_INFO2, "cano_AdjustDarkShading()\n" );
@@ -802,9 +801,11 @@ static SANE_Bool cano_AdjustDarkShading( pPlustek_Device dev )
m_ScanParam = scanning->sParam;
+#if 0
if( m_ScanParam.PhyDpi.x > 75)
m_ScanParam.Size.dwLines = 64;
else
+#endif
m_ScanParam.Size.dwLines = 32;
m_ScanParam.Origin.y = 0;
@@ -867,9 +868,26 @@ static SANE_Bool cano_AdjustDarkShading( pPlustek_Device dev )
}
}
- a_wDarkShading[i] = red/m_ScanParam.Size.dwPhyLines + pParam->swOffset[0];
- a_wDarkShading[i+stepW] = green/m_ScanParam.Size.dwPhyLines + pParam->swOffset[1];
- a_wDarkShading[i+stepW*2] = blue/m_ScanParam.Size.dwPhyLines + pParam->swOffset[2];
+ val = ((int)(red/m_ScanParam.Size.dwPhyLines) + pParam->swOffset[0]);
+ if( val < 0 ) {
+ DBG( _DBG_INFO, "val < 0!!!!\n" );
+ val = 0;
+ }
+ a_wDarkShading[i] = (u_short)val;
+
+ val = ((int)(green/m_ScanParam.Size.dwPhyLines) + pParam->swOffset[1]);
+ if( val < 0 ) {
+ DBG( _DBG_INFO, "val < 0!!!!\n" );
+ val = 0;
+ }
+ a_wDarkShading[i+stepW] = (u_short)val;
+
+ val = ((int)(blue/m_ScanParam.Size.dwPhyLines) + pParam->swOffset[2]);
+ if( val < 0 ) {
+ DBG( _DBG_INFO, "val < 0!!!!\n" );
+ val = 0;
+ }
+ a_wDarkShading[i+stepW*2] = (u_short)val;
}
if(usb_HostSwap())
@@ -891,10 +909,10 @@ static SANE_Bool cano_AdjustDarkShading( pPlustek_Device dev )
if(usb_HostSwap())
usb_Swap(a_wDarkShading, m_ScanParam.Size.dwPhyPixels * 2 );
- memcpy( a_wDarkShading+ m_ScanParam.Size.dwPhyPixels * 2,
- a_wDarkShading, m_ScanParam.Size.dwPhyPixels * 2);
- memcpy(a_wDarkShading+ m_ScanParam.Size.dwPhyPixels * 4,
- a_wDarkShading, m_ScanParam.Size.dwPhyPixels * 2);
+ memcpy( a_wDarkShading + m_ScanParam.Size.dwPhyPixels * 2,
+ a_wDarkShading, m_ScanParam.Size.dwPhyPixels * 2);
+ memcpy( a_wDarkShading + m_ScanParam.Size.dwPhyPixels * 4,
+ a_wDarkShading, m_ScanParam.Size.dwPhyPixels * 2);
}
DBG( _DBG_INFO2, "cano_AdjustDarkShading() done\n" );
@@ -922,9 +940,11 @@ static SANE_Bool cano_AdjustWhiteShading( pPlustek_Device dev )
return SANE_FALSE;
m_ScanParam = scanning->sParam;
+#if 0
if( m_ScanParam.PhyDpi.x > 75)
m_ScanParam.Size.dwLines = 64;
else
+#endif
m_ScanParam.Size.dwLines = 32;
m_ScanParam.Origin.y = 0;
diff --git a/backend/plustek-usbcalfile.c b/backend/plustek-usbcalfile.c
index 51a7218c4..0463f9e36 100644
--- a/backend/plustek-usbcalfile.c
+++ b/backend/plustek-usbcalfile.c
@@ -6,7 +6,7 @@
/** @file plustek-usbcalfile.c
* @brief Functions for saving/restoring calibration settings
*
- * Copyright (C) 2001-2003 Gerhard Jaeger
+ * Copyright (C) 2001-2004 Gerhard Jaeger
*
* History:
* - 0.46 - first version
diff --git a/backend/plustek-usbdevs.c b/backend/plustek-usbdevs.c
index 1a0e79e12..8bcb32bf2 100644
--- a/backend/plustek-usbdevs.c
+++ b/backend/plustek-usbdevs.c
@@ -7,7 +7,7 @@
* @brief Here we have our USB device definitions.
*
* Based on sources acquired from Plustek Inc.
- * Copyright (C) 2001-2003 Gerhard Jaeger
+ * Copyright (C) 2001-2004 Gerhard Jaeger
*
* History:
* - 0.40 - starting version of the USB support
@@ -643,17 +643,17 @@ static DCapsDef Cap0x04A9_0x2207 =
*/
static DCapsDef Cap0x04A9_0x220D =
{
- {{ 0, 110}, 35, 10, {2550, 3508}, {75, 75}, COLOR_GRAY16 },
- {{ 0, 0}, 0, 0, {0, 0}, { 0, 0 }, 0 },
- {{ 0, 0}, 0, 0, {0, 0}, { 0, 0 }, 0 },
- {{ 0, 0}, 0, 0, {0, 0}, { 0, 0 }, 0 },
- {600, 600},
- 0,
- SENSORORDER_rgb,
- 8, /* sensor distance */
- 3, /* number of buttons */
- kCIS670,
- 0, /* not used here... */
+ {{ 0, 110}, 35, 10, {2550, 3508}, {75, 75}, COLOR_GRAY16 },
+ {{ 0, 0}, 0, 0, {0, 0}, { 0, 0 }, 0 },
+ {{ 0, 0}, 0, 0, {0, 0}, { 0, 0 }, 0 },
+ {{ 0, 0}, 0, 0, {0, 0}, { 0, 0 }, 0 },
+ {600, 600},
+ 0,
+ SENSORORDER_rgb,
+ 8, /* sensor distance */
+ 3, /* number of buttons */
+ kCIS670,
+ 0, /* not used here... */
_WAF_MISC_IO_LAMPS | _WAF_BLACKFINE, _NO_MIO
};
@@ -739,7 +739,8 @@ static HWDef Hw0x07B3_0x0017_0 =
0, /* bReg_0x5d */
0, /* bReg_0x5e */
_LM9832, /* chip type */
- MODEL_KaoHsiung /* motorModel */
+ MODEL_KaoHsiung,/* motorModel */
+ 1.0
};
/** Genius ColorPage-HR6 V2 and ColorPage-HR6X
@@ -783,7 +784,8 @@ static HWDef Hw0x07B3_0x0007_0 =
0x0d, 0x88, 0x28, 0x3b,
0, 0, 0,
_LM9832,
- MODEL_HuaLien
+ MODEL_HuaLien,
+ 1.0
};
/** unknown
@@ -827,7 +829,8 @@ static HWDef Hw0x07B3_0x0007_2 =
0x0d, 0x88, 0x28, 0x3b,
0, 0, 0,
_LM9832,
- MODEL_Tokyo600
+ MODEL_Tokyo600,
+ 1.0
};
/** Genius ColorPage-HR7 and ColorPage-HR7LE
@@ -871,7 +874,8 @@ static HWDef Hw0x07B3_0x0007_4 =
0x0d, 0x88, 0x28, 0x3b,
0, 0, 0,
_LM9832,
- MODEL_HuaLien
+ MODEL_HuaLien,
+ 1.0
};
/** Genius ColorPage-HR6A
@@ -915,7 +919,8 @@ static HWDef Hw0x07B3_0x000F_0 =
0x05, 0x88, 0x08, 0x3b,
0, 0, 0,
_LM9832,
- MODEL_HuaLien
+ MODEL_HuaLien,
+ 1.0
};
/** U12 and U24
@@ -959,7 +964,8 @@ static HWDef Hw0x07B3_0x0013_0 =
0x0d, 0x22, 0x82, 0x88,
0, 0, 0,
_LM9831,
- MODEL_KaoHsiung
+ MODEL_KaoHsiung,
+ 1.0
};
/** unknown
@@ -1003,7 +1009,8 @@ static HWDef Hw0x07B3_0x0013_4 =
0x0d, 0x22, 0x82, 0x88,
0, 0, 0,
_LM9831,
- MODEL_KaoHsiung
+ MODEL_KaoHsiung,
+ 1.0
};
/** unknown
@@ -1047,7 +1054,8 @@ static HWDef Hw0x07B3_0x000F_4 =
0x05, 0x88, 0x08, 0x3b,
0, 0, 0,
_LM9832,
- MODEL_HuaLien
+ MODEL_HuaLien,
+ 1.0
};
/** unknown
@@ -1091,7 +1099,8 @@ static HWDef Hw0x07B3_0x0016_4 =
0x0d, 0x22, 0x82, 0x88,
0, 0, 0,
_LM9832,
- MODEL_KaoHsiung
+ MODEL_KaoHsiung,
+ 1.0
};
/** Plustek OpticPro UT24 and others...
@@ -1135,7 +1144,8 @@ static HWDef Hw0x07B3_0x0017_4 =
0x0d, 0x22, 0x82, 0x88,
0, 0, 0,
_LM9832,
- MODEL_KaoHsiung
+ MODEL_KaoHsiung,
+ 1.0
};
/** unknown
@@ -1179,7 +1189,8 @@ static HWDef Hw0x07B3_0x0017_1 =
0x0d, 0x22, 0x82, 0x88,
0, 0, 0,
_LM9832,
- MODEL_KaoHsiung
+ MODEL_KaoHsiung,
+ 1.0
};
/** unknown
@@ -1223,7 +1234,8 @@ static HWDef Hw0x07B3_0x0012_0 =
0x0d, 0x22, 0x82, 0x88,
0, 0, 0,
_LM9832,
- MODEL_KaoHsiung
+ MODEL_KaoHsiung,
+ 1.0
};
/** unknown
@@ -1267,7 +1279,8 @@ static HWDef Hw0x07B3_0x0017_2 =
0x0d, 0x22, 0x82, 0x88,
0, 0, 0,
_LM9832,
- MODEL_KaoHsiung
+ MODEL_KaoHsiung,
+ 1.0
};
/** unknown
@@ -1311,7 +1324,8 @@ static HWDef Hw0x07B3_0x0017_3 =
0x0d, 0x22, 0x82, 0x88,
0, 0, 0,
_LM9832,
- MODEL_KaoHsiung
+ MODEL_KaoHsiung,
+ 1.0
};
/** HP Scanjet 2100C
@@ -1378,7 +1392,8 @@ static HWDef Hw0x03F0_0x0505 =
0, /* bReg_0x5d */
0, /* bReg_0x5e */
_LM9831, /* chiptype */
- MODEL_HP /* motorModel */
+ MODEL_HP, /* motorModel */
+ 1.0
};
/** HP Scanjet 2200C */
@@ -1444,7 +1459,8 @@ static HWDef Hw0x03F0_0x0605 =
0, /* bReg_0x5d */
0, /* bReg_0x5e */
_LM9832, /* chiptype */
- MODEL_HP /* motorModel */
+ MODEL_HP, /* motorModel */
+ 1.0
};
/** Mustek BearPaw 1200 */
@@ -1501,7 +1517,8 @@ static HWDef Hw0x0400_0x1000_0 =
0, /* ok test mode ADC Output CODE LSB (reg 0x5d) */
0, /* ok test mode (reg 0x5e) */
_LM9831,
- MODEL_MUSTEK600
+ MODEL_MUSTEK600,
+ 1.0
};
/** Mustek BearPaw 1200 (LM9832) */
@@ -1558,7 +1575,8 @@ static HWDef Hw0x0400_0x1001_1 =
0, /* ok test mode ADC Output CODE LSB (reg 0x5d) */
0, /* ok test mode (reg 0x5e) */
_LM9832,
- MODEL_MUSTEK600
+ MODEL_MUSTEK600,
+ 1.0
};
/** BearPaw 2400 */
@@ -1620,7 +1638,8 @@ static HWDef Hw0x0400_0x1001_0 =
0x46, /* misc I/O 0x5b */
0, 0, 0,/* test registers, set to 0 (0x5c, 0x5d, 0x5e) */
_LM9832,
- MODEL_MUSTEK1200
+ MODEL_MUSTEK1200,
+ 1.0
};
/** EPSON Perfection/Photo 1250 */
@@ -1684,7 +1703,8 @@ static HWDef Hw0x04B8_0x010F =
0, /* ok test mode ADC Output CODE LSB (reg 0x5d) */
0, /* ok test mode (reg 0x5e) */
_LM9832,
- MODEL_EPSON
+ MODEL_EPSON,
+ 1.0
};
/** EPSON Perfection/Photo 1260 */
@@ -1748,7 +1768,8 @@ static HWDef Hw0x04B8_0x011D =
0, /* ok test mode ADC Output CODE LSB (reg 0x5d) */
0, /* ok test mode (reg 0x5e) */
_LM9832,
- MODEL_EPSON
+ MODEL_EPSON,
+ 1.0
};
/** Umax 3400/3450 */
@@ -1813,7 +1834,8 @@ static HWDef Hw0x1606_0x0060 =
0, /* test mode ADC Output CODE LSB (reg 0x5d) */
0, /* test mode (reg 0x5e) */
_LM9832, /* might be LM9831 on UMAX 3450! */
- MODEL_UMAX
+ MODEL_UMAX,
+ 1.0
};
/** Umax 5400 */
@@ -1878,7 +1900,8 @@ static HWDef Hw0x1606_0x0160 =
0, /* test mode ADC Output CODE LSB (reg 0x5d) */
0, /* test mode (reg 0x5e) */
_LM9832,
- MODEL_UMAX1200
+ MODEL_UMAX1200,
+ 1.0
};
/** Canon 650/656 */
@@ -1945,7 +1968,8 @@ static HWDef Hw0x04A9_0x2206 =
0, /* test mode ADC Output CODE LSB (reg 0x5d) */
0, /* test mode (reg 0x5e) */
_LM9832,
- MODEL_CANON600
+ MODEL_CANON600,
+ 2.0
};
/** Canon N1220U */
@@ -2011,7 +2035,8 @@ static HWDef Hw0x04A9_0x2207 =
0, /* test mode ADC Output CODE LSB (reg 0x5d) */
0, /* test mode (reg 0x5e) */
_LM9832,
- MODEL_CANON1200
+ MODEL_CANON1200,
+ 2.0
};
/** Canon 670/676/LiDE20 */
@@ -2078,7 +2103,8 @@ static HWDef Hw0x04A9_0x220D =
0, /* test mode ADC Output CODE LSB (reg 0x5d) */
0, /* test mode (reg 0x5e) */
_LM9833,
- MODEL_CANON600
+ MODEL_CANON600,
+ 2.0
};
/** Canon N1240U */
@@ -2145,7 +2171,8 @@ static HWDef Hw0x04A9_0x220E =
0, /* test mode ADC Output CODE LSB (reg 0x5d) */
0, /* test mode (reg 0x5e) */
_LM9833,
- MODEL_CANON1200
+ MODEL_CANON1200,
+ 2.0
};
/******************** all available combinations *****************************/
diff --git a/backend/plustek-usbhw.c b/backend/plustek-usbhw.c
index 0447a21a0..b832d7ca0 100644
--- a/backend/plustek-usbhw.c
+++ b/backend/plustek-usbhw.c
@@ -7,7 +7,7 @@
* @brief Functions to control the scanner hardware.
*
* Based on sources acquired from Plustek Inc.
- * Copyright (C) 2001-2003 Gerhard Jaeger
+ * Copyright (C) 2001-2004 Gerhard Jaeger
*
* History:
* - 0.40 - starting version of the USB support
diff --git a/backend/plustek-usbimg.c b/backend/plustek-usbimg.c
index 2ccf891ff..1dc375004 100644
--- a/backend/plustek-usbimg.c
+++ b/backend/plustek-usbimg.c
@@ -7,7 +7,7 @@
* @brief Image processing functions for copying and scaling image lines.
*
* Based on sources acquired from Plustek Inc.
- * Copyright (C) 2001-2003 Gerhard Jaeger
+ * Copyright (C) 2001-2004 Gerhard Jaeger
*
* History:
* - 0.40 - starting version of the USB support
diff --git a/backend/plustek-usbio.c b/backend/plustek-usbio.c
index 444f0e008..198e7801f 100644
--- a/backend/plustek-usbio.c
+++ b/backend/plustek-usbio.c
@@ -7,7 +7,7 @@
* @brief Some I/O stuff.
*
* Based on sources acquired from Plustek Inc.
- * Copyright (C) 2001-2003 Gerhard Jaeger
+ * Copyright (C) 2001-2004 Gerhard Jaeger
*
* History:
* History:
diff --git a/backend/plustek-usbmap.c b/backend/plustek-usbmap.c
index fa46deb6f..937467aff 100644
--- a/backend/plustek-usbmap.c
+++ b/backend/plustek-usbmap.c
@@ -7,7 +7,7 @@
* @brief Creating and manipulating lookup tables.
*
* Based on sources acquired from Plustek Inc.
- * Copyright (C) 2001-2003 Gerhard Jaeger
+ * Copyright (C) 2001-2004 Gerhard Jaeger
*
* History:
* - 0.40 - starting version of the USB support
@@ -17,7 +17,7 @@
* - 0.44 - map inversion for negatatives now only upon user request
* - 0.45 - no changes
* - 0.46 - no changes
- * - 0.47 - no changes
+ * - 0.47 - cleanup work
* .
*
* This file is part of the SANE package.
@@ -64,8 +64,7 @@
static SANE_Byte a_bMap[_MAP_SIZE * 3];
-/*.............................................................................
- * adjust acording to brightness and contrast
+/** adjust acording to brightness and contrast
*/
static void usb_MapAdjust( pPlustek_Device dev )
{
@@ -74,25 +73,23 @@ static void usb_MapAdjust( pPlustek_Device dev )
tabLen = _MAP_SIZE;
- /*
- * adjust brightness (b) and contrast (c) using the function:
+ /* adjust brightness (b) and contrast (c) using the function:
*
* s(x,y) = (s(x,y) + b) * c
* b = [-127, 127]
* c = [0,2]
*/
-
- /*
- * scale brightness and contrast...
- */
b = ((double)dev->scanning.sParam.brightness * 192.0)/100.0;
c = ((double)dev->scanning.sParam.contrast + 100.0)/100.0;
- DBG( _DBG_INFO, "brightness = %i -> %i\n",
- dev->scanning.sParam.brightness, (u_char)b);
- DBG( _DBG_INFO, "contrast*100 = %i -> %i\n",
- dev->scanning.sParam.contrast, (int)(c*100));
+ DBG( _DBG_INFO, "* brightness = %i -> %i\n",
+ dev->scanning.sParam.brightness, (u_char)b);
+ DBG( _DBG_INFO, "* contrast = %i -> %.3f\n",
+ dev->scanning.sParam.contrast, c);
+ if( dev->scanning.sParam.brightness == 0 && dev->scanning.sParam.contrast )
+ return;
+
for( i = 0; i < tabLen; i++ ) {
tmp = ((double)(a_bMap[i] + b)) * c;
@@ -112,17 +109,16 @@ static void usb_MapAdjust( pPlustek_Device dev )
}
}
-/*.............................................................................
- *
+/**
*/
static SANE_Bool usb_MapDownload( pPlustek_Device dev, u_char bDataType )
{
- pScanDef scanning = &dev->scanning;
+ pScanDef scanning = &dev->scanning;
pDCapsDef sc = &dev->usbDev.Caps;
- int color, maxColor; /* loop counters */
+ int color, maxColor;
int i, iThreshold;
- SANE_Byte value; /* value transmitted to port */
+ SANE_Byte value;
SANE_Bool fInverse = 0;
DBG( _DBG_INFO, "usb_MapDownload()\n" );
@@ -132,7 +128,7 @@ static SANE_Bool usb_MapDownload( pPlustek_Device dev, u_char bDataType )
/* do the brightness and contrast adjustment ... */
if( scanning->sParam.bDataType != SCANDATATYPE_BW )
usb_MapAdjust( dev );
-
+
if( !usbio_WriteReg( dev->fd, 7, 0))
return SANE_FALSE;
@@ -175,7 +171,7 @@ static SANE_Bool usb_MapDownload( pPlustek_Device dev, u_char bDataType )
if(iThreshold > (int)_MAP_SIZE)
iThreshold = _MAP_SIZE;
- DBG(_DBG_INFO, "Threshold is at %u siThresh=%i\n",
+ DBG(_DBG_INFO, "* Threshold is at %u siThresh=%i\n",
iThreshold, scanning->sParam.siThreshold );
for(i = 0; i < iThreshold; i++)
@@ -185,7 +181,7 @@ static SANE_Bool usb_MapDownload( pPlustek_Device dev, u_char bDataType )
a_bMap[color*_MAP_SIZE + i] = 255;
fInverse = 1;
-
+
} else {
fInverse = 0;
}
@@ -206,7 +202,7 @@ static SANE_Bool usb_MapDownload( pPlustek_Device dev, u_char bDataType )
u_char map[_MAP_SIZE];
u_char *pMap = a_bMap+color*_MAP_SIZE;
- DBG( _DBG_INFO, "Inverting Map\n" );
+ DBG( _DBG_INFO, "* Inverting Map\n" );
for( i = 0; i < (int)_MAP_SIZE; i++, pMap++ )
map[i] = ~*pMap;
@@ -214,6 +210,7 @@ static SANE_Bool usb_MapDownload( pPlustek_Device dev, u_char bDataType )
sanei_lm983x_write( dev->fd, 0x06, map, _MAP_SIZE, SANE_FALSE );
} else {
+ DBG( _DBG_INFO, "* downloading map %u...\n", color );
sanei_lm983x_write( dev->fd, 0x06, a_bMap+color*_MAP_SIZE,
_MAP_SIZE, SANE_FALSE );
}
diff --git a/backend/plustek-usbscan.c b/backend/plustek-usbscan.c
index 84802c9fa..f8c6611f6 100644
--- a/backend/plustek-usbscan.c
+++ b/backend/plustek-usbscan.c
@@ -7,7 +7,7 @@
* @brief Scanning...
*
* Based on sources acquired from Plustek Inc.
- * Copyright (C) 2001-2003 Gerhard Jaeger
+ * Copyright (C) 2001-2004 Gerhard Jaeger
*
* History:
* - 0.40 - starting version of the USB support
diff --git a/backend/plustek-usbshading.c b/backend/plustek-usbshading.c
index 0f84c5f10..d9f00f34f 100644
--- a/backend/plustek-usbshading.c
+++ b/backend/plustek-usbshading.c
@@ -7,7 +7,7 @@
* @brief Calibration routines.
*
* Based on sources acquired from Plustek Inc.
- * Copyright (C) 2001-2003 Gerhard Jaeger
+ * Copyright (C) 2001-2004 Gerhard Jaeger
*
* History:
* - 0.40 - starting version of the USB support
@@ -351,10 +351,11 @@ static void usb_GetSoftwareOffsetGain( pPlustek_Device dev )
case kNEC8861:
DBG( _DBG_INFO2, "kNEC8861 adjustments\n" );
break;
-
+#if 0
case kCIS650:
case kCIS670:
case kCIS1220:
+
DBG( _DBG_INFO2, "kCIS adjustments\n" );
if(pParam->bDataType == SCANDATATYPE_Color) {
@@ -367,7 +368,6 @@ static void usb_GetSoftwareOffsetGain( pPlustek_Device dev )
pParam->swOffset[2] = 1000;
}
break;
-
case kCIS1240:
DBG( _DBG_INFO2, "kCIS1240 adjustments\n" );
if(pParam->bDataType == SCANDATATYPE_Color) {
@@ -381,7 +381,8 @@ static void usb_GetSoftwareOffsetGain( pPlustek_Device dev )
pParam->swOffset[2] = 0; /*1000;*/
}
break;
-
+#endif
+
case kNEC3799:
DBG( _DBG_INFO2, "kNEC3799 adjustments\n" );
if( sCaps->bPCB == 2 ) {
diff --git a/backend/plustek.c b/backend/plustek.c
index 877de7017..0ba721a24 100644
--- a/backend/plustek.c
+++ b/backend/plustek.c
@@ -11,7 +11,7 @@
* Original code taken from sane-0.71
* Copyright (C) 1997 Hypercore Software Design, Ltd.
* Also based on the work done by Rick Bronson
- * Copyright (C) 2000-2003 Gerhard Jaeger
+ * Copyright (C) 2000-2004 Gerhard Jaeger
*
* History:
* - 0.30 - initial version
@@ -20,7 +20,7 @@
* - 0.33 - no changes
* - 0.34 - moved some definitions and typedefs to plustek.h
* - 0.35 - removed Y-correction for 12000P model
- * - getting Y-size of scan area from driver
+ * - getting Y-size of scan area from driver
* - 0.36 - disabled Dropout, as this does currently not work
* - enabled Halftone selection only for Halftone-mode
* - made the cancel button work by using a child process during read
@@ -141,7 +141,7 @@
#include "../include/sane/sanei.h"
#include "../include/sane/saneopts.h"
-#define BACKEND_VERSION "0.47-2"
+#define BACKEND_VERSION "0.47-5"
#define BACKEND_NAME plustek
#include "../include/sane/sanei_backend.h"
#include "../include/sane/sanei_config.h"
@@ -283,7 +283,7 @@ static SANE_Status drvclose( Plustek_Device *dev )
{
if( dev->fd >= 0 ) {
- DBG( _DBG_INFO, "drvclose()\n" );
+ DBG( _DBG_INFO, "drvclose()\n" );
if( 0 != tsecs ) {
DBG( _DBG_INFO, "TIME END 1: %lus\n", time(NULL)-tsecs);
@@ -309,7 +309,7 @@ static pModeParam getModeList( Plustek_Scanner *scanner )
*/
if( 0 != scanner->val[OPT_EXT_MODE].w ) {
mp = &mp[_TPAModeSupportMin];
- }
+ }
return mp;
}
@@ -514,19 +514,16 @@ static SANE_Status do_cancel( Plustek_Scanner *scanner, SANE_Bool closepipe )
*/
static SANE_Status limitResolution( Plustek_Device *dev )
{
- dev->dpi_range.min = _DEF_DPI;
- if( dev->dpi_range.min < _DEF_DPI )
- dev->dpi_range.min = _DEF_DPI;
-
+ dev->dpi_range.min = _DEF_DPI;
dev->dpi_range.max = dev->usbDev.Caps.OpticDpi.x * 2;
dev->dpi_range.quant = 0;
- dev->x_range.min = 0;
- dev->x_range.max = SANE_FIX(dev->max_x);
- dev->x_range.quant = 0;
- dev->y_range.min = 0;
- dev->y_range.max = SANE_FIX(dev->max_y);
- dev->y_range.quant = 0;
-
+ dev->x_range.min = 0;
+ dev->x_range.max = SANE_FIX(dev->max_x);
+ dev->x_range.quant = 0;
+ dev->y_range.min = 0;
+ dev->y_range.max = SANE_FIX(dev->max_y);
+ dev->y_range.quant = 0;
+
return SANE_STATUS_GOOD;
}
@@ -540,46 +537,41 @@ static SANE_Status initGammaSettings( Plustek_Scanner *s )
int i, j, val;
double gamma;
- /*
- * this setting is common to the ASIC98001/3 and
- * LM9831/2/3 based devices
- * older parallelport devices use 256 entries
- */
s->gamma_length = 4096;
- s->gamma_range.min = 0;
- s->gamma_range.max = 255;
- s->gamma_range.quant = 0;
+ s->gamma_range.min = 0;
+ s->gamma_range.max = 255;
+ s->gamma_range.quant = 0;
+
+ DBG( _DBG_INFO, "Presetting Gamma tables (len=%u)\n", s->gamma_length );
+
+ /* preset the gamma maps
+ */
+ for( i = 0; i < 4; i++ ) {
- DBG( _DBG_INFO, "Presetting Gamma tables (len=%u)\n", s->gamma_length );
- DBG( _DBG_INFO, "----------------------------------\n" );
-
- /*
- * preset the gamma maps
- */
- for( i = 0; i < 4; i++ ) {
-
switch( i ) {
case 1: gamma = s->hw->adj.rgamma; break;
case 2: gamma = s->hw->adj.ggamma; break;
case 3: gamma = s->hw->adj.bgamma; break;
default: gamma = s->hw->adj.graygamma; break;
- }
-
+ }
+ DBG( _DBG_INFO, "* Channel[%u], gamma %.3f\n", i, gamma );
+
for( j = 0; j < s->gamma_length; j++ ) {
-
+
val = (s->gamma_range.max *
pow((double) j / ((double)s->gamma_length - 1.0),
1.0 / gamma ));
-
+
if( val > s->gamma_range.max )
val = s->gamma_range.max;
-
- s->gamma_table[i][j] = val;
- }
- }
-
+
+ s->gamma_table[i][j] = val;
+ }
+ }
+ DBG( _DBG_INFO, "----------------------------------\n" );
+
return SANE_STATUS_GOOD;
-}
+}
/** Check the gamma vectors we got back and limit if necessary
* @param s - pointer to the scanner specific structure
@@ -588,14 +580,15 @@ static SANE_Status initGammaSettings( Plustek_Scanner *s )
static void checkGammaSettings( Plustek_Scanner *s )
{
int i, j;
-
- for( i = 0; i < 4 ; i++ ) {
+
+ DBG( _DBG_INFO, "Maps changed...\n" );
+ for( i = 0; i < 4 ; i++ ) {
for( j = 0; j < s->gamma_length; j++ ) {
if( s->gamma_table[i][j] > s->gamma_range.max ) {
s->gamma_table[i][j] = s->gamma_range.max;
}
- }
- }
+ }
+ }
}
/** initialize the options for the backend according to the device we have
@@ -609,7 +602,7 @@ static SANE_Status init_options( Plustek_Scanner *s )
for( i = 0; i < NUM_OPTIONS; ++i ) {
s->opt[i].size = sizeof (SANE_Word);
s->opt[i].cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT;
- }
+ }
s->opt[OPT_NUM_OPTS].name = SANE_NAME_NUM_OPTIONS;
s->opt[OPT_NUM_OPTS].title = SANE_TITLE_NUM_OPTIONS;
@@ -646,7 +639,7 @@ static SANE_Status init_options( Plustek_Scanner *s )
s->opt[OPT_EXT_MODE].constraint_type = SANE_CONSTRAINT_STRING_LIST;
s->opt[OPT_EXT_MODE].constraint.string_list = ext_mode_list;
s->val[OPT_EXT_MODE].w = 0; /* Normal */
-
+
/* brightness */
s->opt[OPT_BRIGHTNESS].name = SANE_NAME_BRIGHTNESS;
s->opt[OPT_BRIGHTNESS].title = SANE_TITLE_BRIGHTNESS;
@@ -679,11 +672,11 @@ static SANE_Status init_options( Plustek_Scanner *s )
s->val[OPT_RESOLUTION].w = s->hw->dpi_range.min;
/* custom-gamma table */
- s->opt[OPT_CUSTOM_GAMMA].name = SANE_NAME_CUSTOM_GAMMA;
- s->opt[OPT_CUSTOM_GAMMA].title = SANE_TITLE_CUSTOM_GAMMA;
- s->opt[OPT_CUSTOM_GAMMA].desc = SANE_DESC_CUSTOM_GAMMA;
- s->opt[OPT_CUSTOM_GAMMA].type = SANE_TYPE_BOOL;
- s->val[OPT_CUSTOM_GAMMA].w = SANE_FALSE;
+ s->opt[OPT_CUSTOM_GAMMA].name = SANE_NAME_CUSTOM_GAMMA;
+ s->opt[OPT_CUSTOM_GAMMA].title = SANE_TITLE_CUSTOM_GAMMA;
+ s->opt[OPT_CUSTOM_GAMMA].desc = SANE_DESC_CUSTOM_GAMMA;
+ s->opt[OPT_CUSTOM_GAMMA].type = SANE_TYPE_BOOL;
+ s->val[OPT_CUSTOM_GAMMA].w = SANE_FALSE;
/* preview */
s->opt[OPT_PREVIEW].name = SANE_NAME_PREVIEW;
@@ -803,11 +796,6 @@ static SANE_Status init_options( Plustek_Scanner *s )
s->opt[OPT_EXT_MODE].cap |= SANE_CAP_INACTIVE;
}
- /* disable custom gamma, if not supported by the driver... */
- if( 0 == (s->hw->caps.dwFlag & SFLAG_CUSTOM_GAMMA)) {
- s->opt[OPT_CUSTOM_GAMMA].cap |= SANE_CAP_INACTIVE;
- }
-
return SANE_STATUS_GOOD;
}
@@ -995,7 +983,7 @@ static SANE_Status attach( const char *dev_name, pCnfDef cnf,
/* allocate some memory for the device */
dev = malloc( sizeof (*dev));
if( NULL == dev )
- return SANE_STATUS_NO_MEM;
+ return SANE_STATUS_NO_MEM;
/* assign all the stuff we need fo this device... */
@@ -1043,9 +1031,7 @@ static SANE_Status attach( const char *dev_name, pCnfDef cnf,
return SANE_STATUS_INVAL;
#endif
- /*
- * go ahead and open the scanner device
- */
+ /* go ahead and open the scanner device */
handle = usbDev_open( dev );
if( handle < 0 ) {
DBG( _DBG_ERROR,"open failed: %d\n", handle );
@@ -1069,10 +1055,10 @@ static SANE_Status attach( const char *dev_name, pCnfDef cnf,
dev->sane.model = dev->usbDev.ModelStr;
else
#endif
- dev->sane.model = "USB-Device";
-
- DBG( _DBG_INFO, "Vendor : %s\n", dev->sane.vendor );
- DBG( _DBG_INFO, "Model : %s\n", dev->sane.model );
+ dev->sane.model = "USB-Device";
+
+ DBG( _DBG_INFO, "Vendor : %s\n", dev->sane.vendor );
+ DBG( _DBG_INFO, "Model : %s\n", dev->sane.model );
DBG( _DBG_INFO, "Flags : 0x%08lx\n", dev->caps.dwFlag );
dev->max_x = dev->caps.wMaxExtentX*MM_PER_INCH/_MEASURE_BASE;
@@ -1082,8 +1068,8 @@ static SANE_Status attach( const char *dev_name, pCnfDef cnf,
* one more to avoid a buffer overflow, then allocate it...
*/
dev->res_list = (SANE_Int *)
- calloc((((dev->usbDev.Caps.OpticDpi.x*16)-_DEF_DPI)/25+1),
- sizeof (SANE_Int));
+ calloc((((dev->usbDev.Caps.OpticDpi.x*16)-_DEF_DPI)/25+1),
+ sizeof (SANE_Int));
if (NULL == dev->res_list) {
DBG( _DBG_ERROR, "alloc fail, resolution problem\n" );
@@ -1091,9 +1077,9 @@ static SANE_Status attach( const char *dev_name, pCnfDef cnf,
return SANE_STATUS_INVAL;
}
- /* build up the resolution table */
+ /* build up the resolution table */
dev->res_list_size = 0;
- for( cntr = _DEF_DPI; cntr <= (dev->usbDev.Caps.OpticDpi.x*16); cntr += 25 ) {
+ for(cntr = _DEF_DPI; cntr <= (dev->usbDev.Caps.OpticDpi.x*16); cntr += 25){
dev->res_list_size++;
dev->res_list[dev->res_list_size - 1] = (SANE_Int)cntr;
}
@@ -1110,7 +1096,7 @@ static SANE_Status attach( const char *dev_name, pCnfDef cnf,
first_dev = dev;
if (devp)
- *devp = dev;
+ *devp = dev;
return SANE_STATUS_GOOD;
}
@@ -1508,12 +1494,25 @@ SANE_Status sane_control_option( SANE_Handle handle, SANE_Int option,
/* word array options: */
case OPT_GAMMA_VECTOR:
- case OPT_GAMMA_VECTOR_R:
- case OPT_GAMMA_VECTOR_G:
- case OPT_GAMMA_VECTOR_B:
+ DBG( _DBG_INFO, "Reading MASTER gamma.\n" );
memcpy( value, s->val[option].wa, s->opt[option].size );
break;
-
+
+ case OPT_GAMMA_VECTOR_R:
+ DBG( _DBG_INFO, "Reading RED gamma.\n" );
+ memcpy( value, s->val[option].wa, s->opt[option].size );
+ break;
+
+ case OPT_GAMMA_VECTOR_G:
+ DBG( _DBG_INFO, "Reading GREEN gamma.\n" );
+ memcpy( value, s->val[option].wa, s->opt[option].size );
+ break;
+
+ case OPT_GAMMA_VECTOR_B:
+ DBG( _DBG_INFO, "Reading BLUE gamma.\n" );
+ memcpy( value, s->val[option].wa, s->opt[option].size );
+ break;
+
default:
return SANE_STATUS_INVAL;
}
@@ -1575,9 +1574,9 @@ SANE_Status sane_control_option( SANE_Handle handle, SANE_Int option,
break;
case OPT_CUSTOM_GAMMA:
- s->val[option].w = *(SANE_Word *)value;
+ s->val[option].w = *(SANE_Word *)value;
if( NULL != info )
- *info |= SANE_INFO_RELOAD_PARAMS | SANE_INFO_RELOAD_OPTIONS;
+ *info |= SANE_INFO_RELOAD_PARAMS | SANE_INFO_RELOAD_OPTIONS;
mp = getModeList( s );
scanmode = mp[s->val[OPT_MODE].w].scanmode;
@@ -1587,8 +1586,8 @@ SANE_Status sane_control_option( SANE_Handle handle, SANE_Int option,
s->opt[OPT_GAMMA_VECTOR_G].cap |= SANE_CAP_INACTIVE;
s->opt[OPT_GAMMA_VECTOR_B].cap |= SANE_CAP_INACTIVE;
- if( SANE_TRUE == s->val[option].w ) {
-
+ if( SANE_TRUE == s->val[option].w ) {
+ DBG( _DBG_INFO, "Using custom gamma settings.\n" );
if((scanmode == COLOR_256GRAY) ||
(scanmode == COLOR_GRAY16)) {
s->opt[OPT_GAMMA_VECTOR].cap &= ~SANE_CAP_INACTIVE;
@@ -1596,10 +1595,10 @@ SANE_Status sane_control_option( SANE_Handle handle, SANE_Int option,
s->opt[OPT_GAMMA_VECTOR_R].cap &= ~SANE_CAP_INACTIVE;
s->opt[OPT_GAMMA_VECTOR_G].cap &= ~SANE_CAP_INACTIVE;
s->opt[OPT_GAMMA_VECTOR_B].cap &= ~SANE_CAP_INACTIVE;
- }
-
- } else {
-
+ }
+ } else {
+
+ DBG( _DBG_INFO, "NOT using custom gamma settings.\n" );
initGammaSettings( s );
if((scanmode == COLOR_256GRAY) ||
@@ -1707,9 +1706,31 @@ SANE_Status sane_control_option( SANE_Handle handle, SANE_Int option,
break;
}
case OPT_GAMMA_VECTOR:
+ DBG( _DBG_INFO, "Setting MASTER gamma.\n" );
+ memcpy( s->val[option].wa, value, s->opt[option].size );
+ checkGammaSettings(s);
+ if( NULL != info )
+ *info |= SANE_INFO_RELOAD_PARAMS;
+ break;
+
case OPT_GAMMA_VECTOR_R:
+ DBG( _DBG_INFO, "Setting RED gamma.\n" );
+ memcpy( s->val[option].wa, value, s->opt[option].size );
+ checkGammaSettings(s);
+ if( NULL != info )
+ *info |= SANE_INFO_RELOAD_PARAMS;
+ break;
+
case OPT_GAMMA_VECTOR_G:
+ DBG( _DBG_INFO, "Setting GREEN gamma.\n" );
+ memcpy( s->val[option].wa, value, s->opt[option].size );
+ checkGammaSettings(s);
+ if( NULL != info )
+ *info |= SANE_INFO_RELOAD_PARAMS;
+ break;
+
case OPT_GAMMA_VECTOR_B:
+ DBG( _DBG_INFO, "Setting BLUE gamma.\n" );
memcpy( s->val[option].wa, value, s->opt[option].size );
checkGammaSettings(s);
if( NULL != info )
diff --git a/backend/plustek.h b/backend/plustek.h
index 7caae8486..830c52205 100644
--- a/backend/plustek.h
+++ b/backend/plustek.h
@@ -11,7 +11,7 @@
*
* original code taken from sane-0.71
* Copyright (C) 1997 Hypercore Software Design, Ltd.
- * Copyright (C) 2001-2003 Gerhard Jaeger
+ * Copyright (C) 2001-2004 Gerhard Jaeger
*
* History:
* - 0.30 - initial version
@@ -122,20 +122,18 @@
/** image sizes for normal, transparent and negative modes
*/
-#define _TPAPageWidth 500U
-#define _TPAPageHeight 510U
-#define _TPAMinDpi 150
-#define _TPAModeSupportMin COLOR_TRUE24
+#define _TPAPageWidth 500U
+#define _TPAPageHeight 510U
+#define _TPAMinDpi 150
+#define _TPAModeSupportMin COLOR_TRUE24
#define _NegativePageWidth 460UL
#define _NegativePageHeight 350UL
-#define _NORMAL_X 216.0
-#define _NORMAL_Y 297.0
-#define _TP_X ((double)_TPAPageWidth/300.0 * MM_PER_INCH)
-#define _TP_Y ((double)_TPAPageHeight/300.0 * MM_PER_INCH)
-#define _NEG_X ((double)_NegativePageWidth/300.0 * MM_PER_INCH)
-#define _NEG_Y ((double)_NegativePageHeight/300.0 * MM_PER_INCH)
+#define _TP_X ((double)_TPAPageWidth/300.0 * MM_PER_INCH)
+#define _TP_Y ((double)_TPAPageHeight/300.0 * MM_PER_INCH)
+#define _NEG_X ((double)_NegativePageWidth/300.0 * MM_PER_INCH)
+#define _NEG_Y ((double)_NegativePageHeight/300.0 * MM_PER_INCH)
/** scan modes
*/
@@ -149,17 +147,10 @@
*/
#define _MAX_ID_LEN 20
-
/**
*/
-#define SFLAG_SCANNERDEV 0x00000002 /* is scannerdevice */
-#define SFLAG_FLATBED 0x00000004 /* is flatbed scanner */
-
-#define SFLAG_ADF 0x00000010 /* Automatic document feeder */
-#define SFLAG_TPA 0x00000080 /* has transparency adapter */
-#define SFLAG_BUTTONOPT 0x00000100 /* has buttons */
-
-#define SFLAG_CUSTOM_GAMMA 0x00000200 /* driver supports custom gamma */
+#define SFLAG_ADF 0x00000010 /* Automatic document feeder */
+#define SFLAG_TPA 0x00000080 /* has transparency adapter */
/**
*/