From b254292b62afee3a0e15111310ffce9792fde9dc Mon Sep 17 00:00:00 2001 From: Tony Cook Date: Tue, 29 Nov 2005 09:27:16 +0000 Subject: [PATCH] - the straight edges of filled arcs weren't being drawn correctly, causing minor artifacts at the inner and external corners --- Changes | 2 ++ draw.c | 10 +++++----- t/t21draw.t | 43 +++++++++++++++++++++++++++++++++++++++---- 3 files changed, 46 insertions(+), 9 deletions(-) diff --git a/Changes b/Changes index d0c1d8f4..736f8332 100644 --- a/Changes +++ b/Changes @@ -1191,6 +1191,8 @@ Revision history for Perl extension Imager. - add --nolog command-line switch to Makefile.PL to disable logging - filled polygons using a complex fill with combine != 0 (none) didn't correctly handle polygons that crossed a given scanline more than once. +- the straight edges of filled arcs weren't being drawn correctly, + causing minor artifacts at the inner and external corners ================================================================= diff --git a/draw.c b/draw.c index c52d5a0b..d7426e24 100644 --- a/draw.c +++ b/draw.c @@ -112,14 +112,14 @@ i_arcdraw(int x1, int y1, int x2, int y2, i_mmarray *ar) { double dsec; int temp; alpha=(double)(y2-y1)/(double)(x2-x1); - if (fabs(alpha)<1) + if (fabs(alpha) <= 1) { if (x2 38; +use Test::More tests => 43; my $loaded; BEGIN { use_ok(Imager=>':all'); } @@ -21,7 +21,7 @@ my $blueobj = NC(0, 0, 255); my $blue = { hue=>240, saturation=>1, value=>1 }; my $white = '#FFFFFF'; -my $img = Imager->new(xsize=>100, ysize=>300); +my $img = Imager->new(xsize=>100, ysize=>500); ok($img->box(color=>$blueobj, xmin=>10, ymin=>10, xmax=>48, ymax=>18), "box with color obj"); @@ -102,20 +102,40 @@ ok($img->arc(x=>75, 'y'=>125, r=>20, d1=>315, d2=>45, "fill arc through angle 0"); ok($img->arc(x=>25, 'y'=>175, r=>20, d1=>315, d2=>225, color=>$redobj), "concave color arc"); +angle_marker($img, 25, 175, 23, 315, 225); ok($img->arc(x=>75, 'y'=>175, r=>20, d1=>315, d2=>225, fill => { solid=>$greenobj, combine=>'diff' }), "concave fill arc"); +angle_marker($img, 75, 175, 23, 315, 225); ok($img->arc(x=>25, y=>225, r=>20, d1=>135, d2=>45, color=>$redobj), "another concave color arc"); +angle_marker($img, 25, 225, 23, 45, 135); ok($img->arc(x=>75, y=>225, r=>20, d1=>135, d2=>45, - fille => { solid=>$blueobj, combine=>'diff' }), + fill => { solid=>$blueobj, combine=>'diff' }), "another concave fillarc"); +angle_marker($img, 75, 225, 23, 45, 135); ok($img->arc(x=>25, y=>275, r=>20, d1=>135, d2=>45, color=>$redobj, aa=>1), "concave color arc aa"); ok($img->arc(x=>75, y=>275, r=>20, d1=>135, d2=>45, - fille => { solid=>$blueobj, combine=>'diff' }, aa=>1), + fill => { solid=>$blueobj, combine=>'diff' }, aa=>1), "concave fill arc aa"); +ok($img->circle(x=>25, y=>325, r=>20, color=>$redobj), + "color circle no aa"); +ok($img->circle(x=>75, y=>325, r=>20, color=>$redobj, aa=>1), + "color circle aa"); +ok($img->circle(x=>25, 'y'=>375, r=>20, + fill => { hatch=>'stipple', fg=>$blueobj, bg=>$redobj }), + "fill circle no aa"); +ok($img->circle(x=>75, 'y'=>375, r=>20, aa=>1, + fill => { hatch=>'stipple', fg=>$blueobj, bg=>$redobj }), + "fill circle aa"); + +ok($img->arc(x=>50, y=>450, r=>45, d1=>135, d2=>45, + fill => { solid=>$blueobj, combine=>'diff' }), + "another concave fillarc"); +angle_marker($img, 50, 450, 47, 45, 135); + ok($img->write(file=>'testout/t21draw.ppm'), "saving output"); @@ -130,3 +150,18 @@ sub color_cmp { || $l[1] <=> $r[1] || $l[2] <=> $r[2]; } + +use constant PI => 4 * atan2(1,1); + +sub angle_marker { + my ($img, $x, $y, $radius, @angles) = @_; + + for my $angle (@angles) { + my $x1 = int($x + $radius * cos($angle * PI / 180) + 0.5); + my $y1 = int($y + $radius * sin($angle * PI / 180) + 0.5); + my $x2 = int($x + (5+$radius) * cos($angle * PI / 180) + 0.5); + my $y2 = int($y + (5+$radius) * sin($angle * PI / 180) + 0.5); + + $img->line(x1=>$x1, y1=>$y1, x2=>$x2, y2=>$y2, color=>'#FFF'); + } +} -- 2.30.2