chiark / gitweb /
output wip
authorian <ian>
Wed, 15 Jun 2005 17:56:48 +0000 (17:56 +0000)
committerian <ian>
Wed, 15 Jun 2005 17:56:48 +0000 (17:56 +0000)
layout/plan-data-format.h [new file with mode: 0644]
layout/plan-to-gui-data
layout/redactgraph.c
layout/subseg2display.c

diff --git a/layout/plan-data-format.h b/layout/plan-data-format.h
new file mode 100644 (file)
index 0000000..dde5ee9
--- /dev/null
@@ -0,0 +1,28 @@
+/**/
+
+#ifndef PLAN_DATA_FORMAT_H
+#define PLAN_DATA_FORMAT_H
+
+typedef struct {
+  PlanPixmapDataRef a[2/*i*/][2/*det*/];
+} PlanPixmapOnData;
+
+typedef struct {
+  unsigned long code;
+  int n_posns;
+  const PlanPixmapOnData *posns;
+} PlanSegmovfeatData;
+
+typedef struct {
+  PlanPixmapDataRef off;
+  int n_movfeats;
+  PlanSegmovfeatData *movfeats;
+} PlanSegmentData;
+
+typedef struct {
+  PlanPixmapDataRef background;
+  int n_segments;
+  const PlanSegmentData *segments;
+} PlanData;
+
+#endif /*PLAN_DATA_FORMAT_H*/
index bd7677fd6d67efd7d68248359b3ac91fd89dedac..ed38b03f66dcc825ee30e8e7116a17d83513c3d2 100755 (executable)
@@ -7,6 +7,7 @@
 # (The `on' and `detect' XPMs share the actual pixel data.)
 
 use strict qw(vars);
+use POSIX;
 
 #---------- general ----------
 
@@ -244,8 +245,9 @@ our (%cmap,%stylecmaps);
 
 sub xpm_cmap ($$) {
     my ($style,$cmapname) = @_;
+    die if exists $cmap{$cmapname};
     push @{ $stylecmaps{$style} }, $cmapname;
-    $cmap{$cmapname}[0];
+    $cmap{$cmapname}= { };
 }
 
 sub xpm_cmap_entry ($$$) {
@@ -257,12 +259,12 @@ 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));
     }
 }
 
@@ -284,6 +286,8 @@ sub angle_to_colour ($) {
     $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 ],
@@ -298,14 +302,16 @@ sub xpm_cmap_angular($$$@) {
     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);
     }
 }
 
@@ -330,14 +336,16 @@ sub cmaps_define () {
     }
 }
 
+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})
@@ -378,11 +386,11 @@ die "$pp ?" if $xp->{X}{Max} >= 642;
                }
                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;
@@ -398,5 +406,78 @@ die "$pp ?" if $xp->{X}{Max} >= 642;
     }
 }
 
+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();
index 9900e7edeccd82788b7c9ed4488eadc8346435b4..6fc11854f4c6d74cfbfdeb6a426ecfe04eabb0df 100644 (file)
@@ -31,8 +31,6 @@
  * are often useful.
  */
 
-#define _GNU_SOURCE
-
 #include <stdarg.h>
 #include <string.h>
 #include <stdlib.h>
index 7bbf9428a51f045544e66c0739c83343c7a735ec..0e260b8272ff4b300a29e82f89fceb228b2c036c 100644 (file)
@@ -28,6 +28,9 @@
  * All of alpha, red, green, blue are out of 1000.
  */
 
+
+#include <publib.h>
+
 #include <stdio.h>
 #include <string.h>
 #include <stdlib.h>
@@ -35,7 +38,6 @@
 #include <assert.h>
 #include <math.h>
 
-#include <publib.h>
 #include <ppm.h>
 
 #include "segcmap.h"