summaryrefslogtreecommitdiff
Side-by-side diff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--src/lib/CDRCollector.h4
-rw-r--r--src/lib/CDRContentCollector.h3
-rw-r--r--src/lib/CDRParser.cpp40
-rw-r--r--src/lib/CDRStylesCollector.cpp50
-rw-r--r--src/lib/CDRStylesCollector.h5
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