Fix for lineart mode of Epson 3490 @ 3200 DPI

merge-requests/1/head
Oliver Schwartz 2005-11-28 19:28:29 +00:00
rodzic dc89526f03
commit ba7f55d72f
3 zmienionych plików z 72 dodań i 24 usunięć

Wyświetl plik

@ -1,6 +1,11 @@
2005-11-26 Oliver Schwartz <Oliver.Schwartz@gmx.de>
* backend/snapscan-scis.c: Fix for Benq 5000
* backend/snapscan-sources.c: Fix lineart mode for Epson 3490
* doc/descriptions/snapscan.desc: Update status for Benq 5000
2005-11-26 Oliver Schwartz <Oliver.Schwartz@gmx.de>
* backend/snapscan-scsi.c: Fix for Benq 5000
* backend/snapscan.conf: Replace esfw52.bin with dummy filename entry
2005-11-25 Mattias Ellert <mattias.ellert@tsl.uu.se>

Wyświetl plik

@ -690,6 +690,7 @@ typedef struct
SANE_Int ch_ndata; /* actual #bytes in channel buffer */
SANE_Int ch_pos; /* position in buffer */
SANE_Int ch_bytes_per_pixel;
SANE_Bool ch_lineart;
SANE_Int ch_offset; /* The number of lines to be shifted */
SANE_Bool ch_past_init; /* flag indicating if we have enough data to shift pixels down */
SANE_Bool ch_shift_even; /* flag indicating wether even or odd pixels are shifted */
@ -738,28 +739,66 @@ static SANE_Status Deinterlacer_get (Source *pself, SANE_Byte *pbuf, SANE_Int *p
break;
ps->ch_ndata += ndata;
}
if ((ps->ch_shift_even && ((ps->ch_pos/ps->ch_bytes_per_pixel) % 2 == 0)) ||
(!ps->ch_shift_even && ((ps->ch_pos/ps->ch_bytes_per_pixel) % 2 == 1)))
/* Handle special lineart mode: Valid pixels need to be masked */
if (ps->ch_lineart)
{
/* the even indexed pixels need to be shifted down */
if (ps->ch_past_init){
/* We need to use data 4 lines back */
/* So we just go one forward and it will wrap around to 4 back. */
*pbuf = ps->ch_buf[(ps->ch_pos + (ps->ch_line_size)) % ps->ch_size];
}else{
/* Use data from the next pixel for even indexed pixels
if we are on the first few lines.
TODO: also we will overread the buffer if the buffer read ended
on the first pixel. */
if (ps->ch_pos % (ps->ch_line_size) == 0 )
*pbuf = ps->ch_buf[ps->ch_pos+ps->ch_bytes_per_pixel];
else
*pbuf = ps->ch_buf[ps->ch_pos-ps->ch_bytes_per_pixel];
}
}else{
/* odd indexed pixels are okay */
*pbuf = ps->ch_buf[ps->ch_pos];
if (ps->ch_past_init)
{
if (ps->ch_shift_even)
{
/* Even pixels need to be shifted, i.e. bits 0,2,4,6 -> 0x55 */
/* use valid pixels from this line and shifted pixels from ch_size lines back */
*pbuf = (ps->ch_buf[ps->ch_pos] & 0xaa) |
(ps->ch_buf[(ps->ch_pos + (ps->ch_line_size)) % ps->ch_size] & 0x55);
}
else
{
/* Odd pixels need to be shifted, i.e. bits 1,3,5,7 -> 0xaa */
*pbuf = (ps->ch_buf[ps->ch_pos] & 0x55) |
(ps->ch_buf[(ps->ch_pos + (ps->ch_line_size)) % ps->ch_size] & 0xaa);
}
}
else
{
/* not enough data. duplicate pixel values from previous column */
if (ps->ch_shift_even)
{
/* bits 1,3,5,7 contain valid data -> 0xaa */
SANE_Byte valid_pixel = ps->ch_buf[ps->ch_pos] & 0xaa;
*pbuf = valid_pixel | (valid_pixel >> 1);
}
else
{
/* bits 0,2,4,6 contain valid data -> 0x55 */
SANE_Byte valid_pixel = ps->ch_buf[ps->ch_pos] & 0x55;
*pbuf = valid_pixel | (valid_pixel << 1);
}
}
}
else /* colour / grayscale mode */
{
if ((ps->ch_shift_even && ((ps->ch_pos/ps->ch_bytes_per_pixel) % 2 == 0)) ||
(!ps->ch_shift_even && ((ps->ch_pos/ps->ch_bytes_per_pixel) % 2 == 1)))
{
/* the even indexed pixels need to be shifted down */
if (ps->ch_past_init){
/* We need to use data 4 lines back */
/* So we just go one forward and it will wrap around to 4 back. */
*pbuf = ps->ch_buf[(ps->ch_pos + (ps->ch_line_size)) % ps->ch_size];
}else{
/* Use data from the next pixel for even indexed pixels
if we are on the first few lines.
TODO: also we will overread the buffer if the buffer read ended
on the first pixel. */
if (ps->ch_pos % (ps->ch_line_size) == 0 )
*pbuf = ps->ch_buf[ps->ch_pos+ps->ch_bytes_per_pixel];
else
*pbuf = ps->ch_buf[ps->ch_pos-ps->ch_bytes_per_pixel];
}
}else{
/* odd indexed pixels are okay */
*pbuf = ps->ch_buf[ps->ch_pos];
}
}
/* set the flag so we know we have enough data to start shifting columns */
if (ps->ch_pos >= ps->ch_line_size * ps->ch_offset)
@ -846,6 +885,7 @@ static SANE_Status Deinterlacer_init (Deinterlacer *pself,
if (pss->bpp_scan == 16)
pself->ch_bytes_per_pixel *= 2;
}
pself->ch_lineart = (actual_mode(pss) == MD_LINEART);
}
return status;
}
@ -1202,6 +1242,9 @@ static SANE_Status create_source_chain (SnapScan_Scanner *pss,
/*
* $Log$
* Revision 1.20 2005/11/28 19:28:29 oliver-guest
* Fix for lineart mode of Epson 3490 @ 3200 DPI
*
* Revision 1.19 2005/11/25 17:24:48 oliver-guest
* Fix for Epson 3490 @ 3200 DPI for grayscale and lineart mode
*

Wyświetl plik

@ -187,8 +187,8 @@
:model "5000"
:interface "USB"
:status :untested
:comment "USB ID 0x04a5,0x20f8: Status unknown, please contact oliverschwartz@users.sf.net"
:status :good
:comment "USB ID 0x04a5,0x20f8: Color / grayscale scans working up to 1200 DPI"
:model "5300"
:interface "USB"