From: ian Date: Wed, 15 Jun 2005 17:56:48 +0000 (+0000) Subject: output wip X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ijackson/git?a=commitdiff_plain;h=13aa9c72d765fc8c7d3a2ee8ba78463ac6655136;p=trains.git output wip --- diff --git a/layout/plan-data-format.h b/layout/plan-data-format.h new file mode 100644 index 0000000..dde5ee9 --- /dev/null +++ b/layout/plan-data-format.h @@ -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*/ diff --git a/layout/plan-to-gui-data b/layout/plan-to-gui-data index bd7677f..ed38b03 100755 --- a/layout/plan-to-gui-data +++ b/layout/plan-to-gui-data @@ -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(); diff --git a/layout/redactgraph.c b/layout/redactgraph.c index 9900e7e..6fc1185 100644 --- a/layout/redactgraph.c +++ b/layout/redactgraph.c @@ -31,8 +31,6 @@ * are often useful. */ -#define _GNU_SOURCE - #include #include #include diff --git a/layout/subseg2display.c b/layout/subseg2display.c index 7bbf942..0e260b8 100644 --- a/layout/subseg2display.c +++ b/layout/subseg2display.c @@ -28,6 +28,9 @@ * All of alpha, red, green, blue are out of 1000. */ + +#include + #include #include #include @@ -35,7 +38,6 @@ #include #include -#include #include #include "segcmap.h"