kopia lustrzana https://gitlab.com/sane-project/backends
fix image size when document shorter than expected for gl841 scanners
- add a function to read count of lined scanned - use real scanned count line to compute the number of line to read to flush the current scanmerge-requests/1/head
rodzic
3fc69a358e
commit
e6dd25adb7
|
@ -52,7 +52,7 @@
|
|||
|
||||
#include "../include/sane/config.h"
|
||||
|
||||
#define BUILD 11
|
||||
#define BUILD 12
|
||||
|
||||
#include <errno.h>
|
||||
#include <string.h>
|
||||
|
@ -555,6 +555,31 @@ sanei_genesys_read_valid_words (Genesys_Device * dev, unsigned int *words)
|
|||
return SANE_STATUS_GOOD;
|
||||
}
|
||||
|
||||
/** read the number of lines scanned
|
||||
* ie registers 4b-4c-4d
|
||||
*/
|
||||
SANE_Status
|
||||
sanei_genesys_read_scancnt (Genesys_Device * dev, unsigned int *words)
|
||||
{
|
||||
SANE_Status status;
|
||||
uint8_t value;
|
||||
|
||||
DBG (DBG_proc, "sanei_genesys_read_scancnt: start\n");
|
||||
|
||||
RIE (sanei_genesys_read_register (dev, 0x4d, &value));
|
||||
*words = value;
|
||||
RIE (sanei_genesys_read_register (dev, 0x4c, &value));
|
||||
*words += (value * 256);
|
||||
RIE (sanei_genesys_read_register (dev, 0x4b, &value));
|
||||
if (dev->model->asic_type == GENESYS_GL646)
|
||||
*words += ((value & 0x03) * 256 * 256);
|
||||
else
|
||||
*words += ((value & 0x0f) * 256 * 256);
|
||||
|
||||
DBG (DBG_proc, "sanei_genesys_read_scancnt: %d lines\n", *words);
|
||||
return SANE_STATUS_GOOD;
|
||||
}
|
||||
|
||||
Genesys_Register_Set *
|
||||
sanei_genesys_get_address (Genesys_Register_Set * regs, SANE_Byte addr)
|
||||
{
|
||||
|
@ -6794,7 +6819,7 @@ sane_read (SANE_Handle handle, SANE_Byte * buf, SANE_Int max_len,
|
|||
return SANE_STATUS_CANCELLED;
|
||||
}
|
||||
|
||||
DBG (DBG_proc, "sane_read: start\n");
|
||||
DBG (DBG_proc, "sane_read: start, %d maximum bytes required\n", max_len);
|
||||
|
||||
local_len = max_len;
|
||||
status = genesys_read_ordered_data (s->dev, buf, &local_len);
|
||||
|
|
|
@ -3941,7 +3941,7 @@ gl841_detect_document_end (Genesys_Device * dev)
|
|||
{
|
||||
SANE_Status status = SANE_STATUS_GOOD;
|
||||
SANE_Bool paper_loaded;
|
||||
unsigned int words = 0;
|
||||
unsigned int scancnt = 0;
|
||||
int flines, channels, depth, bytes_remain, sublines,
|
||||
bytes_to_flush, lines, sub_bytes, tmp, read_bytes_left;
|
||||
DBG (DBG_proc, "%s: begin\n", __FUNCTION__);
|
||||
|
@ -3957,15 +3957,41 @@ gl841_detect_document_end (Genesys_Device * dev)
|
|||
channels = dev->current_setup.channels;
|
||||
depth = dev->current_setup.depth;
|
||||
read_bytes_left = (int) dev->read_bytes_left;
|
||||
DBG (DBG_io, "gl841_detect_document_end: read_bytes_left=%d\n", read_bytes_left);
|
||||
DBG (DBG_io, "gl841_detect_document_end: read_bytes_left=%d\n",
|
||||
read_bytes_left);
|
||||
|
||||
/* read lins read */
|
||||
status = sanei_genesys_read_scancnt (dev, &scancnt);
|
||||
if (status != SANE_STATUS_GOOD)
|
||||
{
|
||||
flines = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* compute number of line read */
|
||||
tmp = (int) dev->total_bytes_read;
|
||||
if (depth == 1 || dev->settings.scan_mode == SCAN_MODE_LINEART)
|
||||
flines = tmp * 8 / dev->settings.pixels / channels;
|
||||
else
|
||||
flines = tmp / (depth / 8) / dev->settings.pixels / channels;
|
||||
|
||||
/* number of scanned lines, but no read yet */
|
||||
flines = scancnt - flines;
|
||||
|
||||
DBG (DBG_io,
|
||||
"gl841_detect_document_end: %d scanned but not read lines\n",
|
||||
flines);
|
||||
}
|
||||
|
||||
/* adjust number of bytes to read
|
||||
* we need to read the final bytes which are word per line * number of last lines
|
||||
* to have doc leaving feeder */
|
||||
lines =
|
||||
(SANE_UNFIX(dev->model->post_scan) * dev->current_setup.yres) /
|
||||
MM_PER_INCH;
|
||||
DBG (DBG_io, "gl841_detect_document_end: adding %d line to flush\n", lines);
|
||||
(SANE_UNFIX (dev->model->post_scan) * dev->current_setup.yres) /
|
||||
MM_PER_INCH + flines;
|
||||
DBG (DBG_io, "gl841_detect_document_end: adding %d line to flush\n",
|
||||
lines);
|
||||
|
||||
/* number of bytes to read from scanner to get document out of it after
|
||||
* end of document dectected by hardware sensor */
|
||||
bytes_to_flush = lines * dev->wpl;
|
||||
|
@ -3974,30 +4000,24 @@ gl841_detect_document_end (Genesys_Device * dev)
|
|||
if (bytes_to_flush < read_bytes_left)
|
||||
{
|
||||
/* we take all these step to work around an overflow on some plateforms */
|
||||
tmp=(int)dev->total_bytes_read;
|
||||
DBG (DBG_io, "gl841_detect_document_end: tmp=%d\n", tmp);
|
||||
bytes_remain = (int)dev->total_bytes_to_read;
|
||||
DBG (DBG_io, "gl841_detect_document_end: bytes_remain=%d\n", bytes_remain);
|
||||
tmp = (int) dev->total_bytes_read;
|
||||
DBG (DBG_io, "gl841_detect_document_end: tmp=%d\n", tmp);
|
||||
bytes_remain = (int) dev->total_bytes_to_read;
|
||||
DBG (DBG_io, "gl841_detect_document_end: bytes_remain=%d\n",
|
||||
bytes_remain);
|
||||
bytes_remain = bytes_remain - tmp;
|
||||
DBG (DBG_io, "gl841_detect_document_end: bytes_remain=%d\n", bytes_remain);
|
||||
|
||||
/* we substract the amount of data that is still in scanner's buffer */
|
||||
status = sanei_genesys_read_valid_words (dev, &words);
|
||||
if (status == SANE_STATUS_GOOD)
|
||||
{
|
||||
bytes_remain -= words;
|
||||
}
|
||||
DBG (DBG_io, "gl841_detect_document_end: bytes_remain=%d\n",
|
||||
bytes_remain);
|
||||
|
||||
/* remaining lines to read by frontend for the current scan */
|
||||
if (depth == 1 || dev->settings.scan_mode == SCAN_MODE_LINEART)
|
||||
{
|
||||
flines = bytes_remain * 8
|
||||
/ dev->settings.pixels / channels;
|
||||
flines = bytes_remain * 8 / dev->settings.pixels / channels;
|
||||
}
|
||||
else
|
||||
flines = bytes_remain / (depth / 8)
|
||||
flines = bytes_remain / (depth / 8)
|
||||
/ dev->settings.pixels / channels;
|
||||
DBG (DBG_io, "gl841_detect_document_end: flines=%d\n", flines);
|
||||
DBG (DBG_io, "gl841_detect_document_end: flines=%d\n", flines);
|
||||
|
||||
if (flines > lines)
|
||||
{
|
||||
|
@ -4009,34 +4029,40 @@ gl841_detect_document_end (Genesys_Device * dev)
|
|||
if (depth == 1 || dev->settings.scan_mode == SCAN_MODE_LINEART)
|
||||
sub_bytes =
|
||||
((dev->settings.pixels * sublines) / 8 +
|
||||
(((dev->settings.pixels * sublines)%8)?1:0)
|
||||
) * channels;
|
||||
(((dev->settings.pixels * sublines) % 8) ? 1 : 0)) *
|
||||
channels;
|
||||
else
|
||||
sub_bytes =
|
||||
dev->settings.pixels * sublines * channels * (depth / 8);
|
||||
DBG (DBG_io, "gl841_detect_document_end: sublines=%d\n", sublines);
|
||||
DBG (DBG_io, "gl841_detect_document_end: subbytes=%d\n", sub_bytes);
|
||||
DBG (DBG_io, "gl841_detect_document_end: total_bytes_to_read=%d\n", dev->total_bytes_to_read);
|
||||
DBG (DBG_io, "gl841_detect_document_end: read_bytes_left=%d\n", read_bytes_left);
|
||||
|
||||
dev->total_bytes_to_read -= sub_bytes;
|
||||
|
||||
/* then adjust the physical bytes to read */
|
||||
if(read_bytes_left>sub_bytes)
|
||||
{
|
||||
dev->read_bytes_left -= sub_bytes;
|
||||
if (read_bytes_left > sub_bytes)
|
||||
{
|
||||
dev->read_bytes_left -= sub_bytes;
|
||||
}
|
||||
else
|
||||
{
|
||||
dev->total_bytes_to_read = dev->total_bytes_read;
|
||||
dev->read_bytes_left = 0;
|
||||
dev->total_bytes_to_read = dev->total_bytes_read;
|
||||
dev->read_bytes_left = 0;
|
||||
}
|
||||
|
||||
DBG (DBG_io, "gl841_detect_document_end: sublines=%d\n",
|
||||
sublines);
|
||||
DBG (DBG_io, "gl841_detect_document_end: subbytes=%d\n",
|
||||
sub_bytes);
|
||||
DBG (DBG_io,
|
||||
"gl841_detect_document_end: total_bytes_to_read=%d\n",
|
||||
dev->total_bytes_to_read);
|
||||
DBG (DBG_io, "gl841_detect_document_end: read_bytes_left=%d\n",
|
||||
read_bytes_left);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
DBG (DBG_io, "gl841_detect_document_end: no flushing needed\n");
|
||||
}
|
||||
{
|
||||
DBG (DBG_io, "gl841_detect_document_end: no flushing needed\n");
|
||||
}
|
||||
}
|
||||
|
||||
DBG (DBG_proc, "%s: finished\n", __FUNCTION__);
|
||||
|
|
|
@ -638,6 +638,9 @@ sanei_genesys_init_shading_data (Genesys_Device * dev, int pixels_per_line);
|
|||
extern SANE_Status sanei_genesys_read_valid_words (Genesys_Device * dev,
|
||||
unsigned int *steps);
|
||||
|
||||
extern SANE_Status sanei_genesys_read_scancnt (Genesys_Device * dev,
|
||||
unsigned int *steps);
|
||||
|
||||
extern SANE_Status sanei_genesys_read_feed_steps (Genesys_Device * dev,
|
||||
unsigned int *steps);
|
||||
|
||||
|
|
Ładowanie…
Reference in New Issue