diff options
author | Owen Taylor <otaylor@redhat.com> | 2000-11-12 21:16:39 +0000 |
---|---|---|
committer | Owen Taylor <otaylor@src.gnome.org> | 2000-11-12 21:16:39 +0000 |
commit | f726b8d49d00e325314ee6f17cf1f7eaed1fd019 (patch) | |
tree | 6041b8551149c167352c65fda63c3e7aaeb88d9b /pango | |
parent | 1ff8a34d8c98aa47438515abd16f531e838d7404 (diff) | |
download | pango-f726b8d49d00e325314ee6f17cf1f7eaed1fd019.tar.gz |
Include a stripped-down version of fribidi to avoid the extra dependency.
Sun Nov 12 16:07:06 2000 Owen Taylor <otaylor@redhat.com>
* configure.in pango/pango-utils.[ch] pango/Makefile.am
pango/mini-fribidi/*: Include a stripped-down version of fribidi
to avoid the extra dependency. No fribidi symbols are
exported so conflicts with the real fribidi should not
happen. Library can optionally be compiled with the
real libfribidi.
* pango/pango-utils.[ch]: Wrappers for
fribidi_ functions when compiling with fribiid.
* modules/basic/basic-ft2.c modules/basic/basic-win32.c
modules/basic/basic.c modules/thai/thai.c pango/Makefile.am
pango/itemize.c pango/pango-context.c pango/pangoft2.c
pango/pangowin32.c pango/pangox.c: Use pango_ versions of fribidi
functions.
Diffstat (limited to 'pango')
-rw-r--r-- | pango/Makefile.am | 9 | ||||
-rw-r--r-- | pango/itemize.c | 3 | ||||
-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 | ||||
-rw-r--r-- | pango/pango-context.c | 15 | ||||
-rw-r--r-- | pango/pango-utils.c | 31 | ||||
-rw-r--r-- | pango/pango-utils.h | 10 | ||||
-rw-r--r-- | pango/pangoft2.c | 8 | ||||
-rw-r--r-- | pango/pangowin32.c | 7 | ||||
-rw-r--r-- | pango/pangox.c | 7 |
16 files changed, 2327 insertions, 21 deletions
diff --git a/pango/Makefile.am b/pango/Makefile.am index f80c97c1..d5560523 100644 --- a/pango/Makefile.am +++ b/pango/Makefile.am @@ -1,5 +1,10 @@ ## Process this file with automake to create Makefile.in. +if HAVE_FRIBIDI +else +SUBDIRS = mini-fribidi +endif + INCLUDES = \ -DSYSCONFDIR=\"$(sysconfdir)\" \ -DLIBDIR=\"$(libdir)\" \ @@ -42,6 +47,10 @@ libpangox_la_SOURCES = \ # scheme or the standard libtool scheme. # libpango_la_LDFLAGS = -release $(VERSION) $(GLIB_LIBS) +if HAVE_FRIBIDI +else +libpango_la_LIBADD = mini-fribidi/libmini-fribidi.la +endif libpangox_la_LDFLAGS = -release $(VERSION) libpangox_la_LIBADD = $(INCLUDED_MODULES) diff --git a/pango/itemize.c b/pango/itemize.c index da8b0fbc..7894aeba 100644 --- a/pango/itemize.c +++ b/pango/itemize.c @@ -19,7 +19,6 @@ * Boston, MA 02111-1307, USA. */ -#include <fribidi/fribidi.h> #include "pango.h" #include "iconv.h" #include "modules.h" @@ -98,7 +97,7 @@ pango_itemize (PangoContext *context, shape_engines = g_new0 (PangoEngineInfo *, n_chars); lang_engines = g_new0 (PangoEngineInfo *, n_chars); - fribidi_log2vis_get_embedding_levels (text_ucs2, n_chars, &base_dir, + pango_log2vis_get_embedding_levels (text_ucs2, n_chars, &base_dir, embedding_levels); /* Now, make shaping-engine affilitations for characters in 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 diff --git a/pango/pango-context.c b/pango/pango-context.c index fb4bc55e..dbdb5801 100644 --- a/pango/pango-context.c +++ b/pango/pango-context.c @@ -22,8 +22,8 @@ #include <string.h> #include <stdlib.h> -#include <fribidi/fribidi.h> -#include <pango/pango-context.h> +#include "pango/pango-context.h" +#include "pango/pango-utils.h" #include "iconv.h" #include "pango-modules.h" @@ -531,7 +531,7 @@ pango_itemize (PangoContext *context, gunichar *text_ucs4; int n_chars, i; guint8 *embedding_levels; - FriBidiCharType base_dir; + PangoDirection base_dir; PangoItem *item; const char *p; const char *next; @@ -550,11 +550,8 @@ pango_itemize (PangoContext *context, if (length == 0) return NULL; - if (context->base_dir == PANGO_DIRECTION_RTL) - base_dir = FRIBIDI_TYPE_RTL; - else - base_dir = FRIBIDI_TYPE_LTR; - + base_dir = context->base_dir; + if (length == 0) return NULL; @@ -568,7 +565,7 @@ pango_itemize (PangoContext *context, n_chars = g_utf8_strlen (text + start_index, length); embedding_levels = g_new (guint8, n_chars); - fribidi_log2vis_get_embedding_levels (text_ucs4, n_chars, &base_dir, + pango_log2vis_get_embedding_levels (text_ucs4, n_chars, &base_dir, embedding_levels); /* Storing these as ranges would be a lot more efficient, diff --git a/pango/pango-utils.c b/pango/pango-utils.c index 12c8d0a7..b8ce0d58 100644 --- a/pango/pango-utils.c +++ b/pango/pango-utils.c @@ -29,6 +29,10 @@ #include "pango-font.h" #include "pango-utils.h" +#ifdef HAVE_FRIBIDI +#include <fribidi/fribidi.h> +#endif + #ifndef HAVE_FLOCKFILE # define flockfile(f) (void)1 # define funlockfile(f) (void)1 @@ -895,3 +899,30 @@ pango_parse_stretch (const char *str, return FALSE; } +#ifdef HAVE_FRIBIDI + +void +pango_log2vis_get_embedding_levels (gunichar *str, + int len, + PangoDirection *pbase_dir, + guint8 *embedding_level_list) +{ + FriBidiCharType fribidi_base_dir; + + fribidi_base_dir = (*pbase_dir == PANGO_DIRECTION_LTR) ? FRIBIDI_TYPE_L : FRIBIDI_TYPE_R; + + fribidi_log2vis_get_embedding_levels (str, len, &fribidi_base_dir, + embedding_level_list); + + *pbase_dir = (fribidi_base_dir == FRIBIDI_TYPE_L) ? PANGO_DIRECTION_LTR : PANGO_DIRECTION_RTL; +} + + +gboolean +pango_get_mirror_char (gunichar ch, + gunichar *mirrored_ch) +{ + return fribidi_get_mirror_char (ch, mirrored_ch); +} + +#endif /* HAVE_FRIBIDI */ diff --git a/pango/pango-utils.h b/pango/pango-utils.h index 44cbdeec..35ef8127 100644 --- a/pango/pango-utils.h +++ b/pango/pango-utils.h @@ -73,3 +73,13 @@ char * pango_get_sysconf_subdirectory (void); */ char * pango_get_lib_subdirectory (void); + +/* A couple of routines from fribidi that we either wrap or + * provide ourselves. + */ +void pango_log2vis_get_embedding_levels (gunichar *str, + int len, + PangoDirection *pbase_dir, + guint8 *embedding_level_list); +gboolean pango_get_mirror_char (gunichar ch, + gunichar *mirrored_ch); diff --git a/pango/pangoft2.c b/pango/pangoft2.c index 589e8826..8f9e4133 100644 --- a/pango/pangoft2.c +++ b/pango/pangoft2.c @@ -28,8 +28,8 @@ #include <glib.h> #include <freetype/freetype.h> -#include <fribidi/fribidi.h> +#include "pango-utils.h" #include "pangoft2.h" #include "pangoft2-private.h" @@ -543,7 +543,7 @@ get_font_metrics_from_string (PangoFont *font, gunichar *text_ucs4; int n_chars, i; guint8 *embedding_levels; - FriBidiCharType base_dir = PANGO_DIRECTION_LTR; + PangoDirection base_dir = PANGO_DIRECTION_LTR; GSList *subfonts = NULL; n_chars = g_utf8_strlen (str, -1); @@ -553,8 +553,8 @@ get_font_metrics_from_string (PangoFont *font, return; embedding_levels = g_new (guint8, n_chars); - fribidi_log2vis_get_embedding_levels (text_ucs4, n_chars, &base_dir, - embedding_levels); + pango_log2vis_get_embedding_levels (text_ucs4, n_chars, &base_dir, + embedding_levels); g_free (text_ucs4); last_shaper = NULL; diff --git a/pango/pangowin32.c b/pango/pangowin32.c index c1ae86bf..cd61124a 100644 --- a/pango/pangowin32.c +++ b/pango/pangowin32.c @@ -27,6 +27,7 @@ #include <fribidi/fribidi.h> +#include "pango-utils.h" #include "pangowin32.h" #include "pangowin32-private.h" @@ -673,7 +674,7 @@ get_font_metrics_from_string (PangoFont *font, gunichar *text_ucs4; int n_chars, i; guint8 *embedding_levels; - FriBidiCharType base_dir = PANGO_DIRECTION_LTR; + PangoDirection base_dir = PANGO_DIRECTION_LTR; GSList *subfonts = NULL; n_chars = g_utf8_strlen (str, -1); @@ -683,8 +684,8 @@ get_font_metrics_from_string (PangoFont *font, return; embedding_levels = g_new (guint8, n_chars); - fribidi_log2vis_get_embedding_levels (text_ucs4, n_chars, &base_dir, - embedding_levels); + pango_log2vis_get_embedding_levels (text_ucs4, n_chars, &base_dir, + embedding_levels); g_free (text_ucs4); last_shaper = NULL; diff --git a/pango/pangox.c b/pango/pangox.c index 4a4233fa..5d9965a6 100644 --- a/pango/pangox.c +++ b/pango/pangox.c @@ -27,6 +27,7 @@ #include <X11/Xlib.h> #include <fribidi/fribidi.h> #include "pangox.h" +#include "pango-utils.h" #include "pangox-private.h" #include "pango-intset.h" @@ -573,7 +574,7 @@ get_font_metrics_from_string (PangoFont *font, gunichar *text_ucs4; int n_chars, i; guint8 *embedding_levels; - FriBidiCharType base_dir = PANGO_DIRECTION_LTR; + PangoDirection base_dir = PANGO_DIRECTION_LTR; GSList *subfonts = NULL; n_chars = g_utf8_strlen (str, -1); @@ -583,8 +584,8 @@ get_font_metrics_from_string (PangoFont *font, return; embedding_levels = g_new (guint8, n_chars); - fribidi_log2vis_get_embedding_levels (text_ucs4, n_chars, &base_dir, - embedding_levels); + pango_log2vis_get_embedding_levels (text_ucs4, n_chars, &base_dir, + embedding_levels); g_free (text_ucs4); last_shaper = NULL; |