src/lib/VSDXTheme.cpp | 120 +++++++++++++++++++++++++++++++++++++++++++++++++- src/lib/VSDXTheme.h | 25 ++++++++++ src/lib/tokens.txt | 30 ++++++++++++ 3 files changed, 174 insertions(+), 1 deletion(-)
New commits: commit ca14a80bcb129878bb95d1187a8f3761e65b0842 Author: Fridrich Å trba <fridrich.st...@bluewin.ch> Date: Fri Feb 24 10:35:45 2017 +0100 Parse Font scheme Change-Id: If2de16033a921443025f582431c4a4b03a9e7145 diff --git a/src/lib/VSDXTheme.cpp b/src/lib/VSDXTheme.cpp index edf395c..a05484b 100644 --- a/src/lib/VSDXTheme.cpp +++ b/src/lib/VSDXTheme.cpp @@ -46,8 +46,24 @@ libvisio::VSDXClrScheme::VSDXClrScheme() { } +libvisio::VSDXFont::VSDXFont() + : m_latinTypeFace(), + m_eaTypeFace(), + m_csTypeFace(), + m_typeFaces() +{ +} + +libvisio::VSDXFontScheme::VSDXFontScheme() + : m_majorFont(), + m_minorFont(), + m_schemeId(0) +{ +} + libvisio::VSDXTheme::VSDXTheme() - : m_clrScheme() + : m_clrScheme(), + m_fontScheme() { } @@ -63,6 +79,7 @@ int libvisio::VSDXTheme::getElementToken(xmlTextReaderPtr reader) bool libvisio::VSDXTheme::parse(librevenge::RVNGInputStream *input) { + VSD_DEBUG_MSG(("VSDXTheme::parse\n")); if (!input) return false; @@ -84,6 +101,9 @@ bool libvisio::VSDXTheme::parse(librevenge::RVNGInputStream *input) case XML_A_CLRSCHEME: readClrScheme(reader.get()); break; + case XML_A_FONTSCHEME: + readFontScheme(reader.get()); + break; default: break; } @@ -137,8 +157,104 @@ boost::optional<libvisio::Colour> libvisio::VSDXTheme::readSysClr(xmlTextReaderP return retVal; } +void libvisio::VSDXTheme::readFontScheme(xmlTextReaderPtr reader) +{ + VSD_DEBUG_MSG(("VSDXTheme::readFontScheme\n")); + int ret = 1; + int tokenId = XML_TOKEN_INVALID; + int tokenType = -1; + do + { + ret = xmlTextReaderRead(reader); + tokenId = getElementToken(reader); + if (XML_TOKEN_INVALID == tokenId) + { + VSD_DEBUG_MSG(("VSDXTheme::readFontScheme: unknown token %s\n", xmlTextReaderConstName(reader))); + } + tokenType = xmlTextReaderNodeType(reader); + switch (tokenId) + { + case XML_A_MAJORFONT: + readFont(reader, tokenId, m_fontScheme.m_majorFont); + break; + case XML_A_MINORFONT: + readFont(reader, tokenId, m_fontScheme.m_minorFont); + break; + case XML_VT_SCHEMEID: + break; + default: + break; + } + } + while ((XML_A_FONTSCHEME != tokenId || XML_READER_TYPE_END_ELEMENT != tokenType) && 1 == ret); +} + +void libvisio::VSDXTheme::readFont(xmlTextReaderPtr reader, int idToken, VSDXFont &font) +{ + VSD_DEBUG_MSG(("VSDXTheme::readFont\n")); + int ret = 1; + int tokenId = XML_TOKEN_INVALID; + int tokenType = -1; + do + { + ret = xmlTextReaderRead(reader); + tokenId = getElementToken(reader); + if (XML_TOKEN_INVALID == tokenId) + { + VSD_DEBUG_MSG(("VSDXTheme::readFont: unknown token %s\n", xmlTextReaderConstName(reader))); + } + tokenType = xmlTextReaderNodeType(reader); + switch (tokenId) + { + case XML_A_LATIN: + readTypeFace(reader, font.m_latinTypeFace); + break; + case XML_A_EA: + readTypeFace(reader, font.m_eaTypeFace); + break; + case XML_A_CS: + readTypeFace(reader, font.m_csTypeFace); + break; + case XML_A_FONT: + { + int script; + librevenge::RVNGString typeFace; + readTypeFace(reader, script, typeFace); + font.m_typeFaces[script] = typeFace; + break; + } + default: + break; + } + } + while ((idToken != tokenId || XML_READER_TYPE_END_ELEMENT != tokenType) && 1 == ret); +} + +void libvisio::VSDXTheme::readTypeFace(xmlTextReaderPtr reader, librevenge::RVNGString &typeFace) +{ + const shared_ptr<xmlChar> sTypeFace(xmlTextReaderGetAttribute(reader, BAD_CAST("typeface")), xmlFree); + if (sTypeFace) + { + typeFace.clear(); + typeFace.sprintf("%s", (const char *)sTypeFace.get()); + } +} + +void libvisio::VSDXTheme::readTypeFace(xmlTextReaderPtr reader, int &script, librevenge::RVNGString &typeFace) +{ + const shared_ptr<xmlChar> sScript(xmlTextReaderGetAttribute(reader, BAD_CAST("script")), xmlFree); + if (sScript) + { + int token = libvisio::VSDXMLTokenMap::getTokenId(sScript.get()); + if (XML_TOKEN_INVALID != token) + script = token; + } + readTypeFace(reader, typeFace); +} + void libvisio::VSDXTheme::readClrScheme(xmlTextReaderPtr reader) { + VSD_DEBUG_MSG(("VSDXTheme::readClrScheme\n")); int ret = 1; int tokenId = XML_TOKEN_INVALID; int tokenType = -1; @@ -238,6 +354,7 @@ void libvisio::VSDXTheme::readThemeColour(xmlTextReaderPtr reader, int idToken, void libvisio::VSDXTheme::readVariationClrSchemeLst(xmlTextReaderPtr reader) { + VSD_DEBUG_MSG(("VSDXTheme::readVariationClrSchemeLst\n")); int ret = 1; int tokenId = XML_TOKEN_INVALID; int tokenType = -1; @@ -268,6 +385,7 @@ void libvisio::VSDXTheme::readVariationClrSchemeLst(xmlTextReaderPtr reader) void libvisio::VSDXTheme::readVariationClrScheme(xmlTextReaderPtr reader, VSDXVariationClrScheme &varClrSch) { + VSD_DEBUG_MSG(("VSDXTheme::readVariationClrScheme\n")); int ret = 1; int tokenId = XML_TOKEN_INVALID; int tokenType = -1; diff --git a/src/lib/VSDXTheme.h b/src/lib/VSDXTheme.h index 4f251cb..e0de7c3 100644 --- a/src/lib/VSDXTheme.h +++ b/src/lib/VSDXTheme.h @@ -11,6 +11,7 @@ #define __VSDXTHEME_H__ #include <vector> +#include <map> #include <boost/optional.hpp> #include <librevenge-stream/librevenge-stream.h> #include "VSDXMLHelper.h" @@ -53,6 +54,25 @@ struct VSDXClrScheme VSDXClrScheme(); }; +struct VSDXFont +{ + librevenge::RVNGString m_latinTypeFace; + librevenge::RVNGString m_eaTypeFace; + librevenge::RVNGString m_csTypeFace; + std::map<unsigned, librevenge::RVNGString> m_typeFaces; + + VSDXFont(); +}; + +struct VSDXFontScheme +{ + VSDXFont m_majorFont; + VSDXFont m_minorFont; + unsigned m_schemeId; + + VSDXFontScheme(); +}; + class VSDXTheme { public: @@ -72,10 +92,15 @@ private: void readThemeColour(xmlTextReaderPtr reader, int idToken, Colour &clr); void readVariationClrSchemeLst(xmlTextReaderPtr reader); void readVariationClrScheme(xmlTextReaderPtr reader, VSDXVariationClrScheme &varClrSch); + void readFontScheme(xmlTextReaderPtr reader); + void readFont(xmlTextReaderPtr reader, int idToken, VSDXFont &font); + void readTypeFace(xmlTextReaderPtr reader, librevenge::RVNGString &typeFace); + void readTypeFace(xmlTextReaderPtr reader, int &script, librevenge::RVNGString &typeFace); int getElementToken(xmlTextReaderPtr reader); VSDXClrScheme m_clrScheme; + VSDXFontScheme m_fontScheme; }; } // namespace libvisio diff --git a/src/lib/tokens.txt b/src/lib/tokens.txt index 661093c..c15e7ef 100644 --- a/src/lib/tokens.txt +++ b/src/lib/tokens.txt @@ -41,6 +41,7 @@ Angle a:objectDefaults a:outerShdw a:prstDash +ARAB ArcTo a:satMod a:schemeClr @@ -56,16 +57,19 @@ BeginArrow BeginX BeginY BegTrigger +BENG BottomMargin Bullet BulletFont BulletFontSize BulletStr C +CANS Case Cell Char Character +CHER Color ColorEntry Colors @@ -88,6 +92,7 @@ dcterms:created dcterms:modified dc:title DefaultTabStop +DEVA DoubleStrikethrough DrawingScale E @@ -99,6 +104,7 @@ EndArrow EndTrigger EndX EndY +ETHI FaceName FaceNames Fill @@ -117,6 +123,13 @@ Foreign ForeignData Geom Geometry +GEOR +GUJR +GURU +HANG +HANS +HANT +HEBR Height HideText Highlight @@ -129,6 +142,10 @@ IndFirst IndLeft IndRight InfiniteLine +JPAN +KHMR +KNDA +LAOO Layer LayerMem LayerMember @@ -145,11 +162,14 @@ LocPinY Master Masters Misc +MLYM +MONG MoveTo NoFill NoLine NoShow NURBSTo +ORYA Overline Page PageHeight @@ -197,6 +217,7 @@ ShdwForegnd ShdwOffsetX ShdwOffsetY ShdwPattern +SINH Size SolutionXML SpAfter @@ -208,8 +229,11 @@ Strikethru Style StyleSheet StyleSheets +SYRC Tab Tabs +TAML +TELU Template Text TextBkgnd @@ -218,7 +242,10 @@ TextBlock TextDirection TextPosAfterBullet TextXForm +THAA +THAI ThemeIndex +TIBT TopMargin tp TxtAngle @@ -228,9 +255,11 @@ TxtLocPinY TxtPinX TxtPinY TxtWidth +UIGH VariationColorIndex VariationStyleIndex VerticalAlign +VIET Visible vt:bkgnd vt:color @@ -267,3 +296,4 @@ X XForm XForm1D Y +YIII
_______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits