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 ccda2c60affd2c10f4a23046e3a9332265b357af
Author:     Jaume Pujantell <jaume.pujant...@collabora.com>
AuthorDate: Mon Feb 19 09:22:47 2024 +0100
Commit:     Michael Stahl <michael.st...@allotropia.de>
CommitDate: Fri Feb 23 12:08:29 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>
    (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.st...@allotropia.de>

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);
-   }

Reply via email to