#!/usr/bin/env perl

use strict;
use warnings;
use Graphics::ColorObject;

my $dim = <>;
die "no input\n" unless defined $dim;
chomp $dim;
die "no dimension found\n" unless $dim =~ m{^\d+$} && $dim >= 3;
my $i = 0;
my @A;
while (<>) {
   chomp;
   next if m{salami};
   s/^\s*//;
   $A[$i] = [split /\s+/];
   my $nofentries = scalar @{$A[$i]};
   die "invalid input at row $i (expected $dim, got $nofentries)\n" if $nofentries != $dim;
   $i++;
}
die "wrong number of input lines\n" unless $i == $dim;

print q{
prologues := 2;
% defaultfont := "cmr10";
% Palatino default font
defaultfont := "pplb8r";
verbatimtex
%&latex
\documentclass[12pt]{article}
\usepackage{palatino}
\usepackage{mathpple}
\usepackage{ifthen}
\usepackage[latin1]{inputenc}
\usepackage[T1]{fontenc}
\newcommand{\keyword}[1]{{\bfseries#1}}
\newlength{\widtha}
\newlength{\widthb}
\newcommand{\twolines}[2]{%
   \settowidth{\widtha}{#1}%
   \settowidth{\widthb}{#2}%
   \ifthenelse{\lengthtest\widtha>\widthb}{%
      \parbox{\widtha}{\centering #1 \\ #2}%
   }{%
      \parbox{\widthb}{\centering #1 \\ #2}%
   }%
}
\begin{document}
etex
tracingequations := 2;

width = 4in;
height = width;
ahlength := 7pt;
beginfig(1);
   pickup pencircle scaled 1.0pt;
};

print "   dim = $dim;\n";
print "   boxwidth = width / dim;\n";
print "   boxheight = boxwidth;\n";
print "   pair boxll, boxlr, boxul, boxur;\n";
print "   boxll = origin;\n";
print "   boxlr = (width, 0);\n";
print "   boxul = (0, height);\n";
print "   boxur = (width, height);\n";
print "   delta = 20pt;\n";
print "   scalewidth = width / 10;\n";
print "   scaleheight = width;\n";
print "   scaledist = width / 3;\n";
print "   pair scalell, scalelr, scaleul, scaleur;\n";
print "   scalell = (width + scaledist, 0);\n";
print "   scalelr = (width + scaledist + scalewidth, 0);\n";
print "   scaleul = (width + scaledist, scaleheight);\n";
print "   scaleur = (width + scaledist + scalewidth, scaleheight);\n";
foreach my $i (0..$dim-1) {
   foreach my $j (0..$dim-1) {
      print "   fill ($i boxwidth, $j boxheight) --\n";
      print "        (($i+1)*boxwidth, $j boxwidth) --\n";
      print "        (($i+1)*boxwidth, ($j+1)*boxwidth) --\n";
      print "        ($i boxwidth, ($j+1)*boxwidth) -- cycle\n";
      print "        withcolor ", get_color($A[$i]->[$j]), ";\n";
   }
}

foreach my $i (0..$dim-1) {
   print  "   fill ($i / $dim) [scalell,scaleul] -- \n";
   print  "        ($i / $dim) [scalelr,scaleur] -- \n";
   print  "        (($i+1) / $dim) [scalelr,scaleur] -- \n";
   print  "        (($i+1) / $dim) [scalell,scaleul] -- cycle\n";
   print  "        withcolor ", get_color($i / $dim), ";\n";
}
foreach my $i (0..10) {
   print "   draw ($i/10) [scalelr,scaleur] --\n";
   print "        ($i/10) [scalelr,scaleur] + (delta/2, 0);\n";
   my $lab;
   if ($i == 0) {
      $lab = "0";
   } elsif ($i == 10) {
      $lab = "1";
   } else {
      $lab = "0,$i";
   }
   print "   label.rt(btex $lab etex, ($i/10) [scalelr,scaleur] +" .
      " (delta/2, 0));\n";
}
print "   drawarrow boxll - (delta, 0) -- boxlr + (delta, 0);\n";
print "   drawarrow boxll - (0, delta) -- boxul + (0, delta);\n";
print '   label.rt(btex $x$ etex, boxlr + (delta, 0));', "\n";
print '   label.top(btex $y$ etex, boxul + (0, delta));', "\n";
print '   label.rt(btex $u(x, y)$ etex, boxur + (0, delta));', "\n";
print "   draw boxlr -- boxlr - (0, delta / 2);\n";
print "   draw boxul -- boxul - (delta / 2, 0);\n";
print "   label.bot(btex 1 etex, boxlr - (0, delta / 2));\n";
print "   label.lft(btex 1 etex, boxul - (delta / 2, 0));\n";
print "endfig;\nend.\n";

sub get_color {
   my ($value) = @_;
   my $hue = (1-$value) * 240;
   my $color = Graphics::ColorObject->new_HSV([$hue, 1, 1]);
   my @rgb = @{ $color->as_RGB() };
   return "(" . join(", ", map { sprintf "%.3f", $_ } @rgb) . ")";
}
