diff options
author | Jörg Frings-Fürst <debian@jff-webhosting.net> | 2020-03-30 21:30:45 +0200 |
---|---|---|
committer | Jörg Frings-Fürst <debian@jff-webhosting.net> | 2020-03-30 21:30:45 +0200 |
commit | ee770c2346eb37e0dcb8b6cf3eaacf3d8efd6bbc (patch) | |
tree | 58f05092be1a17a939e861f8cadcda1b6ca2ecef /backend/epjitsu.c | |
parent | 0da9e21872802cfc6e975b1ebaf9efb9e5934d84 (diff) | |
parent | fef76e17ed4c607ea73b81279f9ef1d7121be900 (diff) |
Merge branch 'release/experimental/1.0.29-1_experimental1'experimental/1.0.29-1_experimental1
Diffstat (limited to 'backend/epjitsu.c')
-rw-r--r-- | backend/epjitsu.c | 442 |
1 files changed, 226 insertions, 216 deletions
diff --git a/backend/epjitsu.c b/backend/epjitsu.c index ce79a20..714bc0b 100644 --- a/backend/epjitsu.c +++ b/backend/epjitsu.c @@ -1,7 +1,7 @@ /* sane - Scanner Access Now Easy. This file implements a SANE backend for the Fujitsu fi-60F, the - ScanSnap S300/S1300, and (hopefully) other Epson-based scanners. + ScanSnap S300/S1300, and (hopefully) other Epson-based scanners. Copyright 2007-2015 by m. allan noah <kitno455 at gmail dot com> Copyright 2009 by Richard Goedeken <richard at fascinationsoftware dot com> @@ -174,7 +174,7 @@ . . - sane_start() : start image acquisition . . - sane_get_parameters() : returns actual scan parameters . . - sane_read() : read image data (from pipe) - . . (sane_read called multiple times; after sane_read returns EOF, + . . (sane_read called multiple times; after sane_read returns EOF, . . loop may continue with sane_start which may return a 2nd page . . when doing duplex scans, or load the next page from the ADF) . . @@ -218,7 +218,7 @@ unsigned char global_firmware_filename[PATH_MAX]; - function trace 10 - function detail 15 - get/setopt cmds 20 - - usb cmd trace 25 + - usb cmd trace 25 - usb cmd detail 30 - useless noise 35 */ @@ -253,7 +253,7 @@ static struct scanner *scanner_devList = NULL; /* * Called by SANE initially. - * + * * From the SANE spec: * This function must be called before any other SANE function can be * called. The behavior of a SANE backend is undefined if this @@ -271,21 +271,21 @@ sane_init (SANE_Int * version_code, SANE_Auth_Callback authorize) DBG_INIT (); DBG (10, "sane_init: start\n"); - + if (version_code) *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, V_MINOR, BUILD); - + DBG (5, "sane_init: epjitsu backend %d.%d.%d, from %s\n", SANE_CURRENT_MAJOR, V_MINOR, BUILD, PACKAGE_STRING); DBG (10, "sane_init: finish\n"); - + return SANE_STATUS_GOOD; } /* * Called by SANE to find out about supported devices. - * + * * From the SANE spec: * This function can be used to query the list of devices that are * available. If the function executes successfully, it stores a @@ -298,7 +298,7 @@ sane_init (SANE_Int * version_code, SANE_Auth_Callback authorize) * returned (devices directly attached to the machine that SANE is * running on). If it is false, the device list includes all remote * devices that are accessible to the SANE library. - * + * * SANE does not require that this function is called before a * sane_open() call is performed. A device name may be specified * explicitly by a user which would make it unnecessary and @@ -318,41 +318,52 @@ sane_get_devices (const SANE_Device *** device_list, SANE_Bool local_only) FILE *fp; int num_devices=0; int i=0; - + local_only = local_only; /* get rid of compiler warning */ - + DBG (10, "sane_get_devices: start\n"); - + /* mark all existing scanners as missing, attach_one will remove mark */ for (s = scanner_devList; s; s = s->next) { s->missing = 1; } sanei_usb_init(); - + fp = sanei_config_open (CONFIG_FILE); - + if (fp) { - + DBG (15, "sane_get_devices: reading config file %s\n", CONFIG_FILE); - + while (sanei_config_read (line, PATH_MAX, fp)) { - + lp = line; /* ignore comments */ if (*lp == '#') continue; - + /* skip empty lines */ if (*lp == 0) continue; - + if ((strncmp ("firmware", lp, 8) == 0) && isspace (lp[8])) { + size_t firmware_len; + lp += 8; lp = sanei_config_skip_whitespace (lp); DBG (15, "sane_get_devices: firmware '%s'\n", lp); - strncpy((char *)global_firmware_filename,lp,PATH_MAX); + + firmware_len = strlen(lp); + if (firmware_len > sizeof(global_firmware_filename) - 1) + { + DBG (5, "sane_get_devices: firmware file too long. ignoring '%s'\n", lp); + } + else + { + strcpy((char *)global_firmware_filename, lp); + } } else if ((strncmp ("usb", lp, 3) == 0) && isspace (lp[3])) { DBG (15, "sane_get_devices: looking for '%s'\n", lp); @@ -364,7 +375,7 @@ sane_get_devices (const SANE_Device *** device_list, SANE_Bool local_only) } fclose (fp); } - + else { DBG (5, "sane_get_devices: no config file '%s'!\n", CONFIG_FILE); @@ -374,7 +385,7 @@ sane_get_devices (const SANE_Device *** device_list, SANE_Bool local_only) for (s = scanner_devList; s;) { if(s->missing){ DBG (5, "sane_get_devices: missing scanner %s\n",s->sane.name); - + /*splice s out of list by changing pointer in prev to next*/ if(prev){ prev->next = s->next; @@ -387,7 +398,7 @@ sane_get_devices (const SANE_Device *** device_list, SANE_Bool local_only) s = s->next; free(prev); prev=NULL; - + /*reset head to next s*/ scanner_devList = s; } @@ -397,21 +408,21 @@ sane_get_devices (const SANE_Device *** device_list, SANE_Bool local_only) s=prev->next; } } - + for (s = scanner_devList; s; s=s->next) { DBG (15, "sane_get_devices: found scanner %s\n",s->sane.name); num_devices++; } - + DBG (15, "sane_get_devices: found %d scanner(s)\n",num_devices); if (sane_devArray) free (sane_devArray); - + sane_devArray = calloc (num_devices + 1, sizeof (SANE_Device*)); if (!sane_devArray) return SANE_STATUS_NO_MEM; - + for (s = scanner_devList; s; s=s->next) { sane_devArray[i++] = (SANE_Device *)&s->sane; } @@ -420,24 +431,24 @@ sane_get_devices (const SANE_Device *** device_list, SANE_Bool local_only) if(device_list){ *device_list = sane_devArray; } - + DBG (10, "sane_get_devices: finish\n"); - + return ret; } /* callback used by sane_init - * build the scanner struct and link to global list - * unless struct is already loaded, then pretend + * build the scanner struct and link to global list + * unless struct is already loaded, then pretend */ static SANE_Status attach_one (const char *name) { struct scanner *s; int ret, i; - + DBG (10, "attach_one: start '%s'\n", name); - + for (s = scanner_devList; s; s = s->next) { if (strcmp (s->sane.name, name) == 0) { DBG (10, "attach_one: already attached!\n"); @@ -445,30 +456,30 @@ attach_one (const char *name) return SANE_STATUS_GOOD; } } - + /* build a scanner struct to hold it */ DBG (15, "attach_one: init struct\n"); - + if ((s = calloc (sizeof (*s), 1)) == NULL) return SANE_STATUS_NO_MEM; - + /* copy the device name */ s->sane.name = strdup (name); if (!s->sane.name){ destroy(s); return SANE_STATUS_NO_MEM; } - + /* connect the fd */ DBG (15, "attach_one: connect fd\n"); - + s->fd = -1; ret = connect_fd(s); if(ret != SANE_STATUS_GOOD){ destroy(s); return ret; } - + /* load the firmware file into scanner */ ret = load_fw(s); if (ret != SANE_STATUS_GOOD) { @@ -487,7 +498,7 @@ attach_one (const char *name) DBG (15, "attach_one: Found %s scanner %s at %s\n", s->sane.vendor, s->sane.model, s->sane.name); - + if (strstr (s->sane.model, "S1300i")){ unsigned char stat; @@ -498,7 +509,7 @@ attach_one (const char *name) DBG (5, "attach_one: on USB power?\n"); s->usb_power=1; } - + s->model = MODEL_S1300i; s->has_adf = 1; @@ -530,7 +541,7 @@ attach_one (const char *name) DBG (5, "attach_one: on USB power?\n"); s->usb_power=1; } - + s->model = MODEL_S300; s->has_adf = 1; @@ -624,13 +635,13 @@ attach_one (const char *name) else{ DBG (15, "attach_one: Found other\n"); } - + /* set SANE option 'values' to good defaults */ DBG (15, "attach_one: init options\n"); - - /* go ahead and setup the first opt, because - * frontend may call control_option on it - * before calling get_option_descriptor + + /* go ahead and setup the first opt, because + * frontend may call control_option on it + * before calling get_option_descriptor */ memset (s->opt, 0, sizeof (s->opt)); for (i = 0; i < NUM_OPTIONS; ++i) { @@ -638,23 +649,23 @@ attach_one (const char *name) s->opt[i].size = sizeof (SANE_Word); s->opt[i].cap = SANE_CAP_INACTIVE; } - + s->opt[OPT_NUM_OPTS].name = SANE_NAME_NUM_OPTIONS; s->opt[OPT_NUM_OPTS].title = SANE_TITLE_NUM_OPTIONS; s->opt[OPT_NUM_OPTS].desc = SANE_DESC_NUM_OPTIONS; s->opt[OPT_NUM_OPTS].cap = SANE_CAP_SOFT_DETECT; - + DBG (15, "attach_one: init settings\n"); ret = change_params(s); /* we close the connection, so that another backend can talk to scanner */ disconnect_fd(s); - + s->next = scanner_devList; scanner_devList = s; - + DBG (10, "attach_one: finish\n"); - + return SANE_STATUS_GOOD; } @@ -665,9 +676,9 @@ static SANE_Status connect_fd (struct scanner *s) { SANE_Status ret; - + DBG (10, "connect_fd: start\n"); - + if(s->fd > -1){ DBG (5, "connect_fd: already open\n"); ret = SANE_STATUS_GOOD; @@ -676,13 +687,13 @@ connect_fd (struct scanner *s) DBG (15, "connect_fd: opening USB device\n"); ret = sanei_usb_open (s->sane.name, &(s->fd)); } - + if(ret != SANE_STATUS_GOOD){ DBG (5, "connect_fd: could not open device: %d\n", ret); } - + DBG (10, "connect_fd: finish\n"); - + return ret; } @@ -701,7 +712,7 @@ load_fw (struct scanner *s) size_t cmdLen; unsigned char stat[2]; size_t statLen; - + DBG (10, "load_fw: start\n"); /*check status*/ @@ -712,7 +723,7 @@ load_fw (struct scanner *s) DBG (5, "load_fw: firmware already loaded?\n"); return SANE_STATUS_GOOD; } - + if(!global_firmware_filename[0]){ DBG (5, "load_fw: missing filename\n"); return SANE_STATUS_NO_DOCS; @@ -757,7 +768,7 @@ load_fw (struct scanner *s) cmd[1] = 0x06; cmdLen = 2; statLen = 1; - + ret = do_cmd( s, 0, cmd, cmdLen, @@ -774,14 +785,14 @@ load_fw (struct scanner *s) free(buf); return SANE_STATUS_IO_ERROR; } - + /*length/data*/ cmd[0] = 0x01; cmd[1] = 0x00; cmd[2] = 0x01; cmd[3] = 0x00; cmdLen = 4; - + ret = do_cmd( s, 0, cmd, cmdLen, @@ -803,7 +814,7 @@ load_fw (struct scanner *s) cmdLen = 1; statLen = 1; - + ret = do_cmd( s, 0, cmd, cmdLen, @@ -818,13 +829,13 @@ load_fw (struct scanner *s) DBG (5, "load_fw: bad stat on cmd 3\n"); return SANE_STATUS_IO_ERROR; } - + /*reinit*/ cmd[0] = 0x1b; cmd[1] = 0x16; cmdLen = 2; statLen = 1; - + ret = do_cmd( s, 0, cmd, cmdLen, @@ -843,7 +854,7 @@ load_fw (struct scanner *s) cmd[0] = 0x80; cmdLen = 1; statLen = 1; - + ret = do_cmd( s, 0, cmd, cmdLen, @@ -882,7 +893,7 @@ get_stat(struct scanner *s) size_t cmdLen; unsigned char stat[2]; size_t statLen; - + DBG (10, "get_stat: start\n"); /*check status*/ @@ -890,7 +901,7 @@ get_stat(struct scanner *s) cmd[1] = 0x03; cmdLen = 2; statLen = 2; - + ret = do_cmd( s, 0, cmd, cmdLen, @@ -928,7 +939,7 @@ get_ident(struct scanner *s) NULL, 0, in, &inLen ); - + if (ret != SANE_STATUS_GOOD){ return ret; } @@ -945,7 +956,7 @@ get_ident(struct scanner *s) s->sane.model= strndup((char *)in+8, 24); s->sane.type = "scanner"; - + DBG (10, "get_ident: finish\n"); return ret; } @@ -965,7 +976,7 @@ sane_open (SANE_String_Const name, SANE_Handle * handle) struct scanner *dev = NULL; struct scanner *s = NULL; SANE_Status ret; - + DBG (10, "sane_open: start\n"); if(scanner_devList){ @@ -973,13 +984,13 @@ sane_open (SANE_String_Const name, SANE_Handle * handle) } else{ DBG (15, "sane_open: no scanners currently attached, attaching\n"); - + ret = sane_get_devices(NULL,0); if(ret != SANE_STATUS_GOOD){ return ret; } } - + if(name[0] == 0){ DBG (15, "sane_open: no device requested, using default\n"); s = scanner_devList; @@ -994,24 +1005,24 @@ sane_open (SANE_String_Const name, SANE_Handle * handle) } } } - + if (!s) { DBG (5, "sane_open: no device found\n"); return SANE_STATUS_INVAL; } - + DBG (15, "sane_open: device %s found\n", s->sane.name); - + *handle = s; - + /* connect the fd so we can talk to scanner */ ret = connect_fd(s); if(ret != SANE_STATUS_GOOD){ return ret; } - + DBG (10, "sane_open: finish\n"); - + return SANE_STATUS_GOOD; } @@ -1086,7 +1097,7 @@ sane_get_option_descriptor (SANE_Handle handle, SANE_Int option) s->mode_list[i++]=STRING_GRAYSCALE; s->mode_list[i++]=STRING_COLOR; s->mode_list[i]=NULL; - + opt->name = SANE_NAME_SCAN_MODE; opt->title = SANE_TITLE_SCAN_MODE; opt->desc = SANE_DESC_SCAN_MODE; @@ -1130,7 +1141,7 @@ sane_get_option_descriptor (SANE_Handle handle, SANE_Int option) s->tl_x_range.min = SCANNER_UNIT_TO_FIXED_MM(0); s->tl_x_range.max = SCANNER_UNIT_TO_FIXED_MM(get_page_width(s)-s->min_x); s->tl_x_range.quant = MM_PER_UNIT_FIX; - + opt->name = SANE_NAME_SCAN_TL_X; opt->title = SANE_TITLE_SCAN_TL_X; opt->desc = SANE_DESC_SCAN_TL_X; @@ -1149,7 +1160,7 @@ sane_get_option_descriptor (SANE_Handle handle, SANE_Int option) s->tl_y_range.min = SCANNER_UNIT_TO_FIXED_MM(0); s->tl_y_range.max = SCANNER_UNIT_TO_FIXED_MM(get_page_height(s)-s->min_y); s->tl_y_range.quant = MM_PER_UNIT_FIX; - + opt->name = SANE_NAME_SCAN_TL_Y; opt->title = SANE_TITLE_SCAN_TL_Y; opt->desc = SANE_DESC_SCAN_TL_Y; @@ -1167,7 +1178,7 @@ sane_get_option_descriptor (SANE_Handle handle, SANE_Int option) s->br_x_range.min = SCANNER_UNIT_TO_FIXED_MM(s->min_x); s->br_x_range.max = SCANNER_UNIT_TO_FIXED_MM(get_page_width(s)); s->br_x_range.quant = MM_PER_UNIT_FIX; - + opt->name = SANE_NAME_SCAN_BR_X; opt->title = SANE_TITLE_SCAN_BR_X; opt->desc = SANE_DESC_SCAN_BR_X; @@ -1186,7 +1197,7 @@ sane_get_option_descriptor (SANE_Handle handle, SANE_Int option) s->br_y_range.min = SCANNER_UNIT_TO_FIXED_MM(s->min_y); s->br_y_range.max = SCANNER_UNIT_TO_FIXED_MM(get_page_height(s)); s->br_y_range.quant = MM_PER_UNIT_FIX; - + opt->name = SANE_NAME_SCAN_BR_Y; opt->title = SANE_TITLE_SCAN_BR_Y; opt->desc = SANE_DESC_SCAN_BR_Y; @@ -1377,7 +1388,7 @@ sane_get_option_descriptor (SANE_Handle handle, SANE_Int option) opt->unit = SANE_UNIT_NONE; if (s->has_adf) opt->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_HARD_SELECT | SANE_CAP_ADVANCED; - else + else opt->cap = SANE_CAP_INACTIVE; } @@ -1389,7 +1400,7 @@ sane_get_option_descriptor (SANE_Handle handle, SANE_Int option) opt->unit = SANE_UNIT_NONE; if (s->has_adf) opt->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_HARD_SELECT | SANE_CAP_ADVANCED; - else + else opt->cap = SANE_CAP_INACTIVE; } @@ -1401,7 +1412,7 @@ sane_get_option_descriptor (SANE_Handle handle, SANE_Int option) opt->unit = SANE_UNIT_NONE; if (s->has_adf) opt->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_HARD_SELECT | SANE_CAP_ADVANCED; - else + else opt->cap = SANE_CAP_INACTIVE; } @@ -1413,7 +1424,7 @@ sane_get_option_descriptor (SANE_Handle handle, SANE_Int option) opt->unit = SANE_UNIT_NONE; if (s->has_adf) opt->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_HARD_SELECT | SANE_CAP_ADVANCED; - else + else opt->cap = SANE_CAP_INACTIVE; } @@ -1425,7 +1436,7 @@ sane_get_option_descriptor (SANE_Handle handle, SANE_Int option) opt->unit = SANE_UNIT_NONE; if (s->has_adf) opt->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_HARD_SELECT | SANE_CAP_ADVANCED; - else + else opt->cap = SANE_CAP_INACTIVE; } @@ -1434,7 +1445,7 @@ sane_get_option_descriptor (SANE_Handle handle, SANE_Int option) /** * Gets or sets an option value. - * + * * From the SANE spec: * This function is used to set or inquire the current value of option * number n of the device represented by handle h. The manner in which @@ -1445,7 +1456,7 @@ sane_get_option_descriptor (SANE_Handle handle, SANE_Int option) * area pointed to by v must be big enough to hold the entire option * value (determined by member size in the corresponding option * descriptor). - * + * * The only exception to this rule is that when setting the value of a * string option, the string pointed to by argument v may be shorter * since the backend will stop reading the option value upon @@ -1574,22 +1585,22 @@ sane_control_option (SANE_Handle handle, SANE_Int option, get_hardware_status(s); *val_p = s->hw_scan_sw; return SANE_STATUS_GOOD; - + case OPT_HOPPER: get_hardware_status(s); *val_p = s->hw_hopper; return SANE_STATUS_GOOD; - + case OPT_TOP: get_hardware_status(s); *val_p = s->hw_top; return SANE_STATUS_GOOD; - + case OPT_ADF_OPEN: get_hardware_status(s); *val_p = s->hw_adf_open; return SANE_STATUS_GOOD; - + case OPT_SLEEP: get_hardware_status(s); *val_p = s->hw_sleep; @@ -1630,7 +1641,7 @@ sane_control_option (SANE_Handle handle, SANE_Int option, * below. */ switch (option) { - + /* Mode Group */ case OPT_SOURCE: if (!strcmp (val, STRING_ADFFRONT)) { @@ -1766,7 +1777,7 @@ static void update_transfer_totals(struct transfer * t) { if (t->image == NULL) return; - + t->total_bytes = t->line_stride * t->image->height; t->rx_bytes = 0; t->done = 0; @@ -1810,7 +1821,7 @@ static struct model_res settings[] = { /*S300 AC*/ /* model mode xres yres u mxx mnx mxy mny lin_s pln_s pln_w bh cls cps cpw */ - { MODEL_S300, MODE_COLOR, 150, 150, 0, 1296, 32, 2662, 32, 4256*3, 1480*3, 1296, 41, 8512*3, 2960*3, 2592, + { MODEL_S300, MODE_COLOR, 150, 150, 0, 1296, 32, 2662, 32, 4256*3, 1480*3, 1296, 41, 8512*3, 2960*3, 2592, setWindowCoarseCal_S300_150, setWindowFineCal_S300_150, setWindowSendCal_S300_150, sendCal1Header_S300_150, sendCal2Header_S300_150, setWindowScan_S300_150 }, @@ -2056,7 +2067,7 @@ change_params(struct scanner *s) s->page_width = s->min_x; s->tl_x = (s->max_x - s->page_width)/2; s->br_x = (s->max_x + s->page_width)/2; - + /*=============================================================*/ /* set up the calibration scan structs */ /* generally full width, short height, full resolution */ @@ -2102,7 +2113,7 @@ change_params(struct scanner *s) s->sendcal.y_res = settings[i].y_res; s->sendcal.pages = img_pages; s->sendcal.buffer = NULL; - + /*=============================================================*/ /* set up the fullscan parameters */ /* this is bookkeeping for what we actually pull from the scanner */ @@ -2230,7 +2241,7 @@ change_params(struct scanner *s) s->pages[SIDE_BACK].done = 0; DBG (10, "change_params: finish\n"); - + return ret; } @@ -2238,7 +2249,7 @@ change_params(struct scanner *s) used by scanners to implement brightness/contrast/gamma or by backends to speed binarization/thresholding - offset and slope inputs are -127 to +127 + offset and slope inputs are -127 to +127 slope rotates line around central input/output val, 0 makes horizontal line @@ -2254,9 +2265,9 @@ change_params(struct scanner *s) offset moves line vertically, and clamps to output range 0 keeps the line crossing the center of the table - high low + high low . xxxxxxxx . - . x . + . x . out x . x . . x ............ xxxxxxxx.... @@ -2285,7 +2296,7 @@ load_lut (unsigned char * lut, * first [-127,127] to [-1,1] * then multiply by PI/2 to convert to radians * then take the tangent (T.O.A) - * then multiply by the normal linear slope + * then multiply by the normal linear slope * because the table may not be square, i.e. 1024x256*/ rise = tan((double)slope/127 * M_PI/2) * max_out_val / max_in_val; @@ -2332,7 +2343,7 @@ load_lut (unsigned char * lut, * completion of that request. Outside of that window, the returned * values are best-effort estimates of what the parameters will be * when sane_start() gets invoked. - * + * * Calling this function before a scan has actually started allows, * for example, to get an estimate of how big the scanned image will * be. The parameters passed to this function are the handle h of the @@ -2389,9 +2400,9 @@ sane_start (SANE_Handle handle) struct scanner *s = handle; SANE_Status ret; int i; - + DBG (10, "sane_start: start\n"); - + /* set side marker on first page */ if(!s->started){ if(s->source == SOURCE_ADF_BACK){ @@ -2462,7 +2473,7 @@ sane_start (SANE_Handle handle) sane_cancel((SANE_Handle)s); return ret; } - + ret = finecal(s); if (ret != SANE_STATUS_GOOD) { DBG (5, "sane_start: ERROR: failed to finecal\n"); @@ -2476,14 +2487,14 @@ sane_start (SANE_Handle handle) sane_cancel((SANE_Handle)s); return ret; } - + ret = lamp(s,1); if (ret != SANE_STATUS_GOOD) { DBG (5, "sane_start: ERROR: failed to heat lamp\n"); sane_cancel((SANE_Handle)s); return ret; } - + /*should this be between each page*/ ret = set_window(s,WINDOW_SCAN); if (ret != SANE_STATUS_GOOD) { @@ -2491,7 +2502,7 @@ sane_start (SANE_Handle handle) sane_cancel((SANE_Handle)s); return ret; } - + } /* reset everything when starting any front, or just back */ @@ -2503,7 +2514,7 @@ sane_start (SANE_Handle handle) s->fullscan.done = 0; s->fullscan.rx_bytes = 0; s->fullscan.total_bytes = s->fullscan.width_bytes * s->fullscan.height; - + /* reset block */ update_transfer_totals(&s->block_xfr); @@ -2532,7 +2543,7 @@ sane_start (SANE_Handle handle) } DBG (10, "sane_start: finish\n"); - + return SANE_STATUS_GOOD; } @@ -2644,7 +2655,7 @@ coarsecal_send_cal(struct scanner *s, unsigned char *pay) unsigned char cmd[2]; unsigned char stat[1]; size_t cmdLen,statLen,payLen; - + DBG (5, "coarsecal_send_cal: start\n"); /* send coarse cal (c6) */ cmd[0] = 0x1b; @@ -2652,7 +2663,7 @@ coarsecal_send_cal(struct scanner *s, unsigned char *pay) cmdLen = 2; stat[0] = 0; statLen = 1; - + ret = do_cmd( s, 0, cmd, cmdLen, @@ -2667,7 +2678,7 @@ coarsecal_send_cal(struct scanner *s, unsigned char *pay) DBG (5, "coarsecal_send_cal: cmd bad c6 status?\n"); return SANE_STATUS_IO_ERROR; } - + /*send coarse cal payload*/ stat[0] = 0; statLen = 1; @@ -2708,7 +2719,7 @@ coarsecal_get_line(struct scanner *s, struct image *img) cmdLen = 2; stat[0] = 0; statLen = 1; - + ret = do_cmd( s, 0, cmd, cmdLen, @@ -2726,7 +2737,7 @@ coarsecal_get_line(struct scanner *s, struct image *img) s->cal_image.image = img; update_transfer_totals(&s->cal_image); - + while(!s->cal_image.done){ ret = read_from_scanner(s,&s->cal_image); if(ret){ @@ -2782,7 +2793,7 @@ coarsecal_dark(struct scanner *s, unsigned char *pay) } ret = coarsecal_send_cal(s, pay); - + DBG(15, "coarsecal_dark offset: parameter front: %i back: %i\n", param[0], param[1]); ret = coarsecal_get_line(s, &s->coarsecal); @@ -2857,7 +2868,7 @@ coarsecal_light(struct scanner *s, unsigned char *pay) return ret; } - try_count = 8; + try_count = 8; param[0] = pay[11]; param[1] = pay[13]; low_param[0] = low_param[1] = 0; @@ -2872,7 +2883,7 @@ coarsecal_light(struct scanner *s, unsigned char *pay) DBG(15, "coarsecal_light gain: parameter front: %i back: %i\n", param[0], param[1]); ret = coarsecal_get_line(s, &s->coarsecal); - + /* gather statistics: count the proportion of 255-valued pixels in each color channel */ /* count the average pixel value in each color channel */ for (i = 0; i < s->coarsecal.pages; i++) @@ -3119,7 +3130,7 @@ finecal_send_cal(struct scanner *s) /*second unknown cal block*/ cmd[1] = 0xc4; statLen = 1; - + ret = do_cmd( s, 0, cmd, cmdLen, @@ -3441,13 +3452,13 @@ lamp(struct scanner *s, unsigned char set) size_t cmdLen = 2; unsigned char stat[1]; size_t statLen = 1; - + DBG (10, "lamp: start (%d)\n", set); /*send cmd*/ cmd[0] = 0x1b; cmd[1] = 0xd0; - + ret = do_cmd( s, 0, cmd, cmdLen, @@ -3467,7 +3478,7 @@ lamp(struct scanner *s, unsigned char set) cmd[0] = set; cmdLen = 1; statLen = 1; - + ret = do_cmd( s, 0, cmd, cmdLen, @@ -3542,7 +3553,7 @@ set_window(struct scanner *s, int window) /*send payload*/ statLen = 1; - + ret = do_cmd( s, 0, payload, paylen, @@ -3565,7 +3576,7 @@ set_window(struct scanner *s, int window) /* instead of internal brightness/contrast/gamma scanners uses 12bit x 12bit LUT default is linear table of slope 1 - brightness and contrast inputs are -127 to +127 + brightness and contrast inputs are -127 to +127 contrast rotates slope of line around central input val @@ -3581,7 +3592,7 @@ set_window(struct scanner *s, int window) bright dark . xxxxxxxx . - . x . + . x . out x . x . . x ............ xxxxxxxx.... @@ -3598,12 +3609,12 @@ send_lut (struct scanner *s) size_t statLen = 1; unsigned char *out; size_t outLen; - + int i, j; double b, slope, offset; int width; int height; - + DBG (10, "send_lut: start\n"); if (s->model == MODEL_S1100){ @@ -3630,7 +3641,7 @@ send_lut (struct scanner *s) * first [-127,127] to [0,254] then to [0,1] * then multiply by PI/2 to convert to radians * then take the tangent to get slope (T.O.A) - * then multiply by the normal linear slope + * then multiply by the normal linear slope * because the table may not be square, i.e. 1024x256*/ slope = tan(((double)s->contrast+127)/254 * M_PI/2); @@ -3642,17 +3653,17 @@ send_lut (struct scanner *s) * into a scale that covers the range required * to slide the contrast curve entirely off the table */ b = ((double)s->brightness/127) * (slope*(width-1) + offset); - + DBG (15, "send_lut: %d %f %d %f %f\n", s->brightness, b, s->contrast, slope, offset); - + for(i=0;i<width;i++){ j=slope*i + offset + b; - + if(j<0){ j=0; } - + if(j>(height-1)){ j=height-1; } @@ -3675,7 +3686,7 @@ send_lut (struct scanner *s) out[width*4 + i*2] = (j >> 8) & 0xff; out[width*4 + i*2+1] = j & 0xff; } - else { + else { /*first table, le order*/ out[i*2] = j & 0xff; out[i*2+1] = (j >> 8) & 0x0f; @@ -3745,7 +3756,7 @@ get_hardware_status (struct scanner *s) cmd[0] = 0x1b; cmd[1] = 0x33; - + ret = do_cmd( s, 0, cmd, cmdLen, @@ -3790,12 +3801,12 @@ object_position(struct scanner *s, int ingest) i = (ingest)?5:1; - while(i--){ + while(i--){ /*send paper load cmd*/ cmd[0] = 0x1b; cmd[1] = 0xd4; statLen = 1; - + ret = do_cmd( s, 0, cmd, cmdLen, @@ -3810,12 +3821,12 @@ object_position(struct scanner *s, int ingest) DBG (5, "object_position: cmd bad status? %d\n",stat[0]); continue; } - + /*send payload*/ statLen = 1; payLen = 1; pay[0] = ingest; - + ret = do_cmd( s, 0, pay, payLen, @@ -3853,7 +3864,7 @@ scan(struct scanner *s) size_t cmdLen = 2; unsigned char stat[1]; size_t statLen = 1; - + DBG (10, "scan: start\n"); if(s->model == MODEL_S300 || s->model == MODEL_S1100 || s->model == MODEL_S1300i){ @@ -3876,13 +3887,13 @@ scan(struct scanner *s) } DBG (10, "scan: finish\n"); - + return ret; } /* * Called by SANE to read data. - * + * * From the SANE spec: * This function is used to read image data from the device * represented by handle h. Argument buf is a pointer to a memory @@ -3890,7 +3901,7 @@ scan(struct scanner *s) * returned is stored in *len. A backend must set this to zero when * the call fails (i.e., when a status other than SANE_STATUS_GOOD is * returned). - * + * * When the call succeeds, the number of bytes returned can be * anywhere in the range from 0 to maxlen bytes. */ @@ -3900,7 +3911,7 @@ sane_read (SANE_Handle handle, SANE_Byte * buf, SANE_Int max_len, SANE_Int * len struct scanner *s = (struct scanner *) handle; SANE_Status ret=SANE_STATUS_GOOD; struct page * page; - + DBG (10, "sane_read: start si:%d len:%d max:%d\n",s->side,*len,max_len); *len = 0; @@ -3910,7 +3921,7 @@ sane_read (SANE_Handle handle, SANE_Byte * buf, SANE_Int max_len, SANE_Int * len DBG (5, "sane_read: call sane_start first\n"); return SANE_STATUS_CANCELLED; } - + page = &s->pages[s->side]; /* have sent all of current buffer */ @@ -3920,14 +3931,14 @@ sane_read (SANE_Handle handle, SANE_Byte * buf, SANE_Int max_len, SANE_Int * len /*S1100 needs help to turn off button*/ if(s->model == MODEL_S1100){ usleep(15000); - + /* eject paper */ ret = object_position(s,EPJITSU_PAPER_EJECT); if (ret != SANE_STATUS_GOOD && ret != SANE_STATUS_NO_DOCS) { DBG (5, "sane_read: ERROR: failed to eject\n"); return ret; } - + /* reset flashing button? */ ret = six5(s); if (ret != SANE_STATUS_GOOD) { @@ -3937,12 +3948,12 @@ sane_read (SANE_Handle handle, SANE_Byte * buf, SANE_Int max_len, SANE_Int * len } return SANE_STATUS_EOF; - } + } /* scan not finished, get more into block buffer */ if(!s->fullscan.done) { - /* block buffer currently empty, clean up */ + /* block buffer currently empty, clean up */ if(!s->block_xfr.rx_bytes) { /* block buffer bigger than remainder of scan, shrink block */ @@ -3959,9 +3970,9 @@ sane_read (SANE_Handle handle, SANE_Byte * buf, SANE_Int max_len, SANE_Int * len size_t cmdLen = 2; unsigned char stat[1]; size_t statLen = 1; - + DBG (15, "sane_read: d3\n"); - + ret = do_cmd( s, 0, cmd, cmdLen, @@ -4002,7 +4013,7 @@ sane_read (SANE_Handle handle, SANE_Byte * buf, SANE_Int max_len, SANE_Int * len size_t cmdLen = 2; unsigned char in[10]; size_t inLen = 10; - + ret = do_cmd( s, 0, cmd, cmdLen, @@ -4010,7 +4021,7 @@ sane_read (SANE_Handle handle, SANE_Byte * buf, SANE_Int max_len, SANE_Int * len in, &inLen ); hexdump(15, "cmd 43: ", in, inLen); - + if(ret){ DBG (5, "sane_read: error sending 43 cmd\n"); return ret; @@ -4076,19 +4087,19 @@ sane_read (SANE_Handle handle, SANE_Byte * buf, SANE_Int max_len, SANE_Int * len if(*len){ DBG (10, "sane_read: copy rx:%d tx:%d tot:%d len:%d\n", page->bytes_scanned, page->bytes_read, page->bytes_total,*len); - + memcpy(buf, page->image->buffer + page->bytes_read, *len); page->bytes_read += *len; - + /* sent it all, return eof on next read */ if(page->bytes_read == page->bytes_scanned && s->fullscan.done){ DBG (10, "sane_read: side done\n"); page->done = 1; } - } + } DBG (10, "sane_read: finish si:%d len:%d max:%d\n",s->side,*len,max_len); - + return ret; } @@ -4152,39 +4163,39 @@ descramble_raw(struct scanner *s, struct transfer * tp) for (j = 0; j < height; j++){ /* row (y)*/ int curr_col = 0; int r=0, g=0, b=0, ppc=0; - + for (k = 0; k <= tp->plane_width; k++){ /* column (x) */ int this_col = k*tp->image->x_res/tp->x_res; - + /* going to change output pixel, dump rgb and reset */ if(ppc && curr_col != this_col){ *p_out = r/ppc; p_out++; - + *p_out = g/ppc; p_out++; - + *p_out = b/ppc; p_out++; - + r = g = b = ppc = 0; - + curr_col = this_col; } - + if(k == tp->plane_width || this_col >= tp->image->width_pix){ break; } - + /*red is first*/ r += tp->raw_data[j*tp->line_stride + k*3 + i]; - + /*green is second*/ g += tp->raw_data[j*tp->line_stride + tp->plane_stride + k*3 + i]; - + /*blue is third*/ b += tp->raw_data[j*tp->line_stride + 2*tp->plane_stride + k*3 + i]; - + ppc++; } } @@ -4194,39 +4205,39 @@ descramble_raw(struct scanner *s, struct transfer * tp) for (j = 0; j < height; j++){ /* row (y)*/ int curr_col = 0; int r=0, g=0, b=0, ppc=0; - + for (k = 0; k <= tp->plane_width; k++){ /* column (x) */ int this_col = k*tp->image->x_res/tp->x_res; - + /* going to change output pixel, dump rgb and reset */ if(ppc && curr_col != this_col){ *p_out = r/ppc; p_out++; - + *p_out = g/ppc; p_out++; - + *p_out = b/ppc; p_out++; - + r = g = b = ppc = 0; - + curr_col = this_col; } - + if(k == tp->plane_width || this_col >= tp->image->width_pix){ break; } /*red is second*/ r += tp->raw_data[j*tp->line_stride + tp->plane_stride + k]; - + /*green is third*/ g += tp->raw_data[j*tp->line_stride + 2*tp->plane_stride + k]; - + /*blue is first*/ b += tp->raw_data[j*tp->line_stride + k]; - + ppc++; } } @@ -4238,39 +4249,39 @@ descramble_raw(struct scanner *s, struct transfer * tp) for (i = 0; i < 3; i++){ /* read head */ int r=0, g=0, b=0, ppc=0; - + for (k = 0; k <= tp->plane_width; k++){ /* column (x) within the read head */ int this_col = (k+i*tp->plane_width)*tp->image->x_res/tp->x_res; - + /* going to change output pixel, dump rgb and reset */ if(ppc && curr_col != this_col){ *p_out = r/ppc; p_out++; - + *p_out = g/ppc; p_out++; - + *p_out = b/ppc; p_out++; - + r = g = b = ppc = 0; - + curr_col = this_col; } - + if(k == tp->plane_width || this_col >= tp->image->width_pix){ break; } - + /*red is first*/ r += tp->raw_data[j*tp->line_stride + k*3 + i]; - + /*green is second*/ g += tp->raw_data[j*tp->line_stride + tp->plane_stride + k*3 + i]; - + /*blue is third*/ b += tp->raw_data[j*tp->line_stride + 2*tp->plane_stride + k*3 + i]; - + ppc++; } } @@ -4297,15 +4308,15 @@ descramble_raw_gray(struct scanner *s, struct transfer * tp) if (s->model == MODEL_FI60F || s->model == MODEL_FI65F) { for (row = 0; row < height; row++){ - + unsigned char *p_in = tp->raw_data + row * tp->line_stride; unsigned char *p_out = tp->image->buffer + row * tp->image->width_pix; - + for (col_out = 0; col_out < tp->image->width_pix; col_out++){ int col_in = col_out * tp->x_res/tp->image->x_res; int offset = col_in%tp->plane_width; int step = col_in/tp->plane_width; - + *p_out = *(p_in + offset*3 + step); p_out++; } @@ -4388,12 +4399,12 @@ read_from_scanner(struct scanner *s, struct transfer * tp) else { DBG(5, "read_from_scanner: error reading status = %d\n", ret); } - + free(buf); DBG (10, "read_from_scanner: finish rB:%lu len:%lu\n", (unsigned long)(tp->total_bytes - tp->rx_bytes + 8), (unsigned long)bytes); - + return ret; } @@ -4439,7 +4450,7 @@ copy_block_to_page(struct scanner *s,int side) int this_out_row = (this_in_row - page->image->y_skip_offset) * page->image->y_res / s->fullscan.y_res; DBG (15, "copy_block_to_page: in %d out %d lastout %d\n", this_in_row, this_out_row, last_out_row); DBG (15, "copy_block_to_page: bs %d wb %d\n", page->bytes_scanned, page->image->width_bytes); - + /* don't walk off the end of the output buffer */ if(this_out_row >= page->image->height || this_out_row < 0){ DBG (10, "copy_block_to_page: out of space? %d\n", side); @@ -4447,7 +4458,7 @@ copy_block_to_page(struct scanner *s,int side) page->bytes_scanned, page->bytes_read, page->bytes_total,page->image->width_bytes); return ret; } - + /* ok, different output row, so we do the math */ if(this_out_row > last_out_row){ @@ -4459,11 +4470,11 @@ copy_block_to_page(struct scanner *s,int side) last_out_row = this_out_row; if (block->mode == MODE_COLOR){ - + /* reverse order for back side or FI-60F scanner */ if (line_reverse) p_in += (page_width - 1) * 3; - + /* convert all of the pixels in this row */ for (j = 0; j < page_width; j++) { @@ -4492,18 +4503,18 @@ copy_block_to_page(struct scanner *s,int side) p_in += 3; } } - + /* grayscale input */ else{ unsigned char * p_in = block->image->buffer + (side * block_page_stride) + (i * block->image->width_bytes) + page->image->x_start_offset; - + /* reverse order for back side or FI-60F scanner */ if (line_reverse) p_in += (page_width - 1); - + //memcpy(p_out,p_in,page->image->width_bytes); - + for (j = 0; j < page_width; j++) { if (s->mode == MODE_GRAYSCALE) @@ -4570,7 +4581,7 @@ binarize_line(struct scanner *s, unsigned char *lineOut, int width) { int addCol = j + windowX/2; int dropCol = addCol - windowX; - + if (dropCol >= 0 && addCol < width) { sum -= s->dt.buffer[dropCol]; @@ -4584,7 +4595,7 @@ binarize_line(struct scanner *s, unsigned char *lineOut, int width) *lineOut &= ~mask; /* white */ else *lineOut |= mask; /* black */ - + if (offset == 7) lineOut++; } @@ -4596,7 +4607,7 @@ binarize_line(struct scanner *s, unsigned char *lineOut, int width) * @@ Section 4 - SANE cleanup functions */ /* - * Cancels a scan. + * Cancels a scan. * * From the SANE spec: * This function is used to immediately or as quickly as possible @@ -4626,7 +4637,7 @@ sane_cancel (SANE_Handle handle) /* * Ends use of the scanner. - * + * * From the SANE spec: * This function terminates the association between the device handle * passed in argument h and the device it represents. If the device is @@ -4684,7 +4695,7 @@ destroy(struct scanner *s) if(s->sane.model){ free((void *) s->sane.model); } - + free(s); DBG (10, "destroy: finish\n"); @@ -4758,7 +4769,7 @@ teardown_buffers(struct scanner *s) /* * Terminates the backend. - * + * * From the SANE spec: * This function must be called to terminate use of a backend. The * function will first close all device handles that still might be @@ -4828,13 +4839,13 @@ do_cmd(struct scanner *s, int shortTime, /* change timeout */ sanei_usb_set_timeout(cmdTime); - + /* write the command out */ DBG(25, "cmd: writing %ld bytes, timeout %d\n", (long)cmdLen, cmdTime); hexdump(30, "cmd: >>", cmdBuff, cmdLen); ret = sanei_usb_write_bulk(s->fd, cmdBuff, &cmdLen); DBG(25, "cmd: wrote %ld bytes, retVal %d\n", (long)cmdLen, ret); - + if(ret == SANE_STATUS_EOF){ DBG(5,"cmd: got EOF, returning IO_ERROR\n"); return SANE_STATUS_IO_ERROR; @@ -4993,7 +5004,7 @@ sane_get_select_fd (SANE_Handle h, SANE_Int *fdp) * due to using FB */ static int -get_page_width(struct scanner *s) +get_page_width(struct scanner *s) { /* scanner max for fb */ if(s->source == SOURCE_FLATBED){ @@ -5009,7 +5020,7 @@ get_page_width(struct scanner *s) * due to using FB. */ static int -get_page_height(struct scanner *s) +get_page_height(struct scanner *s) { /* scanner max for fb */ if(s->source == SOURCE_FLATBED){ @@ -5018,4 +5029,3 @@ get_page_height(struct scanner *s) return s->page_height; } - |