Lines Matching full:dev
99 * Decode jpeg from `infilename` into dev->decData of dev->decDataSize size.
101 static int decompress(struct device __sane_unused__ *dev, in decompress() argument
138 dev->decDataSize = bmp_size; in decompress()
146 buffer[0] = dev->decData + \ in decompress()
159 /* copy from decoded jpeg image (dev->decData) into user's buffer (pDest) */
161 static int copy_decompress_data(struct device *dev, unsigned char *pDest, int maxlen, int *destLen) in copy_decompress_data() argument
167 if (!dev->decDataSize) in copy_decompress_data()
169 data_size = dev->decDataSize - dev->currentDecDataIndex; in copy_decompress_data()
173 memcpy(pDest, dev->decData + dev->currentDecDataIndex, data_size); in copy_decompress_data()
176 dev->currentDecDataIndex += data_size; in copy_decompress_data()
178 if (dev->decDataSize == dev->currentDecDataIndex) { in copy_decompress_data()
179 dev->currentDecDataIndex = 0; in copy_decompress_data()
180 dev->decDataSize = 0; in copy_decompress_data()
185 static int decompress_tempfile(struct device *dev) in decompress_tempfile() argument
187 decompress(dev, encTmpFileName); in decompress_tempfile()
192 static int dump_to_tmp_file(struct device *dev) in dump_to_tmp_file() argument
194 unsigned char *pSrc = dev->data; in dump_to_tmp_file()
195 int srcLen = dev->datalen; in dump_to_tmp_file()
207 static int isSupportedDevice(struct device __sane_unused__ *dev) in isSupportedDevice() argument
211 if (dev->compressionTypes & (1 << 6)) { in isSupportedDevice()
213 if (!strncmp (dev->sane.model, "SCX-4500W", 9) in isSupportedDevice()
214 || !strncmp (dev->sane.model, "C460", 4) in isSupportedDevice()
215 || !!strstr (dev->sane.model, "WorkCentre 3225") in isSupportedDevice()
216 || !!strstr (dev->sane.model, "CLX-3170") in isSupportedDevice()
217 || !!strstr (dev->sane.model, "4x24") in isSupportedDevice()
218 || !!strstr (dev->sane.model, "4x28") in isSupportedDevice()
219 || !strncmp (dev->sane.model, "M288x", 5)) in isSupportedDevice()
229 static int isJPEGEnabled(struct device __sane_unused__ *dev) in isJPEGEnabled() argument
231 return isSupportedDevice(dev) && dev->compressionEnabled; in isJPEGEnabled()
234 static void dbg_dump(struct device *dev) in dbg_dump() argument
238 int nzlen = dev->reslen; in dbg_dump()
239 int dlen = MIN(dev->reslen, MAX_DUMP); in dbg_dump()
241 for (i = dev->reslen - 1; i >= 0; i--, nzlen--) in dbg_dump()
242 if (dev->res[i] != 0) in dbg_dump()
248 sprintf(dptr, " %02x", dev->res[i]); in dbg_dump()
250 DBG(5, "[%zu]%s%s\n", dev->reslen, dbuf, in dbg_dump()
251 (dlen < (int)dev->reslen)? "..." : ""); in dbg_dump()
256 static int dev_command(struct device *dev, SANE_Byte *cmd, size_t reqlen) in dev_command() argument
260 SANE_Byte *res = dev->res; in dev_command()
263 assert(reqlen <= sizeof(dev->res)); /* requested len */ in dev_command()
264 dev->reslen = sizeof(dev->res); /* doing full buffer to flush stalled commands */ in dev_command()
276 dev->state = 0; in dev_command()
279 status = dev->io->dev_request(dev, cmd, sendlen, res, &dev->reslen); in dev_command()
282 dev->state = SANE_STATUS_IO_ERROR; in dev_command()
292 if (dev->reslen < reqlen) { in dev_command()
294 __func__, dev->reslen, reqlen); in dev_command()
295 dev->state = SANE_STATUS_IO_ERROR; in dev_command()
301 dbg_dump(dev); in dev_command()
303 if (dev->res[0] != RES_CODE) { in dev_command()
304 DBG(2, "%s: illegal data header %02x\n", __func__, dev->res[0]); in dev_command()
305 dev->state = SANE_STATUS_IO_ERROR; in dev_command()
308 pktlen = dev->res[2] + 3; in dev_command()
309 if (dev->reslen != pktlen) { in dev_command()
311 __func__, pktlen, dev->reslen); in dev_command()
312 dev->state = SANE_STATUS_IO_ERROR; in dev_command()
315 if (dev->reslen > reqlen) in dev_command()
317 __func__, dev->reslen, reqlen); in dev_command()
320 dev->state = 0; in dev_command()
325 if (dev->res[1] == STATUS_BUSY) in dev_command()
326 dev->state = SANE_STATUS_DEVICE_BUSY; in dev_command()
327 else if (dev->res[1] == STATUS_CANCEL) in dev_command()
328 dev->state = SANE_STATUS_CANCELLED; in dev_command()
329 else if (dev->res[1] == STATUS_CHECK) in dev_command()
330 dev->state = resolv_state((cmd[2] == CMD_READ)? in dev_command()
331 (dev->res[12] << 8 | dev->res[13]) : in dev_command()
332 (dev->res[4] << 8 | dev->res[5])); in dev_command()
334 if (dev->state) in dev_command()
337 dev->state, sane_strstatus(dev->state)); in dev_command()
344 static int dev_cmd(struct device *dev, SANE_Byte command) in dev_cmd() argument
348 return dev_command(dev, cmd, (command == CMD_INQUIRY)? 70 : 32); in dev_cmd()
352 static SANE_Status dev_stop(struct device *dev) in dev_stop() argument
354 int state = dev->state; in dev_stop()
357 (void *)dev, dev->scanning, dev->reserved); in dev_stop()
358 dev->scanning = 0; in dev_stop()
361 if (!dev->reserved) in dev_stop()
363 dev->reserved = 0; in dev_stop()
364 dev_cmd(dev, CMD_RELEASE_UNIT); in dev_stop()
366 dev->para.pixels_per_line, dev->para.lines, in dev_stop()
367 dev->total_img_size, in dev_stop()
368 dev->win_width, dev->win_len, in dev_stop()
369 dev->pixels_per_line, dev->ulines, dev->blocks, in dev_stop()
370 dev->total_data_size, dev->total_out_size); in dev_stop()
371 dev->state = state; in dev_stop()
375 SANE_Status ret_cancel(struct device *dev, SANE_Status ret) in ret_cancel() argument
377 dev_cmd(dev, CMD_ABORT); in ret_cancel()
378 if (dev->scanning) { in ret_cancel()
379 dev_stop(dev); in ret_cancel()
380 dev->state = SANE_STATUS_CANCELLED; in ret_cancel()
385 static int cancelled(struct device *dev) in cancelled() argument
387 if (dev->cancel) in cancelled()
388 return ret_cancel(dev, 1); in cancelled()
394 static int dev_cmd_wait(struct device *dev, int cmd) in dev_cmd_wait() argument
399 if (cancelled(dev)) in dev_cmd_wait()
401 if (!dev_cmd(dev, cmd)) { in dev_cmd_wait()
402 dev->state = SANE_STATUS_IO_ERROR; in dev_cmd_wait()
404 } else if (dev->state) { in dev_cmd_wait()
405 if (dev->state != SANE_STATUS_DEVICE_BUSY) in dev_cmd_wait()
408 if (dev->non_blocking) { in dev_cmd_wait()
409 dev->state = SANE_STATUS_GOOD; in dev_cmd_wait()
415 str_cmd(cmd), sleeptime, dev->res[4], dev->res[5]); in dev_cmd_wait()
422 } while (dev->state == SANE_STATUS_DEVICE_BUSY); in dev_cmd_wait()
448 static void resolv_inq_dpi(struct device *dev) in resolv_inq_dpi() argument
451 int res = dev->resolutions; in resolv_inq_dpi()
453 assert(sizeof(inq_dpi_bits) < sizeof(dev->dpi_list)); in resolv_inq_dpi()
456 dev->dpi_list[++dev->dpi_list[0]] = inq_dpi_bits[i]; in resolv_inq_dpi()
457 qsort(&dev->dpi_list[1], dev->dpi_list[0], sizeof(SANE_Word), SANE_Word_sort); in resolv_inq_dpi()
524 static void reset_options(struct device *dev) in reset_options() argument
526 dev->val[OPT_RESOLUTION].w = 150; in reset_options()
527 dev->val[OPT_MODE].s = string_match(scan_modes, SANE_VALUE_SCAN_MODE_COLOR); in reset_options()
530 dev->val[OPT_SOURCE].s = UNCONST(doc_sources[(dev->doc_loaded)? 1 : 0]); in reset_options()
532 dev->val[OPT_THRESHOLD].w = SANE_FIX(50); in reset_options()
535 dev->win_x_range.min = SANE_FIX(0); in reset_options()
536 dev->win_x_range.max = SANE_FIX((double)dev->max_win_width / PNT_PER_MM); in reset_options()
537 dev->win_x_range.quant = SANE_FIX(1); in reset_options()
538 dev->win_y_range.min = SANE_FIX(0); in reset_options()
539 dev->win_y_range.max = SANE_FIX((double)dev->max_win_len / PNT_PER_MM); in reset_options()
540 dev->win_y_range.quant = SANE_FIX(1); in reset_options()
541 dev->val[OPT_SCAN_TL_X].w = dev->win_x_range.min; in reset_options()
542 dev->val[OPT_SCAN_TL_Y].w = dev->win_y_range.min; in reset_options()
543 dev->val[OPT_SCAN_BR_X].w = dev->win_x_range.max; in reset_options()
544 dev->val[OPT_SCAN_BR_Y].w = dev->win_y_range.max; in reset_options()
547 static void init_options(struct device *dev) in init_options() argument
552 dev->opt[i].cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT; in init_options()
553 dev->opt[i].size = sizeof(SANE_Word); in init_options()
554 dev->opt[i].type = SANE_TYPE_FIXED; in init_options()
555 dev->val[i].s = NULL; in init_options()
558 dev->opt[OPT_NUMOPTIONS].name = SANE_NAME_NUM_OPTIONS; in init_options()
559 dev->opt[OPT_NUMOPTIONS].title = SANE_TITLE_NUM_OPTIONS; in init_options()
560 dev->opt[OPT_NUMOPTIONS].desc = SANE_DESC_NUM_OPTIONS; in init_options()
561 dev->opt[OPT_NUMOPTIONS].type = SANE_TYPE_INT; in init_options()
562 dev->opt[OPT_NUMOPTIONS].cap = SANE_CAP_SOFT_DETECT; in init_options()
563 dev->val[OPT_NUMOPTIONS].w = NUM_OPTIONS; in init_options()
565 dev->opt[OPT_GROUP_STD].name = SANE_NAME_STANDARD; in init_options()
566 dev->opt[OPT_GROUP_STD].title = SANE_TITLE_STANDARD; in init_options()
567 dev->opt[OPT_GROUP_STD].desc = SANE_DESC_STANDARD; in init_options()
568 dev->opt[OPT_GROUP_STD].type = SANE_TYPE_GROUP; in init_options()
569 dev->opt[OPT_GROUP_STD].cap = 0; in init_options()
571 dev->opt[OPT_RESOLUTION].name = SANE_NAME_SCAN_RESOLUTION; in init_options()
572 dev->opt[OPT_RESOLUTION].title = SANE_TITLE_SCAN_RESOLUTION; in init_options()
573 dev->opt[OPT_RESOLUTION].desc = SANE_DESC_SCAN_RESOLUTION; in init_options()
574 dev->opt[OPT_RESOLUTION].type = SANE_TYPE_INT; in init_options()
575 dev->opt[OPT_RESOLUTION].cap = SANE_CAP_SOFT_SELECT|SANE_CAP_SOFT_DETECT; in init_options()
576 dev->opt[OPT_RESOLUTION].unit = SANE_UNIT_DPI; in init_options()
577 dev->opt[OPT_RESOLUTION].constraint_type = SANE_CONSTRAINT_WORD_LIST; in init_options()
578 dev->opt[OPT_RESOLUTION].constraint.word_list = dev->dpi_list; in init_options()
580 dev->opt[OPT_MODE].name = SANE_NAME_SCAN_MODE; in init_options()
581 dev->opt[OPT_MODE].title = SANE_TITLE_SCAN_MODE; in init_options()
582 dev->opt[OPT_MODE].desc = SANE_DESC_SCAN_MODE; in init_options()
583 dev->opt[OPT_MODE].type = SANE_TYPE_STRING; in init_options()
584 dev->opt[OPT_MODE].size = max_string_size(scan_modes); in init_options()
585 dev->opt[OPT_MODE].cap = SANE_CAP_SOFT_SELECT|SANE_CAP_SOFT_DETECT; in init_options()
586 dev->opt[OPT_MODE].constraint_type = SANE_CONSTRAINT_STRING_LIST; in init_options()
587 dev->opt[OPT_MODE].constraint.string_list = scan_modes; in init_options()
589 dev->opt[OPT_THRESHOLD].name = SANE_NAME_HIGHLIGHT; in init_options()
590 dev->opt[OPT_THRESHOLD].title = SANE_TITLE_THRESHOLD; in init_options()
591 dev->opt[OPT_THRESHOLD].desc = SANE_DESC_THRESHOLD; in init_options()
592 dev->opt[OPT_THRESHOLD].unit = SANE_UNIT_PERCENT; in init_options()
593 dev->opt[OPT_THRESHOLD].cap = SANE_CAP_SOFT_SELECT|SANE_CAP_SOFT_DETECT; in init_options()
594 dev->opt[OPT_THRESHOLD].constraint_type = SANE_CONSTRAINT_RANGE; in init_options()
595 dev->opt[OPT_THRESHOLD].constraint.range = &threshold; in init_options()
597 dev->opt[OPT_SOURCE].name = SANE_NAME_SCAN_SOURCE; in init_options()
598 dev->opt[OPT_SOURCE].title = SANE_TITLE_SCAN_SOURCE; in init_options()
599 dev->opt[OPT_SOURCE].desc = SANE_DESC_SCAN_SOURCE; in init_options()
600 dev->opt[OPT_SOURCE].type = SANE_TYPE_STRING; in init_options()
601 dev->opt[OPT_SOURCE].size = max_string_size(doc_sources); in init_options()
602 dev->opt[OPT_SOURCE].cap = SANE_CAP_SOFT_SELECT|SANE_CAP_SOFT_DETECT; in init_options()
603 dev->opt[OPT_SOURCE].constraint_type = SANE_CONSTRAINT_STRING_LIST; in init_options()
604 dev->opt[OPT_SOURCE].constraint.string_list = doc_sources; in init_options()
606 dev->opt[OPT_JPEG].name = "jpeg"; in init_options()
607 dev->opt[OPT_JPEG].title = SANE_I18N("jpeg compression"); in init_options()
608 dev->opt[OPT_JPEG].desc = SANE_I18N("JPEG Image Compression"); in init_options()
609 dev->opt[OPT_JPEG].unit = SANE_UNIT_NONE; in init_options()
610 dev->opt[OPT_JPEG].type = SANE_TYPE_BOOL; in init_options()
611 dev->opt[OPT_JPEG].cap |= SANE_CAP_ADVANCED; in init_options()
613 dev->compressionEnabled = SANE_TRUE; in init_options()
614 if (!isSupportedDevice(dev)) in init_options()
615 dev->opt[OPT_JPEG].cap |= SANE_CAP_INACTIVE; in init_options()
616 dev->val[OPT_JPEG].b = SANE_TRUE; in init_options()
618 dev->opt[OPT_JPEG].cap |= SANE_CAP_INACTIVE; in init_options()
619 dev->val[OPT_JPEG].b = SANE_FALSE; in init_options()
622 dev->opt[OPT_GROUP_GEO].name = SANE_NAME_GEOMETRY; in init_options()
623 dev->opt[OPT_GROUP_GEO].title = SANE_TITLE_GEOMETRY; in init_options()
624 dev->opt[OPT_GROUP_GEO].desc = SANE_DESC_GEOMETRY; in init_options()
625 dev->opt[OPT_GROUP_GEO].type = SANE_TYPE_GROUP; in init_options()
626 dev->opt[OPT_GROUP_GEO].cap = 0; in init_options()
628 dev->opt[OPT_SCAN_TL_X].name = SANE_NAME_SCAN_TL_X; in init_options()
629 dev->opt[OPT_SCAN_TL_X].title = SANE_TITLE_SCAN_TL_X; in init_options()
630 dev->opt[OPT_SCAN_TL_X].desc = SANE_DESC_SCAN_TL_X; in init_options()
631 dev->opt[OPT_SCAN_TL_X].unit = SANE_UNIT_MM; in init_options()
632 dev->opt[OPT_SCAN_TL_X].constraint_type = SANE_CONSTRAINT_RANGE; in init_options()
633 dev->opt[OPT_SCAN_TL_X].constraint.range = &dev->win_x_range; in init_options()
635 dev->opt[OPT_SCAN_TL_Y].name = SANE_NAME_SCAN_TL_Y; in init_options()
636 dev->opt[OPT_SCAN_TL_Y].title = SANE_TITLE_SCAN_TL_Y; in init_options()
637 dev->opt[OPT_SCAN_TL_Y].desc = SANE_DESC_SCAN_TL_Y; in init_options()
638 dev->opt[OPT_SCAN_TL_Y].unit = SANE_UNIT_MM; in init_options()
639 dev->opt[OPT_SCAN_TL_Y].constraint_type = SANE_CONSTRAINT_RANGE; in init_options()
640 dev->opt[OPT_SCAN_TL_Y].constraint.range = &dev->win_y_range; in init_options()
642 dev->opt[OPT_SCAN_BR_X].name = SANE_NAME_SCAN_BR_X; in init_options()
643 dev->opt[OPT_SCAN_BR_X].title = SANE_TITLE_SCAN_BR_X; in init_options()
644 dev->opt[OPT_SCAN_BR_X].desc = SANE_DESC_SCAN_BR_X; in init_options()
645 dev->opt[OPT_SCAN_BR_X].unit = SANE_UNIT_MM; in init_options()
646 dev->opt[OPT_SCAN_BR_X].constraint_type = SANE_CONSTRAINT_RANGE; in init_options()
647 dev->opt[OPT_SCAN_BR_X].constraint.range = &dev->win_x_range; in init_options()
649 dev->opt[OPT_SCAN_BR_Y].name = SANE_NAME_SCAN_BR_Y; in init_options()
650 dev->opt[OPT_SCAN_BR_Y].title = SANE_TITLE_SCAN_BR_Y; in init_options()
651 dev->opt[OPT_SCAN_BR_Y].desc = SANE_DESC_SCAN_BR_Y; in init_options()
652 dev->opt[OPT_SCAN_BR_Y].unit = SANE_UNIT_MM; in init_options()
653 dev->opt[OPT_SCAN_BR_Y].constraint_type = SANE_CONSTRAINT_RANGE; in init_options()
654 dev->opt[OPT_SCAN_BR_Y].constraint.range = &dev->win_y_range; in init_options()
658 static void set_parameters(struct device *dev) in set_parameters() argument
662 dev->para.last_frame = SANE_TRUE; in set_parameters()
663 dev->para.lines = -1; in set_parameters()
664 px_to_len = 1200.0 / dev->val[OPT_RESOLUTION].w; in set_parameters()
669 px_to_len = 1180.0 / dev->val[OPT_RESOLUTION].w; in set_parameters()
671 dev->para.pixels_per_line = dev->win_width / px_to_len; in set_parameters()
672 dev->para.bytes_per_line = dev->para.pixels_per_line; in set_parameters()
674 DBG(5, dev->val[OPT_JPEG].b ? "JPEG compression enabled\n" : "JPEG compression disabled\n" ); in set_parameters()
675 dev->compressionEnabled = dev->val[OPT_JPEG].b; in set_parameters()
677 if (!isJPEGEnabled(dev)) { in set_parameters()
679 px_to_len = 1213.9 / dev->val[OPT_RESOLUTION].w; in set_parameters()
682 dev->para.lines = dev->win_len / px_to_len; in set_parameters()
683 if (dev->composition == MODE_LINEART || in set_parameters()
684 dev->composition == MODE_HALFTONE) { in set_parameters()
685 dev->para.format = SANE_FRAME_GRAY; in set_parameters()
686 dev->para.depth = 1; in set_parameters()
687 dev->para.bytes_per_line = (dev->para.pixels_per_line + 7) / 8; in set_parameters()
688 } else if (dev->composition == MODE_GRAY8) { in set_parameters()
689 dev->para.format = SANE_FRAME_GRAY; in set_parameters()
690 dev->para.depth = 8; in set_parameters()
691 dev->para.bytes_per_line = dev->para.pixels_per_line; in set_parameters()
692 } else if (dev->composition == MODE_RGB24) { in set_parameters()
693 dev->para.format = SANE_FRAME_RGB; in set_parameters()
694 dev->para.depth = 8; in set_parameters()
695 dev->para.bytes_per_line *= 3; in set_parameters()
699 __func__, dev->composition); in set_parameters()
700 dev->para.format = SANE_FRAME_GRAY; in set_parameters()
701 dev->para.depth = 8; in set_parameters()
707 static int fix_window(struct device *dev) in fix_window() argument
711 int threshold = SANE_UNFIX(dev->val[OPT_THRESHOLD].w); in fix_window()
713 dev->resolution = dpi_to_code(dev->val[OPT_RESOLUTION].w); in fix_window()
714 dev->composition = scan_mode_to_code[string_match_index(scan_modes, dev->val[OPT_MODE].s)]; in fix_window()
716 if (dev->composition == MODE_LINEART || in fix_window()
717 dev->composition == MODE_HALFTONE) { in fix_window()
718 dev->opt[OPT_THRESHOLD].cap &= ~SANE_CAP_INACTIVE; in fix_window()
720 dev->opt[OPT_THRESHOLD].cap |= SANE_CAP_INACTIVE; in fix_window()
723 dev->val[OPT_THRESHOLD].w = SANE_FIX(30); in fix_window()
725 dev->val[OPT_THRESHOLD].w = SANE_FIX(70); in fix_window()
727 threshold = SANE_UNFIX(dev->val[OPT_THRESHOLD].w); in fix_window()
728 dev->threshold = (threshold - 30) / 10; in fix_window()
729 dev->val[OPT_THRESHOLD].w = SANE_FIX(dev->threshold * 10 + 30); in fix_window()
731 dev->doc_source = doc_source_to_code[string_match_index(doc_sources, dev->val[OPT_SOURCE].s)]; in fix_window()
734 if (dev->doc_source == DOC_FLATBED || in fix_window()
735 (dev->doc_source == DOC_AUTO && !dev->doc_loaded)) in fix_window()
736 dev->max_len = dev->max_len_fb; in fix_window()
738 dev->max_len = dev->max_len_adf; in fix_window()
741 dev->win_y_range.max = SANE_FIX((double)dev->max_len / PNT_PER_MM); in fix_window()
745 if (dev->val[i].w < dev->opt[i].constraint.range->min) in fix_window()
746 dev->val[i].w = dev->opt[i].constraint.range->min; in fix_window()
747 if (dev->val[i].w > dev->opt[i].constraint.range->max) in fix_window()
748 dev->val[i].w = dev->opt[i].constraint.range->max; in fix_window()
751 if (dev->val[OPT_SCAN_TL_X].w > dev->val[OPT_SCAN_BR_X].w) in fix_window()
752 SWAP_Word(dev->val[OPT_SCAN_TL_X].w, dev->val[OPT_SCAN_BR_X].w); in fix_window()
753 if (dev->val[OPT_SCAN_TL_Y].w > dev->val[OPT_SCAN_BR_Y].w) in fix_window()
754 SWAP_Word(dev->val[OPT_SCAN_TL_Y].w, dev->val[OPT_SCAN_BR_Y].w); in fix_window()
757 dev->win_off_x = SANE_UNFIX(dev->val[OPT_SCAN_TL_X].w) / MM_PER_INCH; in fix_window()
758 dev->win_off_y = SANE_UNFIX(dev->val[OPT_SCAN_TL_Y].w) / MM_PER_INCH; in fix_window()
761 win_width_mm = SANE_UNFIX(dev->val[OPT_SCAN_BR_X].w) - in fix_window()
762 SANE_UNFIX(dev->val[OPT_SCAN_TL_X].w); in fix_window()
763 win_len_mm = SANE_UNFIX(dev->val[OPT_SCAN_BR_Y].w) - in fix_window()
764 SANE_UNFIX(dev->val[OPT_SCAN_TL_Y].w); in fix_window()
766 dev->win_width = (int)(win_width_mm * PNT_PER_MM); in fix_window()
767 dev->win_len = (int)(win_len_mm * PNT_PER_MM); in fix_window()
770 if (!dev->win_width || !dev->win_len) { in fix_window()
772 dev->state = SANE_STATUS_INVAL; in fix_window()
779 static int dev_set_window(struct device *dev) in dev_set_window() argument
785 if (!fix_window(dev)) in dev_set_window()
788 cmd[0x05] = dev->win_width >> 24; in dev_set_window()
789 cmd[0x06] = dev->win_width >> 16; in dev_set_window()
790 cmd[0x07] = dev->win_width >> 8; in dev_set_window()
791 cmd[0x08] = dev->win_width; in dev_set_window()
792 cmd[0x09] = dev->win_len >> 24; in dev_set_window()
793 cmd[0x0a] = dev->win_len >> 16; in dev_set_window()
794 cmd[0x0b] = dev->win_len >> 8; in dev_set_window()
795 cmd[0x0c] = dev->win_len; in dev_set_window()
796 cmd[0x0d] = dev->resolution; /* x */ in dev_set_window()
797 cmd[0x0e] = dev->resolution; /* y */ in dev_set_window()
798 cmd[0x0f] = (SANE_Byte)floor(dev->win_off_x); in dev_set_window()
799 cmd[0x10] = (SANE_Byte)((dev->win_off_x - floor(dev->win_off_x)) * 100); in dev_set_window()
800 cmd[0x11] = (SANE_Byte)floor(dev->win_off_y); in dev_set_window()
801 cmd[0x12] = (SANE_Byte)((dev->win_off_y - floor(dev->win_off_y)) * 100); in dev_set_window()
802 cmd[0x13] = dev->composition; in dev_set_window()
805 if (dev->composition == MODE_RGB24) { in dev_set_window()
806 if (isJPEGEnabled(dev)) { in dev_set_window()
810 cmd[0x16] = dev->threshold; in dev_set_window()
811 cmd[0x17] = dev->doc_source; in dev_set_window()
819 dev->max_win_width, dev->max_win_len); in dev_set_window()
821 return dev_command(dev, cmd, 32); in dev_set_window()
825 dev_inquiry(struct device *dev) in dev_inquiry() argument
830 if (!dev_cmd(dev, CMD_INQUIRY)) in dev_inquiry()
832 ptr = dev->res; in dev_inquiry()
839 dev->sane.vendor = optr = (SANE_Char *) malloc(33); in dev_inquiry()
840 for (ptr += 4; ptr < &dev->res[0x24] && *ptr && *ptr != ' ';) in dev_inquiry()
844 for (; ptr < &dev->res[0x24] && (!*ptr || *ptr == ' '); ptr++) in dev_inquiry()
847 dev->sane.model = optr = (SANE_Char *) malloc(33); in dev_inquiry()
849 for (; ptr < &dev->res[0x24] && *ptr;) { in dev_inquiry()
857 DBG(1, "%s: found %s/%s\n", __func__, dev->sane.vendor, dev->sane.model); in dev_inquiry()
858 dev->sane.type = strdup("multi-function peripheral"); in dev_inquiry()
860 dev->resolutions = dev->res[0x37] << 16 | in dev_inquiry()
861 dev->res[0x24] << 8 | in dev_inquiry()
862 dev->res[0x25]; in dev_inquiry()
863 dev->compositions = dev->res[0x27]; in dev_inquiry()
864 dev->max_win_width = dev->res[0x28] << 24 | in dev_inquiry()
865 dev->res[0x29] << 16 | in dev_inquiry()
866 dev->res[0x2a] << 8 | in dev_inquiry()
867 dev->res[0x2b]; in dev_inquiry()
868 dev->max_win_len = dev->res[0x2c] << 24 | in dev_inquiry()
869 dev->res[0x2d] << 16 | in dev_inquiry()
870 dev->res[0x2e] << 8 | in dev_inquiry()
871 dev->res[0x2f]; in dev_inquiry()
872 dev->max_len_adf = dev->res[0x38] << 24 | in dev_inquiry()
873 dev->res[0x39] << 16 | in dev_inquiry()
874 dev->res[0x3a] << 8 | in dev_inquiry()
875 dev->res[0x3b]; in dev_inquiry()
876 dev->max_len_fb = dev->res[0x3c] << 24 | in dev_inquiry()
877 dev->res[0x3d] << 16 | in dev_inquiry()
878 dev->res[0x3e] << 8 | in dev_inquiry()
879 dev->res[0x3f]; in dev_inquiry()
880 dev->line_order = dev->res[0x31]; in dev_inquiry()
881 dev->compressionTypes = dev->res[0x32]; in dev_inquiry()
882 dev->doc_loaded = (dev->res[0x35] == 0x02) && in dev_inquiry()
883 (dev->res[0x26] & 0x03); in dev_inquiry()
885 init_options(dev); in dev_inquiry()
886 reset_options(dev); in dev_inquiry()
887 fix_window(dev); in dev_inquiry()
888 set_parameters(dev); in dev_inquiry()
889 resolv_inq_dpi(dev); in dev_inquiry()
897 struct device *dev = h; in sane_get_option_descriptor() local
902 return &dev->opt[opt]; in sane_get_option_descriptor()
909 struct device *dev = h; in sane_control_option() local
912 if (!dev || opt >= NUM_OPTIONS || opt < 0) in sane_control_option()
919 if (dev->opt[opt].type == SANE_TYPE_STRING) in sane_control_option()
920 strcpy(val, dev->val[opt].s); in sane_control_option()
922 *(SANE_Word *)val = dev->val[opt].w; in sane_control_option()
924 SANE_Parameters xpara = dev->para; in sane_control_option()
929 if (dev->opt[opt].constraint_type == SANE_CONSTRAINT_STRING_LIST) { in sane_control_option()
930 dev->val[opt].s = string_match(dev->opt[opt].constraint.string_list, val); in sane_control_option()
931 if (info && strcasecmp(dev->val[opt].s, val)) in sane_control_option()
934 dev->val[opt].w = res_dpi_codes[dpi_to_code(*(SANE_Word *)val)]; in sane_control_option()
936 dev->val[opt].w = *(SANE_Word *)val; in sane_control_option()
938 memcpy(&xopt, &dev->opt, sizeof(xopt)); in sane_control_option()
939 memcpy(&xval, &dev->val, sizeof(xval)); in sane_control_option()
940 fix_window(dev); in sane_control_option()
941 set_parameters(dev); in sane_control_option()
945 if (memcmp(&xpara, &dev->para, sizeof(xpara))) in sane_control_option()
947 if (memcmp(&xopt, &dev->opt, sizeof(xopt))) in sane_control_option()
950 if (xval[i].w != dev->val[i].w) { in sane_control_option()
965 dev_free(struct device *dev) in dev_free() argument
967 if (!dev) in dev_free()
970 if (dev->sane.name) in dev_free()
971 free(UNCONST(dev->sane.name)); in dev_free()
972 if (dev->sane.vendor) in dev_free()
973 free(UNCONST(dev->sane.vendor)); in dev_free()
974 if (dev->sane.model) in dev_free()
975 free(UNCONST(dev->sane.model)); in dev_free()
976 if (dev->sane.type) in dev_free()
977 free(UNCONST(dev->sane.type)); in dev_free()
978 if (dev->data) in dev_free()
979 free(dev->data); in dev_free()
980 if (dev->decData) { in dev_free()
981 free(dev->decData); in dev_free()
982 dev->decData = NULL; in dev_free()
984 memset(dev, 0, sizeof(*dev)); in dev_free()
985 free(dev); in dev_free()
992 struct device *dev; in free_devices() local
998 for (dev = devices_head; dev; dev = next) { in free_devices()
999 next = dev->next; in free_devices()
1000 dev_free(dev); in free_devices()
1015 struct device *dev; in list_one_device() local
1021 for (dev = devices_head; dev; dev = dev->next) { in list_one_device()
1022 if (strcmp(dev->sane.name, devname) == 0) in list_one_device()
1028 dev = calloc(1, sizeof(struct device)); in list_one_device()
1029 if (dev == NULL) in list_one_device()
1032 dev->sane.name = strdup(devname); in list_one_device()
1033 dev->io = tr; in list_one_device()
1034 status = tr->dev_open(dev); in list_one_device()
1036 dev_free(dev); in list_one_device()
1040 /* status = dev_cmd (dev, CMD_ABORT);*/ in list_one_device()
1041 status = dev_inquiry(dev); in list_one_device()
1042 tr->dev_close(dev); in list_one_device()
1045 dev->sane.name, sane_strstatus(status)); in list_one_device()
1046 dev_free(dev); in list_one_device()
1051 dev->next = devices_head; in list_one_device()
1052 devices_head = dev; in list_one_device()
1081 struct device *dev; in sane_exit() local
1083 for (dev = devices_head; dev; dev = dev->next) in sane_exit()
1084 if (dev->dn != -1) in sane_exit()
1085 sane_close(dev); /* implies flush */ in sane_exit()
1094 struct device *dev; in sane_get_devices() local
1113 for (dev_count = 0, dev = devices_head; dev; dev = dev->next) in sane_get_devices()
1122 for (i = 0, dev = devices_head; dev; dev = dev->next) in sane_get_devices()
1123 devlist[i++] = &dev->sane; in sane_get_devices()
1134 struct device *dev = h; in sane_close() local
1136 if (!dev) in sane_close()
1139 DBG(3, "%s: %p (%s)\n", __func__, (void *)dev, dev->sane.name); in sane_close()
1140 dev->io->dev_close(dev); in sane_close()
1146 struct device *dev; in sane_open() local
1155 for (dev = devices_head; dev; dev = dev->next) { in sane_open()
1156 if (dev->dn != -1) { in sane_open()
1157 if (sane_open(dev->sane.name, h) == SANE_STATUS_GOOD) in sane_open()
1162 for (dev = devices_head; dev; dev = dev->next) { in sane_open()
1163 if (strcmp(name, dev->sane.name) == 0) { in sane_open()
1164 *h = dev; in sane_open()
1165 return dev->io->dev_open(dev); in sane_open()
1176 struct device *dev = h; in sane_get_parameters() local
1182 *para = dev->para; in sane_get_parameters()
1188 static int dev_acquire(struct device *dev) in dev_acquire() argument
1190 if (!dev_cmd_wait(dev, CMD_READ)) in dev_acquire()
1193 dev->state = SANE_STATUS_GOOD; in dev_acquire()
1194 dev->vertical = dev->res[0x08] << 8 | dev->res[0x09]; in dev_acquire()
1195 dev->horizontal = dev->res[0x0a] << 8 | dev->res[0x0b]; in dev_acquire()
1196 dev->blocklen = dev->res[4] << 24 | in dev_acquire()
1197 dev->res[5] << 16 | in dev_acquire()
1198 dev->res[6] << 8 | in dev_acquire()
1199 dev->res[7]; in dev_acquire()
1200 dev->final_block = (dev->res[3] == MSG_END_BLOCK)? 1 : 0; in dev_acquire()
1202 dev->pixels_per_line = dev->horizontal; in dev_acquire()
1203 dev->bytes_per_line = dev->horizontal; in dev_acquire()
1205 if (dev->composition == MODE_RGB24) in dev_acquire()
1206 dev->bytes_per_line *= 3; in dev_acquire()
1207 else if (dev->composition == MODE_LINEART || in dev_acquire()
1208 dev->composition == MODE_HALFTONE) in dev_acquire()
1209 dev->pixels_per_line *= 8; in dev_acquire()
1212 dev->vertical, dev->horizontal, dev->final_block? "last " : "", in dev_acquire()
1213 dev->blocklen, dev->blocklen - (dev->vertical * dev->bytes_per_line)); in dev_acquire()
1215 if (dev->bytes_per_line > DATASIZE) { in dev_acquire()
1217 __func__, dev->bytes_per_line, DATASIZE); in dev_acquire()
1218 ret_cancel(dev, SANE_STATUS_NO_MEM); in dev_acquire()
1222 dev->reading = 0; /* need to issue READ_IMAGE */ in dev_acquire()
1224 dev->dataindex = 0; in dev_acquire()
1225 dev->datalen = 0; in dev_acquire()
1226 dev->dataoff = 0; in dev_acquire()
1231 static int fill_slack(struct device *dev, SANE_Byte *buf, int maxlen) in fill_slack() argument
1233 const int slack = dev->total_img_size - dev->total_out_size; in fill_slack()
1244 static int copy_plain_trim(struct device *dev, SANE_Byte *buf, int maxlen, int *olenp) in copy_plain_trim() argument
1247 const int linesize = dev->bytes_per_line; in copy_plain_trim()
1248 int k = dev->dataindex; in copy_plain_trim()
1250 for (j = 0; j < dev->datalen && *olenp < maxlen; j++, k++) { in copy_plain_trim()
1253 if (y >= dev->vertical) in copy_plain_trim()
1255 if (x < dev->para.bytes_per_line && in copy_plain_trim()
1256 (y + dev->y_off) < dev->para.lines) { in copy_plain_trim()
1257 *buf++ = dev->data[(dev->dataoff + j) & DATAMASK]; in copy_plain_trim()
1261 dev->dataindex = k; in copy_plain_trim()
1267 static int copy_mix_bands_trim(struct device *dev, SANE_Byte *buf, int maxlen, int *olenp) in copy_mix_bands_trim() argument
1271 const int linesize = dev->bytes_per_line; /* caching real line size */ in copy_mix_bands_trim()
1275 const int y_off = dev->dataindex / linesize; in copy_mix_bands_trim()
1277 int k = dev->dataindex; /* caching current index of input buffer */ in copy_mix_bands_trim()
1280 int havelen = dev->datalen / linesize * linesize - k % linesize; in copy_mix_bands_trim()
1287 const int band = (k % bands) * dev->horizontal; in copy_mix_bands_trim()
1290 const int y_rly = y + y_off + dev->y_off; /* global y */ in copy_mix_bands_trim()
1292 if (x < dev->para.pixels_per_line && in copy_mix_bands_trim()
1293 y_rly < dev->para.lines) { in copy_mix_bands_trim()
1294 *buf++ = dev->data[(dev->dataoff + band + x + y * linesize) & DATAMASK]; in copy_mix_bands_trim()
1298 dev->dataindex = k; in copy_mix_bands_trim()
1308 struct device *dev = h; in sane_read() local
1314 if (!dev) in sane_read()
1317 if (!dev->scanning) in sane_read()
1321 if (!dev->blocklen && (dev->datalen <= PADDING_SIZE || dev->final_block)) { in sane_read()
1324 if (dev->composition == MODE_RGB24 && in sane_read()
1325 isJPEGEnabled(dev) && in sane_read()
1326 dev->decDataSize > 0) { in sane_read()
1327 int diff = dev->total_img_size - dev->total_out_size; in sane_read()
1330 copy_decompress_data(dev, buf, bufLen, lenp)) { in sane_read()
1332 dev->total_out_size += *lenp; in sane_read()
1335 } else if (dev->composition != MODE_RGB24) { in sane_read()
1336 int diff = dev->total_img_size - dev->total_out_size; in sane_read()
1338 if (diff > 0 && copy_plain_trim(dev, buf, bufLen, lenp) > 0) { in sane_read()
1339 dev->total_out_size += *lenp; in sane_read()
1345 if (dev->final_block) { in sane_read()
1346 int slack = dev->total_img_size - dev->total_out_size; in sane_read()
1350 *lenp = fill_slack(dev, buf, maxlen); in sane_read()
1351 dev->total_out_size += *lenp; in sane_read()
1357 DBG(1, "image overflow %d bytes\n", dev->total_img_size - dev->total_out_size); in sane_read()
1359 if (isJPEGEnabled(dev) && in sane_read()
1360 dev->composition == MODE_RGB24) { in sane_read()
1364 dev_stop(dev); in sane_read()
1369 if (!dev_acquire(dev)) in sane_read()
1370 return dev->state; in sane_read()
1373 if (!dev->reading) { in sane_read()
1374 if (cancelled(dev)) in sane_read()
1375 return dev->state; in sane_read()
1377 if (!dev_cmd(dev, CMD_READ_IMAGE)) in sane_read()
1379 dev->reading++; in sane_read()
1380 dev->ulines += dev->vertical; in sane_read()
1381 dev->y_off = dev->ulines - dev->vertical; in sane_read()
1382 dev->total_data_size += dev->blocklen; in sane_read()
1383 dev->blocks++; in sane_read()
1392 datalen = MIN(dev->blocklen, DATAROOM(dev) & USB_BLOCK_MASK); in sane_read()
1393 while (datalen && dev->blocklen) { in sane_read()
1394 SANE_Byte *rbuf = dev->data + DATATAIL(dev); in sane_read()
1397 datalen, dev->dataoff, DATATAIL(dev), dev->datalen); in sane_read()
1399 if ((status = dev->io->dev_request(dev, NULL, 0, rbuf, &datalen)) != in sane_read()
1403 dev->datalen += datalen; in sane_read()
1404 dev->blocklen -= datalen; in sane_read()
1407 datalen, dev->dataoff, DATATAIL(dev), dev->datalen); in sane_read()
1409 if (dev->blocklen < 0) in sane_read()
1410 return ret_cancel(dev, SANE_STATUS_IO_ERROR); in sane_read()
1412 datalen = MIN(dev->blocklen, DATAROOM(dev) & USB_BLOCK_MASK); in sane_read()
1417 if (dev->para.format == SANE_FRAME_RGB && dev->line_order) { in sane_read()
1418 if (isJPEGEnabled(dev)) { in sane_read()
1419 clrlen = dump_to_tmp_file(dev); in sane_read()
1421 if (0 == dev->blocklen) { in sane_read()
1422 decompress_tempfile(dev); in sane_read()
1424 copy_decompress_data(dev, buf, maxlen, &olen); in sane_read()
1426 clrlen = copy_mix_bands_trim(dev, buf, maxlen, &olen); in sane_read()
1429 clrlen = copy_plain_trim(dev, buf, maxlen, &olen); in sane_read()
1431 dev->datalen -= clrlen; in sane_read()
1432 dev->dataoff = (dev->dataoff + clrlen) & DATAMASK; in sane_read()
1436 dev->total_out_size += olen; in sane_read()
1439 olen, clrlen, dev->blocklen, dev->datalen, maxlen, in sane_read()
1440 dev->dataindex / dev->bytes_per_line + dev->y_off, in sane_read()
1441 dev->y_off, dev->para.lines); in sane_read()
1444 if (dev->dataindex / dev->bytes_per_line + dev->y_off >= dev->para.lines) { in sane_read()
1445 dev->datalen = 0; in sane_read()
1446 dev->dataoff = 0; in sane_read()
1452 dev->datalen = 0; in sane_read()
1453 dev->dataoff = 0; in sane_read()
1456 } while (dev->blocklen); in sane_read()
1467 struct device *dev = h; in sane_start() local
1471 dev->cancel = 0; in sane_start()
1472 dev->scanning = 0; in sane_start()
1473 dev->total_img_size = 0; in sane_start()
1474 dev->total_out_size = 0; in sane_start()
1475 dev->total_data_size = 0; in sane_start()
1476 dev->blocks = 0; in sane_start()
1478 if (!dev->reserved) { in sane_start()
1479 if (!dev_cmd_wait(dev, CMD_RESERVE_UNIT)) in sane_start()
1480 return dev->state; in sane_start()
1481 dev->reserved++; in sane_start()
1484 if (!dev_set_window(dev) || in sane_start()
1485 (dev->state && dev->state != SANE_STATUS_DEVICE_BUSY)) in sane_start()
1486 return dev_stop(dev); in sane_start()
1488 if (!dev_cmd_wait(dev, CMD_OBJECT_POSITION)) in sane_start()
1489 return dev_stop(dev); in sane_start()
1491 if (!dev_cmd(dev, CMD_READ) || in sane_start()
1492 (dev->state && dev->state != SANE_STATUS_DEVICE_BUSY)) in sane_start()
1493 return dev_stop(dev); in sane_start()
1495 dev->scanning = 1; in sane_start()
1496 dev->final_block = 0; in sane_start()
1497 dev->blocklen = 0; in sane_start()
1498 dev->pixels_per_line = 0; in sane_start()
1499 dev->bytes_per_line = 0; in sane_start()
1500 dev->ulines = 0; in sane_start()
1502 set_parameters(dev); in sane_start()
1504 if (!dev->data && !(dev->data = malloc(DATASIZE))) in sane_start()
1505 return ret_cancel(dev, SANE_STATUS_NO_MEM); in sane_start()
1508 if (!dev->decData && !(dev->decData = malloc(POST_DATASIZE))) in sane_start()
1509 return ret_cancel(dev, SANE_STATUS_NO_MEM); in sane_start()
1511 if (!dev_acquire(dev)) in sane_start()
1512 return dev->state; in sane_start()
1514 /* make sure to have dev->para <= of real size */ in sane_start()
1515 if (dev->para.pixels_per_line > dev->pixels_per_line) { in sane_start()
1516 dev->para.pixels_per_line = dev->pixels_per_line; in sane_start()
1517 dev->para.bytes_per_line = dev->pixels_per_line; in sane_start()
1520 if (dev->composition == MODE_RGB24) in sane_start()
1521 dev->para.bytes_per_line = dev->para.pixels_per_line * 3; in sane_start()
1522 else if (dev->composition == MODE_LINEART || in sane_start()
1523 dev->composition == MODE_HALFTONE) { in sane_start()
1524 dev->para.bytes_per_line = (dev->para.pixels_per_line + 7) / 8; in sane_start()
1525 dev->para.pixels_per_line = dev->para.bytes_per_line * 8; in sane_start()
1527 dev->para.bytes_per_line = dev->para.pixels_per_line; in sane_start()
1530 dev->total_img_size = dev->para.bytes_per_line * dev->para.lines; in sane_start()
1532 if (isJPEGEnabled(dev) && in sane_start()
1533 dev->composition == MODE_RGB24) { in sane_start()
1541 (void *)dev, encTmpFileName, strerror(errno)); in sane_start()
1542 return ret_cancel(dev, SANE_STATUS_ACCESS_DENIED); in sane_start()
1546 dev->currentDecDataIndex = 0; in sane_start()
1553 struct device *dev = h; in sane_set_io_mode() local
1560 dev->non_blocking = non_blocking; in sane_set_io_mode()
1573 struct device *dev = h; in sane_cancel() local
1576 dev->cancel = 1; in sane_cancel()