summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2021-11-14 18:35:50 -0500
committerMatthias Clasen <mclasen@redhat.com>2021-11-15 08:38:45 -0500
commit3a566950b516386b25fa028bee73d524dd9ada92 (patch)
tree5b2aa0bbd4e66ab484ba1a42d02bfdbd7fa9fbde
parentcadc688fa4ef2abea1fc6b8dc3ffb053a401ad38 (diff)
downloadpango-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.
-rw-r--r--pango/pango-layout.c16
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];