[sane-devel] [PATCH 05/10] epjitsu: skip top padding

Hiroshi Miura miurahr at linux.com
Sun Nov 4 10:38:13 UTC 2012


The driver need a padding at top of page.
Because scansnap don't treat empty image
at the top of image that is generated when
loading paper, the driver cut top of page
in 1/2 inch.

Signed-off-by: Hiroshi Miura <miurahr at linux.com>
---
 backend/epjitsu.c |   52 +++++++++++++++++++++++++++++++++++++++++++++-------
 backend/epjitsu.h |    1 +
 2 files changed, 46 insertions(+), 7 deletions(-)

diff --git a/backend/epjitsu.c b/backend/epjitsu.c
index a0ca532..624f532 100644
--- a/backend/epjitsu.c
+++ b/backend/epjitsu.c
@@ -1930,6 +1930,17 @@ change_params(struct scanner *s)
     /*output image might be taller than scan due to interpolation*/
     s->front.height = SCANNER_UNIT_TO_PIX(s->page_height, s->resolution_x);
     /*  SCANNER_UNIT_TO_PIX(s->page_height, s->resolution_y) * (s->resolution_x / s->resolution_y) */
+
+    /* ADF front need to remove padding header */
+    if (s->source != SOURCE_FLATBED)
+    {
+        s->front.y_skip_offset = SCANNER_UNIT_TO_PIX(ADF_HEIGHT_PADDING, s->resolution_y);
+    }
+    else
+    {
+        s->front.y_skip_offset = 0;
+    }
+
     s->front.pages = 1;
     s->front.buffer = NULL;
 
@@ -1939,6 +1950,7 @@ change_params(struct scanner *s)
     s->back.height = s->front.height;
     s->back.x_start_offset = s->front.x_start_offset;
     s->back.x_offset_bytes = s->front.x_offset_bytes;
+    s->back.y_skip_offset = 0;
     s->back.pages = 1;
     s->back.buffer = NULL;
 
@@ -3540,7 +3552,7 @@ sane_read (SANE_Handle handle, SANE_Byte * buf, SANE_Int max_len, SANE_Int * len
     page = &s->pages[s->side];
 
     /* have sent all of current buffer */
-    if(page->done){
+    if(s->fullscan.done && page->done){
         DBG (10, "sane_read: returning eof\n");
         return SANE_STATUS_EOF;
     } 
@@ -3687,7 +3699,7 @@ sane_read (SANE_Handle handle, SANE_Byte * buf, SANE_Int max_len, SANE_Int * len
         page->bytes_read += *len;
     
         /* sent it all, return eof on next read */
-        if(s->fullscan.done && page->bytes_read == page->bytes_scanned){
+        if(page->bytes_read == page->bytes_scanned){
             DBG (10, "sane_read: side done\n");
             page->done = 1;
         }
@@ -3799,20 +3811,46 @@ copy_block_to_page(struct scanner *s,int side)
     SANE_Status ret = SANE_STATUS_GOOD;
     struct transfer * block = &s->block_xfr;
     struct page * page = &s->pages[side];
-    int height = block->total_bytes / block->line_stride;
+    int image_height = block->total_bytes / block->line_stride;
     int image_width = block->image->width_pix;
+    int page_height = SCANNER_UNIT_TO_PIX(s->page_height, s->resolution_x);
     int page_width = page->image->width_pix;
     int block_page_stride = block->image->width_bytes * block->image->height;
     int page_y_offset = page->bytes_scanned / page->image->width_bytes;
     int line_reverse = (side == SIDE_BACK) || (s->model == MODEL_FI60F);
-    int i,j;
+    int i,j,k=0,l=0;
 
     DBG (10, "copy_block_to_page: start\n");
 
+    /* skip padding */
+    if (s->fullscan.rx_bytes + s->block_xfr.rx_bytes < block->line_stride * page->image->y_skip_offset)
+    {
+        return ret;
+    }
+    else if (s->fullscan.rx_bytes < block->line_stride * page->image->y_skip_offset)
+    {
+        k = page->image->y_skip_offset - s->fullscan.rx_bytes / block->line_stride;
+    }
+
+    /* skip trailer */
+    if (s->page_height)
+    {
+        if (s->fullscan.rx_bytes > block->line_stride * page->image->y_skip_offset + page_height * block->line_stride)
+        {
+            return ret;
+        }
+        else if (s->fullscan.rx_bytes + s->block_xfr.rx_bytes
+                 > block->line_stride * page->image->y_skip_offset + page_height * block->line_stride)
+        {
+             l = (s->fullscan.rx_bytes + s->block_xfr.rx_bytes) / block->line_stride
+                 - page_height - page->image->y_skip_offset;
+        }
+    }
+
     /* loop over all the lines in the block */
-    for (i = 0; i < height; i++)
+    for (i = 0; i < image_height-k-l; i++)
     {
-        unsigned char * p_in = block->image->buffer + (side * block_page_stride) + (i * block->image->width_bytes) + page->image->x_start_offset * 3;
+        unsigned char * p_in = block->image->buffer + (side * block_page_stride) + ((i+k) * block->image->width_bytes) + page->image->x_start_offset * 3;
         unsigned char * p_out = page->image->buffer + ((i + page_y_offset) * page->image->width_bytes);
         unsigned char * lineStart = p_out;
         /* reverse order for back side or FI-60F scanner */
@@ -3868,7 +3906,7 @@ copy_block_to_page(struct scanner *s,int side)
     }
 
     /* update the page counter of bytes scanned */
-    page->bytes_scanned += page->image->width_bytes * height;
+    page->bytes_scanned += page->image->width_bytes * (image_height - k - l);
 
     DBG (10, "copy_block_to_page: finish\n");
 
diff --git a/backend/epjitsu.h b/backend/epjitsu.h
index f6b7750..68a997b 100644
--- a/backend/epjitsu.h
+++ b/backend/epjitsu.h
@@ -58,6 +58,7 @@ struct image {
   int pages;
   int x_start_offset;
   int x_offset_bytes;
+  int y_skip_offset;
   unsigned char * buffer;
 };
 
-- 
1.7.9.5





More information about the sane-devel mailing list