• Home
  • Raw
  • Download

Lines Matching full:dev

255   Teco_Scanner *dev;  in teco_init()  local
260 dev = malloc (sizeof (Teco_Scanner)); in teco_init()
261 if (dev == NULL) in teco_init()
266 memset (dev, 0, sizeof (Teco_Scanner)); in teco_init()
269 dev->buffer_size = 64 * 1024; in teco_init()
270 dev->buffer = malloc (dev->buffer_size); in teco_init()
271 if (dev->buffer == NULL) in teco_init()
273 free (dev); in teco_init()
277 dev->sfd = -1; in teco_init()
281 return (dev); in teco_init()
286 teco_close (Teco_Scanner * dev) in teco_close() argument
290 if (dev->sfd != -1) in teco_close()
292 sanei_scsi_close (dev->sfd); in teco_close()
293 dev->sfd = -1; in teco_close()
301 teco_free (Teco_Scanner * dev) in teco_free() argument
307 if (dev == NULL) in teco_free()
310 teco_close (dev); in teco_free()
311 if (dev->devicename) in teco_free()
313 free (dev->devicename); in teco_free()
315 if (dev->buffer) in teco_free()
317 free (dev->buffer); in teco_free()
319 if (dev->image) in teco_free()
321 free (dev->image); in teco_free()
325 if (dev->opt[i].type == SANE_TYPE_STRING && dev->val[i].s) in teco_free()
327 free (dev->val[i].s); in teco_free()
331 free (dev); in teco_free()
338 teco_identify_scanner (Teco_Scanner * dev) in teco_identify_scanner() argument
349 status = sanei_scsi_cmd2 (dev->sfd, cdb.data, cdb.len, in teco_identify_scanner()
350 NULL, 0, dev->buffer, &size); in teco_identify_scanner()
360 size = dev->buffer[4] + 5; /* total length of the inquiry data */ in teco_identify_scanner()
370 status = sanei_scsi_cmd2 (dev->sfd, cdb.data, cdb.len, in teco_identify_scanner()
371 NULL, 0, dev->buffer, &size); in teco_identify_scanner()
381 hexdump (DBG_info2, "inquiry", dev->buffer, size); in teco_identify_scanner()
383 dev->scsi_type = dev->buffer[0] & 0x1f; in teco_identify_scanner()
384 memcpy (dev->scsi_vendor, dev->buffer + 0x08, 0x08); in teco_identify_scanner()
385 dev->scsi_vendor[0x08] = 0; in teco_identify_scanner()
386 memcpy (dev->scsi_product, dev->buffer + 0x10, 0x010); in teco_identify_scanner()
387 dev->scsi_product[0x10] = 0; in teco_identify_scanner()
388 memcpy (dev->scsi_version, dev->buffer + 0x20, 0x04); in teco_identify_scanner()
389 dev->scsi_version[0x04] = 0; in teco_identify_scanner()
390 memcpy (dev->scsi_teco_name, dev->buffer + 0x2A, 0x0B); in teco_identify_scanner()
391 dev->scsi_teco_name[0x0B] = 0; in teco_identify_scanner()
394 dev->scsi_vendor, dev->scsi_product, dev->scsi_version, in teco_identify_scanner()
395 dev->scsi_teco_name); in teco_identify_scanner()
402 if (dev->scsi_type == scanners[i].scsi_type && in teco_identify_scanner()
403 strcmp (dev->scsi_teco_name, scanners[i].scsi_teco_name) == 0) in teco_identify_scanner()
408 dev->def = &(scanners[i]); in teco_identify_scanner()
462 teco_set_window (Teco_Scanner * dev) in teco_set_window() argument
473 switch (dev->def->tecoref) in teco_set_window()
491 Ito16 (dev->x_resolution, &window[10]); in teco_set_window()
492 Ito16 (dev->y_resolution, &window[12]); in teco_set_window()
495 Ito32 (dev->x_tl, &window[14]); in teco_set_window()
496 Ito32 (dev->y_tl, &window[18]); in teco_set_window()
499 Ito32 (dev->width, &window[22]); in teco_set_window()
500 Ito32 (dev->length, &window[26]); in teco_set_window()
503 switch (dev->scan_mode) in teco_set_window()
506 window[31] = dev->val[OPT_THRESHOLD].w; in teco_set_window()
508 i = get_string_list_index (dither_list, dev->val[OPT_DITHER].s); in teco_set_window()
522 window[34] = dev->depth; in teco_set_window()
527 switch (dev->def->tecoref) in teco_set_window()
541 status = sanei_scsi_cmd2 (dev->sfd, cdb.data, cdb.len, in teco_set_window()
551 teco_reset_window (Teco_Scanner * dev) in teco_reset_window() argument
561 status = sanei_scsi_cmd2 (dev->sfd, cdb.data, cdb.len, NULL, 0, NULL, NULL); in teco_reset_window()
570 get_filled_data_length (Teco_Scanner * dev, size_t * to_read) in get_filled_data_length() argument
582 status = sanei_scsi_cmd2 (dev->sfd, cdb.data, cdb.len, in get_filled_data_length()
583 NULL, 0, dev->buffer, &size); in get_filled_data_length()
592 hexdump (DBG_info2, "get_filled_data_length return", dev->buffer, size); in get_filled_data_length()
594 *to_read = B24TOI (&dev->buffer[9]); in get_filled_data_length()
597 dev->params.lines, B16TOI (&dev->buffer[12]), in get_filled_data_length()
598 dev->params.bytes_per_line, B16TOI (&dev->buffer[14])); in get_filled_data_length()
600 if (dev->real_bytes_left == 0) in get_filled_data_length()
605 B24TOI (&dev->buffer[6])); in get_filled_data_length()
608 dev->params.lines = B16TOI (&dev->buffer[12]); in get_filled_data_length()
609 dev->bytes_per_raster = B16TOI (&dev->buffer[14]); in get_filled_data_length()
611 switch (dev->scan_mode) in get_filled_data_length()
614 dev->params.bytes_per_line = B16TOI (&dev->buffer[14]); in get_filled_data_length()
615 dev->params.pixels_per_line = dev->params.bytes_per_line * 8; in get_filled_data_length()
619 dev->params.pixels_per_line = B16TOI (&dev->buffer[14]); in get_filled_data_length()
620 dev->params.bytes_per_line = dev->params.pixels_per_line; in get_filled_data_length()
624 dev->params.pixels_per_line = B16TOI (&dev->buffer[14]); in get_filled_data_length()
625 dev->params.bytes_per_line = dev->params.pixels_per_line * 3; in get_filled_data_length()
626 if (dev->buffer[17] == 0x07) in get_filled_data_length()
631 dev->does_color_shift = 1; in get_filled_data_length()
635 dev->does_color_shift = 0; in get_filled_data_length()
650 teco_scan (Teco_Scanner * dev) in teco_scan() argument
659 status = sanei_scsi_cmd2 (dev->sfd, cdb.data, cdb.len, NULL, 0, NULL, NULL); in teco_scan()
668 teco_vendor_spec (Teco_Scanner * dev) in teco_vendor_spec() argument
686 status = sanei_scsi_cmd2 (dev->sfd, cdb.data, cdb.len, in teco_vendor_spec()
687 NULL, 0, dev->buffer, &size); in teco_vendor_spec()
689 /*hexdump (DBG_info2, "calibration:", dev->buffer, size); */ in teco_vendor_spec()
699 status = sanei_scsi_cmd2 (dev->sfd, cdb.data, cdb.len, NULL, 0, NULL, NULL); in teco_vendor_spec()
706 teco_send_gamma (Teco_Scanner * dev) in teco_send_gamma() argument
727 if (dev->val[OPT_CUSTOM_GAMMA].w) in teco_send_gamma()
730 if (dev->scan_mode == TECO_GRAYSCALE) in teco_send_gamma()
736 param.gamma_G[i] = dev->gamma_GRAY[i]; in teco_send_gamma()
746 param.gamma_R[i] = dev->gamma_R[i]; in teco_send_gamma()
747 param.gamma_G[i] = dev->gamma_G[i]; in teco_send_gamma()
748 param.gamma_B[i] = dev->gamma_B[i]; in teco_send_gamma()
766 status = sanei_scsi_cmd2 (dev->sfd, cdb.data, cdb.len, in teco_send_gamma()
778 Teco_Scanner *dev; in attach_scanner() local
788 for (dev = first_dev; dev; dev = dev->next) in attach_scanner()
790 if (strcmp (dev->sane.name, devicename) == 0) in attach_scanner()
794 *devp = dev; in attach_scanner()
802 dev = teco_init (); in attach_scanner()
803 if (dev == NULL) in attach_scanner()
811 status = sanei_scsi_open (devicename, &sfd, teco_sense_handler, dev); in attach_scanner()
816 teco_free (dev); in attach_scanner()
821 dev->devicename = strdup (devicename); in attach_scanner()
822 dev->sfd = sfd; in attach_scanner()
825 if (teco_identify_scanner (dev) == SANE_FALSE) in attach_scanner()
829 teco_free (dev); in attach_scanner()
833 teco_close (dev); in attach_scanner()
836 dev->sane.name = dev->devicename; in attach_scanner()
837 dev->sane.vendor = dev->def->real_vendor; in attach_scanner()
838 dev->sane.model = dev->def->real_product; in attach_scanner()
839 dev->sane.type = "flatbed scanner"; in attach_scanner()
842 dev->next = first_dev; in attach_scanner()
843 first_dev = dev; in attach_scanner()
847 *devp = dev; in attach_scanner()
858 attach_one (const char *dev) in attach_one() argument
860 attach_scanner (dev, NULL); in attach_one()
866 teco_init_options (Teco_Scanner * dev) in teco_init_options() argument
871 memset (dev->opt, 0, sizeof (dev->opt)); in teco_init_options()
872 memset (dev->val, 0, sizeof (dev->val)); in teco_init_options()
876 dev->opt[i].size = sizeof (SANE_Word); in teco_init_options()
877 dev->opt[i].cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT; in teco_init_options()
881 dev->opt[OPT_NUM_OPTS].name = ""; in teco_init_options()
882 dev->opt[OPT_NUM_OPTS].title = SANE_TITLE_NUM_OPTIONS; in teco_init_options()
883 dev->opt[OPT_NUM_OPTS].desc = SANE_DESC_NUM_OPTIONS; in teco_init_options()
884 dev->opt[OPT_NUM_OPTS].type = SANE_TYPE_INT; in teco_init_options()
885 dev->opt[OPT_NUM_OPTS].cap = SANE_CAP_SOFT_DETECT; in teco_init_options()
886 dev->val[OPT_NUM_OPTS].w = OPT_NUM_OPTIONS; in teco_init_options()
889 dev->opt[OPT_MODE_GROUP].title = SANE_TITLE_SCAN_MODE; in teco_init_options()
890 dev->opt[OPT_MODE_GROUP].desc = ""; /* not valid for a group */ in teco_init_options()
891 dev->opt[OPT_MODE_GROUP].type = SANE_TYPE_GROUP; in teco_init_options()
892 dev->opt[OPT_MODE_GROUP].cap = 0; in teco_init_options()
893 dev->opt[OPT_MODE_GROUP].size = 0; in teco_init_options()
894 dev->opt[OPT_MODE_GROUP].constraint_type = SANE_CONSTRAINT_NONE; in teco_init_options()
897 dev->opt[OPT_MODE].name = SANE_NAME_SCAN_MODE; in teco_init_options()
898 dev->opt[OPT_MODE].title = SANE_TITLE_SCAN_MODE; in teco_init_options()
899 dev->opt[OPT_MODE].desc = SANE_DESC_SCAN_MODE; in teco_init_options()
900 dev->opt[OPT_MODE].type = SANE_TYPE_STRING; in teco_init_options()
901 dev->opt[OPT_MODE].size = max_string_size (scan_mode_list); in teco_init_options()
902 dev->opt[OPT_MODE].constraint_type = SANE_CONSTRAINT_STRING_LIST; in teco_init_options()
903 dev->opt[OPT_MODE].constraint.string_list = scan_mode_list; in teco_init_options()
904 dev->val[OPT_MODE].s = (SANE_Char *) strdup (""); /* will be set later */ in teco_init_options()
907 dev->opt[OPT_RESOLUTION].name = SANE_NAME_SCAN_RESOLUTION; in teco_init_options()
908 dev->opt[OPT_RESOLUTION].title = SANE_TITLE_SCAN_RESOLUTION; in teco_init_options()
909 dev->opt[OPT_RESOLUTION].desc = SANE_DESC_SCAN_RESOLUTION; in teco_init_options()
910 dev->opt[OPT_RESOLUTION].type = SANE_TYPE_INT; in teco_init_options()
911 dev->opt[OPT_RESOLUTION].unit = SANE_UNIT_DPI; in teco_init_options()
912 dev->opt[OPT_RESOLUTION].constraint_type = SANE_CONSTRAINT_RANGE; in teco_init_options()
913 dev->opt[OPT_RESOLUTION].constraint.range = &dev->def->res_range; in teco_init_options()
914 dev->val[OPT_RESOLUTION].w = 100; in teco_init_options()
917 dev->opt[OPT_GEOMETRY_GROUP].title = SANE_I18N ("Geometry"); in teco_init_options()
918 dev->opt[OPT_GEOMETRY_GROUP].desc = ""; /* not valid for a group */ in teco_init_options()
919 dev->opt[OPT_GEOMETRY_GROUP].type = SANE_TYPE_GROUP; in teco_init_options()
920 dev->opt[OPT_GEOMETRY_GROUP].cap = 0; in teco_init_options()
921 dev->opt[OPT_GEOMETRY_GROUP].size = 0; in teco_init_options()
922 dev->opt[OPT_GEOMETRY_GROUP].constraint_type = SANE_CONSTRAINT_NONE; in teco_init_options()
925 dev->opt[OPT_TL_X].name = SANE_NAME_SCAN_TL_X; in teco_init_options()
926 dev->opt[OPT_TL_X].title = SANE_TITLE_SCAN_TL_X; in teco_init_options()
927 dev->opt[OPT_TL_X].desc = SANE_DESC_SCAN_TL_X; in teco_init_options()
928 dev->opt[OPT_TL_X].type = SANE_TYPE_FIXED; in teco_init_options()
929 dev->opt[OPT_TL_X].unit = SANE_UNIT_MM; in teco_init_options()
930 dev->opt[OPT_TL_X].constraint_type = SANE_CONSTRAINT_RANGE; in teco_init_options()
931 dev->opt[OPT_TL_X].constraint.range = &x_range; in teco_init_options()
932 dev->val[OPT_TL_X].w = x_range.min; in teco_init_options()
935 dev->opt[OPT_TL_Y].name = SANE_NAME_SCAN_TL_Y; in teco_init_options()
936 dev->opt[OPT_TL_Y].title = SANE_TITLE_SCAN_TL_Y; in teco_init_options()
937 dev->opt[OPT_TL_Y].desc = SANE_DESC_SCAN_TL_Y; in teco_init_options()
938 dev->opt[OPT_TL_Y].type = SANE_TYPE_FIXED; in teco_init_options()
939 dev->opt[OPT_TL_Y].unit = SANE_UNIT_MM; in teco_init_options()
940 dev->opt[OPT_TL_Y].constraint_type = SANE_CONSTRAINT_RANGE; in teco_init_options()
941 dev->opt[OPT_TL_Y].constraint.range = &y_range; in teco_init_options()
942 dev->val[OPT_TL_Y].w = y_range.min; in teco_init_options()
945 dev->opt[OPT_BR_X].name = SANE_NAME_SCAN_BR_X; in teco_init_options()
946 dev->opt[OPT_BR_X].title = SANE_TITLE_SCAN_BR_X; in teco_init_options()
947 dev->opt[OPT_BR_X].desc = SANE_DESC_SCAN_BR_X; in teco_init_options()
948 dev->opt[OPT_BR_X].type = SANE_TYPE_FIXED; in teco_init_options()
949 dev->opt[OPT_BR_X].unit = SANE_UNIT_MM; in teco_init_options()
950 dev->opt[OPT_BR_X].constraint_type = SANE_CONSTRAINT_RANGE; in teco_init_options()
951 dev->opt[OPT_BR_X].constraint.range = &x_range; in teco_init_options()
952 dev->val[OPT_BR_X].w = x_range.max; in teco_init_options()
955 dev->opt[OPT_BR_Y].name = SANE_NAME_SCAN_BR_Y; in teco_init_options()
956 dev->opt[OPT_BR_Y].title = SANE_TITLE_SCAN_BR_Y; in teco_init_options()
957 dev->opt[OPT_BR_Y].desc = SANE_DESC_SCAN_BR_Y; in teco_init_options()
958 dev->opt[OPT_BR_Y].type = SANE_TYPE_FIXED; in teco_init_options()
959 dev->opt[OPT_BR_Y].unit = SANE_UNIT_MM; in teco_init_options()
960 dev->opt[OPT_BR_Y].constraint_type = SANE_CONSTRAINT_RANGE; in teco_init_options()
961 dev->opt[OPT_BR_Y].constraint.range = &y_range; in teco_init_options()
962 dev->val[OPT_BR_Y].w = y_range.max; in teco_init_options()
965 dev->opt[OPT_ENHANCEMENT_GROUP].title = SANE_I18N ("Enhancement"); in teco_init_options()
966 dev->opt[OPT_ENHANCEMENT_GROUP].desc = ""; /* not valid for a group */ in teco_init_options()
967 dev->opt[OPT_ENHANCEMENT_GROUP].type = SANE_TYPE_GROUP; in teco_init_options()
968 dev->opt[OPT_ENHANCEMENT_GROUP].cap = SANE_CAP_ADVANCED; in teco_init_options()
969 dev->opt[OPT_ENHANCEMENT_GROUP].size = 0; in teco_init_options()
970 dev->opt[OPT_ENHANCEMENT_GROUP].constraint_type = SANE_CONSTRAINT_NONE; in teco_init_options()
973 dev->opt[OPT_DITHER].name = "dither"; in teco_init_options()
974 dev->opt[OPT_DITHER].title = SANE_I18N ("Dither"); in teco_init_options()
975 dev->opt[OPT_DITHER].desc = SANE_I18N ("Dither"); in teco_init_options()
976 dev->opt[OPT_DITHER].type = SANE_TYPE_STRING; in teco_init_options()
977 dev->opt[OPT_DITHER].size = max_string_size (dither_list); in teco_init_options()
978 dev->opt[OPT_DITHER].cap |= SANE_CAP_INACTIVE; in teco_init_options()
979 dev->opt[OPT_DITHER].constraint_type = SANE_CONSTRAINT_STRING_LIST; in teco_init_options()
980 dev->opt[OPT_DITHER].constraint.string_list = dither_list; in teco_init_options()
981 dev->val[OPT_DITHER].s = strdup (dither_list[0]); in teco_init_options()
984 dev->opt[OPT_CUSTOM_GAMMA].name = SANE_NAME_CUSTOM_GAMMA; in teco_init_options()
985 dev->opt[OPT_CUSTOM_GAMMA].title = SANE_TITLE_CUSTOM_GAMMA; in teco_init_options()
986 dev->opt[OPT_CUSTOM_GAMMA].desc = SANE_DESC_CUSTOM_GAMMA; in teco_init_options()
987 dev->opt[OPT_CUSTOM_GAMMA].type = SANE_TYPE_BOOL; in teco_init_options()
988 dev->opt[OPT_CUSTOM_GAMMA].cap |= SANE_CAP_INACTIVE; in teco_init_options()
989 dev->val[OPT_CUSTOM_GAMMA].w = SANE_FALSE; in teco_init_options()
992 dev->opt[OPT_GAMMA_VECTOR_R].name = SANE_NAME_GAMMA_VECTOR_R; in teco_init_options()
993 dev->opt[OPT_GAMMA_VECTOR_R].title = SANE_TITLE_GAMMA_VECTOR_R; in teco_init_options()
994 dev->opt[OPT_GAMMA_VECTOR_R].desc = SANE_DESC_GAMMA_VECTOR_R; in teco_init_options()
995 dev->opt[OPT_GAMMA_VECTOR_R].type = SANE_TYPE_INT; in teco_init_options()
996 dev->opt[OPT_GAMMA_VECTOR_R].cap |= SANE_CAP_INACTIVE; in teco_init_options()
997 dev->opt[OPT_GAMMA_VECTOR_R].unit = SANE_UNIT_NONE; in teco_init_options()
998 dev->opt[OPT_GAMMA_VECTOR_R].size = GAMMA_LENGTH * sizeof (SANE_Word); in teco_init_options()
999 dev->opt[OPT_GAMMA_VECTOR_R].constraint_type = SANE_CONSTRAINT_RANGE; in teco_init_options()
1000 dev->opt[OPT_GAMMA_VECTOR_R].constraint.range = &gamma_range; in teco_init_options()
1001 dev->val[OPT_GAMMA_VECTOR_R].wa = dev->gamma_R; in teco_init_options()
1004 dev->opt[OPT_GAMMA_VECTOR_G].name = SANE_NAME_GAMMA_VECTOR_G; in teco_init_options()
1005 dev->opt[OPT_GAMMA_VECTOR_G].title = SANE_TITLE_GAMMA_VECTOR_G; in teco_init_options()
1006 dev->opt[OPT_GAMMA_VECTOR_G].desc = SANE_DESC_GAMMA_VECTOR_G; in teco_init_options()
1007 dev->opt[OPT_GAMMA_VECTOR_G].type = SANE_TYPE_INT; in teco_init_options()
1008 dev->opt[OPT_GAMMA_VECTOR_G].cap |= SANE_CAP_INACTIVE; in teco_init_options()
1009 dev->opt[OPT_GAMMA_VECTOR_G].unit = SANE_UNIT_NONE; in teco_init_options()
1010 dev->opt[OPT_GAMMA_VECTOR_G].size = GAMMA_LENGTH * sizeof (SANE_Word); in teco_init_options()
1011 dev->opt[OPT_GAMMA_VECTOR_G].constraint_type = SANE_CONSTRAINT_RANGE; in teco_init_options()
1012 dev->opt[OPT_GAMMA_VECTOR_G].constraint.range = &gamma_range; in teco_init_options()
1013 dev->val[OPT_GAMMA_VECTOR_G].wa = dev->gamma_G; in teco_init_options()
1016 dev->opt[OPT_GAMMA_VECTOR_B].name = SANE_NAME_GAMMA_VECTOR_B; in teco_init_options()
1017 dev->opt[OPT_GAMMA_VECTOR_B].title = SANE_TITLE_GAMMA_VECTOR_B; in teco_init_options()
1018 dev->opt[OPT_GAMMA_VECTOR_B].desc = SANE_DESC_GAMMA_VECTOR_B; in teco_init_options()
1019 dev->opt[OPT_GAMMA_VECTOR_B].type = SANE_TYPE_INT; in teco_init_options()
1020 dev->opt[OPT_GAMMA_VECTOR_B].cap |= SANE_CAP_INACTIVE; in teco_init_options()
1021 dev->opt[OPT_GAMMA_VECTOR_B].unit = SANE_UNIT_NONE; in teco_init_options()
1022 dev->opt[OPT_GAMMA_VECTOR_B].size = GAMMA_LENGTH * sizeof (SANE_Word); in teco_init_options()
1023 dev->opt[OPT_GAMMA_VECTOR_B].constraint_type = SANE_CONSTRAINT_RANGE; in teco_init_options()
1024 dev->opt[OPT_GAMMA_VECTOR_B].constraint.range = &gamma_range; in teco_init_options()
1025 dev->val[OPT_GAMMA_VECTOR_B].wa = dev->gamma_B; in teco_init_options()
1028 dev->opt[OPT_GAMMA_VECTOR_GRAY].name = SANE_NAME_GAMMA_VECTOR; in teco_init_options()
1029 dev->opt[OPT_GAMMA_VECTOR_GRAY].title = SANE_TITLE_GAMMA_VECTOR; in teco_init_options()
1030 dev->opt[OPT_GAMMA_VECTOR_GRAY].desc = SANE_DESC_GAMMA_VECTOR; in teco_init_options()
1031 dev->opt[OPT_GAMMA_VECTOR_GRAY].type = SANE_TYPE_INT; in teco_init_options()
1032 dev->opt[OPT_GAMMA_VECTOR_GRAY].cap |= SANE_CAP_INACTIVE; in teco_init_options()
1033 dev->opt[OPT_GAMMA_VECTOR_GRAY].unit = SANE_UNIT_NONE; in teco_init_options()
1034 dev->opt[OPT_GAMMA_VECTOR_GRAY].size = GAMMA_LENGTH * sizeof (SANE_Word); in teco_init_options()
1035 dev->opt[OPT_GAMMA_VECTOR_GRAY].constraint_type = SANE_CONSTRAINT_RANGE; in teco_init_options()
1036 dev->opt[OPT_GAMMA_VECTOR_GRAY].constraint.range = &gamma_range; in teco_init_options()
1037 dev->val[OPT_GAMMA_VECTOR_GRAY].wa = dev->gamma_GRAY; in teco_init_options()
1040 dev->opt[OPT_THRESHOLD].name = SANE_NAME_THRESHOLD; in teco_init_options()
1041 dev->opt[OPT_THRESHOLD].title = SANE_TITLE_THRESHOLD; in teco_init_options()
1042 dev->opt[OPT_THRESHOLD].desc = SANE_DESC_THRESHOLD; in teco_init_options()
1043 dev->opt[OPT_THRESHOLD].type = SANE_TYPE_INT; in teco_init_options()
1044 dev->opt[OPT_THRESHOLD].unit = SANE_UNIT_NONE; in teco_init_options()
1045 dev->opt[OPT_THRESHOLD].size = sizeof (SANE_Int); in teco_init_options()
1046 dev->opt[OPT_THRESHOLD].cap |= SANE_CAP_INACTIVE; in teco_init_options()
1047 dev->opt[OPT_THRESHOLD].constraint_type = SANE_CONSTRAINT_RANGE; in teco_init_options()
1048 dev->opt[OPT_THRESHOLD].constraint.range = &threshold_range; in teco_init_options()
1049 dev->val[OPT_THRESHOLD].w = 128; in teco_init_options()
1052 dev->opt[OPT_PREVIEW].name = SANE_NAME_PREVIEW; in teco_init_options()
1053 dev->opt[OPT_PREVIEW].title = SANE_TITLE_PREVIEW; in teco_init_options()
1054 dev->opt[OPT_PREVIEW].desc = SANE_DESC_PREVIEW; in teco_init_options()
1055 dev->opt[OPT_PREVIEW].type = SANE_TYPE_BOOL; in teco_init_options()
1056 dev->opt[OPT_PREVIEW].cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT; in teco_init_options()
1057 dev->val[OPT_PREVIEW].w = SANE_FALSE; in teco_init_options()
1061 sane_control_option (dev, OPT_MODE, SANE_ACTION_SET_VALUE, in teco_init_options()
1069 teco_wait_scanner (Teco_Scanner * dev) in teco_wait_scanner() argument
1086 status = sanei_scsi_cmd2 (dev->sfd, cdb.data, cdb.len, in teco_wait_scanner()
1105 teco_query_sense (Teco_Scanner * dev) in teco_query_sense() argument
1117 status = sanei_scsi_cmd2 (dev->sfd, cdb.data, cdb.len, NULL, 0, buf, &size); in teco_query_sense()
1139 * dev->buffer and write the output in dev->image. size_in the the
1140 * length of the valid data in dev->buffer. */
1147 #define line_shift ( - dev->color_shift)
1150 teco_adjust_raster (Teco_Scanner * dev, size_t size_in) in teco_adjust_raster() argument
1152 int nb_rasters; /* number of rasters in dev->buffer */ in teco_adjust_raster()
1161 assert (dev->scan_mode == TECO_COLOR); in teco_adjust_raster()
1162 assert ((size_in % dev->bytes_per_raster) == 0); in teco_adjust_raster()
1174 nb_rasters = size_in / dev->raster_size; in teco_adjust_raster()
1183 if (dev->raster_num < dev->color_shift) in teco_adjust_raster()
1186 line = dev->raster_num; in teco_adjust_raster()
1188 else if (dev->raster_num < (3 * dev->color_shift)) in teco_adjust_raster()
1191 if ((dev->raster_num - line_shift) % 2) in teco_adjust_raster()
1194 line = (dev->raster_num + line_shift) / 2; in teco_adjust_raster()
1199 line = (dev->raster_num - line_shift) / 2; in teco_adjust_raster()
1202 else if (dev->raster_num >= dev->raster_real - dev->color_shift) in teco_adjust_raster()
1205 line = dev->line; in teco_adjust_raster()
1207 else if (dev->raster_num >= dev->raster_real - 3 * dev->color_shift) in teco_adjust_raster()
1209 if ((dev->raster_real - dev->raster_num - line_shift) % 2) in teco_adjust_raster()
1212 line = dev->line; in teco_adjust_raster()
1217 line = dev->line - line_shift; in teco_adjust_raster()
1222 switch ((dev->raster_num - 3 * line_shift) % 3) in teco_adjust_raster()
1226 line = (dev->raster_num - 3 * line_shift) / 3; in teco_adjust_raster()
1230 line = dev->raster_num / 3; in teco_adjust_raster()
1234 line = (dev->raster_num + 3 * line_shift) / 3; in teco_adjust_raster()
1240 line -= dev->line; in teco_adjust_raster()
1242 offset = dev->image_end + line * dev->params.bytes_per_line; in teco_adjust_raster()
1244 assert (offset <= (dev->image_size - dev->params.bytes_per_line)); in teco_adjust_raster()
1249 unsigned char *src = dev->buffer + raster * dev->raster_size; in teco_adjust_raster()
1250 unsigned char *dest = dev->image + offset + color; in teco_adjust_raster()
1252 for (i = 0; i < dev->raster_size; i++) in teco_adjust_raster()
1259 assert (dest <= (dev->image + dev->image_size + 2)); in teco_adjust_raster()
1263 DBG (DBG_info, "raster=%d, line=%d, color=%d\n", dev->raster_num, in teco_adjust_raster()
1264 dev->line + line, color); in teco_adjust_raster()
1269 dev->line++; in teco_adjust_raster()
1270 dev->image_end += dev->params.bytes_per_line; in teco_adjust_raster()
1273 dev->raster_num++; in teco_adjust_raster()
1281 teco_fill_image (Teco_Scanner * dev) in teco_fill_image() argument
1290 assert (dev->image_begin == dev->image_end); in teco_fill_image()
1291 assert (dev->real_bytes_left > 0); in teco_fill_image()
1297 if (dev->scan_mode == TECO_COLOR) in teco_fill_image()
1299 memmove (dev->image, dev->image + dev->image_begin, dev->raster_ahead); in teco_fill_image()
1302 dev->image_begin = 0; in teco_fill_image()
1303 dev->image_end = 0; in teco_fill_image()
1305 while (dev->real_bytes_left) in teco_fill_image()
1310 if (dev->raster_ahead + dev->image_end + dev->params.bytes_per_line > in teco_fill_image()
1311 dev->image_size) in teco_fill_image()
1315 assert (dev->image_end != 0); in teco_fill_image()
1325 status = get_filled_data_length (dev, &size); in teco_fill_image()
1332 if (size > dev->real_bytes_left) in teco_fill_image()
1333 size = dev->real_bytes_left; in teco_fill_image()
1334 if (size > dev->image_size - dev->raster_ahead - dev->image_end) in teco_fill_image()
1335 size = dev->image_size - dev->raster_ahead - dev->image_end; in teco_fill_image()
1336 if (size > dev->buffer_size) in teco_fill_image()
1338 size = dev->buffer_size; in teco_fill_image()
1342 size = size - (size % dev->bytes_per_raster); in teco_fill_image()
1348 assert (dev->image_end != 0); in teco_fill_image()
1353 (long) size, dev->params.bytes_per_line); in teco_fill_image()
1358 DBG (DBG_info, " image_end=%lu\n", (u_long) dev->image_end); in teco_fill_image()
1360 if (dev->scan_mode == TECO_COLOR && dev->does_color_shift) in teco_fill_image()
1362 image = dev->buffer; in teco_fill_image()
1366 image = dev->image + dev->image_end; in teco_fill_image()
1369 status = sanei_scsi_cmd2 (dev->sfd, cdb.data, cdb.len, in teco_fill_image()
1380 assert ((size % dev->bytes_per_raster) == 0); in teco_fill_image()
1383 (long) dev->real_bytes_left); in teco_fill_image()
1385 if (dev->scan_mode == TECO_COLOR && dev->does_color_shift) in teco_fill_image()
1387 teco_adjust_raster (dev, size); in teco_fill_image()
1391 /* Already in dev->image. */ in teco_fill_image()
1392 dev->image_end += size; in teco_fill_image()
1395 dev->real_bytes_left -= size; in teco_fill_image()
1407 teco_copy_raw_to_frontend (Teco_Scanner * dev, SANE_Byte * buf, size_t * len) in teco_copy_raw_to_frontend() argument
1411 size = dev->image_end - dev->image_begin; in teco_copy_raw_to_frontend()
1418 switch (dev->scan_mode) in teco_copy_raw_to_frontend()
1425 unsigned char *src = dev->image + dev->image_begin; in teco_copy_raw_to_frontend()
1459 memcpy (buf, dev->image + dev->image_begin, size); in teco_copy_raw_to_frontend()
1463 dev->image_begin += size; in teco_copy_raw_to_frontend()
1468 do_cancel (Teco_Scanner * dev) in do_cancel() argument
1472 if (dev->scanning == SANE_TRUE) in do_cancel()
1474 teco_reset_window (dev); in do_cancel()
1475 teco_close (dev); in do_cancel()
1478 dev->scanning = SANE_FALSE; in do_cancel()
1512 /* default to /dev/scanner instead of insisting on config file */ in sane_init()
1513 attach_scanner ("/dev/scanner", 0); in sane_init()
1539 Teco_Scanner *dev; in sane_get_devices() local
1552 for (dev = first_dev; i < num_devices; dev = dev->next) in sane_get_devices()
1553 devlist[i++] = &dev->sane; in sane_get_devices()
1566 Teco_Scanner *dev; in sane_open() local
1577 for (dev = first_dev; dev; dev = dev->next) in sane_open()
1579 if (strcmp (dev->sane.name, devicename) == 0) in sane_open()
1585 if (!dev) in sane_open()
1587 status = attach_scanner (devicename, &dev); in sane_open()
1597 dev = first_dev; /* empty devicename -> use first device */ in sane_open()
1600 if (!dev) in sane_open()
1607 teco_init_options (dev); in sane_open()
1612 dev->gamma_R[i] = i / 4; in sane_open()
1613 dev->gamma_G[i] = i / 4; in sane_open()
1614 dev->gamma_B[i] = i / 4; in sane_open()
1615 dev->gamma_GRAY[i] = i / 4; in sane_open()
1618 *handle = dev; in sane_open()
1628 Teco_Scanner *dev = handle; in sane_get_option_descriptor() local
1639 return dev->opt + option; in sane_get_option_descriptor()
1646 Teco_Scanner *dev = handle; in sane_control_option() local
1659 if (dev->scanning) in sane_control_option()
1669 cap = dev->opt[option].cap; in sane_control_option()
1675 name = dev->opt[option].name; in sane_control_option()
1695 *(SANE_Word *) val = dev->val[option].w; in sane_control_option()
1701 strcpy (val, dev->val[option].s); in sane_control_option()
1709 memcpy (val, dev->val[option].wa, dev->opt[option].size); in sane_control_option()
1725 status = sanei_constrain_value (dev->opt + option, val, info); in sane_control_option()
1746 dev->val[option].w = *(SANE_Word *) val; in sane_control_option()
1751 dev->val[option].w = *(SANE_Word *) val; in sane_control_option()
1756 free (dev->val[option].s); in sane_control_option()
1757 dev->val[option].s = (SANE_String) strdup (val); in sane_control_option()
1762 if (strcmp (dev->val[option].s, val) == 0) in sane_control_option()
1765 free (dev->val[OPT_MODE].s); in sane_control_option()
1766 dev->val[OPT_MODE].s = (SANE_Char *) strdup (val); in sane_control_option()
1768 dev->opt[OPT_DITHER].cap |= SANE_CAP_INACTIVE; in sane_control_option()
1769 dev->opt[OPT_CUSTOM_GAMMA].cap |= SANE_CAP_INACTIVE; in sane_control_option()
1770 dev->opt[OPT_GAMMA_VECTOR_R].cap |= SANE_CAP_INACTIVE; in sane_control_option()
1771 dev->opt[OPT_GAMMA_VECTOR_G].cap |= SANE_CAP_INACTIVE; in sane_control_option()
1772 dev->opt[OPT_GAMMA_VECTOR_B].cap |= SANE_CAP_INACTIVE; in sane_control_option()
1773 dev->opt[OPT_GAMMA_VECTOR_GRAY].cap |= SANE_CAP_INACTIVE; in sane_control_option()
1774 dev->opt[OPT_THRESHOLD].cap |= SANE_CAP_INACTIVE; in sane_control_option()
1776 if (strcmp (dev->val[OPT_MODE].s, BLACK_WHITE_STR) == 0) in sane_control_option()
1778 dev->depth = 8; in sane_control_option()
1779 dev->scan_mode = TECO_BW; in sane_control_option()
1780 dev->opt[OPT_DITHER].cap &= ~SANE_CAP_INACTIVE; in sane_control_option()
1781 dev->opt[OPT_THRESHOLD].cap &= ~SANE_CAP_INACTIVE; in sane_control_option()
1783 else if (strcmp (dev->val[OPT_MODE].s, GRAY_STR) == 0) in sane_control_option()
1785 dev->scan_mode = TECO_GRAYSCALE; in sane_control_option()
1786 dev->opt[OPT_CUSTOM_GAMMA].cap &= ~SANE_CAP_INACTIVE; in sane_control_option()
1787 if (dev->val[OPT_CUSTOM_GAMMA].w) in sane_control_option()
1789 dev->opt[OPT_GAMMA_VECTOR_GRAY].cap &= ~SANE_CAP_INACTIVE; in sane_control_option()
1791 dev->depth = 8; in sane_control_option()
1793 else if (strcmp (dev->val[OPT_MODE].s, COLOR_STR) == 0) in sane_control_option()
1795 dev->scan_mode = TECO_COLOR; in sane_control_option()
1796 dev->opt[OPT_CUSTOM_GAMMA].cap &= ~SANE_CAP_INACTIVE; in sane_control_option()
1797 if (dev->val[OPT_CUSTOM_GAMMA].w) in sane_control_option()
1799 dev->opt[OPT_GAMMA_VECTOR_R].cap &= ~SANE_CAP_INACTIVE; in sane_control_option()
1800 dev->opt[OPT_GAMMA_VECTOR_G].cap &= ~SANE_CAP_INACTIVE; in sane_control_option()
1801 dev->opt[OPT_GAMMA_VECTOR_B].cap &= ~SANE_CAP_INACTIVE; in sane_control_option()
1803 dev->depth = 8; in sane_control_option()
1816 memcpy (dev->val[option].wa, val, dev->opt[option].size); in sane_control_option()
1820 dev->val[OPT_CUSTOM_GAMMA].w = *(SANE_Word *) val; in sane_control_option()
1821 if (dev->val[OPT_CUSTOM_GAMMA].w) in sane_control_option()
1824 if (dev->scan_mode == TECO_GRAYSCALE) in sane_control_option()
1826 dev->opt[OPT_GAMMA_VECTOR_GRAY].cap &= ~SANE_CAP_INACTIVE; in sane_control_option()
1831 dev->opt[OPT_GAMMA_VECTOR_R].cap &= ~SANE_CAP_INACTIVE; in sane_control_option()
1832 dev->opt[OPT_GAMMA_VECTOR_G].cap &= ~SANE_CAP_INACTIVE; in sane_control_option()
1833 dev->opt[OPT_GAMMA_VECTOR_B].cap &= ~SANE_CAP_INACTIVE; in sane_control_option()
1838 dev->opt[OPT_GAMMA_VECTOR_R].cap |= SANE_CAP_INACTIVE; in sane_control_option()
1839 dev->opt[OPT_GAMMA_VECTOR_G].cap |= SANE_CAP_INACTIVE; in sane_control_option()
1840 dev->opt[OPT_GAMMA_VECTOR_B].cap |= SANE_CAP_INACTIVE; in sane_control_option()
1841 dev->opt[OPT_GAMMA_VECTOR_GRAY].cap |= SANE_CAP_INACTIVE; in sane_control_option()
1862 Teco_Scanner *dev = handle; in sane_get_parameters() local
1866 if (!(dev->scanning)) in sane_get_parameters()
1871 if (dev->val[OPT_PREVIEW].w == SANE_TRUE) in sane_get_parameters()
1873 dev->x_resolution = 50; in sane_get_parameters()
1874 dev->y_resolution = 50; in sane_get_parameters()
1875 dev->x_tl = 0; in sane_get_parameters()
1876 dev->y_tl = 0; in sane_get_parameters()
1877 dev->x_br = mmToIlu (SANE_UNFIX (x_range.max)); in sane_get_parameters()
1878 dev->y_br = mmToIlu (SANE_UNFIX (y_range.max)); in sane_get_parameters()
1882 dev->x_resolution = dev->val[OPT_RESOLUTION].w; in sane_get_parameters()
1883 dev->y_resolution = dev->val[OPT_RESOLUTION].w; in sane_get_parameters()
1884 if (dev->x_resolution > dev->def->x_resolution_max) in sane_get_parameters()
1886 dev->x_resolution = dev->def->x_resolution_max; in sane_get_parameters()
1889 dev->x_tl = mmToIlu (SANE_UNFIX (dev->val[OPT_TL_X].w)); in sane_get_parameters()
1890 dev->y_tl = mmToIlu (SANE_UNFIX (dev->val[OPT_TL_Y].w)); in sane_get_parameters()
1891 dev->x_br = mmToIlu (SANE_UNFIX (dev->val[OPT_BR_X].w)); in sane_get_parameters()
1892 dev->y_br = mmToIlu (SANE_UNFIX (dev->val[OPT_BR_Y].w)); in sane_get_parameters()
1896 if (dev->x_tl > dev->x_br) in sane_get_parameters()
1899 s = dev->x_tl; in sane_get_parameters()
1900 dev->x_tl = dev->x_br; in sane_get_parameters()
1901 dev->x_br = s; in sane_get_parameters()
1903 if (dev->y_tl > dev->y_br) in sane_get_parameters()
1906 s = dev->y_tl; in sane_get_parameters()
1907 dev->y_tl = dev->y_br; in sane_get_parameters()
1908 dev->y_br = s; in sane_get_parameters()
1911 dev->width = dev->x_br - dev->x_tl; in sane_get_parameters()
1912 dev->length = dev->y_br - dev->y_tl; in sane_get_parameters()
1915 memset (&dev->params, 0, sizeof (SANE_Parameters)); in sane_get_parameters()
1917 dev->params.last_frame = SANE_TRUE; in sane_get_parameters()
1919 switch (dev->scan_mode) in sane_get_parameters()
1922 dev->params.format = SANE_FRAME_GRAY; in sane_get_parameters()
1923 dev->params.pixels_per_line = in sane_get_parameters()
1924 ((dev->width * dev->x_resolution) / 300) & ~0x7; in sane_get_parameters()
1925 dev->params.bytes_per_line = dev->params.pixels_per_line / 8; in sane_get_parameters()
1926 dev->params.depth = 1; in sane_get_parameters()
1927 dev->color_shift = 0; in sane_get_parameters()
1930 dev->params.format = SANE_FRAME_GRAY; in sane_get_parameters()
1931 dev->params.pixels_per_line = in sane_get_parameters()
1932 ((dev->width * dev->x_resolution) / 300); in sane_get_parameters()
1933 dev->params.bytes_per_line = dev->params.pixels_per_line; in sane_get_parameters()
1934 dev->params.depth = 8; in sane_get_parameters()
1935 dev->color_shift = 0; in sane_get_parameters()
1938 dev->params.format = SANE_FRAME_RGB; in sane_get_parameters()
1939 dev->params.pixels_per_line = in sane_get_parameters()
1940 ((dev->width * dev->x_resolution) / 300); in sane_get_parameters()
1941 dev->params.bytes_per_line = dev->params.pixels_per_line * 3; in sane_get_parameters()
1942 dev->params.depth = 8; in sane_get_parameters()
1952 dev->color_shift = dev->x_resolution / 75; in sane_get_parameters()
1957 dev->params.lines = (dev->length * dev->y_resolution) / 300; in sane_get_parameters()
1963 *params = (dev->params); in sane_get_parameters()
1974 Teco_Scanner *dev = handle; in sane_start() local
1980 if (!(dev->scanning)) in sane_start()
1985 (dev->devicename, &(dev->sfd), teco_sense_handler, dev) != 0) in sane_start()
1992 sane_get_parameters (dev, NULL); in sane_start()
1995 status = teco_wait_scanner (dev); in sane_start()
1998 teco_close (dev); in sane_start()
2002 teco_query_sense (dev); in sane_start()
2003 teco_reset_window (dev); in sane_start()
2005 status = teco_set_window (dev); in sane_start()
2008 teco_close (dev); in sane_start()
2012 dev->real_bytes_left = 0; in sane_start()
2013 status = get_filled_data_length (dev, &size); in sane_start()
2016 teco_close (dev); in sane_start()
2025 dev->raster_ahead = in sane_start()
2026 (2 * dev->color_shift + 1) * dev->params.bytes_per_line; in sane_start()
2027 dev->image_size = dev->buffer_size + dev->raster_ahead; in sane_start()
2028 dev->image_size = in sane_start()
2029 dev->image_size - (dev->image_size % dev->params.bytes_per_line); in sane_start()
2030 dev->image = malloc (dev->image_size); in sane_start()
2031 if (dev->image == NULL) in sane_start()
2037 dev->raster_size = dev->params.pixels_per_line; in sane_start()
2038 dev->raster_real = dev->params.lines * 3; in sane_start()
2039 dev->raster_num = 0; in sane_start()
2040 dev->line = 0; in sane_start()
2042 teco_vendor_spec (dev); in sane_start()
2045 teco_close (dev); in sane_start()
2049 status = teco_send_gamma (dev); in sane_start()
2052 teco_close (dev); in sane_start()
2056 status = teco_set_window (dev); in sane_start()
2059 teco_close (dev); in sane_start()
2063 status = teco_scan (dev); in sane_start()
2066 teco_close (dev); in sane_start()
2071 dev->image_end = 0; in sane_start()
2072 dev->image_begin = 0; in sane_start()
2074 dev->bytes_left = dev->params.bytes_per_line * dev->params.lines; in sane_start()
2075 dev->real_bytes_left = dev->params.bytes_per_line * dev->params.lines; in sane_start()
2077 dev->scanning = SANE_TRUE; in sane_start()
2089 Teco_Scanner *dev = handle; in sane_read() local
2097 if (!(dev->scanning)) in sane_read()
2100 return do_cancel (dev); in sane_read()
2103 if (dev->bytes_left <= 0) in sane_read()
2112 if (dev->image_begin == dev->image_end) in sane_read()
2115 status = teco_fill_image (dev); in sane_read()
2123 if (dev->image_begin == dev->image_end) in sane_read()
2131 if (size > dev->bytes_left) in sane_read()
2133 size = dev->bytes_left; in sane_read()
2135 teco_copy_raw_to_frontend (dev, buf + buf_offset, &size); in sane_read()
2139 dev->bytes_left -= size; in sane_read()
2143 while ((buf_offset != max_len) && dev->bytes_left); in sane_read()
2146 (long) dev->bytes_left); in sane_read()
2155 Teco_Scanner *dev = handle; in sane_set_io_mode() local
2159 if (dev->scanning == SANE_FALSE) in sane_set_io_mode()
2191 Teco_Scanner *dev = handle; in sane_cancel() local
2195 do_cancel (dev); in sane_cancel()
2203 Teco_Scanner *dev = handle; in sane_close() local
2208 do_cancel (dev); in sane_close()
2209 teco_close (dev); in sane_close()
2211 /* Unlink dev. */ in sane_close()
2212 if (first_dev == dev) in sane_close()
2214 first_dev = dev->next; in sane_close()
2219 while (dev_tmp->next && dev_tmp->next != dev) in sane_close()
2229 teco_free (dev); in sane_close()