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