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 <[email protected]> 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 <[email protected]> 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 <[email protected]> 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;
_______________________________________________ Libreoffice-commits mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
