043e090069
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
198 lines
6.9 KiB
Diff
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
|