File Coverage

lib/Graphics/Toolkit/Color/Space/Instance/CIELAB.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             # CIE LAB color space specific code based on XYZ for Illuminant D65 and Observer 2 degree
3              
4             package Graphics::Toolkit::Color::Space::Instance::CIELAB;
5 15     15   247151 use v5.12;
  15         61  
6 15     15   102 use warnings;
  15         27  
  15         921  
7 15     15   796 use Graphics::Toolkit::Color::Space;
  15         57  
  15         8606  
8              
9             my @D65 = (0.95047, 1, 1.08883); # illuminant
10             my $eta = 0.008856 ;
11             my $kappa = 903.3;
12              
13             sub from_xyz {
14 17     17 0 43 my ($xyz) = shift;
15 17 100       43 my @xyz = map {($_ > $eta) ? ($_ ** (1/3)) : ((($kappa * $_) + 16) / 116)} @$xyz;
  51         186  
16 17         45 my $l = (1.16 * $xyz[1]) - 0.16;
17 17         86 my $a = ($xyz[0] - $xyz[1] + 1) / 2;
18 17         42 my $b = ($xyz[1] - $xyz[2] + 1) / 2;
19 17         74 return ([$l, $a, $b]);
20             }
21             sub to_xyz {
22 13     13 0 40 my ($lab) = shift;
23 13         42 my $fy = ($lab->[0] + 0.16) / 1.16;
24 13         67 my $fx = $fy - 1 + ($lab->[1] * 2);
25 13         42 my $fz = $fy + 1 - ($lab->[2] * 2);
26 13 100       35 my @xyz = map {my $f3 = $_** 3; ($f3 > $eta) ? $f3 : (( 116 * $_ - 16 ) / $kappa) } $fx, $fy, $fz;
  39         102  
  39         127  
27 13         52 return \@xyz;
28             }
29              
30             Graphics::Toolkit::Color::Space->new (
31             alias => 'CIELAB', # space name LAB
32             axis => [qw/L* a* b*/], # short l a b - lightness, cyan-orange balance, magenta-green balance
33             range => [100, [-500, 500], [-200, 200]],
34             precision => 3,
35             convert => {XYZ => [\&to_xyz, \&from_xyz]},
36             );