#!/usr/bin/perl -w
use strict;
use diagnostics;
use warnings;
use CGI;
use Fcntl qw (:DEFAULT :flock);
my $cgi = CGI -> new;
my %data = (
'New York' => 10,
'Madrid' => 25,
'Venezuela' => 35,
'Berlin' => 5,
);
my %env = (
pfad_fonts => -e '../../fonts' ? '../../fonts' : '.',
prefix_temp_file => 'tmp_',
pfad_public_html => '..',
chmod_dateien_public => $^O =~ /mswin/i ? 0666 : 0444,
);
$env{farbe}{font_norm} = '#000000';
my %FORM = (
ses => 'test123',
);
print $cgi -> header;
print $cgi -> start_html (
-title => 'Test Hochkantschrift',
-BGCOLOR => 'white',
);
foreach my $FONT ("$env{pfad_fonts}/dejavusans.ttf",undef) {
my ($kopf,$zeile) = ('') x 2;
foreach my $string (keys %data) {
my $ret = hochkantschrift (
$string,
$FONT,
10,
$env{farbe}{font_norm},
"$env{prefix_temp_file}$FORM{ses}_",
$env{pfad_public_html},
$env{chmod_dateien_public},
);
$kopf .= '
';
if (substr ($ret,0,1) eq "\x00") {
$kopf .= ' ';
}
else {
$kopf .= $ret;
}
$kopf .= ' | ';
$zeile .= "$data{$string} | ";
}
print <
| $kopf
Temperatur | $zeile
HTML_TEIL
}
print $cgi -> end_html;
sub hochkantschrift {
#
# Aufruf: my $ret = hochkantschrift ([text],[schriftartdatei],[schriftgröße],[schriftfarbe],[zielpfad],[prefixdatei],[chmod]);
# [text] = darzustellender Text
# [schriftartdatei] = absoluter Pfad und Name zur Schriftartendatei
# [schriftgröße] = Größe der Schrift in Pixel
# [schriftfarbe] = Schriftfarbe in Hexadezimaler Schreibweise, z.B. #FFFFFF für weiß
# [zielpfad] = Pfad für die Grafikdateien
# [prefixdatei] = Prefix für Dateiname
# [chmod] = Berechtigungen für die neuen Dateien
#
# Gibt zurück:
# entweder "\x00IMAGENAME" = erstes Zeichen ein HEX 00 gefolgt von einem Dateinamen
# oder "HTMLCODE" = HTML-Code (Image-Variante ist gescheitert)
#
my ($STRING,$FONT,$FONTSIZE,$FONTCOLOR,$PREFIXFILE,$DESTPATH,$CHMOD) = @_;
my $return = join ('
',split (//,$STRING)); # Default, falls bei der andere Variante etwas schief geht
return $return if !defined $FONT;
eval "use Digest::MD5 qw (md5_hex); 1;" or return $return;
my $dateiname = $PREFIXFILE . md5_hex (@_[0..3]) . '.png'; # Daten im Dateinamen verschlüsseln für Caching der Grafiken
if (-f "$DESTPATH/$dateiname") { # aus Cache verfügbar?
return "\x00$dateiname";
}
return if !-f $FONT;
eval "use GD;use GD::Text;use GD::Text::Align;use GD::Graph::colour;use GD::Image;1;" or return $return; # benötigte Module
my $gd_text = GD::Text -> new () or return $return;
$gd_text -> set_font ($FONT,$FONTSIZE) or return $return;
$gd_text -> set_text ($STRING) or return $return;
my ($w,$h) = $gd_text -> get ('width','height');
my $im = GD::Image -> new ($h * 1.3,$w) or return $return;
my @font_col = GD::Graph::colour::hex2rgb($FONTCOLOR) or return $return; # Farbe konvertieren
my @trans_col = @font_col;
$trans_col[0] = ($trans_col[0] == 255 ? 0 : 255); # irgendeine andere Farbe für die Transparenz
my $trans = $im -> colorAllocate (@trans_col);
my $color = $im -> colorAllocate (@font_col);
$im -> transparent ($trans); # Transparenz einstellen
my $align = GD::Text::Align -> new ($im);
$align -> set_font ($FONT,$FONTSIZE);
$align -> set_text ($STRING);
$align -> draw ($h,$w,3.141592653589 / 2);
sysopen (my $file,"$DESTPATH/$dateiname",O_WRONLY|O_EXCL|O_CREAT,$CHMOD) or return $return;
binmode ($file) or return $return;
print $file $im -> png or return $return;
close $file or return $return;
return "\x00$dateiname";
}