From: ian Date: Mon, 13 Jun 2005 22:18:16 +0000 (+0000) Subject: generates some actual data X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ijackson/git?a=commitdiff_plain;h=306b9a84eaf8ea76eaa8fc832b42af326246e160;p=trains.git generates some actual data --- diff --git a/layout/plan-to-gui-data b/layout/plan-to-gui-data index ddd877c..acfd2d7 100755 --- a/layout/plan-to-gui-data +++ b/layout/plan-to-gui-data @@ -1,4 +1,10 @@ #!/usr/bin/perl -w +# +# We make one set of xpms for every (segment,[movfeat]) +# For each (segment,[movfeat]) there is one `off' bitmap, a mask. +# For (segment,nil) there are also `on' and `detect' pixmaps. +# For (segment,movfeat) there are `on' and `detect' XPMs for each posn. +# (The `on' and `detect' XPMs share the actual pixel data.) use strict qw(vars); @@ -44,22 +50,24 @@ sub wns ($$$) { #---------- xpm data structure ---------- -our(%xpm); -# $xpm{$xpmname}{X}{Min} -# $xpm{$xpmname}{X}{Max} -# $xpm{$xpmname}{Y}{Min} -# $xpm{$xpmname}{Y}{Max} -# $xpm{$xpmname}{Holey} -# $xpm{$xpmname}{Pixels}{$x}{$y} +our(%xpmdata); +# $xpmdata{$style}{$namerhs}{X}{Min} +# $xpmdata{$style}{$namerhs}{X}{Max} +# $xpmdata{$style}{$namerhs}{Y}{Min} +# $xpmdata{$style}{$namerhs}{Y}{Max} +# $xpmdata{$style}{$namerhs}{Pixels}{$y}{$x} +# $xpmdata{$style}{$namerhs}{Holey} +# $xpmdata{$style}{$namerhs}{Partial} +# $xpminstance{$instancename}{Data}= $xpmname -sub xpm_setup ($$$) { - my ($xpmname, $partial, $holey)=@_; +sub xpmdata_setup ($$$$) { + my ($style, $namerhs, $holey, $partial)=@_; my ($xp,$xy); - die if $xpm{$xpmname}; - $xp= $xpm{$xpmname}= { Holey => $holey }; - if (!$partial) { - foreach $xy (qw(X Y)) { $xp->{$xy}{Min}= 0; } - } + die if $xpmdata{$style}{$namerhs}; + $xp= $xpmdata{$style}{$namerhs}= { + Holey => $holey, + Partial => $partial + }; } #---------- read segcmap ---------- @@ -73,7 +81,7 @@ our (@segnum_name,%movfeats,%movfeat_prefix,%movfeat_configbits); # $movfeat_prefix{$xpmname} # $movfeat_configbits{$xpmname} -xpm_setup(Background,0); +xpmdata_setup("background",'',0,0); for (;;) { $!=0; defined($_=<>) or die $!; @@ -84,18 +92,31 @@ for (;;) { $datum_basebit{$1}= $3; } elsif (m/^S ([0-9A-Z]+) (0x[0-9a-f]+)$/) { seteq(\$segnum_name[hex $2], $1, "segnum $2"); - xpm_setup($1,1); + xpmdata_setup("off","_$1",1,1); + xpmdata_setup("on","_$1",1,1); } elsif (m/^F ([0-9A-Z]+) (0x[0-9a-f]+) ([A-Z]+) (0x[0-9a-f]+) (\d+)$/) { - my ($xpmname); + my ($xpmname,$bitno); 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; - xpm_setup($xpmname,1); + xpmdata_setup("off","_$xpmname",1,1); + for ($bitno=0; $bitno<$movfeat_configbits{$xpmname}; $bitno++) { + xpmdata_setup("on","_${xpmname}_${bitno}",1,1); + } } } -die if $datum_numbits{Angle} > 7; + +sub ang2pixchars ($) { + die if $datum_numbits{Angle} > 6; +die if $_[0] > 64; + return substr('0123456789'. + 'abcdefghijklmnopqrstuvwxyz'. + 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'. + '@#', + $_[0], 1); +} #---------- read input image ---------- @@ -104,15 +125,18 @@ our(%sz); # $sz{Y} sub xpm_sizes () { - my ($xp,$xy); - foreach $xp (values %xpm) { - foreach $xy (qw(X Y)) { + my ($rr,$xp,$xy); + foreach $rr (values %xpmdata) { + foreach $xp (values %$rr) { + foreach $xy (qw(X Y)) { #print STDERR "xpms>$xpmname|$xy<\n"; - if (defined $xp->{$xy}{Min}) { - $xp->{$xy}{Max}= $sz{$xy}; - } else { - $xp->{$xy}{Min}= $sz{$xy}; - $xp->{$xy}{Max}= 0; + if ($xp->{Partial}) { + $xp->{$xy}{Min}= $sz{$xy}-1; + $xp->{$xy}{Max}= 0; + } else { + $xp->{$xy}{Min}= 0; + $xp->{$xy}{Max}= $sz{$xy}-1; + } } } } @@ -130,25 +154,23 @@ our(%p,$pp); # $p{X} # $p{Y} -sub xpm_pixel ($$) { - my ($xpmname,$pcharstr)=@_; +sub xpmdata_pixel ($$$) { + my ($style,$namerhs,$pcharstr)=@_; my ($xp,$pk,$xy); - $xp= $xpm{$xpmname}; - defined $xp or die "$pp $xpmname ?"; -#print STDERR "pk>",join('|',keys(%{$xpm{$xpmname}})),"<\n"; -#print STDERR "pk>",join('|',keys(%{$xpm{$xpmname}{X}})),"<\n"; + $xp= $xpmdata{$style}{$namerhs}; + defined $xp or die "$pp $style $namerhs ?"; foreach $xy (qw(X Y)) { -#print STDERR "xpmp>$pp|$xpmname|$xy<\n"; $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 defined $xp->{Pixels}{$p{X}}{$p{Y}}; - $xp->{Pixels}{$p{X}}{$p{Y}}= $pcharstr; +die "$pp ?" if $xp->{X}{Max} >= 642; + die "$pp ?" if defined $xp->{Pixels}{$p{Y}}{$p{X}}; + $xp->{Pixels}{$p{Y}}{$p{X}}= $pcharstr; } sub in_pixel () { my ($movfeat,%t,$xpmname,$segname,$datum,$k); - my ($datum_r,$datum_g,$datum_b); + my ($datum_r,$datum_g,$datum_b, $angstr,$bitno); $pp= "$p{X} $p{Y}"; ($datum_r,$datum_g,$datum_b)= wns(0,255,3); $datum= $datum_r + ($datum_g<<8) + ($datum_b<<16); @@ -157,20 +179,23 @@ sub in_pixel () { ((1 << $datum_numbits{$k}) - 1); } if ($datum == 0xffffffff or $t{Edge}) { - xpm_pixel('Background','-'); + xpmdata_pixel('background','','-'); return; } elsif (!$t{Segnum}) { - xpm_pixel('Background','?'); + xpmdata_pixel('background','','?'); return; } else { - xpm_pixel('Background','!'); + xpmdata_pixel('background','','!'); } $segname= $segnum_name[$t{Segnum}]; defined $segname or die "$pp $t{Segnum}"; $pp.= " $segname"; + $angstr= ang2pixchars($t{Angle}); + if (!$t{Movfeatpos}) { $xpmname= $segname; + xpmdata_pixel("on","_$xpmname", $angstr); } else { my ($found); $found= undef; @@ -185,10 +210,12 @@ sub in_pixel () { } die "$pp $t{Movfeatpos}" unless defined $found; - fixme need off, on for each pos and detect for each pos + for ($bitno=0; $bitno < $movfeat_configbits{$xpmname}; $bitno++) { + xpmdata_pixel("on","_${xpmname}_${bitno}", + ((1<<$bitno) & $t{Movfeatpos}) ? $angstr : '-'); + } } - xpm_pixel($xpmname, sprintf("\\x%02x", $t{Angle} + 0x80)); - fixme actually need off, on and detect; + xpmdata_pixel("off","_$xpmname", '*'); } for ($p{Y}=0; $p{Y}<$sz{Y}; $p{Y}++) { @@ -198,23 +225,49 @@ for ($p{Y}=0; $p{Y}<$sz{Y}; $p{Y}++) { } } +#---------- colourmaps ---------- + +#xpm_cmap("on","on"); +#xpm_cmap("on","det"); +#xpm_cmap("on","ion"); +#xpm_cmap("on","idet"); + +sub ang_cmaps () { + my ($ang); + for ($ang=0; $ang<(1<<$datum_numbits{Angle}); $ang++) { + } +} + #---------- output ---------- -sub xpm_output_all () { - my ($xpmname, $xp); - foreach $xpmname (keys %xpm) { - $xp= $xpm{$xpmname}; - foreach $xy (qw(X Y)) { - $xp->{$xy}{Max}= $xp->{$xy}{Min} if - $xp->{$xy}{Max} < $xp->{$xy}{Min}; - } - for ($p{Y}=$xp->{Y}{Min}; $p{Y}<=$xp->{Y}{Max}; $p{Y}++) { - print " \"" or die $!; - for ($p{X}=$xp->{X}{Min}; $p{X}<=$xp->{X}{Max}; $p{X}++) { - $pp= "$xpmname $p{X} $p{Y}"; - $pixel= $xp->{Pixels}{$p{X}}{$p->{Y}}; - if (!defined $pixel) { - die "$xpmname" if !$p->{Holey}; - $pixel= ' '; +sub xpmdata_output_all () { + my ($style, $namerhs, $xp, $row, $pp, $xy, $pixel); + foreach $style (sort keys %xpmdata) { + foreach $namerhs (sort keys %{ $xpmdata{$style} }) { + $xp= $xpmdata{$style}{$namerhs}; +die "$pp ?" if $xp->{X}{Max} >= 642; + foreach $xy (qw(X Y)) { + $xp->{$xy}{Max}= $xp->{$xy}{Min} if + $xp->{$xy}{Max} < $xp->{$xy}{Min}; + } + for ($p{Y}=$xp->{Y}{Min}; $p{Y}<=$xp->{Y}{Max}; $p{Y}++) { + 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}; + $pixel= ' '; + } + print $pixel or die $!; } - fixme finish here; + print "\";\n" or die $!; + } + } + } +} + +xpmdata_output_all();