Lines Matching full:dev
242 Leo_Scanner *dev; in leo_init() local
247 dev = malloc (sizeof (Leo_Scanner)); in leo_init()
248 if (dev == NULL) in leo_init()
253 memset (dev, 0, sizeof (Leo_Scanner)); in leo_init()
256 dev->buffer_size = 64 * 1024; in leo_init()
257 dev->buffer = malloc (dev->buffer_size); in leo_init()
258 if (dev->buffer == NULL) in leo_init()
260 free (dev); in leo_init()
265 dev->image_size = 64 * 1024; /* enough for 1 line at max res */ in leo_init()
266 dev->image = malloc (dev->image_size); in leo_init()
267 if (dev->image == NULL) in leo_init()
269 free (dev->buffer); in leo_init()
270 free (dev); in leo_init()
274 dev->sfd = -1; in leo_init()
278 return (dev); in leo_init()
283 leo_close (Leo_Scanner * dev) in leo_close() argument
287 if (dev->sfd != -1) in leo_close()
289 sanei_scsi_close (dev->sfd); in leo_close()
290 dev->sfd = -1; in leo_close()
298 leo_free (Leo_Scanner * dev) in leo_free() argument
304 if (dev == NULL) in leo_free()
307 leo_close (dev); in leo_free()
308 if (dev->devicename) in leo_free()
310 free (dev->devicename); in leo_free()
312 if (dev->buffer) in leo_free()
314 free (dev->buffer); in leo_free()
316 if (dev->image) in leo_free()
318 free (dev->image); in leo_free()
323 if (dev->opt[i].type == SANE_TYPE_STRING && dev->val[i].s) in leo_free()
325 free (dev->val[i].s); in leo_free()
329 free (dev); in leo_free()
336 leo_identify_scanner (Leo_Scanner * dev) in leo_identify_scanner() argument
347 status = sanei_scsi_cmd2 (dev->sfd, cdb.data, cdb.len, in leo_identify_scanner()
348 NULL, 0, dev->buffer, &size); in leo_identify_scanner()
358 size = dev->buffer[4] + 5; /* total length of the inquiry data */ in leo_identify_scanner()
368 status = sanei_scsi_cmd2 (dev->sfd, cdb.data, cdb.len, in leo_identify_scanner()
369 NULL, 0, dev->buffer, &size); in leo_identify_scanner()
379 dev->scsi_type = dev->buffer[0] & 0x1f; in leo_identify_scanner()
380 memcpy (dev->scsi_vendor, dev->buffer + 0x08, 0x08); in leo_identify_scanner()
381 dev->scsi_vendor[0x08] = 0; in leo_identify_scanner()
382 memcpy (dev->scsi_product, dev->buffer + 0x10, 0x010); in leo_identify_scanner()
383 dev->scsi_product[0x10] = 0; in leo_identify_scanner()
384 memcpy (dev->scsi_version, dev->buffer + 0x20, 0x04); in leo_identify_scanner()
385 dev->scsi_version[0x04] = 0; in leo_identify_scanner()
388 dev->scsi_vendor, dev->scsi_product, dev->scsi_version); in leo_identify_scanner()
394 if (dev->scsi_type == scanners[i].scsi_type && in leo_identify_scanner()
395 strcmp (dev->scsi_vendor, scanners[i].scsi_vendor) == 0 && in leo_identify_scanner()
396 strcmp (dev->scsi_product, scanners[i].scsi_product) == 0) in leo_identify_scanner()
405 status = sanei_scsi_cmd2 (dev->sfd, cdb.data, cdb.len, in leo_identify_scanner()
406 NULL, 0, dev->buffer, &size); in leo_identify_scanner()
412 hexdump (DBG_info2, "inquiry", dev->buffer, size); in leo_identify_scanner()
414 dev->def = &(scanners[i]); in leo_identify_scanner()
415 dev->res_range.min = 1; in leo_identify_scanner()
416 dev->res_range.max = B16TOI (&dev->buffer[42]); in leo_identify_scanner()
418 dev->x_resolution_max = B16TOI (&dev->buffer[40]); in leo_identify_scanner()
419 dev->y_resolution_max = B16TOI (&dev->buffer[42]); in leo_identify_scanner()
490 leo_set_window (Leo_Scanner * dev) in leo_set_window() argument
509 Ito16 (dev->x_resolution, &window[10]); in leo_set_window()
510 Ito16 (dev->y_resolution, &window[12]); in leo_set_window()
513 Ito32 (dev->x_tl, &window[14]); in leo_set_window()
514 Ito32 (dev->y_tl, &window[18]); in leo_set_window()
517 Ito32 (dev->width, &window[22]); in leo_set_window()
518 Ito32 (dev->length, &window[26]); in leo_set_window()
522 switch (dev->scan_mode) in leo_set_window()
539 window[34] = dev->depth; in leo_set_window()
547 status = sanei_scsi_cmd2 (dev->sfd, cdb.data, cdb.len, in leo_set_window()
557 leo_get_scan_size (Leo_Scanner * dev) in leo_get_scan_size() argument
568 status = sanei_scsi_cmd2 (dev->sfd, cdb.data, cdb.len, in leo_get_scan_size()
569 NULL, 0, dev->buffer, &size); in leo_get_scan_size()
579 hexdump (DBG_info2, "leo_get_scan_size return", dev->buffer, size); in leo_get_scan_size()
582 dev->params.pixels_per_line = B16TOI (&dev->buffer[14]); in leo_get_scan_size()
586 dev->params.lines = B16TOI (&dev->buffer[12]) + in leo_get_scan_size()
587 (B24TOI (&dev->buffer[9]) / dev->params.bytes_per_line); in leo_get_scan_size()
589 switch (dev->scan_mode) in leo_get_scan_size()
593 dev->params.pixels_per_line &= ~0x7; in leo_get_scan_size()
594 dev->params.bytes_per_line = dev->params.pixels_per_line / 8; in leo_get_scan_size()
597 dev->params.bytes_per_line = dev->params.pixels_per_line; in leo_get_scan_size()
600 dev->params.bytes_per_line = dev->params.pixels_per_line * 3; in leo_get_scan_size()
606 DBG (DBG_proc, "lines=%d, bpl=%d\n", dev->params.lines, in leo_get_scan_size()
607 dev->params.bytes_per_line); in leo_get_scan_size()
614 get_filled_data_length (Leo_Scanner * dev, size_t * to_read) in get_filled_data_length() argument
626 status = sanei_scsi_cmd2 (dev->sfd, cdb.data, cdb.len, in get_filled_data_length()
627 NULL, 0, dev->buffer, &size); in get_filled_data_length()
637 hexdump (DBG_info2, "get_filled_data_length return", dev->buffer, size); in get_filled_data_length()
639 *to_read = B24TOI (&dev->buffer[9]); in get_filled_data_length()
650 leo_scan (Leo_Scanner * dev) in leo_scan() argument
659 status = sanei_scsi_cmd2 (dev->sfd, cdb.data, cdb.len, NULL, 0, NULL, NULL); in leo_scan()
670 Leo_Scanner *dev; in attach_scanner() local
679 for (dev = first_dev; dev; dev = dev->next) in attach_scanner()
681 if (strcmp (dev->sane.name, devicename) == 0) in attach_scanner()
685 *devp = dev; in attach_scanner()
693 dev = leo_init (); in attach_scanner()
694 if (dev == NULL) in attach_scanner()
702 if (sanei_scsi_open (devicename, &sfd, leo_sense_handler, dev) != 0) in attach_scanner()
705 leo_free (dev); in attach_scanner()
710 dev->devicename = strdup (devicename); in attach_scanner()
711 dev->sfd = sfd; in attach_scanner()
714 if (leo_identify_scanner (dev) == SANE_FALSE) in attach_scanner()
718 leo_free (dev); in attach_scanner()
722 leo_close (dev); in attach_scanner()
725 dev->sane.name = dev->devicename; in attach_scanner()
726 dev->sane.vendor = dev->def->real_vendor; in attach_scanner()
727 dev->sane.model = dev->def->real_product; in attach_scanner()
728 dev->sane.type = "flatbed scanner"; in attach_scanner()
731 dev->next = first_dev; in attach_scanner()
732 first_dev = dev; in attach_scanner()
736 *devp = dev; in attach_scanner()
747 attach_one (const char *dev) in attach_one() argument
749 attach_scanner (dev, NULL); in attach_one()
755 leo_init_options (Leo_Scanner * dev) in leo_init_options() argument
760 memset (dev->opt, 0, sizeof (dev->opt)); in leo_init_options()
761 memset (dev->val, 0, sizeof (dev->val)); in leo_init_options()
765 dev->opt[i].size = sizeof (SANE_Word); in leo_init_options()
766 dev->opt[i].cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT; in leo_init_options()
770 dev->opt[OPT_NUM_OPTS].name = ""; in leo_init_options()
771 dev->opt[OPT_NUM_OPTS].title = SANE_TITLE_NUM_OPTIONS; in leo_init_options()
772 dev->opt[OPT_NUM_OPTS].desc = SANE_DESC_NUM_OPTIONS; in leo_init_options()
773 dev->opt[OPT_NUM_OPTS].type = SANE_TYPE_INT; in leo_init_options()
774 dev->opt[OPT_NUM_OPTS].cap = SANE_CAP_SOFT_DETECT; in leo_init_options()
775 dev->val[OPT_NUM_OPTS].w = OPT_NUM_OPTIONS; in leo_init_options()
778 dev->opt[OPT_MODE_GROUP].title = SANE_I18N ("Scan mode"); in leo_init_options()
779 dev->opt[OPT_MODE_GROUP].desc = ""; /* not valid for a group */ in leo_init_options()
780 dev->opt[OPT_MODE_GROUP].type = SANE_TYPE_GROUP; in leo_init_options()
781 dev->opt[OPT_MODE_GROUP].cap = 0; in leo_init_options()
782 dev->opt[OPT_MODE_GROUP].size = 0; in leo_init_options()
783 dev->opt[OPT_MODE_GROUP].constraint_type = SANE_CONSTRAINT_NONE; in leo_init_options()
786 dev->opt[OPT_MODE].name = SANE_NAME_SCAN_MODE; in leo_init_options()
787 dev->opt[OPT_MODE].title = SANE_TITLE_SCAN_MODE; in leo_init_options()
788 dev->opt[OPT_MODE].desc = SANE_DESC_SCAN_MODE; in leo_init_options()
789 dev->opt[OPT_MODE].type = SANE_TYPE_STRING; in leo_init_options()
790 dev->opt[OPT_MODE].size = max_string_size (scan_mode_list); in leo_init_options()
791 dev->opt[OPT_MODE].constraint_type = SANE_CONSTRAINT_STRING_LIST; in leo_init_options()
792 dev->opt[OPT_MODE].constraint.string_list = scan_mode_list; in leo_init_options()
793 dev->val[OPT_MODE].s = (SANE_Char *) strdup (""); /* will be set later */ in leo_init_options()
796 dev->opt[OPT_RESOLUTION].name = SANE_NAME_SCAN_RESOLUTION; in leo_init_options()
797 dev->opt[OPT_RESOLUTION].title = SANE_TITLE_SCAN_RESOLUTION; in leo_init_options()
798 dev->opt[OPT_RESOLUTION].desc = SANE_DESC_SCAN_RESOLUTION; in leo_init_options()
799 dev->opt[OPT_RESOLUTION].type = SANE_TYPE_INT; in leo_init_options()
800 dev->opt[OPT_RESOLUTION].unit = SANE_UNIT_DPI; in leo_init_options()
801 dev->opt[OPT_RESOLUTION].constraint_type = SANE_CONSTRAINT_RANGE; in leo_init_options()
802 dev->opt[OPT_RESOLUTION].constraint.range = &dev->res_range; in leo_init_options()
803 dev->val[OPT_RESOLUTION].w = dev->res_range.max / 2; in leo_init_options()
806 dev->opt[OPT_HALFTONE_PATTERN].name = SANE_NAME_HALFTONE_PATTERN; in leo_init_options()
807 dev->opt[OPT_HALFTONE_PATTERN].title = SANE_TITLE_HALFTONE_PATTERN; in leo_init_options()
808 dev->opt[OPT_HALFTONE_PATTERN].desc = SANE_DESC_HALFTONE_PATTERN; in leo_init_options()
809 dev->opt[OPT_HALFTONE_PATTERN].type = SANE_TYPE_STRING; in leo_init_options()
810 dev->opt[OPT_HALFTONE_PATTERN].size = in leo_init_options()
812 dev->opt[OPT_HALFTONE_PATTERN].cap |= SANE_CAP_INACTIVE; in leo_init_options()
813 dev->opt[OPT_HALFTONE_PATTERN].constraint_type = in leo_init_options()
815 dev->opt[OPT_HALFTONE_PATTERN].constraint.string_list = in leo_init_options()
817 dev->val[OPT_HALFTONE_PATTERN].s = strdup (halftone_pattern_list[0]); in leo_init_options()
820 dev->opt[OPT_GEOMETRY_GROUP].title = SANE_I18N ("Geometry"); in leo_init_options()
821 dev->opt[OPT_GEOMETRY_GROUP].desc = ""; /* not valid for a group */ in leo_init_options()
822 dev->opt[OPT_GEOMETRY_GROUP].type = SANE_TYPE_GROUP; in leo_init_options()
823 dev->opt[OPT_GEOMETRY_GROUP].cap = 0; in leo_init_options()
824 dev->opt[OPT_GEOMETRY_GROUP].size = 0; in leo_init_options()
825 dev->opt[OPT_GEOMETRY_GROUP].constraint_type = SANE_CONSTRAINT_NONE; in leo_init_options()
828 dev->opt[OPT_TL_X].name = SANE_NAME_SCAN_TL_X; in leo_init_options()
829 dev->opt[OPT_TL_X].title = SANE_TITLE_SCAN_TL_X; in leo_init_options()
830 dev->opt[OPT_TL_X].desc = SANE_DESC_SCAN_TL_X; in leo_init_options()
831 dev->opt[OPT_TL_X].type = SANE_TYPE_FIXED; in leo_init_options()
832 dev->opt[OPT_TL_X].unit = SANE_UNIT_MM; in leo_init_options()
833 dev->opt[OPT_TL_X].constraint_type = SANE_CONSTRAINT_RANGE; in leo_init_options()
834 dev->opt[OPT_TL_X].constraint.range = &x_range; in leo_init_options()
835 dev->val[OPT_TL_X].w = x_range.min; in leo_init_options()
838 dev->opt[OPT_TL_Y].name = SANE_NAME_SCAN_TL_Y; in leo_init_options()
839 dev->opt[OPT_TL_Y].title = SANE_TITLE_SCAN_TL_Y; in leo_init_options()
840 dev->opt[OPT_TL_Y].desc = SANE_DESC_SCAN_TL_Y; in leo_init_options()
841 dev->opt[OPT_TL_Y].type = SANE_TYPE_FIXED; in leo_init_options()
842 dev->opt[OPT_TL_Y].unit = SANE_UNIT_MM; in leo_init_options()
843 dev->opt[OPT_TL_Y].constraint_type = SANE_CONSTRAINT_RANGE; in leo_init_options()
844 dev->opt[OPT_TL_Y].constraint.range = &y_range; in leo_init_options()
845 dev->val[OPT_TL_Y].w = y_range.min; in leo_init_options()
848 dev->opt[OPT_BR_X].name = SANE_NAME_SCAN_BR_X; in leo_init_options()
849 dev->opt[OPT_BR_X].title = SANE_TITLE_SCAN_BR_X; in leo_init_options()
850 dev->opt[OPT_BR_X].desc = SANE_DESC_SCAN_BR_X; in leo_init_options()
851 dev->opt[OPT_BR_X].type = SANE_TYPE_FIXED; in leo_init_options()
852 dev->opt[OPT_BR_X].unit = SANE_UNIT_MM; in leo_init_options()
853 dev->opt[OPT_BR_X].constraint_type = SANE_CONSTRAINT_RANGE; in leo_init_options()
854 dev->opt[OPT_BR_X].constraint.range = &x_range; in leo_init_options()
855 dev->val[OPT_BR_X].w = x_range.max; in leo_init_options()
858 dev->opt[OPT_BR_Y].name = SANE_NAME_SCAN_BR_Y; in leo_init_options()
859 dev->opt[OPT_BR_Y].title = SANE_TITLE_SCAN_BR_Y; in leo_init_options()
860 dev->opt[OPT_BR_Y].desc = SANE_DESC_SCAN_BR_Y; in leo_init_options()
861 dev->opt[OPT_BR_Y].type = SANE_TYPE_FIXED; in leo_init_options()
862 dev->opt[OPT_BR_Y].unit = SANE_UNIT_MM; in leo_init_options()
863 dev->opt[OPT_BR_Y].constraint_type = SANE_CONSTRAINT_RANGE; in leo_init_options()
864 dev->opt[OPT_BR_Y].constraint.range = &y_range; in leo_init_options()
865 dev->val[OPT_BR_Y].w = y_range.max; in leo_init_options()
868 dev->opt[OPT_ENHANCEMENT_GROUP].title = SANE_I18N ("Enhancement"); in leo_init_options()
869 dev->opt[OPT_ENHANCEMENT_GROUP].desc = ""; /* not valid for a group */ in leo_init_options()
870 dev->opt[OPT_ENHANCEMENT_GROUP].type = SANE_TYPE_GROUP; in leo_init_options()
871 dev->opt[OPT_ENHANCEMENT_GROUP].cap = SANE_CAP_ADVANCED; in leo_init_options()
872 dev->opt[OPT_ENHANCEMENT_GROUP].size = 0; in leo_init_options()
873 dev->opt[OPT_ENHANCEMENT_GROUP].constraint_type = SANE_CONSTRAINT_NONE; in leo_init_options()
876 dev->opt[OPT_CUSTOM_GAMMA].name = SANE_NAME_CUSTOM_GAMMA; in leo_init_options()
877 dev->opt[OPT_CUSTOM_GAMMA].title = SANE_TITLE_CUSTOM_GAMMA; in leo_init_options()
878 dev->opt[OPT_CUSTOM_GAMMA].desc = SANE_DESC_CUSTOM_GAMMA; in leo_init_options()
879 dev->opt[OPT_CUSTOM_GAMMA].type = SANE_TYPE_BOOL; in leo_init_options()
880 dev->opt[OPT_CUSTOM_GAMMA].cap |= SANE_CAP_INACTIVE; in leo_init_options()
881 dev->val[OPT_CUSTOM_GAMMA].w = SANE_FALSE; in leo_init_options()
884 dev->opt[OPT_GAMMA_VECTOR_R].name = SANE_NAME_GAMMA_VECTOR_R; in leo_init_options()
885 dev->opt[OPT_GAMMA_VECTOR_R].title = SANE_TITLE_GAMMA_VECTOR_R; in leo_init_options()
886 dev->opt[OPT_GAMMA_VECTOR_R].desc = SANE_DESC_GAMMA_VECTOR_R; in leo_init_options()
887 dev->opt[OPT_GAMMA_VECTOR_R].type = SANE_TYPE_INT; in leo_init_options()
888 dev->opt[OPT_GAMMA_VECTOR_R].cap |= SANE_CAP_INACTIVE; in leo_init_options()
889 dev->opt[OPT_GAMMA_VECTOR_R].unit = SANE_UNIT_NONE; in leo_init_options()
890 dev->opt[OPT_GAMMA_VECTOR_R].size = GAMMA_LENGTH * sizeof (SANE_Word); in leo_init_options()
891 dev->opt[OPT_GAMMA_VECTOR_R].constraint_type = SANE_CONSTRAINT_RANGE; in leo_init_options()
892 dev->opt[OPT_GAMMA_VECTOR_R].constraint.range = &gamma_range; in leo_init_options()
893 dev->val[OPT_GAMMA_VECTOR_R].wa = dev->gamma_R; in leo_init_options()
896 dev->opt[OPT_GAMMA_VECTOR_G].name = SANE_NAME_GAMMA_VECTOR_G; in leo_init_options()
897 dev->opt[OPT_GAMMA_VECTOR_G].title = SANE_TITLE_GAMMA_VECTOR_G; in leo_init_options()
898 dev->opt[OPT_GAMMA_VECTOR_G].desc = SANE_DESC_GAMMA_VECTOR_G; in leo_init_options()
899 dev->opt[OPT_GAMMA_VECTOR_G].type = SANE_TYPE_INT; in leo_init_options()
900 dev->opt[OPT_GAMMA_VECTOR_G].cap |= SANE_CAP_INACTIVE; in leo_init_options()
901 dev->opt[OPT_GAMMA_VECTOR_G].unit = SANE_UNIT_NONE; in leo_init_options()
902 dev->opt[OPT_GAMMA_VECTOR_G].size = GAMMA_LENGTH * sizeof (SANE_Word); in leo_init_options()
903 dev->opt[OPT_GAMMA_VECTOR_G].constraint_type = SANE_CONSTRAINT_RANGE; in leo_init_options()
904 dev->opt[OPT_GAMMA_VECTOR_G].constraint.range = &gamma_range; in leo_init_options()
905 dev->val[OPT_GAMMA_VECTOR_G].wa = dev->gamma_G; in leo_init_options()
908 dev->opt[OPT_GAMMA_VECTOR_B].name = SANE_NAME_GAMMA_VECTOR_B; in leo_init_options()
909 dev->opt[OPT_GAMMA_VECTOR_B].title = SANE_TITLE_GAMMA_VECTOR_B; in leo_init_options()
910 dev->opt[OPT_GAMMA_VECTOR_B].desc = SANE_DESC_GAMMA_VECTOR_B; in leo_init_options()
911 dev->opt[OPT_GAMMA_VECTOR_B].type = SANE_TYPE_INT; in leo_init_options()
912 dev->opt[OPT_GAMMA_VECTOR_B].cap |= SANE_CAP_INACTIVE; in leo_init_options()
913 dev->opt[OPT_GAMMA_VECTOR_B].unit = SANE_UNIT_NONE; in leo_init_options()
914 dev->opt[OPT_GAMMA_VECTOR_B].size = GAMMA_LENGTH * sizeof (SANE_Word); in leo_init_options()
915 dev->opt[OPT_GAMMA_VECTOR_B].constraint_type = SANE_CONSTRAINT_RANGE; in leo_init_options()
916 dev->opt[OPT_GAMMA_VECTOR_B].constraint.range = &gamma_range; in leo_init_options()
917 dev->val[OPT_GAMMA_VECTOR_B].wa = dev->gamma_B; in leo_init_options()
920 dev->opt[OPT_GAMMA_VECTOR_GRAY].name = SANE_NAME_GAMMA_VECTOR; in leo_init_options()
921 dev->opt[OPT_GAMMA_VECTOR_GRAY].title = SANE_TITLE_GAMMA_VECTOR; in leo_init_options()
922 dev->opt[OPT_GAMMA_VECTOR_GRAY].desc = SANE_DESC_GAMMA_VECTOR; in leo_init_options()
923 dev->opt[OPT_GAMMA_VECTOR_GRAY].type = SANE_TYPE_INT; in leo_init_options()
924 dev->opt[OPT_GAMMA_VECTOR_GRAY].cap |= SANE_CAP_INACTIVE; in leo_init_options()
925 dev->opt[OPT_GAMMA_VECTOR_GRAY].unit = SANE_UNIT_NONE; in leo_init_options()
926 dev->opt[OPT_GAMMA_VECTOR_GRAY].size = GAMMA_LENGTH * sizeof (SANE_Word); in leo_init_options()
927 dev->opt[OPT_GAMMA_VECTOR_GRAY].constraint_type = SANE_CONSTRAINT_RANGE; in leo_init_options()
928 dev->opt[OPT_GAMMA_VECTOR_GRAY].constraint.range = &gamma_range; in leo_init_options()
929 dev->val[OPT_GAMMA_VECTOR_GRAY].wa = dev->gamma_GRAY; in leo_init_options()
932 dev->opt[OPT_PREVIEW].name = SANE_NAME_PREVIEW; in leo_init_options()
933 dev->opt[OPT_PREVIEW].title = SANE_TITLE_PREVIEW; in leo_init_options()
934 dev->opt[OPT_PREVIEW].desc = SANE_DESC_PREVIEW; in leo_init_options()
935 dev->opt[OPT_PREVIEW].type = SANE_TYPE_BOOL; in leo_init_options()
936 dev->opt[OPT_PREVIEW].cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT; in leo_init_options()
937 dev->val[OPT_PREVIEW].w = SANE_FALSE; in leo_init_options()
941 sane_control_option (dev, OPT_MODE, SANE_ACTION_SET_VALUE, in leo_init_options()
949 leo_wait_scanner (Leo_Scanner * dev) in leo_wait_scanner() argument
966 status = sanei_scsi_cmd2 (dev->sfd, cdb.data, cdb.len, in leo_wait_scanner()
983 leo_fill_image (Leo_Scanner * dev) in leo_fill_image() argument
992 assert (dev->image_begin == dev->image_end); in leo_fill_image()
993 assert (dev->real_bytes_left > 0); in leo_fill_image()
995 dev->image_begin = 0; in leo_fill_image()
996 dev->image_end = 0; in leo_fill_image()
998 while (dev->real_bytes_left) in leo_fill_image()
1006 status = get_filled_data_length (dev, &size); in leo_fill_image()
1013 if (size > dev->real_bytes_left) in leo_fill_image()
1014 size = dev->real_bytes_left; in leo_fill_image()
1015 if (size > dev->image_size - dev->image_end) in leo_fill_image()
1016 size = dev->image_size - dev->image_end; in leo_fill_image()
1023 size = size - (size % dev->params.bytes_per_line); in leo_fill_image()
1029 assert (dev->image_end != 0); in leo_fill_image()
1034 (long) size, dev->params.bytes_per_line); in leo_fill_image()
1040 image = dev->image + dev->image_end; in leo_fill_image()
1042 status = sanei_scsi_cmd2 (dev->sfd, cdb.data, cdb.len, in leo_fill_image()
1052 if (dev->scan_mode == LEO_COLOR) in leo_fill_image()
1058 int nb_lines = size / dev->params.bytes_per_line; in leo_fill_image()
1064 unsigned char *dest = dev->buffer; in leo_fill_image()
1066 for (j = 0; j < dev->params.pixels_per_line; j++) in leo_fill_image()
1068 *dest = src[j + 0 * dev->params.pixels_per_line]; in leo_fill_image()
1070 *dest = src[j + 1 * dev->params.pixels_per_line]; in leo_fill_image()
1072 *dest = src[j + 2 * dev->params.pixels_per_line]; in leo_fill_image()
1077 memcpy (src, dev->buffer, dev->params.bytes_per_line); in leo_fill_image()
1079 src += dev->params.bytes_per_line; in leo_fill_image()
1083 dev->image_end += size; in leo_fill_image()
1084 dev->real_bytes_left -= size; in leo_fill_image()
1087 (long) dev->real_bytes_left); in leo_fill_image()
1099 leo_copy_raw_to_frontend (Leo_Scanner * dev, SANE_Byte * buf, size_t * len) in leo_copy_raw_to_frontend() argument
1103 size = dev->image_end - dev->image_begin; in leo_copy_raw_to_frontend()
1110 memcpy (buf, dev->image + dev->image_begin, size); in leo_copy_raw_to_frontend()
1112 dev->image_begin += size; in leo_copy_raw_to_frontend()
1117 do_cancel (Leo_Scanner * dev) in do_cancel() argument
1121 if (dev->scanning == SANE_TRUE) in do_cancel()
1125 dev->x_tl = 0; in do_cancel()
1126 dev->x_tl = 0; in do_cancel()
1127 dev->width = 0; in do_cancel()
1128 dev->length = 0; in do_cancel()
1129 leo_set_window (dev); in do_cancel()
1131 leo_scan (dev); in do_cancel()
1133 leo_close (dev); in do_cancel()
1136 dev->scanning = SANE_FALSE; in do_cancel()
1181 leo_send_gamma (Leo_Scanner * dev) in leo_send_gamma() argument
1201 if (dev->val[OPT_CUSTOM_GAMMA].w) in leo_send_gamma()
1204 if (dev->scan_mode == LEO_GRAYSCALE) in leo_send_gamma()
1209 param.gamma_R[i] = dev->gamma_GRAY[i]; in leo_send_gamma()
1219 param.gamma_R[i] = dev->gamma_R[i]; in leo_send_gamma()
1220 param.gamma_G[i] = dev->gamma_G[i]; in leo_send_gamma()
1221 param.gamma_B[i] = dev->gamma_B[i]; in leo_send_gamma()
1237 status = sanei_scsi_cmd2 (dev->sfd, cdb.data, cdb.len, in leo_send_gamma()
1247 leo_send_halftone_pattern (Leo_Scanner * dev) in leo_send_halftone_pattern() argument
1257 if (dev->scan_mode == LEO_HALFTONE) in leo_send_halftone_pattern()
1261 dev->val[OPT_HALFTONE_PATTERN].s); in leo_send_halftone_pattern()
1272 status = sanei_scsi_cmd2 (dev->sfd, cdb.data, cdb.len, in leo_send_halftone_pattern()
1312 /* default to /dev/scanner instead of insisting on config file */ in sane_init()
1313 attach_scanner ("/dev/scanner", 0); in sane_init()
1339 Leo_Scanner *dev; in sane_get_devices() local
1352 for (dev = first_dev; i < num_devices; dev = dev->next) in sane_get_devices()
1353 devlist[i++] = &dev->sane; in sane_get_devices()
1366 Leo_Scanner *dev; in sane_open() local
1376 for (dev = first_dev; dev; dev = dev->next) in sane_open()
1378 if (strcmp (dev->sane.name, devicename) == 0) in sane_open()
1384 if (!dev) in sane_open()
1386 status = attach_scanner (devicename, &dev); in sane_open()
1396 dev = first_dev; /* empty devicename -> use first device */ in sane_open()
1399 if (!dev) in sane_open()
1406 leo_init_options (dev); in sane_open()
1409 memcpy (dev->gamma_R, gamma_init, dev->opt[OPT_GAMMA_VECTOR_R].size); in sane_open()
1410 memcpy (dev->gamma_G, gamma_init, dev->opt[OPT_GAMMA_VECTOR_G].size); in sane_open()
1411 memcpy (dev->gamma_B, gamma_init, dev->opt[OPT_GAMMA_VECTOR_B].size); in sane_open()
1412 memcpy (dev->gamma_GRAY, gamma_init, dev->opt[OPT_GAMMA_VECTOR_GRAY].size); in sane_open()
1414 *handle = dev; in sane_open()
1424 Leo_Scanner *dev = handle; in sane_get_option_descriptor() local
1435 return dev->opt + option; in sane_get_option_descriptor()
1442 Leo_Scanner *dev = handle; in sane_control_option() local
1455 if (dev->scanning) in sane_control_option()
1465 cap = dev->opt[option].cap; in sane_control_option()
1485 *(SANE_Word *) val = dev->val[option].w; in sane_control_option()
1491 strcpy (val, dev->val[option].s); in sane_control_option()
1499 memcpy (val, dev->val[option].wa, dev->opt[option].size); in sane_control_option()
1515 status = sanei_constrain_value (dev->opt + option, val, info); in sane_control_option()
1535 dev->val[option].w = *(SANE_Word *) val; in sane_control_option()
1540 dev->val[option].w = *(SANE_Word *) val; in sane_control_option()
1545 if (strcmp (dev->val[option].s, val) == 0) in sane_control_option()
1548 free (dev->val[OPT_MODE].s); in sane_control_option()
1549 dev->val[OPT_MODE].s = (SANE_Char *) strdup (val); in sane_control_option()
1551 dev->opt[OPT_CUSTOM_GAMMA].cap |= SANE_CAP_INACTIVE; in sane_control_option()
1552 dev->opt[OPT_GAMMA_VECTOR_R].cap |= SANE_CAP_INACTIVE; in sane_control_option()
1553 dev->opt[OPT_GAMMA_VECTOR_G].cap |= SANE_CAP_INACTIVE; in sane_control_option()
1554 dev->opt[OPT_GAMMA_VECTOR_B].cap |= SANE_CAP_INACTIVE; in sane_control_option()
1555 dev->opt[OPT_GAMMA_VECTOR_GRAY].cap |= SANE_CAP_INACTIVE; in sane_control_option()
1556 dev->opt[OPT_HALFTONE_PATTERN].cap |= SANE_CAP_INACTIVE; in sane_control_option()
1558 if (strcmp (dev->val[OPT_MODE].s, BLACK_WHITE_STR) == 0) in sane_control_option()
1561 dev->val[OPT_HALFTONE_PATTERN].s); in sane_control_option()
1564 dev->scan_mode = LEO_BW; in sane_control_option()
1568 dev->scan_mode = LEO_HALFTONE; in sane_control_option()
1570 dev->depth = 1; in sane_control_option()
1571 dev->opt[OPT_HALFTONE_PATTERN].cap &= ~SANE_CAP_INACTIVE; in sane_control_option()
1573 else if (strcmp (dev->val[OPT_MODE].s, GRAY_STR) == 0) in sane_control_option()
1575 dev->scan_mode = LEO_GRAYSCALE; in sane_control_option()
1576 dev->depth = 8; in sane_control_option()
1577 dev->opt[OPT_CUSTOM_GAMMA].cap &= ~SANE_CAP_INACTIVE; in sane_control_option()
1578 if (dev->val[OPT_CUSTOM_GAMMA].w) in sane_control_option()
1580 dev->opt[OPT_GAMMA_VECTOR_GRAY].cap &= ~SANE_CAP_INACTIVE; in sane_control_option()
1583 else if (strcmp (dev->val[OPT_MODE].s, COLOR_STR) == 0) in sane_control_option()
1585 dev->scan_mode = LEO_COLOR; in sane_control_option()
1586 dev->depth = 8; in sane_control_option()
1587 dev->opt[OPT_CUSTOM_GAMMA].cap &= ~SANE_CAP_INACTIVE; in sane_control_option()
1588 if (dev->val[OPT_CUSTOM_GAMMA].w) in sane_control_option()
1590 dev->opt[OPT_GAMMA_VECTOR_R].cap &= ~SANE_CAP_INACTIVE; in sane_control_option()
1591 dev->opt[OPT_GAMMA_VECTOR_G].cap &= ~SANE_CAP_INACTIVE; in sane_control_option()
1592 dev->opt[OPT_GAMMA_VECTOR_B].cap &= ~SANE_CAP_INACTIVE; in sane_control_option()
1603 free (dev->val[option].s); in sane_control_option()
1604 dev->val[option].s = (SANE_String) strdup (val); in sane_control_option()
1606 dev->val[OPT_HALFTONE_PATTERN].s); in sane_control_option()
1609 dev->scan_mode = LEO_BW; in sane_control_option()
1613 dev->scan_mode = LEO_HALFTONE; in sane_control_option()
1622 memcpy (dev->val[option].wa, val, dev->opt[option].size); in sane_control_option()
1626 dev->val[OPT_CUSTOM_GAMMA].w = *(SANE_Word *) val; in sane_control_option()
1627 if (dev->val[OPT_CUSTOM_GAMMA].w) in sane_control_option()
1630 if (dev->scan_mode == LEO_GRAYSCALE) in sane_control_option()
1632 dev->opt[OPT_GAMMA_VECTOR_GRAY].cap &= ~SANE_CAP_INACTIVE; in sane_control_option()
1637 dev->opt[OPT_GAMMA_VECTOR_R].cap &= ~SANE_CAP_INACTIVE; in sane_control_option()
1638 dev->opt[OPT_GAMMA_VECTOR_G].cap &= ~SANE_CAP_INACTIVE; in sane_control_option()
1639 dev->opt[OPT_GAMMA_VECTOR_B].cap &= ~SANE_CAP_INACTIVE; in sane_control_option()
1644 dev->opt[OPT_GAMMA_VECTOR_R].cap |= SANE_CAP_INACTIVE; in sane_control_option()
1645 dev->opt[OPT_GAMMA_VECTOR_G].cap |= SANE_CAP_INACTIVE; in sane_control_option()
1646 dev->opt[OPT_GAMMA_VECTOR_B].cap |= SANE_CAP_INACTIVE; in sane_control_option()
1647 dev->opt[OPT_GAMMA_VECTOR_GRAY].cap |= SANE_CAP_INACTIVE; in sane_control_option()
1668 Leo_Scanner *dev = handle; in sane_get_parameters() local
1672 if (!(dev->scanning)) in sane_get_parameters()
1677 if (dev->val[OPT_PREVIEW].w == SANE_TRUE) in sane_get_parameters()
1679 dev->x_resolution = 28; in sane_get_parameters()
1680 dev->y_resolution = 28; in sane_get_parameters()
1681 dev->x_tl = 0; in sane_get_parameters()
1682 dev->y_tl = 0; in sane_get_parameters()
1683 dev->x_br = mmToIlu (SANE_UNFIX (x_range.max)); in sane_get_parameters()
1684 dev->y_br = mmToIlu (SANE_UNFIX (y_range.max)); in sane_get_parameters()
1688 dev->x_resolution = dev->val[OPT_RESOLUTION].w; in sane_get_parameters()
1689 dev->y_resolution = dev->val[OPT_RESOLUTION].w; in sane_get_parameters()
1690 dev->x_tl = mmToIlu (SANE_UNFIX (dev->val[OPT_TL_X].w)); in sane_get_parameters()
1691 dev->y_tl = mmToIlu (SANE_UNFIX (dev->val[OPT_TL_Y].w)); in sane_get_parameters()
1692 dev->x_br = mmToIlu (SANE_UNFIX (dev->val[OPT_BR_X].w)); in sane_get_parameters()
1693 dev->y_br = mmToIlu (SANE_UNFIX (dev->val[OPT_BR_Y].w)); in sane_get_parameters()
1697 if (dev->x_tl > dev->x_br) in sane_get_parameters()
1700 s = dev->x_tl; in sane_get_parameters()
1701 dev->x_tl = dev->x_br; in sane_get_parameters()
1702 dev->x_br = s; in sane_get_parameters()
1704 if (dev->y_tl > dev->y_br) in sane_get_parameters()
1707 s = dev->y_tl; in sane_get_parameters()
1708 dev->y_tl = dev->y_br; in sane_get_parameters()
1709 dev->y_br = s; in sane_get_parameters()
1712 dev->width = dev->x_br - dev->x_tl; in sane_get_parameters()
1713 dev->length = dev->y_br - dev->y_tl; in sane_get_parameters()
1716 memset (&dev->params, 0, sizeof (SANE_Parameters)); in sane_get_parameters()
1718 dev->params.last_frame = SANE_TRUE; in sane_get_parameters()
1720 switch (dev->scan_mode) in sane_get_parameters()
1724 dev->params.format = SANE_FRAME_GRAY; in sane_get_parameters()
1725 dev->params.pixels_per_line = dev->width & ~0x7; in sane_get_parameters()
1726 dev->params.bytes_per_line = dev->params.pixels_per_line / 8; in sane_get_parameters()
1727 dev->params.depth = 1; in sane_get_parameters()
1730 dev->params.format = SANE_FRAME_GRAY; in sane_get_parameters()
1731 dev->params.pixels_per_line = dev->width; in sane_get_parameters()
1732 dev->params.bytes_per_line = dev->params.pixels_per_line; in sane_get_parameters()
1733 dev->params.depth = 8; in sane_get_parameters()
1736 dev->params.format = SANE_FRAME_RGB; in sane_get_parameters()
1737 dev->params.pixels_per_line = dev->width; in sane_get_parameters()
1738 dev->params.bytes_per_line = dev->params.pixels_per_line * 3; in sane_get_parameters()
1739 dev->params.depth = 8; in sane_get_parameters()
1743 dev->params.lines = dev->length; in sane_get_parameters()
1749 *params = (dev->params); in sane_get_parameters()
1760 Leo_Scanner *dev = handle; in sane_start() local
1765 if (!(dev->scanning)) in sane_start()
1768 sane_get_parameters (dev, NULL); in sane_start()
1772 (dev->devicename, &(dev->sfd), leo_sense_handler, dev) != 0) in sane_start()
1779 status = leo_wait_scanner (dev); in sane_start()
1782 leo_close (dev); in sane_start()
1786 status = leo_set_window (dev); in sane_start()
1789 leo_close (dev); in sane_start()
1793 status = leo_send_gamma (dev); in sane_start()
1796 leo_close (dev); in sane_start()
1800 status = leo_send_halftone_pattern (dev); in sane_start()
1803 leo_close (dev); in sane_start()
1807 status = leo_scan (dev); in sane_start()
1810 leo_close (dev); in sane_start()
1814 status = leo_wait_scanner (dev); in sane_start()
1817 leo_close (dev); in sane_start()
1821 status = leo_get_scan_size (dev); in sane_start()
1824 leo_close (dev); in sane_start()
1830 dev->image_end = 0; in sane_start()
1831 dev->image_begin = 0; in sane_start()
1833 dev->bytes_left = dev->params.bytes_per_line * dev->params.lines; in sane_start()
1834 dev->real_bytes_left = dev->params.bytes_per_line * dev->params.lines; in sane_start()
1836 dev->scanning = SANE_TRUE; in sane_start()
1848 Leo_Scanner *dev = handle; in sane_read() local
1856 if (!(dev->scanning)) in sane_read()
1859 return do_cancel (dev); in sane_read()
1862 if (dev->bytes_left <= 0) in sane_read()
1871 if (dev->image_begin == dev->image_end) in sane_read()
1874 status = leo_fill_image (dev); in sane_read()
1882 if (dev->image_begin == dev->image_end) in sane_read()
1890 if (size > dev->bytes_left) in sane_read()
1892 size = dev->bytes_left; in sane_read()
1894 leo_copy_raw_to_frontend (dev, buf + buf_offset, &size); in sane_read()
1898 dev->bytes_left -= size; in sane_read()
1902 while ((buf_offset != max_len) && dev->bytes_left); in sane_read()
1905 (long) dev->bytes_left); in sane_read()
1914 Leo_Scanner *dev = handle; in sane_set_io_mode() local
1918 if (!dev->scanning) in sane_set_io_mode()
1950 Leo_Scanner *dev = handle; in sane_cancel() local
1954 do_cancel (dev); in sane_cancel()
1962 Leo_Scanner *dev = handle; in sane_close() local
1967 do_cancel (dev); in sane_close()
1968 leo_close (dev); in sane_close()
1970 /* Unlink dev. */ in sane_close()
1971 if (first_dev == dev) in sane_close()
1973 first_dev = dev->next; in sane_close()
1978 while (dev_tmp->next && dev_tmp->next != dev) in sane_close()
1988 leo_free (dev); in sane_close()