From 66d0069cc50bea024d2fb82b55d12a4019c8599d Mon Sep 17 00:00:00 2001 From: yangjiaxuan <171295266@qq.com> Date: Tue, 12 Mar 2024 17:27:53 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=A4=9A=E6=B5=81=E6=8B=86?= =?UTF-8?q?=E5=88=86=E5=BC=80=E5=90=AF=EF=BC=8C=E5=8F=8C=E5=BC=A0=E5=9B=BE?= =?UTF-8?q?=E5=83=8F=E6=A0=A1=E9=AA=8C=E4=B8=8D=E5=BC=B9=E7=AA=97=E6=8F=90?= =?UTF-8?q?=E7=A4=BA=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 | 152 +++++++++++++++++++++++++------ modules/sane_user/HGSaneImpl.hpp | 3 + 2 files changed, 127 insertions(+), 28 deletions(-) diff --git a/modules/sane_user/HGSaneImpl.cpp b/modules/sane_user/HGSaneImpl.cpp index b61fe073..e01a6bf5 100644 --- a/modules/sane_user/HGSaneImpl.cpp +++ b/modules/sane_user/HGSaneImpl.cpp @@ -1016,18 +1016,11 @@ void HGAPI HGSaneDeviceImpl::ThreadFunc(HGThread thread, HGPointer param) HGUInt doubleImgStat = HGBASE_ERR_OK; p->GetDoubleImgStatus(&doubleImgStat); - // 获取多流输出开启时,不同模式下应出图张数 - HGInt multioutImgCount = 0; - p->GetMultioutImgCount(&multioutImgCount); - - // 获取图像拆分开启时的应出图张数 - HGInt spliteImgCount = 0; - p->GetSpliteImgCount(&spliteImgCount); - - // 获取当前是否开启对折或者单面模式 - HGBool isFold = false; - p->GetIsFold(&isFold); + // 获取多流输出和图像拆分开启时应出图数量 + HGInt finalImgCount = 0; + p->GetfinalImgCount(&finalImgCount); + // 标记多流输出、对折或图像拆分开启后的实际出图数量 HGInt multioutSpliteImgCount = 0; SANE_Status stat = saneAPI.sane_start_api(p->m_devHandle); @@ -1166,7 +1159,7 @@ void HGAPI HGSaneDeviceImpl::ThreadFunc(HGThread thread, HGPointer param) if (HGSANE_ERR_IMAGE_RESERVE == doubleImgRet) { clickedReserveImg = true; - if (multioutImgCount + spliteImgCount > 0) + if (finalImgCount > 0) multioutSpliteImgCount++; } } @@ -1176,7 +1169,7 @@ void HGAPI HGSaneDeviceImpl::ThreadFunc(HGThread thread, HGPointer param) p->m_imageFunc((HGSaneDevice)p, img, HGSANE_IMAGE_TYPE_NORMAL, p->m_imageParam); doubleImgRet = HGBASE_ERR_OK; - if (multioutImgCount + spliteImgCount > 0) + if (SCANNER_ERR_DEVICE_DOUBLE_FEEDING == stat && HGSANE_ERR_UI_RESERVE_CHECK == doubleImgStat && finalImgCount > 0) multioutSpliteImgCount++; } @@ -1188,21 +1181,11 @@ void HGAPI HGSaneDeviceImpl::ThreadFunc(HGThread thread, HGPointer param) buffer = NULL; bufferSize = 0; - if (!isFold) + if (SCANNER_ERR_DEVICE_DOUBLE_FEEDING == stat && + HGSANE_ERR_UI_RESERVE_CHECK == doubleImgStat && + multioutSpliteImgCount == finalImgCount) { - // 多流输出比图像拆分优先级高,如果多流输出和图像拆分同时开启,应出图数量等于多流输出图像数量的两倍 - if (multioutSpliteImgCount == (multioutImgCount == 0 ? multioutImgCount + spliteImgCount : multioutImgCount * 2)) - { - multioutSpliteImgCount = 0; - } - } - else - { - // 如果对折模式或单面和多流输出同时开启,多流输出图像数量减半 - if (multioutSpliteImgCount == (multioutImgCount == 0 ? multioutImgCount + spliteImgCount : multioutImgCount / 2)) - { - multioutSpliteImgCount = 0; - } + multioutSpliteImgCount = 0; } if (HGSANE_ERR_IMAGE_DISCARD == doubleImgRet) @@ -1468,6 +1451,34 @@ HGResult HGSaneDeviceImpl::GetDoubleImgStatus(HGUInt *status) return HGBASE_ERR_FAIL; } +HGResult HGSaneDeviceImpl::GetMultiFilterRedImgCount(HGInt *count) +{ + SANE_Int dev_options = 0; + SANE_Int method = 0; + SANE_Bool ismultiRed = false; + SANE_Int imgCount = 0; + + 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_RID_MULTIOUT_RED) == 0) + { + SANE_Status ret = m_sourceImpl->m_saneApi.sane_control_option_api(m_devHandle, i, SANE_ACTION_GET_VALUE, &ismultiRed, &method); + if (ret == SANE_STATUS_GOOD) + { + if (ismultiRed) + imgCount = 4; + + *count = imgCount; + return HGBASE_ERR_OK; + } + } + } + + return HGBASE_ERR_FAIL; +} + HGResult HGSaneDeviceImpl::GetMultioutImgCount(HGInt *count) { SANE_Int dev_options = 0; @@ -1491,7 +1502,19 @@ HGResult HGSaneDeviceImpl::GetMultioutImgCount(HGInt *count) } if (!isMultiout) + { + HGInt multiRedImgCount = 0; + GetMultiFilterRedImgCount(&multiRedImgCount); + + // 多流输出除红与多流输出互斥 + if (multiRedImgCount > 0) + { + *count = multiRedImgCount; + return HGBASE_ERR_OK; + } + return HGBASE_ERR_FAIL; + } for (int i = 1; i < dev_options; ++i) { @@ -1563,7 +1586,7 @@ HGResult HGSaneDeviceImpl::GetIsFold(HGBool *isFold) 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)) + if (0 == strcmp(value, OPTION_VALUE_SMYM_DZ)) fold = true; *isFold = fold; @@ -1575,3 +1598,76 @@ HGResult HGSaneDeviceImpl::GetIsFold(HGBool *isFold) return HGBASE_ERR_FAIL; } + +HGResult HGSaneDeviceImpl::GetIsSingle(HGBool *isSingle) +{ + SANE_Int dev_options = 0; + SANE_Int method = 0; + HGBool single = 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_DM)) + single = true; + + *isSingle = single; + free(value); + return HGBASE_ERR_OK; + } + } + } + + return HGBASE_ERR_FAIL; +} + +HGResult HGSaneDeviceImpl::GetfinalImgCount(HGInt *count) +{ + // 获取多流输出开启时,不同模式下应出图张数 + HGInt multioutImgCount = 0; + GetMultioutImgCount(&multioutImgCount); + + // 获取图像拆分开启时的应出图张数 + HGInt spliteImgCount = 0; + GetSpliteImgCount(&spliteImgCount); + + // 获取当前是否开启对折 + HGBool isFold = false; + GetIsFold(&isFold); + + // 获取当前是否为单面模式 + HGBool isSingle = false; + GetIsSingle(&isSingle); + + // 对折与图像拆分互斥 + if (isFold) + spliteImgCount = 0; + if (spliteImgCount > 0) + isFold = false; + + // 最终出图数量 + HGInt finalImgCount = 0; + + if (multioutImgCount > 0 && spliteImgCount > 0) + { + finalImgCount = isSingle ? multioutImgCount : multioutImgCount * 2; + } + else if (multioutImgCount > 0 && spliteImgCount == 0) + { + finalImgCount = (isFold || isSingle) ? multioutImgCount / 2 : multioutImgCount; + } + else if (multioutImgCount == 0 && spliteImgCount > 0) + { + finalImgCount = isSingle ? spliteImgCount / 2 : spliteImgCount; + } + + *count = finalImgCount; + return HGBASE_ERR_OK; +} diff --git a/modules/sane_user/HGSaneImpl.hpp b/modules/sane_user/HGSaneImpl.hpp index 05cf039e..c53623a0 100644 --- a/modules/sane_user/HGSaneImpl.hpp +++ b/modules/sane_user/HGSaneImpl.hpp @@ -105,9 +105,12 @@ private: HGResult SetScanMode(const HGChar *scanMode); HGResult SetScanCount(HGInt scanCount); HGResult GetDoubleImgStatus(HGUInt *status); + HGResult GetMultiFilterRedImgCount(HGInt *count); HGResult GetMultioutImgCount(HGInt *count); HGResult GetSpliteImgCount(HGInt *count); HGResult GetIsFold(HGBool *isFold); + HGResult GetIsSingle(HGBool *isSingle); + HGResult GetfinalImgCount(HGInt *count); private: HGSaneSourceImpl* m_sourceImpl;