chiark / gitweb /
numbered-alias-sheet: wip for output
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 3 Nov 2013 21:43:35 +0000 (21:43 +0000)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 3 Nov 2013 21:43:35 +0000 (21:43 +0000)
numbered-alias-sheet

index 027f8bc9b4e47594131aec89556fa290cd32c45c..b7398f22f604d3d543b9a30fcf182de12abf03e8 100755 (executable)
@@ -144,7 +144,6 @@ our @core_size;
 our @item_size;
 our $rotate_paper;
 our @eff_paper_size;
-our @laycount;
 
 sub wontfit ($) {
     print DEBUG " NO @_\n";
@@ -229,7 +228,8 @@ sub do_layout_recursive_search ($) {
     if ($lpi < @lp_options) {
        foreach my $v ($lp_fixed[$lpi] or @{ $lp_options[$lpi] }) {
            $lp_values[$lpi] = $v;
-           return 1 if do_layout_recursive_search $lpi+1;
+           my $r = do_layout_recursive_search $lpi+1;
+           return $r if $r;
        }
        return 0;
     }
@@ -239,10 +239,10 @@ sub do_layout_recursive_search ($) {
     my %lp_y;
     $lp_y{$_} = 1 foreach @lp_values;
 
-    $rotate_paper =
+    $lp_y{rotate_paper} =
        ($paperpts[0] > $paperpts[1] # paper looks like landscape
         xor $lp_y{'landscape'});
-    @eff_paper_size = !$rotate_paper ? @paperpts : reverse @paperpts;
+    @eff_paper_size = !$lp_y{rotate_paper} ? @paperpts : reverse @paperpts;
 
     @item_size = @core_size;
     my $blank_coord = !!$lp_y{'blank-below'};
@@ -255,22 +255,24 @@ sub do_layout_recursive_search ($) {
            $each += $gap_width;
            $avail += $gap_width;
        }
-       $laycount[$coord] = floor($avail / $each);
-       $laycount[$coord] >= 1 or return wontfit "cannot fit even one $coord";
+       $lp_y{$coord} = floor($avail / $each);
+       $lp_y{$coord} >= 1 or return wontfit "cannot fit even one $coord";
     }
 
     if ($lp_y{'single-column'}) {
-       $laycount[0] = 1;
+       $lp_y{0} = 1;
     } else {
-       $laycount[0] >= 2 
+       $lp_y{0} >= 2 
            or return wontfit "requested multi-column but only one";
     }
 
-    $laycount[0] * $laycount[1] >= @strings
-       or return wontfit "layout fits too few @laycount";
+    my $laycountshow = "$lp_y{0} $lp_y{1}";
 
-    print DEBUG " OK @laycount\n";
-    return 1;
+    $lp_y{0} * $lp_y{1} >= @strings
+       or return wontfit "layout fits too few $laycountshow";
+
+    print DEBUG " OK $laycountshow\n";
+    return \%lp_y;
 }
 
 sub do_layout ($) {
@@ -290,6 +292,7 @@ sub do_layout ($) {
 }
 
 our $usesz;
+our $lp_y;
 
 sub determine_size_layout () {
     my $minsz;
@@ -313,14 +316,41 @@ sub determine_size_layout () {
        }
     }
 
-    do_layout $usesz or die;
+    $lp_y = do_layout $usesz or die;
     
     print DEBUG Dumper($usesz, \@lp_values, \@numbers_metr,
                       \@texts_metr, $gap_width, \@core_size,
-                      \@item_size, $rotate_paper, \@eff_paper_size,
-                      \@laycount);
+                      \@item_size, \@eff_paper_size,
+                      $lp_y);
+}
+
+sub prf { printf @_ or die $!; }
+
+sub write_output () {
+    prf "%%!\n";
+    my @cnr;
+    my $c;
+    prf "gsave\n";
+    for ($cnr[0]=0; $cnr[0]<2; $cnr[0]++) {
+       for ($cnr[1]=0; $cnr[1]<2; $cnr[1]++) {
+           foreach my $cnrc (qw(0 1)) {
+               prf "newpath ";
+               prf "%s ", $cnr[$_] ? $paperpts[$_] : 0 foreach qw(0 1);
+               prf "moveto ";
+               prf "%s ", ($cnrc!=$_ ? 0 : $cnr[$_] ? -1 : +1) * $borders[$_]
+                   foreach qw(0 1);
+               prf "rlineto stroke\n";
+           }
+       }
+    }
+    prf "grestore gsave\n";
+    prf "%s ", -$borders[$_] foreach qw(0 1);
+    prf "translate\n";
+    prf "90 rotate\n" if $lp_y->{rotate_paper};
+    prf "grestore\n";
 }
 
 readstrings();
 prepare_metrics();
 determine_size_layout();
+write_output();