[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