File Coverage

lib/Graphics/Toolkit/Color/Space/Instance/HunterLAB.pm
Criterion Covered Total %
statement 23 23 100.0
branch 4 4 100.0
condition n/a
subroutine 5 5 100.0
pod 0 2 0.0
total 32 34 94.1


line stmt bran cond sub pod time code
1              
2             # Hunter lab color space, pre CIELAB, for Illuminant D65 and Observer 2 degree
3              
4             package Graphics::Toolkit::Color::Space::Instance::HunterLAB;
5 15     15   222614 use v5.12;
  15         94  
6 15     15   136 use warnings;
  15         28  
  15         1101  
7 15     15   874 use Graphics::Toolkit::Color::Space qw/round_decimals/;
  15         31  
  15         6628  
8              
9             my @D65 = (0.95047, 1, 1.08883); # illuminant
10             my %K = ( a => round_decimals(175.0 / 198.04 * ($D65[1] + $D65[0]) * 100, 5),
11             b => round_decimals( 70.0 / 218.11 * ($D65[1] + $D65[2]) * 100, 5), );
12              
13             sub from_xyz {
14 4     4 0 10 my ($xyz) = shift;
15 4         44 my $l = sqrt $xyz->[1];
16 4 100       40 my $a = $l ? (($xyz->[0] - $xyz->[1])/$l) : 0;
17 4 100       16 my $b = $l ? (($xyz->[1] - $xyz->[2])/$l) : 0;
18 4         11 $a = ($a / 2) + .5;
19 4         10 $b = ($b / 2) + .5;
20 4         25 return ([$l, $a, $b]);
21             }
22             sub to_xyz {
23 5     5 0 17 my ($lab) = shift;
24 5         15 my $l = $lab->[0];
25 5         18 my $a = ($lab->[1] - .5) * 2;
26 5         36 my $b = ($lab->[2] - .5) * 2;
27 5         21 my $y = $l ** 2;
28 5         16 my $x = ($a * $l) + $y;
29 5         11 my $z = $y - ($b * $l);
30 5         61 return ([$x, $y, $z]);
31             }
32              
33             Graphics::Toolkit::Color::Space->new(
34             name => 'HunterLAB',
35             axis => [qw/l a b/], # same as short
36             range => [100, [-$K{'a'}, $K{'a'}], [-$K{'b'}, $K{'b'}]], # cyan-orange, magenta-green
37             precision => 3,
38             convert => {XYZ => [\&to_xyz, \&from_xyz]},
39             );