Fixed undefined behaviour problem and Scanmaker X12 problems. New version:

20020127. Code from karsten.festag@t-online.de (Karsten Festag).
Henning Meier-Geinitz <henning@meier-geinitz.de>
DEVEL_2_0_BRANCH-1
Henning Geinitz 2002-01-27 15:08:42 +00:00
rodzic 689d503113
commit 0f2b241654
2 zmienionych plików z 54 dodań i 40 usunięć

Wyświetl plik

@ -3827,49 +3827,54 @@ get_scan_parameters(Microtek2_Scanner *ms)
ms->bits_per_pixel_out);
/* calculate positions, width and height in dots */
/* check for impossible values */
/* ensure a minimum scan area of 10 x 10 pixels */
dpm = (double) mi->opt_resolution / MM_PER_INCH;
ms->x1_dots = (SANE_Int) ( SANE_UNFIX(ms->val[OPT_TL_X].w) * dpm + 0.5 );
if ( ms->x1_dots > ( mi->geo_width - 10 ) )
ms->x1_dots = ( mi->geo_width - 10 );
ms->y1_dots = (SANE_Int) ( SANE_UNFIX(ms->val[OPT_TL_Y].w) * dpm + 0.5 );
if ( ms->y1_dots > ( mi->geo_height - 10 ) )
ms->y1_dots = ( mi->geo_height - 10 );
x2_dots = (int) ( SANE_UNFIX(ms->val[OPT_BR_X].w) * dpm + 0.5 );
if ( x2_dots > mi->geo_width )
x2_dots = mi->geo_width;
y2_dots = (int) ( SANE_UNFIX(ms->val[OPT_BR_Y].w) * dpm + 0.5 );
ms->width_dots = abs(x2_dots - ms->x1_dots);
ms->height_dots = abs(y2_dots - ms->y1_dots);
/* ensure minimum and maximum scan area */
if ( ms->height_dots < 10 )
ms->height_dots = 10;
if ( ms->height_dots > mi->geo_height )
ms->height_dots = mi->geo_height;
if ( y2_dots > mi->geo_height )
y2_dots = mi->geo_height;
ms->width_dots = x2_dots - ms->x1_dots;
if ( ms->width_dots < 10 )
ms->width_dots = 10;
if ( ms->width_dots > mi->geo_width )
ms->width_dots = mi->geo_width;
ms->height_dots = y2_dots - ms->y1_dots;
if ( ms->height_dots < 10 )
ms->height_dots = 10;
/* (KF) take scanning direction into account */
/* take scanning direction into account */
if ((mi->direction & MI_DATSEQ_RTOL) == 1)
ms->x1_dots = mi->geo_width - ms->x1_dots - ms->width_dots;
if ( ms->val[OPT_RESOLUTION_BIND].w == SANE_TRUE )
{
ms->x_resolution_dpi =
ms->x_resolution_dpi =
(SANE_Int) (SANE_UNFIX(ms->val[OPT_RESOLUTION].w) + 0.5);
ms->y_resolution_dpi =
ms->y_resolution_dpi =
(SANE_Int) (SANE_UNFIX(ms->val[OPT_RESOLUTION].w) + 0.5);
}
else
{
ms->x_resolution_dpi =
ms->x_resolution_dpi =
(SANE_Int) (SANE_UNFIX(ms->val[OPT_X_RESOLUTION].w) + 0.5);
ms->y_resolution_dpi =
ms->y_resolution_dpi =
(SANE_Int) (SANE_UNFIX(ms->val[OPT_Y_RESOLUTION].w) + 0.5);
}
if ( ms->x_resolution_dpi < 10 )
ms->x_resolution_dpi = 10;
if ( ms->y_resolution_dpi < 10 )
if ( ms->x_resolution_dpi < 10 )
ms->x_resolution_dpi = 10;
if ( ms->y_resolution_dpi < 10 )
ms->y_resolution_dpi = 10;
DBG(30, "get_scan_parameters: yres=%d, x1=%d, width=%d, y1=%d, height=%d\n",
ms->y_resolution_dpi, ms->x1_dots, ms->width_dots,
ms->y_resolution_dpi, ms->x1_dots, ms->width_dots,
ms->y1_dots, ms->height_dots);
/* Preview mode */
@ -5201,16 +5206,19 @@ sane_start(SANE_Handle handle)
DBG(30, "sane_start: backend calibration off\n");
if ( ( ms->val[OPT_CALIB_BACKEND].w == SANE_TRUE )
&& ! ( md->model_flags & MD_PHANTOM336CX_TYPE_SHADING )
&& ( md->shading_table_w == NULL ) )
&& !( md->model_flags & MD_PHANTOM336CX_TYPE_SHADING ) )
{
status = get_scan_parameters(ms);
if ( status != SANE_STATUS_GOOD )
goto cleanup;
if ( ( md->shading_table_w == NULL )
|| !( md->model_flags & MD_READ_CONTROL_BIT ) )
{
status = get_scan_parameters(ms);
if ( status != SANE_STATUS_GOOD )
goto cleanup;
status = read_shading_image(ms);
if ( status != SANE_STATUS_GOOD )
goto cleanup;
status = read_shading_image(ms);
if ( status != SANE_STATUS_GOOD )
goto cleanup;
}
}
status = get_scan_parameters(ms);
@ -5230,7 +5238,7 @@ sane_start(SANE_Handle handle)
md->status.flamp |= MD_FLAMP_ON;
md->status.tlamp &= ~MD_TLAMP_ON;
}
else
else
{
md->status.flamp &= ~MD_FLAMP_ON;
md->status.tlamp |= MD_TLAMP_ON;
@ -5935,10 +5943,6 @@ read_shading_image(Microtek2_Scanner *ms)
if ( status != SANE_STATUS_GOOD )
return status;
status = scsi_wait_for_image(ms);
if ( status != SANE_STATUS_GOOD )
return status;
#ifdef TESTBACKEND
status = scsi_read_sh_image_info(ms);
#else
@ -5947,6 +5951,10 @@ read_shading_image(Microtek2_Scanner *ms)
if ( status != SANE_STATUS_GOOD )
return status;
status = scsi_wait_for_image(ms);
if ( status != SANE_STATUS_GOOD )
return status;
status = scsi_read_system_status(md, ms->sfd);
if ( status != SANE_STATUS_GOOD )
return status;
@ -6036,8 +6044,14 @@ read_shading_image(Microtek2_Scanner *ms)
DBG(30, "read_shading_image: reading white data\n");
/* According to the doc NCalib must be set for white shading data */
/* if we have a black and a white shading correction ?? */
md->status.ncalib |= MD_NCALIB_ON;
/* if we have a black and a white shading correction and must be */
/* cleared if we have only a white shading collection */
if ( ! MI_WHITE_SHADING_ONLY(mi->shtrnsferequ)
|| ( md->model_flags & MD_PHANTOM_C6 ) )
md->status.ncalib |= MD_NCALIB_ON;
else
md->status.ncalib &= ~MD_NCALIB_ON;
md->status.flamp |= MD_FLAMP_ON;
md->status.ntrack |= MD_NTRACK_ON;
@ -6057,10 +6071,6 @@ read_shading_image(Microtek2_Scanner *ms)
if ( status != SANE_STATUS_GOOD )
return status;
status = scsi_wait_for_image(ms);
if ( status != SANE_STATUS_GOOD )
return status;
#ifdef TESTBACKEND
status = scsi_read_sh_image_info(ms);
#else
@ -6069,6 +6079,10 @@ read_shading_image(Microtek2_Scanner *ms)
if ( status != SANE_STATUS_GOOD )
return status;
status = scsi_wait_for_image(ms);
if ( status != SANE_STATUS_GOOD )
return status;
status = scsi_read_system_status(md, ms->sfd);
if ( status != SANE_STATUS_GOOD )
return status;
@ -6144,7 +6158,7 @@ read_shading_image(Microtek2_Scanner *ms)
ms->rawdat = 0;
ms->stay = 0;
md->status.ncalib &= ~MD_NCALIB_ON;
md->status.ncalib |= MD_NCALIB_ON;
if ( md->model_flags & MD_PHANTOM_C6 )
{
@ -8051,7 +8065,7 @@ lineartfake_copy_pixels(Microtek2_Scanner *ms,
if ( (u_int8_t)grayval < threshold ) val = 1; else val = 0;
dest = ( dest << 1 ) | val;
bit = ++bit % 8;
bit = ( bit + 1 ) % 8;
if ( bit == 0 ) /* 8 input bytes processed */
{
fputc((char) dest, fp);

Wyświetl plik

@ -90,7 +90,7 @@
#define MICROTEK2_MAJOR 0
#define MICROTEK2_MINOR 95
#define MICROTEK2_BUILD "20020112"
#define MICROTEK2_BUILD "20020127"
#define MICROTEK2_CONFIG_FILE "microtek2.conf"