Source file: /~heha/Mikrocontroller/Displays/utft/Kalender.zip/ILI9325/convert.awk

# 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"};";
}
Detected encoding: UTF-80