解决多流输出和图像拆分会导致双张保留图像多次弹窗提示的问题;BUG-922
This commit is contained in:
parent
2ac71f54e3
commit
ea2c615497
|
@ -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;
|
||||||
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue