genesys: Use common path to compute ccd_size_divisor on gl646

merge-requests/142/head
Povilas Kanapickas 2019-08-25 23:34:38 +03:00
rodzic e2e1efae80
commit a6a785e28d
4 zmienionych plików z 22 dodań i 19 usunięć

Wyświetl plik

@ -317,9 +317,9 @@ static void gl646_compute_session(Genesys_Device* dev, ScanSession& s,
const Genesys_Sensor& sensor)
{
DBG_HELPER(dbg);
(void) sensor;
(void) dev;
s.params.assert_valid();
compute_session(dev, s, sensor);
s.computed = true;
}
@ -430,8 +430,6 @@ static void gl646_setup_registers(Genesys_Device* dev,
/* now we can search for the specific sensor settings */
i = 0;
unsigned ccd_size_divisor = sensor.ccd_size_divisor;
// now apply values from settings to registers
regs->set16(REG_EXPR, sensor.exposure.red);
regs->set16(REG_EXPG, sensor.exposure.green);
@ -598,8 +596,8 @@ static void gl646_setup_registers(Genesys_Device* dev,
/* at QUATER_STEP lines are 'staggered' and need correction */
stagger = 0;
if (ccd_size_divisor == 1 && (dev->model->flags & GENESYS_FLAG_STAGGERED_LINE)) {
/* for HP3670, stagger happens only at >=1200 dpi */
if (session.ccd_size_divisor == 1 && (dev->model->flags & GENESYS_FLAG_STAGGERED_LINE)) {
// for HP3670, stagger happens only at >=1200 dpi
if ((dev->model->motor_type != MOTOR_HP3670 && dev->model->motor_type != MOTOR_HP2400)
|| session.params.yres >= (unsigned) sensor.optical_res)
{
@ -624,11 +622,12 @@ static void gl646_setup_registers(Genesys_Device* dev,
}
/* scanner's x coordinates are expressed in physical DPI but they must be divided by cksel */
sx = startx / sensor.ccd_pixels_per_system_pixel() / ccd_size_divisor;
ex = endx / sensor.ccd_pixels_per_system_pixel() / ccd_size_divisor;
sx = startx / sensor.ccd_pixels_per_system_pixel() / session.ccd_size_divisor;
ex = endx / sensor.ccd_pixels_per_system_pixel() / session.ccd_size_divisor;
regs->set16(REG_STRPIXEL, sx);
regs->set16(REG_ENDPIXEL, ex);
DBG(DBG_info, "%s: startx=%d, endx=%d, ccd_size_divisor=%d\n", __func__, sx, ex, ccd_size_divisor);
DBG(DBG_info, "%s: startx=%d, endx=%d, ccd_size_divisor=%d\n", __func__, sx, ex,
session.ccd_size_divisor);
/* words_per_line must be computed according to the scan's resolution */
/* in fact, words_per_line _gives_ the actual scan resolution */
@ -649,7 +648,7 @@ static void gl646_setup_registers(Genesys_Device* dev,
DBG(DBG_info, "%s: wpl=%d\n", __func__, words_per_line);
regs->set24(REG_MAXWD, words_per_line);
regs->set16(REG_DPISET, sensor.real_resolution * sensor.ccd_size_divisor *
regs->set16(REG_DPISET, sensor.real_resolution * session.ccd_size_divisor *
sensor.ccd_pixels_per_system_pixel());
regs->set16(REG_LPERIOD, sensor.exposure_lperiod);
@ -834,7 +833,7 @@ static void gl646_setup_registers(Genesys_Device* dev,
dev->current_setup.lines = linecnt;
dev->current_setup.exposure_time = sensor.exposure_lperiod;
dev->current_setup.xres = sensor.real_resolution;
dev->current_setup.ccd_size_divisor = ccd_size_divisor;
dev->current_setup.ccd_size_divisor = session.ccd_size_divisor;
dev->current_setup.stagger = stagger;
dev->current_setup.max_shift = max_shift + stagger;

Wyświetl plik

@ -1135,11 +1135,10 @@ void compute_session(Genesys_Device* dev, ScanSession& s, const Genesys_Sensor&
DBG_HELPER(dbg);
(void) dev;
s.params.assert_valid();
// compute optical and output resolutions
s.ccd_size_divisor = sensor.get_ccd_size_divisor_for_dpi(s.params.xres);
s.params.assert_valid();
}
/** @brief initialize device

Wyświetl plik

@ -202,7 +202,6 @@ struct ScanSession {
// specifies the reduction (if any) of CCD effective dpi which is performed by latching the
// data coming from CCD in such a way that 1/2 or 3/4 of pixel data is ignored.
// except gl646
unsigned ccd_size_divisor = 1;
// the optical resolution of the scanner.

Wyświetl plik

@ -84,6 +84,12 @@ inline unsigned default_get_ccd_size_divisor_for_dpi(const Genesys_Sensor& senso
return 1;
}
inline unsigned get_ccd_size_divisor_exact(const Genesys_Sensor& sensor, unsigned xres)
{
(void) xres;
return sensor.ccd_size_divisor;
}
inline unsigned default_get_hwdpi_divisor_for_dpi(const Genesys_Sensor& sensor, unsigned xres)
{
return sensor.optical_res / default_get_logical_hwdpi(sensor, xres);
@ -287,7 +293,7 @@ void genesys_init_sensor_tables()
sensor.get_logical_hwdpi_fun = default_get_logical_hwdpi;
sensor.get_register_hwdpi_fun = default_get_logical_hwdpi;
sensor.get_hwdpi_divisor_fun = default_get_hwdpi_divisor_for_dpi;
sensor.get_ccd_size_divisor_fun = default_get_ccd_size_divisor_for_dpi;
sensor.get_ccd_size_divisor_fun = get_ccd_size_divisor_exact;
{
struct CustomSensorSettings {
@ -634,7 +640,7 @@ void genesys_init_sensor_tables()
sensor.get_logical_hwdpi_fun = default_get_logical_hwdpi;
sensor.get_register_hwdpi_fun = default_get_logical_hwdpi;
sensor.get_hwdpi_divisor_fun = default_get_hwdpi_divisor_for_dpi;
sensor.get_ccd_size_divisor_fun = default_get_ccd_size_divisor_for_dpi;
sensor.get_ccd_size_divisor_fun = get_ccd_size_divisor_exact;
{
struct CustomSensorSettings {
@ -868,7 +874,7 @@ void genesys_init_sensor_tables()
sensor.get_logical_hwdpi_fun = default_get_logical_hwdpi;
sensor.get_register_hwdpi_fun = default_get_logical_hwdpi;
sensor.get_hwdpi_divisor_fun = default_get_hwdpi_divisor_for_dpi;
sensor.get_ccd_size_divisor_fun = default_get_ccd_size_divisor_for_dpi;
sensor.get_ccd_size_divisor_fun = get_ccd_size_divisor_exact;
{
struct CustomSensorSettings {
@ -1148,7 +1154,7 @@ void genesys_init_sensor_tables()
sensor.get_logical_hwdpi_fun = default_get_logical_hwdpi;
sensor.get_register_hwdpi_fun = default_get_logical_hwdpi;
sensor.get_hwdpi_divisor_fun = default_get_hwdpi_divisor_for_dpi;
sensor.get_ccd_size_divisor_fun = default_get_ccd_size_divisor_for_dpi;
sensor.get_ccd_size_divisor_fun = get_ccd_size_divisor_exact;
{
struct CustomSensorSettings {
@ -1223,7 +1229,7 @@ void genesys_init_sensor_tables()
sensor.get_logical_hwdpi_fun = default_get_logical_hwdpi;
sensor.get_register_hwdpi_fun = default_get_logical_hwdpi;
sensor.get_hwdpi_divisor_fun = default_get_hwdpi_divisor_for_dpi;
sensor.get_ccd_size_divisor_fun = default_get_ccd_size_divisor_for_dpi;
sensor.get_ccd_size_divisor_fun = get_ccd_size_divisor_exact;
{
struct CustomSensorSettings {