[Libreoffice-commits] libcdr.git: 3 commits - build/win32 configure.ac src/lib

Fridrich Å trba fridrich.strba at bluewin.ch
Fri Apr 12 12:36:44 PDT 2013


 build/win32/libcdr.vcproj       |    4 -
 build/win32/libcdr.vcxproj      |    4 -
 configure.ac                    |   11 ++
 src/lib/CDRCollector.cpp        |    2 
 src/lib/CDRCollector.h          |    2 
 src/lib/CDRContentCollector.cpp |    5 -
 src/lib/CDRContentCollector.h   |    1 
 src/lib/CDRParser.cpp           |  154 ++++++++++++++++++++++++++++++----------
 src/lib/CDRParser.h             |    5 -
 src/lib/CDRStylesCollector.cpp  |   16 ----
 src/lib/CDRStylesCollector.h    |    1 
 src/lib/CDRTypes.h              |   17 ++--
 12 files changed, 149 insertions(+), 73 deletions(-)

New commits:
commit e25fd12e203544a86a588af71e8c83b243320552
Author: Fridrich Å trba <fridrich.strba at bluewin.ch>
Date:   Fri Apr 12 21:36:19 2013 +0200

    Actually extract some style information from the style string

diff --git a/src/lib/CDRParser.cpp b/src/lib/CDRParser.cpp
index 0646156..1547d90 100644
--- a/src/lib/CDRParser.cpp
+++ b/src/lib/CDRParser.cpp
@@ -128,7 +128,7 @@ static void processNameForEncoding(WPXString &name, unsigned short &encoding)
   return;
 }
 
-static void _processX6StyleString(const char *styleString, libcdr::CDRCharacterStyle & /*style*/)
+static void _processX6StyleString(const char *styleString, libcdr::CDRCharacterStyle &style)
 {
   boost::property_tree::ptree pt;
   try
@@ -141,6 +141,15 @@ static void _processX6StyleString(const char *styleString, libcdr::CDRCharacterS
   {
     return;
   }
+  std::string fontName = pt.get("character.latin.font", style.m_fontName.cstr());
+  style.m_fontName = fontName.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);
+  unsigned fontSize = pt.get("character.latin.size", 0);
+  if (fontSize)
+    style.m_fontSize = (double)fontSize / 254000.0;
 }
 
 static void _readX6StyleString(WPXInputStream *input, unsigned length, libcdr::CDRCharacterStyle &style)
commit ded49b837453e7cd08b67e1a109e6b0fbec4cbd5
Author: Fridrich Å trba <fridrich.strba at bluewin.ch>
Date:   Fri Apr 12 20:35:55 2013 +0200

    Refactor the CDRCharacterStyle struct

diff --git a/src/lib/CDRCollector.cpp b/src/lib/CDRCollector.cpp
index d6958d5..0eca5eb 100644
--- a/src/lib/CDRCollector.cpp
+++ b/src/lib/CDRCollector.cpp
@@ -34,7 +34,7 @@
 
 libcdr::CDRParserState::CDRParserState()
   : m_fillStyles(), m_lineStyles(), m_bmps(), m_patterns(), m_vects(), m_pages(),
