Update to backend version 0.12 (from Kazuya Fukuda <kazuya@pjs.nevt.nec.co.jp>).

Removed references to sharp backend (grep for "JX"). Check for
HAVE_SYS_SHM_H before including sys/shm.h and disable shared
memory support if necessary. Free devlist allocated in
sane_get_devices() in sane_exit() resolution setting bug fixed
(PC-IN500/4C 10dpi step). Removed resolution list.
DEVEL_2_0_BRANCH-1
Henning Geinitz 2001-06-02 12:49:47 +00:00
rodzic f0ecd3d80b
commit 990cfd6f4c
3 zmienionych plików z 100 dodań i 266 usunięć

Wyświetl plik

@ -1,7 +1,7 @@
/* sane - Scanner Access Now Easy.
Copyright (C) 2000 Kazuya Fukuda, based on sharp.c, which is based on
canon.c.
Copyright (C) 2000-2001 Kazuya Fukuda, based on sharp.c, which is
based on canon.c.
This file is part of the SANE package.
@ -44,6 +44,13 @@
This file implements a SANE backend for NEC flatbed scanners. */
/*
Version 0.12
- Remove references to sharp backend (grep for "JX").
- Check for HAVE_SYS_SHM_H before including sys/shm.h and
disable shared memory support if necessary.
- free devlist allocated in sane_get_devices() in sane_exit()
- resolution setting bug fixed(PC-IN500/4C 10dpi step)
- remove resolution list
Version 0.11
- get_data_buffer_status is not called in sane_get_parameter and
sane_read_direct, sane_read_shuffled.
@ -82,12 +89,15 @@
#endif
/* USE_FORK: fork a special reader process
disable shared memory support.
*/
#ifndef NOTUSE_PCIN500
#if 0
#ifdef HAVE_SYS_SHM_H
#define USE_FORK
#endif
#ifdef USE_FORK
#endif
#ifdef USE_FORK
#include <signal.h>
#include <fcntl.h>
#include <sys/types.h>
@ -104,6 +114,13 @@
#ifndef USE_COLOR_THRESHOLD
#define USE_COLOR_THRESHOLD
#endif
/* enable a short list of some standard resolutions. XSane provides
its own resolution list; therefore its is generally not reasonable
to enable this list, if you mainly using XSane. But it might be handy
if you are working with xscanimage
*/
/* #define USE_RESOLUTION_LIST */
#include "nec.h"
#define BACKEND_NAME nec
@ -124,6 +141,7 @@
static int num_devices = 0;
static NEC_Device *first_dev = NULL;
static NEC_Scanner *first_handle = NULL;
static const SANE_Device **devlist = 0;
typedef enum
{
@ -181,22 +199,6 @@ static SANE_String use_adf = "Automatic Document Feeder";
static SANE_String use_fsu = "Transparency Adapter";
static SANE_String use_simple = "Flatbed";
/* auto selection of ADF and FSU, as described in the JX330 manual,
is a nice idea -- but I assume that the possible scan window
sizes depend not only for the JX250, but also for JX330 on the
usage of ADF or FSU. Thus, the user might be able to select scan
windows of an "illegal" size, which would have to be automatically
corrected, and I don't see, how the user could be informed about
this "window clipping". More important, I don't see, how the
frontend could be informed that the ADF is automatically enabled.
Insert a "#define ALLOW_AUTO_SELECT_ADF", if you want to play
with this feature.
*/
#ifdef ALLOW_AUTO_SELECT_ADF
static SANE_String_Const use_auto = "AutoSelection";
#endif
#define HAVE_FSU 1
#define HAVE_ADF 2
@ -206,9 +208,7 @@ static SANE_String_Const use_auto = "AutoSelection";
#define SCAN_SIMPLE 0
#define SCAN_WITH_FSU 1
#define SCAN_WITH_ADF 2
#ifdef ALLOW_AUTO_SELECT_ADF
#define SCAN_ADF_FSU_AUTO 3
#endif
#define LOAD_PAPER 1
#define UNLOAD_PAPER 0
@ -251,6 +251,7 @@ static const SANE_String_Const speed_list[] =
};
#endif
#ifdef USE_RESOLUTION_LIST
#define RESOLUTION_MAX_PCINXXX 8
static const SANE_String_Const resolution_list_pcinxxx[] =
{
@ -264,6 +265,7 @@ static const SANE_String_Const resolution_list_pcin500[] =
"50", "75", "100", "150", "200", "300", "400", "480", "Select",
0
};
#endif
#define EDGE_NONE "None"
#define EDGE_MIDDLE "Middle"
@ -434,6 +436,7 @@ mode_select_mud (int fd, int mud)
return (status);
}
#if 0
static SANE_Status
mode_select_adf_fsu (int fd, int mode)
{
@ -461,12 +464,6 @@ mode_select_adf_fsu (int fd, int mode)
mp->a_mode = 0x40;
mp->f_mode = 0;
break;
#ifdef ALLOW_AUTO_SELECT_ADF
case: SCAN_ADF_FSU_AUTO:
mp->a_mode = 0;
mp->f_mode = 0;
break;
#endif
}
status = sanei_scsi_cmd (fd, cmd, sizeof (cmd), 0, 0);
@ -474,6 +471,7 @@ mode_select_adf_fsu (int fd, int mode)
DBG (11, ">>\n");
return (status);
}
#endif
static SANE_Status wait_ready(int fd);
@ -634,10 +632,6 @@ reader_process(NEC_Scanner *s)
bytes_to_queue = s->bytes_to_read;
/* it seems that some carriage stops can be avoided with the
JX-250, if the data of an integral number of scan lines is
read with one SCSI command
*/
max_bytes_per_read = s->dev->info.bufsize / s->params.bytes_per_line;
if (max_bytes_per_read)
max_bytes_per_read *= s->params.bytes_per_line;
@ -976,65 +970,6 @@ wait_ready(int fd)
}
#if 0
/* ask the scanner for the maximum scan sizes with/without ADF and
FSU. The JX330 manual does mention the sizes.
*/
static SANE_Status
get_max_scan_size(int fd, NEC_Device *dev, int mode)
{
SANE_Status status;
mode_sense_subdevice m_subdev;
size_t buf_size;
status = mode_select_adf_fsu(fd, mode);
if (status != SANE_STATUS_GOOD)
{
DBG (1, "get_scan_sizes: MODE_SELECT/subdevice page failed\n");
sanei_scsi_close (fd);
return (SANE_STATUS_INVAL);
}
DBG (3, "get_scan_sizes: sending MODE SENSE/subdevice page\n");
memset (&m_subdev, 0, sizeof (m_subdev));
buf_size = sizeof (m_subdev);
status = mode_sense (fd, &m_subdev, &buf_size, 0x20);
if (status != SANE_STATUS_GOOD)
{
DBG (1, "get_scan_sizes: MODE_SENSE/subdevice page failed\n");
sanei_scsi_close (fd);
return (SANE_STATUS_INVAL);
}
dev->info.tl_x_ranges[mode].min = 0;
dev->info.tl_x_ranges[mode].max = SANE_FIX(PIX_TO_MM(
(m_subdev.max_x[0] << 24) + (m_subdev.max_x[1] << 16) +
(m_subdev.max_x[2] << 8) + m_subdev.max_x[3] - 1, dev->info.mud));
dev->info.tl_x_ranges[mode].quant = 0;
dev->info.br_x_ranges[mode].min = SANE_FIX(PIX_TO_MM(1, dev->info.mud));
dev->info.br_x_ranges[mode].max = SANE_FIX(PIX_TO_MM(
(m_subdev.max_x[0] << 24) + (m_subdev.max_x[1] << 16) +
(m_subdev.max_x[2] << 8) + m_subdev.max_x[3], dev->info.mud));
dev->info.br_x_ranges[mode].quant = 0;
dev->info.tl_y_ranges[mode].min = 0;
if (dev->sensedat.model == PCIN500 || mode != SCAN_WITH_FSU)
dev->info.tl_y_ranges[mode].max = SANE_FIX(PIX_TO_MM(
(m_subdev.max_y[0] << 24) + (m_subdev.max_y[1] << 16) +
(m_subdev.max_y[2] << 8) + m_subdev.max_y[3] - 1, dev->info.mud));
dev->info.tl_y_ranges[mode].quant = 0;
dev->info.br_y_ranges[mode].min = SANE_FIX(PIX_TO_MM(1, dev->info.mud));
dev->info.br_y_ranges[mode].max = SANE_FIX(PIX_TO_MM(
(m_subdev.max_y[0] << 24) + (m_subdev.max_y[1] << 16) +
(m_subdev.max_y[2] << 8) + m_subdev.max_y[3], dev->info.mud));
dev->info.br_y_ranges[mode].quant = 0;
return SANE_STATUS_GOOD;
}
#endif
static SANE_Status
attach (const char *devnam, NEC_Device ** devp)
{
@ -1180,8 +1115,10 @@ attach (const char *devnam, NEC_Device ** devp)
DBG (5, "dev->sane.model = %s\n", dev->sane.model);
DBG (5, "dev->sane.type = %s\n", dev->sane.type);
dev->info.xres_range.quant = 0;
dev->info.yres_range.quant = 0;
if (sensedat.model == PCIN500)
dev->info.res_range.quant = 10;
else
dev->info.res_range.quant = 0;
dev->info.tl_x_ranges[SCAN_SIMPLE].min = SANE_FIX(0);
dev->info.br_x_ranges[SCAN_SIMPLE].min = SANE_FIX(1);
@ -1192,8 +1129,10 @@ attach (const char *devnam, NEC_Device ** devp)
dev->info.tl_y_ranges[SCAN_SIMPLE].quant = SANE_FIX(0);
dev->info.br_y_ranges[SCAN_SIMPLE].quant = SANE_FIX(0);
dev->info.xres_default = 150;
dev->info.yres_default = 150;
if (sensedat.model == PCIN500)
dev->info.res_default = 15;
else
dev->info.res_default = 150;
dev->info.tl_x_ranges[SCAN_SIMPLE].max = SANE_FIX(209);
dev->info.br_x_ranges[SCAN_SIMPLE].max = SANE_FIX(210);
dev->info.tl_y_ranges[SCAN_SIMPLE].max = SANE_FIX(296);
@ -1205,11 +1144,9 @@ attach (const char *devnam, NEC_Device ** devp)
dev->info.adf_fsu_installed = 0;
if (dev->sensedat.model == PCIN500)
{
dev->info.xres_range.max = 480;
dev->info.xres_range.min = 30;
dev->info.res_range.max = 48;
dev->info.res_range.min = 5;
dev->info.yres_range.max = 480;
dev->info.yres_range.min = 30;
dev->info.x_default = SANE_FIX(210);
dev->info.tl_x_ranges[SCAN_SIMPLE].max = SANE_FIX(210); /* 304.8mm is the real max */
dev->info.br_x_ranges[SCAN_SIMPLE].max = SANE_FIX(210); /* 304.8mm is the real max */
@ -1220,11 +1157,9 @@ attach (const char *devnam, NEC_Device ** devp)
}
else
{
dev->info.xres_range.max = 400;
dev->info.xres_range.min = 50;
dev->info.res_range.max = 400;
dev->info.res_range.min = 50;
dev->info.yres_range.max = 400;
dev->info.yres_range.min = 50;
dev->info.x_default = SANE_FIX(210);
dev->info.tl_x_ranges[SCAN_SIMPLE].max = SANE_FIX(210); /* 304.8mm is the real max */
dev->info.br_x_ranges[SCAN_SIMPLE].max = SANE_FIX(210); /* 304.8mm is the real max */
@ -1247,14 +1182,10 @@ attach (const char *devnam, NEC_Device ** devp)
dev->info.color_range.max = 255;
dev->info.color_range.quant = 0;
DBG (5, "xres_default=%d\n", dev->info.xres_default);
DBG (5, "xres_range.max=%d\n", dev->info.xres_range.max);
DBG (5, "xres_range.min=%d\n", dev->info.xres_range.min);
DBG (5, "xres_range.quant=%d\n", dev->info.xres_range.quant);
DBG (5, "yres_default=%d\n", dev->info.yres_default);
DBG (5, "yres_range.max=%d\n", dev->info.yres_range.max);
DBG (5, "yres_range.min=%d\n", dev->info.yres_range.min);
DBG (5, "xres_range.quant=%d\n", dev->info.xres_range.quant);
DBG (5, "res_default=%d\n", dev->info.res_default);
DBG (5, "res_range.max=%d\n", dev->info.res_range.max);
DBG (5, "res_range.min=%d\n", dev->info.res_range.min);
DBG (5, "res_range.quant=%d\n", dev->info.res_range.quant);
DBG (5, "x_default=%f\n", SANE_UNFIX(dev->info.x_default));
DBG (5, "tl_x_range[0].max=%f\n", SANE_UNFIX(dev->info.tl_x_ranges[SCAN_SIMPLE].max));
@ -1528,7 +1459,7 @@ init_options (NEC_Scanner * s)
/* half tone */
init_string_option(s, SANE_NAME_HALFTONE_PATTERN, SANE_TITLE_HALFTONE_PATTERN,
SANE_DESC_HALFTONE " (JX-330 only)", halftone_list, OPT_HALFTONE, 0);
SANE_DESC_HALFTONE " (not support)", halftone_list, OPT_HALFTONE, 0);
if (s->dev->sensedat.model == PCIN500)
s->opt[OPT_HALFTONE].cap |= SANE_CAP_INACTIVE;
@ -1536,11 +1467,6 @@ init_options (NEC_Scanner * s)
i = 0;
default_source = -1;
#ifdef ALLOW_AUTO_SELECT_ADF
/* The JX330, but nut not the JX250 supports auto selection of ADF/FSU: */
if (s->dev->info.adf_fsu_installed && (s->dev->sensedat.model == JX330))
s->dev->info->scansources[i++] = use_auto;
#endif
if (s->dev->info.adf_fsu_installed & HAVE_ADF)
{
s->dev->info.scansources[i++] = use_adf;
@ -1581,33 +1507,28 @@ init_options (NEC_Scanner * s)
s->opt[OPT_RESOLUTION_GROUP].cap = 0;
s->opt[OPT_RESOLUTION_GROUP].constraint_type = SANE_CONSTRAINT_NONE;
#ifdef USE_RESOLUTION_LIST
/* select resolution */
if (s->dev->sensedat.model == PCIN500)
init_string_option(s, "Resolution", "Resolution", "Resolution",
resolution_list_pcin500, OPT_RESOLUTION, RESOLUTION_MAX_PCIN500);
resolution_list_pcin500, OPT_RESOLUTION_LIST, RESOLUTION_MAX_PCIN500);
else
init_string_option(s, "Resolution", "Resolution", "Resolution",
resolution_list_pcinxxx, OPT_RESOLUTION, RESOLUTION_MAX_PCINXXX);
resolution_list_pcinxxx, OPT_RESOLUTION_LIST, RESOLUTION_MAX_PCINXXX);
#endif
/* x resolution */
s->opt[OPT_X_RESOLUTION].name = "X" SANE_NAME_SCAN_RESOLUTION;
s->opt[OPT_X_RESOLUTION].title = "X " SANE_TITLE_SCAN_RESOLUTION;
s->opt[OPT_X_RESOLUTION].desc = SANE_DESC_SCAN_RESOLUTION;
s->opt[OPT_X_RESOLUTION].type = SANE_TYPE_INT;
s->opt[OPT_X_RESOLUTION].unit = SANE_UNIT_DPI;
s->opt[OPT_X_RESOLUTION].constraint_type = SANE_CONSTRAINT_RANGE;
s->opt[OPT_X_RESOLUTION].constraint.range = &s->dev->info.xres_range;
s->val[OPT_X_RESOLUTION].w = s->dev->info.xres_default;
/* y resolution */
s->opt[OPT_Y_RESOLUTION].name = "Y" SANE_NAME_SCAN_RESOLUTION;
s->opt[OPT_Y_RESOLUTION].title = "Y " SANE_TITLE_SCAN_RESOLUTION;
s->opt[OPT_Y_RESOLUTION].desc = SANE_DESC_SCAN_RESOLUTION;
s->opt[OPT_Y_RESOLUTION].type = SANE_TYPE_INT;
s->opt[OPT_Y_RESOLUTION].unit = SANE_UNIT_DPI;
s->opt[OPT_Y_RESOLUTION].constraint_type = SANE_CONSTRAINT_RANGE;
s->opt[OPT_Y_RESOLUTION].constraint.range = &s->dev->info.yres_range;
s->val[OPT_Y_RESOLUTION].w = s->dev->info.yres_default;
/* x & y resolution */
s->opt[OPT_RESOLUTION].name = SANE_NAME_SCAN_RESOLUTION;
if (s->dev->sensedat.model == PCIN500)
s->opt[OPT_RESOLUTION].title = SANE_TITLE_SCAN_RESOLUTION"(x 10)";
else
s->opt[OPT_RESOLUTION].title = SANE_TITLE_SCAN_RESOLUTION;
s->opt[OPT_RESOLUTION].desc = SANE_DESC_SCAN_RESOLUTION;
s->opt[OPT_RESOLUTION].type = SANE_TYPE_INT;
s->opt[OPT_RESOLUTION].unit = SANE_UNIT_DPI;
s->opt[OPT_RESOLUTION].constraint_type = SANE_CONSTRAINT_RANGE;
s->opt[OPT_RESOLUTION].constraint.range = &s->dev->info.res_range;
s->val[OPT_RESOLUTION].w = s->dev->info.res_default;
/* "Geometry" group: */
s->opt[OPT_GEOMETRY_GROUP].title = "Geometry";
@ -1656,9 +1577,6 @@ init_options (NEC_Scanner * s)
s->opt[OPT_BR_Y].unit = SANE_UNIT_MM;
s->opt[OPT_BR_Y].constraint_type = SANE_CONSTRAINT_RANGE;
s->opt[OPT_BR_Y].constraint.range = &s->dev->info.br_y_ranges[default_source];
/* The FSU for JX250 allows a maximum scan length of 11.5 inch,
which is less than the default value of 297 mm
*/
scalar = s->dev->info.y_default;
clip_value (&s->opt[OPT_BR_X], &scalar);
s->val[OPT_BR_Y].w = scalar;
@ -1881,12 +1799,6 @@ do_cancel (NEC_Scanner * s)
};
if (reader_running(s))
{
/* be brutal...
!! The waiting time of 10 seconds might be far too short
!! if the resolution limit of the JX 250 is increased to
!! to more than 400 dpi: for these (interpolated) resolutions,
!! the JX 250 is awfully slow.
*/
kill(s->reader_pid, SIGKILL);
}
wait(&exit_status);
@ -1976,9 +1888,7 @@ sane_init (SANE_Int * version_code, SANE_Auth_Callback authorize)
DBG_INIT ();
DBG (10, "<< sane_init ");
#if defined PACKAGE && defined VERSION
DBG (2, "sane_init: " PACKAGE " " VERSION "\n");
#endif
DBG (1, "sane_init: NEC (Ver %d.%d)\n", NEC_MAJOR, NEC_MINOR);
if (version_code)
*version_code = SANE_VERSION_CODE (V_MAJOR, V_MINOR, 0);
@ -2149,13 +2059,15 @@ sane_exit (void)
}
first_dev = 0;
if (devlist)
free(devlist);
DBG (10, ">>\n");
}
SANE_Status
sane_get_devices (const SANE_Device *** device_list, SANE_Bool local_only)
{
static const SANE_Device **devlist = 0;
NEC_Device *dev;
int i;
DBG (10, "<< sane_get_devices ");
@ -2308,8 +2220,7 @@ sane_control_option (SANE_Handle handle, SANE_Int option,
switch (option)
{
/* word options: */
case OPT_X_RESOLUTION:
case OPT_Y_RESOLUTION:
case OPT_RESOLUTION:
case OPT_TL_X:
case OPT_TL_Y:
case OPT_BR_X:
@ -2352,7 +2263,9 @@ sane_control_option (SANE_Handle handle, SANE_Int option,
case OPT_HALFTONE:
case OPT_PAPER:
case OPT_GAMMA:
case OPT_RESOLUTION:
#ifdef USE_RESOLUTION_LIST
case OPT_RESOLUTION_LIST:
#endif
case OPT_EDGE_EMPHASIS:
case OPT_LIGHTCOLOR:
case OPT_SCANSOURCE:
@ -2378,8 +2291,7 @@ sane_control_option (SANE_Handle handle, SANE_Int option,
switch (option)
{
/* (mostly) side-effect-free word options: */
case OPT_X_RESOLUTION:
case OPT_Y_RESOLUTION:
case OPT_RESOLUTION:
case OPT_TL_X:
case OPT_TL_Y:
case OPT_BR_X:
@ -2575,7 +2487,8 @@ sane_control_option (SANE_Handle handle, SANE_Int option,
}
return (SANE_STATUS_GOOD);
case OPT_RESOLUTION:
#ifdef USE_RESOLUTION_LIST
case OPT_RESOLUTION_LIST:
if (info)
*info |= SANE_INFO_RELOAD_OPTIONS | SANE_INFO_RELOAD_PARAMS;
#if 0
@ -2583,19 +2496,19 @@ sane_control_option (SANE_Handle handle, SANE_Int option,
free (s->val[option].s);
s->val[option].s = strdup (val);
#endif
for (i = 0; s->opt[OPT_RESOLUTION].constraint.string_list[i]; i++) {
for (i = 0; s->opt[OPT_RESOLUTION_LIST].constraint.string_list[i]; i++) {
if (strcmp (val,
s->opt[OPT_RESOLUTION].constraint.string_list[i]) == 0){
s->val[OPT_X_RESOLUTION].w
= atoi(s->opt[OPT_RESOLUTION].constraint.string_list[i]);
s->val[OPT_Y_RESOLUTION].w
= atoi(s->opt[OPT_RESOLUTION].constraint.string_list[i]);
s->opt[OPT_RESOLUTION_LIST].constraint.string_list[i]) == 0){
s->val[OPT_RESOLUTION].w
= atoi(s->opt[OPT_RESOLUTION_LIST].constraint.string_list[i]);
if (info)
*info |= SANE_INFO_RELOAD_PARAMS;
break;
}
}
return (SANE_STATUS_GOOD);
#endif
#ifdef USE_CUSTOM_GAMMA
/* side-effect-free word-array options: */
case OPT_GAMMA_VECTOR:
@ -2627,13 +2540,12 @@ sane_control_option (SANE_Handle handle, SANE_Int option,
SANE_Status
sane_get_parameters (SANE_Handle handle, SANE_Parameters * params)
{
int width, length, xres, yres;
int width, length, res;
const char *mode;
NEC_Scanner *s = handle;
DBG (10, "<< sane_get_parameters ");
xres = s->val[OPT_X_RESOLUTION].w;
yres = s->val[OPT_Y_RESOLUTION].w;
res = s->val[OPT_RESOLUTION].w * s->dev->info.res_range.quant;
if (!s->scanning)
{
/* make best-effort guess at what parameters will look like once
@ -2649,8 +2561,8 @@ sane_get_parameters (SANE_Handle handle, SANE_Parameters * params)
s->width = width;
s->length = length;
s->params.pixels_per_line = width * xres / s->dev->info.mud;
s->params.lines = length * yres / s->dev->info.mud;
s->params.pixels_per_line = width * res / s->dev->info.mud;
s->params.lines = length * res / s->dev->info.mud;
if (s->dev->sensedat.model == PCIN500)
{
@ -2689,8 +2601,7 @@ sane_get_parameters (SANE_Handle handle, SANE_Parameters * params)
}
}
#endif
xres = s->val[OPT_X_RESOLUTION].w;
yres = s->val[OPT_Y_RESOLUTION].w;
res = s->val[OPT_RESOLUTION].w * s->dev->info.res_range.quant;
mode = s->val[OPT_MODE].s;
@ -2932,10 +2843,6 @@ sane_start (SANE_Handle handle)
/* make sure that we got at least 32 kB. Even then, the scan will be
awfully slow.
NOTE: If you need to decrease this value, remember that s->buffer
is used in send_ascii_gamma_tables (JX330/JX610) and in
send_binary_g_table (JX250). send_ascii_gamma_tables needs 4106 bytes,
and send_binary_g_table needs 522 bytes.
*/
if (s->dev->info.bufsize < 32 * 1024)
{
@ -3037,13 +2944,11 @@ sane_start (SANE_Handle handle)
if (s->val[OPT_PREVIEW].w == SANE_FALSE)
{
s->xres = s->val[OPT_X_RESOLUTION].w;
s->yres = s->val[OPT_Y_RESOLUTION].w;
s->res = s->val[OPT_RESOLUTION].w * s->dev->info.res_range.quant;
}
else
{
s->xres = 75;
s->yres = 75;
s->res = 75;
}
s->ulx = MM_TO_PIX(SANE_UNFIX(s->val[OPT_TL_X].w), s->dev->info.mud);
s->uly = MM_TO_PIX(SANE_UNFIX(s->val[OPT_TL_Y].w), s->dev->info.mud);
@ -3055,11 +2960,7 @@ sane_start (SANE_Handle handle)
s->bpp = s->params.depth;
s->adf_fsu_mode = SCAN_SIMPLE; /* default: scan without ADF and FSU */
#ifdef ALLOW_AUTO_SELECT_ADF
if (strcmp (adf_fsu, use_auto) == 0)
s->adf_fsu_mode = SCAN_ADF_FSU_AUTO;
else
#endif
if (strcmp(adf_fsu, use_fsu) == 0)
s->adf_fsu_mode = SCAN_WITH_FSU;
else if (strcmp(adf_fsu, use_adf) == 0)
@ -3141,41 +3042,6 @@ sane_start (SANE_Handle handle)
s->lightcolor = 3;
s->adf_scan = 0;
#ifdef NOTUSE_PCIN500
if (s->dev->sensedat.model != JX610)
{
status = mode_select_adf_fsu(s->fd, s->adf_fsu_mode);
if (status != SANE_STATUS_GOOD)
{
DBG (10, "sane_start: mode_select_adf_fsu failed: %s\n", sane_strstatus (status));
sanei_scsi_close (s->fd);
s->fd = -1;
return (status);
}
/* if the ADF is selected, check if it is ready */
memset (&m_subdev, 0, sizeof (m_subdev));
buf_size = sizeof (m_subdev);
status = mode_sense (s->fd, &m_subdev, &buf_size, 0x20);
DBG(11, "mode sense result a_mode: %x f_mode: %x\n",
m_subdev.a_mode_type, m_subdev.f_mode_type);
if (status != SANE_STATUS_GOOD)
{
DBG (10, "sane_start: MODE_SENSE/subdevice page failed\n");
sanei_scsi_close (s->fd);
s->fd = -1;
return (status);
}
if (s->adf_fsu_mode == SCAN_WITH_ADF)
s->adf_scan = 1;
#ifdef ALLOW_AUTO_SELECT_ADF
else if (s->adf_fsu_mode == SCAN_ADF_FSU_AUTO)
{
if (m_subdev.a_mode_type & 0x80)
s->adf_scan = 1;
}
#endif
}
#endif
#ifdef USE_CUSTOM_GAMMA
if (s->val[OPT_CUSTOM_GAMMA].w == SANE_FALSE)
@ -3216,9 +3082,6 @@ sane_start (SANE_Handle handle)
else
#else
{
/* the JX250 does not support the "fixed gamma selection",
therefore, lets calculate & send gamma values
*/
int i;
SANE_Word gtbl[256];
#if 0
@ -3252,34 +3115,6 @@ sane_start (SANE_Handle handle)
return (status);
}
#endif
#ifdef NOTUSE_PCIN500
if (s->dev->sensedat.model != JX250)
{
ss.dtc = 0x86;
ss.dtq = 0x05;
ss.length = 0;
DBG (5, "start: SEND\n");
status = send (s->fd, &ss);
if (status != SANE_STATUS_GOOD)
{
DBG (1, "send failed: %s\n", sane_strstatus (status));
sanei_scsi_close (s->fd);
s->fd = -1;
return (status);
}
#ifdef USE_COLOR_THRESHOLD
status = send_threshold_data(s);
if (status != SANE_STATUS_GOOD)
{
DBG (1, "send threshold data failed: %s\n", sane_strstatus (status));
sanei_scsi_close (s->fd);
s->fd = -1;
return (status);
}
#endif
}
#endif
s->tint = s->val[OPT_TINT].w;
s->color = s->val[OPT_COLOR].w;
@ -3295,10 +3130,10 @@ sane_start (SANE_Handle handle)
wp.wpdh.wdl[0] = buf_size >> 8;
wp.wpdh.wdl[1] = buf_size;
wp.wdb.x_res[0] = s->xres >> 8;
wp.wdb.x_res[1] = s->xres;
wp.wdb.y_res[0] = s->yres >> 8;
wp.wdb.y_res[1] = s->yres;
wp.wdb.x_res[0] = s->res >> 8;
wp.wdb.x_res[1] = s->res;
wp.wdb.y_res[0] = s->res >> 8;
wp.wdb.y_res[1] = s->res;
wp.wdb.x_ul[0] = s->ulx >> 24;
wp.wdb.x_ul[1] = s->ulx >> 16;
wp.wdb.x_ul[2] = s->ulx >> 8;
@ -3564,7 +3399,7 @@ sane_start (SANE_Handle handle)
DBG (1, "%d pixels per line, %d bytes, %d lines high, total %lu bytes, "
"dpi=%d\n", s->params.pixels_per_line, s->params.bytes_per_line,
s->params.lines, (u_long) s->bytes_to_read, s->val[OPT_Y_RESOLUTION].w);
s->params.lines, (u_long) s->bytes_to_read, s->val[OPT_RESOLUTION].w);
s->busy = SANE_FALSE;
s->buf_used = 0;
@ -3807,8 +3642,6 @@ sane_read (SANE_Handle handle, SANE_Byte *dst_buf, SANE_Int max_len,
return (SANE_STATUS_CANCELLED);
}
/* RGB scans with a JX 250 and bi-level color scans
must be handled differently: */
if (s->image_composition <= 2)
status = sane_read_direct(handle, dst_buf, max_len, len);
else if (s->image_composition <= 4)

Wyświetl plik

@ -1,5 +1,5 @@
:backend "nec" ; name of backend
:version "0.11" ; version of backend
:version "0.12" ; version of backend
:status :beta ; :alpha, :beta, :stable, :new
:url "http://www5a.biglobe.ne.jp/~saetaka/"
; backend's homepage

Wyświetl plik

@ -69,6 +69,9 @@
#define DEFAULT_BUFSIZE 128 * 1024
#define DEFAULT_QUEUED_READS 2
#define NEC_MAJOR 0
#define NEC_MINOR 12
typedef enum
{
OPT_NUM_OPTS = 0,
@ -83,9 +86,10 @@ typedef enum
OPT_CUSTOM_GAMMA,
#endif
OPT_RESOLUTION_GROUP,
#ifdef USE_RESOLUTION_LIST
OPT_RESOLUTION_LIST,
#endif
OPT_RESOLUTION,
OPT_X_RESOLUTION,
OPT_Y_RESOLUTION,
OPT_GEOMETRY_GROUP,
OPT_TL_X, /* top-left x */
@ -170,8 +174,7 @@ NEC_Model;
typedef struct NEC_Info
{
SANE_Range xres_range;
SANE_Range yres_range;
SANE_Range res_range;
SANE_Range tl_x_ranges[3]; /* normal / FSU / ADF */
SANE_Range br_x_ranges[3]; /* normal / FSU / ADF */
SANE_Range tl_y_ranges[3]; /* normal / FSU / ADF */
@ -180,8 +183,7 @@ typedef struct NEC_Info
SANE_Range tint_range;
SANE_Range color_range;
SANE_Int xres_default;
SANE_Int yres_default;
SANE_Int res_default;
SANE_Int x_default;
SANE_Int y_default;
SANE_Int bmu;
@ -240,8 +242,7 @@ typedef struct NEC_Scanner
SANE_Int buf_used;
SANE_Int buf_pos;
SANE_Int modes;
SANE_Int xres;
SANE_Int yres;
SANE_Int res;
SANE_Int ulx;
SANE_Int uly;
SANE_Int width;