From ea2c6154974d6d0d06effd0b0f5689f0f09b7001 Mon Sep 17 00:00:00 2001 From: yangjiaxuan <171295266@qq.com> Date: Mon, 11 Mar 2024 14:30:06 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A7=A3=E5=86=B3=E5=A4=9A=E6=B5=81=E8=BE=93?= =?UTF-8?q?=E5=87=BA=E5=92=8C=E5=9B=BE=E5=83=8F=E6=8B=86=E5=88=86=E4=BC=9A?= =?UTF-8?q?=E5=AF=BC=E8=87=B4=E5=8F=8C=E5=BC=A0=E4=BF=9D=E7=95=99=E5=9B=BE?= =?UTF-8?q?=E5=83=8F=E5=A4=9A=E6=AC=A1=E5=BC=B9=E7=AA=97=E6=8F=90=E7=A4=BA?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98=EF=BC=9BBUG-922?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- modules/sane_user/HGSaneImpl.cpp | 118 +++++++++++++++++++++++++++++-- modules/sane_user/HGSaneImpl.hpp | 2 + 2 files changed, 113 insertions(+), 7 deletions(-) diff --git a/modules/sane_user/HGSaneImpl.cpp b/modules/sane_user/HGSaneImpl.cpp index cc4c2f46..20b44dcf 100644 --- a/modules/sane_user/HGSaneImpl.cpp +++ b/modules/sane_user/HGSaneImpl.cpp @@ -1008,12 +1008,26 @@ void HGAPI HGSaneDeviceImpl::ThreadFunc(HGThread thread, HGPointer param) if (NULL != p->m_scanNotify) p->m_scanNotify((int)SANE_EVENT_WORKING, NULL, 0); - SANE_Status stat = saneAPI.sane_start_api(p->m_devHandle); + // 双张图像处理的返回值 + HGUInt doubleImgRet = HGBASE_ERR_OK; + bool clickedReserveImg = false; // 获取设置界面选择的双张处理方式 HGUInt doubleImgStat = HGBASE_ERR_OK; p->GetDoubleImgStatus(&doubleImgStat); + // 获取多流输出开启时,不同模式下应出图张数 + HGInt multioutImgCount = 0; + p->GetMultioutImgCount(&multioutImgCount); + + // 获取图像拆分开启时的应出图张数 + HGInt spliteImgCount = 0; + p->GetSpliteImgCount(&spliteImgCount); + + HGInt multioutSpliteImgCount = 0; + + SANE_Status stat = saneAPI.sane_start_api(p->m_devHandle); + if (SANE_STATUS_GOOD != stat) { if ((SCANNER_ERR_DEVICE_DOUBLE_FEEDING == stat && HGSANE_ERR_UI_RESERVE_CHECK != doubleImgStat)) @@ -1035,10 +1049,6 @@ void HGAPI HGSaneDeviceImpl::ThreadFunc(HGThread thread, HGPointer param) } } - // 双张图像处理的返回值 - HGUInt doubleImgRet = HGBASE_ERR_OK; - bool clickedReserveImg = false; - while (!p->m_stopThread) { SANE_Parameters params; @@ -1141,20 +1151,29 @@ void HGAPI HGSaneDeviceImpl::ThreadFunc(HGThread thread, HGPointer param) if (NULL != img) { HGBase_SetImageDpi(img, p->m_dpi, p->m_dpi); - if (HGBASE_ERR_OK == doubleImgRet && SCANNER_ERR_DEVICE_DOUBLE_FEEDING == stat - && HGSANE_ERR_UI_RESERVE_CHECK == doubleImgStat) + if (HGBASE_ERR_OK == doubleImgRet && + SCANNER_ERR_DEVICE_DOUBLE_FEEDING == stat && + HGSANE_ERR_UI_RESERVE_CHECK == doubleImgStat && + multioutSpliteImgCount == 0) { // 第一个双张图片 doubleImgRet = p->m_imageFunc((HGSaneDevice)p, img, HGSANE_IMAGE_TYPE_DOUBLE, p->m_imageParam); if (HGSANE_ERR_IMAGE_RESERVE == doubleImgRet) + { clickedReserveImg = true; + if (multioutImgCount + spliteImgCount > 0) + multioutSpliteImgCount++; + } } else { // 普通图片或第二个双张图片 p->m_imageFunc((HGSaneDevice)p, img, HGSANE_IMAGE_TYPE_NORMAL, p->m_imageParam); doubleImgRet = HGBASE_ERR_OK; + + if (multioutImgCount + spliteImgCount > 0) + multioutSpliteImgCount++; } HGBase_DestroyImage(img); @@ -1165,6 +1184,12 @@ void HGAPI HGSaneDeviceImpl::ThreadFunc(HGThread thread, HGPointer param) buffer = NULL; bufferSize = 0; + // 多流输出比图像拆分优先级高,如果多流输出和图像拆分同时开启,应出图数量等于多流输出图像数量的两倍 + if (multioutSpliteImgCount == (multioutImgCount == 0 ? multioutImgCount + spliteImgCount : multioutImgCount * 2)) + { + multioutSpliteImgCount = 0; + } + if (HGSANE_ERR_IMAGE_DISCARD == doubleImgRet) { saneAPI.sane_cancel_api(p->m_devHandle); @@ -1427,3 +1452,82 @@ HGResult HGSaneDeviceImpl::GetDoubleImgStatus(HGUInt *status) return HGBASE_ERR_FAIL; } + +HGResult HGSaneDeviceImpl::GetMultioutImgCount(HGInt *count) +{ + SANE_Int dev_options = 0; + SANE_Int method = 0; + SANE_Bool isMultiout = false; + HGInt 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_IS_MULTI_OUT) == 0) + { + SANE_Status ret = m_sourceImpl->m_saneApi.sane_control_option_api(m_devHandle, i, SANE_ACTION_GET_VALUE, &isMultiout, &method); + if (ret == SANE_STATUS_GOOD) + { + if (isMultiout) + break; + } + } + } + + if (!isMultiout) + return HGBASE_ERR_FAIL; + + 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_MULTI_OUT_TYPE) == 0) + { + char *value = (char*)malloc(opt->size * 2 + 4); + SANE_Status ret2 = m_sourceImpl->m_saneApi.sane_control_option_api(m_devHandle, i, SANE_ACTION_GET_VALUE, value, &method); + if (ret2 == SANE_STATUS_GOOD) + { + if (0 == strcmp(value, OPTION_VALUE_DLSCLX_CS_HD_HB)) + imgCount = 6; + else if (0 == strcmp(value, OPTION_VALUE_DLSCLX_CS_HD) || + 0 == strcmp(value, OPTION_VALUE_DLSCLX_CS_HB) || + 0 == strcmp(value, OPTION_VALUE_DLSCLX_HD_HB)) + imgCount = 4; + + *count = imgCount; + free(value); + return HGBASE_ERR_OK; + } + } + } + + return HGBASE_ERR_FAIL; +} + +HGResult HGSaneDeviceImpl::GetSpliteImgCount(HGInt *count) +{ + SANE_Int dev_options = 0; + SANE_Int method = 0; + SANE_Bool isSplite = 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_SPLIT) == 0) + { + SANE_Status ret = m_sourceImpl->m_saneApi.sane_control_option_api(m_devHandle, i, SANE_ACTION_GET_VALUE, &isSplite, &method); + if (ret == SANE_STATUS_GOOD) + { + if (isSplite) + imgCount = 4; + + *count = imgCount; + return HGBASE_ERR_OK; + } + } + } + + return HGBASE_ERR_FAIL; +} diff --git a/modules/sane_user/HGSaneImpl.hpp b/modules/sane_user/HGSaneImpl.hpp index f22626fd..125a1ee5 100644 --- a/modules/sane_user/HGSaneImpl.hpp +++ b/modules/sane_user/HGSaneImpl.hpp @@ -105,6 +105,8 @@ private: HGResult SetScanMode(const HGChar *scanMode); HGResult SetScanCount(HGInt scanCount); HGResult GetDoubleImgStatus(HGUInt *status); + HGResult GetMultioutImgCount(HGInt *count); + HGResult GetSpliteImgCount(HGInt *count); private: HGSaneSourceImpl* m_sourceImpl;