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

Fridrich Štrba fridrich.strba at bluewin.ch
Sun Dec 13 15:21:42 PST 2015


 src/lib/VSDContentCollector.cpp |   21 ++++++++++++++++++++
 src/lib/VSDContentCollector.h   |    1 
 src/lib/VSDLayerList.cpp        |   42 +++++++++++++++++++++++++++++++++++++---
 src/lib/VSDLayerList.h          |    4 +++
 src/lib/VSDParser.cpp           |    3 ++
 src/lib/VSDXMLParserBase.cpp    |    6 +++++
 src/lib/tokens.txt              |    2 +
 7 files changed, 76 insertions(+), 3 deletions(-)

New commits:
commit e7806e9b217fcd195b5f8297091fa83b40b8a95d
Author: Fridrich Štrba <fridrich.strba at bluewin.ch>
Date:   Mon Dec 14 00:21:17 2015 +0100

    Consider layer visibility and printability
    
    Change-Id: Ie47bd7d066673ddc322826d7f33f99eadfbe1e16

diff --git a/src/lib/VSDContentCollector.cpp b/src/lib/VSDContentCollector.cpp
index aee5456..e66984a 100644
--- a/src/lib/VSDContentCollector.cpp
+++ b/src/lib/VSDContentCollector.cpp
@@ -272,6 +272,7 @@ void libvisio::VSDContentCollector::_flushCurrentPath()
       m_shapeOutputDrawing->addStyle(fillPathProps);
       librevenge::RVNGPropertyList propList;
       propList.insert("svg:d", path);
+      _appendVisibleAndPrintable(propList);
       m_shapeOutputDrawing->addPath(propList);
     }
   }
@@ -355,6 +356,7 @@ void libvisio::VSDContentCollector::_flushCurrentPath()
       m_shapeOutputDrawing->addStyle(linePathProps);
       librevenge::RVNGPropertyList propList;
       propList.insert("svg:d", path);
+      _appendVisibleAndPrintable(propList);
       m_shapeOutputDrawing->addPath(propList);
     }
   }
@@ -439,6 +441,8 @@ void libvisio::VSDContentCollector::_flushText()
       m_paraFormats[iPara].charCount = numCharsInText;
   }
 
+  _appendVisibleAndPrintable(textBlockProps);
+
   m_shapeOutputText->addStartTextObject(textBlockProps);
 
   unsigned int charIndex = 0;
@@ -670,6 +674,8 @@ void libvisio::VSDContentCollector::_flushCurrentForeignData()
   if (angle != 0.0)
     m_currentForeignProps.insert("librevenge:rotate", angle * 180 / M_PI, librevenge::RVNG_GENERIC);
 
+  _appendVisibleAndPrintable(m_currentForeignProps);
+
   if (m_currentForeignData.size() && m_currentForeignProps["librevenge:mime-type"] && m_foreignWidth != 0.0 && m_foreignHeight != 0.0)
   {
     m_shapeOutputDrawing->addStyle(styleProps);
@@ -3019,4 +3025,19 @@ void libvisio::VSDContentCollector::collectLayer(unsigned id, unsigned level, co
   m_currentLayerList.addLayer(id, layer);
 }
 
+void libvisio::VSDContentCollector::_appendVisibleAndPrintable(librevenge::RVNGPropertyList &propList)
+{
+  bool visible = m_currentLayerList.getVisible(m_currentLayerMem);
+  bool printable = m_currentLayerList.getPrintable(m_currentLayerMem);
+
+  if (visible && printable)
+    return;
+  else if (!visible && !printable)
+    propList.insert("draw:display", "none");
+  else if (!visible && printable)
+    propList.insert("draw:display", "printer");
+  else if (visible && !printable)
+    propList.insert("draw:display", "screen");
+}
+
 /* vim:set shiftwidth=2 softtabstop=2 expandtab: */
diff --git a/src/lib/VSDContentCollector.h b/src/lib/VSDContentCollector.h
index 02304b2..4b920f8 100644
--- a/src/lib/VSDContentCollector.h
+++ b/src/lib/VSDContentCollector.h
@@ -215,6 +215,7 @@ private:
   void _outputCubicBezierSegment(const std::vector<std::pair<double, double> > &points);
   void _outputQuadraticBezierSegment(const std::vector<std::pair<double, double> > &points);
   void _outputLinearBezierSegment(const std::vector<std::pair<double, double> > &points);
+  void _appendVisibleAndPrintable(librevenge::RVNGPropertyList &propList);
 
   bool m_isPageStarted;
   double m_pageWidth;
diff --git a/src/lib/VSDLayerList.cpp b/src/lib/VSDLayerList.cpp
index 6ebbbd6..d858e4e 100644
--- a/src/lib/VSDLayerList.cpp
+++ b/src/lib/VSDLayerList.cpp
@@ -9,9 +9,10 @@
 
 #include "VSDLayerList.h"
 
-libvisio::VSDLayer::VSDLayer() : m_colour() {}
+libvisio::VSDLayer::VSDLayer() : m_colour(), m_visible(1), m_printable(1) {}
 
-libvisio::VSDLayer::VSDLayer(const VSDLayer &layer) : m_colour(layer.m_colour) {}
+libvisio::VSDLayer::VSDLayer(const VSDLayer &layer) :
+  m_colour(layer.m_colour), m_visible(layer.m_visible), m_printable(layer.m_printable) {}
 
 libvisio::VSDLayer::~VSDLayer() {}
 
@@ -20,6 +21,8 @@ libvisio::VSDLayer &libvisio::VSDLayer::operator=(const libvisio::VSDLayer &laye
   if (this != &layer)
   {
     m_colour = layer.m_colour;
+    m_visible = layer.m_visible;
+    m_printable = layer.m_printable;
   }
   return *this;
 }
@@ -71,7 +74,7 @@ const libvisio::Colour *libvisio::VSDLayerList::getColour(const std::vector<unsi
   {
     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_colour)
+    if (iterMap == m_elements.end() || !iterMap->second.m_colour)
       return 0;
     // This means we are reading the first layer and it overrides colour
     else if (iterColour == m_elements.end())
@@ -85,4 +88,37 @@ const libvisio::Colour *libvisio::VSDLayerList::getColour(const std::vector<unsi
   return iterColour->second.m_colour.get_ptr();
 }
 
+bool libvisio::VSDLayerList::getVisible(const std::vector<unsigned> &ids)
+{
+  if (ids.empty())
+    return true;
+
+  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);
+    if (iterMap == m_elements.end())
+      return true;
+    else if (iterMap->second.m_visible)
+      return true;
+  }
+  return false;
+}
+
+bool libvisio::VSDLayerList::getPrintable(const std::vector<unsigned> &ids)
+{
+  if (ids.empty())
+    return true;
+
+  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);
+    if (iterMap == m_elements.end())
+      return true;
+    else if (iterMap->second.m_printable)
+      return true;
+  }
+  return false;
+}
+
+
 /* vim:set shiftwidth=2 softtabstop=2 expandtab: */
