termcol: hsv method in Colour module
authorMischa POSLAWSKY <perl@shiar.org>
Mon, 2 Nov 2015 14:15:32 +0000 (15:15 +0100)
committerMischa POSLAWSKY <perl@shiar.org>
Tue, 5 Jan 2016 00:05:07 +0000 (01:05 +0100)
Shiar_Sheet/Colour.pm
termcol.plp

index cdac0b346066b204e70fa148001c959ab74de43b..cf22f3eac9726d4a6c86f10e66de932e0347f85a 100644 (file)
@@ -4,7 +4,7 @@ use strict;
 use warnings;
 use List::Util qw( min max );
 
-our $VERSION = '1.03';
+our $VERSION = '1.04';
 
 # ITU-R recommendation 601 luma co-efficients
 our $kr = .299;
@@ -50,6 +50,12 @@ sub hue {
        return $hue;
 }
 
+sub hsv {
+       my ($rgb) = @_;
+       my $v = max(@{$rgb});
+       return $rgb->hue, abs(min(@{$rgb}) - $v), $v;
+}
+
 sub rgb24 {
        my $str = '';
        $str .= sprintf '%X', min($_ / 17 + .5, 15) for @{ $_[0] };
index 267d5a74a7821f4bfd5a54aba6c420a0c2b55589..748625cae0636f5b67ec90a2405fb3b72a4873ae 100644 (file)
@@ -45,7 +45,7 @@ print
 <div class="section">
 <:
 use 5.010;
-use Shiar_Sheet::Colour '1.03';
+use Shiar_Sheet::Colour '1.04';
 use List::Util qw( min max );
 
 my $palettes = do 'termcol.inc.pl';
@@ -159,9 +159,7 @@ sub coltable_hsv {
                        for my $b (0 .. $dim - 1) {
                                my @rgb = ($r, $g, $b);
 
-                               my $h = Shiar_Sheet::Colour->new(@rgb)->hue * $hmax;
-                               my $v = max(@rgb);
-                               my $s = abs(min(@rgb) - max(@rgb));
+                               my ($h, $s, $v) = Shiar_Sheet::Colour->new(@rgb)->hsv;
 
                                if (!$s) {
                                        if (@greymap) {
@@ -169,11 +167,12 @@ sub coltable_hsv {
                                                next;
                                        }
 
-                                       $h = $hmax;  # greyscale hue
+                                       $h = 1;  # greyscale hue
                                        $s = 1;  # lowest saturation for other hues
                                        $v = $s = $vmax if !$v;  # black at full saturation
                                }
 
+                               $h *= $hmax;
                                $v = $vmax - $v;
                                $s = $smax - $s - $v;