优化多流拆分开启,双张图像校验不弹窗提示的问题;

This commit is contained in:
yangjiaxuan 2024-03-12 17:27:53 +08:00
parent f3dcc88420
commit 66d0069cc5
2 changed files with 127 additions and 28 deletions

View File

@ -1016,18 +1016,11 @@ void HGAPI HGSaneDeviceImpl::ThreadFunc(HGThread thread, HGPointer param)
HGUInt doubleImgStat = HGBASE_ERR_OK; HGUInt doubleImgStat = HGBASE_ERR_OK;
p->GetDoubleImgStatus(&doubleImgStat); p->GetDoubleImgStatus(&doubleImgStat);
// 获取多流输出开启时,不同模式下应出图张数 // 获取多流输出和图像拆分开启时应出图数量
HGInt multioutImgCount = 0; HGInt finalImgCount = 0;
p->GetMultioutImgCount(&multioutImgCount); p->GetfinalImgCount(&finalImgCount);
// 获取图像拆分开启时的应出图张数
HGInt spliteImgCount = 0;
p->GetSpliteImgCount(&spliteImgCount);
// 获取当前是否开启对折或者单面模式
HGBool isFold = false;
p->GetIsFold(&isFold);
// 标记多流输出、对折或图像拆分开启后的实际出图数量
HGInt multioutSpliteImgCount = 0; HGInt multioutSpliteImgCount = 0;
SANE_Status stat = saneAPI.sane_start_api(p->m_devHandle); 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) if (HGSANE_ERR_IMAGE_RESERVE == doubleImgRet)
{ {
clickedReserveImg = true; clickedReserveImg = true;
if (multioutImgCount + spliteImgCount > 0) if (finalImgCount > 0)
multioutSpliteImgCount++; 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); 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) if (SCANNER_ERR_DEVICE_DOUBLE_FEEDING == stat && HGSANE_ERR_UI_RESERVE_CHECK == doubleImgStat && finalImgCount > 0)
multioutSpliteImgCount++; multioutSpliteImgCount++;
} }
@ -1188,22 +1181,12 @@ void HGAPI HGSaneDeviceImpl::ThreadFunc(HGThread thread, HGPointer param)
buffer = NULL; buffer = NULL;
bufferSize = 0; 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; multioutSpliteImgCount = 0;
} }
}
else
{
// 如果对折模式或单面和多流输出同时开启,多流输出图像数量减半
if (multioutSpliteImgCount == (multioutImgCount == 0 ? multioutImgCount + spliteImgCount : multioutImgCount / 2))
{
multioutSpliteImgCount = 0;
}
}
if (HGSANE_ERR_IMAGE_DISCARD == doubleImgRet) if (HGSANE_ERR_IMAGE_DISCARD == doubleImgRet)
{ {
@ -1468,6 +1451,34 @@ HGResult HGSaneDeviceImpl::GetDoubleImgStatus(HGUInt *status)
return HGBASE_ERR_FAIL; 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) HGResult HGSaneDeviceImpl::GetMultioutImgCount(HGInt *count)
{ {
SANE_Int dev_options = 0; SANE_Int dev_options = 0;
@ -1491,7 +1502,19 @@ HGResult HGSaneDeviceImpl::GetMultioutImgCount(HGInt *count)
} }
if (!isMultiout) if (!isMultiout)
{
HGInt multiRedImgCount = 0;
GetMultiFilterRedImgCount(&multiRedImgCount);
// 多流输出除红与多流输出互斥
if (multiRedImgCount > 0)
{
*count = multiRedImgCount;
return HGBASE_ERR_OK;
}
return HGBASE_ERR_FAIL; return HGBASE_ERR_FAIL;
}
for (int i = 1; i < dev_options; ++i) 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); 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 (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; fold = true;
*isFold = fold; *isFold = fold;
@ -1575,3 +1598,76 @@ HGResult HGSaneDeviceImpl::GetIsFold(HGBool *isFold)
return HGBASE_ERR_FAIL; 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;
}

View File

@ -105,9 +105,12 @@ 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 GetMultiFilterRedImgCount(HGInt *count);
HGResult GetMultioutImgCount(HGInt *count); HGResult GetMultioutImgCount(HGInt *count);
HGResult GetSpliteImgCount(HGInt *count); HGResult GetSpliteImgCount(HGInt *count);
HGResult GetIsFold(HGBool *isFold); HGResult GetIsFold(HGBool *isFold);
HGResult GetIsSingle(HGBool *isSingle);
HGResult GetfinalImgCount(HGInt *count);
private: private:
HGSaneSourceImpl* m_sourceImpl; HGSaneSourceImpl* m_sourceImpl;