[pango/line-breaking-fixes2: 6/8] Fix line-break accounting more




commit 51cfa45a14d0506d086ea90b3da4739402764542
Author: Matthias Clasen <mclasen redhat com>
Date:   Sun Nov 14 18:35:50 2021 -0500

    Fix line-break accounting more
    
    When looking for breakpoints, we were assuming that
    there is no point to keep looking forward once we
    hit a spot where the broken off part is too long.
    
    But with hyphen insertion, that is no longer true,
    necessarily. Consider 'bli '. Breaking after 'bl'
    will insert 'bl-', which might be longer than
    'bli', which is what will be inserted when we
    break after the i.
    
    To fix this, keep looking for breakpoints as long
    as there is still a chance to find one.

 pango/pango-layout.c | 16 +++++++++++-----
 1 file changed, 11 insertions(+), 5 deletions(-)
---
diff --git a/pango/pango-layout.c b/pango/pango-layout.c
index 50e6ddeb..656bfb18 100644
--- a/pango/pango-layout.c
+++ b/pango/pango-layout.c
@@ -3951,16 +3951,22 @@ process_item (PangoLayout     *layout,
         {
           extra_width = find_break_extra_width (layout, state, num_chars);
 
-          if (width + extra_width > state->remaining_width && break_num_chars < item->num_chars)
-            break;
+          if (MIN (width + extra_width, width) > state->remaining_width && break_num_chars < item->num_chars)
+            {
+              break;
+            }
 
           /* If there are no previous runs we have to take care to grab at least one char. */
           if (can_break_at (layout, state->start_offset + num_chars, retrying_with_char_breaks) &&
               (num_chars > 0 || line->runs))
             {
-              break_num_chars = num_chars;
-              break_width = width;
-              break_extra_width = extra_width;
+              if (width + extra_width <= state->remaining_width ||
+                  break_num_chars >= last_break_char)
+                {
+                  break_num_chars = num_chars;
+                  break_width = width;
+                  break_extra_width = extra_width;
+                }
             }
 
           width += state->log_widths[state->log_widths_offset + num_chars];


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