summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--pango/pango-bidi-type.c20
1 files changed, 15 insertions, 5 deletions
diff --git a/pango/pango-bidi-type.c b/pango/pango-bidi-type.c
index 68f59a97..19a40dae 100644
--- a/pango/pango-bidi-type.c
+++ b/pango/pango-bidi-type.c
@@ -134,9 +134,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;
FriBidiCharType ored_types = 0;
@@ -170,10 +172,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++)
@@ -249,13 +255,17 @@ 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
+ if (bidi_types != local_bidi_types)
+ g_free (bidi_types);
+
if (G_UNLIKELY(max_level == 0))
{
/* fribidi_get_par_embedding_levels() failed. */