summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Hergert <chergert@redhat.com>2018-06-10 21:26:12 -0700
committerChristian Hergert <chergert@redhat.com>2018-06-10 21:28:28 -0700
commit0814dec8b7765e472dca4e6d695f70c39976aec1 (patch)
tree4a8c501fab3671f77715e241013ab3f9d088e7ed
parentcdb88930da73bdbeb0e6167825121435d7e5e99f (diff)
downloadpango-0814dec8b7765e472dca4e6d695f70c39976aec1.tar.gz
log2vis: avoid a number of temporary allocations
-rw-r--r--pango/pango-bidi-type.c20
1 files changed, 14 insertions, 6 deletions
diff --git a/pango/pango-bidi-type.c b/pango/pango-bidi-type.c
index 55d44e98..782f60f2 100644
--- a/pango/pango-bidi-type.c
+++ b/pango/pango-bidi-type.c
@@ -132,9 +132,11 @@ pango_log2vis_get_embedding_levels (const gchar *text,
guint8 *embedding_levels_list;
const gchar *p;
FriBidiParType fribidi_base_dir;
- FriBidiCharType *bidi_types;
+ FriBidiCharType local_bidi_types[128];
+ FriBidiCharType *bidi_types = local_bidi_types;
#ifdef USE_FRIBIDI_EX_API
- FriBidiBracketType *bracket_types;
+ FriBidiBracketType local_bracket_types[128];
+ FriBidiBracketType *bracket_types = local_bracket_types;
#endif
FriBidiLevel max_level;
@@ -166,10 +168,14 @@ pango_log2vis_get_embedding_levels (const gchar *text,
n_chars = g_utf8_strlen (text, length);
- bidi_types = g_new (FriBidiCharType, n_chars);
+ if G_UNLIKELY (n_chars > G_N_ELEMENTS (local_bidi_types))
+ bidi_types = g_new (FriBidiCharType, n_chars);
+
#ifdef USE_FRIBIDI_EX_API
- bracket_types = g_new (FriBidiBracketType, n_chars);
+ if G_UNLIKELY (n_chars > G_N_ELEMENTS (local_bracket_types))
+ bracket_types = g_new (FriBidiBracketType, n_chars);
#endif
+
embedding_levels_list = g_new (guint8, n_chars);
for (i = 0, p = text; p < text + length; p = g_utf8_next_char(p), i++)
@@ -188,14 +194,16 @@ pango_log2vis_get_embedding_levels (const gchar *text,
max_level = fribidi_get_par_embedding_levels_ex (bidi_types, bracket_types, n_chars,
&fribidi_base_dir,
(FriBidiLevel*)embedding_levels_list);
- g_free (bracket_types);
+ if (bracket_types != local_bracket_types)
+ g_free (bracket_types);
#else
max_level = fribidi_get_par_embedding_levels (bidi_types, n_chars,
&fribidi_base_dir,
(FriBidiLevel*)embedding_levels_list);
#endif
- g_free (bidi_types);
+ if (bidi_types != local_bidi_types)
+ g_free (bidi_types);
if (G_UNLIKELY(max_level == 0))
{