diff --git a/xs/lib/Slic3r/XS.pm b/xs/lib/Slic3r/XS.pm index 97f73c360..082bfb6f6 100644 --- a/xs/lib/Slic3r/XS.pm +++ b/xs/lib/Slic3r/XS.pm @@ -22,6 +22,11 @@ use overload '@{}' => sub { $_[0]->arrayref }, 'fallback' => 1; +package Slic3r::ExPolygon::Ref; +our @ISA = 'Slic3r::ExPolygon'; + +sub DESTROY {} + package Slic3r::Polyline; use overload '@{}' => sub { $_[0]->arrayref }, diff --git a/xs/t/05_surface.t b/xs/t/05_surface.t index c9d28c43d..dae46f9b0 100644 --- a/xs/t/05_surface.t +++ b/xs/t/05_surface.t @@ -4,7 +4,7 @@ use strict; use warnings; use Slic3r::XS; -use Test::More tests => 12; +use Test::More tests => 13; my $square = [ # ccw [100, 100], @@ -27,7 +27,7 @@ my $surface = Slic3r::Surface->new( $surface = $surface->clone; -isa_ok $surface->expolygon, 'Slic3r::ExPolygon', 'expolygon'; +isa_ok $surface->expolygon, 'Slic3r::ExPolygon::Ref', 'expolygon'; is_deeply [ @{$surface->expolygon->pp} ], [$square, $hole_in_square], 'expolygon roundtrip'; is scalar(@{$surface->polygons}), 2, 'polygons roundtrip'; @@ -41,6 +41,12 @@ is $surface->bridge_angle, 30, 'bridge_angle'; $surface->extra_perimeters(2); is $surface->extra_perimeters, 2, 'extra_perimeters'; +{ + my $surface2 = $surface->clone; + $surface2->expolygon->scale(2); + isnt $surface2->expolygon->area, $expolygon->area, 'expolygon is returned by reference'; +} + { my $collection = Slic3r::Surface::Collection->new($surface, $surface->clone); is scalar(@$collection), 2, 'collection has the right number of items'; diff --git a/xs/xsp/Surface.xsp b/xs/xsp/Surface.xsp index d2a8e0f3f..73bca3c3e 100644 --- a/xs/xsp/Surface.xsp +++ b/xs/xsp/Surface.xsp @@ -8,7 +8,7 @@ %name{Slic3r::Surface} class Surface { ~Surface(); ExPolygon* expolygon() - %code{% const char* CLASS = "Slic3r::ExPolygon"; RETVAL = new ExPolygon(THIS->expolygon); %}; + %code{% const char* CLASS = "Slic3r::ExPolygon::Ref"; RETVAL = &(THIS->expolygon); %}; double thickness() %code{% RETVAL = THIS->thickness; %}; unsigned short thickness_layers()