File Coverage

lib/Graphics/Toolkit/Color/Space/Instance/NCol.pm
Criterion Covered Total %
statement 42 42 100.0
branch 21 32 65.6
condition n/a
subroutine 7 7 100.0
pod 0 4 0.0
total 70 85 82.3


line stmt bran cond sub pod time code
1              
2             # NCol color space (HWB with human readable hue values) / Karl Ewald Konstantin Hering (1834 - 1918)
3              
4             package Graphics::Toolkit::Color::Space::Instance::NCol;
5 15     15   242030 use v5.12;
  15         100  
6 15     15   93 use warnings;
  15         27  
  15         1016  
7 15     15   803 use Graphics::Toolkit::Color::Space qw/min max/;
  15         41  
  15         13768  
8              
9             my @color_char = qw/R Y G C B M/;
10             my %char_value = (map { $color_char[$_] => $_ } 0 .. $#color_char);
11              
12             sub read_values {
13 9     9 0 18 my $val = shift;
14 9         55 my $hue = $char_value{ uc substr($val->[0], 0, 1) } * 100 + substr($val->[0], 1);
15 9         33 return [$hue, $val->[1], $val->[2]];
16             }
17             sub write_values {
18 4     4 0 8 my $val = shift;
19 4 100       12 my $hue = ($val->[0] < 600) ? $val->[0] : 0;
20 4         62 my $digit = int($hue / 100);
21 4         24 my $hue_str = $color_char[ $digit ] . sprintf( "%u", ($hue - ($digit * 100)));
22 4         19 return [$hue_str, $val->[1], $val->[2]];
23             }
24              
25             sub from_rgb {
26 3     3 0 5 my ($r, $g, $b) = @{$_[0]};
  3         9  
27 3         11 my $vmax = max($r, $g, $b);
28 3         8 my $white = my $vmin = min($r, $g, $b);
29 3 50       9 return ([0,1,0]) if $white == 1;
30 3         6 my $black = 1 - ($vmax);
31 3 100       35 return ([0,0,1]) if $black == 1;
32              
33 2         4 my $d = $vmax - $vmin;
34 2         4 my $s = $d / $vmax;
35 2 50       16 my $h = ($d == 0) ? 0 :
    0          
    50          
    100          
36             ($vmax == $r) ? (($g - $b) / $d + ($g < $b ? 6 : 0)) :
37             ($vmax == $g) ? (($b - $r) / $d + 2)
38             : (($r - $g) / $d + 4);
39 2         25 return ([$h/6, $white, $black]);
40             }
41             sub to_rgb {
42 7     7 0 12 my ($h, $w, $b) = @{$_[0]};
  7         25  
43 7 100       31 return ([0, 0, 0]) if $b == 1;
44 5 100       25 return ([1, 1, 1]) if $w == 1;
45 2         4 my $v = 1 - $b;
46 2         6 my $s = 1 - ($w / $v);
47 2 50       5 $s = 0 if $s < 0;
48 2 100       9 return ([$v, $v, $v]) if $s == 0;
49              
50 1         4 my $hi = int( $h * 6 );
51 1         2 my $f = ( $h * 6 ) - $hi;
52 1         2 my $p = $v * (1 - $s );
53 1         2 my $q = $v * (1 - ($s * $f));
54 1         2 my $t = $v * (1 - ($s * (1 - $f)));
55 1 50       7 my @rgb = ($hi == 1) ? ($q, $v, $p)
    50          
    50          
    50          
    50          
56             : ($hi == 2) ? ($p, $v, $t)
57             : ($hi == 3) ? ($p, $q, $v)
58             : ($hi == 4) ? ($t, $p, $v)
59             : ($hi == 5) ? ($v, $p, $q)
60             : ($v, $t, $p);
61 1         4 return \@rgb;
62             }
63              
64             Graphics::Toolkit::Color::Space->new(
65             name => 'NCol',
66             axis => [qw/hue whiteness blackness/],
67             type => [qw/angular linear linear/],
68             range => [600, 100, 100],
69             precision => 0,
70             value_form => ['[RYGCBMrygcbm]\d{1,3}','\d{1,3}','\d{1,3}'],
71             suffix => ['', '%', '%'],
72             convert => {RGB => [\&to_rgb, \&from_rgb]},
73             values => {read => \&read_values, write => \&write_values, }
74             );