#!/usr/bin/perl
use strict;
use warnings;
use File::Temp qw(tempfile);

# 256 terminal colour map
my $m = "\0\0\0\0\0_\0\0\x87\0\0\xaf\0\0\xd7\0\0\xff\0_\0\0__\0_\x87\0_\xaf\0_\xd7\0_\xff\0\x87\0\0\x87_\0\x87\x87\0\x87\xaf\0\x87\xd7\0\x87\xff\0\xaf\0\0\xaf_\0\xaf\x87\0\xaf\xaf\0\xaf\xd7\0\xaf\xff\0\xd7\0\0\xd7_\0\xd7\x87\0\xd7\xaf\0\xd7\xd7\0\xd7\xff\0\xff\0\0\xff_\0\xff\x87\0\xff\xaf\0\xff\xd7\0\xff\xff_\0\0_\0__\0\x87_\0\xaf_\0\xd7_\0\xff__\0_____\x87__\xaf__\xd7__\xff_\x87\0_\x87__\x87\x87_\x87\xaf_\x87\xd7_\x87\xff_\xaf\0_\xaf__\xaf\x87_\xaf\xaf_\xaf\xd7_\xaf\xff_\xd7\0_\xd7__\xd7\x87_\xd7\xaf_\xd7\xd7_\xd7\xff_\xff\0_\xff__\xff\x87_\xff\xaf_\xff\xd7_\xff\xff\x87\0\0\x87\0_\x87\0\x87\x87\0\xaf\x87\0\xd7\x87\0\xff\x87_\0\x87__\x87_\x87\x87_\xaf\x87_\xd7\x87_\xff\x87\x87\0\x87\x87_\x87\x87\x87\x87\x87\xaf\x87\x87\xd7\x87\x87\xff\x87\xaf\0\x87\xaf_\x87\xaf\x87\x87\xaf\xaf\x87\xaf\xd7\x87\xaf\xff\x87\xd7\0\x87\xd7_\x87\xd7\x87\x87\xd7\xaf\x87\xd7\xd7\x87\xd7\xff\x87\xff\0\x87\xff_\x87\xff\x87\x87\xff\xaf\x87\xff\xd7\x87\xff\xff\xaf\0\0\xaf\0_\xaf\0\x87\xaf\0\xaf\xaf\0\xd7\xaf\0\xff\xaf_\0\xaf__\xaf_\x87\xaf_\xaf\xaf_\xd7\xaf_\xff\xaf\x87\0\xaf\x87_\xaf\x87\x87\xaf\x87\xaf\xaf\x87\xd7\xaf\x87\xff\xaf\xaf\0\xaf\xaf_\xaf\xaf\x87\xaf\xaf\xaf\xaf\xaf\xd7\xaf\xaf\xff\xaf\xd7\0\xaf\xd7_\xaf\xd7\x87\xaf\xd7\xaf\xaf\xd7\xd7\xaf\xd7\xff\xaf\xff\0\xaf\xff_\xaf\xff\x87\xaf\xff\xaf\xaf\xff\xd7\xaf\xff\xff\xd7\0\0\xd7\0_\xd7\0\x87\xd7\0\xaf\xd7\0\xd7\xd7\0\xff\xd7_\0\xd7__\xd7_\x87\xd7_\xaf\xd7_\xd7\xd7_\xff\xd7\x87\0\xd7\x87_\xd7\x87\x87\xd7\x87\xaf\xd7\x87\xd7\xd7\x87\xff\xd7\xaf\0\xd7\xaf_\xd7\xaf\x87\xd7\xaf\xaf\xd7\xaf\xd7\xd7\xaf\xff\xd7\xd7\0\xd7\xd7_\xd7\xd7\x87\xd7\xd7\xaf\xd7\xd7\xd7\xd7\xd7\xff\xd7\xff\0\xd7\xff_\xd7\xff\x87\xd7\xff\xaf\xd7\xff\xd7\xd7\xff\xff\xff\0\0\xff\0_\xff\0\x87\xff\0\xaf\xff\0\xd7\xff\0\xff\xff_\0\xff__\xff_\x87\xff_\xaf\xff_\xd7\xff_\xff\xff\x87\0\xff\x87_\xff\x87\x87\xff\x87\xaf\xff\x87\xd7\xff\x87\xff\xff\xaf\0\xff\xaf_\xff\xaf\x87\xff\xaf\xaf\xff\xaf\xd7\xff\xaf\xff\xff\xd7\0\xff\xd7_\xff\xd7\x87\xff\xd7\xaf\xff\xd7\xd7\xff\xd7\xff\xff\xff\0\xff\xff_\xff\xff\x87\xff\xff\xaf\xff\xff\xd7\xff\xff\xff\b\b\b\22\22\22\34\34\34&&&000:::DDDNNNXXX```fffvvv\x80\x80\x80\x8a\x8a\x8a\x94\x94\x94\x9e\x9e\x9e\xa8\xa8\xa8\xb2\xb2\xb2\xbc\xbc\xbc\xc6\xc6\xc6\xd0\xd0\xd0\xda\xda\xda\xe4\xe4\xe4\xee\xee\xee";
my %m = do { my $i = 16; map { $_ => $i++ } unpack "(a3)*", $m };

my ($map_fh, $map_fn) = tempfile();
print $map_fh "P6\n@{[scalar keys %m]} 1\n255\n"; # char storage
print $map_fh sort keys %m;
my ($img_fh, $img_fn) = tempfile();
print $img_fh (<>);

@_ = split /\n/, qx{ anytopnm < "$img_fn" 2>/dev/null |pnmremap -fs -map="$map_fn" 2>/dev/null }, 4;
exit unless @_;
my @b = ('▀', '▄'); # pixel
my ($s)= $_[1] =~ /(\d+)/; # image width
for($_[3]) {
    @_=unpack "(a".($s*3).")*",$_;
    my $e=1;
    while (my @z = splice @_, 0, 2) { # take each 2 rows
	$_=[unpack "(a3)*",$_] for @z; # r/g/b
	while (@{$z[0]}) {
	    my @y = map { shift @$_ } @z;
	    if (@y==1) {
		print "\e[38;5;$m{$y[0]}m$b[0]"
	    } else {
		print "\e[48;5;$m{$y[$e]};38;5;$m{$y[$e^1]}m$b[$e^=1]"
	    }
	}
	print "\e[0m\n";
    }
}
