diff options
author | Fridrich Štrba <fridrich.strba@bluewin.ch> | 2012-06-19 13:46:14 +0200 |
---|---|---|
committer | Fridrich Štrba <fridrich.strba@bluewin.ch> | 2012-06-19 13:46:14 +0200 |
commit | 22ae0a7d9495bff5ef0e44f62da1719edadc9d6f (patch) | |
tree | 82206f5defe654511bdab0d3bbf95f682111ea1e | |
parent | 0618ceafcdcddb22d9c3a07ebb5a6642e08ecb75 (diff) |
Trying to make encoding work in version 6
-rw-r--r-- | src/lib/VSD11Parser.cpp | 2 | ||||
-rw-r--r-- | src/lib/VSD6Parser.cpp | 2 | ||||
-rw-r--r-- | src/lib/VSDXCharacterList.cpp | 6 | ||||
-rw-r--r-- | src/lib/VSDXCharacterList.h | 3 | ||||
-rw-r--r-- | src/lib/VSDXCollector.h | 4 | ||||
-rw-r--r-- | src/lib/VSDXContentCollector.cpp | 452 | ||||
-rw-r--r-- | src/lib/VSDXContentCollector.h | 8 | ||||
-rw-r--r-- | src/lib/VSDXParser.cpp | 43 | ||||
-rw-r--r-- | src/lib/VSDXStyles.h | 6 | ||||
-rw-r--r-- | src/lib/VSDXStylesCollector.cpp | 4 | ||||
-rw-r--r-- | src/lib/VSDXStylesCollector.h | 4 | ||||
-rw-r--r-- | src/lib/VSDXTypes.h | 7 | ||||
-rw-r--r-- | src/lib/libvisio_utils.cpp | 373 | ||||
-rw-r--r-- | src/lib/libvisio_utils.h | 3 |
14 files changed, 493 insertions, 424 deletions
diff --git a/src/lib/VSD11Parser.cpp b/src/lib/VSD11Parser.cpp index 3f4847f..21c55bc 100644 --- a/src/lib/VSD11Parser.cpp +++ b/src/lib/VSD11Parser.cpp @@ -123,7 +123,7 @@ void libvisio::VSD11Parser::readText(WPXInputStream *input) void libvisio::VSD11Parser::readCharIX(WPXInputStream *input) { - WPXString fontFace("Arial"); + VSDXFont fontFace; unsigned charCount = readU32(input); unsigned short fontID = readU16(input); input->seek(1, WPX_SEEK_CUR); // Color ID diff --git a/src/lib/VSD6Parser.cpp b/src/lib/VSD6Parser.cpp index c09543b..ededb03 100644 --- a/src/lib/VSD6Parser.cpp +++ b/src/lib/VSD6Parser.cpp @@ -104,7 +104,7 @@ void libvisio::VSD6Parser::readText(WPXInputStream *input) void libvisio::VSD6Parser::readCharIX(WPXInputStream *input) { - WPXString fontFace = "Arial"; + VSDXFont fontFace; unsigned charCount = readU32(input); unsigned short fontID = readU16(input); input->seek(1, WPX_SEEK_CUR); // Color ID diff --git a/src/lib/VSDXCharacterList.cpp b/src/lib/VSDXCharacterList.cpp index b88cf20..d3ddca6 100644 --- a/src/lib/VSDXCharacterList.cpp +++ b/src/lib/VSDXCharacterList.cpp @@ -48,7 +48,7 @@ class VSDXCharIX : public VSDXCharacterListElement public: VSDXCharIX(unsigned id , unsigned level, unsigned charCount, unsigned short fontID, Colour fontColour, unsigned langId, double fontSize, bool bold, bool italic, bool underline, bool doubleunderline, bool strikeout, bool doublestrikeout, - bool allcaps, bool initcaps, bool smallcaps, bool superscript, bool subscript, WPXString fontFace) : + bool allcaps, bool initcaps, bool smallcaps, bool superscript, bool subscript, VSDXFont fontFace) : m_id(id), m_level(level), m_charCount(charCount), m_fontID(fontID), m_fontColour(fontColour), m_langId(langId), m_fontSize(fontSize), m_bold(bold), m_italic(italic), m_underline(underline), m_doubleunderline(doubleunderline), m_strikeout(strikeout), m_doublestrikeout(doublestrikeout), m_allcaps(allcaps), m_initcaps(initcaps), m_smallcaps(smallcaps), @@ -65,7 +65,7 @@ private: double m_fontSize; bool m_bold, m_italic, m_underline, m_doubleunderline, m_strikeout, m_doublestrikeout; bool m_allcaps, m_initcaps, m_smallcaps, m_superscript, m_subscript; - WPXString m_fontFace; + VSDXFont m_fontFace; }; } // namespace libvisio @@ -117,7 +117,7 @@ libvisio::VSDXCharacterList::~VSDXCharacterList() void libvisio::VSDXCharacterList::addCharIX(unsigned id , unsigned level, unsigned charCount, unsigned short fontID, Colour fontColour, unsigned langId, double fontSize, bool bold, bool italic, bool underline, bool doubleunderline, bool strikeout, bool doublestrikeout, - bool allcaps, bool initcaps, bool smallcaps, bool superscript, bool subscript, WPXString fontFace) + bool allcaps, bool initcaps, bool smallcaps, bool superscript, bool subscript, VSDXFont fontFace) { m_elements[id] = new VSDXCharIX(id, level, charCount, fontID, fontColour, langId, fontSize, bold, italic, underline, doubleunderline, strikeout, doublestrikeout, allcaps, initcaps, smallcaps, superscript, subscript, fontFace); diff --git a/src/lib/VSDXCharacterList.h b/src/lib/VSDXCharacterList.h index 734d36f..5e4a733 100644 --- a/src/lib/VSDXCharacterList.h +++ b/src/lib/VSDXCharacterList.h @@ -33,6 +33,7 @@ #include <vector> #include <map> +#include "VSDXTypes.h" namespace libvisio { @@ -49,7 +50,7 @@ public: VSDXCharacterList &operator=(const VSDXCharacterList &charList); void addCharIX(unsigned id, unsigned level, unsigned charCount, unsigned short fontID, Colour fontColour, unsigned langId, double fontSize, bool bold, bool italic, bool underline, bool doubleunderline, bool strikeout, bool doublestrikeout, - bool allcaps, bool initcaps, bool smallcaps, bool superscript, bool subscript, WPXString fontFace); + bool allcaps, bool initcaps, bool smallcaps, bool superscript, bool subscript, VSDXFont fontFace); void setElementsOrder(const std::vector<unsigned> &m_elementsOrder); void handle(VSDXCollector *collector); void clear(); diff --git a/src/lib/VSDXCollector.h b/src/lib/VSDXCollector.h index 615fedf..7105d2d 100644 --- a/src/lib/VSDXCollector.h +++ b/src/lib/VSDXCollector.h @@ -85,7 +85,7 @@ public: virtual void collectText(unsigned id, unsigned level, const ::WPXBinaryData &textStream, TextFormat format) = 0; virtual void collectVSDXCharStyle(unsigned id , unsigned level, unsigned charCount, unsigned short fontID, Colour fontColour, unsigned langId, double fontSize, bool bold, bool italic, bool underline, bool doubleunderline, bool strikeout, bool doublestrikeout, - bool allcaps, bool initcaps, bool smallcaps, bool superscript, bool subscript, WPXString fontFace) = 0; + bool allcaps, bool initcaps, bool smallcaps, bool superscript, bool subscript, VSDXFont fontFace) = 0; virtual void collectVSDXParaStyle(unsigned id , unsigned level, unsigned charCount, double indFirst, double indLeft, double indRight, double spLine, double spBefore, double spAfter, unsigned char align, unsigned flags) = 0; virtual void collectTextBlock(unsigned id, unsigned level, double leftMargin, double rightMargin, double topMargin, double bottomMargin, @@ -104,7 +104,7 @@ public: unsigned char fillFGTransparency, unsigned char fillBGTransparency, unsigned char shadowPattern, Colour shfgc) = 0; virtual void collectCharIXStyle(unsigned id , unsigned level, unsigned charCount, unsigned short fontID, Colour fontColour, unsigned langId, double fontSize, bool bold, bool italic, bool underline, bool doubleunderline, bool strikeout, bool doublestrikeout, - bool allcaps, bool initcaps, bool smallcaps, bool superscript, bool subscript, WPXString fontFace) = 0; + bool allcaps, bool initcaps, bool smallcaps, bool superscript, bool subscript, VSDXFont fontFace) = 0; virtual void collectParaIXStyle(unsigned id , unsigned level, unsigned charCount, double indFirst, double indLeft, double indRight, double spLine, double spBefore, double spAfter, unsigned char align, unsigned flags) = 0; virtual void collectTextBlockStyle(unsigned id, unsigned level, double leftMargin, double rightMargin, double topMargin, double bottomMargin, diff --git a/src/lib/VSDXContentCollector.cpp b/src/lib/VSDXContentCollector.cpp index 703b1c8..acb879e 100644 --- a/src/lib/VSDXContentCollector.cpp +++ b/src/lib/VSDXContentCollector.cpp @@ -47,6 +47,62 @@ static unsigned bitmapId = 0; #define M_PI 3.14159265358979323846 #endif +#define SURROGATE_VALUE(h,l) (((h) - 0xd800) * 0x400 + (l) - 0xdc00 + 0x10000) + +namespace +{ + +static void _appendUCS4(WPXString &text, unsigned ucs4Character) +{ + unsigned char first; + int len; + if (ucs4Character < 0x80) + { + first = 0; + len = 1; + } + else if (ucs4Character < 0x800) + { + first = 0xc0; + len = 2; + } + else if (ucs4Character < 0x10000) + { + first = 0xe0; + len = 3; + } + else if (ucs4Character < 0x200000) + { + first = 0xf0; + len = 4; + } + else if (ucs4Character < 0x4000000) + { + first = 0xf8; + len = 5; + } + else + { + first = 0xfc; + len = 6; + } + + unsigned char outbuf[6] = { 0, 0, 0, 0, 0, 0 }; + int i; + for (i = len - 1; i > 0; --i) + { + outbuf[i] = (ucs4Character & 0x3f) | 0x80; + ucs4Character >>= 6; + } + outbuf[0] = (ucs4Character & 0xff) | first; + + for (i = 0; i < len; i++) + text.append(outbuf[i]); +} + +} // anonymous namespace + + libvisio::VSDXContentCollector::VSDXContentCollector( libwpg::WPGPaintInterface *painter, std::vector<std::map<unsigned, XForm> > &groupXFormsSequence, @@ -821,38 +877,24 @@ void libvisio::VSDXContentCollector::_flushText() m_shapeOutputText->addStartTextLine(paraProps); paraCharCount = (*paraIt).charCount; + + TextFormat encoding = libvisio::VSD_TEXT_ANSI; // Find char format that overlaps while (charIndex < m_charFormats.size() && paraCharCount) { paraCharCount -= m_charFormats[charIndex].charCount; - WPXString text; - - if (m_textFormat == VSD_TEXT_UTF16) + WPXPropertyList textProps; + if (m_fonts[m_charFormats[charIndex].faceID].name == "") { - unsigned long max = m_charFormats[charIndex].charCount <= (m_textStream.size()/2) ? m_charFormats[charIndex].charCount : (m_textStream.size()/2); - VSD_DEBUG_MSG(("Charcount: %d, max: %lu, stream size: %lu\n", m_charFormats[charIndex].charCount, max, (unsigned long)m_textStream.size())); - max = (m_charFormats[charIndex].charCount == 0 && m_textStream.size()) ? m_textStream.size()/2 : max; - VSD_DEBUG_MSG(("Charcount: %d, max: %lu, stream size: %lu\n", m_charFormats[charIndex].charCount, max, (unsigned long)m_textStream.size())); - std::vector<unsigned char> tmpBuffer(max*2); - memcpy(&tmpBuffer[0], &pTextBuffer[textBufferPosition], max*2); - appendCharacters(text, tmpBuffer); - textBufferPosition += max*2; + textProps.insert("style:font-name", m_charFormats[charIndex].face.name); + encoding = m_charFormats[charIndex].face.encoding; } else { - unsigned long max = m_charFormats[charIndex].charCount <= m_textStream.size() ? m_charFormats[charIndex].charCount : m_textStream.size(); - max = (m_charFormats[charIndex].charCount == 0 && m_textStream.size()) ? m_textStream.size() : max; - std::vector<unsigned char> tmpBuffer(max); - memcpy(&tmpBuffer[0], &pTextBuffer[textBufferPosition], max); - appendCharacters(text, tmpBuffer, m_textFormat); - textBufferPosition += max; + textProps.insert("style:font-name", m_fonts[m_charFormats[charIndex].faceID].name); + encoding = m_fonts[m_charFormats[charIndex].faceID].encoding; } - WPXPropertyList textProps; - if (m_fonts[m_charFormats[charIndex].faceID] == "") - textProps.insert("style:font-name", m_charFormats[charIndex].face); - else - textProps.insert("style:font-name", m_fonts[m_charFormats[charIndex].faceID]); if (m_charFormats[charIndex].bold) textProps.insert("fo:font-weight", "bold"); if (m_charFormats[charIndex].italic) textProps.insert("fo:font-style", "italic"); @@ -882,6 +924,29 @@ void libvisio::VSDXContentCollector::_flushText() #endif } + WPXString text; + + if (m_textFormat == VSD_TEXT_UTF16) + { + unsigned long max = m_charFormats[charIndex].charCount <= (m_textStream.size()/2) ? m_charFormats[charIndex].charCount : (m_textStream.size()/2); + VSD_DEBUG_MSG(("Charcount: %d, max: %lu, stream size: %lu\n", m_charFormats[charIndex].charCount, max, (unsigned long)m_textStream.size())); + max = (m_charFormats[charIndex].charCount == 0 && m_textStream.size()) ? m_textStream.size()/2 : max; + VSD_DEBUG_MSG(("Charcount: %d, max: %lu, stream size: %lu\n", m_charFormats[charIndex].charCount, max, (unsigned long)m_textStream.size())); + std::vector<unsigned char> tmpBuffer(max*2); + memcpy(&tmpBuffer[0], &pTextBuffer[textBufferPosition], max*2); + appendCharacters(text, tmpBuffer); + textBufferPosition += max*2; + } + else + { + unsigned long max = m_charFormats[charIndex].charCount <= m_textStream.size() ? m_charFormats[charIndex].charCount : m_textStream.size(); + max = (m_charFormats[charIndex].charCount == 0 && m_textStream.size()) ? m_textStream.size() : max; + std::vector<unsigned char> tmpBuffer(max); + memcpy(&tmpBuffer[0], &pTextBuffer[textBufferPosition], max); + appendCharacters(text, tmpBuffer, encoding); + textBufferPosition += max; + } + VSD_DEBUG_MSG(("Text: %s\n", text.cstr())); m_shapeOutputText->addStartTextSpan(textProps); m_shapeOutputText->addInsertText(text); @@ -2017,9 +2082,10 @@ void libvisio::VSDXContentCollector::collectColours(const std::vector<Colour> &c void libvisio::VSDXContentCollector::collectFont(unsigned short fontID, const WPXBinaryData &textStream, TextFormat format) { - WPXString fontname; - _convertDataToString(fontname, textStream, format); - m_fonts[fontID] = fontname; + VSDXFont font; + _convertDataToString(font.name, textStream, format); + font.encoding = format; + m_fonts[fontID] = font; } @@ -2081,7 +2147,7 @@ void libvisio::VSDXContentCollector::collectVSDXParaStyle(unsigned /* id */ , un void libvisio::VSDXContentCollector::collectVSDXCharStyle(unsigned /*id*/ , unsigned level, unsigned charCount, unsigned short fontID, Colour fontColour, unsigned langId, double fontSize, bool bold, bool italic, bool underline, bool doubleunderline, bool strikeout, bool doublestrikeout, - bool allcaps, bool initcaps, bool smallcaps, bool superscript, bool subscript, WPXString fontFace) + bool allcaps, bool initcaps, bool smallcaps, bool superscript, bool subscript, VSDXFont fontFace) { _handleLevelChange(level); VSDXCharStyle format(charCount, fontID, fontColour, langId, fontSize, bold, italic, @@ -2145,7 +2211,7 @@ void libvisio::VSDXContentCollector::collectFillStyle(unsigned /*id*/, unsigned void libvisio::VSDXContentCollector::collectCharIXStyle(unsigned /*id*/ , unsigned level, unsigned /*charCount*/, unsigned short /*fontID*/, Colour /*fontColour*/, unsigned /*langId*/, double /*fontSize*/, bool /*bold*/, bool /*italic*/, bool /*underline*/, bool /* doubleunderline */, bool /* strikeout */, bool /* doublestrikeout */, - bool /* allcaps */, bool /* initcaps */, bool /* smallcaps */, bool /* superscript */, bool /* subscript */, WPXString /*fontFace*/) + bool /* allcaps */, bool /* initcaps */, bool /* smallcaps */, bool /* superscript */, bool /* subscript */, VSDXFont /*fontFace*/) { _handleLevelChange(level); } @@ -2367,4 +2433,336 @@ bool libvisio::VSDXContentCollector::parseFormatId( const char *formatString, un return false; } +void libvisio::VSDXContentCollector::appendCharacters(WPXString &text, const std::vector<unsigned char> &characters, TextFormat format) +{ + if (format == VSD_TEXT_UTF16) + return appendCharacters(text, characters); + + static const unsigned short cp874map[] = + { + 0x20AC, 0x0020, 0x0020, 0x0020, 0x0020, 0x2026, 0x0020, 0x0020, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, + 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x00A0, 0x0E01, 0x0E02, 0x0E03, 0x0E04, 0x0E05, 0x0E06, 0x0E07, + 0x0E08, 0x0E09, 0x0E0A, 0x0E0B, 0x0E0C, 0x0E0D, 0x0E0E, 0x0E0F, + 0x0E10, 0x0E11, 0x0E12, 0x0E13, 0x0E14, 0x0E15, 0x0E16, 0x0E17, + 0x0E18, 0x0E19, 0x0E1A, 0x0E1B, 0x0E1C, 0x0E1D, 0x0E1E, 0x0E1F, + 0x0E20, 0x0E21, 0x0E22, 0x0E23, 0x0E24, 0x0E25, 0x0E26, 0x0E27, + 0x0E28, 0x0E29, 0x0E2A, 0x0E2B, 0x0E2C, 0x0E2D, 0x0E2E, 0x0E2F, + 0x0E30, 0x0E31, 0x0E32, 0x0E33, 0x0E34, 0x0E35, 0x0E36, 0x0E37, + 0x0E38, 0x0E39, 0x0E3A, 0x0020, 0x0020, 0x0020, 0x0020, 0x0E3F, + 0x0E40, 0x0E41, 0x0E42, 0x0E43, 0x0E44, 0x0E45, 0x0E46, 0x0E47, + 0x0E48, 0x0E49, 0x0E4A, 0x0E4B, 0x0E4C, 0x0E4D, 0x0E4E, 0x0E4F, + 0x0E50, 0x0E51, 0x0E52, 0x0E53, 0x0E54, 0x0E55, 0x0E56, 0x0E57, + 0x0E58, 0x0E59, 0x0E5A, 0x0E5B, 0x0020, 0x0020, 0x0020, 0x0020 + }; + + static const unsigned short cp1250map[] = + { + 0x20AC, 0x0020, 0x201A, 0x0020, 0x201E, 0x2026, 0x2020, 0x2021, + 0x0020, 0x2030, 0x0160, 0x2039, 0x015A, 0x0164, 0x017D, 0x0179, + 0x0020, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, + 0x0020, 0x2122, 0x0161, 0x203A, 0x015B, 0x0165, 0x017E, 0x017A, + 0x00A0, 0x02C7, 0x02D8, 0x0141, 0x00A4, 0x0104, 0x00A6, 0x00A7, + 0x00A8, 0x00A9, 0x015E, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x017B, + 0x00B0, 0x00B1, 0x02DB, 0x0142, 0x00B4, 0x00B5, 0x00B6, 0x00B7, + 0x00B8, 0x0105, 0x015F, 0x00BB, 0x013D, 0x02DD, 0x013E, 0x017C, + 0x0154, 0x00C1, 0x00C2, 0x0102, 0x00C4, 0x0139, 0x0106, 0x00C7, + 0x010C, 0x00C9, 0x0118, 0x00CB, 0x011A, 0x00CD, 0x00CE, 0x010E, + 0x0110, 0x0143, 0x0147, 0x00D3, 0x00D4, 0x0150, 0x00D6, 0x00D7, + 0x0158, 0x016E, 0x00DA, 0x0170, 0x00DC, 0x00DD, 0x0162, 0x00DF, + 0x0155, 0x00E1, 0x00E2, 0x0103, 0x00E4, 0x013A, 0x0107, 0x00E7, + 0x010D, 0x00E9, 0x0119, 0x00EB, 0x011B, 0x00ED, 0x00EE, 0x010F, + 0x0111, 0x0144, 0x0148, 0x00F3, 0x00F4, 0x0151, 0x00F6, 0x00F7, + 0x0159, 0x016F, 0x00FA, 0x0171, 0x00FC, 0x00FD, 0x0163, 0x02D9 + }; + + static const unsigned short cp1251map[] = + { + 0x0402, 0x0403, 0x201A, 0x0453, 0x201E, 0x2026, 0x2020, 0x2021, + 0x20AC, 0x2030, 0x0409, 0x2039, 0x040A, 0x040C, 0x040B, 0x040F, + 0x0452, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, + 0x0020, 0x2122, 0x0459, 0x203A, 0x045A, 0x045C, 0x045B, 0x045F, + 0x00A0, 0x040E, 0x045E, 0x0408, 0x00A4, 0x0490, 0x00A6, 0x00A7, + 0x0401, 0x00A9, 0x0404, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x0407, + 0x00B0, 0x00B1, 0x0406, 0x0456, 0x0491, 0x00B5, 0x00B6, 0x00B7, + 0x0451, 0x2116, 0x0454, 0x00BB, 0x0458, 0x0405, 0x0455, 0x0457, + 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, + 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F, + 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, + 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F, + 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, + 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F, + 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, + 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F + }; + + static const unsigned short cp1252map[] = + { + 0x20AC, 0x0020, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, + 0x02C6, 0x2030, 0x0160, 0x2039, 0x0152, 0x0020, 0x017D, 0x0020, + 0x0020, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, + 0x02DC, 0x2122, 0x0161, 0x203A, 0x0153, 0x0020, 0x017E, 0x0178, + 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, + 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, + 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, + 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF, + 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7, + 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF, + 0x00D0, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7, + 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE, 0x00DF, + 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, + 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF, + 0x00F0, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7, + 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x00FF + }; + + static const unsigned short cp1253map[] = + { + 0x20AC, 0x0020, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, + 0x0020, 0x2030, 0x0020, 0x2039, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, + 0x0020, 0x2122, 0x0020, 0x203A, 0x0020, 0x0020, 0x0020, 0x0020, + 0x00A0, 0x0385, 0x0386, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, + 0x00A8, 0x00A9, 0x0020, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x2015, + 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x0384, 0x00B5, 0x00B6, 0x00B7, + 0x0388, 0x0389, 0x038A, 0x00BB, 0x038C, 0x00BD, 0x038E, 0x038F, + 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, + 0x0398, 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F, + 0x03A0, 0x03A1, 0x0020, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7, + 0x03A8, 0x03A9, 0x03AA, 0x03AB, 0x03AC, 0x03AD, 0x03AE, 0x03AF, + 0x03B0, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7, + 0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF, + 0x03C0, 0x03C1, 0x03C2, 0x03C3, 0x03C4, 0x03C5, 0x03C6, 0x03C7, + 0x03C8, 0x03C9, 0x03CA, 0x03CB, 0x03CC, 0x03CD, 0x03CE, 0x0020 + }; + + static const unsigned short cp1254map[] = + { + 0x20AC, 0x0020, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, + 0x02C6, 0x2030, 0x0160, 0x2039, 0x0152, 0x0020, 0x0020, 0x0020, + 0x0020, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, + 0x02DC, 0x2122, 0x0161, 0x203A, 0x0153, 0x0020, 0x0020, 0x0178, + 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, + 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, + 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, + 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF, + 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7, + 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF, + 0x011E, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7, + 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x0130, 0x015E, 0x00DF, + 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, + 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF, + 0x011F, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7, + 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x0131, 0x015F, 0x00FF + }; + + static const unsigned short cp1255map[] = + { + 0x20AC, 0x0020, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, + 0x02C6, 0x2030, 0x0020, 0x2039, 0x0020, 0x0020, 0x0020, 0x0020, + 0x0020, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, + 0x02DC, 0x2122, 0x0020, 0x203A, 0x0020, 0x0020, 0x0020, 0x0020, + 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x20AA, 0x00A5, 0x00A6, 0x00A7, + 0x00A8, 0x00A9, 0x00D7, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, + 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, + 0x00B8, 0x00B9, 0x00F7, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF, + 0x05B0, 0x05B1, 0x05B2, 0x05B3, 0x05B4, 0x05B5, 0x05B6, 0x05B7, + 0x05B8, 0x05B9, 0x0020, 0x05BB, 0x05BC, 0x05BD, 0x05BE, 0x05BF, + 0x05C0, 0x05C1, 0x05C2, 0x05C3, 0x05F0, 0x05F1, 0x05F2, 0x05F3, + 0x05F4, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, + 0x05D0, 0x05D1, 0x05D2, 0x05D3, 0x05D4, 0x05D5, 0x05D6, 0x05D7, + 0x05D8, 0x05D9, 0x05DA, 0x05DB, 0x05DC, 0x05DD, 0x05DE, 0x05DF, + 0x05E0, 0x05E1, 0x05E2, 0x05E3, 0x05E4, 0x05E5, 0x05E6, 0x05E7, + 0x05E8, 0x05E9, 0x05EA, 0x0020, 0x0020, 0x200E, 0x200F, 0x0020 + }; + + static const unsigned short cp1256map[] = + { + 0x20AC, 0x067E, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, + 0x02C6, 0x2030, 0x0679, 0x2039, 0x0152, 0x0686, 0x0698, 0x0688, + 0x06AF, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, + 0x06A9, 0x2122, 0x0691, 0x203A, 0x0153, 0x200C, 0x200D, 0x06BA, + 0x00A0, 0x060C, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, + 0x00A8, 0x00A9, 0x06BE, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, + 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, + 0x00B8, 0x00B9, 0x061B, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x061F, + 0x06C1, 0x0621, 0x0622, 0x0623, 0x0624, 0x0625, 0x0626, 0x0627, + 0x0628, 0x0629, 0x062A, 0x062B, 0x062C, 0x062D, 0x062E, 0x062F, + 0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x0636, 0x00D7, + 0x0637, 0x0638, 0x0639, 0x063A, 0x0640, 0x0641, 0x0642, 0x0643, + 0x00E0, 0x0644, 0x00E2, 0x0645, 0x0646, 0x0647, 0x0648, 0x00E7, + 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x0649, 0x064A, 0x00EE, 0x00EF, + 0x064B, 0x064C, 0x064D, 0x064E, 0x00F4, 0x064F, 0x0650, 0x00F7, + 0x0651, 0x00F9, 0x0652, 0x00FB, 0x00FC, 0x200E, 0x200F, 0x06D2 + }; + + static const unsigned short cp1257map[] = + { + 0x20AC, 0x0020, 0x201A, 0x0020, 0x201E, 0x2026, 0x2020, 0x2021, + 0x0020, 0x2030, 0x0020, 0x2039, 0x0020, 0x00A8, 0x02C7, 0x00B8, + 0x0020, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, + 0x0020, 0x2122, 0x0020, 0x203A, 0x0020, 0x00AF, 0x02DB, 0x0020, + 0x00A0, 0x0020, 0x00A2, 0x00A3, 0x00A4, 0x0020, 0x00A6, 0x00A7, + 0x00D8, 0x00A9, 0x0156, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00C6, + 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, + 0x00F8, 0x00B9, 0x0157, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00E6, + 0x0104, 0x012E, 0x0100, 0x0106, 0x00C4, 0x00C5, 0x0118, 0x0112, + 0x010C, 0x00C9, 0x0179, 0x0116, 0x0122, 0x0136, 0x012A, 0x013B, + 0x0160, 0x0143, 0x0145, 0x00D3, 0x014C, 0x00D5, 0x00D6, 0x00D7, + 0x0172, 0x0141, 0x015A, 0x016A, 0x00DC, 0x017B, 0x017D, 0x00DF, + 0x0105, 0x012F, 0x0101, 0x0107, 0x00E4, 0x00E5, 0x0119, 0x0113, + 0x010D, 0x00E9, 0x017A, 0x0117, 0x0123, 0x0137, 0x012B, 0x013C, + 0x0161, 0x0144, 0x0146, 0x00F3, 0x014D, 0x00F5, 0x00F6, 0x00F7, + 0x0173, 0x0142, 0x015B, 0x016B, 0x00FC, 0x017C, 0x017E, 0x02D9 + }; + + static const unsigned short cp1258map[] = + { + 0x20AC, 0x0020, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, + 0x02C6, 0x2030, 0x0020, 0x2039, 0x0152, 0x0020, 0x0020, 0x0020, + 0x0020, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, + 0x02DC, 0x2122, 0x0020, 0x203A, 0x0153, 0x0020, 0x0020, 0x0178, + 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, + 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, + 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, + 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF, + 0x00C0, 0x00C1, 0x00C2, 0x0102, 0x00C4, 0x00C5, 0x00C6, 0x00C7, + 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x0300, 0x00CD, 0x00CE, 0x00CF, + 0x0110, 0x00D1, 0x0309, 0x00D3, 0x00D4, 0x01A0, 0x00D6, 0x00D7, + 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x01AF, 0x0303, 0x00DF, + 0x00E0, 0x00E1, 0x00E2, 0x0103, 0x00E4, 0x00E5, 0x00E6, 0x00E7, + 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x0301, 0x00ED, 0x00EE, 0x00EF, + 0x0111, 0x00F1, 0x0323, 0x00F3, 0x00F4, 0x01A1, 0x00F6, 0x00F7, + 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x01B0, 0x20AB, 0x00FF + }; + + std::vector<unsigned char>::const_iterator iter = characters.begin(); + while (iter != characters.end()) + { + uint32_t ucs4Character = 0; + if (*iter == 0x1e) + { + if (m_fieldIndex < m_fields.size()) + text.append(m_fields[m_fieldIndex++].cstr()); + else + m_fieldIndex++; + } + else if (*iter < 0x20) + { + ucs4Character = 0x20; + iter++; + } + else if (*iter >= 0x20 && *iter < 0x7f) + ucs4Character = *iter++; + else if (*iter == 0x7f) + { + ucs4Character = 0x20; + iter++; + } + else + { + switch (format) + { + case VSD_TEXT_ANSI: + ucs4Character = cp1252map[*iter++ - 0x80]; + break; + case VSD_TEXT_GREEK: + ucs4Character = cp1253map[*iter++ - 0x80]; + break; + case VSD_TEXT_TURKISH: + ucs4Character = cp1254map[*iter++ - 0x80]; + break; + case VSD_TEXT_VIETNAMESE: + ucs4Character = cp1258map[*iter++ - 0x80]; + break; + case VSD_TEXT_HEBREW: + ucs4Character = cp1255map[*iter++ - 0x80]; + break; + case VSD_TEXT_ARABIC: + ucs4Character = cp1256map[*iter++ - 0x80]; + break; + case VSD_TEXT_BALTIC: + ucs4Character = cp1257map[*iter++ - 0x80]; + break; + case VSD_TEXT_RUSSIAN: + ucs4Character = cp1251map[*iter++ - 0x80]; + break; + case VSD_TEXT_THAI: + ucs4Character = cp874map[*iter++ - 0x80]; + break; + case VSD_TEXT_CENTRAL_EUROPE: + ucs4Character = cp1250map[*iter++ - 0x80]; + break; + default: + ucs4Character = *iter++; + break; + } + } + _appendUCS4(text, ucs4Character); + } +} + +void libvisio::VSDXContentCollector::appendCharacters(WPXString &text, const std::vector<unsigned char> &characters) +{ + for (std::vector<unsigned char>::const_iterator iter = characters.begin(); + iter != characters.end();) + { + uint16_t high_surrogate = 0; + bool fail = false; + uint32_t ucs4Character = 0; + while (true) + { + if (iter == characters.end()) + { + fail = true; + break; + } + uint16_t character = *iter++; + character |= (uint16_t)(*iter++) << 8; + if (character == 0xfffc) + { + if (m_fieldIndex < m_fields.size()) + text.append(m_fields[m_fieldIndex++].cstr()); + else + m_fieldIndex++; + } + else if (character >= 0xdc00 && character < 0xe000) /* low surrogate */ + { + if (high_surrogate) + { + ucs4Character = SURROGATE_VALUE(high_surrogate, character); + high_surrogate = 0; + break; + } + else + { + fail = true; + break; + } + } + else + { + if (high_surrogate) + { + fail = true; + break; + } + if (character >= 0xd800 && character < 0xdc00) /* high surrogate */ + high_surrogate = character; + else + { + ucs4Character = character; + break; + } + } + } + if (fail) + throw libvisio::GenericException(); + + _appendUCS4(text, ucs4Character); + } +} + /* vim:set shiftwidth=2 softtabstop=2 expandtab: */ diff --git a/src/lib/VSDXContentCollector.h b/src/lib/VSDXContentCollector.h index 99be8da..61fdb3c 100644 --- a/src/lib/VSDXContentCollector.h +++ b/src/lib/VSDXContentCollector.h @@ -107,7 +107,7 @@ public: void collectText(unsigned id, unsigned level, const WPXBinaryData &textStream, TextFormat format); void collectVSDXCharStyle(unsigned id , unsigned level, unsigned charCount, unsigned short fontID, Colour fontColour, unsigned langId, double fontSize, bool bold, bool italic, bool underline, bool doubleunderline, bool strikeout, bool doublestrikeout, - bool allcaps, bool initcaps, bool smallcaps, bool superscript, bool subscript, WPXString fontFace); + bool allcaps, bool initcaps, bool smallcaps, bool superscript, bool subscript, VSDXFont fontFace); void collectVSDXParaStyle(unsigned id , unsigned level, unsigned charCount, double indFirst, double indLeft, double indRight, double spLine, double spBefore, double spAfter, unsigned char align, unsigned flags); void collectTextBlock(unsigned id, unsigned level, double leftMargin, double rightMargin, double topMargin, double bottomMargin, unsigned char verticalAlign, @@ -126,7 +126,7 @@ public: unsigned char fillFGTransparency, unsigned char fillBGTransparency, unsigned char shadowPattern, Colour shfgc); void collectCharIXStyle(unsigned id , unsigned level, unsigned charCount, unsigned short fontID, Colour fontColour, unsigned langId, double fontSize, bool bold, bool italic, bool underline, bool doubleunderline, bool strikeout, bool doublestrikeout, - bool allcaps, bool initcaps, bool smallcaps, bool superscript, bool subscript, WPXString fontFace); + bool allcaps, bool initcaps, bool smallcaps, bool superscript, bool subscript, VSDXFont fontFace); void collectParaIXStyle(unsigned id , unsigned level, unsigned charCount, double indFirst, double indLeft, double indRight, double spLine, double spBefore, double spAfter, unsigned char align, unsigned flags); void collectTextBlockStyle(unsigned id, unsigned level, double leftMargin, double rightMargin, double topMargin, double bottomMargin, unsigned char verticalAlign, @@ -178,6 +178,8 @@ private: unsigned fillFGTransparency, unsigned fillBGTransparency, unsigned shadowPattern, Colour shfgc, double shadowOffsetX, double shadowOffsetY); + void appendCharacters(WPXString &text, const std::vector<unsigned char> &characters, TextFormat format); + void appendCharacters(WPXString &text, const std::vector<unsigned char> &characters); void _convertDataToString(WPXString &result, const WPXBinaryData &data, TextFormat format); bool parseFormatId( const char *formatString, unsigned short &result ); @@ -217,7 +219,7 @@ private: bool m_noFill; bool m_noShow; std::vector<Colour> m_colours; - std::map<unsigned short, WPXString> m_fonts; + std::map<unsigned short, VSDXFont> m_fonts; unsigned m_currentLevel; bool m_isShapeStarted; std::map<unsigned, unsigned> &m_groupMemberships; diff --git a/src/lib/VSDXParser.cpp b/src/lib/VSDXParser.cpp index 9085cb7..4764686 100644 --- a/src/lib/VSDXParser.cpp +++ b/src/lib/VSDXParser.cpp @@ -134,7 +134,6 @@ bool libvisio::VSDXParser::parseDocument(WPXInputStream *input) if (ptr.Type == VSD_FONTFACES) PtrList.insert(PtrList.begin(),ptr); -// PtrList.push_back(ptr); else if (ptr.Type != 0) PtrList.push_back(ptr); } @@ -1669,7 +1668,9 @@ void libvisio::VSDXParser::readFont(WPXInputStream *input, unsigned fontID) void libvisio::VSDXParser::readFontIX(WPXInputStream *input) { - input->seek(6, WPX_SEEK_CUR); + input->seek(2, WPX_SEEK_CUR); + unsigned char codePage = readU8(input); + input->seek(3, WPX_SEEK_CUR); ::WPXBinaryData textStream; for (unsigned i = 0; i < m_header.dataLength - 6; i++) @@ -1679,7 +1680,43 @@ void libvisio::VSDXParser::readFontIX(WPXInputStream *input) break; textStream.append(curchar); } - m_collector->collectFont((unsigned short) m_header.id, textStream, libvisio::VSD_TEXT_ANSI); + TextFormat format = libvisio::VSD_TEXT_ANSI; + switch (codePage) + { + case 0: // ANSI + format = libvisio::VSD_TEXT_ANSI; + break; + case 0xa1: // GREEK + format = libvisio::VSD_TEXT_GREEK; + break; + case 0xa2: // TURKISH + format = libvisio::VSD_TEXT_TURKISH; + break; + case 0xa3: // VIETNAMESE + format = libvisio::VSD_TEXT_VIETNAMESE; + break; + case 0xb1: // HEBREW + format = libvisio::VSD_TEXT_HEBREW; + break; + case 0xb2: // ARABIC + format = libvisio::VSD_TEXT_ARABIC; + break; + case 0xba: // BALTIC + format = libvisio::VSD_TEXT_BALTIC; + break; + case 0xcc: // RUSSIAN + format = libvisio::VSD_TEXT_RUSSIAN; + break; + case 0xde: // THAI + format = libvisio::VSD_TEXT_THAI; + break; + case 0xee: // CENTRAL EUROPE + format = libvisio::VSD_TEXT_CENTRAL_EUROPE; + break; + default: + break; + } + m_collector->collectFont((unsigned short) m_header.id, textStream, format); } /* StyleSheet readers */ diff --git a/src/lib/VSDXStyles.h b/src/lib/VSDXStyles.h index a58990c..d4b2729 100644 --- a/src/lib/VSDXStyles.h +++ b/src/lib/VSDXStyles.h @@ -102,8 +102,8 @@ struct VSDXCharStyle smallcaps(false), superscript(false), subscript(false), - face("Arial") {} - VSDXCharStyle(unsigned cc, unsigned short id, Colour c, unsigned lang, double s, bool b, bool i, bool u, bool du, bool so, bool dso, bool ac, bool ic, bool sc, bool super, bool sub, WPXString f) : + face() {} + VSDXCharStyle(unsigned cc, unsigned short id, Colour c, unsigned lang, double s, bool b, bool i, bool u, bool du, bool so, bool dso, bool ac, bool ic, bool sc, bool super, bool sub, VSDXFont f) : charCount(cc), faceID(id), colour(c), @@ -138,7 +138,7 @@ struct VSDXCharStyle bool smallcaps; bool superscript; bool subscript; - WPXString face; + VSDXFont face; }; struct VSDXParaStyle diff --git a/src/lib/VSDXStylesCollector.cpp b/src/lib/VSDXStylesCollector.cpp index 74ea41c..1b2c3b8 100644 --- a/src/lib/VSDXStylesCollector.cpp +++ b/src/lib/VSDXStylesCollector.cpp @@ -246,7 +246,7 @@ void libvisio::VSDXStylesCollector::collectVSDXParaStyle(unsigned /* id */ , uns void libvisio::VSDXStylesCollector::collectVSDXCharStyle(unsigned /*id*/ , unsigned level, unsigned /*charCount*/, unsigned short /*fontID*/, Colour /*fontColour*/, unsigned /*langId*/, double /*fontSize*/, bool /*bold*/, bool /*italic*/, bool /*underline*/, bool /* doubleunderline */, bool /* strikeout */, bool /* doublestrikeout */, bool /* allcaps */, - bool /* initcaps */, bool /* smallcaps */, bool /* superscript */, bool /* subscript */, WPXString /*fontFace*/) + bool /* initcaps */, bool /* smallcaps */, bool /* superscript */, bool /* subscript */, VSDXFont /*fontFace*/) { _handleLevelChange(level); } @@ -327,7 +327,7 @@ void libvisio::VSDXStylesCollector::collectParaIXStyle(unsigned /*id*/, unsigned void libvisio::VSDXStylesCollector::collectCharIXStyle(unsigned /*id*/ , unsigned level, unsigned charCount, unsigned short fontID, Colour fontColour, unsigned langID, double fontSize, bool bold, bool italic, bool underline, bool doubleunderline, bool strikeout, bool doublestrikeout, bool allcaps, bool initcaps, bool smallcaps, - bool superscript, bool subscript, WPXString fontFace) + bool superscript, bool subscript, VSDXFont fontFace) { _handleLevelChange(level); if (!m_charStyle) diff --git a/src/lib/VSDXStylesCollector.h b/src/lib/VSDXStylesCollector.h index 9aa8497..ac7fdef 100644 --- a/src/lib/VSDXStylesCollector.h +++ b/src/lib/VSDXStylesCollector.h @@ -98,7 +98,7 @@ public: void collectText(unsigned id, unsigned level, const ::WPXBinaryData &textStream, TextFormat format); void collectVSDXCharStyle(unsigned id , unsigned level, unsigned charCount, unsigned short fontID, Colour fontColour, unsigned langId, double fontSize, bool bold, bool italic, bool underline, bool doubleunderline, bool strikeout, bool doublestrikeout, - bool allcaps, bool initcaps, bool smallcaps, bool superscript, bool subscript, WPXString fontFace); + bool allcaps, bool initcaps, bool smallcaps, bool superscript, bool subscript, VSDXFont fontFace); void collectVSDXParaStyle(unsigned id , unsigned level, unsigned charCount, double indFirst, double indLeft, double indRight, double spLine, double spBefore, double spAfter, unsigned char align, unsigned flags); void collectTextBlock(unsigned id, unsigned level, double leftMargin, double rightMargin, double topMargin, double bottomMargin, unsigned char verticalAlign, @@ -119,7 +119,7 @@ public: unsigned char fillFGTransparency, unsigned char fillBGTransparency, unsigned char shadowPattern, Colour shfgc); void collectCharIXStyle(unsigned id , unsigned level, unsigned charCount, unsigned short fontID, Colour fontColour, unsigned langId, double fontSize, bool bold, bool italic, bool underline, bool doubleunderline, bool strikeout, bool doublestrikeout, - bool allcaps, bool initcaps, bool smallcaps, bool superscript, bool subscript, WPXString fontFace); + bool allcaps, bool initcaps, bool smallcaps, bool superscript, bool subscript, VSDXFont fontFace); void collectParaIXStyle(unsigned id , unsigned level, unsigned charCount, double indFirst, double indLeft, double indRight, double spLine, double spBefore, double spAfter, unsigned char align, unsigned flags); void collectTextBlockStyle(unsigned id, unsigned level, double leftMargin, double rightMargin, double topMargin, double bottomMargin, unsigned char verticalAlign, diff --git a/src/lib/VSDXTypes.h b/src/lib/VSDXTypes.h index 401ba71..4d5d0c3 100644 --- a/src/lib/VSDXTypes.h +++ b/src/lib/VSDXTypes.h @@ -211,6 +211,13 @@ public: TextFormat m_format; }; +struct VSDXFont +{ + WPXString name; + TextFormat encoding; + VSDXFont() : name("Arial"), encoding(libvisio::VSD_TEXT_ANSI) {} +}; + } // namespace libvisio #endif /* VSDXTYPES_H */ diff --git a/src/lib/libvisio_utils.cpp b/src/lib/libvisio_utils.cpp index d73ba4d..f881bdb 100644 --- a/src/lib/libvisio_utils.cpp +++ b/src/lib/libvisio_utils.cpp @@ -32,61 +32,6 @@ #define VSD_NUM_ELEMENTS(array) sizeof(array)/sizeof(array[0]) -#define SURROGATE_VALUE(h,l) (((h) - 0xd800) * 0x400 + (l) - 0xdc00 + 0x10000) - -namespace -{ - -static void _appendUCS4(WPXString &text, unsigned ucs4Character) -{ - unsigned char first; - int len; - if (ucs4Character < 0x80) - { - first = 0; - len = 1; - } - else if (ucs4Character < 0x800) - { - first = 0xc0; - len = 2; - } - else if (ucs4Character < 0x10000) - { - first = 0xe0; - len = 3; - } - else if (ucs4Character < 0x200000) - { - first = 0xf0; - len = 4; - } - else if (ucs4Character < 0x4000000) - { - first = 0xf8; - len = 5; - } - else - { - first = 0xfc; - len = 6; - } - - unsigned char outbuf[6] = { 0, 0, 0, 0, 0, 0 }; - int i; - for (i = len - 1; i > 0; --i) - { - outbuf[i] = (ucs4Character & 0x3f) | 0x80; - ucs4Character >>= 6; - } - outbuf[0] = (ucs4Character & 0xff) | first; - - for (i = 0; i < len; i++) - text.append(outbuf[i]); -} - -} // anonymous namespace - uint8_t libvisio::readU8(WPXInputStream *input) { if (!input || input->atEOS()) @@ -164,322 +109,4 @@ double libvisio::readDouble(WPXInputStream *input) return tmpUnion.d; } -void libvisio::appendCharacters(WPXString &text, const std::vector<unsigned char> &characters, TextFormat format) -{ - if (format == VSD_TEXT_UTF16) - return appendCharacters(text, characters); - - static const unsigned short cp874map[] = - { - 0x20AC, 0x0020, 0x0020, 0x0020, 0x0020, 0x2026, 0x0020, 0x0020, - 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, - 0x0020, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, - 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, - 0x00A0, 0x0E01, 0x0E02, 0x0E03, 0x0E04, 0x0E05, 0x0E06, 0x0E07, - 0x0E08, 0x0E09, 0x0E0A, 0x0E0B, 0x0E0C, 0x0E0D, 0x0E0E, 0x0E0F, - 0x0E10, 0x0E11, 0x0E12, 0x0E13, 0x0E14, 0x0E15, 0x0E16, 0x0E17, - 0x0E18, 0x0E19, 0x0E1A, 0x0E1B, 0x0E1C, 0x0E1D, 0x0E1E, 0x0E1F, - 0x0E20, 0x0E21, 0x0E22, 0x0E23, 0x0E24, 0x0E25, 0x0E26, 0x0E27, - 0x0E28, 0x0E29, 0x0E2A, 0x0E2B, 0x0E2C, 0x0E2D, 0x0E2E, 0x0E2F, - 0x0E30, 0x0E31, 0x0E32, 0x0E33, 0x0E34, 0x0E35, 0x0E36, 0x0E37, - 0x0E38, 0x0E39, 0x0E3A, 0x0020, 0x0020, 0x0020, 0x0020, 0x0E3F, - 0x0E40, 0x0E41, 0x0E42, 0x0E43, 0x0E44, 0x0E45, 0x0E46, 0x0E47, - 0x0E48, 0x0E49, 0x0E4A, 0x0E4B, 0x0E4C, 0x0E4D, 0x0E4E, 0x0E4F, - 0x0E50, 0x0E51, 0x0E52, 0x0E53, 0x0E54, 0x0E55, 0x0E56, 0x0E57, - 0x0E58, 0x0E59, 0x0E5A, 0x0E5B, 0x0020, 0x0020, 0x0020, 0x0020 - }; - - static const unsigned short cp1250map[] = - { - 0x20AC, 0x0020, 0x201A, 0x0020, 0x201E, 0x2026, 0x2020, 0x2021, - 0x0020, 0x2030, 0x0160, 0x2039, 0x015A, 0x0164, 0x017D, 0x0179, - 0x0020, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, - 0x0020, 0x2122, 0x0161, 0x203A, 0x015B, 0x0165, 0x017E, 0x017A, - 0x00A0, 0x02C7, 0x02D8, 0x0141, 0x00A4, 0x0104, 0x00A6, 0x00A7, - 0x00A8, 0x00A9, 0x015E, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x017B, - 0x00B0, 0x00B1, 0x02DB, 0x0142, 0x00B4, 0x00B5, 0x00B6, 0x00B7, - 0x00B8, 0x0105, 0x015F, 0x00BB, 0x013D, 0x02DD, 0x013E, 0x017C, - 0x0154, 0x00C1, 0x00C2, 0x0102, 0x00C4, 0x0139, 0x0106, 0x00C7, - 0x010C, 0x00C9, 0x0118, 0x00CB, 0x011A, 0x00CD, 0x00CE, 0x010E, - 0x0110, 0x0143, 0x0147, 0x00D3, 0x00D4, 0x0150, 0x00D6, 0x00D7, - 0x0158, 0x016E, 0x00DA, 0x0170, 0x00DC, 0x00DD, 0x0162, 0x00DF, - 0x0155, 0x00E1, 0x00E2, 0x0103, 0x00E4, 0x013A, 0x0107, 0x00E7, - 0x010D, 0x00E9, 0x0119, 0x00EB, 0x011B, 0x00ED, 0x00EE, 0x010F, - 0x0111, 0x0144, 0x0148, 0x00F3, 0x00F4, 0x0151, 0x00F6, 0x00F7, - 0x0159, 0x016F, 0x00FA, 0x0171, 0x00FC, 0x00FD, 0x0163, 0x02D9 - }; - - static const unsigned short cp1251map[] = - { - 0x0402, 0x0403, 0x201A, 0x0453, 0x201E, 0x2026, 0x2020, 0x2021, - 0x20AC, 0x2030, 0x0409, 0x2039, 0x040A, 0x040C, 0x040B, 0x040F, - 0x0452, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, - 0x0020, 0x2122, 0x0459, 0x203A, 0x045A, 0x045C, 0x045B, 0x045F, - 0x00A0, 0x040E, 0x045E, 0x0408, 0x00A4, 0x0490, 0x00A6, 0x00A7, - 0x0401, 0x00A9, 0x0404, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x0407, - 0x00B0, 0x00B1, 0x0406, 0x0456, 0x0491, 0x00B5, 0x00B6, 0x00B7, - 0x0451, 0x2116, 0x0454, 0x00BB, 0x0458, 0x0405, 0x0455, 0x0457, - 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, - 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F, - 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, - 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F, - 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, - 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F, - 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, - 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F - }; - - static const unsigned short cp1252map[] = - { - 0x20AC, 0x0020, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, - 0x02C6, 0x2030, 0x0160, 0x2039, 0x0152, 0x0020, 0x017D, 0x0020, - 0x0020, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, - 0x02DC, 0x2122, 0x0161, 0x203A, 0x0153, 0x0020, 0x017E, 0x0178, - 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, - 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, - 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, - 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF, - 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7, - 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF, - 0x00D0, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7, - 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE, 0x00DF, - 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, - 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF, - 0x00F0, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7, - 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x00FF - }; - - static const unsigned short cp1253map[] = - { - 0x20AC, 0x0020, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, - 0x0020, 0x2030, 0x0020, 0x2039, 0x0020, 0x0020, 0x0020, 0x0020, - 0x0020, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, - 0x0020, 0x2122, 0x0020, 0x203A, 0x0020, 0x0020, 0x0020, 0x0020, - 0x00A0, 0x0385, 0x0386, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, - 0x00A8, 0x00A9, 0x0020, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x2015, - 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x0384, 0x00B5, 0x00B6, 0x00B7, - 0x0388, 0x0389, 0x038A, 0x00BB, 0x038C, 0x00BD, 0x038E, 0x038F, - 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, - 0x0398, 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F, - 0x03A0, 0x03A1, 0x0020, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7, - 0x03A8, 0x03A9, 0x03AA, 0x03AB, 0x03AC, 0x03AD, 0x03AE, 0x03AF, - 0x03B0, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7, - 0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF, - 0x03C0, 0x03C1, 0x03C2, 0x03C3, 0x03C4, 0x03C5, 0x03C6, 0x03C7, - 0x03C8, 0x03C9, 0x03CA, 0x03CB, 0x03CC, 0x03CD, 0x03CE, 0x0020 - }; - - static const unsigned short cp1254map[] = - { - 0x20AC, 0x0020, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, - 0x02C6, 0x2030, 0x0160, 0x2039, 0x0152, 0x0020, 0x0020, 0x0020, - 0x0020, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, - 0x02DC, 0x2122, 0x0161, 0x203A, 0x0153, 0x0020, 0x0020, 0x0178, - 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, - 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, - 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, - 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF, - 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7, - 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF, - 0x011E, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7, - 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x0130, 0x015E, 0x00DF, - 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, - 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF, - 0x011F, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7, - 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x0131, 0x015F, 0x00FF - }; - - static const unsigned short cp1255map[] = - { - 0x20AC, 0x0020, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, - 0x02C6, 0x2030, 0x0020, 0x2039, 0x0020, 0x0020, 0x0020, 0x0020, - 0x0020, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, - 0x02DC, 0x2122, 0x0020, 0x203A, 0x0020, 0x0020, 0x0020, 0x0020, - 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x20AA, 0x00A5, 0x00A6, 0x00A7, - 0x00A8, 0x00A9, 0x00D7, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, - 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, - 0x00B8, 0x00B9, 0x00F7, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF, - 0x05B0, 0x05B1, 0x05B2, 0x05B3, 0x05B4, 0x05B5, 0x05B6, 0x05B7, - 0x05B8, 0x05B9, 0x0020, 0x05BB, 0x05BC, 0x05BD, 0x05BE, 0x05BF, - 0x05C0, 0x05C1, 0x05C2, 0x05C3, 0x05F0, 0x05F1, 0x05F2, 0x05F3, - 0x05F4, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, 0x0020, - 0x05D0, 0x05D1, 0x05D2, 0x05D3, 0x05D4, 0x05D5, 0x05D6, 0x05D7, - 0x05D8, 0x05D9, 0x05DA, 0x05DB, 0x05DC, 0x05DD, 0x05DE, 0x05DF, - 0x05E0, 0x05E1, 0x05E2, 0x05E3, 0x05E4, 0x05E5, 0x05E6, 0x05E7, - 0x05E8, 0x05E9, 0x05EA, 0x0020, 0x0020, 0x200E, 0x200F, 0x0020 - }; - - static const unsigned short cp1256map[] = - { - 0x20AC, 0x067E, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, - 0x02C6, 0x2030, 0x0679, 0x2039, 0x0152, 0x0686, 0x0698, 0x0688, - 0x06AF, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, - 0x06A9, 0x2122, 0x0691, 0x203A, 0x0153, 0x200C, 0x200D, 0x06BA, - 0x00A0, 0x060C, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, - 0x00A8, 0x00A9, 0x06BE, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, - 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, - 0x00B8, 0x00B9, 0x061B, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x061F, - 0x06C1, 0x0621, 0x0622, 0x0623, 0x0624, 0x0625, 0x0626, 0x0627, - 0x0628, 0x0629, 0x062A, 0x062B, 0x062C, 0x062D, 0x062E, 0x062F, - 0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x0636, 0x00D7, - 0x0637, 0x0638, 0x0639, 0x063A, 0x0640, 0x0641, 0x0642, 0x0643, - 0x00E0, 0x0644, 0x00E2, 0x0645, 0x0646, 0x0647, 0x0648, 0x00E7, - 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x0649, 0x064A, 0x00EE, 0x00EF, - 0x064B, 0x064C, 0x064D, 0x064E, 0x00F4, 0x064F, 0x0650, 0x00F7, - 0x0651, 0x00F9, 0x0652, 0x00FB, 0x00FC, 0x200E, 0x200F, 0x06D2 - }; - - static const unsigned short cp1257map[] = - { - 0x20AC, 0x0020, 0x201A, 0x0020, 0x201E, 0x2026, 0x2020, 0x2021, - 0x0020, 0x2030, 0x0020, 0x2039, 0x0020, 0x00A8, 0x02C7, 0x00B8, - 0x0020, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, - 0x0020, 0x2122, 0x0020, 0x203A, 0x0020, 0x00AF, 0x02DB, 0x0020, - 0x00A0, 0x0020, 0x00A2, 0x00A3, 0x00A4, 0x0020, 0x00A6, 0x00A7, - 0x00D8, 0x00A9, 0x0156, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00C6, - 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, - 0x00F8, 0x00B9, 0x0157, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00E6, - 0x0104, 0x012E, 0x0100, 0x0106, 0x00C4, 0x00C5, 0x0118, 0x0112, - 0x010C, 0x00C9, 0x0179, 0x0116, 0x0122, 0x0136, 0x012A, 0x013B, - 0x0160, 0x0143, 0x0145, 0x00D3, 0x014C, 0x00D5, 0x00D6, 0x00D7, - 0x0172, 0x0141, 0x015A, 0x016A, 0x00DC, 0x017B, 0x017D, 0x00DF, - 0x0105, 0x012F, 0x0101, 0x0107, 0x00E4, 0x00E5, 0x0119, 0x0113, - 0x010D, 0x00E9, 0x017A, 0x0117, 0x0123, 0x0137, 0x012B, 0x013C, - 0x0161, 0x0144, 0x0146, 0x00F3, 0x014D, 0x00F5, 0x00F6, 0x00F7, - 0x0173, 0x0142, 0x015B, 0x016B, 0x00FC, 0x017C, 0x017E, 0x02D9 - }; - - static const unsigned short cp1258map[] = - { - 0x20AC, 0x0020, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, - 0x02C6, 0x2030, 0x0020, 0x2039, 0x0152, 0x0020, 0x0020, 0x0020, - 0x0020, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, - 0x02DC, 0x2122, 0x0020, 0x203A, 0x0153, 0x0020, 0x0020, 0x0178, - 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, - 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, - 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, - 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF, - 0x00C0, 0x00C1, 0x00C2, 0x0102, 0x00C4, 0x00C5, 0x00C6, 0x00C7, - 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x0300, 0x00CD, 0x00CE, 0x00CF, - 0x0110, 0x00D1, 0x0309, 0x00D3, 0x00D4, 0x01A0, 0x00D6, 0x00D7, - 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x01AF, 0x0303, 0x00DF, - 0x00E0, 0x00E1, 0x00E2, 0x0103, 0x00E4, 0x00E5, 0x00E6, 0x00E7, - 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x0301, 0x00ED, 0x00EE, 0x00EF, - 0x0111, 0x00F1, 0x0323, 0x00F3, 0x00F4, 0x01A1, 0x00F6, 0x00F7, - 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x01B0, 0x20AB, 0x00FF - }; - - std::vector<unsigned char>::const_iterator iter = characters.begin(); - while (iter != characters.end()) - { - uint32_t ucs4Character = 0; - if (*iter < 0x20) - { - ucs4Character = 0x20; - iter++; - } - else if (*iter >= 0x20 && *iter < 0x7f) - ucs4Character = *iter++; - else if (*iter == 0x7f) - { - ucs4Character = 0x20; - iter++; - } - else - { - switch (format) - { - case VSD_TEXT_ANSI: - ucs4Character = cp1252map[*iter++ - 0x80]; - break; - case VSD_TEXT_GREEK: - ucs4Character = cp1253map[*iter++ - 0x80]; - break; - case VSD_TEXT_TURKISH: - ucs4Character = cp1254map[*iter++ - 0x80]; - break; - case VSD_TEXT_VIETNAMESE: - ucs4Character = cp1258map[*iter++ - 0x80]; - break; - case VSD_TEXT_HEBREW: - ucs4Character = cp1255map[*iter++ - 0x80]; - break; - case VSD_TEXT_ARABIC: - ucs4Character = cp1256map[*iter++ - 0x80]; - break; - case VSD_TEXT_BALTIC: - ucs4Character = cp1257map[*iter++ - 0x80]; - break; - case VSD_TEXT_RUSSIAN: - ucs4Character = cp1251map[*iter++ - 0x80]; - break; - case VSD_TEXT_THAI: - ucs4Character = cp874map[*iter++ - 0x80]; - break; - case VSD_TEXT_CENTRAL_EUROPE: - ucs4Character = cp1250map[*iter++ - 0x80]; - break; - default: - ucs4Character = *iter++; - break; - } - } - _appendUCS4(text, ucs4Character); - } -} - -void libvisio::appendCharacters(WPXString &text, const std::vector<unsigned char> &characters) -{ - for (std::vector<unsigned char>::const_iterator iter = characters.begin(); - iter != characters.end();) - { - uint16_t high_surrogate = 0; - bool fail = false; - uint32_t ucs4Character = 0; - while (true) - { - if (iter == characters.end()) - { - fail = true; - break; - } - uint16_t character = *iter++; - character |= (uint16_t)(*iter++) << 8; - if (character >= 0xdc00 && character < 0xe000) /* low surrogate */ - { - if (high_surrogate) - { - ucs4Character = SURROGATE_VALUE(high_surrogate, character); - high_surrogate = 0; - break; - } - else - { - fail = true; - break; - } - } - else - { - if (high_surrogate) - { - fail = true; - break; - } - if (character >= 0xd800 && character < 0xdc00) /* high surrogate */ - high_surrogate = character; - else - { - ucs4Character = character; - break; - } - } - } - if (fail) - throw libvisio::GenericException(); - - _appendUCS4(text, ucs4Character); - } -} - /* vim:set shiftwidth=2 softtabstop=2 expandtab: */ diff --git a/src/lib/libvisio_utils.h b/src/lib/libvisio_utils.h index 912f32b..593e419 100644 --- a/src/lib/libvisio_utils.h +++ b/src/lib/libvisio_utils.h @@ -95,9 +95,6 @@ uint64_t readU64(WPXInputStream *input); double readDouble(WPXInputStream *input); -void appendCharacters(WPXString &text, const std::vector<unsigned char> &characters, TextFormat format); -void appendCharacters(WPXString &text, const std::vector<unsigned char> &characters); - class EndOfStreamException { }; |