kopia lustrzana https://gitlab.com/sane-project/backends
enable hardware lineart for gl646 scanners
rodzic
4b2d7777e2
commit
9d97e5a606
|
@ -5785,12 +5785,6 @@ init_options (Genesys_Scanner * s)
|
|||
s->opt[OPT_DISABLE_DYNAMIC_LINEART].constraint_type = SANE_CONSTRAINT_NONE;
|
||||
s->val[OPT_DISABLE_DYNAMIC_LINEART].w = SANE_FALSE;
|
||||
|
||||
/* not working for GL646 scanners yet */
|
||||
if (s->dev->model->asic_type == GENESYS_GL646)
|
||||
{
|
||||
s->opt[OPT_DISABLE_DYNAMIC_LINEART].cap = SANE_CAP_INACTIVE;
|
||||
}
|
||||
|
||||
/* disable_interpolation */
|
||||
s->opt[OPT_DISABLE_INTERPOLATION].name = "disable-interpolation";
|
||||
s->opt[OPT_DISABLE_INTERPOLATION].title =
|
||||
|
|
|
@ -709,7 +709,8 @@ gl646_setup_registers (Genesys_Device * dev,
|
|||
uint32_t move,
|
||||
uint32_t linecnt,
|
||||
uint16_t startx,
|
||||
uint16_t endx, SANE_Bool color, SANE_Int depth)
|
||||
uint16_t endx, SANE_Bool color,
|
||||
SANE_Int depth)
|
||||
{
|
||||
SANE_Status status = SANE_STATUS_GOOD;
|
||||
int i, nb;
|
||||
|
@ -718,9 +719,10 @@ gl646_setup_registers (Genesys_Device * dev,
|
|||
Sensor_Settings *settings = NULL;
|
||||
Genesys_Register_Set *r;
|
||||
unsigned int used1, used2, vfinal;
|
||||
unsigned int bpp; /**> bytes per pixel */
|
||||
uint32_t z1, z2;
|
||||
uint16_t ex, sx;
|
||||
int channels = 1, stagger, wpl, max_shift;
|
||||
int channels = 1, stagger, words_per_line, max_shift;
|
||||
size_t requested_buffer_size;
|
||||
size_t read_buffer_size;
|
||||
SANE_Bool half_ccd = SANE_FALSE;
|
||||
|
@ -948,13 +950,20 @@ gl646_setup_registers (Genesys_Device * dev,
|
|||
}
|
||||
|
||||
/* R04 */
|
||||
if (depth > 8)
|
||||
{
|
||||
regs[reg_0x04].value |= REG04_BITSET;
|
||||
}
|
||||
else
|
||||
/* monochrome / color scan */
|
||||
switch (depth)
|
||||
{
|
||||
case 1:
|
||||
regs[reg_0x04].value &= ~REG04_BITSET;
|
||||
regs[reg_0x04].value |= REG04_LINEART;
|
||||
break;
|
||||
case 8:
|
||||
regs[reg_0x04].value &= ~(REG04_LINEART | REG04_BITSET);
|
||||
break;
|
||||
case 16:
|
||||
regs[reg_0x04].value &= ~REG04_LINEART;
|
||||
regs[reg_0x04].value |= REG04_BITSET;
|
||||
break;
|
||||
}
|
||||
|
||||
/* R05 */
|
||||
|
@ -1075,18 +1084,25 @@ gl646_setup_registers (Genesys_Device * dev,
|
|||
DBG (DBG_info, "gl646_setup_registers: startx=%d, endx=%d, half_ccd=%d\n",
|
||||
sx, ex, half_ccd);
|
||||
|
||||
/* wpl must be computed according to the scan's resolution */
|
||||
/* in fact, wpl _gives_ the actual scan resolution */
|
||||
wpl = (((endx - startx) * sensor->xdpi) / dev->sensor.optical_res);
|
||||
if (depth == 16)
|
||||
wpl *= 2;
|
||||
if (dev->model->is_cis == SANE_FALSE)
|
||||
wpl *= channels;
|
||||
dev->wpl = wpl;
|
||||
dev->bpl = wpl;
|
||||
/* words_per_line must be computed according to the scan's resolution */
|
||||
/* in fact, words_per_line _gives_ the actual scan resolution */
|
||||
words_per_line = (((endx - startx) * sensor->xdpi) / dev->sensor.optical_res);
|
||||
bpp=depth/8;
|
||||
if (depth == 1)
|
||||
{
|
||||
words_per_line = (words_per_line+7)/8 ;
|
||||
bpp=1;
|
||||
}
|
||||
else
|
||||
{
|
||||
words_per_line *= bpp;
|
||||
}
|
||||
dev->bpl = words_per_line;
|
||||
words_per_line *= channels;
|
||||
dev->wpl = words_per_line;
|
||||
|
||||
DBG (DBG_info, "gl646_setup_registers: wpl=%d\n", wpl);
|
||||
gl646_set_triple_reg (regs, REG_MAXWD, wpl);
|
||||
DBG (DBG_info, "gl646_setup_registers: wpl=%d\n", words_per_line);
|
||||
gl646_set_triple_reg (regs, REG_MAXWD, words_per_line);
|
||||
|
||||
gl646_set_double_reg (regs, REG_DPISET, sensor->dpiset);
|
||||
gl646_set_double_reg (regs, REG_LPERIOD, sensor->exposure);
|
||||
|
@ -1249,15 +1265,15 @@ gl646_setup_registers (Genesys_Device * dev,
|
|||
* need the buffer to be short enough not to miss the end of document in the feeder*/
|
||||
if (dev->model->is_sheetfed == SANE_FALSE)
|
||||
{
|
||||
requested_buffer_size = (GL646_BULKIN_MAXSIZE / wpl) * wpl;
|
||||
requested_buffer_size = (GL646_BULKIN_MAXSIZE / words_per_line) * words_per_line;
|
||||
/* TODO seems CIS scanners should be treated differently */
|
||||
read_buffer_size =
|
||||
2 * requested_buffer_size +
|
||||
((max_shift + stagger) * scan_settings.pixels * channels * depth) / 8;
|
||||
((max_shift + stagger) * scan_settings.pixels * channels * bpp);
|
||||
}
|
||||
else
|
||||
{
|
||||
requested_buffer_size = 8 * wpl * channels;
|
||||
requested_buffer_size = 8 * words_per_line * channels;
|
||||
read_buffer_size = requested_buffer_size;
|
||||
}
|
||||
|
||||
|
@ -1273,11 +1289,10 @@ gl646_setup_registers (Genesys_Device * dev,
|
|||
|
||||
RIE (sanei_genesys_buffer_free (&(dev->out_buffer)));
|
||||
RIE (sanei_genesys_buffer_alloc (&(dev->out_buffer),
|
||||
(8 * scan_settings.pixels * channels *
|
||||
depth) / 8));
|
||||
8 * scan_settings.pixels * channels * bpp));
|
||||
|
||||
/* scan bytes to read */
|
||||
dev->read_bytes_left = wpl * linecnt;
|
||||
dev->read_bytes_left = words_per_line * linecnt;
|
||||
|
||||
DBG (DBG_info,
|
||||
"gl646_setup_registers: physical bytes to read = %lu\n",
|
||||
|
@ -1308,7 +1323,7 @@ gl646_setup_registers (Genesys_Device * dev,
|
|||
channels;
|
||||
else
|
||||
dev->total_bytes_to_read =
|
||||
scan_settings.pixels * scan_settings.lines * channels * (depth / 8);
|
||||
scan_settings.pixels * scan_settings.lines * channels * bpp;
|
||||
|
||||
DBG (DBG_proc, "gl646_setup_registers: end\n");
|
||||
return SANE_STATUS_GOOD;
|
||||
|
@ -3063,6 +3078,7 @@ gl646_slow_back_home (Genesys_Device * dev, SANE_Bool wait_until_home)
|
|||
settings.disable_interpolation = 0;
|
||||
settings.threshold = 0;
|
||||
settings.exposure_time = 0;
|
||||
settings.dynamic_lineart = SANE_FALSE;
|
||||
|
||||
status = setup_for_scan (dev, settings, SANE_TRUE, SANE_TRUE, SANE_TRUE);
|
||||
|
||||
|
@ -3178,6 +3194,7 @@ gl646_search_start_position (Genesys_Device * dev)
|
|||
settings.disable_interpolation = 0;
|
||||
settings.threshold = 0;
|
||||
settings.exposure_time = 0;
|
||||
settings.dynamic_lineart = SANE_FALSE;
|
||||
|
||||
/* scan the desired area */
|
||||
status =
|
||||
|
@ -3310,6 +3327,7 @@ gl646_init_regs_for_shading (Genesys_Device * dev)
|
|||
settings.disable_interpolation = dev->settings.disable_interpolation;
|
||||
settings.threshold = dev->settings.threshold;
|
||||
settings.exposure_time = dev->settings.exposure_time;
|
||||
settings.dynamic_lineart = SANE_FALSE;
|
||||
|
||||
/* keep account of the movement for final scan move */
|
||||
dev->scanhead_position_in_steps += settings.lines;
|
||||
|
@ -3403,6 +3421,7 @@ setup_for_scan (Genesys_Device * dev, Genesys_Settings settings,
|
|||
{
|
||||
SANE_Status status = SANE_STATUS_GOOD;
|
||||
SANE_Bool color;
|
||||
SANE_Int depth;
|
||||
int channels;
|
||||
uint16_t startx = 0, endx, pixels;
|
||||
int move = 0;
|
||||
|
@ -3425,6 +3444,20 @@ setup_for_scan (Genesys_Device * dev, Genesys_Settings settings,
|
|||
channels = 1;
|
||||
color = SANE_FALSE;
|
||||
}
|
||||
|
||||
depth=settings.depth;
|
||||
if (settings.scan_mode == SCAN_MODE_LINEART)
|
||||
{
|
||||
if (settings.dynamic_lineart == SANE_TRUE)
|
||||
{
|
||||
depth = 8;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* XXX STEF XXX : why does the common layer never send depth=1 ? */
|
||||
depth = 1;
|
||||
}
|
||||
}
|
||||
|
||||
/* compute distance to move */
|
||||
move = 0;
|
||||
|
@ -3514,7 +3547,8 @@ setup_for_scan (Genesys_Device * dev, Genesys_Settings settings,
|
|||
settings.xres,
|
||||
move,
|
||||
settings.lines,
|
||||
startx, endx, color, settings.depth);
|
||||
startx, endx, color,
|
||||
depth);
|
||||
if (status != SANE_STATUS_GOOD)
|
||||
{
|
||||
DBG (DBG_error,
|
||||
|
@ -3744,6 +3778,7 @@ gl646_led_calibration (Genesys_Device * dev)
|
|||
settings.disable_interpolation = 0;
|
||||
settings.threshold = 0;
|
||||
settings.exposure_time = 0;
|
||||
settings.dynamic_lineart = SANE_FALSE;
|
||||
|
||||
/* colors * bytes_per_color * scan lines */
|
||||
total_size = settings.pixels * channels * 2 * 1;
|
||||
|
@ -3751,7 +3786,7 @@ gl646_led_calibration (Genesys_Device * dev)
|
|||
line = malloc (total_size);
|
||||
if (!line)
|
||||
{
|
||||
DBG (DBG_error, "gl646_led_calibration: Failed to allocate %d bytes\n",
|
||||
DBG (DBG_error, "gl646_led_calibration: failed to allocate %d bytes\n",
|
||||
total_size);
|
||||
return SANE_STATUS_NO_MEM;
|
||||
}
|
||||
|
@ -3946,6 +3981,7 @@ ad_fe_offset_calibration (Genesys_Device * dev)
|
|||
settings.disable_interpolation = 0;
|
||||
settings.threshold = 0;
|
||||
settings.exposure_time = 0;
|
||||
settings.dynamic_lineart = SANE_FALSE;
|
||||
|
||||
/* scan first line of data with no gain */
|
||||
dev->frontend.gain[0] = 0;
|
||||
|
@ -4073,6 +4109,7 @@ gl646_offset_calibration (Genesys_Device * dev)
|
|||
settings.disable_interpolation = 0;
|
||||
settings.threshold = 0;
|
||||
settings.exposure_time = 0;
|
||||
settings.dynamic_lineart = SANE_FALSE;
|
||||
|
||||
/* scan first line of data with no gain, but with offset from
|
||||
* last calibration */
|
||||
|
@ -4242,6 +4279,7 @@ ad_fe_coarse_gain_calibration (Genesys_Device * dev, int dpi)
|
|||
settings.disable_interpolation = 0;
|
||||
settings.threshold = 0;
|
||||
settings.exposure_time = 0;
|
||||
settings.dynamic_lineart = SANE_FALSE;
|
||||
|
||||
size = channels * settings.pixels * settings.lines;
|
||||
|
||||
|
@ -4371,6 +4409,7 @@ gl646_coarse_gain_calibration (Genesys_Device * dev, int dpi)
|
|||
settings.disable_interpolation = 0;
|
||||
settings.threshold = 0;
|
||||
settings.exposure_time = 0;
|
||||
settings.dynamic_lineart = SANE_FALSE;
|
||||
|
||||
/* start gain value */
|
||||
dev->frontend.gain[0] = 1;
|
||||
|
@ -4516,6 +4555,7 @@ gl646_init_regs_for_warmup (Genesys_Device * dev,
|
|||
settings.disable_interpolation = 0;
|
||||
settings.threshold = 0;
|
||||
settings.exposure_time = 0;
|
||||
settings.dynamic_lineart = SANE_FALSE;
|
||||
|
||||
/* setup for scan */
|
||||
status = setup_for_scan (dev, settings, SANE_TRUE, SANE_FALSE, SANE_FALSE);
|
||||
|
@ -4584,6 +4624,7 @@ gl646_repark_head (Genesys_Device * dev)
|
|||
settings.disable_interpolation = 0;
|
||||
settings.threshold = 0;
|
||||
settings.exposure_time = 0;
|
||||
settings.dynamic_lineart = SANE_FALSE;
|
||||
|
||||
status = setup_for_scan (dev, settings, SANE_FALSE, SANE_FALSE, SANE_FALSE);
|
||||
if (status != SANE_STATUS_GOOD)
|
||||
|
@ -5240,6 +5281,7 @@ simple_move (Genesys_Device * dev, SANE_Int distance)
|
|||
settings.disable_interpolation = 0;
|
||||
settings.threshold = 0;
|
||||
settings.exposure_time = 0;
|
||||
settings.dynamic_lineart = SANE_FALSE;
|
||||
|
||||
status =
|
||||
simple_scan (dev, settings, SANE_TRUE, SANE_TRUE, SANE_FALSE, &data);
|
||||
|
@ -5623,6 +5665,7 @@ gl646_search_strip (Genesys_Device * dev, SANE_Bool forward, SANE_Bool black)
|
|||
settings.disable_interpolation = 0;
|
||||
settings.threshold = 0;
|
||||
settings.exposure_time = 0;
|
||||
settings.dynamic_lineart = SANE_FALSE;
|
||||
|
||||
/* signals if a strip of the given color has been found */
|
||||
found = 0;
|
||||
|
|
Ładowanie…
Reference in New Issue