diff options
-rw-r--r-- | pango/pango-bidi-type.c | 20 |
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. */ |