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 }