From 448a1250519527662b10e53d0ea9a6e2138353d6 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Sat, 29 Apr 2006 05:53:34 +0000 Subject: =?UTF-8?q?Bug=20307196=20=E2=80=93=20Unhinted=20fonts=20are=20mea?= =?UTF-8?q?sured=20incorrectly=20and=20drawing?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 2006-04-29 Behdad Esfahbod Bug 307196 – Unhinted fonts are measured incorrectly and drawing problems occur as a result * pango/pangofc-font.c (get_face_metrics), (pango_fc_font_get_raw_extents): * pango/pangoxft-font.c (_pango_xft_font_new): Rollback previous change that forced metrics hinting always on. * pango/pangocairo-fcfont.c (_pango_cairo_fc_font_new): Set fcfont metrics hinting based on cairo font options. --- ChangeLog | 13 +++++++++++++ pango/pangocairo-fcfont.c | 5 +++++ pango/pangofc-font.c | 41 ++++++++++++++++++++++++++++++++++++----- pango/pangoxft-font.c | 6 ++++++ 4 files changed, 60 insertions(+), 5 deletions(-) diff --git a/ChangeLog b/ChangeLog index 8edf3b00..0365efb1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,16 @@ +2006-04-29 Behdad Esfahbod + + Bug 307196 – Unhinted fonts are measured incorrectly and drawing + problems occur as a result + + * pango/pangofc-font.c (get_face_metrics), + (pango_fc_font_get_raw_extents): + * pango/pangoxft-font.c (_pango_xft_font_new): Rollback previous + change that forced metrics hinting always on. + + * pango/pangocairo-fcfont.c (_pango_cairo_fc_font_new): Set fcfont + metrics hinting based on cairo font options. + 2006-04-28 Behdad Esfahbod * pango/pangofc-font.c (get_face_metrics), diff --git a/pango/pangocairo-fcfont.c b/pango/pangocairo-fcfont.c index 647e5425..9d122ba7 100644 --- a/pango/pangocairo-fcfont.c +++ b/pango/pangocairo-fcfont.c @@ -645,5 +645,10 @@ _pango_cairo_fc_font_new (PangoCairoFcFontMap *cffontmap, cffont->options = cairo_font_options_copy (_pango_cairo_context_get_merged_font_options (context)); + /* fcfont's is_hinted controls metric hinting + */ + PANGO_FC_FONT(cffont)->is_hinted = + (cairo_font_options_get_hint_metrics(cffont->options) != CAIRO_HINT_METRICS_OFF); + return PANGO_FC_FONT (cffont); } diff --git a/pango/pangofc-font.c b/pango/pangofc-font.c index 42a063e8..d6e2d8fd 100644 --- a/pango/pangofc-font.c +++ b/pango/pangofc-font.c @@ -328,11 +328,22 @@ get_face_metrics (PangoFcFont *fcfont, FT_Vector_Transform (&vector, &ft_matrix); metrics->ascent = PANGO_UNITS_26_6 (vector.y); } - else + else if (fcfont->is_hinted || + (face->face_flags & FT_FACE_FLAG_SCALABLE) == 0) { metrics->descent = - PANGO_UNITS_26_6 (face->size->metrics.descender); metrics->ascent = PANGO_UNITS_26_6 (face->size->metrics.ascender); } + else + { + FT_Fixed ascender, descender; + + descender = FT_MulFix (face->descender, face->size->metrics.y_scale); + metrics->descent = - PANGO_UNITS_26_6 (descender); + + ascender = FT_MulFix (face->ascender, face->size->metrics.y_scale); + metrics->ascent = PANGO_UNITS_26_6 (ascender); + } /* Versions of FreeType < 2.1.8 get underline thickness wrong * for Postscript fonts (always zero), so we need a fallback @@ -370,8 +381,14 @@ get_face_metrics (PangoFcFont *fcfont, metrics->strikethrough_position = (PANGO_SCALE * face->size->metrics.y_ppem) / 4; } - quantize_position (&metrics->underline_thickness, &metrics->underline_position); - quantize_position (&metrics->strikethrough_thickness, &metrics->strikethrough_position); + /* If hinting is on for this font, quantize the underline and strikethrough position + * to integer values. + */ + if (fcfont->is_hinted) + { + quantize_position (&metrics->underline_thickness, &metrics->underline_position); + quantize_position (&metrics->strikethrough_thickness, &metrics->strikethrough_position); + } PANGO_FC_FONT_UNLOCK_FACE (fcfont); } @@ -830,8 +847,22 @@ pango_fc_font_get_raw_extents (PangoFcFont *fcfont, { logical_rect->x = 0; logical_rect->width = PANGO_UNITS_26_6 (gm->horiAdvance); - logical_rect->y = - PANGO_UNITS_26_6 (face->size->metrics.ascender); - logical_rect->height = PANGO_UNITS_26_6 (face->size->metrics.ascender - face->size->metrics.descender); + if (fcfont->is_hinted || + (face->face_flags & FT_FACE_FLAG_SCALABLE) == 0) + { + logical_rect->y = - PANGO_UNITS_26_6 (face->size->metrics.ascender); + logical_rect->height = PANGO_UNITS_26_6 (face->size->metrics.ascender - face->size->metrics.descender); + } + else + { + FT_Fixed ascender, descender; + + ascender = FT_MulFix (face->ascender, face->size->metrics.y_scale); + descender = FT_MulFix (face->descender, face->size->metrics.y_scale); + + logical_rect->y = - PANGO_UNITS_26_6 (ascender); + logical_rect->height = PANGO_UNITS_26_6 (ascender - descender); + } } } else diff --git a/pango/pangoxft-font.c b/pango/pangoxft-font.c index d0ef5caa..fe3844fb 100644 --- a/pango/pangoxft-font.c +++ b/pango/pangoxft-font.c @@ -96,6 +96,12 @@ _pango_xft_font_new (PangoXftFontMap *xftfontmap, "pattern", pattern, NULL); + /* Hack to force hinting of vertical metrics; hinting off for + * a Xft font just means to not hint outlines, but we still + * want integer line spacing, underline positions, etc + */ + PANGO_FC_FONT (xfont)->is_hinted = TRUE; + xfont->xft_font = NULL; return xfont; -- cgit v1.2.1