kopia lustrzana https://gitlab.com/sane-project/backends
Fixed two calibration bugs: one occasionally caused overexposed images
at all resolutions; the other one occasionally caused color inbalances when scanning narrow areas at high resolutions.merge-requests/1/head
rodzic
f87050d7b0
commit
61c2a6aa24
|
@ -1384,12 +1384,13 @@ cis_read_line_low_level (Mustek_PP_CIS_dev * dev, SANE_Byte * buf,
|
||||||
hi_val = calib_hi[calctr] ;
|
hi_val = calib_hi[calctr] ;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (++calctr >= dev->desc->dev->maxhsize/2) {
|
if (++calctr >= dev->calib_pixels) {
|
||||||
/* Avoid array boundary violations due to rounding errors
|
/* Avoid array boundary violations due to rounding errors
|
||||||
(due to the incremental calculation, the current position
|
(due to the incremental calculation, the current position
|
||||||
may be inaccurate to up to two pixels, so we may need to
|
may be inaccurate to up to two pixels, so we may need to
|
||||||
read a few extra bytes -> use the last calibration value) */
|
read a few extra bytes -> use the last calibration value) */
|
||||||
calctr = dev->desc->dev->maxhsize/2 - 1;
|
calctr = dev->calib_pixels - 1;
|
||||||
|
DBG (3, "cis_read_line_low_level: calibration overshoot\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
cval -= low_val ;
|
cval -= low_val ;
|
||||||
|
@ -1578,14 +1579,10 @@ cis_maximize_dynamic_range(Mustek_PP_CIS_dev * dev)
|
||||||
int i, j, pixel, channel, minExposeTime, first, last;
|
int i, j, pixel, channel, minExposeTime, first, last;
|
||||||
SANE_Byte powerOnDelayLower[3], powerOnDelayUpper[3], exposeTime[3];
|
SANE_Byte powerOnDelayLower[3], powerOnDelayUpper[3], exposeTime[3];
|
||||||
SANE_Byte buf[3][MUSTEK_PP_CIS_MAX_H_PIXEL];
|
SANE_Byte buf[3][MUSTEK_PP_CIS_MAX_H_PIXEL];
|
||||||
SANE_Int pixels = dev->desc->params.pixels_per_line;
|
SANE_Int pixels = dev->calib_pixels;
|
||||||
|
|
||||||
DBG(3, "cis_maximize_dynamic_range: starting\n");
|
DBG(3, "cis_maximize_dynamic_range: starting\n");
|
||||||
|
|
||||||
/* Calibrating interpolated pixels makes no sense */
|
|
||||||
if (pixels > (dev->desc->dev->maxhsize >> 1))
|
|
||||||
pixels = (dev->desc->dev->maxhsize >> 1);
|
|
||||||
|
|
||||||
for (channel = 0; channel < 3; ++channel)
|
for (channel = 0; channel < 3; ++channel)
|
||||||
{
|
{
|
||||||
exposeTime[channel] = 254;
|
exposeTime[channel] = 254;
|
||||||
|
@ -1774,13 +1771,9 @@ cis_normalize_ranges(Mustek_PP_CIS_dev * dev)
|
||||||
{
|
{
|
||||||
SANE_Byte cal_low, cal_hi ;
|
SANE_Byte cal_low, cal_hi ;
|
||||||
SANE_Byte powerOnDelay[3] ;
|
SANE_Byte powerOnDelay[3] ;
|
||||||
SANE_Int pixels = dev->desc->params.pixels_per_line;
|
SANE_Int pixels = dev->calib_pixels;
|
||||||
SANE_Int channel, p, first, last;
|
SANE_Int channel, p, first, last;
|
||||||
|
|
||||||
/* Calibrating interpolated pixels makes no sense */
|
|
||||||
if (pixels > (dev->desc->dev->maxhsize >> 1))
|
|
||||||
pixels = (dev->desc->dev->maxhsize >> 1);
|
|
||||||
|
|
||||||
if (dev->desc->mode == MODE_COLOR)
|
if (dev->desc->mode == MODE_COLOR)
|
||||||
{
|
{
|
||||||
first = MUSTEK_PP_CIS_CHANNEL_RED;
|
first = MUSTEK_PP_CIS_CHANNEL_RED;
|
||||||
|
@ -2037,7 +2030,15 @@ cis_calibrate (Mustek_PP_CIS_dev * dev)
|
||||||
*
|
*
|
||||||
* - reset the device
|
* - reset the device
|
||||||
*
|
*
|
||||||
* - move the motor 90 steps forward
|
* - move the motor 110 steps forward. The TWAIN driver moves 90 steps,
|
||||||
|
* and I've used 90 steps for a long time too, but occasionally,
|
||||||
|
* 90 steps is a fraction to short to reach the start of the
|
||||||
|
* calibration strip (the motor movements are not very accurate;
|
||||||
|
* an offset of 1 mm is not unusual). Therefore, I've increased it to
|
||||||
|
* 110 steps. This gives us an additional 1.6 mm slack, which should
|
||||||
|
* prevent calibration errors.
|
||||||
|
* (Note that the MUSTEK_PP_CIS_????CP_DEFAULT_SKIP constants have to
|
||||||
|
* be adjusted if the number of steps is altered.)
|
||||||
*
|
*
|
||||||
* - configure the CIS : actual resolution + set parameters
|
* - configure the CIS : actual resolution + set parameters
|
||||||
*
|
*
|
||||||
|
@ -2064,9 +2065,9 @@ cis_calibrate (Mustek_PP_CIS_dev * dev)
|
||||||
|
|
||||||
cis_reset_device (dev);
|
cis_reset_device (dev);
|
||||||
|
|
||||||
/* Move motor 90 steps @ 300 DPI */
|
/* Move motor 110 steps @ 300 DPI */
|
||||||
Mustek_PP_1015_write_reg_start(dev, MA1015W_MOTOR_CONTROL);
|
Mustek_PP_1015_write_reg_start(dev, MA1015W_MOTOR_CONTROL);
|
||||||
for (i=0; i<90; ++i)
|
for (i=0; i<110; ++i)
|
||||||
{
|
{
|
||||||
if (dev->model == MUSTEK_PP_CIS600)
|
if (dev->model == MUSTEK_PP_CIS600)
|
||||||
{
|
{
|
||||||
|
@ -2099,6 +2100,8 @@ cis_calibrate (Mustek_PP_CIS_dev * dev)
|
||||||
/* dev->CIS.skipsToOrigin = hw2max_vres(dev, dev->CIS.skipsToOrigin); */
|
/* dev->CIS.skipsToOrigin = hw2max_vres(dev, dev->CIS.skipsToOrigin); */
|
||||||
|
|
||||||
/* Move to the origin */
|
/* Move to the origin */
|
||||||
|
DBG(3, "cis_calibrate: remaining skips to origin @maxres: %d\n",
|
||||||
|
dev->CIS.skipsToOrigin);
|
||||||
cis_move_motor(dev, dev->CIS.skipsToOrigin);
|
cis_move_motor(dev, dev->CIS.skipsToOrigin);
|
||||||
|
|
||||||
return dev->desc->state != STATE_CANCELLED ? SANE_TRUE : SANE_FALSE;
|
return dev->desc->state != STATE_CANCELLED ? SANE_TRUE : SANE_FALSE;
|
||||||
|
@ -2487,6 +2490,14 @@ SANE_Status cis_drv_start (SANE_Handle hndl)
|
||||||
else
|
else
|
||||||
cisdev->CIS.cisRes = 600;
|
cisdev->CIS.cisRes = 600;
|
||||||
|
|
||||||
|
/* Calibration only makes sense for hardware pixels, not for interpolated
|
||||||
|
pixels, so we limit the number of calibration pixels to the maximum
|
||||||
|
number of hardware pixels corresponding to the selected area */
|
||||||
|
if (dev->res > cisdev->CIS.hw_hres)
|
||||||
|
cisdev->calib_pixels = (pixels * cisdev->CIS.hw_hres) / dev->res;
|
||||||
|
else
|
||||||
|
cisdev->calib_pixels = pixels;
|
||||||
|
|
||||||
DBG (3, "cis_drv_start: hres: %d vres: %d cisres: %d\n",
|
DBG (3, "cis_drv_start: hres: %d vres: %d cisres: %d\n",
|
||||||
cisdev->CIS.hw_hres, cisdev->CIS.hw_vres, cisdev->CIS.cisRes);
|
cisdev->CIS.hw_hres, cisdev->CIS.hw_vres, cisdev->CIS.cisRes);
|
||||||
|
|
||||||
|
|
|
@ -231,6 +231,9 @@ typedef struct Mustek_PP_CIS_dev
|
||||||
/* calibration buffers (low cut, high cut) */
|
/* calibration buffers (low cut, high cut) */
|
||||||
SANE_Byte *calib_low[3];
|
SANE_Byte *calib_low[3];
|
||||||
SANE_Byte *calib_hi[3];
|
SANE_Byte *calib_hi[3];
|
||||||
|
|
||||||
|
/* Number of pixels in calibration buffers (<= number of pixels to scan) */
|
||||||
|
int calib_pixels;
|
||||||
|
|
||||||
} Mustek_PP_CIS_dev;
|
} Mustek_PP_CIS_dev;
|
||||||
|
|
||||||
|
|
Ładowanie…
Reference in New Issue