From 1428eb1dc2f6540ec2261da6bdfd8ca2e79d7a58 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Toma=C5=BE=20Vajngerl?= Date: Fri, 1 Sep 2023 21:20:05 +0200 Subject: [PATCH] tdf#147704 fix reading TIFF metadata (width and height) MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit When we prepare (not read and load) the bitmap we need to read only the metadata - most importantly pixel width and height. This didn't work correctly for the TIFF files or more importantly the specific TIFF files in the document, and the result was that the size reported was 0,0 and somehow the crop factor wasn't applied correctly. This change fixes the metadata reading and makes it more robust. Change-Id: I60951e5d01afc311c400589496ae82377ccb4cf5 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/156457 Tested-by: Jenkins Reviewed-by: Tomaž Vajngerl (cherry picked from commit 9c636d76a9a7e167da39913ab60f5135f8e831a6) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/156437 Reviewed-by: Xisco Fauli --- vcl/source/filter/GraphicFormatDetector.cxx | 134 +++++++++++++--------------- 1 file changed, 64 insertions(+), 70 deletions(-) diff --git a/vcl/source/filter/GraphicFormatDetector.cxx b/vcl/source/filter/GraphicFormatDetector.cxx index fc43cdd963ab..1a216bb1db92 100644 --- a/vcl/source/filter/GraphicFormatDetector.cxx +++ b/vcl/source/filter/GraphicFormatDetector.cxx @@ -33,7 +33,6 @@ constexpr sal_uInt32 SVG_CHECK_SIZE = 2048; constexpr sal_uInt32 WMF_EMF_CHECK_SIZE = 44; -constexpr sal_uInt32 DATA_SIZE = 640; namespace { @@ -716,6 +715,7 @@ bool GraphicFormatDetector::checkTIF() if (bDetectOk) { sal_uInt16 nTemp16 = 0; + sal_uInt32 nTemp32 = 0; mrStream.ReadUInt16(nTemp16); if (nTemp16 == 0x2a) @@ -725,90 +725,84 @@ bool GraphicFormatDetector::checkTIF() if (mbExtendedInfo) { - sal_uLong nCount; - sal_uLong nMax = DATA_SIZE - 48; - sal_uInt32 nTemp32 = 0; + sal_uInt32 nIfdOffset = 0; // Offset of the first IFD - mrStream.ReadUInt32(nTemp32); - nCount = nTemp32 + 2; - mrStream.SeekRel(nCount - 0x08); + mrStream.ReadUInt32(nIfdOffset); + mrStream.SeekRel(nIfdOffset - 8); // read 6 bytes until here + + sal_uInt16 nNumberOfTags = 0; + mrStream.ReadUInt16(nNumberOfTags); + + bool bOk = true; + sal_Int32 nCount = 0; - if (nCount < nMax) + // read tags till we find Tag256(Width) + mrStream.ReadUInt16(nTemp16); + while (nTemp16 != 256 && bOk) { - bool bOk = false; + mrStream.SeekRel(10); + mrStream.ReadUInt16(nTemp16); + nCount++; + if (nCount > nNumberOfTags) + bOk = false; + } - // read tags till we find Tag256 ( Width ) - // do not read more bytes than DATA_SIZE + if (bOk) + { + // width mrStream.ReadUInt16(nTemp16); - while (nTemp16 != 256) + mrStream.SeekRel(4); + if (nTemp16 == 3) { - bOk = nCount < nMax; - if (!bOk) - { - break; - } - mrStream.SeekRel(10); mrStream.ReadUInt16(nTemp16); - nCount += 12; + maMetadata.maPixSize.setWidth(nTemp16); + mrStream.SeekRel(2); + } + else + { + mrStream.ReadUInt32(nTemp32); + maMetadata.maPixSize.setWidth(nTemp32); } - if (bOk) + // height + mrStream.SeekRel(2); + mrStream.ReadUInt16(nTemp16); + mrStream.SeekRel(4); + if (nTemp16 == 3) { - // width mrStream.ReadUInt16(nTemp16); - mrStream.SeekRel(4); - if (nTemp16 == 3) - { - mrStream.ReadUInt16(nTemp16); - maMetadata.maPixSize.setWidth(nTemp16); - mrStream.SeekRel(2); - } - else - { - mrStream.ReadUInt32(nTemp32); - maMetadata.maPixSize.setWidth(nTemp32); - } - - // height + maMetadata.maPixSize.setHeight(nTemp16); mrStream.SeekRel(2); + } + else + { + mrStream.ReadUInt32(nTemp32); + maMetadata.maPixSize.setHeight(nTemp32); + } + + // Bits/Pixel + mrStream.ReadUInt16(nTemp16); + if (nTemp16 == 258) + { + mrStream.SeekRel(6); mrStream.ReadUInt16(nTemp16); - mrStream.SeekRel(4); - if (nTemp16 == 3) - { - mrStream.ReadUInt16(nTemp16); - maMetadata.maPixSize.setHeight(nTemp16); - mrStream.SeekRel(2); - } - else - { - mrStream.ReadUInt32(nTemp32); - maMetadata.maPixSize.setHeight(nTemp32); - } - - // Bits/Pixel - mrStream.ReadUInt16(nTemp16); - if (nTemp16 == 258) - { - mrStream.SeekRel(6); - mrStream.ReadUInt16(nTemp16); - maMetadata.mnBitsPerPixel = nTemp16; - mrStream.SeekRel(2); - } - else - mrStream.SeekRel(-2); - - // compression - mrStream.ReadUInt16(nTemp16); - if (nTemp16 == 259) - { - mrStream.SeekRel(6); - mrStream.ReadUInt16(nTemp16); // compression - mrStream.SeekRel(2); - } - else - mrStream.SeekRel(-2); + maMetadata.mnBitsPerPixel = nTemp16; + mrStream.SeekRel(2); + } + else + mrStream.SeekRel(-2); + + // compression + mrStream.ReadUInt16(nTemp16); + if (nTemp16 == 259) + { + mrStream.SeekRel(6); + mrStream.ReadUInt16(nTemp16); // compression + mrStream.SeekRel(2); } + else + mrStream.SeekRel(-2); } } } -- 2.11.4.GIT