[sane-devel] Re: Feature freeze for sane-backends 1.0.13 is active
Varol Kaptan
varol at cs.ucf.edu
Tue Nov 4 20:20:39 GMT 2003
Here is a patch that fixes color scanning on the EPSON Perfection610. It is
based on the epkowa backend (but done in a cleaner way). It works for me -
and most probably does not break anything else. Can people with epson
scanners check it?
Varol Kaptan
varol at cs.ucf.edu
-------------- next part --------------
--- epson.c.orig 2003-11-04 14:58:39.000000000 -0500
+++ epson.c 2003-11-04 14:59:00.000000000 -0500
@@ -4089,24 +4089,6 @@
s->params.pixels_per_line = SANE_UNFIX( s->val[ OPT_BR_X].w - s->val[ OPT_TL_X].w) / 25.4 * ndpi + 0.5;
s->params.lines = SANE_UNFIX( s->val[ OPT_BR_Y].w - s->val[ OPT_TL_Y].w) / 25.4 * ndpi + 0.5;
- /*
- * Make sure that the number of lines is correct for color shuffling:
- * The shuffling alghorithm produces 2xline_distance lines at the
- * beginning and the same amount at the end of the scan that are not
- * useable. If s->params.lines gets negative, 0 lines are reported
- * back to the frontend.
- */
- if (s->hw->color_shuffle)
- {
- s->params.lines -= 4*s->line_distance;
- if (s->params.lines < 0)
- {
- s->params.lines = 0;
- }
- DBG(1, "Adjusted params.lines for color_shuffle by %d to %d\n",
- 4*s->line_distance, s->params.lines);
- }
-
DBG( 3, "Preview = %d\n", s->val[OPT_PREVIEW].w);
DBG( 3, "Resolution = %d\n", s->val[OPT_RESOLUTION].w);
@@ -4630,41 +4612,18 @@
s->hw->color_shuffle = SANE_TRUE;
#endif
-
/*
* Modify the scan area: If the scanner requires color shuffling, then we try to
* scan more lines to compensate for the lines that will be removed from the scan
* due to the color shuffling alghorithm.
- * At this time we add two times the line distance to the number of scan lines if
- * this is possible - if not, then we try to calculate the number of additional
- * lines according to the selected scan area.
+ * At this time we add two times the line distance to the number of scan lines.
*/
if (s->hw->color_shuffle == SANE_TRUE)
- {
-
- /* start the scan 2*line_distance earlier */
- top -= 2*s->line_distance;
- if (top < 0)
- {
- top = 0;
- }
-
- /* scan 4*line_distance lines more */
- s->params.lines += 4*s->line_distance;
- }
-
- /*
- * If (top + s->params.lines) is larger than the max scan area, reset
- * the number of scan lines:
- */
- if (SANE_UNFIX( s->val[ OPT_BR_Y].w) / 25.4 * ndpi < (s->params.lines + top))
- {
- s->params.lines = ((int) SANE_UNFIX(s->val[OPT_BR_Y].w) /
- 25.4 * ndpi + 0.5) - top;
- }
-
+ s->extra_lines = 2*s->line_distance;
+ else
+ s->extra_lines = 0;
- status = set_scan_area(s, left, top, s->params.pixels_per_line, s->params.lines);
+ status = set_scan_area(s, left, top, s->params.pixels_per_line, s->params.lines + s->extra_lines);
if( SANE_STATUS_GOOD != status)
{
@@ -5045,7 +5004,7 @@
if (s->hw->color_shuffle)
{
DBG(1, "Written %d lines after color shuffle\n", s->lines_written);
- DBG(1, "Lines requested: %d\n", s->params.lines);
+ DBG(1, "Lines requested: %d\n", s->params.lines + s->extra_lines);
}
*length = 0;
@@ -5506,6 +5465,7 @@
}
data_ptr += s->params.bytes_per_line;
+ s->ptr += s->params.bytes_per_line;
if (s->color_shuffle_line == s->line_distance)
{
--- epson.h.orig 2003-11-04 14:58:45.000000000 -0500
+++ epson.h 2003-11-04 15:02:51.000000000 -0500
@@ -271,6 +271,7 @@
SANE_Option_Descriptor opt [ NUM_OPTIONS];
Option_Value val [ NUM_OPTIONS];
SANE_Parameters params;
+ SANE_Int extra_lines; /* extra lines to read for color shuffle */
SANE_Bool block;
SANE_Bool eof;
SANE_Byte * buf, * end, * ptr;
More information about the sane-devel
mailing list