From bb4543752651d4af6d95eb87c0a2e26ce8d0a6e6 Mon Sep 17 00:00:00 2001 From: Alessandro Ranellucci Date: Sat, 31 Aug 2013 00:28:24 +0200 Subject: [PATCH] Return Surface->expolygon by reference --- xs/lib/Slic3r/XS.pm | 5 +++++ xs/t/05_surface.t | 10 ++++++++-- xs/xsp/Surface.xsp | 2 +- 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/xs/lib/Slic3r/XS.pm b/xs/lib/Slic3r/XS.pm index 97f73c360c..082bfb6f64 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 c9d28c43d5..dae46f9b03 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 d2a8e0f3fe..73bca3c3e0 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()