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   316828 use v5.12;
  15         81  
6 15     15   100 use warnings;
  15         111  
  15         902  
7 15     15   754 use Graphics::Toolkit::Color::Space;
  15         30  
  15         6657  
8              
9             my $eta = 0.008856 ;
10             my $kappa = 903.3;
11              
12             sub from_xyz {
13 15     15 0 29 my ($xyz) = shift;
14 15 100       28 my @xyz = map {(abs($_) > $eta) ? ($_ ** (1/3)) : ((($kappa * $_) + 16) / 116)} @$xyz;
  45         128  
15 15         31 my $l = (1.16 * $xyz[1]) - 0.16;
16 15         39 my $a = ($xyz[0] - $xyz[1] + 1) / 2;
17 15         26 my $b = ($xyz[1] - $xyz[2] + 1) / 2;
18 15         76 return ([$l, $a, $b]);
19             }
20             sub to_xyz {
21 16     16 0 31 my ($lab) = shift;
22 16         43 my $fy = ($lab->[0] + 0.16) / 1.16;
23 16         55 my $fx = $fy - 1 + ($lab->[1] * 2);
24 16         27 my $fz = $fy + 1 - ($lab->[2] * 2);
25 16 100       32 my @xyz = map {my $f3 = $_** 3; (abs($f3) > $eta) ? $f3 : (( 116 * $_ - 16 ) / $kappa) } $fx, $fy, $fz;
  48         146  
  48         187  
26 16         52 return \@xyz;
27             }
28              
29             Graphics::Toolkit::Color::Space->new (
30             alias => 'CIELAB', # space name LAB
31             axis => [qw/L* a* b*/], # short l a b - lightness, cyan-orange balance, magenta-green balance
32             range => [100, [-500, 500], [-200, 200]],
33             precision => 3,
34             convert => {XYZ => [\&to_xyz, \&from_xyz, ]},
35             );