Added deinterlacing for Epson 3490

merge-requests/1/head
Oliver Schwartz 2005-11-10 19:42:02 +00:00
rodzic f27bf8a944
commit 5138513904
4 zmienionych plików z 43 dodań i 14 usunięć

Wyświetl plik

@ -1,3 +1,8 @@
2005-11-10 Oliver Schwartz <Oliver.Schwartz@gmx.de>
* backend/snapscan.c backend/snapscan-sources.c: Added
deinterlacing for Epson 3490
* backend/Makefile.in: added "snapscan" to FIRMWARE_DIRS
2005-11-07 m. allan noah <anoah AT pfeiffer DOT edu>
* backend/fujitsu.c: M3091/2 lie about gamma dl capability

Wyświetl plik

@ -63,7 +63,7 @@ COMPILE = $(CC) -c $(CFLAGS) $(DEFS) $(INCLUDES) $(CPPFLAGS)
DISTCLEAN_FILES = @DISTCLEAN_FILES@
FIRMWARE_DIRS = gt68xx
FIRMWARE_DIRS = gt68xx snapscan
@SET_MAKE@

Wyświetl plik

@ -667,16 +667,16 @@ static SANE_Status create_Expander (SnapScan_Scanner *pss,
/*
This filter implements a fix for scanners that have some columns
of pixels offset. Currently it only shifts every other column
starting with the first one down 4 pixels.
starting with the first one down ch_offset pixels.
The Deinterlacer detects if data is in SANE RGB frame format (3 bytes/pixel)
or in Grayscale (1 byte/pixel).
The first 4 lines of data in the output are fudged so that even indexed
The first ch_offset lines of data in the output are fudged so that even indexed
add odd indexed pixels will have the same value. This is necessary because
the real pixel values of the columns that are shifted down are not
in the data for the first 4 lines. A better way to handle this would be to
scan in 4 extra lines of data, but I haven't figured out how to do this
in the data for the first ch_offset lines. A better way to handle this would be to
scan in ch_offset extra lines of data, but I haven't figured out how to do this
yet.
*/
@ -686,9 +686,11 @@ typedef struct
TX_SOURCE_GUTS;
SANE_Byte *ch_buf; /* channel buffer */
SANE_Int ch_size; /* channel buffer size */
SANE_Int ch_line_size; /* size of one line */
SANE_Int ch_ndata; /* actual #bytes in channel buffer */
SANE_Int ch_pos; /* position in buffer */
SANE_Int ch_bytes_per_pixel;
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 */
} Deinterlacer;
@ -716,17 +718,17 @@ static SANE_Status Deinterlacer_get (Source *pself, SANE_Byte *pbuf, SANE_Int *p
pself->remaining(pself) > 0 &&
!cancelRead)
{
if (ps->ch_pos % (ps->ch_size/5) == ps->ch_ndata % (ps->ch_size/5) )
if (ps->ch_pos % (ps->ch_line_size) == ps->ch_ndata % (ps->ch_line_size) )
{
/* we need more data; try to get the remainder of the current
line, or else the next line */
SANE_Int ndata = (ps->ch_size/5) - ps->ch_ndata % (ps->ch_size/5);
SANE_Int ndata = (ps->ch_line_size) - ps->ch_ndata % (ps->ch_line_size);
if (ps->ch_pos >= ps->ch_size)
{
/* wrap to the beginning of the buffer if we need to */
ps->ch_ndata = 0;
ps->ch_pos = 0;
ndata = ps->ch_size /5;
ndata = ps->ch_line_size;
}
status = TxSource_get(pself, ps->ch_buf + ps->ch_pos, &ndata);
if (status != SANE_STATUS_GOOD)
@ -742,13 +744,13 @@ static SANE_Status Deinterlacer_get (Source *pself, SANE_Byte *pbuf, SANE_Int *p
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_size/5)) % ps->ch_size];
*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_size/5) == 0 )
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];
@ -758,7 +760,7 @@ static SANE_Status Deinterlacer_get (Source *pself, SANE_Byte *pbuf, SANE_Int *p
*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_size /5 *4)
if (ps->ch_pos >= ps->ch_line_size * ps->ch_offset)
ps->ch_past_init = SANE_TRUE;
pbuf++;
@ -786,6 +788,7 @@ static SANE_Status Deinterlacer_done (Source *pself)
free(ps->ch_buf);
ps->ch_buf = NULL;
ps->ch_size = 0;
ps->ch_line_size = 0;
ps->ch_pos = 0;
return status;
}
@ -804,8 +807,20 @@ static SANE_Status Deinterlacer_init (Deinterlacer *pself,
psub);
if (status == SANE_STATUS_GOOD)
{
/* We need at least 5 lines of buffer in order to shift up 4 pixels. */
pself->ch_size = TxSource_bytesPerLine((Source *) pself) *5;
switch (pss->pdev->model)
{
case PERFECTION3490:
pself->ch_offset = 8;
break;
case PERFECTION2480:
default:
pself->ch_offset = 4;
break;
}
pself->ch_line_size = TxSource_bytesPerLine((Source *) pself);
/* We need at least ch_offset+1 lines of buffer in order
to shift up ch_offset pixels. */
pself->ch_size = pself->ch_line_size * (pself->ch_offset + 1);
pself->ch_buf = (SANE_Byte *) malloc(pself->ch_size);
if (pself->ch_buf == NULL)
{
@ -1141,6 +1156,7 @@ static SANE_Status create_source_chain (SnapScan_Scanner *pss,
at 2400 dpi. */
if (status == SANE_STATUS_GOOD &&
((pss->pdev->model == PERFECTION2480 && pss->res == 2400) ||
(pss->pdev->model == PERFECTION3490 && pss->res == 3200) ||
(pss->pdev->model == PRISA5000E && pss->res == 1200)))
status = create_Deinterlacer (pss, *pps, pps);
break;
@ -1150,11 +1166,13 @@ static SANE_Status create_source_chain (SnapScan_Scanner *pss,
status = create_RGBRouter (pss, *pps, pps);
if (status == SANE_STATUS_GOOD &&
((pss->pdev->model == PERFECTION2480 && pss->res == 2400) ||
(pss->pdev->model == PERFECTION3490 && pss->res == 3200) ||
(pss->pdev->model == PRISA5000E && pss->res == 1200)))
status = create_Deinterlacer (pss, *pps, pps);
break;
case MD_GREYSCALE:
if ((pss->pdev->model == PERFECTION2480 && pss->res == 2400) ||
(pss->pdev->model == PERFECTION3490 && pss->res == 3200) ||
(pss->pdev->model == PRISA5000E && pss->res == 1200))
status = create_Deinterlacer (pss, *pps, pps);
break;
@ -1177,6 +1195,9 @@ static SANE_Status create_source_chain (SnapScan_Scanner *pss,
/*
* $Log$
* Revision 1.16 2005/11/10 19:42:02 oliver-guest
* Added deinterlacing for Epson 3490
*
* Revision 1.15 2005/10/31 21:08:47 oliver-guest
* Distinguish between Benq 5000/5000E/5000U
*

Wyświetl plik

@ -79,7 +79,7 @@
#define EXPECTED_MAJOR 1
#define MINOR_VERSION 4
#define BUILD 48
#define BUILD 49
#define BACKEND_NAME snapscan
@ -1916,6 +1916,9 @@ SANE_Status sane_get_select_fd (SANE_Handle h, SANE_Int * fd)
/*
* $Log$
* Revision 1.60 2005/11/10 19:42:02 oliver-guest
* Added deinterlacing for Epson 3490
*
* Revision 1.59 2005/11/02 22:12:54 oliver-guest
* Correct cut'n'paste error
*