chiark / gitweb /
commitid: In Small, include commitid if it fits
[reprap-play.git] / commitid.scad.pl
index 053bcc32f91fe6f7d5051cd26edfb4fed785df08..cfb31f849f85c005f6214d8527a120b4b8a52da8 100755 (executable)
@@ -34,6 +34,7 @@ $SIG{__WARN__} = sub { die @_; };
 #    $Commitid_scale          if not set, we use 1.0 }  together
 #    $Commitid_depth          if not set, we use xy pixel size from above / 2
 #    $Commitid_depth_scale    if not set, we use 1.0 (multiplies depth above)
+#    $Commitid_max_best_scale if not set, we use 2.0 (max mult of xy in Best)
 #
 # For each form we have
 #
@@ -65,6 +66,9 @@ $SIG{__WARN__} = sub { die @_; };
 #       eg if the count is 123456
 #            Small5    3456*
 #            Small8    __123456    (where _ are spaces)
+#       the git objectid is included if it will fit
+#       unambiguously and usefully eg
+#            Small9    ab*123456
 #
 #   Small2S Small4S ... Small10S:
 #   Small3T Small9T:
@@ -80,9 +84,10 @@ $SIG{__WARN__} = sub { die @_; };
 #       eg if the commitid is abcdef0123...
 #            Git5    abcd*
 
-#   Full4 Full6 ... Full10:
+#   Full4 Full6 ... Full20:
 #       git-rev-list --first-parent --count HEAD
 #       git-rev-parse HEAD
+#       (all on two lines)
 #       eg
 #            Full6    abcdef       Full8     abcdef01
 #                     23456*                 _123456*
@@ -247,6 +252,8 @@ our $do_git; # contains may chars 'c' (count) and/or 'o' (object)
 our $do_git_untracked = 1;
 our $argcounter;
 
