chiark / gitweb /
can make ours.dgram-bot.plandata.c, which compiles, but: is too big (must arrange...
authorian <ian>
Sat, 25 Jun 2005 21:01:48 +0000 (21:01 +0000)
committerian <ian>
Sat, 25 Jun 2005 21:01:48 +0000 (21:01 +0000)
layout/.cvsignore
layout/layout
layout/plan-data-format.h
layout/plan-to-gui-data
layout/segencolayers.gen-make

index 111d749a092bf154eac1cc4b77a055a21c9e2440..5a7f64407e14e66d2614f3ccc3172f82f4b68977 100644 (file)
@@ -2,7 +2,7 @@
 ours-*.ps
 *.dgram-*.p*.segenco.ps
 *.dgram-*.p*.segenco.ppm
-ui-plan-*.c
+*.dgram-*.plandata.c
 *.new
 *.segcmapreq
 *.segcmap
index 7269eb260290f2a14bdc55625ad69ae31a91b84b..2a52ac5fa737f3eb57dfa535a61bd8cc1c272d71 100755 (executable)
@@ -157,7 +157,9 @@ our $psu_sleeperlen= 17;
 our $psu_sleeperlw= 15;
 our $psu_raillw= 1.0;
 our $psu_thinlw= 1.0;
-our $psu_subseglw= 15.0;
+our %psu_subseglw;
+$psu_subseglw{'e'}= 25.0;
+$psu_subseglw{'m'}= 15.0;
 
 our $lmu_marklw= 4;
 our $lmu_marktpt= 11;
@@ -657,6 +659,16 @@ sub segment_used__len ($$) {
     o("% segments @segments\n");
 }
     
+sub segment_state_save () {
+    return [ $segused_incurrent, $segused_currentpt,
+            $segmentpart_counter, @segments ];
+}
+sub segment_state_restore ($) {
+    my ($r) = @_;
+    ($segused_incurrent, $segused_currentpt,
+     $segmentpart_counter, @segments) = @$r;
+}
+
 sub segment_used_begin ($) {
     $segused_incurrent= 0;
     $segused_currentpt= $_[0];
@@ -689,54 +701,61 @@ sub parametric_segment ($$$$$) {
 print DEBUG "ps $p0 $p1 $lenperp ($ppu)\n";
     $draw= current_draw();
     if ($draw =~ m/G/) {
-       my ($pt,$going,$red,$csegbare,$movfeat,$movstroke,$used_last);
-       $going=0;
-       o("% segments @segments\n");
-       o("    $psu_subseglw setlinewidth\n");
-       $param=$p0;
-       $pt= &$calcfn;
-       segment_used_begin($pt);
-       for (;;) {
-           $movstroke= "      stroke\n";
-           $csegbare= $segments[0];
-           $csegbare =~ s/^\-//;
-           if ($subsegcmapreq) {
-               if (!exists $subsegcmap{$csegbare}) {
-                   print "$csegbare\n" or die $!;
-                   $subsegcmap{$csegbare}++;
-               }
-           } else {
-               $movfeat= $csegbare =~ s,(/\D+)(\d+)$,$1, ? $2 : 'f';
-               if ($subsegmovfeatpos ne $movfeat) {
-                   $movstroke= "%     no-stroke\n";
+       my ($pt,$going,$red,$csegbare,$movfeat,$movstroke);
+       my ($used_last,$me,$segsave);
+       $segsave= segment_state_save();
+       foreach $me (qw(e m)) {
+           segment_state_restore($segsave);
+           $going=0;
+           o("% segments @segments\n");
+           $param=$p0;
+           $pt= &$calcfn;
+           segment_used_begin($pt);
+           for (;;) {
+               $movstroke= "      cmapreq-stroke\n";
+               $csegbare= $segments[0];
+               $csegbare =~ s/^\-//;
+               if ($subsegcmapreq) {
+                   if (!exists $subsegcmap{$csegbare}) {
+                       print "$csegbare\n" or die $!;
+                       $subsegcmap{$csegbare}++;
+                   }
+               } else {
+                   $movfeat= $csegbare =~ s,(/\D+)(\d+)$,$1, ? $2 : 'f';
+                   die "unknown subsegment colour for $csegbare\n"
+                       unless exists $subsegcmap{$csegbare};
+                   $red= $pt->{A} / (2*$pi);
+                   $red *= $subsegcmapangscale;
+                   $red += $subsegcmapangscale*2;
+                   $red += $subsegcmapangscale/2 if $segments[0] =~ m/^\-/;
+                   $red %= $subsegcmapangscale;
+                   $red += $subsegcmapangscale if $me eq 'e';
+                   $red= sprintf("%f", $red / 255.0);
+                   $movstroke=
+                       ("    $red $subsegcmap{$csegbare} setrgbcolor\n".
+                        "    $psu_subseglw{$me} setlinewidth stroke\n");
+                   if ($subsegmovfeatpos ne $movfeat ||
+                       ($me eq 'e' && $csegbare =~ m,^/,)) {
+                       $movstroke= "%     no-stroke\n";
+                   }
                }
-               die "unknown subsegment colour for $csegbare\n"
-                   unless exists $subsegcmap{$csegbare};
-               $red= $pt->{A} / (2*$pi);
-               $red *= $subsegcmapangscale;
-               $red += $subsegcmapangscale*2;
-               $red += $subsegcmapangscale/2 if $segments[0] =~ m/^\-/;
-               $red %= $subsegcmapangscale;
-               $red /= 255.0;
-               $red= sprintf("%f", $red);
-               o("    $red $subsegcmap{$csegbare} setrgbcolor\n");
-           }
-           o_path_begin();
-           parametric__o_pt($pt);
+               o_path_begin();
+               parametric__o_pt($pt);
        
-           $param += $ppu;
-           last if $param>=$p1;
+               $param += $ppu;
+               last if $param>=$p1;
+               $pt= &$calcfn;
+               segment_used_middle($psu_ulen,$pt);
+               parametric__o_pt($pt);
+               o($movstroke);
+           }
+           $used_last= $p1-($param-$ppu);
+           $param=$p1;
            $pt= &$calcfn;
-           segment_used_middle($psu_ulen,$pt);
+           segment_used_end($used_last * $lenperp, $pt);
            parametric__o_pt($pt);
            o($movstroke);
        }
-       $used_last= $p1-($param-$ppu);
-       $param=$p1;
-       $pt= &$calcfn;
-       segment_used_end($used_last * $lenperp, $pt);
-       parametric__o_pt($pt);
-        o($movstroke);
     }
     if ($draw =~ m/C/) {
        my ($pt);
index e9ce03a797f5f81d2bcac9199076d8453b35cf63..822e4db3fdaba6096d8e9ad2869115171d11c0b6 100644 (file)
@@ -3,16 +3,21 @@
 #ifndef PLAN_DATA_FORMAT_H
 #define PLAN_DATA_FORMAT_H
 
-typedef const char *const *PlanPixmapDataRef;
+typedef const char *const *PlanPixmapDataOnlyRef;
+
+typedef struct PlanPixmapDataRef {
+  int x, y;
+  PlanPixmapDataOnlyRef d;
+} PlanPixmapDataRef;
 
 typedef struct {
-  PlanPixmapDataRef a[2/*i*/][2/*det*/];
+  PlanPixmapDataRef pedge;
+  PlanPixmapDataRef on[2/*i*/][2/*det*/];
 } PlanPixmapOnData;
 
 typedef struct {
   const char *movfeatname;
-  int x, y;
-  PlanPixmapDataRef off;
+  PlanPixmapDataRef mask, unknown[2/*i*/][2/*det*/];
   int n_posns;
   const PlanPixmapOnData *posns;
 } PlanSegmovfeatData;
@@ -25,7 +30,7 @@ typedef struct {
 
 typedef struct {
   int xsz, ysz;
-  PlanPixmapDataRef background;
+  PlanPixmapDataOnlyRef background;
   int n_segments;
   const PlanSegmentData *segments;
 } PlanData;
index 9deb5d04fce309de9a343ed725cd8f65eb49c3ca..9ed28c75070b4f4acc3c8dce139c11a437b9dfb5 100755 (executable)
@@ -8,6 +8,7 @@
 
 use strict qw(vars);
 use POSIX;
+use IO::Handle;
 
 #---------- general ----------
 
@@ -22,10 +23,9 @@ sub seteq ($$$) {
 
 #---------- word-reading (for pbm) ----------
 
-our ($txtrdbuf);
+our $txtrdbuf= '';
 
 sub w () {
-    $txtrdbuf='' if !defined $txtrdbuf;
     for (;;) {
        if ($txtrdbuf =~ s/^\s*(\S+)\s?//) {
 #print STDERR "w>$1<\n";
@@ -75,7 +75,7 @@ sub xpmdata_setup ($$$$) {
 #---------- read segcmap ----------
 
 our (%datum_numbits,%datum_basebit);
-# $datum_numbits{Movfeatpos} etc.
+# $datum_numbits{Segname} etc.
 
 our (@segnum_name,%movfeats,%movfeat_prefix,%movfeat_configbits);
 # $segnum_name[$segnum]= $segname;
@@ -83,7 +83,7 @@ our (@segnum_name,%movfeats,%movfeat_prefix,%movfeat_configbits);
 # $movfeat_prefix{$xpmname}
 # $movfeat_configbits{$xpmname}
 
-xpmdata_setup("background",'',0,0);
+xpmdata_setup('background','',1,0);
 
 for (;;) {
     $!=0; defined($_=<>) or die $!;
@@ -94,18 +94,22 @@ for (;;) {
        $datum_basebit{$1}= $3;
     } elsif (m/^S ([0-9A-Z]+) (0x[0-9a-f]+)$/) {
        seteq(\$segnum_name[hex $2], $1, "segnum $2");
-       xpmdata_setup("off","_$1",1,1);
+       xpmdata_setup("bitmap","m_$1",1,1);
        xpmdata_setup("on","_$1",1,1);
+       xpmdata_setup("bitmap","e_$1",1,1);
     } elsif (m/^F ([0-9A-Z]+) (0x[0-9a-f]+) ([A-Z]+) (0x[0-9a-f]+) (\d+)$/) {
-       my ($xpmname,$bitno);
+       my ($xpmname,$bitno,$namerhs);
        seteq(\$segnum_name[hex $2], $1, "segnum $2 F $3");
        push @{ $movfeats{$1} }, $3;
        $xpmname= $1.'_'.$3;
        $movfeat_prefix{$xpmname}= hex $4;
        $movfeat_configbits{$xpmname}= $5;
-       xpmdata_setup("off","_$xpmname",1,1);
+       xpmdata_setup("on","u_$xpmname",1,1);
+       xpmdata_setup("bitmap","m_$xpmname",1,1);
        for ($bitno=0; $bitno<$movfeat_configbits{$xpmname}; $bitno++) {
-           xpmdata_setup("on","_${xpmname}_${bitno}",1,1);
+           $namerhs= "${xpmname}_${bitno}";
+           xpmdata_setup("on","_$namerhs",1,1);
+           xpmdata_setup("bitmap","e_$namerhs",1,1);
        }
     }
 }
@@ -128,10 +132,10 @@ our(%sz);
 
 sub xpm_sizes () {
     my ($rr,$xp,$xy);
+print STDERR "xpm_sizes\n";
     foreach $rr (values %xpmdata) {
        foreach $xp (values %$rr) {
            foreach $xy (qw(X Y)) {
-#print STDERR "xpms>$xpmname|$xy<\n";
                if ($xp->{Partial}) {
                    $xp->{$xy}{Min}= $sz{$xy}-1;
                    $xp->{$xy}{Max}= 0;
@@ -144,69 +148,70 @@ sub xpm_sizes () {
     }
 }
 
-w() eq 'P6' or die;
-($sz{X},$sz{Y})=wns(1,32767,2);
-wn(1,65535)==255 or die;
-
-die if length $txtrdbuf;
-
-xpm_sizes();
-
 #---------- read input pixels ----------
 
 our(%p,$pp);
 # $p{X}
 # $p{Y}
+# $p{Movpos}
 
 sub xpmdata_pixel ($$$) {
     my ($style,$namerhs,$pcharstr)=@_;
-    my ($xp,$pk,$xy);
+    my ($xp,$pk,$xy,$was);
+#printf STDERR "%s  %s %s \`%s'", $pp, $style, $namerhs, $pcharstr;
     $xp= $xpmdata{$style}{$namerhs};
-    defined $xp or die "$pp $style $namerhs ?";
+    defined $xp or die "$pp: $style $namerhs ?";
     foreach $xy (qw(X Y)) {
        $xp->{$xy}{Min}= $p{$xy} if $p{$xy} < $xp->{$xy}{Min};
        $xp->{$xy}{Max}= $p{$xy} if $p{$xy} > $xp->{$xy}{Max};
     }
-die "$pp ?" if $xp->{X}{Max} >= 642;
-    die "$pp ?" if defined $xp->{Pixels}{$p{Y}}{$p{X}};
+    $was= $xp->{Pixels}{$p{Y}}{$p{X}};
+    if (defined($was) && $was gt $pcharstr) {
+#print STDERR " already \`$was'\n";
+       return;
+    }
+#    die "$pp $style $namerhs \`$pcharstr',\`$xp->{Pixels}{$p{Y}}{$p{X}}' ?"
+#      
     $xp->{Pixels}{$p{Y}}{$p{X}}= $pcharstr;
+#print STDERR " set\n";
 }
 
 sub in_pixel () {
-    my ($pbytes);
+    my ($pbytes, $namerhs);
     $!=0; read(ARGV, $pbytes, 3) == 3 or die $!;
-    if ($pbytes eq "\xff\xff\xff") {
-       xpmdata_pixel('background','','-');
-       return;
-    }
-    my ($movfeat,%t,$xpmname,$segname,$datum,$k,$angstr,$bitno);
-    $pp= "$p{X} $p{Y}";
+    return if $pbytes eq "\xff\xff\xff";
+    my ($movfeat,%t,$xpmname,$segname,$datum,$k,$angstr,$bitno,$me);
+    $pp= "$ARGV $p{X} $p{Y}";
     $datum= unpack 'V', $pbytes."\0";
     foreach $k (keys %datum_numbits) {
        $t{$k}= ($datum >> $datum_basebit{$k}) &
            ((1 << $datum_numbits{$k}) - 1);
     }
-#printf STDERR "%s 0x%08lx 0x%x\n",$pp,$datum,$t{Segnum};
-    if ($t{Edge}) {
-       xpmdata_pixel('background','','+');
-       return;
-    } elsif (!$t{Segnum}) {
-       xpmdata_pixel('background','',':');
+#printf(STDERR "%s 0x%08lx 0x%x 0x%x %d\n",$pp,$datum,
+#       $t{Segnum},$t{Movfeatpos},$t{Edge});
+    if (!$t{Segnum}) {
+       xpmdata_pixel('background','','=')
+           unless $t{Edge};
        return;
     } else {
-       xpmdata_pixel('background','','!');
+       xpmdata_pixel('background','','!')
+           unless $t{Edge};
     }
     $segname= $segnum_name[$t{Segnum}];
-    defined $segname or die "$pp $t{Segnum}";
+    defined $segname or die "$pp $t{Segnum} $datum";
     $pp.= " $segname";
 
     $angstr= ang2pixchars($t{Angle});
-    
+
     if (!$t{Movfeatpos}) {
        $xpmname= $segname;
-       xpmdata_pixel("on","_$xpmname", $angstr);
+       xpmdata_pixel("on","_$xpmname", $angstr)
+           unless $t{Edge};
+       xpmdata_pixel("bitmap", "e_${xpmname}", '*')
+           if $t{Edge};
+       xpmdata_pixel("bitmap", "m_${segname}", '*');
     } else {
-       my ($found);
+       my ($found, $yes);
        $found= undef;
        foreach $movfeat (@{ $movfeats{$segname} }) {
            $xpmname= $segname.'_'.$movfeat;
@@ -220,21 +225,54 @@ sub in_pixel () {
        die "$pp $t{Movfeatpos}"
            unless defined $found;
        $xpmname= $segname.'_'.$found;
+       xpmdata_pixel("on", "u_${xpmname}",
+                     (($p{X} + $p{Y}) % 2) ? $angstr : '-');
+       xpmdata_pixel("bitmap", "m_${xpmname}", '*');
        for ($bitno=0; $bitno < $movfeat_configbits{$xpmname}; $bitno++) {
-           xpmdata_pixel("on","_${xpmname}_${bitno}",
-                         ((1<<$bitno) & $t{Movfeatpos}) ? $angstr : '-');
+           $namerhs= "${xpmname}_${bitno}";
+           $yes= $p{Movpos} == $bitno;
+           xpmdata_pixel("on","_$namerhs", $yes ? $angstr : '-')
+               unless $t{Edge};
+           xpmdata_pixel("bitmap","e_$namerhs", $yes ? '*' : ' ')
+               if $t{Edge};
        }
     }
-    xpmdata_pixel("off","_$xpmname", '*');
 }
 
-for ($p{Y}=0; $p{Y}<$sz{Y}; $p{Y}++) {
-    printf STDERR "%d\r",$p{Y};
-    for ($p{X}=0; $p{X}<$sz{X}; $p{X}++) {
-       in_pixel();
+#---------- read input pixmaps
+
+sub read_pixmap_header () {
+    my (@szn,$osz);
+    @szn= wns(1,32767,2);
+    if (exists $sz{X}) {
+       $osz= "$sz{X} $sz{Y}";
+       "@szn" eq "$osz" or die "$osz @szn ?";
+    } else {
+       ($sz{X},$sz{Y})= @szn;
+       xpm_sizes();
+    }
+    wn(1,65535)==255 or die;
+}
+
+for (;;) {
+    die "$txtrdbuf ?" if length $txtrdbuf;
+    $txtrdbuf= <>;
+    if (!defined $txtrdbuf) {
+       die $! unless ARGV->eof;
+       last;
+    }
+    w() eq 'P6' or die;
+    read_pixmap_header();
+    $ARGV =~ m/.*\.p([0-9a-f]+)\b/ or die "$ARGV ?";
+    $p{Movpos}= $1 eq 'f' ? '' : hex($1);
+    for ($p{Y}=0; $p{Y}<$sz{Y}; $p{Y}++) {
+       printf STDERR "%s %d\r",$ARGV,$p{Y}
+           unless $p{Y} % 100;
+       for ($p{X}=0; $p{X}<$sz{X}; $p{X}++) {
+           in_pixel();
+       }
     }
 }
-die if read ARGV,$_,1;
 
 #---------- colourmaps ----------
 
@@ -247,15 +285,15 @@ $cmap{''}= {}; # fixed colours
 
 sub xpm_cmap ($$) {
     my ($style,$cmapname) = @_;
-    die if exists $cmap{$cmapname};
+    die "$cmapname ?" if exists $cmap{$cmapname};
     push @{ $stylecmaps{$style} }, $cmapname;
     $cmap{$cmapname}= { };
 }
 
 sub xpm_cmap_entry ($$$) {
     my ($cmapname,$pixchars,$rhs) = @_;
-    die unless exists $cmap{$cmapname};
-    die if exists $cmap{$cmapname}{$pixchars};
+    die "$cmapname ?" unless exists $cmap{$cmapname};
+    die "$cmapname $pixchars ?" if exists $cmap{$cmapname}{$pixchars};
     $cmap{$cmapname}{$pixchars}= $rhs;
 }
 
@@ -319,23 +357,28 @@ sub xpm_cmap_angular($$$@) {
 }
 
 sub cmaps_define () {
-    my ($inv,$ondet);
+    my ($style,$inv,$ondet);
+    my (@background, @off, @otherposn);
 
+    @background= qw(100 100 100);
+    @off= qw(0 0 0);
+    @otherposn= qw(50 50 50);
+    
     xpm_cmap("background","background");
-    xpm_cmap_rgbpermil('',qw(off 0 0 0));
-    xpm_cmap_rgbpermil("background",qw(- 100 100 100
-                                      + 999 0 990
-                                      : 75 75 75
-                                      ! 999 0 980));
-    xpm_cmap("off","off");
-    xpm_cmap_fixedbitmap("off",'*');
-
+    xpm_cmap_rgbpermil('', 'off',@off);
+    xpm_cmap_rgbpermil("background",
+                      ' ', @background,
+                      qw(! 999 0 980
+                         = 75 75 75));
+    xpm_cmap("bitmap","bitmap");
+    xpm_cmap_fixedbitmap("bitmap",'*');
+    
     foreach $inv (('','i')) {
        foreach $ondet (qw(on det)) {
            xpm_cmap("on","${inv}${ondet}");
            xpm_cmap_rgbpermil("${inv}${ondet}",
-                              ' ', qw(999 0 970),
-                              qw(- 50 50 50));
+                              ' ', @background,
+                              '-', @otherposn);
        }
        xpm_cmap_angular("${inv}on", !!$inv, 600, qw(0 0 0));
        xpm_cmap_angular("${inv}det",!!$inv, 330, qw(1000 1000 1000));
@@ -380,7 +423,6 @@ sub xpmdata_output_all () {
     foreach $style (sort keys %xpmdata) {
        foreach $namerhs (sort keys %{ $xpmdata{$style} }) {
            $xp= $xpmdata{$style}{$namerhs};
-die "$pp ?" if $xp->{X}{Max} >= 642;
            $header_data= "";
            foreach $xy (qw(X Y)) {
                $xp->{$xy}{Max}= $xp->{$xy}{Min} if
@@ -389,31 +431,31 @@ die "$pp ?" if $xp->{X}{Max} >= 642;
                $header_data .= " ";
            }
            for ($p{Y}=$xp->{Y}{Min}; $p{Y}<=$xp->{Y}{Max}; $p{Y}++) {
-               printf "static const char d%04d_%s%s[]= \"",
+               printf "static const char d%04d_%s_%s[]= \"",
                    $p{Y}, $style, $namerhs or die $!;
                $row= $xp->{Pixels}{$p{Y}};
                $pp= "$style $namerhs $p{X} $p{Y}";
-die "$pp ?" if $xp->{X}{Max} >= 642;
                for ($p{X}=$xp->{X}{Min}; $p{X}<=$xp->{X}{Max}; $p{X}++) {
                    $pixel= $row->{$p{X}};
                    if (!defined $pixel) {
-                       die "$pp" if !$xp->{Holey};
+                       die "$pp ?" if !$xp->{Holey};
                        $pixel= ' ';
                    }
                    print $pixel or die $!;
                }
                print "\";\n" or die $!;
            }
+#printf STDERR "style >$style<\n";
            foreach $cmapname (sort @{ $stylecmaps{$style} }) {
                $cmap_data= $cmap{$cmapname}{''};
-               printf("static const char *p_%s%s[]= {\n".
+               printf("static const char *p_%s_%s[]= {\n".
                       "  \"%s%d 1\",\n",
                       $cmapname, $namerhs,
                       $header_data, scalar(@$cmap_data))
                    or die $!;
                map { printf "  %s,\n", $_ or die $!; } @$cmap_data;
                for ($y=$xp->{Y}{Min}; $y<=$xp->{Y}{Max}; $y++) {
-                   printf "  d%04d_%s%s,\n", $y, $style, $namerhs
+                   printf "  d%04d_%s_%s,\n", $y, $style, $namerhs
                        or die $!;
                }
                print("  0\n".
@@ -424,22 +466,94 @@ die "$pp ?" if $xp->{X}{Max} >= 642;
     }
 }
 
+sub ppdr ($$$) {
+    my ($style,$cmap,$namerhs) = @_;
+    my ($xpmd);
+    $xpmd= $xpmdata{$style}{$namerhs};
+defined $xpmd or die "$style $cmap $namerhs ?";
+    return sprintf("{ %d,%d, p_%s_%s }",
+                   $xpmd->{X}{Min}, $xpmd->{Y}{Min},
+                  $cmap, $namerhs);
+}
+
+sub ppdiondet ($) {
+    my ($dname) = @_;
+    return ("{ { ".ppdr('on',"on",$dname).", ".ppdr('on',"det",$dname)." },".
+           " { ".ppdr('on',"ion",$dname).", ".ppdr('on',"idet",$dname).
+           " } }");
+}
+
+our (@oodnames, %ood);
+# $ood{$oodname}{Data}= $data_so_far
+# $ood{$oodname}{ArrayDelim}= "\n" or ",\n" but for oodas only
+
+sub oods ($$) {
+    my ($oodname, $data) = @_;
+    die "$oodname {{$data}} ?" if exists $ood{$oodname};
+    $ood{$oodname}{Data}= $data;
+    push @oodnames, $oodname;
+}
+
+sub ooda0 ($$) {
+    my ($oodname, $begin) = @_;
+    die "$oodname {{$begin}} ?" if exists $ood{$oodname};
+    $ood{$oodname}{Data}= $begin;
+    $ood{$oodname}{Data} .= "[]= {";
+    $ood{$oodname}{ArrayDelim}= "\n";
+    push @oodnames, $oodname;
+}
+
+sub ooda1 ($$) {
+    my ($oodname, $entry) = @_;
+    die "$oodname {{$entry}} ?" unless defined $ood{$oodname}{ArrayDelim};
+    $ood{$oodname}{Data} .= $ood{$oodname}{ArrayDelim};
+    $ood{$oodname}{Data} .= "  ".$entry;
+    $ood{$oodname}{ArrayDelim}= ",\n";
+}
+
+sub ood_output_all () {
+    my ($oodname, $ood);
+    foreach $oodname (reverse @oodnames) {
+       $ood= $ood{$oodname};
+       print $ood->{Data} or die $!;
+       if (defined $ood->{ArrayDelim}) {
+           print "\n};\n" or die $!;
+       }
+    }
+}
+
 sub plandata_output_all () {
     my ($i, @segnames, $segname);
-    my (@movfeats, $movfeat, $dname, $xpmname, $n_posns, $code, $posn, $mfd);
-    my ($n_movfeats, $xpmd);
+    my (@movfeats, $movfeat, $dname, $xpmname, $n_posns, $code, $posn);
+    my ($n_movfeats, $style, $xpmd, $pedge, $me, $noppdr);
+
     for ($i=1; $i<@segnum_name; $i++) {
-       next unless defined $segnum_name[$i];
-       push @segnames, $segnum_name[$i];
+       $segname= $segnum_name[$i];
+       next unless defined $segname;
+       push @segnames, $segname;
     }
-    for $segname (@segnames) {
-       if (!exists $movfeats{$segname}) {
-           @movfeats= ();
-       } else {
-           @movfeats= @{ $movfeats{$segname} };
-       }
+
+    oods('ui_plan_data',
+        "const PlanData ui_plan_data= {\n".
+        "  $sz{X}, $sz{Y},\n".
+        "  p_background_,\n".
+        "  ".scalar(@segnames).", segments\n".
+        "};\n");
+
+    ooda0('segments',
+         "static const PlanSegmentData segments");
+
+    foreach $segname (@segnames) {
+       @movfeats=
+           exists $movfeats{$segname} ? @{ $movfeats{$segname} } : ();
        unshift @movfeats, '';
-       $mfd= '';
+
+       ooda0("mf_$segname",
+             "static const PlanSegmovfeatData mf_$segname");
+
+       ooda1("segments",
+             "{ \"$segname\", ".scalar(@movfeats).", mf_$segname }");
+
        foreach $movfeat (@movfeats) {
            if (!length $movfeat) {
                $xpmname= $segname;
@@ -450,59 +564,35 @@ sub plandata_output_all () {
                $n_posns= $movfeat_configbits{$xpmname};
                $code= "\"$movfeat\"";
            }
-           printf("static const PlanPixmapOnData pon_%s[]= {\n",
-                  $xpmname)
-               or die $!;
+#print STDERR ">$segname|$movfeat<\n";
+           $noppdr= "{-1,-1,0}";
+           ooda1("mf_$segname",
+                 "{ $code, ".ppdr('bitmap',"bitmap","m_$xpmname").", ".
+                 ($n_posns > 1 ? ppdiondet("u_$xpmname") :
+                  "{ { $noppdr, $noppdr }, { $noppdr, $noppdr } }").
+                 ", $n_posns, posns_$xpmname }");
+
+           ooda0("posns_$xpmname",
+                 "static const PlanPixmapOnData posns_$xpmname");
+           
            for ($posn=0; $posn < $n_posns; $posn++) {
                if ($movfeat eq '') {
                    $dname= $segname;
+                   $pedge= 'edge';
                } else {
                    $dname= sprintf "%s_%s_%d", $segname, $movfeat, $posn;
+                   $pedge= 'pedge';
                }
-               printf("  { { { p_on_$dname, p_det_$dname },".
-                      " { p_ion_$dname, p_idet_$dname } } },\n")
-                   or die $!;
+               ooda1("posns_$xpmname",
+                     "{ ".ppdr('bitmap',"bitmap","e_$dname").",".
+                     " ".ppdiondet("_$dname")." }");
            }
-           printf("};\n")
-               or die $!;
-           $xpmd= $xpmdata{'off'}{"_$xpmname"};
-           $mfd .= sprintf("  { %s, %d,%d, p_off_%s, %d, pon_%s },\n",
-                           $code,
-                           $xpmd->{X}{Min}, $xpmd->{Y}{Min},
-                           $xpmname, $n_posns, $xpmname);
-       }
-       printf("static const PlanSegmovfeatData mf_%s[]= {\n".
-              "%s".
-              "};\n",
-              $segname, $mfd)
-           or die $!;
-    }
-    printf("static const PlanSegmentData segments[]= {\n")
-       or die $!;
-    for $segname (@segnames) {
-       if (exists $movfeats{$segname}) {
-           $n_movfeats= scalar(@{ $movfeats{$segname} })+1;
-       } else {
-           $n_movfeats= 1;
        }
-       printf("  { \"%s\", %d, mf_%s },\n",
-              $segname,
-              $n_movfeats,
-              $segname)
-           or die $!;
     }
-    printf("};\n")
-       or die $!;
-    printf("const PlanData ui_plan_data= {\n".
-          "  $sz{X}, $sz{Y},\n".
-          "  p_background,\n".
-          "  %d, segments\n".
-          "};\n",
-          scalar(@segnames))
-       or die $!;
 }
 
 print "#include \"plan-data-format.h\"\n" or die $!;
 cmapdata_output_all();
 xpmdata_output_all();
 plandata_output_all();
+ood_output_all();
index 60e864b78432a69174107947004b2b6e7673db47..13c0cc32d0ac1ba547340589ab5a475356ad5453 100755 (executable)
@@ -17,4 +17,7 @@ cat <<END
 %.pa.segenco.ppm:      compose-segenco $x
                        ./\$^ \$o
 
+%.plandata.c: plan-to-gui-data %.segcmap $x
+               ./\$^ \$o
+
 END