From 7d315ffc883c44ec89cfcbc38e1ceebe087d3b1d Mon Sep 17 00:00:00 2001 From: yangjiaxuan <171295266@qq.com> Date: Mon, 11 Mar 2024 19:11:03 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A7=A3=E5=86=B3=E5=9B=BD=E4=BA=A7=E7=B3=BB?= =?UTF-8?q?=E7=BB=9F=E5=8D=95=E9=9D=A2=E6=88=96=E5=AF=B9=E6=8A=98=E4=B8=8E?= =?UTF-8?q?=E5=A4=9A=E6=B5=81=E5=90=8C=E6=97=B6=E5=BC=80=E5=90=AF=E6=97=B6?= =?UTF-8?q?=EF=BC=8C=E5=8F=8C=E5=BC=A0=E6=A0=A1=E9=AA=8C=E5=9B=BE=E5=83=8F?= =?UTF-8?q?=E4=B8=8D=E5=BC=B9=E7=AA=97=E7=9A=84=E9=97=AE=E9=A2=98=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- modules/sane_user/HGSaneImpl.cpp | 50 ++++++++++++++++++++++++++++++-- modules/sane_user/HGSaneImpl.hpp | 1 + 2 files changed, 48 insertions(+), 3 deletions(-) diff --git a/modules/sane_user/HGSaneImpl.cpp b/modules/sane_user/HGSaneImpl.cpp index 20b44dcf..b61fe073 100644 --- a/modules/sane_user/HGSaneImpl.cpp +++ b/modules/sane_user/HGSaneImpl.cpp @@ -1024,6 +1024,10 @@ void HGAPI HGSaneDeviceImpl::ThreadFunc(HGThread thread, HGPointer param) HGInt spliteImgCount = 0; p->GetSpliteImgCount(&spliteImgCount); + // 获取当前是否开启对折或者单面模式 + HGBool isFold = false; + p->GetIsFold(&isFold); + HGInt multioutSpliteImgCount = 0; SANE_Status stat = saneAPI.sane_start_api(p->m_devHandle); @@ -1184,10 +1188,21 @@ void HGAPI HGSaneDeviceImpl::ThreadFunc(HGThread thread, HGPointer param) buffer = NULL; bufferSize = 0; - // 多流输出比图像拆分优先级高,如果多流输出和图像拆分同时开启,应出图数量等于多流输出图像数量的两倍 - if (multioutSpliteImgCount == (multioutImgCount == 0 ? multioutImgCount + spliteImgCount : multioutImgCount * 2)) + if (!isFold) { - multioutSpliteImgCount = 0; + // 多流输出比图像拆分优先级高,如果多流输出和图像拆分同时开启,应出图数量等于多流输出图像数量的两倍 + if (multioutSpliteImgCount == (multioutImgCount == 0 ? multioutImgCount + spliteImgCount : multioutImgCount * 2)) + { + multioutSpliteImgCount = 0; + } + } + else + { + // 如果对折模式或单面和多流输出同时开启,多流输出图像数量减半 + if (multioutSpliteImgCount == (multioutImgCount == 0 ? multioutImgCount + spliteImgCount : multioutImgCount / 2)) + { + multioutSpliteImgCount = 0; + } } if (HGSANE_ERR_IMAGE_DISCARD == doubleImgRet) @@ -1531,3 +1546,32 @@ HGResult HGSaneDeviceImpl::GetSpliteImgCount(HGInt *count) return HGBASE_ERR_FAIL; } + +HGResult HGSaneDeviceImpl::GetIsFold(HGBool *isFold) +{ + SANE_Int dev_options = 0; + SANE_Int method = 0; + HGBool fold = false; + + m_sourceImpl->m_saneApi.sane_control_option_api(m_devHandle, 0, SANE_ACTION_GET_VALUE, &dev_options, nullptr); + for (int i = 1; i < dev_options; ++i) + { + const SANE_Option_Descriptor* opt = m_sourceImpl->m_saneApi.sane_get_option_descriptor_api(m_devHandle, i); + if (strcmp(opt->name, SANE_STD_OPT_NAME_PAGE) == 0) + { + char *value = (char*)malloc(opt->size * 2 + 4); + SANE_Status ret = m_sourceImpl->m_saneApi.sane_control_option_api(m_devHandle, i, SANE_ACTION_GET_VALUE, value, &method); + if (ret == SANE_STATUS_GOOD) + { + if (0 == strcmp(value, OPTION_VALUE_SMYM_DZ) || 0 == strcmp(value, OPTION_VALUE_SMYM_DM)) + fold = true; + + *isFold = fold; + free(value); + return HGBASE_ERR_OK; + } + } + } + + return HGBASE_ERR_FAIL; +} diff --git a/modules/sane_user/HGSaneImpl.hpp b/modules/sane_user/HGSaneImpl.hpp index 125a1ee5..05cf039e 100644 --- a/modules/sane_user/HGSaneImpl.hpp +++ b/modules/sane_user/HGSaneImpl.hpp @@ -107,6 +107,7 @@ private: HGResult GetDoubleImgStatus(HGUInt *status); HGResult GetMultioutImgCount(HGInt *count); HGResult GetSpliteImgCount(HGInt *count); + HGResult GetIsFold(HGBool *isFold); private: HGSaneSourceImpl* m_sourceImpl;