Obviously less efficient than replacing palette at a hardcoded position,
but more flexible and reliable with different sources.
Still only loaded if requested.
stylesheet => [qw'light dark'],
});
stylesheet => [qw'light dark'],
});
-my $imgfile = exists $get{img} && 'indi.png';
+my $imgfile = $get{img} // exists $get{img} && 'indi.png';
my @termlist;
push @termlist, split /\W+/, $ENV{PATH_INFO} || 'default';
my @termlist;
push @termlist, split /\W+/, $ENV{PATH_INFO} || 'default';
sub img_egapal {
my ($palette) = @_;
return eval {
sub img_egapal {
my ($palette) = @_;
return eval {
- require Digest::CRC;
-
- local $/;
- open my $img, '<:bytes', "data/$imgfile" or die "$!\n";
- my $imgdata = readline $img;
-
- my $offset = 0x29 - 4;
- my $len = 16 * 3;
- my $chunklen = $len + 4;
- substr($imgdata, $offset+4, $len) = pack 'H*', join '', @{$palette};
- my ($p, $crc) = unpack "x${offset}a${chunklen}N", $imgdata;
- substr($imgdata, $offset+4+$len, 4) = pack 'N', Digest::CRC::crc32($p);
+ my @imgpal = map { Imager::Color->new(ref $_ ? @$_ : $_) } @{$palette};
+ state $img = Imager->new(file => "data/$imgfile")
+ or die Imager->errstr.$/;
+ @{[ $img->getcolors ]} == @imgpal
+ or die "incompatible palette size\n";
+ $img->setcolors(colors => \@imgpal);
+ $img->write(data => \my $imgdata, type => 'png');
return sprintf '<img src="data:image/png;base64,%s">',
MIME::Base64::encode_base64($imgdata);
} || $@;
return sprintf '<img src="data:image/png;base64,%s">',
MIME::Base64::encode_base64($imgdata);
} || $@;