summaryrefslogtreecommitdiff
path: root/pango/pango-bidi-type.c
diff options
context:
space:
mode:
Diffstat (limited to 'pango/pango-bidi-type.c')
-rw-r--r--pango/pango-bidi-type.c54
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;