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.st...@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
_______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits