termcol: adjust non-ansi palette orders slightly
[sheet.git] / termcol.plp
index 748625cae0636f5b67ec90a2405fb3b72a4873ae..8d707ecdf700bf727ee3c9f27630904a3310c9f1 100644 (file)
@@ -14,7 +14,8 @@ Html({
        stylesheet => [qw'light dark'],
 });
 
-my $imgfile = $get{img} // exists $get{img} && 'indi.png';
+my @draw = map { [$_, s/\W+\z//] } grep { $_ } split m(/),
+       $get{img} // exists $get{img} && 'indi.png';
 
 my @termlist;
 push @termlist, split /\W+/, $ENV{PATH_INFO} || 'default';
@@ -47,6 +48,7 @@ print
 use 5.010;
 use Shiar_Sheet::Colour '1.04';
 use List::Util qw( min max );
+use POSIX qw( ceil );
 
 my $palettes = do 'termcol.inc.pl';
 die "Cannot open palette data: $_\n" for $@ || $! || ();
@@ -73,15 +75,17 @@ sub colcell {
 }
 
 sub img_egapal {
-       my ($palette) = @_;
+       my ($palette, $imgfile, $reindex) = @_;
        return eval {
                require Imager;
                require MIME::Base64;
 
                my @imgpal = map { Imager::Color->new(ref $_ ? @$_ : $_) } @{$palette};
-               state $reindex = $imgfile =~ s/!$//;
-               state $img = Imager->new(file => "data/palimage/$imgfile")
+               state $imgcache = {};
+               my $img = $imgcache->{$imgfile}
+                       //= Imager->new(file => "data/palimage/$imgfile")
                        or die Imager->errstr.$/;
+
                do {
                        if ($reindex) {
                                $img->to_paletted({
@@ -128,17 +132,24 @@ for my $term (@termlist) {
                        $colours = [ map { $colours->[$_] =~ s/:|$/:$_/r } @{$reorder} ];
                }
 
+               my $rows = 8;
+               my $columns = ceil(@{$colours} / $rows);
+
                print '<table class=color>', "\n";
                printf "<caption>%s</caption>\n", $caption;
-               for my $num (0 .. $#{$colours}) {
-                       my ($rgb, $name) = split /:/, $colours->[$num], 3;
-                       $name ||= $num;
-                       $name = [ $name, [] ] if $term =~ /^msx/ and !$num;
-                       $name = [ $name, ['#333'] ] if $term eq 'xkcd';
-                       print '<tr>', colcell($name, $rgb);
+               for my $row (0 .. $rows - 1) {
+                       print '<tr>';
+                       for my $col (0 .. $columns - 1) {
+                               my $num = $row + $col * $rows;
+                               my ($rgb, $name) = split /:/, $colours->[$num], 3;
+                               $name //= $rgb && $num;
+                               $name = [ $name, [] ] if $term =~ /^msx/ and !$num;
+                               $name = [ $name, ['#333'] ] if $term eq 'xkcd';
+                               print colcell($name, $rgb);
+                       }
                }
 
-               print '<tr><td>', img_egapal(\@{$colours}) if $imgfile;
+               print "<tr><td colspan=$columns>", img_egapal(\@{$colours}, @{$_}) for @draw;
                print "</table>\n\n";
        }
 }
@@ -199,10 +210,10 @@ sub coltable_hsv {
                }
        }
 
-       if ($imgfile) {
+       if (@draw) {
                my @palette = map { [ @{$_}[1 .. 3] ] } @greymap, map {@$_} map {@$_} @colmap;
-               my $imgdata = img_egapal(\@palette);
                my $tablespan = scalar map { @$_ } @colmap;
+               my $imgdata = img_egapal(\@palette, @{ $draw[0] });
                $out .= "<tr><td colspan=$tablespan>$imgdata";
        }