#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, 0600);
//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;
}