$patchsize = 50; $screenwidth = $patchsize * 4; $screenheight = $screenwidth; # @xoff = (0, 1, 1, 0, 3, 3, 2, 2, 3, 2, 2, 3, 0, 0, 1, 1); # @yoff = (0, 0, 1, 1, 0, 1, 1, 0, 3, 3, 2, 2, 3, 2, 2, 3); @xoff = (0, 1, 1, 0, 2, 3, 3, 2, 2, 3, 3, 2, 0, 1, 1, 0); @yoff = (0, 0, 1, 1, 0, 0, 1, 1, 2, 2, 3, 3, 2, 2, 3, 3); @patchdirs = ('nw', 'ne', 'se', 'sw'); while ($line = <>) { local ($x, $y, $patch, $rot); ($filename, $nw, $ne, $se, $sw, @ori) = split(/\s+/, $line); @dir = ($nw, $ne, $se, $sw); for $o (@ori) { &newfile($filename . "$o" ) ; for $subblock (0 .. 3) { $rot = ($subblock + $o - 1) % 4; @rotblock = &rotate_block(@dir, $rot); for $patchno (0 .. 3) { $xoff = $xoff[$subblock * 4 + $patchno]; $yoff = $yoff[$subblock * 4 + $patchno]; $patch = $rotblock[$patchno]; if ($patch eq 'nw') { for $y (0 .. $patchsize - 1 ) { for $x (0 .. $patchsize - 1 - $y ) { &blackpoint($x, $y); } } } elsif ($patch eq 'ne') { for $y (0 .. $patchsize - 1 ) { for $x (0 + $y .. $patchsize - 1 ) { &blackpoint($x, $y); } } } elsif ($patch eq 'se') { for $y (0 .. $patchsize - 1 ) { for $x ($patchsize - 1 - $y .. $patchsize - 1 ) { &blackpoint($x, $y); } } } elsif ($patch eq 'sw') { for $y (0 .. $patchsize - 1 ) { for $x (0 .. $y) { &blackpoint($x, $y); } } } else { print STDERR "Bad patch: $patch in line $line at line $..\n"; } } } } } @design=('.', '#'); @spacing=(" ", "\n"); sub newfile { local($fn) = @_; if ($fileopen) { &printscreen; close FILE; } unless (open(FILE, "> block.$fn")) { print STDERR "Couldn\'t open file block.$fn: $!\n"; $fileopen = 0; } $fileopen = 1; print FILE "P1\n$screenwidth $screenheight\n\n"; @screen = (); $patchno = 0; print STDERR "Opened file block.$fn.\n"; } sub blackpoint { local($x, $y) = @_; $screensize = $#screen; $index = ($x + $xoff * $patchsize) + $screenwidth * ($y + $yoff * $patchsize); $screen[$index] = 1; } sub printscreen { for $i (0 .. $screenheight * $screenwidth - 1) { $screen[$i] = 0 unless defined($screen[$i]); print FILE $screen[$i]; print FILE ((($i + 1) % $screenwidth) ? $spacing[0] : $spacing[1]); } } # Rotate patch n*90 degrees. sub rotate_patch { local($patch, $n) = @_; local($i); for $i (0 .. 3) { if ($patchdirs[$i] eq $patch) { return $patchdirs[($i + $n)%4]; } } print STDERR "Failed: Couldn't recognize patch $patch.\n"; return $patch; } sub rotate_block { local($nw, $ne, $sw, $se, $n) = @_; local(@patch) = ($nw, $ne, $sw, $se); local($i); $n = $n % 4; for $i (0 .. 3) { $patch[$i] = &rotate_patch($patch[$i], $n); } for $i (1 .. 4 - $n) { local($nw) = shift(@patch); @patch = (@patch, $nw); } return @patch; }