cnFontGen

Tool to convert a font file to a large png glyph for game engines
Log | Files | Refs

main.c (2831B)


      1 #include "freetype/ft2build.h"
      2 #include "freetype/freetype.h"
      3 #include "freetype/ftglyph.h"
      4 #include "lodepng/lodepng.h"
      5 #include <stdlib.h>
      6 #include <stdio.h>
      7 
      8 typedef struct
      9 {
     10 	FT_Library lib;
     11 	FT_Face face;
     12 }ftInfo;
     13 
     14 int paddingSpace = 30;
     15 int paddingHeight = 8;
     16 
     17 int clamp(int input, int min, int max)
     18 {
     19 	return input > max ? max : input < min ? min : input;
     20 }
     21 
     22 int main(int argc, char **argv)
     23 {
     24 	ftInfo ft;
     25 
     26 	int i = 0;
     27 	int j = 0;
     28 	int k = 0;
     29 
     30 	int accumWidth = 0;
     31 	int fontHeight = 35;
     32 	int maxHei = 0;
     33 	int biggestBottom = 0;
     34 	int bestMiddle = 0;
     35 	int averageTop = 0;
     36 	int averageBottom = 0;
     37 	int maxTop = 0;
     38 	int minTop = 0;
     39 	int xInc = 0;
     40 	unsigned int* outputBuffer;
     41 	FT_GlyphSlot g;
     42 
     43 	if (FT_Init_FreeType(&ft.lib))
     44 	{
     45 		printf("Failed to initialize freetype");
     46 	}
     47 
     48 	if (FT_New_Face(ft.lib, argv[1], 0, &ft.face))
     49 	{
     50 		printf("Problem loading fontfile %s", argv[1]);
     51 	}
     52 
     53 	FT_Set_Pixel_Sizes(ft.face, 0, fontHeight);
     54 	g = ft.face->glyph;
     55 
     56 	accumWidth += paddingSpace;
     57 	for (i = 33; i < 127; ++i)
     58 	{
     59 		FT_Load_Char(ft.face, i, FT_LOAD_RENDER);
     60 		accumWidth += g->bitmap.width + paddingSpace;
     61 		
     62 		if ((g->bitmap.rows - g->bitmap_top) + g->bitmap_top > maxTop)
     63 		{
     64 			maxTop = (g->bitmap.rows - g->bitmap_top) + g->bitmap_top;
     65 		}
     66 		
     67 		if (g->bitmap_top < 0)
     68 		{
     69 			if ((g->bitmap_top + (-g->bitmap.rows) ) < minTop) 
     70 			{
     71 				minTop = g->bitmap_top + (-g->bitmap.rows);
     72 			}
     73 		}
     74 	}
     75 	accumWidth += paddingSpace;
     76 
     77 	bestMiddle = (maxTop + minTop) / 2;
     78 	maxHei = (maxTop - minTop) + paddingHeight;
     79 
     80 	outputBuffer = malloc(accumWidth*maxHei*4);
     81 	memset(outputBuffer, 0x00, accumWidth*maxHei * 4);
     82 	//accumWidth = 0;
     83 
     84 	xInc += paddingSpace;
     85 	for (i = 33; i < 127; ++i)
     86 	{
     87 		FT_BBox  bbox;
     88 		FT_Glyph gly;
     89 		FT_Load_Char(ft.face, i, FT_LOAD_RENDER);
     90 		
     91 		printf("%c = %i \n", (char)i, g->advance.x >> 6);
     92 	
     93 		for (j = 0; j < g->bitmap.rows; ++j)
     94 		{		
     95 			for (k = 0; k < g->bitmap.width; ++k)
     96 			{
     97 				unsigned int bytes = 0xFFFFFFFF;
     98 				bytes = (unsigned int)g->bitmap.buffer[j*g->bitmap.width + k];
     99 				bytes = (bytes << 24) | 0xFFFFFF;
    100 				outputBuffer[(((j + (maxHei / 2)) - g->bitmap_top + bestMiddle)*accumWidth) + k + xInc] = bytes;
    101 			}				
    102 		}
    103 		
    104 		
    105 
    106 		FT_Get_Glyph(g, &gly);
    107 		FT_Glyph_Get_CBox(gly, FT_GLYPH_BBOX_PIXELS, &bbox);
    108 	
    109 		
    110 
    111 		outputBuffer[xInc - clamp((paddingSpace / 2) - 1, bbox.xMin, (paddingSpace / 2) - 1)] = 0xFFFF0000;
    112 		outputBuffer[xInc - bbox.xMin] = 0xFF000000;
    113 		outputBuffer[xInc + bbox.xMax] = 0xFF000000;
    114 		outputBuffer[xInc + clamp(g->bitmap.width + (paddingSpace / 2) - 1, bbox.xMax + 1, g->bitmap.width + (paddingSpace / 2) - 1)] = 0xFFFF0000;
    115 
    116 		printf("\t xMin: %i xMax: %i \n \t width: %i \n", bbox.xMin, bbox.xMax, g->bitmap.width);
    117 
    118 		xInc += g->bitmap.width + paddingSpace;
    119 	}
    120 
    121 	lodepng_encode32_file("harbage.png", (char*)outputBuffer, accumWidth, maxHei);
    122 
    123 	system("PAUSE");
    124 }