diff options
Diffstat (limited to 'pango')
-rw-r--r-- | pango/pangocairo-font.c | 24 | ||||
-rw-r--r-- | pango/shape.c | 20 |
2 files changed, 37 insertions, 7 deletions
diff --git a/pango/pangocairo-font.c b/pango/pangocairo-font.c index c2bcc51b..02a976d8 100644 --- a/pango/pangocairo-font.c +++ b/pango/pangocairo-font.c @@ -676,27 +676,45 @@ get_space_extents (PangoCairoFontPrivate *cf_priv, PangoRectangle *ink_rect, PangoRectangle *logical_rect) { + cairo_scaled_font_t *scaled_font; const char hexdigits[] = "0123456789ABCDEF"; char c[2] = {0, 0}; int i; double hex_width; int width; + int n_chars; /* we don't render missing spaces as hex boxes, * so come up with some width to use. For lack * of anything better, use average hex digit width. */ + scaled_font = _pango_cairo_font_private_get_scaled_font (cf_priv); hex_width = 0; + n_chars = 0; for (i = 0 ; i < 16 ; i++) { cairo_text_extents_t extents; c[0] = hexdigits[i]; - cairo_scaled_font_text_extents (_pango_cairo_font_private_get_scaled_font (cf_priv), c, &extents); - hex_width += extents.width; + cairo_scaled_font_text_extents (scaled_font, c, &extents); + if (extents.width > 0) + { + hex_width += extents.width; + n_chars++; + } + } + + if (n_chars == 0) + { + cairo_font_extents_t extents; + + cairo_scaled_font_extents (scaled_font, &extents); + hex_width += extents.max_x_advance; + n_chars++; } - width = pango_units_from_double (hex_width / 16); + + width = pango_units_from_double (hex_width / n_chars); if (ink_rect) { diff --git a/pango/shape.c b/pango/shape.c index 90334cc1..30bceb80 100644 --- a/pango/shape.c +++ b/pango/shape.c @@ -137,12 +137,24 @@ pango_hb_font_get_nominal_glyph (hb_font_t *font, if (hb_font_get_nominal_glyph (context->parent, unicode, glyph)) return TRUE; - /* HarfBuzz knows how to synthesize spaces, so never replace them - * with unknown glyphs, but we do need to tell HarfBuzz that the - * font does not have a glyph. + /* HarfBuzz knows how to synthesize other spaces from 0x20, so never + * replace them with unknown glyphs, just tell HarfBuzz that we don't + * have a glyph. + * + * For 0x20, on the other hand, we need to pretend that we have a glyph + * and rely on our glyph extents code to provide a reasonable width for + * PANGO_GET_UNKNOWN_WIDTH (0x20). */ if (g_unichar_type (unicode) == G_UNICODE_SPACE_SEPARATOR) - return FALSE; + { + if (unicode == 0x20) + { + *glyph = PANGO_GET_UNKNOWN_GLYPH (0x20); + return TRUE; + } + + return FALSE; + } *glyph = PANGO_GET_UNKNOWN_GLYPH (unicode); |