diff options
Diffstat (limited to 'pango/pango-bidi-type.c')
-rw-r--r-- | pango/pango-bidi-type.c | 54 |
1 files changed, 39 insertions, 15 deletions
diff --git a/pango/pango-bidi-type.c b/pango/pango-bidi-type.c index 462e7b00..b363ca89 100644 --- a/pango/pango-bidi-type.c +++ b/pango/pango-bidi-type.c @@ -41,12 +41,11 @@ #include <string.h> +#include <fribidi.h> + #include "pango-bidi-type.h" #include "pango-utils.h" -#include "mini-fribidi/fribidi.h" - - /** * pango_bidi_type_for_unichar: @@ -66,7 +65,11 @@ PangoBidiType pango_bidi_type_for_unichar (gunichar ch) { - FriBidiCharType fribidi_ch_type = fribidi_get_type (ch); + FriBidiCharType fribidi_ch_type; + + G_STATIC_ASSERT (sizeof (FriBidiChar) == sizeof (gunichar)); + + fribidi_ch_type = fribidi_get_bidi_type (ch); switch (fribidi_ch_type) { @@ -122,26 +125,29 @@ pango_log2vis_get_embedding_levels (const gchar *text, int length, PangoDirection *pbase_dir) { - FriBidiCharType fribidi_base_dir; + FriBidiParType fribidi_base_dir; guint8 *embedding_levels_list; + G_STATIC_ASSERT (sizeof (FriBidiLevel) == sizeof (guint8)); + G_STATIC_ASSERT (sizeof (FriBidiChar) == sizeof (gunichar)); + switch (*pbase_dir) { case PANGO_DIRECTION_LTR: case PANGO_DIRECTION_TTB_RTL: - fribidi_base_dir = FRIBIDI_TYPE_L; + fribidi_base_dir = FRIBIDI_PAR_LTR; break; case PANGO_DIRECTION_RTL: case PANGO_DIRECTION_TTB_LTR: - fribidi_base_dir = FRIBIDI_TYPE_R; + fribidi_base_dir = FRIBIDI_PAR_RTL; break; case PANGO_DIRECTION_WEAK_RTL: - fribidi_base_dir = FRIBIDI_TYPE_WR; + fribidi_base_dir = FRIBIDI_PAR_WRTL; break; case PANGO_DIRECTION_WEAK_LTR: case PANGO_DIRECTION_NEUTRAL: default: - fribidi_base_dir = FRIBIDI_TYPE_WL; + fribidi_base_dir = FRIBIDI_PAR_WLTR; break; } @@ -154,17 +160,31 @@ pango_log2vis_get_embedding_levels (const gchar *text, #else { gunichar *text_ucs4; - int n_chars; + glong n_chars; + FriBidiCharType *bidi_types; + FriBidiLevel max_level; + text_ucs4 = g_utf8_to_ucs4_fast (text, length, &n_chars); + bidi_types = g_new (FriBidiCharType, n_chars); embedding_levels_list = g_new (guint8, n_chars); - fribidi_log2vis_get_embedding_levels ((FriBidiChar*)text_ucs4, n_chars, - &fribidi_base_dir, - (FriBidiLevel*)embedding_levels_list); + + fribidi_get_bidi_types (text_ucs4, n_chars, bidi_types); + max_level = fribidi_get_par_embedding_levels (bidi_types, n_chars, + &fribidi_base_dir, + (FriBidiLevel*)embedding_levels_list); + if (G_UNLIKELY(max_level == 0)) + { + /* fribidi_get_par_embedding_levels() failed, + * is this the best thing to do? */ + memset (embedding_levels_list, 0, length); + } + g_free (text_ucs4); + g_free (bidi_types); } #endif - *pbase_dir = (fribidi_base_dir == FRIBIDI_TYPE_L) ? PANGO_DIRECTION_LTR : PANGO_DIRECTION_RTL; + *pbase_dir = (fribidi_base_dir == FRIBIDI_PAR_LTR) ? PANGO_DIRECTION_LTR : PANGO_DIRECTION_RTL; return embedding_levels_list; } @@ -187,7 +207,11 @@ pango_log2vis_get_embedding_levels (const gchar *text, PangoDirection pango_unichar_direction (gunichar ch) { - FriBidiCharType fribidi_ch_type = fribidi_get_type (ch); + FriBidiCharType fribidi_ch_type; + + G_STATIC_ASSERT (sizeof (FriBidiChar) == sizeof (gunichar)); + + fribidi_ch_type = fribidi_get_bidi_type (ch); if (!FRIBIDI_IS_STRONG (fribidi_ch_type)) return PANGO_DIRECTION_NEUTRAL; |