summaryrefslogtreecommitdiff
path: root/backend/canon_dr.h
diff options
context:
space:
mode:
Diffstat (limited to 'backend/canon_dr.h')
-rw-r--r--backend/canon_dr.h587
1 files changed, 587 insertions, 0 deletions
diff --git a/backend/canon_dr.h b/backend/canon_dr.h
new file mode 100644
index 0000000..1bf95a0
--- /dev/null
+++ b/backend/canon_dr.h
@@ -0,0 +1,587 @@
+#ifndef CANON_DR_H
+#define CANON_DR_H
+
+/*
+ * Part of SANE - Scanner Access Now Easy.
+ * Please see opening comments in canon_dr.c
+ */
+
+/* -------------------------------------------------------------------------
+ * This option list has to contain all options for all scanners supported by
+ * this driver. If a certain scanner cannot handle a certain option, there's
+ * still the possibility to say so, later.
+ */
+enum scanner_Option
+{
+ OPT_NUM_OPTS = 0,
+
+ OPT_STANDARD_GROUP,
+ OPT_SOURCE, /*fb/adf/front/back/duplex*/
+ OPT_MODE, /*mono/gray/color*/
+ OPT_RES, /*a range or a list*/
+
+ OPT_GEOMETRY_GROUP,
+ OPT_TL_X,
+ OPT_TL_Y,
+ OPT_BR_X,
+ OPT_BR_Y,
+ OPT_PAGE_WIDTH,
+ OPT_PAGE_HEIGHT,
+
+ OPT_ENHANCEMENT_GROUP,
+ OPT_BRIGHTNESS,
+ OPT_CONTRAST,
+ OPT_THRESHOLD,
+ OPT_RIF,
+
+ OPT_ADVANCED_GROUP,
+ OPT_COMPRESS,
+ OPT_COMPRESS_ARG,
+ OPT_DF_THICKNESS,
+ OPT_DF_LENGTH,
+ OPT_ROLLERDESKEW,
+ OPT_SWDESKEW,
+ OPT_SWDESPECK,
+ OPT_SWCROP,
+ OPT_STAPLEDETECT,
+ OPT_DROPOUT_COLOR_F,
+ OPT_DROPOUT_COLOR_B,
+ OPT_BUFFERMODE,
+ OPT_SIDE,
+
+ /*sensor group*/
+ OPT_SENSOR_GROUP,
+ OPT_START,
+ OPT_STOP,
+ OPT_BUTT3,
+ OPT_NEWFILE,
+ OPT_COUNTONLY,
+ OPT_BYPASSMODE,
+ OPT_COUNTER,
+
+ /* must come last: */
+ NUM_OPTIONS
+};
+
+struct img_params
+{
+ int mode; /*color,lineart,etc*/
+ int source; /*fb,adf front,adf duplex,etc*/
+
+ int dpi_x; /*these are in dpi */
+ int dpi_y;
+
+ int tl_x; /*these are in 1200dpi units */
+ int tl_y;
+ int br_x;
+ int br_y;
+ int page_x;
+ int page_y;
+
+ int width; /*these are in pixels*/
+ int height;
+
+ SANE_Frame format; /*SANE_FRAME_**/
+ int bpp; /* 1,8,24 */
+ int Bpl; /* in bytes */
+
+ int valid_width; /*some machines have black padding*/
+ int valid_Bpl;
+
+ /* done yet? */
+ int eof[2];
+
+ /* how far we have read/written */
+ int bytes_sent[2];
+
+ /* total to read/write */
+ int bytes_tot[2];
+
+ /* dumb scanners send extra data */
+ int skip_lines[2];
+
+};
+
+struct scanner
+{
+ /* --------------------------------------------------------------------- */
+ /* immutable values which are set during init of scanner. */
+ struct scanner *next;
+ char device_name[1024]; /* The name of the device from sanei */
+ int missing; /* used to mark unplugged scanners */
+
+ /* --------------------------------------------------------------------- */
+ /* immutable values which are set during reading of config file. */
+ int buffer_size;
+ int connection; /* hardware interface type */
+
+ /* --------------------------------------------------------------------- */
+ /* immutable values which are set during inquiry probing of the scanner. */
+ /* members in order found in scsi data... */
+ char vendor_name[9]; /* raw data as returned by SCSI inquiry. */
+ char model_name[17]; /* raw data as returned by SCSI inquiry. */
+ char version_name[5]; /* raw data as returned by SCSI inquiry. */
+
+ /* --------------------------------------------------------------------- */
+ /* immutable values which are set during std VPD probing of the scanner. */
+ /* members in order found in scsi data... */
+ int basic_x_res;
+ int basic_y_res;
+ int step_x_res;
+ int step_y_res;
+ int max_x_res;
+ int max_y_res;
+ int min_x_res;
+ int min_y_res;
+
+ int std_res_x[16];
+ int std_res_y[16];
+
+ /* max scan size in pixels converted to 1200dpi units */
+ int max_x;
+ int max_y;
+
+ /*FIXME: 4 more unknown values here*/
+ int can_grayscale;
+ int can_halftone;
+ int can_monochrome;
+ int can_overflow;
+
+ /* --------------------------------------------------------------------- */
+ /* immutable values which are hard coded because they are not in vpd */
+
+ int brightness_steps;
+ int threshold_steps;
+ int contrast_steps;
+ int ppl_mod; /* modulus of scanline width */
+
+ /* the scan size in 1/1200th inches, NOT basic_units or sane units */
+ int min_x;
+ int min_y;
+ int valid_x;
+ int max_x_fb;
+ int max_y_fb;
+
+ int can_color; /* actually might be in vpd, but which bit? */
+ int need_ccal; /* scanner needs software to help with afe calibration */
+ int need_fcal; /* scanner needs software to help with fine calibration */
+ int need_fcal_buffer; /* software to apply calibration stored in scanner*/
+ int ccal_version; /* 0 in most scanners, 3 in newer ones */
+
+ int has_counter;
+ int has_rif;
+ int has_adf;
+ int has_flatbed;
+ int has_duplex;
+ int has_back; /* not all duplex scanners can do adf back side only */
+ int has_comp_JPEG;
+ int has_buffer;
+ int has_df;
+ int has_btc;
+ int has_ssm; /* older scanners use this set scan mode command */
+ int has_ssm2; /* newer scanners user this similar command */
+ int has_ssm_pay_head_len; /* newer scanners put the length twice in ssm */
+ int can_read_panel;
+ int can_write_panel;
+ int rgb_format; /* meaning unknown */
+ int padding; /* meaning unknown */
+
+ int always_op; /* send object pos between pages */
+ int invert_tly; /* weird bug in some smaller scanners */
+ int unknown_byte2; /* weird byte, required, meaning unknown */
+ int padded_read; /* some machines need extra 12 bytes on reads */
+ int fixed_width; /* some machines always scan full width */
+ int even_Bpl; /* some machines require even bytes per line */
+
+ int gray_interlace[2]; /* different models interlace heads differently */
+ int color_interlace[2]; /* different models interlace colors differently */
+ int duplex_interlace; /* different models interlace sides differently */
+ int jpeg_interlace; /* different models interlace jpeg sides differently */
+ int duplex_offset; /* number of lines of padding added to front (1/1200)*/
+ int duplex_offset_side; /* padding added to front or back? */
+
+ int sw_lut; /* no hardware brightness/contrast support */
+ int bg_color; /* needed to fill in after rotation */
+
+ int reverse_by_mode[6]; /* mode specific */
+
+ /* --------------------------------------------------------------------- */
+ /* immutable values which are set during serial number probing scanner */
+ char serial_name[28]; /* 16 char model, ':', 10 byte serial, null */
+
+ /* --------------------------------------------------------------------- */
+ /* struct with pointers to device/vendor/model names, and a type value */
+ /* used to inform sane frontend about the device */
+ SANE_Device sane;
+
+ /* --------------------------------------------------------------------- */
+ /* changeable SANE_Option structs provide our interface to frontend. */
+ /* some options require lists of strings or numbers, we keep them here */
+ /* instead of in global vars so that they can differ for each scanner */
+
+ /* long array of option structs */
+ SANE_Option_Descriptor opt[NUM_OPTIONS];
+
+ /*mode group*/
+ SANE_String_Const mode_list[7];
+ SANE_String_Const source_list[5];
+
+ SANE_Int res_list[17];
+ SANE_Range res_range;
+
+ /*geometry group*/
+ SANE_Range tl_x_range;
+ SANE_Range tl_y_range;
+ SANE_Range br_x_range;
+ SANE_Range br_y_range;
+ SANE_Range paper_x_range;
+ SANE_Range paper_y_range;
+
+ /*enhancement group*/
+ SANE_Range brightness_range;
+ SANE_Range contrast_range;
+ SANE_Range threshold_range;
+
+ /*advanced group*/
+ SANE_String_Const compress_list[3];
+ SANE_Range compress_arg_range;
+ SANE_Range swdespeck_range;
+ SANE_String_Const do_color_list[8];
+
+ /*sensor group*/
+ SANE_Range counter_range;
+
+ /* --------------------------------------------------------------------- */
+ /* changeable vars to hold user input. modified by SANE_Options above */
+
+ /* the user's requested image params */
+ /* exposed in standard and geometry option groups */
+ struct img_params u;
+
+ /*enhancement group*/
+ int brightness;
+ int contrast;
+ int threshold;
+ int rif;
+
+ /*advanced group*/
+ int compress;
+ int compress_arg;
+ int df_length;
+ int df_thickness;
+ int dropout_color_f;
+ int dropout_color_b;
+ int buffermode;
+ int rollerdeskew;
+ int swdeskew;
+ int swdespeck;
+ int swcrop;
+ int stapledetect;
+
+ /* --------------------------------------------------------------------- */
+ /* values which are derived from setting the options above */
+ /* the user never directly modifies these */
+
+ /* the scanner image params (what we ask from scanner) */
+ struct img_params s;
+
+ /* the intermediate image params (like user, but possible higher depth) */
+ struct img_params i;
+
+ /* the brightness/contrast LUT for dumb scanners */
+ unsigned char lut[256];
+
+ /* --------------------------------------------------------------------- */
+ /* values which are set by calibration functions */
+ int c_res;
+ int c_mode;
+
+ int c_offset[2];
+ int c_gain[2];
+ int c_exposure[2][3];
+
+ int f_res;
+ int f_mode;
+
+ unsigned char * f_offset[2];
+ unsigned char * f_gain[2];
+
+ /* --------------------------------------------------------------------- */
+ /* values which are set by scanning functions to keep track of pages, etc */
+ int started;
+ int reading;
+ int cancelled;
+ int side;
+ int prev_page;
+ int jpeg_stage;
+ int jpeg_ff_offset;
+
+ unsigned char * buffers[2];
+
+ /* --------------------------------------------------------------------- */
+ /* values used by the command and data sending functions (scsi/usb) */
+ int fd; /* The scanner device file descriptor. */
+ size_t rs_info;
+
+ /* --------------------------------------------------------------------- */
+ /* values used to hold hardware or control panel status */
+
+ int panel_start;
+ int panel_stop;
+ int panel_butt3;
+ int panel_new_file;
+ int panel_count_only;
+ int panel_bypass_mode;
+ int panel_enable_led;
+ int panel_counter;
+
+ /* values which are used to track the frontend's access to sensors */
+ char hw_read[NUM_OPTIONS-OPT_START];
+};
+
+#define CONNECTION_SCSI 0 /* SCSI interface */
+#define CONNECTION_USB 1 /* USB interface */
+
+#define SIDE_FRONT 0
+#define SIDE_BACK 1
+
+#define CHAN_RED 0
+#define CHAN_GREEN 1
+#define CHAN_BLUE 2
+
+#define SOURCE_FLATBED 0
+#define SOURCE_ADF_FRONT 1
+#define SOURCE_ADF_BACK 2
+#define SOURCE_ADF_DUPLEX 3
+
+static const int dpi_list[] = {
+60,75,100,120,150,160,180,200,
+240,300,320,400,480,600,800,1200
+};
+
+#define DPI_60 0
+#define DPI_75 1
+#define DPI_100 2
+#define DPI_120 3
+#define DPI_150 4
+#define DPI_160 5
+#define DPI_180 6
+#define DPI_200 7
+#define DPI_240 8
+#define DPI_300 9
+#define DPI_320 10
+#define DPI_400 11
+#define DPI_480 12
+#define DPI_600 13
+#define DPI_800 14
+#define DPI_1200 15
+
+#define COMP_NONE WD_cmp_NONE
+#define COMP_JPEG WD_cmp_JPEG
+
+#define JPEG_STAGE_NONE 0
+#define JPEG_STAGE_SOF 1
+
+/* these are same as scsi data to make code easier */
+#define MODE_LINEART WD_comp_LA
+#define MODE_HALFTONE WD_comp_HT
+#define MODE_GRAYSCALE WD_comp_GS
+#define MODE_COLOR WD_comp_CG
+
+enum {
+ COLOR_NONE = 0,
+ COLOR_RED,
+ COLOR_GREEN,
+ COLOR_BLUE,
+ COLOR_EN_RED,
+ COLOR_EN_GREEN,
+ COLOR_EN_BLUE
+};
+
+/* these are same as scsi data to make code easier */
+#define COLOR_WHITE 1
+#define COLOR_BLACK 2
+
+#define GRAY_INTERLACE_NONE 0
+#define GRAY_INTERLACE_2510 1
+#define GRAY_INTERLACE_gG 2
+
+#define COLOR_INTERLACE_RGB 0
+#define COLOR_INTERLACE_BGR 1
+#define COLOR_INTERLACE_RRGGBB 2
+#define COLOR_INTERLACE_rRgGbB 3
+#define COLOR_INTERLACE_2510 4
+
+#define DUPLEX_INTERLACE_NONE 0
+#define DUPLEX_INTERLACE_FFBB 1
+#define DUPLEX_INTERLACE_FBFB 2
+#define DUPLEX_INTERLACE_2510 3
+
+#define JPEG_INTERLACE_ALT 0
+#define JPEG_INTERLACE_NONE 1
+
+#define CROP_RELATIVE 0
+#define CROP_ABSOLUTE 1
+
+/* ------------------------------------------------------------------------- */
+
+#define MM_PER_UNIT_UNFIX SANE_UNFIX(SANE_FIX(MM_PER_INCH / 1200.0))
+#define MM_PER_UNIT_FIX SANE_FIX(SANE_UNFIX(SANE_FIX(MM_PER_INCH / 1200.0)))
+
+#define SCANNER_UNIT_TO_FIXED_MM(number) SANE_FIX((number) * MM_PER_UNIT_UNFIX)
+#define FIXED_MM_TO_SCANNER_UNIT(number) SANE_UNFIX(number) / MM_PER_UNIT_UNFIX
+
+#define CANON_DR_CONFIG_FILE "canon_dr.conf"
+
+#ifndef PATH_MAX
+# define PATH_MAX 1024
+#endif
+
+/* ------------------------------------------------------------------------- */
+
+SANE_Status sane_init (SANE_Int * version_code, SANE_Auth_Callback authorize);
+
+SANE_Status sane_get_devices (const SANE_Device *** device_list,
+ SANE_Bool local_only);
+
+SANE_Status sane_open (SANE_String_Const name, SANE_Handle * handle);
+
+SANE_Status sane_set_io_mode (SANE_Handle h, SANE_Bool non_blocking);
+
+SANE_Status sane_get_select_fd (SANE_Handle h, SANE_Int * fdp);
+
+const SANE_Option_Descriptor * sane_get_option_descriptor (SANE_Handle handle,
+ SANE_Int option);
+
+SANE_Status sane_control_option (SANE_Handle handle, SANE_Int option,
+ SANE_Action action, void *val,
+ SANE_Int * info);
+
+SANE_Status sane_start (SANE_Handle handle);
+
+SANE_Status sane_get_parameters (SANE_Handle handle,
+ SANE_Parameters * params);
+
+SANE_Status sane_read (SANE_Handle handle, SANE_Byte * buf, SANE_Int max_len,
+ SANE_Int * len);
+
+void sane_cancel (SANE_Handle h);
+
+void sane_close (SANE_Handle h);
+
+void sane_exit (void);
+
+/* ------------------------------------------------------------------------- */
+
+static SANE_Status attach_one_scsi (const char *name);
+static SANE_Status attach_one_usb (const char *name);
+static SANE_Status attach_one (const char *devicename, int connType);
+
+static SANE_Status connect_fd (struct scanner *s);
+static SANE_Status disconnect_fd (struct scanner *s);
+
+static SANE_Status sense_handler (int scsi_fd, u_char * result, void *arg);
+
+static SANE_Status init_inquire (struct scanner *s);
+static SANE_Status init_vpd (struct scanner *s);
+static SANE_Status init_model (struct scanner *s);
+static SANE_Status init_panel (struct scanner *s);
+static SANE_Status init_user (struct scanner *s);
+static SANE_Status init_options (struct scanner *s);
+
+static SANE_Status
+do_cmd(struct scanner *s, int runRS, int shortTime,
+ unsigned char * cmdBuff, size_t cmdLen,
+ unsigned char * outBuff, size_t outLen,
+ unsigned char * inBuff, size_t * inLen
+);
+
+static SANE_Status
+do_scsi_cmd(struct scanner *s, int runRS, int shortTime,
+ unsigned char * cmdBuff, size_t cmdLen,
+ unsigned char * outBuff, size_t outLen,
+ unsigned char * inBuff, size_t * inLen
+);
+
+static SANE_Status
+do_usb_cmd(struct scanner *s, int runRS, int shortTime,
+ unsigned char * cmdBuff, size_t cmdLen,
+ unsigned char * outBuff, size_t outLen,
+ unsigned char * inBuff, size_t * inLen
+);
+
+static SANE_Status do_usb_clear(struct scanner *s, int clear, int runRS);
+
+static SANE_Status wait_scanner (struct scanner *s);
+
+static SANE_Status object_position (struct scanner *s, int i_load);
+
+static SANE_Status ssm_buffer (struct scanner *s);
+static SANE_Status ssm_do (struct scanner *s);
+static SANE_Status ssm_df (struct scanner *s);
+
+static int get_page_width (struct scanner *s);
+static int get_page_height (struct scanner *s);
+
+static SANE_Status set_window (struct scanner *s);
+static SANE_Status update_params (struct scanner *s, int calib);
+static SANE_Status update_i_params (struct scanner *s);
+static SANE_Status clean_params (struct scanner *s);
+
+static SANE_Status read_panel(struct scanner *s, SANE_Int option);
+static SANE_Status send_panel(struct scanner *s);
+
+static SANE_Status start_scan (struct scanner *s, int type);
+
+static SANE_Status check_for_cancel(struct scanner *s);
+
+static SANE_Status read_from_scanner(struct scanner *s, int side, int exact);
+static SANE_Status read_from_scanner_duplex(struct scanner *s, int exact);
+
+static SANE_Status copy_simplex(struct scanner *s, unsigned char * buf, int len, int side);
+static SANE_Status copy_duplex(struct scanner *s, unsigned char * buf, int len);
+static SANE_Status copy_line(struct scanner *s, unsigned char * buf, int side);
+
+static SANE_Status buffer_despeck(struct scanner *s, int side);
+static SANE_Status buffer_deskew(struct scanner *s, int side);
+static SANE_Status buffer_crop(struct scanner *s, int side);
+
+int * getTransitionsY (struct scanner *s, int side, int top);
+int * getTransitionsX (struct scanner *s, int side, int top);
+
+SANE_Status getEdgeIterate (int width, int height, int resolution,
+ int * buff, double * finSlope, int * finXInter, int * finYInter);
+
+SANE_Status getEdgeSlope (int width, int height, int * top, int * bot,
+ double slope, int * finXInter, int * finYInter);
+
+SANE_Status rotateOnCenter (struct scanner *s, int side,
+ int centerX, int centerY, double slope);
+
+static SANE_Status getLine (int height, int width, int * buff,
+ int slopes, double minSlope, double maxSlope,
+ int offsets, int minOffset, int maxOffset,
+ double * finSlope, int * finOffset, int * finDensity);
+
+static SANE_Status load_lut (unsigned char * lut, int in_bits, int out_bits,
+ int out_min, int out_max, int slope, int offset);
+
+static SANE_Status read_from_buffer(struct scanner *s, SANE_Byte * buf, SANE_Int max_len, SANE_Int * len, int side);
+
+static SANE_Status image_buffers (struct scanner *s, int setup);
+static SANE_Status offset_buffers (struct scanner *s, int setup);
+static SANE_Status gain_buffers (struct scanner *s, int setup);
+
+static SANE_Status calibrate_AFE(struct scanner *s);
+static SANE_Status calibrate_fine(struct scanner *s);
+static SANE_Status calibrate_fine_buffer(struct scanner *s);
+
+static SANE_Status write_AFE (struct scanner *s);
+static SANE_Status calibration_scan (struct scanner *s, int);
+
+static void hexdump (int level, char *comment, unsigned char *p, int l);
+static void default_globals (void);
+
+static size_t maxStringSize (const SANE_String_Const strings[]);
+
+#endif /* CANON_DR_H */