File Coverage

blib/lib/Schedule/Easing/Function.pm
Criterion Covered Total %
statement 54 58 93.1
branch 32 34 94.1
condition 33 36 91.6
subroutine 11 11 100.0
pod 0 8 0.0
total 130 147 88.4


line stmt bran cond sub pod time code
1             package Schedule::Easing::Function;
2              
3 6     6   6366 use strict;
  6         16  
  6         215  
4 6     6   31 use warnings;
  6         9  
  6         348  
5 6     6   34 use Carp qw/carp/;
  6         11  
  6         5449  
6              
7             our $VERSION='0.1.4';
8              
9             my %shapes=(
10             linear=>\&linearShape,
11             power =>\&powerShape,
12             step =>\&stepShape,
13             );
14              
15             my %unshapes=(
16             linear=>\&linearInverse,
17             power =>\&powerInverse,
18             step =>\&stepInverse,
19             );
20              
21             sub shape {
22 59     59 0 427832 my ($shape)=@_;
23 59 50       252 if(my $f=$shapes{$shape}) { return $f }
  59         256  
24 0         0 carp("Shape not supported: $shape");
25 0         0 return \&linearShape;
26             }
27              
28             sub inverse {
29 59     59 0 170 my ($shape)=@_;
30 59 50       180 if(my $f=$unshapes{$shape}) { return $f }
  59         199  
31 0         0 carp("Inverse not supported: $shape");
32 0         0 return \&linearInverse;
33             }
34              
35             sub linearShape {
36 201521     201521 0 399321 my ($ts,$tsA,$tsB,$begin,$final)=@_;
37 201521 100       424437 if($ts<=$tsA) { return $begin }
  64183         139740  
38 137338 100       260867 if($ts>=$tsB) { return $final }
  32091         72058  
39 105247         296407 return ($ts-$tsA)*($final-$begin)/($tsB-$tsA)+$begin;
40             }
41              
42             sub linearInverse {
43 8451     8451 0 18352 my ($y,$tsA,$tsB,$ymin,$ymax)=@_;
44 8451 100 100     53771 if (($ymax>$ymin)&&(($y<$ymin)||($y>$ymax))) { return }
  2 100 100     12  
      100        
      66        
45 2         10 elsif(($ymax<$ymin)&&(($y>$ymin)||($y<$ymax))) { return }
46 8447 100       16417 if($ymax>$ymin) { return linearShape($y,$ymin,$ymax,$tsA,$tsB) }
  4442         10821  
47 4005         9250 else { return linearShape($ymax+$ymin-$y,$ymax,$ymin,$tsA,$tsB) }
48             }
49              
50             sub powerShape {
51 18     18 0 48 my ($ts,$tsA,$tsB,$begin,$final,$power)=@_;
52 18 100       62 if($ts<=$tsA) { return $begin }
  6         21  
53 12 100       25 if($ts>=$tsB) { return $final }
  6         20  
54 6         74 return (($ts-$tsA)/($tsB-$tsA))**$power*($final-$begin)+$begin;
55             }
56              
57             sub powerInverse {
58 10     10 0 30 my ($y,$tsA,$tsB,$ymin,$ymax,$power)=@_;
59 10 100 100     65 if (($ymax>$ymin)&&(($y<$ymin)||($y>$ymax))) { return }
  2 100 100     8  
      100        
      66        
60 2         8 elsif(($ymax<$ymin)&&(($y>$ymin)||($y<$ymax))) { return }
61 6 100       11 if($ymin<$ymax) { return powerShape($y,$ymin,$ymax,$tsA,$tsB,1/$power) }
  3         9  
62 3         10 else { return powerShape($ymax+$ymin-$y,$ymax,$ymin,$tsA,$tsB,1/$power) }
63             }
64              
65             sub stepShape {
66 66     66 0 147 my ($ts,$tsA,$tsB,$begin,$final,$steps)=@_;
67 66 100       149 if($ts<=$tsA) { return $begin }
  9         67  
68 57 100       102 if($ts>=$tsB) { return $final }
  9         47  
69 48         305 return int(($ts-$tsA)/($tsB-$tsA)*$steps)/$steps*($final-$begin)+$begin;
70             }
71              
72             sub stepInverse {
73 36     36 0 102 my ($y,$tsA,$tsB,$ymin,$ymax,$steps)=@_;
74 36 100 100     262 if (($ymax>$ymin)&&(($y<$ymin)||($y>$ymax))) { return }
  4 100 100     23  
      100        
      66        
75 2         13 elsif(($ymax<$ymin)&&(($y>$ymin)||($y<$ymax))) { return }
76 30 100       57 if($ymin<$ymax) { return stepShape($y,$ymin,$ymax,$tsA,$tsB,$steps) }
  18         50  
77 12         31 else { return stepShape($ymax+$ymin-$y,$ymax,$ymin,$tsA,$tsB,$steps) }
78             }
79              
80             1;