Lines Matching refs:scanner
51 * the scanner returns AdLib
170 /* options supported by the scanner */
227 /* This structure holds the information about a physical scanner */
233 char *devicename; /* name of the scanner device */
264 int inquiry_color_format; /* colour format from scanner */
266 int inquiry_scan_capability; /* additional scanner features, number of speeds */
279 SANE_String halftone_list[17]; /* holds the names of the halftone patterns from the scanner */
288 /* This structure holds information about an instance of an 'opened' scanner */
293 Pie_Device *device; /* pointer to physical scanner */
295 int sfd; /* scanner file desc. */
337 static SANE_Status pie_wait_scanner (Pie_Scanner * scanner);
860 } /* no scanner */
888 DBG (DBG_info, "Found %s scanner %s version %s on device %s\n", vendor,
899 DBG (DBG_info, "found supported scanner\n");
908 return 1; /* NO SUPPORTED SCANNER: short inquiry-block and unknown scanner */
1160 DBG (DBG_error, "attach_scanner: scanner-identification failed\n");
1181 dev->sane.type = "flatbed scanner";
1252 init_options (Pie_Scanner * scanner)
1258 memset (scanner->opt, 0, sizeof (scanner->opt));
1259 memset (scanner->val, 0, sizeof (scanner->val));
1263 scanner->opt[i].size = sizeof (SANE_Word);
1264 scanner->opt[i].cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT;
1267 scanner->opt[OPT_NUM_OPTS].title = SANE_TITLE_NUM_OPTIONS;
1268 scanner->opt[OPT_NUM_OPTS].desc = SANE_DESC_NUM_OPTIONS;
1269 scanner->opt[OPT_NUM_OPTS].type = SANE_TYPE_INT;
1270 scanner->opt[OPT_NUM_OPTS].cap = SANE_CAP_SOFT_DETECT;
1271 scanner->val[OPT_NUM_OPTS].w = NUM_OPTIONS;
1274 scanner->opt[OPT_MODE_GROUP].title = "Scan Mode";
1275 scanner->opt[OPT_MODE_GROUP].desc = "";
1276 scanner->opt[OPT_MODE_GROUP].type = SANE_TYPE_GROUP;
1277 scanner->opt[OPT_MODE_GROUP].cap = 0;
1278 scanner->opt[OPT_MODE_GROUP].constraint_type = SANE_CONSTRAINT_NONE;
1281 scanner->opt[OPT_MODE].name = SANE_NAME_SCAN_MODE;
1282 scanner->opt[OPT_MODE].title = SANE_TITLE_SCAN_MODE;
1283 scanner->opt[OPT_MODE].desc = SANE_DESC_SCAN_MODE;
1284 scanner->opt[OPT_MODE].type = SANE_TYPE_STRING;
1285 scanner->opt[OPT_MODE].size =
1286 max_string_size ((SANE_String_Const *) scanner->device->scan_mode_list);
1287 scanner->opt[OPT_MODE].constraint_type = SANE_CONSTRAINT_STRING_LIST;
1288 scanner->opt[OPT_MODE].constraint.string_list =
1289 (SANE_String_Const *) scanner->device->scan_mode_list;
1290 scanner->val[OPT_MODE].s =
1291 (SANE_Char *) strdup (scanner->device->scan_mode_list[0]);
1294 scanner->opt[OPT_RESOLUTION].name = SANE_NAME_SCAN_RESOLUTION;
1295 scanner->opt[OPT_RESOLUTION].title = SANE_TITLE_SCAN_RESOLUTION;
1296 scanner->opt[OPT_RESOLUTION].desc = SANE_DESC_SCAN_RESOLUTION;
1297 scanner->opt[OPT_RESOLUTION].type = SANE_TYPE_FIXED;
1298 scanner->opt[OPT_RESOLUTION].unit = SANE_UNIT_DPI;
1299 scanner->opt[OPT_RESOLUTION].constraint_type = SANE_CONSTRAINT_RANGE;
1300 scanner->opt[OPT_RESOLUTION].constraint.range = &scanner->device->dpi_range;
1301 scanner->val[OPT_RESOLUTION].w = 100 << SANE_FIXED_SCALE_SHIFT;
1305 scanner->opt[OPT_GEOMETRY_GROUP].title = "Geometry";
1306 scanner->opt[OPT_GEOMETRY_GROUP].desc = "";
1307 scanner->opt[OPT_GEOMETRY_GROUP].type = SANE_TYPE_GROUP;
1308 scanner->opt[OPT_GEOMETRY_GROUP].cap = SANE_CAP_ADVANCED;
1309 scanner->opt[OPT_GEOMETRY_GROUP].constraint_type = SANE_CONSTRAINT_NONE;
1312 scanner->opt[OPT_TL_X].name = SANE_NAME_SCAN_TL_X;
1313 scanner->opt[OPT_TL_X].title = SANE_TITLE_SCAN_TL_X;
1314 scanner->opt[OPT_TL_X].desc = SANE_DESC_SCAN_TL_X;
1315 scanner->opt[OPT_TL_X].type = SANE_TYPE_FIXED;
1316 scanner->opt[OPT_TL_X].unit = SANE_UNIT_MM;
1317 scanner->opt[OPT_TL_X].constraint_type = SANE_CONSTRAINT_RANGE;
1318 scanner->opt[OPT_TL_X].constraint.range = &(scanner->device->x_range);
1319 scanner->val[OPT_TL_X].w = 0;
1322 scanner->opt[OPT_TL_Y].name = SANE_NAME_SCAN_TL_Y;
1323 scanner->opt[OPT_TL_Y].title = SANE_TITLE_SCAN_TL_Y;
1324 scanner->opt[OPT_TL_Y].desc = SANE_DESC_SCAN_TL_Y;
1325 scanner->opt[OPT_TL_Y].type = SANE_TYPE_FIXED;
1326 scanner->opt[OPT_TL_Y].unit = SANE_UNIT_MM;
1327 scanner->opt[OPT_TL_Y].constraint_type = SANE_CONSTRAINT_RANGE;
1328 scanner->opt[OPT_TL_Y].constraint.range = &(scanner->device->y_range);
1329 scanner->val[OPT_TL_Y].w = 0;
1332 scanner->opt[OPT_BR_X].name = SANE_NAME_SCAN_BR_X;
1333 scanner->opt[OPT_BR_X].title = SANE_TITLE_SCAN_BR_X;
1334 scanner->opt[OPT_BR_X].desc = SANE_DESC_SCAN_BR_X;
1335 scanner->opt[OPT_BR_X].type = SANE_TYPE_FIXED;
1336 scanner->opt[OPT_BR_X].unit = SANE_UNIT_MM;
1337 scanner->opt[OPT_BR_X].constraint_type = SANE_CONSTRAINT_RANGE;
1338 scanner->opt[OPT_BR_X].constraint.range = &(scanner->device->x_range);
1339 scanner->val[OPT_BR_X].w = scanner->device->x_range.max;
1342 scanner->opt[OPT_BR_Y].name = SANE_NAME_SCAN_BR_Y;
1343 scanner->opt[OPT_BR_Y].title = SANE_TITLE_SCAN_BR_Y;
1344 scanner->opt[OPT_BR_Y].desc = SANE_DESC_SCAN_BR_Y;
1345 scanner->opt[OPT_BR_Y].type = SANE_TYPE_FIXED;
1346 scanner->opt[OPT_BR_Y].unit = SANE_UNIT_MM;
1347 scanner->opt[OPT_BR_Y].constraint_type = SANE_CONSTRAINT_RANGE;
1348 scanner->opt[OPT_BR_Y].constraint.range = &(scanner->device->y_range);
1349 scanner->val[OPT_BR_Y].w = scanner->device->y_range.max;
1353 scanner->opt[OPT_ENHANCEMENT_GROUP].title = "Enhancement";
1354 scanner->opt[OPT_ENHANCEMENT_GROUP].desc = "";
1355 scanner->opt[OPT_ENHANCEMENT_GROUP].type = SANE_TYPE_GROUP;
1356 scanner->opt[OPT_ENHANCEMENT_GROUP].cap = 0;
1357 scanner->opt[OPT_ENHANCEMENT_GROUP].constraint_type = SANE_CONSTRAINT_NONE;
1360 scanner->opt[OPT_GAMMA_VECTOR].name = SANE_NAME_GAMMA_VECTOR;
1361 scanner->opt[OPT_GAMMA_VECTOR].title = SANE_TITLE_GAMMA_VECTOR;
1362 scanner->opt[OPT_GAMMA_VECTOR].desc = SANE_DESC_GAMMA_VECTOR;
1363 scanner->opt[OPT_GAMMA_VECTOR].type = SANE_TYPE_INT;
1364 scanner->opt[OPT_GAMMA_VECTOR].unit = SANE_UNIT_NONE;
1365 scanner->opt[OPT_GAMMA_VECTOR].constraint_type = SANE_CONSTRAINT_RANGE;
1366 scanner->val[OPT_GAMMA_VECTOR].wa = scanner->gamma_table[0];
1367 scanner->opt[OPT_GAMMA_VECTOR].constraint.range = &scanner->gamma_range;
1368 scanner->opt[OPT_GAMMA_VECTOR].size =
1369 scanner->gamma_length * sizeof (SANE_Word);
1370 scanner->opt[OPT_GAMMA_VECTOR].cap |= SANE_CAP_INACTIVE;
1373 scanner->opt[OPT_GAMMA_VECTOR_R].name = SANE_NAME_GAMMA_VECTOR_R;
1374 scanner->opt[OPT_GAMMA_VECTOR_R].title = SANE_TITLE_GAMMA_VECTOR_R;
1375 scanner->opt[OPT_GAMMA_VECTOR_R].desc = SANE_DESC_GAMMA_VECTOR_R;
1376 scanner->opt[OPT_GAMMA_VECTOR_R].type = SANE_TYPE_INT;
1377 scanner->opt[OPT_GAMMA_VECTOR_R].unit = SANE_UNIT_NONE;
1378 scanner->opt[OPT_GAMMA_VECTOR_R].constraint_type = SANE_CONSTRAINT_RANGE;
1379 scanner->val[OPT_GAMMA_VECTOR_R].wa = scanner->gamma_table[1];
1380 scanner->opt[OPT_GAMMA_VECTOR_R].constraint.range = &(scanner->gamma_range);
1381 scanner->opt[OPT_GAMMA_VECTOR_R].size =
1382 scanner->gamma_length * sizeof (SANE_Word);
1385 scanner->opt[OPT_GAMMA_VECTOR_G].name = SANE_NAME_GAMMA_VECTOR_G;
1386 scanner->opt[OPT_GAMMA_VECTOR_G].title = SANE_TITLE_GAMMA_VECTOR_G;
1387 scanner->opt[OPT_GAMMA_VECTOR_G].desc = SANE_DESC_GAMMA_VECTOR_G;
1388 scanner->opt[OPT_GAMMA_VECTOR_G].type = SANE_TYPE_INT;
1389 scanner->opt[OPT_GAMMA_VECTOR_G].unit = SANE_UNIT_NONE;
1390 scanner->opt[OPT_GAMMA_VECTOR_G].constraint_type = SANE_CONSTRAINT_RANGE;
1391 scanner->val[OPT_GAMMA_VECTOR_G].wa = scanner->gamma_table[2];
1392 scanner->opt[OPT_GAMMA_VECTOR_G].constraint.range = &(scanner->gamma_range);
1393 scanner->opt[OPT_GAMMA_VECTOR_G].size =
1394 scanner->gamma_length * sizeof (SANE_Word);
1398 scanner->opt[OPT_GAMMA_VECTOR_B].name = SANE_NAME_GAMMA_VECTOR_B;
1399 scanner->opt[OPT_GAMMA_VECTOR_B].title = SANE_TITLE_GAMMA_VECTOR_B;
1400 scanner->opt[OPT_GAMMA_VECTOR_B].desc = SANE_DESC_GAMMA_VECTOR_B;
1401 scanner->opt[OPT_GAMMA_VECTOR_B].type = SANE_TYPE_INT;
1402 scanner->opt[OPT_GAMMA_VECTOR_B].unit = SANE_UNIT_NONE;
1403 scanner->opt[OPT_GAMMA_VECTOR_B].constraint_type = SANE_CONSTRAINT_RANGE;
1404 scanner->val[OPT_GAMMA_VECTOR_B].wa = scanner->gamma_table[3];
1405 scanner->opt[OPT_GAMMA_VECTOR_B].constraint.range = &(scanner->gamma_range);
1406 scanner->opt[OPT_GAMMA_VECTOR_B].size =
1407 scanner->gamma_length * sizeof (SANE_Word);
1410 scanner->opt[OPT_HALFTONE_PATTERN].name = SANE_NAME_HALFTONE_PATTERN;
1411 scanner->opt[OPT_HALFTONE_PATTERN].title = SANE_TITLE_HALFTONE_PATTERN;
1412 scanner->opt[OPT_HALFTONE_PATTERN].desc = SANE_DESC_HALFTONE_PATTERN;
1413 scanner->opt[OPT_HALFTONE_PATTERN].type = SANE_TYPE_STRING;
1414 scanner->opt[OPT_HALFTONE_PATTERN].size =
1415 max_string_size ((SANE_String_Const *) scanner->device->halftone_list);
1416 scanner->opt[OPT_HALFTONE_PATTERN].constraint_type =
1418 scanner->opt[OPT_HALFTONE_PATTERN].constraint.string_list =
1419 (SANE_String_Const *) scanner->device->halftone_list;
1420 scanner->val[OPT_HALFTONE_PATTERN].s =
1421 (SANE_Char *) strdup (scanner->device->halftone_list[0]);
1422 scanner->opt[OPT_HALFTONE_PATTERN].cap |= SANE_CAP_INACTIVE;
1425 scanner->opt[OPT_SPEED].name = SANE_NAME_SCAN_SPEED;
1426 scanner->opt[OPT_SPEED].title = SANE_TITLE_SCAN_SPEED;
1427 scanner->opt[OPT_SPEED].desc = SANE_DESC_SCAN_SPEED;
1428 scanner->opt[OPT_SPEED].type = SANE_TYPE_STRING;
1429 scanner->opt[OPT_SPEED].size =
1430 max_string_size ((SANE_String_Const *) scanner->device->speed_list);
1431 scanner->opt[OPT_SPEED].constraint_type = SANE_CONSTRAINT_STRING_LIST;
1432 scanner->opt[OPT_SPEED].constraint.string_list =
1433 (SANE_String_Const *) scanner->device->speed_list;
1434 scanner->val[OPT_SPEED].s =
1435 (SANE_Char *) strdup (scanner->device->speed_list[0]);
1438 scanner->opt[OPT_THRESHOLD].name = SANE_NAME_THRESHOLD;
1439 scanner->opt[OPT_THRESHOLD].title = SANE_TITLE_THRESHOLD;
1440 scanner->opt[OPT_THRESHOLD].desc = SANE_DESC_THRESHOLD;
1441 scanner->opt[OPT_THRESHOLD].type = SANE_TYPE_FIXED;
1442 scanner->opt[OPT_THRESHOLD].unit = SANE_UNIT_PERCENT;
1443 scanner->opt[OPT_THRESHOLD].constraint_type = SANE_CONSTRAINT_RANGE;
1444 scanner->opt[OPT_THRESHOLD].constraint.range = &percentage_range_100;
1445 scanner->val[OPT_THRESHOLD].w = SANE_FIX (50);
1446 scanner->opt[OPT_THRESHOLD].cap |= SANE_CAP_INACTIVE;
1450 scanner->opt[OPT_ADVANCED_GROUP].title = "Advanced";
1451 scanner->opt[OPT_ADVANCED_GROUP].desc = "";
1452 scanner->opt[OPT_ADVANCED_GROUP].type = SANE_TYPE_GROUP;
1453 scanner->opt[OPT_ADVANCED_GROUP].cap = SANE_CAP_ADVANCED;
1454 scanner->opt[OPT_ADVANCED_GROUP].constraint_type = SANE_CONSTRAINT_NONE;
1457 scanner->opt[OPT_PREVIEW].name = SANE_NAME_PREVIEW;
1458 scanner->opt[OPT_PREVIEW].title = SANE_TITLE_PREVIEW;
1459 scanner->opt[OPT_PREVIEW].desc = SANE_DESC_PREVIEW;
1460 scanner->opt[OPT_PREVIEW].type = SANE_TYPE_BOOL;
1461 scanner->val[OPT_PREVIEW].w = SANE_FALSE;
1472 pie_power_save (Pie_Scanner * scanner, int time)
1495 sanei_scsi_cmd (scanner->sfd, buffer, swrite.size + size, NULL, NULL);
1509 pie_send_exposure_one (Pie_Scanner * scanner, int filter, int value)
1535 sanei_scsi_cmd (scanner->sfd, buffer, swrite.size + size, NULL, NULL);
1549 pie_send_exposure (Pie_Scanner * scanner)
1555 status = pie_send_exposure_one (scanner, FILTER_RED, 100);
1559 status = pie_send_exposure_one (scanner, FILTER_GREEN, 100);
1563 status = pie_send_exposure_one (scanner, FILTER_BLUE, 100);
1574 pie_send_highlight_shadow_one (Pie_Scanner * scanner, int filter,
1602 sanei_scsi_cmd (scanner->sfd, buffer, swrite.size + size, NULL, NULL);
1616 pie_send_highlight_shadow (Pie_Scanner * scanner)
1622 status = pie_send_highlight_shadow_one (scanner, FILTER_RED, 100, 0);
1626 status = pie_send_highlight_shadow_one (scanner, FILTER_GREEN, 100, 0);
1630 status = pie_send_highlight_shadow_one (scanner, FILTER_BLUE, 100, 0);
1640 pie_perform_cal (Pie_Scanner * scanner, int cal_index)
1662 pixels_per_line = scanner->device->cal_info[cal_index].pixels_per_line;
1666 rcv_bits = scanner->device->cal_info[cal_index].receive_bits;
1670 send_bits = scanner->device->cal_info[cal_index].send_bits;
1674 rcv_lines = scanner->device->cal_info[cal_index].num_lines;
1678 if (scanner->colormode == RGB)
1711 status = pie_wait_scanner (scanner);
1728 sanei_scsi_cmd (scanner->sfd, sread.cmd, sread.size, rcv_buffer,
1747 if (scanner->colormode == RGB)
1802 rcv_lines = scanner->device->cal_info[cal_index].num_lines;
1804 cal_limit = fullscale / (1 << scanner->device->inquiry_cal_eqn);
1805 k = (1 << scanner->device->inquiry_cal_eqn) - 1;
1822 if (!(filter & scanner->cal_filter))
1828 if (scanner->colormode == RGB)
1865 if (scanner->device->inquiry_cal_eqn)
1885 /* now send the data back to scanner */
1888 status = pie_wait_scanner (scanner);
1903 sanei_scsi_cmd (scanner->sfd, send_buffer, swrite.size + size, NULL,
1929 pie_do_cal (Pie_Scanner * scanner)
1936 if (scanner->device->inquiry_scan_capability & INQ_CAP_EXT_CAL)
1938 for (cal_index = 0; cal_index < scanner->device->cal_info_count;
1940 if (scanner->device->cal_info[cal_index].cal_type ==
1941 scanner->cal_mode)
1943 status = pie_perform_cal (scanner, cal_index);
1955 pie_dwnld_gamma_one (Pie_Scanner * scanner, int filter, SANE_Int * table)
1966 status = pie_wait_scanner (scanner);
1972 if (scanner->device->inquiry_gamma_bits > 8)
1973 size = scanner->gamma_length * 2 + 6;
1975 size = scanner->gamma_length + 6;
1993 for (i = 0; i < scanner->gamma_length; i++)
1995 if (scanner->device->inquiry_gamma_bits > 8)
2008 sanei_scsi_cmd (scanner->sfd, buffer, swrite.size + size, NULL, NULL);
2024 pie_dwnld_gamma (Pie_Scanner * scanner)
2030 if (scanner->colormode == RGB)
2033 pie_dwnld_gamma_one (scanner, FILTER_RED, scanner->gamma_table[1]);
2039 pie_dwnld_gamma_one (scanner, FILTER_GREEN, scanner->gamma_table[2]);
2044 pie_dwnld_gamma_one (scanner, FILTER_BLUE, scanner->gamma_table[3]);
2053 if (scanner->colormode == GRAYSCALE)
2054 table = scanner->gamma_table[0];
2058 status = pie_dwnld_gamma_one (scanner, FILTER_GREEN, table);
2071 pie_set_window (Pie_Scanner * scanner)
2094 if (scanner->colormode == HALFTONE)
2097 dpmm = (double) scanner->device->inquiry_pixel_resolution / MM_PER_INCH;
2099 x = SANE_UNFIX (scanner->val[OPT_TL_X].w) * dpmm;
2103 x = SANE_UNFIX (scanner->val[OPT_TL_Y].w) * dpmm;
2107 x = SANE_UNFIX (scanner->val[OPT_BR_X].w) * dpmm;
2111 x = SANE_UNFIX (scanner->val[OPT_BR_Y].w) * dpmm;
2116 sanei_scsi_cmd (scanner->sfd, buffer, swrite.size + size, NULL, NULL);
2130 pie_mode_select (Pie_Scanner * scanner)
2154 set_data (data, 2, scanner->resolution, 2);
2157 switch (scanner->colormode)
2160 if (scanner->device->inquiry_filters & INQ_ONE_PASS_COLOR)
2163 scanner->cal_filter = FILTER_RED | FILTER_GREEN | FILTER_BLUE;
2178 if (scanner->device->inquiry_filters & INQ_FILTER_NEUTRAL)
2181 scanner->cal_filter = FILTER_NEUTRAL;
2183 else if (scanner->device->inquiry_filters & INQ_FILTER_GREEN)
2186 scanner->cal_filter = FILTER_GREEN;
2188 else if (scanner->device->inquiry_filters & INQ_FILTER_RED)
2191 scanner->cal_filter = FILTER_RED;
2193 else if (scanner->device->inquiry_filters & INQ_FILTER_BLUE)
2196 scanner->cal_filter = FILTER_BLUE;
2201 "pie_mode_select: scanner doesn't appear to support monochrome\n");
2205 if (scanner->colormode == GRAYSCALE)
2213 if (scanner->device->inquiry_color_format & INQ_COLOR_FORMAT_LINE)
2215 else if (scanner->device->inquiry_color_format & INQ_COLOR_FORMAT_INDEX)
2225 if (scanner->device->inquiry_image_format & INQ_IMG_FMT_INTEL)
2236 while (scanner->device->speed_list[i] != NULL)
2238 if (strcmp (scanner->device->speed_list[i], scanner->val[OPT_SPEED].s)
2244 if (scanner->device->speed_list[i] == NULL)
2249 scanner->cal_mode = CAL_MODE_FLATBED;
2252 if (scanner->val[OPT_PREVIEW].w
2253 && (scanner->device->inquiry_scan_capability & INQ_CAP_FAST_PREVIEW))
2256 scanner->cal_mode |= CAL_MODE_PREVIEW;
2259 if (scanner->resolution > scanner->device->inquiry_fast_preview_res)
2260 set_data (data, 2, scanner->device->inquiry_fast_preview_res, 2);
2266 while (scanner->device->halftone_list[i] != NULL)
2269 (scanner->device->halftone_list[i],
2270 scanner->val[OPT_HALFTONE_PATTERN].s) == 0)
2275 if (scanner->device->halftone_list[i] == NULL)
2280 data[13] = SANE_UNFIX (scanner->val[OPT_THRESHOLD].w) * 255 / 100; /* lineart threshold */
2287 sanei_scsi_cmd (scanner->sfd, buffer, smode.size + size, NULL, NULL);
2301 pie_scan (Pie_Scanner * scanner, int start)
2308 status = pie_wait_scanner (scanner);
2318 status = sanei_scsi_cmd (scanner->sfd, scan.cmd, scan.size, NULL, NULL);
2338 pie_wait_scanner (Pie_Scanner * scanner)
2349 DBG (DBG_warning, "scanner does not get ready\n");
2354 sanei_scsi_cmd (scanner->sfd, test_unit_ready.cmd,
2362 DBG (DBG_info2, "scanner reports %s, waiting ...\n",
2371 DBG (DBG_info, "scanner ready\n");
2382 pie_get_params (Pie_Scanner * scanner)
2390 status = pie_wait_scanner (scanner);
2394 if (scanner->device->inquiry_image_format & INQ_IMG_FMT_OKLINE)
2403 sanei_scsi_cmd (scanner->sfd, param.cmd, param.size, buffer, &size);
2422 if (scanner->device->inquiry_image_format & INQ_IMG_FMT_OKLINE)
2426 scanner->filter_offset1 = get_param_scan_filter_offset1 (buffer);
2427 scanner->filter_offset2 = get_param_scan_filter_offset2 (buffer);
2428 scanner->bytes_per_line = get_param_scan_bytes (buffer);
2430 scanner->params.pixels_per_line = get_param_scan_width (buffer);
2431 scanner->params.lines = get_param_scan_lines (buffer);
2433 switch (scanner->colormode)
2436 scanner->params.format = SANE_FRAME_RGB;
2437 scanner->params.depth = 8;
2438 scanner->params.bytes_per_line = 3 * get_param_scan_bytes (buffer);
2442 scanner->params.format = SANE_FRAME_GRAY;
2443 scanner->params.depth = 8;
2444 scanner->params.bytes_per_line = get_param_scan_bytes (buffer);
2449 scanner->params.format = SANE_FRAME_GRAY;
2450 scanner->params.depth = 1;
2451 scanner->params.bytes_per_line = get_param_scan_bytes (buffer);
2455 scanner->params.last_frame = 0;
2466 pie_grab_scanner (Pie_Scanner * scanner)
2473 status = pie_wait_scanner (scanner);
2478 sanei_scsi_cmd (scanner->sfd, reserve_unit.cmd, reserve_unit.size, NULL,
2489 DBG (DBG_info, "scanner reserved\n");
2500 pie_give_scanner (Pie_Scanner * scanner)
2504 DBG (DBG_info2, "trying to release scanner ...\n");
2507 sanei_scsi_cmd (scanner->sfd, release_unit.cmd, release_unit.size, NULL,
2516 DBG (DBG_info, "scanner released\n");
2525 pie_reader_process_indexed (Pie_Scanner * scanner, FILE * fp)
2540 scanner->params.lines, scanner->params.bytes_per_line);
2542 lines = scanner->params.lines;
2543 bytes_per_line = scanner->bytes_per_line;
2553 if (scanner->colormode == RGB)
2557 red_size = bytes_per_line * (scanner->filter_offset1 +
2558 scanner->filter_offset2 + 2);
2559 green_size = bytes_per_line * (scanner->filter_offset2 + 2);
2568 reorder = malloc (scanner->params.bytes_per_line);
2593 sanei_scsi_cmd (scanner->sfd, sread.cmd, sread.size, buffer,
2600 if (scanner->colormode == RGB)
2668 fwrite (reorder, 1, scanner->params.bytes_per_line, fp);
2691 fwrite (buffer, 1, scanner->params.bytes_per_line, fp);
2705 pie_reader_process (Pie_Scanner * scanner, FILE * fp)
2712 DBG (DBG_read, "reading %d lines of %d bytes/line\n", scanner->params.lines,
2713 scanner->params.bytes_per_line);
2715 buffer = malloc (scanner->params.bytes_per_line);
2716 reorder = malloc (scanner->params.bytes_per_line);
2724 lines = scanner->params.lines;
2729 size = scanner->params.bytes_per_line;
2734 sanei_scsi_cmd (scanner->sfd, sread.cmd, sread.size, buffer,
2741 if (scanner->colormode == RGB)
2749 offset = scanner->params.pixels_per_line;
2751 for (i = scanner->params.pixels_per_line; i > 0; i--)
2758 fwrite (reorder, 1, scanner->params.bytes_per_line, fp);
2762 fwrite (buffer, 1, scanner->params.bytes_per_line, fp);
2803 Pie_Scanner * scanner;
2807 scanner = (Pie_Scanner *)data;
2811 close ( scanner->pipe );
2830 fp = fdopen (scanner->reader_fds, "w");
2838 if (scanner->device->inquiry_color_format & INQ_COLOR_FORMAT_LINE)
2839 status = pie_reader_process (scanner, fp);
2840 else if (scanner->device->inquiry_color_format & INQ_COLOR_FORMAT_INDEX)
2841 status = pie_reader_process_indexed (scanner, fp);
2869 close_pipe (Pie_Scanner * scanner)
2873 if (scanner->pipe >= 0)
2875 close (scanner->pipe);
2876 scanner->pipe = -1;
2888 do_cancel (Pie_Scanner * scanner)
2892 scanner->scanning = SANE_FALSE;
2894 if (sanei_thread_is_valid (scanner->reader_pid))
2897 sanei_thread_kill (scanner->reader_pid);
2898 sanei_thread_waitpid (scanner->reader_pid, 0);
2899 sanei_thread_invalidate (scanner->reader_pid);
2903 if (scanner->sfd >= 0)
2905 pie_scan (scanner, 0);
2907 pie_power_save (scanner, 15);
2909 pie_give_scanner (scanner); /* reposition and release scanner */
2912 sanei_scsi_close (scanner->sfd);
2913 scanner->sfd = -1;
2941 attach_scanner ("/dev/scanner", 0); /* no config-file: /dev/scanner */
3052 Pie_Scanner *scanner;
3087 scanner = malloc (sizeof (*scanner));
3088 if (!scanner)
3094 memset (scanner, 0, sizeof (*scanner));
3096 scanner->device = dev;
3097 scanner->sfd = -1;
3098 scanner->pipe = -1;
3100 scanner->gamma_length = 1 << (scanner->device->inquiry_gamma_bits);
3103 scanner->device->inquiry_gamma_bits);
3105 scanner->gamma_range.min = 0;
3106 scanner->gamma_range.max = scanner->gamma_length - 1;
3107 scanner->gamma_range.quant = 0;
3109 scanner->gamma_table[0] =
3110 (SANE_Int *) malloc (scanner->gamma_length * sizeof (SANE_Int));
3111 scanner->gamma_table[1] =
3112 (SANE_Int *) malloc (scanner->gamma_length * sizeof (SANE_Int));
3113 scanner->gamma_table[2] =
3114 (SANE_Int *) malloc (scanner->gamma_length * sizeof (SANE_Int));
3115 scanner->gamma_table[3] =
3116 (SANE_Int *) malloc (scanner->gamma_length * sizeof (SANE_Int));
3120 for (j = 0; j < scanner->gamma_length; ++j)
3122 scanner->gamma_table[i][j] = j;
3126 init_options (scanner);
3128 scanner->next = first_handle; /* insert newly opened handle into list of open handles: */
3129 first_handle = scanner;
3131 *handle = scanner;
3143 Pie_Scanner *prev, *scanner;
3150 for (scanner = first_handle; scanner; scanner = scanner->next)
3152 if (scanner == handle)
3157 prev = scanner;
3160 if (!scanner)
3166 if (scanner->scanning) /* stop scan if still scanning */
3173 prev->next = scanner->next;
3177 first_handle = scanner->next;
3180 free (scanner->gamma_table[0]); /* free custom gamma tables */
3181 free (scanner->gamma_table[1]);
3182 free (scanner->gamma_table[2]);
3183 free (scanner->gamma_table[3]);
3184 free (scanner->val[OPT_MODE].s);
3185 free (scanner->val[OPT_SPEED].s);
3186 free (scanner->val[OPT_HALFTONE_PATTERN].s);
3188 scanner->bufsize = 0;
3190 free (scanner); /* free scanner */
3199 Pie_Scanner *scanner = handle;
3208 return scanner->opt + option;
3219 Pie_Scanner *scanner = handle;
3229 if (scanner->scanning)
3239 cap = scanner->opt[option].cap;
3245 name = scanner->opt[option].name;
3267 *(SANE_Word *) val = scanner->val[option].w;
3275 memcpy (val, scanner->val[option].wa, scanner->opt[option].size);
3285 strcpy (val, scanner->val[option].s);
3291 switch (scanner->opt[option].type)
3322 status = sanei_constrain_value (scanner->opt + option, val, info);
3344 scanner->val[option].w = *(SANE_Word *) val;
3352 memcpy (scanner->val[option].wa, val, scanner->opt[option].size);
3361 if (scanner->val[option].s)
3363 free (scanner->val[option].s);
3366 scanner->val[option].s = (SANE_Char *) strdup (val);
3373 scanner->opt[OPT_HALFTONE_PATTERN].cap |= SANE_CAP_INACTIVE;
3376 scanner->opt[OPT_GAMMA_VECTOR].cap |= SANE_CAP_INACTIVE;
3377 scanner->opt[OPT_GAMMA_VECTOR_R].cap |= SANE_CAP_INACTIVE;
3378 scanner->opt[OPT_GAMMA_VECTOR_G].cap |= SANE_CAP_INACTIVE;
3379 scanner->opt[OPT_GAMMA_VECTOR_B].cap |= SANE_CAP_INACTIVE;
3380 scanner->opt[OPT_THRESHOLD].cap |= SANE_CAP_INACTIVE;
3388 scanner->opt[OPT_HALFTONE_PATTERN].cap &=
3394 scanner->opt[OPT_THRESHOLD].cap &= ~SANE_CAP_INACTIVE;
3404 scanner->opt[OPT_GAMMA_VECTOR].cap &= ~SANE_CAP_INACTIVE;
3408 /* scanner->opt[OPT_GAMMA_VECTOR].cap &= ~SANE_CAP_INACTIVE; */
3409 scanner->opt[OPT_GAMMA_VECTOR_R].cap &= ~SANE_CAP_INACTIVE;
3410 scanner->opt[OPT_GAMMA_VECTOR_G].cap &= ~SANE_CAP_INACTIVE;
3411 scanner->opt[OPT_GAMMA_VECTOR_B].cap &= ~SANE_CAP_INACTIVE;
3419 if (scanner->val[option].s)
3421 free (scanner->val[option].s);
3424 scanner->val[option].s = (SANE_Char *) strdup (val);
3440 Pie_Scanner *scanner = handle;
3445 if (!scanner->scanning)
3449 memset (&scanner->params, 0, sizeof (scanner->params));
3452 SANE_UNFIX (scanner->val[OPT_BR_X].w - scanner->val[OPT_TL_X].w);
3454 SANE_UNFIX (scanner->val[OPT_BR_Y].w - scanner->val[OPT_TL_Y].w);
3455 x_dpi = SANE_UNFIX (scanner->val[OPT_RESOLUTION].w);
3459 if ((scanner->val[OPT_RESOLUTION_BIND].w == SANE_TRUE)
3460 || (scanner->val[OPT_PREVIEW].w == SANE_TRUE))
3470 scanner->params.pixels_per_line = width * x_dots_per_mm;
3471 scanner->params.lines = length * y_dots_per_mm;
3475 mode = scanner->val[OPT_MODE].s;
3479 scanner->params.format = SANE_FRAME_GRAY;
3480 scanner->params.bytes_per_line =
3481 (scanner->params.pixels_per_line + 7) / 8;
3482 scanner->params.depth = 1;
3486 scanner->params.format = SANE_FRAME_GRAY;
3487 scanner->params.bytes_per_line = scanner->params.pixels_per_line;
3488 scanner->params.depth = 8;
3492 scanner->params.format = SANE_FRAME_RGB;
3493 scanner->params.bytes_per_line = 3 * scanner->params.pixels_per_line;
3494 scanner->params.depth = 8;
3497 scanner->params.last_frame = (scanner->params.format != SANE_FRAME_RED
3498 && scanner->params.format !=
3503 *params = scanner->params;
3516 Pie_Scanner *scanner = handle;
3525 if (scanner->val[OPT_TL_X].w > scanner->val[OPT_BR_X].w)
3529 scanner->opt[OPT_TL_X].title, SANE_UNFIX (scanner->val[OPT_TL_X].w),
3530 scanner->opt[OPT_BR_X].title, SANE_UNFIX (scanner->val[OPT_BR_X].w));
3533 if (scanner->val[OPT_TL_Y].w > scanner->val[OPT_BR_Y].w)
3537 scanner->opt[OPT_TL_Y].title, SANE_UNFIX (scanner->val[OPT_TL_Y].w),
3538 scanner->opt[OPT_BR_Y].title, SANE_UNFIX (scanner->val[OPT_BR_Y].w));
3542 mode = scanner->val[OPT_MODE].s;
3544 if (scanner->sfd < 0) /* first call, don`t run this routine again on multi frame or multi image scan */
3550 (scanner->device->sane.name, &(scanner->sfd), sense_handler,
3551 scanner->device, &scsi_bufsize) != 0)
3563 sanei_scsi_close ((scanner->sfd));
3571 scanner->bufsize = scsi_bufsize;
3574 (scanner->device->sane.name, &(scanner->sfd), sense_handler,
3575 scanner->device) != SANE_STATUS_GOOD)
3578 scanner->device->sane.name);
3586 if (pie_check_values (scanner->device) != 0)
3589 scanner->scanning = SANE_FALSE;
3590 pie_give_scanner (scanner); /* reposition and release scanner */
3591 sanei_scsi_close (scanner->sfd);
3592 scanner->sfd = -1;
3597 scanner->params.bytes_per_line = scanner->device->row_len;
3598 scanner->params.pixels_per_line = scanner->device->width_in_pixels;
3599 scanner->params.lines = scanner->device->length_in_pixels;
3601 sane_get_parameters (scanner, 0);
3604 scanner->device->x_resolution);
3606 scanner->device->y_resolution);
3608 scanner->device->x_coordinate_base);
3610 scanner->device->y_coordinate_base);
3612 scanner->device->upper_left_x);
3614 scanner->device->upper_left_y);
3616 scanner->device->scanwidth);
3618 scanner->device->scanlength);
3620 scanner->device->width_in_pixels);
3622 scanner->device->length_in_pixels);
3624 scanner->device->bits_per_pixel);
3626 scanner->params.bytes_per_line);
3628 scanner->params.pixels_per_line);
3630 scanner->params.lines);
3633 /* grab scanner */
3634 if (pie_grab_scanner (scanner))
3636 sanei_scsi_close (scanner->sfd);
3637 scanner->sfd = -1;
3639 "WARNING: unable to reserve scanner: device busy\n");
3643 scanner->scanning = SANE_TRUE;
3645 pie_power_save (scanner, 0);
3651 scanner->colormode = LINEART;
3655 scanner->colormode = HALFTONE;
3659 scanner->colormode = GRAYSCALE;
3663 scanner->colormode = RGB;
3667 scanner->resolution = SANE_UNFIX (scanner->val[OPT_RESOLUTION].w);
3669 pie_set_window (scanner);
3670 pie_send_exposure (scanner);
3671 pie_mode_select (scanner);
3672 pie_send_highlight_shadow (scanner);
3674 pie_scan (scanner, 1);
3676 status = pie_do_cal (scanner);
3682 pie_dwnld_gamma (scanner);
3684 pie_get_params (scanner);
3689 scanner->scanning = SANE_FALSE;
3690 pie_scan (scanner, 0);
3691 pie_give_scanner (scanner); /* reposition and release scanner */
3692 sanei_scsi_close (scanner->sfd);
3693 scanner->sfd = -1;
3697 scanner->pipe = fds[0];
3698 scanner->reader_fds = fds[1];
3699 scanner->reader_pid = sanei_thread_begin( reader_process, (void*)scanner );
3701 if (!sanei_thread_is_valid (scanner->reader_pid))
3710 close (scanner->reader_fds);
3711 scanner->reader_fds = -1;
3725 Pie_Scanner *scanner = handle;
3730 nread = read (scanner->pipe, buf, max_len);
3733 if (!(scanner->scanning)) /* OOPS, not scanning */
3735 return do_cancel (scanner);
3747 do_cancel (scanner); /* we had an error, stop scanner */
3756 do_cancel (scanner);
3758 return close_pipe (scanner); /* close pipe */
3771 Pie_Scanner *scanner = handle;
3775 if (scanner->scanning)
3777 do_cancel (scanner);
3788 Pie_Scanner *scanner = handle;
3792 if (!scanner->scanning)
3797 if (fcntl (scanner->pipe, F_SETFL, non_blocking ? O_NONBLOCK : 0) < 0)
3812 Pie_Scanner *scanner = handle;
3816 if (!scanner->scanning)
3820 *fd = scanner->pipe;