--- src/lib/VSDStyles.h +++ src/lib/VSDStyles.h @@ -179,14 +177,13 @@ struct VSDFillStyle ASSIGN_OPTIONAL(style.qsFillMatrix, qsFillMatrix); if (theme) { - if (!!style.qsFillColour && style.qsFillColour.get() >= 0) - ASSIGN_OPTIONAL(theme->getThemeColour(style.qsFillColour.get()), fgColour); - - if (!!style.qsFillColour && style.qsFillColour.get() >= 0) - ASSIGN_OPTIONAL(theme->getThemeColour(style.qsFillColour.get()), bgColour); - - if (!!style.qsShadowColour && style.qsShadowColour.get() >= 0) - ASSIGN_OPTIONAL(theme->getThemeColour(style.qsShadowColour.get()), shadowFgColour); + // Quick Style Colour 100 is special. It is the default, + // and it is not saved explicitely in the VSDX file. + ASSIGN_OPTIONAL(theme->getThemeColour(style.qsFillColour.value_or(100)), fgColour); + ASSIGN_OPTIONAL(theme->getThemeColour(style.qsFillColour.value_or(100)), bgColour); + ASSIGN_OPTIONAL(theme->getThemeColour(style.qsShadowColour.value_or(100)), shadowFgColour); + if (!!style.qsFillMatrix && style.qsFillMatrix.get() >= 0) + ASSIGN_OPTIONAL(theme->getFillStyleColour(style.qsFillMatrix.get()), fgColour); } ASSIGN_OPTIONAL(style.fgColour, fgColour); ASSIGN_OPTIONAL(style.bgColour, bgColour); --- src/lib/VSDXTheme.cpp +++ src/lib/VSDXTheme.cpp @@ -63,7 +63,8 @@ libvisio::VSDXFontScheme::VSDXFontScheme() libvisio::VSDXTheme::VSDXTheme() : m_clrScheme(), - m_fontScheme() + m_fontScheme(), + m_fillStyleLst(std::vector>(6)) { } @@ -102,6 +103,9 @@ bool libvisio::VSDXTheme::parse(librevenge::RVNGInputStream *input) case XML_A_FONTSCHEME: readFontScheme(reader.get()); break; + case XML_A_FMTSCHEME: + readFmtScheme(reader.get()); + break; default: break; } @@ -320,7 +324,7 @@ void libvisio::VSDXTheme::readClrScheme(xmlTextReaderPtr reader) while ((XML_A_CLRSCHEME != tokenId || XML_READER_TYPE_END_ELEMENT != tokenType) && 1 == ret); } -void libvisio::VSDXTheme::readThemeColour(xmlTextReaderPtr reader, int idToken, Colour &clr) +bool libvisio::VSDXTheme::readThemeColour(xmlTextReaderPtr reader, int idToken, Colour &clr) { int ret = 1; int tokenId = XML_TOKEN_INVALID; @@ -350,7 +354,11 @@ void libvisio::VSDXTheme::readThemeColour(xmlTextReaderPtr reader, int idToken, while ((idToken != tokenId || XML_READER_TYPE_END_ELEMENT != tokenType) && 1 == ret); if (colour) + { clr = *colour; + return true; + } + return false; } void libvisio::VSDXTheme::readVariationClrSchemeLst(xmlTextReaderPtr reader) @@ -491,4 +499,96 @@ boost::optional libvisio::VSDXTheme::getThemeColour(unsigned v return boost::optional(); } +void libvisio::VSDXTheme::readFmtScheme(xmlTextReaderPtr reader) +{ + VSD_DEBUG_MSG(("VSDXTheme::readFmtScheme\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::readFmtScheme: unknown token %s\n", xmlTextReaderConstName(reader))); + } + tokenType = xmlTextReaderNodeType(reader); + switch (tokenId) + { + case XML_A_FILLSTYLELST: + { + readFillStyleLst(reader); + break; + } + default: + // Other style lists not implemented + break; + } + } while ((XML_A_FMTSCHEME != tokenId || XML_READER_TYPE_END_ELEMENT != tokenType) && 1 == ret); +} + +void libvisio::VSDXTheme::skipUnimplemented(xmlTextReaderPtr reader, int idToken) +{ + 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::skipUnimplemented: unknown token %s\n", xmlTextReaderConstName(reader))); + } + tokenType = xmlTextReaderNodeType(reader); + } while ((idToken != tokenId || XML_READER_TYPE_END_ELEMENT != tokenType) && 1 == ret); +} + +void libvisio::VSDXTheme::readFillStyleLst(xmlTextReaderPtr reader) +{ + VSD_DEBUG_MSG(("VSDXTheme::readFillStyleLst\n")); + int ret = xmlTextReaderRead(reader); + int tokenId = getElementToken(reader); + if (XML_TOKEN_INVALID == tokenId) + { + VSD_DEBUG_MSG(("VSDXTheme::readFillStyleLst: unknown token %s\n", xmlTextReaderConstName(reader))); + } + int tokenType = xmlTextReaderNodeType(reader); + int i = 0; + while ((XML_A_FILLSTYLELST != tokenId || XML_READER_TYPE_END_ELEMENT != tokenType) && 1 == ret) + { + switch (tokenId) + { + case XML_A_SOLIDFILL: + { + Colour colour; + if (readThemeColour(reader, tokenId, colour)) + { + m_fillStyleLst[i] = colour; + } + break; + } + default: + // Skip unimplemented fill type + skipUnimplemented(reader, tokenId); + break; + } + ret = xmlTextReaderRead(reader); + tokenId = getElementToken(reader); + if (XML_TOKEN_INVALID == tokenId) + { + VSD_DEBUG_MSG(("VSDXTheme::readFillStyleLst: unknown token %s\n", xmlTextReaderConstName(reader))); + } + tokenType = xmlTextReaderNodeType(reader); + } +} + +boost::optional libvisio::VSDXTheme::getFillStyleColour(unsigned value) const +{ + if (value == 0 || value > m_fillStyleLst.size()) + return boost::optional(); + return m_fillStyleLst[value - 1]; +} + /* vim:set shiftwidth=2 softtabstop=2 expandtab: */ --- src/lib/VSDXTheme.h +++ src/lib/VSDXTheme.h @@ -80,6 +80,7 @@ public: ~VSDXTheme(); bool parse(librevenge::RVNGInputStream *input); boost::optional getThemeColour(unsigned value, unsigned variationIndex = 0) const; + boost::optional getFillStyleColour(unsigned value) const; private: VSDXTheme(const VSDXTheme &); @@ -89,18 +90,22 @@ private: boost::optional readSysClr(xmlTextReaderPtr reader); void readClrScheme(xmlTextReaderPtr reader); - void readThemeColour(xmlTextReaderPtr reader, int idToken, Colour &clr); + bool 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); bool readTypeFace(xmlTextReaderPtr reader, librevenge::RVNGString &typeFace); bool readTypeFace(xmlTextReaderPtr reader, int &script, librevenge::RVNGString &typeFace); + void readFmtScheme(xmlTextReaderPtr reader); + void readFillStyleLst(xmlTextReaderPtr reader); int getElementToken(xmlTextReaderPtr reader); + void skipUnimplemented(xmlTextReaderPtr reader, int idToken); VSDXClrScheme m_clrScheme; VSDXFontScheme m_fontScheme; + std::vector> m_fillStyleLst; }; } // namespace libvisio