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/pango-bidi-type.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/pango-bidi-type.c')
-rw-r--r-- | pango/pango-bidi-type.c | 58 |
1 files changed, 42 insertions, 16 deletions
diff --git a/pango/pango-bidi-type.c b/pango/pango-bidi-type.c index f854a1b8..4277dc19 100644 --- a/pango/pango-bidi-type.c +++ b/pango/pango-bidi-type.c @@ -29,6 +29,7 @@ #include "pango-bidi-type.h" #include "pango-utils.h" +#include "pango-utils-private.h" /** * pango_bidi_type_for_unichar: @@ -109,15 +110,37 @@ pango_bidi_type_for_unichar (gunichar ch) */ guint8 * pango_log2vis_get_embedding_levels (const gchar *text, - int length, - PangoDirection *pbase_dir) + int length, + PangoDirection *pbase_dir) { - glong n_chars, i; - guint8 *embedding_levels_list; + unsigned int n_chars; + guint8 *embedding_levels; + + if (length < 0) + length = strlen (text); + + n_chars = g_utf8_strlen (text, length); + embedding_levels = g_new (guint8, n_chars); + + pango_log2vis_fill_embedding_levels (text, length, n_chars, embedding_levels, pbase_dir); + + return embedding_levels; +} + +void +pango_log2vis_fill_embedding_levels (const gchar *text, + int length, + unsigned int n_chars, + guint8 *embedding_levels_list, + PangoDirection *pbase_dir) +{ + glong i; const gchar *p; FriBidiParType fribidi_base_dir; FriBidiCharType *bidi_types; + FriBidiCharType bidi_types_[64]; FriBidiBracketType *bracket_types; + FriBidiBracketType bracket_types_[64]; FriBidiLevel max_level; FriBidiCharType ored_types = 0; FriBidiCharType anded_strongs = FRIBIDI_TYPE_RLE; @@ -145,14 +168,16 @@ pango_log2vis_get_embedding_levels (const gchar *text, break; } - if (length < 0) - length = strlen (text); - - n_chars = g_utf8_strlen (text, length); - - bidi_types = g_new (FriBidiCharType, n_chars); - bracket_types = g_new (FriBidiBracketType, n_chars); - embedding_levels_list = g_new (guint8, n_chars); + if (n_chars < 64) + { + bidi_types = bidi_types_; + bracket_types = bracket_types_; + } + else + { + bidi_types = g_new (FriBidiCharType, n_chars); + bracket_types = g_new (FriBidiBracketType, n_chars); + } for (i = 0, p = text; p < text + length; p = g_utf8_next_char(p), i++) { @@ -232,12 +257,13 @@ pango_log2vis_get_embedding_levels (const gchar *text, } resolved: - g_free (bidi_types); - g_free (bracket_types); + if (n_chars >= 64) + { + g_free (bidi_types); + g_free (bracket_types); + } *pbase_dir = (fribidi_base_dir == FRIBIDI_PAR_LTR) ? PANGO_DIRECTION_LTR : PANGO_DIRECTION_RTL; - - return embedding_levels_list; } /** |