diff options
34 files changed, 2512 insertions, 128 deletions
@@ -1,3 +1,21 @@ +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. + 2000-11-12 Robert Brady <robert@suse.co.uk> * pango/pango-indic.c (pango_shift_vowels): Don't corrupt the diff --git a/ChangeLog.pre-1-0 b/ChangeLog.pre-1-0 index fbe25491..863e1bac 100644 --- a/ChangeLog.pre-1-0 +++ b/ChangeLog.pre-1-0 @@ -1,3 +1,21 @@ +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. + 2000-11-12 Robert Brady <robert@suse.co.uk> * pango/pango-indic.c (pango_shift_vowels): Don't corrupt the diff --git a/ChangeLog.pre-1-10 b/ChangeLog.pre-1-10 index fbe25491..863e1bac 100644 --- a/ChangeLog.pre-1-10 +++ b/ChangeLog.pre-1-10 @@ -1,3 +1,21 @@ +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. + 2000-11-12 Robert Brady <robert@suse.co.uk> * pango/pango-indic.c (pango_shift_vowels): Don't corrupt the diff --git a/ChangeLog.pre-1-2 b/ChangeLog.pre-1-2 index fbe25491..863e1bac 100644 --- a/ChangeLog.pre-1-2 +++ b/ChangeLog.pre-1-2 @@ -1,3 +1,21 @@ +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. + 2000-11-12 Robert Brady <robert@suse.co.uk> * pango/pango-indic.c (pango_shift_vowels): Don't corrupt the diff --git a/ChangeLog.pre-1-4 b/ChangeLog.pre-1-4 index fbe25491..863e1bac 100644 --- a/ChangeLog.pre-1-4 +++ b/ChangeLog.pre-1-4 @@ -1,3 +1,21 @@ +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. + 2000-11-12 Robert Brady <robert@suse.co.uk> * pango/pango-indic.c (pango_shift_vowels): Don't corrupt the diff --git a/ChangeLog.pre-1-6 b/ChangeLog.pre-1-6 index fbe25491..863e1bac 100644 --- a/ChangeLog.pre-1-6 +++ b/ChangeLog.pre-1-6 @@ -1,3 +1,21 @@ +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. + 2000-11-12 Robert Brady <robert@suse.co.uk> * pango/pango-indic.c (pango_shift_vowels): Don't corrupt the diff --git a/ChangeLog.pre-1-8 b/ChangeLog.pre-1-8 index fbe25491..863e1bac 100644 --- a/ChangeLog.pre-1-8 +++ b/ChangeLog.pre-1-8 @@ -1,3 +1,21 @@ +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. + 2000-11-12 Robert Brady <robert@suse.co.uk> * pango/pango-indic.c (pango_shift_vowels): Don't corrupt the @@ -5,17 +5,21 @@ For more information about Pango, see: http://www.labs.redhat.com/~otaylor/pango/index.html -Requirements +Dependencies ============ -You'll need Dov Grobgeld's FriBidi library. This -is available frmo: +You'll need a fairly capable implementation +of iconv() - for instance the iconv from the +GNU C library version 2.1 + +Pango can optionally be compiled to use Dov Grobgeld's FriBidi +library. This is available from: http://imagic.weizmann.ac.il/~dov/freesw/FriBidi/ -You'll also need a fairly capable implementation -of iconv() - for instance the iconv from the -GNU C library version 2.1 +If the --with-fribidi option is not given to configure, then +Pango will use internal copies of the FriBidi routines. +No functionality will be lost by using the internal routines. Notes ===== diff --git a/configure.in b/configure.in index 9494385c..ccc3ceaa 100644 --- a/configure.in +++ b/configure.in @@ -34,26 +34,6 @@ AM_PATH_GLIB_2_0(1.3.1,, AC_MSG_ERROR([GLib 1.3.1 is required for building Pango]), gmodule gobject) -AC_PATH_PROG(FRIBIDI_CONFIG, fribidi-config, no) -if test x$FRIBIDI_CONFIG = xno ; then - AC_MSG_ERROR([*** fribidi-config not found]) -fi - -if $FRIBIDI_CONFIG --cflags | grep lib/glib/include > /dev/null ; then - AC_MSG_ERROR([*** fribidi appears to be compiled against GLib-1.2.x. -*** You must compile fribidi with GLib-1.3.1 or better.]) -fi - -FRIBIDI_CFLAGS="`$FRIBIDI_CONFIG --cflags`" -CFLAGS="$CFLAGS $FRIBIDI_CFLAGS" -FRIBIDI_LIBS="`$FRIBIDI_CONFIG --libs`" -AC_SUBST(FRIBIDI_LIBS) -AC_SUBST(FRIBIDI_CFLAGS) - -AC_CHECK_LIB(fribidi, fribidi_map_range, :, - AC_MSG_ERROR([*** libfribidi not found.]), $FRIBIDI_LIBS) - - AC_PATH_PROG(GLIB_CONFIG, glib-config-2.0, no) if test x$GLIB_CONFIG = xno ; then AC_MSG_ERROR([*** glib-config-2.0 not found]) @@ -64,6 +44,40 @@ GLIB_LIBS="`$GLIB_CONFIG --libs gmodule gobject`" AC_SUBST(GLIB_LIBS) AC_SUBST(GLIB_CFLAGS) +# +# Checks for fribidi +# +AC_ARG_WITH(fribidi, [ --with-fribidi Use external fribidi library ],,with_fribidi=no) + +FRIBIDI_LIBS="" +FRIBIDI_CFLAGS="" +have_fribidi=no + +if test "x$with_fribidi" = "xyes" ; then + AC_PATH_PROG(FRIBIDI_CONFIG, fribidi-config, no) + if test x$FRIBIDI_CONFIG = xno ; then + AC_MSG_ERROR([*** fribidi-config not found]) + fi + + if $FRIBIDI_CONFIG --cflags | grep lib/glib/include > /dev/null ; then + AC_MSG_ERROR([*** fribidi appears to be compiled against GLib-1.2.x. + *** You must compile fribidi with GLib-1.3.1 or better.]) + fi + + FRIBIDI_CFLAGS="`$FRIBIDI_CONFIG --cflags`" + CFLAGS="$CFLAGS $FRIBIDI_CFLAGS" + FRIBIDI_LIBS="`$FRIBIDI_CONFIG --libs`" + + AC_CHECK_LIB(fribidi, fribidi_get_mirror_char, :, + AC_MSG_ERROR([*** libfribidi not found.]), $FRIBIDI_LIBS) + + AC_DEFINE(HAVE_FRIBIDI) + have_fribidi=yes +fi + +AC_SUBST(FRIBIDI_LIBS) +AC_SUBST(FRIBIDI_CFLAGS) +AM_CONDITIONAL(HAVE_FRIBIDI, test x$have_fribidi = xyes) # # Checks for iconv @@ -258,6 +272,7 @@ AC_CHECK_HEADER(unistd.h, AC_DEFINE(HAVE_UNISTD_H)) AC_OUTPUT([ Makefile pango/Makefile +pango/mini-fribidi/Makefile pango/makefile.mingw pango/pango.rc pango/pangoft2.rc diff --git a/docs/tmpl/layout.sgml b/docs/tmpl/layout.sgml index fca9db60..4cb4c9a9 100644 --- a/docs/tmpl/layout.sgml +++ b/docs/tmpl/layout.sgml @@ -84,28 +84,6 @@ fields. @length: -<!-- ##### FUNCTION pango_layout_set_markup ##### --> -<para> - -</para> - -@layout: -@markup: -@length: - - -<!-- ##### FUNCTION pango_layout_set_markup_with_accel ##### --> -<para> - -</para> - -@layout: -@markup: -@length: -@accel_marker: -@accel_char: - - <!-- ##### FUNCTION pango_layout_set_attributes ##### --> <para> @@ -115,15 +93,6 @@ fields. @attrs: -<!-- ##### FUNCTION pango_layout_get_attributes ##### --> -<para> - -</para> - -@layout: -@Returns: - - <!-- ##### FUNCTION pango_layout_set_font_description ##### --> <para> diff --git a/docs/tmpl/main.sgml b/docs/tmpl/main.sgml index 7e5c4068..7f97791e 100644 --- a/docs/tmpl/main.sgml +++ b/docs/tmpl/main.sgml @@ -171,12 +171,12 @@ for text. @context: @text: -@start_index: @length: @attrs: -@cached_iter: @Returns: <!-- # Unused Parameters # --> +@start_index: +@cached_iter: @lang_info: @n_langs: diff --git a/docs/tmpl/text-attributes.sgml b/docs/tmpl/text-attributes.sgml index 0682bad4..0bf3ea3b 100644 --- a/docs/tmpl/text-attributes.sgml +++ b/docs/tmpl/text-attributes.sgml @@ -41,7 +41,6 @@ attribute is listed in parentheses after the description. @PANGO_ATTR_STRIKETHROUGH: whether the text is struck-through (#PangoAttrInt) @PANGO_ATTR_RISE: baseline displacement (#PangoAttrInt) @PANGO_ATTR_SHAPE: -@PANGO_ATTR_SCALE: <!-- ##### STRUCT PangoAttrClass ##### --> <para> @@ -99,14 +98,6 @@ a integer or enumeration value. @attr: the common portion of the attribute @value: the value of the attribute -<!-- ##### STRUCT PangoAttrFloat ##### --> -<para> - -</para> - -@attr: -@value: - <!-- ##### STRUCT PangoAttrFontDesc ##### --> <para> The #PangoAttrFontDesc structure is used to store an attribute that @@ -125,21 +116,6 @@ sets all aspects of the font description at once. @ink_rect: @logical_rect: -<!-- ##### FUNCTION pango_parse_markup ##### --> -<para> - -</para> - -@markup_text: -@length: -@accel_marker: -@attr_list: -@text: -@accel_char: -@error: -@Returns: - - <!-- ##### FUNCTION pango_attr_type_register ##### --> <para> @@ -298,15 +274,6 @@ sets all aspects of the font description at once. @Returns: -<!-- ##### FUNCTION pango_attr_scale_new ##### --> -<para> - -</para> - -@scale_factor: -@Returns: - - <!-- ##### ENUM PangoUnderline ##### --> <para> the #PangoUnderline enumeration is used to specify diff --git a/modules/basic/basic-ft2.c b/modules/basic/basic-ft2.c index 2faa9788..973e8a43 100644 --- a/modules/basic/basic-ft2.c +++ b/modules/basic/basic-ft2.c @@ -23,8 +23,7 @@ #include "pango.h" #include "pangoft2.h" - -#include <fribidi/fribidi.h> +#include "pango-utils.h" static PangoEngineRange basic_ranges[] = { /* Basic Latin, Latin-1 Supplement, Latin Extended-A, Latin Extended-B, @@ -240,13 +239,13 @@ basic_engine_shape (PangoFont *font, for (i = 0; i < n_chars; i++) { gunichar wc; - FriBidiChar mirrored_ch; + gunichar mirrored_ch; PangoGlyph index; wc = g_utf8_get_char (p); if (analysis->level % 2) - if (fribidi_get_mirror_char (wc, &mirrored_ch)) + if (pango_get_mirror_char (wc, &mirrored_ch)) wc = mirrored_ch; if (wc == 0x200B || wc == 0x200E || wc == 0x200F) /* Zero-width characters */ diff --git a/modules/basic/basic-win32.c b/modules/basic/basic-win32.c index 66082ee8..a6a4b036 100644 --- a/modules/basic/basic-win32.c +++ b/modules/basic/basic-win32.c @@ -22,7 +22,7 @@ #include <glib.h> #include "pango.h" #include "pangowin32.h" -#include <fribidi/fribidi.h> +#include "pango-utils.h" static PangoEngineRange basic_ranges[] = { /* Language characters */ @@ -178,13 +178,13 @@ basic_engine_shape (PangoFont *font, for (i = 0; i < n_chars; i++) { gunichar wc; - FriBidiChar mirrored_ch; + gunichar mirrored_ch; PangoGlyph index; wc = g_utf8_get_char (p); if (analysis->level % 2) - if (fribidi_get_mirror_char (wc, &mirrored_ch)) + if (pango_get_mirror_char (wc, &mirrored_ch)) wc = mirrored_ch; if (wc == 0x200B || wc == 0x200E || wc == 0x200F) /* Zero-width characters */ diff --git a/modules/basic/basic-x.c b/modules/basic/basic-x.c index 944ec41c..f044043b 100644 --- a/modules/basic/basic-x.c +++ b/modules/basic/basic-x.c @@ -24,7 +24,7 @@ #include <glib.h> #include "pango.h" #include "pangox.h" -#include <fribidi/fribidi.h> +#include "pango-utils.h" typedef struct _CharRange CharRange; typedef struct _Charset Charset; @@ -376,7 +376,7 @@ basic_engine_shape (PangoFont *font, for (i=0; i < n_chars; i++) { gunichar wc; - FriBidiChar mirrored_ch; + gunichar mirrored_ch; PangoGlyph index; char buf[6]; const char *input; @@ -385,7 +385,7 @@ basic_engine_shape (PangoFont *font, input = p; if (analysis->level % 2) - if (fribidi_get_mirror_char (wc, &mirrored_ch)) + if (pango_get_mirror_char (wc, &mirrored_ch)) { wc = mirrored_ch; diff --git a/modules/basic/basic.c b/modules/basic/basic.c index 944ec41c..f044043b 100644 --- a/modules/basic/basic.c +++ b/modules/basic/basic.c @@ -24,7 +24,7 @@ #include <glib.h> #include "pango.h" #include "pangox.h" -#include <fribidi/fribidi.h> +#include "pango-utils.h" typedef struct _CharRange CharRange; typedef struct _Charset Charset; @@ -376,7 +376,7 @@ basic_engine_shape (PangoFont *font, for (i=0; i < n_chars; i++) { gunichar wc; - FriBidiChar mirrored_ch; + gunichar mirrored_ch; PangoGlyph index; char buf[6]; const char *input; @@ -385,7 +385,7 @@ basic_engine_shape (PangoFont *font, input = p; if (analysis->level % 2) - if (fribidi_get_mirror_char (wc, &mirrored_ch)) + if (pango_get_mirror_char (wc, &mirrored_ch)) { wc = mirrored_ch; diff --git a/modules/thai/thai-x.c b/modules/thai/thai-x.c index 0b237d46..59364d7a 100644 --- a/modules/thai/thai-x.c +++ b/modules/thai/thai-x.c @@ -24,7 +24,6 @@ #include <glib.h> #include "pango.h" #include "pangox.h" -#include <fribidi/fribidi.h> /* We handle the range U+0e01 to U+0e5b exactly */ diff --git a/modules/thai/thai.c b/modules/thai/thai.c index 0b237d46..59364d7a 100644 --- a/modules/thai/thai.c +++ b/modules/thai/thai.c @@ -24,7 +24,6 @@ #include <glib.h> #include "pango.h" #include "pangox.h" -#include <fribidi/fribidi.h> /* We handle the range U+0e01 to U+0e5b exactly */ 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; |