- the straight edges of filled arcs weren't being drawn correctly,
[imager.git] / t / t21draw.t
CommitLineData
a8652edf 1#!perl -w
3a9a4241
TC
2# Before `make install' is performed this script should be runnable with
3# `make test'. After `make install' it should work as `perl test.pl'
4
5######################### We start with some black magic to print on failure.
6
7# Change 1..1 below to 1..last_test_to_print .
8# (It may become useful if the test is moved to ./t subdirectory.)
9use strict;
b254292b 10use Test::More tests => 43;
3a9a4241
TC
11my $loaded;
12
a8652edf 13BEGIN { use_ok(Imager=>':all'); }
3a9a4241
TC
14init_log("testout/t21draw.log",1);
15
16my $redobj = NC(255, 0, 0);
17my $red = 'FF0000';
18my $greenobj = NC(0, 255, 0);
19my $green = [ 0, 255, 0 ];
20my $blueobj = NC(0, 0, 255);
21my $blue = { hue=>240, saturation=>1, value=>1 };
22my $white = '#FFFFFF';
23
b254292b 24my $img = Imager->new(xsize=>100, ysize=>500);
3a9a4241
TC
25
26ok($img->box(color=>$blueobj, xmin=>10, ymin=>10, xmax=>48, ymax=>18),
27 "box with color obj");
28ok($img->box(color=>$blue, xmin=>10, ymin=>20, xmax=>48, ymax=>28),
29 "box with color");
30ok($img->box(color=>$redobj, xmin=>10, ymin=>30, xmax=>28, ymax=>48, filled=>1),
31 "filled box with color obj");
32ok($img->box(color=>$red, xmin=>30, ymin=>30, xmax=>48, ymax=>48, filled=>1),
33 "filled box with color");
34
a9fa203f 35ok($img->arc('x'=>75, 'y'=>25, r=>24, color=>$redobj),
3a9a4241
TC
36 "filled arc with colorobj");
37
a9fa203f 38ok($img->arc('x'=>75, 'y'=>25, r=>20, color=>$green),
3a9a4241 39 "filled arc with colorobj");
a9fa203f 40ok($img->arc('x'=>75, 'y'=>25, r=>18, color=>$white, d1=>325, d2=>225),
3a9a4241
TC
41 "filled arc with color");
42
a9fa203f 43ok($img->arc('x'=>75, 'y'=>25, r=>18, color=>$blue, d1=>225, d2=>325),
3a9a4241 44 "filled arc with color");
a9fa203f 45ok($img->arc('x'=>75, 'y'=>25, r=>15, color=>$green, aa=>1),
3a9a4241
TC
46 "filled arc with color");
47
48ok($img->line(color=>$blueobj, x1=>5, y1=>55, x2=>35, y2=>95),
49 "line with colorobj");
50
51# FIXME - neither the start nor end-point is set for a non-aa line
a8652edf
TC
52my $c = Imager::i_get_pixel($img->{IMG}, 5, 55);
53ok(color_cmp($c, $blueobj) == 0, "# TODO start point not set");
3a9a4241
TC
54
55ok($img->line(color=>$red, x1=>10, y1=>55, x2=>40, y2=>95, aa=>1),
56 "aa line with color");
57ok($img->line(color=>$green, x1=>15, y1=>55, x2=>45, y2=>95, antialias=>1),
58 "antialias line with color");
59
60ok($img->polyline(points=>[ [ 55, 55 ], [ 90, 60 ], [ 95, 95] ],
61 color=>$redobj),
62 "polyline points with color obj");
a9fa203f 63ok($img->polyline('x'=>[ 55, 85, 90 ], 'y'=>[60, 65, 95], color=>$green, aa=>1),
3a9a4241 64 "polyline xy with color aa");
a9fa203f 65ok($img->polyline('x'=>[ 55, 80, 85 ], 'y'=>[65, 70, 95], color=>$green,
3a9a4241
TC
66 antialias=>1),
67 "polyline xy with color antialias");
68
a9fa203f 69ok($img->setpixel('x'=>[35, 37, 39], 'y'=>[55, 57, 59], color=>$red),
591b5954 70 "set array of pixels");
a9fa203f 71ok($img->setpixel('x'=>39, 'y'=>55, color=>$green),
591b5954
TC
72 "set single pixel");
73use Imager::Color::Float;
74my $flred = Imager::Color::Float->new(1, 0, 0, 0);
75my $flgreen = Imager::Color::Float->new(0, 1, 0, 0);
a9fa203f 76ok($img->setpixel('x'=>[41, 43, 45], 'y'=>[55, 57, 59], color=>$flred),
591b5954 77 "set array of float pixels");
a9fa203f 78ok($img->setpixel('x'=>45, 'y'=>55, color=>$flgreen),
591b5954 79 "set single float pixel");
a9fa203f 80my @gp = $img->getpixel('x'=>[41, 43, 45], 'y'=>[55, 57, 59]);
591b5954
TC
81ok(grep($_->isa('Imager::Color'), @gp) == 3, "check getpixel result type");
82ok(grep(color_cmp($_, NC(255, 0, 0)) == 0, @gp) == 3,
83 "check getpixel result colors");
a9fa203f 84my $gp = $img->getpixel('x'=>45, 'y'=>55);
591b5954
TC
85ok($gp->isa('Imager::Color'), "check scalar getpixel type");
86ok(color_cmp($gp, NC(0, 255, 0)) == 0, "check scalar getpixel color");
a9fa203f 87@gp = $img->getpixel('x'=>[35, 37, 39], 'y'=>[55, 57, 59], type=>'float');
591b5954
TC
88ok(grep($_->isa('Imager::Color::Float'), @gp) == 3,
89 "check getpixel float result type");
90ok(grep(color_cmp($_, $flred) == 0, @gp) == 3,
91 "check getpixel float result type");
a9fa203f 92$gp = $img->getpixel('x'=>39, 'y'=>55, type=>'float');
591b5954
TC
93ok($gp->isa('Imager::Color::Float'), "check scalar float getpixel type");
94ok(color_cmp($gp, $flgreen) == 0, "check scalar float getpixel color");
95
a8652edf
TC
96# more complete arc tests
97ok($img->arc(x=>25, 'y'=>125, r=>20, d1=>315, d2=>45, color=>$greenobj),
98 "color arc through angle 0");
99# use diff combine here to make sure double writing is noticable
100ok($img->arc(x=>75, 'y'=>125, r=>20, d1=>315, d2=>45,
101 fill => { solid=>$blueobj, combine => 'diff' }),
102 "fill arc through angle 0");
103ok($img->arc(x=>25, 'y'=>175, r=>20, d1=>315, d2=>225, color=>$redobj),
104 "concave color arc");
b254292b 105angle_marker($img, 25, 175, 23, 315, 225);
a8652edf
TC
106ok($img->arc(x=>75, 'y'=>175, r=>20, d1=>315, d2=>225,
107 fill => { solid=>$greenobj, combine=>'diff' }),
108 "concave fill arc");
b254292b 109angle_marker($img, 75, 175, 23, 315, 225);
a8652edf
TC
110ok($img->arc(x=>25, y=>225, r=>20, d1=>135, d2=>45, color=>$redobj),
111 "another concave color arc");
b254292b 112angle_marker($img, 25, 225, 23, 45, 135);
a8652edf 113ok($img->arc(x=>75, y=>225, r=>20, d1=>135, d2=>45,
b254292b 114 fill => { solid=>$blueobj, combine=>'diff' }),
a8652edf 115 "another concave fillarc");
b254292b 116angle_marker($img, 75, 225, 23, 45, 135);
a8652edf
TC
117ok($img->arc(x=>25, y=>275, r=>20, d1=>135, d2=>45, color=>$redobj, aa=>1),
118 "concave color arc aa");
119ok($img->arc(x=>75, y=>275, r=>20, d1=>135, d2=>45,
b254292b 120 fill => { solid=>$blueobj, combine=>'diff' }, aa=>1),
a8652edf
TC
121 "concave fill arc aa");
122
b254292b
TC
123ok($img->circle(x=>25, y=>325, r=>20, color=>$redobj),
124 "color circle no aa");
125ok($img->circle(x=>75, y=>325, r=>20, color=>$redobj, aa=>1),
126 "color circle aa");
127ok($img->circle(x=>25, 'y'=>375, r=>20,
128 fill => { hatch=>'stipple', fg=>$blueobj, bg=>$redobj }),
129 "fill circle no aa");
130ok($img->circle(x=>75, 'y'=>375, r=>20, aa=>1,
131 fill => { hatch=>'stipple', fg=>$blueobj, bg=>$redobj }),
132 "fill circle aa");
133
134ok($img->arc(x=>50, y=>450, r=>45, d1=>135, d2=>45,
135 fill => { solid=>$blueobj, combine=>'diff' }),
136 "another concave fillarc");
137angle_marker($img, 50, 450, 47, 45, 135);
138
3a9a4241
TC
139ok($img->write(file=>'testout/t21draw.ppm'),
140 "saving output");
141
142malloc_state();
143
3a9a4241
TC
144sub color_cmp {
145 my ($l, $r) = @_;
146 my @l = $l->rgba;
147 my @r = $r->rgba;
148 # print "# (",join(",", @l[0..2]),") <=> (",join(",", @r[0..2]),")\n";
149 return $l[0] <=> $r[0]
150 || $l[1] <=> $r[1]
151 || $l[2] <=> $r[2];
152}
b254292b
TC
153
154use constant PI => 4 * atan2(1,1);
155
156sub angle_marker {
157 my ($img, $x, $y, $radius, @angles) = @_;
158
159 for my $angle (@angles) {
160 my $x1 = int($x + $radius * cos($angle * PI / 180) + 0.5);
161 my $y1 = int($y + $radius * sin($angle * PI / 180) + 0.5);
162 my $x2 = int($x + (5+$radius) * cos($angle * PI / 180) + 0.5);
163 my $y2 = int($y + (5+$radius) * sin($angle * PI / 180) + 0.5);
164
165 $img->line(x1=>$x1, y1=>$y1, x2=>$x2, y2=>$y2, color=>'#FFF');
166 }
167}