diff options
Diffstat (limited to 'pango/itemize.c')
-rw-r--r-- | pango/itemize.c | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/pango/itemize.c b/pango/itemize.c index 35f17d54..5500d56d 100644 --- a/pango/itemize.c +++ b/pango/itemize.c @@ -33,6 +33,7 @@ #include "pango-emoji-private.h" #include "pango-attributes-private.h" #include "pango-item-private.h" +#include "pango-utils-private.h" #include <hb-ot.h> @@ -292,6 +293,7 @@ struct _ItemizeState PangoItem *item; guint8 *embedding_levels; + guint8 embedding_levels_[64]; int embedding_end_offset; const char *embedding_end; guint8 embedding; @@ -433,6 +435,10 @@ itemize_state_init (ItemizeState *state, PangoAttrIterator *cached_iter, const PangoFontDescription *desc) { + unsigned int n_chars; + + n_chars = g_utf8_strlen (text + start_index, length); + state->context = context; state->text = text; state->end = text + start_index + length; @@ -447,7 +453,11 @@ itemize_state_init (ItemizeState *state, /* First, apply the bidirectional algorithm to break * the text into directional runs. */ - state->embedding_levels = pango_log2vis_get_embedding_levels (text + start_index, length, &base_dir); + if (n_chars < 64) + state->embedding_levels = state->embedding_levels_; + else + state->embedding_levels = g_new (guint8, n_chars); + pango_log2vis_fill_embedding_levels (text + start_index, length, n_chars, state->embedding_levels, &base_dir); state->embedding_end_offset = 0; state->embedding_end = text + start_index; @@ -503,7 +513,7 @@ itemize_state_init (ItemizeState *state, &state->script_end, &state->script); width_iter_init (&state->width_iter, text + start_index, length); - _pango_emoji_iter_init (&state->emoji_iter, text + start_index, length); + _pango_emoji_iter_init (&state->emoji_iter, text + start_index, length, n_chars); if (!PANGO_GRAVITY_IS_VERTICAL (state->context->resolved_gravity)) state->width_iter.end = state->end; @@ -1017,7 +1027,8 @@ itemize_state_process_run (ItemizeState *state) static void itemize_state_finish (ItemizeState *state) { - g_free (state->embedding_levels); + if (state->embedding_levels != state->embedding_levels_) + g_free (state->embedding_levels); if (state->free_attr_iter) pango_attr_iterator_destroy (state->attr_iter); _pango_script_iter_fini (&state->script_iter); |