diff --git a/code/base/base.h b/code/base/base.h
index 73d7123..b7f7c0e 100644
--- a/code/base/base.h
+++ b/code/base/base.h
@@ -1,5 +1,6 @@
#pragma once
+#include "sane/sane_ex.h"
class ref
{
@@ -82,16 +83,12 @@ public:
};
virtual void test_callback(const wchar_t* name/*test name*/, test_event ev, void* data, size_t flag) = 0;
+ // register/unregister sane callback, the sane_callback in UI module should dispatch the events to these registered callback
+ virtual int register_sane_callback(sane_callback cb, void* param) = 0;
+ virtual int unregister_sane_callback(sane_callback cb) = 0;
+
// All IO operations are blocking
- enum usb_io_type
- {
- USB_IO_BULK_READ = 0,
- USB_IO_BULK_WRITE,
- USB_IO_INTERRUPT_READ,
- USB_IO_INTERRUPT_WRITE,
- };
- virtual int io_bulk_int(usb_io_type type, void* buf, size_t* len/*[in]-size of buf, [out]-data bytes in buf*/) = 0;
- virtual int io_control(int type, int req, int val, int ind, void* buf, size_t* len/*[in]-in data sizef, [out]-transferred bytes*/) = 0;
+ virtual int io_control(unsigned long code, void* data, unsigned* len) = 0;
};
#ifdef TEST_DLL
diff --git a/code/base/sane/sane.h b/code/base/sane/sane.h
new file mode 100644
index 0000000..6551c72
--- /dev/null
+++ b/code/base/sane/sane.h
@@ -0,0 +1,248 @@
+/* sane - Scanner Access Now Easy.
+ Copyright (C) 1997-1999 David Mosberger-Tang and Andreas Beck
+ This file is part of the SANE package.
+
+ This file is in the public domain. You may use and modify it as
+ you see fit, as long as this copyright message is included and
+ that there is an indication as to what modifications have been
+ made (if any).
+
+ SANE 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.
+
+ This file declares SANE application interface. See the SANE
+ standard for a detailed explanation of the interface. */
+#ifndef sane_h
+#define sane_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * SANE types and defines
+ */
+
+#define SANE_CURRENT_MAJOR 1
+#define SANE_CURRENT_MINOR 0
+
+#define SANE_VERSION_CODE(major, minor, build) \
+ ( (((SANE_Word) (major) & 0xff) << 24) \
+ | (((SANE_Word) (minor) & 0xff) << 16) \
+ | (((SANE_Word) (build) & 0xffff) << 0))
+
+#define SANE_VERSION_MAJOR(code) ((((SANE_Word)(code)) >> 24) & 0xff)
+#define SANE_VERSION_MINOR(code) ((((SANE_Word)(code)) >> 16) & 0xff)
+#define SANE_VERSION_BUILD(code) ((((SANE_Word)(code)) >> 0) & 0xffff)
+
+#define SANE_FALSE 0
+#define SANE_TRUE 1
+
+typedef unsigned char SANE_Byte;
+typedef int SANE_Word;
+typedef SANE_Word SANE_Bool;
+typedef SANE_Word SANE_Int;
+typedef char SANE_Char;
+typedef SANE_Char *SANE_String;
+typedef const SANE_Char *SANE_String_Const;
+typedef void *SANE_Handle;
+typedef SANE_Word SANE_Fixed;
+
+#define SANE_FIXED_SCALE_SHIFT 16
+#define SANE_FIX(v) ((SANE_Word) ((v) * (1 << SANE_FIXED_SCALE_SHIFT)))
+#define SANE_UNFIX(v) ((double)(v) / (1 << SANE_FIXED_SCALE_SHIFT))
+
+typedef enum
+ {
+ SANE_STATUS_GOOD = 0, /* everything A-OK */
+ SANE_STATUS_UNSUPPORTED, /* operation is not supported */
+ SANE_STATUS_CANCELLED, /* operation was cancelled */
+ SANE_STATUS_DEVICE_BUSY, /* device is busy; try again later */
+ SANE_STATUS_INVAL, /* data is invalid (includes no dev at open) */
+ SANE_STATUS_EOF, /* no more data available (end-of-file) */
+ SANE_STATUS_JAMMED, /* document feeder jammed */
+ SANE_STATUS_NO_DOCS, /* document feeder out of documents */
+ SANE_STATUS_COVER_OPEN, /* scanner cover is open */
+ SANE_STATUS_IO_ERROR, /* error during device I/O */
+ SANE_STATUS_NO_MEM, /* out of memory */
+ SANE_STATUS_ACCESS_DENIED /* access to resource has been denied */
+ }
+SANE_Status;
+
+/* following are for later sane version, older frontends wont support */
+#if 0
+#define SANE_STATUS_WARMING_UP 12 /* lamp not ready, please retry */
+#define SANE_STATUS_HW_LOCKED 13 /* scanner mechanism locked for transport */
+#endif
+
+typedef enum
+ {
+ SANE_TYPE_BOOL = 0,
+ SANE_TYPE_INT,
+ SANE_TYPE_FIXED,
+ SANE_TYPE_STRING,
+ SANE_TYPE_BUTTON,
+ SANE_TYPE_GROUP
+ }
+SANE_Value_Type;
+
+typedef enum
+ {
+ SANE_UNIT_NONE = 0, /* the value is unit-less (e.g., # of scans) */
+ SANE_UNIT_PIXEL, /* value is number of pixels */
+ SANE_UNIT_BIT, /* value is number of bits */
+ SANE_UNIT_MM, /* value is millimeters */
+ SANE_UNIT_DPI, /* value is resolution in dots/inch */
+ SANE_UNIT_PERCENT, /* value is a percentage */
+ SANE_UNIT_MICROSECOND /* value is micro seconds */
+ }
+SANE_Unit;
+
+typedef struct
+ {
+ SANE_String_Const name; /* unique device name */
+ SANE_String_Const vendor; /* device vendor string */
+ SANE_String_Const model; /* device model name */
+ SANE_String_Const type; /* device type (e.g., "flatbed scanner") */
+ }
+SANE_Device;
+
+#define SANE_CAP_SOFT_SELECT (1 << 0)
+#define SANE_CAP_HARD_SELECT (1 << 1)
+#define SANE_CAP_SOFT_DETECT (1 << 2)
+#define SANE_CAP_EMULATED (1 << 3)
+#define SANE_CAP_AUTOMATIC (1 << 4)
+#define SANE_CAP_INACTIVE (1 << 5)
+#define SANE_CAP_ADVANCED (1 << 6)
+
+#define SANE_OPTION_IS_ACTIVE(cap) (((cap) & SANE_CAP_INACTIVE) == 0)
+#define SANE_OPTION_IS_SETTABLE(cap) (((cap) & SANE_CAP_SOFT_SELECT) != 0)
+
+#define SANE_INFO_INEXACT (1 << 0)
+#define SANE_INFO_RELOAD_OPTIONS (1 << 1)
+#define SANE_INFO_RELOAD_PARAMS (1 << 2)
+
+typedef enum
+ {
+ SANE_CONSTRAINT_NONE = 0,
+ SANE_CONSTRAINT_RANGE,
+ SANE_CONSTRAINT_WORD_LIST,
+ SANE_CONSTRAINT_STRING_LIST
+ }
+SANE_Constraint_Type;
+
+typedef struct
+ {
+ SANE_Word min; /* minimum (element) value */
+ SANE_Word max; /* maximum (element) value */
+ SANE_Word quant; /* quantization value (0 if none) */
+ }
+SANE_Range;
+
+typedef struct
+ {
+ SANE_String_Const name; /* name of this option (command-line name) */
+ SANE_String_Const title; /* title of this option (single-line) */
+ SANE_String_Const desc; /* description of this option (multi-line) */
+ SANE_Value_Type type; /* how are values interpreted? */
+ SANE_Unit unit; /* what is the (physical) unit? */
+ SANE_Int size;
+ SANE_Int cap; /* capabilities */
+
+ SANE_Constraint_Type constraint_type;
+ union
+ {
+ const SANE_String_Const *string_list; /* NULL-terminated list */
+ const SANE_Word *word_list; /* first element is list-length */
+ const SANE_Range *range;
+ }
+ constraint;
+ }
+SANE_Option_Descriptor;
+
+typedef enum
+ {
+ SANE_ACTION_GET_VALUE = 0,
+ SANE_ACTION_SET_VALUE,
+ SANE_ACTION_SET_AUTO
+ }
+SANE_Action;
+
+typedef enum
+ {
+ SANE_FRAME_GRAY, /* band covering human visual range */
+ SANE_FRAME_RGB, /* pixel-interleaved red/green/blue bands */
+ SANE_FRAME_RED, /* red band only */
+ SANE_FRAME_GREEN, /* green band only */
+ SANE_FRAME_BLUE /* blue band only */
+ }
+SANE_Frame;
+
+/* push remaining types down to match existing backends */
+/* these are to be exposed in a later version of SANE */
+/* most front-ends will require updates to understand them */
+#if 0
+#define SANE_FRAME_TEXT 0x0A /* backend specific textual data */
+#define SANE_FRAME_JPEG 0x0B /* complete baseline JPEG file */
+#define SANE_FRAME_G31D 0x0C /* CCITT Group 3 1-D Compressed (MH) */
+#define SANE_FRAME_G32D 0x0D /* CCITT Group 3 2-D Compressed (MR) */
+#define SANE_FRAME_G42D 0x0E /* CCITT Group 4 2-D Compressed (MMR) */
+
+#define SANE_FRAME_IR 0x0F /* bare infrared channel */
+#define SANE_FRAME_RGBI 0x10 /* red+green+blue+infrared */
+#define SANE_FRAME_GRAYI 0x11 /* gray+infrared */
+#define SANE_FRAME_XML 0x12 /* undefined schema */
+#endif
+
+typedef struct
+ {
+ SANE_Frame format;
+ SANE_Bool last_frame;
+ SANE_Int bytes_per_line;
+ SANE_Int pixels_per_line;
+ SANE_Int lines;
+ SANE_Int depth;
+ }
+SANE_Parameters;
+
+struct SANE_Auth_Data;
+
+#define SANE_MAX_USERNAME_LEN 128
+#define SANE_MAX_PASSWORD_LEN 128
+
+typedef void (*SANE_Auth_Callback) (SANE_String_Const resource,
+ SANE_Char *username,
+ SANE_Char *password);
+
+extern SANE_Status sane_init (SANE_Int * version_code,
+ SANE_Auth_Callback authorize);
+extern void sane_exit (void);
+extern SANE_Status sane_get_devices (const SANE_Device *** device_list,
+ SANE_Bool local_only);
+extern SANE_Status sane_open (SANE_String_Const devicename,
+ SANE_Handle * handle);
+extern void sane_close (SANE_Handle handle);
+extern const SANE_Option_Descriptor *
+ sane_get_option_descriptor (SANE_Handle handle, SANE_Int option);
+extern SANE_Status sane_control_option (SANE_Handle handle, SANE_Int option,
+ SANE_Action action, void *value,
+ SANE_Int * info);
+extern SANE_Status sane_get_parameters (SANE_Handle handle,
+ SANE_Parameters * params);
+extern SANE_Status sane_start (SANE_Handle handle);
+extern SANE_Status sane_read (SANE_Handle handle, SANE_Byte * data,
+ SANE_Int max_length, SANE_Int * length);
+extern void sane_cancel (SANE_Handle handle);
+extern SANE_Status sane_set_io_mode (SANE_Handle handle,
+ SANE_Bool non_blocking);
+extern SANE_Status sane_get_select_fd (SANE_Handle handle,
+ SANE_Int * fd);
+extern SANE_String_Const sane_strstatus (SANE_Status status);
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* sane_h */
diff --git a/code/base/sane/sane_ex.h b/code/base/sane/sane_ex.h
new file mode 100644
index 0000000..c4c6627
--- /dev/null
+++ b/code/base/sane/sane_ex.h
@@ -0,0 +1,459 @@
+/* sane - Scanner Access Now Easy.
+ 对sane标准头文件的扩展
+
+ Author: Gongbing
+
+ Date: 2022-01-14
+*/
+
+#ifndef sane_ex_h
+#define sane_ex_h
+
+#ifndef EXPORT_SANE_API
+#ifdef OEM_HANWANG
+ #define ENTIRE_API(pre, tail) pre##_hwsane_##tail
+#elif defined(OEM_LISICHENG)
+ #define ENTIRE_API(pre, tail) pre##_lscsane_##tail
+#elif defined(OEM_CANGTIAN)
+ #define ENTIRE_API(pre, tail) pre##_ctssane_##tail
+#else
+ #define ENTIRE_API(pre, tail) pre##_hgsane_##tail
+#endif
+
+#define sane_init ENTIRE_API(sane, init)
+#define sane_init_ex ENTIRE_API(sane, init_ex)
+#define sane_exit ENTIRE_API(sane, exit)
+#define sane_get_devices ENTIRE_API(sane, get_devices)
+#define sane_open ENTIRE_API(sane, open)
+#define sane_close ENTIRE_API(sane, close)
+#define sane_get_option_descriptor ENTIRE_API(sane, get_option_descriptor)
+#define sane_control_option ENTIRE_API(sane, control_option)
+#define sane_get_parameters ENTIRE_API(sane, get_parameters)
+#define sane_start ENTIRE_API(sane, start)
+#define sane_read ENTIRE_API(sane, read)
+#define sane_cancel ENTIRE_API(sane, cancel)
+#define sane_set_io_mode ENTIRE_API(sane, set_io_mode)
+#define sane_get_select_fd ENTIRE_API(sane, get_select_fd)
+#define sane_strstatus ENTIRE_API(sane, strstatus)
+#define sane_io_control ENTIRE_API(sane, io_control)
+#define sane_err_desc ENTIRE_API(sane, err_desc)
+#endif
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+// sane-standard-option-name defined by third-app
+//
+// PART I: 参数类型与华高一致,可直接通过改name字段为标准值实现
+#define SANE_STD_OPT_NAME_RESTORE "restore" // OPTION_TITLE_HFMRSZ
+#define SANE_STD_OPT_NAME_HELP "help" // OPTION_TITLE_BZ
+#define SANE_STD_OPT_NAME_IS_MULTI_OUT "is-multiout" // OPTION_TITLE_DLSC
+#define SANE_STD_OPT_NAME_MULTI_OUT_TYPE "multiout-type" // OPTION_TITLE_DLSCLX
+#define SANE_STD_OPT_NAME_COLOR_MODE "mode" // OPTION_TITLE_YSMS
+#define SANE_STD_OPT_NAME_BINARY_THRESHOLD "binary-threshold" // OPTION_TITLE_HBTXYZ
+#define SANE_STD_OPT_NAME_REVERSE_01 "reverse-bw" // OPTION_TITLE_HBTXFSSC
+#define SANE_STD_OPT_NAME_FILTER "filter" // OPTION_TITLE_HDHHBTX_CS
+#define SANE_STD_OPT_NAME_RID_MULTIOUT_RED "is-rid-multiout-red" // OPTION_TITLE_24WCSTX_DLSCCH
+#define SANE_STD_OPT_NAME_RID_ANSWER_SHEET_RED "is-rid-answer-sheet-red" // OPTION_TITLE_24WCSTX_DTKCH
+#define SANE_STD_OPT_NAME_ERASE_BACKGROUND "is-erase-bkg" // OPTION_TITLE_BJYC
+#define SANE_STD_OPT_NAME_BKG_COLOR_RANGE "bkg-color-range" // OPTION_TITLE_BJSCFDFW
+#define SANE_STD_OPT_NAME_SHARPEN "sharpen" // OPTION_TITLE_RHYMH
+#define SANE_STD_OPT_NAME_RID_MORR "is-rid-morr" // OPTION_TITLE_QCMW
+#define SANE_STD_OPT_NAME_RID_GRID "is-rid-grid" // OPTION_TITLE_CWW
+#define SANE_STD_OPT_NAME_ERROR_EXTENSION "is-err-extension" // OPTION_TITLE_CWKS
+#define SANE_STD_OPT_NAME_NOISE_OPTIMIZE "is-noise-optimize" // OPTION_TITLE_HBTXZDYH
+#define SANE_STD_OPT_NAME_NOISE_SIZE "noise-size" // OPTION_TITLE_ZDYHCC
+#define SANE_STD_OPT_NAME_PAPER "paper" // OPTION_TITLE_ZZCC
+#define SANE_STD_OPT_NAME_CUSTOM_AREA "is-custom-area" // OPTION_TITLE_ZDYSMQY
+#define SANE_STD_OPT_NAME_CUSTOM_AREA_LEFT "tl-x" // OPTION_TITLE_SMQYZCmm
+#define SANE_STD_OPT_NAME_CUSTOM_AREA_RIGHT "br-x" // OPTION_TITLE_SMQYYCmm
+#define SANE_STD_OPT_NAME_CUSTOM_AREA_TOP "tl-y" // OPTION_TITLE_SMQYSCmm
+#define SANE_STD_OPT_NAME_CUSTOM_AREA_BOTTOM "br-y" // OPTION_TITLE_SMQYXCmm
+#define SANE_STD_OPT_NAME_SIZE_CHECK "is-size-check" // OPTION_TITLE_CCJC
+#define SANE_STD_OPT_NAME_PAGE "page" // OPTION_TITLE_SMYM
+#define SANE_STD_OPT_NAME_DISCARD_BLANK_SENS "blank-sensitivity" // OPTION_TITLE_TGKBYLMD
+#define SANE_STD_OPT_NAME_RESOLUTION "resolution" // OPTION_TITLE_FBL
+#define SANE_STD_OPT_NAME_TIME_TO_SLEEP "time-to-sleep" // OPTION_TITLE_XMSJ
+#define SANE_STD_OPT_NAME_IMAGE_QUALITY "image-quality" // OPTION_TITLE_HZ
+#define SANE_STD_OPT_NAME_EXCHANGE "is-exchange" // OPTION_TITLE_JHZFM
+#define SANE_STD_OPT_NAME_SPLIT "is-split" // OPTION_TITLE_TXCF
+#define SANE_STD_OPT_NAME_ANTI_SKEW "is-anti-skew" // OPTION_TITLE_ZDJP
+#define SANE_STD_OPT_NAME_IS_CUSTOM_GAMMA "is-custom-gamma" // OPTION_TITLE_QYSDQX
+#define SANE_STD_OPT_NAME_GAMMA "gamma" // OPTION_TITLE_JMZ
+#define SANE_STD_OPT_NAME_BRIGHTNESS "brightness" // OPTION_TITLE_LDZ
+#define SANE_STD_OPT_NAME_CONTRAST "contrast" // OPTION_TITLE_DBD
+#define SANE_STD_OPT_NAME_IS_PHOTO_MODE "is-photo-mode" // OPTION_TITLE_ZPMS
+#define SANE_STD_OPT_NAME_ERASE_BLACK_FRAME "is-erase-black-frame" // OPTION_TITLE_XCHK
+#define SANE_STD_OPT_NAME_DARK_SAMPLE "is-dark-sample" // OPTION_TITLE_SSYZ
+#define SANE_STD_OPT_NAME_THRESHOLD "threshold" // OPTION_TITLE_YZ
+#define SANE_STD_OPT_NAME_ANTI_NOISE_LEVEL "anti-noise-level" // OPTION_TITLE_BJKZDJ
+#define SANE_STD_OPT_NAME_MARGIN "margin" // OPTION_TITLE_BYSJ
+#define SANE_STD_OPT_NAME_FILL_BKG_MODE "bkg-fill-mode" // OPTION_TITLE_BJTCFS
+#define SANE_STD_OPT_NAME_IS_ANTI_PERMEATE "is-anti-permeate" // OPTION_TITLE_FZST
+#define SANE_STD_OPT_NAME_ANTI_PERMEATE_LEVEL "permeate-level" // OPTION_TITLE_FZSTDJ
+#define SANE_STD_OPT_NAME_RID_HOLE "is-rid-hole" // OPTION_TITLE_CKYC
+#define SANE_STD_OPT_NAME_SEARCH_HOLE_RANGE "search-hole-range" // OPTION_TITLE_CKSSFWZFMBL
+#define SANE_STD_OPT_NAME_RID_HOLE_L "is-rid-hole-l" // OPTION_TITLE_CKYCZC
+#define SANE_STD_OPT_NAME_SEARCH_HOLE_RANGE_L "search-hole-range-l" // OPTION_TITLE_ZCCKSSFWZFMBL
+#define SANE_STD_OPT_NAME_RID_HOLE_R "is-rid-hole-r" // OPTION_TITLE_CKYCYC
+#define SANE_STD_OPT_NAME_SEARCH_HOLE_RANGE_R "search-hole-range-r" // OPTION_TITLE_YCCKSSFWZFMBL
+#define SANE_STD_OPT_NAME_RID_HOLE_T "is-rid-hole-t" // OPTION_TITLE_CKYCSC
+#define SANE_STD_OPT_NAME_SEARCH_HOLE_RANGE_T "search-hole-range-t" // OPTION_TITLE_SCCKSSFWZFMBL
+#define SANE_STD_OPT_NAME_RID_HOLE_B "is-rid-hole-b" // OPTION_TITLE_CKYCXC
+#define SANE_STD_OPT_NAME_SEARCH_HOLE_RANGE_B "search-hole-range-b" // OPTION_TITLE_XCCKSSFWZFMBL
+#define SANE_STD_OPT_NAME_IS_FILL_COLOR "is-fill-color" // OPTION_TITLE_SCTC
+#define SANE_STD_OPT_NAME_IS_ULTROSONIC_CHECK "is-ultrosonic" // OPTION_TITLE_CSBJC
+#define SANE_STD_OPT_NAME_DOUBLE_FEED_HANDLE "double-feed" // OPTION_TITLE_SZTPCL
+#define SANE_STD_OPT_NAME_IS_CHECK_STAPLE "is-staple" // OPTION_TITLE_ZDJC
+#define SANE_STD_OPT_NAME_SCAN_MODE "scan-mode" // OPTION_TITLE_SMZS
+#define SANE_STD_OPT_NAME_SCAN_COUNT "scan-count" // OPTION_TITLE_SMSL
+#define SANE_STD_OPT_NAME_TEXT_DIRECTION "direction" // OPTION_TITLE_WGFX
+#define SANE_STD_OPT_NAME_IS_ROTATE_BKG_180 "is-rotate-bkg-180" // OPTION_TITLE_BMXZ180
+#define SANE_STD_OPT_NAME_IS_CHECK_DOG_EAR "is-check-dog-ear" // OPTION_TITLE_ZJJC
+#define SANE_STD_OPT_NAME_DOG_EAR_SIZE "dog-ear-size" // OPTION_TITLE_ZJDX
+#define SANE_STD_OPT_NAME_IS_CHECK_ASKEW "is-check-askew" // OPTION_TITLE_WXJC
+#define SANE_STD_OPT_NAME_ASKEW_RANGE "askew-range" // OPTION_TITLE_WXRRD
+#define SANE_STD_OPT_NAME_FEED_STRENGTH "feed-strength" // OPTION_TITLE_FZQD
+#define SANE_STD_OPT_NAME_IS_AUTO_FEED_STRENGTH "is-auto-strength" // OPTION_TITLE_ZDFZQD
+#define SANE_STD_OPT_NAME_FEED_STRENGTH_VALUE "feed-strength-value" // OPTION_TITLE_JZSBL
+#define SANE_STD_OPT_NAME_WAIT_TO_SCAN "is-wait-scan" // OPTION_TITLE_DZSM
+#define SANE_STD_OPT_NAME_FOLD_TYPE "fold-type" // OPTION_TITLE_DZMS
+
+// PART II: 参数类型与华高不一致,需要通过“hgsane”组件在中间转换
+#define SANE_STD_OPT_NAME_PAPER_W "page-width" // OPTION_TITLE_ZZCC
+#define SANE_STD_OPT_NAME_PAPER_H "page-height" // OPTION_TITLE_ZZCC
+#define SANE_STD_OPT_NAME_DUPLEX "duplex" // OPTION_TITLE_SMYM
+// END for sane-standard-option-name defined by third-app
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+#include "sane.h"
+
+#define MAX_STRING_LEN 256
+#define IS_DOUBLE_EQUAL(a, b) fabs((a) - (b)) < .000001
+#define IS_PTR_NUMBER(ptr) (((unsigned long long)(ptr)) < 0x10000)
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#pragma pack(push)
+#pragma pack(1)
+#define ZERO_STRUCT(struct_ptr) memset(struct_ptr, 0, sizeof(*(struct_ptr)))
+
+ ////////////////////////////////////////////////////////////////////////////////
+ // extension for standard SANE ...
+ typedef struct _sane_stream
+ {
+ SANE_Int bytes;
+ SANE_Byte *data;
+ }SANE_Stream;
+
+ typedef struct _sane_dev_ex
+ {
+ SANE_String_Const name; /* unique device name */
+ SANE_String_Const vendor; /* device vendor string */
+ SANE_String_Const model; /* device model name */
+ SANE_String_Const type; /* device type (e.g., "flatbed scanner") */
+ SANE_Bool openned; // whether openned
+ }SANE_Device_Ex;
+ typedef struct _sane_auth // for SANE_EVENT_NEED_AUTH
+ {
+ SANE_String_Const resource;
+ SANE_Char name[MAX_STRING_LEN];
+ SANE_Char pwd[MAX_STRING_LEN];
+ SANE_Char method[MAX_STRING_LEN];
+ }SANEAUTH;
+ typedef enum
+ {
+ SANE_Image_Statu_OK = 0, // 正常图像
+ SANE_Image_Statu_Blank, // 被判定为空白的图像
+ SANE_Image_Statu_Double, // 出现双张进纸的图像
+ SANE_Image_Statu_Jammed, // 卡纸后的图像
+ }SANE_Image_Statu; // added on 2022-07-23
+ typedef struct
+ {
+ SANE_Parameters header;
+ struct
+ {
+ unsigned int statu : 4; // SANE_Image_Statu
+ unsigned int dpi : 12; // resolution, dots per inch
+ unsigned int reserve : 16;
+ }flag;
+ unsigned long bytes;
+ unsigned char *data;
+ }SANE_Image;
+ typedef struct _about_info
+ {
+ SANE_String_Const title; // APP名称
+ SANE_String_Const version; // 版本号
+ SANE_String_Const copyright; // 版权信息
+ unsigned int logo_bytes; // LOGO 数据长度
+ void* logo; // LOGO 数据
+ struct
+ {
+ SANE_String_Const key; // 附加信息名称,该数据为NULL时,appendix数组结束
+ SANE_String_Const content;// 附加信息内容
+ SANE_String_Const url; // 附加信息链接, NULL则忽略
+ }appendix[1];
+ }SANE_About;
+
+ typedef enum
+ {
+ SANE_COMPRESSION_FIRST = 0,
+ SANE_COMPRESSION_NONE = 0, // default value
+ //SANE_COMPRESSION_PACBITS,
+ //SANE_COMPRESSION_GROUP31D,
+ //SANE_COMPRESSION_GROUP31DEOL,
+ //SANE_COMPRESSION_GROUP32D,
+ SANE_COMPRESSION_GROUP4 = 5, // support now ! detail is threshold converting color to BlackWhite, e.g. (void*)128
+ //SANE_COMPRESSION_JPEG,
+ //SANE_COMPRESSION_LZW,
+ //SANE_COMPRESSION_JBIG,
+ //SANE_COMPRESSION_PNG,
+ //SANE_COMPRESSION_RLE4,
+ //SANE_COMPRESSION_RLE8,
+ //SANE_COMPRESSION_BITFIELDS,
+ //SANE_COMPRESSION_ZIZ,
+ //SANE_COMPRESSION_JPEG2000,
+
+ SANE_COMPRESSION_LAST,
+ SANE_COMPRESSION_DONTCARE = 0xFFFF,
+ }SANE_CompressionType;
+ typedef struct _img_compression
+ {
+ SANE_CompressionType compression;
+ void* detail; // see SANE_CompressionType (该参数在当前版本不考虑,暂使用压缩类型的默认值)
+ }SANE_Compression;
+ typedef enum // 与Twpp::ImageFileFormat 保持一致
+ {
+ SANE_IMAGE_TYPE_FIRST = 0,
+ SANE_IMAGE_TYPE_TIFF = 0,
+ SANE_IMAGE_TYPE_BMP = 2, // (BITMAPINFOHEADER*)detail
+ SANE_IMAGE_TYPE_PNG = 7,
+ SANE_IMAGE_TYPE_JPG = 13,
+ SANE_IMAGE_TYPE_JFIF = 4,
+ SANE_IMAGE_TYPE_PDF = 10,
+
+ // 以下为Twpp::ImageFileFormat不存在的值
+ SANE_IMAGE_TYPE_GIF = 100,
+ SANE_IMAGE_TYPE_WEBP,
+ SANE_IMAGE_TYPE_SVG,
+ SANE_IMAGE_TYPE_LAST,
+ }SANE_ImageType;
+ typedef struct _img_final_fmt
+ {
+ SANE_ImageType img_format;
+ void* detail; // see SANE_ImageType (该参数在当前版本不考虑,暂使用该图像类型的默认值)
+ SANE_Compression compress;
+ }SANE_FinalImgFormat;
+ typedef struct _img_format_convert
+ {
+ struct
+ {
+ SANE_FinalImgFormat fmt; // format of the data
+ SANE_Bool is_file; // data is a 'path-file' if it was true, or else is raw file data
+ SANE_String_Const data; // represents a local file or a memory data. call 'IO_CTRL_CODE_FREE_MEMORY' to free the dst.data memory if 'is_file' was true !!!
+ unsigned int data_len; // bytes of 'data'
+ }src, dst;
+ }SANE_ImageFormatConvert;
+
+ typedef struct _sane_point
+ {
+ SANE_Byte x;
+ SANE_Byte y;
+ }SANE_Gamma_Point;
+ typedef struct _user_gamma // NOTE: exceeds 4KB !!!
+ {
+ SANE_Bool apply_to_back; // SANE_TRUE: 应用到背面; SANE_FALSE: 应用到正面
+ SANE_Byte pt_count; // 关键点keypoint中有效数据个数,最多4个,0为不使用
+ SANE_Byte pt_count_r; // 关键点keypoint_r中有效数据个数,最多4个,0为不使用
+ SANE_Byte pt_count_g; // 关键点keypoint_g中有效数据个数,最多4个,0为不使用
+ SANE_Byte pt_count_b; // 关键点keypoint_b中有效数据个数,最多4个,0为不使用
+ SANE_Gamma_Point keypoint[4]; // gamma曲线方程式RGB/灰度/黑白模式控制点
+ SANE_Gamma_Point keypoint_r[4]; // gamma曲线方程式Red分量控制点
+ SANE_Gamma_Point keypoint_g[4]; // gamma曲线方程式Green分量控制点
+ SANE_Gamma_Point keypoint_b[4]; // gamma曲线方程式Blue分量控制点
+ SANE_Byte table[3 * 256]; // gamma变换阵列,多分量时,顺序为:R[256] + G[256] + B[256]
+ }SANE_Gamma;
+
+ typedef enum
+ {
+ SANE_FUNCTION_PARAMETER_TYPE_STRING = 0, // SANE_String_List
+ SANE_FUNCTION_PARAMETER_TYPE_STREAM, // SANE_Stream
+ SANE_FUNCTION_PARAMETER_TYPE_USER_INPUT, // SANE_String
+ }SANE_Function_Parameter_Type;
+ typedef struct _sane_function_parameter
+ {
+ SANE_Function_Parameter_Type type;
+ }SANE_Function_Parameter;
+ typedef struct _sane_function
+ {
+ SANE_Int func_id;
+ SANE_Int parameter_count;
+ SANE_Function_Parameter parameter[1];
+ }SANE_Function;
+ typedef struct _sane_img_kits
+ {
+ SANE_Int kit_id;
+ SANE_String name;
+ SANE_String title;
+ SANE_String desc;
+ SANE_Stream icon;
+ SANE_Int function_count;
+ SANE_Function function[1];
+ }SANE_Image_Kits;
+
+ typedef enum
+ {
+ AUTO_COLOR_BLACKWHITE = 0,
+ AUTO_COLOR_GRAY,
+ }SANE_AutoColorType;
+ typedef enum
+ {
+ LOG_FILE_DEVICE = 0, // 设备端日志文件
+ LOG_FILE_DRIVER, // 驱动层日志文件
+ }SANE_LogFileType;
+
+ typedef enum // IO_CTRL_CODE_SET_POWER_LEVEL
+ {
+ SANE_POWER_FIRST = 0,
+ SANE_POWER_NONE = SANE_POWER_FIRST,
+ SANE_POWER_MINUTES_5,
+ SANE_POWER_MINUTES_10,
+ SANE_POWER_MINUTES_20,
+ SANE_POWER_MINUTES_30,
+ SANE_POWER_MINUTES_60,
+ SANE_POWER_MINUTES_120,
+ SANE_POWER_MINUTES_240,
+ SANE_POWER_LAST,
+ SANE_POWER_SHUTDOWN, // 关闭设备 239 设备重启和关闭设备不会触发热拔插,所以使用此命令时需要手动关闭设备和打开设备
+ SANE_POWER_RESTART, // 重启设备
+ }SANE_Power;
+
+ typedef enum
+ {
+ SANE_EVENT_NONE = 0, // 无意义的回调, both data & len are NULL
+ SANE_EVENT_SUPPORT_ASYNC_IO, // 是否支持异步IO,返回“0”支持,其它不支持。data and len unused
+ SANE_EVENT_IS_MEMORY_ENOUGH, // 当前内存是否足够读取图片, data - unused;*len - needed size. return SCANNER_ERR_OK or SCANNER_ERR_INSUFFICIENT_MEM
+ SANE_EVENT_NEED_AUTH, // data - (SANEAUTH*); len - unused; return none-zero to giveup
+ SANE_EVENT_DEVICE_ARRIVED, // data - SANE_Device_Ex*; *len - sizeof(SANE_Device_Ex)
+ SANE_EVENT_DEVICE_LEFT, // data - SANE_Device*; *len - sizeof(SANE_Device)
+ SANE_EVENT_STATUS, // normal status description. data - (utf8*), len - unused, be NULL
+ SANE_EVENT_ERROR, // error happens, should stop operations. data - (utf8*)description, *len - error code
+ SANE_EVENT_WORKING, // 扫描仪正在扫描, data - (char*)description, len - unused
+ SANE_EVENT_USB_DATA_RECEIVED, // 从USB读取到一个图片数据包,当前只用作纸张统计。data - NULL, *len - bytes
+ SANE_EVENT_IMAGE_OK, // new image data is ready for UI. data - (SANE_Image*), *len - index of the image (ZERO base)
+ SANE_EVENT_SCAN_FINISHED, // 扫描仪完成扫描, data - (char*)description, *len - error code
+ SANE_EVENT_ABOUT_INFORMATION, // APP关于信息, data - (SANE_About*), len - unused, be NULL
+ SANE_EVENT_SCANNER_CLOSED, // 扫描仪已经关闭,data & len 同 SANE_EVENT_STATUS
+ // SANE_EVENT_WIN_DEBUG_INFO, // writedown debug info on windows platform ... data - (utf8*), *len - HG_LOG_LEVEL, param - NULL !!!
+
+ // ui event ...
+ SANE_EVENT_UI_CLOSE_CANCEL = 0x1000,
+ SANE_EVENT_UI_CLOSE_NORMAL,
+ SANE_EVENT_UI_SCAN_COMMAND, // setting ui notify button 'scan' clicked
+ SANE_EVENT_UI_CLOSE_SETTING,
+ }SANE_Event;
+
+#pragma pack(pop)
+
+ typedef int(*sane_callback)( // 注册回调的对象,需要保证该回调是多线程安全的
+ SANE_Handle hdev // 产生事件的设备句柄
+ , int code // 回调事件代码
+ , void* data // 回调事件数据,根据事件代码有所不同,参照具体事件定义
+ , unsigned int* len // 数据长度(字节),或者event_data的缓冲区长度,详细请看相应的事件代码
+ , void* param // 用户自定义数据,与调用sane_init_ex传入时的保持一致
+ ); // 返回值依不同的事件代码而定,通常为“0”
+ extern SANE_Status sane_init_ex(SANE_Int* version_code, sane_callback cb, void* param);
+
+ enum io_code
+ {
+ IO_CTRL_CODE_BASE = 0x00C0DE111,
+ IO_CTRL_CODE_TEST_SINGLE = IO_CTRL_CODE_BASE, // 单张测试扫描 data - NULL, len - NULL
+ IO_CTRL_CODE_ABOUT_INFO, // 获取软件关于信息。data - (SANE_About*), 如果data为空或者由len指示的内存大小不足,
+ // 则会在len中返回所需要的最小内存长度,并返回 SANE_STATUS_NO_MEM 错误
+ IO_CTRL_CODE_RESTORE_SETTINGS, // 恢复默认设置 data - NULL, len - NULL
+ IO_CTRL_CODE_GET_DEFAULT_VALUE, // 获取设置项默认值 data - 同sane_control_option - SANE_ACTION_GET_VALUE时的定义, *len - [in] 设置项序号,同sane_control_option中option的值
+ IO_CTRL_CODE_CLEAR_ROLLER_COUNT, // 清除滚轴计数 data - NULL, len - to receive current roller count, can be NULL
+ IO_CTRL_CODE_GET_FINAL_IMAGE_FORMAT, // 获取图像处理最终输出(final())的图像数据格式 data - (SANE_FinalImgFormat*), len - bytes of data
+ IO_CTRL_CODE_SET_FINAL_IMAGE_FORMAT, // 设置图像处理最终输出(final())的图像数据格式 data - (SANE_FinalImgFormat*), len - bytes of data
+ IO_CTRL_CODE_GET_FINAL_COMPRESSION, // 获取支持的压缩格式,data - (SANE_Int*), to receive supported SANE_CompressionType, data[0]: supported counts, data[1]: default value, data[2]: current value; data[3...]: all supported values
+ // *len - array length of data, or need length if it was too small
+ IO_CTRL_CODE_SET_FINAL_COMPRESSION, // 设置图像数据最终输出的压缩格式,data - (SANE_Compression*), len - bytes of data
+ IO_CTRL_CODE_SET_AUTO_COLOR_TYPE, // 设置自动匹配颜色模式, data - (SANE_AutoColorType*), *len - sizeof(data)
+ IO_CTRL_CODE_GET_SERIAL, // 获取设备序列号, data - (char*), *len - bytes of data
+ IO_CTRL_CODE_GET_HARDWARE_VERSION, // 获取硬件版本号,参数同 IO_CTRL_CODE_GET_SERIAL
+ IO_CTRL_CODE_GET_IP, // 获取设备IP, 参数同 IO_CTRL_CODE_GET_SERIAL
+ IO_CTRL_CODE_GET_DEVICE_CODE, // 获取设备编码, 参数同 IO_CTRL_CODE_GET_SERIAL
+ IO_CTRL_CODE_GET_DOGEAR_DISTANCE, // 获取折角检测最小距离阈值, data - (SANE_Int*), *len - sizeof(SANE_Int)
+ IO_CTRL_CODE_SET_DOGEAR_DISTANCE, // 设置折角检测最小距离阈值, data - (SANE_Int*), *len - sizeof(SANE_Int)
+ IO_CTRL_CODE_GET_PAPER_ON, // 获取进纸盘上是否有纸,data - (SANE_Bool*), *len - sizeof(SANE_Bool)
+ IO_CTRL_CODE_SET_POWER_LEVEL, // 设置功耗模式(休眠),data - (SANE_Power*), *len - sizeof(SANE_Power)
+ IO_CTRL_CODE_GET_POWER_LEVEL, // 设置功耗模式(休眠),data - (SANE_Power*), *len - sizeof(SANE_Power)
+ IO_CTRL_CODE_GET_SCAN_WHEN_PAPER_ON, // 获取是否为检测到进纸盘上有纸即开始扫描,data - (SANE_Bool*), *len - sizeof(SANE_Bool)
+ IO_CTRL_CODE_SET_SCAN_WHEN_PAPER_ON, // 设置是否为检测到进纸盘上有纸即开始扫描,data - (SANE_Bool*), *len - sizeof(SANE_Bool)
+ IO_CTRL_CODE_GET_SCAN_WITH_HOLE, // 获取是否为带孔扫描,data - (SANE_Bool*), *len - sizeof(SANE_Bool)
+ IO_CTRL_CODE_SET_SCAN_WITH_HOLE, // 设置是否为带孔扫描,data - (SANE_Bool*), *len - sizeof(SANE_Bool)
+ IO_CTRL_CODE_GET_CUSTOM_GAMMA, // 用于获取用户自定义gamma数值,data - SANE_Gamma*, *len - to receive current color mode
+ IO_CTRL_CODE_SET_CUSTOM_GAMMA, // 用于设置用户自定义gamma数值,data - SANE_Gamma*, len - unused
+ IO_CTRL_CODE_DISPLAY_APP_HELP, // 显示APP帮助文档 data - NULL, len - NULL
+ IO_CTRL_CODE_GET_PAPER_SIZE, // 获取纸张尺寸(mm)。 data - (utf8*)paper name, *len - MAKELPARAM(w, h)
+ IO_CTRL_CODE_GET_IMAGE_QUEUE_COUNT, // 获取图像队列的长度/数量, data - NULL, len - to receive the count
+ IO_CTRL_CODE_CONVERT_IMAGE_FORMAT, // 图像格式转换(文件方式), data - SANE_ImageFormatConvert*, len - unused, be NULL
+ IO_CTRL_CODE_FREE_MEMORY, // 释放由该模块分配的内存, data - 内存块,*len - 内存块长度
+
+ IO_CTRL_CODE_GET_LOG_FILE, // 获取日志文件,data - char[260],用于接收日志文件路径,返回空则获取失败;*len - 日志文件类型 SANE_LogFileType.
+ // 返回的日志文件,如果不再使用,调用者负责删除。
+ IO_CTRL_CODE_GET_SCAN_ISLOCK, // 获取设备是否支持锁定设备功能,data - (SANE_Bool*), *len - sizeof(SANE_Bool)
+ IO_CTRL_CODE_SET_SCAN_LOCK, // 设置设备锁定, data - (SANE_Bool), len - unused
+ IO_CTRL_CODE_SET_SCAN_LOCK_CHECK_VAL, // 设置校验码 ,data - (char*), *len - bytes of data
+ IO_CTRL_CODE_SET_FIRMWARE_UPGRADE, // 设置固件升级,data - (char*), *len - bytes of data
+ IO_CTRL_CODE_GET_HISTORY_ROLLER_NUM, // 获取历史滚轴张数 data - (SANE_Int*), *len - sizeof(SANE_Int)
+ IO_CTRL_CODE_GET_CLEAN_PAPER_ROAD, // 清除纸道 data - (SANE_Bool*), *len - sizeof(SANE_Bool)
+ IO_CTRL_CODE_GET_SCANN_NUM, // 获取扫描张数 data - (SANE_Int*), *len - sizeof(SANE_Int)
+ // all control code must be less than the following value
+ IO_CTRL_CODE_LAST = 0x10000000,
+ };
+
+ // Function: 直接访问控制
+ //
+ // Parameter: h - hg_open_scanner打开的设备句柄
+ //
+ // code - 控制码
+ //
+ // data - 用户分配的内存,对应于控制码的原始数据
+ //
+ // len - data中数据长度。如果是获取操作时,长度小于所需要的长度,则返回需要的长度且返回 E_INSUFFICIENTMEM 的错误
+ //
+ // Return: 错误码
+ extern SANE_Status sane_io_control(SANE_Handle h, unsigned long code, void* data, unsigned* len);
+
+ // Function: 获取错误描述
+ //
+ // Parameters: err - 其它SANE函数返回的错误代码
+ //
+ // Return: 错误描述信息(UTF-8),调用者应立即使用,无须释放
+ extern const char* sane_err_desc(SANE_Status err);
+
+ // for ui interface
+ typedef struct _sane_api
+ {
+ SANE_Status (*sane_get_devices_api)(const SANE_Device*** device_list, SANE_Bool local_only);
+ SANE_Status (*sane_open_api)(SANE_String_Const devicename, SANE_Handle* handle);
+ void (* sane_close_api)(SANE_Handle handle);
+ const SANE_Option_Descriptor* (*sane_get_option_descriptor_api)(SANE_Handle handle, SANE_Int option);
+ SANE_Status (*sane_control_option_api)(SANE_Handle handle, SANE_Int option, SANE_Action action, void* value, SANE_Int* info);
+ SANE_Status (*sane_get_parameters_api)(SANE_Handle handle, SANE_Parameters* params);
+ SANE_Status (*sane_start_api)(SANE_Handle handle);
+ SANE_Status (*sane_read_api)(SANE_Handle handle, SANE_Byte* data, SANE_Int max_length, SANE_Int* length);
+ void (*sane_cancel_api)(SANE_Handle handle);
+ SANE_Status (*sane_set_io_mode_api)(SANE_Handle handle, SANE_Bool non_blocking);
+ SANE_Status (*sane_get_select_fd_api)(SANE_Handle handle, SANE_Int* fd);
+ SANE_String_Const (*sane_strstatus_api)(SANE_Status status);
+ SANE_Status (*sane_io_control_api)(SANE_Handle h, unsigned long code, void* data, unsigned* len);
+ }SANEAPI, *LPSANEAPI;
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* sane_ex_h */
diff --git a/code/base/sane/sane_option_definitions.h b/code/base/sane/sane_option_definitions.h
new file mode 100644
index 0000000..2eaea63
--- /dev/null
+++ b/code/base/sane/sane_option_definitions.h
@@ -0,0 +1,416 @@
+//
+// definitions for option titles and values
+//
+// all multi-bytes letter are in UTF-8 format
+//
+// Date: 2022-09-30 14:23:02
+//
+
+#pragma once
+
+
+
+// #define OPTION_TITLE_HFMRSZ "恢复默认设置"
+#define OPTION_TITLE_HFMRSZ "\346\201\242\345\244\215\351\273\230\350\256\244\350\256\276\347\275\256"
+
+// #define OPTION_TITLE_BZ "帮助"
+#define OPTION_TITLE_BZ "\345\270\256\345\212\251"
+
+// #define OPTION_TITLE_DLSC "多流输出"
+#define OPTION_TITLE_DLSC "\345\244\232\346\265\201\350\276\223\345\207\272"
+// #define OPTION_TITLE_DLSCLX "多流输出类型"
+#define OPTION_TITLE_DLSCLX "\345\244\232\346\265\201\350\276\223\345\207\272\347\261\273\345\236\213"
+// #define OPTION_VALUE_DLSCLX_W "无"
+#define OPTION_VALUE_DLSCLX_W "\346\227\240"
+// #define OPTION_VALUE_DLSCLX_CS_HD_HB "彩色+灰度+黑白"
+#define OPTION_VALUE_DLSCLX_CS_HD_HB "\345\275\251\350\211\262+\347\201\260\345\272\246+\351\273\221\347\231\275"
+// #define OPTION_VALUE_DLSCLX_CS_HD "彩色+灰度"
+#define OPTION_VALUE_DLSCLX_CS_HD "\345\275\251\350\211\262+\347\201\260\345\272\246"
+// #define OPTION_VALUE_DLSCLX_CS_HB "彩色+黑白"
+#define OPTION_VALUE_DLSCLX_CS_HB "\345\275\251\350\211\262+\351\273\221\347\231\275"
+// #define OPTION_VALUE_DLSCLX_HD_HB "灰度+黑白"
+#define OPTION_VALUE_DLSCLX_HD_HB "\347\201\260\345\272\246+\351\273\221\347\231\275"
+
+// #define OPTION_TITLE_YSMS "颜色模式"
+#define OPTION_TITLE_YSMS "\351\242\234\350\211\262\346\250\241\345\274\217"
+// #define OPTION_VALUE_YSMS_24WCS "24位彩色"
+#define OPTION_VALUE_YSMS_24WCS "24\344\275\215\345\275\251\350\211\262"
+// #define OPTION_VALUE_YSMS_256JHD "256级灰度"
+#define OPTION_VALUE_YSMS_256JHD "256\347\272\247\347\201\260\345\272\246"
+// #define OPTION_VALUE_YSMS_HB "黑白"
+#define OPTION_VALUE_YSMS_HB "\351\273\221\347\231\275"
+// #define OPTION_VALUE_YSMS_YSZDSB "颜色自动识别"
+#define OPTION_VALUE_YSMS_YSZDSB "\351\242\234\350\211\262\350\207\252\345\212\250\350\257\206\345\210\253"
+
+// #define OPTION_TITLE_HBTXYZ "黑白图像阈值"
+#define OPTION_TITLE_HBTXYZ "\351\273\221\347\231\275\345\233\276\345\203\217\351\230\210\345\200\274"
+
+// #define OPTION_TITLE_HBTXFSSC "黑白图像反色输出"
+#define OPTION_TITLE_HBTXFSSC "\351\273\221\347\231\275\345\233\276\345\203\217\345\217\215\350\211\262\350\276\223\345\207\272"
+
+// #define OPTION_TITLE_HDHHBTX_CSYZQ "灰度或黑白图像 - 除色与增强"
+#define OPTION_TITLE_HDHHBTX_CSYZQ "\347\201\260\345\272\246\346\210\226\351\273\221\347\231\275\345\233\276\345\203\217 - \351\231\244\350\211\262\344\270\216\345\242\236\345\274\272"
+// #define OPTION_VALUE_HDHHBTX_CSYZQ_BCS "不除色"
+#define OPTION_VALUE_HDHHBTX_CSYZQ_BCS "\344\270\215\351\231\244\350\211\262"
+// #define OPTION_VALUE_HDHHBTX_CSYZQ_CHS "除红色"
+#define OPTION_VALUE_HDHHBTX_CSYZQ_CHS "\351\231\244\347\272\242\350\211\262"
+// #define OPTION_VALUE_HDHHBTX_CSYZQ_CLS "除绿色"
+#define OPTION_VALUE_HDHHBTX_CSYZQ_CLS "\351\231\244\347\273\277\350\211\262"
+// #define OPTION_VALUE_HDHHBTX_CSYZQ_CHULANSE "除蓝色"
+#define OPTION_VALUE_HDHHBTX_CSYZQ_CHULANSE "\351\231\244\350\223\235\350\211\262"
+// #define OPTION_VALUE_HDHHBTX_CSYZQ_HSZQ "红色增强"
+#define OPTION_VALUE_HDHHBTX_CSYZQ_HSZQ "\347\272\242\350\211\262\345\242\236\345\274\272"
+// #define OPTION_VALUE_HDHHBTX_CSYZQ_LSZQ "绿色增强"
+#define OPTION_VALUE_HDHHBTX_CSYZQ_LSZQ "\347\273\277\350\211\262\345\242\236\345\274\272"
+// #define OPTION_VALUE_HDHHBTX_CSYZQ_LANSEZENGQIANG "蓝色增强"
+#define OPTION_VALUE_HDHHBTX_CSYZQ_LANSEZENGQIANG "\350\223\235\350\211\262\345\242\236\345\274\272"
+
+// #define OPTION_TITLE_24WCSTX_DLSCCH "24位彩色图像 - 多流输出除红"
+#define OPTION_TITLE_24WCSTX_DLSCCH "24\344\275\215\345\275\251\350\211\262\345\233\276\345\203\217 - \345\244\232\346\265\201\350\276\223\345\207\272\351\231\244\347\272\242"
+
+// #define OPTION_TITLE_24WCSTX_DTKCH "24位彩色图像 - 答题卡除红"
+#define OPTION_TITLE_24WCSTX_DTKCH "24\344\275\215\345\275\251\350\211\262\345\233\276\345\203\217 - \347\255\224\351\242\230\345\215\241\351\231\244\347\272\242"
+
+// #define OPTION_TITLE_BJYC "背景移除"
+#define OPTION_TITLE_BJYC "\350\203\214\346\231\257\347\247\273\351\231\244"
+
+// #define OPTION_TITLE_BJSCFDFW "背景色彩浮动范围"
+#define OPTION_TITLE_BJSCFDFW "\350\203\214\346\231\257\350\211\262\345\275\251\346\265\256\345\212\250\350\214\203\345\233\264"
+
+// #define OPTION_TITLE_RHYMH "锐化与模糊"
+#define OPTION_TITLE_RHYMH "\351\224\220\345\214\226\344\270\216\346\250\241\347\263\212"
+// #define OPTION_VALUE_RHYMH_W "无"
+#define OPTION_VALUE_RHYMH_W "\346\227\240"
+// #define OPTION_VALUE_RHYMH_RH "锐化"
+#define OPTION_VALUE_RHYMH_RH "\351\224\220\345\214\226"
+// #define OPTION_VALUE_RHYMH_JYBRH "进一步锐化"
+#define OPTION_VALUE_RHYMH_JYBRH "\350\277\233\344\270\200\346\255\245\351\224\220\345\214\226"
+// #define OPTION_VALUE_RHYMH_MH "模糊"
+#define OPTION_VALUE_RHYMH_MH "\346\250\241\347\263\212"
+// #define OPTION_VALUE_RHYMH_JYBMH "进一步模糊"
+#define OPTION_VALUE_RHYMH_JYBMH "\350\277\233\344\270\200\346\255\245\346\250\241\347\263\212"
+
+// #define OPTION_TITLE_QCMW "去除摩尔纹"
+#define OPTION_TITLE_QCMW "\345\216\273\351\231\244\346\221\251\345\260\224\347\272\271"
+
+// #define OPTION_TITLE_CWW "除网纹"
+#define OPTION_TITLE_CWW "\351\231\244\347\275\221\347\272\271"
+
+// #define OPTION_TITLE_CWKS "错误扩散"
+#define OPTION_TITLE_CWKS "\351\224\231\350\257\257\346\211\251\346\225\243"
+
+// #define OPTION_TITLE_HBTXZDYH "黑白图像噪点优化"
+#define OPTION_TITLE_HBTXZDYH "\351\273\221\347\231\275\345\233\276\345\203\217\345\231\252\347\202\271\344\274\230\345\214\226"
+
+// #define OPTION_TITLE_ZDYHCC "噪点优化尺寸"
+#define OPTION_TITLE_ZDYHCC "\345\231\252\347\202\271\344\274\230\345\214\226\345\260\272\345\257\270"
+
+// #define OPTION_TITLE_ZZCC "纸张尺寸"
+#define OPTION_TITLE_ZZCC "\347\272\270\345\274\240\345\260\272\345\257\270"
+// #define OPTION_VALUE_ZZCC_A3 "A3"
+#define OPTION_VALUE_ZZCC_A3 "A3"
+// #define OPTION_VALUE_ZZCC_8K "8开"
+#define OPTION_VALUE_ZZCC_8K "8\345\274\200"
+// #define OPTION_VALUE_ZZCC_A4 "A4"
+#define OPTION_VALUE_ZZCC_A4 "A4"
+// #define OPTION_VALUE_ZZCC_A4HX "A4横向"
+#define OPTION_VALUE_ZZCC_A4HX "A4\346\250\252\345\220\221"
+// #define OPTION_VALUE_ZZCC_16K "16开"
+#define OPTION_VALUE_ZZCC_16K "16\345\274\200"
+// #define OPTION_VALUE_ZZCC_16KHX "16开横向"
+#define OPTION_VALUE_ZZCC_16KHX "16\345\274\200\346\250\252\345\220\221"
+// #define OPTION_VALUE_ZZCC_A5 "A5"
+#define OPTION_VALUE_ZZCC_A5 "A5"
+// #define OPTION_VALUE_ZZCC_A5HX "A5横向"
+#define OPTION_VALUE_ZZCC_A5HX "A5\346\250\252\345\220\221"
+// #define OPTION_VALUE_ZZCC_A6 "A6"
+#define OPTION_VALUE_ZZCC_A6 "A6"
+// #define OPTION_VALUE_ZZCC_A6HX "A6横向"
+#define OPTION_VALUE_ZZCC_A6HX "A6\346\250\252\345\220\221"
+// #define OPTION_VALUE_ZZCC_B4 "B4"
+#define OPTION_VALUE_ZZCC_B4 "B4"
+// #define OPTION_VALUE_ZZCC_B5 "B5"
+#define OPTION_VALUE_ZZCC_B5 "B5"
+// #define OPTION_VALUE_ZZCC_B5HX "B5横向"
+#define OPTION_VALUE_ZZCC_B5HX "B5\346\250\252\345\220\221"
+// #define OPTION_VALUE_ZZCC_B6 "B6"
+#define OPTION_VALUE_ZZCC_B6 "B6"
+// #define OPTION_VALUE_ZZCC_B6HX "B6横向"
+#define OPTION_VALUE_ZZCC_B6HX "B6\346\250\252\345\220\221"
+// #define OPTION_VALUE_ZZCC_Letter "Letter"
+#define OPTION_VALUE_ZZCC_Letter "Letter"
+// #define OPTION_VALUE_ZZCC_LetterHX "Letter横向"
+#define OPTION_VALUE_ZZCC_LetterHX "Letter\346\250\252\345\220\221"
+// #define OPTION_VALUE_ZZCC_DoubleLetter "Double Letter"
+#define OPTION_VALUE_ZZCC_DoubleLetter "Double Letter"
+// #define OPTION_VALUE_ZZCC_LEGAL "LEGAL"
+#define OPTION_VALUE_ZZCC_LEGAL "LEGAL"
+// #define OPTION_VALUE_ZZCC_PPYSCC "匹配原始尺寸"
+#define OPTION_VALUE_ZZCC_PPYSCC "\345\214\271\351\205\215\345\216\237\345\247\213\345\260\272\345\257\270"
+// #define OPTION_VALUE_ZZCC_ZDSMCCZDCQ "最大扫描尺寸自动裁切"
+#define OPTION_VALUE_ZZCC_ZDSMCCZDCQ "\346\234\200\345\244\247\346\211\253\346\217\217\345\260\272\345\257\270\350\207\252\345\212\250\350\243\201\345\210\207"
+// #define OPTION_VALUE_ZZCC_ZDSMCC "最大扫描尺寸"
+#define OPTION_VALUE_ZZCC_ZDSMCC "\346\234\200\345\244\247\346\211\253\346\217\217\345\260\272\345\257\270"
+// #define OPTION_VALUE_ZZCC_SLSJ "三联试卷"
+#define OPTION_VALUE_ZZCC_SLSJ "\344\270\211\350\201\224\350\257\225\345\215\267"
+
+// #define OPTION_TITLE_ZDYSMQY "自定义扫描区域"
+#define OPTION_TITLE_ZDYSMQY "\350\207\252\345\256\232\344\271\211\346\211\253\346\217\217\345\214\272\345\237\237"
+
+// #define OPTION_TITLE_SMQYZCmm "扫描区域左侧(mm)"
+#define OPTION_TITLE_SMQYZCmm "\346\211\253\346\217\217\345\214\272\345\237\237\345\267\246\344\276\247\357\274\210mm\357\274\211"
+
+// #define OPTION_TITLE_SMQYYCmm "扫描区域右侧(mm)"
+#define OPTION_TITLE_SMQYYCmm "\346\211\253\346\217\217\345\214\272\345\237\237\345\217\263\344\276\247\357\274\210mm\357\274\211"
+
+// #define OPTION_TITLE_SMQYSCmm "扫描区域上侧(mm)"
+#define OPTION_TITLE_SMQYSCmm "\346\211\253\346\217\217\345\214\272\345\237\237\344\270\212\344\276\247\357\274\210mm\357\274\211"
+
+// #define OPTION_TITLE_SMQYXCmm "扫描区域下侧(mm)"
+#define OPTION_TITLE_SMQYXCmm "\346\211\253\346\217\217\345\214\272\345\237\237\344\270\213\344\276\247\357\274\210mm\357\274\211"
+
+// #define OPTION_TITLE_CCJC "尺寸检测"
+#define OPTION_TITLE_CCJC "\345\260\272\345\257\270\346\243\200\346\265\213"
+
+// #define OPTION_TITLE_SMYM "扫描页面"
+#define OPTION_TITLE_SMYM "\346\211\253\346\217\217\351\241\265\351\235\242"
+// #define OPTION_VALUE_SMYM_DM "单面"
+#define OPTION_VALUE_SMYM_DM "\345\215\225\351\235\242"
+// #define OPTION_VALUE_SMYM_SM "双面"
+#define OPTION_VALUE_SMYM_SM "\345\217\214\351\235\242"
+// #define OPTION_VALUE_SMYM_TGKBYTY "跳过空白页(通用)"
+#define OPTION_VALUE_SMYM_TGKBYTY "\350\267\263\350\277\207\347\251\272\347\231\275\351\241\265\357\274\210\351\200\232\347\224\250\357\274\211"
+// #define OPTION_VALUE_SMYM_TGKBYFPZ "跳过空白页(发票纸)"
+#define OPTION_VALUE_SMYM_TGKBYFPZ "\350\267\263\350\277\207\347\251\272\347\231\275\351\241\265\357\274\210\345\217\221\347\245\250\347\272\270\357\274\211"
+// #define OPTION_VALUE_SMYM_DZ "对折"
+#define OPTION_VALUE_SMYM_DZ "\345\257\271\346\212\230"
+
+// #define OPTION_TITLE_TGKBYLMD "跳过空白页灵敏度"
+#define OPTION_TITLE_TGKBYLMD "\350\267\263\350\277\207\347\251\272\347\231\275\351\241\265\347\201\265\346\225\217\345\272\246"
+
+// #define OPTION_TITLE_FBL "分辨率"
+#define OPTION_TITLE_FBL "\345\210\206\350\276\250\347\216\207"
+
+// #define OPTION_TITLE_HZ "画质"
+#define OPTION_TITLE_HZ "\347\224\273\350\264\250"
+// #define OPTION_VALUE_HZ_W "无"
+#define OPTION_VALUE_HZ_W "\346\227\240"
+// #define OPTION_VALUE_HZ_SDYX "速度优先"
+#define OPTION_VALUE_HZ_SDYX "\351\200\237\345\272\246\344\274\230\345\205\210"
+// #define OPTION_VALUE_HZ_HZYX "画质优先"
+#define OPTION_VALUE_HZ_HZYX "\347\224\273\350\264\250\344\274\230\345\205\210"
+
+// #define OPTION_TITLE_JHZFM "交换正反面"
+#define OPTION_TITLE_JHZFM "\344\272\244\346\215\242\346\255\243\345\217\215\351\235\242"
+
+// #define OPTION_TITLE_QYSDQX "启用色调曲线"
+#define OPTION_TITLE_QYSDQX "\345\220\257\347\224\250\350\211\262\350\260\203\346\233\262\347\272\277"
+
+// #define OPTION_TITLE_LDZ "亮度值"
+#define OPTION_TITLE_LDZ "\344\272\256\345\272\246\345\200\274"
+
+// #define OPTION_TITLE_DBD "对比度"
+#define OPTION_TITLE_DBD "\345\257\271\346\257\224\345\272\246"
+
+// #define OPTION_TITLE_JMZ "伽马值"
+#define OPTION_TITLE_JMZ "\344\274\275\351\251\254\345\200\274"
+
+// #define OPTION_TITLE_ZDJP "自动纠偏"
+#define OPTION_TITLE_ZDJP "\350\207\252\345\212\250\347\272\240\345\201\217"
+
+// #define OPTION_TITLE_TXCF "图像拆分"
+#define OPTION_TITLE_TXCF "\345\233\276\345\203\217\346\213\206\345\210\206"
+
+// #define OPTION_TITLE_ZPMS "照片模式"
+#define OPTION_TITLE_ZPMS "\347\205\247\347\211\207\346\250\241\345\274\217"
+
+// #define OPTION_TITLE_XCHK "消除黑框"
+#define OPTION_TITLE_XCHK "\346\266\210\351\231\244\351\273\221\346\241\206"
+
+// #define OPTION_TITLE_BJTCFS "背景填充方式"
+#define OPTION_TITLE_BJTCFS "\350\203\214\346\231\257\345\241\253\345\205\205\346\226\271\345\274\217"
+// #define OPTION_VALUE_BJTCFS_TDBX "凸多边形"
+#define OPTION_VALUE_BJTCFS_TDBX "\345\207\270\345\244\232\350\276\271\345\275\242"
+// #define OPTION_VALUE_BJTCFS_ADBX "凹多边形"
+#define OPTION_VALUE_BJTCFS_ADBX "\345\207\271\345\244\232\350\276\271\345\275\242"
+
+// #define OPTION_TITLE_SCTC "色彩填充"
+#define OPTION_TITLE_SCTC "\350\211\262\345\275\251\345\241\253\345\205\205"
+
+// #define OPTION_TITLE_YZ "阈值"
+#define OPTION_TITLE_YZ "\351\230\210\345\200\274"
+
+// #define OPTION_TITLE_BJKZDJ "背景抗噪等级"
+#define OPTION_TITLE_BJKZDJ "\350\203\214\346\231\257\346\212\227\345\231\252\347\255\211\347\272\247"
+
+// #define OPTION_TITLE_BYSJ "边缘缩进"
+#define OPTION_TITLE_BYSJ "\350\276\271\347\274\230\347\274\251\350\277\233"
+
+// #define OPTION_TITLE_SSYZ "深色样张"
+#define OPTION_TITLE_SSYZ "\346\267\261\350\211\262\346\240\267\345\274\240"
+
+// #define OPTION_TITLE_FZST "防止渗透"
+#define OPTION_TITLE_FZST "\351\230\262\346\255\242\346\270\227\351\200\217"
+// #define OPTION_TITLE_FZSTDJ "防止渗透等级"
+#define OPTION_TITLE_FZSTDJ "\351\230\262\346\255\242\346\270\227\351\200\217\347\255\211\347\272\247"
+// #define OPTION_VALUE_FZSTDJ_R "弱"
+#define OPTION_VALUE_FZSTDJ_R "\345\274\261"
+// #define OPTION_VALUE_FZSTDJ_JR "较弱"
+#define OPTION_VALUE_FZSTDJ_JR "\350\276\203\345\274\261"
+// #define OPTION_VALUE_FZSTDJ_YB "一般"
+#define OPTION_VALUE_FZSTDJ_YB "\344\270\200\350\210\254"
+// #define OPTION_VALUE_FZSTDJ_JQ "较强"
+#define OPTION_VALUE_FZSTDJ_JQ "\350\276\203\345\274\272"
+// #define OPTION_VALUE_FZSTDJ_Q "强"
+#define OPTION_VALUE_FZSTDJ_Q "\345\274\272"
+
+// #define OPTION_TITLE_CKYC "穿孔移除"
+#define OPTION_TITLE_CKYC "\347\251\277\345\255\224\347\247\273\351\231\244"
+
+// #define OPTION_TITLE_CKSSFWZFMBL "穿孔搜索范围占幅面比例"
+#define OPTION_TITLE_CKSSFWZFMBL "\347\251\277\345\255\224\346\220\234\347\264\242\350\214\203\345\233\264\345\215\240\345\271\205\351\235\242\346\257\224\344\276\213"
+
+// #define OPTION_TITLE_CKYCZC "穿孔移除—左侧"
+#define OPTION_TITLE_CKYCZC "\347\251\277\345\255\224\347\247\273\351\231\244\342\200\224\345\267\246\344\276\247"
+
+// #define OPTION_TITLE_ZCCKSSFWZFMBL "左侧穿孔搜索范围占幅面比例"
+#define OPTION_TITLE_ZCCKSSFWZFMBL "\345\267\246\344\276\247\347\251\277\345\255\224\346\220\234\347\264\242\350\214\203\345\233\264\345\215\240\345\271\205\351\235\242\346\257\224\344\276\213"
+
+// #define OPTION_TITLE_CKYCYC "穿孔移除—右侧"
+#define OPTION_TITLE_CKYCYC "\347\251\277\345\255\224\347\247\273\351\231\244\342\200\224\345\217\263\344\276\247"
+
+// #define OPTION_TITLE_YCCKSSFWZFMBL "右侧穿孔搜索范围占幅面比例"
+#define OPTION_TITLE_YCCKSSFWZFMBL "\345\217\263\344\276\247\347\251\277\345\255\224\346\220\234\347\264\242\350\214\203\345\233\264\345\215\240\345\271\205\351\235\242\346\257\224\344\276\213"
+
+// #define OPTION_TITLE_CKYCSC "穿孔移除—上侧"
+#define OPTION_TITLE_CKYCSC "\347\251\277\345\255\224\347\247\273\351\231\244\342\200\224\344\270\212\344\276\247"
+
+// #define OPTION_TITLE_SCCKSSFWZFMBL "上侧穿孔搜索范围占幅面比例"
+#define OPTION_TITLE_SCCKSSFWZFMBL "\344\270\212\344\276\247\347\251\277\345\255\224\346\220\234\347\264\242\350\214\203\345\233\264\345\215\240\345\271\205\351\235\242\346\257\224\344\276\213"
+
+// #define OPTION_TITLE_CKYCXC "穿孔移除—下侧"
+#define OPTION_TITLE_CKYCXC "\347\251\277\345\255\224\347\247\273\351\231\244\342\200\224\344\270\213\344\276\247"
+
+// #define OPTION_TITLE_XCCKSSFWZFMBL "下侧穿孔搜索范围占幅面比例"
+#define OPTION_TITLE_XCCKSSFWZFMBL "\344\270\213\344\276\247\347\251\277\345\255\224\346\220\234\347\264\242\350\214\203\345\233\264\345\215\240\345\271\205\351\235\242\346\257\224\344\276\213"
+
+// #define OPTION_TITLE_DZSM "待纸扫描"
+#define OPTION_TITLE_DZSM "\345\276\205\347\272\270\346\211\253\346\217\217"
+
+// #define OPTION_TITLE_SMZS "扫描张数"
+#define OPTION_TITLE_SMZS "\346\211\253\346\217\217\345\274\240\346\225\260"
+// #define OPTION_VALUE_SMZS_LXSM "连续扫描"
+#define OPTION_VALUE_SMZS_LXSM "\350\277\236\347\273\255\346\211\253\346\217\217"
+// #define OPTION_VALUE_SMZS_SMZDZS "扫描指定张数"
+#define OPTION_VALUE_SMZS_SMZDZS "\346\211\253\346\217\217\346\214\207\345\256\232\345\274\240\346\225\260"
+
+// #define OPTION_TITLE_SMSL "扫描数量"
+#define OPTION_TITLE_SMSL "\346\211\253\346\217\217\346\225\260\351\207\217"
+
+// #define OPTION_TITLE_WGFX "文稿方向"
+#define OPTION_TITLE_WGFX "\346\226\207\347\250\277\346\226\271\345\220\221"
+// #define OPTION_VALUE_WGFX_0 "0°"
+#define OPTION_VALUE_WGFX_0 "0\302\260"
+// #define OPTION_VALUE_WGFX_90 "90°"
+#define OPTION_VALUE_WGFX_90 "90\302\260"
+// #define OPTION_VALUE_WGFX_180 "180°"
+#define OPTION_VALUE_WGFX_180 "180\302\260"
+// #define OPTION_VALUE_WGFX__90 "-90°"
+#define OPTION_VALUE_WGFX__90 "-90\302\260"
+// #define OPTION_VALUE_WGFX_ZDWBFXSB "自动文本方向识别°"
+#define OPTION_VALUE_WGFX_ZDWBFXSB "\350\207\252\345\212\250\346\226\207\346\234\254\346\226\271\345\220\221\350\257\206\345\210\253\302\260"
+
+// #define OPTION_TITLE_BMXZ180 "背面旋转180°"
+#define OPTION_TITLE_BMXZ180 "\350\203\214\351\235\242\346\227\213\350\275\254180\302\260"
+
+// #define OPTION_TITLE_CSBJC "超声波检测"
+#define OPTION_TITLE_CSBJC "\350\266\205\345\243\260\346\263\242\346\243\200\346\265\213"
+
+// #define OPTION_TITLE_SZTPCL "双张图片处理"
+#define OPTION_TITLE_SZTPCL "\345\217\214\345\274\240\345\233\276\347\211\207\345\244\204\347\220\206"
+// #define OPTION_VALUE_SZTPCL_DQTXBTZSM "丢弃图像并停止扫描"
+#define OPTION_VALUE_SZTPCL_DQTXBTZSM "\344\270\242\345\274\203\345\233\276\345\203\217\345\271\266\345\201\234\346\255\242\346\211\253\346\217\217"
+// #define OPTION_VALUE_SZTPCL_DQTXBJXSM "丢弃图像并继续扫描"
+#define OPTION_VALUE_SZTPCL_DQTXBJXSM "\344\270\242\345\274\203\345\233\276\345\203\217\345\271\266\347\273\247\347\273\255\346\211\253\346\217\217"
+// #define OPTION_VALUE_SZTPCL_SCTXBTZSM "上传图像并停止扫描"
+#define OPTION_VALUE_SZTPCL_SCTXBTZSM "\344\270\212\344\274\240\345\233\276\345\203\217\345\271\266\345\201\234\346\255\242\346\211\253\346\217\217"
+// #define OPTION_VALUE_SZTPCL_SCTXBJXSM "上传图像并继续扫描"
+#define OPTION_VALUE_SZTPCL_SCTXBJXSM "\344\270\212\344\274\240\345\233\276\345\203\217\345\271\266\347\273\247\347\273\255\346\211\253\346\217\217"
+
+// #define OPTION_TITLE_ZDJC "装订检测"
+#define OPTION_TITLE_ZDJC "\350\243\205\350\256\242\346\243\200\346\265\213"
+
+// #define OPTION_TITLE_WXJC "歪斜检测"
+#define OPTION_TITLE_WXJC "\346\255\252\346\226\234\346\243\200\346\265\213"
+
+// #define OPTION_TITLE_WXRRD "歪斜容忍度"
+#define OPTION_TITLE_WXRRD "\346\255\252\346\226\234\345\256\271\345\277\215\345\272\246"
+
+// #define OPTION_TITLE_ZJJC "折角检测"
+#define OPTION_TITLE_ZJJC "\346\212\230\350\247\222\346\243\200\346\265\213"
+
+// #define OPTION_TITLE_ZJDX "折角大小"
+#define OPTION_TITLE_ZJDX "\346\212\230\350\247\222\345\244\247\345\260\217"
+
+// #define OPTION_TITLE_FZQD "分纸强度"
+#define OPTION_TITLE_FZQD "\345\210\206\347\272\270\345\274\272\345\272\246"
+// #define OPTION_VALUE_FZQD_R "弱"
+#define OPTION_VALUE_FZQD_R "\345\274\261"
+// #define OPTION_VALUE_FZQD_YB "一般"
+#define OPTION_VALUE_FZQD_YB "\344\270\200\350\210\254"
+// #define OPTION_VALUE_FZQD_Q "强"
+#define OPTION_VALUE_FZQD_Q "\345\274\272"
+
+// #define OPTION_TITLE_XMSJ "休眠时间"
+#define OPTION_TITLE_XMSJ "\344\274\221\347\234\240\346\227\266\351\227\264"
+// #define OPTION_VALUE_XMSJ_BXM "不休眠"
+#define OPTION_VALUE_XMSJ_BXM "\344\270\215\344\274\221\347\234\240"
+// #define OPTION_VALUE_XMSJ_WFZ "五分钟"
+#define OPTION_VALUE_XMSJ_WFZ "\344\272\224\345\210\206\351\222\237"
+// #define OPTION_VALUE_XMSJ_SFZ "十分钟"
+#define OPTION_VALUE_XMSJ_SFZ "\345\215\201\345\210\206\351\222\237"
+// #define OPTION_VALUE_XMSJ_BXS "半小时"
+#define OPTION_VALUE_XMSJ_BXS "\345\215\212\345\260\217\346\227\266"
+// #define OPTION_VALUE_XMSJ_YXS "一小时"
+#define OPTION_VALUE_XMSJ_YXS "\344\270\200\345\260\217\346\227\266"
+// #define OPTION_VALUE_XMSJ_LXS "两小时"
+#define OPTION_VALUE_XMSJ_LXS "\344\270\244\345\260\217\346\227\266"
+// #define OPTION_VALUE_XMSJ_SXS "四小时"
+#define OPTION_VALUE_XMSJ_SXS "\345\233\233\345\260\217\346\227\266"
+
+// #define OPTION_TITLE_ZDFZQD "自动分纸强度"
+#define OPTION_TITLE_ZDFZQD "\350\207\252\345\212\250\345\210\206\347\272\270\345\274\272\345\272\246"
+
+// #define OPTION_TITLE_JZSBL "进纸失败率"
+#define OPTION_TITLE_JZSBL "\350\277\233\347\272\270\345\244\261\350\264\245\347\216\207"
+
+//#define OPTION_TITLE_DZMS "对折模式"
+#define OPTION_TITLE_DZMS "\345\257\271\346\212\230\346\250\241\345\274\217"
+//#define OPTION_VALUE_ZYDZ "左右对折"
+#define OPTION_VALUE_ZYDZ "\345\267\246\345\217\263\345\257\271\346\212\230"
+//#define OPTION_VALUE_SXDZ "上下对折"
+#define OPTION_VALUE_SXDZ "\344\270\212\344\270\213\345\257\271\346\212\230"
+//#define OPTION_VALUE_SXDZ "自动对折"
+#define OPTION_VALUE_ZDDZ "\350\207\252\345\212\250\345\257\271\346\212\230"
+
+
+
+
+////////////////////////////////////////////////////////////////
+// reserved ...
+////////////////////////////////////////////////////////////////
+#define OPTION_TITLE_GMZ OPTION_TITLE_JMZ
+
+
+////////////////////////////////////////////////////////////////
+// string compare ...
+////////////////////////////////////////////////////////////////
+#define IMPLEMENT_OPTION_STRING_COMPARE(func_name) \
+ bool func_name(const char* opt_define, const char* value) \
+ { \
+ while(*value++ == L' '); \
+ value--; \
+ return strcmp(opt_define, value) == 0; \
+ }
+
+
diff --git a/code/base/sane/sanei.h b/code/base/sane/sanei.h
new file mode 100644
index 0000000..ece1beb
--- /dev/null
+++ b/code/base/sane/sanei.h
@@ -0,0 +1,160 @@
+/* sane - Scanner Access Now Easy.
+ Copyright (C) 1996 David Mosberger-Tang and Andreas Beck
+ Copyright (C) 2002, 2003 Henning Meier-Geinitz
+
+ This file is part of the SANE package.
+
+ SANE 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.
+
+ SANE 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 sane; see the file COPYING. If not, write to the Free
+ Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, 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.
+*/
+
+/** @file sanei.h
+ * Convenience macros and function declarations for backends
+ * @sa sanei_backend.h sanei_thread.h
+ */
+
+/* Doxygen documentation */
+
+/** @mainpage SANEI (SANE internal routines) documentation
+ *
+ * @image html sane-logo2.jpg
+ * @section intro Introduction
+ *
+ * The header files in the include/sane/ directory named sanei_*.h provide
+ * function declarations and macros that can be used by every SANE backend.
+ * Their implementations can be found in the sanei/ directory. The code aims
+ * to be platform-independent to avoid lots of \#ifdef code in the backends.
+ * Please use the SANEI functions wherever possible.
+ *
+ * This documentation was created by the use of doxygen, the
+ * doc/doxygen-sanei.conf configuration file and documentation in the sanei_*.h
+ * files.
+ *
+ * This documentation is far from complete. Any help is appreciated.
+ *
+ * @section additional Additional documentation
+ * - The SANE standard can be found at the SANE webserver,
+ * though the PostScript version produced from the source may be more recent.
+ * - Information on how to write a backend: backend-writing.txt.
+ * - General SANE documentation is on the SANE documentation
+ * page.
+ *
+ * @section contact Contact
+ *
+ * The common way to contact the developers of SANE is the sane-devel
+ * mailing list. See the mailing list webpage
+ * for details. That's the place to ask questions, report bugs, or announce
+ * a new backend.
+ *
+ */
+
+#ifndef sanei_h
+#define sanei_h
+
+#include
+
+/** @name Public macros and functions
+ * @{
+ */
+/** @def STRINGIFY(x)
+ * Turn parameter into string.
+ */
+/** @def PASTE(x,y)
+ * Concatenate parameters.
+ *
+ */
+/** @def NELEMS(a)
+ * Return number of elements of an array.
+ *
+ */
+
+/** @fn extern SANE_Status sanei_check_value (const SANE_Option_Descriptor * opt, void * value);
+ * Check the constraints of a SANE option.
+ *
+ * @param opt option to check
+ * @param value value of the option
+ *
+ * @return
+ * - SANE_STATUS_GOOD - on success
+ * - SANE_STATUS_INVAL - if the value doesn't fit inside the constraint
+ * or any other error occured
+ * @sa sanei_constrain_value()
+ */
+
+/** @fn extern SANE_Status sanei_constrain_value (const SANE_Option_Descriptor * opt, void * value, SANE_Word * info);
+ * Check the constraints of a SANE option and adjust its value if necessary.
+ *
+ * Depending on the type of the option and constraint, value is modified
+ * to fit inside constraint.
+ *
+ * @param opt option to check
+ * @param value value of the option
+ * @param info info is set to SANE_INFO_INEXACT if value was changed
+ *
+ * @return
+ * - SANE_STATUS_GOOD - on success
+ * - SANE_STATUS_INVAL - if the function wasn't able to fit value into the
+ * constraint or any other error occured
+ * @sa sanei_check_value()
+ */
+
+/* @} */
+
+/* A few convenience macros: */
+/** @hideinitializer */
+#define NELEMS(a) ((int)(sizeof (a) / sizeof (a[0])))
+
+/** @hideinitializer */
+#define STRINGIFY1(x) #x
+/** @hideinitializer */
+#define STRINGIFY(x) STRINGIFY1(x)
+
+/** @hideinitializer */
+#define PASTE1(x,y) x##y
+/** @hideinitializer */
+#define PASTE(x,y) PASTE1(x,y)
+
+extern SANE_Status sanei_check_value (const SANE_Option_Descriptor * opt,
+ void * value);
+
+extern SANE_Status sanei_constrain_value (const SANE_Option_Descriptor * opt,
+ void * value, SANE_Word * info);
+
+
+#endif /* sanei_h */
diff --git a/code/base/sane/sanei_backend.h b/code/base/sane/sanei_backend.h
new file mode 100644
index 0000000..d5c7ebe
--- /dev/null
+++ b/code/base/sane/sanei_backend.h
@@ -0,0 +1,188 @@
+/** @file sanei_backend.h
+ * Compatibility header file for backends
+ *
+ * This file provides some defines for macros missing on some platforms.
+ * It also has the SANE API entry points. sanei_backend.h must be included
+ * by every backend.
+ *
+ * @sa sanei.h sanei_thread.h
+ */
+
+
+/*
+ * Compiler related options
+ */
+
+/** Mark unused variables/parameters
+ *
+ * Tells the compiler a variable is unused, so the compiler doesn't spit a warning.
+ */
+#ifdef __GNUC__
+#define __sane_unused__ __attribute__((unused))
+#else
+#define __sane_unused__
+#endif
+
+/** @name Compatibility macros
+ * @{
+ */
+#include "sanei_debug.h"
+
+#ifdef HAVE_SYS_HW_H
+ /* OS/2 i/o-port access compatibility macros: */
+# define inb(p) _inp8 (p)
+# define outb(v,p) _outp8 ((p),(v))
+# define ioperm(b,l,o) _portaccess ((b),(b)+(l)-1)
+# define HAVE_IOPERM 1
+#endif
+
+#ifndef HAVE_OS2_H
+#include
+#ifndef O_NONBLOCK
+# ifdef O_NDELAY
+# define O_NONBLOCK O_NDELAY
+# else
+# ifdef FNDELAY
+# define O_NONBLOCK FNDELAY /* last resort */
+# endif
+# endif
+#endif
+#endif /* HAVE_OS2_H */
+
+#include
+#ifndef PATH_MAX
+# define PATH_MAX 1024
+#endif
+
+#ifndef M_PI
+#define M_PI 3.14159265358979323846
+#endif
+
+#ifndef MM_PER_INCH
+#define MM_PER_INCH 25.4
+#endif
+
+#ifdef HAVE_SIGPROCMASK
+# define SIGACTION sigaction
+#else
+
+/* Just enough backwards compatibility that we get by in the backends
+ without making handstands. */
+# ifdef sigset_t
+# undef sigset_t
+# endif
+# ifdef sigemptyset
+# undef sigemptyset
+# endif
+# ifdef sigfillset
+# undef sigfillset
+# endif
+# ifdef sigaddset
+# undef sigaddset
+# endif
+# ifdef sigdelset
+# undef sigdelset
+# endif
+# ifdef sigprocmask
+# undef sigprocmask
+# endif
+# ifdef SIG_BLOCK
+# undef SIG_BLOCK
+# endif
+# ifdef SIG_UNBLOCK
+# undef SIG_UNBLOCK
+# endif
+# ifdef SIG_SETMASK
+# undef SIG_SETMASK
+# endif
+
+# define sigset_t int
+# define sigemptyset(set) do { *(set) = 0; } while (0)
+# define sigfillset(set) do { *(set) = ~0; } while (0)
+# define sigaddset(set,signal) do { *(set) |= sigmask (signal); } while (0)
+# define sigdelset(set,signal) do { *(set) &= ~sigmask (signal); } while (0)
+# define sigaction(sig,new,old) sigvec (sig,new,old)
+
+ /* Note: it's not safe to just declare our own "struct sigaction" since
+ some systems (e.g., some versions of OpenStep) declare that structure,
+ but do not implement sigprocmask(). Hard to believe, aint it? */
+# define SIGACTION sigvec
+# define SIG_BLOCK 1
+# define SIG_UNBLOCK 2
+# define SIG_SETMASK 3
+#endif /* !HAVE_SIGPROCMASK */
+/* @} */
+
+
+/** @name Declaration of entry points:
+ * @{
+ */
+extern SANE_Status ENTRY(init) (SANE_Int *, SANE_Auth_Callback);
+extern SANE_Status ENTRY(get_devices) (const SANE_Device ***, SANE_Bool);
+extern SANE_Status ENTRY(open) (SANE_String_Const, SANE_Handle *);
+extern const SANE_Option_Descriptor *
+ ENTRY(get_option_descriptor) (SANE_Handle, SANE_Int);
+extern SANE_Status ENTRY(control_option) (SANE_Handle, SANE_Int, SANE_Action,
+ void *, SANE_Word *);
+extern SANE_Status ENTRY(get_parameters) (SANE_Handle, SANE_Parameters *);
+extern SANE_Status ENTRY(start) (SANE_Handle);
+extern SANE_Status ENTRY(read) (SANE_Handle, SANE_Byte *, SANE_Int,
+ SANE_Int *);
+extern SANE_Status ENTRY(set_io_mode) (SANE_Handle, SANE_Bool);
+extern SANE_Status ENTRY(get_select_fd) (SANE_Handle, SANE_Int *);
+extern void ENTRY(cancel) (SANE_Handle);
+extern void ENTRY(close) (SANE_Handle);
+extern void ENTRY(exit) (void);
+extern void sanei_debug_msg(int level, int max_level, const char* be, const char* fmt, va_list ap);
+
+#ifndef STUBS
+/* Now redirect sane_* calls to backend's functions: */
+
+#define sane_init(a,b) ENTRY(init) (a,b)
+#define sane_get_devices(a,b) ENTRY(get_devices) (a,b)
+#define sane_open(a,b) ENTRY(open) (a,b)
+#define sane_get_option_descriptor(a,b) ENTRY(get_option_descriptor) (a,b)
+#define sane_control_option(a,b,c,d,e) ENTRY(control_option) (a,b,c,d,e)
+#define sane_get_parameters(a,b) ENTRY(get_parameters) (a,b)
+#define sane_start(a) ENTRY(start) (a)
+#define sane_read(a,b,c,d) ENTRY(read) (a,b,c,d)
+#define sane_set_io_mode(a,b) ENTRY(set_io_mode) (a,b)
+#define sane_get_select_fd(a,b) ENTRY(get_select_fd) (a,b)
+#define sane_cancel(a) ENTRY(cancel) (a)
+#define sane_close(a) ENTRY(close) (a)
+#define sane_exit(a) ENTRY(exit) (a)
+#define sane_strstatus(a) ENTRY(strstatus)(a)
+
+////////////////////////////////////////////////////////////////////////////////
+// extension for standard SANE ...
+#define sane_init_ex(a, b, c) ENTRY(init_ex) (a,b,c)
+#define sane_io_control(a,b,c,d) ENTRY(io_control)(a,b,c,d)
+#define sane_err_desc(a) ENTRY(err_desc)(a)
+
+#endif /* STUBS */
+/* @} */
+
+/** Internationalization for SANE backends
+ *
+ * Add SANE_I18N() to all texts that can be translated.
+ * E.g. out_txt = SANE_I18N("Hello");
+ */
+#ifndef SANE_I18N
+#define SANE_I18N(text) text
+#endif
+
+/** Option_Value union
+ *
+ * Convenience union to access option values given to the backend
+ */
+#ifndef SANE_OPTION
+typedef union
+{
+ SANE_Bool b; /**< bool */
+ SANE_Word w; /**< word */
+ SANE_Word *wa; /**< word array */
+ SANE_String s; /**< string */
+}
+Option_Value;
+#define SANE_OPTION 1
+#endif
diff --git a/code/base/sane/sanei_debug.h b/code/base/sane/sanei_debug.h
new file mode 100644
index 0000000..557f8a7
--- /dev/null
+++ b/code/base/sane/sanei_debug.h
@@ -0,0 +1,153 @@
+/** @file sanei_debug.h
+ * Support for printing debug messages.
+ *
+ * Use the functions of this header file to print debug or warning messages.
+ */
+
+#ifndef _SANEI_DEBUG_H
+#define _SANEI_DEBUG_H
+
+#include
+
+/** @name Public macros
+ * These macros can be used in backends and other SANE-related
+ * code.
+ *
+ * Before including sanei_debug.h, the following macros must be set:
+ *
+ * - BACKEND_NAME - The name of your backend without double-quotes (must be set in any case)
+ * - STUBS - If this is defined, no macros will be included. Used in
+ * backends consisting of more than one .c file.
+ * - DEBUG_DECLARE_ONLY - Generates prototypes instead of functions. Used in
+ * backends consisting of more than one .c file.
+ * - DEBUG_NOT_STATIC - Doesn't generate static functions. Used in header files if
+ * they are include in more than one .c file.
+ *
+ * @{
+ */
+
+/** @def DBG_INIT()
+ * Initialize sanei_debug.
+ *
+ * Call this function before you use any DBG function.
+ */
+
+/** @def DBG(level, fmt, ...)
+ * Print a message at debug level `level' or higher using a printf-like
+ * function. Example: DBG(1, "sane_open: opening fd \%d\\n", fd).
+ *
+ * @param level debug level
+ * @param fmt format (see man 3 printf for details)
+ * @param ... additional arguments
+ */
+
+/** @def IF_DBG(x)
+ * Compile code only if debugging is enabled.
+ *
+ * Expands to x if debug support is enabled at compile-time. If NDEBUG is
+ * defined at compile-time this macro expands to nothing.
+ *
+ * @param x code to expand when debugging is enabled
+ */
+
+/**
+ * @def DBG_LEVEL
+ * Current debug level.
+ *
+ * You can only read this "variable".
+ */
+
+/** @def ENTRY(name)
+ * Expands to sane_BACKEND_NAME_name.
+ *
+ * Example: ENTRY(init) in mustek.c will expand to sane_mustek_init.
+ */
+
+/* @} */
+
+
+ /** @hideinitializer*/
+#define ENTRY(name) PASTE(PASTE(PASTE(sane_,BACKEND_NAME),_),name)
+
+#ifdef NDEBUG
+
+extern void sanei_debug_ndebug (int level, const char *msg, ...);
+
+# define DBG_LEVEL (0)
+# define DBG_INIT()
+# define DBG sanei_debug_ndebug
+# define IF_DBG(x)
+
+#else /* !NDEBUG */
+
+ /** @hideinitializer*/
+# define DBG_LEVEL PASTE(sanei_debug_,BACKEND_NAME)
+
+# if defined(BACKEND_NAME) && !defined(STUBS)
+# ifdef DEBUG_DECLARE_ONLY
+extern int DBG_LEVEL;
+# else /* !DEBUG_DECLARE_ONLY */
+int DBG_LEVEL = 0;
+# endif /* DEBUG_DECLARE_ONLY */
+# endif /* BACKEND_NAME && !STUBS */
+
+ /** @hideinitializer*/
+# define DBG_INIT() \
+ sanei_init_debug (STRINGIFY(BACKEND_NAME), &DBG_LEVEL)
+
+ /** @hideinitializer*/
+# define DBG_LOCAL PASTE(DBG_LEVEL,_call)
+
+
+# ifndef STUBS
+
+# ifdef DEBUG_DECLARE_ONLY
+
+extern void DBG_LOCAL (int level, const char *msg, ...)
+#ifdef __GNUC__
+__attribute__ ((format (printf, 2, 3)))
+#endif
+;
+
+# else /* !DEBUG_DECLARE_ONLY */
+
+# include
+
+extern void sanei_debug_msg
+ (int level, int max_level, const char *be, const char *fmt, va_list ap);
+
+#ifdef __GNUC__
+# ifndef DEBUG_NOT_STATIC
+static
+# endif /* !DEBUG_NOT_STATIC */
+void DBG_LOCAL (int level, const char *msg, ...) __attribute__ ((format (printf, 2, 3)));
+#endif /* __GNUC__ */
+
+# ifndef DEBUG_NOT_STATIC
+static
+# endif /* !DEBUG_NOT_STATIC */
+void
+DBG_LOCAL (int level, const char *msg, ...)
+{
+ va_list ap;
+
+ va_start (ap, msg);
+ sanei_debug_msg (level, DBG_LEVEL, STRINGIFY(BACKEND_NAME), msg, ap);
+ va_end (ap);
+}
+
+# endif /* DEBUG_DECLARE_ONLY */
+
+# endif /* !STUBS */
+
+ /** @hideinitializer*/
+# define DBG DBG_LOCAL
+
+extern void sanei_init_debug (const char * backend, int * debug_level_var);
+
+ /** @hideinitializer*/
+# define IF_DBG(x) x
+
+#endif /* NDEBUG */
+
+#endif /* _SANEI_DEBUG_H */