genesys: Move Genesys_Device::segnb to DesegmentationState

merge-requests/162/head
Povilas Kanapickas 2019-09-12 21:26:57 +03:00
rodzic 15996983ba
commit f92253adc8
5 zmienionych plików z 51 dodań i 59 usunięć

Wyświetl plik

@ -3457,7 +3457,7 @@ static void genesys_fill_segmented_buffer(Genesys_Device* dev, uint8_t* work_buf
{
DBG_HELPER(dbg);
size_t count;
int depth,i,n,k;
int depth, i, k;
depth = dev->settings.depth;
if (dev->settings.scan_mode == ScanColorMode::LINEART && dev->settings.dynamic_lineart==SANE_FALSE)
@ -3476,13 +3476,13 @@ static void genesys_fill_segmented_buffer(Genesys_Device* dev, uint8_t* work_buf
{
if (depth==1) {
while (dev->cur < dev->deseg.pixel_groups && count < size) {
for (n=0; n<dev->segnb; n++) {
for (unsigned n = 0; n < dev->deseg.segment_count; n++) {
work_buffer_dst[count+n] = 0;
}
/* interleaving is at bit level */
for (i=0;i<8;i++) {
k=count+(i*dev->segnb)/8;
for (n=0;n<dev->segnb;n++) {
k = count + (i * dev->deseg.segment_count) / 8;
for (unsigned n = 0; n < dev->deseg.segment_count; n++) {
work_buffer_dst[k] = work_buffer_dst[k] << 1;
if ((dev->oe_buffer.get_read_pos()[dev->cur + dev->deseg.skip_bytes + dev->deseg.conseq_pixel_dist_bytes * dev->segment_order[n]])&(128>>i)) {
work_buffer_dst[k] |= 1;
@ -3491,28 +3491,28 @@ static void genesys_fill_segmented_buffer(Genesys_Device* dev, uint8_t* work_buf
}
/* update counter and pointer */
count += dev->segnb;
count += dev->deseg.segment_count;
dev->cur++;
}
}
if (depth==8) {
while (dev->cur < dev->deseg.pixel_groups && count < size) {
for (n=0;n<dev->segnb;n++) {
for (unsigned n = 0; n < dev->deseg.segment_count; n++) {
work_buffer_dst[count+n] = dev->oe_buffer.get_read_pos()[dev->cur + dev->deseg.skip_bytes + dev->deseg.conseq_pixel_dist_bytes *dev->segment_order[n]];
}
/* update counter and pointer */
count += dev->segnb;
count += dev->deseg.segment_count;
dev->cur++;
}
}
if (depth==16) {
while (dev->cur < dev->deseg.pixel_groups && count < size) {
for (n=0;n<dev->segnb;n++) {
for (unsigned n = 0; n < dev->deseg.segment_count; n++) {
work_buffer_dst[count+n*2] = dev->oe_buffer.get_read_pos()[dev->cur + dev->deseg.skip_bytes + 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->deseg.skip_bytes + dev->deseg.conseq_pixel_dist_bytes * dev->segment_order[n] + 1];
}
/* update counter and pointer */
count += dev->segnb*2;
count += dev->deseg.segment_count * 2;
dev->cur+=2;
}
}
@ -3591,8 +3591,7 @@ static void genesys_fill_read_buffer(Genesys_Device* dev)
// line interpolation
genesys_fill_line_interp_buffer(dev, work_buffer_dst, size);
}
else if (dev->segnb>1)
{
else if (dev->deseg.segment_count > 1) {
// multi-segment sensors processing
genesys_fill_segmented_buffer(dev, work_buffer_dst, size);
}
@ -5528,7 +5527,7 @@ sane_open_impl(SANE_String_Const devicename, SANE_Handle * handle)
s->dev->force_calibration = 0;
s->dev->line_interp = 0;
s->dev->line_count = 0;
s->dev->segnb = 0;
s->dev->deseg.segment_count = 0;
s->dev->binary=NULL;
*handle = s;

Wyświetl plik

@ -195,6 +195,9 @@ struct Genesys_Model
// Describes the geometry of the raw data coming out of the scanner for desegmentation.
struct DesegmentationState
{
// The number of segments in the sensor
unsigned segment_count = 0;
// The number of bytes to skip at start of line. Currently it's always zero.
unsigned skip_bytes = 0;
@ -331,8 +334,6 @@ struct Genesys_Device
SANE_Int ld_shift_g = 0;
// used blue line-distance shift
SANE_Int ld_shift_b = 0;
// number of segments composing the sensor
int segnb = 0;
// number of lines used in line interpolation
int line_interp = 0;
// number of scan lines used during scan

Wyświetl plik

@ -829,7 +829,7 @@ static void gl124_init_optical_regs_scan(Genesys_Device* dev, const Genesys_Sens
DBG_HELPER_ARGS(dbg, "exposure_time=%d, start=%d\n",
exposure_time, start);
unsigned int segcnt;
unsigned int startx, endx, segnb;
unsigned int startx, endx;
unsigned int dpihw, factor;
GenesysRegister *r;
uint32_t expmax;
@ -978,17 +978,16 @@ static void gl124_init_optical_regs_scan(Genesys_Device* dev, const Genesys_Sens
/* segment number */
r = sanei_genesys_get_address (reg, 0x98);
segnb = r->value & 0x0f;
unsigned segment_count = r->value & 0x0f;
reg->set24(REG_STRPIXEL, startx / segnb);
DBG (DBG_io2, "%s: strpixel used=%d\n", __func__, startx/segnb);
reg->set24(REG_STRPIXEL, startx / segment_count);
DBG (DBG_io2, "%s: strpixel used=%d\n", __func__, startx / segment_count);
segcnt = reg->get24(REG_SEGCNT);
if(endx/segnb==segcnt)
{
if(endx / segment_count == segcnt) {
endx=0;
}
reg->set24(REG_ENDPIXEL, endx / segnb);
DBG (DBG_io2, "%s: endpixel used=%d\n", __func__, endx/segnb);
reg->set24(REG_ENDPIXEL, endx / segment_count);
DBG (DBG_io2, "%s: endpixel used=%d\n", __func__, endx / segment_count);
// words(16bit) before gamma, conversion to 8 bit or lineart
dev->deseg.raw_channel_bytes =
@ -997,9 +996,9 @@ static void gl124_init_optical_regs_scan(Genesys_Device* dev, const Genesys_Sens
dev->cur = 0;
dev->deseg.skip_bytes = 0;
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->deseg.pixel_groups = dev->deseg.raw_channel_bytes / segment_count;
dev->deseg.conseq_pixel_dist_bytes = dev->deseg.raw_channel_bytes / segment_count;
dev->deseg.segment_count = segment_count;
dev->line_count = 0;
dev->line_interp = 0;
@ -1210,7 +1209,7 @@ gl124_calculate_current_setup (Genesys_Device * dev, const Genesys_Sensor& senso
const SensorProfile& sensor_profile = get_sensor_profile(sensor, dpihw,
session.ccd_size_divisor);
dev->segnb = sensor_profile.custom_regs.get_value(0x98) & 0x0f;
dev->deseg.segment_count = sensor_profile.custom_regs.get_value(0x98) & 0x0f;
dev->session = session;
dev->current_setup.pixels = session.output_pixels;
@ -1943,7 +1942,9 @@ static void gl124_send_shading_data(Genesys_Device* dev, const Genesys_Sensor& s
channels = dev->session.params.channels;
if(dev->binary!=NULL)
{
fprintf(dev->binary,"P5\n%d %d\n%d\n",(endpixel-strpixel)/factor*channels*dev->segnb,lines/channels,255);
std::fprintf(dev->binary,"P5\n%d %d\n%d\n",
(endpixel - strpixel) / factor * channels * dev->deseg.segment_count,
lines / channels, 255);
}
}
@ -1954,7 +1955,7 @@ static void gl124_send_shading_data(Genesys_Device* dev, const Genesys_Sensor& s
pixels=endpixel-strpixel;
DBG( DBG_io2, "%s: using chunks of %d bytes (%d shading data pixels)\n",__func__,length, length/4);
std::vector<uint8_t> buffer(pixels * dev->segnb, 0);
std::vector<uint8_t> buffer(pixels * dev->deseg.segment_count, 0);
/* write actual red data */
for(i=0;i<3;i++)
@ -1970,8 +1971,7 @@ static void gl124_send_shading_data(Genesys_Device* dev, const Genesys_Sensor& s
src=data+x+strpixel+i*length;
/* iterate over all the segments */
switch(dev->segnb)
{
switch (dev->deseg.segment_count) {
case 1:
ptr[0+pixels*0]=src[0+segcnt*0];
ptr[1+pixels*0]=src[1+segcnt*0];
@ -2013,7 +2013,7 @@ static void gl124_send_shading_data(Genesys_Device* dev, const Genesys_Sensor& s
}
uint8_t val = dev->read_register(0xd0+i);
addr = val * 8192 + 0x10000000;
sanei_genesys_write_ahb(dev, addr, pixels*dev->segnb, buffer.data());
sanei_genesys_write_ahb(dev, addr, pixels * dev->deseg.segment_count, buffer.data());
}
}

Wyświetl plik

@ -726,7 +726,7 @@ static void gl846_init_optical_regs_scan(Genesys_Device* dev, const Genesys_Sens
{
DBG_HELPER_ARGS(dbg, "exposure_time=%d, start=%d", exposure_time, start);
unsigned int words_per_line;
unsigned int dpihw, segnb, factor;
unsigned int dpihw, factor;
GenesysRegister *r;
// resolution is divided according to ccd_pixels_per_system_pixel()
@ -749,30 +749,26 @@ static void gl846_init_optical_regs_scan(Genesys_Device* dev, const Genesys_Sens
/* sensors are built from 600 dpi segments for LiDE 100/200
* and 1200 dpi for the 700F */
if (dev->model->flags & GENESYS_FLAG_SIS_SENSOR)
{
segnb=dpihw/600;
}
else
{
segnb=1;
unsigned segment_count = 1;
if (dev->model->flags & GENESYS_FLAG_SIS_SENSOR) {
segment_count = dpihw / 600;
}
// compute pixel coordinate in the given dpihw space, taking segments into account
startx /= factor*segnb;
endx /= factor*segnb;
startx /= factor * segment_count;
endx /= factor * segment_count;
dev->deseg.pixel_groups = endx - startx;
dev->deseg.conseq_pixel_dist_bytes = 0;
dev->deseg.skip_bytes = 0;
/* in cas of multi-segments sensor, we have to add the witdh
* of the sensor crossed by the scan area */
if (dev->model->flags & GENESYS_FLAG_SIS_SENSOR && segnb > 1) {
if (dev->model->flags & GENESYS_FLAG_SIS_SENSOR && segment_count > 1) {
dev->deseg.conseq_pixel_dist_bytes = sensor_profile.segment_size;
}
/* use a segcnt rounded to next even number */
endx += ((dev->deseg.conseq_pixel_dist_bytes + 1) & 0xfffe) * (segnb - 1);
endx += ((dev->deseg.conseq_pixel_dist_bytes + 1) & 0xfffe) * (segment_count - 1);
unsigned used_pixels = endx - startx;
gl846_set_fe(dev, sensor, AFE_SET);
@ -876,7 +872,7 @@ static void gl846_init_optical_regs_scan(Genesys_Device* dev, const Genesys_Sens
dev->deseg.conseq_pixel_dist_bytes = multiply_by_depth_ceil(dev->deseg.conseq_pixel_dist_bytes, session.params.depth);
dev->cur=0;
dev->segnb=segnb;
dev->deseg.segment_count = segment_count;
dev->line_interp = 0;
unsigned dpiset = session.params.xres * ccd_pixels_per_system_pixel;
@ -894,7 +890,7 @@ static void gl846_init_optical_regs_scan(Genesys_Device* dev, const Genesys_Sens
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->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);
DBG (DBG_io2, "%s: dev->segnb =%lu\n", __func__, (unsigned long) dev->deseg.segment_count);
dev->deseg.raw_line_bytes = dev->deseg.raw_channel_bytes * session.params.channels;

Wyświetl plik

@ -744,7 +744,7 @@ static void gl847_init_optical_regs_scan(Genesys_Device* dev, const Genesys_Sens
const ScanSession& session, unsigned int start)
{
DBG_HELPER_ARGS(dbg, "exposure_time=%d, start=%d", exposure_time, start);
unsigned dpiset, dpihw, segnb, factor;
unsigned dpiset, dpihw, factor;
GenesysRegister *r;
// resolution is divided according to ccd_pixels_per_system_pixel()
@ -768,30 +768,26 @@ static void gl847_init_optical_regs_scan(Genesys_Device* dev, const Genesys_Sens
/* sensors are built from 600 dpi segments for LiDE 100/200
* and 1200 dpi for the 700F */
if (dev->model->flags & GENESYS_FLAG_SIS_SENSOR)
{
segnb=dpihw/600;
}
else
{
segnb=1;
unsigned segment_count = 1;
if (dev->model->flags & GENESYS_FLAG_SIS_SENSOR) {
segment_count = dpihw/600;
}
// compute pixel coordinate in the given dpihw space, taking segments into account
startx /= factor*segnb;
endx /= factor*segnb;
startx /= factor * segment_count;
endx /= factor * segment_count;
dev->deseg.pixel_groups = endx-startx;
dev->deseg.conseq_pixel_dist_bytes = 0;
dev->deseg.skip_bytes = 0;
/* in cas of multi-segments sensor, we have to add the witdh
* of the sensor crossed by the scan area */
if (dev->model->flags & GENESYS_FLAG_SIS_SENSOR && segnb > 1) {
if (dev->model->flags & GENESYS_FLAG_SIS_SENSOR && segment_count > 1) {
dev->deseg.conseq_pixel_dist_bytes = sensor_profile.segment_size;
}
/* use a segcnt rounded to next even number */
endx += ((dev->deseg.conseq_pixel_dist_bytes + 1) & 0xfffe) * (segnb - 1);
endx += ((dev->deseg.conseq_pixel_dist_bytes + 1) & 0xfffe) * (segment_count - 1);
unsigned used_pixels = endx - startx;
gl847_set_fe(dev, sensor, AFE_SET);
@ -895,7 +891,7 @@ static void gl847_init_optical_regs_scan(Genesys_Device* dev, const Genesys_Sens
dev->deseg.conseq_pixel_dist_bytes = multiply_by_depth_ceil(dev->deseg.conseq_pixel_dist_bytes, session.params.depth);
dev->cur=0;
dev->segnb=segnb;
dev->deseg.segment_count = segment_count;
dev->line_interp = 0;
reg->set16(REG_DPISET,dpiset);
@ -912,7 +908,7 @@ static void gl847_init_optical_regs_scan(Genesys_Device* dev, const Genesys_Sens
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->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);
DBG (DBG_io2, "%s: dev->segnb =%lu\n", __func__, (unsigned long) dev->deseg.segment_count);
dev->deseg.raw_line_bytes = dev->deseg.raw_channel_bytes * session.params.channels;