vcl/source/filter/GraphicFormatDetector.cxx |  134 +++++++++++++---------------
 1 file changed, 64 insertions(+), 70 deletions(-)

New commits:
commit 1428eb1dc2f6540ec2261da6bdfd8ca2e79d7a58
Author:     Tomaž Vajngerl <tomaz.vajng...@collabora.co.uk>
AuthorDate: Fri Sep 1 21:20:05 2023 +0200
Commit:     Xisco Fauli <xiscofa...@libreoffice.org>
CommitDate: Mon Sep 4 09:49:28 2023 +0200

    tdf#147704 fix reading TIFF metadata (width and height)
    
    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 <qui...@gmail.com>
    (cherry picked from commit 9c636d76a9a7e167da39913ab60f5135f8e831a6)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/156437
    Reviewed-by: Xisco Fauli <xiscofa...@libreoffice.org>

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);
                     }
                 }
             }

Reply via email to