kopia lustrzana https://gitlab.com/sane-project/backends
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
rodzic
4f526dbb24
commit
ad1f7de9e0
|
@ -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>
|
2009-04-16 Stéphane Voltz <stef.dev@free.fr>
|
||||||
* backend/genesys.h backend/genesys.c backend/genesys_gl646.c
|
* backend/genesys.h backend/genesys.c backend/genesys_gl646.c
|
||||||
backend/genesys_devices.c: y scan position fixes
|
backend/genesys_devices.c: y scan position fixes
|
||||||
|
|
|
@ -2241,21 +2241,8 @@ genesys_dark_shading_calibration (Genesys_Device * dev)
|
||||||
|
|
||||||
DBG (DBG_proc, "genesys_dark_shading_calibration\n");
|
DBG (DBG_proc, "genesys_dark_shading_calibration\n");
|
||||||
/* end pixel - start pixel */
|
/* 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;
|
pixels_per_line = dev->calib_pixels;
|
||||||
}
|
channels = dev->calib_channels;
|
||||||
|
|
||||||
if (dev->settings.scan_mode == SCAN_MODE_COLOR) /* single pass color */
|
|
||||||
channels = 3;
|
|
||||||
else
|
|
||||||
channels = 1;
|
|
||||||
|
|
||||||
FREE_IFNOT_NULL (dev->dark_average_data);
|
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",
|
DBG (DBG_proc, "genesys_white_shading_calibration (lines = %d)\n",
|
||||||
dev->model->shading_lines);
|
dev->model->shading_lines);
|
||||||
|
|
||||||
if (dev->model->asic_type != GENESYS_GL646)
|
pixels_per_line = dev->calib_pixels;
|
||||||
{
|
channels = dev->calib_channels;
|
||||||
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;
|
|
||||||
|
|
||||||
if (dev->white_average_data)
|
if (dev->white_average_data)
|
||||||
free (dev->white_average_data);
|
free (dev->white_average_data);
|
||||||
|
@ -2583,6 +2557,9 @@ genesys_white_shading_calibration (Genesys_Device * dev)
|
||||||
return SANE_STATUS_GOOD;
|
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
|
static SANE_Status
|
||||||
genesys_dark_white_shading_calibration (Genesys_Device * dev)
|
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",
|
DBG (DBG_proc, "genesys_black_white_shading_calibration (lines = %d)\n",
|
||||||
dev->model->shading_lines);
|
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 */
|
pixels_per_line = dev->calib_pixels;
|
||||||
channels = 3;
|
channels = dev->calib_channels;
|
||||||
else
|
|
||||||
channels = 1;
|
|
||||||
|
|
||||||
if (dev->white_average_data)
|
if (dev->white_average_data)
|
||||||
free (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 */
|
/* turn on motor and lamp power */
|
||||||
dev->model->cmd_set->set_lamp_power (dev, dev->calib_reg, SANE_TRUE);
|
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 =
|
status =
|
||||||
dev->model->cmd_set->bulk_write_register (dev, dev->calib_reg,
|
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;
|
pixels_per_line = dev->calib_pixels;
|
||||||
|
channels = dev->calib_channels;
|
||||||
if (dev->settings.scan_mode == SCAN_MODE_COLOR) /* single pass color */
|
|
||||||
channels = 3;
|
|
||||||
else
|
|
||||||
channels = 1;
|
|
||||||
|
|
||||||
/* we always build data for three channels, even for gray */
|
/* we always build data for three channels, even for gray */
|
||||||
if (dev->model->is_cis)
|
if (dev->model->is_cis)
|
||||||
|
@ -3053,7 +3021,9 @@ genesys_send_shading_coefficient (Genesys_Device * dev)
|
||||||
avgpixels = dev->sensor.optical_res / res;
|
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 */
|
/* 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;
|
avgpixels = avgpixels;
|
||||||
else if (avgpixels < 8)
|
else if (avgpixels < 8)
|
||||||
avgpixels = 6;
|
avgpixels = 6;
|
||||||
|
@ -3243,6 +3213,7 @@ genesys_restore_calibration (Genesys_Device * dev)
|
||||||
|
|
||||||
dev->average_size = cache->average_size;
|
dev->average_size = cache->average_size;
|
||||||
dev->calib_pixels = cache->calib_pixels;
|
dev->calib_pixels = cache->calib_pixels;
|
||||||
|
dev->calib_channels = cache->calib_channels;
|
||||||
|
|
||||||
dev->dark_average_data = (uint8_t*)malloc(cache->average_size);
|
dev->dark_average_data = (uint8_t*)malloc(cache->average_size);
|
||||||
dev->white_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));
|
memcpy (&cache->sensor, &dev->sensor, sizeof (cache->sensor));
|
||||||
|
|
||||||
cache->calib_pixels = dev->calib_pixels;
|
cache->calib_pixels = dev->calib_pixels;
|
||||||
|
cache->calib_channels = dev->calib_channels;
|
||||||
memcpy (cache->dark_average_data, dev->dark_average_data,
|
memcpy (cache->dark_average_data, dev->dark_average_data,
|
||||||
cache->average_size);
|
cache->average_size);
|
||||||
memcpy (cache->white_average_data, dev->white_average_data,
|
memcpy (cache->white_average_data, dev->white_average_data,
|
||||||
|
@ -3537,14 +3509,6 @@ genesys_flatbed_calibration (Genesys_Device * dev)
|
||||||
return status;
|
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)
|
if (dev->model->flags & GENESYS_FLAG_DARK_WHITE_CALIBRATION)
|
||||||
{
|
{
|
||||||
status = genesys_dark_white_shading_calibration (dev);
|
status = genesys_dark_white_shading_calibration (dev);
|
||||||
|
|
|
@ -3413,6 +3413,7 @@ gl646_init_regs_for_shading (Genesys_Device * dev)
|
||||||
|
|
||||||
/* used when sending shading calibration data */
|
/* used when sending shading calibration data */
|
||||||
dev->calib_pixels = settings.pixels;
|
dev->calib_pixels = settings.pixels;
|
||||||
|
dev->calib_channels = dev->current_setup.channels;
|
||||||
|
|
||||||
/* no shading */
|
/* no shading */
|
||||||
dev->reg[reg_0x01].value &= ~REG01_DVDSET;
|
dev->reg[reg_0x01].value &= ~REG01_DVDSET;
|
||||||
|
|
|
@ -4447,16 +4447,12 @@ static SANE_Status
|
||||||
gl841_init_regs_for_shading (Genesys_Device * dev)
|
gl841_init_regs_for_shading (Genesys_Device * dev)
|
||||||
{
|
{
|
||||||
SANE_Status status;
|
SANE_Status status;
|
||||||
uint8_t channels;
|
|
||||||
|
|
||||||
|
|
||||||
DBG (DBG_proc, "gl841_init_regs_for_shading: lines = %d\n",
|
DBG (DBG_proc, "gl841_init_regs_for_shading: lines = %d\n",
|
||||||
dev->model->shading_lines);
|
dev->model->shading_lines);
|
||||||
|
|
||||||
if (dev->settings.scan_mode == SCAN_MODE_COLOR) /* single pass color */
|
dev->calib_channels = 3;
|
||||||
channels = 3;
|
dev->calib_pixels = (dev->sensor.sensor_pixels * dev->settings.xres) / dev->sensor.optical_res;
|
||||||
else
|
|
||||||
channels = 1;
|
|
||||||
|
|
||||||
status = gl841_init_scan_regs (dev,
|
status = gl841_init_scan_regs (dev,
|
||||||
dev->calib_reg,
|
dev->calib_reg,
|
||||||
|
@ -4464,10 +4460,10 @@ gl841_init_regs_for_shading (Genesys_Device * dev)
|
||||||
dev->motor.base_ydpi,
|
dev->motor.base_ydpi,
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
(dev->sensor.sensor_pixels * dev->settings.xres) / dev->sensor.optical_res,
|
dev->calib_pixels,
|
||||||
dev->model->shading_lines,
|
dev->model->shading_lines,
|
||||||
16,
|
16,
|
||||||
channels,
|
dev->calib_channels,
|
||||||
dev->settings.color_filter,
|
dev->settings.color_filter,
|
||||||
SCAN_FLAG_DISABLE_SHADING |
|
SCAN_FLAG_DISABLE_SHADING |
|
||||||
SCAN_FLAG_DISABLE_GAMMA |
|
SCAN_FLAG_DISABLE_GAMMA |
|
||||||
|
@ -5582,8 +5578,6 @@ gl841_is_compatible_calibration (Genesys_Device * dev,
|
||||||
|
|
||||||
DBG (DBG_proc, "gl841_is_compatible_calibration: checking\n");
|
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)
|
if (dev->current_setup.half_ccd != cache->used_setup.half_ccd)
|
||||||
return SANE_STATUS_UNSUPPORTED;
|
return SANE_STATUS_UNSUPPORTED;
|
||||||
|
|
||||||
|
|
|
@ -523,6 +523,7 @@ struct Genesys_Calibration_Cache
|
||||||
Genesys_Sensor sensor;
|
Genesys_Sensor sensor;
|
||||||
|
|
||||||
size_t calib_pixels;
|
size_t calib_pixels;
|
||||||
|
size_t calib_channels;
|
||||||
size_t average_size;
|
size_t average_size;
|
||||||
uint8_t *white_average_data;
|
uint8_t *white_average_data;
|
||||||
uint8_t *dark_average_data;
|
uint8_t *dark_average_data;
|
||||||
|
@ -551,6 +552,7 @@ struct Genesys_Device
|
||||||
|
|
||||||
size_t average_size;
|
size_t average_size;
|
||||||
size_t calib_pixels;
|
size_t calib_pixels;
|
||||||
|
size_t calib_channels;
|
||||||
uint8_t *white_average_data;
|
uint8_t *white_average_data;
|
||||||
uint8_t *dark_average_data;
|
uint8_t *dark_average_data;
|
||||||
uint16_t dark[3];
|
uint16_t dark[3];
|
||||||
|
|
Ładowanie…
Reference in New Issue