From 94ca28644eb6f42dbce8f7cc442132deedab6a1f Mon Sep 17 00:00:00 2001 From: Alessandro Ranellucci Date: Sat, 17 Aug 2013 12:24:04 +0200 Subject: [PATCH] Ported union() to XS --- lib/Slic3r/Geometry/Clipper.pm | 11 ----------- xs/src/ClipperUtils.cpp | 5 ++++- xs/src/ClipperUtils.hpp | 3 ++- xs/xsp/Clipper.xsp | 11 ++++++++++- 4 files changed, 16 insertions(+), 14 deletions(-) diff --git a/lib/Slic3r/Geometry/Clipper.pm b/lib/Slic3r/Geometry/Clipper.pm index f99587c0e..26e2e3436 100644 --- a/lib/Slic3r/Geometry/Clipper.pm +++ b/lib/Slic3r/Geometry/Clipper.pm @@ -25,17 +25,6 @@ sub safety_offset_ex { @{Math::Clipper::ex_int_offset(_convert($polygons), $factor // (scale 1e-05), 100000, JT_MITER, 2)}; } -sub union { - my ($polygons, $jointype, $safety_offset) = @_; - $jointype = PFT_NONZERO unless defined $jointype; - $clipper->clear; - $clipper->add_subject_polygons(_convert($safety_offset ? safety_offset($polygons) : $polygons)); - return [ - map Slic3r::Polygon->new(@$_), - @{ $clipper->execute(CT_UNION, $jointype, $jointype) }, - ]; -} - sub union_pt { my ($polygons, $jointype, $safety_offset) = @_; $jointype = PFT_NONZERO unless defined $jointype; diff --git a/xs/src/ClipperUtils.cpp b/xs/src/ClipperUtils.cpp index fa402ef3f..672d11202 100644 --- a/xs/src/ClipperUtils.cpp +++ b/xs/src/ClipperUtils.cpp @@ -271,11 +271,14 @@ void xor_ex(Slic3r::Polygons &subject, Slic3r::Polygons &clip, Slic3r::ExPolygon _clipper(ClipperLib::ctXor, subject, clip, retval, safety_offset); } -void union_ex(Slic3r::Polygons &subject, Slic3r::ExPolygons &retval, bool safety_offset) +template +void union_(Slic3r::Polygons &subject, T &retval, bool safety_offset) { Slic3r::Polygons p; _clipper(ClipperLib::ctUnion, subject, p, retval, safety_offset); } +template void union_(Slic3r::Polygons &subject, Slic3r::ExPolygons &retval, bool safety_offset); +template void union_(Slic3r::Polygons &subject, Slic3r::Polygons &retval, bool safety_offset); void simplify_polygons(Slic3r::Polygons &subject, Slic3r::Polygons &retval) { diff --git a/xs/src/ClipperUtils.hpp b/xs/src/ClipperUtils.hpp index 783e12a4d..cbf230137 100644 --- a/xs/src/ClipperUtils.hpp +++ b/xs/src/ClipperUtils.hpp @@ -60,7 +60,8 @@ void intersection(Slic3r::Polygons &subject, Slic3r::Polygons &clip, T &retval, void xor_ex(Slic3r::Polygons &subject, Slic3r::Polygons &clip, Slic3r::ExPolygons &retval, bool safety_offset = false); -void union_ex(Slic3r::Polygons &subject, Slic3r::ExPolygons &retval, bool safety_offset = false); +template +void union_(Slic3r::Polygons &subject, T &retval, bool safety_offset = false); void simplify_polygons(Slic3r::Polygons &subject, Slic3r::Polygons &retval); diff --git a/xs/xsp/Clipper.xsp b/xs/xsp/Clipper.xsp index 0c3c0cf41..b14b9ebfd 100644 --- a/xs/xsp/Clipper.xsp +++ b/xs/xsp/Clipper.xsp @@ -110,12 +110,21 @@ xor_ex(subject, clip, safety_offset = false) OUTPUT: RETVAL +Polygons +union(subject, safety_offset = false) + Polygons subject + bool safety_offset + CODE: + union_(subject, RETVAL, safety_offset); + OUTPUT: + RETVAL + ExPolygons union_ex(subject, safety_offset = false) Polygons subject bool safety_offset CODE: - union_ex(subject, RETVAL, safety_offset); + union_(subject, RETVAL, safety_offset); OUTPUT: RETVAL