-    m_documentPalette(), m_fonts(), m_texts(),
+    m_documentPalette(), m_texts(),
     m_colorTransformCMYK2RGB(0), m_colorTransformLab2RGB(0), m_colorTransformRGB2RGB(0)
 {
   cmsHPROFILE tmpRGBProfile = cmsCreate_sRGBProfile();
diff --git a/src/lib/CDRCollector.h b/src/lib/CDRCollector.h
index c17cbb4..c81be10 100644
--- a/src/lib/CDRCollector.h
+++ b/src/lib/CDRCollector.h
@@ -61,7 +61,6 @@ public:
   std::map<unsigned, WPXBinaryData> m_vects;
   std::vector<CDRPage> m_pages;
   std::map<unsigned, CDRColor> m_documentPalette;
-  std::map<unsigned, CDRFont> m_fonts;
   std::map<unsigned, std::vector<CDRTextLine> > m_texts;
 
   unsigned _getRGBColor(const CDRColor &color);
@@ -123,7 +122,6 @@ public:
   virtual void collectSpnd(unsigned spnd) = 0;
   virtual void collectVectorPattern(unsigned id, const WPXBinaryData &data) = 0;
   virtual void collectPaletteEntry(unsigned colorId, unsigned userId, const CDRColor &color) = 0;
-  virtual void collectFont(unsigned fontId, unsigned short fontEncoding, const WPXString &font) = 0;
   virtual void collectText(unsigned textId, unsigned styleId, const std::vector<unsigned char> &data,
                            const std::vector<unsigned char> &charDescriptions, const std::map<unsigned, CDRCharacterStyle> &styleOverrides) = 0;
   virtual void collectArtisticText(double x, double y) = 0;
diff --git a/src/lib/CDRContentCollector.cpp b/src/lib/CDRContentCollector.cpp
index 769b3f7..ea43090 100644
--- a/src/lib/CDRContentCollector.cpp
+++ b/src/lib/CDRContentCollector.cpp
@@ -488,9 +488,8 @@ void libcdr::CDRContentCollector::_flushCurrentPath()
         WPXPropertyList spanProps;
         double fontSize = (double)cdr_round(144.0*(*m_currentText)[i].m_line[j].m_charStyle.m_fontSize) / 2.0;
         spanProps.insert("fo:font-size", fontSize, WPX_POINT);
-        std::map<unsigned, CDRFont>::const_iterator iterFont = m_ps.m_fonts.find((*m_currentText)[i].m_line[j].m_charStyle.m_fontId);
-        if (iterFont != m_ps.m_fonts.end())
-          spanProps.insert("style:font-name", iterFont->second.m_name);
+        if ((*m_currentText)[i].m_line[j].m_charStyle.m_fontName.len())
+          spanProps.insert("style:font-name", (*m_currentText)[i].m_line[j].m_charStyle.m_fontName);
         std::map<unsigned, CDRFillStyle>::const_iterator iterFill = m_ps.m_fillStyles.find((*m_currentText)[i].m_line[j].m_charStyle.m_fillId);
         if (iterFill != m_ps.m_fillStyles.end())
           spanProps.insert("fo:color", m_ps.getRGBColorString(iterFill->second.color1));
diff --git a/src/lib/CDRContentCollector.h b/src/lib/CDRContentCollector.h
index a1e3e33..5a53418 100644
--- a/src/lib/CDRContentCollector.h
+++ b/src/lib/CDRContentCollector.h
@@ -86,7 +86,6 @@ public:
   void collectSpnd(unsigned spnd);
   void collectVectorPattern(unsigned id, const WPXBinaryData &data);
   void collectPaletteEntry(unsigned, unsigned, const CDRColor &) {}
-  void collectFont(unsigned, unsigned short, const WPXString &) {}
   void collectText(unsigned, unsigned, const std::vector<unsigned char> &,
                    const std::vector<unsigned char> &, const std::map<unsigned, CDRCharacterStyle> &) {}
   void collectArtisticText(double x, double y);
diff --git a/src/lib/CDRParser.cpp b/src/lib/CDRParser.cpp
index 8f025f5..0646156 100644
--- a/src/lib/CDRParser.cpp
+++ b/src/lib/CDRParser.cpp
@@ -161,7 +161,7 @@ static void _readX6StyleString(WPXInputStream *input, unsigned length, libcdr::C
 
 libcdr::CDRParser::CDRParser(const std::vector<WPXInputStream *> &externalStreams, libcdr::CDRCollector *collector)
   : CommonParser(collector),
-    m_externalStreams(externalStreams),
+    m_externalStreams(externalStreams), m_fonts(),
     m_version(0), m_fillId(0), m_outlId(0) {}
 
 libcdr::CDRParser::~CDRParser()
@@ -2392,7 +2392,8 @@ void libcdr::CDRParser::readFont(WPXInputStream *input, unsigned length)
   unsigned short fontId = readU16(input);
   unsigned short fontEncoding = readU16(input);
   input->seek(14, WPX_SEEK_CUR);
-  WPXString name;
+  std::vector<unsigned char> name;
+  WPXString fontName;
   if (m_version >= 1200)
   {
     unsigned short character = 0;
@@ -2400,10 +2401,14 @@ void libcdr::CDRParser::readFont(WPXInputStream *input, unsigned length)
     {
       character = readU16(input);
       if (character)
-        name.append((char)(character & 0xff));
+      {
+        name.push_back((unsigned char)(character & 0xff));
+        name.push_back((unsigned char)(character >> 8));
+      }
       else
         break;
     }
+    appendCharacters(fontName, name);
   }
   else
   {
@@ -2412,14 +2417,20 @@ void libcdr::CDRParser::readFont(WPXInputStream *input, unsigned length)
     {
       character = readU8(input);
       if (character)
-        name.append((char)character);
+        name.push_back(character);
       else
         break;
     }
+    appendCharacters(fontName, name, fontEncoding);
   }
   if (!fontEncoding)
-    processNameForEncoding(name, fontEncoding);
-  m_collector->collectFont(fontId, fontEncoding, name);
+    processNameForEncoding(fontName, fontEncoding);
+  std::map<unsigned, CDRFont>::const_iterator iter = m_fonts.find(fontId);
+  // Asume that the first font with the given ID is a font
+  // that we want, the others are substitution fonts. We might
+  // be utterly wrong in this one
+  if (iter == m_fonts.end())
+    m_fonts[fontId] = CDRFont(fontName, fontEncoding);
 }
 
 void libcdr::CDRParser::readStlt(WPXInputStream *input, unsigned length)
@@ -2614,10 +2625,18 @@ void libcdr::CDRParser::readStlt(WPXInputStream *input, unsigned length)
         {
           std::map<unsigned, unsigned short>::const_iterator iterFontId = fontIds.find(fontRecId);
           if (iterFontId != fontIds.end())
-            tmpCharStyle.m_fontId = iterFontId->second;
+          {
+            std::map<unsigned, CDRFont>::const_iterator iterFonts = m_fonts.find(iterFontId->second);
+            if (iterFonts != m_fonts.end())
+            {
+              tmpCharStyle.m_fontName = iterFonts->second.m_name;
+              tmpCharStyle.m_charSet = iterFonts->second.m_encoding;
+            }
+          }
           std::map<unsigned, unsigned short>::const_iterator iterCharSet = fontEncodings.find(fontRecId);
           if (iterCharSet != fontEncodings.end())
-            tmpCharStyle.m_charSet = iterCharSet->second;
+            if (iterCharSet->second)
+              tmpCharStyle.m_charSet = iterCharSet->second;
           std::map<unsigned, double>::const_iterator iterFontSize = fontSizes.find(fontRecId);
           if (iterFontSize != fontSizes.end())
             tmpCharStyle.m_fontSize = iterFontSize->second;
@@ -2766,8 +2785,16 @@ void libcdr::CDRParser::readTxsm(WPXInputStream *input, unsigned length)
         // Read more information depending on the flags
         if (fl2&1) // Font
         {
-          charStyle.m_fontId = readU16(input);
-          charStyle.m_charSet = readU16(input);
+          unsigned short fontId = readU16(input);
+          std::map<unsigned, CDRFont>::const_iterator iterFont = m_fonts.find(fontId);
+          if (iterFont != m_fonts.end())
+          {
+            charStyle.m_fontName = iterFont->second.m_name;
+            charStyle.m_charSet = iterFont->second.m_encoding;
+          }
+          unsigned short charSet = readU16(input);
+          if (charSet)
+            charStyle.m_charSet = charSet;
         }
         if (fl2&2) // Bold/Italic, etc.
           input->seek(4, WPX_SEEK_CUR);
@@ -2961,8 +2988,16 @@ void libcdr::CDRParser::readTxsm6(WPXInputStream *input)
     input->seek(3, WPX_SEEK_CUR);
     if (flag&0x01)
     {
-      charStyle.m_fontId = readU16(input);
-      charStyle.m_charSet = readU16(input);
+      unsigned short fontId = readU16(input);
+      std::map<unsigned, CDRFont>::const_iterator iterFont = m_fonts.find(fontId);
+      if (iterFont != m_fonts.end())
+      {
+        charStyle.m_fontName = iterFont->second.m_name;
+        charStyle.m_charSet = iterFont->second.m_encoding;
+      }
+      unsigned short charSet = readU16(input);
+      if (charSet)
+        charStyle.m_charSet = charSet;
     }
     else
       input->seek(4, WPX_SEEK_CUR);
@@ -3009,8 +3044,16 @@ void libcdr::CDRParser::readTxsm5(WPXInputStream *input)
     input->seek(1, WPX_SEEK_CUR);
     if (flag&0x01)
     {
-      charStyle.m_fontId = readU8(input);
-      charStyle.m_charSet = readU8(input);
+      unsigned short fontId = readU8(input);
+      std::map<unsigned, CDRFont>::const_iterator iterFont = m_fonts.find(fontId);
+      if (iterFont != m_fonts.end())
+      {
+        charStyle.m_fontName = iterFont->second.m_name;
+        charStyle.m_charSet = iterFont->second.m_encoding;
+      }
+      unsigned short charSet = readU8(input);
+      if (charSet)
+        charStyle.m_charSet = charSet;
     }
     else
       input->seek(2, WPX_SEEK_CUR);
@@ -3086,14 +3129,24 @@ void libcdr::CDRParser::readStyd(WPXInputStream *input)
       charStyle.m_outlId = readU32(input);
       break;
     case STYD_FONTS:
+    {
       if (m_version >= 600)
         input->seek(4, WPX_SEEK_CUR);
-      charStyle.m_fontId = readUnsignedShort(input);
-      charStyle.m_charSet = readUnsignedShort(input);
+      unsigned short fontId = readUnsignedShort(input);
+      std::map<unsigned, CDRFont>::const_iterator iterFont = m_fonts.find(fontId);
+      if (iterFont != m_fonts.end())
+      {
+        charStyle.m_fontName = iterFont->second.m_name;
+        charStyle.m_charSet = iterFont->second.m_encoding;
+      }
+      unsigned short charSet = readUnsignedShort(input);
+      if (charSet)
+        charStyle.m_charSet = charSet;
       if (m_version >= 600)
         input->seek(8, WPX_SEEK_CUR);
       charStyle.m_fontSize = readCoordinate(input);
       break;
+    }
     case STYD_ALIGN:
       charStyle.m_align = readUnsigned(input);
       break;
diff --git a/src/lib/CDRParser.h b/src/lib/CDRParser.h
index 3d954b9..d6a4ad2 100644
--- a/src/lib/CDRParser.h
+++ b/src/lib/CDRParser.h
@@ -115,9 +115,12 @@ private:
 
   std::vector<WPXInputStream *> m_externalStreams;
 
+  std::map<unsigned, CDRFont> m_fonts;
+
   unsigned m_version;
   unsigned m_fillId;
   unsigned m_outlId;
+
 };
 } // namespace libcdr
 
