[pango/more-space-tweaks: 2/2] cairo: Work harder to measure space




commit 94d2e7d60aa9e8e5bc031d904ab1654296a1c642
Author: Matthias Clasen <mclasen redhat com>
Date:   Fri Dec 17 18:07:58 2021 -0500

    cairo: Work harder to measure space
    
    When coming up with a width for a missing space,
    we were just measuring the hex digits. But in
    subsetted fonts, such as the ones we use for ci,
    hex digits might well be missing. Take that into
    account and still provide some nonzero width
    for space.

 pango/pangocairo-font.c | 24 +++++++++++++++++++++---
 1 file changed, 21 insertions(+), 3 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)
     {


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