Port offset_ex() and offset2_ex() to XS

This commit is contained in:
Alessandro Ranellucci 2013-07-16 20:09:53 +02:00
parent 9458c7db97
commit 898007fc36
20 changed files with 4349 additions and 52 deletions

77
xs/xsp/Clipper.xsp Normal file
View file

@ -0,0 +1,77 @@
%module{Slic3r::XS};
%{
#include <myinit.h>
#include "clipper.hpp"
#include "ClipperUtils.hpp"
%}
%package{Slic3r::Geometry::Clipper};
%{
ExPolygons
offset_ex(polygons, delta, scale = 100000, joinType = ClipperLib::jtMiter, miterLimit = 3)
Polygons polygons
const float delta
double scale
ClipperLib::JoinType joinType
double miterLimit
CODE:
// read input
ClipperLib::Polygons* input = new ClipperLib::Polygons();
Slic3rPolygons_to_ClipperPolygons(polygons, *input);
// scale input
scaleClipperPolygons(*input, scale);
// perform offset
ClipperLib::Polygons* output = new ClipperLib::Polygons();
ClipperLib::OffsetPolygons(*input, *output, (delta*scale), joinType, miterLimit);
delete input;
// unscale output
scaleClipperPolygons(*output, 1/scale);
// convert into ExPolygons
ClipperPolygons_to_Slic3rExPolygons(*output, RETVAL);
delete output;
OUTPUT:
RETVAL
ExPolygons
offset2_ex(polygons, delta1, delta2, scale = 100000, joinType = ClipperLib::jtMiter, miterLimit = 3)
Polygons polygons
const float delta1
const float delta2
double scale
ClipperLib::JoinType joinType
double miterLimit
CODE:
// read input
ClipperLib::Polygons* input = new ClipperLib::Polygons();
Slic3rPolygons_to_ClipperPolygons(polygons, *input);
// scale input
scaleClipperPolygons(*input, scale);
// perform first offset
ClipperLib::Polygons* output1 = new ClipperLib::Polygons();
ClipperLib::OffsetPolygons(*input, *output1, (delta1*scale), joinType, miterLimit);
delete input;
// perform second offset
ClipperLib::Polygons* output2 = new ClipperLib::Polygons();
ClipperLib::OffsetPolygons(*output1, *output2, (delta2*scale), joinType, miterLimit);
delete output1;
// unscale output
scaleClipperPolygons(*output2, 1/scale);
// convert into ExPolygons
ClipperPolygons_to_Slic3rExPolygons(*output2, RETVAL);
delete output2;
OUTPUT:
RETVAL
%}

View file

@ -31,7 +31,6 @@ Line::new(...)
RETVAL->b.from_SV_check( ST(2) );
OUTPUT:
RETVAL
}
void
Line::rotate(angle, center_sv)

View file

@ -13,18 +13,37 @@ SurfaceCollection* O_OBJECT
ExtrusionRole T_UV
SurfaceType T_UV
ClipperLib::JoinType T_UV
Lines T_LINES
Lines T_ARRAYREF
Polygons T_ARRAYREF
ExPolygons T_ARRAYREF
INPUT
T_ARRAYREF
if (SvROK($arg) && SvTYPE(SvRV($arg)) == SVt_PVAV) {
AV* av = (AV*)SvRV($arg);
const unsigned int len = av_len(av)+1;
$type* tmp = new $type(len);
for (unsigned int i = 0; i < len; i++) {
SV** elem = av_fetch(av, i, 0);
(*tmp)[i].from_SV_check(*elem);
}
$var = *tmp;
delete tmp;
} else
Perl_croak(aTHX_ \"%s: %s is not an array reference\",
${$ALIAS?\q[GvNAME(CvGV(cv))]:\qq[\"$pname\"]},
\"$var\");
OUTPUT
T_LINES
T_ARRAYREF
AV* av = newAV();
$arg = newRV_noinc((SV*)av);
const unsigned int len = $var.size();
av_extend(av, len-1);
for (unsigned int i = 0; i < len; i++) {
av_store(av, i, ${var}[i].to_SV_ref());
av_store(av, i, ${var}[i].to_SV_ref());
}

View file

@ -9,6 +9,8 @@
%typemap{ExtrusionPath*};
%typemap{ExtrusionLoop*};
%typemap{Lines};
%typemap{Polygons};
%typemap{ExPolygons};
%typemap{SurfaceType}{parsed}{
%cpp_type{SurfaceType};