--- /dev/null
+#! /usr/bin/perl
+
+$file_input="font.pnm";
+$file_output="eutopiabold36.rle";
+$border=-1;
+$spaceborder=4;
+
+$|=1;
+
+open(INPUT,$file_input) || die "Couldn't open font: $!\n";
+
+$tag=<INPUT>; chop($tag);
+if($tag ne "P6")
+ { die "Couldn't process image: not a pnm file ($tag)"; }
+
+$comment=<INPUT>;
+
+$dimensions=<INPUT>; chop($dimensions);
+
+if($dimensions =~ /(\d+) (\d+)/)
+ { $width=$1; $height=$2; }
+else
+ { die "Couldn't process image: couldn't get dimensions"; }
+
+$bits=<INPUT>;
+
+print "width $width height $height\n";
+
+for($j=0; $j<$height; $j++)
+ { for($i=0; $i<$width; $i++)
+ {
+ $red[$i][$j]=ord(getc(INPUT));
+ $green[$i][$j]=ord(getc(INPUT));
+ $blue[$i][$j]=ord(getc(INPUT));
+ }
+ print ".";
+ }
+
+print "\n";
+
+close(INPUT);
+
+open(OUTPUT,">".$file_output) || die "Couldn't open output: $!\n";
+
+# Put header
+print OUTPUT pack("C2",0x36,0x05);
+
+# Put font height
+print OUTPUT pack("C",$height);
+
+$xstart=0;
+
+# Search for space
+
+$xstart=2;
+$x=$xstart; $blank=0;
+while($x<$width && !$blank)
+ { $blank=1;
+ for($y=0; $y<$height; $y++)
+ { if($blue[$x][$y]!=255)
+ { $blank=0; }
+ }
+ if(!$blank)
+ { $x++; }
+ }
+
+$xstart=$x;
+
+$x=$xstart; $blank=1;
+while($x<$width && $blank)
+ { $blank=1;
+ for($y=0; $y<$height; $y++)
+ { if($blue[$x][$y]!=255)
+ { $blank=0; }
+ }
+ if($blank)
+ { $x++; }
+ }
+$xend=$x;
+
+$spacewidth=$xend-$xstart+$spaceborder;
+$spacewidth=$spacewidth/2;
+if($spacewidth==0)
+ { $spacewidth=1; }
+
+print "space start=$xstart end=$xend -> width=$spacewidth\n\n";
+
+# Put space character code
+print OUTPUT pack("C",32);
+
+# Put space width
+print OUTPUT pack("C",$spacewidth);
+
+# Put space RLE data
+for($y=0;$y<$height;$y++)
+ { print OUTPUT pack("C",1);
+ print OUTPUT pack("C",0);
+ print OUTPUT pack("C",$spacewidth);
+ }
+
+$char=33;
+
+while($xstart<$width)
+ {
+ print "looking for character $char \"".chr($char)."\"\n";
+
+ $x=$xstart; $blank=1;
+ while($x<$width && $blank)
+ { $blank=1;
+ for($y=0; $y<$height; $y++)
+ { if($blue[$x][$y]!=255)
+ { $blank=0; }
+ }
+ if($blank)
+ { $x++; }
+ }
+ $xstart=$x;
+
+ $x=$xstart; $blank=0;
+ while($x<$width && !$blank)
+ { $blank=1;
+ for($y=0; $y<$height; $y++)
+ { if($blue[$x][$y]!=255)
+ { $blank=0; }
+ }
+ if(!$blank)
+ { $x++; }
+ }
+ $xend=$x;
+ print "start=$xstart end=$xend\n";
+
+ $dstart=$xstart-$border;
+ if($dstart < 0)
+ { $dstart = 0; }
+ $dend=$xend+$border;
+ if($dend > $width)
+ { $dend = $width; }
+
+ # Put character
+ print OUTPUT pack("C",$char);
+
+ # Put character width
+ print OUTPUT pack("C",$dend-$dstart);
+
+ for($y=0; $y<$height; $y++)
+ { $linecode=""; $bytecode=""; $lastcolour=-1; $count=0;
+ for($x=$dstart; $x<$dend; $x++)
+ {
+ # Transparent background
+ $c=":"; $colour=0;
+
+ # Anti-aliased foreground
+ if($blue[$x][$y]<255 && $red[$x][$y]>0)
+ { $c="+"; $colour=1; }
+
+ # Solid foreground
+ if($blue[$x][$y]==255 && $red[$x][$y]==255 )
+ { $c="#"; $colour=2; }
+
+ # Anti-aliased shadow (same as shadow)
+ if($blue[$x][$y]<255 && $red[$x][$y]==0)
+ { $c="."; $colour=3; }
+
+ # Solid shadow
+ if($blue[$x][$y]==0 && $red[$x][$y]==0)
+ { $c=" "; $colour=3; }
+
+ print $c;
+
+ if($colour != $lastcolour)
+ {
+ if($lastcolour!=-1)
+ { $linecode.=" $lastcolour,$count";
+ $bytecode.=pack("C2",$lastcolour,$count);
+ }
+ $lastcolour=$colour; $count=1;
+ }
+ else
+ { $count++; }
+ }
+ if($lastcolour!=-1)
+ { $linecode.=" $lastcolour,$count";
+ $bytecode.=pack("C2",$lastcolour,$count);
+ }
+ print " [$linecode]\n";
+
+ # Put length of RLE line
+ print OUTPUT pack("C*",length($bytecode)/2);
+
+ # Put RLE line
+ print OUTPUT $bytecode;
+
+ }
+
+ print "\n";
+
+ $xstart=$xend+1;
+ $char++;
+ }
+
+print OUTPUT pack("C",255);
+
+print "Done!\n";
+
+close(OUTPUT);