diff options
Diffstat (limited to 'new/make_png.c')
-rw-r--r-- | new/make_png.c | 167 |
1 files changed, 167 insertions, 0 deletions
diff --git a/new/make_png.c b/new/make_png.c new file mode 100644 index 000000000..4d3312561 --- /dev/null +++ b/new/make_png.c @@ -0,0 +1,167 @@ +#include "bitmap.h" + +int main (int argc, char const *argv[]) +{ + FT_Library library; + FT_Face face; + FT_GlyphSlot slot; + + FT_Bitmap* bitmap; + + FT_Error error; + + const char* font_file; + int size; + int render_mode; // argument + + int load_flag; // FT_LOAD_XXX + int render_flag; // FT_RENDER_MODE_XXX + int target_flag; // FT_LOAD_TARGET_XXX + char* render_type; // for file_name + + char name[100]; // hashes file name + int i; // for loop + + if (argc != 4) + { + printf("\nTo generate 32-bit RGBA PNG(s) of all glyphs in a font\n"); + printf("Images will be saved in a file named \n\ + $(font)_$(pt_size)_$(render_mode)_$(glyph_index).png \n\n"); + + printf("By default, hashes of 256-level gray bitmaps will be generated\n\n"); + + printf("Usage ./<exe> <font_file> <pt_size> <render_mode>\n\n"); + + printf("Values for render_mode 0 - monochrome\n"); + printf(" 1 - anti-aliased\n"); + printf(" 2 - lcd horizontal-RGB\n"); + printf(" 3 - lcd horizontal-BGR\n"); + printf(" 4 - lcd vertical-RGB\n"); + printf(" 5 - lcd vertical-BGR\n"); + + return 1; + } + + font_file = argv[1]; + size = atof(argv[2]); + render_mode = atoi(argv[3]); + + error = FT_Init_FreeType( &library ); + if(error){ + printf("Error while initialising library\n"); + } + + error = FT_New_Face( library, + font_file, + 0, + &face ); + if(error){ + printf("Error loading new face\n"); + } + + error = FT_Set_Char_Size( face, + size * 64, + 0, + DPI, + 0 ); + if(error){ + printf("Error setting character size\n"); + } + + switch ( render_mode ) { + case 0: render_flag = FT_RENDER_MODE_MONO; + load_flag = FT_LOAD_MONOCHROME; + target_flag = FT_LOAD_TARGET_MONO; + render_type = "mono"; + break; + + case 1: render_flag = FT_RENDER_MODE_NORMAL; + load_flag = FT_LOAD_DEFAULT; + target_flag = FT_LOAD_TARGET_NORMAL; + render_type = "gray"; + break; + + case 2: render_flag = FT_RENDER_MODE_LCD; + load_flag = FT_LOAD_DEFAULT; + target_flag = FT_LOAD_TARGET_LCD; + render_type = "lcd_rgb"; + break; + + case 3: render_flag = FT_RENDER_MODE_LCD; + load_flag = FT_LOAD_DEFAULT; + target_flag = FT_LOAD_TARGET_LCD; + render_type = "lcd_bgr"; + break; + + case 4: render_flag = FT_RENDER_MODE_LCD_V; + load_flag = FT_LOAD_DEFAULT; + target_flag = FT_LOAD_TARGET_LCD_V; + render_type = "lcd_ver_rgb"; + break; + + case 5: render_flag = FT_RENDER_MODE_LCD_V; + load_flag = FT_LOAD_DEFAULT; + target_flag = FT_LOAD_TARGET_LCD_V; + render_type = "lcd_ver_bgr"; + break; + + default:render_flag = FT_RENDER_MODE_NORMAL; + load_flag = FT_LOAD_DEFAULT; + target_flag = FT_LOAD_TARGET_NORMAL; + render_type = "gray"; + } + + slot = face->glyph; + + sprintf(name,"./images/%s_%d_%s",font_file, + size, + render_type); + + for (i = 0; i <50; ++i) + { + error = FT_Load_Glyph( face, + i, + load_flag | target_flag); + if(error){ + printf("Error loading glyph\n"); + } + + FT_Render_Glyph( slot, + render_flag); + if(error){ + printf("Error rendering the glyph\n"); + } + + bitmap = &slot->bitmap; + + if (bitmap->width == 0 || bitmap->rows == 0) + { + continue; + } + + FT_Bitmap target; + FT_Bitmap_Init( &target ); + + if (bitmap->pixel_mode == 1) + { + int alignment = 4; + error = FT_Bitmap_Convert( library, + bitmap, + &target, + alignment); + if(error){ + printf("Error converting the bitmap\n"); + } + Make_PNG(&target,name,i,render_mode); + }else{ + + Make_PNG(bitmap,name,i,render_mode); + } + } + + FT_Done_Face ( face ); + FT_Done_FreeType( library ); + + return 0; + +} |