chiark / gitweb /
commitid.scad.pl: Generate 2D name inside gentextmodule; docs
[reprap-play.git] / commitid.scad.pl
index 72ab7144ba3480bd6cd5a87346a9c67584797b9f..fbf1231597968fa1cd5bd2de847f2a8992956148 100755 (executable)
@@ -3,9 +3,31 @@ use strict;
 
 $SIG{__WARN__} = sub { die @_; };
 
+#  xxx much of the comment below is TODO
+
 # We generate a physical indication of which commit was used.
 #
-# We can generate three forms:
+# We provide for scaling factors with dynamic variables:
+#    $Commitid_pixelsz        if not set, we use 0.4 } multiplied
+#    $Commitid_scale          if not set, we use 1.0 }  together
+#    $Commitid_depth          if not set, we use xy pixel size from above
+#    $Commitid_depth_scale    if not set, we use 1.0 (multiplies depth above)
+#
+# For each form we have
+#
+#    module Commitid_Form_2D() { ... }
+#    module Commitid_Form() { ... }
+#
+#  These have their origin in the bottom left corner.  The 3D model
+#  is a positive, has its origin halfway through, and is twice the
+#  depth in height, so it can be added or subtracted.
+#
+# And we provide
+#
+#   function Commitid_pixelsz()    // $Commitid_pixelsz * $Commitid_scale
+#   function Commitid_depth()      // see above
+#
+# We can generate these forms:
 #
 #   Tiny3:
 #   Tiny4:
@@ -25,6 +47,13 @@ $SIG{__WARN__} = sub { die @_; };
 #            Tiny4Q   10
 #                     70
 #
+#   Git4
+#   Git6
+#   Git8
+#       git-rev-parse HEAD
+#       eg
+#            Git6    82f2a2
+
 #   Small4
 #   Small6
 #   Small8
@@ -34,9 +63,52 @@ $SIG{__WARN__} = sub { die @_; };
 #            Small6     1070
 #                     82f2a2
 
+sub p { print @_ or die $!; }
+
+p <<'END';
+// *** AUTOGENERATED - DO NOT EDIT *** //
+function Commitid_pixelsz() =
+  ($Commitid_pixelsz       ? $Commitid_pixelsz       : 0.4) *
+  ($Commitid_scale         ? $Commitid_scale         : 1.0);
+function Commitid_depth() =
+  ($Commitid_depth         ? $Commitid_depth         : Commitid_pixelsz()) *
+  ($Commitid_depth_scale   ? $Commitid_depth_scale   : 1.0);
+function Commitid__scale() =
+  Commitid_pixelsz() / 0.1;
+END
+
+sub chrmodname ($) {
+    my ($chr) = @_;
+    my $chrx = sprintf '%#x', ord $chr;
+    return "Commitid__chr_$chrx";
+}
+
+sub gentextmodule ($@) {
+    my ($form, @lines) = @_;
+    my $modb = "Commitid_$form";
+    p "module ${modb}_2D(){\n";
+    p " scale(Commitid__scale()){\n";
+    my $y = @lines;
+    foreach my $line (@lines) {
+       $y--;
+       my $x = 0;
+       foreach my $chr (split //, $line) {
+           next if $chr !~ m/\S/;
+           p sprintf "  translate([%d * 0.8, %d * 1.2]) %s();\n",
+               $x, $y, chrmodname $chr;
+           $x++;
+       }
+    }
+    p " }\n";
+    p "}\n";
+}
+
+our @demo;
+
 sub parsefont () {
     my %cellmap;
-    while (<DATA>) {
+    for (;;) {
+       $_ = <DATA> // die;
        last if %cellmap && !m/\S/;
        next unless m/\S/;
        chomp;
@@ -46,18 +118,20 @@ sub parsefont () {
     my %chrpolys;
     while (<DATA>) {
        next unless m/\S/;
+       chomp;
        my @chrs = split / /, $_;
        <DATA> !~ m/\S/ or die;
-       foreach my $row (0..4) {
+       foreach my $row (reverse 0..4) {
            $_ = <DATA>;
            chomp;
            s{^}{ };
-           $_ .= ' ' x (@chrs * 4);
+           $_ .= ' ' x 8;
            m{\S/\S} and die;
            s{/(?=\s)}{L}g;
            s{/(?=\S)}{r}g;
            s{\\(?=\s)}{l}g;
            s{\\(?=\S)}{R}g;
+           p "// $_\n";
            foreach my $chr (@chrs) {
                s{^ }{} or die "$chr $_ ?";
                foreach my $col (0..2) {
@@ -66,8 +140,8 @@ sub parsefont () {
                    } elsif (s{^\S}{}) {
                        my $f = $cellmap{$&};
                        die unless $f;
-                       $f =~ s/\b\d/ sprintf '%x', $col*2 + $& /ge;
-                       $f =~ s/\d\b/ sprintf '%x', $row*2 + $& /ge;
+                       $f =~ s/\b\d/ sprintf '%05d', $col*2000 + $&*1025 /ge;
+                       $f =~ s/\d\b/ sprintf '%05d', $row*2000 + $&*1025 /ge;
                        push @{ $chrpolys{$chr} }, [ split / /, $f ];
                    } else {
                        die "$_ ?";
@@ -77,18 +151,39 @@ sub parsefont () {
            die "$_ ?" if m{\S};
        }    
     }
-                   
-    use Data::Dumper;
-    print Dumper(\%chrpolys);
+
+    my $demo = '';
+    my $democols = 6;
+    foreach my $chr (sort keys %chrpolys) {
+       my $mod = chrmodname $chr;
+       p "module $mod () {\n";
+       foreach my $poly (@{ $chrpolys{$chr} }) {
+           p " polygon([";
+           my $delim = "";
+           foreach my $pt (@$poly) {
+               p $delim;
+               $pt =~ s{\d{5}}{$&,};
+               $pt =~ s{\b\d}{$&.}g;
+               p "[$pt]";
+               $delim = ',';
+           }
+           p "]);\n";
+       }
+       p "}\n";
+       $demo .= $chr;
+    }
+    @demo = reverse $demo =~ m{.{1,$democols}}go;
 }
 
 parsefont();
 
+gentextmodule('FontDemo', @demo);
+
 __DATA__
 
 # 00 20 22 02
-l 00 20 22
-r 00 20 02
+l 00 20 02
+r 00 20 22
 L 00 22 02
 R 20 22 02
 > 00 20 22 02 11
@@ -96,17 +191,17 @@ R 20 22 02
 
 0 1 2 3 4 5 6 7 8 9
 
-/#\  #  ##\ ##\ # # ### /## ### /#\ /#\
-# #  #    #   # # # #   #     # # # # #
-# #  #  /#/ ### ### ##\ ##\  // >#< \##
+/#\  r  /#\ ##\ # # ### //  ### /#\ /#\
+# # /#    #   # # # #   #     # # # # #
+# #  #  /#/ ##< \## ##\ ##\  // >#< \##
 # #  #  #     #   #   # # #  #  # #   #
-\#/  #  ### ##/   # ##/ \#/  #  \#/ ##/
+\#/ /#\ ### ##/   # ##/ \#/  #  \#/ ##/
 
 a b c d e f
 
     #         #     /##
-/## ##\ /## /## /## #
-# # # # #   # # # # ###
+    #   /##   # /#\ #
+/## ##\ #   /## #r# ###
 # # # # #   # # #/  #
-\## ##/ \## \## ### #
+\## ##/ \## \## \#/ #