static FT_Error freetype2_get_glyph_size(PFontFreetype pf, FT_Face face, int glyph_index, int *padvance, int *pascent, int *pdescent) { FT_Error error; error = FT_Load_Glyph(face, glyph_index, FT_LOAD_DEFAULT); if (error) return error; if (padvance) *padvance = ROUND_26_6_TO_INT(face->glyph->advance.x); if (pascent || pdescent) { FT_Glyph glyph; FT_BBox bbox; error = FT_Get_Glyph(face->glyph, &glyph); if (error) return error; FT_Glyph_Get_CBox(glyph, ft_glyph_bbox_pixels, &bbox); FT_Done_Glyph(glyph); if (pascent) *pascent = bbox.yMax; if (pdescent) *pdescent = -bbox.yMin; } return 0; }
// aScale is intended for a 16.16 x/y_scale of an FT_Size_Metrics static inline FT_Long ScaleRoundDesignUnits(FT_Short aDesignMetric, FT_Fixed aScale) { FT_Long fixed26dot6 = FT_MulFix(aDesignMetric, aScale); return ROUND_26_6_TO_INT(fixed26dot6); }