manticore/uniworx.pl
2023-12-22 15:37:48 +01:00

190 lines
5.1 KiB
Perl
Executable File

#!/usr/bin/env perl
use strict;
use warnings;
use Tk;
use Data::Dumper;
# Wir wollen keine , in Dezimalbruechen. Wer kommt nur auf solche Ideen?
use POSIX;
setlocale(LC_NUMERIC, "C");
BEGIN {
unshift @INC, '.';
};
use Manticore::Mantis;
#my %font = ();
my $logoDist = 0;
my $logoDist2 = 0;
sub refont {
Manticore::Mantis::fontLoader(dir => "fonts/uwx");
}
refont();
my $graysim = 0;
sub col {
my ($R,$G,$B,$mkgray) = @_;
if($mkgray) {
my $mid = ($R+$G+$B)/3;
$R = $mid;
$G = $mid;
$B = $mid;
}
my $r = int($R*255);
my $g = int($G*255);
my $b = int($B*255);
for($r,$g,$b) { $_=0 if $_<0; $_=255 if $_>255 }
sprintf("#%02x%02x%02x",$r,$g,$b);
}
my $main = MainWindow->new();
my $can = $main->Canvas(-background=>'#ffffff',-width=>700,-height=>700)->pack(-side=>'left');
my $scrolls = $main->Frame(-width=>350,-height=>300,-background=>'#000000')->pack(-side=>'left',-expand=>0);
#$scrolls->Label(-text=>" ")->pack;
#renderOutline(5, 425,200,30, "X", '#000000');
#render(425,200,30, "X", '#ff0000');
#renderOutline(5, 200,200,30, "W", '#000000');
#render(200,200,30, "W", '#ff0000');
#renderOutline(5, 185,200,30, "U", '#000000');
#render(185,200,30, "U", '#ff0000');
#renderOutline(5, 415,200,30, "X", '#000000');
#render(415,200,30, "X", '#553080');
#renderOutline(5, 200,200,30, "W", '#000000');
#render(200,200,30, "W", '#88409e');
#renderOutline(5, 195,200,30, "U", '#000000');
#render(195,200,30, "U", '#aa50bb');
#my $r1 = 0.3;
#my $g1 = 0.3;
#my $b1 = 0.8;
#my $r0 = 0.55;
#my $g0 = 0.15;
#my $b0 = 0.15;
#$scrolls->Checkbutton(-text=>'draw grayscale',-variable=>\$graysim,-command=>sub {renderAll()})->pack;
my $r1 = 0.4;
my $g1 = 0.4;
my $b1 = 0.8;
my $r0 = 0.2;
my $g0 = 0.2;
my $b0 = 0.5;
for(
['r',\$r0,'#ff0000'],
['g',\$g0,'#00ff00'],
['b',\$b0,'#0000ff'],
['r',\$r1,'#ff0000'],
['g',\$g1,'#00ff00'],
['b',\$b1,'#0000ff'],
) {
#$scrolls->Scrollbar(-orient=>'horizontal')->pack(-fill=>'x');
my $row = $scrolls->Frame->pack(-fill=>'x');
$row->Label(-text=>$_->[0],-width=>2,-background=>$_->[2])->pack(-side=>'left');
#$row->Scrollbar(-orient=>'horizontal',-command=>sub {print "[[ @_ ]]\n"; return 1})->pack(-expand=>1,-fill=>'x',-side=>'left');
my $vb = $_->[1];
$row->Scale(-orient=>'horizontal',-length=>200,-variable=>$vb,-resolution=>-1,-from=>0,-to=>1,
-command=>sub {
my $v = shift;
#print "[[ @_ ]]\n"; return 1
#$$vb = $v/100;
renderAll();
})->pack(-side=>'left')
}
$scrolls->Scale(-orient=>'horizontal',-length=>200,-variable=>\$logoDist,-resolution=>-1,-from=>0,-to=>100,
-command=>sub {
renderAll();
})->pack();
$scrolls->Scale(-orient=>'horizontal',-length=>200,-variable=>\$logoDist2,-resolution=>-1,-from=>-20,-to=>20,
-command=>sub {
renderAll();
})->pack();
my $dunkelbg = '#333333';
my $hellbg = '#cccccc';
sub renderAll {
$can->delete('all');
renderOutline(5, 415+$logoDist,120,30, "X", [$dunkelbg, $hellbg, $hellbg, $dunkelbg]);
render(415+$logoDist,120,30, "X", col($r0,$g0,$b0,0));
renderOutline(5, 200,120,30, "W", [$dunkelbg, $hellbg, $hellbg, $dunkelbg]);
render(200,120,30, "W", col(($r0+$r1)/2,($g0+$g1)/2,($b0+$b1)/2,0));
renderOutline(5, 165-$logoDist,120,30, "U", [$dunkelbg, $hellbg, $hellbg, $dunkelbg]);
render(165-$logoDist,120,30, "U", col($r1,$g1,$b1,0));
renderOutline(5, 415+$logoDist,340,30, "X", [$dunkelbg, $hellbg, $hellbg, $dunkelbg]);
render(415+$logoDist,340,30, "X", col($r0,$g0,$b0,1));
renderOutline(5, 200,340,30, "W", [$dunkelbg, $hellbg, $hellbg, $dunkelbg]);
render(200,340,30, "W", col(($r0+$r1)/2,($g0+$g1)/2,($b0+$b1)/2,1));
renderOutline(5, 165-$logoDist,340,30, "U", [$dunkelbg, $hellbg, $hellbg, $dunkelbg]);
render(165-$logoDist,340,30, "U", col($r1,$g1,$b1,1));
# renderOutline(5, 120,220,50, "R", [$dunkelbg, $hellbg, $hellbg, $dunkelbg]);
#render(120,220,50, "R", col(0.5,1,0,0));
my $i = 0;
for my $c(reverse (
[185,0.0,"U"],
[235,0.1666,"N"],
[285,0.3333,"I"],
[320,0.5,"W2"],
[410,0.6666,"O"],
[450,0.8333,"R"],
[502,1,"X"],
)) {
my $dx = $i*$logoDist2;
$i++;
renderOutline(2, $c->[0]+$dx,570,10, $c->[2], [$dunkelbg, $hellbg, $hellbg, $dunkelbg]);
render($c->[0]+$dx,570,10, $c->[2], col($r0*$c->[1]+$r1*(1-$c->[1]),$g0*$c->[1]+$g1*(1-$c->[1]),$b0*$c->[1]+$b1*(1-$c->[1]),0));
}
}
renderAll();
MainLoop;
sub renderOutline {
my ($diff, $x, $y, $size, $letter, $col) = @_;
my @where = (
[$diff,-$diff],
[-$diff,-$diff],
[-$diff,$diff],
[$diff,$diff],
);
for(0..$#where) {
my ($dx, $dy) = @{$where[$_]};
my $scol = ref $col ? $col->[$_] : $col;
render($dx+$x, $dy+$y, $size, $letter, $scol);
}
}
sub render {
my ($x,$y,$scale,$t, $col) = @_;
my $font = Manticore::Mantis::glyphemDisplay($t) or die "Letter not found: $t";
#print Data::Dumper::Dumper($font);
for my $frag(@{$font}) {
my @newpoly = map {$scale*$_} @{$frag};
for(0..$#newpoly) {
$newpoly[$_] += ($_ % 2) == 0 ? $x : $y
}
$can->createPolygon(@newpoly, -fill=>$col, -outline=>undef);
}
}