-if ($get{v}) {
- my %reorder = (
- arnegame => [ 0,5,9,12 , 3,6,10,13,1 , 4,7,8,11,14,15,2 ],
- arnegame => [ 0,3,10,6,12,9,13,1 , 5,7,11,8,14,4,15,2 ],
- c64 => [ 0,2,5,9,6,4,3,15 , 11,10,13,7,14,8,12,1 ],
- msx2 => [ 0,6,2,10,4,13,7,14 , 1,8,3,11,5,9,12,15 ],
- risc => [ 7,11,13,14,8,12,15,1, 6,5,10,9,4,3,2,0],
- mac2 => [ 15,3,9,11,6,5,7,12 , 14,2,8,1,13,4,10,0 ],
- );
- $reorder{$_} = $reorder{msx2} for qw( msx1 arnejmp );
- while (my ($name, $order) = each %reorder) {
- for my $pal ( $palettes->{$name}) {
- $pal = [ map { $pal->[$_ + 1] =~ s/:|$/:$_/r } -1, @{$order} ];
- }
- }
+sub img_egapal {
+ my ($palette, $imgfile, $reindex) = @_;
+ return eval {
+ require Imager;
+ require MIME::Base64;
+
+ my @imgpal = map { Imager::Color->new(ref $_ ? @$_ : $_) } @{$palette};
+ state $imgcache = {};
+ my $img = $imgcache->{$imgfile}
+ //= Imager->new(file => "data/palimage/$imgfile")
+ or die Imager->errstr.$/;
+
+ do {
+ if ($reindex) {
+ $img->to_paletted({
+ make_colors => 'none',
+ colors => \@imgpal,
+ translate => 'closest',
+ });
+ }
+ else {
+ @{[ $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);
+ } || $@;