kopia lustrzana https://gitlab.com/sane-project/backends
				
				
				
			
		
			
				
	
	
		
			352 wiersze
		
	
	
		
			16 KiB
		
	
	
	
		
			C
		
	
	
			
		
		
	
	
			352 wiersze
		
	
	
		
			16 KiB
		
	
	
	
		
			C
		
	
	
/* sane - Scanner Access Now Easy.
 | 
						|
 | 
						|
   pieusb_specific.h
 | 
						|
 | 
						|
   Copyright (C) 2012-2015 Jan Vleeshouwers, Michael Rickmann, Klaus Kaempf
 | 
						|
 | 
						|
   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 PIEUSB_SPECIFIC_H
 | 
						|
#define	PIEUSB_SPECIFIC_H
 | 
						|
 | 
						|
#include "../include/sane/sanei_ir.h"
 | 
						|
#include "../include/sane/sanei_backend.h"
 | 
						|
#include "pieusb_scancmd.h"
 | 
						|
#include "pieusb_buffer.h"
 | 
						|
 | 
						|
/* Settings for scan modes available to SANE */
 | 
						|
/* In addition to those defined in sane.h */
 | 
						|
#define SANE_VALUE_SCAN_MODE_RGBI    "RGBI"
 | 
						|
 | 
						|
/* Scanner settings for colors to scan */
 | 
						|
#define SCAN_ONE_PASS_RGBI           0x90
 | 
						|
#define SCAN_ONE_PASS_COLOR          0x80
 | 
						|
#define SCAN_FILTER_INFRARED         0x10
 | 
						|
#define SCAN_FILTER_BLUE             0x08
 | 
						|
#define SCAN_FILTER_GREEN            0x04
 | 
						|
#define SCAN_FILTER_RED              0x02
 | 
						|
#define SCAN_FILTER_NEUTRAL          0x01
 | 
						|
 | 
						|
/* Settings for color depth of scan */
 | 
						|
#define SCAN_COLOR_DEPTH_16          0x20
 | 
						|
#define SCAN_COLOR_DEPTH_12          0x10
 | 
						|
#define SCAN_COLOR_DEPTH_10          0x08
 | 
						|
#define SCAN_COLOR_DEPTH_8           0x04
 | 
						|
#define SCAN_COLOR_DEPTH_4           0x02
 | 
						|
#define SCAN_COLOR_DEPTH_1           0x01
 | 
						|
 | 
						|
/* Settings for format of the scanned data */
 | 
						|
#define SCAN_COLOR_FORMAT_INDEX      0x04
 | 
						|
#define SCAN_COLOR_FORMAT_LINE       0x02
 | 
						|
#define SCAN_COLOR_FORMAT_PIXEL      0x01
 | 
						|
 | 
						|
/* Settings for calibration mode */
 | 
						|
#define SCAN_CALIBRATION_DEFAULT     "default values"
 | 
						|
#define SCAN_CALIBRATION_AUTO        "from internal test"
 | 
						|
#define SCAN_CALIBRATION_PREVIEW     "from preview"
 | 
						|
#define SCAN_CALIBRATION_OPTIONS     "from options"
 | 
						|
 | 
						|
/* Settings for additional gain */
 | 
						|
#define SCAN_GAIN_ADJUST_03 "* 0.3"
 | 
						|
#define SCAN_GAIN_ADJUST_05 "* 0.5"
 | 
						|
#define SCAN_GAIN_ADJUST_08 "* 0.8"
 | 
						|
#define SCAN_GAIN_ADJUST_10 "* 1.0"
 | 
						|
#define SCAN_GAIN_ADJUST_12 "* 1.2"
 | 
						|
#define SCAN_GAIN_ADJUST_16 "* 1.6"
 | 
						|
#define SCAN_GAIN_ADJUST_19 "* 1.9"
 | 
						|
#define SCAN_GAIN_ADJUST_24 "* 2.4"
 | 
						|
#define SCAN_GAIN_ADJUST_30 "* 3.0"
 | 
						|
 | 
						|
/* Post-processing */
 | 
						|
#define POST_SW_COLORS          (1 << 0)        /* gain, negatives, ..., can be done at any time */
 | 
						|
#define POST_SW_IRED            (1 << 1)        /* remove spectral overlap, needs complete scan */
 | 
						|
#define POST_SW_DIRT            (1 << 2)        /* our digital lavabo, needs complete scan */
 | 
						|
