From: ian Date: Tue, 14 Jun 2005 23:53:00 +0000 (+0000) Subject: data output wip X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ijackson/git?a=commitdiff_plain;h=faa4d43cfe1bcc53f6825e5782db32b5051b1727;p=trains.git data output wip --- diff --git a/layout/plan-to-gui-data b/layout/plan-to-gui-data index 31fd5ee..4af00a8 100755 --- a/layout/plan-to-gui-data +++ b/layout/plan-to-gui-data @@ -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();