chiark / gitweb /
generates some actual data
authorian <ian>
Mon, 13 Jun 2005 22:18:16 +0000 (22:18 +0000)
committerian <ian>
Mon, 13 Jun 2005 22:18:16 +0000 (22:18 +0000)
layout/plan-to-gui-data

index ddd877cb4aaaf7f6580accf6c5d27434b26b0a82..acfd2d71f34707a86ce40f4ad6f6a0a38d0033ff 100755 (executable)
@@ -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();