# (The `on' and `detect' XPMs share the actual pixel data.)
use strict qw(vars);
+use POSIX;
#---------- general ----------
sub xpm_cmap ($$) {
my ($style,$cmapname) = @_;
+ die if exists $cmap{$cmapname};
push @{ $stylecmaps{$style} }, $cmapname;
- $cmap{$cmapname}[0];
+ $cmap{$cmapname}= { };
}
sub xpm_cmap_entry ($$$) {
sub xpm_cmap_rgbpermil($@) {
my ($cmapname, @l) = @_;
my ($pixchars, @rgb);
- die if @l % 4;
+ die "$cmapname @l" if @l % 4;
while (@l) {
($pixchars, @rgb)= @l[0..3]; @l = @l[4..$#l];
xpm_cmap_entry($cmapname, $pixchars,
sprintf("c #%04x%04x%04x",
- map { floor($_ * 65535.0 + 0.5) } @rgb));
+ map { floor($_ * 65.535 + 0.5) } @rgb));
}
}
$d= 0.5 - $u;
$D= $d + 0.5;
+#print STDERR "a>$u|$U|$d|$D|$s<\n";
+
$R= ([ $D, $U, 0 ],
[ $d, 1, $u ],
[ 0, $D, $U ],
my ($cmapname, $invert, $alpha, @basergb) = @_;
my ($angnum,$angval,@permil,@angrgb,$i);
for ($angnum=0; $angnum<(1<<$datum_numbits{Angle}); $angnum++) {
- $angval= 6.0 * ($angnum+0.0) / 1<<$datum_numbits{Angle};
+ $angval= 6.0 * ($angnum+0.0) / (1<<$datum_numbits{Angle});
$angval += 3.0 if $invert;
+ $angval -= 6.0 if $angval >= 6.0;
@angrgb= angle_to_colour($angval);
for ($i=0; $i<3; $i++) {
- $permil[$i]= $alpha * 1000.0 * $angrgb[$i] +
- (1 - $alpha) * $basergb[$i];
+#print STDERR ">$cmapname|$i|$alpha|$angrgb[$i]|$basergb[$i]<\n";
+ $permil[$i]= $alpha * $angrgb[$i] +
+ (1.0 - $alpha/1000.0) * $basergb[$i];
}
- xpm_cmap_rgbpermil(ang2pixchars($angnum), @permil);
+ xpm_cmap_rgbpermil($cmapname, ang2pixchars($angnum), @permil);
}
}
}
}
+cmaps_define();
+
#---------- output ----------
sub cmapdata_output_all () {
my ($cmapname, $stuff, $cmap, $sname, $pixchars);
- foreach $cmapname (keys %cmap) {
+ foreach $cmapname (sort keys %cmap) {
$stuff= [ ];
$cmap= $cmap{$cmapname};
- foreach $pixchars (keys %$cmap) {
+ foreach $pixchars (sort keys %$cmap) {
$sname= "m_${cmapname}_". unpack "H*", $pixchars;
printf("static const char %s= \"%s %s\";\n",
$sname, $pixchars, $cmap->{$pixchars})
}
print "\";\n" or die $!;
}
- foreach $cmapname (@{ $stylecmaps{$style} }) {
- $cmap_data= $cmap{$cmapname};
+ foreach $cmapname (sort @{ $stylecmaps{$style} }) {
+ $cmap_data= $cmap{$cmapname}{''};
printf("static const char *p_%s%s[]= {\n".
" \"%s%d 1\",\n",
- $style, $namerhs,
+ $cmapname, $namerhs,
$header_data, scalar(@$cmap_data))
or die $!;
map { printf " %s,\n", $_ or die $!; } @$cmap_data;
}
}
+sub plandata_output_all () {
+ my ($i, @segnames, $segname);
+ my (@movfeats, $movfeat, $dname, $xpmname, $n_posns, $code, $posn, $mfd);
+ for ($i=1; $i<@segnum_name; $i++) {
+ next unless defined $segnum_name[$i];
+ push @segnames, $segnum_name[$i];
+ }
+ for $segname (@segnames) {
+ if (!exists $movfeats{$segname}) {
+ @movfeats= ();
+ } else {
+ @movfeats= @{ $movfeats{$segname} };
+ }
+ unshift @movfeats, '';
+ $mfd= '';
+ foreach $movfeat (@movfeats) {
+ if (!length $movfeat) {
+ $xpmname= $segname;
+ $n_posns= 1;
+ $code= 0;
+ } else {
+ $xpmname= "${segname}_${movfeat}";
+ $n_posns= $movfeat_configbits{$xpmname};
+ $code= $movfeat_prefix{$xpmname};
+ }
+ printf("const PlanPixmapOnData pon_%s[]= {\n",
+ $xpmname)
+ or die $!;
+ for ($posn=0; $posn < $n_posns; $posn++) {
+ if ($movfeat eq '') {
+ $dname= sprintf "_%s", $segname;
+ } else {
+ $dname= sprintf "_%s_%s_%d", $segname, $movfeat, $posn;
+ }
+ printf(" { on_$dname, det_$dname,".
+ " ion_$dname, idet_$dname },\n")
+ or die $!;
+ }
+ printf(" 0\n".
+ "};\n")
+ or die $!;
+ $mfd .= sprintf(" { 0x%x, %d, pon_%s },\n",
+ $code, $n_posns, $xpmname);
+ }
+ printf("const PlanSegmovfeatData mf_%s[]= {\n".
+ "%s".
+ " 0\n".
+ "};\n",
+ $segname, $mfd)
+ or die $!;
+ }
+ for $segname (@segnames) {
+ if (exists $movfeats{$segname}) {
+ printf(" { %d, mf_%s },\n",
+ scalar(@{ $movfeats{$segname} })+1, $segname)
+ or die $!;
+ } else {
+ printf(" { 1, mf_%s },\n", $segname)
+ or die $!;
+ }
+ }
+ printf(" { -1, 0 }\n".
+ "};\n")
+ or die $!;
+ printf("const PlanData ui_plan_data= {\n".
+ " p_background,\n".
+ " %d, segments\n".
+ "}\n",
+ scalar(@segnames))
+ or die $!;
+}
+
cmapdata_output_all();
xpmdata_output_all();
+plandata_output_all();