diff options
Diffstat (limited to 'pango/mini-fribidi')
-rw-r--r-- | pango/mini-fribidi/.cvsignore | 6 | ||||
-rw-r--r-- | pango/mini-fribidi/Makefile.am | 25 | ||||
-rw-r--r-- | pango/mini-fribidi/README | 44 | ||||
-rw-r--r-- | pango/mini-fribidi/fribidi-0.1.12.patch | 441 | ||||
-rw-r--r-- | pango/mini-fribidi/fribidi.c | 514 | ||||
-rw-r--r-- | pango/mini-fribidi/fribidi_get_type.c | 75 | ||||
-rw-r--r-- | pango/mini-fribidi/fribidi_tables.i | 1052 | ||||
-rw-r--r-- | pango/mini-fribidi/fribidi_types.h | 101 |
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 |