From 0c5da94b172ac90bfde6db226cfe727b5a4fef8c Mon Sep 17 00:00:00 2001 From: Rene Rebe Date: Mon, 5 Dec 2005 23:27:22 +0000 Subject: [PATCH] fixed more typos in comments and debug output, removed obsolete options from the parser, example avision.conf and manual page. Fixed 12 Bit gray and color modes to actually work as well as software CCD line-difference correction. Minimal scan resolutions have been slightly adapted for some ASICs. --- ChangeLog | 10 ++++ backend/avision.c | 108 ++++++++++++++++--------------------------- backend/avision.conf | 5 +- doc/sane-avision.man | 14 ------ 4 files changed, 52 insertions(+), 85 deletions(-) diff --git a/ChangeLog b/ChangeLog index dc3eab60b..ae0f9e9f3 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ + +2005-12-05 Rene Rebe + + * backend/avision.c backend/avision.conf doc/sane-avision.man: + fixed more typos in comments and debug output, removed obsolete + options from the parser, example avision.conf and manual page. + Fixed 12 Bit gray and color modes to actually work as well as + software CCD line-difference correction. Minimal scan resolutions + have been slightly adapted for some ASICs. + 2005-12-05 Pierre Willenbrock * backend/genesys.c: removed usage of current_setup in functions diff --git a/backend/avision.c b/backend/avision.c index f7abdf3b9..6be48db99 100644 --- a/backend/avision.c +++ b/backend/avision.c @@ -93,6 +93,9 @@ the Avision backend would not be in the shape it is today! ;-) ChangeLog: + 2005-12-05: René Rebe + * fixed 12bit mode support - data is not packed + 2005-12-02: René Rebe * finally made the AV600U and most probably also the HP5370 aquire unshifted images inspired by Falk Rohsiepe's observations @@ -764,7 +767,7 @@ #include #define BACKEND_NAME avision -#define BACKEND_BUILD 179 /* avision backend BUILD version */ +#define BACKEND_BUILD 182 /* avision backend BUILD version */ #include #include @@ -1484,9 +1487,6 @@ static SANE_Bool disable_gamma_table = SANE_FALSE; /* disable the calibration */ static SANE_Bool disable_calibration = SANE_FALSE; -/* do only one claibration per backend initialization */ -static SANE_Bool one_calib_only = SANE_FALSE; - /* force scanable areas to ISO(DIN) A4/A3 */ static SANE_Bool force_a4 = SANE_FALSE; static SANE_Bool force_a3 = SANE_FALSE; @@ -1756,7 +1756,7 @@ static void debug_print_window_descriptor (int dbg_level, char* func, window->avision.type.normal.bitset3); DBG (dbg_level, "%s: [58] auto focus: %d\n", func, window->avision.type.normal.auto_focus); - DBG (dbg_level, "%s: [59] line-widht (MSB): %d\n", + DBG (dbg_level, "%s: [59] line-width (MSB): %d\n", func, window->avision.type.normal.line_width_msb); DBG (dbg_level, "%s: [60] line-count (MSB): %d\n", func, window->avision.type.normal.line_count_msb); @@ -2144,8 +2144,8 @@ write_usb_cmd: DBG (8, "wrote %lu bytes\n", (u_long) count); if (status != SANE_STATUS_GOOD || count != cmd_size) { - DBG (3, "=== Got error %d trying to write, wrote: %d. ===\n", - status, count); + DBG (3, "=== Got error %d trying to write, wrote: %ld. ===\n", + status, (long)count); if (status != SANE_STATUS_GOOD) /* == SANE_STATUS_EOF) */ { DBG (3, "try to read status to clear the FIFO\n"); @@ -2444,21 +2444,15 @@ get_pixel_boundary (Avision_Scanner* s) switch (s->c_mode) { case AV_TRUECOLOR: + case AV_TRUECOLOR12: case AV_TRUECOLOR16: boundary = dev->inquiry_color_boundary; break; - case AV_TRUECOLOR12: - boundary = dev->inquiry_color_boundary; - boundary += 6 - boundary % 6; - break; case AV_GRAYSCALE: + case AV_GRAYSCALE12: case AV_GRAYSCALE16: boundary = dev->inquiry_gray_boundary; break; - case AV_GRAYSCALE12: - boundary = dev->inquiry_gray_boundary; - boundary += 3 - boundary % 3; - break; case AV_DITHERED: if (dev->inquiry_asic_type != AV_ASIC_C5) boundary = 32; @@ -2506,19 +2500,17 @@ compute_parameters (Avision_Scanner* s) boundary = boundary > 32 ? boundary : 32; break; case AV_GRAYSCALE: + case AV_GRAYSCALE12: case AV_GRAYSCALE16: boundary = boundary > 4 ? boundary : 4; break; - case AV_GRAYSCALE12: - boundary = boundary > 6 ? boundary : 6; break; case AV_TRUECOLOR: + case AV_TRUECOLOR12: case AV_TRUECOLOR16: /* 12 bytes for 24bit color - 48bit is untested w/ Office */ boundary = boundary > 4 ? boundary : 4; break; - case AV_TRUECOLOR12: - boundary = boundary > 6 ? boundary : 6; break; } #endif @@ -2555,17 +2547,12 @@ compute_parameters (Avision_Scanner* s) DBG (1, "sane_compute_parameters: Line difference ignored due to device-list!!\n"); } else { - /* R² TODO: I made a mistake some months ago. line_difference should - be difference per color, unfortunately I'm out of time to review - all occurances of line_difference. At some point in the future - however this should be corrected thruout the backend ... */ - s->avdimen.line_difference = (dev->inquiry_line_difference * s->avdimen.yres) / dev->inquiry_max_res; } - s->avdimen.bry += 3 * s->avdimen.line_difference; - + s->avdimen.bry += 2 * s->avdimen.line_difference; + /* limit bry + line_difference to real scan boundary */ { long y_max = dev->inquiry_y_ranges[s->source_mode_dim] * @@ -2573,9 +2560,9 @@ compute_parameters (Avision_Scanner* s) DBG (3, "sane_compute_parameters: y_max: %ld, bry: %ld, line_difference: %d\n", y_max, s->avdimen.bry, s->avdimen.line_difference); - if (s->avdimen.bry + 3* s->avdimen.line_difference > y_max) { + if (s->avdimen.bry + 2 * s->avdimen.line_difference > y_max) { DBG (1, "sane_compute_parameters: bry limitted!\n"); - s->avdimen.bry = y_max - 3 * s->avdimen.line_difference; + s->avdimen.bry = y_max - 2 * s->avdimen.line_difference; } } @@ -2589,7 +2576,8 @@ compute_parameters (Avision_Scanner* s) s->params.pixels_per_line = (s->avdimen.brx - s->avdimen.tlx); s->params.pixels_per_line -= s->params.pixels_per_line % boundary; - s->params.lines = s->avdimen.bry - s->avdimen.tly - 3 * s->avdimen.line_difference; + s->params.lines = s->avdimen.bry - s->avdimen.tly - + 2 * s->avdimen.line_difference; if (s->avdimen.interlaced_duplex) s->params.lines -= s->params.lines % 8; @@ -3011,7 +2999,7 @@ get_button_status (Avision_Scanner* s) DBG (5, "==> (interrupt read) going down ...\n"); status = sanei_usb_read_int (s->av_con.usb_dn, (u_int8_t*)&result, &size); - DBG (5, "==> (interrupt read) got: %d\n", size); + DBG (5, "==> (interrupt read) got: %ld\n", (long)size); if (status != SANE_STATUS_GOOD) { DBG (1, "get_button_status: interrupt read failed (%s)\n", @@ -3564,7 +3552,7 @@ get_double ( &(result[48] ) )); BIT(result[62],3)?" Film scanner":"", BIT(result[62],2)?" Duplex":""); - DBG (3, "attach: [75-75] Max shading target : %x\n", + DBG (3, "attach: [75-76] Max shading target : %x\n", get_double ( &(result[75]) )); DBG (3, "attach: [77-78] Max X of transparency: %d dots * base_dpi\n", @@ -4031,7 +4019,8 @@ get_calib_data (Avision_Scanner* s, u_int8_t data_type, set_triple (rcmd.transferlen, get_size); - DBG (3, "get_calib_data: Reading %d bytes calibration data\n", get_size); + DBG (3, "get_calib_data: Reading %ld bytes calibration data\n", + (long)get_size); status = avision_cmd (&s->av_con, &rcmd, sizeof (rcmd), 0, 0, calib_ptr, &get_size); @@ -4041,7 +4030,7 @@ get_calib_data (Avision_Scanner* s, u_int8_t data_type, return status; } - DBG (3, "get_calib_data: Got %d bytes calibration data\n", get_size); + DBG (3, "get_calib_data: Got %ld bytes calibration data\n", (long)get_size); data_size -= get_size; calib_ptr += get_size; @@ -5022,10 +5011,10 @@ set_window (Avision_Scanner* s) set_quad (cmd.window.descriptor.width, s->params.pixels_per_line * base_dpi_rel / s->avdimen.xres + 1); set_quad (cmd.window.descriptor.length, - (s->params.lines + s->avdimen.line_difference) * base_dpi_rel / + (s->params.lines + 2 * s->avdimen.line_difference) * base_dpi_rel / s->avdimen.yres + 1); - line_count = s->params.lines + 3 * s->avdimen.line_difference; + line_count = s->params.lines + 2 * s->avdimen.line_difference; /* interlaced duplex scans are twice as long */ if (s->avdimen.interlaced_duplex) { @@ -5033,19 +5022,7 @@ set_window (Avision_Scanner* s) line_count *= 2; } - /* we always pass 16bit data thru the API - thus we need to translate - the 12 bit per channel modes */ - switch (s->c_mode) - { - case AV_GRAYSCALE12: - bytes_per_line = s->params.bytes_per_line * 12 / 16; - break; - case AV_TRUECOLOR12: - bytes_per_line = s->params.bytes_per_line * 36 / 48; - break; - default: - bytes_per_line = s->params.bytes_per_line; - } + bytes_per_line = s->params.bytes_per_line; set_double (cmd.window.avision.line_width, bytes_per_line); set_double (cmd.window.avision.line_count, line_count); @@ -5392,12 +5369,15 @@ init_options (Avision_Scanner* s) dev->y_range.quant = 0; switch (dev->inquiry_asic_type) { + case AV_ASIC_C2: + dev->dpi_range.min = 100; + break; case AV_ASIC_C5: dev->dpi_range.min = 80; break; - /*case AV_ASIC_C6: - dev->dpi_range.min = 75; - break; */ + case AV_ASIC_C6: /* TODO: AV610 in ADF mode does not scan less */ + dev->dpi_range.min = 175; + break; default: dev->dpi_range.min = 50; } @@ -5824,8 +5804,6 @@ reader_process (void *data) switch (s->c_mode) { case AV_GRAYSCALE12: - pixels_per_line = pixels_per_line * 12 / 16; - break; case AV_GRAYSCALE16: pixels_per_line /= 2; break; @@ -5833,8 +5811,6 @@ reader_process (void *data) pixels_per_line /= 3; break; case AV_TRUECOLOR12: - pixels_per_line = pixels_per_line * 36 / 48; - break; case AV_TRUECOLOR16: pixels_per_line /= 6; break; @@ -5847,7 +5823,7 @@ reader_process (void *data) pleasuant preview */ if (!deinterlace) { - lines_per_stripe = s->avdimen.line_difference * 2; + lines_per_stripe = s->avdimen.line_difference * 3 * 2; } else { /* In theory the SPEC has a command to request the value from the scanner. @@ -5891,7 +5867,8 @@ reader_process (void *data) s->line = 0; /* calculate params for the simple reader */ - total_size = bytes_per_line * (s->params.lines + s->avdimen.line_difference); + total_size = bytes_per_line * (s->params.lines + + 2 * s->avdimen.line_difference); if (deinterlace && !s->duplex_rear_valid) total_size *= 2; DBG (3, "reader_process: total_size: %lu\n", (u_long) total_size); @@ -5983,7 +5960,7 @@ reader_process (void *data) useful_bytes = stripe_fill; if (s->c_mode == AV_TRUECOLOR || s->c_mode == AV_TRUECOLOR16) - useful_bytes -= s->avdimen.line_difference * bytes_per_line; + useful_bytes -= 2 * s->avdimen.line_difference * bytes_per_line; DBG (3, "reader_process: useful_bytes %i\n", useful_bytes); @@ -6025,7 +6002,7 @@ reader_process (void *data) { /* TODO: add 16bit per sample code? */ int i; - int c_offset = (s->avdimen.line_difference / 3) * bytes_per_line; + int c_offset = s->avdimen.line_difference * bytes_per_line; u_int8_t* r_ptr = stripe_data; u_int8_t* g_ptr = stripe_data + c_offset + 1; @@ -6344,11 +6321,6 @@ sane_init (SANE_Int* version_code, SANE_Auth_Callback authorize) linenumber); disable_calibration = SANE_TRUE; } - else if (strcmp (word, "one-calib-only") == 0) { - DBG (3, "sane_init: config file line %d: one-calib-only\n", - linenumber); - one_calib_only = SANE_TRUE; - } else if (strcmp (word, "force-a4") == 0) { DBG (3, "sane_init: config file line %d: enabling force-a4\n", linenumber); @@ -6447,7 +6419,9 @@ sane_exit (void) for (dev = first_dev; dev; dev = next) { next = dev->next; - free ((void*) (int)dev->sane.name); + /* no warning for stripping const - C lacks a const_cast<> */ + free ((void*)(size_t) dev->sane.name); + free (dev); } first_dev = NULL; @@ -7076,8 +7050,8 @@ sane_start (SANE_Handle handle) calib_end: - if (dev->inquiry_3x3_matrix && param_cksum != s->param_cksum && - !(dev->hw->feature_type & AV_NO_MATRIX) ) { + if (dev->inquiry_3x3_matrix && dev->inquiry_asic_type >= AV_ASIC_C5 && + param_cksum != s->param_cksum && !(dev->hw->feature_type & AV_NO_MATRIX) ) { status = send_3x3_matrix (s); if (status != SANE_STATUS_GOOD) { return status; diff --git a/backend/avision.conf b/backend/avision.conf index bb8fe37a6..d54ea2584 100644 --- a/backend/avision.conf +++ b/backend/avision.conf @@ -3,14 +3,11 @@ # should work just fine without them - and they are only # needed for test and debugging. So if you experience problems # and you solve them with enabling options here, please notify -# the SANE/Avision maintainer. +# the SANE/Avision maintainer: Rene Rebe #option disable-gamma-table #option disable-calibration -#option old-calibration -#option one-calib-only #option force-a4 -#option disable-c5-guard scsi AVISION scsi FCPA diff --git a/doc/sane-avision.man b/doc/sane-avision.man index c46a5fc26..6130644ec 100644 --- a/doc/sane-avision.man +++ b/doc/sane-avision.man @@ -38,8 +38,6 @@ a hash mark (#) are ignored. A sample configuration file is shown below: option force-a3 option disable-gamma-table option disable-calibration - option one-calib-only - option old-calibration \ #scsi Vendor Model Type Bus Channel ID LUN scsi AVISION @@ -73,18 +71,6 @@ Disables the scanner's color calibration. You might try this if your scans hang or only produces random garbage. .TP -one-calib-only: -When this option is enabled, the backend will only -perform a calibration when the backend is initialized -and not before each scan. This might extend the life -of the CCD, but does not work reliable with the newer -USB scanners (they hang sometimes or return garbage -image data). So this option should be used with care. -.TP -old-calibration: -This enables the use of the old calibration code for -testing purposes. -.TP Note: Any option above modifies the default code-flow for your scanner. The options should only be used