#!/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);
#---------- 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 ----------
# $movfeat_prefix{$xpmname}
# $movfeat_configbits{$xpmname}
-xpm_setup(Background,0);
+xpmdata_setup("background",'',0,0);
for (;;) {
$!=0; defined($_=<>) or die $!;
$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 ----------
# $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;
+ }
}
}
}
# $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);
((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;
}
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}++) {
}
}
+#---------- 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();