#!/usr/bin/perl use strict; use warnings; use Cairo; my $u = 72/2.5; my $mi = 72/25.4; my $pw = 210*$mi; my $ph = 297*$mi; my $s = Cairo::PdfSurface->create('digit.pdf', $pw, $ph); my $c = Cairo::Context->create($s); my $n = 0; $c->set_line_width(2); $c->set_line_cap('round'); $c->set_source_rgb(0, 0, 0); sub cross($$) { my ($x,$y) = @_; $c->save; $c->set_line_width(0.5); $c->move_to($x-.5*$u, $y); $c->line_to($x+.5*$u, $y); $c->stroke; $c->move_to($x, $y-.5*$u); $c->line_to($x, $y+.5*$u); $c->stroke; $c->restore; } my $xp = $u; my $yp = $u; while (<>) { s/^@@ // or next; chomp; my @r = split /\s+/; @r == 5 or next; cross($xp, $yp); cross($xp+6*$u, $yp); cross($xp, $yp+6*$u); cross($xp+6*$u, $yp+6*$u); for my $r (@r) { my ($x1,$y1,$x2,$y2) = $r =~ /^\((\d+),(\d+)\)-\((\d+),(\d+)\)$/ or die; $c->move_to($xp + (.9*$x1+.1*$x2)*$u, $yp + (.9*$y1+.1*$y2)*$u); $c->line_to($xp + (.9*$x2+.1*$x1)*$u, $yp + (.9*$y2+.1*$y1)*$u); $c->stroke; } $xp += 6*$u; if ($xp + 5*$u > $pw) { $xp = $u; $yp += 6*$u; if ($yp + 5*$u > $ph) { $c->show_page; $yp = $u; } } $n++; } print "Output $n matchograms.\n";