diff --git a/src/lib/VSDLayerList.h b/src/lib/VSDLayerList.h
index c9cbb43..0d796db 100644
--- a/src/lib/VSDLayerList.h
+++ b/src/lib/VSDLayerList.h
@@ -26,6 +26,8 @@ struct VSDLayer
   VSDLayer &operator=(const VSDLayer &layer);
 
   boost::optional<Colour> m_colour;
+  bool m_visible;
+  bool m_printable;
 };
 
 class VSDLayerList
@@ -41,6 +43,8 @@ public:
   void addLayer(unsigned id, const VSDLayer &layer);
 
   const Colour *getColour(const std::vector<unsigned> &ids);
+  bool getVisible(const std::vector<unsigned> &ids);
+  bool getPrintable(const std::vector<unsigned> &ids);
 
 private:
   std::map<unsigned, VSDLayer> m_elements;
diff --git a/src/lib/VSDParser.cpp b/src/lib/VSDParser.cpp
index e3cd622..74e9bc0 100644
--- a/src/lib/VSDParser.cpp
+++ b/src/lib/VSDParser.cpp
@@ -974,6 +974,9 @@ void libvisio::VSDParser::readLayer(librevenge::RVNGInputStream *input)
     colour.a = readU8(input);
     layer.m_colour = colour;
   }
+  input->seek(1, librevenge::RVNG_SEEK_CUR);
+  layer.m_visible = !!readU8(input);
+  layer.m_printable = !!readU8(input);
 
   m_collector->collectLayer(m_header.id, m_header.level, layer);
 }
diff --git a/src/lib/VSDXMLParserBase.cpp b/src/lib/VSDXMLParserBase.cpp
index 9e20a7c..f2ca3b6 100644
--- a/src/lib/VSDXMLParserBase.cpp
+++ b/src/lib/VSDXMLParserBase.cpp
@@ -1373,6 +1373,12 @@ void libvisio::VSDXMLParserBase::readLayerIX(xmlTextReaderPtr reader)
           layer.m_colour = colour;
       }
       break;
+    case XML_VISIBLE:
+      ret = readBoolData(layer.m_visible, reader);
+      break;
+    case XML_PRINT:
+      ret = readBoolData(layer.m_printable, reader);
+      break;
     default:
       break;
     }
diff --git a/src/lib/tokens.txt b/src/lib/tokens.txt
index 7feb26d..0d62b4b 100644
--- a/src/lib/tokens.txt
+++ b/src/lib/tokens.txt
@@ -139,6 +139,7 @@ PinY
 PolylineTo
 Pos
 pp
+Print
 QuickStyleEffectsMatrix
 QuickStyleFillColor
 QuickStyleFillMatrix
@@ -194,6 +195,7 @@ TxtPinX
 TxtPinY
 TxtWidth
 VerticalAlign
+Visible
 vt:bkgnd
 vt:color
 vt:connectorFontStyles


More information about the Libreoffice-commits mailing list