kopia lustrzana https://gitlab.com/sane-project/backends
genesys: Add support for half-ccd and quarter-ccd modes on the same chip
Previously we hardcoded half-ccd mode to be actually quarter-ccd mode on GL843.merge-requests/81/head
rodzic
8a9a4e3f71
commit
36872e5751
|
@ -2340,7 +2340,8 @@ compute_averaged_planar (Genesys_Device * dev, const Genesys_Sensor& sensor,
|
|||
*/
|
||||
res = dev->settings.xres;
|
||||
|
||||
if (sensor.half_ccd_mode && dev->settings.xres <= sensor.optical_res / 2) {
|
||||
if (sensor.get_ccd_size_divisor_for_dpi(dev->settings.xres) > 1)
|
||||
{
|
||||
res *= 2;
|
||||
}
|
||||
|
||||
|
@ -2634,8 +2635,7 @@ compute_shifted_coefficients (Genesys_Device * dev,
|
|||
unsigned int patch_cnt = offset * 3; /* at start, offset of first patch */
|
||||
|
||||
x = dev->settings.xres;
|
||||
if ((sensor.half_ccd_mode) &&
|
||||
(dev->settings.xres <= sensor.optical_res / 2))
|
||||
if (sensor.get_ccd_size_divisor_for_dpi(dev->settings.xres) > 1)
|
||||
x *= 2; /* scanner is using half-ccd mode */
|
||||
basepixels = sensor.optical_res / x; /*this should be evenly dividable */
|
||||
|
||||
|
|
|
@ -388,7 +388,7 @@ void genesys_init_sensor_tables()
|
|||
sensor = Genesys_Sensor();
|
||||
sensor.sensor_id = CCD_5345;
|
||||
sensor.optical_res = 1200;
|
||||
sensor.half_ccd_mode = true;
|
||||
sensor.ccd_size_divisor = 2;
|
||||
sensor.black_pixels = 48;
|
||||
sensor.dummy_pixel = 16;
|
||||
sensor.CCD_start_xoffset = 0;
|
||||
|
@ -471,7 +471,7 @@ void genesys_init_sensor_tables()
|
|||
sensor = Genesys_Sensor();
|
||||
sensor.sensor_id = CCD_HP2300;
|
||||
sensor.optical_res = 600;
|
||||
sensor.half_ccd_mode = true;
|
||||
sensor.ccd_size_divisor = 2;
|
||||
sensor.black_pixels = 48;
|
||||
sensor.dummy_pixel = 20;
|
||||
sensor.CCD_start_xoffset = 0;
|
||||
|
@ -513,7 +513,7 @@ void genesys_init_sensor_tables()
|
|||
sensor = Genesys_Sensor();
|
||||
sensor.sensor_id = CCD_CANONLIDE35;
|
||||
sensor.optical_res = 1200;
|
||||
sensor.half_ccd_mode = true;
|
||||
sensor.ccd_size_divisor = 2;
|
||||
sensor.black_pixels = 87;
|
||||
sensor.dummy_pixel = 87;
|
||||
sensor.CCD_start_xoffset = 0;
|
||||
|
@ -1188,7 +1188,7 @@ void genesys_init_sensor_tables()
|
|||
sensor = Genesys_Sensor();
|
||||
sensor.sensor_id = CCD_CS4400F;
|
||||
sensor.optical_res = 4800;
|
||||
sensor.half_ccd_mode = true; // FIXME: actually quarter CCD mode
|
||||
sensor.ccd_size_divisor = 4;
|
||||
sensor.black_pixels = 50*8;
|
||||
// 31 at 600 dpi, 58 at 1200 dpi
|
||||
sensor.dummy_pixel = 20;
|
||||
|
@ -1277,7 +1277,7 @@ void genesys_init_sensor_tables()
|
|||
sensor = Genesys_Sensor();
|
||||
sensor.sensor_id = CCD_CS8600F;
|
||||
sensor.optical_res = 4800;
|
||||
sensor.half_ccd_mode = true; // FIXME: actually quarter CCD mode
|
||||
sensor.ccd_size_divisor = 4;
|
||||
sensor.black_pixels = 31;
|
||||
sensor.dummy_pixel = 20;
|
||||
sensor.CCD_start_xoffset = 0; // not used at the moment
|
||||
|
@ -1375,7 +1375,7 @@ void genesys_init_sensor_tables()
|
|||
sensor = Genesys_Sensor();
|
||||
sensor.sensor_id = CCD_HP_N6310;
|
||||
sensor.optical_res = 2400;
|
||||
// sensor.half_ccd_mode = true; Possibly half CCD, needs checking
|
||||
// sensor.ccd_size_divisor = 2; Possibly half CCD, needs checking
|
||||
sensor.black_pixels = 96;
|
||||
sensor.dummy_pixel = 26;
|
||||
sensor.CCD_start_xoffset = 128;
|
||||
|
@ -1417,7 +1417,7 @@ void genesys_init_sensor_tables()
|
|||
sensor = Genesys_Sensor();
|
||||
sensor.sensor_id = CIS_CANONLIDE110;
|
||||
sensor.optical_res = 2400;
|
||||
sensor.half_ccd_mode = true;
|
||||
sensor.ccd_size_divisor = 2;
|
||||
sensor.black_pixels = 87;
|
||||
sensor.dummy_pixel = 16;
|
||||
sensor.CCD_start_xoffset = 303;
|
||||
|
@ -1459,7 +1459,7 @@ void genesys_init_sensor_tables()
|
|||
sensor = Genesys_Sensor();
|
||||
sensor.sensor_id = CIS_CANONLIDE120;
|
||||
sensor.optical_res = 2400;
|
||||
sensor.half_ccd_mode = true;
|
||||
sensor.ccd_size_divisor = 2;
|
||||
sensor.black_pixels = 87;
|
||||
sensor.dummy_pixel = 16;
|
||||
sensor.CCD_start_xoffset = 303;
|
||||
|
@ -1502,7 +1502,7 @@ void genesys_init_sensor_tables()
|
|||
sensor = Genesys_Sensor();
|
||||
sensor.sensor_id = CIS_CANONLIDE210;
|
||||
sensor.optical_res = 2400;
|
||||
sensor.half_ccd_mode = true;
|
||||
sensor.ccd_size_divisor = 2;
|
||||
sensor.black_pixels = 87;
|
||||
sensor.dummy_pixel = 16;
|
||||
sensor.CCD_start_xoffset = 303;
|
||||
|
@ -1544,7 +1544,7 @@ void genesys_init_sensor_tables()
|
|||
sensor = Genesys_Sensor();
|
||||
sensor.sensor_id = CIS_CANONLIDE220;
|
||||
sensor.optical_res = 2400;
|
||||
sensor.half_ccd_mode = true;
|
||||
sensor.ccd_size_divisor = 2;
|
||||
sensor.black_pixels = 87;
|
||||
sensor.dummy_pixel = 16;
|
||||
sensor.CCD_start_xoffset = 303;
|
||||
|
@ -1586,7 +1586,7 @@ void genesys_init_sensor_tables()
|
|||
sensor = Genesys_Sensor();
|
||||
sensor.sensor_id = CCD_PLUSTEK_3600;
|
||||
sensor.optical_res = 1200;
|
||||
sensor.half_ccd_mode = true;
|
||||
sensor.ccd_size_divisor = 2;
|
||||
sensor.black_pixels = 87;
|
||||
sensor.dummy_pixel = 87;
|
||||
sensor.CCD_start_xoffset = 0;
|
||||
|
@ -1710,7 +1710,7 @@ void genesys_init_sensor_tables()
|
|||
sensor = Genesys_Sensor();
|
||||
sensor.sensor_id = CIS_CANONLIDE80,
|
||||
sensor.optical_res = 1200; // real hardware limit is 2400
|
||||
sensor.half_ccd_mode = true;
|
||||
sensor.ccd_size_divisor = 2;
|
||||
sensor.black_pixels = 20;
|
||||
sensor.dummy_pixel = 6;
|
||||
// tuned to give 3*8 multiple startx coordinate during shading calibration
|
||||
|
|
|
@ -171,7 +171,7 @@ SANE_Status status=SANE_STATUS_GOOD;
|
|||
static SANE_Bool compute_half_ccd(const Genesys_Sensor& sensor, int xres)
|
||||
{
|
||||
/* we have 2 domains for ccd: xres below or above half ccd max dpi */
|
||||
if (xres<=300 && sensor.half_ccd_mode)
|
||||
if (xres<=300 && sensor.ccd_size_divisor > 1)
|
||||
{
|
||||
return SANE_TRUE;
|
||||
}
|
||||
|
|
|
@ -2742,7 +2742,7 @@ gl646_init_regs_for_shading (Genesys_Device * dev, const Genesys_Sensor& sensor)
|
|||
DBG(DBG_proc, "%s: start\n", __func__);
|
||||
|
||||
/* when shading all (full width) line, we must adapt to half_ccd case */
|
||||
if (sensor.half_ccd_mode)
|
||||
if (sensor.ccd_size_divisor > 1)
|
||||
{
|
||||
/* walk the master mode list to find if half_ccd */
|
||||
if (is_half_ccd (dev->model->ccd_type, dev->settings.xres, SANE_TRUE) ==
|
||||
|
@ -4880,7 +4880,7 @@ gl646_search_strip(Genesys_Device * dev, const Genesys_Sensor& sensor, SANE_Bool
|
|||
|
||||
DBG(DBG_proc, "%s: start\n", __func__);
|
||||
/* adapt to half_ccd case */
|
||||
if (sensor.half_ccd_mode)
|
||||
if (sensor.ccd_size_divisor > 1)
|
||||
{
|
||||
/* walk the master mode list to find if half_ccd */
|
||||
if (is_half_ccd (dev->model->ccd_type, res, SANE_TRUE) == SANE_TRUE)
|
||||
|
|
|
@ -2238,11 +2238,10 @@ independent of our calculated values:
|
|||
|
||||
/* half_ccd */
|
||||
/* we have 2 domains for ccd: xres below or above half ccd max dpi */
|
||||
if (sensor.optical_res < 2 * xres ||
|
||||
!(sensor.half_ccd_mode)) {
|
||||
half_ccd = SANE_FALSE;
|
||||
} else {
|
||||
if (sensor.get_ccd_size_divisor_for_dpi(xres) > 1) {
|
||||
half_ccd = SANE_TRUE;
|
||||
} else {
|
||||
half_ccd = SANE_FALSE;
|
||||
}
|
||||
|
||||
/* optical_res */
|
||||
|
@ -2604,11 +2603,10 @@ static SANE_Status gl841_calculate_current_setup(Genesys_Device * dev, const Gen
|
|||
|
||||
/* half_ccd */
|
||||
/* we have 2 domains for ccd: xres below or above half ccd max dpi */
|
||||
if ((sensor.optical_res < 2 * xres) ||
|
||||
!(sensor.half_ccd_mode)) {
|
||||
half_ccd = SANE_FALSE;
|
||||
} else {
|
||||
if (sensor.get_ccd_size_divisor_for_dpi(xres) > 1) {
|
||||
half_ccd = SANE_TRUE;
|
||||
} else {
|
||||
half_ccd = SANE_FALSE;
|
||||
}
|
||||
|
||||
/* optical_res */
|
||||
|
|
|
@ -1375,12 +1375,11 @@ static void gl843_compute_session(Genesys_Device* dev, ScanSession& s,
|
|||
const Genesys_Sensor& sensor)
|
||||
{
|
||||
s.params.assert_valid();
|
||||
if (sensor.optical_res < 4 * s.params.xres ||
|
||||
!(sensor.half_ccd_mode))
|
||||
if (sensor.get_ccd_size_divisor_for_dpi(s.params.xres) > 1)
|
||||
{
|
||||
s.half_ccd = SANE_FALSE;
|
||||
} else {
|
||||
s.half_ccd = SANE_TRUE;
|
||||
} else {
|
||||
s.half_ccd = SANE_FALSE;
|
||||
}
|
||||
|
||||
s.optical_resolution = sensor.optical_res;
|
||||
|
@ -1680,14 +1679,13 @@ gl843_calculate_current_setup(Genesys_Device * dev, const Genesys_Sensor& sensor
|
|||
yres = dev->settings.yres;
|
||||
|
||||
/* we have 2 domains for ccd: xres below or above half ccd max dpi */
|
||||
if ((sensor.optical_res < 4 * xres) ||
|
||||
!(sensor.half_ccd_mode))
|
||||
if (sensor.get_ccd_size_divisor_for_dpi(xres) > 1)
|
||||
{
|
||||
half_ccd = SANE_FALSE;
|
||||
half_ccd = SANE_TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
half_ccd = SANE_TRUE;
|
||||
half_ccd = SANE_FALSE;
|
||||
}
|
||||
|
||||
/* channels */
|
||||
|
|
|
@ -1148,14 +1148,13 @@ gl846_init_scan_regs (Genesys_Device * dev, const Genesys_Sensor& sensor,
|
|||
__func__, xres, yres, lines, pixels, startx, starty, depth, channels, flags);
|
||||
|
||||
/* we may have 2 domains for ccd: xres below or above half ccd max dpi */
|
||||
if (sensor.optical_res < 2 * xres ||
|
||||
!(sensor.half_ccd_mode))
|
||||
if (sensor.get_ccd_size_divisor_for_dpi(xres) > 1)
|
||||
{
|
||||
half_ccd = SANE_FALSE;
|
||||
half_ccd = SANE_TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
half_ccd = SANE_TRUE;
|
||||
half_ccd = SANE_FALSE;
|
||||
}
|
||||
|
||||
/* optical_res */
|
||||
|
@ -1429,14 +1428,10 @@ gl846_calculate_current_setup(Genesys_Device * dev, const Genesys_Sensor& sensor
|
|||
|
||||
/* half_ccd */
|
||||
/* we have 2 domains for ccd: xres below or above half ccd max dpi */
|
||||
if ((sensor.optical_res < 2 * xres) ||
|
||||
!(sensor.half_ccd_mode))
|
||||
{
|
||||
half_ccd = SANE_FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
half_ccd = SANE_TRUE;
|
||||
if (sensor.get_ccd_size_divisor_for_dpi(xres) > 1) {
|
||||
half_ccd = SANE_TRUE;
|
||||
} else {
|
||||
half_ccd = SANE_FALSE;
|
||||
}
|
||||
|
||||
/* optical_res */
|
||||
|
|
|
@ -1163,14 +1163,13 @@ gl847_init_scan_regs (Genesys_Device * dev,
|
|||
__func__, xres, yres, lines, pixels, startx, starty, depth, channels, flags);
|
||||
|
||||
/* we may have 2 domains for ccd: xres below or above half ccd max dpi */
|
||||
if (sensor.optical_res < 2 * xres ||
|
||||
!(sensor.half_ccd_mode))
|
||||
if (sensor.get_ccd_size_divisor_for_dpi(xres) > 1)
|
||||
{
|
||||
half_ccd = SANE_FALSE;
|
||||
half_ccd = SANE_TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
half_ccd = SANE_TRUE;
|
||||
half_ccd = SANE_FALSE;
|
||||
}
|
||||
|
||||
/* optical_res */
|
||||
|
@ -1444,14 +1443,10 @@ gl847_calculate_current_setup(Genesys_Device * dev, const Genesys_Sensor& sensor
|
|||
|
||||
/* half_ccd */
|
||||
/* we have 2 domains for ccd: xres below or above half ccd max dpi */
|
||||
if ((sensor.optical_res < 2 * xres) ||
|
||||
!(sensor.half_ccd_mode))
|
||||
{
|
||||
half_ccd = SANE_FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
half_ccd = SANE_TRUE;
|
||||
if (sensor.get_ccd_size_divisor_for_dpi(xres) > 1) {
|
||||
half_ccd = SANE_TRUE;
|
||||
} else {
|
||||
half_ccd = SANE_FALSE;
|
||||
}
|
||||
|
||||
/* optical_res */
|
||||
|
|
|
@ -529,8 +529,8 @@ struct Genesys_Sensor {
|
|||
// whether the sensor is transparency sensor.
|
||||
bool is_transparency = false;
|
||||
|
||||
// half or quarter CCD mode
|
||||
bool half_ccd_mode = false;
|
||||
// CCD may present itself as half or quarter-size CCD on certain resolutions
|
||||
int ccd_size_divisor = 1;
|
||||
|
||||
int black_pixels = 0;
|
||||
// value of the dummy register
|
||||
|
@ -599,6 +599,14 @@ struct Genesys_Sensor {
|
|||
::fwrite(&custom_regs[i].mask, sizeof(custom_regs[i].mask), 1, fp);
|
||||
}
|
||||
}
|
||||
|
||||
int get_ccd_size_divisor_for_dpi(int xres) const
|
||||
{
|
||||
if (ccd_size_divisor > 1 && xres * ccd_size_divisor <= optical_res) {
|
||||
return ccd_size_divisor;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
};
|
||||
|
||||
struct Genesys_Gpo
|
||||
|
|
Ładowanie…
Reference in New Issue