diff --git a/backend/genesys.cc b/backend/genesys.cc index 8bd147401..4f8a1a06a 100644 --- a/backend/genesys.cc +++ b/backend/genesys.cc @@ -3432,8 +3432,7 @@ static void genesys_fill_line_interp_buffer(Genesys_Device* dev, uint8_t* work_b dev->cur++; /* go to next line if needed */ - if (dev->cur == dev->len) - { + if (dev->cur == dev->deseg.pixel_groups) { dev->oe_buffer.set_pos(dev->oe_buffer.pos() + dev->deseg.raw_channel_bytes); dev->cur = 0; dev->line_count++; @@ -3476,7 +3475,7 @@ static void genesys_fill_segmented_buffer(Genesys_Device* dev, uint8_t* work_buf while (count < size) { if (depth==1) { - while (dev->cur < dev->len && count < size) { + while (dev->cur < dev->deseg.pixel_groups && count < size) { for (n=0; nsegnb; n++) { work_buffer_dst[count+n] = 0; } @@ -3497,7 +3496,7 @@ static void genesys_fill_segmented_buffer(Genesys_Device* dev, uint8_t* work_buf } } if (depth==8) { - while (dev->cur < dev->len && count < size) { + while (dev->cur < dev->deseg.pixel_groups && count < size) { for (n=0;nsegnb;n++) { work_buffer_dst[count+n] = dev->oe_buffer.get_read_pos()[dev->cur + dev->skip + dev->deseg.conseq_pixel_dist_bytes *dev->segment_order[n]]; } @@ -3507,7 +3506,7 @@ static void genesys_fill_segmented_buffer(Genesys_Device* dev, uint8_t* work_buf } } if (depth==16) { - while (dev->cur < dev->len && count < size) { + while (dev->cur < dev->deseg.pixel_groups && count < size) { for (n=0;nsegnb;n++) { work_buffer_dst[count+n*2] = dev->oe_buffer.get_read_pos()[dev->cur + dev->skip + dev->deseg.conseq_pixel_dist_bytes * dev->segment_order[n]]; work_buffer_dst[count+n*2+1] = dev->oe_buffer.get_read_pos()[dev->cur + dev->skip + dev->deseg.conseq_pixel_dist_bytes * dev->segment_order[n] + 1]; @@ -3519,8 +3518,7 @@ static void genesys_fill_segmented_buffer(Genesys_Device* dev, uint8_t* work_buf } /* go to next line if needed */ - if (dev->cur == dev->len) - { + if (dev->cur == dev->deseg.pixel_groups) { dev->oe_buffer.set_pos(dev->oe_buffer.pos() + dev->deseg.raw_channel_bytes); dev->cur = 0; } diff --git a/backend/genesys_device.h b/backend/genesys_device.h index 378b857e4..7eb0eb890 100644 --- a/backend/genesys_device.h +++ b/backend/genesys_device.h @@ -195,11 +195,17 @@ struct Genesys_Model // Describes the geometry of the raw data coming out of the scanner for desegmentation. struct DesegmentationState { + // The number of "even" pixels to scan. This corresponds to the number of pixels that will be + // scanned from a single segment + unsigned pixel_groups = 0; + // Distance in bytes between consecutive pixels, e.g. between odd and even pixels. Note that // the number of segments can be large. unsigned conseq_pixel_dist_bytes = 0; + // Total bytes in a channel received from a scanner unsigned raw_channel_bytes = 0; + // Total bytes in a line received from a scanner unsigned raw_line_bytes = 0; }; @@ -328,8 +334,6 @@ struct Genesys_Device int line_interp = 0; // number of scan lines used during scan int line_count = 0; - // number of even pixels - size_t len = 0; // current pixel position within sub window size_t cur = 0; // number of bytes to skip at start of line diff --git a/backend/genesys_gl124.cc b/backend/genesys_gl124.cc index 1f8cfaebe..9ccf258d3 100644 --- a/backend/genesys_gl124.cc +++ b/backend/genesys_gl124.cc @@ -997,7 +997,7 @@ static void gl124_init_optical_regs_scan(Genesys_Device* dev, const Genesys_Sens dev->cur = 0; dev->skip = 0; - dev->len = dev->deseg.raw_channel_bytes / segnb; + dev->deseg.pixel_groups = dev->deseg.raw_channel_bytes / segnb; dev->deseg.conseq_pixel_dist_bytes = dev->deseg.raw_channel_bytes / segnb; dev->segnb = segnb; dev->line_count = 0; @@ -1006,7 +1006,7 @@ static void gl124_init_optical_regs_scan(Genesys_Device* dev, const Genesys_Sens DBG (DBG_io2, "%s: pixels =%d\n", __func__, session.optical_pixels); DBG (DBG_io2, "%s: depth =%d\n", __func__, session.params.depth); DBG (DBG_io2, "%s: dev->bpl =%lu\n", __func__, (unsigned long) dev->deseg.raw_channel_bytes); - DBG (DBG_io2, "%s: dev->len =%lu\n", __func__, (unsigned long)dev->len); + DBG (DBG_io2, "%s: dev->len =%lu\n", __func__, (unsigned long) dev->deseg.pixel_groups); DBG (DBG_io2, "%s: dev->dist =%lu\n", __func__, (unsigned long) dev->deseg.conseq_pixel_dist_bytes); DBG (DBG_io2, "%s: dev->line_interp=%lu\n", __func__, (unsigned long)dev->line_interp); diff --git a/backend/genesys_gl843.cc b/backend/genesys_gl843.cc index a5ef81688..f519c411a 100644 --- a/backend/genesys_gl843.cc +++ b/backend/genesys_gl843.cc @@ -1163,7 +1163,7 @@ static void gl843_init_optical_regs_scan(Genesys_Device* dev, const Genesys_Sens DBG(DBG_io2, "%s: pixels =%d\n", __func__, session.optical_pixels); DBG(DBG_io2, "%s: depth =%d\n", __func__, session.params.depth); DBG(DBG_io2, "%s: dev->bpl =%lu\n", __func__, (unsigned long) dev->deseg.raw_channel_bytes); - DBG(DBG_io2, "%s: dev->len =%lu\n", __func__, (unsigned long)dev->len); + DBG(DBG_io2, "%s: dev->len =%lu\n", __func__, (unsigned long) dev->deseg.pixel_groups); DBG(DBG_io2, "%s: dev->dist =%lu\n", __func__, (unsigned long) dev->deseg.conseq_pixel_dist_bytes); /* MAXWD is expressed in 2 words unit */ diff --git a/backend/genesys_gl846.cc b/backend/genesys_gl846.cc index 055c67fe9..dffc54474 100644 --- a/backend/genesys_gl846.cc +++ b/backend/genesys_gl846.cc @@ -761,7 +761,7 @@ static void gl846_init_optical_regs_scan(Genesys_Device* dev, const Genesys_Sens // compute pixel coordinate in the given dpihw space, taking segments into account startx /= factor*segnb; endx /= factor*segnb; - dev->len = endx - startx; + dev->deseg.pixel_groups = endx - startx; dev->deseg.conseq_pixel_dist_bytes = 0; dev->skip=0; @@ -872,7 +872,7 @@ static void gl846_init_optical_regs_scan(Genesys_Device* dev, const Genesys_Sens /* words(16bit) before gamma, conversion to 8 bit or lineart*/ words_per_line = (used_pixels * session.params.xres * ccd_pixels_per_system_pixel) / sensor.get_register_hwdpi(session.params.xres * ccd_pixels_per_system_pixel); dev->deseg.raw_channel_bytes = multiply_by_depth_ceil(words_per_line, session.params.depth); - dev->len = multiply_by_depth_ceil(dev->len, session.params.depth); + dev->deseg.pixel_groups = multiply_by_depth_ceil(dev->deseg.pixel_groups, session.params.depth); dev->deseg.conseq_pixel_dist_bytes = multiply_by_depth_ceil(dev->deseg.conseq_pixel_dist_bytes, session.params.depth); dev->cur=0; @@ -892,7 +892,7 @@ static void gl846_init_optical_regs_scan(Genesys_Device* dev, const Genesys_Sens DBG (DBG_io2, "%s: pixels =%d\n", __func__, session.optical_pixels); DBG (DBG_io2, "%s: depth =%d\n", __func__, session.params.depth); DBG (DBG_io2, "%s: dev->bpl =%lu\n", __func__, (unsigned long) dev->deseg.raw_channel_bytes); - DBG (DBG_io2, "%s: dev->len =%lu\n", __func__, (unsigned long)dev->len); + DBG (DBG_io2, "%s: dev->len =%lu\n", __func__, (unsigned long) dev->deseg.pixel_groups); DBG (DBG_io2, "%s: dev->dist =%lu\n", __func__, (unsigned long) dev->deseg.conseq_pixel_dist_bytes); DBG (DBG_io2, "%s: dev->segnb =%lu\n", __func__, (unsigned long)dev->segnb); diff --git a/backend/genesys_gl847.cc b/backend/genesys_gl847.cc index fd73c9726..fa59359f1 100644 --- a/backend/genesys_gl847.cc +++ b/backend/genesys_gl847.cc @@ -780,7 +780,7 @@ static void gl847_init_optical_regs_scan(Genesys_Device* dev, const Genesys_Sens // compute pixel coordinate in the given dpihw space, taking segments into account startx /= factor*segnb; endx /= factor*segnb; - dev->len=endx-startx; + dev->deseg.pixel_groups = endx-startx; dev->deseg.conseq_pixel_dist_bytes = 0; dev->skip=0; @@ -891,7 +891,7 @@ static void gl847_init_optical_regs_scan(Genesys_Device* dev, const Genesys_Sens /* words(16bit) before gamma, conversion to 8 bit or lineart*/ dev->deseg.raw_channel_bytes = multiply_by_depth_ceil((used_pixels * dpiset) / dpihw, session.params.depth); - dev->len = multiply_by_depth_ceil(dev->len, session.params.depth); + dev->deseg.pixel_groups = multiply_by_depth_ceil(dev->deseg.pixel_groups, session.params.depth); dev->deseg.conseq_pixel_dist_bytes = multiply_by_depth_ceil(dev->deseg.conseq_pixel_dist_bytes, session.params.depth); dev->cur=0; @@ -910,7 +910,7 @@ static void gl847_init_optical_regs_scan(Genesys_Device* dev, const Genesys_Sens DBG (DBG_io2, "%s: pixels =%d\n", __func__, session.optical_pixels); DBG (DBG_io2, "%s: depth =%d\n", __func__, session.params.depth); DBG (DBG_io2, "%s: dev->bpl =%lu\n", __func__, (unsigned long) dev->deseg.raw_channel_bytes); - DBG (DBG_io2, "%s: dev->len =%lu\n", __func__, (unsigned long)dev->len); + DBG (DBG_io2, "%s: dev->len =%lu\n", __func__, (unsigned long) dev->deseg.pixel_groups); DBG (DBG_io2, "%s: dev->dist =%lu\n", __func__, (unsigned long) dev->deseg.conseq_pixel_dist_bytes); DBG (DBG_io2, "%s: dev->segnb =%lu\n", __func__, (unsigned long)dev->segnb);