genesys: Use new image pipeline for format and CIS reordering

merge-requests/183/head
Povilas Kanapickas 2019-09-13 17:03:59 +03:00
rodzic d1badffa88
commit cae3015b66
11 zmienionych plików z 13 dodań i 248 usunięć

Wyświetl plik

@ -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)
{

Wyświetl plik

@ -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,

Wyświetl plik

@ -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();

Wyświetl plik

@ -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;

Wyświetl plik

@ -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);

Wyświetl plik

@ -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);

Wyświetl plik

@ -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);

Wyświetl plik

@ -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);

Wyświetl plik

@ -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);

Wyświetl plik

@ -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);

Wyświetl plik

@ -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()