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