解决多流输出和图像拆分会导致双张保留图像多次弹窗提示的问题;BUG-922

This commit is contained in:
yangjiaxuan 2024-03-11 14:30:06 +08:00
parent 2ac71f54e3
commit ea2c615497
2 changed files with 113 additions and 7 deletions

View File

@ -1008,12 +1008,26 @@ void HGAPI HGSaneDeviceImpl::ThreadFunc(HGThread thread, HGPointer param)
if (NULL != p->m_scanNotify) if (NULL != p->m_scanNotify)
p->m_scanNotify((int)SANE_EVENT_WORKING, NULL, 0); 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; HGUInt doubleImgStat = HGBASE_ERR_OK;
p->GetDoubleImgStatus(&doubleImgStat); 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 (SANE_STATUS_GOOD != stat)
{ {
if ((SCANNER_ERR_DEVICE_DOUBLE_FEEDING == stat && HGSANE_ERR_UI_RESERVE_CHECK != doubleImgStat)) 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) while (!p->m_stopThread)
{ {
SANE_Parameters params; SANE_Parameters params;
@ -1141,20 +1151,29 @@ void HGAPI HGSaneDeviceImpl::ThreadFunc(HGThread thread, HGPointer param)
if (NULL != img) if (NULL != img)
{ {
HGBase_SetImageDpi(img, p->m_dpi, p->m_dpi); HGBase_SetImageDpi(img, p->m_dpi, p->m_dpi);
if (HGBASE_ERR_OK == doubleImgRet && SCANNER_ERR_DEVICE_DOUBLE_FEEDING == stat if (HGBASE_ERR_OK == doubleImgRet &&
&& HGSANE_ERR_UI_RESERVE_CHECK == doubleImgStat) 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); doubleImgRet = p->m_imageFunc((HGSaneDevice)p, img, HGSANE_IMAGE_TYPE_DOUBLE, p->m_imageParam);
if (HGSANE_ERR_IMAGE_RESERVE == doubleImgRet) if (HGSANE_ERR_IMAGE_RESERVE == doubleImgRet)
{
clickedReserveImg = true; clickedReserveImg = true;
if (multioutImgCount + spliteImgCount > 0)
multioutSpliteImgCount++;
}
} }
else else
{ {
// 普通图片或第二个双张图片 // 普通图片或第二个双张图片
p->m_imageFunc((HGSaneDevice)p, img, HGSANE_IMAGE_TYPE_NORMAL, p->m_imageParam); p->m_imageFunc((HGSaneDevice)p, img, HGSANE_IMAGE_TYPE_NORMAL, p->m_imageParam);
doubleImgRet = HGBASE_ERR_OK; doubleImgRet = HGBASE_ERR_OK;
if (multioutImgCount + spliteImgCount > 0)
multioutSpliteImgCount++;
} }
HGBase_DestroyImage(img); HGBase_DestroyImage(img);
@ -1165,6 +1184,12 @@ void HGAPI HGSaneDeviceImpl::ThreadFunc(HGThread thread, HGPointer param)
buffer = NULL; buffer = NULL;
bufferSize = 0; bufferSize = 0;
// 多流输出比图像拆分优先级高,如果多流输出和图像拆分同时开启,应出图数量等于多流输出图像数量的两倍
if (multioutSpliteImgCount == (multioutImgCount == 0 ? multioutImgCount + spliteImgCount : multioutImgCount * 2))
{
multioutSpliteImgCount = 0;
}
if (HGSANE_ERR_IMAGE_DISCARD == doubleImgRet) if (HGSANE_ERR_IMAGE_DISCARD == doubleImgRet)
{ {
saneAPI.sane_cancel_api(p->m_devHandle); saneAPI.sane_cancel_api(p->m_devHandle);
@ -1427,3 +1452,82 @@ HGResult HGSaneDeviceImpl::GetDoubleImgStatus(HGUInt *status)
return HGBASE_ERR_FAIL; 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;
}

View File

@ -105,6 +105,8 @@ private:
HGResult SetScanMode(const HGChar *scanMode); HGResult SetScanMode(const HGChar *scanMode);
HGResult SetScanCount(HGInt scanCount); HGResult SetScanCount(HGInt scanCount);
HGResult GetDoubleImgStatus(HGUInt *status); HGResult GetDoubleImgStatus(HGUInt *status);
HGResult GetMultioutImgCount(HGInt *count);
HGResult GetSpliteImgCount(HGInt *count);
private: private:
HGSaneSourceImpl* m_sourceImpl; HGSaneSourceImpl* m_sourceImpl;