File Coverage

blib/lib/PDF/Make/Builder/Shape/Circle.pm
Criterion Covered Total %
statement 26 26 100.0
branch n/a
condition n/a
subroutine 6 6 100.0
pod 1 1 100.0
total 33 33 100.0


line stmt bran cond sub pod time code
1             package PDF::Make::Builder::Shape::Circle;
2 42     42   208 use strict;
  42         60  
  42         1377  
3 42     42   200 use warnings;
  42         68  
  42         1528  
4 42     42   165 use Object::Proto;
  42         57  
  42         2513  
5              
6             BEGIN {
7 42     42   1684 Object::Proto::define('PDF::Make::Builder::Shape::Circle',
8             'fill_colour:Str:default(#000)',
9             'x:Num:required',
10             'y:Num:required',
11             'r:Num:required',
12             );
13 42         1815 Object::Proto::import_accessors('PDF::Make::Builder::Shape::Circle');
14             }
15              
16             # Bezier control point ratio for circle approximation
17 42     42   254 use constant K => 0.5522847498;
  42         94  
  42         10626  
18              
19             sub add {
20 1     1 1 2 my ($self, $builder) = @_;
21 1         4 my $page = $builder->page;
22 1         3 my $canvas = $page->canvas;
23 1         2 my $font = $builder->font;
24              
25 1         2 my $cx = $self->x;
26 1         4 my $cy = $self->y;
27 1         2 my $radius = $self->r;
28 1         5 my ($cr, $cg, $cb) = $font->hex_to_rgb(fill_colour $self);
29              
30 1         2 my $k = $radius * K;
31              
32 1         10 $canvas->q->rg($cr, $cg, $cb);
33              
34             # 4 cubic Bezier curves forming a circle
35 1         37 $canvas->m($cx + $radius, $cy)
36             ->c($cx + $radius, $cy + $k, $cx + $k, $cy + $radius, $cx, $cy + $radius)
37             ->c($cx - $k, $cy + $radius, $cx - $radius, $cy + $k, $cx - $radius, $cy)
38             ->c($cx - $radius, $cy - $k, $cx - $k, $cy - $radius, $cx, $cy - $radius)
39             ->c($cx + $k, $cy - $radius, $cx + $radius, $cy - $k, $cx + $radius, $cy)
40             ->f->Q;
41              
42 1         3 return $self;
43             }
44              
45             1;
46              
47             __END__