diff options
author | Matthias Clasen <mclasen@redhat.com> | 2020-09-17 19:17:27 -0400 |
---|---|---|
committer | Marco Trevisan (TreviƱo) <mail@3v1n0.net> | 2021-05-05 15:43:48 +0200 |
commit | 2c193f2bf951c6455d9347187511f1753c6bc6b5 (patch) | |
tree | 06583ce4c6e414470aa148ddd7241b45e3b3ed58 /pango/pango-context.c | |
parent | d8ba812c27d40692d619a280b4cd269ce4cf8427 (diff) | |
download | pango-2c193f2bf951c6455d9347187511f1753c6bc6b5.tar.gz |
Fix handling of keycap sequences
The last character of Emoji keycap sequences, 0x20E3,
has a vertical orientation of U, according to Unicode.
This unfortunately makes the width iter frequently break
such sequences into multiple items, preventing them from
being rendered as expected.
Fix this by ignoring width changes inside Emoji sequences.
Fixes: #502
(cherry-picked from commit b1718281)
Diffstat (limited to 'pango/pango-context.c')
-rw-r--r-- | pango/pango-context.c | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/pango/pango-context.c b/pango/pango-context.c index a64eb79f..f0bf11c3 100644 --- a/pango/pango-context.c +++ b/pango/pango-context.c @@ -1063,6 +1063,9 @@ itemize_state_init (ItemizeState *state, width_iter_init (&state->width_iter, text + start_index, length); _pango_emoji_iter_init (&state->emoji_iter, text + start_index, length); + if (state->emoji_iter.is_emoji) + state->width_iter.end = MAX (state->width_iter.end, state->emoji_iter.end); + update_end (state); if (pango_font_description_get_set_fields (state->font_desc) & PANGO_FONT_MASK_GRAVITY) @@ -1110,15 +1113,18 @@ itemize_state_next (ItemizeState *state) &state->script_end, &state->script); state->changed |= SCRIPT_CHANGED; } - if (state->run_end == state->width_iter.end) - { - width_iter_next (&state->width_iter); - state->changed |= WIDTH_CHANGED; - } if (state->run_end == state->emoji_iter.end) { _pango_emoji_iter_next (&state->emoji_iter); state->changed |= EMOJI_CHANGED; + + if (state->emoji_iter.is_emoji) + state->width_iter.end = MAX (state->width_iter.end, state->emoji_iter.end); + } + if (state->run_end == state->width_iter.end) + { + width_iter_next (&state->width_iter); + state->changed |= WIDTH_CHANGED; } update_end (state); |