What follows is a simple Java program to create a header from a specific font. The header consists of an array of numbers, each number being a set of bits representing the bits that are set in a column.
import java.awt.Color; import java.awt.Font; import java.awt.FontMetrics; import java.awt.Graphics; import java.awt.image.BufferedImage; import java.io.File; import java.io.PrintWriter; import javax.imageio.ImageIO; /** Give the statics at the top of this class, create a header file for * drawing a font */ public class FontHeaderMaker { // ----------------------------------------------------------------------- static int HEIGHT = 12; // max height is 32 (that's all we can fit in a std int) static int CHARS = 128; static String FONT_NAME = "Sans"; // ----------------------------------------------------------------------- static int MAXWIDTH = HEIGHT*CHARS; // assume square static int formatCol = 0; // for formattedPrint public static void formattedPrintReset() { formatCol = 0; } public static void formattedPrint(PrintWriter pw, String str) { if (formatCol + str.length() > 78) { formatCol = 0; pw.println(); } formatCol+=str.length(); pw.print(str); } public static void main(String[] args) throws Exception { BufferedImage im = new BufferedImage(MAXWIDTH, HEIGHT, BufferedImage.TYPE_INT_ARGB); Graphics g = im.getGraphics(); int fontsize = 2; do { g.setFont(new Font(FONT_NAME,0,++fontsize)); } while (g.getFontMetrics().getHeight()<HEIGHT); FontMetrics metrics = g.getFontMetrics(); // clear background g.setColor(Color.BLACK); g.fillRect(0,0,MAXWIDTH,HEIGHT); // draw fonts + work out widths int widths[] = new int[CHARS]; g.setColor(Color.WHITE); int x = 0; for (int ch = 0; ch<CHARS; ch++) { if (ch>=32) // <32 are control chars, 32 is space widths[ch] = metrics.charWidth((char)ch); if (widths[ch] > 0) g.drawString(""+(char)ch, x, metrics.getHeight()-metrics.getDescent()); x += widths[ch]; } // output image so people can see ImageIO.write(im, "png", new File("font"+HEIGHT+"_sample.png")); // get image data int rgb[] = new int[x*HEIGHT]; im.getRGB(0, 0, x, HEIGHT, rgb, 0, x); // create the header PrintWriter header = new PrintWriter(new File("font"+HEIGHT+".h")); header.println("// Auto-generated header, created by FontHeaderMaker"); header.println("// Gordon Williams, http://www.pur3.co.uk"); header.println(""); header.println("unsigned char FONT"+HEIGHT+"_WIDTH["+CHARS+"] = {"); formattedPrintReset(); for (int i=0;i<CHARS;i++) { String str = widths[i]+","; formattedPrint(header, str); } header.println("};"); header.println(); header.println("unsigned short FONT"+HEIGHT+"_OFFSET["+CHARS+"] = {"); formattedPrintReset(); int offset = 0; for (int i=0;i<CHARS;i++) { String str = offset+","; formattedPrint(header, str); offset += widths[i]; } header.println("};"); header.println(); String dataType; if (HEIGHT<=8) dataType = "char"; else if (HEIGHT<=16) dataType = "short"; else dataType = "int"; header.println("unsigned "+dataType+" FONT"+HEIGHT+"_DATA["+x+"] = {"); formattedPrintReset(); for (int i=0;i<x;i++) { int hex = 0; for (int y=0;y<HEIGHT;y++) { if ((rgb[i+(y*x)]&0xFF) > 127) hex |= 1; hex = hex << 1; } String str; if (hex>0) str = "0x"+Integer.toHexString(hex)+","; else str = hex+","; formattedPrint(header, str); } header.println("};"); header.close(); } }
The finished file looks a bit like this:
// Auto-generated header, created by FontHeaderMaker // Gordon Williams, http://www.pur3.co.uk unsigned char FONT12_WIDTH[128] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,4,5,8,6,10, 9,3,4,4,5,8,3,4,3,3,6,6,6,6,6,6,6,6,6,6,3,3,8,8,8,5,11,7,7,8,8,7,6,8,8,3,3,7, 6,9,8,8,7,8,7,7,5,8,7,9,6,7,6,4,3,4,8,5,5,6,6,5,6,6,4,6,6,2,2,5,2,10,6,6,6,6, 4,5,4,6,6,8,6,6,5,6,3,6,8,6,}; unsigned short FONT12_OFFSET[128] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,7,12,20, 26,36,45,48,52,56,61,69,72,76,79,82,88,94,100,106,112,118,124,130,136,142,145, 148,156,164,172,177,188,195,202,210,218,225,231,239,247,250,253,260,266,275, 283,291,298,306,313,320,325,333,340,349,355,362,368,372,375,379,387,392,397, 403,409,414,420,426,430,436,442,444,446,451,453,463,469,475,481,487,491,496, 500,506,512,520,526,532,537,543,546,552,560,}; unsigned short FONT12_DATA[566] = { 0,0,0,0,0,0x7d0,0,0,0x700,0,0x700,0,0,0x40,0x170,0x7c0,0x140,0x1f0,0x740, 0x100,0,0x190,0x290,0x7f8,0x250,0x260,0,0x780,0x480,0x7b0,0xc0,0x180,0x6f0, 0x90,0xf0,0,0,0xe0,0x330,0x490,0x490,0x260,0x20,0xd0,0,0,0x700,0,0,0x7f0, 0x808,0,0,0xc18,0x3e0,0,0x480,0x300,0x780,0x300,0x480,0,0x80,0x80,0x80,0x7f0, 0x80,0x80,0x80,0,0x18,0,0,0x40,0x40,0x40,0,0x10,0,0x18,0x1e0,0x600,0,0x3e0, 0x410,0x410,0x410,0x3e0,0,0x410,0x410,0x7f0,0x10,0x10,0,0x210,0x430,0x450, 0x490,0x310,0,0x220,0x490,0x490,0x490,0x360,0,0xc0,0x140,0x640,0x7f0,0x40,0, 0x710,0x510,0x510,0x510,0xe0,0,0x3e0,0x690,0x490,0x490,0x460,0,0x400,0x410, 0x460,0x580,0x600,0,0x360,0x490,0x490,0x490,0x360,0,0x310,0x490,0x490,0x4b0, 0x3e0,0,0x110,0,0,0x118,0,0,0x80,0x80,0x140,0x140,0x140,0x220,0,0,0x140,0x140, 0x140,0x140,0x140,0x140,0,0,0x220,0x140,0x140,0x140,0x80,0x80,0,0,0x400,0x4d0, 0x500,0x600,0,0x1f0,0x318,0x60c,0x4e4,0x4a4,0x4e4,0x428,0x260,0x1c0,0,0x10, 0xe0,0x340,0x440,0x340,0xe0,0x10,0,0x7f0,0x490,0x490,0x490,0x360,0,0,0x1c0, 0x220,0x410,0x410,0x410,0x220,0,0,0x7f0,0x410,0x410,0x410,0x630,0x3e0,0,0, 0x7f0,0x490,0x490,0x490,0x490,0,0,0x7f0,0x480,0x480,0x480,0,0,0x3e0,0x630, 0x410,0x490,0x490,0x2e0,0,0,0x7f0,0x80,0x80,0x80,0x80,0x7f0,0,0,0x7f0,0x4,0x4, 0x7f8,0,0,0x7f0,0x80,0x140,0x220,0x410,0,0,0x7f0,0x10,0x10,0x10,0x10,0,0x7f0, 0x300,0xc0,0x20,0xc0,0x300,0x7f0,0,0,0x7f0,0x200,0x180,0x40,0x20,0x7f0,0,0, 0x3e0,0x630,0x410,0x410,0x630,0x3e0,0,0,0x7f0,0x480,0x480,0x480,0x300,0,0, 0x3e0,0x630,0x410,0x410,0x628,0x3c0,0,0,0x7f0,0x480,0x480,0x4c0,0x320,0x10,0, 0x320,0x490,0x490,0x490,0x260,0,0x400,0x400,0x7f0,0x400,0x400,0,0x7e0,0x10, 0x10,0x10,0x10,0x7e0,0,0x600,0x180,0x60,0x10,0x60,0x180,0x600,0x600,0x1c0, 0x30,0x1c0,0x600,0x1c0,0x30,0x1c0,0x600,0x410,0x630,0x1c0,0x1c0,0x630,0x410, 0x400,0x200,0x100,0xf0,0x100,0x200,0x400,0x410,0x430,0x4d0,0x590,0x610,0x410, 0,0xff8,0x808,0,0x600,0x1e0,0x18,0,0x808,0xff8,0,0,0x100,0x200,0x400,0x400, 0x200,0x100,0,0x4,0x4,0x4,0x4,0x4,0,0x800,0x400,0,0,0,0x30,0x150,0x150,0x150, 0xf0,0,0xff0,0x110,0x110,0x110,0xe0,0,0xe0,0x110,0x110,0x110,0,0xe0,0x110, 0x110,0x110,0xff0,0,0xe0,0x150,0x150,0x150,0xd0,0,0x100,0xff0,0x900,0x800, 0xe0,0x114,0x114,0x114,0x1f8,0,0xff0,0x100,0x100,0x100,0xf0,0,0x9f0,0x4,0x9fc, 0,0xff0,0x40,0xa0,0x110,0,0xff0,0,0x1f0,0x100,0x100,0x100,0xf0,0x100,0x100, 0x100,0xf0,0,0x1f0,0x100,0x100,0x100,0xf0,0,0xe0,0x110,0x110,0x110,0xe0,0, 0x1fc,0x110,0x110,0x110,0xe0,0,0xe0,0x110,0x110,0x110,0x1fc,0,0x1f0,0x100, 0x100,0,0x190,0x150,0x150,0x170,0x100,0x7f0,0x110,0x110,0,0x1e0,0x10,0x10, 0x10,0x1f0,0,0x180,0x60,0x10,0x60,0x180,0,0x1c0,0x30,0xc0,0x100,0xc0,0x30, 0x1c0,0,0x110,0xa0,0x40,0xa0,0x110,0,0x184,0x64,0x18,0x60,0x180,0,0x110,0x130, 0x150,0x190,0,0x80,0x80,0xf78,0x808,0,0,0xffc,0,0,0x808,0xf78,0x80,0x80,0,0,0, 0x80,0x80,0x40,0x40,0x80,0,0,0x7fc,0x404,0x404,0x404,0x7fc,};