diff options
author | Matthias Clasen <mclasen@redhat.com> | 2021-11-14 18:35:50 -0500 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2021-11-15 08:38:45 -0500 |
commit | 3a566950b516386b25fa028bee73d524dd9ada92 (patch) | |
tree | 5b2aa0bbd4e66ab484ba1a42d02bfdbd7fa9fbde /pango | |
parent | cadc688fa4ef2abea1fc6b8dc3ffb053a401ad38 (diff) | |
download | pango-3a566950b516386b25fa028bee73d524dd9ada92.tar.gz |
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.
Diffstat (limited to 'pango')
-rw-r--r-- | pango/pango-layout.c | 16 |
1 files 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]; |