diff options
Diffstat (limited to 'backend/fujitsu.c')
-rw-r--r-- | backend/fujitsu.c | 102 |
1 files changed, 46 insertions, 56 deletions
diff --git a/backend/fujitsu.c b/backend/fujitsu.c index d24975e..6c1c8f6 100644 --- a/backend/fujitsu.c +++ b/backend/fujitsu.c @@ -30,9 +30,7 @@ General Public License for more details. You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, - MA 02111-1307, USA. + along with this program. If not, see <https://www.gnu.org/licenses/>. As a special exception, the authors of SANE give permission for additional uses of the libraries contained in this release of SANE. @@ -172,11 +170,11 @@ - use sanei_scsi_open_extended() to set buffer size - fix some compiler warns: 32&64 bit gcc v26 2006-05-23, MAN - - dont send scanner control (F1) if unsupported + - don't send scanner control (F1) if unsupported v27 2006-05-30, MAN - speed up hexdump (adeuring A T gmx D O T net) - duplex request same size block from both sides - - dont #include or call sanei_thread + - don't #include or call sanei_thread - split usb/scsi command DBG into 25 and 30 v28 2006-06-01, MAN - sane_read() usleep if scanner is busy @@ -201,10 +199,10 @@ - add error msg if VPD missing or non-extended - remove references to color_lineart and ht units - rework init_model to support more known models - - dont send paper size data if using flatbed + - don't send paper size data if using flatbed v31 2006-06-13, MAN - add 5220C usb id - - dont show ink level buttons if no imprinter + - don't show ink level buttons if no imprinter - run ghs/rs every second instead of every other v32 2006-06-14, MAN - add 4220C2 usb id @@ -299,7 +297,7 @@ - proper async sane_cancel support - re-enable JPEG support - replace s->img_count with s->side - - sane_get_parameters(): dont round up larger than current paper size + - sane_get_parameters(): don't round up larger than current paper size - sane_start() rewritten, shorter, more clear - return values are SANE_Status, not int - hide unused functions @@ -386,7 +384,7 @@ - set SANE_CAP_INACTIVE on all disabled options - fix bug in mode_select page for sleep timer v78 2008-08-26, MAN - - recent model names (fi-6xxx) dont end in 'C' + - recent model names (fi-6xxx) don't end in 'C' - simplify flatbed area overrides - call scanner_control to change source during sane_start v79 2008-10-01, MAN @@ -423,7 +421,7 @@ - track frontend reading sensor/button values to reload - deactivate double feed options if df-action == default v88 2009-01-21, MAN - - dont export private symbols + - don't export private symbols v89 2009-02-20, MAN - fi-4750 returns random garbage to serial number queries v90 2009-02-23, MAN @@ -482,7 +480,7 @@ - cache software crop/deskew parameters for use on backside of duplex - fi-6110 does not support bgcolor or prepick v106 2011-01-30, MAN (SANE 1.0.22) - - dont call mode_select with a page code the scanner does not support + - don't call mode_select with a page code the scanner does not support v107 2011-11-03, MAN - M3091 does not support scanner_control(adf) - Correct buffer overflow in read_from_3091duplex() @@ -609,6 +607,10 @@ - add support for fi-800R - add support for card scanning slot (Return Path) - fix bug with reading hardware sensors on first invocation + v137 2020-09-23, MAN + - fix JPEG duplex memory corruption + - change window_gamma init (fixes bright/contrast for iX1500) + - only call send_lut after set_window (remove late_lut) SANE FLOW DIAGRAM @@ -658,7 +660,7 @@ #include "fujitsu.h" #define DEBUG 1 -#define BUILD 136 +#define BUILD 137 /* values for SANE_DEBUG_FUJITSU env var: - errors 5 @@ -1217,7 +1219,7 @@ init_inquire (struct fujitsu *s) s->color_raster_offset = get_IN_color_offset(in); DBG (15, " color offset: %d lines\n",s->color_raster_offset); - /* FIXME: we dont store all of these? */ + /* FIXME: we don't store all of these? */ DBG (15, " long gray scan: %d\n",get_IN_long_gray(in)); DBG (15, " long color scan: %d\n",get_IN_long_color(in)); @@ -1701,7 +1703,7 @@ init_vpd (struct fujitsu *s) s->has_comp_JPG3 = get_IN_compression_JPG_INDEP (in); DBG (15, " compression JPG3: %d\n", s->has_comp_JPG3); - /* FIXME: we dont store these? */ + /* FIXME: we don't store these? */ DBG (15, " back endorser mech: %d\n", get_IN_endorser_b_mech(in)); DBG (15, " back endorser stamp: %d\n", get_IN_endorser_b_stamp(in)); DBG (15, " back endorser elec: %d\n", get_IN_endorser_b_elec(in)); @@ -2105,11 +2107,9 @@ init_model (struct fujitsu *s) s->ppl_mod_by_mode[MODE_GRAYSCALE] = 1; s->ppl_mod_by_mode[MODE_COLOR] = 1; - /* if scanner has built-in gamma tables, we use the first one (0) */ - /* otherwise, we use the first downloaded one (0x80) */ - /* note that you may NOT need to send the table to use it, */ - /* the scanner will fall back to the brightness/contrast LUT */ - if (!s->num_internal_gamma && s->num_download_gamma){ + /* we prefer to use the downloaded (LUT) gamma table (0x80) if possible. + * but if scanner has only built-in gamma tables, we use the first one (0) */ + if (s->num_download_gamma){ s->window_gamma = 0x80; } @@ -2365,7 +2365,6 @@ init_model (struct fujitsu *s) /* weirdness */ s->need_q_table = 1; - s->late_lut = 1; s->need_diag_preread = 1; s->ppl_mod_by_mode[MODE_COLOR] = 2; s->hopper_before_op = 1; @@ -2378,7 +2377,7 @@ init_model (struct fujitsu *s) s->can_mode[MODE_LINEART] = 2; s->can_mode[MODE_GRAYSCALE] = 2; - /* dont bother with this one */ + /* don't bother with this one */ s->can_mode[MODE_HALFTONE] = 0; } @@ -2389,7 +2388,6 @@ init_model (struct fujitsu *s) /* weirdness */ s->need_q_table = 1; - s->late_lut = 1; s->need_diag_preread = 1; s->ppl_mod_by_mode[MODE_COLOR] = 2; s->hopper_before_op = 1; @@ -2398,7 +2396,7 @@ init_model (struct fujitsu *s) /* lies */ s->adbits = 8; - /* dont bother with this one */ + /* don't bother with this one */ s->can_mode[MODE_HALFTONE] = 0; } @@ -4202,7 +4200,7 @@ sane_get_option_descriptor (SANE_Handle handle, SANE_Int option) opt->unit = SANE_UNIT_NONE; opt->size = sizeof(SANE_Word); - /*old type cant do this?*/ + /*old type can't do this?*/ if ((s->has_endorser_f && s->endorser_type_f != ET_OLD) || (s->has_endorser_b && s->endorser_type_b != ET_OLD)){ opt->cap=SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT | SANE_CAP_ADVANCED; @@ -5336,7 +5334,7 @@ sane_control_option (SANE_Handle handle, SANE_Int option, DBG (20, "sane_control_option: set value for '%s' (%d)\n", s->opt[option].name,option); if ( s->started ) { - DBG (5, "sane_control_option: cant set, device busy\n"); + DBG (5, "sane_control_option: can't set, device busy\n"); return SANE_STATUS_DEVICE_BUSY; } @@ -5351,7 +5349,7 @@ sane_control_option (SANE_Handle handle, SANE_Int option, return status; } - /* may have been changed by constrain, so dont copy until now */ + /* may have been changed by constrain, so don't copy until now */ val_c = *(SANE_Word *)val; /* @@ -6429,7 +6427,7 @@ diag_preread (struct fujitsu *s) set_SD_preread_yres(out,s->resolution_y); /* call helper function, scanner wants lies about paper width */ set_SD_preread_paper_width(out, get_page_width(s)); - /* dont call helper function, scanner wants actual length? */ + /* don't call helper function, scanner wants actual length? */ set_SD_preread_paper_length(out, s->page_height); set_SD_preread_composition(out, s->s_mode); @@ -6789,7 +6787,7 @@ sane_get_parameters (SANE_Handle handle, SANE_Parameters * params) params->pixels_per_line = s->u_params.pixels_per_line; params->bytes_per_line = s->u_params.bytes_per_line; - /* we wont know the end until we get to it */ + /* we won't know the end until we get to it */ if(s->ald && !must_fully_buffer(s)){ DBG (15, "sane_get_parameters: hand-scanner mode\n"); params->lines = -1; @@ -6941,7 +6939,7 @@ update_u_params (struct fujitsu * s) * * this will be called between sides of a duplex scan, * and at the start of each page of an adf batch. - * hence, we spend alot of time playing with s->started, etc. + * hence, we spend a lot of time playing with s->started, etc. */ SANE_Status sane_start (SANE_Handle handle) @@ -7050,14 +7048,6 @@ sane_start (SANE_Handle handle) if (ret != SANE_STATUS_GOOD) DBG (5, "sane_start: WARNING: cannot send_endorser %d\n", ret); - /* send lut if scanner has no hardware brightness/contrast, - * or we are going to ask it to use a downloaded gamma table */ - if (!s->late_lut && (!s->brightness_steps || !s->contrast_steps || s->window_gamma & 0x80)){ - ret = send_lut(s); - if (ret != SANE_STATUS_GOOD) - DBG (5, "sane_start: WARNING: cannot early send_lut %d\n", ret); - } - /* set window command */ ret = set_window(s); if (ret != SANE_STATUS_GOOD) { @@ -7067,7 +7057,7 @@ sane_start (SANE_Handle handle) /* send lut if scanner has no hardware brightness/contrast, * or we are going to ask it to use a downloaded gamma table */ - if (s->late_lut && (!s->brightness_steps || !s->contrast_steps || s->window_gamma & 0x80)){ + if (!s->brightness_steps || !s->contrast_steps || s->window_gamma & 0x80){ ret = send_lut(s); if (ret != SANE_STATUS_GOOD) DBG (5, "sane_start: WARNING: cannot late send_lut %d\n", ret); @@ -7110,10 +7100,10 @@ sane_start (SANE_Handle handle) } /* set clean defaults with new sheet of paper */ - /* dont reset the transfer vars on backside of duplex page */ + /* don't reset the transfer vars on backside of duplex page */ /* otherwise buffered back page will be lost */ /* ingest paper with adf (no-op for fb) */ - /* dont call object pos or scan on back side of duplex scan */ + /* don't call object pos or scan on back side of duplex scan */ if(s->side == SIDE_FRONT || s->source == SOURCE_ADF_BACK || s->source == SOURCE_CARD_BACK){ s->bytes_rx[0]=0; @@ -7187,7 +7177,7 @@ sane_start (SANE_Handle handle) s->buff_tot[SIDE_BACK] = s->bytes_tot[SIDE_BACK]; /* the back buffer is normally very large, but some scanners or - * option combinations dont need it, so we make a small one */ + * option combinations don't need it, so we make a small one */ if(s->low_mem || s->source == SOURCE_ADF_BACK || s->source == SOURCE_CARD_BACK || s->duplex_interlace == DUPLEX_INTERLACE_NONE) s->buff_tot[SIDE_BACK] = s->buffer_size; @@ -7739,7 +7729,7 @@ set_window (struct fujitsu *s) /* call helper function, scanner wants lies about paper width */ set_WD_paper_width_X (desc1, get_page_width(s)); - /* dont call helper function, scanner wants actual length? */ + /* don't call helper function, scanner wants actual length? */ set_WD_paper_length_Y (desc1, s->page_height); } @@ -7974,7 +7964,7 @@ start_scan (struct fujitsu *s) /* checks started and cancelled flags in scanner struct, * sends cancel command to scanner if required. don't call - * this function asyncronously, wait for pending operation */ + * this function asynchronously, wait for pending operation */ static SANE_Status check_for_cancel(struct fujitsu *s) { @@ -8166,7 +8156,7 @@ sane_read (SANE_Handle handle, SANE_Byte * buf, SANE_Int max_len, SANE_Int * len return ret; } -/* bare jpeg images dont contain resolution, but JFIF APP0 does, so we add */ +/* bare jpeg images don't contain resolution, but JFIF APP0 does, so we add */ static SANE_Status inject_jfif_header(struct fujitsu *s, int side) { @@ -8220,21 +8210,21 @@ read_from_JPEGduplex(struct fujitsu *s) int avail = s->buff_tot[SIDE_FRONT] - s->buff_rx[SIDE_FRONT]; if(bytes > avail){ bytes = avail; - /* leave space for JFIF header at start of image */ - if(s->bytes_rx[SIDE_FRONT] < 2) - bytes -= JFIF_APP0_LENGTH; } } if(!s->eof_rx[SIDE_BACK]){ int avail = s->buff_tot[SIDE_BACK] - s->buff_rx[SIDE_BACK]; if(bytes > avail){ bytes = avail; - /* leave space for JFIF header at start of image */ - if(s->bytes_rx[SIDE_BACK] < 2) - bytes -= JFIF_APP0_LENGTH; } } + /* leave space for JFIF header in the small front side buffer, + * if we are at the beginning of the image */ + if(s->bytes_rx[SIDE_FRONT] < 3){ + bytes -= JFIF_APP0_LENGTH; + } + DBG(15, "read_from_JPEGduplex: fto:%d frx:%d bto:%d brx:%d pa:%d\n", s->bytes_tot[SIDE_FRONT], s->bytes_rx[SIDE_FRONT], s->bytes_tot[SIDE_BACK], s->bytes_rx[SIDE_BACK], @@ -8378,7 +8368,7 @@ read_from_JPEGduplex(struct fujitsu *s) } /* unknown, warn */ - else if(in[i] != 0xff){ + else if(in[i] != 0x00){ DBG(15, "read_from_JPEGduplex: unknown %02x\n", in[i]); } } @@ -8415,7 +8405,7 @@ read_from_JPEGduplex(struct fujitsu *s) s->bytes_rx[SIDE_FRONT]++; } - /* image is interlaced afterall, continue */ + /* image is interlaced after all, continue */ else{ DBG(15, "read_from_JPEGduplex: wrong width, req:%d got:%d\n", s->s_params.pixels_per_line,width); @@ -8484,7 +8474,7 @@ read_from_JPEGduplex(struct fujitsu *s) free(in); - /* jpeg uses in-band EOI marker, so this is ususally redundant */ + /* jpeg uses in-band EOI marker, so this is usually redundant */ if(ret == SANE_STATUS_EOF){ DBG(15, "read_from_JPEGduplex: got EOF, finishing\n"); s->eof_rx[SIDE_FRONT] = 1; @@ -9157,7 +9147,7 @@ downsample_from_buffer(struct fujitsu *s, SANE_Byte * buf, * handle h is a valid handle) but usually affects long-running * operations only (such as image is acquisition). It is safe to call * this function asynchronously (e.g., from within a signal handler). - * It is important to note that completion of this operaton does not + * It is important to note that completion of this operation does not * imply that the currently pending operation has been cancelled. It * only guarantees that cancellation has been initiated. Cancellation * completes only when the cancelled call returns (typically with a @@ -9963,7 +9953,7 @@ get_page_width(struct fujitsu *s) return s->page_width; } - /* cant overscan larger than scanner max */ + /* can't overscan larger than scanner max */ if(width > s->max_x){ return s->max_x; } @@ -9992,7 +9982,7 @@ get_page_height(struct fujitsu *s) return s->page_height; } - /* cant overscan larger than scanner max */ + /* can't overscan larger than scanner max */ if(height > s->max_y){ return s->max_y; } |