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-14 18:55:09 -0500
commit51cfa45a14d0506d086ea90b3da4739402764542 (patch)
tree7e03e4493a346fbbf6b3dbfb1d318326727e6f08
parent886c83d4ee94ebc1cd215ce3dbadf91c31d74dc0 (diff)
downloadpango-51cfa45a14d0506d086ea90b3da4739402764542.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];