Newer
Older
Import / research / embedded / src / host / tools / convertFont.c
#include <stdlib.h>  
#include <unistd.h>  
#include <fcntl.h>  
//#include <freetype/freetype.h>  
#include <ft2build.h>
#include FT_FREETYPE_H


typedef struct {
    unsigned char   left;
    unsigned char   top;
    unsigned char   horiAdvance;
    unsigned char   vertAdvance;
    unsigned char   width;
    unsigned char   height;
    unsigned char   dummy1;
    unsigned char   dummy2;
    unsigned int    pixel_data_offset;
    unsigned int    dummy3;
} Glyph;

typedef struct {
    int	    bpp;
    int	    pxSize;
    int	    map_size;
    int	    dummy;
    Glyph   glyphs[256];
} Font;

void writeInt(int fd, unsigned val)
{
    unsigned char c1 = (val >>  0) & 0xFF; 
    unsigned char c2 = (val >>  8) & 0xFF; 
    unsigned char c3 = (val >> 16) & 0xFF; 
    unsigned char c4 = (val >> 24) & 0xFF; 
    write(fd, &c1, 1);
    write(fd, &c2, 1);
    write(fd, &c3, 1);
    write(fd, &c4, 1);
}

int main(int argc, char *argv[])
{
    //char *fontPath = "/usr/X11R6/lib/X11/fonts/truetype/Vera.ttf";
    //char *fontPath = "/usr/X11R6/lib/X11/fonts/truetype/arial.ttf";
    char *fontPath = (argc > 1) ? argv[1] : "/usr/X11R6/lib/X11/fonts/truetype/luximr.ttf";
    int fontSize = (argc > 3) ? atoi(argv[3]) : 16;
    int i = 0;

    /* open output font */
    Font output;
    unsigned lastPixData = 0;
    unsigned char pixDataBuf[65536];
    int fd = open((argc > 2) ? argv[2] : "font-out.map", O_WRONLY | O_CREAT);
    //printf("opened output font\n");

    /* open input font */
    FT_Library freetypeLib;
    FT_Face face;
    FT_Long faceIndex = 0;
    FT_Int32 loadFlags = 0;
    FT_Open_Args openArgs = { FT_OPEN_PATHNAME, 0, 0, 0 };
    openArgs.pathname = fontPath;
    FT_Init_FreeType(&freetypeLib);
    FT_Open_Face(freetypeLib, &openArgs, faceIndex, &face);
    FT_Set_Pixel_Sizes(face, fontSize, fontSize);
    //printf("opened input font\n");

    for (i = 0; i < 256; i++) {
	FT_UInt GlyphIndex;
	GlyphIndex = FT_Get_Char_Index(face, i);
	//printf("loaded glyph %i\n", i);
	FT_Load_Glyph(face, GlyphIndex, loadFlags);
	FT_Render_Glyph(face->glyph, 0);

	output.glyphs[i].left = face->glyph->bitmap_left;
	output.glyphs[i].top = face->glyph->bitmap_top;
	output.glyphs[i].horiAdvance = face->glyph->metrics.horiAdvance >> 6;
	output.glyphs[i].vertAdvance = face->glyph->metrics.vertAdvance >> 6;
	output.glyphs[i].width = 0;
	output.glyphs[i].height = 0;
	output.glyphs[i].pixel_data_offset = 0;

	if ( face->glyph->bitmap.buffer ) {
	    output.glyphs[i].width = face->glyph->bitmap.width;
	    output.glyphs[i].height = face->glyph->bitmap.rows;
	    output.glyphs[i].pixel_data_offset = lastPixData;
	    if ( face->glyph->bitmap.pixel_mode == FT_PIXEL_MODE_MONO ) {
/*
		int j, k;
		unsigned char *data = face->glyph->bitmap.buffer;
		unsigned short buffer[32*16];
		for ( j = 0; j < 64; j++ ) {
		    for ( k = 0; k < 8; k++ ) {
			buffer[j*8+k] = (data[j] & (1 << (7-k))) ? 0xFFFF : 0;
		    }
		}
		face->glyph->bitmap.width = 8
		face->glyph->bitmap.rows = 16
		Z_drawSlice((unsigned char *)buffer, 64,
		printf("mode not supported yet\n");
*/
	    } else {
		int bytes = face->glyph->bitmap.width*face->glyph->bitmap.rows;
//		printf("saving --%c-- at offset %i\n", i, lastPixData);
		memcpy(&pixDataBuf[lastPixData], face->glyph->bitmap.buffer, bytes);
		lastPixData += bytes;
	    }
	}
//	FT_Done_Glyph(face->glyph);
    } 

    /* close input font */
    FT_Done_Face(face);
    FT_Done_FreeType(freetypeLib);
    //printf("closed input font\n");

    /* close output font */
    output.bpp = 8;
    output.pxSize = fontSize;
    output.map_size = sizeof(Font) + lastPixData + 1;
    write(fd, &output, sizeof(Font));
    write(fd, pixDataBuf, lastPixData + 1);
    close(fd);
    //printf("closed output font\n");

    return 0;
}