[Libreoffice-commits] libcdr.git: src/lib

Fridrich Å trba fridrich.strba at bluewin.ch
Tue Apr 1 16:37:46 PDT 2014


 src/lib/CDRParser.cpp |  176 ++++++++++++++++++++++++++------------------------
 src/lib/CDRParser.h   |    1 
 2 files changed, 94 insertions(+), 83 deletions(-)

New commits:
commit 7e91dba8fbcb237f281ad0a113cf51326154b4d5
Author: Fridrich Å trba <fridrich.strba at bluewin.ch>
Date:   Wed Apr 2 01:37:02 2014 +0200

    CorelDraw X7 txsm
    
    Change-Id: I2f0507fe2a72f3c1adb3ff60c557ca14c977ec6a

diff --git a/src/lib/CDRParser.cpp b/src/lib/CDRParser.cpp
index 5782ff7..62d967d 100644
--- a/src/lib/CDRParser.cpp
+++ b/src/lib/CDRParser.cpp
@@ -151,85 +151,6 @@ static int parseColourString(const char *colourString, libcdr::CDRColor &colour,
   return 1;
 }
 
-static void _readX6StyleString(librevenge::RVNGInputStream *input, unsigned length, libcdr::CDRCharacterStyle &style)
-{
-  std::vector<unsigned char> styleBuffer(length);
-  unsigned long numBytesRead = 0;
-  const unsigned char *tmpBuffer = input->read(length, numBytesRead);
-  if (numBytesRead)
-    memcpy(&styleBuffer[0], tmpBuffer, numBytesRead);
-  librevenge::RVNGString styleString;
-  libcdr::appendCharacters(styleString, styleBuffer);
-  CDR_DEBUG_MSG(("CDRParser::_readX6StyleString - styleString = \"%s\"\n", styleString.cstr()));
-
-  boost::property_tree::ptree pt;
-  try
-  {
-    std::stringstream ss;
-    ss << styleString.cstr();
-    boost::property_tree::read_json(ss, pt);
-  }
-  catch (...)
-  {
-    return;
-  }
-
-  if (pt.count("character"))
-  {
-    boost::optional<std::string> fontName = pt.get_optional<std::string>("character.latin.font");
-    if (!!fontName)
-      style.m_fontName = fontName.get().c_str();
-    unsigned short encoding = pt.get("character.latin.charset", 0);
-    if (encoding || style.m_charSet == (unsigned short)-1)
-      style.m_charSet = encoding;
-    processNameForEncoding(style.m_fontName, style.m_charSet);
-    boost::optional<unsigned> fontSize = pt.get_optional<unsigned>("character.latin.size");
-    if (!!fontSize)
-      style.m_fontSize = (double)fontSize.get() / 254000.0;
-
-    if (pt.count("character.outline"))
-    {
-      style.m_lineStyle.lineType = 0;
-      boost::optional<unsigned> lineWidth = pt.get_optional<unsigned>("character.outline.width");
-      if (!!lineWidth)
-        style.m_lineStyle.lineWidth = (double)lineWidth.get() / 254000.0;
-      boost::optional<std::string> color = pt.get_optional<std::string>("character.outline.color");
-      if (!!color)
-      {
-        double opacity = 1.0;
-        parseColourString(color.get().c_str(), style.m_lineStyle.color, opacity);
-      }
-    }
-
-    if (pt.count("character.fill"))
-    {
-      boost::optional<unsigned short> type = pt.get_optional<unsigned short>("character.fill.type");
-      if (!!type)
-        style.m_fillStyle.fillType = type.get();
-      boost::optional<std::string> color1 = pt.get_optional<std::string>("character.fill.primaryColor");
-      if (!!color1)
-      {
-        double opacity = 1.0;
-        parseColourString(color1.get().c_str(), style.m_fillStyle.color1, opacity);
-      }
-      boost::optional<std::string> color2 = pt.get_optional<std::string>("character.fill.primaryColor");
-      if (!!color2)
-      {
-        double opacity = 1.0;
-        parseColourString(color2.get().c_str(), style.m_fillStyle.color2, opacity);
-      }
-    }
-  }
-
-  if (pt.count("paragraph"))
-  {
-    boost::optional<unsigned> align = pt.get_optional<unsigned>("paragraph.justify");
-    if (!!align)
-      style.m_align = align.get();
-  }
-}
-
-
 } // anonymous namespace
 
 libcdr::CDRParser::CDRParser(const std::vector<librevenge::RVNGInputStream *> &externalStreams, libcdr::CDRCollector *collector)
