limit hardware lineart up to 600 dpi for gl847 scanners

- due to interleaving at bit level and uneven sub sensor length,
  hardware lineart is almost unworkable when resolution exceeds 600.
merge-requests/1/head
Stphane Voltz 2012-08-08 07:37:28 +02:00
rodzic d89087c6c6
commit fd47a2512c
2 zmienionych plików z 27 dodań i 13 usunięć

Wyświetl plik

@ -4544,7 +4544,7 @@ genesys_fill_segmented_buffer (Genesys_Device * dev, uint8_t *work_buffer_dst, s
{ {
work_buffer_dst[count+n] = 0; work_buffer_dst[count+n] = 0;
} }
/* interleaving is a bit level */ /* interleaving is at bit level */
for(i=0;i<8;i++) for(i=0;i<8;i++)
{ {
k=count+(i*dev->segnb)/8; k=count+(i*dev->segnb)/8;
@ -5289,6 +5289,7 @@ calc_parameters (Genesys_Scanner * s)
* or when xres is doubled to match yres */ * or when xres is doubled to match yres */
if (s->dev->settings.xres >= 1200 if (s->dev->settings.xres >= 1200
&& ( s->dev->model->asic_type == GENESYS_GL124 && ( s->dev->model->asic_type == GENESYS_GL124
|| s->dev->model->asic_type == GENESYS_GL847
|| s->dev->current_setup.xres < s->dev->current_setup.yres || s->dev->current_setup.xres < s->dev->current_setup.yres
) )
) )
@ -5359,11 +5360,22 @@ calc_parameters (Genesys_Scanner * s)
&&s->dev->settings.scan_mode == SCAN_MODE_LINEART) &&s->dev->settings.scan_mode == SCAN_MODE_LINEART)
{ {
s->dev->settings.dynamic_lineart = SANE_TRUE; s->dev->settings.dynamic_lineart = SANE_TRUE;
/* threshold curve for dynamic ratserization */
if(s->dev->settings.dynamic_lineart==SANE_TRUE)
s->dev->settings.threshold_curve=s->val[OPT_THRESHOLD_CURVE].w;
} }
/* hardware lineart works only when we don't have interleave data
* for GL847 scanners, ie up to 600 DPI, then we have to rely on
* dynamic_lineart */
if(s->dev->settings.xres > 600
&& s->dev->model->asic_type==GENESYS_GL847
&& s->dev->settings.scan_mode == SCAN_MODE_LINEART)
{
s->dev->settings.dynamic_lineart = SANE_TRUE;
}
/* threshold curve for dynamic rasterization */
s->dev->settings.threshold_curve=s->val[OPT_THRESHOLD_CURVE].w;
/* some digital processing requires the whole picture to be buffered */ /* some digital processing requires the whole picture to be buffered */
/* no digital processing takes place when doing preview, or when bit depth is /* no digital processing takes place when doing preview, or when bit depth is
* higher than 8 bits */ * higher than 8 bits */

Wyświetl plik

@ -1329,18 +1329,12 @@ gl847_init_optical_regs_scan (Genesys_Device * dev,
}*/ }*/
} }
sanei_genesys_set_double(reg,REG_DPISET,dpiset);
DBG (DBG_io2, "%s: dpiset used=%d\n", __FUNCTION__, dpiset);
sanei_genesys_set_double(reg,REG_STRPIXEL,startx);
sanei_genesys_set_double(reg,REG_ENDPIXEL,endx);
/* words(16bit) before gamma, conversion to 8 bit or lineart*/ /* words(16bit) before gamma, conversion to 8 bit or lineart*/
words_per_line = (used_pixels * dpiset) / dpihw; words_per_line = (used_pixels * dpiset) / dpihw;
bytes=depth/8; bytes=depth/8;
if (depth == 1) if (depth == 1)
{ {
words_per_line = (words_per_line >> 3) + ((words_per_line & 7) ? 1 : 0); words_per_line = (words_per_line+7)/8 ;
dev->len = (dev->len >> 3) + ((dev->len & 7) ? 1 : 0); dev->len = (dev->len >> 3) + ((dev->len & 7) ? 1 : 0);
dev->dist = (dev->dist >> 3) + ((dev->dist & 7) ? 1 : 0); dev->dist = (dev->dist >> 3) + ((dev->dist & 7) ? 1 : 0);
} }
@ -1356,6 +1350,14 @@ gl847_init_optical_regs_scan (Genesys_Device * dev,
dev->segnb=segnb; dev->segnb=segnb;
dev->line_interp = 0; dev->line_interp = 0;
sanei_genesys_set_double(reg,REG_DPISET,dpiset);
DBG (DBG_io2, "%s: dpiset used=%d\n", __FUNCTION__, dpiset);
sanei_genesys_set_double(reg,REG_STRPIXEL,startx);
sanei_genesys_set_double(reg,REG_ENDPIXEL,endx);
DBG (DBG_io2, "%s: startx=%d\n", __FUNCTION__, startx);
DBG (DBG_io2, "%s: endx =%d\n", __FUNCTION__, endx);
DBG (DBG_io2, "%s: used_pixels=%d\n", __FUNCTION__, used_pixels); DBG (DBG_io2, "%s: used_pixels=%d\n", __FUNCTION__, used_pixels);
DBG (DBG_io2, "%s: pixels =%d\n", __FUNCTION__, pixels); DBG (DBG_io2, "%s: pixels =%d\n", __FUNCTION__, pixels);
DBG (DBG_io2, "%s: depth =%d\n", __FUNCTION__, depth); DBG (DBG_io2, "%s: depth =%d\n", __FUNCTION__, depth);