Merge branch 'fix-escl-resolution-with-jpeg' into 'master'

Fix scan all resolution with JPEG.

See merge request sane-project/backends!617
merge-requests/619/head
Ordissimo 2021-03-31 16:12:51 +00:00
commit eb702d33c4
2 zmienionych plików z 30 dodań i 22 usunięć

Wyświetl plik

@ -1381,6 +1381,7 @@ sane_control_option(SANE_Handle h, SANE_Int n, SANE_Action a, void *v, SANE_Int
break; break;
case OPT_RESOLUTION: case OPT_RESOLUTION:
handler->val[n].w = _get_resolution(handler, (int)(*(SANE_Word *) v)); handler->val[n].w = _get_resolution(handler, (int)(*(SANE_Word *) v));
handler->scanner->caps[handler->scanner->source].default_resolution = handler->val[n].w;
if (i) if (i)
*i |= SANE_INFO_RELOAD_PARAMS | SANE_INFO_RELOAD_OPTIONS | SANE_INFO_INEXACT; *i |= SANE_INFO_RELOAD_PARAMS | SANE_INFO_RELOAD_OPTIONS | SANE_INFO_INEXACT;
break; break;

Wyświetl plik

@ -192,34 +192,41 @@ get_JPEG_data(capabilities_t *scanner, int *width, int *height, int *bps)
cinfo.out_color_space = JCS_RGB; cinfo.out_color_space = JCS_RGB;
cinfo.quantize_colors = FALSE; cinfo.quantize_colors = FALSE;
jpeg_calc_output_dimensions(&cinfo); jpeg_calc_output_dimensions(&cinfo);
if (cinfo.output_width < (unsigned int)scanner->caps[scanner->source].width) double ratio = (double)cinfo.output_width / (double)scanner->caps[scanner->source].width;
scanner->caps[scanner->source].width = cinfo.output_width; int rw = (int)((double)scanner->caps[scanner->source].width * ratio);
if (scanner->caps[scanner->source].pos_x < 0) int rh = (int)((double)scanner->caps[scanner->source].height * ratio);
scanner->caps[scanner->source].pos_x = 0; int rx = (int)((double)scanner->caps[scanner->source].pos_x * ratio);
int ry = (int)((double)scanner->caps[scanner->source].pos_y * ratio);
if (cinfo.output_height < (unsigned int)scanner->caps[scanner->source].height)
scanner->caps[scanner->source].height = cinfo.output_height; if (cinfo.output_width < (unsigned int)rw)
if (scanner->caps[scanner->source].pos_y < 0) rw = cinfo.output_width;
scanner->caps[scanner->source].pos_y = 0; if (rx < 0)
rx = 0;
if (cinfo.output_height < (unsigned int)rh)
rh = cinfo.output_height;
if (ry < 0)
ry = 0;
DBG(10, "1-JPEF Geometry [%dx%d|%dx%d]\n", DBG(10, "1-JPEF Geometry [%dx%d|%dx%d]\n",
scanner->caps[scanner->source].pos_x, rx,
scanner->caps[scanner->source].pos_y, ry,
scanner->caps[scanner->source].width, rw,
scanner->caps[scanner->source].height); rh);
x_off = scanner->caps[scanner->source].pos_x; x_off = rx;
if (x_off > (unsigned int)scanner->caps[scanner->source].width) { if (x_off > (unsigned int)rw) {
w = scanner->caps[scanner->source].width; w = rw;
x_off = 0; x_off = 0;
} }
else else
w = scanner->caps[scanner->source].width - x_off; w = rw - x_off;
y_off = scanner->caps[scanner->source].pos_y; y_off = ry;
if(y_off > (unsigned int)scanner->caps[scanner->source].height) { if(y_off > (unsigned int)rh) {
h = scanner->caps[scanner->source].height; h = rh;
y_off = 0; y_off = 0;
} }
else else
h = scanner->caps[scanner->source].height - y_off; h = rh - y_off;
DBG(10, "2-JPEF Geometry [%dx%d|%dx%d]\n", DBG(10, "2-JPEF Geometry [%dx%d|%dx%d]\n",
x_off, x_off,
y_off, y_off,
@ -242,7 +249,7 @@ get_JPEG_data(capabilities_t *scanner, int *width, int *height, int *bps)
if (y_off > 0) if (y_off > 0)
jpeg_skip_scanlines(&cinfo, y_off); jpeg_skip_scanlines(&cinfo, y_off);
pos = 0; pos = 0;
while (cinfo.output_scanline < (unsigned int)scanner->caps[scanner->source].height) { while (cinfo.output_scanline < (unsigned int)rh) {
rowptr[0] = (JSAMPROW)surface + (lineSize * pos); // ..cinfo.output_scanline); rowptr[0] = (JSAMPROW)surface + (lineSize * pos); // ..cinfo.output_scanline);
jpeg_read_scanlines(&cinfo, rowptr, (JDIMENSION) 1); jpeg_read_scanlines(&cinfo, rowptr, (JDIMENSION) 1);
pos++; pos++;
@ -253,7 +260,7 @@ get_JPEG_data(capabilities_t *scanner, int *width, int *height, int *bps)
*width = w; *width = w;
*height = h; *height = h;
*bps = cinfo.output_components; *bps = cinfo.output_components;
jpeg_finish_decompress(&cinfo); // jpeg_finish_decompress(&cinfo);
jpeg_destroy_decompress(&cinfo); jpeg_destroy_decompress(&cinfo);
fclose(scanner->tmp); fclose(scanner->tmp);
scanner->tmp = NULL; scanner->tmp = NULL;