# $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
#
# 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:
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) = @_;
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 ($$$) {
foreach my $sz (2..10) {
gentextmodule_demo_start_batch();
- genform_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);
+ }
genform_plusq("Git$sz", ljustt($sz, $git_object, $git_dirty))
if defined $git_object;
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;
gentextmodule('FontDemo', @demo);
do_git();
+do_git_best();
p "module Commitid_2DDemo(){\n";
p " st = Commitid__scale() * [ 10, 5 ];\n";