1 package Shiar_Sheet::Colour;
5 use List::Util qw( min max );
9 # ITU-R recommendation 601 luma co-efficients
12 our $kg = 1 - $kb - $kr;
14 my $PI = 2 * atan2 1, 0;
18 my @rgb = @_ >= 3 ? @_ : (map {hex} $_[0] =~ /(..)/g);
23 # convert from YPbPr values 0..255 (or hex string)
25 my ($y, $cb, $cr) = @_ >= 3 ? @_ : (map {hex} $_[0] =~ /(..)/g);
27 $_ -= 128 for $cb, $cr;
28 $_ /= 255 for $y, $cb, $cr;
30 my @rgb = map { max(0, min(255, $_ * 255)) } (
32 $y - $cb * (1 - $kb) * $kb/$kg - $cr * $kr/$kg,
33 $y + $cb * (1 - $kb) ,
39 # perceived brightness
40 my ($r, $g, $b) = @{ $_[0] };
41 return $r*$kr + $g*$kg + $b*$kb;
45 # colour shift (red = 0 .. 1)
46 my ($r, $g, $b) = @{ $_[0] };
47 my $hue = atan2 sqrt(3) * ($g - $b), $r*2 - $g - $b;
48 $hue /= $PI * 2; # -.5 .. .5
49 $hue++ if $hue < 0; # fp $hue %= 1
56 return $rgb->hue, abs(min(@{$rgb}) - $v), $v;
61 $str .= sprintf '%X', min($_ / 17 + .5, 15) for @{ $_[0] };
67 $str .= sprintf '%02X', $_ for @{ $_[0] };