[Libreoffice-commits] libvisio.git: src/lib

Fridrich Štrba fridrich.strba at bluewin.ch
Fri Dec 11 10:54:47 PST 2015


 src/lib/VSDContentCollector.cpp |   12 ++++++++++--
 src/lib/VSDLayerList.cpp        |   25 +++++++++++++++++++++++++
 src/lib/VSDLayerList.h          |    1 +
 3 files changed, 36 insertions(+), 2 deletions(-)

New commits:
commit 69ae3cb64d39575cb1875acc705763e3dabfb99a
Author: Fridrich Štrba <fridrich.strba at bluewin.ch>
Date:   Fri Dec 11 19:54:24 2015 +0100

    Account for layer membership for stroke colour and for text colour
    
    Change-Id: I137c039f548b42003f2b0de94d6efd09d8f1a212

diff --git a/src/lib/VSDContentCollector.cpp b/src/lib/VSDContentCollector.cpp
index 48d483f..aee5456 100644
--- a/src/lib/VSDContentCollector.cpp
+++ b/src/lib/VSDContentCollector.cpp
@@ -517,7 +517,11 @@ void libvisio::VSDContentCollector::_flushText()
       if (m_charFormats[charIndex].superscript) textProps.insert("style:text-position", "super");
       if (m_charFormats[charIndex].subscript) textProps.insert("style:text-position", "sub");
       textProps.insert("fo:font-size", m_charFormats[charIndex].size*72.0, librevenge::RVNG_POINT);
-      textProps.insert("fo:color", getColourString(m_charFormats[charIndex].colour));
+      Colour colour = m_charFormats[charIndex].colour;
+      const Colour *pColour = m_currentLayerList.getColour(m_currentLayerMem);
+      if (pColour)
+        colour = *pColour;
+      textProps.insert("fo:color", getColourString(colour));
       double opacity = 1.0;
       if (m_charFormats[charIndex].colour.a)
         opacity -= (double)(m_charFormats[charIndex].colour.a)/255.0;
@@ -2237,7 +2241,11 @@ void libvisio::VSDContentCollector::_lineProperties(const VSDLineStyle &style, l
   }
 
   styleProps.insert("svg:stroke-width", m_scale*style.width);
-  styleProps.insert("svg:stroke-color", getColourString(style.colour));
+  libvisio::Colour colour = style.colour;
+  const Colour *pColour = m_currentLayerList.getColour(m_currentLayerMem);
+  if (pColour)
+    colour = *pColour;
+  styleProps.insert("svg:stroke-color", getColourString(colour));
   if (style.colour.a)
     styleProps.insert("svg:stroke-opacity", (1 - style.colour.a/255.0), librevenge::RVNG_PERCENT);
   else
diff --git a/src/lib/VSDLayerList.cpp b/src/lib/VSDLayerList.cpp
index 73fd233..ca638d4 100644
--- a/src/lib/VSDLayerList.cpp
+++ b/src/lib/VSDLayerList.cpp
@@ -86,4 +86,29 @@ unsigned libvisio::VSDLayerList::getColourId(const std::vector<unsigned> &ids)
   return colourId;
 }
 
+const libvisio::Colour *libvisio::VSDLayerList::getColour(const std::vector<unsigned> &ids)
+{
+  unsigned colourId = MINUS_ONE;
+  std::map<unsigned, libvisio::VSDLayer>::const_iterator iterColour = m_elements.end();
+  for (std::vector<unsigned>::const_iterator iter = ids.begin(); iter != ids.end(); ++iter)
+  {
+    std::map<unsigned, libvisio::VSDLayer>::const_iterator iterMap = m_elements.find(*iter);
+    // It is enough that one layer does not override colour and the original colour is used
+    if (iterMap->second.m_colourId == MINUS_ONE)
+      return 0;
+    // This means we are reading the first layer and it overrides colour
+    else if (iterColour == m_elements.end())
+    {
+      colourId = iterMap->second.m_colourId;
+      iterColour = iterMap;
+    }
+    // If two layers override colour to two different values, the original colour is used
+    else if (colourId != iterMap->second.m_colourId)
+      return 0;
+  }
+  if (iterColour == m_elements.end())
+    return 0;
+  return &(iterColour->second.m_colour);
+}
+
 /* vim:set shiftwidth=2 softtabstop=2 expandtab: */
diff --git a/src/lib/VSDLayerList.h b/src/lib/VSDLayerList.h
index 7267c2a..aa45e14 100644
--- a/src/lib/VSDLayerList.h
+++ b/src/lib/VSDLayerList.h
@@ -41,6 +41,7 @@ public:
   void addLayer(unsigned id, const VSDLayer &layer);
 
   unsigned getColourId(const std::vector<unsigned> &ids);
+  const Colour *getColour(const std::vector<unsigned> &ids);
 
 private:
   std::map<unsigned, VSDLayer> m_elements;


More information about the Libreoffice-commits mailing list