#include #include #include #include FT_FREETYPE_H #include FT_MODULE_H #include FT_OUTLINE_H #include FT_UNPATENTED_HINTING_H static int conic_to_func (const FT_Vector* control, const FT_Vector* to, void* p) { printf ("conic_to (%i %i) (%i %i)\n", (int)control->x, (int)control->y, (int)to->x, (int)to->y); return 0; } static int cubic_to_func (const FT_Vector* ctl1, const FT_Vector* ctl2, const FT_Vector* to, void* p) { const FT_Vector *v1, *v2, *v3; v1 = ctl1; v2 = ctl2; v3 = to; printf ("cubic_to (%i %i) (%i %i) (%i %i)\n", (int)v1->x, (int)v1->y, (int)v2->x, (int)v2->y, (int)v3->x, (int)v3->y); return 0; } static int line_to_func (const FT_Vector* v, void* p) { printf("line_to %i %i\n", (int)v->x, (int)v->y); return 0; } static int move_to_func (const FT_Vector* v, void* p) { printf("move_to (%i %i)\n", (int)v->x, (int)v->y); return 0; } static FT_Outline_Funcs outline_funcs = { (FT_Outline_MoveToFunc)move_to_func, (FT_Outline_LineToFunc)line_to_func, (FT_Outline_ConicToFunc)conic_to_func, (FT_Outline_CubicToFunc)cubic_to_func, 0, 0 }; static void print_version (FT_Library l) { FT_Int min, maj, pat; FT_Library_Version (l, &maj, &min, &pat); printf ("FreeType %i.%i.%i (", maj, min, pat); switch (FT_Get_TrueType_Engine_Type (l)) { case FT_TRUETYPE_ENGINE_TYPE_NONE: printf ("FT_TRUETYPE_ENGINE_TYPE_NONE"); break; case FT_TRUETYPE_ENGINE_TYPE_UNPATENTED: printf ("FT_TRUETYPE_ENGINE_TYPE_UNPATENTED"); break; case FT_TRUETYPE_ENGINE_TYPE_PATENTED: printf ("FT_TRUETYPE_ENGINE_TYPE_PATENTED"); break; } printf(")\n"); } int main (int argc, char **argv) { int index = 1; FT_Library library; FT_Face face; FT_Error error; FT_GlyphSlot slot; FT_Open_Args args; FT_Parameter parameter; if (argc > 2) sscanf (argv[2], "%i", &index); error = FT_Init_FreeType (&library); if (error) { fprintf (stderr, "Can't load FreeType2 library\n"); return !0; } print_version (library); args.flags = FT_OPEN_PATHNAME | FT_OPEN_PARAMS; args.pathname = argv[1]; parameter.tag = FT_PARAM_TAG_UNPATENTED_HINTING; args.num_params = 1; args.params = ¶meter; printf ("decomposing with FT_PARAM_TAG_UNPATENTED_HINTING\n"); error = FT_Open_Face(library, &args, 0, &face); if (error) { fprintf(stderr, "Can't create face\n"); return !0; } error = FT_Set_Char_Size (face, 20 * 64, 0, 100, 0); if (error) { fprintf(stderr, "Can't set char size\n"); return !0; } error = FT_Load_Glyph (face, index, FT_LOAD_RENDER); if (error) { fprintf(stderr, "Can't load glyph index %i\n", index); return !0; } slot = face->glyph; FT_Outline_Decompose (&slot->outline, &outline_funcs, NULL); args.flags = FT_OPEN_PATHNAME; args.pathname = argv[1]; args.num_params = 0; args.params = NULL; printf ("decomposing without FT_PARAM_TAG_UNPATENTED_HINTING\n"); error = FT_Open_Face(library, &args, 0, &face); if (error) { fprintf(stderr, "Can't create face\n"); return !0; } error = FT_Set_Char_Size (face, 20 * 64, 0, 100, 0); if (error) { fprintf(stderr, "Can't set char size\n"); return !0; } error = FT_Load_Glyph (face, index, FT_LOAD_RENDER); if (error) { fprintf(stderr, "Can't load glyph index %i\n", index); return !0; } slot = face->glyph; FT_Outline_Decompose (&slot->outline, &outline_funcs, NULL); return 0; }