summaryrefslogtreecommitdiff
path: root/external
diff options
context:
space:
mode:
authorJaume Pujantell <jaume.pujantell@collabora.com>2024-02-19 09:22:47 +0100
committerMichael Stahl <michael.stahl@allotropia.de>2024-02-23 12:08:29 +0100
commitccda2c60affd2c10f4a23046e3a9332265b357af (patch)
treeb8c17b0cd8b1f19bf5be2757446987197d3dce8e /external
parent74a12bcb96d8e602006be933d29ccc3c7238740d (diff)
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 fb9ca6bba9bc3ce9feb9a066636dcd986dca096b) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/163544 Tested-by: Jenkins (cherry picked from commit 043e090069b3bd4c660743f6f639d002f403a7b8) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/163546 Reviewed-by: Michael Stahl <michael.stahl@allotropia.de>
Diffstat (limited to 'external')
-rw-r--r--external/libvisio/UnpackedTarball_libvisio.mk2
-rw-r--r--external/libvisio/solid-fill-style.patch198
-rw-r--r--external/libvisio/tdf-77915-fix-import-of-default-shape-fill-color.patch13
3 files changed, 199 insertions, 14 deletions
diff --git a/external/libvisio/UnpackedTarball_libvisio.mk b/external/libvisio/UnpackedTarball_libvisio.mk
index 85e356db8837..b5f530fb2763 100644
--- a/external/libvisio/UnpackedTarball_libvisio.mk
+++ b/external/libvisio/UnpackedTarball_libvisio.mk
@@ -17,7 +17,7 @@ $(eval $(call gb_UnpackedTarball_update_autoconf_configs,libvisio))
$(eval $(call gb_UnpackedTarball_add_patches,libvisio, \
external/libvisio/ubsan.patch \
- external/libvisio/tdf-77915-fix-import-of-default-shape-fill-color.patch \
+ external/libvisio/solid-fill-style.patch \
))
# vim: set noet sw=4 ts=4:
diff --git a/external/libvisio/solid-fill-style.patch b/external/libvisio/solid-fill-style.patch
new file mode 100644
index 000000000000..53dc6a405e71
--- /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
diff --git a/external/libvisio/tdf-77915-fix-import-of-default-shape-fill-color.patch b/external/libvisio/tdf-77915-fix-import-of-default-shape-fill-color.patch
deleted file mode 100644
index 68c0c2c88b10..000000000000
--- a/external/libvisio/tdf-77915-fix-import-of-default-shape-fill-color.patch
+++ /dev/null
@@ -1,13 +0,0 @@
---- src/lib/VSDStyles.h
-+++ src/lib/VSDStyles.h
-@@ -129,7 +129,9 @@ struct VSDOptionalFillStyle
- ASSIGN_OPTIONAL(style.qsFillColour, qsFillColour);
- ASSIGN_OPTIONAL(style.qsShadowColour, qsShadowColour);
- ASSIGN_OPTIONAL(style.qsFillMatrix, qsFillMatrix);
-- ASSIGN_OPTIONAL(style.fgColour, fgColour);
-+ // Colour 'Blue, Variant 1' is special. It is the default,
-+ // and it is not saved explicitely in the VSDX file.
-+ ASSIGN_OPTIONAL(style.fgColour, fgColour);else fgColour = Colour(0x5b, 0x9b, 0xd5, 0);
- ASSIGN_OPTIONAL(style.bgColour, bgColour);
- ASSIGN_OPTIONAL(style.shadowFgColour, shadowFgColour);
- }