File Coverage

blib/lib/SVG/Sparkline/RangeArea.pm
Criterion Covered Total %
statement 63 66 95.4
branch 7 8 87.5
condition n/a
subroutine 9 10 90.0
pod 2 2 100.0
total 81 86 94.1


line stmt bran cond sub pod time code
1             package SVG::Sparkline::RangeArea;
2              
3 3     3   23 use warnings;
  3         8  
  3         118  
4 3     3   17 use strict;
  3         7  
  3         67  
5 3     3   16 use Carp;
  3         8  
  3         215  
6 3     3   20 use SVG;
  3         8  
  3         31  
7 3     3   3831 use SVG::Sparkline::Utils;
  3         11  
  3         117  
8              
9 3     3   67 use 5.008000;
  3         13  
10             our $VERSION = 1.12;
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 21     21 1 45 my ($class, $args) = @_;
22             # validate parameters
23 21         67 SVG::Sparkline::Utils::validate_array_param( $args, 'values' );
24             croak "'values' must be an array of pairs.\n"
25 17 100       27 if grep { 'ARRAY' ne ref $_ || 2 != @{$_} } @{$args->{values}};
  85 100       222  
  81         270  
  17         41  
26             my $valdesc = SVG::Sparkline::Utils::summarize_xy_values(
27 16         29 [ (map { $_->[0] } @{$args->{values}}), (reverse map { $_->[1] } @{$args->{values}}) ]
  81         143  
  16         33  
  81         161  
  16         27  
28             );
29 16         37 $valdesc->{xrange} = $#{$args->{values}};
  16         40  
30 16         37 $valdesc->{xmax} = $#{$args->{values}};
  16         28  
31 16         31 my $off = $valdesc->{xrange};
32 16         30 foreach my $v (@{$valdesc->{vals}}[($off+1) .. $#{$valdesc->{vals}}])
  16         63  
  16         31  
33             {
34 81         138 $v->[0] = $off--;
35             }
36              
37 16         62 SVG::Sparkline::Utils::calculate_xscale( $args, $valdesc->{xrange} );
38 16         55 SVG::Sparkline::Utils::calculate_yscale_and_offset( $args, $valdesc->{yrange}, $valdesc->{offset} );
39 16         57 my $svg = SVG::Sparkline::Utils::make_svg( $args );
40              
41             my $points = SVG::Sparkline::Utils::xypairs_to_points_str(
42             $valdesc->{vals}, $args->{xscale}, $args->{yscale}
43 16         55 );
44 16         76 $svg->polygon( fill=>$args->{color}, points=>$points, stroke=>'none' );
45              
46 16 100       1086 if( exists $args->{mark} )
47             {
48             _make_marks( $svg,
49             xscale=>$args->{xscale}, yscale=>$args->{yscale},
50             values=>$args->{values}, mark=>$args->{mark},
51             base=>$valdesc->{base}
52 5         14 );
53             }
54              
55 16         127 return $svg;
56             }
57              
58             sub _make_marks
59             {
60 5     5   15 my ($svg, %args) = @_;
61            
62 5         8 my @marks = @{$args{mark}};
  5         11  
63 5         19 while(@marks)
64             {
65 5         11 my ($index,$color) = splice( @marks, 0, 2 );
66 5         15 $index = SVG::Sparkline::Utils::range_mark_to_index( 'RangeArea', $index, $args{values} );
67 5         16 _make_mark( $svg, %args, index=>$index, color=>$color );
68             }
69 5         12 return;
70             }
71              
72             sub _make_mark
73             {
74 5     5   16 my ($svg, %args) = @_;
75 5         10 my $index = $args{index};
76 5         5 my ($lo, $hi) = @{$args{values}->[$index]};
  5         12  
77 5         15 my $y = _f( ($lo-$args{base}) * $args{yscale} );
78 5         14 my $yh = _f( ($hi-$args{base}) * $args{yscale} );
79 5         11 my $x = _f($index * $args{xscale});
80              
81 5 50       15 if(abs($hi-$lo) <= 0.01)
82             {
83 0         0 $svg->circle( cx=>$x, cy=>$y, r=>1, fill=>$args{color}, stroke=>'none' );
84             }
85             else
86             {
87             $svg->line( x1=>$x, y1=>$y, x2=>$x, y2=>$yh,
88 5         17 fill=>'none', stroke=>$args{color}, 'stroke-width'=>1
89             );
90             }
91 5         368 return;
92             }
93              
94             1;
95              
96             __END__