| -rw-r--r-- | src/lib/CDRCollector.h | 4 | ||||
| -rw-r--r-- | src/lib/CDRContentCollector.h | 3 | ||||
| -rw-r--r-- | src/lib/CDRParser.cpp | 40 | ||||
| -rw-r--r-- | src/lib/CDRStylesCollector.cpp | 50 | ||||
| -rw-r--r-- | src/lib/CDRStylesCollector.h | 5 |
5 files changed, 64 insertions, 38 deletions
diff --git a/src/lib/CDRCollector.h b/src/lib/CDRCollector.h index cc1b7ac..085cb2e 100644 --- a/src/lib/CDRCollector.h +++ b/src/lib/CDRCollector.h @@ -39,6 +39,7 @@ #include "CDRTypes.h" #include "CDRPath.h" #include "CDROutputElementList.h" +#include "libcdr_utils.h" namespace { @@ -123,7 +124,8 @@ public: 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, const WPXString &text) = 0; + virtual void collectText(unsigned textId, unsigned styleId, const std::vector<unsigned char> &data, + const std::vector<uint64_t> &charDescriptions, const std::map<unsigned, CDRCharacterStyle> &styleOverrides) = 0; virtual void collectArtisticText() = 0; virtual void collectParagraphText() = 0; }; diff --git a/src/lib/CDRContentCollector.h b/src/lib/CDRContentCollector.h index f03ae0c..1704b5a 100644 --- a/src/lib/CDRContentCollector.h +++ b/src/lib/CDRContentCollector.h @@ -87,7 +87,8 @@ public: void collectVectorPattern(unsigned id, const WPXBinaryData &data); void collectPaletteEntry(unsigned, unsigned, const CDRColor &) {} void collectFont(unsigned, unsigned short, const WPXString &) {} - void collectText(unsigned, const WPXString &) {} + void collectText(unsigned, unsigned, const std::vector<unsigned char>&, + const std::vector<uint64_t>&, const std::map<unsigned, CDRCharacterStyle>&) {} void collectArtisticText(); void collectParagraphText(); diff --git a/src/lib/CDRParser.cpp b/src/lib/CDRParser.cpp index ed85cf4..ca52dbe 100644 --- a/src/lib/CDRParser.cpp +++ b/src/lib/CDRParser.cpp @@ -2329,7 +2329,7 @@ void libcdr::CDRParser::readTxsm(WPXInputStream *input, unsigned length) input->seek(4, WPX_SEEK_CUR); } - /* unsigned stlId = */ readU32(input); + unsigned stlId = readU32(input); if (m_version >= 1300 && num) input->seek(1, WPX_SEEK_CUR); input->seek(1, WPX_SEEK_CUR); @@ -2406,38 +2406,12 @@ void libcdr::CDRParser::readTxsm(WPXInputStream *input, unsigned length) const unsigned char *buffer = input->read(numBytes, numBytesRead); if (numBytesRead != numBytes) throw GenericException(); - std::vector<unsigned char> tmpTextData; - WPXString text; - uint32_t tmpCharDescription = 0; - unsigned j = 0; - for (i=0, j=0; i<numChars && j<numBytesRead; ++i) - { - if ((uint32_t)(charDescriptions[i] & 0xffffff) != tmpCharDescription) - { - if (!tmpTextData.empty()) - { - if (tmpCharDescription & 0x01) - appendCharacters(text, tmpTextData); - else - appendCharacters(text, tmpTextData, charStyles[(tmpCharDescription >> 16) & 0xff].m_charSet); - } - tmpTextData.clear(); - tmpCharDescription = (uint32_t)(charDescriptions[i] & 0xffffff); - } - tmpTextData.push_back(buffer[j++]); - if (tmpCharDescription & 0x01) - tmpTextData.push_back(buffer[j++]); - } - if (!tmpTextData.empty()) - { - if (tmpCharDescription & 0x01) - appendCharacters(text, tmpTextData); - else - appendCharacters(text, tmpTextData, charStyles[(tmpCharDescription >> 16) & 0xff].m_charSet); - } - tmpTextData.clear(); - CDR_DEBUG_MSG(("CDRParser::readTxsm - Text: %s\n", text.cstr())); - m_collector->collectText(textId, text); + std::vector<unsigned char> textData(numBytesRead); + if (numBytesRead) + memcpy(&textData[0], buffer, numBytesRead); + + m_collector->collectText(textId, stlId, textData, charDescriptions, charStyles); + } /* vim:set shiftwidth=2 softtabstop=2 expandtab: */ diff --git a/src/lib/CDRStylesCollector.cpp b/src/lib/CDRStylesCollector.cpp index e3cda9e..40b7176 100644 --- a/src/lib/CDRStylesCollector.cpp +++ b/src/lib/CDRStylesCollector.cpp @@ -41,7 +41,7 @@ #endif libcdr::CDRStylesCollector::CDRStylesCollector(libcdr::CDRParserState &ps) : - m_ps(ps), m_page(8.5, 11.0, -4.25, -5.5) + m_ps(ps), m_page(8.5, 11.0, -4.25, -5.5), m_charStyles() { } @@ -244,8 +244,54 @@ void libcdr::CDRStylesCollector::collectFont(unsigned fontId, unsigned short, co m_ps.m_fonts[fontId] = font; } -void libcdr::CDRStylesCollector::collectText(unsigned textId, const WPXString &text) +void libcdr::CDRStylesCollector::collectText(unsigned textId, unsigned styleId, const std::vector<unsigned char> &data, + const std::vector<uint64_t> &charDescriptions, const std::map<unsigned, CDRCharacterStyle> &styleOverrides) { + if (data.empty() || charDescriptions.empty()) + return; + + WPXString text; + uint32_t tmpCharDescription = 0; + unsigned i = 0; + unsigned j = 0; + std::vector<unsigned char> tmpTextData; + CDRCharacterStyle defaultCharStyle; + CDRCharacterStyle tmpCharStyle; + + std::map<unsigned, CDRCharacterStyle>::const_iterator iter = m_charStyles.find(styleId); + if (iter != m_charStyles.end()) + defaultCharStyle = iter->second; + for (i=0, j=0; i<charDescriptions.size() && j<data.size(); ++i) + { + tmpCharStyle = defaultCharStyle; + std::map<unsigned, CDRCharacterStyle>::const_iterator iter = styleOverrides.find((tmpCharDescription >> 16) & 0xff); + if (iter != styleOverrides.end()) + tmpCharStyle = iter->second; + if ((uint32_t)(charDescriptions[i] & 0xffffff) != tmpCharDescription) + { + if (!tmpTextData.empty()) + { + if (tmpCharDescription & 0x01) + appendCharacters(text, tmpTextData); + else + appendCharacters(text, tmpTextData, tmpCharStyle.m_charSet); + } + tmpTextData.clear(); + tmpCharDescription = (uint32_t)(charDescriptions[i] & 0xffffff); + } + tmpTextData.push_back(data[j++]); + if (tmpCharDescription & 0x01) + tmpTextData.push_back(data[j++]); + } + if (!tmpTextData.empty()) + { + if (tmpCharDescription & 0x01) + appendCharacters(text, tmpTextData); + else + appendCharacters(text, tmpTextData, tmpCharStyle.m_charSet); + } + + CDR_DEBUG_MSG(("CDRStylesCollector::collectText - Text: %s\n", text.cstr())); m_ps.m_texts[textId] = text; } diff --git a/src/lib/CDRStylesCollector.h b/src/lib/CDRStylesCollector.h index b57b04c..6d76be1 100644 --- a/src/lib/CDRStylesCollector.h +++ b/src/lib/CDRStylesCollector.h @@ -39,6 +39,7 @@ #include "CDRPath.h" #include "CDROutputElementList.h" #include "CDRCollector.h" +#include "libcdr_utils.h" namespace libcdr { @@ -88,7 +89,8 @@ public: 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, const WPXString &text); + void collectText(unsigned textId, unsigned styleId, const std::vector<unsigned char> &data, + const std::vector<uint64_t> &charDescriptions, const std::map<unsigned, CDRCharacterStyle> &styleOverrides); void collectArtisticText() {} void collectParagraphText() {} @@ -98,6 +100,7 @@ private: CDRParserState &m_ps; CDRPage m_page; + std::map<unsigned, CDRCharacterStyle> m_charStyles; }; } // namespace libcdr |
