From cae3015b66ab340cf585fb224745e73ae6c53ae6 Mon Sep 17 00:00:00 2001 From: Povilas Kanapickas Date: Fri, 13 Sep 2019 17:03:59 +0300 Subject: [PATCH] genesys: Use new image pipeline for format and CIS reordering --- backend/genesys.cc | 96 -------------------------- backend/genesys_conv_hlp.cc | 132 ------------------------------------ backend/genesys_device.cc | 1 - backend/genesys_device.h | 1 - backend/genesys_gl124.cc | 3 - backend/genesys_gl646.cc | 3 - backend/genesys_gl841.cc | 3 - backend/genesys_gl843.cc | 3 - backend/genesys_gl846.cc | 3 - backend/genesys_gl847.cc | 3 - backend/genesys_low.cc | 13 ++++ 11 files changed, 13 insertions(+), 248 deletions(-) diff --git a/backend/genesys.cc b/backend/genesys.cc index af3afbc9e..3a8f27e05 100644 --- a/backend/genesys.cc +++ b/backend/genesys.cc @@ -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) { diff --git a/backend/genesys_conv_hlp.cc b/backend/genesys_conv_hlp.cc index 7982625a7..17e2e61f3 100644 --- a/backend/genesys_conv_hlp.cc +++ b/backend/genesys_conv_hlp.cc @@ -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, diff --git a/backend/genesys_device.cc b/backend/genesys_device.cc index 8129bb752..3a8abdc20 100644 --- a/backend/genesys_device.cc +++ b/backend/genesys_device.cc @@ -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(); diff --git a/backend/genesys_device.h b/backend/genesys_device.h index 819877eee..de225e48d 100644 --- a/backend/genesys_device.h +++ b/backend/genesys_device.h @@ -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; diff --git a/backend/genesys_gl124.cc b/backend/genesys_gl124.cc index 3cf6b736f..9b78e3ee5 100644 --- a/backend/genesys_gl124.cc +++ b/backend/genesys_gl124.cc @@ -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); diff --git a/backend/genesys_gl646.cc b/backend/genesys_gl646.cc index d4727d71e..701476fed 100644 --- a/backend/genesys_gl646.cc +++ b/backend/genesys_gl646.cc @@ -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); diff --git a/backend/genesys_gl841.cc b/backend/genesys_gl841.cc index 2f713ad0d..2ddbba6db 100644 --- a/backend/genesys_gl841.cc +++ b/backend/genesys_gl841.cc @@ -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); diff --git a/backend/genesys_gl843.cc b/backend/genesys_gl843.cc index 30b9931f2..3a07af523 100644 --- a/backend/genesys_gl843.cc +++ b/backend/genesys_gl843.cc @@ -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); diff --git a/backend/genesys_gl846.cc b/backend/genesys_gl846.cc index 03c31d82e..752b47945 100644 --- a/backend/genesys_gl846.cc +++ b/backend/genesys_gl846.cc @@ -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); diff --git a/backend/genesys_gl847.cc b/backend/genesys_gl847.cc index d1131419e..4b66498ed 100644 --- a/backend/genesys_gl847.cc +++ b/backend/genesys_gl847.cc @@ -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); diff --git a/backend/genesys_low.cc b/backend/genesys_low.cc index 9b88e7b9b..b65ec422a 100644 --- a/backend/genesys_low.cc +++ b/backend/genesys_low.cc @@ -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(dev->model->line_mode_color_order); + } + + if (dev->pipeline.get_output_format() == PixelFormat::BGR888) { + dev->pipeline.push_node(PixelFormat::RGB888); + } + + if (dev->pipeline.get_output_format() == PixelFormat::BGR161616) { + dev->pipeline.push_node(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()