summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2020-09-17 19:17:27 -0400
committerMarco Trevisan (TreviƱo) <mail@3v1n0.net>2021-05-05 15:43:48 +0200
commit2c193f2bf951c6455d9347187511f1753c6bc6b5 (patch)
tree06583ce4c6e414470aa148ddd7241b45e3b3ed58
parentd8ba812c27d40692d619a280b4cd269ce4cf8427 (diff)
downloadpango-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)
-rw-r--r--pango/pango-context.c16
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);