summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/lib/VSDContentCollector.cpp21
-rw-r--r--src/lib/VSDContentCollector.h1
-rw-r--r--src/lib/VSDLayerList.cpp42
-rw-r--r--src/lib/VSDLayerList.h4
-rw-r--r--src/lib/VSDParser.cpp3
-rw-r--r--src/lib/VSDXMLParserBase.cpp6
-rw-r--r--src/lib/tokens.txt2
7 files changed, 76 insertions, 3 deletions
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