sub ang2pixchars ($) {
die if $datum_numbits{Angle} > 6;
-die if $_[0] > 64;
+ die if $_[0] > 64;
return substr('0123456789'.
'abcdefghijklmnopqrstuvwxyz'.
'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.
in_pixel();
}
}
+die if read ARGV,$_,1;
#---------- colourmaps ----------
-#xpm_cmap("on","on");
-#xpm_cmap("on","det");
-#xpm_cmap("on","ion");
-#xpm_cmap("on","idet");
+our (%cmap,%stylecmaps);
+# $stylecmaps{$style}= [ $cmapname,... ]
+# $cmap{$cmapname}{$pixchars}= $xpm_data_string_rhs
+# $cmap{$cmapname}{''}= [ string names for including in xpm ]
+# (after cmapdata_output_all)
+
+sub xpm_cmap ($$) {
+ my ($style,$cmapname) = @_;
+ push @{ $stylecmaps{$style} }, $cmapname;
+ $cmap{$cmapname}[0];
+}
+
+sub xpm_cmap_entry($$) {
+ my ($cmapname,$pixchars,$rhs) = @_;
+ die if exists $cmap{$cmapname}{$pixchars};
+ $cmap{$cmapname}{$pixchars}= $rhs;
+}
+
+sub xpm_cmap_rgbpermil($@) {
+ my ($cmapname, @l) = @_;
+ my ($pixchars, @rgb);
+ die if @l % 4;
+ while (@l) {
+ ($pixchars, @rgb)= @l[0..3]; @l = @l[4..];
+ xpm_cmap_entry($cmapname, $pixchars,
+ sprintf("c #%04x%04x%04x",
+ map { floor($_ * 65535.0 + 0.5) }
+ @rgv));
+ }
+}
+
+sub xpm_cmap_fixedbitmap($$) {
+ my ($cmapname,$on) = @_;
+ xpm_cmap_entry($cmapname,' ','s space');
+ xpm_cmap_entry($cmapname,$on,'s mark');
+}
sub angle_to_colour ($) {
my ($angle) = @_;
return @$R;
}
-sub ang_cmaps () {
- my ($ang);
- for ($ang=0; $ang<(1<<$datum_numbits{Angle}); $ang++) {
- #($ang+0.0) / 1<<$datum_numbits{Angle};
-
+sub xpm_cmap_angular($$$@) {
+ my ($cmapname, $invert, $alpha, @basergb) = @_;
+ my ($angnum,$angval);
+ for ($angnum=0; $angnum<(1<<$datum_numbits{Angle}); $angnum++) {
+ $angval= 6.0 * ($angnum+0.0) / 1<<$datum_numbits{Angle};
+ $angval += 3.0 if $invert;
+ @angrgb= angle_to_colour($angval);
+ for ($i=0; $i<3; $i++) {
+ $permil[$i]= $alpha * 1000.0 * $angrgb[$i] +
+ (1 - $alpha) * $basergb[$i];
+ }
+ xpm_cmap_rgbpermil(ang2pixchars($angnum), @permil);
+ }
+}
+
+sub cmaps_define () {
+ xpm_cmap("background","background");
+ xpm_cmap_rgbpermil("background",qw(- 100 100 100
+ + 999 0 999
+ ? 75 75 75
+ ! 999 0 999));
+ xpm_cmap("off","off");
+ xpm_cmap_fixedbitmap("off",'*');
+
+ foreach $inv (('','i')) {
+ foreach $ondet (qw(on det)) {
+ xpm_cmap("on","${inv}${ondet}");
+ xpm_cmap_rgbpermil("${inv}${ondet}",qw(- 300 300 300));
+ }
+ xpm_cmap_angular("${inv}on", !!$inv, 600, qw(0 0 0));
+ xpm_cmap_angular("${inv}det",!!$inv, 330, qw(1000 1000 1000));
}
}
#---------- output ----------
+sub cmapdata_output_all () {
+ my ($cmapname, $stuff);
+ foreach $cmapname (keys %cmap) {
+ $stuff= [ ];
+ $cmap= $cmap{$cmapname};
+ foreach $pixchars (keys %$cmap) {
+ $sname= "m_${cmapname}_". unpack "H*", $pixchars;
+ printf("static const char %s= \"%s %s\";\n",
+ $sname, $pixchars, $cmap->{$pixchars})
+ or die $!;
+ push @$stuff, $sname;
+ }
+ $cmap->{''}= $stuff;
+ }
+}
+
sub xpmdata_output_all () {
my ($style, $namerhs, $xp, $row, $pp, $xy, $pixel);
- foreach $style (sort keys %xpmdata) {
- foreach $namerhs (sort keys %{ $xpmdata{$style} }) {
+ foreach $namerhs (sort keys %{ $xpmdata{$style} }) {
+ foreach $style (sort keys %xpmdata) {
$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
$xp->{$xy}{Max} < $xp->{$xy}{Min};
+ $header_data .= $xp->{$xy}{Max} - $xp->{$xy}{Min} + 1;
+ $header_data .= " ";
}
for ($p{Y}=$xp->{Y}{Min}; $p{Y}<=$xp->{Y}{Max}; $p{Y}++) {
printf "static const char d%04d_%s%s= \"",
}
print "\";\n" or die $!;
}
+ foreach $cmapname (@{ $stylecmaps{$style} }) {
+ $cmap_data= $cmap{$cmapname};
+ printf("static const char *p_%s%s[]= {\n".
+ " \"%s%d 1\",\n",
+ $style, $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
+ or die $!;
+ }
+ print(" 0\n".
+ "};\n")
+ or die $!;
+ }
}
}
}
+cmapdata_output_all();
xpmdata_output_all();