1999-08-09 18:06:01 +00:00
|
|
|
/* sane - Scanner Access Now Easy.
|
|
|
|
Copyright (C) 1997 BYTEC GmbH Germany
|
|
|
|
Written by Helmut Koeberle, Email: helmut.koeberle@bytec.de
|
2006-06-15 15:55:28 +00:00
|
|
|
Modified by Manuel Panea <Manuel.Panea@rzg.mpg.de>,
|
|
|
|
Markus Mertinat <Markus.Mertinat@Physik.Uni-Augsburg.DE>,
|
|
|
|
and ULrich Deiters <ulrich.deiters@uni-koeln.de>
|
1999-08-09 18:06:01 +00:00
|
|
|
|
|
|
|
This file is part of the SANE package.
|
|
|
|
|
|
|
|
This program is free software; you can redistribute it and/or
|
|
|
|
modify it under the terms of the GNU General Public License as
|
|
|
|
published by the Free Software Foundation; either version 2 of the
|
|
|
|
License, or (at your option) any later version.
|
|
|
|
|
|
|
|
This program is distributed in the hope that it will be useful, but
|
|
|
|
WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
General Public License for more details.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
|
|
along with this program; if not, write to the Free Software
|
|
|
|
Foundation, Inc., 59 Temple Place - Suite 330, Boston,
|
|
|
|
MA 02111-1307, USA.
|
|
|
|
|
|
|
|
As a special exception, the authors of SANE give permission for
|
|
|
|
additional uses of the libraries contained in this release of SANE.
|
|
|
|
|
|
|
|
The exception is that, if you link a SANE library with other files
|
|
|
|
to produce an executable, this does not by itself cause the
|
|
|
|
resulting executable to be covered by the GNU General Public
|
|
|
|
License. Your use of that executable is in no way restricted on
|
|
|
|
account of linking the SANE library code into it.
|
|
|
|
|
|
|
|
This exception does not, however, invalidate any other reasons why
|
|
|
|
the executable file might be covered by the GNU General Public
|
|
|
|
License.
|
|
|
|
|
|
|
|
If you submit changes to SANE to the maintainers to be included in
|
|
|
|
a subsequent release, you agree by submitting the changes that
|
|
|
|
those changes may be distributed with this exception intact.
|
|
|
|
|
|
|
|
If you write modifications of your own for SANE, it is your choice
|
|
|
|
whether to permit this exception to apply to your modifications.
|
|
|
|
If you do not wish that, delete this exception notice. */
|
|
|
|
|
|
|
|
#ifndef canon_h
|
|
|
|
#define canon_h 1
|
|
|
|
|
2006-06-15 15:55:28 +00:00
|
|
|
#ifdef __GNUC__
|
|
|
|
#define UNUSEDARG __attribute__ ((unused))
|
|
|
|
#else
|
|
|
|
#define UNUSEDARG
|
|
|
|
#endif
|
|
|
|
|
2000-03-05 13:57:25 +00:00
|
|
|
/* all the different possible model names. */
|
|
|
|
#define FB1200S "IX-12015E "
|
|
|
|
#define FB620S "IX-06035E "
|
|
|
|
#define CS300 "IX-03035B "
|
|
|
|
#define CS600 "IX-06015C "
|
|
|
|
#define CS2700F "IX-27015C "
|
|
|
|
#define IX_4025 "IX-4025 "
|
|
|
|
#define IX_4015 "IX-4015 "
|
|
|
|
#define IX_3010 "IX-3010 "
|
|
|
|
|
1999-08-09 18:06:01 +00:00
|
|
|
#include <sys/types.h>
|
|
|
|
|
2003-02-26 13:50:00 +00:00
|
|
|
#define AUTO_DOC_FEEDER_UNIT 0x01
|
|
|
|
#define TRANSPARENCY_UNIT 0x02
|
|
|
|
#define TRANSPARENCY_UNIT_FB1200 0x03
|
|
|
|
#define SCAN_CONTROL_CONDITIONS 0x20
|
|
|
|
#define SCAN_CONTROL_CON_FB1200 0x21
|
|
|
|
#define ALL_SCAN_MODE_PAGES 0x3F
|
1999-08-09 18:06:01 +00:00
|
|
|
|
|
|
|
#define RED 0
|
|
|
|
#define GREEN 1
|
|
|
|
#define BLUE 2
|
|
|
|
|
2000-03-05 13:57:25 +00:00
|
|
|
#define ADF_STAT_NONE 0
|
|
|
|
#define ADF_STAT_INACTIVE 1
|
|
|
|
#define ADF_STAT_ACTIVE 2
|
|
|
|
#define ADF_STAT_DISABLED 3
|
|
|
|
|
2002-04-21 10:29:18 +00:00
|
|
|
#define ADF_Status (4+2) /* byte positioning */
|
|
|
|
#define ADF_Settings (4+3) /* in data block */
|
2000-03-05 13:57:25 +00:00
|
|
|
|
2002-04-21 10:29:18 +00:00
|
|
|
#define ADF_NOT_PRESENT 0x01 /* bit selection */
|
|
|
|
#define ADF_PROBLEM 0x0E /* from bytes in */
|
|
|
|
#define ADF_PRIORITY 0x03 /* data block. */
|
|
|
|
#define ADF_FEEDER 0x04 /* */
|
2000-03-05 13:57:25 +00:00
|
|
|
|
1999-08-09 18:06:01 +00:00
|
|
|
#define TPU_STAT_NONE 0
|
|
|
|
#define TPU_STAT_INACTIVE 1
|
|
|
|
#define TPU_STAT_ACTIVE 2
|
|
|
|
|
2002-04-21 10:29:18 +00:00
|
|
|
#define CS3_600 0 /* CanoScan 300/600 */
|
|
|
|
#define CS2700 1 /* CanoScan 2700F */
|
|
|
|
#define FB620 2 /* CanoScan FB620S */
|
2003-02-28 09:35:24 +00:00
|
|
|
#define FS2710 3 /* CanoScan FS2710S */
|
2003-02-26 13:50:00 +00:00
|
|
|
#define FB1200 4 /* CanoScan FB1200S */
|
2002-04-21 10:29:18 +00:00
|
|
|
|
|
|
|
#ifndef MAX
|
|
|
|
#define MAX(A,B) (((A) > (B))? (A) : (B))
|
|
|
|
#endif
|
|
|
|
#ifndef MIN
|
|
|
|
#define MIN(A,B) (((A) < (B))? (A) : (B))
|
|
|
|
#endif
|
2005-07-04 07:01:53 +00:00
|
|
|
#ifndef SSIZE_MAX
|
|
|
|
#define SSIZE_MAX LONG_MAX
|
|
|
|
#endif
|
1999-08-09 18:06:01 +00:00
|
|
|
|
2000-03-05 13:57:25 +00:00
|
|
|
typedef struct
|
|
|
|
{
|
2002-04-21 10:29:18 +00:00
|
|
|
SANE_Int Status; /* Auto Document Feeder Unit Status */
|
|
|
|
SANE_Int Problem; /* ADF Problems list */
|
|
|
|
SANE_Int Priority; /* ADF Priority setting */
|
|
|
|
SANE_Int Feeder; /* ADF Feeder setting */
|
2000-03-05 13:57:25 +00:00
|
|
|
|
2002-04-21 10:29:18 +00:00
|
|
|
}
|
|
|
|
CANON_ADF;
|
2000-03-05 13:57:25 +00:00
|
|
|
|
|
|
|
|
1999-08-09 18:06:01 +00:00
|
|
|
typedef struct
|
|
|
|
{
|
2002-04-21 10:29:18 +00:00
|
|
|
SANE_Int Status; /* Transparency Unit Status */
|
|
|
|
SANE_Bool PosNeg; /* Negative/Positive Film */
|
|
|
|
SANE_Int Transparency; /* TPU Transparency */
|
|
|
|
SANE_Int ControlMode; /* TPU Density Control Mode */
|
|
|
|
SANE_Int FilmType; /* TPU Film Type */
|
1999-08-09 18:06:01 +00:00
|
|
|
|
2002-04-21 10:29:18 +00:00
|
|
|
}
|
|
|
|
CANON_TPU;
|
1999-08-09 18:06:01 +00:00
|
|
|
|
|
|
|
|
|
|
|
typedef enum
|
2002-04-21 10:29:18 +00:00
|
|
|
{
|
|
|
|
OPT_NUM_OPTS = 0,
|
|
|
|
|
|
|
|
OPT_MODE_GROUP,
|
|
|
|
OPT_MODE,
|
|
|
|
OPT_NEGATIVE, /* Reverse image format */
|
|
|
|
OPT_NEGATIVE_TYPE, /* Negative film type */
|
|
|
|
OPT_SCANNING_SPEED,
|
|
|
|
|
|
|
|
OPT_RESOLUTION_GROUP,
|
|
|
|
OPT_RESOLUTION_BIND,
|
|
|
|
OPT_HW_RESOLUTION_ONLY,
|
|
|
|
OPT_X_RESOLUTION,
|
|
|
|
OPT_Y_RESOLUTION,
|
|
|
|
|
|
|
|
OPT_ENHANCEMENT_GROUP,
|
|
|
|
OPT_BRIGHTNESS,
|
|
|
|
OPT_CONTRAST,
|
|
|
|
OPT_THRESHOLD,
|
|
|
|
|
|
|
|
OPT_MIRROR,
|
|
|
|
|
|
|
|
OPT_CUSTOM_GAMMA, /* use custom gamma tables? */
|
|
|
|
OPT_CUSTOM_GAMMA_BIND,
|
|
|
|
/* The gamma vectors MUST appear in the order gray, red, green, blue. */
|
|
|
|
OPT_GAMMA_VECTOR,
|
|
|
|
OPT_GAMMA_VECTOR_R,
|
|
|
|
OPT_GAMMA_VECTOR_G,
|
|
|
|
OPT_GAMMA_VECTOR_B,
|
|
|
|
OPT_AE, /* Auto Exposure */
|
|
|
|
|
|
|
|
OPT_CALIBRATION_GROUP, /* Calibration for FB620S */
|
|
|
|
OPT_CALIBRATION_NOW, /* Execute Calibration now for FB620S */
|
|
|
|
OPT_SCANNER_SELF_DIAGNOSTIC, /* Self diagnostic for FB620S */
|
|
|
|
OPT_RESET_SCANNER, /* Reset scanner for FB620S */
|
|
|
|
|
|
|
|
OPT_EJECT_GROUP,
|
|
|
|
OPT_EJECT_AFTERSCAN,
|
|
|
|
OPT_EJECT_BEFOREEXIT,
|
|
|
|
OPT_EJECT_NOW,
|
|
|
|
|
|
|
|
OPT_FOCUS_GROUP,
|
|
|
|
OPT_AF, /* Auto Focus */
|
|
|
|
OPT_AF_ONCE, /* Auto Focus only once between ejects */
|
|
|
|
OPT_FOCUS, /* Manual focus position */
|
|
|
|
|
|
|
|
OPT_MARGINS_GROUP, /* scan margins */
|
|
|
|
OPT_TL_X, /* top-left x */
|
|
|
|
OPT_TL_Y, /* top-left y */
|
|
|
|
OPT_BR_X, /* bottom-right x */
|
|
|
|
OPT_BR_Y, /* bottom-right y */
|
|
|
|
|
|
|
|
OPT_COLORS_GROUP,
|
|
|
|
OPT_HNEGATIVE, /* Reverse image format */
|
|
|
|
OPT_BIND_HILO, /* Same values vor highlight and shadow
|
|
|
|
points for red, green, blue */
|
|
|
|
OPT_HILITE_R, /* highlight point for red */
|
|
|
|
OPT_SHADOW_R, /* shadow point for red */
|
|
|
|
OPT_HILITE_G, /* highlight point for green */
|
|
|
|
OPT_SHADOW_G, /* shadow point for green */
|
|
|
|
OPT_HILITE_B, /* highlight point for blue */
|
|
|
|
OPT_SHADOW_B, /* shadow point for blue */
|
|
|
|
|
|
|
|
OPT_ADF_GROUP, /* to allow display of options. */
|
|
|
|
OPT_FLATBED_ONLY, /* in case you have a sheetfeeder
|
2000-03-05 13:57:25 +00:00
|
|
|
but don't want to use it. */
|
|
|
|
|
2002-04-21 10:29:18 +00:00
|
|
|
OPT_TPU_GROUP,
|
|
|
|
OPT_TPU_ON,
|
|
|
|
OPT_TPU_PN,
|
|
|
|
OPT_TPU_DCM,
|
|
|
|
OPT_TPU_TRANSPARENCY,
|
|
|
|
OPT_TPU_FILMTYPE,
|
1999-08-09 18:06:01 +00:00
|
|
|
|
2002-04-21 10:29:18 +00:00
|
|
|
OPT_PREVIEW,
|
1999-08-09 18:06:01 +00:00
|
|
|
|
2002-04-21 10:29:18 +00:00
|
|
|
/* must come last: */
|
|
|
|
NUM_OPTIONS
|
|
|
|
}
|
1999-08-09 18:06:01 +00:00
|
|
|
CANON_Option;
|
|
|
|
|
|
|
|
|
|
|
|
typedef struct CANON_Info
|
2002-04-21 10:29:18 +00:00
|
|
|
{
|
|
|
|
int model;
|
|
|
|
|
|
|
|
SANE_Range xres_range;
|
|
|
|
SANE_Range yres_range;
|
|
|
|
SANE_Range x_range;
|
|
|
|
SANE_Range y_range;
|
|
|
|
SANE_Range brightness_range;
|
|
|
|
SANE_Range contrast_range;
|
|
|
|
SANE_Range threshold_range;
|
|
|
|
SANE_Range HiliteR_range;
|
|
|
|
SANE_Range ShadowR_range;
|
|
|
|
SANE_Range HiliteG_range;
|
|
|
|
SANE_Range ShadowG_range;
|
|
|
|
SANE_Range HiliteB_range;
|
|
|
|
SANE_Range ShadowB_range;
|
|
|
|
SANE_Range focus_range;
|
|
|
|
|
|
|
|
SANE_Range x_adf_range;
|
|
|
|
SANE_Range y_adf_range;
|
|
|
|
SANE_Int xres_default;
|
|
|
|
SANE_Int yres_default;
|
|
|
|
SANE_Int bmu;
|
|
|
|
SANE_Int mud;
|
|
|
|
SANE_Range TPU_Transparency_range;
|
|
|
|
SANE_Int TPU_Stat;
|
|
|
|
|
2003-02-26 13:50:00 +00:00
|
|
|
SANE_Bool can_focus; /* has got focus control */
|
|
|
|
SANE_Bool can_autoexpose; /* can do autoexposure by hardware */
|
|
|
|
SANE_Bool can_calibrate; /* has got calibration control */
|
|
|
|
SANE_Bool can_eject; /* can eject medium */
|
|
|
|
SANE_Bool can_mirror; /* can mirror image by hardware */
|
|
|
|
SANE_Bool is_scsi2; /* is an SCSI-2 device */
|
|
|
|
SANE_Bool is_filmscanner;
|
|
|
|
SANE_Bool has_fixed_resolutions; /* only a finite number possible */
|
2002-04-21 10:29:18 +00:00
|
|
|
}
|
1999-08-09 18:06:01 +00:00
|
|
|
CANON_Info;
|
|
|
|
|
|
|
|
typedef struct CANON_Device
|
2002-04-21 10:29:18 +00:00
|
|
|
{
|
|
|
|
struct CANON_Device *next;
|
|
|
|
SANE_Device sane;
|
|
|
|
CANON_Info info;
|
|
|
|
CANON_ADF adf;
|
|
|
|
CANON_TPU tpu;
|
|
|
|
}
|
1999-08-09 18:06:01 +00:00
|
|
|
CANON_Device;
|
|
|
|
|
|
|
|
typedef struct CANON_Scanner
|
2002-04-21 10:29:18 +00:00
|
|
|
{
|
|
|
|
struct CANON_Scanner *next;
|
|
|
|
int fd;
|
|
|
|
CANON_Device *hw;
|
|
|
|
SANE_Option_Descriptor opt[NUM_OPTIONS];
|
|
|
|
Option_Value val[NUM_OPTIONS];
|
|
|
|
char *sense_str; /* sense string */
|
|
|
|
SANE_Int gamma_table[4][256];
|
|
|
|
SANE_Parameters params;
|
|
|
|
SANE_Bool AF_NOW; /* To keep track of when to do AF */
|
|
|
|
|
|
|
|
SANE_Int xres;
|
|
|
|
SANE_Int yres;
|
|
|
|
SANE_Int ulx;
|
|
|
|
SANE_Int uly;
|
|
|
|
SANE_Int width;
|
|
|
|
SANE_Int length;
|
|
|
|
SANE_Int brightness;
|
|
|
|
SANE_Int contrast;
|
|
|
|
SANE_Int threshold;
|
|
|
|
SANE_Int image_composition;
|
|
|
|
SANE_Int bpp;
|
|
|
|
SANE_Bool RIF; /* Reverse Image Format */
|
|
|
|
SANE_Int negative_filmtype;
|
|
|
|
SANE_Int scanning_speed;
|
|
|
|
SANE_Bool GRC; /* Gray Response Curve */
|
|
|
|
SANE_Bool Mirror;
|
|
|
|
SANE_Bool AE; /* Auto Exposure */
|
|
|
|
SANE_Int HiliteR;
|
|
|
|
SANE_Int ShadowR;
|
|
|
|
SANE_Int HiliteG;
|
|
|
|
SANE_Int ShadowG;
|
|
|
|
SANE_Int HiliteB;
|
|
|
|
SANE_Int ShadowB;
|
|
|
|
|
|
|
|
/* 990320, ss: array for fixed resolutions */
|
2003-02-26 13:50:00 +00:00
|
|
|
SANE_Word xres_word_list[16];
|
|
|
|
SANE_Word yres_word_list[16];
|
2002-04-21 10:29:18 +00:00
|
|
|
|
|
|
|
SANE_Byte *inbuffer; /* modification for FB620S */
|
|
|
|
SANE_Byte *outbuffer; /* modification for FB620S */
|
|
|
|
SANE_Int buf_used; /* modification for FB620S */
|
|
|
|
SANE_Int buf_pos; /* modification for FB620S */
|
|
|
|
time_t time0; /* modification for FB620S */
|
|
|
|
time_t time1; /* modification for FB620S */
|
|
|
|
int switch_preview; /* modification for FB620S */
|
|
|
|
int reset_flag; /* modification for FB620S */
|
|
|
|
|
2003-02-26 13:50:00 +00:00
|
|
|
int tmpfile; /* modification for FB1200S */
|
|
|
|
|
2002-04-21 10:29:18 +00:00
|
|
|
size_t bytes_to_read;
|
|
|
|
int scanning;
|
|
|
|
|
2003-02-28 09:35:24 +00:00
|
|
|
u_char gamma_map[4][4096]; /* for FS2710S: */
|
2002-04-21 10:29:18 +00:00
|
|
|
int colour; /* index to gamma_map */
|
|
|
|
int auxbuf_len; /* size of auxiliary buffer */
|
|
|
|
u_char *auxbuf;
|
|
|
|
}
|
1999-08-09 18:06:01 +00:00
|
|
|
CANON_Scanner;
|
|
|
|
|
2002-04-21 15:33:22 +00:00
|
|
|
static char *option_name[] = {
|
2002-04-21 10:29:18 +00:00
|
|
|
"OPT_NUM_OPTS",
|
|
|
|
|
|
|
|
"OPT_MODE_GROUP",
|
|
|
|
"OPT_MODE",
|
|
|
|
"OPT_NEGATIVE",
|
|
|
|
"OPT_NEGATIVE_TYPE",
|
|
|
|
"OPT_SCANNING_SPEED",
|
|
|
|
|
|
|
|
"OPT_RESOLUTION_GROUP",
|
|
|
|
"OPT_RESOLUTION_BIND",
|
|
|
|
"OPT_HW_RESOLUTION_ONLY",
|
|
|
|
"OPT_X_RESOLUTION",
|
|
|
|
"OPT_Y_RESOLUTION",
|
|
|
|
|
|
|
|
"OPT_ENHANCEMENT_GROUP",
|
|
|
|
"OPT_BRIGHTNESS",
|
|
|
|
"OPT_CONTRAST",
|
|
|
|
"OPT_THRESHOLD",
|
|
|
|
|
|
|
|
"OPT_MIRROR",
|
|
|
|
|
|
|
|
"OPT_CUSTOM_GAMMA",
|
|
|
|
"OPT_CUSTOM_GAMMA_BIND",
|
|
|
|
"OPT_GAMMA_VECTOR",
|
|
|
|
"OPT_GAMMA_VECTOR_R",
|
|
|
|
"OPT_GAMMA_VECTOR_G",
|
|
|
|
"OPT_GAMMA_VECTOR_B",
|
|
|
|
"OPT_AE",
|
|
|
|
|
|
|
|
"OPT_CALIBRATION_GROUP",
|
|
|
|
"OPT_CALIBRATION_NOW",
|
|
|
|
"OPT_SCANNER_SELF_DIAGNOSTIC",
|
|
|
|
"OPT_RESET_SCANNER",
|
|
|
|
|
|
|
|
"OPT_EJECT_GROUP",
|
|
|
|
"OPT_EJECT_AFTERSCAN",
|
|
|
|
"OPT_EJECT_BEFOREEXIT",
|
|
|
|
"OPT_EJECT_NOW",
|
|
|
|
|
|
|
|
"OPT_FOCUS_GROUP",
|
|
|
|
"OPT_AF",
|
|
|
|
"OPT_AF_ONCE",
|
|
|
|
"OPT_FOCUS",
|
|
|
|
|
|
|
|
"OPT_MARGINS_GROUP",
|
|
|
|
"OPT_TL_X",
|
|
|
|
"OPT_TL_Y",
|
|
|
|
"OPT_BR_X",
|
|
|
|
"OPT_BR_Y",
|
|
|
|
|
|
|
|
"OPT_COLORS_GROUP",
|
|
|
|
"OPT_HNEGATIVE",
|
|
|
|
"OPT_BIND_HILO",
|
|
|
|
|
|
|
|
"OPT_HILITE_R",
|
|
|
|
"OPT_SHADOW_R",
|
|
|
|
"OPT_HILITE_G",
|
|
|
|
"OPT_SHADOW_G",
|
|
|
|
"OPT_HILITE_B",
|
|
|
|
"OPT_SHADOW_B",
|
|
|
|
|
|
|
|
"OPT_ADF_GROUP",
|
|
|
|
"OPT_FLATBED_ONLY",
|
|
|
|
|
|
|
|
"OPT_TPU_GROUP",
|
|
|
|
"OPT_TPU_ON",
|
|
|
|
"OPT_TPU_PN",
|
|
|
|
"OPT_TPU_DCM",
|
|
|
|
"OPT_TPU_TRANSPARENCY",
|
|
|
|
"OPT_TPU_FILMTYPE",
|
|
|
|
|
|
|
|
"OPT_PREVIEW",
|
|
|
|
|
|
|
|
"NUM_OPTIONS"
|
|
|
|
};
|
2000-03-05 13:57:25 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1999-08-09 18:06:01 +00:00
|
|
|
#endif /* not canon_h */
|