# Konvertiere PixelFontGenerator 6+ generierte Proportionalschrift
# in etwas komprimierteres für kleine Controller und große Schriften.
# NUR FÜR PROPORTIONALSCHRIFTEN!!
# Das Ergebnis ist eine Bitmap, Buchstabe für Buchstabe dicht an dicht
# nebeneinander, 1 Buchstabenzeile.
# Kein Auffüllen von Bits am Pixelzeilenende.
# Die (meine) UTFT-bitblt-Routine kann Bitmaps mit beliebigem Startbit
# und Bitmapzeilenlängen in Bits ausgeben. Nur MSBfirst muss zz. sein.
# henni, 160201
function ltrim(s) {sub(/^[ \t\r\n]+/, "", s); return s;}
function rtrim(s) {sub(/[ \t\r\n]+$/, "", s); return s;}
function trim(s) {return rtrim(ltrim(s)); }
function strip_bracket(s) {sub(/^\[/,"",s); sub(/\]$/,"",s); return s;}
BEGIN{
FS=",";
i=0;
min=80;
}
/^\/\/ Name:/ { #"// Name:Arial / Size:12 / Style:[B]"
split($0,a,"/");
split(a[3],b,":"); #"Name:Arial "
font_name=trim(b[2]); #"Arial"
split(a[5],b,":"); #"Style:[B]"
font_name=font_name strip_bracket(trim(b[2]));
}
/^\/\/ First-Ascii :/ { #"// First-Ascii : 32"
split($0,a,":");
first_code=strtonum(a[2]);
}
/^0x/ {
k=strtonum($1); // Zeichenbreite
w[i]=k;
if (min>k) min=k;
if (max<k) max=k;
z=NF-2; // Zeilenzahl
for (j=0;j<z;j++) data[i,j]=strtonum($(j+2));
i++;
}
END {
last_code=first_code+i-1;
print "#if defined(__AVR__)";
print "#include <avr/pgmspace.h>";
print "typedef uint8_t byte;";
print "#elif defined(__PIC32MX__) || defined(__arm__)";
print "#define PROGMEM";
print "typedef unsigned char byte;";
print "#endif\n";
pix=0;
for (k=0; k<i; k++) pix+=w[k]; # count overall width
bytes=int((pix*z+7)/8); # bitmap data
bytes+=max-min>15 ? i : int((i+1)/2); # character widths
bytes+=4; # header bytes
print "// Character Cell: (" min "~" max ")x" z;
print "// Memory usage: " bytes " bytes";
print "// Character Range: " first_code ".." last_code;
print "// Bitmap dimension: x=" pix ", y=" z ", x*y=" pix*z "\n";
print "const byte " font_name "P" z "[] PROGMEM ={";
printf("0x%02X,0x%02X,0x%02X,0x%02X,\n",
(max-min>15 ? 240 : 256-min),z,first_code,i);
if (max-min>15) {
for (k=0; k<i; k++) {
printf("%2d,",w[k]); # Ganze Bytes
if (k%16==15) print;
}
}else{
for (k=0; k<i; k+=2) {
h=w[k+1];
l=w[k];
printf("0x%X%X,",h?h-min:0,l-min); # Nibbles
if (k%32==30) print;
}
}
print;
bit=0;
byte=0;
for (n=0; n<z; n++) {
for (k=0; k<i; k++) {
for (l=lshift(1,w[k]-1);l;l=rshift(l,1)) {
byte+=byte;
if (and(l,data[k,n])) byte++;
bit++;
if (!and(bit,7)) {printf("0x%02X,",byte); byte=0;}
if (!and(bit,127)) print;
}
}
}
if (and(bit,7)) printf("0x%02X,",lshift(byte,8-and(bit,7)));
print"};";
}
Vorgefundene Kodierung: UTF-8 | 0
|