#define POST_SW_GRAIN           (1 << 3)        /* smoothen a bit */
 | 
						|
#define POST_SW_CROP            (1 << 4)        /* trim whole image in sane_start
 | 
						|
                                                   before sane_get_parameters() is answered */
 | 
						|
#define POST_SW_IRED_MASK       (POST_SW_IRED | POST_SW_DIRT)
 | 
						|
#define POST_SW_ACCUM_MASK      (POST_SW_IRED_MASK | POST_SW_GRAIN | POST_SW_CROP)
 | 
						|
 | 
						|
#define DEFAULT_GAIN                    19   /* 0x13 */
 | 
						|
#define DEFAULT_EXPOSURE                2937 /* 0xb79 minimum value, see Pieusb_Settings */
 | 
						|
#define DEFAULT_OFFSET                  0
 | 
						|
#define DEFAULT_LIGHT                   4
 | 
						|
#define DEFAULT_ADDITIONAL_ENTRIES      1
 | 
						|
#define DEFAULT_DOUBLE_TIMES            0
 | 
						|
 | 
						|
/* --------------------------------------------------------------------------
 | 
						|
 *
 | 
						|
 * DEVICE DEFINITION STRUCTURES
 | 
						|
 *
 | 
						|
 * --------------------------------------------------------------------------*/
 | 
						|
 | 
						|
/* Options supported by the scanner */
 | 
						|
 | 
						|
enum Pieusb_Option
 | 
						|
{
 | 
						|
    OPT_NUM_OPTS = 0,
 | 
						|
    /* ------------------------------------------- */
 | 
						|
    OPT_MODE_GROUP,
 | 
						|
    OPT_MODE,                   /* scan mode */
 | 
						|
    OPT_BIT_DEPTH,              /* number of bits to encode a color */
 | 
						|
    OPT_RESOLUTION,             /* number of pixels per inch */
 | 
						|
    OPT_HALFTONE_PATTERN,       /* halftone pattern to use (see halftone_list) */
 | 
						|
    OPT_THRESHOLD,              /* halftone threshold */
 | 
						|
    OPT_SHARPEN,                /* create a sharper scan at the cost of scan time */
 | 
						|
    OPT_SHADING_ANALYSIS,       /* do shading analysis before the scan */
 | 
						|
    OPT_FAST_INFRARED,          /* scan infrared channel faster but less accurate */
 | 
						|
    OPT_ADVANCE_SLIDE,          /* auto-advance slide after scan */
 | 
						|
    OPT_CALIBRATION_MODE,       /* use auto-calibarion settings for scan */
 | 
						|
    /* ------------------------------------------- */
 | 
						|
    OPT_GEOMETRY_GROUP,
 | 
						|
    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_ENHANCEMENT_GROUP,
 | 
						|
    OPT_CORRECT_SHADING,        /* correct scanned data for lamp variations (shading) */
 | 
						|
    OPT_CORRECT_INFRARED,       /* correct infrared for red crosstalk */
 | 
						|
    OPT_CLEAN_IMAGE,            /* detect and remove dust and scratch artifacts */
 | 
						|
    OPT_GAIN_ADJUST,            /* adjust gain (a simpler option than setting gain, exposure and offset directly) */
 | 
						|
    OPT_CROP_IMAGE,             /* automatically crop image */
 | 
						|
    OPT_SMOOTH_IMAGE,           /* smoothen image */
 | 
						|
    OPT_TRANSFORM_TO_SRGB,      /* transform to approximate sRGB data */
 | 
						|
    OPT_INVERT_IMAGE,           /* transform negative to positive */
 | 
						|
    /* ------------------------------------------- */
 | 
						|
    OPT_ADVANCED_GROUP,
 | 
						|
    OPT_PREVIEW,                /* scan a preview before the actual scan */
 | 
						|
    OPT_SAVE_SHADINGDATA,       /* output shading data */
 | 
						|
    OPT_SAVE_CCDMASK,           /* output CCD mask */
 | 
						|
    OPT_LIGHT,
 | 
						|
    OPT_DOUBLE_TIMES,
 | 
						|
    OPT_SET_EXPOSURE_R,           /* exposure times for R */
 | 
						|
    OPT_SET_EXPOSURE_G,           /* exposure times for G */
 | 
						|
    OPT_SET_EXPOSURE_B,           /* exposure times for B */
 | 
						|
    OPT_SET_EXPOSURE_I,           /* exposure times for I */
 | 
						|
    OPT_SET_GAIN_R,               /* gain for R */
 | 
						|
    OPT_SET_GAIN_G,               /* gain for G */
 | 
						|
    OPT_SET_GAIN_B,               /* gain for B */
 | 
						|
    OPT_SET_GAIN_I,               /* gain for I */
 | 
						|
    OPT_SET_OFFSET_R,             /* offset for R */
 | 
						|
    OPT_SET_OFFSET_G,             /* offset for G */
 | 
						|
    OPT_SET_OFFSET_B,             /* offset for B */
 | 
						|
    OPT_SET_OFFSET_I,             /* offset for I */
 | 
						|
    /* must come last: */
 | 
						|
    NUM_OPTIONS
 | 
						|
};
 | 
						|
 | 
						|
