[pango: 1/2] layout: make the height of an empty line match a regular line




commit 2690612cf3acb19449bc0fc98e9cc66a1f83849c
Author: Artem Rebrov <artem rebrov devexpress com>
Date:   Thu Jul 8 19:21:37 2021 +0300

    layout: make the height of an empty line match a regular line
    
    When using line-spacing, the height of an empty line is the same as when line-spacing has zero value.
    Take the value from font metrics.

 pango/pango-layout.c | 30 +++++++++++++++++-------------
 1 file changed, 17 insertions(+), 13 deletions(-)
---
diff --git a/pango/pango-layout.c b/pango/pango-layout.c
index 0227f819..87d2a2a9 100644
--- a/pango/pango-layout.c
+++ b/pango/pango-layout.c
@@ -176,9 +176,10 @@ static PangoLayoutLine* _pango_layout_iter_get_line (PangoLayoutIter *iter);
 static void pango_layout_get_item_properties (PangoItem      *item,
                                               ItemProperties *properties);
 
-static void pango_layout_get_empty_extents_at_index (PangoLayout    *layout,
+static void pango_layout_get_empty_extents_and_height_at_index (PangoLayout    *layout,
                                                      int             index,
-                                                     PangoRectangle *logical_rect);
+                                                     PangoRectangle *logical_rect,
+                                                     int            *height);
 
 static void pango_layout_finalize    (GObject          *object);
 
@@ -4330,8 +4331,9 @@ pango_layout_check_lines (PangoLayout *layout)
   if (layout->height >= 0)
     {
       PangoRectangle logical;
-      pango_layout_get_empty_extents_at_index (layout, 0, &logical);
-      state.line_height = logical.height;
+      int height;
+      pango_layout_get_empty_extents_and_height_at_index (layout, 0, &logical, &height);
+      state.line_height = layout->line_spacing == 0.0 ? logical.height : layout->line_spacing * height;
     }
 
   do
@@ -4879,9 +4881,10 @@ pango_layout_line_get_x_ranges (PangoLayoutLine  *line,
 }
 
 static void
-pango_layout_get_empty_extents_at_index (PangoLayout    *layout,
-                                         int             index,
-                                         PangoRectangle *logical_rect)
+pango_layout_get_empty_extents_and_height_at_index (PangoLayout    *layout,
+                                                    int             index,
+                                                    PangoRectangle *logical_rect,
+                                                    int             *height)
 {
   if (logical_rect)
     {
@@ -4945,6 +4948,8 @@ pango_layout_get_empty_extents_at_index (PangoLayout    *layout,
             {
               logical_rect->y = - pango_font_metrics_get_ascent (metrics);
               logical_rect->height = - logical_rect->y + pango_font_metrics_get_descent (metrics);
+              if (height)
+                *height = pango_font_metrics_get_height (metrics);
 
               pango_font_metrics_unref (metrics);
             }
@@ -4970,10 +4975,11 @@ pango_layout_get_empty_extents_at_index (PangoLayout    *layout,
 }
 
 static void
-pango_layout_line_get_empty_extents (PangoLayoutLine *line,
-                                     PangoRectangle  *logical_rect)
+pango_layout_line_get_empty_extents_and_height (PangoLayoutLine *line,
+                                                PangoRectangle  *logical_rect,
+                                                int             *height)
 {
-  pango_layout_get_empty_extents_at_index (line->layout, line->start_index, logical_rect);
+  pango_layout_get_empty_extents_and_height_at_index (line->layout, line->start_index, logical_rect, height);
 }
 
 static void
@@ -5224,9 +5230,7 @@ pango_layout_line_get_extents_and_height (PangoLayoutLine *line,
       PangoRectangle r, *rect;
 
       rect = logical_rect ? logical_rect : &r;
-      pango_layout_line_get_empty_extents (line, rect);
-      if (height)
-        *height = rect->height;
+      pango_layout_line_get_empty_extents_and_height (line, rect, height);
     }
 
   if (caching)


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