File Coverage

blib/lib/SVG/Sparkline/Line.pm
Criterion Covered Total %
statement 49 49 100.0
branch 2 2 100.0
condition 2 2 100.0
subroutine 10 10 100.0
pod 2 2 100.0
total 65 65 100.0


line stmt bran cond sub pod time code
1             package SVG::Sparkline::Line;
2              
3 7     7   42 use warnings;
  7         16  
  7         258  
4 7     7   49 use strict;
  7         13  
  7         234  
5 7     7   39 use Carp;
  7         58  
  7         549  
6 7     7   77 use SVG;
  7         58  
  7         55  
7 7     7   8882 use SVG::Sparkline::Utils;
  7         18  
  7         238  
8              
9 7     7   327 use 5.008000;
  7         28  
  7         5207  
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 2     2 1 6 return scalar grep { $_[1] eq $_ } qw/thick xrange yrange/;
  6         26  
17             }
18              
19             sub make
20             {
21 36     36 1 64 my ($class, $args) = @_;
22             # validate parameters
23 36         129 SVG::Sparkline::Utils::validate_array_param( $args, 'values' );
24 33         122 my $valdesc = SVG::Sparkline::Utils::summarize_xy_values( $args->{values} );
25              
26 31   100     158 my $thick = $args->{thick} || 1;
27 31         130 SVG::Sparkline::Utils::calculate_xscale( $args, $valdesc->{xrange} );
28 31         116 SVG::Sparkline::Utils::calculate_yscale_and_offset( $args, $valdesc->{yrange}, $valdesc->{offset} );
29 31         98 my $svg = SVG::Sparkline::Utils::make_svg( $args );
30              
31 31         153 my $points = SVG::Sparkline::Utils::xypairs_to_points_str(
32             $valdesc->{vals}, $args->{xscale}, $args->{yscale}
33             );
34 31         258 $svg->polyline( fill=>'none', 'stroke-width'=>$thick, stroke=>$args->{color}, 'stroke-linecap'=>'round', points=>$points );
35              
36 31 100       2355 if( exists $args->{mark} )
37             {
38 16         65 _make_marks( $svg,
39             thick=>$thick, xscale=>$args->{xscale}, yscale=>$args->{yscale},
40             values=>$valdesc->{vals}, mark=>$args->{mark}
41             );
42             }
43              
44 31         249 return $svg;
45             }
46              
47             sub _make_marks
48             {
49 16     16   63 my ($svg, %args) = @_;
50            
51 16         80 my @marks = @{$args{mark}};
  16         47  
52 16         208 my @yvalues = map { $_->[1] } @{$args{values}};
  128         231  
  16         41  
53 16         47 while(@marks)
54             {
55 16         45 my ($index,$color) = splice( @marks, 0, 2 );
56 16         67 $index = SVG::Sparkline::Utils::mark_to_index( 'Line', $index, \@yvalues );
57 16         69 _make_mark( $svg, %args, index=>$index, color=>$color );
58             }
59 16         52 return;
60             }
61              
62             sub _make_mark
63             {
64 16     16   75 my ($svg, %args) = @_;
65 16         28 my $index = $args{index};
66 16         70 my $x = _f($args{xscale} * $args{values}->[$index]->[0]);
67 16         73 my $y = _f($args{yscale} * $args{values}->[$index]->[1]);
68 16         83 $svg->circle( cx=>$x, cy=>$y, r=>$args{thick},
69             stroke=>'none', fill=>$args{color}
70             );
71 16         1340 return;
72             }
73              
74             1;
75              
76             __END__