Always do shading calibration in color mode on gl841.

This removes the need to calibrate for both greyscale and color mode.
merge-requests/1/head
Pierre Willenbrock 2009-04-17 13:03:35 +00:00
rodzic 4f526dbb24
commit ad1f7de9e0
5 zmienionych plików z 27 dodań i 61 usunięć

Wyświetl plik

@ -1,3 +1,8 @@
2009-04-17 Pierre Willenbrock <pierre@pirsoft.dnsalias.org>
* backend/genesys.c, backend/genesys_gl646.c,
backend/genesys_gl841.c, backend/genesys_low.h: Always do shading
calibration in color mode on gl841.
2009-04-16 Stéphane Voltz <stef.dev@free.fr>
* backend/genesys.h backend/genesys.c backend/genesys_gl646.c
backend/genesys_devices.c: y scan position fixes

Wyświetl plik

@ -2241,21 +2241,8 @@ genesys_dark_shading_calibration (Genesys_Device * dev)
DBG (DBG_proc, "genesys_dark_shading_calibration\n");
/* end pixel - start pixel */
if (dev->model->asic_type != GENESYS_GL646)
{
pixels_per_line =
(genesys_pixels_per_line (dev->calib_reg)
* genesys_dpiset (dev->calib_reg)) / dev->sensor.optical_res;
}
else
{
pixels_per_line = dev->calib_pixels;
}
if (dev->settings.scan_mode == SCAN_MODE_COLOR) /* single pass color */
channels = 3;
else
channels = 1;
channels = dev->calib_channels;
FREE_IFNOT_NULL (dev->dark_average_data);
@ -2462,21 +2449,8 @@ genesys_white_shading_calibration (Genesys_Device * dev)
DBG (DBG_proc, "genesys_white_shading_calibration (lines = %d)\n",
dev->model->shading_lines);
if (dev->model->asic_type != GENESYS_GL646)
{
pixels_per_line =
(genesys_pixels_per_line (dev->calib_reg)
* genesys_dpiset (dev->calib_reg)) / dev->sensor.optical_res;
}
else
{
pixels_per_line = dev->calib_pixels;
}
if (dev->settings.scan_mode == SCAN_MODE_COLOR) /* single pass color */
channels = 3;
else
channels = 1;
pixels_per_line = dev->calib_pixels;
channels = dev->calib_channels;
if (dev->white_average_data)
free (dev->white_average_data);
@ -2583,6 +2557,9 @@ genesys_white_shading_calibration (Genesys_Device * dev)
return SANE_STATUS_GOOD;
}
/* This calibration uses a scan over the calibration target, comprising a
* black and a white stripe. (So the motor must be on.)
*/
static SANE_Status
genesys_dark_white_shading_calibration (Genesys_Device * dev)
{
@ -2599,14 +2576,9 @@ genesys_dark_white_shading_calibration (Genesys_Device * dev)
DBG (DBG_proc, "genesys_black_white_shading_calibration (lines = %d)\n",
dev->model->shading_lines);
pixels_per_line =
(genesys_pixels_per_line (dev->calib_reg)
* genesys_dpiset (dev->calib_reg)) / dev->sensor.optical_res;
if (dev->settings.scan_mode == SCAN_MODE_COLOR) /* single pass color */
channels = 3;
else
channels = 1;
pixels_per_line = dev->calib_pixels;
channels = dev->calib_channels;
if (dev->white_average_data)
free (dev->white_average_data);
@ -2644,7 +2616,7 @@ genesys_dark_white_shading_calibration (Genesys_Device * dev)
/* turn on motor and lamp power */
dev->model->cmd_set->set_lamp_power (dev, dev->calib_reg, SANE_TRUE);
dev->model->cmd_set->set_motor_power (dev->calib_reg, SANE_FALSE);
dev->model->cmd_set->set_motor_power (dev->calib_reg, SANE_TRUE);
status =
dev->model->cmd_set->bulk_write_register (dev, dev->calib_reg,
@ -2949,11 +2921,7 @@ genesys_send_shading_coefficient (Genesys_Device * dev)
pixels_per_line = dev->calib_pixels;
if (dev->settings.scan_mode == SCAN_MODE_COLOR) /* single pass color */
channels = 3;
else
channels = 1;
channels = dev->calib_channels;
/* we always build data for three channels, even for gray */
if (dev->model->is_cis)
@ -3053,7 +3021,9 @@ genesys_send_shading_coefficient (Genesys_Device * dev)
avgpixels = dev->sensor.optical_res / res;
/* gl841 supports 1/1 1/2 1/3 1/4 1/5 1/6 1/8 1/10 1/12 1/15 averaging */
if (avgpixels < 6)
if (avgpixels < 1)
avgpixels = 1;
else if (avgpixels < 6)
avgpixels = avgpixels;
else if (avgpixels < 8)
avgpixels = 6;
@ -3243,6 +3213,7 @@ genesys_restore_calibration (Genesys_Device * dev)
dev->average_size = cache->average_size;
dev->calib_pixels = cache->calib_pixels;
dev->calib_channels = cache->calib_channels;
dev->dark_average_data = (uint8_t*)malloc(cache->average_size);
dev->white_average_data = (uint8_t*)malloc(cache->average_size);
@ -3364,6 +3335,7 @@ genesys_save_calibration (Genesys_Device * dev)
memcpy (&cache->sensor, &dev->sensor, sizeof (cache->sensor));
cache->calib_pixels = dev->calib_pixels;
cache->calib_channels = dev->calib_channels;
memcpy (cache->dark_average_data, dev->dark_average_data,
cache->average_size);
memcpy (cache->white_average_data, dev->white_average_data,
@ -3537,14 +3509,6 @@ genesys_flatbed_calibration (Genesys_Device * dev)
return status;
}
/* GL646 scanners set up calib_pixels in init_regs_for_shading */
if (dev->model->asic_type != GENESYS_GL646)
{
dev->calib_pixels =
(genesys_pixels_per_line (dev->calib_reg)
* genesys_dpiset (dev->calib_reg)) / dev->sensor.optical_res;
}
if (dev->model->flags & GENESYS_FLAG_DARK_WHITE_CALIBRATION)
{
status = genesys_dark_white_shading_calibration (dev);

Wyświetl plik

@ -3413,6 +3413,7 @@ gl646_init_regs_for_shading (Genesys_Device * dev)
/* used when sending shading calibration data */
dev->calib_pixels = settings.pixels;
dev->calib_channels = dev->current_setup.channels;
/* no shading */
dev->reg[reg_0x01].value &= ~REG01_DVDSET;

Wyświetl plik

@ -4447,16 +4447,12 @@ static SANE_Status
gl841_init_regs_for_shading (Genesys_Device * dev)
{
SANE_Status status;
uint8_t channels;
DBG (DBG_proc, "gl841_init_regs_for_shading: lines = %d\n",
dev->model->shading_lines);
if (dev->settings.scan_mode == SCAN_MODE_COLOR) /* single pass color */
channels = 3;
else
channels = 1;
dev->calib_channels = 3;
dev->calib_pixels = (dev->sensor.sensor_pixels * dev->settings.xres) / dev->sensor.optical_res;
status = gl841_init_scan_regs (dev,
dev->calib_reg,
@ -4464,10 +4460,10 @@ gl841_init_regs_for_shading (Genesys_Device * dev)
dev->motor.base_ydpi,
0,
0,
(dev->sensor.sensor_pixels * dev->settings.xres) / dev->sensor.optical_res,
dev->calib_pixels,
dev->model->shading_lines,
16,
channels,
dev->calib_channels,
dev->settings.color_filter,
SCAN_FLAG_DISABLE_SHADING |
SCAN_FLAG_DISABLE_GAMMA |
@ -5582,8 +5578,6 @@ gl841_is_compatible_calibration (Genesys_Device * dev,
DBG (DBG_proc, "gl841_is_compatible_calibration: checking\n");
if (dev->current_setup.channels != cache->used_setup.channels)
return SANE_STATUS_UNSUPPORTED;
if (dev->current_setup.half_ccd != cache->used_setup.half_ccd)
return SANE_STATUS_UNSUPPORTED;

Wyświetl plik

@ -523,6 +523,7 @@ struct Genesys_Calibration_Cache
Genesys_Sensor sensor;
size_t calib_pixels;
size_t calib_channels;
size_t average_size;
uint8_t *white_average_data;
uint8_t *dark_average_data;
@ -551,6 +552,7 @@ struct Genesys_Device
size_t average_size;
size_t calib_pixels;
size_t calib_channels;
uint8_t *white_average_data;
uint8_t *dark_average_data;
uint16_t dark[3];