File Coverage

lib/Graphics/Toolkit/Color/Space/Instance/HSL.pm
Criterion Covered Total %
statement 25 25 100.0
branch 19 20 95.0
condition n/a
subroutine 5 5 100.0
pod 0 2 0.0
total 49 52 94.2


line stmt bran cond sub pod time code
1              
2             # HSL color space specific code
3              
4             package Graphics::Toolkit::Color::Space::Instance::HSL;
5 16     16   267255 use v5.12;
  16         90  
6 16     16   62 use warnings;
  16         27  
  16         766  
7 16     16   435 use Graphics::Toolkit::Color::Space qw/min max mod_real/;
  16         18  
  16         7420  
8              
9             sub from_hsl {
10 97     97 0 121 my ($h, $s, $l) = @{$_[0]};
  97         158  
11 97         119 $h *= 6;
12 97         222 my $C = $s * (1 - abs($l * 2 - 1));
13 97         183 my $X = $C * (1 - abs( mod_real($h, 2) - 1) );
14 97         150 my $m = $l - ($C / 2);
15 97 100       411 my @rgb = ($h < 1) ? ($C + $m, $X + $m, $m)
    100          
    100          
    100          
    100          
16             : ($h < 2) ? ($X + $m, $C + $m, $m)
17             : ($h < 3) ? ( $m, $C + $m, $X + $m)
18             : ($h < 4) ? ( $m, $X + $m, $C + $m)
19             : ($h < 5) ? ($X + $m, $m, $C + $m)
20             : ($C + $m, $m, $X + $m);
21 97         238 return \@rgb;
22             }
23             sub to_hsl {
24 75     75 0 81 my ($r, $g, $b) = @{$_[0]};
  75         141  
25 75         179 my $vmax = max($r, $g, $b),
26             my $vmin = min($r, $g, $b);
27 75         144 my $l = ($vmax + $vmin) / 2;
28 75 100       184 return ([0, 0, $l]) if $vmax == $vmin;
29 45         62 my $d = $vmax - $vmin;
30 45 100       101 my $s = ($l > 0.5) ? ($d / (2 - $vmax - $vmin)) : ($d / ($vmax + $vmin));
31 45 50       143 my $h = ($vmax == $r) ? (($g - $b) / $d + ($g < $b ? 6 : 0)) :
    100          
    100          
32             ($vmax == $g) ? (($b - $r) / $d + 2)
33             : (($r - $g) / $d + 4);
34 45         126 return ([$h/6, $s, $l]);
35             }
36              
37             Graphics::Toolkit::Color::Space->new(
38             family => 'HSL',
39             axis => [qw/hue saturation lightness/],
40             range => [ 360, 100, 100 ],
41             precision => 0,
42             type => [qw/angular linear linear/],
43             #suffix => ['', '%', '%'],
44             convert => {RGB => [\&from_hsl, \&to_hsl]},
45             );