/* Forward declaration (see pieusb_scancmd.h) */
 | 
						|
struct Pieusb_Shading_Parameters;
 | 
						|
 | 
						|
/* Device characteristics of a Pieusb USB scanner */
 | 
						|
struct Pieusb_Device_Definition
 | 
						|
{
 | 
						|
    struct Pieusb_Device_Definition *next;
 | 
						|
 | 
						|
    SANE_Device sane;
 | 
						|
      /* name = string like "libusb:001:006" == NO! this should be "CrystalScan 7200" or "ProScan 7200"...
 | 
						|
       * vendor = "PIE/Pieusb"
 | 
						|
       * model = "CrystalScan 7200" or "ProScan 7200"
 | 
						|
       * type = "film scanner" */
 | 
						|
    /* char *devicename; => sane->name */
 | 
						|
    /* char *vendor; => sane->vendor */
 | 
						|
    /* char *product; => sane->model */
 | 
						|
    SANE_Word vendorId;
 | 
						|
    SANE_Word productId;
 | 
						|
      /* USB id's like 0x05e3 0x0145, see pieusb.conf */
 | 
						|
    SANE_String version; /* INQUIRY productRevision */
 | 
						|
    SANE_Byte model; /* INQUIRY model */
 | 
						|
    SANE_Byte flags; /* pieusb.conf flags */
 | 
						|
 | 
						|
    /* Ranges for various quantities */
 | 
						|
    SANE_Range dpi_range;
 | 
						|
    SANE_Range x_range;
 | 
						|
    SANE_Range y_range;
 | 
						|
    SANE_Range exposure_range; /* Unit is a 8051 machine cycle, which is approximately 1 us. (Exactly: 12 cycles at 11.059 Mhz = 1.085 us.) */
 | 
						|
    SANE_Range dust_range;
 | 
						|
 | 
						|
    SANE_Range shadow_range;
 | 
						|
    SANE_Range highlight_range;
 | 
						|
 | 
						|
    /* Enumerated ranges vor various quantities */
 | 
						|
    SANE_String scan_mode_list[7]; /* names of scan modes (see saneopts.h) */
 | 
						|
    SANE_String calibration_mode_list[6]; /* names of calibration modes */
 | 
						|
    SANE_String gain_adjust_list[10]; /* gain adjustment values */
 | 
						|
    SANE_Word bpp_list[5];	   /* bit depths  */
 | 
						|
    SANE_String halftone_list[17]; /* names of the halftone patterns from the scanner */
 | 
						|
    SANE_String speed_list[9];	   /* names of available speeds */
 | 
						|
    SANE_String ir_sw_list[4];
 | 
						|
    SANE_String crop_sw_list[4];
 | 
						|
    SANE_Word grain_sw_list[6];
 | 
						|
 | 
						|
    /* Maximum resolution values */
 | 
						|
    int maximum_resolution_x;	   /* maximum x-resolution */
 | 
						|
    int maximum_resolution_y;	   /* maximum y-resolution */
 | 
						|
    int maximum_resolution;
 | 
						|
 | 
						|
    /* Geometry */
 | 
						|
    double scan_bed_width;	   /* flatbed width in inches (horizontal) */
 | 
						|
    double scan_bed_height;	   /* flatbed height in inches (vertical) */
 | 
						|
    int slide_top_left_x;          /* top-left location of slide w.r.t. scan bed */
 | 
						|
    int slide_top_left_y;          /* top-left location of slide w.r.t. scan bed */
 | 
						|
    double slide_width;	           /* transparency width in inches */
 | 
						|
    double slide_height;           /* transparency length in inches */
 | 
						|
 | 
						|
    /* Integer and bit-encoded properties */
 | 
						|
    int halftone_patterns;	   /* number of halftones supported */
 | 
						|
    int color_filters;	           /* available colour filters: Infrared-0-0-OnePassColor-B-G-R-N */
 | 
						|
    int color_depths;	           /* available colour depths: 0-0-16-12-10-8-4-1 */
 | 
						|
    int color_formats;	           /* colour data format: 0-0-0-0-0-Index-Line-Pixel */
 | 
						|
    int image_formats;	           /* image data format: 0-0-0-0-OKLine-BlkOne-Motorola-Intel */
 | 
						|
    int scan_capabilities;         /* additional scanner features, number of speeds: PowerSave-ExtCal-0-FastPreview-DisableCal-[CalSpeeds=3] */
 | 
						|
    int optional_devices;          /* optional devices: MultiPageLoad-?-?-0-0-TransModule1-TransModule-AutoDocFeeder */
 | 
						|
    int enhancements;	           /* enhancements: unknown coding */
 | 
						|
    int gamma_bits;	           /* no of bits used for gamma table */
 | 
						|
    int fast_preview_resolution;   /* fast preview resolution */
 | 
						|
    int minimum_highlight;	   /* min highlight % that can be used */
 | 
						|
    int maximum_shadow;  	   /* max shadow % that can be used */
 | 
						|
    int calibration_equation;      /* which calibration equation to use */
 | 
						|
    int minimum_exposure;	   /* min exposure */
 | 
						|
    int maximum_exposure;	   /* max exposure */
 | 
						|
 | 
						|
    struct Pieusb_Shading_Parameters_Info shading_parameters[4]; /* array with shading data parameters */
 | 
						|
 | 
						|
    int x0, y0, x1, y1;
 | 
						|
    SANE_String production;
 | 
						|
    SANE_String timestamp;
 | 
						|
    SANE_String signature;
 | 
						|
};
 | 
						|
 | 
						|
