[pango/more-space-tweaks: 1/2] shape: More tweaks to space handling




commit fba7e54e1a7f250ce9bb939ad96b8b72d112f8a1
Author: Matthias Clasen <mclasen redhat com>
Date:   Fri Dec 17 18:06:31 2021 -0500

    shape: More tweaks to space handling
    
    It is a difficult dance between HarfBuzz and pango
    which glyphs we let hb synthesize, and which ones
    we need to fake ourselves.
    
    HarfBuzz knows how to create other spaces from 0x20,
    so if the font is lacking spaces, we want to tell
    HarfBuzz that we don't have that glyph *except* for
    0x20 where we need to fake one, and provide HarfBuzz
    with a suitable width.

 pango/shape.c | 20 ++++++++++++++++----
 1 file changed, 16 insertions(+), 4 deletions(-)
---
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);
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]