kopia lustrzana https://gitlab.com/sane-project/backends
genesys: Use new image pipeline for format and CIS reordering
rodzic
d1badffa88
commit
cae3015b66
|
@ -3445,7 +3445,6 @@ static void genesys_read_ordered_data(Genesys_Device* dev, SANE_Byte* destinatio
|
|||
uint8_t *work_buffer_src;
|
||||
uint8_t *work_buffer_dst;
|
||||
unsigned int dst_lines;
|
||||
unsigned int step_1_mode;
|
||||
Genesys_Buffer *src_buffer;
|
||||
Genesys_Buffer *dst_buffer;
|
||||
|
||||
|
@ -3547,101 +3546,6 @@ Problems with the first approach:
|
|||
|
||||
src_buffer = &(dev->read_buffer);
|
||||
|
||||
/* maybe reorder components/bytes */
|
||||
if (dev->session.pipeline_needs_reorder) {
|
||||
if (depth == 1) {
|
||||
throw SaneException("Can't reorder single bit data\n");
|
||||
}
|
||||
|
||||
dst_buffer = &(dev->lines_buffer);
|
||||
|
||||
work_buffer_src = src_buffer->get_read_pos();
|
||||
bytes = src_buffer->avail();
|
||||
|
||||
/*how many bytes can be processed here?*/
|
||||
/*we are greedy. we work as much as possible*/
|
||||
if (bytes > dst_buffer->size() - dst_buffer->avail())
|
||||
bytes = dst_buffer->size() - dst_buffer->avail();
|
||||
|
||||
dst_lines = (bytes * 8) / (src_pixels * channels * depth);
|
||||
bytes = (dst_lines * src_pixels * channels * depth) / 8;
|
||||
|
||||
work_buffer_dst = dst_buffer->get_write_pos(bytes);
|
||||
|
||||
DBG(DBG_info, "%s: reordering %d lines\n", __func__, dst_lines);
|
||||
|
||||
if (dst_lines != 0)
|
||||
{
|
||||
|
||||
if (channels == 3)
|
||||
{
|
||||
step_1_mode = 0;
|
||||
|
||||
if (depth == 16) {
|
||||
step_1_mode |= 1;
|
||||
}
|
||||
|
||||
if (dev->model->is_cis) {
|
||||
step_1_mode |= 2;
|
||||
}
|
||||
|
||||
if (dev->model->line_mode_color_order == ColorOrder::BGR) {
|
||||
step_1_mode |= 4;
|
||||
}
|
||||
|
||||
switch (step_1_mode)
|
||||
{
|
||||
case 1: /* RGB, chunky, 16 bit */
|
||||
#ifdef WORDS_BIGENDIAN
|
||||
genesys_reorder_components_endian_16(work_buffer_src, work_buffer_dst, dst_lines,
|
||||
src_pixels, 3);
|
||||
break;
|
||||
#endif /*WORDS_BIGENDIAN */
|
||||
case 0: /* RGB, chunky, 8 bit */
|
||||
break;
|
||||
case 2: /* RGB, cis, 8 bit */
|
||||
genesys_reorder_components_cis_8(work_buffer_src, work_buffer_dst, dst_lines,
|
||||
src_pixels);
|
||||
break;
|
||||
case 3: /* RGB, cis, 16 bit */
|
||||
genesys_reorder_components_cis_16(work_buffer_src, work_buffer_dst, dst_lines,
|
||||
src_pixels);
|
||||
break;
|
||||
case 4: /* BGR, chunky, 8 bit */
|
||||
genesys_reorder_components_bgr_8(work_buffer_src, work_buffer_dst, dst_lines,
|
||||
src_pixels);
|
||||
break;
|
||||
case 5: /* BGR, chunky, 16 bit */
|
||||
genesys_reorder_components_bgr_16(work_buffer_src, work_buffer_dst, dst_lines,
|
||||
src_pixels);
|
||||
break;
|
||||
case 6: /* BGR, cis, 8 bit */
|
||||
genesys_reorder_components_cis_bgr_8(work_buffer_src, work_buffer_dst, dst_lines,
|
||||
src_pixels);
|
||||
break;
|
||||
case 7: /* BGR, cis, 16 bit */
|
||||
genesys_reorder_components_cis_bgr_16(work_buffer_src, work_buffer_dst, dst_lines,
|
||||
src_pixels);
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
#ifdef WORDS_BIGENDIAN
|
||||
if (depth == 16)
|
||||
{
|
||||
genesys_reorder_components_endian_16(work_buffer_src, work_buffer_dst, dst_lines,
|
||||
src_pixels, 1);
|
||||
}
|
||||
#endif /*WORDS_BIGENDIAN */
|
||||
}
|
||||
|
||||
dst_buffer->produce(bytes);
|
||||
src_buffer->consume(bytes);
|
||||
}
|
||||
src_buffer = dst_buffer;
|
||||
}
|
||||
|
||||
// maybe reverse effects of ccd layout
|
||||
if (dev->session.pipeline_needs_ccd)
|
||||
{
|
||||
|
|
|
@ -45,138 +45,6 @@
|
|||
* Conversion filters for genesys backend
|
||||
*/
|
||||
|
||||
static void FUNC_NAME(genesys_reorder_components_cis) (uint8_t* src_data, uint8_t* dst_data,
|
||||
unsigned int lines, unsigned int pixels)
|
||||
{
|
||||
DBG_HELPER(dbg);
|
||||
unsigned int x, y;
|
||||
uint8_t *src[3];
|
||||
uint8_t *dst = dst_data;
|
||||
unsigned int rest = pixels * 2 * BYTES_PER_COMPONENT;
|
||||
|
||||
src[0] = src_data + pixels * BYTES_PER_COMPONENT * 0;
|
||||
src[1] = src_data + pixels * BYTES_PER_COMPONENT * 1;
|
||||
src[2] = src_data + pixels * BYTES_PER_COMPONENT * 2;
|
||||
|
||||
for(y = 0; y < lines; y++) {
|
||||
for(x = 0; x < pixels; x++) {
|
||||
|
||||
#ifndef DOUBLE_BYTE
|
||||
*dst++ = *src[0]++;
|
||||
*dst++ = *src[1]++;
|
||||
*dst++ = *src[2]++;
|
||||
#else
|
||||
# ifndef WORDS_BIGENDIAN
|
||||
*dst++ = *src[0]++;
|
||||
*dst++ = *src[0]++;
|
||||
*dst++ = *src[1]++;
|
||||
*dst++ = *src[1]++;
|
||||
*dst++ = *src[2]++;
|
||||
*dst++ = *src[2]++;
|
||||
# else
|
||||
*dst++ = src[0][1];
|
||||
*dst++ = src[0][0];
|
||||
*dst++ = src[1][1];
|
||||
*dst++ = src[1][0];
|
||||
*dst++ = src[2][1];
|
||||
*dst++ = src[2][0];
|
||||
src[0] += 2;
|
||||
src[1] += 2;
|
||||
src[2] += 2;
|
||||
# endif
|
||||
#endif
|
||||
}
|
||||
|
||||
src[0] += rest;
|
||||
src[1] += rest;
|
||||
src[2] += rest;
|
||||
}
|
||||
}
|
||||
|
||||
static void FUNC_NAME(genesys_reorder_components_cis_bgr) (uint8_t* src_data, uint8_t* dst_data,
|
||||
unsigned int lines, unsigned int pixels)
|
||||
{
|
||||
DBG_HELPER(dbg);
|
||||
unsigned int x, y;
|
||||
uint8_t *src[3];
|
||||
uint8_t *dst = dst_data;
|
||||
unsigned int rest = pixels * 2 * BYTES_PER_COMPONENT;
|
||||
|
||||
src[0] = src_data + pixels * BYTES_PER_COMPONENT * 0;
|
||||
src[1] = src_data + pixels * BYTES_PER_COMPONENT * 1;
|
||||
src[2] = src_data + pixels * BYTES_PER_COMPONENT * 2;
|
||||
|
||||
for(y = 0; y < lines; y++) {
|
||||
for(x = 0; x < pixels; x++) {
|
||||
#ifndef DOUBLE_BYTE
|
||||
*dst++ = *src[2]++;
|
||||
*dst++ = *src[1]++;
|
||||
*dst++ = *src[0]++;
|
||||
#else
|
||||
# ifndef WORDS_BIGENDIAN
|
||||
*dst++ = *src[2]++;
|
||||
*dst++ = *src[2]++;
|
||||
*dst++ = *src[1]++;
|
||||
*dst++ = *src[1]++;
|
||||
*dst++ = *src[0]++;
|
||||
*dst++ = *src[0]++;
|
||||
# else
|
||||
*dst++ = src[2][1];
|
||||
*dst++ = src[2][0];
|
||||
*dst++ = src[1][1];
|
||||
*dst++ = src[1][0];
|
||||
*dst++ = src[0][1];
|
||||
*dst++ = src[0][0];
|
||||
src[0] += 2;
|
||||
src[1] += 2;
|
||||
src[2] += 2;
|
||||
# endif
|
||||
#endif
|
||||
}
|
||||
|
||||
src[0] += rest;
|
||||
src[1] += rest;
|
||||
src[2] += rest;
|
||||
}
|
||||
}
|
||||
|
||||
static void FUNC_NAME(genesys_reorder_components_bgr) (uint8_t* src_data, uint8_t* dst_data,
|
||||
unsigned int lines, unsigned int pixels)
|
||||
{
|
||||
DBG_HELPER(dbg);
|
||||
unsigned int c;
|
||||
uint8_t *src = src_data;
|
||||
uint8_t *dst = dst_data;
|
||||
|
||||
for(c = 0; c < lines * pixels; c++) {
|
||||
|
||||
#ifndef DOUBLE_BYTE
|
||||
*dst++ = src[2];
|
||||
*dst++ = src[1];
|
||||
*dst++ = src[0];
|
||||
src += 3;
|
||||
#else
|
||||
# ifndef WORDS_BIGENDIAN
|
||||
*dst++ = src[2 * 2 + 0];
|
||||
*dst++ = src[2 * 2 + 1];
|
||||
*dst++ = src[1 * 2 + 0];
|
||||
*dst++ = src[1 * 2 + 1];
|
||||
*dst++ = src[0 * 2 + 0];
|
||||
*dst++ = src[0 * 2 + 1];
|
||||
# else
|
||||
*dst++ = src[2 * 2 + 1];
|
||||
*dst++ = src[2 * 2 + 0];
|
||||
*dst++ = src[1 * 2 + 1];
|
||||
*dst++ = src[1 * 2 + 0];
|
||||
*dst++ = src[0 * 2 + 1];
|
||||
*dst++ = src[0 * 2 + 0];
|
||||
# endif
|
||||
src += 3 * 2;
|
||||
#endif
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
#if defined(DOUBLE_BYTE) && defined(WORDS_BIGENDIAN)
|
||||
static void FUNC_NAME(genesys_reorder_components_endian) (uint8_t* src_data, uint8_t* dst_data,
|
||||
unsigned int lines, unsigned int pixels,
|
||||
|
|
|
@ -55,7 +55,6 @@ Genesys_Device::~Genesys_Device()
|
|||
void Genesys_Device::clear()
|
||||
{
|
||||
read_buffer.clear();
|
||||
lines_buffer.clear();
|
||||
shrink_buffer.clear();
|
||||
out_buffer.clear();
|
||||
binarize_buffer.clear();
|
||||
|
|
|
@ -282,7 +282,6 @@ struct Genesys_Device
|
|||
SANE_Bool needs_home_ta = 0;
|
||||
|
||||
Genesys_Buffer read_buffer;
|
||||
Genesys_Buffer lines_buffer;
|
||||
Genesys_Buffer shrink_buffer;
|
||||
Genesys_Buffer out_buffer;
|
||||
|
||||
|
|
|
@ -1053,9 +1053,6 @@ static void gl124_init_scan_regs(Genesys_Device* dev, const Genesys_Sensor& sens
|
|||
dev->read_buffer.clear();
|
||||
dev->read_buffer.alloc(session.buffer_size_read);
|
||||
|
||||
dev->lines_buffer.clear();
|
||||
dev->lines_buffer.alloc(session.buffer_size_lines);
|
||||
|
||||
dev->shrink_buffer.clear();
|
||||
dev->shrink_buffer.alloc(session.buffer_size_shrink);
|
||||
|
||||
|
|
|
@ -718,9 +718,6 @@ static void gl646_setup_registers(Genesys_Device* dev,
|
|||
dev->read_buffer.clear();
|
||||
dev->read_buffer.alloc(session.buffer_size_read);
|
||||
|
||||
dev->lines_buffer.clear();
|
||||
dev->lines_buffer.alloc(session.buffer_size_lines);
|
||||
|
||||
dev->shrink_buffer.clear();
|
||||
dev->shrink_buffer.alloc(session.buffer_size_shrink);
|
||||
|
||||
|
|
|
@ -1875,9 +1875,6 @@ dummy \ scanned lines
|
|||
dev->read_buffer.clear();
|
||||
dev->read_buffer.alloc(session.buffer_size_read);
|
||||
|
||||
dev->lines_buffer.clear();
|
||||
dev->lines_buffer.alloc(session.buffer_size_lines);
|
||||
|
||||
dev->shrink_buffer.clear();
|
||||
dev->shrink_buffer.alloc(session.buffer_size_shrink);
|
||||
|
||||
|
|
|
@ -1292,9 +1292,6 @@ static void gl843_init_scan_regs(Genesys_Device* dev, const Genesys_Sensor& sens
|
|||
dev->read_buffer.clear();
|
||||
dev->read_buffer.alloc(session.buffer_size_read);
|
||||
|
||||
dev->lines_buffer.clear();
|
||||
dev->lines_buffer.alloc(session.buffer_size_lines);
|
||||
|
||||
dev->shrink_buffer.clear();
|
||||
dev->shrink_buffer.alloc(session.buffer_size_shrink);
|
||||
|
||||
|
|
|
@ -918,9 +918,6 @@ static void gl846_init_scan_regs(Genesys_Device* dev, const Genesys_Sensor& sens
|
|||
dev->read_buffer.clear();
|
||||
dev->read_buffer.alloc(session.buffer_size_read);
|
||||
|
||||
dev->lines_buffer.clear();
|
||||
dev->lines_buffer.alloc(session.buffer_size_lines);
|
||||
|
||||
dev->shrink_buffer.clear();
|
||||
dev->shrink_buffer.alloc(session.buffer_size_shrink);
|
||||
|
||||
|
|
|
@ -928,9 +928,6 @@ static void gl847_init_scan_regs(Genesys_Device* dev, const Genesys_Sensor& sens
|
|||
dev->read_buffer.clear();
|
||||
dev->read_buffer.alloc(session.buffer_size_read);
|
||||
|
||||
dev->lines_buffer.clear();
|
||||
dev->lines_buffer.alloc(session.buffer_size_lines);
|
||||
|
||||
dev->shrink_buffer.clear();
|
||||
dev->shrink_buffer.alloc(session.buffer_size_shrink);
|
||||
|
||||
|
|
|
@ -1501,6 +1501,19 @@ void build_image_pipeline(Genesys_Device* dev, const ScanSession& session)
|
|||
get_fake_usb_buffer_model(session), read_data_from_usb);
|
||||
}
|
||||
|
||||
if (dev->model->is_cis && session.params.channels == 3) {
|
||||
dev->pipeline.push_node<ImagePipelineNodeMergeMonoLines>(dev->model->line_mode_color_order);
|
||||
}
|
||||
|
||||
if (dev->pipeline.get_output_format() == PixelFormat::BGR888) {
|
||||
dev->pipeline.push_node<ImagePipelineNodeFormatConvert>(PixelFormat::RGB888);
|
||||
}
|
||||
|
||||
if (dev->pipeline.get_output_format() == PixelFormat::BGR161616) {
|
||||
dev->pipeline.push_node<ImagePipelineNodeFormatConvert>(PixelFormat::RGB161616);
|
||||
}
|
||||
|
||||
|
||||
auto read_from_pipeline = [dev](std::size_t size, std::uint8_t* out_data)
|
||||
{
|
||||
(void) size; // will be always equal to dev->pipeline.get_output_row_bytes()
|
||||
|
|
Ładowanie…
Reference in New Issue