external/libvisio/UnpackedTarball_libvisio.mk | 2 external/libvisio/solid-fill-style.patch | 198 ++++++++++ external/libvisio/tdf-77915-fix-import-of-default-shape-fill-color.patch | 13 3 files changed, 199 insertions(+), 14 deletions(-)
New commits: commit fb9ca6bba9bc3ce9feb9a066636dcd986dca096b Author: Jaume Pujantell <jaume.pujant...@collabora.com> AuthorDate: Mon Feb 19 09:22:47 2024 +0100 Commit: Andras Timar <andras.ti...@collabora.com> CommitDate: Mon Feb 19 11:23:32 2024 +0100 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 <jenkinscollaboraoff...@gmail.com> Reviewed-by: Andras Timar <andras.ti...@collabora.com> 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 ")); ++ 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 ", 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 ", 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 ")); ++ int ret = xmlTextReaderRead(reader); ++ int tokenId = getElementToken(reader); ++ if (XML_TOKEN_INVALID == tokenId) ++ { ++ VSD_DEBUG_MSG(("VSDXTheme::readFillStyleLst: unknown token %s ", 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 ", 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); - }