code_device/twain/ds/s2t.cpp

541 lines
15 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "s2t_api.h"
#include "../../../sdk/include/sane/sane_option_definitions.h"
#include "scanned_img.h"
// 标准TWAIN属性值与SANE属性值之间的转换
//
// FIXED ME: all values should come from SANE but not static columns here !!!
//
namespace s2t
{
enum Language // copy from <twain/twpp/enums.hpp>
{
English = 2,
ChineseSimplified = 41,
ChineseTraditional = 43,
};
enum Filter // copy from <twain/twpp/enums.hpp>
{
Red = 0,
Green = 1,
Blue = 2,
None = 3,
};
static struct
{
int twain_id;
const char* opt_val;
}
g_color_mode_map[] = { {COLOR_BW, OPTION_VALUE_YSMS_HB}
, {COLOR_GRAY, OPTION_VALUE_YSMS_256JHD}
, {COLOR_RGB, OPTION_VALUE_YSMS_24WCS}
, {COLOR_AUTO_MATCH, OPTION_VALUE_YSMS_YSZDSB}
},
g_multiout_map[] = { {MULTI_OUT_NONE, "\346\227\240"}
, {MULTI_OUT_ALL, OPTION_VALUE_DLSCLX_CS_HD_HB}
, {MULTI_OUT_COLOR_GRAY, OPTION_VALUE_DLSCLX_CS_HD}
, {MULTI_OUT_COLOR_BW, OPTION_VALUE_DLSCLX_CS_HB}
, {MULTI_OUT_GRAY_BW, OPTION_VALUE_DLSCLX_HD_HB}
},
g_enhance_map[] = { {ENHANCE_NONE, OPTION_VALUE_HDHHBTX_CSYZQ_BCS}
, {ENHANCE_RED, OPTION_VALUE_HDHHBTX_CSYZQ_HSZQ}
, {ENHANCE_GREEN, OPTION_VALUE_HDHHBTX_CSYZQ_LSZQ}
, {ENHANCE_BLUE, OPTION_VALUE_HDHHBTX_CSYZQ_LANSEZENGQIANG}
},
g_filter_map[] = { {FILTER_NONE, OPTION_VALUE_HDHHBTX_CSYZQ_BCS}
, {FILTER_RED, OPTION_VALUE_HDHHBTX_CSYZQ_CHS}
, {FILTER_GREEN, OPTION_VALUE_HDHHBTX_CSYZQ_CLS}
, {FILTER_BLUE, OPTION_VALUE_HDHHBTX_CSYZQ_CHULANSE}
},
g_auto_color_map[] = { {0, OPTION_VALUE_YSMS_HB}
, {1, OPTION_VALUE_YSMS_256JHD}
},
g_sharpen_map[] = { {SHARPEN_NONE, OPTION_VALUE_RHYMH_W}
, {SHARPEN_SHARPEN, OPTION_VALUE_RHYMH_RH}
, {SHARPEN_SHARPEN_MORE, OPTION_VALUE_RHYMH_JYBRH}
, {SHARPEN_BLUR, OPTION_VALUE_RHYMH_MH}
, {SHARPEN_BLUR_MORE, OPTION_VALUE_RHYMH_JYBMH}
},
g_paper_map[] = { {PAPER_LETTER, OPTION_VALUE_ZZCC_Letter}
,{PAPER_LETTER, OPTION_VALUE_ZZCC_LetterHX}
, {PAPER_LEGAL, OPTION_VALUE_ZZCC_LEGAL}
//, {PAPER_8K, OPTION_VALUE_ZZCC_8K}
//, {PAPER_16K, OPTION_VALUE_ZZCC_16K}
, {PAPER_A3, OPTION_VALUE_ZZCC_A3}
, {PAPER_A4, OPTION_VALUE_ZZCC_A4}
, {PAPER_A5, OPTION_VALUE_ZZCC_A5}
, {PAPER_A6, OPTION_VALUE_ZZCC_A6}
, {PAPER_A4, OPTION_VALUE_ZZCC_A4HX}
, {PAPER_A5, OPTION_VALUE_ZZCC_A5HX}
, {PAPER_A6, OPTION_VALUE_ZZCC_A6HX}
, {PAPER_B4, OPTION_VALUE_ZZCC_B4}
, {PAPER_B5, OPTION_VALUE_ZZCC_B5}
, {PAPER_B6, OPTION_VALUE_ZZCC_B6}
, {PAPER_B5, OPTION_VALUE_ZZCC_B5HX}
, {PAPER_B6, OPTION_VALUE_ZZCC_B6HX}
, {PAPER_STATEMENT, OPTION_VALUE_ZZCC_PPYSCC}
, {PAPER_MAXSIZE, OPTION_VALUE_ZZCC_ZDSMCC}
, {PAPER_MAXSIZE_CROP, OPTION_VALUE_ZZCC_ZDSMCCZDCQ}
, {PAPER_DOUBLE_LETTER, OPTION_VALUE_ZZCC_DoubleLetter}
, {PAPER_TRIPPLE, OPTION_VALUE_ZZCC_SLSJ}
},
g_power[] = { {SANE_POWER_MINUTES_5, OPTION_VALUE_XMSJ_WFZ}
, {SANE_POWER_MINUTES_10, OPTION_VALUE_XMSJ_SFZ}
, {SANE_POWER_MINUTES_30, OPTION_VALUE_XMSJ_BXS}
, {SANE_POWER_MINUTES_60, OPTION_VALUE_XMSJ_YXS}
, {SANE_POWER_MINUTES_120, OPTION_VALUE_XMSJ_LXS}
, {SANE_POWER_MINUTES_240, OPTION_VALUE_XMSJ_SXS}
},
g_language[] = { {Language::ChineseSimplified, "\344\270\255\346\226\207\357\274\210\347\256\200\344\275\223\357\274\211"}
, {Language::ChineseTraditional, "\344\270\255\346\226\207\357\274\210\347\271\201\344\275\223\357\274\211"}
, {Language::English, "\350\213\261\350\257\255"}
}
;
#define TO_TWAIN(a, s) \
for(auto& v: a) \
{ \
if(strcmp(v.opt_val, local_trans::to_default_language(s)) == 0) \
return v.twain_id; \
}
#define FROM_TWAIN(a, t) \
for(auto& v: a) \
{ \
if(v.twain_id == t) \
return local_trans::from_default_language(v.opt_val); \
}
// 页面 与 双面转换
bool page_is_duplex(const char* sane_val)
{
return strcmp(sane_val, local_trans::from_default_language(OPTION_VALUE_SMYM_SM)) == 0;
}
std::string page_from_duplex(bool duplex)
{
if (duplex)
return local_trans::from_default_language(OPTION_VALUE_SMYM_SM);
else
return local_trans::from_default_language(OPTION_VALUE_SMYM_DM);
}
// 页面 与 丢弃空白页
bool discard_blank_from_sane(const char* sane_val)
{
std::string val(local_trans::to_default_language(sane_val));
return val == OPTION_VALUE_SMYM_TGKBYFPZ || val == OPTION_VALUE_SMYM_TGKBYTY;
}
std::string discard_blank_to_sane(bool discard)
{
if (discard)
return local_trans::from_default_language(OPTION_VALUE_SMYM_TGKBYTY);
else
return local_trans::from_default_language(OPTION_VALUE_SMYM_SM);
}
// 页面 与 丢弃空白发票
bool discard_blank_receipt_from_sane(const char* sane_val)
{
std::string val(local_trans::to_default_language(sane_val));
return val == OPTION_VALUE_SMYM_TGKBYFPZ;
}
std::string discard_blank_receipt_to_sane(bool discard)
{
if (discard)
return local_trans::from_default_language(OPTION_VALUE_SMYM_TGKBYFPZ);
else
return local_trans::from_default_language(OPTION_VALUE_SMYM_SM);
}
// 页面 与 对折
bool fold_from_sane(const char* sane_val)
{
std::string val(local_trans::to_default_language(sane_val));
return val == OPTION_VALUE_SMYM_DZ;
}
std::string fold_to_sane(bool fold)
{
if (fold)
return local_trans::from_default_language(OPTION_VALUE_SMYM_DZ);
else
return local_trans::from_default_language(OPTION_VALUE_SMYM_SM);
}
// 语言
int language_to_twain(const char* sane_val)
{
TO_TWAIN(g_language, sane_val);
return Language::ChineseSimplified;
}
std::string language_from_twain(int twain)
{
FROM_TWAIN(g_language, twain);
FROM_TWAIN(g_language, Language::ChineseSimplified);
}
// 位深 与 颜色模式
int bits_from_sane(const char* color_mode)
{
std::string curl(local_trans::to_default_language(color_mode));
if (curl == OPTION_VALUE_YSMS_HB)
return 1;
else if (curl == OPTION_VALUE_YSMS_256JHD)
return 8;
else
return 24;
}
std::string bits_to_sane(int bits)
{
if(bits == 1)
return local_trans::from_default_language(OPTION_VALUE_YSMS_HB);
else if(bits == 8)
return local_trans::from_default_language(OPTION_VALUE_YSMS_256JHD);
else
return local_trans::from_default_language(OPTION_VALUE_YSMS_24WCS);
}
// PixelType 与 颜色模式
int pixel_type_from_sane(const char* color_mode)
{
TO_TWAIN(g_color_mode_map, color_mode);
return COLOR_RGB;
}
std::string pixel_type_to_sane(int pixel)
{
FROM_TWAIN(g_color_mode_map, pixel);
return local_trans::from_default_language(OPTION_VALUE_YSMS_24WCS);
}
// 自动颜色匹配 与 颜色模式
bool color_mode_is_auto(const char* color_mode)
{
return strcmp(color_mode, local_trans::from_default_language(OPTION_VALUE_YSMS_YSZDSB)) == 0;
}
std::string color_mode_from_auto(bool auto_mode)
{
if (auto_mode)
return local_trans::from_default_language(OPTION_VALUE_YSMS_YSZDSB);
else
return local_trans::from_default_language(OPTION_VALUE_YSMS_24WCS);
}
// 支持的尺寸 与 纸张
int paper_size_from_sane(const char* sane_val)
{
TO_TWAIN(g_paper_map, sane_val);
return PAPER_STATEMENT;
}
std::string paper_size_to_sane(int paper)
{
FROM_TWAIN(g_paper_map, paper);
return local_trans::from_default_language(OPTION_VALUE_ZZCC_PPYSCC);
}
// 横向 与 纸张
bool lateral_from_sane(const char* sane_val, bool* support_lateral)
{
bool ret = false,
sup = false;
std::string val(local_trans::to_default_language(sane_val));
if (val == OPTION_VALUE_ZZCC_A4)
{
sup = true;
}
else if (val == OPTION_VALUE_ZZCC_A4HX)
{
sup = true;
ret = true;
}
else if (val == OPTION_VALUE_ZZCC_A5)
{
sup = true;
}
else if (val == OPTION_VALUE_ZZCC_A5HX)
{
sup = true;
ret = true;
}
else if (val == OPTION_VALUE_ZZCC_A6)
{
sup = true;
}
else if (val == OPTION_VALUE_ZZCC_A6HX)
{
sup = true;
ret = true;
}
else if (val == OPTION_VALUE_ZZCC_B5)
{
sup = true;
}
else if (val == OPTION_VALUE_ZZCC_B5HX)
{
sup = true;
ret = true;
}
else if (val == OPTION_VALUE_ZZCC_B6)
{
sup = true;
}
else if (val == OPTION_VALUE_ZZCC_B6HX)
{
sup = true;
ret = true;
}
else if (val == OPTION_VALUE_ZZCC_Letter)
{
sup = true;
}
else if (val == OPTION_VALUE_ZZCC_LetterHX)
{
sup = true;
ret = true;
}
if (support_lateral)
*support_lateral = sup;
return ret;
}
std::string lateral_to_sane(const char* sane_val, bool lateral) // 如果sane_val不支持横向则返回sane_val确定是否支持横向请调用lateral_from_sane
{
std::string ret(sane_val), val(local_trans::to_default_language(sane_val));
if (lateral)
{
#define TRY_LATERAL(paper) \
if(val == OPTION_VALUE_ZZCC_##paper) \
ret = local_trans::from_default_language(OPTION_VALUE_ZZCC_##paper##HX);
TRY_LATERAL(A4)
else TRY_LATERAL(A5)
else TRY_LATERAL(A6)
else TRY_LATERAL(B5)
else TRY_LATERAL(B6)
else TRY_LATERAL(Letter)
}
else
{
#define TRY_NON_LATERAL(paper) \
if(val == OPTION_VALUE_ZZCC_##paper##HX) \
ret = local_trans::from_default_language(OPTION_VALUE_ZZCC_##paper);
TRY_NON_LATERAL(A4)
else TRY_NON_LATERAL(A5)
else TRY_NON_LATERAL(A6)
else TRY_NON_LATERAL(B5)
else TRY_NON_LATERAL(B6)
else TRY_NON_LATERAL(Letter)
}
return std::move(ret);
}
// 自动尺寸 与 纸张
bool auto_size_from_sane(const char* sane_val)
{
std::string val(local_trans::to_default_language(sane_val));
return val == OPTION_VALUE_ZZCC_PPYSCC;
}
std::string auto_size_to_sane(bool autos)
{
return local_trans::from_default_language(OPTION_VALUE_ZZCC_PPYSCC); // 因为默认值也为该值,所以固定返回此值。
}
// 自动裁切 与 纸张
bool auto_crop_from_sane(const char* sane_val)
{
std::string val(local_trans::to_default_language(sane_val));
return val == OPTION_VALUE_ZZCC_ZDSMCCZDCQ;
}
std::string auto_crop_to_sane(bool autos)
{
if(autos)
return local_trans::from_default_language(OPTION_VALUE_ZZCC_ZDSMCCZDCQ);
else
return local_trans::from_default_language(OPTION_VALUE_ZZCC_PPYSCC);
}
// 旋转角度 与 送纸方向
double rotation_from_sane(const char* sane_val)
{
std::string val(local_trans::to_default_language(sane_val));
if (val == OPTION_VALUE_WGFX_90)
return 90.0f;
else if (val == OPTION_VALUE_WGFX_180)
return 180.0f;
else if (val == OPTION_VALUE_WGFX__90)
return 270.0f;
else if (val == OPTION_VALUE_WGFX_ZDWBFXSB)
return AUTO_MATIC_ROTATE;
else
return .0f;
}
std::string rotation_to_sane(double rot)
{
if (IS_DOUBLE_EQUAL(rot, 90.0f))
return local_trans::from_default_language(OPTION_VALUE_WGFX_90);
if (IS_DOUBLE_EQUAL(rot, 180.0f))
return local_trans::from_default_language(OPTION_VALUE_WGFX_180);
if (IS_DOUBLE_EQUAL(rot, 270.0f))
return local_trans::from_default_language(OPTION_VALUE_WGFX__90);
if (IS_DOUBLE_EQUAL(rot, AUTO_MATIC_ROTATE))
return local_trans::from_default_language(OPTION_VALUE_WGFX_ZDWBFXSB);
return local_trans::from_default_language(OPTION_VALUE_WGFX_0);;
}
bool auto_rotation_from_sane(const char* sane_val)
{
std::string val(local_trans::to_default_language(sane_val));
return val == OPTION_VALUE_WGFX_ZDWBFXSB;
}
std::string auto_rotation_to_sane(bool autor)
{
if (autor)
return local_trans::from_default_language(OPTION_VALUE_WGFX_ZDWBFXSB);
else
return local_trans::from_default_language(OPTION_VALUE_WGFX_0);
}
// 滤波 与 除色与增强
static int filter_to_twain(const char* s, bool filter)
{
std::string val(local_trans::to_default_language(s));
if (filter)
{
if (val == OPTION_VALUE_HDHHBTX_CSYZQ_CHS)
return Filter::Red;
else if (val == OPTION_VALUE_HDHHBTX_CSYZQ_CLS)
return Filter::Green;
else if (val == OPTION_VALUE_HDHHBTX_CSYZQ_CHULANSE)
return Filter::Blue;
}
else
{
if (val == OPTION_VALUE_HDHHBTX_CSYZQ_HSZQ)
return Filter::Red;
else if (val == OPTION_VALUE_HDHHBTX_CSYZQ_LSZQ)
return Filter::Green;
else if (val == OPTION_VALUE_HDHHBTX_CSYZQ_LANSEZENGQIANG)
return Filter::Blue;
}
return Filter::None;
}
void filter_from_sane(const std::vector<std::string>& sane/*sane_opts::RANGE_POS*/, std::vector<int>& twain, bool filter/*true - filter; false - enhance*/)
{
if (sane.size())
{
twain.push_back(filter_to_twain(sane[0].c_str(), filter));
if (sane.size() >= 2)
{
twain.push_back(filter_to_twain(sane[1].c_str(), filter));
}
}
for (int i = sane_opts::RANGE_POS_ENUM_BEGIN; i < sane.size(); ++i)
{
int v = filter_to_twain(sane[i].c_str(), filter);
if (std::find(twain.begin() + 2, twain.end(), v) == twain.end())
twain.push_back(v);
}
}
std::string filter_to_sane(int filter)
{
if (filter == Filter::Red)
return local_trans::from_default_language(OPTION_VALUE_HDHHBTX_CSYZQ_CHS);
else if(filter == Filter::Green)
return local_trans::from_default_language(OPTION_VALUE_HDHHBTX_CSYZQ_CLS);
else if(filter == Filter::Blue)
return local_trans::from_default_language(OPTION_VALUE_HDHHBTX_CSYZQ_CHULANSE);
else
return local_trans::from_default_language(OPTION_VALUE_HDHHBTX_CSYZQ_BCS);
}
std::string enhance_to_sane(int enhance)
{
if (enhance == Filter::Red)
return local_trans::from_default_language(OPTION_VALUE_HDHHBTX_CSYZQ_HSZQ);
else if (enhance == Filter::Green)
return local_trans::from_default_language(OPTION_VALUE_HDHHBTX_CSYZQ_LSZQ);
else if (enhance == Filter::Blue)
return local_trans::from_default_language(OPTION_VALUE_HDHHBTX_CSYZQ_LANSEZENGQIANG);
else
return local_trans::from_default_language(OPTION_VALUE_HDHHBTX_CSYZQ_BCS);
}
// 多流输出
int multi_out_from_sane(const char* sane_val)
{
TO_TWAIN(g_multiout_map, sane_val);
return -1;
}
std::string multi_out_to_sane(int mo)
{
FROM_TWAIN(g_multiout_map, mo);
return local_trans::from_default_language(OPTION_VALUE_DLSCLX_CS_HD_HB);
}
// 休眠时间兼容老版本协议
int power_from_sane(const char* sane_val)
{
TO_TWAIN(g_power, sane_val);
return SANE_POWER_NONE;
}
std::string power_to_sane(int power)
{
FROM_TWAIN(g_power, power);
return local_trans::from_default_language(OPTION_VALUE_XMSJ_BXM);
}
// 背景填充方式 设置凸多边形
bool convex_from_sane(const char* sane_val)
{
std::string val(local_trans::to_default_language(sane_val));
return val == OPTION_VALUE_BJTCFS_TDBX;
}
std::string convex_to_sane(bool convex)
{
if (convex)
return local_trans::from_default_language(OPTION_VALUE_BJTCFS_TDBX);
else
return local_trans::from_default_language(OPTION_VALUE_BJTCFS_ADBX);
}
// 锐化
int sharpen_from_sane(const char* sane_val)
{
TO_TWAIN(g_sharpen_map, sane_val);
return SHARPEN_NONE;
}
std::string sharpen_to_sane(int sharpen)
{
FROM_TWAIN(g_sharpen_map, sharpen);
return local_trans::from_default_language(OPTION_VALUE_RHYMH_W);
}
};