diff options
Diffstat (limited to 'external/libvisio/solid-fill-style.patch')
-rw-r--r-- | external/libvisio/solid-fill-style.patch | 198 |
1 files changed, 198 insertions, 0 deletions
diff --git a/external/libvisio/solid-fill-style.patch b/external/libvisio/solid-fill-style.patch new file mode 100644 index 0000000000..53dc6a405e --- /dev/null +++ b/external/libvisio/solid-fill-style.patch @@ -0,0 +1,198 @@ +--- 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<boost::optional<libvisio::Colour>>(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::Colour> libvisio::VSDXTheme::getThemeColour(unsigned v + return boost::optional<libvisio::Colour>(); + } + ++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::Colour> libvisio::VSDXTheme::getFillStyleColour(unsigned value) const ++{ ++ if (value == 0 || value > m_fillStyleLst.size()) ++ return boost::optional<libvisio::Colour>(); ++ 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<Colour> getThemeColour(unsigned value, unsigned variationIndex = 0) const; ++ boost::optional<Colour> getFillStyleColour(unsigned value) const; + + private: + VSDXTheme(const VSDXTheme &); +@@ -89,18 +90,22 @@ private: + boost::optional<Colour> 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<boost::optional<Colour>> m_fillStyleLst; + }; + + } // namespace libvisio |