Lines Matching refs:dev

315   Teco_Scanner *dev;
320 dev = malloc (sizeof (Teco_Scanner));
321 if (dev == NULL)
326 memset (dev, 0, sizeof (Teco_Scanner));
329 dev->buffer_size = 64 * 1024;
330 dev->buffer = malloc (dev->buffer_size);
331 if (dev->buffer == NULL)
333 free (dev);
338 dev->image_size = 64 * 1024; /* enough for 1 line at max res */
339 dev->image = malloc (dev->image_size);
340 if (dev->image == NULL)
342 free (dev->buffer);
343 free (dev);
347 dev->sfd = -1;
351 return (dev);
356 teco_close (Teco_Scanner * dev)
360 if (dev->sfd != -1)
362 sanei_scsi_close (dev->sfd);
363 dev->sfd = -1;
371 teco_free (Teco_Scanner * dev)
377 if (dev == NULL)
380 teco_close (dev);
381 if (dev->devicename)
383 free (dev->devicename);
385 if (dev->buffer)
387 free (dev->buffer);
389 if (dev->image)
391 free (dev->image);
395 if (dev->opt[i].type == SANE_TYPE_STRING && dev->val[i].s)
397 free (dev->val[i].s);
401 free (dev);
408 teco_identify_scanner (Teco_Scanner * dev)
419 status = sanei_scsi_cmd2 (dev->sfd, cdb.data, cdb.len,
420 NULL, 0, dev->buffer, &size);
453 memcpy (dev->buffer, table, sizeof (table));
457 size = dev->buffer[4] + 5; /* total length of the inquiry data */
460 status = sanei_scsi_cmd2 (dev->sfd, cdb.data, cdb.len,
461 NULL, 0, dev->buffer, &size);
472 if (memcmp (dev->buffer + 0x08, "DF-600M ", 8) == 0)
474 memcpy (dev->buffer + 0x29, "\0TECO VM3510", 12);
475 dev->buffer[4] = 0x30; /* change length */
486 hexdump (DBG_info2, "inquiry", dev->buffer, size);
488 dev->scsi_type = dev->buffer[0] & 0x1f;
489 memcpy (dev->scsi_vendor, dev->buffer + 0x08, 0x08);
490 dev->scsi_vendor[0x08] = 0;
491 memcpy (dev->scsi_product, dev->buffer + 0x10, 0x010);
492 dev->scsi_product[0x10] = 0;
493 memcpy (dev->scsi_version, dev->buffer + 0x20, 0x04);
494 dev->scsi_version[0x04] = 0;
495 memcpy (dev->scsi_teco_name, dev->buffer + 0x2A, 0x0B);
496 dev->scsi_teco_name[0x0B] = 0;
499 dev->scsi_vendor, dev->scsi_product, dev->scsi_version,
500 dev->scsi_teco_name);
507 if (dev->scsi_type == scanners[i].scsi_type &&
508 strcmp (dev->scsi_teco_name, scanners[i].scsi_teco_name) == 0)
513 dev->def = &(scanners[i]);
526 teco_get_inquiry_82 (Teco_Scanner * dev)
539 status = sanei_scsi_cmd2 (dev->sfd, cdb.data, cdb.len,
540 NULL, 0, dev->buffer, &size);
550 size = dev->buffer[3] + 4;
555 status = sanei_scsi_cmd2 (dev->sfd, cdb.data, cdb.len,
556 NULL, 0, dev->buffer, &size);
566 hexdump (DBG_info2, "inquiry page 0x82", dev->buffer, size);
616 teco_mode_select (Teco_Scanner * dev)
632 status = sanei_scsi_cmd2 (dev->sfd, cdb.data, cdb.len,
642 teco_set_window (Teco_Scanner * dev)
652 size = dev->def->window_size;
662 Ito16 (dev->x_resolution, &window[10]);
663 Ito16 (dev->y_resolution, &window[12]);
666 Ito32 (dev->x_tl, &window[14]);
667 Ito32 (dev->y_tl, &window[18]);
670 Ito32 (dev->width, &window[22]);
671 Ito32 (dev->length, &window[26]);
674 switch (dev->scan_mode)
678 i = get_string_list_index (dither_list, dev->val[OPT_DITHER].s);
690 window[34] = dev->depth;
714 status = sanei_scsi_cmd2 (dev->sfd, cdb.data, cdb.len,
724 get_filled_data_length (Teco_Scanner * dev, size_t * to_read)
736 status = sanei_scsi_cmd2 (dev->sfd, cdb.data, cdb.len,
737 NULL, 0, dev->buffer, &size);
746 hexdump (DBG_info2, "get_filled_data_length return", dev->buffer, size);
748 *to_read = B24TOI (&dev->buffer[9]);
751 dev->params.lines, B16TOI (&dev->buffer[12]),
752 dev->params.bytes_per_line, B16TOI (&dev->buffer[14]));
754 if (dev->real_bytes_left == 0)
757 dev->params.lines = B16TOI (&dev->buffer[12]);
759 switch (dev->scan_mode)
762 dev->params.bytes_per_line = B16TOI (&dev->buffer[14]);
763 dev->params.pixels_per_line = dev->params.bytes_per_line * 8;
767 dev->params.pixels_per_line = B16TOI (&dev->buffer[14]);
768 dev->params.bytes_per_line = dev->params.pixels_per_line;
772 dev->params.pixels_per_line = B16TOI (&dev->buffer[14]);
773 if (dev->def->pass == 3)
775 dev->params.bytes_per_line = dev->params.pixels_per_line;
779 dev->params.bytes_per_line = dev->params.pixels_per_line * 3;
794 teco_scan (Teco_Scanner * dev)
803 status = sanei_scsi_cmd2 (dev->sfd, cdb.data, cdb.len, NULL, 0, NULL, NULL);
813 teco_vendor_spec (Teco_Scanner * dev)
831 status = sanei_scsi_cmd2 (dev->sfd, cdb.data, cdb.len,
832 NULL, 0, dev->buffer, &size);
834 /*hexdump (DBG_info2, "calibration:", dev->buffer, size); */
844 status = sanei_scsi_cmd2 (dev->sfd, cdb.data, cdb.len, NULL, 0, NULL, NULL);
857 teco_send_gamma (Teco_Scanner * dev)
874 if (dev->val[OPT_CUSTOM_GAMMA].w)
877 if (dev->scan_mode == TECO_GRAYSCALE)
883 param.gamma[1 * GAMMA_LENGTH + i] = dev->gamma_GRAY[i];
893 param.gamma[0 * GAMMA_LENGTH + i] = dev->gamma_R[i];
894 param.gamma[1 * GAMMA_LENGTH + i] = dev->gamma_G[i];
895 param.gamma[2 * GAMMA_LENGTH + i] = dev->gamma_B[i];
902 if (dev->scan_mode == TECO_BW)
907 dev->val[OPT_THRESHOLD].w * (GAMMA_LENGTH / 256);
941 status = sanei_scsi_cmd2 (dev->sfd, cdb.data, cdb.len,
953 Teco_Scanner *dev;
962 for (dev = first_dev; dev; dev = dev->next)
964 if (strcmp (dev->sane.name, devicename) == 0)
968 *devp = dev;
976 dev = teco_init ();
977 if (dev == NULL)
985 if (sanei_scsi_open (devicename, &sfd, teco_sense_handler, dev) != 0)
988 teco_free (dev);
993 dev->devicename = strdup (devicename);
994 dev->sfd = sfd;
997 if (teco_identify_scanner (dev) == SANE_FALSE)
1001 teco_free (dev);
1006 teco_get_inquiry_82 (dev);
1008 teco_close (dev);
1011 dev->sane.name = dev->devicename;
1012 dev->sane.vendor = dev->def->real_vendor;
1013 dev->sane.model = dev->def->real_product;
1014 dev->sane.type = "flatbed scanner";
1017 dev->next = first_dev;
1018 first_dev = dev;
1022 *devp = dev;
1033 attach_one (const char *dev)
1035 attach_scanner (dev, NULL);
1041 teco_init_options (Teco_Scanner * dev)
1046 memset (dev->opt, 0, sizeof (dev->opt));
1047 memset (dev->val, 0, sizeof (dev->val));
1051 dev->opt[i].size = sizeof (SANE_Word);
1052 dev->opt[i].cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT;
1056 dev->opt[OPT_NUM_OPTS].name = "";
1057 dev->opt[OPT_NUM_OPTS].title = SANE_TITLE_NUM_OPTIONS;
1058 dev->opt[OPT_NUM_OPTS].desc = SANE_DESC_NUM_OPTIONS;
1059 dev->opt[OPT_NUM_OPTS].type = SANE_TYPE_INT;
1060 dev->opt[OPT_NUM_OPTS].cap = SANE_CAP_SOFT_DETECT;
1061 dev->val[OPT_NUM_OPTS].w = OPT_NUM_OPTIONS;
1064 dev->opt[OPT_MODE_GROUP].title = SANE_TITLE_SCAN_MODE;
1065 dev->opt[OPT_MODE_GROUP].desc = ""; /* not valid for a group */
1066 dev->opt[OPT_MODE_GROUP].type = SANE_TYPE_GROUP;
1067 dev->opt[OPT_MODE_GROUP].cap = 0;
1068 dev->opt[OPT_MODE_GROUP].size = 0;
1069 dev->opt[OPT_MODE_GROUP].constraint_type = SANE_CONSTRAINT_NONE;
1072 dev->opt[OPT_MODE].name = SANE_NAME_SCAN_MODE;
1073 dev->opt[OPT_MODE].title = SANE_TITLE_SCAN_MODE;
1074 dev->opt[OPT_MODE].desc = SANE_DESC_SCAN_MODE;
1075 dev->opt[OPT_MODE].type = SANE_TYPE_STRING;
1076 dev->opt[OPT_MODE].size = max_string_size (scan_mode_list);
1077 dev->opt[OPT_MODE].constraint_type = SANE_CONSTRAINT_STRING_LIST;
1078 dev->opt[OPT_MODE].constraint.string_list = scan_mode_list;
1079 dev->val[OPT_MODE].s = (SANE_Char *) strdup (""); /* will be set later */
1082 dev->opt[OPT_RESOLUTION].name = SANE_NAME_SCAN_RESOLUTION;
1083 dev->opt[OPT_RESOLUTION].title = SANE_TITLE_SCAN_RESOLUTION;
1084 dev->opt[OPT_RESOLUTION].desc = SANE_DESC_SCAN_RESOLUTION;
1085 dev->opt[OPT_RESOLUTION].type = SANE_TYPE_INT;
1086 dev->opt[OPT_RESOLUTION].unit = SANE_UNIT_DPI;
1087 dev->opt[OPT_RESOLUTION].constraint_type = SANE_CONSTRAINT_RANGE;
1088 dev->opt[OPT_RESOLUTION].constraint.range = &dev->def->res_range;
1089 dev->val[OPT_RESOLUTION].w = 100;
1092 dev->opt[OPT_GEOMETRY_GROUP].title = SANE_I18N ("Geometry");
1093 dev->opt[OPT_GEOMETRY_GROUP].desc = ""; /* not valid for a group */
1094 dev->opt[OPT_GEOMETRY_GROUP].type = SANE_TYPE_GROUP;
1095 dev->opt[OPT_GEOMETRY_GROUP].cap = 0;
1096 dev->opt[OPT_GEOMETRY_GROUP].size = 0;
1097 dev->opt[OPT_GEOMETRY_GROUP].constraint_type = SANE_CONSTRAINT_NONE;
1100 dev->opt[OPT_TL_X].name = SANE_NAME_SCAN_TL_X;
1101 dev->opt[OPT_TL_X].title = SANE_TITLE_SCAN_TL_X;
1102 dev->opt[OPT_TL_X].desc = SANE_DESC_SCAN_TL_X;
1103 dev->opt[OPT_TL_X].type = SANE_TYPE_FIXED;
1104 dev->opt[OPT_TL_X].unit = SANE_UNIT_MM;
1105 dev->opt[OPT_TL_X].constraint_type = SANE_CONSTRAINT_RANGE;
1106 dev->opt[OPT_TL_X].constraint.range = &x_range;
1107 dev->val[OPT_TL_X].w = x_range.min;
1110 dev->opt[OPT_TL_Y].name = SANE_NAME_SCAN_TL_Y;
1111 dev->opt[OPT_TL_Y].title = SANE_TITLE_SCAN_TL_Y;
1112 dev->opt[OPT_TL_Y].desc = SANE_DESC_SCAN_TL_Y;
1113 dev->opt[OPT_TL_Y].type = SANE_TYPE_FIXED;
1114 dev->opt[OPT_TL_Y].unit = SANE_UNIT_MM;
1115 dev->opt[OPT_TL_Y].constraint_type = SANE_CONSTRAINT_RANGE;
1116 dev->opt[OPT_TL_Y].constraint.range = &y_range;
1117 dev->val[OPT_TL_Y].w = y_range.min;
1120 dev->opt[OPT_BR_X].name = SANE_NAME_SCAN_BR_X;
1121 dev->opt[OPT_BR_X].title = SANE_TITLE_SCAN_BR_X;
1122 dev->opt[OPT_BR_X].desc = SANE_DESC_SCAN_BR_X;
1123 dev->opt[OPT_BR_X].type = SANE_TYPE_FIXED;
1124 dev->opt[OPT_BR_X].unit = SANE_UNIT_MM;
1125 dev->opt[OPT_BR_X].constraint_type = SANE_CONSTRAINT_RANGE;
1126 dev->opt[OPT_BR_X].constraint.range = &x_range;
1127 dev->val[OPT_BR_X].w = x_range.max;
1130 dev->opt[OPT_BR_Y].name = SANE_NAME_SCAN_BR_Y;
1131 dev->opt[OPT_BR_Y].title = SANE_TITLE_SCAN_BR_Y;
1132 dev->opt[OPT_BR_Y].desc = SANE_DESC_SCAN_BR_Y;
1133 dev->opt[OPT_BR_Y].type = SANE_TYPE_FIXED;
1134 dev->opt[OPT_BR_Y].unit = SANE_UNIT_MM;
1135 dev->opt[OPT_BR_Y].constraint_type = SANE_CONSTRAINT_RANGE;
1136 dev->opt[OPT_BR_Y].constraint.range = &y_range;
1137 dev->val[OPT_BR_Y].w = y_range.max;
1140 dev->opt[OPT_ENHANCEMENT_GROUP].title = SANE_I18N ("Enhancement");
1141 dev->opt[OPT_ENHANCEMENT_GROUP].desc = ""; /* not valid for a group */
1142 dev->opt[OPT_ENHANCEMENT_GROUP].type = SANE_TYPE_GROUP;
1143 dev->opt[OPT_ENHANCEMENT_GROUP].cap = SANE_CAP_ADVANCED;
1144 dev->opt[OPT_ENHANCEMENT_GROUP].size = 0;
1145 dev->opt[OPT_ENHANCEMENT_GROUP].constraint_type = SANE_CONSTRAINT_NONE;
1148 dev->opt[OPT_DITHER].name = "dither";
1149 dev->opt[OPT_DITHER].title = SANE_I18N ("Dither");
1150 dev->opt[OPT_DITHER].desc = SANE_I18N ("Dither");
1151 dev->opt[OPT_DITHER].type = SANE_TYPE_STRING;
1152 dev->opt[OPT_DITHER].size = max_string_size (dither_list);
1153 dev->opt[OPT_DITHER].cap |= SANE_CAP_INACTIVE;
1154 dev->opt[OPT_DITHER].constraint_type = SANE_CONSTRAINT_STRING_LIST;
1155 dev->opt[OPT_DITHER].constraint.string_list = dither_list;
1156 dev->val[OPT_DITHER].s = strdup (dither_list[0]);
1159 dev->opt[OPT_CUSTOM_GAMMA].name = SANE_NAME_CUSTOM_GAMMA;
1160 dev->opt[OPT_CUSTOM_GAMMA].title = SANE_TITLE_CUSTOM_GAMMA;
1161 dev->opt[OPT_CUSTOM_GAMMA].desc = SANE_DESC_CUSTOM_GAMMA;
1162 dev->opt[OPT_CUSTOM_GAMMA].type = SANE_TYPE_BOOL;
1163 dev->opt[OPT_CUSTOM_GAMMA].cap |= SANE_CAP_INACTIVE;
1164 dev->val[OPT_CUSTOM_GAMMA].w = SANE_FALSE;
1167 dev->opt[OPT_GAMMA_VECTOR_R].name = SANE_NAME_GAMMA_VECTOR_R;
1168 dev->opt[OPT_GAMMA_VECTOR_R].title = SANE_TITLE_GAMMA_VECTOR_R;
1169 dev->opt[OPT_GAMMA_VECTOR_R].desc = SANE_DESC_GAMMA_VECTOR_R;
1170 dev->opt[OPT_GAMMA_VECTOR_R].type = SANE_TYPE_INT;
1171 dev->opt[OPT_GAMMA_VECTOR_R].cap |= SANE_CAP_INACTIVE;
1172 dev->opt[OPT_GAMMA_VECTOR_R].unit = SANE_UNIT_NONE;
1173 dev->opt[OPT_GAMMA_VECTOR_R].size = GAMMA_LENGTH * sizeof (SANE_Word);
1174 dev->opt[OPT_GAMMA_VECTOR_R].constraint_type = SANE_CONSTRAINT_RANGE;
1175 dev->opt[OPT_GAMMA_VECTOR_R].constraint.range = &gamma_range;
1176 dev->val[OPT_GAMMA_VECTOR_R].wa = dev->gamma_R;
1179 dev->opt[OPT_GAMMA_VECTOR_G].name = SANE_NAME_GAMMA_VECTOR_G;
1180 dev->opt[OPT_GAMMA_VECTOR_G].title = SANE_TITLE_GAMMA_VECTOR_G;
1181 dev->opt[OPT_GAMMA_VECTOR_G].desc = SANE_DESC_GAMMA_VECTOR_G;
1182 dev->opt[OPT_GAMMA_VECTOR_G].type = SANE_TYPE_INT;
1183 dev->opt[OPT_GAMMA_VECTOR_G].cap |= SANE_CAP_INACTIVE;
1184 dev->opt[OPT_GAMMA_VECTOR_G].unit = SANE_UNIT_NONE;
1185 dev->opt[OPT_GAMMA_VECTOR_G].size = GAMMA_LENGTH * sizeof (SANE_Word);
1186 dev->opt[OPT_GAMMA_VECTOR_G].constraint_type = SANE_CONSTRAINT_RANGE;
1187 dev->opt[OPT_GAMMA_VECTOR_G].constraint.range = &gamma_range;
1188 dev->val[OPT_GAMMA_VECTOR_G].wa = dev->gamma_G;
1191 dev->opt[OPT_GAMMA_VECTOR_B].name = SANE_NAME_GAMMA_VECTOR_B;
1192 dev->opt[OPT_GAMMA_VECTOR_B].title = SANE_TITLE_GAMMA_VECTOR_B;
1193 dev->opt[OPT_GAMMA_VECTOR_B].desc = SANE_DESC_GAMMA_VECTOR_B;
1194 dev->opt[OPT_GAMMA_VECTOR_B].type = SANE_TYPE_INT;
1195 dev->opt[OPT_GAMMA_VECTOR_B].cap |= SANE_CAP_INACTIVE;
1196 dev->opt[OPT_GAMMA_VECTOR_B].unit = SANE_UNIT_NONE;
1197 dev->opt[OPT_GAMMA_VECTOR_B].size = GAMMA_LENGTH * sizeof (SANE_Word);
1198 dev->opt[OPT_GAMMA_VECTOR_B].constraint_type = SANE_CONSTRAINT_RANGE;
1199 dev->opt[OPT_GAMMA_VECTOR_B].constraint.range = &gamma_range;
1200 dev->val[OPT_GAMMA_VECTOR_B].wa = dev->gamma_B;
1203 dev->opt[OPT_GAMMA_VECTOR_GRAY].name = SANE_NAME_GAMMA_VECTOR;
1204 dev->opt[OPT_GAMMA_VECTOR_GRAY].title = SANE_TITLE_GAMMA_VECTOR;
1205 dev->opt[OPT_GAMMA_VECTOR_GRAY].desc = SANE_DESC_GAMMA_VECTOR;
1206 dev->opt[OPT_GAMMA_VECTOR_GRAY].type = SANE_TYPE_INT;
1207 dev->opt[OPT_GAMMA_VECTOR_GRAY].cap |= SANE_CAP_INACTIVE;
1208 dev->opt[OPT_GAMMA_VECTOR_GRAY].unit = SANE_UNIT_NONE;
1209 dev->opt[OPT_GAMMA_VECTOR_GRAY].size = GAMMA_LENGTH * sizeof (SANE_Word);
1210 dev->opt[OPT_GAMMA_VECTOR_GRAY].constraint_type = SANE_CONSTRAINT_RANGE;
1211 dev->opt[OPT_GAMMA_VECTOR_GRAY].constraint.range = &gamma_range;
1212 dev->val[OPT_GAMMA_VECTOR_GRAY].wa = dev->gamma_GRAY;
1215 dev->opt[OPT_THRESHOLD].name = SANE_NAME_THRESHOLD;
1216 dev->opt[OPT_THRESHOLD].title = SANE_TITLE_THRESHOLD;
1217 dev->opt[OPT_THRESHOLD].desc = SANE_DESC_THRESHOLD;
1218 dev->opt[OPT_THRESHOLD].type = SANE_TYPE_INT;
1219 dev->opt[OPT_THRESHOLD].unit = SANE_UNIT_NONE;
1220 dev->opt[OPT_THRESHOLD].size = sizeof (SANE_Int);
1221 dev->opt[OPT_THRESHOLD].cap |= SANE_CAP_INACTIVE;
1222 dev->opt[OPT_THRESHOLD].constraint_type = SANE_CONSTRAINT_RANGE;
1223 dev->opt[OPT_THRESHOLD].constraint.range = &threshold_range;
1224 dev->val[OPT_THRESHOLD].w = 128;
1227 dev->opt[OPT_PREVIEW].name = SANE_NAME_PREVIEW;
1228 dev->opt[OPT_PREVIEW].title = SANE_TITLE_PREVIEW;
1229 dev->opt[OPT_PREVIEW].desc = SANE_DESC_PREVIEW;
1230 dev->opt[OPT_PREVIEW].type = SANE_TYPE_BOOL;
1231 dev->opt[OPT_PREVIEW].cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT;
1232 dev->val[OPT_PREVIEW].w = SANE_FALSE;
1236 sane_control_option (dev, OPT_MODE, SANE_ACTION_SET_VALUE,
1244 teco_wait_scanner (Teco_Scanner * dev)
1261 status = sanei_scsi_cmd2 (dev->sfd, cdb.data, cdb.len,
1278 teco_fill_image (Teco_Scanner * dev)
1287 assert (dev->image_begin == dev->image_end);
1288 assert (dev->real_bytes_left > 0);
1290 dev->image_begin = 0;
1291 dev->image_end = 0;
1293 while (dev->real_bytes_left)
1301 status = get_filled_data_length (dev, &size);
1308 if (size > dev->real_bytes_left)
1309 size = dev->real_bytes_left;
1310 if (size > dev->image_size - dev->image_end)
1311 size = dev->image_size - dev->image_end;
1314 size = size - (size % dev->params.bytes_per_line);
1320 assert (dev->image_end != 0);
1325 (long) size, dev->params.bytes_per_line);
1331 image = dev->image + dev->image_end;
1333 status = sanei_scsi_cmd2 (dev->sfd, cdb.data, cdb.len,
1343 assert ((size % dev->params.bytes_per_line) == 0);
1346 (long) dev->real_bytes_left);
1348 if (dev->scan_mode == TECO_COLOR)
1350 if (dev->def->pass == 1)
1356 int nb_lines = size / dev->params.bytes_per_line;
1362 unsigned char *dest = dev->buffer;
1364 for (j = 0; j < dev->params.pixels_per_line; j++)
1366 *dest = src[j + 0 * dev->params.pixels_per_line];
1368 *dest = src[j + 1 * dev->params.pixels_per_line];
1370 *dest = src[j + 2 * dev->params.pixels_per_line];
1375 memcpy (src, dev->buffer, dev->params.bytes_per_line);
1377 src += dev->params.bytes_per_line;
1382 dev->image_end += size;
1383 dev->real_bytes_left -= size;
1395 teco_copy_raw_to_frontend (Teco_Scanner * dev, SANE_Byte * buf, size_t * len)
1399 size = dev->image_end - dev->image_begin;
1406 switch (dev->scan_mode)
1411 unsigned char *src = dev->image + dev->image_begin;
1425 memcpy (buf, dev->image + dev->image_begin, size);
1429 dev->image_begin += size;
1434 do_cancel (Teco_Scanner * dev)
1438 if (dev->scanning == SANE_TRUE)
1442 dev->x_resolution = 300;
1443 dev->y_resolution = 300;
1444 dev->x_tl = 0;
1445 dev->y_tl = 0;
1446 dev->width = 0;
1447 dev->length = 0;
1449 teco_set_window (dev);
1451 teco_scan (dev);
1453 teco_close (dev);
1456 dev->scanning = SANE_FALSE;
1490 /* default to /dev/scanner instead of insisting on config file */
1491 attach_scanner ("/dev/scanner", 0);
1517 Teco_Scanner *dev;
1530 for (dev = first_dev; i < num_devices; dev = dev->next)
1531 devlist[i++] = &dev->sane;
1544 Teco_Scanner *dev;
1554 for (dev = first_dev; dev; dev = dev->next)
1556 if (strcmp (dev->sane.name, devicename) == 0)
1562 if (!dev)
1564 status = attach_scanner (devicename, &dev);
1574 dev = first_dev; /* empty devicename -> use first device */
1577 if (!dev)
1584 teco_init_options (dev);
1597 dev->gamma_R[i] = i / shift;
1598 dev->gamma_G[i] = i / shift;
1599 dev->gamma_B[i] = i / shift;
1600 dev->gamma_GRAY[i] = i / shift;
1604 *handle = dev;
1614 Teco_Scanner *dev = handle;
1625 return dev->opt + option;
1632 Teco_Scanner *dev = handle;
1645 if (dev->scanning)
1655 cap = dev->opt[option].cap;
1661 name = dev->opt[option].name;
1681 *(SANE_Word *) val = dev->val[option].w;
1687 strcpy (val, dev->val[option].s);
1695 memcpy (val, dev->val[option].wa, dev->opt[option].size);
1711 status = sanei_constrain_value (dev->opt + option, val, info);
1731 dev->val[option].w = *(SANE_Word *) val;
1737 dev->val[option].w = *(SANE_Word *) val;
1742 free (dev->val[option].s);
1743 dev->val[option].s = (SANE_String) strdup (val);
1748 if (strcmp (dev->val[option].s, val) == 0)
1751 free (dev->val[OPT_MODE].s);
1752 dev->val[OPT_MODE].s = (SANE_Char *) strdup (val);
1754 dev->opt[OPT_DITHER].cap |= SANE_CAP_INACTIVE;
1755 dev->opt[OPT_CUSTOM_GAMMA].cap |= SANE_CAP_INACTIVE;
1756 dev->opt[OPT_GAMMA_VECTOR_R].cap |= SANE_CAP_INACTIVE;
1757 dev->opt[OPT_GAMMA_VECTOR_G].cap |= SANE_CAP_INACTIVE;
1758 dev->opt[OPT_GAMMA_VECTOR_B].cap |= SANE_CAP_INACTIVE;
1759 dev->opt[OPT_GAMMA_VECTOR_GRAY].cap |= SANE_CAP_INACTIVE;
1760 dev->opt[OPT_THRESHOLD].cap |= SANE_CAP_INACTIVE;
1762 if (strcmp (dev->val[OPT_MODE].s, BLACK_WHITE_STR) == 0)
1764 dev->depth = 8;
1765 dev->scan_mode = TECO_BW;
1766 dev->opt[OPT_DITHER].cap &= ~SANE_CAP_INACTIVE;
1767 dev->opt[OPT_THRESHOLD].cap &= ~SANE_CAP_INACTIVE;
1769 else if (strcmp (dev->val[OPT_MODE].s, GRAY_STR) == 0)
1771 dev->scan_mode = TECO_GRAYSCALE;
1772 dev->opt[OPT_CUSTOM_GAMMA].cap &= ~SANE_CAP_INACTIVE;
1773 if (dev->val[OPT_CUSTOM_GAMMA].w)
1775 dev->opt[OPT_GAMMA_VECTOR_GRAY].cap &= ~SANE_CAP_INACTIVE;
1777 dev->depth = 8;
1779 else if (strcmp (dev->val[OPT_MODE].s, COLOR_STR) == 0)
1781 dev->scan_mode = TECO_COLOR;
1782 dev->opt[OPT_CUSTOM_GAMMA].cap &= ~SANE_CAP_INACTIVE;
1783 if (dev->val[OPT_CUSTOM_GAMMA].w)
1785 dev->opt[OPT_GAMMA_VECTOR_R].cap &= ~SANE_CAP_INACTIVE;
1786 dev->opt[OPT_GAMMA_VECTOR_G].cap &= ~SANE_CAP_INACTIVE;
1787 dev->opt[OPT_GAMMA_VECTOR_B].cap &= ~SANE_CAP_INACTIVE;
1789 dev->depth = 8;
1802 memcpy (dev->val[option].wa, val, dev->opt[option].size);
1806 dev->val[OPT_CUSTOM_GAMMA].w = *(SANE_Word *) val;
1807 if (dev->val[OPT_CUSTOM_GAMMA].w)
1810 if (dev->scan_mode == TECO_GRAYSCALE)
1812 dev->opt[OPT_GAMMA_VECTOR_GRAY].cap &= ~SANE_CAP_INACTIVE;
1817 dev->opt[OPT_GAMMA_VECTOR_R].cap &= ~SANE_CAP_INACTIVE;
1818 dev->opt[OPT_GAMMA_VECTOR_G].cap &= ~SANE_CAP_INACTIVE;
1819 dev->opt[OPT_GAMMA_VECTOR_B].cap &= ~SANE_CAP_INACTIVE;
1824 dev->opt[OPT_GAMMA_VECTOR_R].cap |= SANE_CAP_INACTIVE;
1825 dev->opt[OPT_GAMMA_VECTOR_G].cap |= SANE_CAP_INACTIVE;
1826 dev->opt[OPT_GAMMA_VECTOR_B].cap |= SANE_CAP_INACTIVE;
1827 dev->opt[OPT_GAMMA_VECTOR_GRAY].cap |= SANE_CAP_INACTIVE;
1848 Teco_Scanner *dev = handle;
1852 if (!(dev->scanning))
1857 if (dev->val[OPT_PREVIEW].w == SANE_TRUE)
1859 dev->x_resolution = 22;
1860 dev->y_resolution = 22;
1861 dev->x_tl = 0;
1862 dev->y_tl = 0;
1863 dev->x_br = mmToIlu (SANE_UNFIX (x_range.max));
1864 dev->y_br = mmToIlu (SANE_UNFIX (y_range.max));
1868 dev->x_resolution = dev->val[OPT_RESOLUTION].w;
1869 dev->y_resolution = dev->val[OPT_RESOLUTION].w;
1870 if (dev->x_resolution > dev->def->x_resolution_max)
1872 dev->x_resolution = dev->def->x_resolution_max;
1875 dev->x_tl = mmToIlu (SANE_UNFIX (dev->val[OPT_TL_X].w));
1876 dev->y_tl = mmToIlu (SANE_UNFIX (dev->val[OPT_TL_Y].w));
1877 dev->x_br = mmToIlu (SANE_UNFIX (dev->val[OPT_BR_X].w));
1878 dev->y_br = mmToIlu (SANE_UNFIX (dev->val[OPT_BR_Y].w));
1882 if (dev->x_tl > dev->x_br)
1885 s = dev->x_tl;
1886 dev->x_tl = dev->x_br;
1887 dev->x_br = s;
1889 if (dev->y_tl > dev->y_br)
1892 s = dev->y_tl;
1893 dev->y_tl = dev->y_br;
1894 dev->y_br = s;
1897 dev->width = dev->x_br - dev->x_tl;
1898 dev->length = dev->y_br - dev->y_tl;
1901 memset (&dev->params, 0, sizeof (SANE_Parameters));
1903 dev->params.last_frame = SANE_TRUE;
1905 switch (dev->scan_mode)
1908 dev->params.format = SANE_FRAME_GRAY;
1909 dev->params.pixels_per_line =
1910 ((dev->width * dev->x_resolution) / 300) & ~0x7;
1911 dev->params.bytes_per_line = dev->params.pixels_per_line / 8;
1912 dev->params.depth = 1;
1913 dev->pass = 1;
1916 dev->params.format = SANE_FRAME_GRAY;
1917 dev->params.pixels_per_line =
1918 ((dev->width * dev->x_resolution) / 300);
1919 dev->params.bytes_per_line = dev->params.pixels_per_line;
1920 dev->params.depth = 8;
1921 dev->pass = 1;
1924 dev->params.format = SANE_FRAME_RGB;
1925 dev->params.pixels_per_line =
1926 ((dev->width * dev->x_resolution) / 300);
1927 dev->pass = dev->def->pass;
1928 dev->params.bytes_per_line = dev->params.pixels_per_line * 3;
1929 dev->params.depth = 8;
1933 dev->params.lines = (dev->length * dev->y_resolution) / 300;
1939 *params = (dev->params);
1950 Teco_Scanner *dev = handle;
1956 if (!(dev->scanning))
1961 (dev->devicename, &(dev->sfd), teco_sense_handler, dev) != 0)
1968 sane_get_parameters (dev, NULL);
1971 status = teco_wait_scanner (dev);
1974 teco_close (dev);
1978 status = teco_mode_select (dev);
1981 teco_close (dev);
1985 if (dev->scan_mode == TECO_COLOR)
1987 dev->pass = dev->def->pass;
1991 dev->pass = 1;
1994 if (dev->def->tecoref != TECO_VM3510)
1996 status = teco_set_window (dev);
1999 teco_close (dev);
2003 dev->real_bytes_left = 0;
2004 status = get_filled_data_length (dev, &size);
2007 teco_close (dev);
2014 teco_vendor_spec (dev);
2017 teco_close (dev);
2022 status = teco_send_gamma (dev);
2025 teco_close (dev);
2029 status = teco_set_window (dev);
2032 teco_close (dev);
2036 status = teco_scan (dev);
2039 teco_close (dev);
2043 if (dev->def->tecoref == TECO_VM3510)
2045 dev->real_bytes_left = 0;
2046 status = get_filled_data_length (dev, &size);
2049 teco_close (dev);
2057 dev->pass--;
2061 if (dev->scan_mode == TECO_COLOR && dev->def->pass > 1)
2066 dev->params.format = frames[dev->pass];
2070 if (dev->pass > 1)
2072 dev->params.last_frame = SANE_FALSE;
2076 dev->params.last_frame = SANE_TRUE;
2079 dev->image_end = 0;
2080 dev->image_begin = 0;
2082 dev->bytes_left = dev->params.bytes_per_line * dev->params.lines;
2083 dev->real_bytes_left = dev->params.bytes_per_line * dev->params.lines;
2085 dev->scanning = SANE_TRUE;
2097 Teco_Scanner *dev = handle;
2105 if (!(dev->scanning))
2108 return do_cancel (dev);
2111 if (dev->bytes_left <= 0)
2120 if (dev->image_begin == dev->image_end)
2123 status = teco_fill_image (dev);
2131 if (dev->image_begin == dev->image_end)
2139 if (size > dev->bytes_left)
2141 size = dev->bytes_left;
2143 teco_copy_raw_to_frontend (dev, buf + buf_offset, &size);
2147 dev->bytes_left -= size;
2151 while ((buf_offset != max_len) && dev->bytes_left);
2154 (long) dev->bytes_left);
2163 Teco_Scanner *dev = handle;
2167 if (dev->scanning == SANE_FALSE)
2199 Teco_Scanner *dev = handle;
2203 do_cancel (dev);
2211 Teco_Scanner *dev = handle;
2216 do_cancel (dev);
2217 teco_close (dev);
2219 /* Unlink dev. */
2220 if (first_dev == dev)
2222 first_dev = dev->next;
2227 while (dev_tmp->next && dev_tmp->next != dev)
2237 teco_free (dev);