code_device/twain/ds/s2t.cpp

541 lines
15 KiB
C++
Raw Normal View History

2023-09-21 03:24:44 +00:00
#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}
2023-09-21 03:24:44 +00:00
, {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}
2023-09-21 03:24:44 +00:00
, {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}
2023-09-21 03:24:44 +00:00
, {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);
}
};