newtx/imgproc/algs/multi_out.cpp

146 lines
4.4 KiB
C++

#include "multi_out.h"
#include <huagao/hgscanner_error.h>
#include <sane/sane_ex.h>
#include <base/utils.h>
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
static std::string device_opt_json[] = {
"{\"is-multiout\":{\"cat\":\"base\",\"group\":\"base\",\"title\":\"\\u591a\\u6d41\\u8f93\\u51fa\",\"desc\":\"\\u540c\\u65f6\\u8f93\\u51fa\\u591a\\u79cd\\u989c\\u8272\\u6a21\\u5f0f\\u7684\\u56fe\\u50cf\",\"type\":\"bool\",\"pos\":40,\"fix-id\":34817,\"ui-pos\":10,\"auth\":0,\"size\":4,\"cur\":false,\"default\":false},\"multiout-type\":{\"cat\":\"base\",\"group\":\"base\",\"title\":\"\\u591a\\u6d41\\u8f93\\u51fa\\u7c7b\\u578b\",\"desc\":\"\\u9009\\u62e9\\u591a\\u6d41\\u8f93\\u51fa\\u7684\\u7c7b\\u578b\",\"type\":\"string\",\"pos\":41,\"fix-id\":34818,\"ui-pos\":11,\"auth\":0,\"enabled\":false,\"size\":66,\"cur\":\"\\u5f69\\u8272+\\u7070\\u5ea6+\\u9ed1\\u767d\",\"default\":\"\\u5f69\\u8272+\\u7070\\u5ea6+\\u9ed1\\u767d\",\"range\":[\"\\u5f69\\u8272+\\u7070\\u5ea6+\\u9ed1\\u767d\",\"\\u5f69\\u8272+\\u7070\\u5ea6\",\"\\u5f69\\u8272+\\u9ed1\\u767d\",\"\\u7070\\u5ea6+\\u9ed1\\u767d\"],\"depend\":\"is-multiout==true\"},\"mode\":{\"cat\":\"base\",\"group\":\"base\",\"title\":\"\\u989c\\u8272\\u6a21\\u5f0f\",\"desc\":\"\\u9009\\u62e9\\u8272\\u5f69\\u6a21\\u5f0f\",\"type\":\"string\",\"pos\":50,\"fix-id\":34819,\"ui-pos\":15,\"auth\":0,\"size\":24,\"cur\":\"24\\u4f4d\\u5f69\\u8272\",\"default\":\"24\\u4f4d\\u5f69\\u8272\",\"range\":[\"24\\u4f4d\\u5f69\\u8272\",\"256\\u7ea7\\u7070\\u5ea6\",\"\\u9ed1\\u767d\",\"\\u989c\\u8272\\u81ea\\u52a8\\u8bc6\\u522b\"],\"depend\":\"is-multiout!=true\"}}"
};
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
multi_out::multi_out(bool weaker) : image_processor("multi_out")
{
if(weaker)
return;
ADD_THIS_JSON();
}
multi_out::~multi_out()
{}
void multi_out::refresh_final_mode(void)
{
if(multi_)
{
coef_ = 2;
if(multi_str_ == WORDS_MULTI_OUT_GBW)
{
clr_ = false;
gray_ = bw_ = true;
}
else if(multi_str_ == WORDS_MULTI_OUT_CG)
{
clr_ = gray_ = true;
bw_ = false;
}
else if(multi_str_ == WORDS_MULTI_OUT_CBW)
{
clr_ = bw_ = true;
gray_ = false;
}
else
{
coef_ = 3;
clr_ = gray_ = bw_ = true;
}
}
else
{
coef_ = 1;
if(mode_str_.find(WORDS_COLOR_BW) != std::string::npos)
{
clr_ = gray_ = false;
bw_ = true;
}
else if(mode_str_.find(WORDS_COLOR_GRAY) != std::string::npos)
{
clr_ = bw_ = false;
gray_ = true;
}
else
{
clr_ = true;
gray_ = bw_ = false;
}
}
}
int multi_out::set_value(const char* name/*nullptr for all options*/, void* val/*nullptr for restore*/)
{
int ret = SCANNER_ERR_OK;
if(strcmp(name, SANE_OPT_NAME(IS_MULTI_OUT)) == 0)
{
enabled_ = multi_ = *(bool*)val;
refresh_final_mode();
}
else if(strcmp(name, SANE_OPT_NAME(MULTI_OUT_TYPE)) == 0)
{
multi_str_ = (char*)val;
refresh_final_mode();
}
else if(strcmp(name, SANE_OPT_NAME(COLOR_MODE)) == 0)
{
mode_str_ = (char*)val;
refresh_final_mode();
}
else
ret = SCANNER_ERR_DEVICE_NOT_SUPPORT;
return ret;
}
image_processor* multi_out::copy_weaker(void)
{
multi_out *weaker = new multi_out(true);
weaker->pos_ = pos_;
weaker->enabled_ = enabled_;
weaker->multi_ = multi_;
weaker->clr_ = clr_;
weaker->gray_ = gray_;
weaker->bw_ = bw_;
weaker->coef_ = coef_;
return weaker;
}
int multi_out::process(std::vector<PROCIMGINFO>& in, std::vector<PROCIMGINFO>& out)
{
int cnt = in.size() * coef_,
index = 0;
for(auto& v: in)
{
if(clr_ && v.info.channels == 3)
{
PROCIMGINFO o = v;
o.info.prc_stage = get_position();
o.info.prc_time = 0;
o.info.pos.paper_all = cnt;
o.info.pos.ind_in_paper = index++;
out.push_back(o);
}
if(gray_)
{
}
if(bw_)
{
}
}
return SCANNER_ERR_OK;
}