From: Fridrich S. <str...@us...> - 2010-06-11 09:58:34
|
Update of /cvsroot/libwpd/libwpd2/src/lib In directory sfp-cvsdas-2.v30.ch3.sourceforge.com:/tmp/cvs-serv10544/src/lib Modified Files: WP1ContentListener.cpp WP3ContentListener.cpp WP42ContentListener.cpp WP5ContentListener.cpp WP6ContentListener.cpp WPXContentListener.cpp WPXContentListener.h Log Message: Map the noncompliant 'Symbol' font glyphs to their corresponding Unicode glyphs Index: WP5ContentListener.cpp =================================================================== RCS file: /cvsroot/libwpd/libwpd2/src/lib/WP5ContentListener.cpp,v retrieving revision 1.40 retrieving revision 1.41 diff -u -d -r1.40 -r1.41 --- WP5ContentListener.cpp 3 Dec 2008 13:40:34 -0000 1.40 +++ WP5ContentListener.cpp 11 Jun 2010 09:58:26 -0000 1.41 @@ -65,9 +65,10 @@ void WP5ContentListener::insertCharacter(uint16_t character) { + uint16_t tmpCharacter = _mapSymbolFont(character); if (!m_ps->m_isSpanOpened) _openSpan(); - appendUCS4(m_parseState->m_textBuffer, (uint32_t)character); + appendUCS4(m_parseState->m_textBuffer, (uint32_t)tmpCharacter); } void WP5ContentListener::insertTab(uint8_t tabType, double tabPosition) Index: WP42ContentListener.cpp =================================================================== RCS file: /cvsroot/libwpd/libwpd2/src/lib/WP42ContentListener.cpp,v retrieving revision 1.24 retrieving revision 1.25 diff -u -d -r1.24 -r1.25 --- WP42ContentListener.cpp 3 Dec 2008 13:40:34 -0000 1.24 +++ WP42ContentListener.cpp 11 Jun 2010 09:58:26 -0000 1.25 @@ -61,9 +61,10 @@ { if (!isUndoOn()) { + uint16_t tmpCharacter = _mapSymbolFont(character); if (!m_ps->m_isSpanOpened) _openSpan(); - appendUCS4(m_parseState->m_textBuffer, (uint32_t)character); + appendUCS4(m_parseState->m_textBuffer, (uint32_t)tmpCharacter); } } Index: WP6ContentListener.cpp =================================================================== RCS file: /cvsroot/libwpd/libwpd2/src/lib/WP6ContentListener.cpp,v retrieving revision 1.74 retrieving revision 1.75 diff -u -d -r1.74 -r1.75 --- WP6ContentListener.cpp 10 Jun 2010 11:58:01 -0000 1.74 +++ WP6ContentListener.cpp 11 Jun 2010 09:58:26 -0000 1.75 @@ -412,40 +412,42 @@ { if (!isUndoOn()) { + uint16_t tmpCharacter = _mapSymbolFont(character); + if (m_parseState->m_styleStateSequence.getCurrentState() == STYLE_BODY || m_parseState->m_styleStateSequence.getCurrentState() == NORMAL) { if (!m_ps->m_isSpanOpened) _openSpan(); m_parseState->m_isListReference = false; - appendUCS4(m_parseState->m_bodyText, (uint32_t)character); + appendUCS4(m_parseState->m_bodyText, (uint32_t)tmpCharacter); } else if (m_parseState->m_styleStateSequence.getCurrentState() == BEGIN_BEFORE_NUMBERING) { m_parseState->m_isListReference = true; - appendUCS4(m_parseState->m_textBeforeNumber, (uint32_t)character); + appendUCS4(m_parseState->m_textBeforeNumber, (uint32_t)tmpCharacter); } else if (m_parseState->m_styleStateSequence.getCurrentState() == BEGIN_NUMBERING_BEFORE_DISPLAY_REFERENCING) { // left delimeter (or the bullet if there is no display referencing) - appendUCS4(m_parseState->m_textBeforeDisplayReference, (uint32_t)character); + appendUCS4(m_parseState->m_textBeforeDisplayReference, (uint32_t)tmpCharacter); m_parseState->m_isListReference = true; } else if (m_parseState->m_styleStateSequence.getCurrentState() == DISPLAY_REFERENCING) { // the actual paragraph number (in varying forms) - appendUCS4(m_parseState->m_numberText, (uint32_t)character); + appendUCS4(m_parseState->m_numberText, (uint32_t)tmpCharacter); m_parseState->m_isListReference = true; } else if (m_parseState->m_styleStateSequence.getCurrentState() == BEGIN_NUMBERING_AFTER_DISPLAY_REFERENCING) { // right delimeter (if there was a display no. ref. group) - appendUCS4(m_parseState->m_textAfterDisplayReference, (uint32_t)character); + appendUCS4(m_parseState->m_textAfterDisplayReference, (uint32_t)tmpCharacter); m_parseState->m_isListReference = true; } else if (m_parseState->m_styleStateSequence.getCurrentState() == BEGIN_AFTER_NUMBERING) { - appendUCS4(m_parseState->m_textAfterNumber, (uint32_t)character); + appendUCS4(m_parseState->m_textAfterNumber, (uint32_t)tmpCharacter); m_parseState->m_isListReference = true; } } Index: WPXContentListener.h =================================================================== RCS file: /cvsroot/libwpd/libwpd2/src/lib/WPXContentListener.h,v retrieving revision 1.26 retrieving revision 1.27 diff -u -d -r1.26 -r1.27 --- WPXContentListener.h 3 Dec 2008 13:40:34 -0000 1.26 +++ WPXContentListener.h 11 Jun 2010 09:58:26 -0000 1.27 @@ -203,6 +203,8 @@ void _insertBreakIfNecessary(WPXPropertyList &propList); + uint16_t _mapSymbolFont(uint16_t character); + private: WPXContentListener(const WPXContentListener&); WPXContentListener& operator=(const WPXContentListener&); Index: WP3ContentListener.cpp =================================================================== RCS file: /cvsroot/libwpd/libwpd2/src/lib/WP3ContentListener.cpp,v retrieving revision 1.44 retrieving revision 1.45 diff -u -d -r1.44 -r1.45 --- WP3ContentListener.cpp 3 Dec 2008 13:40:34 -0000 1.44 +++ WP3ContentListener.cpp 11 Jun 2010 09:58:26 -0000 1.45 @@ -67,11 +67,12 @@ void WP3ContentListener::insertCharacter(const uint16_t character) { - if (!isUndoOn()) + if (!isUndoOn()) { + uint16_t tmpCharacter = _mapSymbolFont(character); if (!m_ps->m_isSpanOpened) _openSpan(); - appendUCS4(m_parseState->m_textBuffer, (uint32_t)character); + appendUCS4(m_parseState->m_textBuffer, (uint32_t)tmpCharacter); } } Index: WP1ContentListener.cpp =================================================================== RCS file: /cvsroot/libwpd/libwpd2/src/lib/WP1ContentListener.cpp,v retrieving revision 1.28 retrieving revision 1.29 diff -u -d -r1.28 -r1.29 --- WP1ContentListener.cpp 3 Dec 2008 13:40:34 -0000 1.28 +++ WP1ContentListener.cpp 11 Jun 2010 09:58:26 -0000 1.29 @@ -64,13 +64,15 @@ { if (!isUndoOn()) { + uint16_t tmpCharacter = _mapSymbolFont(character); + if (!m_ps->m_isSpanOpened) _openSpan(); for (;m_parseState->m_numDeferredTabs > 0; m_parseState->m_numDeferredTabs--) { m_documentInterface->insertTab(); } - appendUCS4(m_parseState->m_textBuffer, (uint32_t)character); + appendUCS4(m_parseState->m_textBuffer, (uint32_t)tmpCharacter); } } Index: WPXContentListener.cpp =================================================================== RCS file: /cvsroot/libwpd/libwpd2/src/lib/WPXContentListener.cpp,v retrieving revision 1.42 retrieving revision 1.43 diff -u -d -r1.42 -r1.43 --- WPXContentListener.cpp 3 Dec 2008 13:40:34 -0000 1.42 +++ WPXContentListener.cpp 11 Jun 2010 09:58:26 -0000 1.43 @@ -712,7 +712,12 @@ propList.insert("fo:text-shadow", "1pt 1pt"); if (m_ps->m_fontName) - propList.insert("style:font-name", m_ps->m_fontName->cstr()); + { + if (*(m_ps->m_fontName) == "Symbol") + propList.insert("style:font-name", "WGL4"); + else + propList.insert("style:font-name", m_ps->m_fontName->cstr()); + } propList.insert("fo:font-size", fontSizeChange*m_ps->m_fontSize, WPX_POINT); // Here we give the priority to the redline bit over the font color. This is how WordPerfect behaves: @@ -1277,3 +1282,47 @@ } return position; } + +uint16_t WPXContentListener::_mapSymbolFont(uint16_t character) +{ + static uint16_t _symbolFontMap1 [] = + { + 0x0020, 0x0021, 0x2200, 0x0023, 0x2203, 0x0025, 0x0026, 0x220D, // 0x21 .. + 0x0028, 0x0029, 0x2217, 0x002B, 0x002C, 0x2212, 0x002E, 0x002F, + 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, + 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, + 0x2245, 0x0391, 0x0392, 0x03A7, 0x0394, 0x0395, 0x03A6, 0x0393, + 0x0397, 0x0399, 0x03D1, 0x039A, 0x039B, 0x039C, 0x039D, 0x039F, + 0x03A0, 0x0398, 0x03A1, 0x03A3, 0x03A4, 0x03A5, 0x03C2, 0x03A9, + 0x039E, 0x03A8, 0x0396, 0x005B, 0x2234, 0x005D, 0x22A5, 0x005F, + 0xF8E5, 0x03B1, 0x03B2, 0x03C7, 0x03B4, 0x03B5, 0x03C6, 0x03B3, + 0x03B7, 0x03B9, 0x03D5, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BF, + 0x03C0, 0x03B8, 0x03C1, 0x03C3, 0x03C4, 0x03C5, 0x03D6, 0x03C9, + 0x03BE, 0x03C8, 0x03B6, 0x007B, 0x007C, 0x007D, 0x223C // .. 0x7E + }; + + static uint16_t _symbolFontMap2 [] = + { + 0x20AC, 0x03D2, 0x2032, 0x2264, 0x2044, 0x221E, 0x0192, 0x2663, // 0xA0 .. + 0x2666, 0x2665, 0x2660, 0x2194, 0x2190, 0x2191, 0x2192, 0x2193, + 0x00B0, 0x00B1, 0x2033, 0x2265, 0x00D7, 0x221D, 0x2202, 0x2022, + 0x00F7, 0x2260, 0x2261, 0x2248, 0x2026, 0x23D0, 0x23AF, 0x21B5, + 0x2135, 0x2111, 0x211C, 0x2118, 0x2297, 0x2295, 0x2205, 0x2229, + 0x222A, 0x2283, 0x2287, 0x2284, 0x2282, 0x2286, 0x2208, 0x2209, + 0x2220, 0x2207, 0x00AE, 0x00A9, 0x2122, 0x220F, 0x221A, 0x22C5, + 0x00AC, 0x2227, 0x2228, 0x21D4, 0x21D0, 0x21D1, 0x21D2, 0x21D3, + 0x25CA, 0x3008, 0x00AE, 0x00A9, 0x2122, 0x2211, 0x239B, 0x239C, + 0x239D, 0x23A1, 0x23A2, 0x23A3, 0x23A7, 0x23A8, 0x23A9, 0x23AA, + 0xF8FF, 0x3009, 0x222B, 0x2320, 0x23AE, 0x2321, 0x239E, 0x239F, + 0x23A0, 0x23A4, 0x23A5, 0x23A6, 0x23AB, 0x23AC, 0x23AD // .. 0xFE + }; + + if (*(m_ps->m_fontName) != "Symbol") + return character; + + if (character >= 0x0020 && character < 0x7F) + return _symbolFontMap1[character - 0x20]; + if (character >= 0x00A0 && character < 0xFF) + return _symbolFontMap2[character - 0xA0]; + return character; +} |