Module Name: xsrc Committed By: macallan Date: Wed Dec 28 16:53:30 UTC 2011
Added Files: xsrc/local/programs/ttf2wsfont: Makefile main.c Log Message: tool to generate anti-aliased fonts for wscons from TTF files To generate a diff of this commit: cvs rdiff -u -r0 -r1.1 xsrc/local/programs/ttf2wsfont/Makefile \ xsrc/local/programs/ttf2wsfont/main.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Added files: Index: xsrc/local/programs/ttf2wsfont/Makefile diff -u /dev/null xsrc/local/programs/ttf2wsfont/Makefile:1.1 --- /dev/null Wed Dec 28 16:53:30 2011 +++ xsrc/local/programs/ttf2wsfont/Makefile Wed Dec 28 16:53:30 2011 @@ -0,0 +1,14 @@ +# $NetBSD: Makefile,v 1.1 2011/12/28 16:53:30 macallan Exp $ +# @(#)Makefile 8.1 (Berkeley) 5/31/93 + +PROG= ttf2wsfont + +SRCS= main.c +WARNS= 3 + +CPPFLAGS+= -DXFREE86_FT2 -I${DESTDIR}${X11INCDIR}/freetype2 + +LDADD+= -lfreetype + +.include <bsd.x11.mk> +.include <bsd.prog.mk> Index: xsrc/local/programs/ttf2wsfont/main.c diff -u /dev/null xsrc/local/programs/ttf2wsfont/main.c:1.1 --- /dev/null Wed Dec 28 16:53:30 2011 +++ xsrc/local/programs/ttf2wsfont/main.c Wed Dec 28 16:53:30 2011 @@ -0,0 +1,159 @@ +#include <stdio.h> +#include <ctype.h> + +#include <ft2build.h> +#include FT_FREETYPE_H + +char cvr[] = " .-+oaOX"; +FT_Library library; +FT_Face face; +int baseline, above = 0, below = 0, advance = 0; + +int push_size(int); + +int +push_size(int letter) +{ + int glyph_index, error; + int new_above, new_below, new_advance; + + glyph_index = FT_Get_Char_Index(face, letter); + printf("idx: %d\n", glyph_index); + error = FT_Load_Glyph(face, glyph_index, FT_LOAD_DEFAULT); + if (error) { + printf("wtf?!\n"); + return -1; + } + FT_Render_Glyph(face->glyph, FT_RENDER_MODE_NORMAL); + printf("%d x %d\n", face->glyph->bitmap.width, face->glyph->bitmap.rows); + printf("offset: %d %d\n", face->glyph->bitmap_left, face->glyph->bitmap_top); + new_advance = (int)(face->glyph->advance.x >> 6); + printf("advance: %d\n", new_advance); + new_above = face->glyph->bitmap_top; + new_below = face->glyph->bitmap.rows - face->glyph->bitmap_top; + if (new_above > above) above = new_above; + if (new_below > below) below = new_below; + if (new_advance > advance) advance = new_advance; + return 0; +} + +int +main(int argc, char *argv[]) +{ + int error, glyph_index; + int x, y, idx, width_in_bytes, height = 22, cell_height; + int width, datalen, didx, i, start, end; + FILE *output; + uint8_t *fontdata; + char fontname[128], filename[128]; + + if (argc != 3) { + printf("usage: ttf2wsfont some_font.ttf height\n"); + return 0; + } + + sscanf(argv[2], "%d", &height); + + error = FT_Init_FreeType( &library ); + if (error) { + printf("Failed to initialize freefont2\n"); + return -1; + } + error = FT_New_Face(library, argv[1], 0, &face ); + if ( error == FT_Err_Unknown_File_Format ) { + printf("unsupported font format\n"); + return -1; + } + error = FT_Set_Pixel_Sizes(face, /* handle to face object */ + 0, /* pixel_width */ + height - (height / 10) ); /* pixel_height */ + if (error) { + printf("couldn't set character cell size\n"); + } + + push_size('W'); + push_size('g'); + push_size(192); + printf("above: %d below: %d advance: %d\n", above, below, advance); + width = advance; + baseline = above; + cell_height = above + below; + datalen = 256 * width * cell_height; + fontdata = malloc(datalen); + + + for (i = 0; i < 256; i++) { + glyph_index = FT_Get_Char_Index(face, i); + FT_Load_Glyph(face, glyph_index, FT_LOAD_DEFAULT); + FT_Render_Glyph(face->glyph, FT_RENDER_MODE_NORMAL); + width_in_bytes = face->glyph->bitmap.width; + start = baseline - face->glyph->bitmap_top; + end = start + face->glyph->bitmap.rows; + if (end > cell_height) + end = cell_height; + idx = 0; + if (start < 0) { + idx += (0 - start) * width_in_bytes; + start = 0; + } + didx = i * width * cell_height + /* character cell */ + start * width + /* pixels above baseline */ + face->glyph->bitmap_left; /* pixels left from border */ + memset(&fontdata[i * width * cell_height], 0, width * cell_height); + for (y = start; y < end; y++) { + for (x = 0; x < width_in_bytes; x++) { + fontdata[didx + x] = face->glyph->bitmap.buffer[idx + x]; + } + idx += width_in_bytes; + didx += width; + } + } + + /* now output as a header file */ + snprintf(fontname, 128, "%s_%dx%d", face->family_name, width, cell_height); + for (i = 0; i < strlen(fontname); i++) { + if (isblank(fontname[i])) + fontname[i]='_'; + } + snprintf(filename, 128, "%s.h", fontname); + if ((output = fopen(filename, "w")) == NULL) { + fprintf(stderr, "Can't open output file %s\n", filename); + return -1; + } + fprintf(output, "static u_char %s_data[];\n", fontname); + fprintf(output, "\n"); + fprintf(output, "static struct wsdisplay_font %s = {\n", fontname); + fprintf(output, "\t\"%s\",\t\t\t/* typeface name */\n", face->family_name); + fprintf(output, "\t0,\t\t\t\t/* firstchar */\n"); + fprintf(output, "\t255 - 0 + 1,\t\t\t/* numchar */\n"); + fprintf(output, "\tWSDISPLAY_FONTENC_ISO,\t\t/* encoding */\n"); + fprintf(output, "\t%d,\t\t\t\t/* width */\n", width); + fprintf(output, "\t%d,\t\t\t\t/* height */\n", cell_height); + fprintf(output, "\t%d,\t\t\t\t/* stride */\n", width); + fprintf(output, "\tWSDISPLAY_FONTORDER_L2R,\t/* bit order */\n"); + fprintf(output, "\tWSDISPLAY_FONTORDER_L2R,\t/* byte order */\n"); + fprintf(output, "\t%s_data\t\t/* data */\n", fontname); + fprintf(output, "};\n\n"); + fprintf(output, "static u_char %s_data[] = {\n", fontname); + for (i = 0; i < 256; i++) { + fprintf(output, "\t/* %d */\n", i); + idx = i * width * cell_height; + for (y = 0; y < cell_height; y++) { + for (x = 0; x < width; x++) { + fprintf(output, "0x%02x, ",fontdata[idx + x]); + } + fprintf(output, "/* "); + for (x = 0; x < width; x++) { + fprintf(output, "%c",cvr[fontdata[idx + x] >> 5]); + } + fprintf(output, " */\n"); + + idx += width; + } + } + fprintf(output, "};\n"); + fclose(output); + free(fontdata); + FT_Done_Face(face); + FT_Done_FreeType(library); +}