diff --git a/src/lib/CDRStylesCollector.cpp b/src/lib/CDRStylesCollector.cpp
index 634bf8c..08365df 100644
--- a/src/lib/CDRStylesCollector.cpp
+++ b/src/lib/CDRStylesCollector.cpp
@@ -241,16 +241,6 @@ void libcdr::CDRStylesCollector::collectPaletteEntry(unsigned colorId, unsigned
   m_ps.m_documentPalette[colorId] = color;
 }
 
-void libcdr::CDRStylesCollector::collectFont(unsigned fontId, unsigned short encoding, const WPXString &font)
-{
-  std::map<unsigned, CDRFont>::const_iterator iter = m_ps.m_fonts.find(fontId);
-  // Asume that the first font with the given ID is a font
-  // that we want, the others are substitution fonts. We might
-  // be utterly wrong in this one
-  if (iter == m_ps.m_fonts.end())
-    m_ps.m_fonts[fontId] = CDRFont(font, encoding);
-}
-
 void libcdr::CDRStylesCollector::collectText(unsigned textId, unsigned styleId, const std::vector<unsigned char> &data,
     const std::vector<unsigned char> &charDescriptions, const std::map<unsigned, CDRCharacterStyle> &styleOverrides)
 {
@@ -271,12 +261,6 @@ void libcdr::CDRStylesCollector::collectText(unsigned textId, unsigned styleId,
     std::map<unsigned, CDRCharacterStyle>::const_iterator iter = styleOverrides.find(tmpCharDescription & 0xfe);
     if (iter != styleOverrides.end())
       tmpCharStyle.overrideCharacterStyle(iter->second);
-    if (!tmpCharStyle.m_charSet)
-    {
-      std::map<unsigned, CDRFont>::const_iterator iterFont = m_ps.m_fonts.find(tmpCharStyle.m_fontId);
-      if (iterFont != m_ps.m_fonts.end())
-        tmpCharStyle.m_charSet = iterFont->second.m_encoding;
-    }
     if (charDescriptions[i] != tmpCharDescription)
     {
       WPXString text;
diff --git a/src/lib/CDRStylesCollector.h b/src/lib/CDRStylesCollector.h
index ecafd63..261b54e 100644
--- a/src/lib/CDRStylesCollector.h
+++ b/src/lib/CDRStylesCollector.h
@@ -88,7 +88,6 @@ public:
   void collectSpnd(unsigned) {}
   void collectVectorPattern(unsigned, const WPXBinaryData &) {}
   void collectPaletteEntry(unsigned colorId, unsigned userId, const CDRColor &color);
-  void collectFont(unsigned fontId, unsigned short fontEncoding, const WPXString &font);
   void collectText(unsigned textId, unsigned styleId, const std::vector<unsigned char> &data,
                    const std::vector<unsigned char> &charDescriptions, const std::map<unsigned, CDRCharacterStyle> &styleOverrides);
   void collectArtisticText(double, double) {}
diff --git a/src/lib/CDRTypes.h b/src/lib/CDRTypes.h
index 361932f..3461e83 100644
--- a/src/lib/CDRTypes.h
+++ b/src/lib/CDRTypes.h
@@ -33,6 +33,7 @@
 #include <math.h>
 #include <libwpd/libwpd.h>
 #include "CDRTransforms.h"
+#include "libcdr_utils.h"
 
 namespace libcdr
 {
@@ -153,23 +154,27 @@ struct CDRLineStyle
 
 struct CDRCharacterStyle
 {
-  unsigned short m_charSet, m_fontId;
+  unsigned short m_charSet;
+  WPXString m_fontName;
   double m_fontSize;
   unsigned m_align;
   double m_leftIndent, m_firstIndent, m_rightIndent;
   unsigned m_outlId, m_fillId, m_parentId;
   CDRCharacterStyle()
-    : m_charSet((unsigned short)-1), m_fontId((unsigned short)-1),
+    : m_charSet((unsigned short)-1), m_fontName(),
       m_fontSize(0.0), m_align(0), m_leftIndent(0.0), m_firstIndent(0.0),
-      m_rightIndent(0.0), m_outlId(0), m_fillId(0), m_parentId(0) {}
+      m_rightIndent(0.0), m_outlId(0), m_fillId(0), m_parentId(0)
+  {
+    m_fontName.clear();
+  }
   void overrideCharacterStyle(const CDRCharacterStyle &override)
   {
-    if (override.m_charSet != (unsigned short)-1 || override.m_fontId != (unsigned short)-1)
+    if (override.m_charSet != (unsigned short)-1 || override.m_fontName.len())
     {
       m_charSet = override.m_charSet;
-      m_fontId = override.m_fontId;
+      m_fontName = override.m_fontName;
     }
-    if (override.m_fontSize > 0.0)
+    if (!CDR_ALMOST_ZERO(override.m_fontSize))
       m_fontSize = override.m_fontSize;
     if (override.m_align)
       m_align = override.m_align;
commit 759665ce62a20ced7f5948108ce39afc7bfc3fc1
Author: Fridrich Å trba <fridrich.strba at bluewin.ch>
Date:   Fri Apr 12 19:37:25 2013 +0200

    Parse style string using boost::property_tree::json_read

diff --git a/build/win32/libcdr.vcproj b/build/win32/libcdr.vcproj
index 7cf7334..1f3c94f 100755
--- a/build/win32/libcdr.vcproj
+++ b/build/win32/libcdr.vcproj
@@ -41,7 +41,7 @@
 			<Tool
 				Name="VCCLCompilerTool"
 				Optimization="0"
-				AdditionalIncludeDirectories="$(LIBWPD_INCLUDE_DIR),$(LIBWPG_INCLUDE_DIR),$(LCMS2_INCLUDE_DIR),$(ZLIB_INCLUDE_DIR),$(ICU_INCLUDE_DIR)"
+				AdditionalIncludeDirectories="$(LIBWPD_INCLUDE_DIR),$(LIBWPG_INCLUDE_DIR),$(LCMS2_INCLUDE_DIR),$(ZLIB_INCLUDE_DIR),$(ICU_INCLUDE_DIR),$(BOOST_INCLUDE_DIR)"
 				PreprocessorDefinitions="_DEBUG;DEBUG;WIN32;_LIB;_CRT_SECURE_NO_WARNINGS"
 				BasicRuntimeChecks="3"
 				RuntimeLibrary="3"
@@ -116,7 +116,7 @@
 				Name="VCCLCompilerTool"
 				Optimization="2"
 				InlineFunctionExpansion="1"
-				AdditionalIncludeDirectories="$(LIBWPD_INCLUDE_DIR),$(LIBWPG_INCLUDE_DIR),$(LCMS2_INCLUDE_DIR),$(ZLIB_INCLUDE_DIR),$(ICU_INCLUDE_DIR)"
+				AdditionalIncludeDirectories="$(LIBWPD_INCLUDE_DIR),$(LIBWPG_INCLUDE_DIR),$(LCMS2_INCLUDE_DIR),$(ZLIB_INCLUDE_DIR),$(ICU_INCLUDE_DIR),$(BOOST_INCLUDE_DIR)"
 				PreprocessorDefinitions="NDEBUG;WIN32;_LIB;_CRT_SECURE_NO_WARNINGS"
 				StringPooling="true"
 				RuntimeLibrary="2"
diff --git a/build/win32/libcdr.vcxproj b/build/win32/libcdr.vcxproj
index 355ec43..9985185 100755
--- a/build/win32/libcdr.vcxproj
+++ b/build/win32/libcdr.vcxproj
@@ -43,7 +43,7 @@
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
     <ClCompile>
       <Optimization>Disabled</Optimization>
-      <AdditionalIncludeDirectories>$(LIBWPD_INCLUDE_DIR);$(LIBWPG_INCLUDE_DIR);$(LCMS2_INCLUDE_DIR);$(ZLIB_INCLUDE_DIR);$(ICU_INCLUDE_DIR);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(LIBWPD_INCLUDE_DIR);$(LIBWPG_INCLUDE_DIR);$(LCMS2_INCLUDE_DIR);$(ZLIB_INCLUDE_DIR);$(ICU_INCLUDE_DIR);$(BOOST_INCLUDE_DIR);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>_DEBUG;DEBUG;WIN32;_LIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
@@ -74,7 +74,7 @@
     <ClCompile>
       <Optimization>MaxSpeed</Optimization>
       <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
-      <AdditionalIncludeDirectories>$(LIBWPD_INCLUDE_DIR);$(LIBWPG_INCLUDE_DIR);$(LCMS2_INCLUDE_DIR);$(ZLIB_INCLUDE_DIR);$(ICU_INCLUDE_DIR);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>$(LIBWPD_INCLUDE_DIR);$(LIBWPG_INCLUDE_DIR);$(LCMS2_INCLUDE_DIR);$(ZLIB_INCLUDE_DIR);$(ICU_INCLUDE_DIR);$(BOOST_INCLUDE_DIR);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
       <PreprocessorDefinitions>NDEBUG;WIN32;_LIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <StringPooling>true</StringPooling>
       <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
diff --git a/configure.ac b/configure.ac
index f839f57..90e4bc1 100644
--- a/configure.ac
+++ b/configure.ac
@@ -90,6 +90,17 @@ AC_SUBST(ICU_CFLAGS)
 AC_SUBST(ICU_LIBS)
 
 
+# ===========================
+# Find required boost headers
+# ===========================
+
+AC_CHECK_HEADERS(
+	[boost/property_tree/ptree.hpp boost/property_tree/json_parser.hpp],
+	[],
+	[AC_MSG_ERROR(Required boost headers not found. Install boost >= 1.41.0)],
+	[]
+)
+
 # =================================
 # Libtool/Version Makefile settings
 # =================================
diff --git a/src/lib/CDRParser.cpp b/src/lib/CDRParser.cpp
index a1d4a33..8f025f5 100644
--- a/src/lib/CDRParser.cpp
+++ b/src/lib/CDRParser.cpp
@@ -27,11 +27,13 @@
  * instead of those above.
  */
 
-#include <libwpd-stream/libwpd-stream.h>
 #include <locale.h>
 #include <math.h>
-#include <set>
 #include <string.h>
+#include <sstream>
+#include <set>
+#include <boost/property_tree/json_parser.hpp>
+#include <boost/property_tree/ptree.hpp>
 #include "libcdr_utils.h"
 #include "CDRDocumentStructure.h"
 #include "CDRInternalStream.h"
@@ -126,6 +128,35 @@ static void processNameForEncoding(WPXString &name, unsigned short &encoding)
   return;
 }
 
+static void _processX6StyleString(const char *styleString, libcdr::CDRCharacterStyle & /*style*/)
+{
+  boost::property_tree::ptree pt;
+  try
+  {
+    std::stringstream ss;
+    ss << styleString;
+    boost::property_tree::read_json(ss, pt);
+  }
+  catch (...)
+  {
+    return;
+  }
+}
+
+static void _readX6StyleString(WPXInputStream *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);
+  WPXString styleString;
+  libcdr::appendCharacters(styleString, styleBuffer);
+  CDR_DEBUG_MSG(("CDRParser::_readX6StyleString - styleString = \"%s\"\n", styleString.cstr()));
+  _processX6StyleString(styleString.cstr(), style);
+}
+
+
 } // anonymous namespace
 
 libcdr::CDRParser::CDRParser(const std::vector<WPXInputStream *> &externalStreams, libcdr::CDRCollector *collector)
@@ -2813,18 +2844,6 @@ void libcdr::CDRParser::readTxsm(WPXInputStream *input, unsigned length)
 #endif
 }
 
-void libcdr::CDRParser::_readX6StyleString(WPXInputStream *input, unsigned length, WPXString &styleString)
-{
-  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);
-  appendCharacters(styleString, styleBuffer);
-  CDR_DEBUG_MSG(("CDRParser::_readX6StyleString - styleString = \"%s\"\n", styleString.cstr()));
-}
-
-
 void libcdr::CDRParser::readTxsm16(WPXInputStream *input)
 {
 #ifndef DEBUG
@@ -2873,14 +2892,16 @@ void libcdr::CDRParser::readTxsm16(WPXInputStream *input)
     input->seek(1, WPX_SEEK_CUR);
 
     unsigned len2 = readU32(input);
-    WPXString styleString;
-    _readX6StyleString(input, 2*len2, styleString);
+    CDRCharacterStyle defaultStyle;
+    _readX6StyleString(input, 2*len2, defaultStyle);
 
     unsigned numRecords = readU32(input);
 
     unsigned i = 0;
+    std::map<unsigned, CDRCharacterStyle> charStyles;
     for (i=0; i<numRecords; ++i)
     {
+      charStyles[i*2] = defaultStyle;
       input->seek(4, WPX_SEEK_CUR);
       unsigned flag = readU8(input);
       input->seek(1, WPX_SEEK_CUR);
@@ -2888,15 +2909,12 @@ void libcdr::CDRParser::readTxsm16(WPXInputStream *input)
       if (flag & 0x04)
       {
         lenN = readU32(input);
-        styleString.clear();
-        _readX6StyleString(input, 2*lenN, styleString);
+        input->seek(2*lenN, WPX_SEEK_CUR);
       }
       lenN = readU32(input);
-      styleString.clear();
-      _readX6StyleString(input, 2*lenN, styleString);
+      _readX6StyleString(input, 2*lenN, charStyles[i*2]);
     }
 
-    std::map<unsigned, CDRCharacterStyle> charStyles;
     unsigned numChars = readU32(input);
     std::vector<unsigned char> charDescriptions(numChars);
     for (i=0; i<numChars; ++i)
diff --git a/src/lib/CDRParser.h b/src/lib/CDRParser.h
index 9e74bf8..3d954b9 100644
--- a/src/lib/CDRParser.h
+++ b/src/lib/CDRParser.h
@@ -113,8 +113,6 @@ private:
 
   bool _redirectX6Chunk(WPXInputStream **input, unsigned &length);
 
-  void _readX6StyleString(WPXInputStream *input, unsigned length, WPXString &styleString);
-
   std::vector<WPXInputStream *> m_externalStreams;
 
   unsigned m_version;


More information about the Libreoffice-commits mailing list