Merge branch 'master' of ssh://git.debian.org/git/sane/sane-backends

merge-requests/1/head
Nicolas Martin 2011-01-04 22:12:27 +01:00
commit 529673f220
4 zmienionych plików z 147 dodań i 73 usunięć

Wyświetl plik

@ -1,3 +1,9 @@
2011-01-04 Stéphane Voltz <stef.dev@free.fr>
* backend/genesys.c backend/genesys_devices.c
backend/genesys_gl124.c: fix 1200 dpi lineart issues for gl124,
reenable low resolutions for lineart for gl124, and geometry fine
tuning for LiDE 110/210
2011-01-03 Stéphane Voltz <stef.dev@free.fr> 2011-01-03 Stéphane Voltz <stef.dev@free.fr>
* backends/lexmark_low.c: fix compilation issue due to incorrect * backends/lexmark_low.c: fix compilation issue due to incorrect
place for a DBG statement. place for a DBG statement.

Wyświetl plik

@ -4790,6 +4790,13 @@ genesys_fill_segmented_buffer (Genesys_Device * dev, uint8_t *work_buffer_dst, s
{ {
size_t count; size_t count;
SANE_Status status; SANE_Status status;
uint8_t odd,even,mask;
uint16_t merged;
int depth,i;
depth = dev->settings.depth;
if (dev->settings.scan_mode == SCAN_MODE_LINEART)
depth = 1;
/* fill buffer if needed */ /* fill buffer if needed */
if (dev->oe_buffer.avail == 0) if (dev->oe_buffer.avail == 0)
@ -4817,32 +4824,86 @@ genesys_fill_segmented_buffer (Genesys_Device * dev, uint8_t *work_buffer_dst, s
count++; count++;
dev->cur++; dev->cur++;
} }
else if(dev->settings.depth==8 && dev->settings.double_xres==SANE_FALSE) else
{ {
while (dev->cur < dev->len && count < size) /* here we must handle the segments to copy data */
{ if(dev->segnb==2)
/* copy even pixel */ {
work_buffer_dst[count] = dev->oe_buffer.buffer[dev->cur + dev->skip + dev->oe_buffer.pos]; if(depth==8)
/* copy odd pixel */ {
work_buffer_dst[count + 1] = dev->oe_buffer.buffer[dev->cur + dev->skip + dev->dist + dev->oe_buffer.pos]; while (dev->cur < dev->len && count < size)
/* update counter and pointer */ {
count += 2; /* copy even pixel */
dev->cur++; work_buffer_dst[count] = dev->oe_buffer.buffer[dev->cur + dev->skip + dev->oe_buffer.pos];
/* copy odd pixel */
work_buffer_dst[count + 1] = dev->oe_buffer.buffer[dev->cur + dev->skip + dev->dist + dev->oe_buffer.pos];
/* update counter and pointer */
count += 2;
dev->cur++;
}
}
else if(depth==16)
{
while (dev->cur < dev->len && count < size)
{
/* copy even pixel */
work_buffer_dst[count] = dev->oe_buffer.buffer[dev->cur + dev->skip + dev->oe_buffer.pos];
work_buffer_dst[count+1] = dev->oe_buffer.buffer[dev->cur + dev->skip + dev->oe_buffer.pos+1];
/* copy odd pixel */
work_buffer_dst[count + 2] = dev->oe_buffer.buffer[dev->cur + dev->skip + dev->dist + dev->oe_buffer.pos];
work_buffer_dst[count + 3] = dev->oe_buffer.buffer[dev->cur + dev->skip + dev->dist + dev->oe_buffer.pos+1];
/* update counter and pointer */
count += 4;
dev->cur+=2;
}
} else { /* lineart case */
while (dev->cur < dev->len && count < size)
{
/* get values to merge */
odd = dev->oe_buffer.buffer[dev->cur + dev->skip + dev->oe_buffer.pos];
even = dev->oe_buffer.buffer[dev->cur + dev->skip + dev->dist + dev->oe_buffer.pos];
/* interleave bits .... */
merged=0;
for(i=7;i>=0;i--)
{
mask=1<<i;
if(odd & mask)
{
merged |= 1;
}
merged<<=1;
if(even & mask)
{
merged |= 1;
}
/* don't shift on last bit */
if(i>0)
{
merged<<=1;
}
}
/* store result */
work_buffer_dst[count] = merged >> 8;
work_buffer_dst[count+1] = merged & 255;
/* update counter and pointer */
count += 2;
dev->cur++;
}
}
} }
} else if(dev->segnb==4)
else if(dev->settings.depth==16 && dev->settings.double_xres==SANE_FALSE) {
{ DBG (DBG_error, "%s: %d is an unimplemented segment number ....\n",__FUNCTION__,dev->segnb);
while (dev->cur < dev->len && count < size) return SANE_STATUS_INVAL;
{ }
/* copy even pixel */ else
work_buffer_dst[count] = dev->oe_buffer.buffer[dev->cur + dev->skip + dev->oe_buffer.pos]; {
work_buffer_dst[count+1] = dev->oe_buffer.buffer[dev->cur + dev->skip + dev->oe_buffer.pos+1]; DBG (DBG_error, "%s: %d is an unimplemented segment number ....\n",__FUNCTION__,dev->segnb);
/* copy odd pixel */ return SANE_STATUS_INVAL;
work_buffer_dst[count + 2] = dev->oe_buffer.buffer[dev->cur + dev->skip + dev->dist + dev->oe_buffer.pos];
work_buffer_dst[count + 3] = dev->oe_buffer.buffer[dev->cur + dev->skip + dev->dist + dev->oe_buffer.pos+1];
/* update counter and pointer */
count += 4;
dev->cur+=2;
} }
} }
@ -4911,7 +4972,7 @@ genesys_fill_read_buffer (Genesys_Device * dev)
size &= ~0xff; size &= ~0xff;
} }
/* early out if our remaining buffer capacity is too lo w */ /* early out if our remaining buffer capacity is too low */
if (size == 0) if (size == 0)
return SANE_STATUS_GOOD; return SANE_STATUS_GOOD;
@ -4949,13 +5010,6 @@ genesys_fill_read_buffer (Genesys_Device * dev)
else /* regular case with no extra copy */ else /* regular case with no extra copy */
{ {
status = dev->model->cmd_set->bulk_read_data (dev, 0x45, work_buffer_dst, size); status = dev->model->cmd_set->bulk_read_data (dev, 0x45, work_buffer_dst, size);
if (status != SANE_STATUS_GOOD)
{
DBG (DBG_error,
"genesys_fill_read_buffer: failed to read %lu bytes (%s)\n",
(u_long) size, sane_strstatus (status));
return SANE_STATUS_IO_ERROR;
}
#ifdef SANE_DEBUG_LOG_RAW_DATA #ifdef SANE_DEBUG_LOG_RAW_DATA
if (rawfile != NULL && DBG_LEVEL >= DBG_data) if (rawfile != NULL && DBG_LEVEL >= DBG_data)
{ {
@ -4965,6 +5019,13 @@ genesys_fill_read_buffer (Genesys_Device * dev)
} }
#endif #endif
} }
if (status != SANE_STATUS_GOOD)
{
DBG (DBG_error,
"genesys_fill_read_buffer: failed to read %lu bytes (%s)\n",
(u_long) size, sane_strstatus (status));
return SANE_STATUS_IO_ERROR;
}
if (size > dev->read_bytes_left) if (size > dev->read_bytes_left)
size = dev->read_bytes_left; size = dev->read_bytes_left;
@ -5481,9 +5542,13 @@ Problems with the first approach:
DBG (DBG_error, "Cannot convert from 16bit to lineart\n"); DBG (DBG_error, "Cannot convert from 16bit to lineart\n");
return SANE_STATUS_INVAL; return SANE_STATUS_INVAL;
} }
/*lines in input*/ /* lines in input to process */
dst_lines = bytes / (dev->settings.pixels * channels); dst_lines = bytes / (dev->settings.pixels * channels);
if(dst_lines==0)
{
/* padd to at least line length */
dst_lines=1;
}
bytes = dst_lines * dev->settings.pixels * channels; bytes = dst_lines * dev->settings.pixels * channels;
status = genesys_gray_lineart (dev, status = genesys_gray_lineart (dev,
@ -5593,7 +5658,7 @@ calc_parameters (Genesys_Scanner * s)
s->dev->settings.double_xres = SANE_FALSE; s->dev->settings.double_xres = SANE_FALSE;
if ((s->dev->model->flags & GENESYS_FLAG_ODD_EVEN_CIS) if ((s->dev->model->flags & GENESYS_FLAG_ODD_EVEN_CIS)
&& s->dev->settings.xres <= s->dev->sensor.optical_res / 2 && s->dev->settings.xres <= s->dev->sensor.optical_res / 2
&& s->dev->settings.xres != 400) && s->dev->settings.xres != 400)
{ {
s->dev->settings.double_xres = SANE_TRUE; s->dev->settings.double_xres = SANE_TRUE;
} }
@ -5610,6 +5675,13 @@ calc_parameters (Genesys_Scanner * s)
s->params.pixels_per_line = (s->params.pixels_per_line/4)*4; s->params.pixels_per_line = (s->params.pixels_per_line/4)*4;
} }
/* corner case for true lineart for sensor with several segments */
if (s->dev->settings.xres >= 1200
&& s->dev->model->asic_type == GENESYS_GL124 )
{
s->params.pixels_per_line = (s->params.pixels_per_line/16)*16;
}
s->params.bytes_per_line = s->params.pixels_per_line; s->params.bytes_per_line = s->params.pixels_per_line;
if (s->params.depth > 8) if (s->params.depth > 8)
{ {
@ -6053,10 +6125,6 @@ init_options (Genesys_Scanner * s)
{ {
s->opt[OPT_DISABLE_DYNAMIC_LINEART].cap = SANE_CAP_INACTIVE; s->opt[OPT_DISABLE_DYNAMIC_LINEART].cap = SANE_CAP_INACTIVE;
} }
if (s->dev->model->asic_type == GENESYS_GL124)
{
s->val[OPT_DISABLE_DYNAMIC_LINEART].w = SANE_TRUE;
}
/* disable_interpolation */ /* disable_interpolation */
s->opt[OPT_DISABLE_INTERPOLATION].name = "disable-interpolation"; s->opt[OPT_DISABLE_INTERPOLATION].name = "disable-interpolation";
@ -7239,8 +7307,6 @@ set_option_value (Genesys_Scanner * s, int option, void *val,
SANE_Status status = SANE_STATUS_GOOD; SANE_Status status = SANE_STATUS_GOOD;
SANE_Word *table; SANE_Word *table;
unsigned int i; unsigned int i;
int min, count;
SANE_Word *dpi_list;
SANE_Range *x_range, *y_range; SANE_Range *x_range, *y_range;
Genesys_Calibration_Cache *cache, *next_cache; Genesys_Calibration_Cache *cache, *next_cache;
@ -7327,6 +7393,7 @@ set_option_value (Genesys_Scanner * s, int option, void *val,
/* due to low resolution emulation ,we can't mix lineart /* due to low resolution emulation ,we can't mix lineart
* with dpi lower than 300 for GL124 */ * with dpi lower than 300 for GL124 */
/* XXX STEF XXX
if(s->dev->model->asic_type == GENESYS_GL124) if(s->dev->model->asic_type == GENESYS_GL124)
{ {
free(s->opt[OPT_RESOLUTION].constraint.word_list); free(s->opt[OPT_RESOLUTION].constraint.word_list);
@ -7344,7 +7411,7 @@ set_option_value (Genesys_Scanner * s, int option, void *val,
s->opt[OPT_RESOLUTION].constraint.word_list = dpi_list; s->opt[OPT_RESOLUTION].constraint.word_list = dpi_list;
if(s->val[OPT_RESOLUTION].w<min) if(s->val[OPT_RESOLUTION].w<min)
s->val[OPT_RESOLUTION].w=min; s->val[OPT_RESOLUTION].w=min;
} } */
if (strcmp (s->val[option].s, SANE_VALUE_SCAN_MODE_LINEART) == 0) if (strcmp (s->val[option].s, SANE_VALUE_SCAN_MODE_LINEART) == 0)
{ {

Wyświetl plik

@ -1315,9 +1315,9 @@ static Genesys_Model canon_lide_110_model = {
{16, 8, 0}, /* possible depths in color mode */ {16, 8, 0}, /* possible depths in color mode */
SANE_FIX (3.6), /* Start of scan area in mm (x) */ SANE_FIX (3.6), /* Start of scan area in mm (x) */
SANE_FIX (8.2), /* Start of scan area in mm (y) */ SANE_FIX (8.5), /* Start of scan area in mm (y) */
SANE_FIX (213.80), /* Size of scan area in mm (x) */ SANE_FIX (213.80), /* Size of scan area in mm (x) */
SANE_FIX (297.0), /* Size of scan area in mm (y) */ SANE_FIX (300.0), /* Size of scan area in mm (y) */
SANE_FIX (1.0), /* Start of white strip in mm (y) */ SANE_FIX (1.0), /* Start of white strip in mm (y) */
SANE_FIX (0.0), /* Start of black mark in mm (x) */ SANE_FIX (0.0), /* Start of black mark in mm (x) */
@ -1367,9 +1367,9 @@ static Genesys_Model canon_lide_210_model = {
{16, 8, 0}, /* possible depths in color mode */ {16, 8, 0}, /* possible depths in color mode */
SANE_FIX (3.6), /* Start of scan area in mm (x) */ SANE_FIX (3.6), /* Start of scan area in mm (x) */
SANE_FIX (8.2), /* Start of scan area in mm (y) */ SANE_FIX (8.5), /* Start of scan area in mm (y) */
SANE_FIX (213.80), /* Size of scan area in mm (x) */ SANE_FIX (213.80), /* Size of scan area in mm (x) */
SANE_FIX (297.0), /* Size of scan area in mm (y) */ SANE_FIX (300.0), /* Size of scan area in mm (y) */
SANE_FIX (0.0), /* Start of white strip in mm (y) */ SANE_FIX (0.0), /* Start of white strip in mm (y) */
SANE_FIX (0.0), /* Start of black mark in mm (x) */ SANE_FIX (0.0), /* Start of black mark in mm (x) */

Wyświetl plik

@ -145,31 +145,31 @@ gl124_bulk_read_data (Genesys_Device * dev, uint8_t addr,
/* blocks must be multiple of 512 but not last block */ /* blocks must be multiple of 512 but not last block */
read = size; read = size;
if (read >= 512) read /= 512;
{ read *= 512;
read /= 512;
read *= 512;
}
DBG (DBG_io2, if(read>0)
"gl124_bulk_read_data: trying to read %lu bytes of data\n", {
(u_long) read); DBG (DBG_io2,
status = sanei_usb_read_bulk (dev->dn, data, &read); "gl124_bulk_read_data: trying to read %lu bytes of data\n",
if (status != SANE_STATUS_GOOD) (u_long) read);
{ status = sanei_usb_read_bulk (dev->dn, data, &read);
DBG (DBG_error, if (status != SANE_STATUS_GOOD)
"gl124_bulk_read_data failed while reading bulk data: %s\n", {
sane_strstatus (status)); DBG (DBG_error,
return status; "gl124_bulk_read_data failed while reading bulk data: %s\n",
} sane_strstatus (status));
return status;
}
}
/* read less than 512 bytes remainder */ /* read less than 512 bytes remainder */
if (read < size) if (read < size)
{ {
done=read; done = read;
read = size - read; read = size - read;
DBG (DBG_io2, DBG (DBG_io2,
"gl124_bulk_read_data: trying to read %lu bytes of data\n", "gl124_bulk_read_data: trying to read remaining %lu bytes of data\n",
(u_long) read); (u_long) read);
status = sanei_usb_read_bulk (dev->dn, data+done, &read); status = sanei_usb_read_bulk (dev->dn, data+done, &read);
if (status != SANE_STATUS_GOOD) if (status != SANE_STATUS_GOOD)
@ -1071,11 +1071,12 @@ gl124_init_motor_regs_scan (Genesys_Device * dev,
/* STEPNO */ /* STEPNO */
sanei_genesys_set_double(reg,REG_STEPNO,scan_steps); sanei_genesys_set_double(reg,REG_STEPNO,scan_steps);
/* FASTNO */
sanei_genesys_set_double(reg,REG_FASTNO,scan_steps);
/* fast table */ /* fast table */
fast_dpi=yres; fast_dpi=yres;
if (scan_mode != SCAN_MODE_COLOR)
{
fast_dpi*=3;
}
fast_time=gl124_slope_table(fast_table, fast_time=gl124_slope_table(fast_table,
&fast_steps, &fast_steps,
fast_dpi, fast_dpi,
@ -1087,6 +1088,9 @@ gl124_init_motor_regs_scan (Genesys_Device * dev,
RIE(gl124_send_slope_table (dev, STOP_TABLE, fast_table, fast_steps)); RIE(gl124_send_slope_table (dev, STOP_TABLE, fast_table, fast_steps));
RIE(gl124_send_slope_table (dev, FAST_TABLE, fast_table, fast_steps)); RIE(gl124_send_slope_table (dev, FAST_TABLE, fast_table, fast_steps));
/* FASTNO */
sanei_genesys_set_double(reg,REG_FASTNO,fast_steps);
/* FSHDEC */ /* FSHDEC */
sanei_genesys_set_double(reg,REG_FSHDEC,fast_steps); sanei_genesys_set_double(reg,REG_FSHDEC,fast_steps);
@ -1611,9 +1615,6 @@ gl124_init_scan_regs (Genesys_Device * dev,
{ {
depth = 8; depth = 8;
} }
/* XXX STEF XXX
if (depth == 16)
flags |= SCAN_FLAG_DISABLE_GAMMA; */
/* we enable true gray for cis scanners only, and just when doing /* we enable true gray for cis scanners only, and just when doing
* scan since color calibration is OK for this mode * scan since color calibration is OK for this mode
@ -2732,7 +2733,7 @@ gl124_init_regs_for_scan (Genesys_Device * dev)
if(channels*dev->settings.yres>=1200 && move>3000) if(channels*dev->settings.yres>=1200 && move>3000)
{ {
move-=190; move -= 180;
status = gl124_feed (dev, move); status = gl124_feed (dev, move);
if (status != SANE_STATUS_GOOD) if (status != SANE_STATUS_GOOD)
{ {
@ -2745,7 +2746,7 @@ gl124_init_regs_for_scan (Genesys_Device * dev)
{ {
if(channels==1) if(channels==1)
{ {
move-=25; move-=0;
} }
} }
DBG (DBG_info, "gl124_init_regs_for_scan: move=%f steps\n", move); DBG (DBG_info, "gl124_init_regs_for_scan: move=%f steps\n", move);