[pango/pango-1-44: 7/31] Fix handling of keycap sequences




commit 2c193f2bf951c6455d9347187511f1753c6bc6b5
Author: Matthias Clasen <mclasen redhat com>
Date:   Thu Sep 17 19:17:27 2020 -0400

    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)

 pango/pango-context.c | 16 +++++++++++-----
 1 file 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);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]