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> 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 * backend/snapscan.conf: Replace esfw52.bin with dummy filename entry
2005-11-25 Mattias Ellert <mattias.ellert@tsl.uu.se> 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_ndata; /* actual #bytes in channel buffer */
SANE_Int ch_pos; /* position in buffer */ SANE_Int ch_pos; /* position in buffer */
SANE_Int ch_bytes_per_pixel; SANE_Int ch_bytes_per_pixel;
SANE_Bool ch_lineart;
SANE_Int ch_offset; /* The number of lines to be shifted */ 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_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 */ 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; break;
ps->ch_ndata += ndata; ps->ch_ndata += ndata;
} }
/* Handle special lineart mode: Valid pixels need to be masked */
if ((ps->ch_shift_even && ((ps->ch_pos/ps->ch_bytes_per_pixel) % 2 == 0)) || if (ps->ch_lineart)
(!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)
if (ps->ch_past_init){ {
/* We need to use data 4 lines back */ if (ps->ch_shift_even)
/* 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]; /* Even pixels need to be shifted, i.e. bits 0,2,4,6 -> 0x55 */
}else{ /* use valid pixels from this line and shifted pixels from ch_size lines back */
/* Use data from the next pixel for even indexed pixels *pbuf = (ps->ch_buf[ps->ch_pos] & 0xaa) |
if we are on the first few lines. (ps->ch_buf[(ps->ch_pos + (ps->ch_line_size)) % ps->ch_size] & 0x55);
TODO: also we will overread the buffer if the buffer read ended }
on the first pixel. */ else
if (ps->ch_pos % (ps->ch_line_size) == 0 ) {
*pbuf = ps->ch_buf[ps->ch_pos+ps->ch_bytes_per_pixel]; /* Odd pixels need to be shifted, i.e. bits 1,3,5,7 -> 0xaa */
else *pbuf = (ps->ch_buf[ps->ch_pos] & 0x55) |
*pbuf = ps->ch_buf[ps->ch_pos-ps->ch_bytes_per_pixel]; (ps->ch_buf[(ps->ch_pos + (ps->ch_line_size)) % ps->ch_size] & 0xaa);
} }
}else{ }
/* odd indexed pixels are okay */ else
*pbuf = ps->ch_buf[ps->ch_pos]; {
/* 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 */ /* 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) 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) if (pss->bpp_scan == 16)
pself->ch_bytes_per_pixel *= 2; pself->ch_bytes_per_pixel *= 2;
} }
pself->ch_lineart = (actual_mode(pss) == MD_LINEART);
} }
return status; return status;
} }
@ -1202,6 +1242,9 @@ static SANE_Status create_source_chain (SnapScan_Scanner *pss,
/* /*
* $Log$ * $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 * Revision 1.19 2005/11/25 17:24:48 oliver-guest
* Fix for Epson 3490 @ 3200 DPI for grayscale and lineart mode * Fix for Epson 3490 @ 3200 DPI for grayscale and lineart mode
* *

Wyświetl plik

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