summaryrefslogtreecommitdiff
path: root/pango/mini-fribidi
diff options
context:
space:
mode:
Diffstat (limited to 'pango/mini-fribidi')
-rw-r--r--pango/mini-fribidi/.cvsignore6
-rw-r--r--pango/mini-fribidi/Makefile.am25
-rw-r--r--pango/mini-fribidi/README44
-rw-r--r--pango/mini-fribidi/fribidi-0.1.12.patch441
-rw-r--r--pango/mini-fribidi/fribidi.c514
-rw-r--r--pango/mini-fribidi/fribidi_get_type.c75
-rw-r--r--pango/mini-fribidi/fribidi_tables.i1052
-rw-r--r--pango/mini-fribidi/fribidi_types.h101
8 files changed, 2258 insertions, 0 deletions
diff --git a/pango/mini-fribidi/.cvsignore b/pango/mini-fribidi/.cvsignore
new file mode 100644
index 00000000..587e7b39
--- /dev/null
+++ b/pango/mini-fribidi/.cvsignore
@@ -0,0 +1,6 @@
+Makefile.in
+Makefile
+*.lo
+*.la
+.deps
+.libs
diff --git a/pango/mini-fribidi/Makefile.am b/pango/mini-fribidi/Makefile.am
new file mode 100644
index 00000000..50e9f86f
--- /dev/null
+++ b/pango/mini-fribidi/Makefile.am
@@ -0,0 +1,25 @@
+## Process this file with automake to produce Makefile.in
+
+INCLUDES = \
+ -DSYSCONFDIR=\"$(sysconfdir)\" \
+ -DLIBDIR=\"$(libdir)\" \
+ -I$(top_srcdir)
+
+LDADDS = @STRIP_BEGIN@ \
+ @x_ldflags@ \
+ @x_libs@ \
+ @GLIB_LIBS@ \
+ -lm \
+@STRIP_END@
+
+noinst_LTLIBRARIES = libmini-fribidi.la
+
+libmini_fribidi_la_SOURCES = \
+ fribidi_types.h \
+ fribidi_get_type.c \
+ fribidi.c
+
+EXTRA_DIST = \
+ README \
+ fribidi_tables.i \
+ fribidi-0.1.12.patch
diff --git a/pango/mini-fribidi/README b/pango/mini-fribidi/README
new file mode 100644
index 00000000..a3a81bdd
--- /dev/null
+++ b/pango/mini-fribidi/README
@@ -0,0 +1,44 @@
+This directory holds a stripped down version of Dov Grobgeld's FriBidi
+library. The files in here are taken from FriBidi 0.1.12, with the
+changes in fribidi-0.1.12.patch applied to them.
+
+Like Pango, FriBidi is licensed under the terms of the GNU Lesser
+General Public License - see the file COPYING in the toplevel
+directory of the Pango distribution.
+
+12 November 2000
+Owen Taylor
+
+
+From the README of Fribidi:
+
+
+This is is FriBidi, a Free Implementation of the Unicode BiDi algorithm.
+
+Background
+==========
+One of the missing links stopping the penetration of free software in
+Israel is the lack of support for Hebrew. In order to have proper
+Hebrew support, the BiDi algorithm must be implemented. It is my hope
+that this library will stimulate more Hebrew free software.
+
+Of course the BiDi algorithm is not limited to Hebrew, so I expect
+that our Arab neighbors will also find this software useful.
+
+Audience
+========
+
+It is my hope that this library will stimulate the implementation of
+Hebrew and Arabic in lots of free software. Here is a small list of
+projects that would benifit from the use of the FriBidi library, but
+of course there are many more: Wine, Mozilla, Gtk, Gnome, Qt, KDE,
+AbiWord, lynx.
+
+Downloading
+===========
+The latest version of FriBidi may be found at:
+
+ http://imagic.weizmann.ac.il/~dov/freesw/FriBidi
+
+
+
diff --git a/pango/mini-fribidi/fribidi-0.1.12.patch b/pango/mini-fribidi/fribidi-0.1.12.patch
new file mode 100644
index 00000000..b6f30428
--- /dev/null
+++ b/pango/mini-fribidi/fribidi-0.1.12.patch
@@ -0,0 +1,441 @@
+--- /home/otaylor/ftp/fribidi-0.1.12/fribidi.c Sat Jul 22 10:33:30 2000
++++ fribidi.c Sun Nov 12 15:12:09 2000
+@@ -17,8 +17,8 @@
+ * Boston, MA 02111-1307, USA.
+ */
+ #include <glib.h>
+-#include <stdio.h>
+-#include "fribidi.h"
++#include "pango/pango-utils.h"
++#include "fribidi_types.h"
+
+ /*======================================================================
+ // Typedef for the run-length list.
+@@ -39,47 +39,6 @@
+ FriBidiChar value;
+ } key_value_t;
+
+-/* Global variables */
+-gboolean fribidi_debug = FALSE;
+-
+-void fribidi_set_debug(gboolean debug)
+-{
+- fribidi_debug = debug;
+-}
+-
+-static int bidi_string_strlen(FriBidiChar *str)
+-{
+- int len = 0;
+-
+- while(*str++)
+- len++;
+-
+- return len;
+-}
+-
+-static void bidi_string_reverse(FriBidiChar *str, gint len)
+-{
+- int i;
+- for (i=0; i<len/2; i++)
+- {
+- FriBidiChar tmp = str[i];
+- str[i] = str[len-1-i];
+- str[len-1-i] = tmp;
+- }
+-}
+-
+-static void
+-int16_array_reverse(gint16 *arr, gint len)
+-{
+- int i;
+- for (i=0; i<len/2; i++)
+- {
+- gint tmp = arr[i];
+- arr[i] = arr[len-1-i];
+- arr[len-1-i] = tmp;
+- }
+-}
+-
+ static TypeLink *free_type_links = NULL;
+
+ static TypeLink *new_type_link()
+@@ -240,103 +199,6 @@
+ }
+
+ /*======================================================================
+-// For debugging, define some macros for printing the types and the
+-// levels.
+-//----------------------------------------------------------------------*/
+-static void print_types_re(TypeLink *pp)
+-{
+- while(pp)
+- {
+- printf("%d:%c(%d)[%d] ", RL_POS(pp), RL_TYPE(pp), RL_LEN(pp), RL_LEVEL(pp));
+- pp = pp->next;
+- }
+- printf("\n");
+-}
+-
+-static void print_resolved_levels(TypeLink *pp)
+-{
+- while(pp)
+- {
+- int i;
+- for (i=0; i<RL_LEN(pp); i++)
+- printf("%d", RL_LEVEL(pp));
+- pp = pp->next;
+- }
+- printf("\n");
+-}
+-
+-static void print_resolved_types(TypeLink *pp)
+-{
+- while(pp)
+- {
+- int i;
+- for (i=0; i<RL_LEN(pp); i++)
+- {
+- gchar ch;
+- FriBidiCharType type = RL_TYPE(pp);
+-
+- /* Convert the type to something readable */
+- if (type == FRIBIDI_TYPE_R)
+- ch = 'R';
+- else if (type == FRIBIDI_TYPE_L)
+- ch = 'L';
+- else if (type == FRIBIDI_TYPE_E)
+- ch = 'E';
+- else if (type == FRIBIDI_TYPE_EN)
+- ch = 'n';
+- else if (type == FRIBIDI_TYPE_N)
+- ch = 'N';
+- else
+- ch = '?';
+-
+- printf("%c", ch);
+- }
+- pp = pp->next;
+- }
+- printf("\n");
+-}
+-
+-static void print_bidi_string(FriBidiChar *str)
+-{
+- int i;
+- for (i=0; i<bidi_string_strlen(str); i++)
+- printf("%c", str[i]);
+- printf("\n");
+-}
+-
+-/*======================================================================
+-// search_rl_for strong searches the run length list in the direction
+-// indicated by dir for a strong directional. It returns a pointer to
+-// the found character or NULL if none is found. */
+-//----------------------------------------------------------------------*/
+-static TypeLink *
+-search_rl_for_strong(TypeLink *pos,
+- gint dir)
+-{
+- TypeLink *pp = pos;
+-
+- if (dir == -1)
+- {
+- for (pp = pos; pp; pp=pp->prev)
+- {
+- FriBidiCharType char_type = RL_TYPE(pp);
+- if (char_type == FRIBIDI_TYPE_R || char_type == FRIBIDI_TYPE_L)
+- return pp;
+- }
+- }
+- else
+- {
+- for (pp = pos; pp; pp=pp->next)
+- {
+- FriBidiCharType char_type = RL_TYPE(pp);
+- if (char_type == FRIBIDI_TYPE_R || char_type == FRIBIDI_TYPE_L)
+- return pp;
+- }
+- }
+- return NULL;
+-}
+-
+-/*======================================================================
+ // This function should follow the Unicode specification closely!
+ //
+ // It is still lacking the support for <RLO> and <LRO>.
+@@ -360,7 +222,7 @@
+ /* Determinate character types */
+ char_type = g_new(gint, len);
+ for (i=0; i<len; i++)
+- char_type[i] = fribidi_get_type(str[i]);
++ char_type[i] = _pango_fribidi_get_type (str[i]);
+
+ /* Run length encode the character types */
+ type_rl_list = run_length_encode_types(char_type, len);
+@@ -511,8 +373,6 @@
+ compact_list(type_rl_list);
+
+ /* 5. Resolving Neutral Types */
+- if (fribidi_debug)
+- fprintf(stderr,"Resolving neutral types.\n");
+
+ /* We can now collapse all separators and other neutral types to
+ plain neutrals */
+@@ -559,12 +419,8 @@
+ }
+
+ compact_list(type_rl_list);
+- if (fribidi_debug)
+- print_types_re(type_rl_list);
+
+ /* 6. Resolving Implicit levels */
+- if (fribidi_debug)
+- fprintf(stderr,"Resolving implicit levels.\n");
+ {
+ int level = base_level;
+ max_level = base_level;
+@@ -605,13 +461,6 @@
+
+ compact_list(type_rl_list);
+
+- if (fribidi_debug)
+- {
+- print_bidi_string(str);
+- print_resolved_levels(type_rl_list);
+- print_resolved_types(type_rl_list);
+- }
+-
+ *ptype_rl_list = type_rl_list;
+ *pmax_level = max_level;
+ *pbase_dir = base_dir;
+@@ -622,160 +471,26 @@
+ //----------------------------------------------------------------------*/
+
+ /*======================================================================
+-// fribidi_log2vis() calls the function_analyse_string() and then
+-// does reordering and fills in the output strings.
+-//----------------------------------------------------------------------*/
+-void fribidi_log2vis(/* input */
+- FriBidiChar *str,
+- gint len,
+- FriBidiCharType *pbase_dir,
+- /* output */
+- FriBidiChar *visual_str,
+- guint16 *position_L_to_V_list,
+- guint16 *position_V_to_L_list,
+- guint8 *embedding_level_list
+- )
+-{
+- TypeLink *type_rl_list, *pp = NULL;
+- int max_level;
+- gboolean private_L_to_V = FALSE;
+-
+- /* If v2l is to be calculated we must have l2v as well. If it is not
+- given by the caller, we have to make a private instance of it. */
+- if (position_V_to_L_list && !position_L_to_V_list)
+- {
+- private_L_to_V++;
+- position_L_to_V_list = g_new(guint16, len+1);
+- }
+-
+- if (len > (2L<<16)-1)
+- {
+- fprintf(stderr, "Fribidi can't handle strings > 65000 chars!\n");
+- return;
+- }
+- fribidi_analyse_string(str, len, pbase_dir,
+- /* output */
+- &type_rl_list,
+- &max_level);
+-
+- /* 7. Reordering resolved levels */
+- if (fribidi_debug)
+- fprintf(stderr, "Reordering.\n");
+-
+- {
+- int level_idx;
+- int i;
+-
+- /* Set up the ordering array to sorted order and copy the logical
+- string to the visual */
+- if (position_L_to_V_list)
+- for (i=0; i<len+1; i++)
+- position_L_to_V_list[i]=i;
+-
+- if (visual_str)
+- for (i=0; i<len+1; i++)
+- visual_str[i] = str[i];
+-
+- /* Assign the embedding level array */
+- if (embedding_level_list)
+- for (pp = type_rl_list->next; pp->next; pp = pp->next)
+- {
+- int i;
+- int pos = RL_POS(pp);
+- int len = RL_LEN(pp);
+- int level = RL_LEVEL(pp);
+- for (i=0; i<len; i++)
+- embedding_level_list[pos + i] = level;
+- }
+-
+- /* Reorder both the outstring and the order array*/
+- if (visual_str || position_L_to_V_list)
+- {
+-
+- if (visual_str)
+- /* Mirror all characters that are in odd levels and have mirrors */
+- for (pp = type_rl_list->next; pp->next; pp = pp->next)
+- {
+- if (RL_LEVEL(pp) % 2 == 1)
+- {
+- int i;
+- for (i=RL_POS(pp); i<RL_POS(pp)+RL_LEN(pp); i++)
+- {
+- FriBidiChar mirrored_ch;
+- if (fribidi_get_mirror_char(visual_str[i], &mirrored_ch))
+- visual_str[i] = mirrored_ch;
+- }
+- }
+- }
+-
+- /* Reorder */
+- for (level_idx = max_level; level_idx>0; level_idx--)
+- {
+- for (pp = type_rl_list->next; pp->next; pp = pp->next)
+- {
+- if (RL_LEVEL(pp) >= level_idx)
+- {
+- /* Find all stretches that are >= level_idx */
+- int len = RL_LEN(pp);
+- int pos = RL_POS(pp);
+- TypeLink *pp1 = pp->next;
+- while(pp1->next && RL_LEVEL(pp1) >= level_idx)
+- {
+- len+= RL_LEN(pp1);
+- pp1 = pp1->next;
+- }
+-
+- pp = pp1->prev;
+- if (visual_str)
+- bidi_string_reverse(visual_str+pos, len);
+- if (position_L_to_V_list)
+- int16_array_reverse(position_L_to_V_list+pos, len);
+-
+- }
+- }
+- }
+- }
+-
+- /* Convert the l2v list to v2l */
+- if (position_V_to_L_list && position_L_to_V_list)
+- for (i=0; i<len; i++)
+- position_V_to_L_list[position_L_to_V_list[i]] = i;
+- }
+-
+- /* Free up the rl_list */
+-
+- /* At this point, pp points to the last link or (rarely) might be NULL
+- */
+- if (!pp)
+- for (pp = type_rl_list->next; pp->next; pp = pp->next)
+- /* Nothing */;
+-
+- pp->next = free_type_links;
+- free_type_links = type_rl_list;
+-
+- /* Free up L_to_V if we allocated it */
+- if (private_L_to_V)
+- g_free(position_L_to_V_list);
+-
+-}
+-
+-/*======================================================================
+ // fribidi_embedding_levels() is used in order to just get the
+ // embedding levels.
+ //----------------------------------------------------------------------*/
+-void fribidi_log2vis_get_embedding_levels(
++void
++pango_log2vis_get_embedding_levels(
+ /* input */
+- FriBidiChar *str,
++ gunichar *str,
+ int len,
+- FriBidiCharType *pbase_dir,
++ PangoDirection *pbase_dir,
+ /* output */
+ guint8 *embedding_level_list
+ )
+ {
+ TypeLink *type_rl_list, *pp;
+ int max_level;
++ FriBidiCharType fribidi_base_dir;
++
++ fribidi_base_dir = (*pbase_dir == PANGO_DIRECTION_LTR) ? FRIBIDI_TYPE_L : FRIBIDI_TYPE_R;
+
+- fribidi_analyse_string(str, len, pbase_dir,
++ fribidi_analyse_string(str, len, &fribidi_base_dir,
+ /* output */
+ &type_rl_list,
+ &max_level);
+@@ -793,5 +508,7 @@
+ /* Free up the rl_list */
+ pp->next = free_type_links;
+ free_type_links = type_rl_list;
++
++ *pbase_dir = (fribidi_base_dir == FRIBIDI_TYPE_L) ? PANGO_DIRECTION_LTR : PANGO_DIRECTION_RTL;
+ }
+
+--- /home/otaylor/ftp/fribidi-0.1.12/fribidi_get_type.c Fri May 19 05:36:54 2000
++++ fribidi_get_type.c Sun Nov 12 14:42:56 2000
+@@ -18,13 +18,14 @@
+ */
+ #include <stdio.h>
+ #include <stdlib.h>
+-#include "fribidi.h"
++#include "pango/pango-utils.h"
++#include "fribidi_types.h"
+ #include "fribidi_tables.i"
+
+ /*======================================================================
+ // fribidi_get_type() returns the bidi type of a character.
+ //----------------------------------------------------------------------*/
+-FriBidiCharType fribidi_get_type(FriBidiChar uch)
++FriBidiCharType _pango_fribidi_get_type(FriBidiChar uch)
+ {
+ guchar *block = FriBidiPropertyBlocks[uch / 256];
+ if (block)
+@@ -34,10 +35,10 @@
+ }
+
+ gboolean
+-fribidi_get_mirror_char(/* Input */
+- FriBidiChar ch,
+- /* Output */
+- FriBidiChar *mirrored_ch)
++pango_get_mirror_char(/* Input */
++ gunichar ch,
++ /* Output */
++ gunichar *mirrored_ch)
+ {
+ int pos, step;
+ gboolean found = FALSE;
+--- /home/otaylor/ftp/fribidi-0.1.12/fribidi_tables.i Fri May 19 05:12:01 2000
++++ fribidi_tables.i Sun Nov 12 15:07:10 2000
+@@ -3,8 +3,6 @@
+ // by the perl script CreateGetType.pl.
+ //----------------------------------------------------------------------*/
+
+-#include "fribidi.h"
+-
+ #define LTR FRIBIDI_TYPE_LTR
+ #define RTL FRIBIDI_TYPE_RTL
+ #define EN FRIBIDI_TYPE_EN
+--- /home/otaylor/ftp/fribidi-0.1.12/fribidi_types.h Fri May 19 05:07:48 2000
++++ fribidi_types.h Sun Nov 12 14:40:58 2000
+@@ -96,4 +96,6 @@
+ void *attribute;
+ } FriBidiRunType;
+
++FriBidiCharType _pango_fribidi_get_type(FriBidiChar uch);
++
+ #endif
diff --git a/pango/mini-fribidi/fribidi.c b/pango/mini-fribidi/fribidi.c
new file mode 100644
index 00000000..e4d7efce
--- /dev/null
+++ b/pango/mini-fribidi/fribidi.c
@@ -0,0 +1,514 @@
+/* FriBidi - Library of BiDi algorithm
+ * Copyright (C) 1999 Dov Grobgeld
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+#include <glib.h>
+#include "pango/pango-utils.h"
+#include "fribidi_types.h"
+
+/*======================================================================
+// Typedef for the run-length list.
+//----------------------------------------------------------------------*/
+typedef struct _TypeLink TypeLink;
+
+struct _TypeLink {
+ TypeLink *prev;
+ TypeLink *next;
+ FriBidiCharType type;
+ int pos;
+ int len;
+ int level;
+};
+
+typedef struct {
+ FriBidiChar key;
+ FriBidiChar value;
+} key_value_t;
+
+static TypeLink *free_type_links = NULL;
+
+static TypeLink *new_type_link()
+{
+ TypeLink *link;
+
+ if (free_type_links)
+ {
+ link = free_type_links;
+ free_type_links = free_type_links->next;
+ }
+ else
+ {
+ static GMemChunk *mem_chunk = NULL;
+
+ if (!mem_chunk)
+ mem_chunk = g_mem_chunk_new ("TypeLinkList",
+ sizeof (TypeLink),
+ sizeof (TypeLink) * 128,
+ G_ALLOC_ONLY);
+
+ link = g_chunk_new (TypeLink, mem_chunk);
+ }
+
+ link->len = 0;
+ link->pos = 0;
+ link->level = 0;
+ link->next = NULL;
+ link->prev = NULL;
+ return link;
+}
+
+static void free_type_link(TypeLink *link)
+{
+ link->next = free_type_links;
+ free_type_links = link;
+}
+
+static TypeLink *run_length_encode_types(int *char_type, int type_len)
+{
+ TypeLink *list = NULL;
+ TypeLink *last;
+ TypeLink *link;
+ FriBidiCharType type;
+ int len, pos, i;
+
+ /* Add the starting link */
+ list = new_type_link();
+ list->type = FRIBIDI_TYPE_SOT;
+ list->len = 0;
+ list->pos = 0;
+ last = list;
+
+ /* Sweep over the string_types */
+ type = -1;
+ len = 0;
+ pos = -1;
+ for (i=0; i<=type_len; i++)
+ {
+ if (i==type_len || char_type[i] != type)
+ {
+ if (pos>=0)
+ {
+ link = new_type_link();
+ link->type = type;
+ link->pos = pos;
+ link->len = len;
+ last->next = link;
+ link->prev = last;
+ last = last->next;
+ }
+ if (i==type_len)
+ break;
+ len = 0;
+ pos = i;
+ }
+ type =char_type[i];
+ len++;
+ }
+
+ /* Add the ending link */
+ link = new_type_link();
+ link->type = FRIBIDI_TYPE_EOT;
+ link->len = 0;
+ link->pos = type_len;
+ last->next = link;
+ link->prev = last;
+
+ return list;
+}
+
+/* Some convenience macros */
+#define RL_TYPE(list) (list)->type
+#define RL_LEN(list) (list)->len
+#define RL_POS(list) (list)->pos
+#define RL_LEVEL(list) (list)->level
+
+static void compact_list(TypeLink *list)
+{
+ while(list)
+ {
+ if (list->prev
+ && RL_TYPE(list->prev) == RL_TYPE(list))
+ {
+ TypeLink *next = list->next;
+ list->prev->next = list->next;
+ list->next->prev = list->prev;
+ RL_LEN(list->prev) = RL_LEN(list->prev) + RL_LEN(list);
+ free_type_link(list);
+ list = next;
+ }
+ else
+ list = list->next;
+ }
+}
+
+/* Define a rule macro */
+
+/* Rules for overriding current type */
+#define TYPE_RULE1(old_this, \
+ new_this) \
+ if (this_type == TYPE_ ## old_this) \
+ RL_TYPE(pp) = FRIBIDI_TYPE_ ## new_this; \
+
+/* Rules for current and previous type */
+#define TYPE_RULE2(old_prev, old_this, \
+ new_prev, new_this) \
+ if ( prev_type == FRIBIDI_TYPE_ ## old_prev \
+ && this_type == FRIBIDI_TYPE_ ## old_this) \
+ { \
+ RL_TYPE(pp->prev) = FRIBIDI_TYPE_ ## new_prev; \
+ RL_TYPE(pp) = FRIBIDI_TYPE_ ## new_this; \
+ continue; \
+ }
+
+/* A full rule that assigns all three types */
+#define TYPE_RULE(old_prev, old_this, old_next, \
+ new_prev, new_this, new_next) \
+ if ( prev_type == FRIBIDI_TYPE_ ## old_prev \
+ && this_type == FRIBIDI_TYPE_ ## old_this \
+ && next_type == FRIBIDI_TYPE_ ## old_next) \
+ { \
+ RL_TYPE(pp->prev) = FRIBIDI_TYPE_ ## new_prev; \
+ RL_TYPE(pp) = FRIBIDI_TYPE_ ## new_this; \
+ RL_TYPE(pp->next) = FRIBIDI_TYPE_ ## new_next; \
+ continue; \
+ }
+
+/* For optimization the following macro only assigns the center type */
+#define TYPE_RULE_C(old_prev, old_this, old_next, \
+ new_this) \
+ if ( prev_type == FRIBIDI_TYPE_ ## old_prev \
+ && this_type == FRIBIDI_TYPE_ ## old_this \
+ && next_type == FRIBIDI_TYPE_ ## old_next) \
+ { \
+ RL_TYPE(pp) = FRIBIDI_TYPE_ ## new_this; \
+ continue; \
+ }
+
+/*======================================================================
+// This function should follow the Unicode specification closely!
+//
+// It is still lacking the support for <RLO> and <LRO>.
+//----------------------------------------------------------------------*/
+static void
+fribidi_analyse_string(/* input */
+ FriBidiChar *str,
+ int len,
+ FriBidiCharType *pbase_dir,
+ /* output */
+ TypeLink **ptype_rl_list,
+ gint *pmax_level)
+{
+ int base_level, base_dir;
+ int max_level;
+ int i;
+ int *char_type;
+ int prev_last_strong, last_strong;
+ TypeLink *type_rl_list, *pp;
+
+ /* Determinate character types */
+ char_type = g_new(gint, len);
+ for (i=0; i<len; i++)
+ char_type[i] = _pango_fribidi_get_type (str[i]);
+
+ /* Run length encode the character types */
+ type_rl_list = run_length_encode_types(char_type, len);
+ g_free(char_type);
+
+ /* Find the base level */
+ if (*pbase_dir == FRIBIDI_TYPE_L)
+ {
+ base_dir = FRIBIDI_TYPE_L;
+ base_level = 0;
+ }
+ else if (*pbase_dir == FRIBIDI_TYPE_R)
+ {
+ base_dir = FRIBIDI_TYPE_R;
+ base_level = 1;
+ }
+
+ /* Search for first strong character and use its direction as base
+ direciton */
+ else
+ {
+ base_level = 0; /* Default */
+ base_dir = FRIBIDI_TYPE_N;
+ for (pp = type_rl_list; pp; pp = pp->next)
+ {
+ if (RL_TYPE(pp) == FRIBIDI_TYPE_R)
+ {
+ base_level = 1;
+ base_dir = FRIBIDI_TYPE_R;
+ break;
+ }
+ else if (RL_TYPE(pp) == FRIBIDI_TYPE_L)
+ {
+ base_level = 0;
+ base_dir = FRIBIDI_TYPE_L;
+ break;
+ }
+ }
+
+ /* If no strong base_dir was found, resort to the weak direction
+ * that was passed on input.
+ */
+ if (base_dir == FRIBIDI_TYPE_N)
+ {
+ if (*pbase_dir == FRIBIDI_TYPE_WR)
+ {
+ base_dir = FRIBIDI_TYPE_RTL;
+ base_level = 1;
+ }
+ else if (*pbase_dir == FRIBIDI_TYPE_WL)
+ {
+ base_dir = FRIBIDI_TYPE_LTR;
+ base_level = 0;
+ }
+ }
+ }
+
+ /* 1. Explicit Levels and Directions. TBD! */
+ compact_list(type_rl_list);
+
+ /* 2. Explicit Overrides. TBD! */
+ compact_list(type_rl_list);
+
+ /* 3. Terminating Embeddings and overrides. TBD! */
+ compact_list(type_rl_list);
+
+ /* 4. Resolving weak types */
+ last_strong = base_dir;
+ for (pp = type_rl_list->next; pp->next; pp = pp->next)
+ {
+ int prev_type = RL_TYPE(pp->prev);
+ int this_type = RL_TYPE(pp);
+ int next_type = RL_TYPE(pp->next);
+
+ /* Remember the last strong character */
+ if (prev_type == FRIBIDI_TYPE_AL
+ || prev_type == FRIBIDI_TYPE_R
+ || prev_type == FRIBIDI_TYPE_L)
+ last_strong = prev_type;
+
+ /* W1. NSM */
+ if (this_type == FRIBIDI_TYPE_NSM)
+ {
+ if (prev_type == FRIBIDI_TYPE_SOT)
+ RL_TYPE(pp) = FRIBIDI_TYPE_N; /* Will be resolved to base dir */
+ else
+ RL_TYPE(pp) = prev_type;
+ }
+
+ /* W2: European numbers */
+ if (this_type == FRIBIDI_TYPE_N
+ && last_strong == FRIBIDI_TYPE_AL)
+ RL_TYPE(pp) = FRIBIDI_TYPE_AN;
+
+ /* W3: Change ALs to R
+ We have to do this for prev character as we would otherwise
+ interfer with the next last_strong which is FRIBIDI_TYPE_AL.
+ */
+ if (prev_type == FRIBIDI_TYPE_AL)
+ RL_TYPE(pp->prev) = FRIBIDI_TYPE_R;
+
+ /* W4. A single european separator changes to a european number.
+ A single common separator between two numbers of the same type
+ changes to that type.
+ */
+ if (RL_LEN(pp) == 1)
+ {
+ TYPE_RULE_C(EN,ES,EN, EN);
+ TYPE_RULE_C(EN,CS,EN, EN);
+ TYPE_RULE_C(AN,CS,AN, AN);
+ }
+
+ /* W5. A sequence of European terminators adjacent to European
+ numbers changes to All European numbers.
+ */
+ if (this_type == FRIBIDI_TYPE_ET)
+ {
+ if (next_type == FRIBIDI_TYPE_EN
+ || prev_type == FRIBIDI_TYPE_EN) {
+ RL_TYPE(pp) = FRIBIDI_TYPE_EN;
+ }
+ }
+
+ /* This type may have been overriden */
+ this_type = RL_TYPE(pp);
+
+ /* W6. Otherwise change separators and terminators to other neutral */
+ if (this_type == FRIBIDI_TYPE_ET
+ || this_type == FRIBIDI_TYPE_CS
+ || this_type == FRIBIDI_TYPE_ES)
+ RL_TYPE(pp) = FRIBIDI_TYPE_ON;
+
+ /* W7. Change european numbers to L. */
+ if (prev_type == FRIBIDI_TYPE_EN
+ && last_strong == FRIBIDI_TYPE_L)
+ RL_TYPE(pp->prev) = FRIBIDI_TYPE_L;
+ }
+
+ /* Handle the two rules that effect pp->prev for the last element */
+
+ if (RL_TYPE (pp->prev) == FRIBIDI_TYPE_AL) /* W3 */
+ RL_TYPE(pp->prev) = FRIBIDI_TYPE_R;
+ if (RL_TYPE (pp->prev) == FRIBIDI_TYPE_EN /* W7 */
+ && last_strong == FRIBIDI_TYPE_L)
+ RL_TYPE(pp->prev) = FRIBIDI_TYPE_L;
+
+
+ compact_list(type_rl_list);
+
+ /* 5. Resolving Neutral Types */
+
+ /* We can now collapse all separators and other neutral types to
+ plain neutrals */
+ for (pp = type_rl_list->next; pp->next; pp = pp->next)
+ {
+ int this_type = RL_TYPE(pp);
+
+ if ( this_type == FRIBIDI_TYPE_WS
+ || this_type == FRIBIDI_TYPE_ON
+ || this_type == FRIBIDI_TYPE_ES
+ || this_type == FRIBIDI_TYPE_ET
+ || this_type == FRIBIDI_TYPE_CS
+ || this_type == FRIBIDI_TYPE_BN)
+ RL_TYPE(pp) = FRIBIDI_TYPE_N;
+ }
+
+ compact_list(type_rl_list);
+
+ for (pp = type_rl_list->next; pp->next; pp = pp->next)
+ {
+ int prev_type = RL_TYPE(pp->prev);
+ int this_type = RL_TYPE(pp);
+ int next_type = RL_TYPE(pp->next);
+
+ if (this_type == FRIBIDI_TYPE_N) /* optimization! */
+ {
+ /* "European and arabic numbers are treated
+ as though they were R" */
+
+ if (prev_type == FRIBIDI_TYPE_EN || prev_type == FRIBIDI_TYPE_AN)
+ prev_type = FRIBIDI_TYPE_R;
+
+ if (next_type == FRIBIDI_TYPE_EN || next_type == FRIBIDI_TYPE_AN)
+ next_type = FRIBIDI_TYPE_R;
+
+ /* N1. */
+ TYPE_RULE_C(R,N,R, R);
+ TYPE_RULE_C(L,N,L, L);
+
+ /* N2. Any remaining neutrals takes the embedding direction */
+ if (RL_TYPE(pp) == FRIBIDI_TYPE_N)
+ RL_TYPE(pp) = FRIBIDI_TYPE_E;
+ }
+ }
+
+ compact_list(type_rl_list);
+
+ /* 6. Resolving Implicit levels */
+ {
+ int level = base_level;
+ max_level = base_level;
+
+ for (pp = type_rl_list->next; pp->next; pp = pp->next)
+ {
+ int this_type = RL_TYPE(pp);
+
+ /* This code should be expanded to handle explicit directions! */
+
+ /* Even */
+ if (level % 2 == 0)
+ {
+ if (this_type == FRIBIDI_TYPE_R)
+ RL_LEVEL(pp) = level + 1;
+ else if (this_type == FRIBIDI_TYPE_AN)
+ RL_LEVEL(pp) = level + 2;
+ else if (RL_TYPE(pp->prev) != FRIBIDI_TYPE_L && this_type == FRIBIDI_TYPE_EN)
+ RL_LEVEL(pp) = level + 2;
+ else
+ RL_LEVEL(pp) = level;
+ }
+ /* Odd */
+ else
+ {
+ if ( this_type == FRIBIDI_TYPE_L
+ || this_type == FRIBIDI_TYPE_AN
+ || this_type == FRIBIDI_TYPE_EN)
+ RL_LEVEL(pp) = level+1;
+ else
+ RL_LEVEL(pp) = level;
+ }
+
+ if (RL_LEVEL(pp) > max_level)
+ max_level = RL_LEVEL(pp);
+ }
+ }
+
+ compact_list(type_rl_list);
+
+ *ptype_rl_list = type_rl_list;
+ *pmax_level = max_level;
+ *pbase_dir = base_dir;
+}
+
+/*======================================================================
+// Here starts the exposed front end functions.
+//----------------------------------------------------------------------*/
+
+/*======================================================================
+// fribidi_embedding_levels() is used in order to just get the
+// embedding levels.
+//----------------------------------------------------------------------*/
+void
+pango_log2vis_get_embedding_levels(
+ /* input */
+ gunichar *str,
+ int len,
+ PangoDirection *pbase_dir,
+ /* output */
+ guint8 *embedding_level_list
+ )
+{
+ TypeLink *type_rl_list, *pp;
+ int max_level;
+ FriBidiCharType fribidi_base_dir;
+
+ fribidi_base_dir = (*pbase_dir == PANGO_DIRECTION_LTR) ? FRIBIDI_TYPE_L : FRIBIDI_TYPE_R;
+
+ fribidi_analyse_string(str, len, &fribidi_base_dir,
+ /* output */
+ &type_rl_list,
+ &max_level);
+
+ for (pp = type_rl_list->next; pp->next; pp = pp->next)
+ {
+ int i;
+ int pos = RL_POS(pp);
+ int len = RL_LEN(pp);
+ int level = RL_LEVEL(pp);
+ for (i=0; i<len; i++)
+ embedding_level_list[pos + i] = level;
+ }
+
+ /* Free up the rl_list */
+ pp->next = free_type_links;
+ free_type_links = type_rl_list;
+
+ *pbase_dir = (fribidi_base_dir == FRIBIDI_TYPE_L) ? PANGO_DIRECTION_LTR : PANGO_DIRECTION_RTL;
+}
+
diff --git a/pango/mini-fribidi/fribidi_get_type.c b/pango/mini-fribidi/fribidi_get_type.c
new file mode 100644
index 00000000..3daad57b
--- /dev/null
+++ b/pango/mini-fribidi/fribidi_get_type.c
@@ -0,0 +1,75 @@
+/* FriBidi - Library of BiDi algorithm
+ * Copyright (C) 1999 Dov Grobgeld
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+#include <stdio.h>
+#include <stdlib.h>
+#include "pango/pango-utils.h"
+#include "fribidi_types.h"
+#include "fribidi_tables.i"
+
+/*======================================================================
+// fribidi_get_type() returns the bidi type of a character.
+//----------------------------------------------------------------------*/
+FriBidiCharType _pango_fribidi_get_type(FriBidiChar uch)
+{
+ guchar *block = FriBidiPropertyBlocks[uch / 256];
+ if (block)
+ return block[uch % 256];
+ else
+ return 0;
+}
+
+gboolean
+pango_get_mirror_char(/* Input */
+ gunichar ch,
+ /* Output */
+ gunichar *mirrored_ch)
+{
+ int pos, step;
+ gboolean found = FALSE;
+
+ pos = step = (nFriBidiMirroredChars/2)+1;
+
+ while(step > 1)
+ {
+ FriBidiChar cmp_ch = FriBidiMirroredChars[pos].ch;
+ step = (step+1)/2;
+
+ if (cmp_ch < ch)
+ {
+ pos += step;
+ if (pos>nFriBidiMirroredChars-1)
+ pos = nFriBidiMirroredChars-1;
+ }
+ else if (cmp_ch > ch)
+ {
+ pos -= step;
+ if (pos<0)
+ pos=0;
+ }
+ else
+ break;
+ }
+ if (FriBidiMirroredChars[pos].ch == ch)
+ {
+ *mirrored_ch = FriBidiMirroredChars[pos].mirrored_ch;
+ found = TRUE;
+ }
+ return found;
+}
+
diff --git a/pango/mini-fribidi/fribidi_tables.i b/pango/mini-fribidi/fribidi_tables.i
new file mode 100644
index 00000000..754ce66a
--- /dev/null
+++ b/pango/mini-fribidi/fribidi_tables.i
@@ -0,0 +1,1052 @@
+/*======================================================================
+// This file was automatically created from PropList-3.0.txt
+// by the perl script CreateGetType.pl.
+//----------------------------------------------------------------------*/
+
+#define LTR FRIBIDI_TYPE_LTR
+#define RTL FRIBIDI_TYPE_RTL
+#define EN FRIBIDI_TYPE_EN
+#define ES FRIBIDI_TYPE_ES
+#define ET FRIBIDI_TYPE_ET
+#define AN FRIBIDI_TYPE_AN
+#define CS FRIBIDI_TYPE_CS
+#define BS FRIBIDI_TYPE_BS
+#define SS FRIBIDI_TYPE_SS
+#define CTL FRIBIDI_TYPE_CTL
+#define LRE FRIBIDI_TYPE_LRE
+#define RLE FRIBIDI_TYPE_RLE
+#define LRO FRIBIDI_TYPE_LRO
+#define RLO FRIBIDI_TYPE_RLO
+#define WS FRIBIDI_TYPE_WS
+#define ON FRIBIDI_TYPE_ON
+#define AL FRIBIDI_TYPE_AL
+#define NSM FRIBIDI_TYPE_NSM
+#define BN FRIBIDI_TYPE_BN
+#define PDF FRIBIDI_TYPE_PDF
+#define EO FRIBIDI_TYPE_EO
+
+
+guchar FriBidiPropertyBlock0000[256] = {
+ BN ,BN ,BN ,BN ,BN ,BN ,BN ,BN ,BN ,SS ,BS ,SS ,WS ,BS ,BN ,BN ,
+ BN ,BN ,BN ,BN ,BN ,BN ,BN ,BN ,BN ,BN ,BN ,BN ,BS ,BS ,BS ,SS ,
+ WS ,ON ,ON ,ET ,ET ,ET ,ON ,ON ,ON ,ON ,ON ,ET ,CS ,ET ,CS ,ES ,
+ EN ,EN ,EN ,EN ,EN ,EN ,EN ,EN ,EN ,EN ,CS ,ON ,ON ,ON ,ON ,ON ,
+ ON ,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,ON ,ON ,ON ,ON ,ON ,
+ ON ,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,ON ,ON ,ON ,ON ,BN ,
+ BN ,BN ,BN ,BN ,BN ,BS ,BN ,BN ,BN ,BN ,BN ,BN ,BN ,BN ,BN ,BN ,
+ BN ,BN ,BN ,BN ,BN ,BN ,BN ,BN ,BN ,BN ,BN ,BN ,BN ,BN ,BN ,BN ,
+ CS ,ON ,ET ,ET ,ET ,ET ,ON ,ON ,ON ,ON ,LTR,ON ,ON ,ON ,ON ,ON ,
+ ET ,ET ,EN ,EN ,ON ,LTR,ON ,ON ,ON ,EN ,LTR,ON ,ON ,ON ,ON ,ON ,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,ON ,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,ON ,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+};
+
+guchar FriBidiPropertyBlock0100[256] = {
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+};
+
+guchar FriBidiPropertyBlock0200[256] = {
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,ON ,ON ,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,
+ LTR,LTR,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,
+ LTR,LTR,LTR,LTR,LTR,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+};
+
+guchar FriBidiPropertyBlock0300[256] = {
+ NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,
+ NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,
+ NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,
+ NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,
+ NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,
+ NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,
+ NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,
+ NSM,NSM,NSM,NSM,ON ,ON ,ON ,ON ,ON ,ON ,LTR,LTR,LTR,LTR,ON ,ON ,
+ ON ,ON ,ON ,ON ,ON ,ON ,LTR,ON ,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+};
+
+guchar FriBidiPropertyBlock0400[256] = {
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+};
+
+guchar FriBidiPropertyBlock0500[256] = {
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,ON ,ON ,ON ,ON ,ON ,ON ,
+ ON ,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,
+ NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,
+ NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,RTL,NSM,
+ RTL,NSM,NSM,RTL,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,
+ RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,
+ RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,
+ RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,
+};
+
+guchar FriBidiPropertyBlock0600[256] = {
+ CS ,CS ,CS ,CS ,CS ,CS ,CS ,CS ,CS ,CS ,CS ,CS ,CS ,CS ,CS ,CS ,
+ CS ,CS ,CS ,CS ,CS ,CS ,CS ,CS ,CS ,CS ,CS ,AL ,AL ,AL ,AL ,AL ,
+ AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,
+ AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,
+ AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,NSM,NSM,NSM,NSM,NSM,
+ NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,
+ AN ,AN ,AN ,AN ,AN ,AN ,AN ,AN ,AN ,AN ,ET ,AN ,AN ,AL ,AL ,AL ,
+ NSM,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,
+ AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,
+ AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,
+ AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,
+ AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,
+ AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,
+ AL ,AL ,AL ,AL ,AL ,AL ,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,
+ NSM,NSM,NSM,NSM,NSM,AL ,AL ,NSM,NSM,ON ,NSM,NSM,NSM,NSM,NSM,NSM,
+ EN ,EN ,EN ,EN ,EN ,EN ,EN ,EN ,EN ,EN ,AL ,AL ,AL ,AL ,AL ,AL ,
+};
+
+guchar FriBidiPropertyBlock0700[256] = {
+ AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,BN ,
+ AL ,NSM,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,
+ AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,
+ NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,
+ NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,
+ NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,
+ NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,
+ NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,
+ AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,
+ AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,
+ AL ,AL ,AL ,AL ,AL ,AL ,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,
+ NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,
+ NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,
+ NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,
+ NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,
+ NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,
+};
+
+guchar FriBidiPropertyBlock0900[256] = {
+ NSM,NSM,NSM,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,NSM,LTR,LTR,LTR,
+ LTR,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,LTR,LTR,LTR,LTR,NSM,NSM,NSM,
+ LTR,NSM,NSM,NSM,NSM,NSM,NSM,NSM,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,NSM,NSM,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,NSM,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,NSM,NSM,LTR,LTR,
+ LTR,NSM,NSM,NSM,NSM,NSM,NSM,LTR,LTR,LTR,LTR,LTR,LTR,NSM,NSM,NSM,
+ NSM,NSM,NSM,NSM,NSM,NSM,NSM,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,NSM,NSM,NSM,NSM,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,ET ,ET ,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+};
+
+guchar FriBidiPropertyBlock0a00[256] = {
+ NSM,NSM,NSM,NSM,NSM,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,NSM,NSM,LTR,LTR,
+ LTR,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,
+ NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ NSM,NSM,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,NSM,NSM,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,NSM,LTR,LTR,LTR,
+ LTR,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,LTR,LTR,LTR,LTR,NSM,NSM,NSM,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+};
+
+guchar FriBidiPropertyBlock0b00[256] = {
+ NSM,NSM,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,NSM,LTR,LTR,NSM,
+ LTR,NSM,NSM,NSM,NSM,NSM,NSM,LTR,LTR,LTR,LTR,LTR,LTR,NSM,NSM,NSM,
+ NSM,NSM,NSM,NSM,NSM,NSM,NSM,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,NSM,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ NSM,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,NSM,NSM,NSM,
+ NSM,NSM,NSM,NSM,NSM,NSM,NSM,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+};
+
+guchar FriBidiPropertyBlock0c00[256] = {
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,NSM,NSM,
+ NSM,LTR,LTR,LTR,LTR,LTR,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,
+ NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,NSM,
+ LTR,LTR,LTR,LTR,LTR,LTR,NSM,LTR,LTR,LTR,LTR,LTR,NSM,NSM,NSM,NSM,
+ NSM,NSM,NSM,NSM,NSM,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+};
+
+guchar FriBidiPropertyBlock0d00[256] = {
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,NSM,NSM,NSM,NSM,NSM,LTR,LTR,LTR,LTR,LTR,LTR,LTR,NSM,NSM,NSM,
+ NSM,NSM,NSM,NSM,NSM,NSM,NSM,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,NSM,NSM,NSM,NSM,NSM,LTR,
+ LTR,LTR,NSM,NSM,NSM,NSM,NSM,NSM,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+};
+
+guchar FriBidiPropertyBlock0e00[256] = {
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,NSM,LTR,LTR,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,ET ,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,NSM,LTR,LTR,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+};
+
+guchar FriBidiPropertyBlock0f00[256] = {
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,NSM,NSM,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,NSM,LTR,NSM,LTR,NSM,ON ,ON ,ON ,ON ,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,LTR,
+ NSM,NSM,NSM,NSM,NSM,LTR,NSM,NSM,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,
+ NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,
+ NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,NSM,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+};
+
+guchar FriBidiPropertyBlock1000[256] = {
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,NSM,NSM,NSM,
+ NSM,LTR,NSM,NSM,NSM,NSM,NSM,NSM,LTR,NSM,NSM,NSM,NSM,NSM,NSM,NSM,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,
+ NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,
+ NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,
+ NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,
+ NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+};
+
+guchar FriBidiPropertyBlock1600[256] = {
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ WS ,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,ON ,ON ,ON ,ON ,ON ,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+};
+
+guchar FriBidiPropertyBlock1700[256] = {
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,NSM,NSM,NSM,NSM,NSM,NSM,NSM,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,NSM,LTR,LTR,NSM,NSM,NSM,NSM,NSM,NSM,NSM,
+ NSM,NSM,NSM,NSM,LTR,LTR,LTR,LTR,LTR,LTR,LTR,ET ,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+};
+
+guchar FriBidiPropertyBlock1800[256] = {
+ ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,BN ,BN ,BN ,BN ,BN ,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,NSM,NSM,NSM,NSM,NSM,NSM,NSM,
+ NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,
+ NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,
+ NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,
+ NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,
+ NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,
+};
+
+guchar FriBidiPropertyBlock1f00[256] = {
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,ON ,LTR,ON ,
+ ON ,ON ,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,ON ,ON ,ON ,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,ON ,ON ,ON ,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,ON ,ON ,ON ,
+ ON ,ON ,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,ON ,ON ,ON ,
+};
+
+guchar FriBidiPropertyBlock2000[256] = {
+ WS ,WS ,WS ,WS ,WS ,WS ,WS ,WS ,WS ,WS ,WS ,BN ,BN ,BN ,LTR,RTL,
+ ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,
+ ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,WS ,BS ,LRE,RLE,PDF,LRO,RLO,WS ,
+ ET ,ET ,ET ,ET ,ET ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,
+ ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,
+ ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,
+ ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,BN ,BN ,BN ,BN ,BN ,BN ,
+ EN ,EN ,EN ,EN ,EN ,EN ,EN ,EN ,EN ,EN ,ET ,ET ,ON ,ON ,ON ,LTR,
+ EN ,EN ,EN ,EN ,EN ,EN ,EN ,EN ,EN ,EN ,ET ,ET ,ON ,ON ,ON ,ON ,
+ ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,
+ ET ,ET ,ET ,ET ,ET ,ET ,ET ,ET ,ET ,ET ,ET ,ET ,ET ,ET ,ET ,ET ,
+ ET ,ET ,ET ,ET ,ET ,ET ,ET ,ET ,ET ,ET ,ET ,ET ,ET ,ET ,ET ,ET ,
+ ET ,ET ,ET ,ET ,ET ,ET ,ET ,ET ,ET ,ET ,ET ,ET ,ET ,ET ,ET ,ET ,
+ NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,
+ NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,
+ NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,
+};
+
+guchar FriBidiPropertyBlock2100[256] = {
+ ON ,ON ,LTR,ON ,ON ,ON ,ON ,LTR,ON ,ON ,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,ON ,LTR,ON ,ON ,ON ,LTR,LTR,LTR,LTR,LTR,ON ,ON ,
+ ON ,ON ,ON ,ON ,LTR,ON ,LTR,ON ,LTR,ON ,LTR,LTR,LTR,LTR,ET ,LTR,
+ LTR,LTR,ON ,LTR,LTR,LTR,LTR,LTR,LTR,LTR,ON ,ON ,ON ,ON ,ON ,ON ,
+ ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,
+ ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,
+ ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,
+ ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,
+ ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,
+ ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,
+ ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,
+ ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,
+};
+
+guchar FriBidiPropertyBlock2200[256] = {
+ ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,
+ ON ,ON ,ET ,ET ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,
+ ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,
+ ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,
+ ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,
+ ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,
+ ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,
+ ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,
+ ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,
+ ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,
+ ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,
+ ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,
+ ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,
+ ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,
+ ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,
+ ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,
+};
+
+guchar FriBidiPropertyBlock2300[256] = {
+ ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,
+ ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,
+ ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,
+ ON ,ON ,ON ,ON ,ON ,ON ,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,ON ,ON ,ON ,ON ,ON ,
+ ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,
+ ON ,ON ,ON ,ON ,ON ,LTR,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,
+ ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,
+ ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,
+ ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,
+ ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,
+ ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,
+ ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,
+};
+
+guchar FriBidiPropertyBlock2400[256] = {
+ ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,
+ ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,
+ ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,
+ ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,
+ ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,
+ ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,
+ EN ,EN ,EN ,EN ,EN ,EN ,EN ,EN ,EN ,EN ,EN ,EN ,EN ,EN ,EN ,EN ,
+ EN ,EN ,EN ,EN ,EN ,EN ,EN ,EN ,EN ,EN ,EN ,EN ,EN ,EN ,EN ,EN ,
+ EN ,EN ,EN ,EN ,EN ,EN ,EN ,EN ,EN ,EN ,EN ,EN ,EN ,EN ,EN ,EN ,
+ EN ,EN ,EN ,EN ,EN ,EN ,EN ,EN ,EN ,EN ,EN ,EN ,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,EN ,EN ,EN ,EN ,EN ,EN ,
+ EN ,EN ,EN ,EN ,EN ,EN ,EN ,EN ,EN ,EN ,EN ,EN ,EN ,EN ,EN ,EN ,
+};
+
+guchar FriBidiPropertyBlock2500[256] = {
+ ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,
+ ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,
+ ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,
+ ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,
+ ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,
+ ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,
+ ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,
+ ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,
+ ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,
+ ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,
+ ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,
+ ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,
+ ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,
+ ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,
+ ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,
+ ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,
+};
+
+guchar FriBidiPropertyBlock3000[256] = {
+ WS ,ON ,ON ,ON ,ON ,LTR,LTR,LTR,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,
+ ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,
+ ON ,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,NSM,NSM,NSM,NSM,NSM,NSM,
+ ON ,LTR,LTR,LTR,LTR,LTR,ON ,ON ,LTR,LTR,LTR,LTR,LTR,LTR,ON ,ON ,
+ ON ,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,NSM,NSM,ON ,ON ,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,ON ,LTR,LTR,LTR,LTR,
+};
+
+guchar FriBidiPropertyBlocka400[256] = {
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,
+ ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,
+ ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,
+ ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,
+ ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,
+ ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,
+ ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,
+};
+
+guchar FriBidiPropertyBlockf800[256] = {
+ NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,
+ NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,
+ NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,
+ NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,
+ NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,
+ NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,
+ NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,
+ NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,
+ NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,
+ NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,
+ NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,
+ NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,
+ NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,
+ NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,
+ NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,
+ NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,
+};
+
+guchar FriBidiPropertyBlockfb00[256] = {
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,RTL,NSM,RTL,
+ RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,ET ,RTL,RTL,RTL,RTL,RTL,RTL,
+ RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,
+ RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,RTL,
+ AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,
+ AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,
+ AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,
+ AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,
+ AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,
+ AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,
+ AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,
+ AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,
+ AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,
+ AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,
+ AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,
+};
+
+guchar FriBidiPropertyBlockfc00[256] = {
+ AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,
+ AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,
+ AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,
+ AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,
+ AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,
+ AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,
+ AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,
+ AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,
+ AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,
+ AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,
+ AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,
+ AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,
+ AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,
+ AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,
+ AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,
+ AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,
+};
+
+guchar FriBidiPropertyBlockfd00[256] = {
+ AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,
+ AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,
+ AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,
+ AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,ON ,ON ,
+ ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,
+ AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,
+ AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,
+ AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,
+ AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,
+ AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,
+ AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,
+ AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,
+ AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,
+ AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,
+ AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,
+ AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,
+};
+
+guchar FriBidiPropertyBlockfe00[256] = {
+ NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,
+ NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,
+ NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,NSM,
+ ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,
+ ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,
+ CS ,ON ,CS ,CS ,ON ,CS ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ET ,
+ ON ,ON ,ET ,ET ,ON ,ON ,ON ,ON ,ON ,ET ,ET ,ON ,ON ,ON ,ON ,ON ,
+ AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,
+ AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,
+ AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,
+ AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,
+ AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,
+ AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,
+ AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,
+ AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,
+ AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,AL ,BN ,
+};
+
+guchar FriBidiPropertyBlockff00[256] = {
+ ON ,ON ,ON ,ET ,ET ,ET ,ON ,ON ,ON ,ON ,ON ,ET ,CS ,ET ,CS ,ES ,
+ EN ,EN ,EN ,EN ,EN ,EN ,EN ,EN ,EN ,EN ,CS ,ON ,ON ,ON ,ON ,ON ,
+ ON ,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,ON ,ON ,ON ,ON ,ON ,
+ ON ,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,ON ,ON ,ON ,ON ,ON ,
+ ON ,ON ,ON ,ON ,ON ,ON ,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,LTR,
+ ET ,ET ,ON ,ON ,ON ,ET ,ET ,ET ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,
+ ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,ON ,BN ,BN ,BN ,ON ,ON ,ON ,ON ,
+};
+
+/* 34 blocks defined */
+
+guchar *FriBidiPropertyBlocks[256] = {
+ FriBidiPropertyBlock0000,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0200,
+ FriBidiPropertyBlock0300,
+ FriBidiPropertyBlock0400,
+ FriBidiPropertyBlock0500,
+ FriBidiPropertyBlock0600,
+ FriBidiPropertyBlock0700,
+ NULL,
+ FriBidiPropertyBlock0900,
+ FriBidiPropertyBlock0a00,
+ FriBidiPropertyBlock0b00,
+ FriBidiPropertyBlock0c00,
+ FriBidiPropertyBlock0d00,
+ FriBidiPropertyBlock0e00,
+ FriBidiPropertyBlock0f00,
+ FriBidiPropertyBlock1000,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock1600,
+ FriBidiPropertyBlock1700,
+ FriBidiPropertyBlock1800,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock1f00,
+ FriBidiPropertyBlock2000,
+ FriBidiPropertyBlock2100,
+ FriBidiPropertyBlock2200,
+ FriBidiPropertyBlock2300,
+ FriBidiPropertyBlock2400,
+ FriBidiPropertyBlock2500,
+ FriBidiPropertyBlock2500,
+ FriBidiPropertyBlock2500,
+ FriBidiPropertyBlock2500,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ FriBidiPropertyBlock2500,
+ FriBidiPropertyBlock2500,
+ FriBidiPropertyBlock3000,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlocka400,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlockf800,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlock0100,
+ FriBidiPropertyBlockfb00,
+ FriBidiPropertyBlockfc00,
+ FriBidiPropertyBlockfd00,
+ FriBidiPropertyBlockfe00,
+ FriBidiPropertyBlockff00,
+};
+
+#undef LTR
+#undef RTL
+#undef EN
+#undef ES
+#undef ET
+#undef AN
+#undef CS
+#undef BS
+#undef SS
+#undef CTL
+#undef LRE
+#undef RLE
+#undef LRO
+#undef RLO
+#undef WS
+#undef ON
+#undef AL
+#undef NSM
+#undef BN
+#undef PDF
+#undef EO
+
+
+/*======================================================================
+// Mirrored characters include all the characters in the Unicode list
+// that have been declared as being mirrored and that have a mirrored
+// equivalent.
+//
+// There are lots of characters that are designed as being mirrored
+// but do not have any mirrored glyph, e.g. the sign for there exist.
+// Are these used in Arabic? That is are all the mathematical signs
+// that are assigned to be mirrorable actually mirrored in Arabic?
+// If that is the case, I'll change the below code to include also
+// characters that mirror to themself. It will then be the responsibility
+// of the display engine to actually mirror these.
+//----------------------------------------------------------------------*/
+
+struct {
+ FriBidiChar ch, mirrored_ch;
+} FriBidiMirroredChars[] = {
+ {0x0028, 0x0029},
+ {0x0029, 0x0028},
+ {0x003C, 0x003E},
+ {0x003E, 0x003C},
+ {0x005B, 0x005D},
+ {0x005D, 0x005B},
+ {0x007B, 0x007D},
+ {0x007D, 0x007B},
+ {0x00AB, 0x00BB},
+ {0x00BB, 0x00AB},
+ {0x2039, 0x203A},
+ {0x203A, 0x2039},
+ {0x2045, 0x2046},
+ {0x2046, 0x2045},
+ {0x207D, 0x207E},
+ {0x207E, 0x207D},
+ {0x208D, 0x208E},
+ {0x208E, 0x208D},
+ {0x2264, 0x2265},
+ {0x2265, 0x2264},
+ {0x2266, 0x2267},
+ {0x2267, 0x2266},
+ {0x2268, 0x2269},
+ {0x2269, 0x2268},
+ {0x226A, 0x226B},
+ {0x226B, 0x226A},
+ {0x226E, 0x226F},
+ {0x226F, 0x226E},
+ {0x2270, 0x2271},
+ {0x2271, 0x2270},
+ {0x2272, 0x2273},
+ {0x2273, 0x2272},
+ {0x2274, 0x2275},
+ {0x2275, 0x2274},
+ {0x22A2, 0x22A3},
+ {0x22A3, 0x22A2},
+ {0x22C9, 0x22CA},
+ {0x22CA, 0x22C9},
+ {0x22CB, 0x22CC},
+ {0x22CC, 0x22CB},
+ {0x22D6, 0x22D7},
+ {0x22D7, 0x22D6},
+ {0x22D8, 0x22D9},
+ {0x22D9, 0x22D8},
+ {0x22DC, 0x22DD},
+ {0x22DD, 0x22DC},
+ {0x22E6, 0x22E7},
+ {0x22E7, 0x22E6},
+ {0x22F0, 0x22F1},
+ {0x22F1, 0x22F0},
+ {0x2308, 0x2309},
+ {0x2309, 0x2308},
+ {0x230A, 0x230B},
+ {0x230B, 0x230A},
+ {0x2329, 0x232A},
+ {0x232A, 0x2329},
+ {0x3008, 0x3009},
+ {0x3009, 0x3008},
+ {0x300A, 0x300B},
+ {0x300B, 0x300A},
+ {0x300C, 0x300D},
+ {0x300D, 0x300C},
+ {0x300E, 0x300F},
+ {0x300F, 0x300E},
+ {0x3010, 0x3011},
+ {0x3011, 0x3010},
+ {0x3014, 0x3015},
+ {0x3015, 0x3014},
+ {0x3016, 0x3017},
+ {0x3017, 0x3016},
+ {0x3018, 0x3019},
+ {0x3019, 0x3018},
+ {0x301A, 0x301B},
+ {0x301B, 0x301A}
+};
+
+gint nFriBidiMirroredChars = 74;
diff --git a/pango/mini-fribidi/fribidi_types.h b/pango/mini-fribidi/fribidi_types.h
new file mode 100644
index 00000000..edb9637e
--- /dev/null
+++ b/pango/mini-fribidi/fribidi_types.h
@@ -0,0 +1,101 @@
+/* FriBidi - Library of BiDi algorithm
+ * Copyright (C) 1999 Dov Grobgeld
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+#ifndef FRIBIDI_TYPES_H
+#define FRIBIDI_TYPES_H
+
+#include <glib.h>
+
+typedef guint32 FriBidiChar;
+
+#if 0
+/* Classifications of the various Bidi properties */
+typedef enum
+{
+ FRIBIDI_TYPE_LTR = 0x01000000, /* Strong left to right */
+ FRIBIDI_TYPE_RTL = 0x02000000, /* Strong right to left */
+ FRIBIDI_TYPE_WL = 0x01000001, /* Weak left to right */
+ FRIBIDI_TYPE_WR = 0x02000002, /* Weak right to left */
+ FRIBIDI_TYPE_EN = 0x03000000, /* European digit */
+ FRIBIDI_TYPE_ES = 0x04000000, /* European number separator */
+ FRIBIDI_TYPE_ET = 0x05000000, /* European number terminator */
+ FRIBIDI_TYPE_AN = 0x06000000, /* Arabic digit */
+ FRIBIDI_TYPE_CS = 0x07000000, /* Common Separator */
+ FRIBIDI_TYPE_BS = 0x08000000, /* Block separator */
+ FRIBIDI_TYPE_SS = 0x09000000, /* Segment separator */
+ FRIBIDI_TYPE_WS = 0x0A000000, /* Whitespace */
+ FRIBIDI_TYPE_CTL = 0x10000090, /* Control units */
+ FRIBIDI_TYPE_ON = 0x80000009, /* Other Neutral */
+
+ /* The following are only used internally */
+ FRIBIDI_TYPE_L = 0x01000000,
+ FRIBIDI_TYPE_R = 0x02000000,
+ FRIBIDI_TYPE_BN = 0xF1000000,
+ FRIBIDI_TYPE_CM = 0xF2000000,
+ FRIBIDI_TYPE_SOT = 0xF3000000,
+ FRIBIDI_TYPE_EOT = 0xF4000000,
+ FRIBIDI_TYPE_N = 0xF5000000,
+ FRIBIDI_TYPE_E = 0xF6000000,
+} FriBidiCharType;
+#endif
+
+typedef enum
+{
+ FRIBIDI_TYPE_LTR , /* Strong left to right */
+ FRIBIDI_TYPE_RTL , /* Right to left characters */
+ FRIBIDI_TYPE_WL , /* Weak left to right */
+ FRIBIDI_TYPE_WR , /* Weak right to left */
+ FRIBIDI_TYPE_EN , /* European digit */
+ FRIBIDI_TYPE_ES , /* European number separator */
+ FRIBIDI_TYPE_ET , /* European number terminator */
+ FRIBIDI_TYPE_AN , /* Arabic digit */
+ FRIBIDI_TYPE_CS , /* Common Separator */
+ FRIBIDI_TYPE_BS , /* Block separator */
+ FRIBIDI_TYPE_SS , /* Segment separator */
+ FRIBIDI_TYPE_WS , /* Whitespace */
+ FRIBIDI_TYPE_AL , /* Arabic characters */
+ FRIBIDI_TYPE_NSM , /* Non spacing mark */
+ FRIBIDI_TYPE_LRE , /* Left-To-Right embedding */
+ FRIBIDI_TYPE_RLE , /* Right-To-Left embedding */
+ FRIBIDI_TYPE_LRO , /* Left-To-Right override */
+ FRIBIDI_TYPE_RLO , /* Right-To-Left override */
+ FRIBIDI_TYPE_PDF , /* Pop directional override */
+ FRIBIDI_TYPE_ON , /* Other Neutral */
+
+ /* The following are only used internally */
+ FRIBIDI_TYPE_L = FRIBIDI_TYPE_LTR,
+ FRIBIDI_TYPE_R = FRIBIDI_TYPE_RTL,
+ FRIBIDI_TYPE_BN = FRIBIDI_TYPE_ON + 2,
+ FRIBIDI_TYPE_CM ,
+ FRIBIDI_TYPE_SOT ,
+ FRIBIDI_TYPE_EOT ,
+ FRIBIDI_TYPE_N ,
+ FRIBIDI_TYPE_E ,
+ FRIBIDI_TYPE_CTL , /* Control units */
+ FRIBIDI_TYPE_EO , /* Control units */
+} FriBidiCharType;
+
+/* The following type is used by fribidi_utils */
+typedef struct {
+ int length;
+ void *attribute;
+} FriBidiRunType;
+
+FriBidiCharType _pango_fribidi_get_type(FriBidiChar uch);
+
+#endif