summaryrefslogtreecommitdiff
path: root/pango/itemize.c
diff options
context:
space:
mode:
Diffstat (limited to 'pango/itemize.c')
-rw-r--r--pango/itemize.c17
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);