summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/lib/VSDSVGGenerator.cpp2
-rw-r--r--src/lib/VSDXContentCollector.cpp73
2 files changed, 60 insertions, 15 deletions
diff --git a/src/lib/VSDSVGGenerator.cpp b/src/lib/VSDSVGGenerator.cpp
index b39779a..2a05060 100644
--- a/src/lib/VSDSVGGenerator.cpp
+++ b/src/lib/VSDSVGGenerator.cpp
@@ -451,7 +451,7 @@ void libvisio::VSDSVGGenerator::drawPath(const ::WPXPropertyListVector &path)
m_outputSink << (propList["libwpg:sweep"] ? propList["libwpg:sweep"]->getInt() : 1) << " ";
m_outputSink << doubleToString(72*(propList["svg:x"]->getDouble())) << "," << doubleToString(72*(propList["svg:y"]->getDouble()));
}
- else if ((i >= path.count()-1 && i > 2) && propList["libwpg:path-action"] && propList["libwpg:path-action"]->getStr() == "Z" )
+ else if (propList["libwpg:path-action"] && propList["libwpg:path-action"]->getStr() == "Z")
{
isClosed = true;
m_outputSink << "\nZ";
diff --git a/src/lib/VSDXContentCollector.cpp b/src/lib/VSDXContentCollector.cpp
index e59a257..cdb530f 100644
--- a/src/lib/VSDXContentCollector.cpp
+++ b/src/lib/VSDXContentCollector.cpp
@@ -676,7 +676,6 @@ double libvisio::VSDXContentCollector::_linePropertiesMarkerScale(unsigned marke
void libvisio::VSDXContentCollector::_flushCurrentPath()
{
- WPXPropertyListVector path;
WPXPropertyList fillPathProps(m_styleProps);
fillPathProps.insert("draw:stroke", "none");
WPXPropertyList linePathProps(m_styleProps);
@@ -695,6 +694,7 @@ void libvisio::VSDXContentCollector::_flushCurrentPath()
if (needsGroup)
m_shapeOutputDrawing->addStartLayer(WPXPropertyList());
+ std::vector<WPXPropertyList> tmpPath;
if (m_styleProps["draw:fill"] && m_styleProps["draw:fill"]->getStr() != "none")
{
bool firstPoint = true;
@@ -708,39 +708,84 @@ void libvisio::VSDXContentCollector::_flushCurrentPath()
}
else if (m_currentFillGeometry[i]["libwpg:path-action"]->getStr() == "M")
{
- if (path.count() && !wasMove)
+ if (!tmpPath.empty())
{
- WPXPropertyList closedPath;
- closedPath.insert("libwpg:path-action", "Z");
- path.append(closedPath);
+ if (!wasMove)
+ {
+ WPXPropertyList closedPath;
+ closedPath.insert("libwpg:path-action", "Z");
+ tmpPath.push_back(closedPath);
+ }
+ else
+ {
+ tmpPath.pop_back();
+ }
}
wasMove = true;
}
else
wasMove = false;
- path.append(m_currentFillGeometry[i]);
+ tmpPath.push_back(m_currentFillGeometry[i]);
}
- if (path.count() && !wasMove)
+ if (!tmpPath.empty())
{
- WPXPropertyList closedPath;
- closedPath.insert("libwpg:path-action", "Z");
- path.append(closedPath);
+ if (!wasMove)
+ {
+ WPXPropertyList closedPath;
+ closedPath.insert("libwpg:path-action", "Z");
+ tmpPath.push_back(closedPath);
+ }
+ else
+ tmpPath.pop_back();
}
- if (path.count())
+ if (!tmpPath.empty())
{
+ WPXPropertyListVector path;
+ for (unsigned i = 0; i < tmpPath.size(); ++i)
+ path.append(tmpPath[i]);
m_shapeOutputDrawing->addStyle(fillPathProps, WPXPropertyListVector());
m_shapeOutputDrawing->addPath(path);
}
}
m_currentFillGeometry.clear();
- path = WPXPropertyListVector();
+ tmpPath.clear();
if (m_styleProps["draw:stroke"] && m_styleProps["draw:stroke"]->getStr() != "none")
{
+ bool firstPoint = true;
+ bool wasMove = false;
for (unsigned i = 0; i < m_currentLineGeometry.size(); i++)
- path.append(m_currentLineGeometry[i]);
- if (path.count())
{
+ if (firstPoint)
+ {
+ firstPoint = false;
+ wasMove = true;
+ }
+ else if (m_currentLineGeometry[i]["libwpg:path-action"]->getStr() == "M")
+ {
+ if (!tmpPath.empty())
+ {
+ if (wasMove)
+ {
+ tmpPath.pop_back();
+ }
+ }
+ wasMove = true;
+ }
+ else
+ wasMove = false;
+ tmpPath.push_back(m_currentLineGeometry[i]);
+ }
+ if (!tmpPath.empty())
+ {
+ if (wasMove)
+ tmpPath.pop_back();
+ }
+ if (!tmpPath.empty())
+ {
+ WPXPropertyListVector path;
+ for (unsigned i = 0; i < tmpPath.size(); ++i)
+ path.append(tmpPath[i]);
m_shapeOutputDrawing->addStyle(linePathProps, WPXPropertyListVector());
m_shapeOutputDrawing->addPath(path);
}