static GF_Err gdip_get_font_info(GF_FontReader *dr, char **font_name, s32 *em_size, s32 *ascent, s32 *descent, s32 *underline, s32 *line_spacing, s32 *max_advance_h, s32 *max_advance_v) { UINT16 val, em; FontPriv *ctx = (FontPriv *)dr->udta; *font_name = NULL; *em_size = *ascent = *descent = *line_spacing = *max_advance_h = *max_advance_v = 0; if (!ctx->font) return GF_BAD_PARAM; GdipGetEmHeight(ctx->font, ctx->font_style, &em); *em_size = (s32) em; GdipGetCellAscent(ctx->font, ctx->font_style, &val); ctx->ascent = (Float) val; *ascent = (s32) val; GdipGetCellDescent(ctx->font, ctx->font_style, &val); *descent = (s32) val; *descent *= -1; ctx->descent = -1 * (Float) val; *underline = *descent / 2; GdipGetLineSpacing(ctx->font, ctx->font_style, &val); *line_spacing = (s32) val; *max_advance_v = *ascent - *descent; unsigned short test_str[4]; Fixed w, h, w2; ctx->em_size = (Float) *em_size; test_str[0] = (unsigned short) '_'; test_str[1] = (unsigned short) '\0'; gdip_get_text_size(dr, test_str, &w, &h); ctx->underscore_width = FIX2FLT(w); test_str[0] = (unsigned short) '_'; test_str[1] = (unsigned short) ' '; test_str[2] = (unsigned short) '_'; test_str[3] = (unsigned short) '\0'; gdip_get_text_size(dr, test_str, &w2, &h); ctx->whitespace_width = FIX2FLT(w2 - 2*w); *max_advance_h = (s32) MAX(ctx->underscore_width, ctx->whitespace_width); return GF_OK; }
static M4Err gdip_set_font_size(FontRaster *dr, Float pixel_size) { unsigned short test_str[4]; FontPriv *ctx = (FontPriv *)dr->priv; if (!ctx->font) return M4BadParam; ctx->font_size = pixel_size; /*GDI+ won't return begin/end whitespace info through GetBoundingRect, so compute a default value for space...*/ ctx->whitespace_width = 0; Float w, h, w2; test_str[0] = (unsigned short) '_'; test_str[1] = (unsigned short) '\0'; gdip_get_text_size(dr, test_str, &w, &h); ctx->underscore_width = w; test_str[0] = (unsigned short) '_'; test_str[1] = (unsigned short) ' '; test_str[2] = (unsigned short) '_'; test_str[3] = (unsigned short) '\0'; gdip_get_text_size(dr, test_str, &w2, &h); ctx->whitespace_width = w2 - 2*w; return M4OK; }