#!/usr/bin/perl -w
use Image::Magick;

$infile=shift(@ARGV);
$outfile=shift(@ARGV);
if(!$infile or !$outfile){ instructions(); }

$input=new Image::Magick;
$input->Read($infile);
($h,$w)=$input->Get('height','width');
print "original $infile width $w height $h\n";
$outw=$w*7+20;
$outh=$h*9+13;
print "outputting to $outfile width $outw height $outh\n";

$output=new Image::Magick;
$output->Set(size=>"$outw"."x"."$outh");
$output->ReadImage('canvas:black');

open(IFP,"/home/mhgraham/Text/Shakespeare-Much_Ado.txt");

for($i=0;$i<$h;$i++){
  for($j=0;$j<$w;$j++){
    @p=$input->GetPixel(x=>$j,y=>$i);
    $p[0]*=255;
    $p[1]*=255;
    $p[2]*=255;
    $col="rgb($p[0],$p[1],$p[2])";
    $output->Annotate(font=>'cour.ttf',pointsize=>10,fill=>
      $col,text=>getonechar(\*IFP),antialias=>'false',
      x=>11+$j*7,y=>13+$i*9);
    }
  }

$output->Write($outfile);

sub instructions{
  print "makematrix.pl <infile> <outfile>\n";
  print "Makes a 'The Matrix'-like version of <infile>.  Note that the
output file may be quite large.\n";
  exit 1;
}

sub getonechar{
  my $FP=shift(@_);
  $c=' ';
  while(ord($c)<33 or ord($c)>125){
    if(ord($c=getc($FP))){ ; }
    else{ seek($FP,0,0); }
    }
  return $c;
}
