diff options
author | Matthias Clasen <mclasen@redhat.com> | 2023-01-31 04:56:23 +0000 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2023-01-31 04:56:23 +0000 |
commit | fad3e7690845f128aa0beba9adaae7038c01269f (patch) | |
tree | 6dbf158ea77e0311be9022dcc5741e8af1a27bcb /pango/itemize.c | |
parent | 7b4a7d6dc00365289bece029e6698d01441bfb1f (diff) | |
parent | c895f9a8c4b7c4d5553d6fde1c95921117fffbc5 (diff) | |
download | pango-fad3e7690845f128aa0beba9adaae7038c01269f.tar.gz |
Merge branch 'misc-opt' into 'main'
shape: Avoid some overhead
See merge request GNOME/pango!674
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); |