chiark / gitweb /
commitid.scad.pl: more wip
[reprap-play.git] / commitid.scad.pl
1 #!/usr/bin/perl -w
2 use strict;
3
4 $SIG{__WARN__} = sub { die @_; };
5
6 #  xxx much of the comment below is TODO
7
8 # We generate a physical indication of which commit was used.
9 #
10 # We provide for a scaling factor
11 #
12 #    $Commitid_pixelsz = 0.4;
13 #    $Commitid_depth = 1.5; // in pixels
14 #
15 # For each form we have
16 #
17 #    module Commitid_Form_2D(pixelsz=0.4)
18 #    module Commitid_Form(pixelsz=0.4, depth=pixelsz)
19 #
20 #    function Commitid_Form_size(pixelsz=$Commitid_pixelsz) => [ xsz, ysz ]
21 #         
22 #
23 # We can generate these forms:
24 #
25 #   Tiny3:
26 #   Tiny4:
27 #   Tiny5:
28 #   Tiny6:
29 #   Tiny7:
30 #   Tiny8:
31 #       git rev-list --first-parent --count HEAD
32 #       typically 3-4 characters but we allow for up to 6
33 #       eg
34 #            Tiny4    1070
35 #
36 #   Tiny4Q:
37 #   Tiny6Q:
38 #   Tiny9Q:
39 #       same but in two lines eg
40 #            Tiny4Q   10
41 #                     70
42 #
43 #   Git4
44 #   Git6
45 #   Git8
46 #       git-rev-parse HEAD
47 #       eg
48 #            Git6    82f2a2
49
50 #   Small4
51 #   Small6
52 #   Small8
53 #       git-rev-list --first-parent --count HEAD
54 #       git-rev-parse HEAD
55 #       eg
56 #            Small6     1070
57 #                     82f2a2
58
59 sub p { print @_ or die $!; }
60
61 sub parsefont () {
62     my %cellmap;
63     for (;;) {
64         $_ = <DATA> // die;
65         last if %cellmap && !m/\S/;
66         next unless m/\S/;
67         chomp;
68         s{^(.) }{};
69         $cellmap{$1} = $_;
70     }
71     my %chrpolys;
72     while (<DATA>) {
73         next unless m/\S/;
74         my @chrs = split / /, $_;
75         <DATA> !~ m/\S/ or die;
76         foreach my $row (reverse 0..4) {
77             $_ = <DATA>;
78             chomp;
79             s{^}{ };
80             $_ .= ' ' x 8;
81             m{\S/\S} and die;
82             s{/(?=\s)}{L}g;
83             s{/(?=\S)}{r}g;
84             s{\\(?=\s)}{l}g;
85             s{\\(?=\S)}{R}g;
86             p "// $_\n";
87             foreach my $chr (@chrs) {
88                 s{^ }{} or die "$chr $_ ?";
89                 foreach my $col (0..2) {
90                     my @verts;
91                     if (s{^ }{}) {
92                     } elsif (s{^\S}{}) {
93                         my $f = $cellmap{$&};
94                         die unless $f;
95                         $f =~ s/\b\d/ sprintf '%05d', $col*4000 + $&*2001 /ge;
96                         $f =~ s/\d\b/ sprintf '%05d', $row*4000 + $&*2001 /ge;
97                         push @{ $chrpolys{$chr} }, [ split / /, $f ];
98                     } else {
99                         die "$_ ?";
100                     }
101                 }
102             }
103             die "$_ ?" if m{\S};
104         }    
105     }
106
107     my @demo;
108     my $democols = 6;
109     foreach my $chr (sort keys %chrpolys) {
110         my $chrx = sprintf '%#x', ord $chr;
111         my $mod = "Commitid__chr_$chrx";
112         p "module $mod () {\n";
113         foreach my $poly (@{ $chrpolys{$chr} }) {
114             p " polygon([";
115             my $delim = "";
116             foreach my $pt (@$poly) {
117                 p $delim;
118                 $pt =~ s{\d{5}}{$&,};
119                 $pt =~ s{\b\d}{$&.}g;
120                 p "[$pt]";
121                 $delim = ',';
122             }
123             p "]);\n";
124         }
125         p "}\n";
126         my $px = @demo % $democols;
127         my $py = int(@demo / $democols);
128         push @demo, " translate([$px * 1.600, $py * 2.400]) $mod ();\n";
129     }
130     p "module Commitid_FontDemo(){\n";
131     p $_ foreach @demo;
132     p "}\n";
133
134 #    use Data::Dumper;
135 #    print Dumper(\%chrpolys);
136 }
137
138 parsefont();
139
140 #p "Commitid_FontDemo();\n";
141
142 __DATA__
143
144 # 00 20 22 02
145 l 00 20 02
146 r 00 20 22
147 L 00 22 02
148 R 20 22 02
149 > 00 20 22 02 11
150 < 00 20 11 22 02
151
152 0 1 2 3 4 5 6 7 8 9
153
154 /#\  r  /#\ ##\ # # ### //  ### /#\ /#\
155 # # /#    #   # # # #   #     # # # # #
156 #r#  #  /#/ ##< \## ##\ ##\  // >#< \##
157 # #  #  #     #   #   # # #  #  # #   #
158 \#/ /#\ ### ##/   # ##/ \#/  #  \#/ ##/
159
160 a b c d e f
161
162     #         #     /##
163 /## ##\ /## /## /#\ #
164 # # # # #   # # #r/ ###
165 # # # # #   # # #/  #
166 \## ##/ \## \## \#/ #
167