From af5caa5c91e9dd4796eaeff24173811c2e5100df Mon Sep 17 00:00:00 2001 From: ian Date: Sat, 25 Jun 2005 21:01:48 +0000 Subject: [PATCH] can make ours.dgram-bot.plandata.c, which compiles, but: is too big (must arrange to trim), and driver program does not know about its changes --- layout/.cvsignore | 2 +- layout/layout | 105 ++++++----- layout/plan-data-format.h | 15 +- layout/plan-to-gui-data | 328 ++++++++++++++++++++++------------ layout/segencolayers.gen-make | 3 + 5 files changed, 285 insertions(+), 168 deletions(-) diff --git a/layout/.cvsignore b/layout/.cvsignore index 111d749..5a7f644 100644 --- a/layout/.cvsignore +++ b/layout/.cvsignore @@ -2,7 +2,7 @@ ours-*.ps *.dgram-*.p*.segenco.ps *.dgram-*.p*.segenco.ppm -ui-plan-*.c +*.dgram-*.plandata.c *.new *.segcmapreq *.segcmap diff --git a/layout/layout b/layout/layout index 7269eb2..2a52ac5 100755 --- a/layout/layout +++ b/layout/layout @@ -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); diff --git a/layout/plan-data-format.h b/layout/plan-data-format.h index e9ce03a..822e4db 100644 --- a/layout/plan-data-format.h +++ b/layout/plan-data-format.h @@ -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; diff --git a/layout/plan-to-gui-data b/layout/plan-to-gui-data index 9deb5d0..9ed28c7 100755 --- a/layout/plan-to-gui-data +++ b/layout/plan-to-gui-data @@ -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(); diff --git a/layout/segencolayers.gen-make b/layout/segencolayers.gen-make index 60e864b..13c0cc3 100755 --- a/layout/segencolayers.gen-make +++ b/layout/segencolayers.gen-make @@ -17,4 +17,7 @@ cat <