chiark / gitweb /
data output wip
authorian <ian>
Tue, 14 Jun 2005 23:53:00 +0000 (23:53 +0000)
committerian <ian>
Tue, 14 Jun 2005 23:53:00 +0000 (23:53 +0000)
layout/plan-to-gui-data

index 31fd5eefa6bbe9ab899455dab365c4ef7c895623..4af00a8faa6b8fcb1e8b40feefacde2bcd63a05a 100755 (executable)
@@ -111,7 +111,7 @@ for (;;) {
 
 sub ang2pixchars ($) {
     die if $datum_numbits{Angle} > 6;
-die if $_[0] > 64;
+    die if $_[0] > 64;
     return substr('0123456789'.
                  'abcdefghijklmnopqrstuvwxyz'.
                  'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.
@@ -232,13 +232,46 @@ for ($p{Y}=0; $p{Y}<$sz{Y}; $p{Y}++) {
        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) = @_;
@@ -262,25 +295,70 @@ sub angle_to_colour ($) {
     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= \"",
@@ -298,8 +376,25 @@ die "$pp ?" if $xp->{X}{Max} >= 642;
                }
                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();