genesys: Use scan params to compute scan geometry, not settings

merge-requests/82/head
Povilas Kanapickas 2019-06-08 14:04:18 +03:00
rodzic 2a8f642787
commit 65bb8724c6
5 zmienionych plików z 40 dodań i 44 usunięć

Wyświetl plik

@ -358,7 +358,6 @@ static int get_cksel(int sensor_id, int required, unsigned channels)
* the device. * the device.
* @param dev pointer to a struct describing the device * @param dev pointer to a struct describing the device
* @param regs register set to fill * @param regs register set to fill
* @param scan_settings scan's settings
* @param slope_table1 first motor table to fill * @param slope_table1 first motor table to fill
* @param slope_table2 second motor table to fill * @param slope_table2 second motor table to fill
* @return SANE_STATUS_GOOD if registers could be set, SANE_STATUS_INVAL if * @return SANE_STATUS_GOOD if registers could be set, SANE_STATUS_INVAL if
@ -372,7 +371,6 @@ gl646_setup_registers (Genesys_Device * dev,
const Genesys_Sensor& sensor, const Genesys_Sensor& sensor,
Genesys_Register_Set * regs, Genesys_Register_Set * regs,
SetupParams& params, SetupParams& params,
Genesys_Settings scan_settings,
uint16_t * slope_table1, uint16_t * slope_table1,
uint16_t * slope_table2, uint16_t * slope_table2,
bool xcorrection) bool xcorrection)
@ -635,8 +633,7 @@ gl646_setup_registers (Genesys_Device * dev,
/* select XPA */ /* select XPA */
regs->find_reg(0x03).value &= ~REG03_XPASEL; regs->find_reg(0x03).value &= ~REG03_XPASEL;
if (scan_settings.scan_method == ScanMethod::TRANSPARENCY) if (params.flags & SCAN_FLAG_USE_XPA) {
{
regs->find_reg(0x03).value |= REG03_XPASEL; regs->find_reg(0x03).value |= REG03_XPASEL;
} }
@ -703,7 +700,7 @@ gl646_setup_registers (Genesys_Device * dev,
{ {
/* reset count of dummy lines to zero */ /* reset count of dummy lines to zero */
regs->find_reg(0x1e).value &= ~REG1E_LINESEL; regs->find_reg(0x1e).value &= ~REG1E_LINESEL;
if (scan_settings.xres >= 1200) if (params.xres >= 1200)
{ {
/* there must be one dummy line */ /* there must be one dummy line */
regs->find_reg(0x1e).value |= 1 & REG1E_LINESEL; regs->find_reg(0x1e).value |= 1 & REG1E_LINESEL;
@ -725,21 +722,20 @@ gl646_setup_registers (Genesys_Device * dev,
regs->find_reg(0x24).value = motor->steps1; regs->find_reg(0x24).value = motor->steps1;
/* scanned area height must be enlarged by max color shift needed */ /* scanned area height must be enlarged by max color shift needed */
max_shift=sanei_genesys_compute_max_shift(dev,params.channels,scan_settings.yres,0); max_shift=sanei_genesys_compute_max_shift(dev,params.channels, params.yres, 0);
/* we adjust linecnt according to real motor dpi */ /* we adjust linecnt according to real motor dpi */
linecnt = (linecnt * motor->ydpi) / scan_settings.yres + max_shift; linecnt = (linecnt * motor->ydpi) / params.yres + max_shift;
/* at QUATER_STEP lines are 'staggered' and need correction */ /* at QUATER_STEP lines are 'staggered' and need correction */
stagger = 0; stagger = 0;
if ((!half_ccd) && (dev->model->flags & GENESYS_FLAG_STAGGERED_LINE)) if ((!half_ccd) && (dev->model->flags & GENESYS_FLAG_STAGGERED_LINE))
{ {
/* for HP3670, stagger happens only at >=1200 dpi */ /* for HP3670, stagger happens only at >=1200 dpi */
if ((dev->model->motor_type != MOTOR_HP3670 if ((dev->model->motor_type != MOTOR_HP3670 && dev->model->motor_type != MOTOR_HP2400)
&& dev->model->motor_type != MOTOR_HP2400) || params.yres >= (unsigned) sensor.optical_res)
|| scan_settings.yres >= sensor.optical_res)
{ {
stagger = (4 * scan_settings.yres) / dev->motor.base_ydpi; stagger = (4 * params.yres) / dev->motor.base_ydpi;
} }
} }
linecnt += stagger; linecnt += stagger;
@ -951,7 +947,7 @@ gl646_setup_registers (Genesys_Device * dev,
requested_buffer_size = 8 * words_per_line; requested_buffer_size = 8 * words_per_line;
read_buffer_size = read_buffer_size =
2 * requested_buffer_size + 2 * requested_buffer_size +
((max_shift + stagger) * scan_settings.pixels * params.channels * params.depth) / 8; ((max_shift + stagger) * params.pixels * params.channels * params.depth) / 8;
dev->read_buffer.clear(); dev->read_buffer.clear();
dev->read_buffer.alloc(read_buffer_size); dev->read_buffer.alloc(read_buffer_size);
@ -963,7 +959,7 @@ gl646_setup_registers (Genesys_Device * dev,
dev->shrink_buffer.alloc(requested_buffer_size); dev->shrink_buffer.alloc(requested_buffer_size);
dev->out_buffer.clear(); dev->out_buffer.clear();
dev->out_buffer.alloc(8 * scan_settings.pixels * params.channels * bpp); dev->out_buffer.alloc(8 * params.pixels * params.channels * bpp);
/* scan bytes to read */ /* scan bytes to read */
dev->read_bytes_left = words_per_line * linecnt; dev->read_bytes_left = words_per_line * linecnt;
@ -988,15 +984,12 @@ gl646_setup_registers (Genesys_Device * dev,
* read_bytes_left is the number of bytes to read from the scanner * read_bytes_left is the number of bytes to read from the scanner
*/ */
dev->total_bytes_read = 0; dev->total_bytes_read = 0;
if (params.depth == 1) if (params.depth == 1) {
dev->total_bytes_to_read = dev->total_bytes_to_read = ((params.pixels * params.lines) / 8 +
((scan_settings.pixels * scan_settings.lines) / 8 + (((params.pixels * params.lines) % 8) ? 1 : 0)) * params.channels;
(((scan_settings.pixels * scan_settings.lines) % 8) ? 1 : 0)) * } else {
params.channels; dev->total_bytes_to_read = params.pixels * params.lines * params.channels * bpp;
else { }
dev->total_bytes_to_read =
scan_settings.pixels * scan_settings.lines * params.channels * bpp;
}
/* select color filter based on settings */ /* select color filter based on settings */
regs->find_reg(0x04).value &= ~REG04_FILTER; regs->find_reg(0x04).value &= ~REG04_FILTER;
@ -2976,13 +2969,16 @@ setup_for_scan (Genesys_Device * dev,
params.scan_mode = settings.scan_mode; params.scan_mode = settings.scan_mode;
params.color_filter = settings.color_filter; params.color_filter = settings.color_filter;
params.flags = 0; params.flags = 0;
if (settings.scan_method == ScanMethod::TRANSPARENCY) {
params.flags |= SCAN_FLAG_USE_XPA;
}
uint16_t slope_table0[256] = {}; uint16_t slope_table0[256] = {};
uint16_t slope_table1[256] = {}; uint16_t slope_table1[256] = {};
/* set up correct values for scan (gamma and shading enabled) */ /* set up correct values for scan (gamma and shading enabled) */
status = gl646_setup_registers(dev, sensor, regs, params, settings, status = gl646_setup_registers(dev, sensor, regs, params, slope_table0, slope_table1,
slope_table0, slope_table1, xcorrection); xcorrection);
if (status != SANE_STATUS_GOOD) if (status != SANE_STATUS_GOOD)
{ {
DBG(DBG_error, "%s: failed setup registers: %s\n", __func__, sane_strstatus(status)); DBG(DBG_error, "%s: failed setup registers: %s\n", __func__, sane_strstatus(status));

Wyświetl plik

@ -213,7 +213,6 @@ static SANE_Status
gl646_setup_registers (Genesys_Device * dev, gl646_setup_registers (Genesys_Device * dev,
const Genesys_Sensor& sensor, const Genesys_Sensor& sensor,
Genesys_Register_Set * regs, SetupParams& params, Genesys_Register_Set * regs, SetupParams& params,
Genesys_Settings scan_settings,
uint16_t * slope_table1, uint16_t * slope_table1,
uint16_t * slope_table2, uint16_t * slope_table2,
bool xcorrection); bool xcorrection);

Wyświetl plik

@ -1578,7 +1578,8 @@ static SANE_Status gl843_init_scan_regs(Genesys_Device* dev, const Genesys_Senso
dev->shrink_buffer.alloc(requested_buffer_size); dev->shrink_buffer.alloc(requested_buffer_size);
dev->out_buffer.clear(); dev->out_buffer.clear();
dev->out_buffer.alloc((8 * dev->settings.pixels * session.params.channels * session.params.depth) / 8); dev->out_buffer.alloc((8 * session.params.pixels * session.params.channels *
session.params.depth) / 8);
dev->read_bytes_left = session.output_line_bytes * session.output_line_count; dev->read_bytes_left = session.output_line_bytes * session.output_line_count;
@ -1598,14 +1599,14 @@ static SANE_Status gl843_init_scan_regs(Genesys_Device* dev, const Genesys_Senso
dev->current_setup.max_shift = session.max_color_shift_lines + session.num_staggered_lines; dev->current_setup.max_shift = session.max_color_shift_lines + session.num_staggered_lines;
dev->total_bytes_read = 0; dev->total_bytes_read = 0;
if (session.params.depth == 1) if (session.params.depth == 1) {
dev->total_bytes_to_read = dev->total_bytes_to_read = ((session.params.pixels * session.params.lines) / 8 +
((dev->settings.pixels * dev->settings.lines) / 8 + (((session.params.pixels * session.params.lines) % 8) ? 1 : 0)) *
(((dev->settings.pixels * dev->settings.lines) % 8) ? 1 : 0)) * session.params.channels;
session.params.channels; } else {
else dev->total_bytes_to_read = session.params.pixels * session.params.lines *
dev->total_bytes_to_read = session.params.channels * (session.params.depth / 8);
dev->settings.pixels * dev->settings.lines * session.params.channels * (session.params.depth / 8); }
DBG(DBG_info, "%s: total bytes to send = %lu\n", __func__, (u_long) dev->total_bytes_to_read); DBG(DBG_info, "%s: total bytes to send = %lu\n", __func__, (u_long) dev->total_bytes_to_read);

Wyświetl plik

@ -1290,7 +1290,7 @@ gl846_init_scan_regs(Genesys_Device * dev, const Genesys_Sensor& sensor, Genesys
dev->shrink_buffer.alloc(requested_buffer_size); dev->shrink_buffer.alloc(requested_buffer_size);
dev->out_buffer.clear(); dev->out_buffer.clear();
dev->out_buffer.alloc((8 * dev->settings.pixels * params.channels * params.depth) / 8); dev->out_buffer.alloc((8 * params.pixels * params.channels * params.depth) / 8);
dev->read_bytes_left = bytes_per_line * lincnt; dev->read_bytes_left = bytes_per_line * lincnt;
@ -1313,7 +1313,7 @@ gl846_init_scan_regs(Genesys_Device * dev, const Genesys_Sensor& sensor, Genesys
/* scan bytes to send to the frontend */ /* scan bytes to send to the frontend */
/* theory : /* theory :
target_size = target_size =
(dev->settings.pixels * dev->settings.lines * channels * depth) / 8; (params.pixels * params.lines * channels * depth) / 8;
but it suffers from integer overflow so we do the following: but it suffers from integer overflow so we do the following:
1 bit color images store color data byte-wise, eg byte 0 contains 1 bit color images store color data byte-wise, eg byte 0 contains
@ -1327,12 +1327,12 @@ gl846_init_scan_regs(Genesys_Device * dev, const Genesys_Sensor& sensor, Genesys
dev->total_bytes_read = 0; dev->total_bytes_read = 0;
if (params.depth == 1) if (params.depth == 1)
dev->total_bytes_to_read = dev->total_bytes_to_read =
((dev->settings.pixels * dev->settings.lines) / 8 + ((params.pixels * params.lines) / 8 +
(((dev->settings.pixels * dev->settings.lines) % 8) ? 1 : 0)) * (((params.pixels * params.lines) % 8) ? 1 : 0)) *
params.channels; params.channels;
else else
dev->total_bytes_to_read = dev->total_bytes_to_read =
dev->settings.pixels * dev->settings.lines * params.channels * (params.depth / 8); params.pixels * params.lines * params.channels * (params.depth / 8);
DBG(DBG_info, "%s: total bytes to send = %lu\n", __func__, (u_long) dev->total_bytes_to_read); DBG(DBG_info, "%s: total bytes to send = %lu\n", __func__, (u_long) dev->total_bytes_to_read);
/* END TODO */ /* END TODO */

Wyświetl plik

@ -1307,7 +1307,7 @@ gl847_init_scan_regs(Genesys_Device * dev, const Genesys_Sensor& sensor, Genesys
dev->shrink_buffer.alloc(requested_buffer_size); dev->shrink_buffer.alloc(requested_buffer_size);
dev->out_buffer.clear(); dev->out_buffer.clear();
dev->out_buffer.alloc((8 * dev->settings.pixels * params.channels * params.depth) / 8); dev->out_buffer.alloc((8 * params.pixels * params.channels * params.depth) / 8);
dev->read_bytes_left = bytes_per_line * lincnt; dev->read_bytes_left = bytes_per_line * lincnt;
@ -1330,7 +1330,7 @@ gl847_init_scan_regs(Genesys_Device * dev, const Genesys_Sensor& sensor, Genesys
/* scan bytes to send to the frontend */ /* scan bytes to send to the frontend */
/* theory : /* theory :
target_size = target_size =
(dev->settings.pixels * dev->settings.lines * channels * depth) / 8; (params.pixels * params.lines * channels * depth) / 8;
but it suffers from integer overflow so we do the following: but it suffers from integer overflow so we do the following:
1 bit color images store color data byte-wise, eg byte 0 contains 1 bit color images store color data byte-wise, eg byte 0 contains
@ -1344,12 +1344,12 @@ gl847_init_scan_regs(Genesys_Device * dev, const Genesys_Sensor& sensor, Genesys
dev->total_bytes_read = 0; dev->total_bytes_read = 0;
if (params.depth == 1) if (params.depth == 1)
dev->total_bytes_to_read = dev->total_bytes_to_read =
((dev->settings.pixels * dev->settings.lines) / 8 + ((params.pixels * params.lines) / 8 +
(((dev->settings.pixels * dev->settings.lines) % 8) ? 1 : 0)) * (((params.pixels * params.lines) % 8) ? 1 : 0)) *
params.channels; params.channels;
else else
dev->total_bytes_to_read = dev->total_bytes_to_read =
dev->settings.pixels * dev->settings.lines * params.channels * (params.depth / 8); params.pixels * params.lines * params.channels * (params.depth / 8);
DBG(DBG_info, "%s: total bytes to send = %lu\n", __func__, (u_long) dev->total_bytes_to_read); DBG(DBG_info, "%s: total bytes to send = %lu\n", __func__, (u_long) dev->total_bytes_to_read);
/* END TODO */ /* END TODO */