office-gobmx/external/libvisio/solid-fill-style.patch
Jaume Pujantell 043e090069 libvisio: read and use simple solid fill styles
Implemented the reading of simple solid fills from the fill styles list
in a vsdx theme. And it's use with the quick style fill matrix value.

This patch includes an alternative fix to tdf#77915 so the previous patch
is no longer needed.

Change-Id: Iccfe915c90bcb1280cfcbfa4920d2989d18518ee
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/163581
Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoffice@gmail.com>
Reviewed-by: Andras Timar <andras.timar@collabora.com>
(cherry picked from commit fb9ca6bba9)
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/163544
Tested-by: Jenkins
2024-02-19 13:17:03 +01:00

198 lines
6.9 KiB
Diff

--- 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