File Coverage

lib/Graphics/Toolkit/Color/Space/Instance/ProPhotoRGB.pm
Criterion Covered Total %
statement 20 20 100.0
branch 4 4 100.0
condition n/a
subroutine 5 5 100.0
pod 0 2 0.0
total 29 31 93.5


line stmt bran cond sub pod time code
1              
2             # Pro Photo RGB (illuminant D50, gamma 1.8)
3              
4             package Graphics::Toolkit::Color::Space::Instance::ProPhotoRGB;
5 16     16   266871 use v5.12;
  16         65  
6 16     16   77 use warnings;
  16         25  
  16         809  
7 16     16   443 use Graphics::Toolkit::Color::Space qw/spow mult_matrix_vector_3/;
  16         35  
  16         5817  
8              
9             my @D50 = (0.96422, 1, 0.82521);
10             my @D65 = (0.95047, 1, 1.08883);
11             my $eta = 0.001953;
12             my $gamma = 1.8;
13              
14             sub from_rgb {
15 4 100   4 0 3 my @rgb = map { (abs($_) <= 16 * $eta) ? ($_ / 16) : spow( $_, $gamma ) } @{$_[0]};
  12         26  
  4         19  
16              
17 4         15 my @xyz = mult_matrix_vector_3( [[ 0.7556032668, 0.1127849127, 0.0820818412 ],
18             [ 0.2683379836, 0.7151267757, 0.0165353036 ],
19             [ 0.0039100028, -0.0129187254, 1.0978386769 ], ], @rgb);
20 4         18 $xyz[$_] /= $D65[ $_ ] for 0 .. 2;
21 4         11 return \@xyz;
22             }
23             sub to_rgb {
24 4     4 0 5 my ($xyz) = [ @{$_[0]} ];
  4         8  
25 4         16 $xyz->[$_] *= $D65[ $_ ] for 0 .. 2;
26 4         14 my @rgb = mult_matrix_vector_3( [[ 1.4032152559, -0.2231400792, -0.1015529925 ],
27             [ -0.5262716028, 1.4816610921, 0.0170313058 ],
28             [ -0.0111904728, 0.0182300474, 0.9114427432 ], ], @$xyz);
29              
30 4 100       9 return [map { (abs($_) <= $eta) ? ($_ * 16) : spow($_, 1 / $gamma)} @rgb];
  12         25  
31             }
32              
33             Graphics::Toolkit::Color::Space->new(
34             name => 'ProPhotoRGB',
35             alias_name => 'ROMMRGB',
36             family => 'RGB',
37             axis => [qw/red green blue/],
38             precision => 6,
39             convert => {XYZ => [\&from_rgb, \&to_rgb]},
40             );