
$patchsize = 100;
$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;
}
