summaryrefslogtreecommitdiffstats
path: root/external/libvisio/solid-fill-style.patch
diff options
context:
space:
mode:
Diffstat (limited to 'external/libvisio/solid-fill-style.patch')
-rw-r--r--external/libvisio/solid-fill-style.patch198
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