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 16     16   264757 use v5.12;
  16         46  
6 16     16   91 use warnings;
  16         24  
  16         663  
7 16     16   418 use Graphics::Toolkit::Color::Space;
  16         41  
  16         5178  
8              
9             my $eta = 0.008856 ;
10             my $kappa = 903.3;
11              
12             sub from_lab {
13 16     16 0 25 my ($lab) = shift;
14 16         40 my $fy = ($lab->[0] + 0.16) / 1.16;
15 16         36 my $fx = $fy - 1 + ($lab->[1] * 2);
16 16         40 my $fz = $fy + 1 - ($lab->[2] * 2);
17 16 100       31 my @xyz = map {my $f3 = $_** 3; (abs($f3) > $eta) ? $f3 : (( 116 * $_ - 16 ) / $kappa) } $fx, $fy, $fz;
  48         107  
  48         109  
18 16         37 return \@xyz;
19             }
20             sub to_lab {
21 15     15 0 26 my ($xyz) = shift;
22 15 100       26 my @xyz = map {(abs($_) > $eta) ? ($_ ** (1/3)) : ((($kappa * $_) + 16) / 116)} @$xyz;
  45         120  
23 15         27 my $l = (1.16 * $xyz[1]) - 0.16;
24 15         34 my $a = ($xyz[0] - $xyz[1] + 1) / 2;
25 15         23 my $b = ($xyz[1] - $xyz[2] + 1) / 2;
26 15         37 return ([$l, $a, $b]);
27             }
28              
29             Graphics::Toolkit::Color::Space->new (
30             alias_name => 'CIELAB', # space name LAB
31             family => 'LAB',
32             axis => [qw/L* a* b*/], # short l a b - lightness, cyan-orange balance, magenta-green balance
33             role => [qw/L a b/],
34             range => [100, [-500, 500], [-200, 200]],
35             precision => 3,
36             convert => {XYZ => [\&from_lab, \&to_lab, ]},
37             );