copyright updates and some changes concerning the CanoScan lamp calibration.

merge-requests/1/head
Gerhard Jaeger 2004-01-09 14:24:30 +00:00
rodzic 7d3ec3869c
commit c9d48fcdeb
13 zmienionych plików z 373 dodań i 307 usunięć

Wyświetl plik

@ -7,7 +7,7 @@
* @brief The interface functions to the USB driver stuff.
*
* Based on sources acquired from Plustek Inc.<br>
* Copyright (C) 2001-2003 Gerhard Jaeger <gerhard@gjaeger.de>
* Copyright (C) 2001-2004 Gerhard Jaeger <gerhard@gjaeger.de>
*
* 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;

Wyświetl plik

@ -7,7 +7,7 @@
* @brief Main defines for the USB devices.
*
* Based on sources acquired from Plustek Inc.<br>
* Copyright (C) 2001-2003 Gerhard Jaeger <gerhard@gjaeger.de>
* Copyright (C) 2001-2004 Gerhard Jaeger <gerhard@gjaeger.de>
*
* 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
* .
* <hr>
* 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

Wyświetl plik

@ -7,7 +7,7 @@
* @brief Calibration routines for CanoScan CIS devices.
*
* Based on sources acquired from Plustek Inc.<br>
* Copyright (C) 2001-2003 Gerhard Jaeger <gerhard@gjaeger.de><br>
* Copyright (C) 2001-2004 Gerhard Jaeger <gerhard@gjaeger.de><br>
* Large parts Copyright (C) 2003 Christopher Montgomery <monty@xiph.org>
*
* 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<bisect?twice:bisect;
/* as we have already set the maximum value, there's no need
* for this channel to recalibrate.
*/
if( *off > 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;

Wyświetl plik

@ -6,7 +6,7 @@
/** @file plustek-usbcalfile.c
* @brief Functions for saving/restoring calibration settings
*
* Copyright (C) 2001-2003 Gerhard Jaeger <gerhard@gjaeger.de>
* Copyright (C) 2001-2004 Gerhard Jaeger <gerhard@gjaeger.de>
*
* History:
* - 0.46 - first version

Wyświetl plik

@ -7,7 +7,7 @@
* @brief Here we have our USB device definitions.
*
* Based on sources acquired from Plustek Inc.<br>
* Copyright (C) 2001-2003 Gerhard Jaeger <gerhard@gjaeger.de>
* Copyright (C) 2001-2004 Gerhard Jaeger <gerhard@gjaeger.de>
*
* 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 *****************************/

Wyświetl plik

@ -7,7 +7,7 @@
* @brief Functions to control the scanner hardware.
*
* Based on sources acquired from Plustek Inc.<br>
* Copyright (C) 2001-2003 Gerhard Jaeger <gerhard@gjaeger.de>
* Copyright (C) 2001-2004 Gerhard Jaeger <gerhard@gjaeger.de>
*
* History:
* - 0.40 - starting version of the USB support

Wyświetl plik

@ -7,7 +7,7 @@
* @brief Image processing functions for copying and scaling image lines.
*
* Based on sources acquired from Plustek Inc.<br>
* Copyright (C) 2001-2003 Gerhard Jaeger <gerhard@gjaeger.de>
* Copyright (C) 2001-2004 Gerhard Jaeger <gerhard@gjaeger.de>
*
* History:
* - 0.40 - starting version of the USB support

Wyświetl plik

@ -7,7 +7,7 @@
* @brief Some I/O stuff.
*
* Based on sources acquired from Plustek Inc.<br>
* Copyright (C) 2001-2003 Gerhard Jaeger <gerhard@gjaeger.de>
* Copyright (C) 2001-2004 Gerhard Jaeger <gerhard@gjaeger.de>
*
* History:
* History:

Wyświetl plik

@ -7,7 +7,7 @@
* @brief Creating and manipulating lookup tables.
*
* Based on sources acquired from Plustek Inc.<br>
* Copyright (C) 2001-2003 Gerhard Jaeger <gerhard@gjaeger.de>
* Copyright (C) 2001-2004 Gerhard Jaeger <gerhard@gjaeger.de>
*
* 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
* .
* <hr>
* 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 );
}

Wyświetl plik

@ -7,7 +7,7 @@
* @brief Scanning...
*
* Based on sources acquired from Plustek Inc.<br>
* Copyright (C) 2001-2003 Gerhard Jaeger <gerhard@gjaeger.de>
* Copyright (C) 2001-2004 Gerhard Jaeger <gerhard@gjaeger.de>
*
* History:
* - 0.40 - starting version of the USB support

Wyświetl plik

@ -7,7 +7,7 @@
* @brief Calibration routines.
*
* Based on sources acquired from Plustek Inc.<br>
* Copyright (C) 2001-2003 Gerhard Jaeger <gerhard@gjaeger.de>
* Copyright (C) 2001-2004 Gerhard Jaeger <gerhard@gjaeger.de>
*
* 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 ) {

Wyświetl plik

@ -11,7 +11,7 @@
* Original code taken from sane-0.71<br>
* Copyright (C) 1997 Hypercore Software Design, Ltd.<br>
* Also based on the work done by Rick Bronson<br>
* Copyright (C) 2000-2003 Gerhard Jaeger <gerhard@gjaeger.de><br>
* Copyright (C) 2000-2004 Gerhard Jaeger <gerhard@gjaeger.de><br>
*
* 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<br>
* - 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<br>
* - enabled Halftone selection only for Halftone-mode<br>
* - made the cancel button work by using a child process during read<br>
@ -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 )

Wyświetl plik

@ -11,7 +11,7 @@
*
* original code taken from sane-0.71<br>
* Copyright (C) 1997 Hypercore Software Design, Ltd.<br>
* Copyright (C) 2001-2003 Gerhard Jaeger <gerhard@gjaeger.de>
* Copyright (C) 2001-2004 Gerhard Jaeger <gerhard@gjaeger.de>
*
* 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 */
/**
*/