src/lib/CDRParser.cpp |   57 ++++++++++++++++++++++++++++++++++++++++++--------
 src/lib/CDRParser.h   |    1 
 2 files changed, 50 insertions(+), 8 deletions(-)

New commits:
commit f8f82291345d635bcdd3b6d757f6968cb552820d
Author:     Fridrich Štrba <fridrich.st...@bluewin.ch>
AuthorDate: Thu Feb 6 11:15:50 2020 +0100
Commit:     Fridrich Štrba <fridrich.st...@bluewin.ch>
CommitDate: Thu Feb 6 11:15:50 2020 +0100

    More robust parsing of x3 fills
    
    Change-Id: Ib383d22dc33f494d69cee30f3b6100f1617cc034

diff --git a/src/lib/CDRParser.cpp b/src/lib/CDRParser.cpp
index 51434d1..e57fb67 100644
--- a/src/lib/CDRParser.cpp
+++ b/src/lib/CDRParser.cpp
@@ -1870,8 +1870,10 @@ void 
libcdr::CDRParser::readFild(librevenge::RVNGInputStream *input, unsigned le
     else
       input->seek(1, librevenge::RVNG_SEEK_CUR);
     color1 = readColor(input);
-    if (m_version >= 1300)
+    if (m_version >= 1600)
       input->seek(31, librevenge::RVNG_SEEK_CUR);
+    else if (m_version >= 1300)
+      input->seek(10, librevenge::RVNG_SEEK_CUR);
     color2 = readColor(input);
     imageFill = libcdr::CDRImageFill(patternId, patternWidth, patternHeight, 
isRelative, tileOffsetX, tileOffsetY, rcpOffset, flags);
   }
@@ -1880,12 +1882,14 @@ void 
libcdr::CDRParser::readFild(librevenge::RVNGInputStream *input, unsigned le
   {
     if (m_version < 600)
       fillType = 10;
-    input->seek(2, librevenge::RVNG_SEEK_CUR);
-    unsigned patternId = readUnsigned(input);
-    if (m_version >= 1600)
-      input->seek(26, librevenge::RVNG_SEEK_CUR);
-    else if (m_version >= 1300)
+    if (m_version >= 1300)
+    {
+      _skipX3Optional(input);
+      input->seek(-4, librevenge::RVNG_SEEK_CUR);
+    }
+    else
       input->seek(2, librevenge::RVNG_SEEK_CUR);
+    unsigned patternId = readUnsigned(input);
     int tmpWidth = readUnsigned(input);
     int tmpHeight = readUnsigned(input);
     double tileOffsetX = 0.0;
@@ -1920,7 +1924,10 @@ void 
libcdr::CDRParser::readFild(librevenge::RVNGInputStream *input, unsigned le
   case 10: // Full color
   {
     if (m_version >= 1300)
-      input->seek(28, librevenge::RVNG_SEEK_CUR);
+    {
+      _skipX3Optional(input);
+      input->seek(-4, librevenge::RVNG_SEEK_CUR);
+    }
     else
       input->seek(2, librevenge::RVNG_SEEK_CUR);
     unsigned patternId = readUnsigned(input);
@@ -1960,7 +1967,10 @@ void 
libcdr::CDRParser::readFild(librevenge::RVNGInputStream *input, unsigned le
     if (m_version < 600)
       fillType = 10;
     if (m_version >= 1300)
-      input->seek(36, librevenge::RVNG_SEEK_CUR);
+    {
+      _skipX3Optional(input);
+      input->seek(-4, librevenge::RVNG_SEEK_CUR);
+    }
     else
       input->seek(2, librevenge::RVNG_SEEK_CUR);
     unsigned patternId = readU32(input);
@@ -3475,5 +3485,36 @@ void 
libcdr::CDRParser::_readX6StyleString(librevenge::RVNGInputStream *input, u
   }
 }
 
+void libcdr::CDRParser::_skipX3Optional(librevenge::RVNGInputStream *input)
+{
+  if (m_version < 1300)
+    return;
+
+  bool goOut = false;
+
+  while (!goOut)
+  {
+    switch (readU32(input))
+    {
+    case 0x640:
+    {
+      unsigned length = readU32(input);
+      input->seek(length, librevenge::RVNG_SEEK_CUR);
+      break;
+    }
+    case 0x514:
+    {
+      input->seek(4, librevenge::RVNG_SEEK_CUR);
+      break;
+    }
+    default:
+    {
+      input->seek(-4, librevenge::RVNG_SEEK_CUR);
+      goOut = true;
+      break;
+    }
+    }
+  }
+}
 
 /* vim:set shiftwidth=2 softtabstop=2 expandtab: */
diff --git a/src/lib/CDRParser.h b/src/lib/CDRParser.h
index 242736d..76c46e0 100644
--- a/src/lib/CDRParser.h
+++ b/src/lib/CDRParser.h
@@ -94,6 +94,7 @@ private:
 
   bool _redirectX6Chunk(librevenge::RVNGInputStream **input, unsigned &length);
   void _readX6StyleString(librevenge::RVNGInputStream *input, unsigned length, 
CDRStyle &style);
+  void _skipX3Optional(librevenge::RVNGInputStream *input);
 
   const std::vector<std::unique_ptr<librevenge::RVNGInputStream>> 
&m_externalStreams;
 
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to