diff options
Diffstat (limited to 'backend/gt68xx_high.h')
-rw-r--r-- | backend/gt68xx_high.h | 374 |
1 files changed, 374 insertions, 0 deletions
diff --git a/backend/gt68xx_high.h b/backend/gt68xx_high.h new file mode 100644 index 0000000..d830e96 --- /dev/null +++ b/backend/gt68xx_high.h @@ -0,0 +1,374 @@ +/* sane - Scanner Access Now Easy. + + Copyright (C) 2002 Sergey Vlasov <vsu@altlinux.ru> + Copyright (C) 2002-2007 Henning Geinitz <sane@geinitz.org> + + 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 GT68XX_HIGH_H +#define GT68XX_HIGH_H + +#include "gt68xx_mid.h" + +typedef struct GT68xx_Calibrator GT68xx_Calibrator; +typedef struct GT68xx_Calibration GT68xx_Calibration; +typedef struct GT68xx_Scanner GT68xx_Scanner; + +/** Calibration data for one channel. + */ +struct GT68xx_Calibrator +{ + unsigned int *k_white; /**< White point vector */ + unsigned int *k_black; /**< Black point vector */ + + double *white_line; /**< White average */ + double *black_line; /**< Black average */ + + SANE_Int width; /**< Image width */ + SANE_Int white_level; /**< Desired white level */ + + SANE_Int white_count; /**< Number of white lines scanned */ + SANE_Int black_count; /**< Number of black lines scanned */ + +#ifdef TUNE_CALIBRATOR + SANE_Int min_clip_count; /**< Count of too low values */ + SANE_Int max_clip_count; /**< Count of too high values */ +#endif /* TUNE_CALIBRATOR */ +}; + + +/** Calibration data for a given resolution + */ +struct GT68xx_Calibration +{ + SANE_Int dpi; /**< optical horizontal dpi used to + build the calibration data */ + SANE_Int pixel_x0; /**< x start position used at calibration time */ + + GT68xx_Calibrator *gray; /**< Calibrator for grayscale data */ + GT68xx_Calibrator *red; /**< Calibrator for the red channel */ + GT68xx_Calibrator *green; /**< Calibrator for the green channel */ + GT68xx_Calibrator *blue; /**< Calibrator for the blue channel */ +}; + +/** Create a new calibrator for one (color or mono) channel. + * + * @param width Image width in pixels. + * @param white_level Desired white level (65535 max). + * @param cal_return Returned pointer to the created calibrator object. + * + * @return + * - SANE_STATUS_GOOD - the calibrator object was created. + * - SANE_STATUS_INVAL - invalid parameters. + * - SANE_STATUS_NO_MEM - not enough memory to create the object. + */ +static SANE_Status +gt68xx_calibrator_new (SANE_Int width, + SANE_Int white_level, GT68xx_Calibrator ** cal_return); + +/** Destroy the channel calibrator object. + * + * @param cal Calibrator object. + */ +static SANE_Status gt68xx_calibrator_free (GT68xx_Calibrator * cal); + +/** Add a white calibration line to the calibrator. + * + * This function should be called after scanning each white calibration line. + * The line width must be equal to the value passed to gt68xx_calibrator_new(). + * + * @param cal Calibrator object. + * @param line Pointer to the line data. + * + * @return + * - #SANE_STATUS_GOOD - the line data was processed successfully. + */ +static SANE_Status +gt68xx_calibrator_add_white_line (GT68xx_Calibrator * cal, + unsigned int *line); + +/** Calculate the white point for the calibrator. + * + * This function should be called when all white calibration lines have been + * scanned. After doing this, gt68xx_calibrator_add_white_line() should not be + * called again for this calibrator. + * + * @param cal Calibrator object. + * @param factor White point correction factor. + * + * @return + * - #SANE_STATUS_GOOD - the white point was calculated successfully. + */ +static SANE_Status +gt68xx_calibrator_eval_white (GT68xx_Calibrator * cal, double factor); + +/** Add a black calibration line to the calibrator. + * + * This function should be called after scanning each black calibration line. + * The line width must be equal to the value passed to gt68xx_calibrator_new(). + * + * @param cal Calibrator object. + * @param line Pointer to the line data. + * + * @return + * - #SANE_STATUS_GOOD - the line data was processed successfully. + */ +static SANE_Status +gt68xx_calibrator_add_black_line (GT68xx_Calibrator * cal, + unsigned int *line); + +/** Calculate the black point for the calibrator. + * + * This function should be called when all black calibration lines have been + * scanned. After doing this, gt68xx_calibrator_add_black_line() should not be + * called again for this calibrator. + * + * @param cal Calibrator object. + * @param factor Black point correction factor. + * + * @return + * - #SANE_STATUS_GOOD - the white point was calculated successfully. + */ +static SANE_Status +gt68xx_calibrator_eval_black (GT68xx_Calibrator * cal, double factor); + +/** Finish the calibrator setup and prepare for real scanning. + * + * This function must be called after gt68xx_calibrator_eval_white() and + * gt68xx_calibrator_eval_black(). + * + * @param cal Calibrator object. + * + * @return + * - #SANE_STATUS_GOOD - the calibrator setup completed successfully. + */ +static SANE_Status gt68xx_calibrator_finish_setup (GT68xx_Calibrator * cal); + +/** Process the image line through the calibrator. + * + * This function must be called only after gt68xx_calibrator_finish_setup(). + * The image line is modified in place. + * + * @param cal Calibrator object. + * @param line Pointer to the image line data. + * + * @return + * - #SANE_STATUS_GOOD - the image line was processed successfully. + */ +static SANE_Status +gt68xx_calibrator_process_line (GT68xx_Calibrator * cal, unsigned int *line); + +/** List of SANE options + */ +enum GT68xx_Option +{ + OPT_NUM_OPTS = 0, + + OPT_MODE_GROUP, + OPT_MODE, + OPT_GRAY_MODE_COLOR, + OPT_SOURCE, + OPT_PREVIEW, + OPT_BIT_DEPTH, + OPT_RESOLUTION, + OPT_LAMP_OFF_AT_EXIT, + OPT_BACKTRACK, + + OPT_DEBUG_GROUP, + OPT_AUTO_WARMUP, + OPT_FULL_SCAN, + OPT_COARSE_CAL, + OPT_COARSE_CAL_ONCE, + OPT_QUALITY_CAL, + OPT_BACKTRACK_LINES, + + OPT_ENHANCEMENT_GROUP, + OPT_GAMMA_VALUE, + OPT_THRESHOLD, + + 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_SENSOR_GROUP, + OPT_NEED_CALIBRATION_SW, /* signals calibration is needed */ + OPT_PAGE_LOADED_SW, /* signals that a document is inserted in feeder */ + + OPT_BUTTON_GROUP, + OPT_CALIBRATE, /* button option to trigger call + to sheetfed calibration */ + OPT_CLEAR_CALIBRATION, /* clear calibration */ + + /* must come last: */ + NUM_OPTIONS +}; + +/** Scanner object. + */ +struct GT68xx_Scanner +{ + struct GT68xx_Scanner *next; /**< Next scanner in list */ + GT68xx_Device *dev; /**< Low-level device object */ + + GT68xx_Line_Reader *reader; /**< Line reader object */ + + GT68xx_Calibrator *cal_gray; /**< Calibrator for grayscale data */ + GT68xx_Calibrator *cal_r; /**< Calibrator for the red channel */ + GT68xx_Calibrator *cal_g; /**< Calibrator for the green channel */ + GT68xx_Calibrator *cal_b; /**< Calibrator for the blue channel */ + + /* SANE data */ + SANE_Bool scanning; /**< We are currently scanning */ + SANE_Option_Descriptor opt[NUM_OPTIONS]; /**< Option descriptors */ + Option_Value val[NUM_OPTIONS]; /**< Option values */ + SANE_Parameters params; /**< SANE Parameters */ + SANE_Int line; /**< Current line */ + SANE_Int total_bytes; /**< Bytes already transmitted */ + SANE_Int byte_count; /**< Bytes transmitted in this line */ + SANE_Bool calib; /**< Apply calibration data */ + SANE_Bool auto_afe; /**< Use automatic gain/offset */ + SANE_Bool first_scan; /**< Is this the first scan? */ + struct timeval lamp_on_time; /**< Time when the lamp was turned on */ + struct timeval start_time; /**< Time when the scan was started */ + SANE_Int bpp_list[5]; /**< */ + SANE_Int *gamma_table; /**< Gray gamma table */ +#ifdef DEBUG_BRIGHTNESS + SANE_Int average_white; /**< For debugging brightness problems */ + SANE_Int max_white; + SANE_Int min_black; +#endif + + /** SANE_TRUE when the scanner has been calibrated */ + SANE_Bool calibrated; + + /** per horizontal resolution calibration data */ + GT68xx_Calibration calibrations[MAX_RESOLUTIONS]; + + /* AFE and exposure settings */ + GT68xx_AFE_Parameters afe_params; + GT68xx_Exposure_Parameters exposure_params; +}; + + +/** Create a new scanner object. + * + * @param dev Low-level device object. + * @param scanner_return Returned pointer to the created scanner object. + */ +static SANE_Status +gt68xx_scanner_new (GT68xx_Device * dev, GT68xx_Scanner ** scanner_return); + +/** Destroy the scanner object. + * + * The low-level device object is not destroyed. + * + * @param scanner Scanner object. + */ +static SANE_Status gt68xx_scanner_free (GT68xx_Scanner * scanner); + +/** Calibrate the scanner before the main scan. + * + * @param scanner Scanner object. + * @param request Scan request data. + * @param use_autogain Enable automatic offset/gain control + */ +static SANE_Status +gt68xx_scanner_calibrate (GT68xx_Scanner * scanner, + GT68xx_Scan_Request * request); + +/** Start scanning the image. + * + * This function does not perform calibration - it needs to be performed before + * by calling gt68xx_scanner_calibrate(). + * + * @param scanner Scanner object. + * @param request Scan request data. + * @param params Returned scan parameters (calculated from the request). + */ +static SANE_Status +gt68xx_scanner_start_scan (GT68xx_Scanner * scanner, + GT68xx_Scan_Request * request, + GT68xx_Scan_Parameters * params); + +/** Read one image line from the scanner. + * + * This function can be called only during the scan - after calling + * gt68xx_scanner_start_scan() and before calling gt68xx_scanner_stop_scan(). + * + * @param scanner Scanner object. + * @param buffer_pointers Array of pointers to the image lines. + */ +static SANE_Status +gt68xx_scanner_read_line (GT68xx_Scanner * scanner, + unsigned int **buffer_pointers); + +/** Stop scanning the image. + * + * This function must be called to finish the scan started by + * gt68xx_scanner_start_scan(). It may be called before all lines are read to + * cancel the scan prematurely. + * + * @param scanner Scanner object. + */ +static SANE_Status gt68xx_scanner_stop_scan (GT68xx_Scanner * scanner); + +/** Save calibration data to file + * + * This function stores in memory calibration data created at calibration + * time into file + * @param scanner Scanner object. + * @return SANE_STATUS_GOOD when succesfull + */ +static SANE_Status gt68xx_write_calibration (GT68xx_Scanner * scanner); + +/** Read calibration data from file + * + * This function sets in memory calibration data from data saved into file. + * + * @param scanner Scanner object. + * @return SANE_STATUS_GOOD when succesfull + */ +static SANE_Status gt68xx_read_calibration (GT68xx_Scanner * scanner); + +#endif /* not GT68XX_HIGH_H */ + +/* vim: set sw=2 cino=>2se-1sn-1s{s^-1st0(0u0 smarttab expandtab: */ |