diff options
author | Matthias Clasen <mclasen@redhat.com> | 2021-10-19 15:12:56 -0400 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2021-10-19 16:42:26 -0400 |
commit | 20ec670e124e4461075a2967faa29603d25106cc (patch) | |
tree | d1926ed5c6b12e19812718b12e4a13bc2454d311 /pango | |
parent | f178bb42d3622b3144bc30d5c5d99c884eee0455 (diff) | |
download | pango-20ec670e124e4461075a2967faa29603d25106cc.tar.gz |
Use harfbuzz metrics for cairo fonts
Without this, we end up with differences in
metrics of empty runs.
Fixes: #421
Diffstat (limited to 'pango')
-rw-r--r-- | pango/pangocairo-font.c | 43 |
1 files changed, 22 insertions, 21 deletions
diff --git a/pango/pangocairo-font.c b/pango/pangocairo-font.c index 69c375c3..15c5be4a 100644 --- a/pango/pangocairo-font.c +++ b/pango/pangocairo-font.c @@ -784,40 +784,41 @@ struct _PangoCairoFontGlyphExtentsCacheEntry static gboolean _pango_cairo_font_private_glyph_extents_cache_init (PangoCairoFontPrivate *cf_priv) { - cairo_scaled_font_t *scaled_font = _pango_cairo_font_private_get_scaled_font (cf_priv); - cairo_font_extents_t font_extents; - - if (G_UNLIKELY (scaled_font == NULL || cairo_scaled_font_status (scaled_font) != CAIRO_STATUS_SUCCESS)) - return FALSE; - - cairo_scaled_font_extents (scaled_font, &font_extents); + PangoCairoFont *cfont = cf_priv->cfont; + PangoFontMetrics *metrics = _pango_cairo_font_get_metrics (PANGO_FONT (cfont), NULL); cf_priv->font_extents.x = 0; cf_priv->font_extents.width = 0; - cf_priv->font_extents.height = pango_units_from_double (font_extents.ascent + font_extents.descent); + cf_priv->font_extents.height = metrics->ascent + metrics->descent; + switch (cf_priv->gravity) { default: case PANGO_GRAVITY_AUTO: case PANGO_GRAVITY_SOUTH: - cf_priv->font_extents.y = - pango_units_from_double (font_extents.ascent); - break; + cf_priv->font_extents.y = - metrics->ascent; + break; case PANGO_GRAVITY_NORTH: - cf_priv->font_extents.y = - pango_units_from_double (font_extents.descent); - break; + cf_priv->font_extents.y = - metrics->descent; + break; case PANGO_GRAVITY_EAST: case PANGO_GRAVITY_WEST: - { - int ascent = pango_units_from_double (font_extents.ascent + font_extents.descent) / 2; - if (cf_priv->is_hinted) - ascent = PANGO_UNITS_ROUND (ascent); - cf_priv->font_extents.y = - ascent; - } + { + int ascent = (metrics->ascent + metrics->descent) / 2; + if (cf_priv->is_hinted) + ascent = PANGO_UNITS_ROUND (ascent); + cf_priv->font_extents.y = - ascent; + } } - cf_priv->glyph_extents_cache = g_new0 (PangoCairoFontGlyphExtentsCacheEntry, GLYPH_CACHE_NUM_ENTRIES); - /* Make sure all cache entries are invalid initially */ - cf_priv->glyph_extents_cache[0].glyph = 1; /* glyph 1 cannot happen in bucket 0 */ + pango_font_metrics_unref (metrics); + + if (!cf_priv->glyph_extents_cache) + { + cf_priv->glyph_extents_cache = g_new0 (PangoCairoFontGlyphExtentsCacheEntry, GLYPH_CACHE_NUM_ENTRIES); + /* Make sure all cache entries are invalid initially */ + cf_priv->glyph_extents_cache[0].glyph = 1; /* glyph 1 cannot happen in bucket 0 */ + } return TRUE; } |