600DPI纸张及画质限制

This commit is contained in:
gb 2022-08-02 11:14:58 +08:00
parent b1402c2605
commit 0c8272bdb7
3 changed files with 79 additions and 3 deletions

View File

@ -419,7 +419,7 @@ std::string is_permaeate_string(int permaeate_lv)
}
std::string is_img_quality(int is_quakuty)
{
return INVOKE_STR(g_img_quality, is_quakuty, 0);
return INVOKE_STR(g_img_quality, is_quakuty + 1/*start from -1*/, 0);
}
int double_paper_flag_from_option_value(std::string& opt_val, bool* exact)

View File

@ -592,6 +592,32 @@ bool hg_scanner::check_range(int setting_no, std::string& val)
return false;
}
bool hg_scanner::check_paper_and_resolution(int res, int paper)
{
if (res == 600)
{
if (paper == PAPER_MAX_SIZE ||
paper == PAPER_MAX_SIZE_CLIP ||
paper == PAPER_TRIGEMINY)
{
VLOG_MINI_2(LOG_LEVEL_WARNING, "resolution '%d' is in-compatible with paper '%s'\n", res, paper_string(paper).c_str());
return false;
}
}
return true;
}
bool hg_scanner::check_resolution_and_quality(int res, const char* quality)
{
if (res == 600 && strcmp(quality, OPTION_VALUE_HZ_SDYX) == 0)
{
VLOG_MINI_2(LOG_LEVEL_WARNING, "resolution '%d' is in-compatible with quality '%s'\n", res, quality);
return false;
}
return true;
}
int hg_scanner::restore(int setting_no)
{
char key[20];
@ -881,7 +907,8 @@ int hg_scanner::invoke_setting_xxx(int(hg_scanner::*func)(int, void*), void* dat
{
if (it->second == func)
{
ret = (this->*it->second)(it->first, data);
ret = set_setting(it->first, data, 0);
// ret = (this->*it->second)(it->first, data);
break;
}
++it;
@ -1089,6 +1116,16 @@ int hg_scanner::setting_paper(int sn, void* data)
old = image_prc_param_.bits.paper;
val = image_prc_param_.bits.paper = match_best_paper(paper, NULL);
// check 600 dpi ...
if (!check_paper_and_resolution(resolution_, val))
{
image_prc_param_.bits.paper = old;
strcpy((char*)data, paper_string(old).c_str());
return SCANNER_ERR_DEVICE_NOT_SUPPORT;
}
sub = on_paper_changed(val);
image_prc_param_.bits.paper = val;
if (sub == SCANNER_ERR_NOT_EXACT)
@ -1165,6 +1202,35 @@ int hg_scanner::setting_resolution(int sn, void* data)
resolution_ = *((int*)data);
if (!check_range(sn, resolution_))
ret = SCANNER_ERR_NOT_EXACT;
// check paper ...
if (!check_paper_and_resolution(resolution_, image_prc_param_.bits.paper))
{
resolution_ = old;
*((int*)data) = old;
return SCANNER_ERR_DEVICE_NOT_SUPPORT;
}
if (!check_resolution_and_quality(resolution_, is_img_quality(is_quality_).c_str()))
{
if (resolution_ == 600 && old < 300)
{
char buf[128] = { 0 };
strcpy(buf, OPTION_VALUE_HZ_HZYX);
resolution_ = old;
invoke_setting_xxx(&hg_scanner::setting_img_quality, buf);
resolution_ = 600;
ret = SCANNER_ERR_CONFIGURATION_CHANGED;
}
else
{
resolution_ = old;
*((int*)data) = old;
return SCANNER_ERR_DEVICE_NOT_SUPPORT;
}
}
sub = on_resolution_changed(resolution_);
if (sub == SCANNER_ERR_NOT_EXACT)
ret = sub;
@ -1591,10 +1657,18 @@ int hg_scanner::setting_img_quality(int sn, void *data)
std::string str((char*)data);
bool exact = check_range(sn, str);
int ret = exact ? SCANNER_ERR_OK : SCANNER_ERR_NOT_EXACT;
int old = is_quality_;
VLOG_MINI_3(LOG_LEVEL_DEBUG_INFO, "Change quality from '%s' to '%s' = %s\n", is_img_quality(is_quality_).c_str()
, (char*)data, hg_scanner_err_name(ret));
is_quality_ = match_best_img_quality(str,NULL);
if (!check_resolution_and_quality(resolution_, is_img_quality(is_quality_).c_str()))
{
is_quality_ = old;
strcpy((char*)data, is_img_quality(is_quality_).c_str());
return SCANNER_ERR_DEVICE_NOT_SUPPORT;
}
return SCANNER_ERR_OK;
}

View File

@ -55,6 +55,8 @@ class hg_scanner
bool check_range(int setting_no, int& val);
bool check_range(int setting_no, double& val);
bool check_range(int setting_no, std::string& val);
bool check_paper_and_resolution(int res, int paper);
bool check_resolution_and_quality(int res, const char* quality);
int restore(int setting_no);
bool get_default_value(void* buf, json* jsn);
bool is_to_file(void);
@ -209,7 +211,7 @@ protected:
int fractate_level_; // 折角检测复杂度
int scan_count_; // 扫描张数各实例化类在重载set_setting_value中如果发现该设置项对该参数有影响时需要对此值作更改
bool is_auto_matic_color;// 自动颜色识别
int is_quality_; // 画质设置
int is_quality_; // 画质设置 0 - 速度优先1 - 画质优先
bool is_color_fill; // 色彩填充
bool is_multiout; // 多流输出