af_autofitter_load_glyph( AF_Module module, FT_GlyphSlot slot, FT_Size size, FT_UInt glyph_index, FT_Int32 load_flags ) { FT_Error error = FT_Err_Ok; FT_Memory memory = module->root.library->memory; #ifdef FT_DEBUG_AUTOFIT /* in debug mode, we use a global object that survives this routine */ AF_GlyphHints hints = _af_debug_hints_rec; AF_LoaderRec loader[1]; FT_UNUSED( size ); if ( hints->memory ) af_glyph_hints_done( hints ); af_glyph_hints_init( hints, memory ); af_loader_init( loader, hints ); error = af_loader_load_glyph( loader, module, slot->face, glyph_index, load_flags ); af_glyph_hints_dump_points( hints, 0 ); af_glyph_hints_dump_segments( hints, 0 ); af_glyph_hints_dump_edges( hints, 0 ); af_loader_done( loader ); return error; #else /* !FT_DEBUG_AUTOFIT */ AF_GlyphHintsRec hints[1]; AF_LoaderRec loader[1]; FT_UNUSED( size ); af_glyph_hints_init( hints, memory ); af_loader_init( loader, hints ); error = af_loader_load_glyph( loader, module, slot->face, glyph_index, load_flags ); af_loader_done( loader ); af_glyph_hints_done( hints ); return error; #endif /* !FT_DEBUG_AUTOFIT */ }
af_cjk_hints_apply( AF_GlyphHints hints, FT_Outline* outline, AF_LatinMetrics metrics ) { FT_Error error; int dim; FT_UNUSED( metrics ); error = af_glyph_hints_reload( hints, outline, 0 ); if ( error ) goto Exit; /* analyze glyph outline */ if ( AF_HINTS_DO_HORIZONTAL( hints ) ) { error = af_cjk_hints_detect_features( hints, AF_DIMENSION_HORZ ); if ( error ) goto Exit; } if ( AF_HINTS_DO_VERTICAL( hints ) ) { error = af_cjk_hints_detect_features( hints, AF_DIMENSION_VERT ); if ( error ) goto Exit; } /* grid-fit the outline */ for ( dim = 0; dim < AF_DIMENSION_MAX; dim++ ) { if ( ( dim == AF_DIMENSION_HORZ && AF_HINTS_DO_HORIZONTAL( hints ) ) || ( dim == AF_DIMENSION_VERT && AF_HINTS_DO_VERTICAL( hints ) ) ) { #ifdef AF_USE_WARPER if ( dim == AF_DIMENSION_HORZ && metrics->root.scaler.render_mode == FT_RENDER_MODE_NORMAL ) { AF_WarperRec warper; FT_Fixed scale; FT_Pos delta; af_warper_compute( &warper, hints, dim, &scale, &delta ); af_glyph_hints_scale_dim( hints, dim, scale, delta ); continue; } #endif /* AF_USE_WARPER */ af_cjk_hint_edges( hints, (AF_Dimension)dim ); af_cjk_align_edge_points( hints, (AF_Dimension)dim ); af_glyph_hints_align_strong_points( hints, (AF_Dimension)dim ); af_glyph_hints_align_weak_points( hints, (AF_Dimension)dim ); } } #if 0 af_glyph_hints_dump_points( hints ); af_glyph_hints_dump_segments( hints ); af_glyph_hints_dump_edges( hints ); #endif af_glyph_hints_save( hints, outline ); Exit: return error; }