优化多流拆分开启,双张图像校验不弹窗提示的问题;
This commit is contained in:
parent
f3dcc88420
commit
66d0069cc5
|
@ -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,22 +1181,12 @@ void HGAPI HGSaneDeviceImpl::ThreadFunc(HGThread thread, HGPointer param)
|
|||
buffer = NULL;
|
||||
bufferSize = 0;
|
||||
|
||||
if (!isFold)
|
||||
{
|
||||
// 多流输出比图像拆分优先级高,如果多流输出和图像拆分同时开启,应出图数量等于多流输出图像数量的两倍
|
||||
if (multioutSpliteImgCount == (multioutImgCount == 0 ? multioutImgCount + spliteImgCount : multioutImgCount * 2))
|
||||
if (SCANNER_ERR_DEVICE_DOUBLE_FEEDING == stat &&
|
||||
HGSANE_ERR_UI_RESERVE_CHECK == doubleImgStat &&
|
||||
multioutSpliteImgCount == finalImgCount)
|
||||
{
|
||||
multioutSpliteImgCount = 0;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// 如果对折模式或单面和多流输出同时开启,多流输出图像数量减半
|
||||
if (multioutSpliteImgCount == (multioutImgCount == 0 ? multioutImgCount + spliteImgCount : multioutImgCount / 2))
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue