diff options
-rw-r--r-- | src/lib/VSDSVGGenerator.cpp | 2 | ||||
-rw-r--r-- | src/lib/VSDXContentCollector.cpp | 73 |
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); } |