+our @forms;
+
 sub rjustt ($$;$) { # right justify and truncate (ie, pad and truncate at left)
                     # always includes prefix
     my ($sz, $whole, $prefix) = @_;
@@ -266,7 +273,19 @@ sub ljustt ($$;$) {
     return sprintf "%-${sz}.${sz}s%s", $whole, $suffix;
 }
 
-sub gentextmodule_q ($$$) {
+sub genform ($@) {
+    my ($form, @lines) = @_;
+    gentextmodule($form, @lines);
+    my $f = {
+       Form => $form,
+       Chars => (length join '', @lines),
+       Lines => (scalar @lines),
+       Ambiguous => ($form =~ m/Full/ && !grep { m/\W/ } @lines),
+    };
+    push @forms, $f;
+}
+
+sub genform_q ($$$) {
     my ($form, $s, $lines) = @_;
     $gtm_demo_j++;
     my $l = length $s;
@@ -274,14 +293,14 @@ sub gentextmodule_q ($$$) {
     my $e = $l/$lines;
     return if $e < 2;
     $gtm_demo_j--;
-    gentextmodule($form, $s =~ m/.{$e}/g);
+    genform($form, $s =~ m/.{$e}/g);
 }
 
-sub gentextmodule_plusq ($$) {
+sub genform_plusq ($$) {
     my ($form, $s) = @_;
-    gentextmodule($form, $s);
-    gentextmodule_q("${form}S", $s, 2);
-    gentextmodule_q("${form}T", $s, 3);
+    genform($form, $s);
+    genform_q("${form}S", $s, 2);
+    genform_q("${form}T", $s, 3);
 }
 
 our @gcmd;
@@ -340,25 +359,94 @@ sub do_git () {
     foreach my $sz (2..10) {
        gentextmodule_demo_start_batch();
 
-       gentextmodule_plusq("Small$sz", rjustt($sz, $git_count, $git_dirty))
-           if defined $git_count;
+       if (defined($git_count)) {
+           my $smallstr = rjustt($sz, $git_count, $git_dirty);
+           if (defined($git_object) && $sz >= length($git_count) + 3) {
+               $smallstr = $git_object;
+               $smallstr .= ($git_dirty || ' ');
+               $smallstr .= $git_count;
+               $smallstr = rjustt($sz, $smallstr);
+           }
+           genform_plusq("Small$sz", $smallstr);
+       }
 
-       gentextmodule_plusq("Git$sz", ljustt($sz, $git_object, $git_dirty))
+       genform_plusq("Git$sz", ljustt($sz, $git_object, $git_dirty))
            if defined $git_object;
 
        if (defined $git_count && defined $git_object) {
-           gentextmodule("Full$sz",
-                         ljustt($sz, $git_object),
-                         rjustt($sz, $git_count, $git_dirty));
+           genform("Full".($sz*2),
+                   ljustt($sz, $git_object),
+                   rjustt($sz, $git_count, $git_dirty));
 
            my $e = $sz;
-           gentextmodule("Full".($e*3)."T",
-                         ljustt($e*2, $git_object, $git_dirty)
-                         =~ m/.{$e}/g,
-                         rjustt($e, $git_count));
+           genform("Full".($e*3)."T",
+                   ljustt($e*2, $git_object, $git_dirty)
+                   =~ m/.{$e}/g,
+                   rjustt($e, $git_count));
        }
     }
-}    
+}
+
+sub do_some_best ($$) {
+    my ($modname, $formre) = @_;
+    my $fullmodname = "Commitid_${modname}_2D";
+    p "module $fullmodname(max_sz) {\n";
+    p ' sc_max = $Commitid_max_best_scale ? $Commitid_max_best_scale : 2;'."\n";
+    my @do;
+    foreach my $f (
+        sort {
+           $b->{Chars} <=> $a->{Chars} or
+           $a->{Lines} <=> $b->{Chars}
+        }
+        grep {
+           $_->{Form} =~ m/$formre/ &&
+           !$_->{Ambiguous}
+       }
+        @forms
+    ) {
+       my $form = $f->{Form};
+       p " sz_$form = Commitid_${form}_sz();\n";
+       foreach my $rot (qw(0 1)) {
+           my $id = "${form}_r${rot}";
+           p " sc_$id = min(sc_max";
+           foreach my $xy (qw(0 1)) {
+               p ",max_sz[$xy]/sz_$form","[",(($xy xor $rot)+0),"]";
+           }
+           p ");\n";
+           push @do, " if (sc_$id >= 1.0) {\n";
+           push @do, "  scale(sc_$id)\n";
+           push @do, "   rotate(90) translate([0,-sz_$form"."[1]])\n" if $rot;
+           push @do, "   Commitid_${form}_2D();\n";
+           push @do, " } else";
+       }
+    }
+    push @do, <<END;
+ {
+  echo("$fullmodname could not fit anything in", max_sz);
+ }
+END
+    p $_ foreach @do;
+    p "}\n";
+}
+
+sub do_git_best () {
+    return unless $do_git;
+
+    # Auto-computer for `best fit'
+    #
+    # We have two best fit approaches: with count, and git-object-id-only
+    #
+    # For `with count', we only ever include the git object id if the
+    # result would be unambigous.  That means that at least one space
+    # or punctuation was generated.
+    #
+    # We sort the options by firstly number of characters
+    # (decreasing), and then by number of lines (increasing) and
+    # try each one both ways round.
+
+    do_some_best('BestCount', 'Small|Full') if $do_git =~ m/c/;
+    do_some_best('BestObjid', 'Git|Full') if $do_git =~ m/o/;
+}
 
 while (@ARGV) {
     $_ = shift;
@@ -388,6 +476,7 @@ gentextmodule_demo_start_batch();
 gentextmodule('FontDemo', @demo);
 
 do_git();
+do_git_best();
 
 p "module Commitid_2DDemo(){\n";
 p " st = Commitid__scale() * [ 10, 5 ];\n";