From 3a566950b516386b25fa028bee73d524dd9ada92 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Sun, 14 Nov 2021 18:35:50 -0500 Subject: 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(-) (limited to 'pango/pango-layout.c') 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]; -- cgit v1.2.1