typedef struct Pieusb_Device_Definition Pieusb_Device_Definition;
 | 
						|
 | 
						|
/* --------------------------------------------------------------------------
 | 
						|
 *
 | 
						|
 * CURRENTLY ACTIVE DEVICES
 | 
						|
 *
 | 
						|
 * --------------------------------------------------------------------------*/
 | 
						|
 | 
						|
/* This structure holds information about an instance of an active scanner */
 | 
						|
 | 
						|
struct Pieusb_Scanner
 | 
						|
{
 | 
						|
    struct Pieusb_Scanner *next;
 | 
						|
    struct Pieusb_Device_Definition *device; /* pointer to device definition */
 | 
						|
 | 
						|
    int device_number; /* scanner device number (as determined by USB) */
 | 
						|
 | 
						|
    /* SANE option descriptions and settings for this scanner instance */
 | 
						|
    SANE_Option_Descriptor opt[NUM_OPTIONS];
 | 
						|
    Option_Value val[NUM_OPTIONS];
 | 
						|
 | 
						|
    /* Scan state */
 | 
						|
    struct Pieusb_Scanner_State state;
 | 
						|
    SANE_Int scanning; /* true if busy scanning */
 | 
						|
    SANE_Int cancel_request; /* if true, scanner should terminate a scan */
 | 
						|
 | 
						|
    /* Scan settings */
 | 
						|
    struct Pieusb_Mode mode;
 | 
						|
    struct Pieusb_Settings settings;
 | 
						|
    struct Pieusb_Scan_Frame frame;
 | 
						|
    SANE_Parameters scan_parameters;
 | 
						|
 | 
						|
    /* Shading data and CCD-mask */
 | 
						|
#define PIEUSB_CCD_MASK_SIZE 0x1a1d  /* pieusb 5340; */ /* cyberview: 6685 0x1a1d */
 | 
						|
    SANE_Byte *ccd_mask; /* malloc'ed in sane_open */
 | 
						|
    SANE_Int ccd_mask_size;
 | 
						|
    SANE_Bool shading_data_present; /* don't correct shading if not present */
 | 
						|
    SANE_Int shading_mean[SHADING_PARAMETERS_INFO_COUNT]; /* mean shading value for each color (average all 45 lines)  */
 | 
						|
    SANE_Int shading_max[SHADING_PARAMETERS_INFO_COUNT]; /* maximum shading value for each color (for all 45 lines)  */
 | 
						|
    SANE_Int* shading_ref[SHADING_PARAMETERS_INFO_COUNT]; /* 4 arrays of shading references for each pixel on a line and for each color */
 | 
						|
 | 
						|
    /* Calibration using preview */
 | 
						|
 | 
						|
    SANE_Bool preview_done;
 | 
						|
    SANE_Int preview_exposure[4];    /* exposure values used in preview */
 | 
						|
    SANE_Int preview_gain[4];        /* gain values used in preview */
 | 
						|
    SANE_Int preview_offset[4];      /* offset values used in preview */
 | 
						|
    SANE_Int preview_lower_bound[4]; /* lowest RGBI values in preview */
 | 
						|
    SANE_Int preview_upper_bound[4]; /* highest RGBI values in preview */
 | 
						|
 | 
						|
    /* Post processing options */
 | 
						|
/*
 | 
						|
    SANE_Int processing;
 | 
						|
*/
 | 
						|
    double *ln_lut; /* logarithmic lookup table */
 | 
						|
 | 
						|
    /* Reading buffer */
 | 
						|
    struct Pieusb_Read_Buffer buffer;
 | 
						|
};
 | 
						|
 | 
						|
