优化多流拆分开启,双张图像校验不弹窗提示的问题;
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;
|
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;
|
||||||
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue