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