typedef struct Pieusb_Scanner Pieusb_Scanner;
 | 
						|
 | 
						|
SANE_Status sanei_pieusb_parse_config_line(const char* config_line,
 | 
						|
                                           SANE_Word* vendor_id,
 | 
						|
                                           SANE_Word* product_id,
 | 
						|
                                           SANE_Int* model_number,
 | 
						|
                                           SANE_Int* flags);
 | 
						|
/* sub to sane_start() */
 | 
						|
SANE_Status sanei_pieusb_post (Pieusb_Scanner *scanner,  uint16_t **in_img, int planes);
 | 
						|
void sanei_pieusb_correct_shading(struct Pieusb_Scanner *scanner, struct Pieusb_Read_Buffer *buffer);
 | 
						|
SANE_Status sanei_pieusb_get_scan_data(Pieusb_Scanner * scanner, SANE_Int parameter_bytes);
 | 
						|
SANE_Status sanei_pieusb_get_parameters(Pieusb_Scanner * scanner, SANE_Int *parameter_bytes);
 | 
						|
SANE_Status sanei_pieusb_get_ccd_mask(Pieusb_Scanner * scanner);
 | 
						|
SANE_Status sanei_pieusb_get_shading_data(Pieusb_Scanner * scanner);
 | 
						|
SANE_Status sanei_pieusb_set_mode_from_options(Pieusb_Scanner * scanner);
 | 
						|
SANE_Status sanei_pieusb_set_gain_offset(Pieusb_Scanner * scanner, const char* calibration_mode);
 | 
						|
SANE_Status sanei_pieusb_set_frame_from_options(Pieusb_Scanner * scanner);
 | 
						|
void sanei_pieusb_print_options(struct Pieusb_Scanner *scanner);
 | 
						|
/* sub to sane_control_option() and sane_start() */
 | 
						|
int sanei_pieusb_analyse_options(struct Pieusb_Scanner *scanner);
 | 
						|
SANE_Bool sanei_pieusb_supported_device_list_contains(SANE_Word vendor_id, SANE_Word product_id, SANE_Int model_number, SANE_Int flags);
 | 
						|
SANE_Status sanei_pieusb_supported_device_list_add(SANE_Word vendor_id, SANE_Word product_id, SANE_Int model_number, SANE_Int flags);
 | 
						|
/* sub to sane_init() and sane_open() */
 | 
						|
SANE_Status sanei_pieusb_find_device_callback (const char *devicename);
 | 
						|
/* sub to sane_open() */
 | 
						|
SANE_Status sanei_pieusb_init_options (Pieusb_Scanner * scanner);
 | 
						|
/* sub to sane_start(), sane_read() and sane_close() */
 | 
						|
SANE_Status sanei_pieusb_on_cancel (Pieusb_Scanner * scanner);
 | 
						|
 | 
						|
SANE_Status sanei_pieusb_wait_ready(Pieusb_Scanner *scanner, SANE_Int device_number);
 | 
						|
SANE_Status sanei_pieusb_analyze_preview(Pieusb_Scanner * scanner);
 | 
						|
 | 
						|
 | 
						|
 | 
						|
#endif	/* PIEUSB_SPECIFIC_H */
 |