Blob Blame History Raw
--- src/geomgeos.cc.clipper	2013-03-04 16:38:26.385181723 +0100
+++ src/geomgeos.cc	2013-03-04 17:11:36.433503798 +0100
@@ -80,21 +80,37 @@
 	return p;
 }
 
-PolygonHole from_clipper(const ClipperLib::ExPolygon& cp, const Point& offs)
+void from_clipper(MultiPolygonHole& ph, const ClipperLib::PolyNode& cp, const Point& offs)
 {
-	PolygonHole p;
-	p.set_exterior(from_clipper(cp.outer, offs));
-	for (ClipperLib::Polygons::const_iterator i(cp.holes.begin()), e(cp.holes.end()); i != e; ++i)
-		p.add_interior(from_clipper(*i, offs));
+	if (!cp.Contour.size())
+		return;
+	if (cp.IsHole())
+		throw std::runtime_error("from_clipper: outer polygon is a hole!");
+	ph.push_back(PolygonHole());
+	PolygonHole& p(ph.back());
+	p.set_exterior(from_clipper(cp.Contour, offs));
+	for (std::vector<ClipperLib::PolyNode *>::const_iterator chi(cp.Childs.begin()), che(cp.Childs.end()); chi != che; ++chi) {
+		const ClipperLib::PolyNode& cpc(**chi);
+		if (!cpc.IsHole())
+			throw std::runtime_error("from_clipper: outer polygon is a child of an outer polygon");
+		p.add_interior(from_clipper(cpc.Contour, offs));
+		for (std::vector<ClipperLib::PolyNode *>::const_iterator cchi(cpc.Childs.begin()), cche(cpc.Childs.end()); cchi != cche; ++cchi) {
+			const ClipperLib::PolyNode& cpcc(**cchi);
+			from_clipper(ph, cpcc, offs);
+		}
+	}
 	p.normalize();
-	return p;
 }
 
-MultiPolygonHole from_clipper(const ClipperLib::ExPolygons& cp, const Point& offs)
+MultiPolygonHole from_clipper(const ClipperLib::PolyTree& cp, const Point& offs)
 {
 	MultiPolygonHole p;
-	for (ClipperLib::ExPolygons::const_iterator i(cp.begin()), e(cp.end()); i != e; ++i)
-		p.push_back(from_clipper(*i, offs));
+	if (cp.Contour.size())
+		throw std::runtime_error("from_clipper: PolyTree has a contour!");
+	for (std::vector<ClipperLib::PolyNode *>::const_iterator chi(cp.Childs.begin()), che(cp.Childs.end()); chi != che; ++chi) {
+		const ClipperLib::PolyNode& cpc(**chi);
+		from_clipper(p, cpc, offs);
+	}
 	return p;
 }
 
@@ -113,7 +129,7 @@
 	offs.set_invalid();
 	ClipperLib::Clipper c;
 	c.AddPolygon(to_clipper(*this, offs), ClipperLib::ptSubject);
-	ClipperLib::ExPolygons sol;
+	ClipperLib::PolyTree sol;
 	c.Execute(ClipperLib::ctUnion, sol, ClipperLib::pftNonZero, ClipperLib::pftNonZero); 
 	return from_clipper(sol, offs);
 }
@@ -151,7 +167,7 @@
 		to_clipper(cp, mp, offs);
 		c.AddPolygons(cp, ClipperLib::ptSubject);
 	}
-	ClipperLib::ExPolygons sol;
+	ClipperLib::PolyTree sol;
 	c.Execute(ClipperLib::ctUnion, sol, ClipperLib::pftNonZero, ClipperLib::pftNonZero);
 	MultiPolygonHole mp(from_clipper(sol, offs));
 	swap(mp);
@@ -176,7 +192,7 @@
 		to_clipper(cp, mp, offs);
 		c.AddPolygons(cp, ClipperLib::ptClip);
 	}
-	ClipperLib::ExPolygons sol;
+	ClipperLib::PolyTree sol;
 	c.Execute(ClipperLib::ctDifference, sol, ClipperLib::pftNonZero, ClipperLib::pftNonZero); 
 	MultiPolygonHole mp(from_clipper(sol, offs));
 	swap(mp);
@@ -201,7 +217,7 @@
 		to_clipper(cp, mp, offs);
 		c.AddPolygons(cp, ClipperLib::ptClip);
 	}
-	ClipperLib::ExPolygons sol;
+	ClipperLib::PolyTree sol;
 	c.Execute(ClipperLib::ctIntersection, sol, ClipperLib::pftNonZero, ClipperLib::pftNonZero); 
 	MultiPolygonHole mp(from_clipper(sol, offs));
 	swap(mp);