Lines Matching refs:dev

60    update 2005/07/29. Removed using teco_request_sense (dev) routine for VM3564
544 Teco_Scanner *dev;
549 dev = malloc (sizeof (Teco_Scanner));
550 if (dev == NULL)
555 memset (dev, 0, sizeof (Teco_Scanner));
558 dev->buffer_size = 64 * 1024;
559 dev->buffer = malloc (dev->buffer_size);
560 if (dev->buffer == NULL)
562 free (dev);
566 dev->sfd = -1;
570 return (dev);
575 teco_close (Teco_Scanner * dev)
579 if (dev->sfd != -1)
581 sanei_scsi_close (dev->sfd);
582 dev->sfd = -1;
590 teco_free (Teco_Scanner * dev)
596 if (dev == NULL)
599 teco_close (dev);
600 if (dev->devicename)
602 free (dev->devicename);
604 if (dev->buffer)
606 free (dev->buffer);
610 if (dev->opt[i].type == SANE_TYPE_STRING && dev->val[i].s)
612 free (dev->val[i].s);
615 if (dev->resolutions_list)
616 free (dev->resolutions_list);
618 free (dev);
625 teco_identify_scanner (Teco_Scanner * dev)
637 status = sanei_scsi_cmd2 (dev->sfd, cdb.data, cdb.len,
638 NULL, 0, dev->buffer, &size);
648 size = dev->buffer[4] + 5; /* total length of the inquiry data */
726 memcpy (dev->buffer, table, sizeof (table));
732 status = sanei_scsi_cmd2 (dev->sfd, cdb.data, cdb.len,
733 NULL, 0, dev->buffer, &size);
743 hexdump (DBG_info2, "inquiry", dev->buffer, size);
745 dev->scsi_type = dev->buffer[0] & 0x1f;
746 memcpy (dev->scsi_vendor, dev->buffer + 0x08, 0x08);
747 dev->scsi_vendor[0x08] = 0;
748 memcpy (dev->scsi_product, dev->buffer + 0x10, 0x010);
749 dev->scsi_product[0x10] = 0;
750 memcpy (dev->scsi_version, dev->buffer + 0x20, 0x04);
751 dev->scsi_version[0x04] = 0;
752 memcpy (dev->scsi_teco_name, dev->buffer + 0x2A, 0x0B);
753 dev->scsi_teco_name[0x0B] = 0;
756 dev->scsi_vendor, dev->scsi_product, dev->scsi_version,
757 dev->scsi_teco_name);
763 if (dev->scsi_type == scanners[i].scsi_type &&
764 strcmp (dev->scsi_teco_name, scanners[i].scsi_teco_name) == 0)
771 if (strncmp (dev->scsi_vendor, "RELISYS", 1) == 0 ||
772 strncmp (dev->scsi_vendor, " ", 1) == 0)
777 dev->def = &(scanners[i]);
788 dev->def = &(scanners[i]);
803 teco_set_window (Teco_Scanner * dev)
815 switch (dev->def->tecoref)
842 Ito16 (dev->x_resolution, &window[10]);
843 Ito16 (dev->y_resolution, &window[12]);
846 Ito32 (dev->x_tl, &window[14]);
847 Ito32 (dev->y_tl, &window[18]);
850 Ito32 (dev->width, &window[22]);
851 Ito32 (dev->length, &window[26]);
854 switch (dev->scan_mode)
857 window[31] = dev->val[OPT_THRESHOLD].w;
859 i = get_string_list_index (dither_list, dev->val[OPT_DITHER].s);
871 window[34] = dev->depth;
874 i = get_string_list_index (filter_color_list, dev->val[OPT_FILTER_COLOR].s);
882 if (dev->def->tecoref == TECO_VM656A ||
883 dev->def->tecoref == TECO_VM6575 || dev->def->tecoref == TECO_VM6586)
886 switch (dev->scan_mode)
890 Ito16 (dev->params.bytes_per_line, &window[52]);
893 Ito16 (dev->params.bytes_per_line / 3, &window[52]);
896 Ito16 (dev->params.lines, &window[54]);
902 status = sanei_scsi_cmd2 (dev->sfd, cdb.data, cdb.len,
912 teco_reset_window (Teco_Scanner * dev)
922 status = sanei_scsi_cmd2 (dev->sfd, cdb.data, cdb.len, NULL, 0, NULL, NULL);
936 teco_get_scan_size (Teco_Scanner * dev)
947 status = sanei_scsi_cmd2 (dev->sfd, cdb.data, cdb.len,
948 NULL, 0, dev->buffer, &size);
952 hexdump (DBG_info2, "teco_get_scan_size return", dev->buffer, size);
955 dev->params.lines = B16TOI (&dev->buffer[12]);
956 dev->bytes_per_raster = B16TOI (&dev->buffer[14]);
958 switch (dev->scan_mode)
961 dev->params.bytes_per_line = B16TOI (&dev->buffer[14]);
962 dev->params.pixels_per_line = dev->params.bytes_per_line * 8;
965 dev->params.pixels_per_line = B16TOI (&dev->buffer[14]);
966 dev->params.bytes_per_line = dev->params.pixels_per_line;
969 dev->params.pixels_per_line = B16TOI (&dev->buffer[14]);
970 dev->params.bytes_per_line = dev->params.pixels_per_line * 3;
979 switch (dev->def->tecoref)
983 if (dev->scan_mode == TECO_GRAYSCALE)
985 dev->params.pixels_per_line = 850;
986 dev->params.bytes_per_line = 850;
987 dev->params.lines = 1170;
988 dev->bytes_per_raster = 850;
995 switch (dev->val[OPT_RESOLUTION].w)
998 dev->params.pixels_per_line = 425;
999 dev->params.lines = 585;
1003 dev->params.pixels_per_line = 510;
1004 dev->params.lines = 702;
1008 dev->params.pixels_per_line = 638;
1009 dev->params.lines = 431;
1013 dev->params.pixels_per_line = 402;
1014 dev->params.lines = 575;
1019 dev->params.bytes_per_line = dev->params.pixels_per_line * 3;
1020 dev->bytes_per_raster = dev->params.pixels_per_line;
1025 switch (dev->val[OPT_RESOLUTION].w)
1028 dev->params.pixels_per_line = 297;
1029 dev->params.lines = 296;
1033 dev->params.pixels_per_line = 1186;
1034 dev->params.lines = 1186;
1039 dev->params.bytes_per_line = dev->params.pixels_per_line * 3;
1040 dev->bytes_per_raster = dev->params.pixels_per_line;
1044 s1 = dev->params.bytes_per_line * dev->params.lines;
1067 teco_wait_for_data (Teco_Scanner * dev)
1086 status = sanei_scsi_cmd2 (dev->sfd, cdb.data, cdb.len,
1087 NULL, 0, dev->buffer, &size);
1091 hexdump (DBG_info2, "teco_wait_for_data return", dev->buffer, size);
1093 switch (dev->def->tecoref)
1097 if (dev->buffer[11] > 0x01)
1106 if (dev->buffer[11] == 0x80)
1145 teco_do_calibration (Teco_Scanner * dev)
1169 cal_algo = dev->def->cal_algo;
1180 switch (dev->def->tecoref)
1186 colsub0_1 = 240 + (dev->val[OPT_WHITE_LEVEL_R].w);
1187 colsub0_2 = 240 + (dev->val[OPT_WHITE_LEVEL_G].w);
1188 colsub0_0 = 240 + (dev->val[OPT_WHITE_LEVEL_B].w);
1190 colsub1_1 = 12720 + (40 * dev->val[OPT_WHITE_LEVEL_R].w);
1191 colsub1_2 = 12720 + (40 * dev->val[OPT_WHITE_LEVEL_G].w);
1192 colsub1_0 = 12720 + (40 * dev->val[OPT_WHITE_LEVEL_B].w);
1197 colsub0_1 = 4096 + (8 * dev->val[OPT_WHITE_LEVEL_R].w);
1198 colsub0_2 = 4096 + (8 * dev->val[OPT_WHITE_LEVEL_G].w);
1199 colsub0_0 = 4096 + (8 * dev->val[OPT_WHITE_LEVEL_B].w);
1201 colsub1_1 = 4078639 + (4000 * dev->val[OPT_WHITE_LEVEL_R].w);
1202 colsub1_2 = 4078639 + (4000 * dev->val[OPT_WHITE_LEVEL_G].w);
1203 colsub1_0 = 4078639 + (4000 * dev->val[OPT_WHITE_LEVEL_B].w);
1225 tmp_buf_size = dev->def->cal_length * 3 * sizeof (int);
1226 tmp_min_buf_size = dev->def->cal_length * 3 * sizeof (int);
1227 tmp_max_buf_size = dev->def->cal_length * 3 * sizeof (int);
1232 switch (dev->def->tecoref)
1255 for (i = 0; i < dev->def->cal_lines; i++)
1261 switch (dev->scan_mode)
1275 size = dev->def->cal_length * dev->def->cal_col_len;
1280 status = sanei_scsi_cmd2 (dev->sfd, cdb.data, cdb.len,
1281 NULL, 0, dev->buffer, &size);
1292 for (j = 0; j < dev->def->cal_length; j++)
1294 dev->buffer[6 * j + 0] = 0x10;
1295 dev->buffer[6 * j + 1] = 0x12;
1296 dev->buffer[6 * j + 2] = 0x14;
1297 dev->buffer[6 * j + 3] = 0x16;
1298 dev->buffer[6 * j + 4] = 0x20;
1299 dev->buffer[6 * j + 5] = 0x25;
1302 /*hexdump (DBG_info2, "got calibration line:", dev->buffer, size); */
1304 for (j = 0; j < dev->def->cal_length; j++)
1306 switch (dev->def->tecoref)
1313 (dev->buffer[6 * j + 1] << 8) + dev->buffer[6 * j + 0];
1315 if (tmp_min_buf[3 * j + 0] >> ((dev->buffer[6 * j + 1] << 8) + dev->buffer[6 * j + 0]))
1317 tmp_min_buf[3 * j + 0] = (dev->buffer[6 * j + 1] << 8) + dev->buffer[6 * j + 0];
1320 if (tmp_max_buf[3 * j + 0] < ((dev->buffer[6 * j + 1] << 8) + dev->buffer[6 * j + 0]))
1322 tmp_max_buf[3 * j + 0] = (dev->buffer[6 * j + 1] << 8) + dev->buffer[6 * j + 0];
1325 (dev->buffer[6 * j + 3] << 8) + dev->buffer[6 * j + 2];
1327 if (tmp_min_buf[3 * j + 1] >> ((dev->buffer[6 * j + 3] << 8) + dev->buffer[6 * j + 2]))
1329 tmp_min_buf[3 * j + 1] = (dev->buffer[6 * j + 3] << 8) + dev->buffer[6 * j + 2];
1332 if (tmp_max_buf[3 * j + 1] < ((dev->buffer[6 * j + 3] << 8) + dev->buffer[6 * j + 2]))
1334 tmp_max_buf[3 * j + 1] = (dev->buffer[6 * j + 3] << 8) + dev->buffer[6 * j + 2];
1337 (dev->buffer[6 * j + 5] << 8) + dev->buffer[6 * j + 4];
1339 if (tmp_min_buf[3 * j + 2] >> ((dev->buffer[6 * j + 5] << 8) + dev->buffer[6 * j + 4]))
1341 tmp_min_buf[3 * j + 2] = (dev->buffer[6 * j + 5] << 8) + dev->buffer[6 * j + 4];
1344 if (tmp_max_buf[3 * j + 2] < ((dev->buffer[6 * j + 5] << 8) + dev->buffer[6 * j + 4]))
1346 tmp_max_buf[3 * j + 2] = (dev->buffer[6 * j + 5] << 8) + dev->buffer[6 * j + 4];
1351 tmp_buf[3 * j + 0] += dev->buffer[3 * j + 0];
1353 if (tmp_min_buf[3 * j + 0] >> dev->buffer[3 * j + 0])
1355 tmp_min_buf[3 * j + 0] = dev->buffer[3 * j + 0];
1358 if (tmp_max_buf[3 * j + 0] < dev->buffer[3 * j + 0])
1360 tmp_max_buf[3 * j + 0] = dev->buffer[3 * j + 0];
1362 tmp_buf[3 * j + 1] += dev->buffer[3 * j + 1];
1364 if (tmp_min_buf[3 * j + 1] >> dev->buffer[3 * j + 1])
1366 tmp_min_buf[3 * j + 1] = dev->buffer[3 * j + 1];
1369 if (tmp_max_buf[3 * j + 1] < dev->buffer[3 * j + 1])
1371 tmp_max_buf[3 * j + 1] = dev->buffer[3 * j + 1];
1373 tmp_buf[3 * j + 2] += dev->buffer[3 * j + 2];
1375 if (tmp_min_buf[3 * j + 2] >> dev->buffer[3 * j + 2])
1377 tmp_min_buf[3 * j + 2] = dev->buffer[3 * j + 2];
1380 if (tmp_max_buf[3 * j + 2] < dev->buffer[3 * j + 2])
1382 tmp_max_buf[3 * j + 2] = dev->buffer[3 * j + 2];
1387 (dev->buffer[6 * j + 1] << 8) + dev->buffer[6 * j + 0];
1389 (dev->buffer[6 * j + 3] << 8) + dev->buffer[6 * j + 2];
1391 (dev->buffer[6 * j + 5] << 8) + dev->buffer[6 * j + 4];
1404 switch (dev->def->tecoref)
1412 for (j = 0; j < dev->def->cal_length; j++)
1416 tmp_buf[j + dev->def->cal_length] = tmp_buf[j + dev->def->cal_length]
1417 - (tmp_min_buf[j + dev->def->cal_length]
1418 + tmp_max_buf[j + dev->def->cal_length]);
1419 tmp_buf[j + 2 * dev->def->cal_length] = tmp_buf[j + 2 * dev->def->cal_length]
1420 - (tmp_min_buf[j + 2 * dev->def->cal_length]
1421 + tmp_max_buf[j + 2 *dev->def->cal_length]);
1425 tmp_buf[j] = (colsub1_0 * (dev->def->cal_lines - 2)) / tmp_buf[j];
1426 tmp_buf[j + dev->def->cal_length] = (colsub1_1 * (dev->def->cal_lines - 2))
1427 / tmp_buf[j + dev->def->cal_length];
1428 tmp_buf[j + 2 * dev->def->cal_length] = (colsub1_2 * (dev->def->cal_lines - 2))
1429 / tmp_buf[j + 2 * dev->def->cal_length];
1433 tmp_buf[j] = colsub0_0 - (tmp_buf[j] / (dev->def->cal_lines - 2));
1434 tmp_buf[j + dev->def->cal_length] = colsub0_1 - (tmp_buf[j + dev->def->cal_length]
1435 / (dev->def->cal_lines - 2));
1436 tmp_buf[j + 2 * dev->def->cal_length] = colsub0_2
1437 - (tmp_buf[j + 2 * dev->def->cal_length] / (dev->def->cal_lines - 2));
1442 for (j = 0; j < (3 * dev->def->cal_length); j++)
1445 tmp_buf[j] = (colsub1_1 * dev->def->cal_lines) / tmp_buf[j];
1447 tmp_buf[j] = colsub0_1 - (tmp_buf[j] / dev->def->cal_lines);
1455 for (j = 0; j < dev->def->cal_length; j++)
1458 switch (dev->def->tecoref)
1464 dev->buffer[6 * j + 0] =
1465 (tmp_buf[0 * dev->def->cal_length + j] >> 0) & 0xff;
1466 dev->buffer[6 * j + 1] =
1467 (tmp_buf[0 * dev->def->cal_length + j] >> 8) & 0xff;
1469 dev->buffer[6 * j + 2] =
1470 (tmp_buf[1 * dev->def->cal_length + j] >> 0) & 0xff;
1471 dev->buffer[6 * j + 3] =
1472 (tmp_buf[1 * dev->def->cal_length + j] >> 8) & 0xff;
1474 dev->buffer[6 * j + 4] =
1475 (tmp_buf[2 * dev->def->cal_length + j] >> 0) & 0xff;
1476 dev->buffer[6 * j + 5] =
1477 (tmp_buf[2 * dev->def->cal_length + j] >> 8) & 0xff;
1481 dev->buffer[3 * j + 0] = (tmp_buf[3 * j + 0] >> 0) & 0xff;
1483 dev->buffer[3 * j + 1] = (tmp_buf[3 * j + 1] >> 0) & 0xff;
1485 dev->buffer[3 * j + 2] = (tmp_buf[3 * j + 2] >> 0) & 0xff;
1497 size = dev->def->cal_length * dev->def->cal_col_len;
1500 /*hexdump (DBG_info2, "calibration line sent:", dev->buffer, size); */
1501 status = sanei_scsi_cmd2 (dev->sfd, cdb.data, cdb.len,
1502 dev->buffer, size, NULL, NULL);
1518 teco_request_sense (Teco_Scanner * dev)
1535 status = sanei_scsi_cmd2 (dev->sfd, cdb.data, cdb.len,
1536 NULL, 0, dev->buffer, &size); */
1537 status = sanei_scsi_cmd2 (dev->sfd, cdb.data, cdb.len,
1551 teco_send_gamma (Teco_Scanner * dev)
1571 if (dev->val[OPT_CUSTOM_GAMMA].w)
1574 if (dev->scan_mode == TECO_GRAYSCALE)
1579 param.gamma_R[i] = dev->gamma_GRAY[i];
1580 param.gamma_G[i] = dev->gamma_GRAY[i];
1581 param.gamma_B[i] = dev->gamma_GRAY[i];
1589 param.gamma_R[i] = dev->gamma_R[i];
1590 param.gamma_G[i] = dev->gamma_G[i];
1591 param.gamma_B[i] = dev->gamma_B[i];
1607 switch (dev->def->tecoref)
1614 status = sanei_scsi_cmd2 (dev->sfd, cdb.data, cdb.len,
1624 teco_send_vendor_06 (Teco_Scanner * dev)
1637 status = sanei_scsi_cmd2 (dev->sfd, cdb.data, cdb.len,
1638 NULL, 0, dev->buffer, &size);
1644 memset (dev->buffer, 0, size);
1647 status = sanei_scsi_cmd2 (dev->sfd, cdb.data, cdb.len,
1648 dev->buffer, size, NULL, NULL);
1657 teco_scan (Teco_Scanner * dev)
1667 status = sanei_scsi_cmd2 (dev->sfd, cdb.data, cdb.len, NULL, 0, NULL, NULL);
1735 Teco_Scanner *dev;
1744 for (dev = first_dev; dev; dev = dev->next)
1746 if (strcmp (dev->sane.name, devicename) == 0)
1750 *devp = dev;
1758 dev = teco_init ();
1759 if (dev == NULL)
1767 if (sanei_scsi_open (devicename, &sfd, teco_sense_handler, dev) != 0)
1770 teco_free (dev);
1779 dev->devicename = strdup (devicename);
1780 dev->sfd = sfd;
1783 if (teco_identify_scanner (dev) == SANE_FALSE)
1787 teco_free (dev);
1791 teco_close (dev);
1795 if (dev->def->color_adjust[0].resolution != 0)
1801 while (dev->def->color_adjust[num_entries].resolution != 0)
1804 dev->resolutions_list = malloc (sizeof (SANE_Word) * (num_entries + 1));
1806 if (dev->resolutions_list == NULL)
1810 teco_free (dev);
1814 dev->resolutions_list[0] = num_entries;
1817 dev->resolutions_list[i + 1] = dev->def->color_adjust[i].resolution;
1822 dev->resolutions_list = NULL;
1826 dev->sane.name = dev->devicename;
1827 dev->sane.vendor = dev->def->real_vendor;
1828 dev->sane.model = dev->def->real_product;
1829 dev->sane.type = SANE_I18N ("flatbed scanner");
1832 dev->next = first_dev;
1833 first_dev = dev;
1837 *devp = dev;
1848 attach_one (const char *dev)
1850 attach_scanner (dev, NULL);
1856 teco_init_options (Teco_Scanner * dev)
1861 memset (dev->opt, 0, sizeof (dev->opt));
1862 memset (dev->val, 0, sizeof (dev->val));
1866 dev->opt[i].size = sizeof (SANE_Word);
1867 dev->opt[i].cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT;
1871 dev->opt[OPT_NUM_OPTS].name = "";
1872 dev->opt[OPT_NUM_OPTS].title = SANE_TITLE_NUM_OPTIONS;
1873 dev->opt[OPT_NUM_OPTS].desc = SANE_DESC_NUM_OPTIONS;
1874 dev->opt[OPT_NUM_OPTS].type = SANE_TYPE_INT;
1875 dev->opt[OPT_NUM_OPTS].cap = SANE_CAP_SOFT_DETECT;
1876 dev->val[OPT_NUM_OPTS].w = OPT_NUM_OPTIONS;
1879 dev->opt[OPT_MODE_GROUP].title = SANE_I18N ("Scan Mode");
1880 dev->opt[OPT_MODE_GROUP].desc = ""; /* not valid for a group */
1881 dev->opt[OPT_MODE_GROUP].type = SANE_TYPE_GROUP;
1882 dev->opt[OPT_MODE_GROUP].cap = 0;
1883 dev->opt[OPT_MODE_GROUP].size = 0;
1884 dev->opt[OPT_MODE_GROUP].constraint_type = SANE_CONSTRAINT_NONE;
1887 dev->opt[OPT_MODE].name = SANE_NAME_SCAN_MODE;
1888 dev->opt[OPT_MODE].title = SANE_TITLE_SCAN_MODE;
1889 dev->opt[OPT_MODE].desc = SANE_DESC_SCAN_MODE;
1890 dev->opt[OPT_MODE].type = SANE_TYPE_STRING;
1891 dev->opt[OPT_MODE].size = max_string_size (scan_mode_list);
1892 dev->opt[OPT_MODE].constraint_type = SANE_CONSTRAINT_STRING_LIST;
1893 dev->opt[OPT_MODE].constraint.string_list = scan_mode_list;
1894 dev->val[OPT_MODE].s = (SANE_Char *) strdup (""); /* will be set later */
1897 dev->opt[OPT_RESOLUTION].name = SANE_NAME_SCAN_RESOLUTION;
1898 dev->opt[OPT_RESOLUTION].title = SANE_TITLE_SCAN_RESOLUTION;
1899 dev->opt[OPT_RESOLUTION].desc = SANE_DESC_SCAN_RESOLUTION;
1900 dev->opt[OPT_RESOLUTION].type = SANE_TYPE_INT;
1901 dev->opt[OPT_RESOLUTION].unit = SANE_UNIT_DPI;
1902 dev->opt[OPT_RESOLUTION].constraint_type = SANE_CONSTRAINT_RANGE;
1903 dev->opt[OPT_RESOLUTION].constraint.range = &dev->def->res_range;
1904 dev->val[OPT_RESOLUTION].w = DEF_RESOLUTION;
1907 dev->opt[OPT_GEOMETRY_GROUP].title = SANE_I18N ("Geometry");
1908 dev->opt[OPT_GEOMETRY_GROUP].desc = ""; /* not valid for a group */
1909 dev->opt[OPT_GEOMETRY_GROUP].type = SANE_TYPE_GROUP;
1910 dev->opt[OPT_GEOMETRY_GROUP].cap = 0;
1911 dev->opt[OPT_GEOMETRY_GROUP].size = 0;
1912 dev->opt[OPT_GEOMETRY_GROUP].constraint_type = SANE_CONSTRAINT_NONE;
1915 dev->opt[OPT_TL_X].name = SANE_NAME_SCAN_TL_X;
1916 dev->opt[OPT_TL_X].title = SANE_TITLE_SCAN_TL_X;
1917 dev->opt[OPT_TL_X].desc = SANE_DESC_SCAN_TL_X;
1918 dev->opt[OPT_TL_X].type = SANE_TYPE_FIXED;
1919 dev->opt[OPT_TL_X].unit = SANE_UNIT_MM;
1920 dev->opt[OPT_TL_X].constraint_type = SANE_CONSTRAINT_RANGE;
1921 dev->opt[OPT_TL_X].constraint.range = &dev->def->x_range;
1922 dev->val[OPT_TL_X].w = dev->def->x_range.min;
1925 dev->opt[OPT_TL_Y].name = SANE_NAME_SCAN_TL_Y;
1926 dev->opt[OPT_TL_Y].title = SANE_TITLE_SCAN_TL_Y;
1927 dev->opt[OPT_TL_Y].desc = SANE_DESC_SCAN_TL_Y;
1928 dev->opt[OPT_TL_Y].type = SANE_TYPE_FIXED;
1929 dev->opt[OPT_TL_Y].unit = SANE_UNIT_MM;
1930 dev->opt[OPT_TL_Y].constraint_type = SANE_CONSTRAINT_RANGE;
1931 dev->opt[OPT_TL_Y].constraint.range = &dev->def->y_range;
1932 dev->val[OPT_TL_Y].w = dev->def->y_range.min;
1935 dev->opt[OPT_BR_X].name = SANE_NAME_SCAN_BR_X;
1936 dev->opt[OPT_BR_X].title = SANE_TITLE_SCAN_BR_X;
1937 dev->opt[OPT_BR_X].desc = SANE_DESC_SCAN_BR_X;
1938 dev->opt[OPT_BR_X].type = SANE_TYPE_FIXED;
1939 dev->opt[OPT_BR_X].unit = SANE_UNIT_MM;
1940 dev->opt[OPT_BR_X].constraint_type = SANE_CONSTRAINT_RANGE;
1941 dev->opt[OPT_BR_X].constraint.range = &dev->def->x_range;
1942 dev->val[OPT_BR_X].w = dev->def->x_range.max;
1945 dev->opt[OPT_BR_Y].name = SANE_NAME_SCAN_BR_Y;
1946 dev->opt[OPT_BR_Y].title = SANE_TITLE_SCAN_BR_Y;
1947 dev->opt[OPT_BR_Y].desc = SANE_DESC_SCAN_BR_Y;
1948 dev->opt[OPT_BR_Y].type = SANE_TYPE_FIXED;
1949 dev->opt[OPT_BR_Y].unit = SANE_UNIT_MM;
1950 dev->opt[OPT_BR_Y].constraint_type = SANE_CONSTRAINT_RANGE;
1951 dev->opt[OPT_BR_Y].constraint.range = &dev->def->y_range;
1952 dev->val[OPT_BR_Y].w = dev->def->y_range.max;
1955 dev->opt[OPT_ENHANCEMENT_GROUP].title = SANE_I18N ("Enhancement");
1956 dev->opt[OPT_ENHANCEMENT_GROUP].desc = ""; /* not valid for a group */
1957 dev->opt[OPT_ENHANCEMENT_GROUP].type = SANE_TYPE_GROUP;
1958 dev->opt[OPT_ENHANCEMENT_GROUP].cap = SANE_CAP_ADVANCED;
1959 dev->opt[OPT_ENHANCEMENT_GROUP].size = 0;
1960 dev->opt[OPT_ENHANCEMENT_GROUP].constraint_type = SANE_CONSTRAINT_NONE;
1963 dev->opt[OPT_DITHER].name = "dither";
1964 dev->opt[OPT_DITHER].title = SANE_I18N ("Dither");
1965 dev->opt[OPT_DITHER].desc = SANE_I18N ("Dither");
1966 dev->opt[OPT_DITHER].type = SANE_TYPE_STRING;
1967 dev->opt[OPT_DITHER].size = max_string_size (dither_list);
1968 dev->opt[OPT_DITHER].cap |= SANE_CAP_INACTIVE;
1969 dev->opt[OPT_DITHER].constraint_type = SANE_CONSTRAINT_STRING_LIST;
1970 dev->opt[OPT_DITHER].constraint.string_list = dither_list;
1971 dev->val[OPT_DITHER].s = strdup (dither_list[0]);
1974 dev->opt[OPT_CUSTOM_GAMMA].name = SANE_NAME_CUSTOM_GAMMA;
1975 dev->opt[OPT_CUSTOM_GAMMA].title = SANE_TITLE_CUSTOM_GAMMA;
1976 dev->opt[OPT_CUSTOM_GAMMA].desc = SANE_DESC_CUSTOM_GAMMA;
1977 dev->opt[OPT_CUSTOM_GAMMA].type = SANE_TYPE_BOOL;
1978 dev->opt[OPT_CUSTOM_GAMMA].cap |= SANE_CAP_INACTIVE;
1979 dev->val[OPT_CUSTOM_GAMMA].w = SANE_FALSE;
1982 dev->opt[OPT_GAMMA_VECTOR_R].name = SANE_NAME_GAMMA_VECTOR_R;
1983 dev->opt[OPT_GAMMA_VECTOR_R].title = SANE_TITLE_GAMMA_VECTOR_R;
1984 dev->opt[OPT_GAMMA_VECTOR_R].desc = SANE_DESC_GAMMA_VECTOR_R;
1985 dev->opt[OPT_GAMMA_VECTOR_R].type = SANE_TYPE_INT;
1986 dev->opt[OPT_GAMMA_VECTOR_R].cap |= SANE_CAP_INACTIVE;
1987 dev->opt[OPT_GAMMA_VECTOR_R].unit = SANE_UNIT_NONE;
1988 dev->opt[OPT_GAMMA_VECTOR_R].size = GAMMA_LENGTH * sizeof (SANE_Word);
1989 dev->opt[OPT_GAMMA_VECTOR_R].constraint_type = SANE_CONSTRAINT_RANGE;
1990 dev->opt[OPT_GAMMA_VECTOR_R].constraint.range = &gamma_range;
1991 dev->val[OPT_GAMMA_VECTOR_R].wa = dev->gamma_R;
1994 dev->opt[OPT_GAMMA_VECTOR_G].name = SANE_NAME_GAMMA_VECTOR_G;
1995 dev->opt[OPT_GAMMA_VECTOR_G].title = SANE_TITLE_GAMMA_VECTOR_G;
1996 dev->opt[OPT_GAMMA_VECTOR_G].desc = SANE_DESC_GAMMA_VECTOR_G;
1997 dev->opt[OPT_GAMMA_VECTOR_G].type = SANE_TYPE_INT;
1998 dev->opt[OPT_GAMMA_VECTOR_G].cap |= SANE_CAP_INACTIVE;
1999 dev->opt[OPT_GAMMA_VECTOR_G].unit = SANE_UNIT_NONE;
2000 dev->opt[OPT_GAMMA_VECTOR_G].size = GAMMA_LENGTH * sizeof (SANE_Word);
2001 dev->opt[OPT_GAMMA_VECTOR_G].constraint_type = SANE_CONSTRAINT_RANGE;
2002 dev->opt[OPT_GAMMA_VECTOR_G].constraint.range = &gamma_range;
2003 dev->val[OPT_GAMMA_VECTOR_G].wa = dev->gamma_G;
2006 dev->opt[OPT_GAMMA_VECTOR_B].name = SANE_NAME_GAMMA_VECTOR_B;
2007 dev->opt[OPT_GAMMA_VECTOR_B].title = SANE_TITLE_GAMMA_VECTOR_B;
2008 dev->opt[OPT_GAMMA_VECTOR_B].desc = SANE_DESC_GAMMA_VECTOR_B;
2009 dev->opt[OPT_GAMMA_VECTOR_B].type = SANE_TYPE_INT;
2010 dev->opt[OPT_GAMMA_VECTOR_B].cap |= SANE_CAP_INACTIVE;
2011 dev->opt[OPT_GAMMA_VECTOR_B].unit = SANE_UNIT_NONE;
2012 dev->opt[OPT_GAMMA_VECTOR_B].size = GAMMA_LENGTH * sizeof (SANE_Word);
2013 dev->opt[OPT_GAMMA_VECTOR_B].constraint_type = SANE_CONSTRAINT_RANGE;
2014 dev->opt[OPT_GAMMA_VECTOR_B].constraint.range = &gamma_range;
2015 dev->val[OPT_GAMMA_VECTOR_B].wa = dev->gamma_B;
2018 dev->opt[OPT_GAMMA_VECTOR_GRAY].name = SANE_NAME_GAMMA_VECTOR;
2019 dev->opt[OPT_GAMMA_VECTOR_GRAY].title = SANE_TITLE_GAMMA_VECTOR;
2020 dev->opt[OPT_GAMMA_VECTOR_GRAY].desc = SANE_DESC_GAMMA_VECTOR;
2021 dev->opt[OPT_GAMMA_VECTOR_GRAY].type = SANE_TYPE_INT;
2022 dev->opt[OPT_GAMMA_VECTOR_GRAY].cap |= SANE_CAP_INACTIVE;
2023 dev->opt[OPT_GAMMA_VECTOR_GRAY].unit = SANE_UNIT_NONE;
2024 dev->opt[OPT_GAMMA_VECTOR_GRAY].size = GAMMA_LENGTH * sizeof (SANE_Word);
2025 dev->opt[OPT_GAMMA_VECTOR_GRAY].constraint_type = SANE_CONSTRAINT_RANGE;
2026 dev->opt[OPT_GAMMA_VECTOR_GRAY].constraint.range = &gamma_range;
2027 dev->val[OPT_GAMMA_VECTOR_GRAY].wa = dev->gamma_GRAY;
2030 dev->opt[OPT_FILTER_COLOR].name = "color-filter";
2031 dev->opt[OPT_FILTER_COLOR].title = "Color dropout";
2032 dev->opt[OPT_FILTER_COLOR].desc = "Color dropout";
2033 dev->opt[OPT_FILTER_COLOR].type = SANE_TYPE_STRING;
2034 dev->opt[OPT_FILTER_COLOR].size = max_string_size (filter_color_list);
2035 dev->opt[OPT_FILTER_COLOR].cap |= SANE_CAP_INACTIVE;
2036 dev->opt[OPT_FILTER_COLOR].constraint_type = SANE_CONSTRAINT_STRING_LIST;
2037 dev->opt[OPT_FILTER_COLOR].constraint.string_list = filter_color_list;
2038 dev->val[OPT_FILTER_COLOR].s = (SANE_Char *) strdup (filter_color_list[0]);
2041 dev->opt[OPT_THRESHOLD].name = SANE_NAME_THRESHOLD;
2042 dev->opt[OPT_THRESHOLD].title = SANE_TITLE_THRESHOLD;
2043 dev->opt[OPT_THRESHOLD].desc = SANE_DESC_THRESHOLD;
2044 dev->opt[OPT_THRESHOLD].type = SANE_TYPE_INT;
2045 dev->opt[OPT_THRESHOLD].unit = SANE_UNIT_NONE;
2046 dev->opt[OPT_THRESHOLD].size = sizeof (SANE_Int);
2047 dev->opt[OPT_THRESHOLD].cap |= SANE_CAP_INACTIVE;
2048 dev->opt[OPT_THRESHOLD].constraint_type = SANE_CONSTRAINT_RANGE;
2049 dev->opt[OPT_THRESHOLD].constraint.range = &threshold_range;
2050 dev->val[OPT_THRESHOLD].w = 128;
2053 dev->opt[OPT_PREVIEW].name = SANE_NAME_PREVIEW;
2054 dev->opt[OPT_PREVIEW].title = SANE_TITLE_PREVIEW;
2055 dev->opt[OPT_PREVIEW].desc = SANE_DESC_PREVIEW;
2056 dev->opt[OPT_PREVIEW].type = SANE_TYPE_BOOL;
2057 dev->opt[OPT_PREVIEW].cap = SANE_CAP_SOFT_DETECT | SANE_CAP_SOFT_SELECT;
2058 dev->val[OPT_PREVIEW].w = SANE_FALSE;
2061 dev->opt[OPT_WHITE_LEVEL_R].name = SANE_NAME_WHITE_LEVEL_R;
2062 dev->opt[OPT_WHITE_LEVEL_R].title = SANE_TITLE_WHITE_LEVEL_R;
2063 dev->opt[OPT_WHITE_LEVEL_R].desc = SANE_DESC_WHITE_LEVEL_R;
2064 dev->opt[OPT_WHITE_LEVEL_R].type = SANE_TYPE_INT;
2065 dev->opt[OPT_WHITE_LEVEL_R].unit = SANE_UNIT_NONE;
2066 dev->opt[OPT_WHITE_LEVEL_R].constraint_type = SANE_CONSTRAINT_RANGE;
2067 dev->opt[OPT_WHITE_LEVEL_R].constraint.range = &red_level_range;
2068 dev->val[OPT_WHITE_LEVEL_R].w = 32; /* to get middle value */
2071 dev->opt[OPT_WHITE_LEVEL_G].name = SANE_NAME_WHITE_LEVEL_G;
2072 dev->opt[OPT_WHITE_LEVEL_G].title = SANE_TITLE_WHITE_LEVEL_G;
2073 dev->opt[OPT_WHITE_LEVEL_G].desc = SANE_DESC_WHITE_LEVEL_G;
2074 dev->opt[OPT_WHITE_LEVEL_G].type = SANE_TYPE_INT;
2075 dev->opt[OPT_WHITE_LEVEL_G].unit = SANE_UNIT_NONE;
2076 dev->opt[OPT_WHITE_LEVEL_G].constraint_type = SANE_CONSTRAINT_RANGE;
2077 dev->opt[OPT_WHITE_LEVEL_G].constraint.range = &green_level_range;
2078 dev->val[OPT_WHITE_LEVEL_G].w = 32; /* to get middle value */
2081 dev->opt[OPT_WHITE_LEVEL_B].name = SANE_NAME_WHITE_LEVEL_B;
2082 dev->opt[OPT_WHITE_LEVEL_B].title = SANE_TITLE_WHITE_LEVEL_B;
2083 dev->opt[OPT_WHITE_LEVEL_B].desc = SANE_DESC_WHITE_LEVEL_B;
2084 dev->opt[OPT_WHITE_LEVEL_B].type = SANE_TYPE_INT;
2085 dev->opt[OPT_WHITE_LEVEL_B].unit = SANE_UNIT_NONE;
2086 dev->opt[OPT_WHITE_LEVEL_B].constraint_type = SANE_CONSTRAINT_RANGE;
2087 dev->opt[OPT_WHITE_LEVEL_B].constraint.range = &blue_level_range;
2088 dev->val[OPT_WHITE_LEVEL_B].w = 32; /* to get middle value */
2092 sane_control_option (dev, OPT_MODE, SANE_ACTION_SET_VALUE,
2100 teco_wait_scanner (Teco_Scanner * dev)
2118 status = sanei_scsi_cmd (dev->sfd, cdb.data, cdb.len, NULL, NULL);
2158 * dev->buffer and write the output in dev->image. size_in the the
2159 * length of the valid data in dev->buffer. */
2166 teco_adjust_raster (Teco_Scanner * dev, size_t size_in)
2168 int nb_rasters; /* number of rasters in dev->buffer */
2174 const struct dpi_color_adjust *color_adjust = dev->color_adjust;
2180 assert (dev->scan_mode == TECO_COLOR);
2181 assert ((size_in % dev->params.bytes_per_line) == 0);
2193 nb_rasters = size_in / dev->raster_size;
2202 if (dev->raster_num < color_adjust->color_shift)
2213 line = dev->raster_num;
2215 else if (dev->raster_num < (3 * color_adjust->color_shift))
2218 if ((dev->raster_num - color_adjust->color_shift) % 2)
2221 line = (dev->raster_num - color_adjust->color_shift) / 2;
2233 line = (dev->raster_num + color_adjust->color_shift) / 2;
2236 else if (dev->raster_num >=
2237 dev->raster_real - color_adjust->color_shift)
2248 line = dev->line;
2250 else if (dev->raster_num >=
2251 dev->raster_real - 3 * color_adjust->color_shift)
2254 if ((dev->raster_real - dev->raster_num -
2260 line = dev->line;
2265 line = dev->line + color_adjust->color_shift - 1;
2273 line = dev->line + color_adjust->color_shift;
2278 line = dev->line;
2285 switch ((dev->raster_num) % 3)
2290 line = dev->raster_num / 3 + color_adjust->color_shift;
2292 line = dev->raster_num / 3 - color_adjust->color_shift;
2296 line = dev->raster_num / 3;
2301 line = dev->raster_num / 3 - color_adjust->color_shift;
2303 line = dev->raster_num / 3 + color_adjust->color_shift;
2309 line -= dev->line;
2311 offset = dev->image_end + line * dev->params.bytes_per_line;
2313 assert (offset <= (dev->image_size - dev->params.bytes_per_line));
2318 unsigned char *src = dev->buffer + raster * dev->raster_size;
2319 unsigned char *dest = dev->image + offset + color;
2321 for (i = 0; i < dev->raster_size; i++)
2329 DBG (DBG_info, "raster=%d, line=%d, color=%d\n", dev->raster_num,
2330 dev->line + line, color);
2336 dev->line++;
2337 dev->image_end += dev->params.bytes_per_line;
2340 dev->raster_num++;
2348 teco_fill_image (Teco_Scanner * dev)
2356 assert (dev->image_begin == dev->image_end);
2357 assert (dev->real_bytes_left > 0);
2365 memmove (dev->image, dev->image + dev->image_begin, dev->raster_ahead);
2367 dev->image_begin = 0;
2368 dev->image_end = 0;
2370 while (dev->real_bytes_left)
2375 size = dev->real_bytes_left;
2376 if (size > dev->image_size - dev->raster_ahead - dev->image_end)
2378 size = dev->image_size - dev->raster_ahead - dev->image_end;
2380 if (size > dev->buffer_size)
2382 size = dev->buffer_size;
2390 size = size - (size % dev->params.bytes_per_line);
2396 assert (dev->image_end != 0);
2401 (long) size, dev->params.bytes_per_line);
2404 cdb.data[5] = size / dev->params.bytes_per_line;
2409 status = sanei_scsi_cmd2 (dev->sfd, cdb.data, cdb.len,
2410 NULL, 0, dev->buffer, &size);
2413 memcpy (dev->buffer, image_buf + image_buf_begin, size);
2424 (long) dev->real_bytes_left);
2426 if (dev->scan_mode == TECO_COLOR &&
2427 dev->def->tecoref != TECO_VM656A && raw_output == 0)
2429 teco_adjust_raster (dev, size);
2433 memcpy (dev->image + dev->image_end, dev->buffer, size);
2434 dev->image_end += size;
2436 dev->real_bytes_left -= size;
2448 teco_copy_raw_to_frontend (Teco_Scanner * dev, SANE_Byte * buf, size_t * len)
2452 size = dev->image_end - dev->image_begin;
2459 switch (dev->scan_mode)
2464 unsigned char *src = dev->image + dev->image_begin;
2478 memcpy (buf, dev->image + dev->image_begin, size);
2482 dev->image_begin += size;
2487 do_cancel (Teco_Scanner * dev)
2491 if (dev->scanning == SANE_TRUE)
2495 teco_reset_window (dev);
2496 teco_close (dev);
2499 dev->scanning = SANE_FALSE;
2533 /* default to /dev/scanner instead of insisting on config file */
2534 attach_scanner ("/dev/scanner", 0);
2560 Teco_Scanner *dev;
2573 for (dev = first_dev; i < num_devices; dev = dev->next)
2574 devlist[i++] = &dev->sane;
2587 Teco_Scanner *dev;
2598 for (dev = first_dev; dev; dev = dev->next)
2600 if (strcmp (dev->sane.name, devicename) == 0)
2606 if (!dev)
2608 status = attach_scanner (devicename, &dev);
2618 dev = first_dev; /* empty devicename -> use first device */
2621 if (!dev)
2628 teco_init_options (dev);
2633 dev->gamma_R[i] = i / 4;
2634 dev->gamma_G[i] = i / 4;
2635 dev->gamma_B[i] = i / 4;
2636 dev->gamma_GRAY[i] = i / 4;
2639 *handle = dev;
2649 Teco_Scanner *dev = handle;
2660 return dev->opt + option;
2667 Teco_Scanner *dev = handle;
2679 if (dev->scanning)
2689 cap = dev->opt[option].cap;
2713 *(SANE_Word *) val = dev->val[option].w;
2720 strcpy (val, dev->val[option].s);
2728 memcpy (val, dev->val[option].wa, dev->opt[option].size);
2744 status = sanei_constrain_value (dev->opt + option, val, info);
2768 dev->val[option].w = *(SANE_Word *) val;
2773 dev->val[option].w = *(SANE_Word *) val;
2778 free (dev->val[option].s);
2779 dev->val[option].s = (SANE_String) strdup (val);
2783 free (dev->val[option].s);
2784 dev->val[option].s = (SANE_String) strdup (val);
2789 if (strcmp (dev->val[option].s, val) == 0)
2792 free (dev->val[OPT_MODE].s);
2793 dev->val[OPT_MODE].s = (SANE_Char *) strdup (val);
2795 dev->opt[OPT_CUSTOM_GAMMA].cap |= SANE_CAP_INACTIVE;
2796 dev->opt[OPT_GAMMA_VECTOR_R].cap |= SANE_CAP_INACTIVE;
2797 dev->opt[OPT_GAMMA_VECTOR_G].cap |= SANE_CAP_INACTIVE;
2798 dev->opt[OPT_GAMMA_VECTOR_B].cap |= SANE_CAP_INACTIVE;
2799 dev->opt[OPT_GAMMA_VECTOR_GRAY].cap |= SANE_CAP_INACTIVE;
2800 dev->opt[OPT_DITHER].cap |= SANE_CAP_INACTIVE;
2801 dev->opt[OPT_FILTER_COLOR].cap |= SANE_CAP_INACTIVE;
2802 dev->opt[OPT_THRESHOLD].cap |= SANE_CAP_INACTIVE;
2803 dev->opt[OPT_WHITE_LEVEL_R].cap |= SANE_CAP_INACTIVE;
2804 dev->opt[OPT_WHITE_LEVEL_G].cap |= SANE_CAP_INACTIVE;
2805 dev->opt[OPT_WHITE_LEVEL_B].cap |= SANE_CAP_INACTIVE;
2810 dev->opt[OPT_RESOLUTION].constraint_type = SANE_CONSTRAINT_RANGE;
2811 dev->opt[OPT_RESOLUTION].constraint.range = &dev->def->res_range;
2813 if (strcmp (dev->val[OPT_MODE].s, SANE_VALUE_SCAN_MODE_LINEART) == 0)
2815 dev->scan_mode = TECO_BW;
2816 dev->depth = 8;
2817 dev->opt[OPT_DITHER].cap &= ~SANE_CAP_INACTIVE;
2818 dev->opt[OPT_FILTER_COLOR].cap &= ~SANE_CAP_INACTIVE;
2819 dev->opt[OPT_THRESHOLD].cap &= ~SANE_CAP_INACTIVE;
2821 else if (strcmp (dev->val[OPT_MODE].s, SANE_VALUE_SCAN_MODE_GRAY) == 0)
2823 dev->scan_mode = TECO_GRAYSCALE;
2824 dev->depth = 8;
2826 switch (dev->def->tecoref)
2830 dev->opt[OPT_WHITE_LEVEL_R].cap &= ~SANE_CAP_INACTIVE;
2831 dev->opt[OPT_WHITE_LEVEL_G].cap &= ~SANE_CAP_INACTIVE;
2832 dev->opt[OPT_WHITE_LEVEL_B].cap &= ~SANE_CAP_INACTIVE;
2836 dev->opt[OPT_WHITE_LEVEL_R].cap &= ~SANE_CAP_INACTIVE;
2837 dev->opt[OPT_WHITE_LEVEL_G].cap &= ~SANE_CAP_INACTIVE;
2838 dev->opt[OPT_WHITE_LEVEL_B].cap &= ~SANE_CAP_INACTIVE;
2839 dev->opt[OPT_CUSTOM_GAMMA].cap &= ~SANE_CAP_INACTIVE;
2840 if (dev->val[OPT_CUSTOM_GAMMA].w)
2842 dev->opt[OPT_GAMMA_VECTOR_GRAY].cap &=
2848 dev->opt[OPT_CUSTOM_GAMMA].cap &= ~SANE_CAP_INACTIVE;
2849 if (dev->val[OPT_CUSTOM_GAMMA].w)
2851 dev->opt[OPT_GAMMA_VECTOR_GRAY].cap &=
2856 dev->opt[OPT_FILTER_COLOR].cap &= ~SANE_CAP_INACTIVE;
2858 else if (strcmp (dev->val[OPT_MODE].s, SANE_VALUE_SCAN_MODE_COLOR) == 0)
2860 dev->scan_mode = TECO_COLOR;
2861 dev->depth = 8;
2863 switch (dev->def->tecoref)
2867 dev->opt[OPT_WHITE_LEVEL_R].cap &= ~SANE_CAP_INACTIVE;
2868 dev->opt[OPT_WHITE_LEVEL_G].cap &= ~SANE_CAP_INACTIVE;
2869 dev->opt[OPT_WHITE_LEVEL_B].cap &= ~SANE_CAP_INACTIVE;
2873 dev->opt[OPT_WHITE_LEVEL_R].cap &= ~SANE_CAP_INACTIVE;
2874 dev->opt[OPT_WHITE_LEVEL_G].cap &= ~SANE_CAP_INACTIVE;
2875 dev->opt[OPT_WHITE_LEVEL_B].cap &= ~SANE_CAP_INACTIVE;
2876 dev->opt[OPT_CUSTOM_GAMMA].cap &= ~SANE_CAP_INACTIVE;
2877 if (dev->val[OPT_CUSTOM_GAMMA].w)
2879 dev->opt[OPT_GAMMA_VECTOR_R].cap &= ~SANE_CAP_INACTIVE;
2880 dev->opt[OPT_GAMMA_VECTOR_G].cap &= ~SANE_CAP_INACTIVE;
2881 dev->opt[OPT_GAMMA_VECTOR_B].cap &= ~SANE_CAP_INACTIVE;
2886 dev->opt[OPT_CUSTOM_GAMMA].cap &= ~SANE_CAP_INACTIVE;
2887 if (dev->val[OPT_CUSTOM_GAMMA].w)
2889 dev->opt[OPT_GAMMA_VECTOR_R].cap &= ~SANE_CAP_INACTIVE;
2890 dev->opt[OPT_GAMMA_VECTOR_G].cap &= ~SANE_CAP_INACTIVE;
2891 dev->opt[OPT_GAMMA_VECTOR_B].cap &= ~SANE_CAP_INACTIVE;
2897 if (dev->resolutions_list != NULL)
2901 dev->opt[OPT_RESOLUTION].constraint_type =
2903 dev->opt[OPT_RESOLUTION].constraint.word_list =
2904 dev->resolutions_list;
2907 for (i = 1; i <= dev->resolutions_list[0]; i++)
2909 if (dev->resolutions_list[i] >=
2910 dev->val[OPT_RESOLUTION].w)
2913 if (i > dev->resolutions_list[0])
2916 dev->val[OPT_RESOLUTION].w = DEF_RESOLUTION;
2921 dev->val[OPT_RESOLUTION].w = dev->resolutions_list[i];
2936 memcpy (dev->val[option].wa, val, dev->opt[option].size);
2940 dev->val[OPT_CUSTOM_GAMMA].w = *(SANE_Word *) val;
2941 if (dev->val[OPT_CUSTOM_GAMMA].w)
2944 if (dev->scan_mode == TECO_GRAYSCALE)
2946 dev->opt[OPT_GAMMA_VECTOR_GRAY].cap &= ~SANE_CAP_INACTIVE;
2951 dev->opt[OPT_GAMMA_VECTOR_R].cap &= ~SANE_CAP_INACTIVE;
2952 dev->opt[OPT_GAMMA_VECTOR_G].cap &= ~SANE_CAP_INACTIVE;
2953 dev->opt[OPT_GAMMA_VECTOR_B].cap &= ~SANE_CAP_INACTIVE;
2958 dev->opt[OPT_GAMMA_VECTOR_R].cap |= SANE_CAP_INACTIVE;
2959 dev->opt[OPT_GAMMA_VECTOR_G].cap |= SANE_CAP_INACTIVE;
2960 dev->opt[OPT_GAMMA_VECTOR_B].cap |= SANE_CAP_INACTIVE;
2981 Teco_Scanner *dev = handle;
2985 if (!(dev->scanning))
2990 if (dev->val[OPT_PREVIEW].w == SANE_TRUE)
2994 switch (dev->def->tecoref)
2998 dev->x_resolution = 75;
2999 dev->y_resolution = 75;
3003 dev->x_resolution = 50;
3004 dev->y_resolution = 50;
3007 dev->x_tl = 0;
3008 dev->y_tl = 0;
3009 dev->x_br = mmToIlu (SANE_UNFIX (dev->def->x_range.max));
3010 dev->y_br = mmToIlu (SANE_UNFIX (dev->def->y_range.max));
3014 dev->x_resolution = dev->val[OPT_RESOLUTION].w;
3015 dev->y_resolution = dev->val[OPT_RESOLUTION].w;
3017 dev->x_tl = mmToIlu (SANE_UNFIX (dev->val[OPT_TL_X].w));
3018 dev->y_tl = mmToIlu (SANE_UNFIX (dev->val[OPT_TL_Y].w));
3019 dev->x_br = mmToIlu (SANE_UNFIX (dev->val[OPT_BR_X].w));
3020 dev->y_br = mmToIlu (SANE_UNFIX (dev->val[OPT_BR_Y].w));
3023 if (dev->x_resolution > dev->def->x_resolution_max)
3025 dev->x_resolution = dev->def->x_resolution_max;
3029 if (dev->x_tl > dev->x_br)
3032 s = dev->x_tl;
3033 dev->x_tl = dev->x_br;
3034 dev->x_br = s;
3036 if (dev->y_tl > dev->y_br)
3039 s = dev->y_tl;
3040 dev->y_tl = dev->y_br;
3041 dev->y_br = s;
3044 dev->width = dev->x_br - dev->x_tl;
3045 dev->length = dev->y_br - dev->y_tl;
3048 memset (&dev->params, 0, sizeof (SANE_Parameters));
3050 dev->params.last_frame = SANE_TRUE;
3052 switch (dev->scan_mode)
3055 dev->params.format = SANE_FRAME_GRAY;
3056 dev->params.pixels_per_line =
3057 ((dev->width * dev->x_resolution) /
3058 dev->def->x_resolution_max) & ~0x7;
3059 dev->params.bytes_per_line = dev->params.pixels_per_line / 8;
3060 dev->params.depth = 1;
3061 dev->color_adjust = NULL;
3064 dev->params.format = SANE_FRAME_GRAY;
3065 dev->params.pixels_per_line =
3066 ((dev->width * dev->x_resolution) / dev->def->x_resolution_max);
3067 if ((dev->def->tecoref == TECO_VM656A
3068 || dev->def->tecoref == TECO_VM6586)
3069 && ((dev->width * dev->x_resolution) %
3070 dev->def->x_resolution_max != 0))
3073 dev->params.pixels_per_line += 1;
3075 dev->params.bytes_per_line = dev->params.pixels_per_line;
3076 dev->params.depth = 8;
3077 dev->color_adjust = NULL;
3080 dev->params.format = SANE_FRAME_RGB;
3081 dev->params.pixels_per_line =
3082 ((dev->width * dev->x_resolution) / dev->def->x_resolution_max);
3083 if ((dev->def->tecoref == TECO_VM656A
3084 || dev->def->tecoref == TECO_VM6586)
3085 && ((dev->width * dev->x_resolution) %
3086 dev->def->x_resolution_max != 0))
3089 dev->params.pixels_per_line += 1;
3091 dev->params.bytes_per_line = dev->params.pixels_per_line * 3;
3092 dev->params.depth = 8;
3094 if (dev->resolutions_list != NULL)
3102 dev->def->color_adjust[i].resolution != dev->y_resolution;
3105 dev->color_adjust = &dev->def->color_adjust[i];
3109 dev->color_adjust = &dev->def->color_adjust[0];
3114 dev->params.lines =
3115 (dev->length * dev->y_resolution) / dev->def->x_resolution_max;
3121 *params = (dev->params);
3132 Teco_Scanner *dev = handle;
3137 if (!(dev->scanning))
3140 sane_get_parameters (dev, NULL);
3144 (dev->devicename, &(dev->sfd), teco_sense_handler, dev) != 0)
3151 status = teco_wait_scanner (dev);
3154 teco_close (dev);
3158 status = teco_set_window (dev);
3161 teco_close (dev);
3165 status = teco_get_scan_size (dev);
3168 teco_close (dev);
3176 if (dev->color_adjust)
3178 dev->raster_ahead =
3179 (2 * dev->color_adjust->color_shift) * dev->params.bytes_per_line;
3183 dev->raster_ahead = 0;
3185 dev->image_size = dev->buffer_size + dev->raster_ahead;
3186 dev->image = malloc (dev->image_size);
3187 if (dev->image == NULL)
3193 dev->raster_size = dev->params.pixels_per_line;
3194 dev->raster_real = dev->params.lines * 3;
3195 dev->raster_num = 0;
3196 dev->line = 0;
3199 status = teco_do_calibration (dev);
3202 teco_close (dev);
3207 switch (dev->def->tecoref)
3212 status = teco_request_sense (dev);
3215 teco_close (dev);
3223 status = teco_send_gamma (dev);
3226 teco_close (dev);
3230 status = teco_set_window (dev);
3233 teco_close (dev);
3236 switch (dev->def->tecoref)
3242 status = teco_send_vendor_06 (dev);
3245 teco_close (dev);
3249 status = teco_scan (dev);
3252 teco_close (dev);
3256 status = teco_wait_for_data (dev);
3259 teco_close (dev);
3264 dev->image_end = 0;
3265 dev->image_begin = 0;
3267 dev->bytes_left = dev->params.bytes_per_line * dev->params.lines;
3268 dev->real_bytes_left = dev->params.bytes_per_line * dev->params.lines;
3270 dev->scanning = SANE_TRUE;
3282 Teco_Scanner *dev = handle;
3290 if (!(dev->scanning))
3293 return do_cancel (dev);
3296 if (dev->bytes_left <= 0)
3305 if (dev->image_begin == dev->image_end)
3308 status = teco_fill_image (dev);
3317 assert (dev->image_begin != dev->image_end);
3319 if (dev->image_begin == dev->image_end)
3328 if (size > dev->bytes_left)
3330 size = dev->bytes_left;
3332 teco_copy_raw_to_frontend (dev, buf + buf_offset, &size);
3336 dev->bytes_left -= size;
3340 while ((buf_offset != max_len) && dev->bytes_left);
3342 DBG (DBG_info, "sane_read: leave, bytes_left=%ld\n", (long) dev->bytes_left);
3351 Teco_Scanner *dev = handle;
3355 if (dev->scanning == SANE_FALSE)
3387 Teco_Scanner *dev = handle;
3391 do_cancel (dev);
3399 Teco_Scanner *dev = handle;
3404 do_cancel (dev);
3405 teco_close (dev);
3407 /* Unlink dev. */
3408 if (first_dev == dev)
3410 first_dev = dev->next;
3415 while (dev_tmp->next && dev_tmp->next != dev)
3425 teco_free (dev);