@@ -3044,7 +2965,9 @@ void libcdr::CDRParser::readTxsm16(librevenge::RVNGInputStream *input)
     {
       input->seek(28, librevenge::RVNG_SEEK_CUR);
       unsigned tlen = readU32(input);
-      input->seek(2*tlen + 4, librevenge::RVNG_SEEK_CUR);
+      if (m_version < 1700)
+        tlen *= 2;
+      input->seek(tlen + 4, librevenge::RVNG_SEEK_CUR);
     }
     else
     {
@@ -3076,8 +2999,10 @@ void libcdr::CDRParser::readTxsm16(librevenge::RVNGInputStream *input)
     input->seek(1, librevenge::RVNG_SEEK_CUR);
 
     unsigned len2 = readU32(input);
+    if (m_version < 1700)
+      len2 *= 2;
     CDRCharacterStyle defaultStyle;
-    _readX6StyleString(input, 2*len2, defaultStyle);
+    _readX6StyleString(input, len2, defaultStyle);
 
     unsigned numRecords = readU32(input);
 
@@ -3093,10 +3018,13 @@ void libcdr::CDRParser::readTxsm16(librevenge::RVNGInputStream *input)
       if (flag & 0x04)
       {
         lenN = readU32(input);
-        input->seek(2*lenN, librevenge::RVNG_SEEK_CUR);
+        lenN *= 2;
+        input->seek(lenN, librevenge::RVNG_SEEK_CUR);
       }
       lenN = readU32(input);
-      _readX6StyleString(input, 2*lenN, charStyles[i*2]);
+      if (m_version < 1700)
+        lenN *= 2;
+      _readX6StyleString(input, lenN, charStyles[i*2]);
     }
 
     unsigned numChars = readU32(input);
@@ -3392,4 +3320,86 @@ void libcdr::CDRParser::readParagraphText(librevenge::RVNGInputStream *input)
   m_collector->collectParagraphText(0.0, 0.0, width, height);
 }
 
+void libcdr::CDRParser::_readX6StyleString(librevenge::RVNGInputStream *input, unsigned length, libcdr::CDRCharacterStyle &style)
+{
+  std::vector<unsigned char> styleBuffer(length);
+  unsigned long numBytesRead = 0;
+  const unsigned char *tmpBuffer = input->read(length, numBytesRead);
+  if (numBytesRead)
+    memcpy(&styleBuffer[0], tmpBuffer, numBytesRead);
+  librevenge::RVNGString styleString;
+  if (m_version >= 1700)
+    libcdr::appendCharacters(styleString, styleBuffer, 0);
+  else
+    libcdr::appendCharacters(styleString, styleBuffer);
+  CDR_DEBUG_MSG(("CDRParser::_readX6StyleString - styleString = \"%s\"\n", styleString.cstr()));
+
+  boost::property_tree::ptree pt;
+  try
+  {
+    std::stringstream ss;
+    ss << styleString.cstr();
+    boost::property_tree::read_json(ss, pt);
+  }
+  catch (...)
+  {
+    return;
+  }
+
+  if (pt.count("character"))
+  {
+    boost::optional<std::string> fontName = pt.get_optional<std::string>("character.latin.font");
+    if (!!fontName)
+      style.m_fontName = fontName.get().c_str();
+    unsigned short encoding = pt.get("character.latin.charset", 0);
+    if (encoding || style.m_charSet == (unsigned short)-1)
+      style.m_charSet = encoding;
+    processNameForEncoding(style.m_fontName, style.m_charSet);
+    boost::optional<unsigned> fontSize = pt.get_optional<unsigned>("character.latin.size");
+    if (!!fontSize)
+      style.m_fontSize = (double)fontSize.get() / 254000.0;
+
+    if (pt.count("character.outline"))
+    {
+      style.m_lineStyle.lineType = 0;
+      boost::optional<unsigned> lineWidth = pt.get_optional<unsigned>("character.outline.width");
+      if (!!lineWidth)
+        style.m_lineStyle.lineWidth = (double)lineWidth.get() / 254000.0;
+      boost::optional<std::string> color = pt.get_optional<std::string>("character.outline.color");
+      if (!!color)
+      {
+        double opacity = 1.0;
+        parseColourString(color.get().c_str(), style.m_lineStyle.color, opacity);
+      }
+    }
+
+    if (pt.count("character.fill"))
+    {
+      boost::optional<unsigned short> type = pt.get_optional<unsigned short>("character.fill.type");
+      if (!!type)
+        style.m_fillStyle.fillType = type.get();
+      boost::optional<std::string> color1 = pt.get_optional<std::string>("character.fill.primaryColor");
+      if (!!color1)
+      {
+        double opacity = 1.0;
+        parseColourString(color1.get().c_str(), style.m_fillStyle.color1, opacity);
+      }
+      boost::optional<std::string> color2 = pt.get_optional<std::string>("character.fill.primaryColor");
+      if (!!color2)
+      {
+        double opacity = 1.0;
+        parseColourString(color2.get().c_str(), style.m_fillStyle.color2, opacity);
+      }
+    }
+  }
+
+  if (pt.count("paragraph"))
+  {
+    boost::optional<unsigned> align = pt.get_optional<unsigned>("paragraph.justify");
+    if (!!align)
+      style.m_align = align.get();
+  }
+}
+
+
 /* vim:set shiftwidth=2 softtabstop=2 expandtab: */
diff --git a/src/lib/CDRParser.h b/src/lib/CDRParser.h
index a061b74..d959507 100644
--- a/src/lib/CDRParser.h
+++ b/src/lib/CDRParser.h
@@ -94,6 +94,7 @@ private:
   void readParagraphText(librevenge::RVNGInputStream *input);
 
   bool _redirectX6Chunk(librevenge::RVNGInputStream **input, unsigned &length);
+  void _readX6StyleString(librevenge::RVNGInputStream *input, unsigned length, CDRCharacterStyle &style);
 
   std::vector<librevenge::RVNGInputStream *> m_externalStreams;
 


More information about the Libreoffice-commits mailing list