File Coverage

blib/lib/SVG/Sparkline/Area.pm
Criterion Covered Total %
statement 49 51 96.0
branch 4 4 100.0
condition n/a
subroutine 9 10 90.0
pod 2 2 100.0
total 64 67 95.5


line stmt bran cond sub pod time code
1             package SVG::Sparkline::Area;
2              
3 7     7   44 use warnings;
  7         14  
  7         278  
4 7     7   39 use strict;
  7         16  
  7         245  
5 7     7   39 use Carp;
  7         16  
  7         12518  
6 7     7   101 use SVG;
  7         14  
  7         63  
7 7     7   9403 use SVG::Sparkline::Utils;
  7         21  
  7         182  
8              
9 7     7   253 use 5.008000;
  7         29  
  7         6638  
10             our $VERSION = 1.10;
11              
12             # aliases to make calling shorter.
13             *_f = *SVG::Sparkline::Utils::format_f;
14              
15             sub valid_param {
16 0     0 1 0 return scalar grep { $_[1] eq $_ } qw/xrange yrange/;
  0         0  
17             }
18              
19             sub make
20             {
21 34     34 1 170 my ($class, $args) = @_;
22             # validate parameters
23 34         147 SVG::Sparkline::Utils::validate_array_param( $args, 'values' );
24 31         131 my $valdesc = SVG::Sparkline::Utils::summarize_xy_values( $args->{values} );
25              
26 29         138 SVG::Sparkline::Utils::calculate_xscale( $args, $valdesc->{xrange} );
27 29         117 SVG::Sparkline::Utils::calculate_yscale_and_offset( $args, $valdesc->{yrange}, $valdesc->{offset} );
28 29         106 my $svg = SVG::Sparkline::Utils::make_svg( $args );
29              
30 29         236 my $points = SVG::Sparkline::Utils::xypairs_to_points_str(
31 29         92 [ [0,0], @{$valdesc->{vals}}, [$valdesc->{vals}->[-1]->[0],0] ],
32             $args->{xscale}, $args->{yscale}
33             );
34 29         284 $svg->polygon( fill=>$args->{color}, points=>$points, stroke=>'none' );
35              
36 29 100       6270 if( exists $args->{mark} )
37             {
38 15         72 _make_marks( $svg,
39             xscale=>$args->{xscale}, yscale=>$args->{yscale},
40             values=>$valdesc->{vals}, mark=>$args->{mark}
41             );
42             }
43              
44 29         310 return $svg;
45             }
46              
47             sub _make_marks
48             {
49 15     15   65 my ($svg, %args) = @_;
50            
51 15         25 my @marks = @{$args{mark}};
  15         58  
52 15         65 my @yvalues = map { $_->[1] } @{$args{values}};
  120         187  
  15         33  
53 15         52 while(@marks)
54             {
55 15         46 my ($index,$color) = splice( @marks, 0, 2 );
56 15         72 $index = SVG::Sparkline::Utils::mark_to_index( 'Area', $index, \@yvalues );
57 15         566 _make_mark( $svg, %args, index=>$index, color=>$color );
58             }
59 15         54 return;
60             }
61              
62             sub _make_mark
63             {
64 15     15   70 my ($svg, %args) = @_;
65 15         34 my $index = $args{index};
66 15         68 my $x = _f($args{xscale} * $args{values}->[$index]->[0]);
67 15         87 my $y = _f($args{yscale} * ($args{values}->[$index]->[1]));
68 15 100       63 if(abs($y) <= 0.01)
69             {
70 2         31 $svg->circle( cx=>$x, cy=>$y, r=>1, fill=>$args{color}, stroke=>'none' );
71             }
72             else
73             {
74 13         79 $svg->line( x1=>$x, y1=>0, x2=>$x, y2=>$y,
75             fill=>'none', stroke=>$args{color}, 'stroke-width'=>1
76             );
77             }
78 15         1262 return;
79             }
80              
81             1;
82              
83             __END__