File Coverage

lib/Graphics/Toolkit/Color/Space/Instance/CIELCHuv.pm
Criterion Covered Total %
statement 21 21 100.0
branch 6 6 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 LCh(uv) cylindrical color space variant of CIELUV
3              
4             package Graphics::Toolkit::Color::Space::Instance::CIELCHuv;
5 16     16   264620 use v5.12;
  16         48  
6 16     16   83 use warnings;
  16         52  
  16         756  
7 16     16   519 use Graphics::Toolkit::Color::Space qw/round_decimals/;
  16         20  
  16         4796  
8              
9             my $TAU = 6.283185307;
10              
11             sub from_lch {
12 7     7 0 10 my ($lch) = shift;
13 7         60 my $u = $lch->[1] * cos($lch->[2] * $TAU) * 261;
14 7         20 my $v = $lch->[1] * sin($lch->[2] * $TAU) * 261;
15 7         50 return ([$lch->[0], ($u+134) / 354, ($v+140) / 262 ]);
16             }
17             sub to_lch {
18 7     7 0 15 my ($luv) = shift;
19 7         17 my $u = $luv->[1] * 354 - 134;
20 7         13 my $v = $luv->[2] * 262 - 140;
21 7 100       22 $u = 0 if round_decimals($u, 5) == 0;
22 7 100       17 $v = 0 if round_decimals($v, 5) == 0;
23 7         28 my $c = sqrt( ($u**2) + ($v**2));
24 7         72 my $h = atan2($v, $u);
25 7 100       18 $h += $TAU if $h < 0;
26 7         38 return ([$luv->[0], $c / 261, $h / $TAU ]);
27             }
28              
29             Graphics::Toolkit::Color::Space->new(
30             name => 'CIELCHuv',
31             alias_name => 'LCHuv',
32             family => 'HSL',
33             axis => [qw/luminance chroma hue/],
34             role => [qw/lightness saturation hue/],
35             type => [qw/linear linear angular/],
36             range => [100, 261, 360],
37             precision => 3,
38             convert => {LUV => [\&from_lch, \&to_lch]},
39             );