kopia lustrzana https://gitlab.com/sane-project/backends
genesys: Simplify genesys_read_ordered_data()
rodzic
1eccbf5aef
commit
0d97c3d195
|
@ -4107,33 +4107,6 @@ static void genesys_start_scan(Genesys_Device* dev, bool lamp_off)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void genesys_fill_read_buffer(Genesys_Device* dev)
|
|
||||||
{
|
|
||||||
DBG_HELPER(dbg);
|
|
||||||
|
|
||||||
/* for sheetfed scanner, we must check is document is shorter than
|
|
||||||
* the requested scan */
|
|
||||||
if (dev->model->is_sheetfed) {
|
|
||||||
dev->cmd_set->detect_document_end(dev);
|
|
||||||
}
|
|
||||||
|
|
||||||
std::size_t size = dev->read_buffer.size() - dev->read_buffer.avail();
|
|
||||||
|
|
||||||
/* due to sensors and motors, not all data can be directly used. It
|
|
||||||
* may have to be read from another intermediate buffer and then processed.
|
|
||||||
* There are currently 3 intermediate stages:
|
|
||||||
* - handling of odd/even sensors
|
|
||||||
* - handling of line interpolation for motors that can't have low
|
|
||||||
* enough dpi
|
|
||||||
* - handling of multi-segments sensors
|
|
||||||
*
|
|
||||||
* This is also the place where full duplex data will be handled.
|
|
||||||
*/
|
|
||||||
dev->pipeline_buffer.get_data(size, dev->read_buffer.get_write_pos(size));
|
|
||||||
|
|
||||||
dev->read_buffer.produce(size);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* this function does the effective data read in a manner that suits
|
/* this function does the effective data read in a manner that suits
|
||||||
the scanner. It does data reordering and resizing if need.
|
the scanner. It does data reordering and resizing if need.
|
||||||
It also manages EOF and I/O errors, and line distance correction.
|
It also manages EOF and I/O errors, and line distance correction.
|
||||||
|
@ -4144,7 +4117,6 @@ static void genesys_read_ordered_data(Genesys_Device* dev, SANE_Byte* destinatio
|
||||||
DBG_HELPER(dbg);
|
DBG_HELPER(dbg);
|
||||||
size_t bytes = 0;
|
size_t bytes = 0;
|
||||||
uint8_t *work_buffer_src;
|
uint8_t *work_buffer_src;
|
||||||
Genesys_Buffer *src_buffer;
|
|
||||||
|
|
||||||
if (!dev->read_active) {
|
if (!dev->read_active) {
|
||||||
*len = 0;
|
*len = 0;
|
||||||
|
@ -4202,14 +4174,19 @@ Problems with the first approach:
|
||||||
}
|
}
|
||||||
dev->total_bytes_read += *len;
|
dev->total_bytes_read += *len;
|
||||||
} else {
|
} else {
|
||||||
genesys_fill_read_buffer(dev);
|
if (dev->model->is_sheetfed) {
|
||||||
|
dev->cmd_set->detect_document_end(dev);
|
||||||
|
}
|
||||||
|
|
||||||
src_buffer = &(dev->read_buffer);
|
std::size_t size = dev->read_buffer.size() - dev->read_buffer.avail();
|
||||||
|
|
||||||
/* move data to destination */
|
dev->pipeline_buffer.get_data(size, dev->read_buffer.get_write_pos(size));
|
||||||
bytes = std::min(src_buffer->avail(), *len);
|
|
||||||
|
|
||||||
work_buffer_src = src_buffer->get_read_pos();
|
dev->read_buffer.produce(size);
|
||||||
|
|
||||||
|
bytes = std::min(dev->read_buffer.avail(), *len);
|
||||||
|
|
||||||
|
work_buffer_src = dev->read_buffer.get_read_pos();
|
||||||
|
|
||||||
std::memcpy(destination, work_buffer_src, bytes);
|
std::memcpy(destination, work_buffer_src, bytes);
|
||||||
*len = bytes;
|
*len = bytes;
|
||||||
|
@ -4223,7 +4200,7 @@ Problems with the first approach:
|
||||||
/* count bytes sent to frontend */
|
/* count bytes sent to frontend */
|
||||||
dev->total_bytes_read += *len;
|
dev->total_bytes_read += *len;
|
||||||
|
|
||||||
src_buffer->consume(bytes);
|
dev->read_buffer.consume(bytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* end scan if all needed data have been read */
|
/* end scan if all needed data have been read */
|
||||||
|
|
Ładowanie…
Reference in New Issue