Don't loose scanned image's resolution precision

Change-Id: I526dcf8db880615308cfb228eaa06d1a5a0e5cac
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/125584
Tested-by: Jenkins
Reviewed-by: Mike Kaganski <mike.kaganski@collabora.com>
This commit is contained in:
Mike Kaganski
2021-11-20 10:58:51 +01:00
parent 867abf5b8e
commit 6d528515c5
+8 -11
View File
@@ -36,10 +36,7 @@
namespace
{
TW_INT32 FixToInt32(const TW_FIX32& rFix)
{
return static_cast<TW_INT32>(floor(rFix.Whole + rFix.Frac / 65536. + 0.5));
}
double FixToDouble(const TW_FIX32& rFix) { return rFix.Whole + rFix.Frac / 65536.; }
const wchar_t sTwainWndClass[] = L"TwainClass";
@@ -383,12 +380,12 @@ void ImpTwain::ImplXfer()
{
TW_IMAGEINFO aInfo;
HANDLE hDIB = nullptr;
TW_INT32 nXRes, nYRes;
double nXRes, nYRes;
if (m_pDSM(&m_aAppId, &m_aSrcId, DG_IMAGE, DAT_IMAGEINFO, MSG_GET, &aInfo) == TWRC_SUCCESS)
{
nXRes = FixToInt32(aInfo.XResolution);
nYRes = FixToInt32(aInfo.YResolution);
nXRes = FixToDouble(aInfo.XResolution);
nYRes = FixToDouble(aInfo.YResolution);
}
else
nXRes = nYRes = -1;
@@ -411,15 +408,15 @@ void ImpTwain::ImplXfer()
{
if (LPVOID pBmpMem = GlobalLock(hGlob))
{
if ((nXRes != -1) && (nYRes != -1))
if ((nXRes > 0) && (nYRes > 0))
{
// set resolution of bitmap
BITMAPINFOHEADER* pBIH = static_cast<BITMAPINFOHEADER*>(pBmpMem);
static const auto[m, d]
const auto[m, d]
= getConversionMulDiv(o3tl::Length::in, o3tl::Length::m);
pBIH->biXPelsPerMeter = o3tl::convert(nXRes, d, m);
pBIH->biYPelsPerMeter = o3tl::convert(nYRes, d, m);
pBIH->biXPelsPerMeter = std::round(o3tl::convert(nXRes, d, m));
pBIH->biYPelsPerMeter = std::round(o3tl::convert(nYRes, d, m));
}
HANDLE hMap = CreateFileMappingW(INVALID_HANDLE_VALUE, nullptr,