From 15840a2e849f02b569f978aee4339fb5f1937613 Mon Sep 17 00:00:00 2001 From: Mike Klein Date: Thu, 10 Jul 2014 11:32:44 -0400 Subject: Delete third_party/harfbuzz BUG=skia: R=bungeman@google.com, reed@google.com Review URL: https://codereview.chromium.org/384503008 --- third_party/harfbuzz/.gitignore | 20 - third_party/harfbuzz/AUTHORS | 6 - third_party/harfbuzz/COPYING | 24 - third_party/harfbuzz/ChangeLog | 0 third_party/harfbuzz/Makefile.am | 2 - third_party/harfbuzz/NEWS | 0 third_party/harfbuzz/README | 7 - third_party/harfbuzz/README.google | 9 - third_party/harfbuzz/autogen.sh | 116 - third_party/harfbuzz/chromium.patch | 37 - third_party/harfbuzz/config.h | 60 - third_party/harfbuzz/configure.ac | 54 - third_party/harfbuzz/contrib/README | 9 - third_party/harfbuzz/contrib/harfbuzz-freetype.c | 149 - third_party/harfbuzz/contrib/harfbuzz-freetype.h | 9 - .../harfbuzz/contrib/harfbuzz-unicode-glib.c | 169 - .../harfbuzz/contrib/harfbuzz-unicode-tables.c | 84 - third_party/harfbuzz/contrib/harfbuzz-unicode.c | 287 - third_party/harfbuzz/contrib/harfbuzz-unicode.h | 54 - .../harfbuzz/contrib/tables/BidiMirroring.txt | 588 -- .../contrib/tables/DerivedCombiningClass.txt | 1881 ------ .../contrib/tables/DerivedGeneralCategory.txt | 3072 ---------- .../contrib/tables/GraphemeBreakProperty.txt | 1166 ---- third_party/harfbuzz/contrib/tables/README | 17 - third_party/harfbuzz/contrib/tables/Scripts.txt | 1747 ------ .../harfbuzz/contrib/tables/category-parse.py | 70 - .../harfbuzz/contrib/tables/category-properties.h | 2869 ---------- .../contrib/tables/combining-class-parse.py | 34 - .../harfbuzz/contrib/tables/combining-properties.h | 247 - .../contrib/tables/grapheme-break-parse.py | 45 - .../contrib/tables/grapheme-break-properties.h | 1113 ---- .../harfbuzz/contrib/tables/mirroring-parse.py | 50 - .../harfbuzz/contrib/tables/mirroring-properties.h | 379 -- .../harfbuzz/contrib/tables/script-properties.h | 297 - .../harfbuzz/contrib/tables/scripts-parse.py | 75 - .../contrib/tables/unicode_parse_common.py | 70 - third_party/harfbuzz/harfbuzz.gyp | 63 - third_party/harfbuzz/src/.gitignore | 7 - third_party/harfbuzz/src/Makefile.am | 68 - third_party/harfbuzz/src/harfbuzz-arabic.c | 1145 ---- third_party/harfbuzz/src/harfbuzz-buffer-private.h | 107 - third_party/harfbuzz/src/harfbuzz-buffer.c | 383 -- third_party/harfbuzz/src/harfbuzz-buffer.h | 94 - third_party/harfbuzz/src/harfbuzz-dump-main.c | 97 - third_party/harfbuzz/src/harfbuzz-dump.c | 765 --- third_party/harfbuzz/src/harfbuzz-dump.h | 41 - third_party/harfbuzz/src/harfbuzz-external.h | 157 - third_party/harfbuzz/src/harfbuzz-gdef-private.h | 124 - third_party/harfbuzz/src/harfbuzz-gdef.c | 1159 ---- third_party/harfbuzz/src/harfbuzz-gdef.h | 135 - third_party/harfbuzz/src/harfbuzz-global.h | 118 - third_party/harfbuzz/src/harfbuzz-gpos-private.h | 712 --- third_party/harfbuzz/src/harfbuzz-gpos.c | 6055 -------------------- third_party/harfbuzz/src/harfbuzz-gpos.h | 149 - third_party/harfbuzz/src/harfbuzz-gsub-private.h | 476 -- third_party/harfbuzz/src/harfbuzz-gsub.c | 4329 -------------- third_party/harfbuzz/src/harfbuzz-gsub.h | 141 - third_party/harfbuzz/src/harfbuzz-hangul.c | 268 - third_party/harfbuzz/src/harfbuzz-hebrew.c | 189 - third_party/harfbuzz/src/harfbuzz-impl.c | 84 - third_party/harfbuzz/src/harfbuzz-impl.h | 131 - third_party/harfbuzz/src/harfbuzz-indic.cpp | 1873 ------ third_party/harfbuzz/src/harfbuzz-khmer.c | 667 --- third_party/harfbuzz/src/harfbuzz-myanmar.c | 542 -- third_party/harfbuzz/src/harfbuzz-open-private.h | 102 - third_party/harfbuzz/src/harfbuzz-open.c | 1416 ----- third_party/harfbuzz/src/harfbuzz-open.h | 282 - third_party/harfbuzz/src/harfbuzz-shape.h | 199 - third_party/harfbuzz/src/harfbuzz-shaper-all.cpp | 36 - third_party/harfbuzz/src/harfbuzz-shaper-private.h | 167 - third_party/harfbuzz/src/harfbuzz-shaper.cpp | 1357 ----- third_party/harfbuzz/src/harfbuzz-shaper.h | 278 - third_party/harfbuzz/src/harfbuzz-stream-private.h | 81 - third_party/harfbuzz/src/harfbuzz-stream.c | 114 - third_party/harfbuzz/src/harfbuzz-stream.h | 45 - third_party/harfbuzz/src/harfbuzz-thai.c | 87 - third_party/harfbuzz/src/harfbuzz-tibetan.c | 274 - third_party/harfbuzz/src/harfbuzz.c | 32 - third_party/harfbuzz/src/harfbuzz.h | 38 - third_party/harfbuzz/tests/Makefile.am | 7 - third_party/harfbuzz/tests/linebreaking/.gitignore | 4 - .../harfbuzz/tests/linebreaking/Makefile.am | 12 - .../harfbuzz/tests/linebreaking/harfbuzz-qt.cpp | 108 - third_party/harfbuzz/tests/linebreaking/main.cpp | 230 - third_party/harfbuzz/tests/shaping/.gitignore | 2 - third_party/harfbuzz/tests/shaping/Makefile.am | 14 - third_party/harfbuzz/tests/shaping/README | 9 - third_party/harfbuzz/tests/shaping/main.cpp | 1035 ---- 88 files changed, 40824 deletions(-) delete mode 100644 third_party/harfbuzz/.gitignore delete mode 100644 third_party/harfbuzz/AUTHORS delete mode 100644 third_party/harfbuzz/COPYING delete mode 100644 third_party/harfbuzz/ChangeLog delete mode 100644 third_party/harfbuzz/Makefile.am delete mode 100644 third_party/harfbuzz/NEWS delete mode 100644 third_party/harfbuzz/README delete mode 100644 third_party/harfbuzz/README.google delete mode 100755 third_party/harfbuzz/autogen.sh delete mode 100644 third_party/harfbuzz/chromium.patch delete mode 100644 third_party/harfbuzz/config.h delete mode 100644 third_party/harfbuzz/configure.ac delete mode 100644 third_party/harfbuzz/contrib/README delete mode 100644 third_party/harfbuzz/contrib/harfbuzz-freetype.c delete mode 100644 third_party/harfbuzz/contrib/harfbuzz-freetype.h delete mode 100644 third_party/harfbuzz/contrib/harfbuzz-unicode-glib.c delete mode 100644 third_party/harfbuzz/contrib/harfbuzz-unicode-tables.c delete mode 100644 third_party/harfbuzz/contrib/harfbuzz-unicode.c delete mode 100644 third_party/harfbuzz/contrib/harfbuzz-unicode.h delete mode 100644 third_party/harfbuzz/contrib/tables/BidiMirroring.txt delete mode 100644 third_party/harfbuzz/contrib/tables/DerivedCombiningClass.txt delete mode 100644 third_party/harfbuzz/contrib/tables/DerivedGeneralCategory.txt delete mode 100644 third_party/harfbuzz/contrib/tables/GraphemeBreakProperty.txt delete mode 100644 third_party/harfbuzz/contrib/tables/README delete mode 100644 third_party/harfbuzz/contrib/tables/Scripts.txt delete mode 100644 third_party/harfbuzz/contrib/tables/category-parse.py delete mode 100644 third_party/harfbuzz/contrib/tables/category-properties.h delete mode 100644 third_party/harfbuzz/contrib/tables/combining-class-parse.py delete mode 100644 third_party/harfbuzz/contrib/tables/combining-properties.h delete mode 100644 third_party/harfbuzz/contrib/tables/grapheme-break-parse.py delete mode 100644 third_party/harfbuzz/contrib/tables/grapheme-break-properties.h delete mode 100644 third_party/harfbuzz/contrib/tables/mirroring-parse.py delete mode 100644 third_party/harfbuzz/contrib/tables/mirroring-properties.h delete mode 100644 third_party/harfbuzz/contrib/tables/script-properties.h delete mode 100644 third_party/harfbuzz/contrib/tables/scripts-parse.py delete mode 100644 third_party/harfbuzz/contrib/tables/unicode_parse_common.py delete mode 100644 third_party/harfbuzz/harfbuzz.gyp delete mode 100644 third_party/harfbuzz/src/.gitignore delete mode 100644 third_party/harfbuzz/src/Makefile.am delete mode 100644 third_party/harfbuzz/src/harfbuzz-arabic.c delete mode 100644 third_party/harfbuzz/src/harfbuzz-buffer-private.h delete mode 100644 third_party/harfbuzz/src/harfbuzz-buffer.c delete mode 100644 third_party/harfbuzz/src/harfbuzz-buffer.h delete mode 100644 third_party/harfbuzz/src/harfbuzz-dump-main.c delete mode 100644 third_party/harfbuzz/src/harfbuzz-dump.c delete mode 100644 third_party/harfbuzz/src/harfbuzz-dump.h delete mode 100644 third_party/harfbuzz/src/harfbuzz-external.h delete mode 100644 third_party/harfbuzz/src/harfbuzz-gdef-private.h delete mode 100644 third_party/harfbuzz/src/harfbuzz-gdef.c delete mode 100644 third_party/harfbuzz/src/harfbuzz-gdef.h delete mode 100644 third_party/harfbuzz/src/harfbuzz-global.h delete mode 100644 third_party/harfbuzz/src/harfbuzz-gpos-private.h delete mode 100644 third_party/harfbuzz/src/harfbuzz-gpos.c delete mode 100644 third_party/harfbuzz/src/harfbuzz-gpos.h delete mode 100644 third_party/harfbuzz/src/harfbuzz-gsub-private.h delete mode 100644 third_party/harfbuzz/src/harfbuzz-gsub.c delete mode 100644 third_party/harfbuzz/src/harfbuzz-gsub.h delete mode 100644 third_party/harfbuzz/src/harfbuzz-hangul.c delete mode 100644 third_party/harfbuzz/src/harfbuzz-hebrew.c delete mode 100644 third_party/harfbuzz/src/harfbuzz-impl.c delete mode 100644 third_party/harfbuzz/src/harfbuzz-impl.h delete mode 100644 third_party/harfbuzz/src/harfbuzz-indic.cpp delete mode 100644 third_party/harfbuzz/src/harfbuzz-khmer.c delete mode 100644 third_party/harfbuzz/src/harfbuzz-myanmar.c delete mode 100644 third_party/harfbuzz/src/harfbuzz-open-private.h delete mode 100644 third_party/harfbuzz/src/harfbuzz-open.c delete mode 100644 third_party/harfbuzz/src/harfbuzz-open.h delete mode 100644 third_party/harfbuzz/src/harfbuzz-shape.h delete mode 100644 third_party/harfbuzz/src/harfbuzz-shaper-all.cpp delete mode 100644 third_party/harfbuzz/src/harfbuzz-shaper-private.h delete mode 100644 third_party/harfbuzz/src/harfbuzz-shaper.cpp delete mode 100644 third_party/harfbuzz/src/harfbuzz-shaper.h delete mode 100644 third_party/harfbuzz/src/harfbuzz-stream-private.h delete mode 100644 third_party/harfbuzz/src/harfbuzz-stream.c delete mode 100644 third_party/harfbuzz/src/harfbuzz-stream.h delete mode 100644 third_party/harfbuzz/src/harfbuzz-thai.c delete mode 100644 third_party/harfbuzz/src/harfbuzz-tibetan.c delete mode 100644 third_party/harfbuzz/src/harfbuzz.c delete mode 100644 third_party/harfbuzz/src/harfbuzz.h delete mode 100644 third_party/harfbuzz/tests/Makefile.am delete mode 100644 third_party/harfbuzz/tests/linebreaking/.gitignore delete mode 100644 third_party/harfbuzz/tests/linebreaking/Makefile.am delete mode 100644 third_party/harfbuzz/tests/linebreaking/harfbuzz-qt.cpp delete mode 100644 third_party/harfbuzz/tests/linebreaking/main.cpp delete mode 100644 third_party/harfbuzz/tests/shaping/.gitignore delete mode 100644 third_party/harfbuzz/tests/shaping/Makefile.am delete mode 100644 third_party/harfbuzz/tests/shaping/README delete mode 100644 third_party/harfbuzz/tests/shaping/main.cpp (limited to 'third_party/harfbuzz') diff --git a/third_party/harfbuzz/.gitignore b/third_party/harfbuzz/.gitignore deleted file mode 100644 index 572243facd..0000000000 --- a/third_party/harfbuzz/.gitignore +++ /dev/null @@ -1,20 +0,0 @@ -INSTALL -Makefile.in -aclocal.m4 -autom4te.cache -config.guess -config.h.in -config.sub -config.h -configure -depcomp -install-sh -ltmain.sh -missing -Makefile -config.status -config.log -libtool -stamp-h1 -compile -build diff --git a/third_party/harfbuzz/AUTHORS b/third_party/harfbuzz/AUTHORS deleted file mode 100644 index 023488a5b9..0000000000 --- a/third_party/harfbuzz/AUTHORS +++ /dev/null @@ -1,6 +0,0 @@ -David Turner -Werner Lemberg -Owen Taylor -Behdad Esfahbod -Lars Knoll -Simon Hausmann diff --git a/third_party/harfbuzz/COPYING b/third_party/harfbuzz/COPYING deleted file mode 100644 index 820a9e6808..0000000000 --- a/third_party/harfbuzz/COPYING +++ /dev/null @@ -1,24 +0,0 @@ -HarfBuzz was previously licensed under different licenses. This was -changed in January 2008. If you need to relicense your old copies, -consult the announcement of the license change on the internet. -Other than that, each copy of HarfBuzz is licensed under the COPYING -file included with it. The actual license follows: - - -Permission is hereby granted, without written agreement and without -license or royalty fees, to use, copy, modify, and distribute this -software and its documentation for any purpose, provided that the -above copyright notice and the following two paragraphs appear in -all copies of this software. - -IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR -DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES -ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN -IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGE. - -THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, -BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS -ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO -PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. diff --git a/third_party/harfbuzz/ChangeLog b/third_party/harfbuzz/ChangeLog deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/third_party/harfbuzz/Makefile.am b/third_party/harfbuzz/Makefile.am deleted file mode 100644 index 776b947eee..0000000000 --- a/third_party/harfbuzz/Makefile.am +++ /dev/null @@ -1,2 +0,0 @@ - -SUBDIRS = src tests diff --git a/third_party/harfbuzz/NEWS b/third_party/harfbuzz/NEWS deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/third_party/harfbuzz/README b/third_party/harfbuzz/README deleted file mode 100644 index ca2546ae02..0000000000 --- a/third_party/harfbuzz/README +++ /dev/null @@ -1,7 +0,0 @@ -This is HarfBuzz, an OpenType Layout engine library. - -To report bugs or post to discussion mailing list, see: - - http://freedesktop.org/wiki/Software/HarfBuzz - -For license information, see the file COPYING. diff --git a/third_party/harfbuzz/README.google b/third_party/harfbuzz/README.google deleted file mode 100644 index 74eeb2e781..0000000000 --- a/third_party/harfbuzz/README.google +++ /dev/null @@ -1,9 +0,0 @@ -Harfbuzz - -http://freedesktop.org/wiki/Software/HarfBuzz - -This code was taken from b0d396aa88b3cdf8cea896bfeeba197656e1cdb1 -(git://anongit.freedesktop.org/harfbuzz) - -The patch in chromium.patch was applied on top of this; I will talk with -upstream about it. diff --git a/third_party/harfbuzz/autogen.sh b/third_party/harfbuzz/autogen.sh deleted file mode 100755 index 7fa1c3df61..0000000000 --- a/third_party/harfbuzz/autogen.sh +++ /dev/null @@ -1,116 +0,0 @@ -#!/bin/sh -# Run this to generate all the initial makefiles, etc. - -set -e - -srcdir=`dirname $0` -test -z "$srcdir" && srcdir=. - -ORIGDIR=`pwd` -cd $srcdir -PROJECT=harfbuzz -TEST_TYPE=-f -FILE=src/harfbuzz.h -ACLOCAL=${ACLOCAL-aclocal} -LIBTOOLIZE=${LIBTOOLIZE-libtoolize} -AUTOMAKE=${AUTOMAKE-automake} -AUTOHEADER=${AUTOHEADER-autoheader} -AUTOCONF=${AUTOCONF-autoconf} -LIBTOOLIZE_FLAGS="--copy --force" - -DIE=0 - -have_libtool=false -if $LIBTOOLIZE --version < /dev/null > /dev/null 2>&1 ; then - libtool_version=`$LIBTOOLIZE --version | sed 's/^[^0-9]*\([0-9].[0-9.]*\).*/\1/'` - case $libtool_version in - 1.4*|1.5*|1.6*|1.7*|2*) - have_libtool=true - ;; - esac -fi -if $have_libtool ; then : ; else - echo - echo "You must have libtool 1.4 installed to compile $PROJECT." - echo "Install the appropriate package for your distribution," - echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/" - DIE=1 -fi - -($AUTOCONF --version) < /dev/null > /dev/null 2>&1 || { - echo - echo "You must have autoconf installed to compile $PROJECT." - echo "libtool the appropriate package for your distribution," - echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/" - DIE=1 -} - -have_automake=false -need_libtoolize=true -if $AUTOMAKE --version < /dev/null > /dev/null 2>&1 ; then - automake_version=`$AUTOMAKE --version | grep 'automake (GNU automake)' | sed 's/^[^0-9]*\(.*\)/\1/'` - case $automake_version in - 1.2*|1.3*|1.4) - ;; - 1.4*) - have_automake=true - need_libtoolize=false - ;; - *) - have_automake=true - ;; - esac -fi -if $have_automake ; then : ; else - echo - echo "You must have automake 1.4-p1 installed to compile $PROJECT." - echo "Get ftp://ftp.gnu.org/pub/gnu/automake/automake-1.4-p1.tar.gz" - echo "(or a newer version if it is available)" - DIE=1 -fi - -if test "$DIE" -eq 1; then - exit 1 -fi - -test $TEST_TYPE $FILE || { - echo "You must run this script in the top-level $PROJECT directory" - exit 1 -} - -if test -z "$AUTOGEN_SUBDIR_MODE"; then - if test -z "$*"; then - echo "I am going to run ./configure with no arguments - if you wish " - echo "to pass any to it, please specify them on the $0 command line." - fi -fi - -echo Running $ACLOCAL $ACLOCAL_FLAGS -$ACLOCAL $ACLOCAL_FLAGS - -# optionally run autoheader -if $AUTOHEADER --version < /dev/null > /dev/null 2>&1; then - echo Running $AUTOHEADER - $AUTOHEADER -fi - -case $need_libtoolize in - true) - echo Running $LIBTOOLIZE $LIBTOOLIZE_FLAGS - $LIBTOOLIZE $LIBTOOLIZE_FLAGS - ;; -esac - -echo Running $AUTOMAKE -a $am_opt -$AUTOMAKE -a $am_opt -echo Running $AUTOCONF -$AUTOCONF -cd $ORIGDIR - -if test -z "$AUTOGEN_SUBDIR_MODE"; then - echo Running $srcdir/configure "$@" - $srcdir/configure "$@" - - echo - echo "Now type 'make' to compile $PROJECT." -fi diff --git a/third_party/harfbuzz/chromium.patch b/third_party/harfbuzz/chromium.patch deleted file mode 100644 index 0f20dfd19e..0000000000 --- a/third_party/harfbuzz/chromium.patch +++ /dev/null @@ -1,37 +0,0 @@ -diff --git a/contrib/harfbuzz-unicode.c b/contrib/harfbuzz-unicode.c -index 51dd4ea..cb7a85b 100644 ---- a/contrib/harfbuzz-unicode.c -+++ b/contrib/harfbuzz-unicode.c -@@ -171,7 +171,10 @@ hb_utf16_script_run_prev(unsigned *num_code_points, HB_ScriptItem *output, - current_script = script; - continue; - } else if (script == HB_Script_Inherited) { -- current_script = script; -+ // Just assume that whatever follows this combining character is within -+ // the same script. This is incorrect if you had language1 + combining -+ // char + language 2, but that is rare and this code is suspicious -+ // anyway. - continue; - } else { - *iter = prev_iter; -diff --git a/src/harfbuzz-shaper.cpp b/src/harfbuzz-shaper.cpp -index f3ec8e1..2b0dfde 100644 ---- a/src/harfbuzz-shaper.cpp -+++ b/src/harfbuzz-shaper.cpp -@@ -433,7 +433,7 @@ void HB_HeuristicSetGlyphAttributes(HB_ShaperItem *item) - - // ### zeroWidth and justification are missing here!!!!! - -- assert(item->num_glyphs <= length); -+ assert(length <= item->num_glyphs); - - // qDebug("QScriptEngine::heuristicSetGlyphAttributes, num_glyphs=%d", item->num_glyphs); - HB_GlyphAttributes *attributes = item->attributes; -@@ -451,7 +451,6 @@ void HB_HeuristicSetGlyphAttributes(HB_ShaperItem *item) - } - ++glyph_pos; - } -- assert(glyph_pos == item->num_glyphs); - - // first char in a run is never (treated as) a mark - int cStart = 0; diff --git a/third_party/harfbuzz/config.h b/third_party/harfbuzz/config.h deleted file mode 100644 index 2e856ee6c9..0000000000 --- a/third_party/harfbuzz/config.h +++ /dev/null @@ -1,60 +0,0 @@ -/* config.h. Generated from config.h.in by configure. */ -/* config.h.in. Generated from configure.ac by autoheader. */ - -/* Define to 1 if you have the header file. */ -#define HAVE_DLFCN_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_INTTYPES_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_MEMORY_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_STDINT_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_STDLIB_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_STRINGS_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_STRING_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_SYS_STAT_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_SYS_TYPES_H 1 - -/* Define to 1 if you have the header file. */ -#define HAVE_UNISTD_H 1 - -/* Define to the sub-directory in which libtool stores uninstalled libraries. - */ -#define LT_OBJDIR ".libs/" - -/* Name of package */ -#define PACKAGE "harfbuzz" - -/* Define to the address where bug reports for this package should be sent. */ -#define PACKAGE_BUGREPORT "" - -/* Define to the full name of this package. */ -#define PACKAGE_NAME "" - -/* Define to the full name and version of this package. */ -#define PACKAGE_STRING "" - -/* Define to the one symbol short name of this package. */ -#define PACKAGE_TARNAME "" - -/* Define to the version of this package. */ -#define PACKAGE_VERSION "" - -/* Define to 1 if you have the ANSI C header files. */ -#define STDC_HEADERS 1 - -/* Version number of package */ -#define VERSION "0.1" diff --git a/third_party/harfbuzz/configure.ac b/third_party/harfbuzz/configure.ac deleted file mode 100644 index 8519279738..0000000000 --- a/third_party/harfbuzz/configure.ac +++ /dev/null @@ -1,54 +0,0 @@ -AC_INIT(README) -AM_INIT_AUTOMAKE(harfbuzz, 0.1) -AC_PROG_CC -AC_PROG_CXX -AM_PROG_LIBTOOL -PKG_PROG_PKG_CONFIG -AM_CONFIG_HEADER(config.h) - -if test "x$ac_compiler_gnu" = xyes; then - CFLAGS="$CFLAGS -Wall -W -pedantic -ansi" - CXXFLAGS="$CXXFLAGS -Wall -W" -fi - -AC_PATH_PROG(ft_config,freetype-config,no) -if test "$ft_config" = "no"; then - AC_MSG_ERROR([You must have freetype installed; see http://www.freetype.org/]) -fi - -FREETYPE_CFLAGS="`$ft_config --cflags`" -FREETYPE_LIBS="`$ft_config --libs`" - -AC_SUBST(FREETYPE_LIBS) -AC_SUBST(FREETYPE_CFLAGS) - -AC_ARG_ENABLE(qt, AS_HELP_STRING([--disable-qt], [Build Qt support (default: auto)]), [QT=$enableval], [QT=auto]) - -if test "x$QT" = xauto; then - PKG_CHECK_MODULES(QT, [QtGui >= 4.3], [QT=yes], [QT=no]) -fi -if test "x$QT" = xyes; then - PKG_CHECK_MODULES(QT_GUI, [QtGui >= 4.3]) - PKG_CHECK_MODULES(QT_QTEST, [QtTest >= 4.3]) - - _PKG_CONFIG(QT_INCDIR, [variable=includedir], [QtGui >= 4.3]) - QT_GUI_CFLAGS="$QT_GUI_CFLAGS -I$pkg_cv_QT_INCDIR/../Qt" - - AC_SUBST(QT_GUI_CFLAGS) - AC_SUBST(QT_GUI_LIBS) - AC_SUBST(QT_QTEST_CFLAGS) - AC_SUBST(QT_QTEST_LIBS) - - _PKG_CONFIG(QT_MOC, [variable=moc_location], [QtGui >= 4.3]) - QT_MOC=$pkg_cv_QT_MOC - AC_SUBST(QT_MOC) -fi -AM_CONDITIONAL(QT, [test "x$QT" = xyes]) - -AC_OUTPUT([ -Makefile -src/Makefile -tests/Makefile -tests/linebreaking/Makefile -tests/shaping/Makefile -]) diff --git a/third_party/harfbuzz/contrib/README b/third_party/harfbuzz/contrib/README deleted file mode 100644 index 074cc527f0..0000000000 --- a/third_party/harfbuzz/contrib/README +++ /dev/null @@ -1,9 +0,0 @@ -Harfbuzz requires several functions to be defined in order to work with the -platform's Unicode tables etc. - -If you are building on top of Qt4 you should look at the code in the tests/ -directory for examples of how to hook up Qt4 functions to Harfbuzz. - -Otherwise, this directory contains examples of using downloaded Unicode tables -and/or glib to host Harfbuzz. You should read the README file in tables/ for how -to build the header files for some of the Unicode tables. diff --git a/third_party/harfbuzz/contrib/harfbuzz-freetype.c b/third_party/harfbuzz/contrib/harfbuzz-freetype.c deleted file mode 100644 index a2962df48f..0000000000 --- a/third_party/harfbuzz/contrib/harfbuzz-freetype.c +++ /dev/null @@ -1,149 +0,0 @@ -#include - -#include -#include FT_FREETYPE_H -#include FT_TRUETYPE_TABLES_H - -#if 0 -#include -#include -#endif - -#include -#include "harfbuzz-unicode.h" - -static HB_Bool -hb_freetype_string_to_glyphs(HB_Font font, - const HB_UChar16 *chars, hb_uint32 len, - HB_Glyph *glyphs, hb_uint32 *numGlyphs, - HB_Bool is_rtl) { - FT_Face face = (FT_Face) font->userData; - if (len > *numGlyphs) - return 0; - - size_t i = 0, j = 0; - while (i < len) { - const uint32_t cp = utf16_to_code_point(chars, len, &i); - glyphs[j++] = FT_Get_Char_Index(face, cp); - } - - *numGlyphs = j; - - return 1; -} - -static void -hb_freetype_advances_get(HB_Font font, const HB_Glyph *glyphs, hb_uint32 len, - HB_Fixed *advances, int flags) { - FT_Face face = (FT_Face) font->userData; - - hb_uint32 i; - for (i = 0; i < len; ++i) { - const FT_Error error = FT_Load_Glyph(face, glyphs[i], FT_LOAD_DEFAULT); - if (error) { - advances[i] = 0; - continue; - } - - advances[i] = face->glyph->advance.x; - } -} - -static HB_Bool -hb_freetype_can_render(HB_Font font, const HB_UChar16 *chars, hb_uint32 len) { - FT_Face face = (FT_Face)font->userData; - - size_t i = 0; - while (i < len) { - const uint32_t cp = utf16_to_code_point(chars, len, &i); - if (FT_Get_Char_Index(face, cp) == 0) - return 0; - } - - return 1; -} - -static HB_Error -hb_freetype_outline_point_get(HB_Font font, HB_Glyph glyph, int flags, - hb_uint32 point, HB_Fixed *xpos, HB_Fixed *ypos, - hb_uint32 *n_points) { - HB_Error error = HB_Err_Ok; - FT_Face face = (FT_Face) font->userData; - - int load_flags = (flags & HB_ShaperFlag_UseDesignMetrics) ? FT_LOAD_NO_HINTING : FT_LOAD_DEFAULT; - - if ((error = (HB_Error) FT_Load_Glyph(face, glyph, load_flags))) - return error; - - if (face->glyph->format != ft_glyph_format_outline) - return (HB_Error)HB_Err_Invalid_SubTable; - - *n_points = face->glyph->outline.n_points; - if (!(*n_points)) - return HB_Err_Ok; - - if (point > *n_points) - return (HB_Error)HB_Err_Invalid_SubTable; - - *xpos = face->glyph->outline.points[point].x; - *ypos = face->glyph->outline.points[point].y; - - return HB_Err_Ok; -} - -static void -hb_freetype_glyph_metrics_get(HB_Font font, HB_Glyph glyph, - HB_GlyphMetrics *metrics) { - FT_Face face = (FT_Face) font->userData; - - const FT_Error error = FT_Load_Glyph(face, glyph, FT_LOAD_DEFAULT); - if (error) { - metrics->x = metrics->y = metrics->width = metrics->height = 0; - metrics->xOffset = metrics->yOffset = 0; - return; - } - - const FT_Glyph_Metrics *ftmetrics = &face->glyph->metrics; - metrics->width = ftmetrics->width; - metrics->height = ftmetrics->height; - metrics->x = ftmetrics->horiAdvance; - metrics->y = 0; // unclear what this is - metrics->xOffset = ftmetrics->horiBearingX; - metrics->yOffset = ftmetrics->horiBearingY; -} - -static HB_Fixed -hb_freetype_font_metric_get(HB_Font font, HB_FontMetric metric) { - FT_Face face = (FT_Face) font->userData; - - switch (metric) { - case HB_FontAscent: - // Note that we aren't scanning the VDMX table which we probably would in - // an ideal world. - return face->ascender; - default: - return 0; - } -} - -const HB_FontClass hb_freetype_class = { - hb_freetype_string_to_glyphs, - hb_freetype_advances_get, - hb_freetype_can_render, - hb_freetype_outline_point_get, - hb_freetype_glyph_metrics_get, - hb_freetype_font_metric_get, -}; - -HB_Error -hb_freetype_table_sfnt_get(void *voidface, const HB_Tag tag, HB_Byte *buffer, HB_UInt *len) { - FT_Face face = (FT_Face) voidface; - FT_ULong ftlen = *len; - - if (!FT_IS_SFNT(face)) - return HB_Err_Invalid_Argument; - - const FT_Error error = FT_Load_Sfnt_Table(face, tag, 0, buffer, &ftlen); - *len = ftlen; - return (HB_Error) error; -} diff --git a/third_party/harfbuzz/contrib/harfbuzz-freetype.h b/third_party/harfbuzz/contrib/harfbuzz-freetype.h deleted file mode 100644 index 628be16831..0000000000 --- a/third_party/harfbuzz/contrib/harfbuzz-freetype.h +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef HB_FREETYPE_H_ -#define HB_FREETYPE_H_ - -extern const HB_FontClass hb_freetype_class; - -HB_Error hb_freetype_table_sfnt_get(void *voidface, const HB_Tag tag, - HB_Byte *buffer, HB_UInt *len); - -#endif // HB_FREETYPE_H_ diff --git a/third_party/harfbuzz/contrib/harfbuzz-unicode-glib.c b/third_party/harfbuzz/contrib/harfbuzz-unicode-glib.c deleted file mode 100644 index 6a13433fea..0000000000 --- a/third_party/harfbuzz/contrib/harfbuzz-unicode-glib.c +++ /dev/null @@ -1,169 +0,0 @@ -#include "harfbuzz-external.h" - -#include - -static int -hb_category_for_char(HB_UChar32 ch) { - switch (g_unichar_type(ch)) { - case G_UNICODE_CONTROL: - return HB_Other_Control; - case G_UNICODE_FORMAT: - return HB_Other_Format; - case G_UNICODE_UNASSIGNED: - return HB_Other_NotAssigned; - case G_UNICODE_PRIVATE_USE: - return HB_Other_PrivateUse; - case G_UNICODE_SURROGATE: - return HB_Other_Surrogate; - case G_UNICODE_LOWERCASE_LETTER: - return HB_Letter_Lowercase; - case G_UNICODE_MODIFIER_LETTER: - return HB_Letter_Modifier; - case G_UNICODE_OTHER_LETTER: - return HB_Letter_Other; - case G_UNICODE_TITLECASE_LETTER: - return HB_Letter_Titlecase; - case G_UNICODE_UPPERCASE_LETTER: - return HB_Letter_Uppercase; - case G_UNICODE_COMBINING_MARK: - return HB_Mark_SpacingCombining; - case G_UNICODE_ENCLOSING_MARK: - return HB_Mark_Enclosing; - case G_UNICODE_NON_SPACING_MARK: - return HB_Mark_NonSpacing; - case G_UNICODE_DECIMAL_NUMBER: - return HB_Number_DecimalDigit; - case G_UNICODE_LETTER_NUMBER: - return HB_Number_Letter; - case G_UNICODE_OTHER_NUMBER: - return HB_Number_Other; - case G_UNICODE_CONNECT_PUNCTUATION: - return HB_Punctuation_Connector; - case G_UNICODE_DASH_PUNCTUATION: - return HB_Punctuation_Dash; - case G_UNICODE_CLOSE_PUNCTUATION: - return HB_Punctuation_Close; - case G_UNICODE_FINAL_PUNCTUATION: - return HB_Punctuation_FinalQuote; - case G_UNICODE_INITIAL_PUNCTUATION: - return HB_Punctuation_InitialQuote; - case G_UNICODE_OTHER_PUNCTUATION: - return HB_Punctuation_Other; - case G_UNICODE_OPEN_PUNCTUATION: - return HB_Punctuation_Open; - case G_UNICODE_CURRENCY_SYMBOL: - return HB_Symbol_Currency; - case G_UNICODE_MODIFIER_SYMBOL: - return HB_Symbol_Modifier; - case G_UNICODE_MATH_SYMBOL: - return HB_Symbol_Math; - case G_UNICODE_OTHER_SYMBOL: - return HB_Symbol_Other; - case G_UNICODE_LINE_SEPARATOR: - return HB_Separator_Line; - case G_UNICODE_PARAGRAPH_SEPARATOR: - return HB_Separator_Paragraph; - case G_UNICODE_SPACE_SEPARATOR: - return HB_Separator_Space; - default: - return HB_Symbol_Other; - } -} - -HB_LineBreakClass -HB_GetLineBreakClass(HB_UChar32 ch) { - switch (g_unichar_break_type(ch)) { - case G_UNICODE_BREAK_MANDATORY: - return HB_LineBreak_BK; - case G_UNICODE_BREAK_CARRIAGE_RETURN: - return HB_LineBreak_CR; - case G_UNICODE_BREAK_LINE_FEED: - return HB_LineBreak_LF; - case G_UNICODE_BREAK_COMBINING_MARK: - return HB_LineBreak_CM; - case G_UNICODE_BREAK_SURROGATE: - return HB_LineBreak_SG; - case G_UNICODE_BREAK_ZERO_WIDTH_SPACE: - return HB_LineBreak_ZW; - case G_UNICODE_BREAK_INSEPARABLE: - return HB_LineBreak_IN; - case G_UNICODE_BREAK_NON_BREAKING_GLUE: - return HB_LineBreak_GL; - case G_UNICODE_BREAK_CONTINGENT: - return HB_LineBreak_AL; - case G_UNICODE_BREAK_SPACE: - return HB_LineBreak_SP; - case G_UNICODE_BREAK_AFTER: - return HB_LineBreak_BA; - case G_UNICODE_BREAK_BEFORE: - return HB_LineBreak_BB; - case G_UNICODE_BREAK_BEFORE_AND_AFTER: - return HB_LineBreak_B2; - case G_UNICODE_BREAK_HYPHEN: - return HB_LineBreak_HY; - case G_UNICODE_BREAK_NON_STARTER: - return HB_LineBreak_NS; - case G_UNICODE_BREAK_OPEN_PUNCTUATION: - return HB_LineBreak_OP; - case G_UNICODE_BREAK_CLOSE_PUNCTUATION: - return HB_LineBreak_CL; - case G_UNICODE_BREAK_QUOTATION: - return HB_LineBreak_QU; - case G_UNICODE_BREAK_EXCLAMATION: - return HB_LineBreak_EX; - case G_UNICODE_BREAK_IDEOGRAPHIC: - return HB_LineBreak_ID; - case G_UNICODE_BREAK_NUMERIC: - return HB_LineBreak_NU; - case G_UNICODE_BREAK_INFIX_SEPARATOR: - return HB_LineBreak_IS; - case G_UNICODE_BREAK_SYMBOL: - return HB_LineBreak_SY; - case G_UNICODE_BREAK_ALPHABETIC: - return HB_LineBreak_AL; - case G_UNICODE_BREAK_PREFIX: - return HB_LineBreak_PR; - case G_UNICODE_BREAK_POSTFIX: - return HB_LineBreak_PO; - case G_UNICODE_BREAK_COMPLEX_CONTEXT: - return HB_LineBreak_SA; - case G_UNICODE_BREAK_AMBIGUOUS: - return HB_LineBreak_AL; - case G_UNICODE_BREAK_UNKNOWN: - return HB_LineBreak_AL; - case G_UNICODE_BREAK_NEXT_LINE: - return HB_LineBreak_AL; - case G_UNICODE_BREAK_WORD_JOINER: - return HB_LineBreak_WJ; - case G_UNICODE_BREAK_HANGUL_L_JAMO: - return HB_LineBreak_JL; - case G_UNICODE_BREAK_HANGUL_V_JAMO: - return HB_LineBreak_JV; - case G_UNICODE_BREAK_HANGUL_T_JAMO: - return HB_LineBreak_JT; - case G_UNICODE_BREAK_HANGUL_LV_SYLLABLE: - return HB_LineBreak_H2; - case G_UNICODE_BREAK_HANGUL_LVT_SYLLABLE: - return HB_LineBreak_H3; - default: - return HB_LineBreak_AL; - } -} - -int -HB_GetUnicodeCharCombiningClass(HB_UChar32 ch) { - return g_unichar_combining_class(ch); -} - -void -HB_GetUnicodeCharProperties(HB_UChar32 ch, - HB_CharCategory *category, - int *combiningClass) { - *category = hb_category_for_char(ch); - *combiningClass = g_unichar_combining_class(ch); -} - -HB_CharCategory -HB_GetUnicodeCharCategory(HB_UChar32 ch) { - return hb_category_for_char(ch); -} diff --git a/third_party/harfbuzz/contrib/harfbuzz-unicode-tables.c b/third_party/harfbuzz/contrib/harfbuzz-unicode-tables.c deleted file mode 100644 index 3c3fead62c..0000000000 --- a/third_party/harfbuzz/contrib/harfbuzz-unicode-tables.c +++ /dev/null @@ -1,84 +0,0 @@ -#include -#include - -#include - -#include "tables/category-properties.h" -#include "tables/combining-properties.h" - -HB_LineBreakClass -HB_GetLineBreakClass(HB_UChar32 ch) { - abort(); - return 0; -} - -static int -combining_property_cmp(const void *vkey, const void *vcandidate) { - const uint32_t key = (uint32_t) (intptr_t) vkey; - const struct combining_property *candidate = vcandidate; - - if (key < candidate->range_start) { - return -1; - } else if (key > candidate->range_end) { - return 1; - } else { - return 0; - } -} - -static int -code_point_to_combining_class(HB_UChar32 cp) { - const void *vprop = bsearch((void *) (intptr_t) cp, combining_properties, - combining_properties_count, - sizeof(struct combining_property), - combining_property_cmp); - if (!vprop) - return 0; - - return ((const struct combining_property *) vprop)->klass; -} - -int -HB_GetUnicodeCharCombiningClass(HB_UChar32 ch) { - return code_point_to_combining_class(ch); - return 0; -} - -static int -category_property_cmp(const void *vkey, const void *vcandidate) { - const uint32_t key = (uint32_t) (intptr_t) vkey; - const struct category_property *candidate = vcandidate; - - if (key < candidate->range_start) { - return -1; - } else if (key > candidate->range_end) { - return 1; - } else { - return 0; - } -} - -static HB_CharCategory -code_point_to_category(HB_UChar32 cp) { - const void *vprop = bsearch((void *) (intptr_t) cp, category_properties, - category_properties_count, - sizeof(struct category_property), - category_property_cmp); - if (!vprop) - return HB_NoCategory; - - return ((const struct category_property *) vprop)->category; -} - -void -HB_GetUnicodeCharProperties(HB_UChar32 ch, - HB_CharCategory *category, - int *combiningClass) { - *category = code_point_to_category(ch); - *combiningClass = code_point_to_combining_class(ch); -} - -HB_CharCategory -HB_GetUnicodeCharCategory(HB_UChar32 ch) { - return code_point_to_category(ch); -} diff --git a/third_party/harfbuzz/contrib/harfbuzz-unicode.c b/third_party/harfbuzz/contrib/harfbuzz-unicode.c deleted file mode 100644 index f2185dc6fb..0000000000 --- a/third_party/harfbuzz/contrib/harfbuzz-unicode.c +++ /dev/null @@ -1,287 +0,0 @@ -#include -#include - -#include -#include -#include -#include "harfbuzz-unicode.h" - -#include "tables/grapheme-break-properties.h" -#include "tables/mirroring-properties.h" -#include "tables/script-properties.h" - -uint32_t -utf16_to_code_point(const uint16_t *chars, size_t len, ssize_t *iter) { - const uint16_t v = chars[(*iter)++]; - if (HB_IsHighSurrogate(v)) { - // surrogate pair - if (*iter >= len) { - // the surrogate is incomplete. - return HB_InvalidCodePoint; - } - const uint16_t v2 = chars[(*iter)++]; - if (!HB_IsLowSurrogate(v2)) { - // invalidate surrogate pair. - return HB_InvalidCodePoint; - } - - return HB_SurrogateToUcs4(v, v2); - } - - if (HB_IsLowSurrogate(v)) { - // this isn't a valid code point - return HB_InvalidCodePoint; - } - - return v; -} - -uint32_t -utf16_to_code_point_prev(const uint16_t *chars, size_t len, ssize_t *iter) { - const uint16_t v = chars[(*iter)--]; - if (HB_IsLowSurrogate(v)) { - // surrogate pair - if (*iter < 0) { - // the surrogate is incomplete. - return HB_InvalidCodePoint; - } - const uint16_t v2 = chars[(*iter)--]; - if (!HB_IsHighSurrogate(v2)) { - // invalidate surrogate pair. - return HB_InvalidCodePoint; - } - - return HB_SurrogateToUcs4(v2, v); - } - - if (HB_IsHighSurrogate(v)) { - // this isn't a valid code point - return HB_InvalidCodePoint; - } - - return v; -} - -static int -script_property_cmp(const void *vkey, const void *vcandidate) { - const uint32_t key = (uint32_t) (intptr_t) vkey; - const struct script_property *candidate = vcandidate; - - if (key < candidate->range_start) { - return -1; - } else if (key > candidate->range_end) { - return 1; - } else { - return 0; - } -} - -HB_Script -code_point_to_script(uint32_t cp) { - const void *vprop = bsearch((void *) (intptr_t) cp, script_properties, - script_properties_count, - sizeof(struct script_property), - script_property_cmp); - if (!vprop) - return HB_Script_Common; - - return ((const struct script_property *) vprop)->script; -} - -char -hb_utf16_script_run_next(unsigned *num_code_points, HB_ScriptItem *output, - const uint16_t *chars, size_t len, ssize_t *iter) { - if (*iter == len) - return 0; - - output->pos = *iter; - const uint32_t init_cp = utf16_to_code_point(chars, len, iter); - unsigned cps = 1; - if (init_cp == HB_InvalidCodePoint) - return 0; - const HB_Script init_script = code_point_to_script(init_cp); - HB_Script current_script = init_script; - output->script = init_script; - - for (;;) { - if (*iter == len) - break; - const ssize_t prev_iter = *iter; - const uint32_t cp = utf16_to_code_point(chars, len, iter); - if (cp == HB_InvalidCodePoint) - return 0; - cps++; - const HB_Script script = code_point_to_script(cp); - - if (script != current_script) { - if (current_script == init_script == HB_Script_Inherited) { - // If we started off as inherited, we take whatever we can find. - output->script = script; - current_script = script; - continue; - } else if (script == HB_Script_Inherited) { - continue; - } else { - *iter = prev_iter; - cps--; - break; - } - } - } - - if (output->script == HB_Script_Inherited) - output->script = HB_Script_Common; - - output->length = *iter - output->pos; - if (num_code_points) - *num_code_points = cps; - return 1; -} - -char -hb_utf16_script_run_prev(unsigned *num_code_points, HB_ScriptItem *output, - const uint16_t *chars, size_t len, ssize_t *iter) { - if (*iter == (size_t) -1) - return 0; - - const size_t ending_index = *iter; - const uint32_t init_cp = utf16_to_code_point_prev(chars, len, iter); - unsigned cps = 1; - if (init_cp == HB_InvalidCodePoint) - return 0; - const HB_Script init_script = code_point_to_script(init_cp); - HB_Script current_script = init_script; - output->script = init_script; - - for (;;) { - if (*iter < 0) - break; - const ssize_t prev_iter = *iter; - const uint32_t cp = utf16_to_code_point_prev(chars, len, iter); - if (cp == HB_InvalidCodePoint) - return 0; - cps++; - const HB_Script script = code_point_to_script(cp); - - if (script != current_script) { - if (current_script == init_script == HB_Script_Inherited) { - // If we started off as inherited, we take whatever we can find. - output->script = script; - current_script = script; - continue; - } else if (script == HB_Script_Inherited) { - // Just assume that whatever follows this combining character is within - // the same script. This is incorrect if you had language1 + combining - // char + language 2, but that is rare and this code is suspicious - // anyway. - continue; - } else { - *iter = prev_iter; - cps--; - break; - } - } - } - - if (output->script == HB_Script_Inherited) - output->script = HB_Script_Common; - - output->pos = *iter + 1; - output->length = ending_index - *iter; - if (num_code_points) - *num_code_points = cps; - return 1; -} - -static int -grapheme_break_property_cmp(const void *vkey, const void *vcandidate) { - const uint32_t key = (uint32_t) (intptr_t) vkey; - const struct grapheme_break_property *candidate = vcandidate; - - if (key < candidate->range_start) { - return -1; - } else if (key > candidate->range_end) { - return 1; - } else { - return 0; - } -} - -HB_GraphemeClass -HB_GetGraphemeClass(HB_UChar32 ch) { - const void *vprop = bsearch((void *) (intptr_t) ch, grapheme_break_properties, - grapheme_break_properties_count, - sizeof(struct grapheme_break_property), - grapheme_break_property_cmp); - if (!vprop) - return HB_Grapheme_Other; - - return ((const struct grapheme_break_property *) vprop)->klass; -} - -HB_WordClass -HB_GetWordClass(HB_UChar32 ch) { - abort(); - return 0; -} - -HB_SentenceClass -HB_GetSentenceClass(HB_UChar32 ch) { - abort(); - return 0; -} - -void -HB_GetGraphemeAndLineBreakClass(HB_UChar32 ch, HB_GraphemeClass *gclass, HB_LineBreakClass *breakclass) { - *gclass = HB_GetGraphemeClass(ch); - *breakclass = HB_GetLineBreakClass(ch); -} - -static int -mirroring_property_cmp(const void *vkey, const void *vcandidate) { - const uint32_t key = (uint32_t) (intptr_t) vkey; - const struct mirroring_property *candidate = vcandidate; - - if (key < candidate->a) { - return -1; - } else if (key > candidate->a) { - return 1; - } else { - return 0; - } -} - -HB_UChar16 -HB_GetMirroredChar(HB_UChar16 ch) { - const void *mprop = bsearch((void *) (intptr_t) ch, mirroring_properties, - mirroring_properties_count, - sizeof(struct mirroring_property), - mirroring_property_cmp); - if (!mprop) - return ch; - - return ((const struct mirroring_property *) mprop)->b; -} - -void * -HB_Library_Resolve(const char *library, const char *symbol) { - abort(); - return NULL; -} - -void * -HB_TextCodecForMib(int mib) { - abort(); - return NULL; -} - -char * -HB_TextCodec_ConvertFromUnicode(void *codec, const HB_UChar16 *unicode, hb_uint32 length, hb_uint32 *outputLength) { - abort(); - return NULL; -} - -void -HB_TextCodec_FreeResult(char *v) { - abort(); -} diff --git a/third_party/harfbuzz/contrib/harfbuzz-unicode.h b/third_party/harfbuzz/contrib/harfbuzz-unicode.h deleted file mode 100644 index f28b3c3e89..0000000000 --- a/third_party/harfbuzz/contrib/harfbuzz-unicode.h +++ /dev/null @@ -1,54 +0,0 @@ -#ifndef SCRIPT_IDENTIFY_H_ -#define SCRIPT_IDENTIFY_H_ - -#include - -#include - -static const uint32_t HB_InvalidCodePoint = 0xffffffffu; - -// ----------------------------------------------------------------------------- -// Return the next Unicode code point from a UTF-16 vector -// chars: a pointer to @len words -// iter: (input/output) an index into @chars. This is updated. -// returns: HB_InvalidCodePoint on error and the code point otherwise. -// ----------------------------------------------------------------------------- -uint32_t utf16_to_code_point(const uint16_t *chars, size_t len, ssize_t *iter); - -// ----------------------------------------------------------------------------- -// Like the above, except that the code points are traversed backwards. Thus, -// on the first call, |iter| should be |len| - 1. -// ----------------------------------------------------------------------------- -uint32_t utf16_to_code_point(const uint16_t *chars, size_t len, ssize_t *iter); - -// ----------------------------------------------------------------------------- -// Return the script of the given code point -// ----------------------------------------------------------------------------- -HB_Script code_point_to_script(uint32_t cp); - -// ----------------------------------------------------------------------------- -// Find the next script run in a UTF-16 string. -// -// A script run is a subvector of codepoints, all of which are in the same -// script. A run will never cut a surrogate pair in half at either end. -// -// num_code_points: (output, maybe NULL) the number of code points in the run -// output: (output) the @pos, @length and @script fields are set on success -// chars: the UTF-16 string -// len: the length of @chars, in words -// iter: (in/out) the current index into the string. This should be 0 for the -// first call and is updated on exit. -// -// returns: non-zero if a script run was found and returned. -// ----------------------------------------------------------------------------- -char hb_utf16_script_run_next(unsigned *num_code_points, HB_ScriptItem *output, - const uint16_t *chars, size_t len, ssize_t *iter); - -// ----------------------------------------------------------------------------- -// This is the same as above, except that the input is traversed backwards. -// Thus, on the first call, |iter| should be |len| - 1. -// ----------------------------------------------------------------------------- -char hb_utf16_script_run_prev(unsigned *num_code_points, HB_ScriptItem *output, - const uint16_t *chars, size_t len, ssize_t *iter); - -#endif diff --git a/third_party/harfbuzz/contrib/tables/BidiMirroring.txt b/third_party/harfbuzz/contrib/tables/BidiMirroring.txt deleted file mode 100644 index 64d29e44cd..0000000000 --- a/third_party/harfbuzz/contrib/tables/BidiMirroring.txt +++ /dev/null @@ -1,588 +0,0 @@ -# BidiMirroring-5.1.0.txt -# Date: 2008-03-28, 10:22:00 PDT [KW] -# -# Bidi_Mirroring_Glyph Property -# -# This file is an informative contributory data file in the -# Unicode Character Database. -# -# Copyright (c) 1991-2008 Unicode, Inc. -# For terms of use, see http://www.unicode.org/terms_of_use.html -# -# This data file lists characters that have the mirrored property -# where there is another Unicode character that typically has a glyph -# that is the mirror image of the original character's glyph. -# The repertoire covered by the file is Unicode 5.1.0. -# -# The file contains a list of lines with mappings from one code point -# to another one for character-based mirroring. -# Note that for "real" mirroring, a rendering engine needs to select -# appropriate alternative glyphs, and that many Unicode characters do not -# have a mirror-image Unicode character. -# -# Each mapping line contains two fields, separated by a semicolon (';'). -# Each of the two fields contains a code point represented as a -# variable-length hexadecimal value with 4 to 6 digits. -# A comment indicates where the characters are "BEST FIT" mirroring. -# -# Code points with the "mirrored" property but no appropriate mirrors are -# listed as comments at the end of the file. -# -# For information on bidi mirroring, see UAX #9: Bidirectional Algorithm, -# at http://www.unicode.org/unicode/reports/tr9/ -# -# This file was originally created by Markus Scherer. -# Extended for Unicode 3.2, 4.0, 4.1, 5.0, and 5.1 by Ken Whistler. -# -# ############################################################ - -0028; 0029 # LEFT PARENTHESIS -0029; 0028 # RIGHT PARENTHESIS -003C; 003E # LESS-THAN SIGN -003E; 003C # GREATER-THAN SIGN -005B; 005D # LEFT SQUARE BRACKET -005D; 005B # RIGHT SQUARE BRACKET -007B; 007D # LEFT CURLY BRACKET -007D; 007B # RIGHT CURLY BRACKET -00AB; 00BB # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK -00BB; 00AB # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK -0F3A; 0F3B # TIBETAN MARK GUG RTAGS GYON -0F3B; 0F3A # TIBETAN MARK GUG RTAGS GYAS -0F3C; 0F3D # TIBETAN MARK ANG KHANG GYON -0F3D; 0F3C # TIBETAN MARK ANG KHANG GYAS -169B; 169C # OGHAM FEATHER MARK -169C; 169B # OGHAM REVERSED FEATHER MARK -2039; 203A # SINGLE LEFT-POINTING ANGLE QUOTATION MARK -203A; 2039 # SINGLE RIGHT-POINTING ANGLE QUOTATION MARK -2045; 2046 # LEFT SQUARE BRACKET WITH QUILL -2046; 2045 # RIGHT SQUARE BRACKET WITH QUILL -207D; 207E # SUPERSCRIPT LEFT PARENTHESIS -207E; 207D # SUPERSCRIPT RIGHT PARENTHESIS -208D; 208E # SUBSCRIPT LEFT PARENTHESIS -208E; 208D # SUBSCRIPT RIGHT PARENTHESIS -2208; 220B # ELEMENT OF -2209; 220C # NOT AN ELEMENT OF -220A; 220D # SMALL ELEMENT OF -220B; 2208 # CONTAINS AS MEMBER -220C; 2209 # DOES NOT CONTAIN AS MEMBER -220D; 220A # SMALL CONTAINS AS MEMBER -2215; 29F5 # DIVISION SLASH -223C; 223D # TILDE OPERATOR -223D; 223C # REVERSED TILDE -2243; 22CD # ASYMPTOTICALLY EQUAL TO -2252; 2253 # APPROXIMATELY EQUAL TO OR THE IMAGE OF -2253; 2252 # IMAGE OF OR APPROXIMATELY EQUAL TO -2254; 2255 # COLON EQUALS -2255; 2254 # EQUALS COLON -2264; 2265 # LESS-THAN OR EQUAL TO -2265; 2264 # GREATER-THAN OR EQUAL TO -2266; 2267 # LESS-THAN OVER EQUAL TO -2267; 2266 # GREATER-THAN OVER EQUAL TO -2268; 2269 # [BEST FIT] LESS-THAN BUT NOT EQUAL TO -2269; 2268 # [BEST FIT] GREATER-THAN BUT NOT EQUAL TO -226A; 226B # MUCH LESS-THAN -226B; 226A # MUCH GREATER-THAN -226E; 226F # [BEST FIT] NOT LESS-THAN -226F; 226E # [BEST FIT] NOT GREATER-THAN -2270; 2271 # [BEST FIT] NEITHER LESS-THAN NOR EQUAL TO -2271; 2270 # [BEST FIT] NEITHER GREATER-THAN NOR EQUAL TO -2272; 2273 # [BEST FIT] LESS-THAN OR EQUIVALENT TO -2273; 2272 # [BEST FIT] GREATER-THAN OR EQUIVALENT TO -2274; 2275 # [BEST FIT] NEITHER LESS-THAN NOR EQUIVALENT TO -2275; 2274 # [BEST FIT] NEITHER GREATER-THAN NOR EQUIVALENT TO -2276; 2277 # LESS-THAN OR GREATER-THAN -2277; 2276 # GREATER-THAN OR LESS-THAN -2278; 2279 # [BEST FIT] NEITHER LESS-THAN NOR GREATER-THAN -2279; 2278 # [BEST FIT] NEITHER GREATER-THAN NOR LESS-THAN -227A; 227B # PRECEDES -227B; 227A # SUCCEEDS -227C; 227D # PRECEDES OR EQUAL TO -227D; 227C # SUCCEEDS OR EQUAL TO -227E; 227F # [BEST FIT] PRECEDES OR EQUIVALENT TO -227F; 227E # [BEST FIT] SUCCEEDS OR EQUIVALENT TO -2280; 2281 # [BEST FIT] DOES NOT PRECEDE -2281; 2280 # [BEST FIT] DOES NOT SUCCEED -2282; 2283 # SUBSET OF -2283; 2282 # SUPERSET OF -2284; 2285 # [BEST FIT] NOT A SUBSET OF -2285; 2284 # [BEST FIT] NOT A SUPERSET OF -2286; 2287 # SUBSET OF OR EQUAL TO -2287; 2286 # SUPERSET OF OR EQUAL TO -2288; 2289 # [BEST FIT] NEITHER A SUBSET OF NOR EQUAL TO -2289; 2288 # [BEST FIT] NEITHER A SUPERSET OF NOR EQUAL TO -228A; 228B # [BEST FIT] SUBSET OF WITH NOT EQUAL TO -228B; 228A # [BEST FIT] SUPERSET OF WITH NOT EQUAL TO -228F; 2290 # SQUARE IMAGE OF -2290; 228F # SQUARE ORIGINAL OF -2291; 2292 # SQUARE IMAGE OF OR EQUAL TO -2292; 2291 # SQUARE ORIGINAL OF OR EQUAL TO -2298; 29B8 # CIRCLED DIVISION SLASH -22A2; 22A3 # RIGHT TACK -22A3; 22A2 # LEFT TACK -22A6; 2ADE # ASSERTION -22A8; 2AE4 # TRUE -22A9; 2AE3 # FORCES -22AB; 2AE5 # DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE -22B0; 22B1 # PRECEDES UNDER RELATION -22B1; 22B0 # SUCCEEDS UNDER RELATION -22B2; 22B3 # NORMAL SUBGROUP OF -22B3; 22B2 # CONTAINS AS NORMAL SUBGROUP -22B4; 22B5 # NORMAL SUBGROUP OF OR EQUAL TO -22B5; 22B4 # CONTAINS AS NORMAL SUBGROUP OR EQUAL TO -22B6; 22B7 # ORIGINAL OF -22B7; 22B6 # IMAGE OF -22C9; 22CA # LEFT NORMAL FACTOR SEMIDIRECT PRODUCT -22CA; 22C9 # RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT -22CB; 22CC # LEFT SEMIDIRECT PRODUCT -22CC; 22CB # RIGHT SEMIDIRECT PRODUCT -22CD; 2243 # REVERSED TILDE EQUALS -22D0; 22D1 # DOUBLE SUBSET -22D1; 22D0 # DOUBLE SUPERSET -22D6; 22D7 # LESS-THAN WITH DOT -22D7; 22D6 # GREATER-THAN WITH DOT -22D8; 22D9 # VERY MUCH LESS-THAN -22D9; 22D8 # VERY MUCH GREATER-THAN -22DA; 22DB # LESS-THAN EQUAL TO OR GREATER-THAN -22DB; 22DA # GREATER-THAN EQUAL TO OR LESS-THAN -22DC; 22DD # EQUAL TO OR LESS-THAN -22DD; 22DC # EQUAL TO OR GREATER-THAN -22DE; 22DF # EQUAL TO OR PRECEDES -22DF; 22DE # EQUAL TO OR SUCCEEDS -22E0; 22E1 # [BEST FIT] DOES NOT PRECEDE OR EQUAL -22E1; 22E0 # [BEST FIT] DOES NOT SUCCEED OR EQUAL -22E2; 22E3 # [BEST FIT] NOT SQUARE IMAGE OF OR EQUAL TO -22E3; 22E2 # [BEST FIT] NOT SQUARE ORIGINAL OF OR EQUAL TO -22E4; 22E5 # [BEST FIT] SQUARE IMAGE OF OR NOT EQUAL TO -22E5; 22E4 # [BEST FIT] SQUARE ORIGINAL OF OR NOT EQUAL TO -22E6; 22E7 # [BEST FIT] LESS-THAN BUT NOT EQUIVALENT TO -22E7; 22E6 # [BEST FIT] GREATER-THAN BUT NOT EQUIVALENT TO -22E8; 22E9 # [BEST FIT] PRECEDES BUT NOT EQUIVALENT TO -22E9; 22E8 # [BEST FIT] SUCCEEDS BUT NOT EQUIVALENT TO -22EA; 22EB # [BEST FIT] NOT NORMAL SUBGROUP OF -22EB; 22EA # [BEST FIT] DOES NOT CONTAIN AS NORMAL SUBGROUP -22EC; 22ED # [BEST FIT] NOT NORMAL SUBGROUP OF OR EQUAL TO -22ED; 22EC # [BEST FIT] DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL -22F0; 22F1 # UP RIGHT DIAGONAL ELLIPSIS -22F1; 22F0 # DOWN RIGHT DIAGONAL ELLIPSIS -22F2; 22FA # ELEMENT OF WITH LONG HORIZONTAL STROKE -22F3; 22FB # ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE -22F4; 22FC # SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE -22F6; 22FD # ELEMENT OF WITH OVERBAR -22F7; 22FE # SMALL ELEMENT OF WITH OVERBAR -22FA; 22F2 # CONTAINS WITH LONG HORIZONTAL STROKE -22FB; 22F3 # CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE -22FC; 22F4 # SMALL CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE -22FD; 22F6 # CONTAINS WITH OVERBAR -22FE; 22F7 # SMALL CONTAINS WITH OVERBAR -2308; 2309 # LEFT CEILING -2309; 2308 # RIGHT CEILING -230A; 230B # LEFT FLOOR -230B; 230A # RIGHT FLOOR -2329; 232A # LEFT-POINTING ANGLE BRACKET -232A; 2329 # RIGHT-POINTING ANGLE BRACKET -2768; 2769 # MEDIUM LEFT PARENTHESIS ORNAMENT -2769; 2768 # MEDIUM RIGHT PARENTHESIS ORNAMENT -276A; 276B # MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT -276B; 276A # MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT -276C; 276D # MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT -276D; 276C # MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT -276E; 276F # HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT -276F; 276E # HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT -2770; 2771 # HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT -2771; 2770 # HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT -2772; 2773 # LIGHT LEFT TORTOISE SHELL BRACKET -2773; 2772 # LIGHT RIGHT TORTOISE SHELL BRACKET -2774; 2775 # MEDIUM LEFT CURLY BRACKET ORNAMENT -2775; 2774 # MEDIUM RIGHT CURLY BRACKET ORNAMENT -27C3; 27C4 # OPEN SUBSET -27C4; 27C3 # OPEN SUPERSET -27C5; 27C6 # LEFT S-SHAPED BAG DELIMITER -27C6; 27C5 # RIGHT S-SHAPED BAG DELIMITER -27C8; 27C9 # REVERSE SOLIDUS PRECEDING SUBSET -27C9; 27C8 # SUPERSET PRECEDING SOLIDUS -27D5; 27D6 # LEFT OUTER JOIN -27D6; 27D5 # RIGHT OUTER JOIN -27DD; 27DE # LONG RIGHT TACK -27DE; 27DD # LONG LEFT TACK -27E2; 27E3 # WHITE CONCAVE-SIDED DIAMOND WITH LEFTWARDS TICK -27E3; 27E2 # WHITE CONCAVE-SIDED DIAMOND WITH RIGHTWARDS TICK -27E4; 27E5 # WHITE SQUARE WITH LEFTWARDS TICK -27E5; 27E4 # WHITE SQUARE WITH RIGHTWARDS TICK -27E6; 27E7 # MATHEMATICAL LEFT WHITE SQUARE BRACKET -27E7; 27E6 # MATHEMATICAL RIGHT WHITE SQUARE BRACKET -27E8; 27E9 # MATHEMATICAL LEFT ANGLE BRACKET -27E9; 27E8 # MATHEMATICAL RIGHT ANGLE BRACKET -27EA; 27EB # MATHEMATICAL LEFT DOUBLE ANGLE BRACKET -27EB; 27EA # MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET -27EC; 27ED # MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET -27ED; 27EC # MATHEMATICAL RIGHT WHITE TORTOISE SHELL BRACKET -27EE; 27EF # MATHEMATICAL LEFT FLATTENED PARENTHESIS -27EF; 27EE # MATHEMATICAL RIGHT FLATTENED PARENTHESIS -2983; 2984 # LEFT WHITE CURLY BRACKET -2984; 2983 # RIGHT WHITE CURLY BRACKET -2985; 2986 # LEFT WHITE PARENTHESIS -2986; 2985 # RIGHT WHITE PARENTHESIS -2987; 2988 # Z NOTATION LEFT IMAGE BRACKET -2988; 2987 # Z NOTATION RIGHT IMAGE BRACKET -2989; 298A # Z NOTATION LEFT BINDING BRACKET -298A; 2989 # Z NOTATION RIGHT BINDING BRACKET -298B; 298C # LEFT SQUARE BRACKET WITH UNDERBAR -298C; 298B # RIGHT SQUARE BRACKET WITH UNDERBAR -298D; 2990 # LEFT SQUARE BRACKET WITH TICK IN TOP CORNER -298E; 298F # RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER -298F; 298E # LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER -2990; 298D # RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER -2991; 2992 # LEFT ANGLE BRACKET WITH DOT -2992; 2991 # RIGHT ANGLE BRACKET WITH DOT -2993; 2994 # LEFT ARC LESS-THAN BRACKET -2994; 2993 # RIGHT ARC GREATER-THAN BRACKET -2995; 2996 # DOUBLE LEFT ARC GREATER-THAN BRACKET -2996; 2995 # DOUBLE RIGHT ARC LESS-THAN BRACKET -2997; 2998 # LEFT BLACK TORTOISE SHELL BRACKET -2998; 2997 # RIGHT BLACK TORTOISE SHELL BRACKET -29B8; 2298 # CIRCLED REVERSE SOLIDUS -29C0; 29C1 # CIRCLED LESS-THAN -29C1; 29C0 # CIRCLED GREATER-THAN -29C4; 29C5 # SQUARED RISING DIAGONAL SLASH -29C5; 29C4 # SQUARED FALLING DIAGONAL SLASH -29CF; 29D0 # LEFT TRIANGLE BESIDE VERTICAL BAR -29D0; 29CF # VERTICAL BAR BESIDE RIGHT TRIANGLE -29D1; 29D2 # BOWTIE WITH LEFT HALF BLACK -29D2; 29D1 # BOWTIE WITH RIGHT HALF BLACK -29D4; 29D5 # TIMES WITH LEFT HALF BLACK -29D5; 29D4 # TIMES WITH RIGHT HALF BLACK -29D8; 29D9 # LEFT WIGGLY FENCE -29D9; 29D8 # RIGHT WIGGLY FENCE -29DA; 29DB # LEFT DOUBLE WIGGLY FENCE -29DB; 29DA # RIGHT DOUBLE WIGGLY FENCE -29F5; 2215 # REVERSE SOLIDUS OPERATOR -29F8; 29F9 # BIG SOLIDUS -29F9; 29F8 # BIG REVERSE SOLIDUS -29FC; 29FD # LEFT-POINTING CURVED ANGLE BRACKET -29FD; 29FC # RIGHT-POINTING CURVED ANGLE BRACKET -2A2B; 2A2C # MINUS SIGN WITH FALLING DOTS -2A2C; 2A2B # MINUS SIGN WITH RISING DOTS -2A2D; 2A2E # PLUS SIGN IN LEFT HALF CIRCLE -2A2E; 2A2D # PLUS SIGN IN RIGHT HALF CIRCLE -2A34; 2A35 # MULTIPLICATION SIGN IN LEFT HALF CIRCLE -2A35; 2A34 # MULTIPLICATION SIGN IN RIGHT HALF CIRCLE -2A3C; 2A3D # INTERIOR PRODUCT -2A3D; 2A3C # RIGHTHAND INTERIOR PRODUCT -2A64; 2A65 # Z NOTATION DOMAIN ANTIRESTRICTION -2A65; 2A64 # Z NOTATION RANGE ANTIRESTRICTION -2A79; 2A7A # LESS-THAN WITH CIRCLE INSIDE -2A7A; 2A79 # GREATER-THAN WITH CIRCLE INSIDE -2A7D; 2A7E # LESS-THAN OR SLANTED EQUAL TO -2A7E; 2A7D # GREATER-THAN OR SLANTED EQUAL TO -2A7F; 2A80 # LESS-THAN OR SLANTED EQUAL TO WITH DOT INSIDE -2A80; 2A7F # GREATER-THAN OR SLANTED EQUAL TO WITH DOT INSIDE -2A81; 2A82 # LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE -2A82; 2A81 # GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE -2A83; 2A84 # LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE RIGHT -2A84; 2A83 # GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE LEFT -2A8B; 2A8C # LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN -2A8C; 2A8B # GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN -2A91; 2A92 # LESS-THAN ABOVE GREATER-THAN ABOVE DOUBLE-LINE EQUAL -2A92; 2A91 # GREATER-THAN ABOVE LESS-THAN ABOVE DOUBLE-LINE EQUAL -2A93; 2A94 # LESS-THAN ABOVE SLANTED EQUAL ABOVE GREATER-THAN ABOVE SLANTED EQUAL -2A94; 2A93 # GREATER-THAN ABOVE SLANTED EQUAL ABOVE LESS-THAN ABOVE SLANTED EQUAL -2A95; 2A96 # SLANTED EQUAL TO OR LESS-THAN -2A96; 2A95 # SLANTED EQUAL TO OR GREATER-THAN -2A97; 2A98 # SLANTED EQUAL TO OR LESS-THAN WITH DOT INSIDE -2A98; 2A97 # SLANTED EQUAL TO OR GREATER-THAN WITH DOT INSIDE -2A99; 2A9A # DOUBLE-LINE EQUAL TO OR LESS-THAN -2A9A; 2A99 # DOUBLE-LINE EQUAL TO OR GREATER-THAN -2A9B; 2A9C # DOUBLE-LINE SLANTED EQUAL TO OR LESS-THAN -2A9C; 2A9B # DOUBLE-LINE SLANTED EQUAL TO OR GREATER-THAN -2AA1; 2AA2 # DOUBLE NESTED LESS-THAN -2AA2; 2AA1 # DOUBLE NESTED GREATER-THAN -2AA6; 2AA7 # LESS-THAN CLOSED BY CURVE -2AA7; 2AA6 # GREATER-THAN CLOSED BY CURVE -2AA8; 2AA9 # LESS-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL -2AA9; 2AA8 # GREATER-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL -2AAA; 2AAB # SMALLER THAN -2AAB; 2AAA # LARGER THAN -2AAC; 2AAD # SMALLER THAN OR EQUAL TO -2AAD; 2AAC # LARGER THAN OR EQUAL TO -2AAF; 2AB0 # PRECEDES ABOVE SINGLE-LINE EQUALS SIGN -2AB0; 2AAF # SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN -2AB3; 2AB4 # PRECEDES ABOVE EQUALS SIGN -2AB4; 2AB3 # SUCCEEDS ABOVE EQUALS SIGN -2ABB; 2ABC # DOUBLE PRECEDES -2ABC; 2ABB # DOUBLE SUCCEEDS -2ABD; 2ABE # SUBSET WITH DOT -2ABE; 2ABD # SUPERSET WITH DOT -2ABF; 2AC0 # SUBSET WITH PLUS SIGN BELOW -2AC0; 2ABF # SUPERSET WITH PLUS SIGN BELOW -2AC1; 2AC2 # SUBSET WITH MULTIPLICATION SIGN BELOW -2AC2; 2AC1 # SUPERSET WITH MULTIPLICATION SIGN BELOW -2AC3; 2AC4 # SUBSET OF OR EQUAL TO WITH DOT ABOVE -2AC4; 2AC3 # SUPERSET OF OR EQUAL TO WITH DOT ABOVE -2AC5; 2AC6 # SUBSET OF ABOVE EQUALS SIGN -2AC6; 2AC5 # SUPERSET OF ABOVE EQUALS SIGN -2ACD; 2ACE # SQUARE LEFT OPEN BOX OPERATOR -2ACE; 2ACD # SQUARE RIGHT OPEN BOX OPERATOR -2ACF; 2AD0 # CLOSED SUBSET -2AD0; 2ACF # CLOSED SUPERSET -2AD1; 2AD2 # CLOSED SUBSET OR EQUAL TO -2AD2; 2AD1 # CLOSED SUPERSET OR EQUAL TO -2AD3; 2AD4 # SUBSET ABOVE SUPERSET -2AD4; 2AD3 # SUPERSET ABOVE SUBSET -2AD5; 2AD6 # SUBSET ABOVE SUBSET -2AD6; 2AD5 # SUPERSET ABOVE SUPERSET -2ADE; 22A6 # SHORT LEFT TACK -2AE3; 22A9 # DOUBLE VERTICAL BAR LEFT TURNSTILE -2AE4; 22A8 # VERTICAL BAR DOUBLE LEFT TURNSTILE -2AE5; 22AB # DOUBLE VERTICAL BAR DOUBLE LEFT TURNSTILE -2AEC; 2AED # DOUBLE STROKE NOT SIGN -2AED; 2AEC # REVERSED DOUBLE STROKE NOT SIGN -2AF7; 2AF8 # TRIPLE NESTED LESS-THAN -2AF8; 2AF7 # TRIPLE NESTED GREATER-THAN -2AF9; 2AFA # DOUBLE-LINE SLANTED LESS-THAN OR EQUAL TO -2AFA; 2AF9 # DOUBLE-LINE SLANTED GREATER-THAN OR EQUAL TO -2E02; 2E03 # LEFT SUBSTITUTION BRACKET -2E03; 2E02 # RIGHT SUBSTITUTION BRACKET -2E04; 2E05 # LEFT DOTTED SUBSTITUTION BRACKET -2E05; 2E04 # RIGHT DOTTED SUBSTITUTION BRACKET -2E09; 2E0A # LEFT TRANSPOSITION BRACKET -2E0A; 2E09 # RIGHT TRANSPOSITION BRACKET -2E0C; 2E0D # LEFT RAISED OMISSION BRACKET -2E0D; 2E0C # RIGHT RAISED OMISSION BRACKET -2E1C; 2E1D # LEFT LOW PARAPHRASE BRACKET -2E1D; 2E1C # RIGHT LOW PARAPHRASE BRACKET -2E20; 2E21 # LEFT VERTICAL BAR WITH QUILL -2E21; 2E20 # RIGHT VERTICAL BAR WITH QUILL -2E22; 2E23 # TOP LEFT HALF BRACKET -2E23; 2E22 # TOP RIGHT HALF BRACKET -2E24; 2E25 # BOTTOM LEFT HALF BRACKET -2E25; 2E24 # BOTTOM RIGHT HALF BRACKET -2E26; 2E27 # LEFT SIDEWAYS U BRACKET -2E27; 2E26 # RIGHT SIDEWAYS U BRACKET -2E28; 2E29 # LEFT DOUBLE PARENTHESIS -2E29; 2E28 # RIGHT DOUBLE PARENTHESIS -3008; 3009 # LEFT ANGLE BRACKET -3009; 3008 # RIGHT ANGLE BRACKET -300A; 300B # LEFT DOUBLE ANGLE BRACKET -300B; 300A # RIGHT DOUBLE ANGLE BRACKET -300C; 300D # [BEST FIT] LEFT CORNER BRACKET -300D; 300C # [BEST FIT] RIGHT CORNER BRACKET -300E; 300F # [BEST FIT] LEFT WHITE CORNER BRACKET -300F; 300E # [BEST FIT] RIGHT WHITE CORNER BRACKET -3010; 3011 # LEFT BLACK LENTICULAR BRACKET -3011; 3010 # RIGHT BLACK LENTICULAR BRACKET -3014; 3015 # LEFT TORTOISE SHELL BRACKET -3015; 3014 # RIGHT TORTOISE SHELL BRACKET -3016; 3017 # LEFT WHITE LENTICULAR BRACKET -3017; 3016 # RIGHT WHITE LENTICULAR BRACKET -3018; 3019 # LEFT WHITE TORTOISE SHELL BRACKET -3019; 3018 # RIGHT WHITE TORTOISE SHELL BRACKET -301A; 301B # LEFT WHITE SQUARE BRACKET -301B; 301A # RIGHT WHITE SQUARE BRACKET -FE59; FE5A # SMALL LEFT PARENTHESIS -FE5A; FE59 # SMALL RIGHT PARENTHESIS -FE5B; FE5C # SMALL LEFT CURLY BRACKET -FE5C; FE5B # SMALL RIGHT CURLY BRACKET -FE5D; FE5E # SMALL LEFT TORTOISE SHELL BRACKET -FE5E; FE5D # SMALL RIGHT TORTOISE SHELL BRACKET -FE64; FE65 # SMALL LESS-THAN SIGN -FE65; FE64 # SMALL GREATER-THAN SIGN -FF08; FF09 # FULLWIDTH LEFT PARENTHESIS -FF09; FF08 # FULLWIDTH RIGHT PARENTHESIS -FF1C; FF1E # FULLWIDTH LESS-THAN SIGN -FF1E; FF1C # FULLWIDTH GREATER-THAN SIGN -FF3B; FF3D # FULLWIDTH LEFT SQUARE BRACKET -FF3D; FF3B # FULLWIDTH RIGHT SQUARE BRACKET -FF5B; FF5D # FULLWIDTH LEFT CURLY BRACKET -FF5D; FF5B # FULLWIDTH RIGHT CURLY BRACKET -FF5F; FF60 # FULLWIDTH LEFT WHITE PARENTHESIS -FF60; FF5F # FULLWIDTH RIGHT WHITE PARENTHESIS -FF62; FF63 # [BEST FIT] HALFWIDTH LEFT CORNER BRACKET -FF63; FF62 # [BEST FIT] HALFWIDTH RIGHT CORNER BRACKET - -# The following characters have no appropriate mirroring character. -# For these characters it is up to the rendering system -# to provide mirrored glyphs. - -# 2140; DOUBLE-STRUCK N-ARY SUMMATION -# 2201; COMPLEMENT -# 2202; PARTIAL DIFFERENTIAL -# 2203; THERE EXISTS -# 2204; THERE DOES NOT EXIST -# 2211; N-ARY SUMMATION -# 2216; SET MINUS -# 221A; SQUARE ROOT -# 221B; CUBE ROOT -# 221C; FOURTH ROOT -# 221D; PROPORTIONAL TO -# 221F; RIGHT ANGLE -# 2220; ANGLE -# 2221; MEASURED ANGLE -# 2222; SPHERICAL ANGLE -# 2224; DOES NOT DIVIDE -# 2226; NOT PARALLEL TO -# 222B; INTEGRAL -# 222C; DOUBLE INTEGRAL -# 222D; TRIPLE INTEGRAL -# 222E; CONTOUR INTEGRAL -# 222F; SURFACE INTEGRAL -# 2230; VOLUME INTEGRAL -# 2231; CLOCKWISE INTEGRAL -# 2232; CLOCKWISE CONTOUR INTEGRAL -# 2233; ANTICLOCKWISE CONTOUR INTEGRAL -# 2239; EXCESS -# 223B; HOMOTHETIC -# 223E; INVERTED LAZY S -# 223F; SINE WAVE -# 2240; WREATH PRODUCT -# 2241; NOT TILDE -# 2242; MINUS TILDE -# 2244; NOT ASYMPTOTICALLY EQUAL TO -# 2245; APPROXIMATELY EQUAL TO -# 2246; APPROXIMATELY BUT NOT ACTUALLY EQUAL TO -# 2247; NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO -# 2248; ALMOST EQUAL TO -# 2249; NOT ALMOST EQUAL TO -# 224A; ALMOST EQUAL OR EQUAL TO -# 224B; TRIPLE TILDE -# 224C; ALL EQUAL TO -# 225F; QUESTIONED EQUAL TO -# 2260; NOT EQUAL TO -# 2262; NOT IDENTICAL TO -# 228C; MULTISET -# 22A7; MODELS -# 22AA; TRIPLE VERTICAL BAR RIGHT TURNSTILE -# 22AC; DOES NOT PROVE -# 22AD; NOT TRUE -# 22AE; DOES NOT FORCE -# 22AF; NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE -# 22B8; MULTIMAP -# 22BE; RIGHT ANGLE WITH ARC -# 22BF; RIGHT TRIANGLE -# 22F5; ELEMENT OF WITH DOT ABOVE -# 22F8; ELEMENT OF WITH UNDERBAR -# 22F9; ELEMENT OF WITH TWO HORIZONTAL STROKES -# 22FF; Z NOTATION BAG MEMBERSHIP -# 2320; TOP HALF INTEGRAL -# 2321; BOTTOM HALF INTEGRAL -# 27CC; LONG DIVISION -# 27C0; THREE DIMENSIONAL ANGLE -# 27D3; LOWER RIGHT CORNER WITH DOT -# 27D4; UPPER LEFT CORNER WITH DOT -# 27DC; LEFT MULTIMAP -# 299B; MEASURED ANGLE OPENING LEFT -# 299C; RIGHT ANGLE VARIANT WITH SQUARE -# 299D; MEASURED RIGHT ANGLE WITH DOT -# 299E; ANGLE WITH S INSIDE -# 299F; ACUTE ANGLE -# 29A0; SPHERICAL ANGLE OPENING LEFT -# 29A1; SPHERICAL ANGLE OPENING UP -# 29A2; TURNED ANGLE -# 29A3; REVERSED ANGLE -# 29A4; ANGLE WITH UNDERBAR -# 29A5; REVERSED ANGLE WITH UNDERBAR -# 29A6; OBLIQUE ANGLE OPENING UP -# 29A7; OBLIQUE ANGLE OPENING DOWN -# 29A8; MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND RIGHT -# 29A9; MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND LEFT -# 29AA; MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND RIGHT -# 29AB; MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND LEFT -# 29AC; MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND UP -# 29AD; MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND UP -# 29AE; MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND DOWN -# 29AF; MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND DOWN -# 29C2; CIRCLE WITH SMALL CIRCLE TO THE RIGHT -# 29C3; CIRCLE WITH TWO HORIZONTAL STROKES TO THE RIGHT -# 29C9; TWO JOINED SQUARES -# 29CE; RIGHT TRIANGLE ABOVE LEFT TRIANGLE -# 29DC; INCOMPLETE INFINITY -# 29E1; INCREASES AS -# 29E3; EQUALS SIGN AND SLANTED PARALLEL -# 29E4; EQUALS SIGN AND SLANTED PARALLEL WITH TILDE ABOVE -# 29E5; IDENTICAL TO AND SLANTED PARALLEL -# 29E8; DOWN-POINTING TRIANGLE WITH LEFT HALF BLACK -# 29E9; DOWN-POINTING TRIANGLE WITH RIGHT HALF BLACK -# 29F4; RULE-DELAYED -# 29F6; SOLIDUS WITH OVERBAR -# 29F7; REVERSE SOLIDUS WITH HORIZONTAL STROKE -# 2A0A; MODULO TWO SUM -# 2A0B; SUMMATION WITH INTEGRAL -# 2A0C; QUADRUPLE INTEGRAL OPERATOR -# 2A0D; FINITE PART INTEGRAL -# 2A0E; INTEGRAL WITH DOUBLE STROKE -# 2A0F; INTEGRAL AVERAGE WITH SLASH -# 2A10; CIRCULATION FUNCTION -# 2A11; ANTICLOCKWISE INTEGRATION -# 2A12; LINE INTEGRATION WITH RECTANGULAR PATH AROUND POLE -# 2A13; LINE INTEGRATION WITH SEMICIRCULAR PATH AROUND POLE -# 2A14; LINE INTEGRATION NOT INCLUDING THE POLE -# 2A15; INTEGRAL AROUND A POINT OPERATOR -# 2A16; QUATERNION INTEGRAL OPERATOR -# 2A17; INTEGRAL WITH LEFTWARDS ARROW WITH HOOK -# 2A18; INTEGRAL WITH TIMES SIGN -# 2A19; INTEGRAL WITH INTERSECTION -# 2A1A; INTEGRAL WITH UNION -# 2A1B; INTEGRAL WITH OVERBAR -# 2A1C; INTEGRAL WITH UNDERBAR -# 2A1E; LARGE LEFT TRIANGLE OPERATOR -# 2A1F; Z NOTATION SCHEMA COMPOSITION -# 2A20; Z NOTATION SCHEMA PIPING -# 2A21; Z NOTATION SCHEMA PROJECTION -# 2A24; PLUS SIGN WITH TILDE ABOVE -# 2A26; PLUS SIGN WITH TILDE BELOW -# 2A29; MINUS SIGN WITH COMMA ABOVE -# 2A3E; Z NOTATION RELATIONAL COMPOSITION -# 2A57; SLOPING LARGE OR -# 2A58; SLOPING LARGE AND -# 2A6A; TILDE OPERATOR WITH DOT ABOVE -# 2A6B; TILDE OPERATOR WITH RISING DOTS -# 2A6C; SIMILAR MINUS SIMILAR -# 2A6D; CONGRUENT WITH DOT ABOVE -# 2A6F; ALMOST EQUAL TO WITH CIRCUMFLEX ACCENT -# 2A70; APPROXIMATELY EQUAL OR EQUAL TO -# 2A73; EQUALS SIGN ABOVE TILDE OPERATOR -# 2A74; DOUBLE COLON EQUAL -# 2A7B; LESS-THAN WITH QUESTION MARK ABOVE -# 2A7C; GREATER-THAN WITH QUESTION MARK ABOVE -# 2A85; LESS-THAN OR APPROXIMATE -# 2A86; GREATER-THAN OR APPROXIMATE -# 2A87; LESS-THAN AND SINGLE-LINE NOT EQUAL TO -# 2A88; GREATER-THAN AND SINGLE-LINE NOT EQUAL TO -# 2A89; LESS-THAN AND NOT APPROXIMATE -# 2A8A; GREATER-THAN AND NOT APPROXIMATE -# 2A8D; LESS-THAN ABOVE SIMILAR OR EQUAL -# 2A8E; GREATER-THAN ABOVE SIMILAR OR EQUAL -# 2A8F; LESS-THAN ABOVE SIMILAR ABOVE GREATER-THAN -# 2A90; GREATER-THAN ABOVE SIMILAR ABOVE LESS-THAN -# 2A9D; SIMILAR OR LESS-THAN -# 2A9E; SIMILAR OR GREATER-THAN -# 2A9F; SIMILAR ABOVE LESS-THAN ABOVE EQUALS SIGN -# 2AA0; SIMILAR ABOVE GREATER-THAN ABOVE EQUALS SIGN -# 2AA3; DOUBLE NESTED LESS-THAN WITH UNDERBAR -# 2AB1; PRECEDES ABOVE SINGLE-LINE NOT EQUAL TO -# 2AB2; SUCCEEDS ABOVE SINGLE-LINE NOT EQUAL TO -# 2AB5; PRECEDES ABOVE NOT EQUAL TO -# 2AB6; SUCCEEDS ABOVE NOT EQUAL TO -# 2AB7; PRECEDES ABOVE ALMOST EQUAL TO -# 2AB8; SUCCEEDS ABOVE ALMOST EQUAL TO -# 2AB9; PRECEDES ABOVE NOT ALMOST EQUAL TO -# 2ABA; SUCCEEDS ABOVE NOT ALMOST EQUAL TO -# 2AC7; SUBSET OF ABOVE TILDE OPERATOR -# 2AC8; SUPERSET OF ABOVE TILDE OPERATOR -# 2AC9; SUBSET OF ABOVE ALMOST EQUAL TO -# 2ACA; SUPERSET OF ABOVE ALMOST EQUAL TO -# 2ACB; SUBSET OF ABOVE NOT EQUAL TO -# 2ACC; SUPERSET OF ABOVE NOT EQUAL TO -# 2ADC; FORKING -# 2AE2; VERTICAL BAR TRIPLE RIGHT TURNSTILE -# 2AE6; LONG DASH FROM LEFT MEMBER OF DOUBLE VERTICAL -# 2AEE; DOES NOT DIVIDE WITH REVERSED NEGATION SLASH -# 2AF3; PARALLEL WITH TILDE OPERATOR -# 2AFB; TRIPLE SOLIDUS BINARY RELATION -# 2AFD; DOUBLE SOLIDUS OPERATOR -# 1D6DB; MATHEMATICAL BOLD PARTIAL DIFFERENTIAL -# 1D715; MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL -# 1D74F; MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL -# 1D789; MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL -# 1D7C3; MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL - -# EOF diff --git a/third_party/harfbuzz/contrib/tables/DerivedCombiningClass.txt b/third_party/harfbuzz/contrib/tables/DerivedCombiningClass.txt deleted file mode 100644 index f30fb0bae2..0000000000 --- a/third_party/harfbuzz/contrib/tables/DerivedCombiningClass.txt +++ /dev/null @@ -1,1881 +0,0 @@ -# DerivedCombiningClass-5.1.0.txt -# Date: 2008-03-20, 17:54:45 GMT [MD] -# -# Unicode Character Database -# Copyright (c) 1991-2008 Unicode, Inc. -# For terms of use, see http://www.unicode.org/terms_of_use.html -# For documentation, see UCD.html - -# ================================================ - -# Combining Class (listing UnicodeData.txt, field 3: see UCD.html) - -# All code points not explicitly listed for Canonical_Combining_Class -# have the value Not_Reordered (0). - -# @missing: 0000..10FFFF; Not_Reordered - -# ================================================ - -# Canonical_Combining_Class=Not_Reordered - -0000..001F ; 0 # Cc [32] .. -0020 ; 0 # Zs SPACE -0021..0023 ; 0 # Po [3] EXCLAMATION MARK..NUMBER SIGN -0024 ; 0 # Sc DOLLAR SIGN -0025..0027 ; 0 # Po [3] PERCENT SIGN..APOSTROPHE -0028 ; 0 # Ps LEFT PARENTHESIS -0029 ; 0 # Pe RIGHT PARENTHESIS -002A ; 0 # Po ASTERISK -002B ; 0 # Sm PLUS SIGN -002C ; 0 # Po COMMA -002D ; 0 # Pd HYPHEN-MINUS -002E..002F ; 0 # Po [2] FULL STOP..SOLIDUS -0030..0039 ; 0 # Nd [10] DIGIT ZERO..DIGIT NINE -003A..003B ; 0 # Po [2] COLON..SEMICOLON -003C..003E ; 0 # Sm [3] LESS-THAN SIGN..GREATER-THAN SIGN -003F..0040 ; 0 # Po [2] QUESTION MARK..COMMERCIAL AT -0041..005A ; 0 # L& [26] LATIN CAPITAL LETTER A..LATIN CAPITAL LETTER Z -005B ; 0 # Ps LEFT SQUARE BRACKET -005C ; 0 # Po REVERSE SOLIDUS -005D ; 0 # Pe RIGHT SQUARE BRACKET -005E ; 0 # Sk CIRCUMFLEX ACCENT -005F ; 0 # Pc LOW LINE -0060 ; 0 # Sk GRAVE ACCENT -0061..007A ; 0 # L& [26] LATIN SMALL LETTER A..LATIN SMALL LETTER Z -007B ; 0 # Ps LEFT CURLY BRACKET -007C ; 0 # Sm VERTICAL LINE -007D ; 0 # Pe RIGHT CURLY BRACKET -007E ; 0 # Sm TILDE -007F..009F ; 0 # Cc [33] .. -00A0 ; 0 # Zs NO-BREAK SPACE -00A1 ; 0 # Po INVERTED EXCLAMATION MARK -00A2..00A5 ; 0 # Sc [4] CENT SIGN..YEN SIGN -00A6..00A7 ; 0 # So [2] BROKEN BAR..SECTION SIGN -00A8 ; 0 # Sk DIAERESIS -00A9 ; 0 # So COPYRIGHT SIGN -00AA ; 0 # L& FEMININE ORDINAL INDICATOR -00AB ; 0 # Pi LEFT-POINTING DOUBLE ANGLE QUOTATION MARK -00AC ; 0 # Sm NOT SIGN -00AD ; 0 # Cf SOFT HYPHEN -00AE ; 0 # So REGISTERED SIGN -00AF ; 0 # Sk MACRON -00B0 ; 0 # So DEGREE SIGN -00B1 ; 0 # Sm PLUS-MINUS SIGN -00B2..00B3 ; 0 # No [2] SUPERSCRIPT TWO..SUPERSCRIPT THREE -00B4 ; 0 # Sk ACUTE ACCENT -00B5 ; 0 # L& MICRO SIGN -00B6 ; 0 # So PILCROW SIGN -00B7 ; 0 # Po MIDDLE DOT -00B8 ; 0 # Sk CEDILLA -00B9 ; 0 # No SUPERSCRIPT ONE -00BA ; 0 # L& MASCULINE ORDINAL INDICATOR -00BB ; 0 # Pf RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK -00BC..00BE ; 0 # No [3] VULGAR FRACTION ONE QUARTER..VULGAR FRACTION THREE QUARTERS -00BF ; 0 # Po INVERTED QUESTION MARK -00C0..00D6 ; 0 # L& [23] LATIN CAPITAL LETTER A WITH GRAVE..LATIN CAPITAL LETTER O WITH DIAERESIS -00D7 ; 0 # Sm MULTIPLICATION SIGN -00D8..00F6 ; 0 # L& [31] LATIN CAPITAL LETTER O WITH STROKE..LATIN SMALL LETTER O WITH DIAERESIS -00F7 ; 0 # Sm DIVISION SIGN -00F8..01BA ; 0 # L& [195] LATIN SMALL LETTER O WITH STROKE..LATIN SMALL LETTER EZH WITH TAIL -01BB ; 0 # Lo LATIN LETTER TWO WITH STROKE -01BC..01BF ; 0 # L& [4] LATIN CAPITAL LETTER TONE FIVE..LATIN LETTER WYNN -01C0..01C3 ; 0 # Lo [4] LATIN LETTER DENTAL CLICK..LATIN LETTER RETROFLEX CLICK -01C4..0293 ; 0 # L& [208] LATIN CAPITAL LETTER DZ WITH CARON..LATIN SMALL LETTER EZH WITH CURL -0294 ; 0 # Lo LATIN LETTER GLOTTAL STOP -0295..02AF ; 0 # L& [27] LATIN LETTER PHARYNGEAL VOICED FRICATIVE..LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL -02B0..02C1 ; 0 # Lm [18] MODIFIER LETTER SMALL H..MODIFIER LETTER REVERSED GLOTTAL STOP -02C2..02C5 ; 0 # Sk [4] MODIFIER LETTER LEFT ARROWHEAD..MODIFIER LETTER DOWN ARROWHEAD -02C6..02D1 ; 0 # Lm [12] MODIFIER LETTER CIRCUMFLEX ACCENT..MODIFIER LETTER HALF TRIANGULAR COLON -02D2..02DF ; 0 # Sk [14] MODIFIER LETTER CENTRED RIGHT HALF RING..MODIFIER LETTER CROSS ACCENT -02E0..02E4 ; 0 # Lm [5] MODIFIER LETTER SMALL GAMMA..MODIFIER LETTER SMALL REVERSED GLOTTAL STOP -02E5..02EB ; 0 # Sk [7] MODIFIER LETTER EXTRA-HIGH TONE BAR..MODIFIER LETTER YANG DEPARTING TONE MARK -02EC ; 0 # Lm MODIFIER LETTER VOICING -02ED ; 0 # Sk MODIFIER LETTER UNASPIRATED -02EE ; 0 # Lm MODIFIER LETTER DOUBLE APOSTROPHE -02EF..02FF ; 0 # Sk [17] MODIFIER LETTER LOW DOWN ARROWHEAD..MODIFIER LETTER LOW LEFT ARROW -034F ; 0 # Mn COMBINING GRAPHEME JOINER -0370..0373 ; 0 # L& [4] GREEK CAPITAL LETTER HETA..GREEK SMALL LETTER ARCHAIC SAMPI -0374 ; 0 # Lm GREEK NUMERAL SIGN -0375 ; 0 # Sk GREEK LOWER NUMERAL SIGN -0376..0377 ; 0 # L& [2] GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA..GREEK SMALL LETTER PAMPHYLIAN DIGAMMA -037A ; 0 # Lm GREEK YPOGEGRAMMENI -037B..037D ; 0 # L& [3] GREEK SMALL REVERSED LUNATE SIGMA SYMBOL..GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL -037E ; 0 # Po GREEK QUESTION MARK -0384..0385 ; 0 # Sk [2] GREEK TONOS..GREEK DIALYTIKA TONOS -0386 ; 0 # L& GREEK CAPITAL LETTER ALPHA WITH TONOS -0387 ; 0 # Po GREEK ANO TELEIA -0388..038A ; 0 # L& [3] GREEK CAPITAL LETTER EPSILON WITH TONOS..GREEK CAPITAL LETTER IOTA WITH TONOS -038C ; 0 # L& GREEK CAPITAL LETTER OMICRON WITH TONOS -038E..03A1 ; 0 # L& [20] GREEK CAPITAL LETTER UPSILON WITH TONOS..GREEK CAPITAL LETTER RHO -03A3..03F5 ; 0 # L& [83] GREEK CAPITAL LETTER SIGMA..GREEK LUNATE EPSILON SYMBOL -03F6 ; 0 # Sm GREEK REVERSED LUNATE EPSILON SYMBOL -03F7..0481 ; 0 # L& [139] GREEK CAPITAL LETTER SHO..CYRILLIC SMALL LETTER KOPPA -0482 ; 0 # So CYRILLIC THOUSANDS SIGN -0488..0489 ; 0 # Me [2] COMBINING CYRILLIC HUNDRED THOUSANDS SIGN..COMBINING CYRILLIC MILLIONS SIGN -048A..0523 ; 0 # L& [154] CYRILLIC CAPITAL LETTER SHORT I WITH TAIL..CYRILLIC SMALL LETTER EN WITH MIDDLE HOOK -0531..0556 ; 0 # L& [38] ARMENIAN CAPITAL LETTER AYB..ARMENIAN CAPITAL LETTER FEH -0559 ; 0 # Lm ARMENIAN MODIFIER LETTER LEFT HALF RING -055A..055F ; 0 # Po [6] ARMENIAN APOSTROPHE..ARMENIAN ABBREVIATION MARK -0561..0587 ; 0 # L& [39] ARMENIAN SMALL LETTER AYB..ARMENIAN SMALL LIGATURE ECH YIWN -0589 ; 0 # Po ARMENIAN FULL STOP -058A ; 0 # Pd ARMENIAN HYPHEN -05BE ; 0 # Pd HEBREW PUNCTUATION MAQAF -05C0 ; 0 # Po HEBREW PUNCTUATION PASEQ -05C3 ; 0 # Po HEBREW PUNCTUATION SOF PASUQ -05C6 ; 0 # Po HEBREW PUNCTUATION NUN HAFUKHA -05D0..05EA ; 0 # Lo [27] HEBREW LETTER ALEF..HEBREW LETTER TAV -05F0..05F2 ; 0 # Lo [3] HEBREW LIGATURE YIDDISH DOUBLE VAV..HEBREW LIGATURE YIDDISH DOUBLE YOD -05F3..05F4 ; 0 # Po [2] HEBREW PUNCTUATION GERESH..HEBREW PUNCTUATION GERSHAYIM -0600..0603 ; 0 # Cf [4] ARABIC NUMBER SIGN..ARABIC SIGN SAFHA -0606..0608 ; 0 # Sm [3] ARABIC-INDIC CUBE ROOT..ARABIC RAY -0609..060A ; 0 # Po [2] ARABIC-INDIC PER MILLE SIGN..ARABIC-INDIC PER TEN THOUSAND SIGN -060B ; 0 # Sc AFGHANI SIGN -060C..060D ; 0 # Po [2] ARABIC COMMA..ARABIC DATE SEPARATOR -060E..060F ; 0 # So [2] ARABIC POETIC VERSE SIGN..ARABIC SIGN MISRA -061B ; 0 # Po ARABIC SEMICOLON -061E..061F ; 0 # Po [2] ARABIC TRIPLE DOT PUNCTUATION MARK..ARABIC QUESTION MARK -0621..063F ; 0 # Lo [31] ARABIC LETTER HAMZA..ARABIC LETTER FARSI YEH WITH THREE DOTS ABOVE -0640 ; 0 # Lm ARABIC TATWEEL -0641..064A ; 0 # Lo [10] ARABIC LETTER FEH..ARABIC LETTER YEH -0660..0669 ; 0 # Nd [10] ARABIC-INDIC DIGIT ZERO..ARABIC-INDIC DIGIT NINE -066A..066D ; 0 # Po [4] ARABIC PERCENT SIGN..ARABIC FIVE POINTED STAR -066E..066F ; 0 # Lo [2] ARABIC LETTER DOTLESS BEH..ARABIC LETTER DOTLESS QAF -0671..06D3 ; 0 # Lo [99] ARABIC LETTER ALEF WASLA..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE -06D4 ; 0 # Po ARABIC FULL STOP -06D5 ; 0 # Lo ARABIC LETTER AE -06DD ; 0 # Cf ARABIC END OF AYAH -06DE ; 0 # Me ARABIC START OF RUB EL HIZB -06E5..06E6 ; 0 # Lm [2] ARABIC SMALL WAW..ARABIC SMALL YEH -06E9 ; 0 # So ARABIC PLACE OF SAJDAH -06EE..06EF ; 0 # Lo [2] ARABIC LETTER DAL WITH INVERTED V..ARABIC LETTER REH WITH INVERTED V -06F0..06F9 ; 0 # Nd [10] EXTENDED ARABIC-INDIC DIGIT ZERO..EXTENDED ARABIC-INDIC DIGIT NINE -06FA..06FC ; 0 # Lo [3] ARABIC LETTER SHEEN WITH DOT BELOW..ARABIC LETTER GHAIN WITH DOT BELOW -06FD..06FE ; 0 # So [2] ARABIC SIGN SINDHI AMPERSAND..ARABIC SIGN SINDHI POSTPOSITION MEN -06FF ; 0 # Lo ARABIC LETTER HEH WITH INVERTED V -0700..070D ; 0 # Po [14] SYRIAC END OF PARAGRAPH..SYRIAC HARKLEAN ASTERISCUS -070F ; 0 # Cf SYRIAC ABBREVIATION MARK -0710 ; 0 # Lo SYRIAC LETTER ALAPH -0712..072F ; 0 # Lo [30] SYRIAC LETTER BETH..SYRIAC LETTER PERSIAN DHALATH -074D..07A5 ; 0 # Lo [89] SYRIAC LETTER SOGDIAN ZHAIN..THAANA LETTER WAAVU -07A6..07B0 ; 0 # Mn [11] THAANA ABAFILI..THAANA SUKUN -07B1 ; 0 # Lo THAANA LETTER NAA -07C0..07C9 ; 0 # Nd [10] NKO DIGIT ZERO..NKO DIGIT NINE -07CA..07EA ; 0 # Lo [33] NKO LETTER A..NKO LETTER JONA RA -07F4..07F5 ; 0 # Lm [2] NKO HIGH TONE APOSTROPHE..NKO LOW TONE APOSTROPHE -07F6 ; 0 # So NKO SYMBOL OO DENNEN -07F7..07F9 ; 0 # Po [3] NKO SYMBOL GBAKURUNEN..NKO EXCLAMATION MARK -07FA ; 0 # Lm NKO LAJANYALAN -0901..0902 ; 0 # Mn [2] DEVANAGARI SIGN CANDRABINDU..DEVANAGARI SIGN ANUSVARA -0903 ; 0 # Mc DEVANAGARI SIGN VISARGA -0904..0939 ; 0 # Lo [54] DEVANAGARI LETTER SHORT A..DEVANAGARI LETTER HA -093D ; 0 # Lo DEVANAGARI SIGN AVAGRAHA -093E..0940 ; 0 # Mc [3] DEVANAGARI VOWEL SIGN AA..DEVANAGARI VOWEL SIGN II -0941..0948 ; 0 # Mn [8] DEVANAGARI VOWEL SIGN U..DEVANAGARI VOWEL SIGN AI -0949..094C ; 0 # Mc [4] DEVANAGARI VOWEL SIGN CANDRA O..DEVANAGARI VOWEL SIGN AU -0950 ; 0 # Lo DEVANAGARI OM -0958..0961 ; 0 # Lo [10] DEVANAGARI LETTER QA..DEVANAGARI LETTER VOCALIC LL -0962..0963 ; 0 # Mn [2] DEVANAGARI VOWEL SIGN VOCALIC L..DEVANAGARI VOWEL SIGN VOCALIC LL -0964..0965 ; 0 # Po [2] DEVANAGARI DANDA..DEVANAGARI DOUBLE DANDA -0966..096F ; 0 # Nd [10] DEVANAGARI DIGIT ZERO..DEVANAGARI DIGIT NINE -0970 ; 0 # Po DEVANAGARI ABBREVIATION SIGN -0971 ; 0 # Lm DEVANAGARI SIGN HIGH SPACING DOT -0972 ; 0 # Lo DEVANAGARI LETTER CANDRA A -097B..097F ; 0 # Lo [5] DEVANAGARI LETTER GGA..DEVANAGARI LETTER BBA -0981 ; 0 # Mn BENGALI SIGN CANDRABINDU -0982..0983 ; 0 # Mc [2] BENGALI SIGN ANUSVARA..BENGALI SIGN VISARGA -0985..098C ; 0 # Lo [8] BENGALI LETTER A..BENGALI LETTER VOCALIC L -098F..0990 ; 0 # Lo [2] BENGALI LETTER E..BENGALI LETTER AI -0993..09A8 ; 0 # Lo [22] BENGALI LETTER O..BENGALI LETTER NA -09AA..09B0 ; 0 # Lo [7] BENGALI LETTER PA..BENGALI LETTER RA -09B2 ; 0 # Lo BENGALI LETTER LA -09B6..09B9 ; 0 # Lo [4] BENGALI LETTER SHA..BENGALI LETTER HA -09BD ; 0 # Lo BENGALI SIGN AVAGRAHA -09BE..09C0 ; 0 # Mc [3] BENGALI VOWEL SIGN AA..BENGALI VOWEL SIGN II -09C1..09C4 ; 0 # Mn [4] BENGALI VOWEL SIGN U..BENGALI VOWEL SIGN VOCALIC RR -09C7..09C8 ; 0 # Mc [2] BENGALI VOWEL SIGN E..BENGALI VOWEL SIGN AI -09CB..09CC ; 0 # Mc [2] BENGALI VOWEL SIGN O..BENGALI VOWEL SIGN AU -09CE ; 0 # Lo BENGALI LETTER KHANDA TA -09D7 ; 0 # Mc BENGALI AU LENGTH MARK -09DC..09DD ; 0 # Lo [2] BENGALI LETTER RRA..BENGALI LETTER RHA -09DF..09E1 ; 0 # Lo [3] BENGALI LETTER YYA..BENGALI LETTER VOCALIC LL -09E2..09E3 ; 0 # Mn [2] BENGALI VOWEL SIGN VOCALIC L..BENGALI VOWEL SIGN VOCALIC LL -09E6..09EF ; 0 # Nd [10] BENGALI DIGIT ZERO..BENGALI DIGIT NINE -09F0..09F1 ; 0 # Lo [2] BENGALI LETTER RA WITH MIDDLE DIAGONAL..BENGALI LETTER RA WITH LOWER DIAGONAL -09F2..09F3 ; 0 # Sc [2] BENGALI RUPEE MARK..BENGALI RUPEE SIGN -09F4..09F9 ; 0 # No [6] BENGALI CURRENCY NUMERATOR ONE..BENGALI CURRENCY DENOMINATOR SIXTEEN -09FA ; 0 # So BENGALI ISSHAR -0A01..0A02 ; 0 # Mn [2] GURMUKHI SIGN ADAK BINDI..GURMUKHI SIGN BINDI -0A03 ; 0 # Mc GURMUKHI SIGN VISARGA -0A05..0A0A ; 0 # Lo [6] GURMUKHI LETTER A..GURMUKHI LETTER UU -0A0F..0A10 ; 0 # Lo [2] GURMUKHI LETTER EE..GURMUKHI LETTER AI -0A13..0A28 ; 0 # Lo [22] GURMUKHI LETTER OO..GURMUKHI LETTER NA -0A2A..0A30 ; 0 # Lo [7] GURMUKHI LETTER PA..GURMUKHI LETTER RA -0A32..0A33 ; 0 # Lo [2] GURMUKHI LETTER LA..GURMUKHI LETTER LLA -0A35..0A36 ; 0 # Lo [2] GURMUKHI LETTER VA..GURMUKHI LETTER SHA -0A38..0A39 ; 0 # Lo [2] GURMUKHI LETTER SA..GURMUKHI LETTER HA -0A3E..0A40 ; 0 # Mc [3] GURMUKHI VOWEL SIGN AA..GURMUKHI VOWEL SIGN II -0A41..0A42 ; 0 # Mn [2] GURMUKHI VOWEL SIGN U..GURMUKHI VOWEL SIGN UU -0A47..0A48 ; 0 # Mn [2] GURMUKHI VOWEL SIGN EE..GURMUKHI VOWEL SIGN AI -0A4B..0A4C ; 0 # Mn [2] GURMUKHI VOWEL SIGN OO..GURMUKHI VOWEL SIGN AU -0A51 ; 0 # Mn GURMUKHI SIGN UDAAT -0A59..0A5C ; 0 # Lo [4] GURMUKHI LETTER KHHA..GURMUKHI LETTER RRA -0A5E ; 0 # Lo GURMUKHI LETTER FA -0A66..0A6F ; 0 # Nd [10] GURMUKHI DIGIT ZERO..GURMUKHI DIGIT NINE -0A70..0A71 ; 0 # Mn [2] GURMUKHI TIPPI..GURMUKHI ADDAK -0A72..0A74 ; 0 # Lo [3] GURMUKHI IRI..GURMUKHI EK ONKAR -0A75 ; 0 # Mn GURMUKHI SIGN YAKASH -0A81..0A82 ; 0 # Mn [2] GUJARATI SIGN CANDRABINDU..GUJARATI SIGN ANUSVARA -0A83 ; 0 # Mc GUJARATI SIGN VISARGA -0A85..0A8D ; 0 # Lo [9] GUJARATI LETTER A..GUJARATI VOWEL CANDRA E -0A8F..0A91 ; 0 # Lo [3] GUJARATI LETTER E..GUJARATI VOWEL CANDRA O -0A93..0AA8 ; 0 # Lo [22] GUJARATI LETTER O..GUJARATI LETTER NA -0AAA..0AB0 ; 0 # Lo [7] GUJARATI LETTER PA..GUJARATI LETTER RA -0AB2..0AB3 ; 0 # Lo [2] GUJARATI LETTER LA..GUJARATI LETTER LLA -0AB5..0AB9 ; 0 # Lo [5] GUJARATI LETTER VA..GUJARATI LETTER HA -0ABD ; 0 # Lo GUJARATI SIGN AVAGRAHA -0ABE..0AC0 ; 0 # Mc [3] GUJARATI VOWEL SIGN AA..GUJARATI VOWEL SIGN II -0AC1..0AC5 ; 0 # Mn [5] GUJARATI VOWEL SIGN U..GUJARATI VOWEL SIGN CANDRA E -0AC7..0AC8 ; 0 # Mn [2] GUJARATI VOWEL SIGN E..GUJARATI VOWEL SIGN AI -0AC9 ; 0 # Mc GUJARATI VOWEL SIGN CANDRA O -0ACB..0ACC ; 0 # Mc [2] GUJARATI VOWEL SIGN O..GUJARATI VOWEL SIGN AU -0AD0 ; 0 # Lo GUJARATI OM -0AE0..0AE1 ; 0 # Lo [2] GUJARATI LETTER VOCALIC RR..GUJARATI LETTER VOCALIC LL -0AE2..0AE3 ; 0 # Mn [2] GUJARATI VOWEL SIGN VOCALIC L..GUJARATI VOWEL SIGN VOCALIC LL -0AE6..0AEF ; 0 # Nd [10] GUJARATI DIGIT ZERO..GUJARATI DIGIT NINE -0AF1 ; 0 # Sc GUJARATI RUPEE SIGN -0B01 ; 0 # Mn ORIYA SIGN CANDRABINDU -0B02..0B03 ; 0 # Mc [2] ORIYA SIGN ANUSVARA..ORIYA SIGN VISARGA -0B05..0B0C ; 0 # Lo [8] ORIYA LETTER A..ORIYA LETTER VOCALIC L -0B0F..0B10 ; 0 # Lo [2] ORIYA LETTER E..ORIYA LETTER AI -0B13..0B28 ; 0 # Lo [22] ORIYA LETTER O..ORIYA LETTER NA -0B2A..0B30 ; 0 # Lo [7] ORIYA LETTER PA..ORIYA LETTER RA -0B32..0B33 ; 0 # Lo [2] ORIYA LETTER LA..ORIYA LETTER LLA -0B35..0B39 ; 0 # Lo [5] ORIYA LETTER VA..ORIYA LETTER HA -0B3D ; 0 # Lo ORIYA SIGN AVAGRAHA -0B3E ; 0 # Mc ORIYA VOWEL SIGN AA -0B3F ; 0 # Mn ORIYA VOWEL SIGN I -0B40 ; 0 # Mc ORIYA VOWEL SIGN II -0B41..0B44 ; 0 # Mn [4] ORIYA VOWEL SIGN U..ORIYA VOWEL SIGN VOCALIC RR -0B47..0B48 ; 0 # Mc [2] ORIYA VOWEL SIGN E..ORIYA VOWEL SIGN AI -0B4B..0B4C ; 0 # Mc [2] ORIYA VOWEL SIGN O..ORIYA VOWEL SIGN AU -0B56 ; 0 # Mn ORIYA AI LENGTH MARK -0B57 ; 0 # Mc ORIYA AU LENGTH MARK -0B5C..0B5D ; 0 # Lo [2] ORIYA LETTER RRA..ORIYA LETTER RHA -0B5F..0B61 ; 0 # Lo [3] ORIYA LETTER YYA..ORIYA LETTER VOCALIC LL -0B62..0B63 ; 0 # Mn [2] ORIYA VOWEL SIGN VOCALIC L..ORIYA VOWEL SIGN VOCALIC LL -0B66..0B6F ; 0 # Nd [10] ORIYA DIGIT ZERO..ORIYA DIGIT NINE -0B70 ; 0 # So ORIYA ISSHAR -0B71 ; 0 # Lo ORIYA LETTER WA -0B82 ; 0 # Mn TAMIL SIGN ANUSVARA -0B83 ; 0 # Lo TAMIL SIGN VISARGA -0B85..0B8A ; 0 # Lo [6] TAMIL LETTER A..TAMIL LETTER UU -0B8E..0B90 ; 0 # Lo [3] TAMIL LETTER E..TAMIL LETTER AI -0B92..0B95 ; 0 # Lo [4] TAMIL LETTER O..TAMIL LETTER KA -0B99..0B9A ; 0 # Lo [2] TAMIL LETTER NGA..TAMIL LETTER CA -0B9C ; 0 # Lo TAMIL LETTER JA -0B9E..0B9F ; 0 # Lo [2] TAMIL LETTER NYA..TAMIL LETTER TTA -0BA3..0BA4 ; 0 # Lo [2] TAMIL LETTER NNA..TAMIL LETTER TA -0BA8..0BAA ; 0 # Lo [3] TAMIL LETTER NA..TAMIL LETTER PA -0BAE..0BB9 ; 0 # Lo [12] TAMIL LETTER MA..TAMIL LETTER HA -0BBE..0BBF ; 0 # Mc [2] TAMIL VOWEL SIGN AA..TAMIL VOWEL SIGN I -0BC0 ; 0 # Mn TAMIL VOWEL SIGN II -0BC1..0BC2 ; 0 # Mc [2] TAMIL VOWEL SIGN U..TAMIL VOWEL SIGN UU -0BC6..0BC8 ; 0 # Mc [3] TAMIL VOWEL SIGN E..TAMIL VOWEL SIGN AI -0BCA..0BCC ; 0 # Mc [3] TAMIL VOWEL SIGN O..TAMIL VOWEL SIGN AU -0BD0 ; 0 # Lo TAMIL OM -0BD7 ; 0 # Mc TAMIL AU LENGTH MARK -0BE6..0BEF ; 0 # Nd [10] TAMIL DIGIT ZERO..TAMIL DIGIT NINE -0BF0..0BF2 ; 0 # No [3] TAMIL NUMBER TEN..TAMIL NUMBER ONE THOUSAND -0BF3..0BF8 ; 0 # So [6] TAMIL DAY SIGN..TAMIL AS ABOVE SIGN -0BF9 ; 0 # Sc TAMIL RUPEE SIGN -0BFA ; 0 # So TAMIL NUMBER SIGN -0C01..0C03 ; 0 # Mc [3] TELUGU SIGN CANDRABINDU..TELUGU SIGN VISARGA -0C05..0C0C ; 0 # Lo [8] TELUGU LETTER A..TELUGU LETTER VOCALIC L -0C0E..0C10 ; 0 # Lo [3] TELUGU LETTER E..TELUGU LETTER AI -0C12..0C28 ; 0 # Lo [23] TELUGU LETTER O..TELUGU LETTER NA -0C2A..0C33 ; 0 # Lo [10] TELUGU LETTER PA..TELUGU LETTER LLA -0C35..0C39 ; 0 # Lo [5] TELUGU LETTER VA..TELUGU LETTER HA -0C3D ; 0 # Lo TELUGU SIGN AVAGRAHA -0C3E..0C40 ; 0 # Mn [3] TELUGU VOWEL SIGN AA..TELUGU VOWEL SIGN II -0C41..0C44 ; 0 # Mc [4] TELUGU VOWEL SIGN U..TELUGU VOWEL SIGN VOCALIC RR -0C46..0C48 ; 0 # Mn [3] TELUGU VOWEL SIGN E..TELUGU VOWEL SIGN AI -0C4A..0C4C ; 0 # Mn [3] TELUGU VOWEL SIGN O..TELUGU VOWEL SIGN AU -0C58..0C59 ; 0 # Lo [2] TELUGU LETTER TSA..TELUGU LETTER DZA -0C60..0C61 ; 0 # Lo [2] TELUGU LETTER VOCALIC RR..TELUGU LETTER VOCALIC LL -0C62..0C63 ; 0 # Mn [2] TELUGU VOWEL SIGN VOCALIC L..TELUGU VOWEL SIGN VOCALIC LL -0C66..0C6F ; 0 # Nd [10] TELUGU DIGIT ZERO..TELUGU DIGIT NINE -0C78..0C7E ; 0 # No [7] TELUGU FRACTION DIGIT ZERO FOR ODD POWERS OF FOUR..TELUGU FRACTION DIGIT THREE FOR EVEN POWERS OF FOUR -0C7F ; 0 # So TELUGU SIGN TUUMU -0C82..0C83 ; 0 # Mc [2] KANNADA SIGN ANUSVARA..KANNADA SIGN VISARGA -0C85..0C8C ; 0 # Lo [8] KANNADA LETTER A..KANNADA LETTER VOCALIC L -0C8E..0C90 ; 0 # Lo [3] KANNADA LETTER E..KANNADA LETTER AI -0C92..0CA8 ; 0 # Lo [23] KANNADA LETTER O..KANNADA LETTER NA -0CAA..0CB3 ; 0 # Lo [10] KANNADA LETTER PA..KANNADA LETTER LLA -0CB5..0CB9 ; 0 # Lo [5] KANNADA LETTER VA..KANNADA LETTER HA -0CBD ; 0 # Lo KANNADA SIGN AVAGRAHA -0CBE ; 0 # Mc KANNADA VOWEL SIGN AA -0CBF ; 0 # Mn KANNADA VOWEL SIGN I -0CC0..0CC4 ; 0 # Mc [5] KANNADA VOWEL SIGN II..KANNADA VOWEL SIGN VOCALIC RR -0CC6 ; 0 # Mn KANNADA VOWEL SIGN E -0CC7..0CC8 ; 0 # Mc [2] KANNADA VOWEL SIGN EE..KANNADA VOWEL SIGN AI -0CCA..0CCB ; 0 # Mc [2] KANNADA VOWEL SIGN O..KANNADA VOWEL SIGN OO -0CCC ; 0 # Mn KANNADA VOWEL SIGN AU -0CD5..0CD6 ; 0 # Mc [2] KANNADA LENGTH MARK..KANNADA AI LENGTH MARK -0CDE ; 0 # Lo KANNADA LETTER FA -0CE0..0CE1 ; 0 # Lo [2] KANNADA LETTER VOCALIC RR..KANNADA LETTER VOCALIC LL -0CE2..0CE3 ; 0 # Mn [2] KANNADA VOWEL SIGN VOCALIC L..KANNADA VOWEL SIGN VOCALIC LL -0CE6..0CEF ; 0 # Nd [10] KANNADA DIGIT ZERO..KANNADA DIGIT NINE -0CF1..0CF2 ; 0 # So [2] KANNADA SIGN JIHVAMULIYA..KANNADA SIGN UPADHMANIYA -0D02..0D03 ; 0 # Mc [2] MALAYALAM SIGN ANUSVARA..MALAYALAM SIGN VISARGA -0D05..0D0C ; 0 # Lo [8] MALAYALAM LETTER A..MALAYALAM LETTER VOCALIC L -0D0E..0D10 ; 0 # Lo [3] MALAYALAM LETTER E..MALAYALAM LETTER AI -0D12..0D28 ; 0 # Lo [23] MALAYALAM LETTER O..MALAYALAM LETTER NA -0D2A..0D39 ; 0 # Lo [16] MALAYALAM LETTER PA..MALAYALAM LETTER HA -0D3D ; 0 # Lo MALAYALAM SIGN AVAGRAHA -0D3E..0D40 ; 0 # Mc [3] MALAYALAM VOWEL SIGN AA..MALAYALAM VOWEL SIGN II -0D41..0D44 ; 0 # Mn [4] MALAYALAM VOWEL SIGN U..MALAYALAM VOWEL SIGN VOCALIC RR -0D46..0D48 ; 0 # Mc [3] MALAYALAM VOWEL SIGN E..MALAYALAM VOWEL SIGN AI -0D4A..0D4C ; 0 # Mc [3] MALAYALAM VOWEL SIGN O..MALAYALAM VOWEL SIGN AU -0D57 ; 0 # Mc MALAYALAM AU LENGTH MARK -0D60..0D61 ; 0 # Lo [2] MALAYALAM LETTER VOCALIC RR..MALAYALAM LETTER VOCALIC LL -0D62..0D63 ; 0 # Mn [2] MALAYALAM VOWEL SIGN VOCALIC L..MALAYALAM VOWEL SIGN VOCALIC LL -0D66..0D6F ; 0 # Nd [10] MALAYALAM DIGIT ZERO..MALAYALAM DIGIT NINE -0D70..0D75 ; 0 # No [6] MALAYALAM NUMBER TEN..MALAYALAM FRACTION THREE QUARTERS -0D79 ; 0 # So MALAYALAM DATE MARK -0D7A..0D7F ; 0 # Lo [6] MALAYALAM LETTER CHILLU NN..MALAYALAM LETTER CHILLU K -0D82..0D83 ; 0 # Mc [2] SINHALA SIGN ANUSVARAYA..SINHALA SIGN VISARGAYA -0D85..0D96 ; 0 # Lo [18] SINHALA LETTER AYANNA..SINHALA LETTER AUYANNA -0D9A..0DB1 ; 0 # Lo [24] SINHALA LETTER ALPAPRAANA KAYANNA..SINHALA LETTER DANTAJA NAYANNA -0DB3..0DBB ; 0 # Lo [9] SINHALA LETTER SANYAKA DAYANNA..SINHALA LETTER RAYANNA -0DBD ; 0 # Lo SINHALA LETTER DANTAJA LAYANNA -0DC0..0DC6 ; 0 # Lo [7] SINHALA LETTER VAYANNA..SINHALA LETTER FAYANNA -0DCF..0DD1 ; 0 # Mc [3] SINHALA VOWEL SIGN AELA-PILLA..SINHALA VOWEL SIGN DIGA AEDA-PILLA -0DD2..0DD4 ; 0 # Mn [3] SINHALA VOWEL SIGN KETTI IS-PILLA..SINHALA VOWEL SIGN KETTI PAA-PILLA -0DD6 ; 0 # Mn SINHALA VOWEL SIGN DIGA PAA-PILLA -0DD8..0DDF ; 0 # Mc [8] SINHALA VOWEL SIGN GAETTA-PILLA..SINHALA VOWEL SIGN GAYANUKITTA -0DF2..0DF3 ; 0 # Mc [2] SINHALA VOWEL SIGN DIGA GAETTA-PILLA..SINHALA VOWEL SIGN DIGA GAYANUKITTA -0DF4 ; 0 # Po SINHALA PUNCTUATION KUNDDALIYA -0E01..0E30 ; 0 # Lo [48] THAI CHARACTER KO KAI..THAI CHARACTER SARA A -0E31 ; 0 # Mn THAI CHARACTER MAI HAN-AKAT -0E32..0E33 ; 0 # Lo [2] THAI CHARACTER SARA AA..THAI CHARACTER SARA AM -0E34..0E37 ; 0 # Mn [4] THAI CHARACTER SARA I..THAI CHARACTER SARA UEE -0E3F ; 0 # Sc THAI CURRENCY SYMBOL BAHT -0E40..0E45 ; 0 # Lo [6] THAI CHARACTER SARA E..THAI CHARACTER LAKKHANGYAO -0E46 ; 0 # Lm THAI CHARACTER MAIYAMOK -0E47 ; 0 # Mn THAI CHARACTER MAITAIKHU -0E4C..0E4E ; 0 # Mn [3] THAI CHARACTER THANTHAKHAT..THAI CHARACTER YAMAKKAN -0E4F ; 0 # Po THAI CHARACTER FONGMAN -0E50..0E59 ; 0 # Nd [10] THAI DIGIT ZERO..THAI DIGIT NINE -0E5A..0E5B ; 0 # Po [2] THAI CHARACTER ANGKHANKHU..THAI CHARACTER KHOMUT -0E81..0E82 ; 0 # Lo [2] LAO LETTER KO..LAO LETTER KHO SUNG -0E84 ; 0 # Lo LAO LETTER KHO TAM -0E87..0E88 ; 0 # Lo [2] LAO LETTER NGO..LAO LETTER CO -0E8A ; 0 # Lo LAO LETTER SO TAM -0E8D ; 0 # Lo LAO LETTER NYO -0E94..0E97 ; 0 # Lo [4] LAO LETTER DO..LAO LETTER THO TAM -0E99..0E9F ; 0 # Lo [7] LAO LETTER NO..LAO LETTER FO SUNG -0EA1..0EA3 ; 0 # Lo [3] LAO LETTER MO..LAO LETTER LO LING -0EA5 ; 0 # Lo LAO LETTER LO LOOT -0EA7 ; 0 # Lo LAO LETTER WO -0EAA..0EAB ; 0 # Lo [2] LAO LETTER SO SUNG..LAO LETTER HO SUNG -0EAD..0EB0 ; 0 # Lo [4] LAO LETTER O..LAO VOWEL SIGN A -0EB1 ; 0 # Mn LAO VOWEL SIGN MAI KAN -0EB2..0EB3 ; 0 # Lo [2] LAO VOWEL SIGN AA..LAO VOWEL SIGN AM -0EB4..0EB7 ; 0 # Mn [4] LAO VOWEL SIGN I..LAO VOWEL SIGN YY -0EBB..0EBC ; 0 # Mn [2] LAO VOWEL SIGN MAI KON..LAO SEMIVOWEL SIGN LO -0EBD ; 0 # Lo LAO SEMIVOWEL SIGN NYO -0EC0..0EC4 ; 0 # Lo [5] LAO VOWEL SIGN E..LAO VOWEL SIGN AI -0EC6 ; 0 # Lm LAO KO LA -0ECC..0ECD ; 0 # Mn [2] LAO CANCELLATION MARK..LAO NIGGAHITA -0ED0..0ED9 ; 0 # Nd [10] LAO DIGIT ZERO..LAO DIGIT NINE -0EDC..0EDD ; 0 # Lo [2] LAO HO NO..LAO HO MO -0F00 ; 0 # Lo TIBETAN SYLLABLE OM -0F01..0F03 ; 0 # So [3] TIBETAN MARK GTER YIG MGO TRUNCATED A..TIBETAN MARK GTER YIG MGO -UM GTER TSHEG MA -0F04..0F12 ; 0 # Po [15] TIBETAN MARK INITIAL YIG MGO MDUN MA..TIBETAN MARK RGYA GRAM SHAD -0F13..0F17 ; 0 # So [5] TIBETAN MARK CARET -DZUD RTAGS ME LONG CAN..TIBETAN ASTROLOGICAL SIGN SGRA GCAN -CHAR RTAGS -0F1A..0F1F ; 0 # So [6] TIBETAN SIGN RDEL DKAR GCIG..TIBETAN SIGN RDEL DKAR RDEL NAG -0F20..0F29 ; 0 # Nd [10] TIBETAN DIGIT ZERO..TIBETAN DIGIT NINE -0F2A..0F33 ; 0 # No [10] TIBETAN DIGIT HALF ONE..TIBETAN DIGIT HALF ZERO -0F34 ; 0 # So TIBETAN MARK BSDUS RTAGS -0F36 ; 0 # So TIBETAN MARK CARET -DZUD RTAGS BZHI MIG CAN -0F38 ; 0 # So TIBETAN MARK CHE MGO -0F3A ; 0 # Ps TIBETAN MARK GUG RTAGS GYON -0F3B ; 0 # Pe TIBETAN MARK GUG RTAGS GYAS -0F3C ; 0 # Ps TIBETAN MARK ANG KHANG GYON -0F3D ; 0 # Pe TIBETAN MARK ANG KHANG GYAS -0F3E..0F3F ; 0 # Mc [2] TIBETAN SIGN YAR TSHES..TIBETAN SIGN MAR TSHES -0F40..0F47 ; 0 # Lo [8] TIBETAN LETTER KA..TIBETAN LETTER JA -0F49..0F6C ; 0 # Lo [36] TIBETAN LETTER NYA..TIBETAN LETTER RRA -0F73 ; 0 # Mn TIBETAN VOWEL SIGN II -0F75..0F79 ; 0 # Mn [5] TIBETAN VOWEL SIGN UU..TIBETAN VOWEL SIGN VOCALIC LL -0F7E ; 0 # Mn TIBETAN SIGN RJES SU NGA RO -0F7F ; 0 # Mc TIBETAN SIGN RNAM BCAD -0F81 ; 0 # Mn TIBETAN VOWEL SIGN REVERSED II -0F85 ; 0 # Po TIBETAN MARK PALUTA -0F88..0F8B ; 0 # Lo [4] TIBETAN SIGN LCE TSA CAN..TIBETAN SIGN GRU MED RGYINGS -0F90..0F97 ; 0 # Mn [8] TIBETAN SUBJOINED LETTER KA..TIBETAN SUBJOINED LETTER JA -0F99..0FBC ; 0 # Mn [36] TIBETAN SUBJOINED LETTER NYA..TIBETAN SUBJOINED LETTER FIXED-FORM RA -0FBE..0FC5 ; 0 # So [8] TIBETAN KU RU KHA..TIBETAN SYMBOL RDO RJE -0FC7..0FCC ; 0 # So [6] TIBETAN SYMBOL RDO RJE RGYA GRAM..TIBETAN SYMBOL NOR BU BZHI -KHYIL -0FCE..0FCF ; 0 # So [2] TIBETAN SIGN RDEL NAG RDEL DKAR..TIBETAN SIGN RDEL NAG GSUM -0FD0..0FD4 ; 0 # Po [5] TIBETAN MARK BSKA- SHOG GI MGO RGYAN..TIBETAN MARK CLOSING BRDA RNYING YIG MGO SGAB MA -1000..102A ; 0 # Lo [43] MYANMAR LETTER KA..MYANMAR LETTER AU -102B..102C ; 0 # Mc [2] MYANMAR VOWEL SIGN TALL AA..MYANMAR VOWEL SIGN AA -102D..1030 ; 0 # Mn [4] MYANMAR VOWEL SIGN I..MYANMAR VOWEL SIGN UU -1031 ; 0 # Mc MYANMAR VOWEL SIGN E -1032..1036 ; 0 # Mn [5] MYANMAR VOWEL SIGN AI..MYANMAR SIGN ANUSVARA -1038 ; 0 # Mc MYANMAR SIGN VISARGA -103B..103C ; 0 # Mc [2] MYANMAR CONSONANT SIGN MEDIAL YA..MYANMAR CONSONANT SIGN MEDIAL RA -103D..103E ; 0 # Mn [2] MYANMAR CONSONANT SIGN MEDIAL WA..MYANMAR CONSONANT SIGN MEDIAL HA -103F ; 0 # Lo MYANMAR LETTER GREAT SA -1040..1049 ; 0 # Nd [10] MYANMAR DIGIT ZERO..MYANMAR DIGIT NINE -104A..104F ; 0 # Po [6] MYANMAR SIGN LITTLE SECTION..MYANMAR SYMBOL GENITIVE -1050..1055 ; 0 # Lo [6] MYANMAR LETTER SHA..MYANMAR LETTER VOCALIC LL -1056..1057 ; 0 # Mc [2] MYANMAR VOWEL SIGN VOCALIC R..MYANMAR VOWEL SIGN VOCALIC RR -1058..1059 ; 0 # Mn [2] MYANMAR VOWEL SIGN VOCALIC L..MYANMAR VOWEL SIGN VOCALIC LL -105A..105D ; 0 # Lo [4] MYANMAR LETTER MON NGA..MYANMAR LETTER MON BBE -105E..1060 ; 0 # Mn [3] MYANMAR CONSONANT SIGN MON MEDIAL NA..MYANMAR CONSONANT SIGN MON MEDIAL LA -1061 ; 0 # Lo MYANMAR LETTER SGAW KAREN SHA -1062..1064 ; 0 # Mc [3] MYANMAR VOWEL SIGN SGAW KAREN EU..MYANMAR TONE MARK SGAW KAREN KE PHO -1065..1066 ; 0 # Lo [2] MYANMAR LETTER WESTERN PWO KAREN THA..MYANMAR LETTER WESTERN PWO KAREN PWA -1067..106D ; 0 # Mc [7] MYANMAR VOWEL SIGN WESTERN PWO KAREN EU..MYANMAR SIGN WESTERN PWO KAREN TONE-5 -106E..1070 ; 0 # Lo [3] MYANMAR LETTER EASTERN PWO KAREN NNA..MYANMAR LETTER EASTERN PWO KAREN GHWA -1071..1074 ; 0 # Mn [4] MYANMAR VOWEL SIGN GEBA KAREN I..MYANMAR VOWEL SIGN KAYAH EE -1075..1081 ; 0 # Lo [13] MYANMAR LETTER SHAN KA..MYANMAR LETTER SHAN HA -1082 ; 0 # Mn MYANMAR CONSONANT SIGN SHAN MEDIAL WA -1083..1084 ; 0 # Mc [2] MYANMAR VOWEL SIGN SHAN AA..MYANMAR VOWEL SIGN SHAN E -1085..1086 ; 0 # Mn [2] MYANMAR VOWEL SIGN SHAN E ABOVE..MYANMAR VOWEL SIGN SHAN FINAL Y -1087..108C ; 0 # Mc [6] MYANMAR SIGN SHAN TONE-2..MYANMAR SIGN SHAN COUNCIL TONE-3 -108E ; 0 # Lo MYANMAR LETTER RUMAI PALAUNG FA -108F ; 0 # Mc MYANMAR SIGN RUMAI PALAUNG TONE-5 -1090..1099 ; 0 # Nd [10] MYANMAR SHAN DIGIT ZERO..MYANMAR SHAN DIGIT NINE -109E..109F ; 0 # So [2] MYANMAR SYMBOL SHAN ONE..MYANMAR SYMBOL SHAN EXCLAMATION -10A0..10C5 ; 0 # L& [38] GEORGIAN CAPITAL LETTER AN..GEORGIAN CAPITAL LETTER HOE -10D0..10FA ; 0 # Lo [43] GEORGIAN LETTER AN..GEORGIAN LETTER AIN -10FB ; 0 # Po GEORGIAN PARAGRAPH SEPARATOR -10FC ; 0 # Lm MODIFIER LETTER GEORGIAN NAR -1100..1159 ; 0 # Lo [90] HANGUL CHOSEONG KIYEOK..HANGUL CHOSEONG YEORINHIEUH -115F..11A2 ; 0 # Lo [68] HANGUL CHOSEONG FILLER..HANGUL JUNGSEONG SSANGARAEA -11A8..11F9 ; 0 # Lo [82] HANGUL JONGSEONG KIYEOK..HANGUL JONGSEONG YEORINHIEUH -1200..1248 ; 0 # Lo [73] ETHIOPIC SYLLABLE HA..ETHIOPIC SYLLABLE QWA -124A..124D ; 0 # Lo [4] ETHIOPIC SYLLABLE QWI..ETHIOPIC SYLLABLE QWE -1250..1256 ; 0 # Lo [7] ETHIOPIC SYLLABLE QHA..ETHIOPIC SYLLABLE QHO -1258 ; 0 # Lo ETHIOPIC SYLLABLE QHWA -125A..125D ; 0 # Lo [4] ETHIOPIC SYLLABLE QHWI..ETHIOPIC SYLLABLE QHWE -1260..1288 ; 0 # Lo [41] ETHIOPIC SYLLABLE BA..ETHIOPIC SYLLABLE XWA -128A..128D ; 0 # Lo [4] ETHIOPIC SYLLABLE XWI..ETHIOPIC SYLLABLE XWE -1290..12B0 ; 0 # Lo [33] ETHIOPIC SYLLABLE NA..ETHIOPIC SYLLABLE KWA -12B2..12B5 ; 0 # Lo [4] ETHIOPIC SYLLABLE KWI..ETHIOPIC SYLLABLE KWE -12B8..12BE ; 0 # Lo [7] ETHIOPIC SYLLABLE KXA..ETHIOPIC SYLLABLE KXO -12C0 ; 0 # Lo ETHIOPIC SYLLABLE KXWA -12C2..12C5 ; 0 # Lo [4] ETHIOPIC SYLLABLE KXWI..ETHIOPIC SYLLABLE KXWE -12C8..12D6 ; 0 # Lo [15] ETHIOPIC SYLLABLE WA..ETHIOPIC SYLLABLE PHARYNGEAL O -12D8..1310 ; 0 # Lo [57] ETHIOPIC SYLLABLE ZA..ETHIOPIC SYLLABLE GWA -1312..1315 ; 0 # Lo [4] ETHIOPIC SYLLABLE GWI..ETHIOPIC SYLLABLE GWE -1318..135A ; 0 # Lo [67] ETHIOPIC SYLLABLE GGA..ETHIOPIC SYLLABLE FYA -1360 ; 0 # So ETHIOPIC SECTION MARK -1361..1368 ; 0 # Po [8] ETHIOPIC WORDSPACE..ETHIOPIC PARAGRAPH SEPARATOR -1369..137C ; 0 # No [20] ETHIOPIC DIGIT ONE..ETHIOPIC NUMBER TEN THOUSAND -1380..138F ; 0 # Lo [16] ETHIOPIC SYLLABLE SEBATBEIT MWA..ETHIOPIC SYLLABLE PWE -1390..1399 ; 0 # So [10] ETHIOPIC TONAL MARK YIZET..ETHIOPIC TONAL MARK KURT -13A0..13F4 ; 0 # Lo [85] CHEROKEE LETTER A..CHEROKEE LETTER YV -1401..166C ; 0 # Lo [620] CANADIAN SYLLABICS E..CANADIAN SYLLABICS CARRIER TTSA -166D..166E ; 0 # Po [2] CANADIAN SYLLABICS CHI SIGN..CANADIAN SYLLABICS FULL STOP -166F..1676 ; 0 # Lo [8] CANADIAN SYLLABICS QAI..CANADIAN SYLLABICS NNGAA -1680 ; 0 # Zs OGHAM SPACE MARK -1681..169A ; 0 # Lo [26] OGHAM LETTER BEITH..OGHAM LETTER PEITH -169B ; 0 # Ps OGHAM FEATHER MARK -169C ; 0 # Pe OGHAM REVERSED FEATHER MARK -16A0..16EA ; 0 # Lo [75] RUNIC LETTER FEHU FEOH FE F..RUNIC LETTER X -16EB..16ED ; 0 # Po [3] RUNIC SINGLE PUNCTUATION..RUNIC CROSS PUNCTUATION -16EE..16F0 ; 0 # Nl [3] RUNIC ARLAUG SYMBOL..RUNIC BELGTHOR SYMBOL -1700..170C ; 0 # Lo [13] TAGALOG LETTER A..TAGALOG LETTER YA -170E..1711 ; 0 # Lo [4] TAGALOG LETTER LA..TAGALOG LETTER HA -1712..1713 ; 0 # Mn [2] TAGALOG VOWEL SIGN I..TAGALOG VOWEL SIGN U -1720..1731 ; 0 # Lo [18] HANUNOO LETTER A..HANUNOO LETTER HA -1732..1733 ; 0 # Mn [2] HANUNOO VOWEL SIGN I..HANUNOO VOWEL SIGN U -1735..1736 ; 0 # Po [2] PHILIPPINE SINGLE PUNCTUATION..PHILIPPINE DOUBLE PUNCTUATION -1740..1751 ; 0 # Lo [18] BUHID LETTER A..BUHID LETTER HA -1752..1753 ; 0 # Mn [2] BUHID VOWEL SIGN I..BUHID VOWEL SIGN U -1760..176C ; 0 # Lo [13] TAGBANWA LETTER A..TAGBANWA LETTER YA -176E..1770 ; 0 # Lo [3] TAGBANWA LETTER LA..TAGBANWA LETTER SA -1772..1773 ; 0 # Mn [2] TAGBANWA VOWEL SIGN I..TAGBANWA VOWEL SIGN U -1780..17B3 ; 0 # Lo [52] KHMER LETTER KA..KHMER INDEPENDENT VOWEL QAU -17B4..17B5 ; 0 # Cf [2] KHMER VOWEL INHERENT AQ..KHMER VOWEL INHERENT AA -17B6 ; 0 # Mc KHMER VOWEL SIGN AA -17B7..17BD ; 0 # Mn [7] KHMER VOWEL SIGN I..KHMER VOWEL SIGN UA -17BE..17C5 ; 0 # Mc [8] KHMER VOWEL SIGN OE..KHMER VOWEL SIGN AU -17C6 ; 0 # Mn KHMER SIGN NIKAHIT -17C7..17C8 ; 0 # Mc [2] KHMER SIGN REAHMUK..KHMER SIGN YUUKALEAPINTU -17C9..17D1 ; 0 # Mn [9] KHMER SIGN MUUSIKATOAN..KHMER SIGN VIRIAM -17D3 ; 0 # Mn KHMER SIGN BATHAMASAT -17D4..17D6 ; 0 # Po [3] KHMER SIGN KHAN..KHMER SIGN CAMNUC PII KUUH -17D7 ; 0 # Lm KHMER SIGN LEK TOO -17D8..17DA ; 0 # Po [3] KHMER SIGN BEYYAL..KHMER SIGN KOOMUUT -17DB ; 0 # Sc KHMER CURRENCY SYMBOL RIEL -17DC ; 0 # Lo KHMER SIGN AVAKRAHASANYA -17E0..17E9 ; 0 # Nd [10] KHMER DIGIT ZERO..KHMER DIGIT NINE -17F0..17F9 ; 0 # No [10] KHMER SYMBOL LEK ATTAK SON..KHMER SYMBOL LEK ATTAK PRAM-BUON -1800..1805 ; 0 # Po [6] MONGOLIAN BIRGA..MONGOLIAN FOUR DOTS -1806 ; 0 # Pd MONGOLIAN TODO SOFT HYPHEN -1807..180A ; 0 # Po [4] MONGOLIAN SIBE SYLLABLE BOUNDARY MARKER..MONGOLIAN NIRUGU -180B..180D ; 0 # Mn [3] MONGOLIAN FREE VARIATION SELECTOR ONE..MONGOLIAN FREE VARIATION SELECTOR THREE -180E ; 0 # Zs MONGOLIAN VOWEL SEPARATOR -1810..1819 ; 0 # Nd [10] MONGOLIAN DIGIT ZERO..MONGOLIAN DIGIT NINE -1820..1842 ; 0 # Lo [35] MONGOLIAN LETTER A..MONGOLIAN LETTER CHI -1843 ; 0 # Lm MONGOLIAN LETTER TODO LONG VOWEL SIGN -1844..1877 ; 0 # Lo [52] MONGOLIAN LETTER TODO E..MONGOLIAN LETTER MANCHU ZHA -1880..18A8 ; 0 # Lo [41] MONGOLIAN LETTER ALI GALI ANUSVARA ONE..MONGOLIAN LETTER MANCHU ALI GALI BHA -18AA ; 0 # Lo MONGOLIAN LETTER MANCHU ALI GALI LHA -1900..191C ; 0 # Lo [29] LIMBU VOWEL-CARRIER LETTER..LIMBU LETTER HA -1920..1922 ; 0 # Mn [3] LIMBU VOWEL SIGN A..LIMBU VOWEL SIGN U -1923..1926 ; 0 # Mc [4] LIMBU VOWEL SIGN EE..LIMBU VOWEL SIGN AU -1927..1928 ; 0 # Mn [2] LIMBU VOWEL SIGN E..LIMBU VOWEL SIGN O -1929..192B ; 0 # Mc [3] LIMBU SUBJOINED LETTER YA..LIMBU SUBJOINED LETTER WA -1930..1931 ; 0 # Mc [2] LIMBU SMALL LETTER KA..LIMBU SMALL LETTER NGA -1932 ; 0 # Mn LIMBU SMALL LETTER ANUSVARA -1933..1938 ; 0 # Mc [6] LIMBU SMALL LETTER TA..LIMBU SMALL LETTER LA -1940 ; 0 # So LIMBU SIGN LOO -1944..1945 ; 0 # Po [2] LIMBU EXCLAMATION MARK..LIMBU QUESTION MARK -1946..194F ; 0 # Nd [10] LIMBU DIGIT ZERO..LIMBU DIGIT NINE -1950..196D ; 0 # Lo [30] TAI LE LETTER KA..TAI LE LETTER AI -1970..1974 ; 0 # Lo [5] TAI LE LETTER TONE-2..TAI LE LETTER TONE-6 -1980..19A9 ; 0 # Lo [42] NEW TAI LUE LETTER HIGH QA..NEW TAI LUE LETTER LOW XVA -19B0..19C0 ; 0 # Mc [17] NEW TAI LUE VOWEL SIGN VOWEL SHORTENER..NEW TAI LUE VOWEL SIGN IY -19C1..19C7 ; 0 # Lo [7] NEW TAI LUE LETTER FINAL V..NEW TAI LUE LETTER FINAL B -19C8..19C9 ; 0 # Mc [2] NEW TAI LUE TONE MARK-1..NEW TAI LUE TONE MARK-2 -19D0..19D9 ; 0 # Nd [10] NEW TAI LUE DIGIT ZERO..NEW TAI LUE DIGIT NINE -19DE..19DF ; 0 # Po [2] NEW TAI LUE SIGN LAE..NEW TAI LUE SIGN LAEV -19E0..19FF ; 0 # So [32] KHMER SYMBOL PATHAMASAT..KHMER SYMBOL DAP-PRAM ROC -1A00..1A16 ; 0 # Lo [23] BUGINESE LETTER KA..BUGINESE LETTER HA -1A19..1A1B ; 0 # Mc [3] BUGINESE VOWEL SIGN E..BUGINESE VOWEL SIGN AE -1A1E..1A1F ; 0 # Po [2] BUGINESE PALLAWA..BUGINESE END OF SECTION -1B00..1B03 ; 0 # Mn [4] BALINESE SIGN ULU RICEM..BALINESE SIGN SURANG -1B04 ; 0 # Mc BALINESE SIGN BISAH -1B05..1B33 ; 0 # Lo [47] BALINESE LETTER AKARA..BALINESE LETTER HA -1B35 ; 0 # Mc BALINESE VOWEL SIGN TEDUNG -1B36..1B3A ; 0 # Mn [5] BALINESE VOWEL SIGN ULU..BALINESE VOWEL SIGN RA REPA -1B3B ; 0 # Mc BALINESE VOWEL SIGN RA REPA TEDUNG -1B3C ; 0 # Mn BALINESE VOWEL SIGN LA LENGA -1B3D..1B41 ; 0 # Mc [5] BALINESE VOWEL SIGN LA LENGA TEDUNG..BALINESE VOWEL SIGN TALING REPA TEDUNG -1B42 ; 0 # Mn BALINESE VOWEL SIGN PEPET -1B43 ; 0 # Mc BALINESE VOWEL SIGN PEPET TEDUNG -1B45..1B4B ; 0 # Lo [7] BALINESE LETTER KAF SASAK..BALINESE LETTER ASYURA SASAK -1B50..1B59 ; 0 # Nd [10] BALINESE DIGIT ZERO..BALINESE DIGIT NINE -1B5A..1B60 ; 0 # Po [7] BALINESE PANTI..BALINESE PAMENENG -1B61..1B6A ; 0 # So [10] BALINESE MUSICAL SYMBOL DONG..BALINESE MUSICAL SYMBOL DANG GEDE -1B74..1B7C ; 0 # So [9] BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DUG..BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PING -1B80..1B81 ; 0 # Mn [2] SUNDANESE SIGN PANYECEK..SUNDANESE SIGN PANGLAYAR -1B82 ; 0 # Mc SUNDANESE SIGN PANGWISAD -1B83..1BA0 ; 0 # Lo [30] SUNDANESE LETTER A..SUNDANESE LETTER HA -1BA1 ; 0 # Mc SUNDANESE CONSONANT SIGN PAMINGKAL -1BA2..1BA5 ; 0 # Mn [4] SUNDANESE CONSONANT SIGN PANYAKRA..SUNDANESE VOWEL SIGN PANYUKU -1BA6..1BA7 ; 0 # Mc [2] SUNDANESE VOWEL SIGN PANAELAENG..SUNDANESE VOWEL SIGN PANOLONG -1BA8..1BA9 ; 0 # Mn [2] SUNDANESE VOWEL SIGN PAMEPET..SUNDANESE VOWEL SIGN PANEULEUNG -1BAE..1BAF ; 0 # Lo [2] SUNDANESE LETTER KHA..SUNDANESE LETTER SYA -1BB0..1BB9 ; 0 # Nd [10] SUNDANESE DIGIT ZERO..SUNDANESE DIGIT NINE -1C00..1C23 ; 0 # Lo [36] LEPCHA LETTER KA..LEPCHA LETTER A -1C24..1C2B ; 0 # Mc [8] LEPCHA SUBJOINED LETTER YA..LEPCHA VOWEL SIGN UU -1C2C..1C33 ; 0 # Mn [8] LEPCHA VOWEL SIGN E..LEPCHA CONSONANT SIGN T -1C34..1C35 ; 0 # Mc [2] LEPCHA CONSONANT SIGN NYIN-DO..LEPCHA CONSONANT SIGN KANG -1C36 ; 0 # Mn LEPCHA SIGN RAN -1C3B..1C3F ; 0 # Po [5] LEPCHA PUNCTUATION TA-ROL..LEPCHA PUNCTUATION TSHOOK -1C40..1C49 ; 0 # Nd [10] LEPCHA DIGIT ZERO..LEPCHA DIGIT NINE -1C4D..1C4F ; 0 # Lo [3] LEPCHA LETTER TTA..LEPCHA LETTER DDA -1C50..1C59 ; 0 # Nd [10] OL CHIKI DIGIT ZERO..OL CHIKI DIGIT NINE -1C5A..1C77 ; 0 # Lo [30] OL CHIKI LETTER LA..OL CHIKI LETTER OH -1C78..1C7D ; 0 # Lm [6] OL CHIKI MU TTUDDAG..OL CHIKI AHAD -1C7E..1C7F ; 0 # Po [2] OL CHIKI PUNCTUATION MUCAAD..OL CHIKI PUNCTUATION DOUBLE MUCAAD -1D00..1D2B ; 0 # L& [44] LATIN LETTER SMALL CAPITAL A..CYRILLIC LETTER SMALL CAPITAL EL -1D2C..1D61 ; 0 # Lm [54] MODIFIER LETTER CAPITAL A..MODIFIER LETTER SMALL CHI -1D62..1D77 ; 0 # L& [22] LATIN SUBSCRIPT SMALL LETTER I..LATIN SMALL LETTER TURNED G -1D78 ; 0 # Lm MODIFIER LETTER CYRILLIC EN -1D79..1D9A ; 0 # L& [34] LATIN SMALL LETTER INSULAR G..LATIN SMALL LETTER EZH WITH RETROFLEX HOOK -1D9B..1DBF ; 0 # Lm [37] MODIFIER LETTER SMALL TURNED ALPHA..MODIFIER LETTER SMALL THETA -1E00..1F15 ; 0 # L& [278] LATIN CAPITAL LETTER A WITH RING BELOW..GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA -1F18..1F1D ; 0 # L& [6] GREEK CAPITAL LETTER EPSILON WITH PSILI..GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA -1F20..1F45 ; 0 # L& [38] GREEK SMALL LETTER ETA WITH PSILI..GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA -1F48..1F4D ; 0 # L& [6] GREEK CAPITAL LETTER OMICRON WITH PSILI..GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA -1F50..1F57 ; 0 # L& [8] GREEK SMALL LETTER UPSILON WITH PSILI..GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI -1F59 ; 0 # L& GREEK CAPITAL LETTER UPSILON WITH DASIA -1F5B ; 0 # L& GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA -1F5D ; 0 # L& GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA -1F5F..1F7D ; 0 # L& [31] GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI..GREEK SMALL LETTER OMEGA WITH OXIA -1F80..1FB4 ; 0 # L& [53] GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI..GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI -1FB6..1FBC ; 0 # L& [7] GREEK SMALL LETTER ALPHA WITH PERISPOMENI..GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI -1FBD ; 0 # Sk GREEK KORONIS -1FBE ; 0 # L& GREEK PROSGEGRAMMENI -1FBF..1FC1 ; 0 # Sk [3] GREEK PSILI..GREEK DIALYTIKA AND PERISPOMENI -1FC2..1FC4 ; 0 # L& [3] GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI -1FC6..1FCC ; 0 # L& [7] GREEK SMALL LETTER ETA WITH PERISPOMENI..GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI -1FCD..1FCF ; 0 # Sk [3] GREEK PSILI AND VARIA..GREEK PSILI AND PERISPOMENI -1FD0..1FD3 ; 0 # L& [4] GREEK SMALL LETTER IOTA WITH VRACHY..GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA -1FD6..1FDB ; 0 # L& [6] GREEK SMALL LETTER IOTA WITH PERISPOMENI..GREEK CAPITAL LETTER IOTA WITH OXIA -1FDD..1FDF ; 0 # Sk [3] GREEK DASIA AND VARIA..GREEK DASIA AND PERISPOMENI -1FE0..1FEC ; 0 # L& [13] GREEK SMALL LETTER UPSILON WITH VRACHY..GREEK CAPITAL LETTER RHO WITH DASIA -1FED..1FEF ; 0 # Sk [3] GREEK DIALYTIKA AND VARIA..GREEK VARIA -1FF2..1FF4 ; 0 # L& [3] GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI -1FF6..1FFC ; 0 # L& [7] GREEK SMALL LETTER OMEGA WITH PERISPOMENI..GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI -1FFD..1FFE ; 0 # Sk [2] GREEK OXIA..GREEK DASIA -2000..200A ; 0 # Zs [11] EN QUAD..HAIR SPACE -200B..200F ; 0 # Cf [5] ZERO WIDTH SPACE..RIGHT-TO-LEFT MARK -2010..2015 ; 0 # Pd [6] HYPHEN..HORIZONTAL BAR -2016..2017 ; 0 # Po [2] DOUBLE VERTICAL LINE..DOUBLE LOW LINE -2018 ; 0 # Pi LEFT SINGLE QUOTATION MARK -2019 ; 0 # Pf RIGHT SINGLE QUOTATION MARK -201A ; 0 # Ps SINGLE LOW-9 QUOTATION MARK -201B..201C ; 0 # Pi [2] SINGLE HIGH-REVERSED-9 QUOTATION MARK..LEFT DOUBLE QUOTATION MARK -201D ; 0 # Pf RIGHT DOUBLE QUOTATION MARK -201E ; 0 # Ps DOUBLE LOW-9 QUOTATION MARK -201F ; 0 # Pi DOUBLE HIGH-REVERSED-9 QUOTATION MARK -2020..2027 ; 0 # Po [8] DAGGER..HYPHENATION POINT -2028 ; 0 # Zl LINE SEPARATOR -2029 ; 0 # Zp PARAGRAPH SEPARATOR -202A..202E ; 0 # Cf [5] LEFT-TO-RIGHT EMBEDDING..RIGHT-TO-LEFT OVERRIDE -202F ; 0 # Zs NARROW NO-BREAK SPACE -2030..2038 ; 0 # Po [9] PER MILLE SIGN..CARET -2039 ; 0 # Pi SINGLE LEFT-POINTING ANGLE QUOTATION MARK -203A ; 0 # Pf SINGLE RIGHT-POINTING ANGLE QUOTATION MARK -203B..203E ; 0 # Po [4] REFERENCE MARK..OVERLINE -203F..2040 ; 0 # Pc [2] UNDERTIE..CHARACTER TIE -2041..2043 ; 0 # Po [3] CARET INSERTION POINT..HYPHEN BULLET -2044 ; 0 # Sm FRACTION SLASH -2045 ; 0 # Ps LEFT SQUARE BRACKET WITH QUILL -2046 ; 0 # Pe RIGHT SQUARE BRACKET WITH QUILL -2047..2051 ; 0 # Po [11] DOUBLE QUESTION MARK..TWO ASTERISKS ALIGNED VERTICALLY -2052 ; 0 # Sm COMMERCIAL MINUS SIGN -2053 ; 0 # Po SWUNG DASH -2054 ; 0 # Pc INVERTED UNDERTIE -2055..205E ; 0 # Po [10] FLOWER PUNCTUATION MARK..VERTICAL FOUR DOTS -205F ; 0 # Zs MEDIUM MATHEMATICAL SPACE -2060..2064 ; 0 # Cf [5] WORD JOINER..INVISIBLE PLUS -206A..206F ; 0 # Cf [6] INHIBIT SYMMETRIC SWAPPING..NOMINAL DIGIT SHAPES -2070 ; 0 # No SUPERSCRIPT ZERO -2071 ; 0 # L& SUPERSCRIPT LATIN SMALL LETTER I -2074..2079 ; 0 # No [6] SUPERSCRIPT FOUR..SUPERSCRIPT NINE -207A..207C ; 0 # Sm [3] SUPERSCRIPT PLUS SIGN..SUPERSCRIPT EQUALS SIGN -207D ; 0 # Ps SUPERSCRIPT LEFT PARENTHESIS -207E ; 0 # Pe SUPERSCRIPT RIGHT PARENTHESIS -207F ; 0 # L& SUPERSCRIPT LATIN SMALL LETTER N -2080..2089 ; 0 # No [10] SUBSCRIPT ZERO..SUBSCRIPT NINE -208A..208C ; 0 # Sm [3] SUBSCRIPT PLUS SIGN..SUBSCRIPT EQUALS SIGN -208D ; 0 # Ps SUBSCRIPT LEFT PARENTHESIS -208E ; 0 # Pe SUBSCRIPT RIGHT PARENTHESIS -2090..2094 ; 0 # Lm [5] LATIN SUBSCRIPT SMALL LETTER A..LATIN SUBSCRIPT SMALL LETTER SCHWA -20A0..20B5 ; 0 # Sc [22] EURO-CURRENCY SIGN..CEDI SIGN -20DD..20E0 ; 0 # Me [4] COMBINING ENCLOSING CIRCLE..COMBINING ENCLOSING CIRCLE BACKSLASH -20E2..20E4 ; 0 # Me [3] COMBINING ENCLOSING SCREEN..COMBINING ENCLOSING UPWARD POINTING TRIANGLE -2100..2101 ; 0 # So [2] ACCOUNT OF..ADDRESSED TO THE SUBJECT -2102 ; 0 # L& DOUBLE-STRUCK CAPITAL C -2103..2106 ; 0 # So [4] DEGREE CELSIUS..CADA UNA -2107 ; 0 # L& EULER CONSTANT -2108..2109 ; 0 # So [2] SCRUPLE..DEGREE FAHRENHEIT -210A..2113 ; 0 # L& [10] SCRIPT SMALL G..SCRIPT SMALL L -2114 ; 0 # So L B BAR SYMBOL -2115 ; 0 # L& DOUBLE-STRUCK CAPITAL N -2116..2118 ; 0 # So [3] NUMERO SIGN..SCRIPT CAPITAL P -2119..211D ; 0 # L& [5] DOUBLE-STRUCK CAPITAL P..DOUBLE-STRUCK CAPITAL R -211E..2123 ; 0 # So [6] PRESCRIPTION TAKE..VERSICLE -2124 ; 0 # L& DOUBLE-STRUCK CAPITAL Z -2125 ; 0 # So OUNCE SIGN -2126 ; 0 # L& OHM SIGN -2127 ; 0 # So INVERTED OHM SIGN -2128 ; 0 # L& BLACK-LETTER CAPITAL Z -2129 ; 0 # So TURNED GREEK SMALL LETTER IOTA -212A..212D ; 0 # L& [4] KELVIN SIGN..BLACK-LETTER CAPITAL C -212E ; 0 # So ESTIMATED SYMBOL -212F..2134 ; 0 # L& [6] SCRIPT SMALL E..SCRIPT SMALL O -2135..2138 ; 0 # Lo [4] ALEF SYMBOL..DALET SYMBOL -2139 ; 0 # L& INFORMATION SOURCE -213A..213B ; 0 # So [2] ROTATED CAPITAL Q..FACSIMILE SIGN -213C..213F ; 0 # L& [4] DOUBLE-STRUCK SMALL PI..DOUBLE-STRUCK CAPITAL PI -2140..2144 ; 0 # Sm [5] DOUBLE-STRUCK N-ARY SUMMATION..TURNED SANS-SERIF CAPITAL Y -2145..2149 ; 0 # L& [5] DOUBLE-STRUCK ITALIC CAPITAL D..DOUBLE-STRUCK ITALIC SMALL J -214A ; 0 # So PROPERTY LINE -214B ; 0 # Sm TURNED AMPERSAND -214C..214D ; 0 # So [2] PER SIGN..AKTIESELSKAB -214E ; 0 # L& TURNED SMALL F -214F ; 0 # So SYMBOL FOR SAMARITAN SOURCE -2153..215F ; 0 # No [13] VULGAR FRACTION ONE THIRD..FRACTION NUMERATOR ONE -2160..2182 ; 0 # Nl [35] ROMAN NUMERAL ONE..ROMAN NUMERAL TEN THOUSAND -2183..2184 ; 0 # L& [2] ROMAN NUMERAL REVERSED ONE HUNDRED..LATIN SMALL LETTER REVERSED C -2185..2188 ; 0 # Nl [4] ROMAN NUMERAL SIX LATE FORM..ROMAN NUMERAL ONE HUNDRED THOUSAND -2190..2194 ; 0 # Sm [5] LEFTWARDS ARROW..LEFT RIGHT ARROW -2195..2199 ; 0 # So [5] UP DOWN ARROW..SOUTH WEST ARROW -219A..219B ; 0 # Sm [2] LEFTWARDS ARROW WITH STROKE..RIGHTWARDS ARROW WITH STROKE -219C..219F ; 0 # So [4] LEFTWARDS WAVE ARROW..UPWARDS TWO HEADED ARROW -21A0 ; 0 # Sm RIGHTWARDS TWO HEADED ARROW -21A1..21A2 ; 0 # So [2] DOWNWARDS TWO HEADED ARROW..LEFTWARDS ARROW WITH TAIL -21A3 ; 0 # Sm RIGHTWARDS ARROW WITH TAIL -21A4..21A5 ; 0 # So [2] LEFTWARDS ARROW FROM BAR..UPWARDS ARROW FROM BAR -21A6 ; 0 # Sm RIGHTWARDS ARROW FROM BAR -21A7..21AD ; 0 # So [7] DOWNWARDS ARROW FROM BAR..LEFT RIGHT WAVE ARROW -21AE ; 0 # Sm LEFT RIGHT ARROW WITH STROKE -21AF..21CD ; 0 # So [31] DOWNWARDS ZIGZAG ARROW..LEFTWARDS DOUBLE ARROW WITH STROKE -21CE..21CF ; 0 # Sm [2] LEFT RIGHT DOUBLE ARROW WITH STROKE..RIGHTWARDS DOUBLE ARROW WITH STROKE -21D0..21D1 ; 0 # So [2] LEFTWARDS DOUBLE ARROW..UPWARDS DOUBLE ARROW -21D2 ; 0 # Sm RIGHTWARDS DOUBLE ARROW -21D3 ; 0 # So DOWNWARDS DOUBLE ARROW -21D4 ; 0 # Sm LEFT RIGHT DOUBLE ARROW -21D5..21F3 ; 0 # So [31] UP DOWN DOUBLE ARROW..UP DOWN WHITE ARROW -21F4..22FF ; 0 # Sm [268] RIGHT ARROW WITH SMALL CIRCLE..Z NOTATION BAG MEMBERSHIP -2300..2307 ; 0 # So [8] DIAMETER SIGN..WAVY LINE -2308..230B ; 0 # Sm [4] LEFT CEILING..RIGHT FLOOR -230C..231F ; 0 # So [20] BOTTOM RIGHT CROP..BOTTOM RIGHT CORNER -2320..2321 ; 0 # Sm [2] TOP HALF INTEGRAL..BOTTOM HALF INTEGRAL -2322..2328 ; 0 # So [7] FROWN..KEYBOARD -2329 ; 0 # Ps LEFT-POINTING ANGLE BRACKET -232A ; 0 # Pe RIGHT-POINTING ANGLE BRACKET -232B..237B ; 0 # So [81] ERASE TO THE LEFT..NOT CHECK MARK -237C ; 0 # Sm RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW -237D..239A ; 0 # So [30] SHOULDERED OPEN BOX..CLEAR SCREEN SYMBOL -239B..23B3 ; 0 # Sm [25] LEFT PARENTHESIS UPPER HOOK..SUMMATION BOTTOM -23B4..23DB ; 0 # So [40] TOP SQUARE BRACKET..FUSE -23DC..23E1 ; 0 # Sm [6] TOP PARENTHESIS..BOTTOM TORTOISE SHELL BRACKET -23E2..23E7 ; 0 # So [6] WHITE TRAPEZIUM..ELECTRICAL INTERSECTION -2400..2426 ; 0 # So [39] SYMBOL FOR NULL..SYMBOL FOR SUBSTITUTE FORM TWO -2440..244A ; 0 # So [11] OCR HOOK..OCR DOUBLE BACKSLASH -2460..249B ; 0 # No [60] CIRCLED DIGIT ONE..NUMBER TWENTY FULL STOP -249C..24E9 ; 0 # So [78] PARENTHESIZED LATIN SMALL LETTER A..CIRCLED LATIN SMALL LETTER Z -24EA..24FF ; 0 # No [22] CIRCLED DIGIT ZERO..NEGATIVE CIRCLED DIGIT ZERO -2500..25B6 ; 0 # So [183] BOX DRAWINGS LIGHT HORIZONTAL..BLACK RIGHT-POINTING TRIANGLE -25B7 ; 0 # Sm WHITE RIGHT-POINTING TRIANGLE -25B8..25C0 ; 0 # So [9] BLACK RIGHT-POINTING SMALL TRIANGLE..BLACK LEFT-POINTING TRIANGLE -25C1 ; 0 # Sm WHITE LEFT-POINTING TRIANGLE -25C2..25F7 ; 0 # So [54] BLACK LEFT-POINTING SMALL TRIANGLE..WHITE CIRCLE WITH UPPER RIGHT QUADRANT -25F8..25FF ; 0 # Sm [8] UPPER LEFT TRIANGLE..LOWER RIGHT TRIANGLE -2600..266E ; 0 # So [111] BLACK SUN WITH RAYS..MUSIC NATURAL SIGN -266F ; 0 # Sm MUSIC SHARP SIGN -2670..269D ; 0 # So [46] WEST SYRIAC CROSS..OUTLINED WHITE STAR -26A0..26BC ; 0 # So [29] WARNING SIGN..SESQUIQUADRATE -26C0..26C3 ; 0 # So [4] WHITE DRAUGHTS MAN..BLACK DRAUGHTS KING -2701..2704 ; 0 # So [4] UPPER BLADE SCISSORS..WHITE SCISSORS -2706..2709 ; 0 # So [4] TELEPHONE LOCATION SIGN..ENVELOPE -270C..2727 ; 0 # So [28] VICTORY HAND..WHITE FOUR POINTED STAR -2729..274B ; 0 # So [35] STRESS OUTLINED WHITE STAR..HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK -274D ; 0 # So SHADOWED WHITE CIRCLE -274F..2752 ; 0 # So [4] LOWER RIGHT DROP-SHADOWED WHITE SQUARE..UPPER RIGHT SHADOWED WHITE SQUARE -2756 ; 0 # So BLACK DIAMOND MINUS WHITE X -2758..275E ; 0 # So [7] LIGHT VERTICAL BAR..HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT -2761..2767 ; 0 # So [7] CURVED STEM PARAGRAPH SIGN ORNAMENT..ROTATED FLORAL HEART BULLET -2768 ; 0 # Ps MEDIUM LEFT PARENTHESIS ORNAMENT -2769 ; 0 # Pe MEDIUM RIGHT PARENTHESIS ORNAMENT -276A ; 0 # Ps MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT -276B ; 0 # Pe MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT -276C ; 0 # Ps MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT -276D ; 0 # Pe MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT -276E ; 0 # Ps HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT -276F ; 0 # Pe HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT -2770 ; 0 # Ps HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT -2771 ; 0 # Pe HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT -2772 ; 0 # Ps LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT -2773 ; 0 # Pe LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT -2774 ; 0 # Ps MEDIUM LEFT CURLY BRACKET ORNAMENT -2775 ; 0 # Pe MEDIUM RIGHT CURLY BRACKET ORNAMENT -2776..2793 ; 0 # No [30] DINGBAT NEGATIVE CIRCLED DIGIT ONE..DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN -2794 ; 0 # So HEAVY WIDE-HEADED RIGHTWARDS ARROW -2798..27AF ; 0 # So [24] HEAVY SOUTH EAST ARROW..NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW -27B1..27BE ; 0 # So [14] NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW..OPEN-OUTLINED RIGHTWARDS ARROW -27C0..27C4 ; 0 # Sm [5] THREE DIMENSIONAL ANGLE..OPEN SUPERSET -27C5 ; 0 # Ps LEFT S-SHAPED BAG DELIMITER -27C6 ; 0 # Pe RIGHT S-SHAPED BAG DELIMITER -27C7..27CA ; 0 # Sm [4] OR WITH DOT INSIDE..VERTICAL BAR WITH HORIZONTAL STROKE -27CC ; 0 # Sm LONG DIVISION -27D0..27E5 ; 0 # Sm [22] WHITE DIAMOND WITH CENTRED DOT..WHITE SQUARE WITH RIGHTWARDS TICK -27E6 ; 0 # Ps MATHEMATICAL LEFT WHITE SQUARE BRACKET -27E7 ; 0 # Pe MATHEMATICAL RIGHT WHITE SQUARE BRACKET -27E8 ; 0 # Ps MATHEMATICAL LEFT ANGLE BRACKET -27E9 ; 0 # Pe MATHEMATICAL RIGHT ANGLE BRACKET -27EA ; 0 # Ps MATHEMATICAL LEFT DOUBLE ANGLE BRACKET -27EB ; 0 # Pe MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET -27EC ; 0 # Ps MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET -27ED ; 0 # Pe MATHEMATICAL RIGHT WHITE TORTOISE SHELL BRACKET -27EE ; 0 # Ps MATHEMATICAL LEFT FLATTENED PARENTHESIS -27EF ; 0 # Pe MATHEMATICAL RIGHT FLATTENED PARENTHESIS -27F0..27FF ; 0 # Sm [16] UPWARDS QUADRUPLE ARROW..LONG RIGHTWARDS SQUIGGLE ARROW -2800..28FF ; 0 # So [256] BRAILLE PATTERN BLANK..BRAILLE PATTERN DOTS-12345678 -2900..2982 ; 0 # Sm [131] RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE..Z NOTATION TYPE COLON -2983 ; 0 # Ps LEFT WHITE CURLY BRACKET -2984 ; 0 # Pe RIGHT WHITE CURLY BRACKET -2985 ; 0 # Ps LEFT WHITE PARENTHESIS -2986 ; 0 # Pe RIGHT WHITE PARENTHESIS -2987 ; 0 # Ps Z NOTATION LEFT IMAGE BRACKET -2988 ; 0 # Pe Z NOTATION RIGHT IMAGE BRACKET -2989 ; 0 # Ps Z NOTATION LEFT BINDING BRACKET -298A ; 0 # Pe Z NOTATION RIGHT BINDING BRACKET -298B ; 0 # Ps LEFT SQUARE BRACKET WITH UNDERBAR -298C ; 0 # Pe RIGHT SQUARE BRACKET WITH UNDERBAR -298D ; 0 # Ps LEFT SQUARE BRACKET WITH TICK IN TOP CORNER -298E ; 0 # Pe RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER -298F ; 0 # Ps LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER -2990 ; 0 # Pe RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER -2991 ; 0 # Ps LEFT ANGLE BRACKET WITH DOT -2992 ; 0 # Pe RIGHT ANGLE BRACKET WITH DOT -2993 ; 0 # Ps LEFT ARC LESS-THAN BRACKET -2994 ; 0 # Pe RIGHT ARC GREATER-THAN BRACKET -2995 ; 0 # Ps DOUBLE LEFT ARC GREATER-THAN BRACKET -2996 ; 0 # Pe DOUBLE RIGHT ARC LESS-THAN BRACKET -2997 ; 0 # Ps LEFT BLACK TORTOISE SHELL BRACKET -2998 ; 0 # Pe RIGHT BLACK TORTOISE SHELL BRACKET -2999..29D7 ; 0 # Sm [63] DOTTED FENCE..BLACK HOURGLASS -29D8 ; 0 # Ps LEFT WIGGLY FENCE -29D9 ; 0 # Pe RIGHT WIGGLY FENCE -29DA ; 0 # Ps LEFT DOUBLE WIGGLY FENCE -29DB ; 0 # Pe RIGHT DOUBLE WIGGLY FENCE -29DC..29FB ; 0 # Sm [32] INCOMPLETE INFINITY..TRIPLE PLUS -29FC ; 0 # Ps LEFT-POINTING CURVED ANGLE BRACKET -29FD ; 0 # Pe RIGHT-POINTING CURVED ANGLE BRACKET -29FE..2AFF ; 0 # Sm [258] TINY..N-ARY WHITE VERTICAL BAR -2B00..2B2F ; 0 # So [48] NORTH EAST WHITE ARROW..WHITE VERTICAL ELLIPSE -2B30..2B44 ; 0 # Sm [21] LEFT ARROW WITH SMALL CIRCLE..RIGHTWARDS ARROW THROUGH SUPERSET -2B45..2B46 ; 0 # So [2] LEFTWARDS QUADRUPLE ARROW..RIGHTWARDS QUADRUPLE ARROW -2B47..2B4C ; 0 # Sm [6] REVERSE TILDE OPERATOR ABOVE RIGHTWARDS ARROW..RIGHTWARDS ARROW ABOVE REVERSE TILDE OPERATOR -2B50..2B54 ; 0 # So [5] WHITE MEDIUM STAR..WHITE RIGHT-POINTING PENTAGON -2C00..2C2E ; 0 # L& [47] GLAGOLITIC CAPITAL LETTER AZU..GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE -2C30..2C5E ; 0 # L& [47] GLAGOLITIC SMALL LETTER AZU..GLAGOLITIC SMALL LETTER LATINATE MYSLITE -2C60..2C6F ; 0 # L& [16] LATIN CAPITAL LETTER L WITH DOUBLE BAR..LATIN CAPITAL LETTER TURNED A -2C71..2C7C ; 0 # L& [12] LATIN SMALL LETTER V WITH RIGHT HOOK..LATIN SUBSCRIPT SMALL LETTER J -2C7D ; 0 # Lm MODIFIER LETTER CAPITAL V -2C80..2CE4 ; 0 # L& [101] COPTIC CAPITAL LETTER ALFA..COPTIC SYMBOL KAI -2CE5..2CEA ; 0 # So [6] COPTIC SYMBOL MI RO..COPTIC SYMBOL SHIMA SIMA -2CF9..2CFC ; 0 # Po [4] COPTIC OLD NUBIAN FULL STOP..COPTIC OLD NUBIAN VERSE DIVIDER -2CFD ; 0 # No COPTIC FRACTION ONE HALF -2CFE..2CFF ; 0 # Po [2] COPTIC FULL STOP..COPTIC MORPHOLOGICAL DIVIDER -2D00..2D25 ; 0 # L& [38] GEORGIAN SMALL LETTER AN..GEORGIAN SMALL LETTER HOE -2D30..2D65 ; 0 # Lo [54] TIFINAGH LETTER YA..TIFINAGH LETTER YAZZ -2D6F ; 0 # Lm TIFINAGH MODIFIER LETTER LABIALIZATION MARK -2D80..2D96 ; 0 # Lo [23] ETHIOPIC SYLLABLE LOA..ETHIOPIC SYLLABLE GGWE -2DA0..2DA6 ; 0 # Lo [7] ETHIOPIC SYLLABLE SSA..ETHIOPIC SYLLABLE SSO -2DA8..2DAE ; 0 # Lo [7] ETHIOPIC SYLLABLE CCA..ETHIOPIC SYLLABLE CCO -2DB0..2DB6 ; 0 # Lo [7] ETHIOPIC SYLLABLE ZZA..ETHIOPIC SYLLABLE ZZO -2DB8..2DBE ; 0 # Lo [7] ETHIOPIC SYLLABLE CCHA..ETHIOPIC SYLLABLE CCHO -2DC0..2DC6 ; 0 # Lo [7] ETHIOPIC SYLLABLE QYA..ETHIOPIC SYLLABLE QYO -2DC8..2DCE ; 0 # Lo [7] ETHIOPIC SYLLABLE KYA..ETHIOPIC SYLLABLE KYO -2DD0..2DD6 ; 0 # Lo [7] ETHIOPIC SYLLABLE XYA..ETHIOPIC SYLLABLE XYO -2DD8..2DDE ; 0 # Lo [7] ETHIOPIC SYLLABLE GYA..ETHIOPIC SYLLABLE GYO -2E00..2E01 ; 0 # Po [2] RIGHT ANGLE SUBSTITUTION MARKER..RIGHT ANGLE DOTTED SUBSTITUTION MARKER -2E02 ; 0 # Pi LEFT SUBSTITUTION BRACKET -2E03 ; 0 # Pf RIGHT SUBSTITUTION BRACKET -2E04 ; 0 # Pi LEFT DOTTED SUBSTITUTION BRACKET -2E05 ; 0 # Pf RIGHT DOTTED SUBSTITUTION BRACKET -2E06..2E08 ; 0 # Po [3] RAISED INTERPOLATION MARKER..DOTTED TRANSPOSITION MARKER -2E09 ; 0 # Pi LEFT TRANSPOSITION BRACKET -2E0A ; 0 # Pf RIGHT TRANSPOSITION BRACKET -2E0B ; 0 # Po RAISED SQUARE -2E0C ; 0 # Pi LEFT RAISED OMISSION BRACKET -2E0D ; 0 # Pf RIGHT RAISED OMISSION BRACKET -2E0E..2E16 ; 0 # Po [9] EDITORIAL CORONIS..DOTTED RIGHT-POINTING ANGLE -2E17 ; 0 # Pd DOUBLE OBLIQUE HYPHEN -2E18..2E19 ; 0 # Po [2] INVERTED INTERROBANG..PALM BRANCH -2E1A ; 0 # Pd HYPHEN WITH DIAERESIS -2E1B ; 0 # Po TILDE WITH RING ABOVE -2E1C ; 0 # Pi LEFT LOW PARAPHRASE BRACKET -2E1D ; 0 # Pf RIGHT LOW PARAPHRASE BRACKET -2E1E..2E1F ; 0 # Po [2] TILDE WITH DOT ABOVE..TILDE WITH DOT BELOW -2E20 ; 0 # Pi LEFT VERTICAL BAR WITH QUILL -2E21 ; 0 # Pf RIGHT VERTICAL BAR WITH QUILL -2E22 ; 0 # Ps TOP LEFT HALF BRACKET -2E23 ; 0 # Pe TOP RIGHT HALF BRACKET -2E24 ; 0 # Ps BOTTOM LEFT HALF BRACKET -2E25 ; 0 # Pe BOTTOM RIGHT HALF BRACKET -2E26 ; 0 # Ps LEFT SIDEWAYS U BRACKET -2E27 ; 0 # Pe RIGHT SIDEWAYS U BRACKET -2E28 ; 0 # Ps LEFT DOUBLE PARENTHESIS -2E29 ; 0 # Pe RIGHT DOUBLE PARENTHESIS -2E2A..2E2E ; 0 # Po [5] TWO DOTS OVER ONE DOT PUNCTUATION..REVERSED QUESTION MARK -2E2F ; 0 # Lm VERTICAL TILDE -2E30 ; 0 # Po RING POINT -2E80..2E99 ; 0 # So [26] CJK RADICAL REPEAT..CJK RADICAL RAP -2E9B..2EF3 ; 0 # So [89] CJK RADICAL CHOKE..CJK RADICAL C-SIMPLIFIED TURTLE -2F00..2FD5 ; 0 # So [214] KANGXI RADICAL ONE..KANGXI RADICAL FLUTE -2FF0..2FFB ; 0 # So [12] IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT..IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID -3000 ; 0 # Zs IDEOGRAPHIC SPACE -3001..3003 ; 0 # Po [3] IDEOGRAPHIC COMMA..DITTO MARK -3004 ; 0 # So JAPANESE INDUSTRIAL STANDARD SYMBOL -3005 ; 0 # Lm IDEOGRAPHIC ITERATION MARK -3006 ; 0 # Lo IDEOGRAPHIC CLOSING MARK -3007 ; 0 # Nl IDEOGRAPHIC NUMBER ZERO -3008 ; 0 # Ps LEFT ANGLE BRACKET -3009 ; 0 # Pe RIGHT ANGLE BRACKET -300A ; 0 # Ps LEFT DOUBLE ANGLE BRACKET -300B ; 0 # Pe RIGHT DOUBLE ANGLE BRACKET -300C ; 0 # Ps LEFT CORNER BRACKET -300D ; 0 # Pe RIGHT CORNER BRACKET -300E ; 0 # Ps LEFT WHITE CORNER BRACKET -300F ; 0 # Pe RIGHT WHITE CORNER BRACKET -3010 ; 0 # Ps LEFT BLACK LENTICULAR BRACKET -3011 ; 0 # Pe RIGHT BLACK LENTICULAR BRACKET -3012..3013 ; 0 # So [2] POSTAL MARK..GETA MARK -3014 ; 0 # Ps LEFT TORTOISE SHELL BRACKET -3015 ; 0 # Pe RIGHT TORTOISE SHELL BRACKET -3016 ; 0 # Ps LEFT WHITE LENTICULAR BRACKET -3017 ; 0 # Pe RIGHT WHITE LENTICULAR BRACKET -3018 ; 0 # Ps LEFT WHITE TORTOISE SHELL BRACKET -3019 ; 0 # Pe RIGHT WHITE TORTOISE SHELL BRACKET -301A ; 0 # Ps LEFT WHITE SQUARE BRACKET -301B ; 0 # Pe RIGHT WHITE SQUARE BRACKET -301C ; 0 # Pd WAVE DASH -301D ; 0 # Ps REVERSED DOUBLE PRIME QUOTATION MARK -301E..301F ; 0 # Pe [2] DOUBLE PRIME QUOTATION MARK..LOW DOUBLE PRIME QUOTATION MARK -3020 ; 0 # So POSTAL MARK FACE -3021..3029 ; 0 # Nl [9] HANGZHOU NUMERAL ONE..HANGZHOU NUMERAL NINE -3030 ; 0 # Pd WAVY DASH -3031..3035 ; 0 # Lm [5] VERTICAL KANA REPEAT MARK..VERTICAL KANA REPEAT MARK LOWER HALF -3036..3037 ; 0 # So [2] CIRCLED POSTAL MARK..IDEOGRAPHIC TELEGRAPH LINE FEED SEPARATOR SYMBOL -3038..303A ; 0 # Nl [3] HANGZHOU NUMERAL TEN..HANGZHOU NUMERAL THIRTY -303B ; 0 # Lm VERTICAL IDEOGRAPHIC ITERATION MARK -303C ; 0 # Lo MASU MARK -303D ; 0 # Po PART ALTERNATION MARK -303E..303F ; 0 # So [2] IDEOGRAPHIC VARIATION INDICATOR..IDEOGRAPHIC HALF FILL SPACE -3041..3096 ; 0 # Lo [86] HIRAGANA LETTER SMALL A..HIRAGANA LETTER SMALL KE -309B..309C ; 0 # Sk [2] KATAKANA-HIRAGANA VOICED SOUND MARK..KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK -309D..309E ; 0 # Lm [2] HIRAGANA ITERATION MARK..HIRAGANA VOICED ITERATION MARK -309F ; 0 # Lo HIRAGANA DIGRAPH YORI -30A0 ; 0 # Pd KATAKANA-HIRAGANA DOUBLE HYPHEN -30A1..30FA ; 0 # Lo [90] KATAKANA LETTER SMALL A..KATAKANA LETTER VO -30FB ; 0 # Po KATAKANA MIDDLE DOT -30FC..30FE ; 0 # Lm [3] KATAKANA-HIRAGANA PROLONGED SOUND MARK..KATAKANA VOICED ITERATION MARK -30FF ; 0 # Lo KATAKANA DIGRAPH KOTO -3105..312D ; 0 # Lo [41] BOPOMOFO LETTER B..BOPOMOFO LETTER IH -3131..318E ; 0 # Lo [94] HANGUL LETTER KIYEOK..HANGUL LETTER ARAEAE -3190..3191 ; 0 # So [2] IDEOGRAPHIC ANNOTATION LINKING MARK..IDEOGRAPHIC ANNOTATION REVERSE MARK -3192..3195 ; 0 # No [4] IDEOGRAPHIC ANNOTATION ONE MARK..IDEOGRAPHIC ANNOTATION FOUR MARK -3196..319F ; 0 # So [10] IDEOGRAPHIC ANNOTATION TOP MARK..IDEOGRAPHIC ANNOTATION MAN MARK -31A0..31B7 ; 0 # Lo [24] BOPOMOFO LETTER BU..BOPOMOFO FINAL LETTER H -31C0..31E3 ; 0 # So [36] CJK STROKE T..CJK STROKE Q -31F0..31FF ; 0 # Lo [16] KATAKANA LETTER SMALL KU..KATAKANA LETTER SMALL RO -3200..321E ; 0 # So [31] PARENTHESIZED HANGUL KIYEOK..PARENTHESIZED KOREAN CHARACTER O HU -3220..3229 ; 0 # No [10] PARENTHESIZED IDEOGRAPH ONE..PARENTHESIZED IDEOGRAPH TEN -322A..3243 ; 0 # So [26] PARENTHESIZED IDEOGRAPH MOON..PARENTHESIZED IDEOGRAPH REACH -3250 ; 0 # So PARTNERSHIP SIGN -3251..325F ; 0 # No [15] CIRCLED NUMBER TWENTY ONE..CIRCLED NUMBER THIRTY FIVE -3260..327F ; 0 # So [32] CIRCLED HANGUL KIYEOK..KOREAN STANDARD SYMBOL -3280..3289 ; 0 # No [10] CIRCLED IDEOGRAPH ONE..CIRCLED IDEOGRAPH TEN -328A..32B0 ; 0 # So [39] CIRCLED IDEOGRAPH MOON..CIRCLED IDEOGRAPH NIGHT -32B1..32BF ; 0 # No [15] CIRCLED NUMBER THIRTY SIX..CIRCLED NUMBER FIFTY -32C0..32FE ; 0 # So [63] IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY..CIRCLED KATAKANA WO -3300..33FF ; 0 # So [256] SQUARE APAATO..SQUARE GAL -3400..4DB5 ; 0 # Lo [6582] CJK UNIFIED IDEOGRAPH-3400..CJK UNIFIED IDEOGRAPH-4DB5 -4DC0..4DFF ; 0 # So [64] HEXAGRAM FOR THE CREATIVE HEAVEN..HEXAGRAM FOR BEFORE COMPLETION -4E00..9FC3 ; 0 # Lo [20932] CJK UNIFIED IDEOGRAPH-4E00..CJK UNIFIED IDEOGRAPH-9FC3 -A000..A014 ; 0 # Lo [21] YI SYLLABLE IT..YI SYLLABLE E -A015 ; 0 # Lm YI SYLLABLE WU -A016..A48C ; 0 # Lo [1143] YI SYLLABLE BIT..YI SYLLABLE YYR -A490..A4C6 ; 0 # So [55] YI RADICAL QOT..YI RADICAL KE -A500..A60B ; 0 # Lo [268] VAI SYLLABLE EE..VAI SYLLABLE NG -A60C ; 0 # Lm VAI SYLLABLE LENGTHENER -A60D..A60F ; 0 # Po [3] VAI COMMA..VAI QUESTION MARK -A610..A61F ; 0 # Lo [16] VAI SYLLABLE NDOLE FA..VAI SYMBOL JONG -A620..A629 ; 0 # Nd [10] VAI DIGIT ZERO..VAI DIGIT NINE -A62A..A62B ; 0 # Lo [2] VAI SYLLABLE NDOLE MA..VAI SYLLABLE NDOLE DO -A640..A65F ; 0 # L& [32] CYRILLIC CAPITAL LETTER ZEMLYA..CYRILLIC SMALL LETTER YN -A662..A66D ; 0 # L& [12] CYRILLIC CAPITAL LETTER SOFT DE..CYRILLIC SMALL LETTER DOUBLE MONOCULAR O -A66E ; 0 # Lo CYRILLIC LETTER MULTIOCULAR O -A670..A672 ; 0 # Me [3] COMBINING CYRILLIC TEN MILLIONS SIGN..COMBINING CYRILLIC THOUSAND MILLIONS SIGN -A673 ; 0 # Po SLAVONIC ASTERISK -A67E ; 0 # Po CYRILLIC KAVYKA -A67F ; 0 # Lm CYRILLIC PAYEROK -A680..A697 ; 0 # L& [24] CYRILLIC CAPITAL LETTER DWE..CYRILLIC SMALL LETTER SHWE -A700..A716 ; 0 # Sk [23] MODIFIER LETTER CHINESE TONE YIN PING..MODIFIER LETTER EXTRA-LOW LEFT-STEM TONE BAR -A717..A71F ; 0 # Lm [9] MODIFIER LETTER DOT VERTICAL BAR..MODIFIER LETTER LOW INVERTED EXCLAMATION MARK -A720..A721 ; 0 # Sk [2] MODIFIER LETTER STRESS AND HIGH TONE..MODIFIER LETTER STRESS AND LOW TONE -A722..A76F ; 0 # L& [78] LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF..LATIN SMALL LETTER CON -A770 ; 0 # Lm MODIFIER LETTER US -A771..A787 ; 0 # L& [23] LATIN SMALL LETTER DUM..LATIN SMALL LETTER INSULAR T -A788 ; 0 # Lm MODIFIER LETTER LOW CIRCUMFLEX ACCENT -A789..A78A ; 0 # Sk [2] MODIFIER LETTER COLON..MODIFIER LETTER SHORT EQUALS SIGN -A78B..A78C ; 0 # L& [2] LATIN CAPITAL LETTER SALTILLO..LATIN SMALL LETTER SALTILLO -A7FB..A801 ; 0 # Lo [7] LATIN EPIGRAPHIC LETTER REVERSED F..SYLOTI NAGRI LETTER I -A802 ; 0 # Mn SYLOTI NAGRI SIGN DVISVARA -A803..A805 ; 0 # Lo [3] SYLOTI NAGRI LETTER U..SYLOTI NAGRI LETTER O -A807..A80A ; 0 # Lo [4] SYLOTI NAGRI LETTER KO..SYLOTI NAGRI LETTER GHO -A80B ; 0 # Mn SYLOTI NAGRI SIGN ANUSVARA -A80C..A822 ; 0 # Lo [23] SYLOTI NAGRI LETTER CO..SYLOTI NAGRI LETTER HO -A823..A824 ; 0 # Mc [2] SYLOTI NAGRI VOWEL SIGN A..SYLOTI NAGRI VOWEL SIGN I -A825..A826 ; 0 # Mn [2] SYLOTI NAGRI VOWEL SIGN U..SYLOTI NAGRI VOWEL SIGN E -A827 ; 0 # Mc SYLOTI NAGRI VOWEL SIGN OO -A828..A82B ; 0 # So [4] SYLOTI NAGRI POETRY MARK-1..SYLOTI NAGRI POETRY MARK-4 -A840..A873 ; 0 # Lo [52] PHAGS-PA LETTER KA..PHAGS-PA LETTER CANDRABINDU -A874..A877 ; 0 # Po [4] PHAGS-PA SINGLE HEAD MARK..PHAGS-PA MARK DOUBLE SHAD -A880..A881 ; 0 # Mc [2] SAURASHTRA SIGN ANUSVARA..SAURASHTRA SIGN VISARGA -A882..A8B3 ; 0 # Lo [50] SAURASHTRA LETTER A..SAURASHTRA LETTER LLA -A8B4..A8C3 ; 0 # Mc [16] SAURASHTRA CONSONANT SIGN HAARU..SAURASHTRA VOWEL SIGN AU -A8CE..A8CF ; 0 # Po [2] SAURASHTRA DANDA..SAURASHTRA DOUBLE DANDA -A8D0..A8D9 ; 0 # Nd [10] SAURASHTRA DIGIT ZERO..SAURASHTRA DIGIT NINE -A900..A909 ; 0 # Nd [10] KAYAH LI DIGIT ZERO..KAYAH LI DIGIT NINE -A90A..A925 ; 0 # Lo [28] KAYAH LI LETTER KA..KAYAH LI LETTER OO -A926..A92A ; 0 # Mn [5] KAYAH LI VOWEL UE..KAYAH LI VOWEL O -A92E..A92F ; 0 # Po [2] KAYAH LI SIGN CWI..KAYAH LI SIGN SHYA -A930..A946 ; 0 # Lo [23] REJANG LETTER KA..REJANG LETTER A -A947..A951 ; 0 # Mn [11] REJANG VOWEL SIGN I..REJANG CONSONANT SIGN R -A952 ; 0 # Mc REJANG CONSONANT SIGN H -A95F ; 0 # Po REJANG SECTION MARK -AA00..AA28 ; 0 # Lo [41] CHAM LETTER A..CHAM LETTER HA -AA29..AA2E ; 0 # Mn [6] CHAM VOWEL SIGN AA..CHAM VOWEL SIGN OE -AA2F..AA30 ; 0 # Mc [2] CHAM VOWEL SIGN O..CHAM VOWEL SIGN AI -AA31..AA32 ; 0 # Mn [2] CHAM VOWEL SIGN AU..CHAM VOWEL SIGN UE -AA33..AA34 ; 0 # Mc [2] CHAM CONSONANT SIGN YA..CHAM CONSONANT SIGN RA -AA35..AA36 ; 0 # Mn [2] CHAM CONSONANT SIGN LA..CHAM CONSONANT SIGN WA -AA40..AA42 ; 0 # Lo [3] CHAM LETTER FINAL K..CHAM LETTER FINAL NG -AA43 ; 0 # Mn CHAM CONSONANT SIGN FINAL NG -AA44..AA4B ; 0 # Lo [8] CHAM LETTER FINAL CH..CHAM LETTER FINAL SS -AA4C ; 0 # Mn CHAM CONSONANT SIGN FINAL M -AA4D ; 0 # Mc CHAM CONSONANT SIGN FINAL H -AA50..AA59 ; 0 # Nd [10] CHAM DIGIT ZERO..CHAM DIGIT NINE -AA5C..AA5F ; 0 # Po [4] CHAM PUNCTUATION SPIRAL..CHAM PUNCTUATION TRIPLE DANDA -AC00..D7A3 ; 0 # Lo [11172] HANGUL SYLLABLE GA..HANGUL SYLLABLE HIH -E000..F8FF ; 0 # Co [6400] .. -F900..FA2D ; 0 # Lo [302] CJK COMPATIBILITY IDEOGRAPH-F900..CJK COMPATIBILITY IDEOGRAPH-FA2D -FA30..FA6A ; 0 # Lo [59] CJK COMPATIBILITY IDEOGRAPH-FA30..CJK COMPATIBILITY IDEOGRAPH-FA6A -FA70..FAD9 ; 0 # Lo [106] CJK COMPATIBILITY IDEOGRAPH-FA70..CJK COMPATIBILITY IDEOGRAPH-FAD9 -FB00..FB06 ; 0 # L& [7] LATIN SMALL LIGATURE FF..LATIN SMALL LIGATURE ST -FB13..FB17 ; 0 # L& [5] ARMENIAN SMALL LIGATURE MEN NOW..ARMENIAN SMALL LIGATURE MEN XEH -FB1D ; 0 # Lo HEBREW LETTER YOD WITH HIRIQ -FB1F..FB28 ; 0 # Lo [10] HEBREW LIGATURE YIDDISH YOD YOD PATAH..HEBREW LETTER WIDE TAV -FB29 ; 0 # Sm HEBREW LETTER ALTERNATIVE PLUS SIGN -FB2A..FB36 ; 0 # Lo [13] HEBREW LETTER SHIN WITH SHIN DOT..HEBREW LETTER ZAYIN WITH DAGESH -FB38..FB3C ; 0 # Lo [5] HEBREW LETTER TET WITH DAGESH..HEBREW LETTER LAMED WITH DAGESH -FB3E ; 0 # Lo HEBREW LETTER MEM WITH DAGESH -FB40..FB41 ; 0 # Lo [2] HEBREW LETTER NUN WITH DAGESH..HEBREW LETTER SAMEKH WITH DAGESH -FB43..FB44 ; 0 # Lo [2] HEBREW LETTER FINAL PE WITH DAGESH..HEBREW LETTER PE WITH DAGESH -FB46..FBB1 ; 0 # Lo [108] HEBREW LETTER TSADI WITH DAGESH..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM -FBD3..FD3D ; 0 # Lo [363] ARABIC LETTER NG ISOLATED FORM..ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM -FD3E ; 0 # Ps ORNATE LEFT PARENTHESIS -FD3F ; 0 # Pe ORNATE RIGHT PARENTHESIS -FD50..FD8F ; 0 # Lo [64] ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM..ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM -FD92..FDC7 ; 0 # Lo [54] ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM..ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM -FDF0..FDFB ; 0 # Lo [12] ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM..ARABIC LIGATURE JALLAJALALOUHOU -FDFC ; 0 # Sc RIAL SIGN -FDFD ; 0 # So ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM -FE00..FE0F ; 0 # Mn [16] VARIATION SELECTOR-1..VARIATION SELECTOR-16 -FE10..FE16 ; 0 # Po [7] PRESENTATION FORM FOR VERTICAL COMMA..PRESENTATION FORM FOR VERTICAL QUESTION MARK -FE17 ; 0 # Ps PRESENTATION FORM FOR VERTICAL LEFT WHITE LENTICULAR BRACKET -FE18 ; 0 # Pe PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRAKCET -FE19 ; 0 # Po PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS -FE30 ; 0 # Po PRESENTATION FORM FOR VERTICAL TWO DOT LEADER -FE31..FE32 ; 0 # Pd [2] PRESENTATION FORM FOR VERTICAL EM DASH..PRESENTATION FORM FOR VERTICAL EN DASH -FE33..FE34 ; 0 # Pc [2] PRESENTATION FORM FOR VERTICAL LOW LINE..PRESENTATION FORM FOR VERTICAL WAVY LOW LINE -FE35 ; 0 # Ps PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS -FE36 ; 0 # Pe PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS -FE37 ; 0 # Ps PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET -FE38 ; 0 # Pe PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET -FE39 ; 0 # Ps PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET -FE3A ; 0 # Pe PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET -FE3B ; 0 # Ps PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET -FE3C ; 0 # Pe PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET -FE3D ; 0 # Ps PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET -FE3E ; 0 # Pe PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET -FE3F ; 0 # Ps PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET -FE40 ; 0 # Pe PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET -FE41 ; 0 # Ps PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET -FE42 ; 0 # Pe PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET -FE43 ; 0 # Ps PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET -FE44 ; 0 # Pe PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET -FE45..FE46 ; 0 # Po [2] SESAME DOT..WHITE SESAME DOT -FE47 ; 0 # Ps PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET -FE48 ; 0 # Pe PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET -FE49..FE4C ; 0 # Po [4] DASHED OVERLINE..DOUBLE WAVY OVERLINE -FE4D..FE4F ; 0 # Pc [3] DASHED LOW LINE..WAVY LOW LINE -FE50..FE52 ; 0 # Po [3] SMALL COMMA..SMALL FULL STOP -FE54..FE57 ; 0 # Po [4] SMALL SEMICOLON..SMALL EXCLAMATION MARK -FE58 ; 0 # Pd SMALL EM DASH -FE59 ; 0 # Ps SMALL LEFT PARENTHESIS -FE5A ; 0 # Pe SMALL RIGHT PARENTHESIS -FE5B ; 0 # Ps SMALL LEFT CURLY BRACKET -FE5C ; 0 # Pe SMALL RIGHT CURLY BRACKET -FE5D ; 0 # Ps SMALL LEFT TORTOISE SHELL BRACKET -FE5E ; 0 # Pe SMALL RIGHT TORTOISE SHELL BRACKET -FE5F..FE61 ; 0 # Po [3] SMALL NUMBER SIGN..SMALL ASTERISK -FE62 ; 0 # Sm SMALL PLUS SIGN -FE63 ; 0 # Pd SMALL HYPHEN-MINUS -FE64..FE66 ; 0 # Sm [3] SMALL LESS-THAN SIGN..SMALL EQUALS SIGN -FE68 ; 0 # Po SMALL REVERSE SOLIDUS -FE69 ; 0 # Sc SMALL DOLLAR SIGN -FE6A..FE6B ; 0 # Po [2] SMALL PERCENT SIGN..SMALL COMMERCIAL AT -FE70..FE74 ; 0 # Lo [5] ARABIC FATHATAN ISOLATED FORM..ARABIC KASRATAN ISOLATED FORM -FE76..FEFC ; 0 # Lo [135] ARABIC FATHA ISOLATED FORM..ARABIC LIGATURE LAM WITH ALEF FINAL FORM -FEFF ; 0 # Cf ZERO WIDTH NO-BREAK SPACE -FF01..FF03 ; 0 # Po [3] FULLWIDTH EXCLAMATION MARK..FULLWIDTH NUMBER SIGN -FF04 ; 0 # Sc FULLWIDTH DOLLAR SIGN -FF05..FF07 ; 0 # Po [3] FULLWIDTH PERCENT SIGN..FULLWIDTH APOSTROPHE -FF08 ; 0 # Ps FULLWIDTH LEFT PARENTHESIS -FF09 ; 0 # Pe FULLWIDTH RIGHT PARENTHESIS -FF0A ; 0 # Po FULLWIDTH ASTERISK -FF0B ; 0 # Sm FULLWIDTH PLUS SIGN -FF0C ; 0 # Po FULLWIDTH COMMA -FF0D ; 0 # Pd FULLWIDTH HYPHEN-MINUS -FF0E..FF0F ; 0 # Po [2] FULLWIDTH FULL STOP..FULLWIDTH SOLIDUS -FF10..FF19 ; 0 # Nd [10] FULLWIDTH DIGIT ZERO..FULLWIDTH DIGIT NINE -FF1A..FF1B ; 0 # Po [2] FULLWIDTH COLON..FULLWIDTH SEMICOLON -FF1C..FF1E ; 0 # Sm [3] FULLWIDTH LESS-THAN SIGN..FULLWIDTH GREATER-THAN SIGN -FF1F..FF20 ; 0 # Po [2] FULLWIDTH QUESTION MARK..FULLWIDTH COMMERCIAL AT -FF21..FF3A ; 0 # L& [26] FULLWIDTH LATIN CAPITAL LETTER A..FULLWIDTH LATIN CAPITAL LETTER Z -FF3B ; 0 # Ps FULLWIDTH LEFT SQUARE BRACKET -FF3C ; 0 # Po FULLWIDTH REVERSE SOLIDUS -FF3D ; 0 # Pe FULLWIDTH RIGHT SQUARE BRACKET -FF3E ; 0 # Sk FULLWIDTH CIRCUMFLEX ACCENT -FF3F ; 0 # Pc FULLWIDTH LOW LINE -FF40 ; 0 # Sk FULLWIDTH GRAVE ACCENT -FF41..FF5A ; 0 # L& [26] FULLWIDTH LATIN SMALL LETTER A..FULLWIDTH LATIN SMALL LETTER Z -FF5B ; 0 # Ps FULLWIDTH LEFT CURLY BRACKET -FF5C ; 0 # Sm FULLWIDTH VERTICAL LINE -FF5D ; 0 # Pe FULLWIDTH RIGHT CURLY BRACKET -FF5E ; 0 # Sm FULLWIDTH TILDE -FF5F ; 0 # Ps FULLWIDTH LEFT WHITE PARENTHESIS -FF60 ; 0 # Pe FULLWIDTH RIGHT WHITE PARENTHESIS -FF61 ; 0 # Po HALFWIDTH IDEOGRAPHIC FULL STOP -FF62 ; 0 # Ps HALFWIDTH LEFT CORNER BRACKET -FF63 ; 0 # Pe HALFWIDTH RIGHT CORNER BRACKET -FF64..FF65 ; 0 # Po [2] HALFWIDTH IDEOGRAPHIC COMMA..HALFWIDTH KATAKANA MIDDLE DOT -FF66..FF6F ; 0 # Lo [10] HALFWIDTH KATAKANA LETTER WO..HALFWIDTH KATAKANA LETTER SMALL TU -FF70 ; 0 # Lm HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK -FF71..FF9D ; 0 # Lo [45] HALFWIDTH KATAKANA LETTER A..HALFWIDTH KATAKANA LETTER N -FF9E..FF9F ; 0 # Lm [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK -FFA0..FFBE ; 0 # Lo [31] HALFWIDTH HANGUL FILLER..HALFWIDTH HANGUL LETTER HIEUH -FFC2..FFC7 ; 0 # Lo [6] HALFWIDTH HANGUL LETTER A..HALFWIDTH HANGUL LETTER E -FFCA..FFCF ; 0 # Lo [6] HALFWIDTH HANGUL LETTER YEO..HALFWIDTH HANGUL LETTER OE -FFD2..FFD7 ; 0 # Lo [6] HALFWIDTH HANGUL LETTER YO..HALFWIDTH HANGUL LETTER YU -FFDA..FFDC ; 0 # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL LETTER I -FFE0..FFE1 ; 0 # Sc [2] FULLWIDTH CENT SIGN..FULLWIDTH POUND SIGN -FFE2 ; 0 # Sm FULLWIDTH NOT SIGN -FFE3 ; 0 # Sk FULLWIDTH MACRON -FFE4 ; 0 # So FULLWIDTH BROKEN BAR -FFE5..FFE6 ; 0 # Sc [2] FULLWIDTH YEN SIGN..FULLWIDTH WON SIGN -FFE8 ; 0 # So HALFWIDTH FORMS LIGHT VERTICAL -FFE9..FFEC ; 0 # Sm [4] HALFWIDTH LEFTWARDS ARROW..HALFWIDTH DOWNWARDS ARROW -FFED..FFEE ; 0 # So [2] HALFWIDTH BLACK SQUARE..HALFWIDTH WHITE CIRCLE -FFF9..FFFB ; 0 # Cf [3] INTERLINEAR ANNOTATION ANCHOR..INTERLINEAR ANNOTATION TERMINATOR -FFFC..FFFD ; 0 # So [2] OBJECT REPLACEMENT CHARACTER..REPLACEMENT CHARACTER -10000..1000B ; 0 # Lo [12] LINEAR B SYLLABLE B008 A..LINEAR B SYLLABLE B046 JE -1000D..10026 ; 0 # Lo [26] LINEAR B SYLLABLE B036 JO..LINEAR B SYLLABLE B032 QO -10028..1003A ; 0 # Lo [19] LINEAR B SYLLABLE B060 RA..LINEAR B SYLLABLE B042 WO -1003C..1003D ; 0 # Lo [2] LINEAR B SYLLABLE B017 ZA..LINEAR B SYLLABLE B074 ZE -1003F..1004D ; 0 # Lo [15] LINEAR B SYLLABLE B020 ZO..LINEAR B SYLLABLE B091 TWO -10050..1005D ; 0 # Lo [14] LINEAR B SYMBOL B018..LINEAR B SYMBOL B089 -10080..100FA ; 0 # Lo [123] LINEAR B IDEOGRAM B100 MAN..LINEAR B IDEOGRAM VESSEL B305 -10100..10101 ; 0 # Po [2] AEGEAN WORD SEPARATOR LINE..AEGEAN WORD SEPARATOR DOT -10102 ; 0 # So AEGEAN CHECK MARK -10107..10133 ; 0 # No [45] AEGEAN NUMBER ONE..AEGEAN NUMBER NINETY THOUSAND -10137..1013F ; 0 # So [9] AEGEAN WEIGHT BASE UNIT..AEGEAN MEASURE THIRD SUBUNIT -10140..10174 ; 0 # Nl [53] GREEK ACROPHONIC ATTIC ONE QUARTER..GREEK ACROPHONIC STRATIAN FIFTY MNAS -10175..10178 ; 0 # No [4] GREEK ONE HALF SIGN..GREEK THREE QUARTERS SIGN -10179..10189 ; 0 # So [17] GREEK YEAR SIGN..GREEK TRYBLION BASE SIGN -1018A ; 0 # No GREEK ZERO SIGN -10190..1019B ; 0 # So [12] ROMAN SEXTANS SIGN..ROMAN CENTURIAL SIGN -101D0..101FC ; 0 # So [45] PHAISTOS DISC SIGN PEDESTRIAN..PHAISTOS DISC SIGN WAVY BAND -10280..1029C ; 0 # Lo [29] LYCIAN LETTER A..LYCIAN LETTER X -102A0..102D0 ; 0 # Lo [49] CARIAN LETTER A..CARIAN LETTER UUU3 -10300..1031E ; 0 # Lo [31] OLD ITALIC LETTER A..OLD ITALIC LETTER UU -10320..10323 ; 0 # No [4] OLD ITALIC NUMERAL ONE..OLD ITALIC NUMERAL FIFTY -10330..10340 ; 0 # Lo [17] GOTHIC LETTER AHSA..GOTHIC LETTER PAIRTHRA -10341 ; 0 # Nl GOTHIC LETTER NINETY -10342..10349 ; 0 # Lo [8] GOTHIC LETTER RAIDA..GOTHIC LETTER OTHAL -1034A ; 0 # Nl GOTHIC LETTER NINE HUNDRED -10380..1039D ; 0 # Lo [30] UGARITIC LETTER ALPA..UGARITIC LETTER SSU -1039F ; 0 # Po UGARITIC WORD DIVIDER -103A0..103C3 ; 0 # Lo [36] OLD PERSIAN SIGN A..OLD PERSIAN SIGN HA -103C8..103CF ; 0 # Lo [8] OLD PERSIAN SIGN AURAMAZDAA..OLD PERSIAN SIGN BUUMISH -103D0 ; 0 # Po OLD PERSIAN WORD DIVIDER -103D1..103D5 ; 0 # Nl [5] OLD PERSIAN NUMBER ONE..OLD PERSIAN NUMBER HUNDRED -10400..1044F ; 0 # L& [80] DESERET CAPITAL LETTER LONG I..DESERET SMALL LETTER EW -10450..1049D ; 0 # Lo [78] SHAVIAN LETTER PEEP..OSMANYA LETTER OO -104A0..104A9 ; 0 # Nd [10] OSMANYA DIGIT ZERO..OSMANYA DIGIT NINE -10800..10805 ; 0 # Lo [6] CYPRIOT SYLLABLE A..CYPRIOT SYLLABLE JA -10808 ; 0 # Lo CYPRIOT SYLLABLE JO -1080A..10835 ; 0 # Lo [44] CYPRIOT SYLLABLE KA..CYPRIOT SYLLABLE WO -10837..10838 ; 0 # Lo [2] CYPRIOT SYLLABLE XA..CYPRIOT SYLLABLE XE -1083C ; 0 # Lo CYPRIOT SYLLABLE ZA -1083F ; 0 # Lo CYPRIOT SYLLABLE ZO -10900..10915 ; 0 # Lo [22] PHOENICIAN LETTER ALF..PHOENICIAN LETTER TAU -10916..10919 ; 0 # No [4] PHOENICIAN NUMBER ONE..PHOENICIAN NUMBER ONE HUNDRED -1091F ; 0 # Po PHOENICIAN WORD SEPARATOR -10920..10939 ; 0 # Lo [26] LYDIAN LETTER A..LYDIAN LETTER C -1093F ; 0 # Po LYDIAN TRIANGULAR MARK -10A00 ; 0 # Lo KHAROSHTHI LETTER A -10A01..10A03 ; 0 # Mn [3] KHAROSHTHI VOWEL SIGN I..KHAROSHTHI VOWEL SIGN VOCALIC R -10A05..10A06 ; 0 # Mn [2] KHAROSHTHI VOWEL SIGN E..KHAROSHTHI VOWEL SIGN O -10A0C ; 0 # Mn KHAROSHTHI VOWEL LENGTH MARK -10A0E ; 0 # Mn KHAROSHTHI SIGN ANUSVARA -10A10..10A13 ; 0 # Lo [4] KHAROSHTHI LETTER KA..KHAROSHTHI LETTER GHA -10A15..10A17 ; 0 # Lo [3] KHAROSHTHI LETTER CA..KHAROSHTHI LETTER JA -10A19..10A33 ; 0 # Lo [27] KHAROSHTHI LETTER NYA..KHAROSHTHI LETTER TTTHA -10A40..10A47 ; 0 # No [8] KHAROSHTHI DIGIT ONE..KHAROSHTHI NUMBER ONE THOUSAND -10A50..10A58 ; 0 # Po [9] KHAROSHTHI PUNCTUATION DOT..KHAROSHTHI PUNCTUATION LINES -12000..1236E ; 0 # Lo [879] CUNEIFORM SIGN A..CUNEIFORM SIGN ZUM -12400..12462 ; 0 # Nl [99] CUNEIFORM NUMERIC SIGN TWO ASH..CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE QUARTER -12470..12473 ; 0 # Po [4] CUNEIFORM PUNCTUATION SIGN OLD ASSYRIAN WORD DIVIDER..CUNEIFORM PUNCTUATION SIGN DIAGONAL TRICOLON -1D000..1D0F5 ; 0 # So [246] BYZANTINE MUSICAL SYMBOL PSILI..BYZANTINE MUSICAL SYMBOL GORGON NEO KATO -1D100..1D126 ; 0 # So [39] MUSICAL SYMBOL SINGLE BARLINE..MUSICAL SYMBOL DRUM CLEF-2 -1D129..1D164 ; 0 # So [60] MUSICAL SYMBOL MULTIPLE MEASURE REST..MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE -1D16A..1D16C ; 0 # So [3] MUSICAL SYMBOL FINGERED TREMOLO-1..MUSICAL SYMBOL FINGERED TREMOLO-3 -1D173..1D17A ; 0 # Cf [8] MUSICAL SYMBOL BEGIN BEAM..MUSICAL SYMBOL END PHRASE -1D183..1D184 ; 0 # So [2] MUSICAL SYMBOL ARPEGGIATO UP..MUSICAL SYMBOL ARPEGGIATO DOWN -1D18C..1D1A9 ; 0 # So [30] MUSICAL SYMBOL RINFORZANDO..MUSICAL SYMBOL DEGREE SLASH -1D1AE..1D1DD ; 0 # So [48] MUSICAL SYMBOL PEDAL MARK..MUSICAL SYMBOL PES SUBPUNCTIS -1D200..1D241 ; 0 # So [66] GREEK VOCAL NOTATION SYMBOL-1..GREEK INSTRUMENTAL NOTATION SYMBOL-54 -1D245 ; 0 # So GREEK MUSICAL LEIMMA -1D300..1D356 ; 0 # So [87] MONOGRAM FOR EARTH..TETRAGRAM FOR FOSTERING -1D360..1D371 ; 0 # No [18] COUNTING ROD UNIT DIGIT ONE..COUNTING ROD TENS DIGIT NINE -1D400..1D454 ; 0 # L& [85] MATHEMATICAL BOLD CAPITAL A..MATHEMATICAL ITALIC SMALL G -1D456..1D49C ; 0 # L& [71] MATHEMATICAL ITALIC SMALL I..MATHEMATICAL SCRIPT CAPITAL A -1D49E..1D49F ; 0 # L& [2] MATHEMATICAL SCRIPT CAPITAL C..MATHEMATICAL SCRIPT CAPITAL D -1D4A2 ; 0 # L& MATHEMATICAL SCRIPT CAPITAL G -1D4A5..1D4A6 ; 0 # L& [2] MATHEMATICAL SCRIPT CAPITAL J..MATHEMATICAL SCRIPT CAPITAL K -1D4A9..1D4AC ; 0 # L& [4] MATHEMATICAL SCRIPT CAPITAL N..MATHEMATICAL SCRIPT CAPITAL Q -1D4AE..1D4B9 ; 0 # L& [12] MATHEMATICAL SCRIPT CAPITAL S..MATHEMATICAL SCRIPT SMALL D -1D4BB ; 0 # L& MATHEMATICAL SCRIPT SMALL F -1D4BD..1D4C3 ; 0 # L& [7] MATHEMATICAL SCRIPT SMALL H..MATHEMATICAL SCRIPT SMALL N -1D4C5..1D505 ; 0 # L& [65] MATHEMATICAL SCRIPT SMALL P..MATHEMATICAL FRAKTUR CAPITAL B -1D507..1D50A ; 0 # L& [4] MATHEMATICAL FRAKTUR CAPITAL D..MATHEMATICAL FRAKTUR CAPITAL G -1D50D..1D514 ; 0 # L& [8] MATHEMATICAL FRAKTUR CAPITAL J..MATHEMATICAL FRAKTUR CAPITAL Q -1D516..1D51C ; 0 # L& [7] MATHEMATICAL FRAKTUR CAPITAL S..MATHEMATICAL FRAKTUR CAPITAL Y -1D51E..1D539 ; 0 # L& [28] MATHEMATICAL FRAKTUR SMALL A..MATHEMATICAL DOUBLE-STRUCK CAPITAL B -1D53B..1D53E ; 0 # L& [4] MATHEMATICAL DOUBLE-STRUCK CAPITAL D..MATHEMATICAL DOUBLE-STRUCK CAPITAL G -1D540..1D544 ; 0 # L& [5] MATHEMATICAL DOUBLE-STRUCK CAPITAL I..MATHEMATICAL DOUBLE-STRUCK CAPITAL M -1D546 ; 0 # L& MATHEMATICAL DOUBLE-STRUCK CAPITAL O -1D54A..1D550 ; 0 # L& [7] MATHEMATICAL DOUBLE-STRUCK CAPITAL S..MATHEMATICAL DOUBLE-STRUCK CAPITAL Y -1D552..1D6A5 ; 0 # L& [340] MATHEMATICAL DOUBLE-STRUCK SMALL A..MATHEMATICAL ITALIC SMALL DOTLESS J -1D6A8..1D6C0 ; 0 # L& [25] MATHEMATICAL BOLD CAPITAL ALPHA..MATHEMATICAL BOLD CAPITAL OMEGA -1D6C1 ; 0 # Sm MATHEMATICAL BOLD NABLA -1D6C2..1D6DA ; 0 # L& [25] MATHEMATICAL BOLD SMALL ALPHA..MATHEMATICAL BOLD SMALL OMEGA -1D6DB ; 0 # Sm MATHEMATICAL BOLD PARTIAL DIFFERENTIAL -1D6DC..1D6FA ; 0 # L& [31] MATHEMATICAL BOLD EPSILON SYMBOL..MATHEMATICAL ITALIC CAPITAL OMEGA -1D6FB ; 0 # Sm MATHEMATICAL ITALIC NABLA -1D6FC..1D714 ; 0 # L& [25] MATHEMATICAL ITALIC SMALL ALPHA..MATHEMATICAL ITALIC SMALL OMEGA -1D715 ; 0 # Sm MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL -1D716..1D734 ; 0 # L& [31] MATHEMATICAL ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD ITALIC CAPITAL OMEGA -1D735 ; 0 # Sm MATHEMATICAL BOLD ITALIC NABLA -1D736..1D74E ; 0 # L& [25] MATHEMATICAL BOLD ITALIC SMALL ALPHA..MATHEMATICAL BOLD ITALIC SMALL OMEGA -1D74F ; 0 # Sm MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL -1D750..1D76E ; 0 # L& [31] MATHEMATICAL BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA -1D76F ; 0 # Sm MATHEMATICAL SANS-SERIF BOLD NABLA -1D770..1D788 ; 0 # L& [25] MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA -1D789 ; 0 # Sm MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL -1D78A..1D7A8 ; 0 # L& [31] MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA -1D7A9 ; 0 # Sm MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA -1D7AA..1D7C2 ; 0 # L& [25] MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA -1D7C3 ; 0 # Sm MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL -1D7C4..1D7CB ; 0 # L& [8] MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD SMALL DIGAMMA -1D7CE..1D7FF ; 0 # Nd [50] MATHEMATICAL BOLD DIGIT ZERO..MATHEMATICAL MONOSPACE DIGIT NINE -1F000..1F02B ; 0 # So [44] MAHJONG TILE EAST WIND..MAHJONG TILE BACK -1F030..1F093 ; 0 # So [100] DOMINO TILE HORIZONTAL BACK..DOMINO TILE VERTICAL-06-06 -20000..2A6D6 ; 0 # Lo [42711] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6D6 -2F800..2FA1D ; 0 # Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D -E0001 ; 0 # Cf LANGUAGE TAG -E0020..E007F ; 0 # Cf [96] TAG SPACE..CANCEL TAG -E0100..E01EF ; 0 # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256 -F0000..FFFFD ; 0 # Co [65534] .. -100000..10FFFD; 0 # Co [65534] .. - -# The above property value applies to 875931 code points not listed here. -# Total code points: 1113611 - -# ================================================ - -# Canonical_Combining_Class=Overlay - -0334..0338 ; 1 # Mn [5] COMBINING TILDE OVERLAY..COMBINING LONG SOLIDUS OVERLAY -20D2..20D3 ; 1 # Mn [2] COMBINING LONG VERTICAL LINE OVERLAY..COMBINING SHORT VERTICAL LINE OVERLAY -20D8..20DA ; 1 # Mn [3] COMBINING RING OVERLAY..COMBINING ANTICLOCKWISE RING OVERLAY -20E5..20E6 ; 1 # Mn [2] COMBINING REVERSE SOLIDUS OVERLAY..COMBINING DOUBLE VERTICAL STROKE OVERLAY -20EA..20EB ; 1 # Mn [2] COMBINING LEFTWARDS ARROW OVERLAY..COMBINING LONG DOUBLE SOLIDUS OVERLAY -10A39 ; 1 # Mn KHAROSHTHI SIGN CAUDA -1D167..1D169 ; 1 # Mn [3] MUSICAL SYMBOL COMBINING TREMOLO-1..MUSICAL SYMBOL COMBINING TREMOLO-3 - -# Total code points: 18 - -# ================================================ - -# Canonical_Combining_Class=Nukta - -093C ; 7 # Mn DEVANAGARI SIGN NUKTA -09BC ; 7 # Mn BENGALI SIGN NUKTA -0A3C ; 7 # Mn GURMUKHI SIGN NUKTA -0ABC ; 7 # Mn GUJARATI SIGN NUKTA -0B3C ; 7 # Mn ORIYA SIGN NUKTA -0CBC ; 7 # Mn KANNADA SIGN NUKTA -1037 ; 7 # Mn MYANMAR SIGN DOT BELOW -1B34 ; 7 # Mn BALINESE SIGN REREKAN -1C37 ; 7 # Mn LEPCHA SIGN NUKTA - -# Total code points: 9 - -# ================================================ - -# Canonical_Combining_Class=Kana_Voicing - -3099..309A ; 8 # Mn [2] COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK..COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK - -# Total code points: 2 - -# ================================================ - -# Canonical_Combining_Class=Virama - -094D ; 9 # Mn DEVANAGARI SIGN VIRAMA -09CD ; 9 # Mn BENGALI SIGN VIRAMA -0A4D ; 9 # Mn GURMUKHI SIGN VIRAMA -0ACD ; 9 # Mn GUJARATI SIGN VIRAMA -0B4D ; 9 # Mn ORIYA SIGN VIRAMA -0BCD ; 9 # Mn TAMIL SIGN VIRAMA -0C4D ; 9 # Mn TELUGU SIGN VIRAMA -0CCD ; 9 # Mn KANNADA SIGN VIRAMA -0D4D ; 9 # Mn MALAYALAM SIGN VIRAMA -0DCA ; 9 # Mn SINHALA SIGN AL-LAKUNA -0E3A ; 9 # Mn THAI CHARACTER PHINTHU -0F84 ; 9 # Mn TIBETAN MARK HALANTA -1039..103A ; 9 # Mn [2] MYANMAR SIGN VIRAMA..MYANMAR SIGN ASAT -1714 ; 9 # Mn TAGALOG SIGN VIRAMA -1734 ; 9 # Mn HANUNOO SIGN PAMUDPOD -17D2 ; 9 # Mn KHMER SIGN COENG -1B44 ; 9 # Mc BALINESE ADEG ADEG -1BAA ; 9 # Mc SUNDANESE SIGN PAMAAEH -A806 ; 9 # Mn SYLOTI NAGRI SIGN HASANTA -A8C4 ; 9 # Mn SAURASHTRA SIGN VIRAMA -A953 ; 9 # Mc REJANG VIRAMA -10A3F ; 9 # Mn KHAROSHTHI VIRAMA - -# Total code points: 23 - -# ================================================ - -# Canonical_Combining_Class=10 - -05B0 ; 10 # Mn HEBREW POINT SHEVA - -# Total code points: 1 - -# ================================================ - -# Canonical_Combining_Class=11 - -05B1 ; 11 # Mn HEBREW POINT HATAF SEGOL - -# Total code points: 1 - -# ================================================ - -# Canonical_Combining_Class=12 - -05B2 ; 12 # Mn HEBREW POINT HATAF PATAH - -# Total code points: 1 - -# ================================================ - -# Canonical_Combining_Class=13 - -05B3 ; 13 # Mn HEBREW POINT HATAF QAMATS - -# Total code points: 1 - -# ================================================ - -# Canonical_Combining_Class=14 - -05B4 ; 14 # Mn HEBREW POINT HIRIQ - -# Total code points: 1 - -# ================================================ - -# Canonical_Combining_Class=15 - -05B5 ; 15 # Mn HEBREW POINT TSERE - -# Total code points: 1 - -# ================================================ - -# Canonical_Combining_Class=16 - -05B6 ; 16 # Mn HEBREW POINT SEGOL - -# Total code points: 1 - -# ================================================ - -# Canonical_Combining_Class=17 - -05B7 ; 17 # Mn HEBREW POINT PATAH - -# Total code points: 1 - -# ================================================ - -# Canonical_Combining_Class=18 - -05B8 ; 18 # Mn HEBREW POINT QAMATS -05C7 ; 18 # Mn HEBREW POINT QAMATS QATAN - -# Total code points: 2 - -# ================================================ - -# Canonical_Combining_Class=19 - -05B9..05BA ; 19 # Mn [2] HEBREW POINT HOLAM..HEBREW POINT HOLAM HASER FOR VAV - -# Total code points: 2 - -# ================================================ - -# Canonical_Combining_Class=20 - -05BB ; 20 # Mn HEBREW POINT QUBUTS - -# Total code points: 1 - -# ================================================ - -# Canonical_Combining_Class=21 - -05BC ; 21 # Mn HEBREW POINT DAGESH OR MAPIQ - -# Total code points: 1 - -# ================================================ - -# Canonical_Combining_Class=22 - -05BD ; 22 # Mn HEBREW POINT METEG - -# Total code points: 1 - -# ================================================ - -# Canonical_Combining_Class=23 - -05BF ; 23 # Mn HEBREW POINT RAFE - -# Total code points: 1 - -# ================================================ - -# Canonical_Combining_Class=24 - -05C1 ; 24 # Mn HEBREW POINT SHIN DOT - -# Total code points: 1 - -# ================================================ - -# Canonical_Combining_Class=25 - -05C2 ; 25 # Mn HEBREW POINT SIN DOT - -# Total code points: 1 - -# ================================================ - -# Canonical_Combining_Class=26 - -FB1E ; 26 # Mn HEBREW POINT JUDEO-SPANISH VARIKA - -# Total code points: 1 - -# ================================================ - -# Canonical_Combining_Class=27 - -064B ; 27 # Mn ARABIC FATHATAN - -# Total code points: 1 - -# ================================================ - -# Canonical_Combining_Class=28 - -064C ; 28 # Mn ARABIC DAMMATAN - -# Total code points: 1 - -# ================================================ - -# Canonical_Combining_Class=29 - -064D ; 29 # Mn ARABIC KASRATAN - -# Total code points: 1 - -# ================================================ - -# Canonical_Combining_Class=30 - -0618 ; 30 # Mn ARABIC SMALL FATHA -064E ; 30 # Mn ARABIC FATHA - -# Total code points: 2 - -# ================================================ - -# Canonical_Combining_Class=31 - -0619 ; 31 # Mn ARABIC SMALL DAMMA -064F ; 31 # Mn ARABIC DAMMA - -# Total code points: 2 - -# ================================================ - -# Canonical_Combining_Class=32 - -061A ; 32 # Mn ARABIC SMALL KASRA -0650 ; 32 # Mn ARABIC KASRA - -# Total code points: 2 - -# ================================================ - -# Canonical_Combining_Class=33 - -0651 ; 33 # Mn ARABIC SHADDA - -# Total code points: 1 - -# ================================================ - -# Canonical_Combining_Class=34 - -0652 ; 34 # Mn ARABIC SUKUN - -# Total code points: 1 - -# ================================================ - -# Canonical_Combining_Class=35 - -0670 ; 35 # Mn ARABIC LETTER SUPERSCRIPT ALEF - -# Total code points: 1 - -# ================================================ - -# Canonical_Combining_Class=36 - -0711 ; 36 # Mn SYRIAC LETTER SUPERSCRIPT ALAPH - -# Total code points: 1 - -# ================================================ - -# Canonical_Combining_Class=84 - -0C55 ; 84 # Mn TELUGU LENGTH MARK - -# Total code points: 1 - -# ================================================ - -# Canonical_Combining_Class=91 - -0C56 ; 91 # Mn TELUGU AI LENGTH MARK - -# Total code points: 1 - -# ================================================ - -# Canonical_Combining_Class=103 - -0E38..0E39 ; 103 # Mn [2] THAI CHARACTER SARA U..THAI CHARACTER SARA UU - -# Total code points: 2 - -# ================================================ - -# Canonical_Combining_Class=107 - -0E48..0E4B ; 107 # Mn [4] THAI CHARACTER MAI EK..THAI CHARACTER MAI CHATTAWA - -# Total code points: 4 - -# ================================================ - -# Canonical_Combining_Class=118 - -0EB8..0EB9 ; 118 # Mn [2] LAO VOWEL SIGN U..LAO VOWEL SIGN UU - -# Total code points: 2 - -# ================================================ - -# Canonical_Combining_Class=122 - -0EC8..0ECB ; 122 # Mn [4] LAO TONE MAI EK..LAO TONE MAI CATAWA - -# Total code points: 4 - -# ================================================ - -# Canonical_Combining_Class=129 - -0F71 ; 129 # Mn TIBETAN VOWEL SIGN AA - -# Total code points: 1 - -# ================================================ - -# Canonical_Combining_Class=130 - -0F72 ; 130 # Mn TIBETAN VOWEL SIGN I -0F7A..0F7D ; 130 # Mn [4] TIBETAN VOWEL SIGN E..TIBETAN VOWEL SIGN OO -0F80 ; 130 # Mn TIBETAN VOWEL SIGN REVERSED I - -# Total code points: 6 - -# ================================================ - -# Canonical_Combining_Class=132 - -0F74 ; 132 # Mn TIBETAN VOWEL SIGN U - -# Total code points: 1 - -# ================================================ - -# Canonical_Combining_Class=Attached_Below - -0321..0322 ; 202 # Mn [2] COMBINING PALATALIZED HOOK BELOW..COMBINING RETROFLEX HOOK BELOW -0327..0328 ; 202 # Mn [2] COMBINING CEDILLA..COMBINING OGONEK -1DD0 ; 202 # Mn COMBINING IS BELOW - -# Total code points: 5 - -# ================================================ - -# Canonical_Combining_Class=214 - -1DCE ; 214 # Mn COMBINING OGONEK ABOVE - -# Total code points: 1 - -# ================================================ - -# Canonical_Combining_Class=Attached_Above_Right - -031B ; 216 # Mn COMBINING HORN -0F39 ; 216 # Mn TIBETAN MARK TSA -PHRU -1D165..1D166 ; 216 # Mc [2] MUSICAL SYMBOL COMBINING STEM..MUSICAL SYMBOL COMBINING SPRECHGESANG STEM -1D16E..1D172 ; 216 # Mc [5] MUSICAL SYMBOL COMBINING FLAG-1..MUSICAL SYMBOL COMBINING FLAG-5 - -# Total code points: 9 - -# ================================================ - -# Canonical_Combining_Class=Below_Left - -302A ; 218 # Mn IDEOGRAPHIC LEVEL TONE MARK - -# Total code points: 1 - -# ================================================ - -# Canonical_Combining_Class=Below - -0316..0319 ; 220 # Mn [4] COMBINING GRAVE ACCENT BELOW..COMBINING RIGHT TACK BELOW -031C..0320 ; 220 # Mn [5] COMBINING LEFT HALF RING BELOW..COMBINING MINUS SIGN BELOW -0323..0326 ; 220 # Mn [4] COMBINING DOT BELOW..COMBINING COMMA BELOW -0329..0333 ; 220 # Mn [11] COMBINING VERTICAL LINE BELOW..COMBINING DOUBLE LOW LINE -0339..033C ; 220 # Mn [4] COMBINING RIGHT HALF RING BELOW..COMBINING SEAGULL BELOW -0347..0349 ; 220 # Mn [3] COMBINING EQUALS SIGN BELOW..COMBINING LEFT ANGLE BELOW -034D..034E ; 220 # Mn [2] COMBINING LEFT RIGHT ARROW BELOW..COMBINING UPWARDS ARROW BELOW -0353..0356 ; 220 # Mn [4] COMBINING X BELOW..COMBINING RIGHT ARROWHEAD AND UP ARROWHEAD BELOW -0359..035A ; 220 # Mn [2] COMBINING ASTERISK BELOW..COMBINING DOUBLE RING BELOW -0591 ; 220 # Mn HEBREW ACCENT ETNAHTA -0596 ; 220 # Mn HEBREW ACCENT TIPEHA -059B ; 220 # Mn HEBREW ACCENT TEVIR -05A2..05A7 ; 220 # Mn [6] HEBREW ACCENT ATNAH HAFUKH..HEBREW ACCENT DARGA -05AA ; 220 # Mn HEBREW ACCENT YERAH BEN YOMO -05C5 ; 220 # Mn HEBREW MARK LOWER DOT -0655..0656 ; 220 # Mn [2] ARABIC HAMZA BELOW..ARABIC SUBSCRIPT ALEF -065C ; 220 # Mn ARABIC VOWEL SIGN DOT BELOW -06E3 ; 220 # Mn ARABIC SMALL LOW SEEN -06EA ; 220 # Mn ARABIC EMPTY CENTRE LOW STOP -06ED ; 220 # Mn ARABIC SMALL LOW MEEM -0731 ; 220 # Mn SYRIAC PTHAHA BELOW -0734 ; 220 # Mn SYRIAC ZQAPHA BELOW -0737..0739 ; 220 # Mn [3] SYRIAC RBASA BELOW..SYRIAC DOTTED ZLAMA ANGULAR -073B..073C ; 220 # Mn [2] SYRIAC HBASA BELOW..SYRIAC HBASA-ESASA DOTTED -073E ; 220 # Mn SYRIAC ESASA BELOW -0742 ; 220 # Mn SYRIAC RUKKAKHA -0744 ; 220 # Mn SYRIAC TWO VERTICAL DOTS BELOW -0746 ; 220 # Mn SYRIAC THREE DOTS BELOW -0748 ; 220 # Mn SYRIAC OBLIQUE LINE BELOW -07F2 ; 220 # Mn NKO COMBINING NASALIZATION MARK -0952 ; 220 # Mn DEVANAGARI STRESS SIGN ANUDATTA -0F18..0F19 ; 220 # Mn [2] TIBETAN ASTROLOGICAL SIGN -KHYUD PA..TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS -0F35 ; 220 # Mn TIBETAN MARK NGAS BZUNG NYI ZLA -0F37 ; 220 # Mn TIBETAN MARK NGAS BZUNG SGOR RTAGS -0FC6 ; 220 # Mn TIBETAN SYMBOL PADMA GDAN -108D ; 220 # Mn MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE -193B ; 220 # Mn LIMBU SIGN SA-I -1A18 ; 220 # Mn BUGINESE VOWEL SIGN U -1B6C ; 220 # Mn BALINESE MUSICAL SYMBOL COMBINING ENDEP -1DC2 ; 220 # Mn COMBINING SNAKE BELOW -1DCA ; 220 # Mn COMBINING LATIN SMALL LETTER R BELOW -1DCF ; 220 # Mn COMBINING ZIGZAG BELOW -1DFF ; 220 # Mn COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW -20E8 ; 220 # Mn COMBINING TRIPLE UNDERDOT -20EC..20EF ; 220 # Mn [4] COMBINING RIGHTWARDS HARPOON WITH BARB DOWNWARDS..COMBINING RIGHT ARROW BELOW -A92B..A92D ; 220 # Mn [3] KAYAH LI TONE PLOPHU..KAYAH LI TONE CALYA PLOPHU -101FD ; 220 # Mn PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE -10A0D ; 220 # Mn KHAROSHTHI SIGN DOUBLE RING BELOW -10A3A ; 220 # Mn KHAROSHTHI SIGN DOT BELOW -1D17B..1D182 ; 220 # Mn [8] MUSICAL SYMBOL COMBINING ACCENT..MUSICAL SYMBOL COMBINING LOURE -1D18A..1D18B ; 220 # Mn [2] MUSICAL SYMBOL COMBINING DOUBLE TONGUE..MUSICAL SYMBOL COMBINING TRIPLE TONGUE - -# Total code points: 104 - -# ================================================ - -# Canonical_Combining_Class=Below_Right - -059A ; 222 # Mn HEBREW ACCENT YETIV -05AD ; 222 # Mn HEBREW ACCENT DEHI -1939 ; 222 # Mn LIMBU SIGN MUKPHRENG -302D ; 222 # Mn IDEOGRAPHIC ENTERING TONE MARK - -# Total code points: 4 - -# ================================================ - -# Canonical_Combining_Class=Left - -302E..302F ; 224 # Mn [2] HANGUL SINGLE DOT TONE MARK..HANGUL DOUBLE DOT TONE MARK - -# Total code points: 2 - -# ================================================ - -# Canonical_Combining_Class=Right - -1D16D ; 226 # Mc MUSICAL SYMBOL COMBINING AUGMENTATION DOT - -# Total code points: 1 - -# ================================================ - -# Canonical_Combining_Class=Above_Left - -05AE ; 228 # Mn HEBREW ACCENT ZINOR -18A9 ; 228 # Mn MONGOLIAN LETTER ALI GALI DAGALGA -302B ; 228 # Mn IDEOGRAPHIC RISING TONE MARK - -# Total code points: 3 - -# ================================================ - -# Canonical_Combining_Class=Above - -0300..0314 ; 230 # Mn [21] COMBINING GRAVE ACCENT..COMBINING REVERSED COMMA ABOVE -033D..0344 ; 230 # Mn [8] COMBINING X ABOVE..COMBINING GREEK DIALYTIKA TONOS -0346 ; 230 # Mn COMBINING BRIDGE ABOVE -034A..034C ; 230 # Mn [3] COMBINING NOT TILDE ABOVE..COMBINING ALMOST EQUAL TO ABOVE -0350..0352 ; 230 # Mn [3] COMBINING RIGHT ARROWHEAD ABOVE..COMBINING FERMATA -0357 ; 230 # Mn COMBINING RIGHT HALF RING ABOVE -035B ; 230 # Mn COMBINING ZIGZAG ABOVE -0363..036F ; 230 # Mn [13] COMBINING LATIN SMALL LETTER A..COMBINING LATIN SMALL LETTER X -0483..0487 ; 230 # Mn [5] COMBINING CYRILLIC TITLO..COMBINING CYRILLIC POKRYTIE -0592..0595 ; 230 # Mn [4] HEBREW ACCENT SEGOL..HEBREW ACCENT ZAQEF GADOL -0597..0599 ; 230 # Mn [3] HEBREW ACCENT REVIA..HEBREW ACCENT PASHTA -059C..05A1 ; 230 # Mn [6] HEBREW ACCENT GERESH..HEBREW ACCENT PAZER -05A8..05A9 ; 230 # Mn [2] HEBREW ACCENT QADMA..HEBREW ACCENT TELISHA QETANA -05AB..05AC ; 230 # Mn [2] HEBREW ACCENT OLE..HEBREW ACCENT ILUY -05AF ; 230 # Mn HEBREW MARK MASORA CIRCLE -05C4 ; 230 # Mn HEBREW MARK UPPER DOT -0610..0617 ; 230 # Mn [8] ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM..ARABIC SMALL HIGH ZAIN -0653..0654 ; 230 # Mn [2] ARABIC MADDAH ABOVE..ARABIC HAMZA ABOVE -0657..065B ; 230 # Mn [5] ARABIC INVERTED DAMMA..ARABIC VOWEL SIGN INVERTED SMALL V ABOVE -065D..065E ; 230 # Mn [2] ARABIC REVERSED DAMMA..ARABIC FATHA WITH TWO DOTS -06D6..06DC ; 230 # Mn [7] ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA..ARABIC SMALL HIGH SEEN -06DF..06E2 ; 230 # Mn [4] ARABIC SMALL HIGH ROUNDED ZERO..ARABIC SMALL HIGH MEEM ISOLATED FORM -06E4 ; 230 # Mn ARABIC SMALL HIGH MADDA -06E7..06E8 ; 230 # Mn [2] ARABIC SMALL HIGH YEH..ARABIC SMALL HIGH NOON -06EB..06EC ; 230 # Mn [2] ARABIC EMPTY CENTRE HIGH STOP..ARABIC ROUNDED HIGH STOP WITH FILLED CENTRE -0730 ; 230 # Mn SYRIAC PTHAHA ABOVE -0732..0733 ; 230 # Mn [2] SYRIAC PTHAHA DOTTED..SYRIAC ZQAPHA ABOVE -0735..0736 ; 230 # Mn [2] SYRIAC ZQAPHA DOTTED..SYRIAC RBASA ABOVE -073A ; 230 # Mn SYRIAC HBASA ABOVE -073D ; 230 # Mn SYRIAC ESASA ABOVE -073F..0741 ; 230 # Mn [3] SYRIAC RWAHA..SYRIAC QUSHSHAYA -0743 ; 230 # Mn SYRIAC TWO VERTICAL DOTS ABOVE -0745 ; 230 # Mn SYRIAC THREE DOTS ABOVE -0747 ; 230 # Mn SYRIAC OBLIQUE LINE ABOVE -0749..074A ; 230 # Mn [2] SYRIAC MUSIC..SYRIAC BARREKH -07EB..07F1 ; 230 # Mn [7] NKO COMBINING SHORT HIGH TONE..NKO COMBINING LONG RISING TONE -07F3 ; 230 # Mn NKO COMBINING DOUBLE DOT ABOVE -0951 ; 230 # Mn DEVANAGARI STRESS SIGN UDATTA -0953..0954 ; 230 # Mn [2] DEVANAGARI GRAVE ACCENT..DEVANAGARI ACUTE ACCENT -0F82..0F83 ; 230 # Mn [2] TIBETAN SIGN NYI ZLA NAA DA..TIBETAN SIGN SNA LDAN -0F86..0F87 ; 230 # Mn [2] TIBETAN SIGN LCI RTAGS..TIBETAN SIGN YANG RTAGS -135F ; 230 # Mn ETHIOPIC COMBINING GEMINATION MARK -17DD ; 230 # Mn KHMER SIGN ATTHACAN -193A ; 230 # Mn LIMBU SIGN KEMPHRENG -1A17 ; 230 # Mn BUGINESE VOWEL SIGN I -1B6B ; 230 # Mn BALINESE MUSICAL SYMBOL COMBINING TEGEH -1B6D..1B73 ; 230 # Mn [7] BALINESE MUSICAL SYMBOL COMBINING KEMPUL..BALINESE MUSICAL SYMBOL COMBINING GONG -1DC0..1DC1 ; 230 # Mn [2] COMBINING DOTTED GRAVE ACCENT..COMBINING DOTTED ACUTE ACCENT -1DC3..1DC9 ; 230 # Mn [7] COMBINING SUSPENSION MARK..COMBINING ACUTE-GRAVE-ACUTE -1DCB..1DCC ; 230 # Mn [2] COMBINING BREVE-MACRON..COMBINING MACRON-BREVE -1DD1..1DE6 ; 230 # Mn [22] COMBINING UR ABOVE..COMBINING LATIN SMALL LETTER Z -1DFE ; 230 # Mn COMBINING LEFT ARROWHEAD ABOVE -20D0..20D1 ; 230 # Mn [2] COMBINING LEFT HARPOON ABOVE..COMBINING RIGHT HARPOON ABOVE -20D4..20D7 ; 230 # Mn [4] COMBINING ANTICLOCKWISE ARROW ABOVE..COMBINING RIGHT ARROW ABOVE -20DB..20DC ; 230 # Mn [2] COMBINING THREE DOTS ABOVE..COMBINING FOUR DOTS ABOVE -20E1 ; 230 # Mn COMBINING LEFT RIGHT ARROW ABOVE -20E7 ; 230 # Mn COMBINING ANNUITY SYMBOL -20E9 ; 230 # Mn COMBINING WIDE BRIDGE ABOVE -20F0 ; 230 # Mn COMBINING ASTERISK ABOVE -2DE0..2DFF ; 230 # Mn [32] COMBINING CYRILLIC LETTER BE..COMBINING CYRILLIC LETTER IOTIFIED BIG YUS -A66F ; 230 # Mn COMBINING CYRILLIC VZMET -A67C..A67D ; 230 # Mn [2] COMBINING CYRILLIC KAVYKA..COMBINING CYRILLIC PAYEROK -FE20..FE26 ; 230 # Mn [7] COMBINING LIGATURE LEFT HALF..COMBINING CONJOINING MACRON -10A0F ; 230 # Mn KHAROSHTHI SIGN VISARGA -10A38 ; 230 # Mn KHAROSHTHI SIGN BAR ABOVE -1D185..1D189 ; 230 # Mn [5] MUSICAL SYMBOL COMBINING DOIT..MUSICAL SYMBOL COMBINING BEND -1D1AA..1D1AD ; 230 # Mn [4] MUSICAL SYMBOL COMBINING DOWN BOW..MUSICAL SYMBOL COMBINING SNAP PIZZICATO -1D242..1D244 ; 230 # Mn [3] COMBINING GREEK MUSICAL TRISEME..COMBINING GREEK MUSICAL PENTASEME - -# Total code points: 252 - -# ================================================ - -# Canonical_Combining_Class=Above_Right - -0315 ; 232 # Mn COMBINING COMMA ABOVE RIGHT -031A ; 232 # Mn COMBINING LEFT ANGLE ABOVE -0358 ; 232 # Mn COMBINING DOT ABOVE RIGHT -302C ; 232 # Mn IDEOGRAPHIC DEPARTING TONE MARK - -# Total code points: 4 - -# ================================================ - -# Canonical_Combining_Class=Double_Below - -035C ; 233 # Mn COMBINING DOUBLE BREVE BELOW -035F ; 233 # Mn COMBINING DOUBLE MACRON BELOW -0362 ; 233 # Mn COMBINING DOUBLE RIGHTWARDS ARROW BELOW - -# Total code points: 3 - -# ================================================ - -# Canonical_Combining_Class=Double_Above - -035D..035E ; 234 # Mn [2] COMBINING DOUBLE BREVE..COMBINING DOUBLE MACRON -0360..0361 ; 234 # Mn [2] COMBINING DOUBLE TILDE..COMBINING DOUBLE INVERTED BREVE -1DCD ; 234 # Mn COMBINING DOUBLE CIRCUMFLEX ABOVE - -# Total code points: 5 - -# ================================================ - -# Canonical_Combining_Class=Iota_Subscript - -0345 ; 240 # Mn COMBINING GREEK YPOGEGRAMMENI - -# Total code points: 1 - -# EOF diff --git a/third_party/harfbuzz/contrib/tables/DerivedGeneralCategory.txt b/third_party/harfbuzz/contrib/tables/DerivedGeneralCategory.txt deleted file mode 100644 index 8423c702e2..0000000000 --- a/third_party/harfbuzz/contrib/tables/DerivedGeneralCategory.txt +++ /dev/null @@ -1,3072 +0,0 @@ -# DerivedGeneralCategory-5.1.0.txt -# Date: 2008-03-20, 17:54:57 GMT [MD] -# -# Unicode Character Database -# Copyright (c) 1991-2008 Unicode, Inc. -# For terms of use, see http://www.unicode.org/terms_of_use.html -# For documentation, see UCD.html - -# ================================================ - -# Property: General_Category - -# ================================================ - -# General_Category=Unassigned - -0378..0379 ; Cn # [2] .. -037F..0383 ; Cn # [5] .. -038B ; Cn # -038D ; Cn # -03A2 ; Cn # -0524..0530 ; Cn # [13] .. -0557..0558 ; Cn # [2] .. -0560 ; Cn # -0588 ; Cn # -058B..0590 ; Cn # [6] .. -05C8..05CF ; Cn # [8] .. -05EB..05EF ; Cn # [5] .. -05F5..05FF ; Cn # [11] .. -0604..0605 ; Cn # [2] .. -061C..061D ; Cn # [2] .. -0620 ; Cn # -065F ; Cn # -070E ; Cn # -074B..074C ; Cn # [2] .. -07B2..07BF ; Cn # [14] .. -07FB..0900 ; Cn # [262] .. -093A..093B ; Cn # [2] .. -094E..094F ; Cn # [2] .. -0955..0957 ; Cn # [3] .. -0973..097A ; Cn # [8] .. -0980 ; Cn # -0984 ; Cn # -098D..098E ; Cn # [2] .. -0991..0992 ; Cn # [2] .. -09A9 ; Cn # -09B1 ; Cn # -09B3..09B5 ; Cn # [3] .. -09BA..09BB ; Cn # [2] .. -09C5..09C6 ; Cn # [2] .. -09C9..09CA ; Cn # [2] .. -09CF..09D6 ; Cn # [8] .. -09D8..09DB ; Cn # [4] .. -09DE ; Cn # -09E4..09E5 ; Cn # [2] .. -09FB..0A00 ; Cn # [6] .. -0A04 ; Cn # -0A0B..0A0E ; Cn # [4] .. -0A11..0A12 ; Cn # [2] .. -0A29 ; Cn # -0A31 ; Cn # -0A34 ; Cn # -0A37 ; Cn # -0A3A..0A3B ; Cn # [2] .. -0A3D ; Cn # -0A43..0A46 ; Cn # [4] .. -0A49..0A4A ; Cn # [2] .. -0A4E..0A50 ; Cn # [3] .. -0A52..0A58 ; Cn # [7] .. -0A5D ; Cn # -0A5F..0A65 ; Cn # [7] .. -0A76..0A80 ; Cn # [11] .. -0A84 ; Cn # -0A8E ; Cn # -0A92 ; Cn # -0AA9 ; Cn # -0AB1 ; Cn # -0AB4 ; Cn # -0ABA..0ABB ; Cn # [2] .. -0AC6 ; Cn # -0ACA ; Cn # -0ACE..0ACF ; Cn # [2] .. -0AD1..0ADF ; Cn # [15] .. -0AE4..0AE5 ; Cn # [2] .. -0AF0 ; Cn # -0AF2..0B00 ; Cn # [15] .. -0B04 ; Cn # -0B0D..0B0E ; Cn # [2] .. -0B11..0B12 ; Cn # [2] .. -0B29 ; Cn # -0B31 ; Cn # -0B34 ; Cn # -0B3A..0B3B ; Cn # [2] .. -0B45..0B46 ; Cn # [2] .. -0B49..0B4A ; Cn # [2] .. -0B4E..0B55 ; Cn # [8] .. -0B58..0B5B ; Cn # [4] .. -0B5E ; Cn # -0B64..0B65 ; Cn # [2] .. -0B72..0B81 ; Cn # [16] .. -0B84 ; Cn # -0B8B..0B8D ; Cn # [3] .. -0B91 ; Cn # -0B96..0B98 ; Cn # [3] .. -0B9B ; Cn # -0B9D ; Cn # -0BA0..0BA2 ; Cn # [3] .. -0BA5..0BA7 ; Cn # [3] .. -0BAB..0BAD ; Cn # [3] .. -0BBA..0BBD ; Cn # [4] .. -0BC3..0BC5 ; Cn # [3] .. -0BC9 ; Cn # -0BCE..0BCF ; Cn # [2] .. -0BD1..0BD6 ; Cn # [6] .. -0BD8..0BE5 ; Cn # [14] .. -0BFB..0C00 ; Cn # [6] .. -0C04 ; Cn # -0C0D ; Cn # -0C11 ; Cn # -0C29 ; Cn # -0C34 ; Cn # -0C3A..0C3C ; Cn # [3] .. -0C45 ; Cn # -0C49 ; Cn # -0C4E..0C54 ; Cn # [7] .. -0C57 ; Cn # -0C5A..0C5F ; Cn # [6] .. -0C64..0C65 ; Cn # [2] .. -0C70..0C77 ; Cn # [8] .. -0C80..0C81 ; Cn # [2] .. -0C84 ; Cn # -0C8D ; Cn # -0C91 ; Cn # -0CA9 ; Cn # -0CB4 ; Cn # -0CBA..0CBB ; Cn # [2] .. -0CC5 ; Cn # -0CC9 ; Cn # -0CCE..0CD4 ; Cn # [7] .. -0CD7..0CDD ; Cn # [7] .. -0CDF ; Cn # -0CE4..0CE5 ; Cn # [2] .. -0CF0 ; Cn # -0CF3..0D01 ; Cn # [15] .. -0D04 ; Cn # -0D0D ; Cn # -0D11 ; Cn # -0D29 ; Cn # -0D3A..0D3C ; Cn # [3] .. -0D45 ; Cn # -0D49 ; Cn # -0D4E..0D56 ; Cn # [9] .. -0D58..0D5F ; Cn # [8] .. -0D64..0D65 ; Cn # [2] .. -0D76..0D78 ; Cn # [3] .. -0D80..0D81 ; Cn # [2] .. -0D84 ; Cn # -0D97..0D99 ; Cn # [3] .. -0DB2 ; Cn # -0DBC ; Cn # -0DBE..0DBF ; Cn # [2] .. -0DC7..0DC9 ; Cn # [3] .. -0DCB..0DCE ; Cn # [4] .. -0DD5 ; Cn # -0DD7 ; Cn # -0DE0..0DF1 ; Cn # [18] .. -0DF5..0E00 ; Cn # [12] .. -0E3B..0E3E ; Cn # [4] .. -0E5C..0E80 ; Cn # [37] .. -0E83 ; Cn # -0E85..0E86 ; Cn # [2] .. -0E89 ; Cn # -0E8B..0E8C ; Cn # [2] .. -0E8E..0E93 ; Cn # [6] .. -0E98 ; Cn # -0EA0 ; Cn # -0EA4 ; Cn # -0EA6 ; Cn # -0EA8..0EA9 ; Cn # [2] .. -0EAC ; Cn # -0EBA ; Cn # -0EBE..0EBF ; Cn # [2] .. -0EC5 ; Cn # -0EC7 ; Cn # -0ECE..0ECF ; Cn # [2] .. -0EDA..0EDB ; Cn # [2] .. -0EDE..0EFF ; Cn # [34] .. -0F48 ; Cn # -0F6D..0F70 ; Cn # [4] .. -0F8C..0F8F ; Cn # [4] .. -0F98 ; Cn # -0FBD ; Cn # -0FCD ; Cn # -0FD5..0FFF ; Cn # [43] .. -109A..109D ; Cn # [4] .. -10C6..10CF ; Cn # [10] .. -10FD..10FF ; Cn # [3] .. -115A..115E ; Cn # [5] .. -11A3..11A7 ; Cn # [5] .. -11FA..11FF ; Cn # [6] .. -1249 ; Cn # -124E..124F ; Cn # [2] .. -1257 ; Cn # -1259 ; Cn # -125E..125F ; Cn # [2] .. -1289 ; Cn # -128E..128F ; Cn # [2] .. -12B1 ; Cn # -12B6..12B7 ; Cn # [2] .. -12BF ; Cn # -12C1 ; Cn # -12C6..12C7 ; Cn # [2] .. -12D7 ; Cn # -1311 ; Cn # -1316..1317 ; Cn # [2] .. -135B..135E ; Cn # [4] .. -137D..137F ; Cn # [3] .. -139A..139F ; Cn # [6] .. -13F5..1400 ; Cn # [12] .. -1677..167F ; Cn # [9] .. -169D..169F ; Cn # [3] .. -16F1..16FF ; Cn # [15] .. -170D ; Cn # -1715..171F ; Cn # [11] .. -1737..173F ; Cn # [9] .. -1754..175F ; Cn # [12] .. -176D ; Cn # -1771 ; Cn # -1774..177F ; Cn # [12] .. -17DE..17DF ; Cn # [2] .. -17EA..17EF ; Cn # [6] .. -17FA..17FF ; Cn # [6] .. -180F ; Cn # -181A..181F ; Cn # [6] .. -1878..187F ; Cn # [8] .. -18AB..18FF ; Cn # [85] .. -191D..191F ; Cn # [3] .. -192C..192F ; Cn # [4] .. -193C..193F ; Cn # [4] .. -1941..1943 ; Cn # [3] .. -196E..196F ; Cn # [2] .. -1975..197F ; Cn # [11] .. -19AA..19AF ; Cn # [6] .. -19CA..19CF ; Cn # [6] .. -19DA..19DD ; Cn # [4] .. -1A1C..1A1D ; Cn # [2] .. -1A20..1AFF ; Cn # [224] .. -1B4C..1B4F ; Cn # [4] .. -1B7D..1B7F ; Cn # [3] .. -1BAB..1BAD ; Cn # [3] .. -1BBA..1BFF ; Cn # [70] .. -1C38..1C3A ; Cn # [3] .. -1C4A..1C4C ; Cn # [3] .. -1C80..1CFF ; Cn # [128] .. -1DE7..1DFD ; Cn # [23] .. -1F16..1F17 ; Cn # [2] .. -1F1E..1F1F ; Cn # [2] .. -1F46..1F47 ; Cn # [2] .. -1F4E..1F4F ; Cn # [2] .. -1F58 ; Cn # -1F5A ; Cn # -1F5C ; Cn # -1F5E ; Cn # -1F7E..1F7F ; Cn # [2] .. -1FB5 ; Cn # -1FC5 ; Cn # -1FD4..1FD5 ; Cn # [2] .. -1FDC ; Cn # -1FF0..1FF1 ; Cn # [2] .. -1FF5 ; Cn # -1FFF ; Cn # -2065..2069 ; Cn # [5] .. -2072..2073 ; Cn # [2] .. -208F ; Cn # -2095..209F ; Cn # [11] .. -20B6..20CF ; Cn # [26] .. -20F1..20FF ; Cn # [15] .. -2150..2152 ; Cn # [3] .. -2189..218F ; Cn # [7] .. -23E8..23FF ; Cn # [24] .. -2427..243F ; Cn # [25] .. -244B..245F ; Cn # [21] .. -269E..269F ; Cn # [2] .. -26BD..26BF ; Cn # [3] .. -26C4..2700 ; Cn # [61] .. -2705 ; Cn # -270A..270B ; Cn # [2] .. -2728 ; Cn # -274C ; Cn # -274E ; Cn # -2753..2755 ; Cn # [3] .. -2757 ; Cn # -275F..2760 ; Cn # [2] .. -2795..2797 ; Cn # [3] .. -27B0 ; Cn # -27BF ; Cn # -27CB ; Cn # -27CD..27CF ; Cn # [3] .. -2B4D..2B4F ; Cn # [3] .. -2B55..2BFF ; Cn # [171] .. -2C2F ; Cn # -2C5F ; Cn # -2C70 ; Cn # -2C7E..2C7F ; Cn # [2] .. -2CEB..2CF8 ; Cn # [14] .. -2D26..2D2F ; Cn # [10] .. -2D66..2D6E ; Cn # [9] .. -2D70..2D7F ; Cn # [16] .. -2D97..2D9F ; Cn # [9] .. -2DA7 ; Cn # -2DAF ; Cn # -2DB7 ; Cn # -2DBF ; Cn # -2DC7 ; Cn # -2DCF ; Cn # -2DD7 ; Cn # -2DDF ; Cn # -2E31..2E7F ; Cn # [79] .. -2E9A ; Cn # -2EF4..2EFF ; Cn # [12] .. -2FD6..2FEF ; Cn # [26] .. -2FFC..2FFF ; Cn # [4] .. -3040 ; Cn # -3097..3098 ; Cn # [2] .. -3100..3104 ; Cn # [5] .. -312E..3130 ; Cn # [3] .. -318F ; Cn # -31B8..31BF ; Cn # [8] .. -31E4..31EF ; Cn # [12] .. -321F ; Cn # -3244..324F ; Cn # [12] .. -32FF ; Cn # -4DB6..4DBF ; Cn # [10] .. -9FC4..9FFF ; Cn # [60] .. -A48D..A48F ; Cn # [3] .. -A4C7..A4FF ; Cn # [57] .. -A62C..A63F ; Cn # [20] .. -A660..A661 ; Cn # [2] .. -A674..A67B ; Cn # [8] .. -A698..A6FF ; Cn # [104] .. -A78D..A7FA ; Cn # [110] .. -A82C..A83F ; Cn # [20] .. -A878..A87F ; Cn # [8] .. -A8C5..A8CD ; Cn # [9] .. -A8DA..A8FF ; Cn # [38] .. -A954..A95E ; Cn # [11] .. -A960..A9FF ; Cn # [160] .. -AA37..AA3F ; Cn # [9] .. -AA4E..AA4F ; Cn # [2] .. -AA5A..AA5B ; Cn # [2] .. -AA60..ABFF ; Cn # [416] .. -D7A4..D7FF ; Cn # [92] .. -FA2E..FA2F ; Cn # [2] .. -FA6B..FA6F ; Cn # [5] .. -FADA..FAFF ; Cn # [38] .. -FB07..FB12 ; Cn # [12] .. -FB18..FB1C ; Cn # [5] .. -FB37 ; Cn # -FB3D ; Cn # -FB3F ; Cn # -FB42 ; Cn # -FB45 ; Cn # -FBB2..FBD2 ; Cn # [33] .. -FD40..FD4F ; Cn # [16] .. -FD90..FD91 ; Cn # [2] .. -FDC8..FDEF ; Cn # [40] .. -FDFE..FDFF ; Cn # [2] .. -FE1A..FE1F ; Cn # [6] .. -FE27..FE2F ; Cn # [9] .. -FE53 ; Cn # -FE67 ; Cn # -FE6C..FE6F ; Cn # [4] .. -FE75 ; Cn # -FEFD..FEFE ; Cn # [2] .. -FF00 ; Cn # -FFBF..FFC1 ; Cn # [3] .. -FFC8..FFC9 ; Cn # [2] .. -FFD0..FFD1 ; Cn # [2] .. -FFD8..FFD9 ; Cn # [2] .. -FFDD..FFDF ; Cn # [3] .. -FFE7 ; Cn # -FFEF..FFF8 ; Cn # [10] .. -FFFE..FFFF ; Cn # [2] .. -1000C ; Cn # -10027 ; Cn # -1003B ; Cn # -1003E ; Cn # -1004E..1004F ; Cn # [2] .. -1005E..1007F ; Cn # [34] .. -100FB..100FF ; Cn # [5] .. -10103..10106 ; Cn # [4] .. -10134..10136 ; Cn # [3] .. -1018B..1018F ; Cn # [5] .. -1019C..101CF ; Cn # [52] .. -101FE..1027F ; Cn # [130] .. -1029D..1029F ; Cn # [3] .. -102D1..102FF ; Cn # [47] .. -1031F ; Cn # -10324..1032F ; Cn # [12] .. -1034B..1037F ; Cn # [53] .. -1039E ; Cn # -103C4..103C7 ; Cn # [4] .. -103D6..103FF ; Cn # [42] .. -1049E..1049F ; Cn # [2] .. -104AA..107FF ; Cn # [854] .. -10806..10807 ; Cn # [2] .. -10809 ; Cn # -10836 ; Cn # -10839..1083B ; Cn # [3] .. -1083D..1083E ; Cn # [2] .. -10840..108FF ; Cn # [192] .. -1091A..1091E ; Cn # [5] .. -1093A..1093E ; Cn # [5] .. -10940..109FF ; Cn # [192] .. -10A04 ; Cn # -10A07..10A0B ; Cn # [5] .. -10A14 ; Cn # -10A18 ; Cn # -10A34..10A37 ; Cn # [4] .. -10A3B..10A3E ; Cn # [4] .. -10A48..10A4F ; Cn # [8] .. -10A59..11FFF ; Cn # [5543] .. -1236F..123FF ; Cn # [145] .. -12463..1246F ; Cn # [13] .. -12474..1CFFF ; Cn # [43916] .. -1D0F6..1D0FF ; Cn # [10] .. -1D127..1D128 ; Cn # [2] .. -1D1DE..1D1FF ; Cn # [34] .. -1D246..1D2FF ; Cn # [186] .. -1D357..1D35F ; Cn # [9] .. -1D372..1D3FF ; Cn # [142] .. -1D455 ; Cn # -1D49D ; Cn # -1D4A0..1D4A1 ; Cn # [2] .. -1D4A3..1D4A4 ; Cn # [2] .. -1D4A7..1D4A8 ; Cn # [2] .. -1D4AD ; Cn # -1D4BA ; Cn # -1D4BC ; Cn # -1D4C4 ; Cn # -1D506 ; Cn # -1D50B..1D50C ; Cn # [2] .. -1D515 ; Cn # -1D51D ; Cn # -1D53A ; Cn # -1D53F ; Cn # -1D545 ; Cn # -1D547..1D549 ; Cn # [3] .. -1D551 ; Cn # -1D6A6..1D6A7 ; Cn # [2] .. -1D7CC..1D7CD ; Cn # [2] .. -1D800..1EFFF ; Cn # [6144] .. -1F02C..1F02F ; Cn # [4] .. -1F094..1FFFF ; Cn # [3948] .. -2A6D7..2F7FF ; Cn # [20777] .. -2FA1E..E0000 ; Cn # [722403] .. -E0002..E001F ; Cn # [30] .. -E0080..E00FF ; Cn # [128] .. -E01F0..EFFFF ; Cn # [65040] .. -FFFFE..FFFFF ; Cn # [2] .. -10FFFE..10FFFF; Cn # [2] .. - -# Total code points: 873883 - -# ================================================ - -# General_Category=Uppercase_Letter - -0041..005A ; Lu # [26] LATIN CAPITAL LETTER A..LATIN CAPITAL LETTER Z -00C0..00D6 ; Lu # [23] LATIN CAPITAL LETTER A WITH GRAVE..LATIN CAPITAL LETTER O WITH DIAERESIS -00D8..00DE ; Lu # [7] LATIN CAPITAL LETTER O WITH STROKE..LATIN CAPITAL LETTER THORN -0100 ; Lu # LATIN CAPITAL LETTER A WITH MACRON -0102 ; Lu # LATIN CAPITAL LETTER A WITH BREVE -0104 ; Lu # LATIN CAPITAL LETTER A WITH OGONEK -0106 ; Lu # LATIN CAPITAL LETTER C WITH ACUTE -0108 ; Lu # LATIN CAPITAL LETTER C WITH CIRCUMFLEX -010A ; Lu # LATIN CAPITAL LETTER C WITH DOT ABOVE -010C ; Lu # LATIN CAPITAL LETTER C WITH CARON -010E ; Lu # LATIN CAPITAL LETTER D WITH CARON -0110 ; Lu # LATIN CAPITAL LETTER D WITH STROKE -0112 ; Lu # LATIN CAPITAL LETTER E WITH MACRON -0114 ; Lu # LATIN CAPITAL LETTER E WITH BREVE -0116 ; Lu # LATIN CAPITAL LETTER E WITH DOT ABOVE -0118 ; Lu # LATIN CAPITAL LETTER E WITH OGONEK -011A ; Lu # LATIN CAPITAL LETTER E WITH CARON -011C ; Lu # LATIN CAPITAL LETTER G WITH CIRCUMFLEX -011E ; Lu # LATIN CAPITAL LETTER G WITH BREVE -0120 ; Lu # LATIN CAPITAL LETTER G WITH DOT ABOVE -0122 ; Lu # LATIN CAPITAL LETTER G WITH CEDILLA -0124 ; Lu # LATIN CAPITAL LETTER H WITH CIRCUMFLEX -0126 ; Lu # LATIN CAPITAL LETTER H WITH STROKE -0128 ; Lu # LATIN CAPITAL LETTER I WITH TILDE -012A ; Lu # LATIN CAPITAL LETTER I WITH MACRON -012C ; Lu # LATIN CAPITAL LETTER I WITH BREVE -012E ; Lu # LATIN CAPITAL LETTER I WITH OGONEK -0130 ; Lu # LATIN CAPITAL LETTER I WITH DOT ABOVE -0132 ; Lu # LATIN CAPITAL LIGATURE IJ -0134 ; Lu # LATIN CAPITAL LETTER J WITH CIRCUMFLEX -0136 ; Lu # LATIN CAPITAL LETTER K WITH CEDILLA -0139 ; Lu # LATIN CAPITAL LETTER L WITH ACUTE -013B ; Lu # LATIN CAPITAL LETTER L WITH CEDILLA -013D ; Lu # LATIN CAPITAL LETTER L WITH CARON -013F ; Lu # LATIN CAPITAL LETTER L WITH MIDDLE DOT -0141 ; Lu # LATIN CAPITAL LETTER L WITH STROKE -0143 ; Lu # LATIN CAPITAL LETTER N WITH ACUTE -0145 ; Lu # LATIN CAPITAL LETTER N WITH CEDILLA -0147 ; Lu # LATIN CAPITAL LETTER N WITH CARON -014A ; Lu # LATIN CAPITAL LETTER ENG -014C ; Lu # LATIN CAPITAL LETTER O WITH MACRON -014E ; Lu # LATIN CAPITAL LETTER O WITH BREVE -0150 ; Lu # LATIN CAPITAL LETTER O WITH DOUBLE ACUTE -0152 ; Lu # LATIN CAPITAL LIGATURE OE -0154 ; Lu # LATIN CAPITAL LETTER R WITH ACUTE -0156 ; Lu # LATIN CAPITAL LETTER R WITH CEDILLA -0158 ; Lu # LATIN CAPITAL LETTER R WITH CARON -015A ; Lu # LATIN CAPITAL LETTER S WITH ACUTE -015C ; Lu # LATIN CAPITAL LETTER S WITH CIRCUMFLEX -015E ; Lu # LATIN CAPITAL LETTER S WITH CEDILLA -0160 ; Lu # LATIN CAPITAL LETTER S WITH CARON -0162 ; Lu # LATIN CAPITAL LETTER T WITH CEDILLA -0164 ; Lu # LATIN CAPITAL LETTER T WITH CARON -0166 ; Lu # LATIN CAPITAL LETTER T WITH STROKE -0168 ; Lu # LATIN CAPITAL LETTER U WITH TILDE -016A ; Lu # LATIN CAPITAL LETTER U WITH MACRON -016C ; Lu # LATIN CAPITAL LETTER U WITH BREVE -016E ; Lu # LATIN CAPITAL LETTER U WITH RING ABOVE -0170 ; Lu # LATIN CAPITAL LETTER U WITH DOUBLE ACUTE -0172 ; Lu # LATIN CAPITAL LETTER U WITH OGONEK -0174 ; Lu # LATIN CAPITAL LETTER W WITH CIRCUMFLEX -0176 ; Lu # LATIN CAPITAL LETTER Y WITH CIRCUMFLEX -0178..0179 ; Lu # [2] LATIN CAPITAL LETTER Y WITH DIAERESIS..LATIN CAPITAL LETTER Z WITH ACUTE -017B ; Lu # LATIN CAPITAL LETTER Z WITH DOT ABOVE -017D ; Lu # LATIN CAPITAL LETTER Z WITH CARON -0181..0182 ; Lu # [2] LATIN CAPITAL LETTER B WITH HOOK..LATIN CAPITAL LETTER B WITH TOPBAR -0184 ; Lu # LATIN CAPITAL LETTER TONE SIX -0186..0187 ; Lu # [2] LATIN CAPITAL LETTER OPEN O..LATIN CAPITAL LETTER C WITH HOOK -0189..018B ; Lu # [3] LATIN CAPITAL LETTER AFRICAN D..LATIN CAPITAL LETTER D WITH TOPBAR -018E..0191 ; Lu # [4] LATIN CAPITAL LETTER REVERSED E..LATIN CAPITAL LETTER F WITH HOOK -0193..0194 ; Lu # [2] LATIN CAPITAL LETTER G WITH HOOK..LATIN CAPITAL LETTER GAMMA -0196..0198 ; Lu # [3] LATIN CAPITAL LETTER IOTA..LATIN CAPITAL LETTER K WITH HOOK -019C..019D ; Lu # [2] LATIN CAPITAL LETTER TURNED M..LATIN CAPITAL LETTER N WITH LEFT HOOK -019F..01A0 ; Lu # [2] LATIN CAPITAL LETTER O WITH MIDDLE TILDE..LATIN CAPITAL LETTER O WITH HORN -01A2 ; Lu # LATIN CAPITAL LETTER OI -01A4 ; Lu # LATIN CAPITAL LETTER P WITH HOOK -01A6..01A7 ; Lu # [2] LATIN LETTER YR..LATIN CAPITAL LETTER TONE TWO -01A9 ; Lu # LATIN CAPITAL LETTER ESH -01AC ; Lu # LATIN CAPITAL LETTER T WITH HOOK -01AE..01AF ; Lu # [2] LATIN CAPITAL LETTER T WITH RETROFLEX HOOK..LATIN CAPITAL LETTER U WITH HORN -01B1..01B3 ; Lu # [3] LATIN CAPITAL LETTER UPSILON..LATIN CAPITAL LETTER Y WITH HOOK -01B5 ; Lu # LATIN CAPITAL LETTER Z WITH STROKE -01B7..01B8 ; Lu # [2] LATIN CAPITAL LETTER EZH..LATIN CAPITAL LETTER EZH REVERSED -01BC ; Lu # LATIN CAPITAL LETTER TONE FIVE -01C4 ; Lu # LATIN CAPITAL LETTER DZ WITH CARON -01C7 ; Lu # LATIN CAPITAL LETTER LJ -01CA ; Lu # LATIN CAPITAL LETTER NJ -01CD ; Lu # LATIN CAPITAL LETTER A WITH CARON -01CF ; Lu # LATIN CAPITAL LETTER I WITH CARON -01D1 ; Lu # LATIN CAPITAL LETTER O WITH CARON -01D3 ; Lu # LATIN CAPITAL LETTER U WITH CARON -01D5 ; Lu # LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON -01D7 ; Lu # LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE -01D9 ; Lu # LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON -01DB ; Lu # LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE -01DE ; Lu # LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON -01E0 ; Lu # LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON -01E2 ; Lu # LATIN CAPITAL LETTER AE WITH MACRON -01E4 ; Lu # LATIN CAPITAL LETTER G WITH STROKE -01E6 ; Lu # LATIN CAPITAL LETTER G WITH CARON -01E8 ; Lu # LATIN CAPITAL LETTER K WITH CARON -01EA ; Lu # LATIN CAPITAL LETTER O WITH OGONEK -01EC ; Lu # LATIN CAPITAL LETTER O WITH OGONEK AND MACRON -01EE ; Lu # LATIN CAPITAL LETTER EZH WITH CARON -01F1 ; Lu # LATIN CAPITAL LETTER DZ -01F4 ; Lu # LATIN CAPITAL LETTER G WITH ACUTE -01F6..01F8 ; Lu # [3] LATIN CAPITAL LETTER HWAIR..LATIN CAPITAL LETTER N WITH GRAVE -01FA ; Lu # LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE -01FC ; Lu # LATIN CAPITAL LETTER AE WITH ACUTE -01FE ; Lu # LATIN CAPITAL LETTER O WITH STROKE AND ACUTE -0200 ; Lu # LATIN CAPITAL LETTER A WITH DOUBLE GRAVE -0202 ; Lu # LATIN CAPITAL LETTER A WITH INVERTED BREVE -0204 ; Lu # LATIN CAPITAL LETTER E WITH DOUBLE GRAVE -0206 ; Lu # LATIN CAPITAL LETTER E WITH INVERTED BREVE -0208 ; Lu # LATIN CAPITAL LETTER I WITH DOUBLE GRAVE -020A ; Lu # LATIN CAPITAL LETTER I WITH INVERTED BREVE -020C ; Lu # LATIN CAPITAL LETTER O WITH DOUBLE GRAVE -020E ; Lu # LATIN CAPITAL LETTER O WITH INVERTED BREVE -0210 ; Lu # LATIN CAPITAL LETTER R WITH DOUBLE GRAVE -0212 ; Lu # LATIN CAPITAL LETTER R WITH INVERTED BREVE -0214 ; Lu # LATIN CAPITAL LETTER U WITH DOUBLE GRAVE -0216 ; Lu # LATIN CAPITAL LETTER U WITH INVERTED BREVE -0218 ; Lu # LATIN CAPITAL LETTER S WITH COMMA BELOW -021A ; Lu # LATIN CAPITAL LETTER T WITH COMMA BELOW -021C ; Lu # LATIN CAPITAL LETTER YOGH -021E ; Lu # LATIN CAPITAL LETTER H WITH CARON -0220 ; Lu # LATIN CAPITAL LETTER N WITH LONG RIGHT LEG -0222 ; Lu # LATIN CAPITAL LETTER OU -0224 ; Lu # LATIN CAPITAL LETTER Z WITH HOOK -0226 ; Lu # LATIN CAPITAL LETTER A WITH DOT ABOVE -0228 ; Lu # LATIN CAPITAL LETTER E WITH CEDILLA -022A ; Lu # LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON -022C ; Lu # LATIN CAPITAL LETTER O WITH TILDE AND MACRON -022E ; Lu # LATIN CAPITAL LETTER O WITH DOT ABOVE -0230 ; Lu # LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON -0232 ; Lu # LATIN CAPITAL LETTER Y WITH MACRON -023A..023B ; Lu # [2] LATIN CAPITAL LETTER A WITH STROKE..LATIN CAPITAL LETTER C WITH STROKE -023D..023E ; Lu # [2] LATIN CAPITAL LETTER L WITH BAR..LATIN CAPITAL LETTER T WITH DIAGONAL STROKE -0241 ; Lu # LATIN CAPITAL LETTER GLOTTAL STOP -0243..0246 ; Lu # [4] LATIN CAPITAL LETTER B WITH STROKE..LATIN CAPITAL LETTER E WITH STROKE -0248 ; Lu # LATIN CAPITAL LETTER J WITH STROKE -024A ; Lu # LATIN CAPITAL LETTER SMALL Q WITH HOOK TAIL -024C ; Lu # LATIN CAPITAL LETTER R WITH STROKE -024E ; Lu # LATIN CAPITAL LETTER Y WITH STROKE -0370 ; Lu # GREEK CAPITAL LETTER HETA -0372 ; Lu # GREEK CAPITAL LETTER ARCHAIC SAMPI -0376 ; Lu # GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA -0386 ; Lu # GREEK CAPITAL LETTER ALPHA WITH TONOS -0388..038A ; Lu # [3] GREEK CAPITAL LETTER EPSILON WITH TONOS..GREEK CAPITAL LETTER IOTA WITH TONOS -038C ; Lu # GREEK CAPITAL LETTER OMICRON WITH TONOS -038E..038F ; Lu # [2] GREEK CAPITAL LETTER UPSILON WITH TONOS..GREEK CAPITAL LETTER OMEGA WITH TONOS -0391..03A1 ; Lu # [17] GREEK CAPITAL LETTER ALPHA..GREEK CAPITAL LETTER RHO -03A3..03AB ; Lu # [9] GREEK CAPITAL LETTER SIGMA..GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA -03CF ; Lu # GREEK CAPITAL KAI SYMBOL -03D2..03D4 ; Lu # [3] GREEK UPSILON WITH HOOK SYMBOL..GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL -03D8 ; Lu # GREEK LETTER ARCHAIC KOPPA -03DA ; Lu # GREEK LETTER STIGMA -03DC ; Lu # GREEK LETTER DIGAMMA -03DE ; Lu # GREEK LETTER KOPPA -03E0 ; Lu # GREEK LETTER SAMPI -03E2 ; Lu # COPTIC CAPITAL LETTER SHEI -03E4 ; Lu # COPTIC CAPITAL LETTER FEI -03E6 ; Lu # COPTIC CAPITAL LETTER KHEI -03E8 ; Lu # COPTIC CAPITAL LETTER HORI -03EA ; Lu # COPTIC CAPITAL LETTER GANGIA -03EC ; Lu # COPTIC CAPITAL LETTER SHIMA -03EE ; Lu # COPTIC CAPITAL LETTER DEI -03F4 ; Lu # GREEK CAPITAL THETA SYMBOL -03F7 ; Lu # GREEK CAPITAL LETTER SHO -03F9..03FA ; Lu # [2] GREEK CAPITAL LUNATE SIGMA SYMBOL..GREEK CAPITAL LETTER SAN -03FD..042F ; Lu # [51] GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL..CYRILLIC CAPITAL LETTER YA -0460 ; Lu # CYRILLIC CAPITAL LETTER OMEGA -0462 ; Lu # CYRILLIC CAPITAL LETTER YAT -0464 ; Lu # CYRILLIC CAPITAL LETTER IOTIFIED E -0466 ; Lu # CYRILLIC CAPITAL LETTER LITTLE YUS -0468 ; Lu # CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS -046A ; Lu # CYRILLIC CAPITAL LETTER BIG YUS -046C ; Lu # CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS -046E ; Lu # CYRILLIC CAPITAL LETTER KSI -0470 ; Lu # CYRILLIC CAPITAL LETTER PSI -0472 ; Lu # CYRILLIC CAPITAL LETTER FITA -0474 ; Lu # CYRILLIC CAPITAL LETTER IZHITSA -0476 ; Lu # CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT -0478 ; Lu # CYRILLIC CAPITAL LETTER UK -047A ; Lu # CYRILLIC CAPITAL LETTER ROUND OMEGA -047C ; Lu # CYRILLIC CAPITAL LETTER OMEGA WITH TITLO -047E ; Lu # CYRILLIC CAPITAL LETTER OT -0480 ; Lu # CYRILLIC CAPITAL LETTER KOPPA -048A ; Lu # CYRILLIC CAPITAL LETTER SHORT I WITH TAIL -048C ; Lu # CYRILLIC CAPITAL LETTER SEMISOFT SIGN -048E ; Lu # CYRILLIC CAPITAL LETTER ER WITH TICK -0490 ; Lu # CYRILLIC CAPITAL LETTER GHE WITH UPTURN -0492 ; Lu # CYRILLIC CAPITAL LETTER GHE WITH STROKE -0494 ; Lu # CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK -0496 ; Lu # CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER -0498 ; Lu # CYRILLIC CAPITAL LETTER ZE WITH DESCENDER -049A ; Lu # CYRILLIC CAPITAL LETTER KA WITH DESCENDER -049C ; Lu # CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE -049E ; Lu # CYRILLIC CAPITAL LETTER KA WITH STROKE -04A0 ; Lu # CYRILLIC CAPITAL LETTER BASHKIR KA -04A2 ; Lu # CYRILLIC CAPITAL LETTER EN WITH DESCENDER -04A4 ; Lu # CYRILLIC CAPITAL LIGATURE EN GHE -04A6 ; Lu # CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK -04A8 ; Lu # CYRILLIC CAPITAL LETTER ABKHASIAN HA -04AA ; Lu # CYRILLIC CAPITAL LETTER ES WITH DESCENDER -04AC ; Lu # CYRILLIC CAPITAL LETTER TE WITH DESCENDER -04AE ; Lu # CYRILLIC CAPITAL LETTER STRAIGHT U -04B0 ; Lu # CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE -04B2 ; Lu # CYRILLIC CAPITAL LETTER HA WITH DESCENDER -04B4 ; Lu # CYRILLIC CAPITAL LIGATURE TE TSE -04B6 ; Lu # CYRILLIC CAPITAL LETTER CHE WITH DESCENDER -04B8 ; Lu # CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE -04BA ; Lu # CYRILLIC CAPITAL LETTER SHHA -04BC ; Lu # CYRILLIC CAPITAL LETTER ABKHASIAN CHE -04BE ; Lu # CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER -04C0..04C1 ; Lu # [2] CYRILLIC LETTER PALOCHKA..CYRILLIC CAPITAL LETTER ZHE WITH BREVE -04C3 ; Lu # CYRILLIC CAPITAL LETTER KA WITH HOOK -04C5 ; Lu # CYRILLIC CAPITAL LETTER EL WITH TAIL -04C7 ; Lu # CYRILLIC CAPITAL LETTER EN WITH HOOK -04C9 ; Lu # CYRILLIC CAPITAL LETTER EN WITH TAIL -04CB ; Lu # CYRILLIC CAPITAL LETTER KHAKASSIAN CHE -04CD ; Lu # CYRILLIC CAPITAL LETTER EM WITH TAIL -04D0 ; Lu # CYRILLIC CAPITAL LETTER A WITH BREVE -04D2 ; Lu # CYRILLIC CAPITAL LETTER A WITH DIAERESIS -04D4 ; Lu # CYRILLIC CAPITAL LIGATURE A IE -04D6 ; Lu # CYRILLIC CAPITAL LETTER IE WITH BREVE -04D8 ; Lu # CYRILLIC CAPITAL LETTER SCHWA -04DA ; Lu # CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS -04DC ; Lu # CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS -04DE ; Lu # CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS -04E0 ; Lu # CYRILLIC CAPITAL LETTER ABKHASIAN DZE -04E2 ; Lu # CYRILLIC CAPITAL LETTER I WITH MACRON -04E4 ; Lu # CYRILLIC CAPITAL LETTER I WITH DIAERESIS -04E6 ; Lu # CYRILLIC CAPITAL LETTER O WITH DIAERESIS -04E8 ; Lu # CYRILLIC CAPITAL LETTER BARRED O -04EA ; Lu # CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS -04EC ; Lu # CYRILLIC CAPITAL LETTER E WITH DIAERESIS -04EE ; Lu # CYRILLIC CAPITAL LETTER U WITH MACRON -04F0 ; Lu # CYRILLIC CAPITAL LETTER U WITH DIAERESIS -04F2 ; Lu # CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE -04F4 ; Lu # CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS -04F6 ; Lu # CYRILLIC CAPITAL LETTER GHE WITH DESCENDER -04F8 ; Lu # CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS -04FA ; Lu # CYRILLIC CAPITAL LETTER GHE WITH STROKE AND HOOK -04FC ; Lu # CYRILLIC CAPITAL LETTER HA WITH HOOK -04FE ; Lu # CYRILLIC CAPITAL LETTER HA WITH STROKE -0500 ; Lu # CYRILLIC CAPITAL LETTER KOMI DE -0502 ; Lu # CYRILLIC CAPITAL LETTER KOMI DJE -0504 ; Lu # CYRILLIC CAPITAL LETTER KOMI ZJE -0506 ; Lu # CYRILLIC CAPITAL LETTER KOMI DZJE -0508 ; Lu # CYRILLIC CAPITAL LETTER KOMI LJE -050A ; Lu # CYRILLIC CAPITAL LETTER KOMI NJE -050C ; Lu # CYRILLIC CAPITAL LETTER KOMI SJE -050E ; Lu # CYRILLIC CAPITAL LETTER KOMI TJE -0510 ; Lu # CYRILLIC CAPITAL LETTER REVERSED ZE -0512 ; Lu # CYRILLIC CAPITAL LETTER EL WITH HOOK -0514 ; Lu # CYRILLIC CAPITAL LETTER LHA -0516 ; Lu # CYRILLIC CAPITAL LETTER RHA -0518 ; Lu # CYRILLIC CAPITAL LETTER YAE -051A ; Lu # CYRILLIC CAPITAL LETTER QA -051C ; Lu # CYRILLIC CAPITAL LETTER WE -051E ; Lu # CYRILLIC CAPITAL LETTER ALEUT KA -0520 ; Lu # CYRILLIC CAPITAL LETTER EL WITH MIDDLE HOOK -0522 ; Lu # CYRILLIC CAPITAL LETTER EN WITH MIDDLE HOOK -0531..0556 ; Lu # [38] ARMENIAN CAPITAL LETTER AYB..ARMENIAN CAPITAL LETTER FEH -10A0..10C5 ; Lu # [38] GEORGIAN CAPITAL LETTER AN..GEORGIAN CAPITAL LETTER HOE -1E00 ; Lu # LATIN CAPITAL LETTER A WITH RING BELOW -1E02 ; Lu # LATIN CAPITAL LETTER B WITH DOT ABOVE -1E04 ; Lu # LATIN CAPITAL LETTER B WITH DOT BELOW -1E06 ; Lu # LATIN CAPITAL LETTER B WITH LINE BELOW -1E08 ; Lu # LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE -1E0A ; Lu # LATIN CAPITAL LETTER D WITH DOT ABOVE -1E0C ; Lu # LATIN CAPITAL LETTER D WITH DOT BELOW -1E0E ; Lu # LATIN CAPITAL LETTER D WITH LINE BELOW -1E10 ; Lu # LATIN CAPITAL LETTER D WITH CEDILLA -1E12 ; Lu # LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW -1E14 ; Lu # LATIN CAPITAL LETTER E WITH MACRON AND GRAVE -1E16 ; Lu # LATIN CAPITAL LETTER E WITH MACRON AND ACUTE -1E18 ; Lu # LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW -1E1A ; Lu # LATIN CAPITAL LETTER E WITH TILDE BELOW -1E1C ; Lu # LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE -1E1E ; Lu # LATIN CAPITAL LETTER F WITH DOT ABOVE -1E20 ; Lu # LATIN CAPITAL LETTER G WITH MACRON -1E22 ; Lu # LATIN CAPITAL LETTER H WITH DOT ABOVE -1E24 ; Lu # LATIN CAPITAL LETTER H WITH DOT BELOW -1E26 ; Lu # LATIN CAPITAL LETTER H WITH DIAERESIS -1E28 ; Lu # LATIN CAPITAL LETTER H WITH CEDILLA -1E2A ; Lu # LATIN CAPITAL LETTER H WITH BREVE BELOW -1E2C ; Lu # LATIN CAPITAL LETTER I WITH TILDE BELOW -1E2E ; Lu # LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE -1E30 ; Lu # LATIN CAPITAL LETTER K WITH ACUTE -1E32 ; Lu # LATIN CAPITAL LETTER K WITH DOT BELOW -1E34 ; Lu # LATIN CAPITAL LETTER K WITH LINE BELOW -1E36 ; Lu # LATIN CAPITAL LETTER L WITH DOT BELOW -1E38 ; Lu # LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON -1E3A ; Lu # LATIN CAPITAL LETTER L WITH LINE BELOW -1E3C ; Lu # LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW -1E3E ; Lu # LATIN CAPITAL LETTER M WITH ACUTE -1E40 ; Lu # LATIN CAPITAL LETTER M WITH DOT ABOVE -1E42 ; Lu # LATIN CAPITAL LETTER M WITH DOT BELOW -1E44 ; Lu # LATIN CAPITAL LETTER N WITH DOT ABOVE -1E46 ; Lu # LATIN CAPITAL LETTER N WITH DOT BELOW -1E48 ; Lu # LATIN CAPITAL LETTER N WITH LINE BELOW -1E4A ; Lu # LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW -1E4C ; Lu # LATIN CAPITAL LETTER O WITH TILDE AND ACUTE -1E4E ; Lu # LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS -1E50 ; Lu # LATIN CAPITAL LETTER O WITH MACRON AND GRAVE -1E52 ; Lu # LATIN CAPITAL LETTER O WITH MACRON AND ACUTE -1E54 ; Lu # LATIN CAPITAL LETTER P WITH ACUTE -1E56 ; Lu # LATIN CAPITAL LETTER P WITH DOT ABOVE -1E58 ; Lu # LATIN CAPITAL LETTER R WITH DOT ABOVE -1E5A ; Lu # LATIN CAPITAL LETTER R WITH DOT BELOW -1E5C ; Lu # LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON -1E5E ; Lu # LATIN CAPITAL LETTER R WITH LINE BELOW -1E60 ; Lu # LATIN CAPITAL LETTER S WITH DOT ABOVE -1E62 ; Lu # LATIN CAPITAL LETTER S WITH DOT BELOW -1E64 ; Lu # LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE -1E66 ; Lu # LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE -1E68 ; Lu # LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE -1E6A ; Lu # LATIN CAPITAL LETTER T WITH DOT ABOVE -1E6C ; Lu # LATIN CAPITAL LETTER T WITH DOT BELOW -1E6E ; Lu # LATIN CAPITAL LETTER T WITH LINE BELOW -1E70 ; Lu # LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW -1E72 ; Lu # LATIN CAPITAL LETTER U WITH DIAERESIS BELOW -1E74 ; Lu # LATIN CAPITAL LETTER U WITH TILDE BELOW -1E76 ; Lu # LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW -1E78 ; Lu # LATIN CAPITAL LETTER U WITH TILDE AND ACUTE -1E7A ; Lu # LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS -1E7C ; Lu # LATIN CAPITAL LETTER V WITH TILDE -1E7E ; Lu # LATIN CAPITAL LETTER V WITH DOT BELOW -1E80 ; Lu # LATIN CAPITAL LETTER W WITH GRAVE -1E82 ; Lu # LATIN CAPITAL LETTER W WITH ACUTE -1E84 ; Lu # LATIN CAPITAL LETTER W WITH DIAERESIS -1E86 ; Lu # LATIN CAPITAL LETTER W WITH DOT ABOVE -1E88 ; Lu # LATIN CAPITAL LETTER W WITH DOT BELOW -1E8A ; Lu # LATIN CAPITAL LETTER X WITH DOT ABOVE -1E8C ; Lu # LATIN CAPITAL LETTER X WITH DIAERESIS -1E8E ; Lu # LATIN CAPITAL LETTER Y WITH DOT ABOVE -1E90 ; Lu # LATIN CAPITAL LETTER Z WITH CIRCUMFLEX -1E92 ; Lu # LATIN CAPITAL LETTER Z WITH DOT BELOW -1E94 ; Lu # LATIN CAPITAL LETTER Z WITH LINE BELOW -1E9E ; Lu # LATIN CAPITAL LETTER SHARP S -1EA0 ; Lu # LATIN CAPITAL LETTER A WITH DOT BELOW -1EA2 ; Lu # LATIN CAPITAL LETTER A WITH HOOK ABOVE -1EA4 ; Lu # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE -1EA6 ; Lu # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE -1EA8 ; Lu # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE -1EAA ; Lu # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE -1EAC ; Lu # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW -1EAE ; Lu # LATIN CAPITAL LETTER A WITH BREVE AND ACUTE -1EB0 ; Lu # LATIN CAPITAL LETTER A WITH BREVE AND GRAVE -1EB2 ; Lu # LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE -1EB4 ; Lu # LATIN CAPITAL LETTER A WITH BREVE AND TILDE -1EB6 ; Lu # LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW -1EB8 ; Lu # LATIN CAPITAL LETTER E WITH DOT BELOW -1EBA ; Lu # LATIN CAPITAL LETTER E WITH HOOK ABOVE -1EBC ; Lu # LATIN CAPITAL LETTER E WITH TILDE -1EBE ; Lu # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE -1EC0 ; Lu # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE -1EC2 ; Lu # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE -1EC4 ; Lu # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE -1EC6 ; Lu # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW -1EC8 ; Lu # LATIN CAPITAL LETTER I WITH HOOK ABOVE -1ECA ; Lu # LATIN CAPITAL LETTER I WITH DOT BELOW -1ECC ; Lu # LATIN CAPITAL LETTER O WITH DOT BELOW -1ECE ; Lu # LATIN CAPITAL LETTER O WITH HOOK ABOVE -1ED0 ; Lu # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE -1ED2 ; Lu # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE -1ED4 ; Lu # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE -1ED6 ; Lu # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE -1ED8 ; Lu # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW -1EDA ; Lu # LATIN CAPITAL LETTER O WITH HORN AND ACUTE -1EDC ; Lu # LATIN CAPITAL LETTER O WITH HORN AND GRAVE -1EDE ; Lu # LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE -1EE0 ; Lu # LATIN CAPITAL LETTER O WITH HORN AND TILDE -1EE2 ; Lu # LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW -1EE4 ; Lu # LATIN CAPITAL LETTER U WITH DOT BELOW -1EE6 ; Lu # LATIN CAPITAL LETTER U WITH HOOK ABOVE -1EE8 ; Lu # LATIN CAPITAL LETTER U WITH HORN AND ACUTE -1EEA ; Lu # LATIN CAPITAL LETTER U WITH HORN AND GRAVE -1EEC ; Lu # LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE -1EEE ; Lu # LATIN CAPITAL LETTER U WITH HORN AND TILDE -1EF0 ; Lu # LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW -1EF2 ; Lu # LATIN CAPITAL LETTER Y WITH GRAVE -1EF4 ; Lu # LATIN CAPITAL LETTER Y WITH DOT BELOW -1EF6 ; Lu # LATIN CAPITAL LETTER Y WITH HOOK ABOVE -1EF8 ; Lu # LATIN CAPITAL LETTER Y WITH TILDE -1EFA ; Lu # LATIN CAPITAL LETTER MIDDLE-WELSH LL -1EFC ; Lu # LATIN CAPITAL LETTER MIDDLE-WELSH V -1EFE ; Lu # LATIN CAPITAL LETTER Y WITH LOOP -1F08..1F0F ; Lu # [8] GREEK CAPITAL LETTER ALPHA WITH PSILI..GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI -1F18..1F1D ; Lu # [6] GREEK CAPITAL LETTER EPSILON WITH PSILI..GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA -1F28..1F2F ; Lu # [8] GREEK CAPITAL LETTER ETA WITH PSILI..GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI -1F38..1F3F ; Lu # [8] GREEK CAPITAL LETTER IOTA WITH PSILI..GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI -1F48..1F4D ; Lu # [6] GREEK CAPITAL LETTER OMICRON WITH PSILI..GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA -1F59 ; Lu # GREEK CAPITAL LETTER UPSILON WITH DASIA -1F5B ; Lu # GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA -1F5D ; Lu # GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA -1F5F ; Lu # GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI -1F68..1F6F ; Lu # [8] GREEK CAPITAL LETTER OMEGA WITH PSILI..GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI -1FB8..1FBB ; Lu # [4] GREEK CAPITAL LETTER ALPHA WITH VRACHY..GREEK CAPITAL LETTER ALPHA WITH OXIA -1FC8..1FCB ; Lu # [4] GREEK CAPITAL LETTER EPSILON WITH VARIA..GREEK CAPITAL LETTER ETA WITH OXIA -1FD8..1FDB ; Lu # [4] GREEK CAPITAL LETTER IOTA WITH VRACHY..GREEK CAPITAL LETTER IOTA WITH OXIA -1FE8..1FEC ; Lu # [5] GREEK CAPITAL LETTER UPSILON WITH VRACHY..GREEK CAPITAL LETTER RHO WITH DASIA -1FF8..1FFB ; Lu # [4] GREEK CAPITAL LETTER OMICRON WITH VARIA..GREEK CAPITAL LETTER OMEGA WITH OXIA -2102 ; Lu # DOUBLE-STRUCK CAPITAL C -2107 ; Lu # EULER CONSTANT -210B..210D ; Lu # [3] SCRIPT CAPITAL H..DOUBLE-STRUCK CAPITAL H -2110..2112 ; Lu # [3] SCRIPT CAPITAL I..SCRIPT CAPITAL L -2115 ; Lu # DOUBLE-STRUCK CAPITAL N -2119..211D ; Lu # [5] DOUBLE-STRUCK CAPITAL P..DOUBLE-STRUCK CAPITAL R -2124 ; Lu # DOUBLE-STRUCK CAPITAL Z -2126 ; Lu # OHM SIGN -2128 ; Lu # BLACK-LETTER CAPITAL Z -212A..212D ; Lu # [4] KELVIN SIGN..BLACK-LETTER CAPITAL C -2130..2133 ; Lu # [4] SCRIPT CAPITAL E..SCRIPT CAPITAL M -213E..213F ; Lu # [2] DOUBLE-STRUCK CAPITAL GAMMA..DOUBLE-STRUCK CAPITAL PI -2145 ; Lu # DOUBLE-STRUCK ITALIC CAPITAL D -2183 ; Lu # ROMAN NUMERAL REVERSED ONE HUNDRED -2C00..2C2E ; Lu # [47] GLAGOLITIC CAPITAL LETTER AZU..GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE -2C60 ; Lu # LATIN CAPITAL LETTER L WITH DOUBLE BAR -2C62..2C64 ; Lu # [3] LATIN CAPITAL LETTER L WITH MIDDLE TILDE..LATIN CAPITAL LETTER R WITH TAIL -2C67 ; Lu # LATIN CAPITAL LETTER H WITH DESCENDER -2C69 ; Lu # LATIN CAPITAL LETTER K WITH DESCENDER -2C6B ; Lu # LATIN CAPITAL LETTER Z WITH DESCENDER -2C6D..2C6F ; Lu # [3] LATIN CAPITAL LETTER ALPHA..LATIN CAPITAL LETTER TURNED A -2C72 ; Lu # LATIN CAPITAL LETTER W WITH HOOK -2C75 ; Lu # LATIN CAPITAL LETTER HALF H -2C80 ; Lu # COPTIC CAPITAL LETTER ALFA -2C82 ; Lu # COPTIC CAPITAL LETTER VIDA -2C84 ; Lu # COPTIC CAPITAL LETTER GAMMA -2C86 ; Lu # COPTIC CAPITAL LETTER DALDA -2C88 ; Lu # COPTIC CAPITAL LETTER EIE -2C8A ; Lu # COPTIC CAPITAL LETTER SOU -2C8C ; Lu # COPTIC CAPITAL LETTER ZATA -2C8E ; Lu # COPTIC CAPITAL LETTER HATE -2C90 ; Lu # COPTIC CAPITAL LETTER THETHE -2C92 ; Lu # COPTIC CAPITAL LETTER IAUDA -2C94 ; Lu # COPTIC CAPITAL LETTER KAPA -2C96 ; Lu # COPTIC CAPITAL LETTER LAULA -2C98 ; Lu # COPTIC CAPITAL LETTER MI -2C9A ; Lu # COPTIC CAPITAL LETTER NI -2C9C ; Lu # COPTIC CAPITAL LETTER KSI -2C9E ; Lu # COPTIC CAPITAL LETTER O -2CA0 ; Lu # COPTIC CAPITAL LETTER PI -2CA2 ; Lu # COPTIC CAPITAL LETTER RO -2CA4 ; Lu # COPTIC CAPITAL LETTER SIMA -2CA6 ; Lu # COPTIC CAPITAL LETTER TAU -2CA8 ; Lu # COPTIC CAPITAL LETTER UA -2CAA ; Lu # COPTIC CAPITAL LETTER FI -2CAC ; Lu # COPTIC CAPITAL LETTER KHI -2CAE ; Lu # COPTIC CAPITAL LETTER PSI -2CB0 ; Lu # COPTIC CAPITAL LETTER OOU -2CB2 ; Lu # COPTIC CAPITAL LETTER DIALECT-P ALEF -2CB4 ; Lu # COPTIC CAPITAL LETTER OLD COPTIC AIN -2CB6 ; Lu # COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE -2CB8 ; Lu # COPTIC CAPITAL LETTER DIALECT-P KAPA -2CBA ; Lu # COPTIC CAPITAL LETTER DIALECT-P NI -2CBC ; Lu # COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI -2CBE ; Lu # COPTIC CAPITAL LETTER OLD COPTIC OOU -2CC0 ; Lu # COPTIC CAPITAL LETTER SAMPI -2CC2 ; Lu # COPTIC CAPITAL LETTER CROSSED SHEI -2CC4 ; Lu # COPTIC CAPITAL LETTER OLD COPTIC SHEI -2CC6 ; Lu # COPTIC CAPITAL LETTER OLD COPTIC ESH -2CC8 ; Lu # COPTIC CAPITAL LETTER AKHMIMIC KHEI -2CCA ; Lu # COPTIC CAPITAL LETTER DIALECT-P HORI -2CCC ; Lu # COPTIC CAPITAL LETTER OLD COPTIC HORI -2CCE ; Lu # COPTIC CAPITAL LETTER OLD COPTIC HA -2CD0 ; Lu # COPTIC CAPITAL LETTER L-SHAPED HA -2CD2 ; Lu # COPTIC CAPITAL LETTER OLD COPTIC HEI -2CD4 ; Lu # COPTIC CAPITAL LETTER OLD COPTIC HAT -2CD6 ; Lu # COPTIC CAPITAL LETTER OLD COPTIC GANGIA -2CD8 ; Lu # COPTIC CAPITAL LETTER OLD COPTIC DJA -2CDA ; Lu # COPTIC CAPITAL LETTER OLD COPTIC SHIMA -2CDC ; Lu # COPTIC CAPITAL LETTER OLD NUBIAN SHIMA -2CDE ; Lu # COPTIC CAPITAL LETTER OLD NUBIAN NGI -2CE0 ; Lu # COPTIC CAPITAL LETTER OLD NUBIAN NYI -2CE2 ; Lu # COPTIC CAPITAL LETTER OLD NUBIAN WAU -A640 ; Lu # CYRILLIC CAPITAL LETTER ZEMLYA -A642 ; Lu # CYRILLIC CAPITAL LETTER DZELO -A644 ; Lu # CYRILLIC CAPITAL LETTER REVERSED DZE -A646 ; Lu # CYRILLIC CAPITAL LETTER IOTA -A648 ; Lu # CYRILLIC CAPITAL LETTER DJERV -A64A ; Lu # CYRILLIC CAPITAL LETTER MONOGRAPH UK -A64C ; Lu # CYRILLIC CAPITAL LETTER BROAD OMEGA -A64E ; Lu # CYRILLIC CAPITAL LETTER NEUTRAL YER -A650 ; Lu # CYRILLIC CAPITAL LETTER YERU WITH BACK YER -A652 ; Lu # CYRILLIC CAPITAL LETTER IOTIFIED YAT -A654 ; Lu # CYRILLIC CAPITAL LETTER REVERSED YU -A656 ; Lu # CYRILLIC CAPITAL LETTER IOTIFIED A -A658 ; Lu # CYRILLIC CAPITAL LETTER CLOSED LITTLE YUS -A65A ; Lu # CYRILLIC CAPITAL LETTER BLENDED YUS -A65C ; Lu # CYRILLIC CAPITAL LETTER IOTIFIED CLOSED LITTLE YUS -A65E ; Lu # CYRILLIC CAPITAL LETTER YN -A662 ; Lu # CYRILLIC CAPITAL LETTER SOFT DE -A664 ; Lu # CYRILLIC CAPITAL LETTER SOFT EL -A666 ; Lu # CYRILLIC CAPITAL LETTER SOFT EM -A668 ; Lu # CYRILLIC CAPITAL LETTER MONOCULAR O -A66A ; Lu # CYRILLIC CAPITAL LETTER BINOCULAR O -A66C ; Lu # CYRILLIC CAPITAL LETTER DOUBLE MONOCULAR O -A680 ; Lu # CYRILLIC CAPITAL LETTER DWE -A682 ; Lu # CYRILLIC CAPITAL LETTER DZWE -A684 ; Lu # CYRILLIC CAPITAL LETTER ZHWE -A686 ; Lu # CYRILLIC CAPITAL LETTER CCHE -A688 ; Lu # CYRILLIC CAPITAL LETTER DZZE -A68A ; Lu # CYRILLIC CAPITAL LETTER TE WITH MIDDLE HOOK -A68C ; Lu # CYRILLIC CAPITAL LETTER TWE -A68E ; Lu # CYRILLIC CAPITAL LETTER TSWE -A690 ; Lu # CYRILLIC CAPITAL LETTER TSSE -A692 ; Lu # CYRILLIC CAPITAL LETTER TCHE -A694 ; Lu # CYRILLIC CAPITAL LETTER HWE -A696 ; Lu # CYRILLIC CAPITAL LETTER SHWE -A722 ; Lu # LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF -A724 ; Lu # LATIN CAPITAL LETTER EGYPTOLOGICAL AIN -A726 ; Lu # LATIN CAPITAL LETTER HENG -A728 ; Lu # LATIN CAPITAL LETTER TZ -A72A ; Lu # LATIN CAPITAL LETTER TRESILLO -A72C ; Lu # LATIN CAPITAL LETTER CUATRILLO -A72E ; Lu # LATIN CAPITAL LETTER CUATRILLO WITH COMMA -A732 ; Lu # LATIN CAPITAL LETTER AA -A734 ; Lu # LATIN CAPITAL LETTER AO -A736 ; Lu # LATIN CAPITAL LETTER AU -A738 ; Lu # LATIN CAPITAL LETTER AV -A73A ; Lu # LATIN CAPITAL LETTER AV WITH HORIZONTAL BAR -A73C ; Lu # LATIN CAPITAL LETTER AY -A73E ; Lu # LATIN CAPITAL LETTER REVERSED C WITH DOT -A740 ; Lu # LATIN CAPITAL LETTER K WITH STROKE -A742 ; Lu # LATIN CAPITAL LETTER K WITH DIAGONAL STROKE -A744 ; Lu # LATIN CAPITAL LETTER K WITH STROKE AND DIAGONAL STROKE -A746 ; Lu # LATIN CAPITAL LETTER BROKEN L -A748 ; Lu # LATIN CAPITAL LETTER L WITH HIGH STROKE -A74A ; Lu # LATIN CAPITAL LETTER O WITH LONG STROKE OVERLAY -A74C ; Lu # LATIN CAPITAL LETTER O WITH LOOP -A74E ; Lu # LATIN CAPITAL LETTER OO -A750 ; Lu # LATIN CAPITAL LETTER P WITH STROKE THROUGH DESCENDER -A752 ; Lu # LATIN CAPITAL LETTER P WITH FLOURISH -A754 ; Lu # LATIN CAPITAL LETTER P WITH SQUIRREL TAIL -A756 ; Lu # LATIN CAPITAL LETTER Q WITH STROKE THROUGH DESCENDER -A758 ; Lu # LATIN CAPITAL LETTER Q WITH DIAGONAL STROKE -A75A ; Lu # LATIN CAPITAL LETTER R ROTUNDA -A75C ; Lu # LATIN CAPITAL LETTER RUM ROTUNDA -A75E ; Lu # LATIN CAPITAL LETTER V WITH DIAGONAL STROKE -A760 ; Lu # LATIN CAPITAL LETTER VY -A762 ; Lu # LATIN CAPITAL LETTER VISIGOTHIC Z -A764 ; Lu # LATIN CAPITAL LETTER THORN WITH STROKE -A766 ; Lu # LATIN CAPITAL LETTER THORN WITH STROKE THROUGH DESCENDER -A768 ; Lu # LATIN CAPITAL LETTER VEND -A76A ; Lu # LATIN CAPITAL LETTER ET -A76C ; Lu # LATIN CAPITAL LETTER IS -A76E ; Lu # LATIN CAPITAL LETTER CON -A779 ; Lu # LATIN CAPITAL LETTER INSULAR D -A77B ; Lu # LATIN CAPITAL LETTER INSULAR F -A77D..A77E ; Lu # [2] LATIN CAPITAL LETTER INSULAR G..LATIN CAPITAL LETTER TURNED INSULAR G -A780 ; Lu # LATIN CAPITAL LETTER TURNED L -A782 ; Lu # LATIN CAPITAL LETTER INSULAR R -A784 ; Lu # LATIN CAPITAL LETTER INSULAR S -A786 ; Lu # LATIN CAPITAL LETTER INSULAR T -A78B ; Lu # LATIN CAPITAL LETTER SALTILLO -FF21..FF3A ; Lu # [26] FULLWIDTH LATIN CAPITAL LETTER A..FULLWIDTH LATIN CAPITAL LETTER Z -10400..10427 ; Lu # [40] DESERET CAPITAL LETTER LONG I..DESERET CAPITAL LETTER EW -1D400..1D419 ; Lu # [26] MATHEMATICAL BOLD CAPITAL A..MATHEMATICAL BOLD CAPITAL Z -1D434..1D44D ; Lu # [26] MATHEMATICAL ITALIC CAPITAL A..MATHEMATICAL ITALIC CAPITAL Z -1D468..1D481 ; Lu # [26] MATHEMATICAL BOLD ITALIC CAPITAL A..MATHEMATICAL BOLD ITALIC CAPITAL Z -1D49C ; Lu # MATHEMATICAL SCRIPT CAPITAL A -1D49E..1D49F ; Lu # [2] MATHEMATICAL SCRIPT CAPITAL C..MATHEMATICAL SCRIPT CAPITAL D -1D4A2 ; Lu # MATHEMATICAL SCRIPT CAPITAL G -1D4A5..1D4A6 ; Lu # [2] MATHEMATICAL SCRIPT CAPITAL J..MATHEMATICAL SCRIPT CAPITAL K -1D4A9..1D4AC ; Lu # [4] MATHEMATICAL SCRIPT CAPITAL N..MATHEMATICAL SCRIPT CAPITAL Q -1D4AE..1D4B5 ; Lu # [8] MATHEMATICAL SCRIPT CAPITAL S..MATHEMATICAL SCRIPT CAPITAL Z -1D4D0..1D4E9 ; Lu # [26] MATHEMATICAL BOLD SCRIPT CAPITAL A..MATHEMATICAL BOLD SCRIPT CAPITAL Z -1D504..1D505 ; Lu # [2] MATHEMATICAL FRAKTUR CAPITAL A..MATHEMATICAL FRAKTUR CAPITAL B -1D507..1D50A ; Lu # [4] MATHEMATICAL FRAKTUR CAPITAL D..MATHEMATICAL FRAKTUR CAPITAL G -1D50D..1D514 ; Lu # [8] MATHEMATICAL FRAKTUR CAPITAL J..MATHEMATICAL FRAKTUR CAPITAL Q -1D516..1D51C ; Lu # [7] MATHEMATICAL FRAKTUR CAPITAL S..MATHEMATICAL FRAKTUR CAPITAL Y -1D538..1D539 ; Lu # [2] MATHEMATICAL DOUBLE-STRUCK CAPITAL A..MATHEMATICAL DOUBLE-STRUCK CAPITAL B -1D53B..1D53E ; Lu # [4] MATHEMATICAL DOUBLE-STRUCK CAPITAL D..MATHEMATICAL DOUBLE-STRUCK CAPITAL G -1D540..1D544 ; Lu # [5] MATHEMATICAL DOUBLE-STRUCK CAPITAL I..MATHEMATICAL DOUBLE-STRUCK CAPITAL M -1D546 ; Lu # MATHEMATICAL DOUBLE-STRUCK CAPITAL O -1D54A..1D550 ; Lu # [7] MATHEMATICAL DOUBLE-STRUCK CAPITAL S..MATHEMATICAL DOUBLE-STRUCK CAPITAL Y -1D56C..1D585 ; Lu # [26] MATHEMATICAL BOLD FRAKTUR CAPITAL A..MATHEMATICAL BOLD FRAKTUR CAPITAL Z -1D5A0..1D5B9 ; Lu # [26] MATHEMATICAL SANS-SERIF CAPITAL A..MATHEMATICAL SANS-SERIF CAPITAL Z -1D5D4..1D5ED ; Lu # [26] MATHEMATICAL SANS-SERIF BOLD CAPITAL A..MATHEMATICAL SANS-SERIF BOLD CAPITAL Z -1D608..1D621 ; Lu # [26] MATHEMATICAL SANS-SERIF ITALIC CAPITAL A..MATHEMATICAL SANS-SERIF ITALIC CAPITAL Z -1D63C..1D655 ; Lu # [26] MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL A..MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Z -1D670..1D689 ; Lu # [26] MATHEMATICAL MONOSPACE CAPITAL A..MATHEMATICAL MONOSPACE CAPITAL Z -1D6A8..1D6C0 ; Lu # [25] MATHEMATICAL BOLD CAPITAL ALPHA..MATHEMATICAL BOLD CAPITAL OMEGA -1D6E2..1D6FA ; Lu # [25] MATHEMATICAL ITALIC CAPITAL ALPHA..MATHEMATICAL ITALIC CAPITAL OMEGA -1D71C..1D734 ; Lu # [25] MATHEMATICAL BOLD ITALIC CAPITAL ALPHA..MATHEMATICAL BOLD ITALIC CAPITAL OMEGA -1D756..1D76E ; Lu # [25] MATHEMATICAL SANS-SERIF BOLD CAPITAL ALPHA..MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA -1D790..1D7A8 ; Lu # [25] MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ALPHA..MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA -1D7CA ; Lu # MATHEMATICAL BOLD CAPITAL DIGAMMA - -# Total code points: 1421 - -# ================================================ - -# General_Category=Lowercase_Letter - -0061..007A ; Ll # [26] LATIN SMALL LETTER A..LATIN SMALL LETTER Z -00AA ; Ll # FEMININE ORDINAL INDICATOR -00B5 ; Ll # MICRO SIGN -00BA ; Ll # MASCULINE ORDINAL INDICATOR -00DF..00F6 ; Ll # [24] LATIN SMALL LETTER SHARP S..LATIN SMALL LETTER O WITH DIAERESIS -00F8..00FF ; Ll # [8] LATIN SMALL LETTER O WITH STROKE..LATIN SMALL LETTER Y WITH DIAERESIS -0101 ; Ll # LATIN SMALL LETTER A WITH MACRON -0103 ; Ll # LATIN SMALL LETTER A WITH BREVE -0105 ; Ll # LATIN SMALL LETTER A WITH OGONEK -0107 ; Ll # LATIN SMALL LETTER C WITH ACUTE -0109 ; Ll # LATIN SMALL LETTER C WITH CIRCUMFLEX -010B ; Ll # LATIN SMALL LETTER C WITH DOT ABOVE -010D ; Ll # LATIN SMALL LETTER C WITH CARON -010F ; Ll # LATIN SMALL LETTER D WITH CARON -0111 ; Ll # LATIN SMALL LETTER D WITH STROKE -0113 ; Ll # LATIN SMALL LETTER E WITH MACRON -0115 ; Ll # LATIN SMALL LETTER E WITH BREVE -0117 ; Ll # LATIN SMALL LETTER E WITH DOT ABOVE -0119 ; Ll # LATIN SMALL LETTER E WITH OGONEK -011B ; Ll # LATIN SMALL LETTER E WITH CARON -011D ; Ll # LATIN SMALL LETTER G WITH CIRCUMFLEX -011F ; Ll # LATIN SMALL LETTER G WITH BREVE -0121 ; Ll # LATIN SMALL LETTER G WITH DOT ABOVE -0123 ; Ll # LATIN SMALL LETTER G WITH CEDILLA -0125 ; Ll # LATIN SMALL LETTER H WITH CIRCUMFLEX -0127 ; Ll # LATIN SMALL LETTER H WITH STROKE -0129 ; Ll # LATIN SMALL LETTER I WITH TILDE -012B ; Ll # LATIN SMALL LETTER I WITH MACRON -012D ; Ll # LATIN SMALL LETTER I WITH BREVE -012F ; Ll # LATIN SMALL LETTER I WITH OGONEK -0131 ; Ll # LATIN SMALL LETTER DOTLESS I -0133 ; Ll # LATIN SMALL LIGATURE IJ -0135 ; Ll # LATIN SMALL LETTER J WITH CIRCUMFLEX -0137..0138 ; Ll # [2] LATIN SMALL LETTER K WITH CEDILLA..LATIN SMALL LETTER KRA -013A ; Ll # LATIN SMALL LETTER L WITH ACUTE -013C ; Ll # LATIN SMALL LETTER L WITH CEDILLA -013E ; Ll # LATIN SMALL LETTER L WITH CARON -0140 ; Ll # LATIN SMALL LETTER L WITH MIDDLE DOT -0142 ; Ll # LATIN SMALL LETTER L WITH STROKE -0144 ; Ll # LATIN SMALL LETTER N WITH ACUTE -0146 ; Ll # LATIN SMALL LETTER N WITH CEDILLA -0148..0149 ; Ll # [2] LATIN SMALL LETTER N WITH CARON..LATIN SMALL LETTER N PRECEDED BY APOSTROPHE -014B ; Ll # LATIN SMALL LETTER ENG -014D ; Ll # LATIN SMALL LETTER O WITH MACRON -014F ; Ll # LATIN SMALL LETTER O WITH BREVE -0151 ; Ll # LATIN SMALL LETTER O WITH DOUBLE ACUTE -0153 ; Ll # LATIN SMALL LIGATURE OE -0155 ; Ll # LATIN SMALL LETTER R WITH ACUTE -0157 ; Ll # LATIN SMALL LETTER R WITH CEDILLA -0159 ; Ll # LATIN SMALL LETTER R WITH CARON -015B ; Ll # LATIN SMALL LETTER S WITH ACUTE -015D ; Ll # LATIN SMALL LETTER S WITH CIRCUMFLEX -015F ; Ll # LATIN SMALL LETTER S WITH CEDILLA -0161 ; Ll # LATIN SMALL LETTER S WITH CARON -0163 ; Ll # LATIN SMALL LETTER T WITH CEDILLA -0165 ; Ll # LATIN SMALL LETTER T WITH CARON -0167 ; Ll # LATIN SMALL LETTER T WITH STROKE -0169 ; Ll # LATIN SMALL LETTER U WITH TILDE -016B ; Ll # LATIN SMALL LETTER U WITH MACRON -016D ; Ll # LATIN SMALL LETTER U WITH BREVE -016F ; Ll # LATIN SMALL LETTER U WITH RING ABOVE -0171 ; Ll # LATIN SMALL LETTER U WITH DOUBLE ACUTE -0173 ; Ll # LATIN SMALL LETTER U WITH OGONEK -0175 ; Ll # LATIN SMALL LETTER W WITH CIRCUMFLEX -0177 ; Ll # LATIN SMALL LETTER Y WITH CIRCUMFLEX -017A ; Ll # LATIN SMALL LETTER Z WITH ACUTE -017C ; Ll # LATIN SMALL LETTER Z WITH DOT ABOVE -017E..0180 ; Ll # [3] LATIN SMALL LETTER Z WITH CARON..LATIN SMALL LETTER B WITH STROKE -0183 ; Ll # LATIN SMALL LETTER B WITH TOPBAR -0185 ; Ll # LATIN SMALL LETTER TONE SIX -0188 ; Ll # LATIN SMALL LETTER C WITH HOOK -018C..018D ; Ll # [2] LATIN SMALL LETTER D WITH TOPBAR..LATIN SMALL LETTER TURNED DELTA -0192 ; Ll # LATIN SMALL LETTER F WITH HOOK -0195 ; Ll # LATIN SMALL LETTER HV -0199..019B ; Ll # [3] LATIN SMALL LETTER K WITH HOOK..LATIN SMALL LETTER LAMBDA WITH STROKE -019E ; Ll # LATIN SMALL LETTER N WITH LONG RIGHT LEG -01A1 ; Ll # LATIN SMALL LETTER O WITH HORN -01A3 ; Ll # LATIN SMALL LETTER OI -01A5 ; Ll # LATIN SMALL LETTER P WITH HOOK -01A8 ; Ll # LATIN SMALL LETTER TONE TWO -01AA..01AB ; Ll # [2] LATIN LETTER REVERSED ESH LOOP..LATIN SMALL LETTER T WITH PALATAL HOOK -01AD ; Ll # LATIN SMALL LETTER T WITH HOOK -01B0 ; Ll # LATIN SMALL LETTER U WITH HORN -01B4 ; Ll # LATIN SMALL LETTER Y WITH HOOK -01B6 ; Ll # LATIN SMALL LETTER Z WITH STROKE -01B9..01BA ; Ll # [2] LATIN SMALL LETTER EZH REVERSED..LATIN SMALL LETTER EZH WITH TAIL -01BD..01BF ; Ll # [3] LATIN SMALL LETTER TONE FIVE..LATIN LETTER WYNN -01C6 ; Ll # LATIN SMALL LETTER DZ WITH CARON -01C9 ; Ll # LATIN SMALL LETTER LJ -01CC ; Ll # LATIN SMALL LETTER NJ -01CE ; Ll # LATIN SMALL LETTER A WITH CARON -01D0 ; Ll # LATIN SMALL LETTER I WITH CARON -01D2 ; Ll # LATIN SMALL LETTER O WITH CARON -01D4 ; Ll # LATIN SMALL LETTER U WITH CARON -01D6 ; Ll # LATIN SMALL LETTER U WITH DIAERESIS AND MACRON -01D8 ; Ll # LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE -01DA ; Ll # LATIN SMALL LETTER U WITH DIAERESIS AND CARON -01DC..01DD ; Ll # [2] LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE..LATIN SMALL LETTER TURNED E -01DF ; Ll # LATIN SMALL LETTER A WITH DIAERESIS AND MACRON -01E1 ; Ll # LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON -01E3 ; Ll # LATIN SMALL LETTER AE WITH MACRON -01E5 ; Ll # LATIN SMALL LETTER G WITH STROKE -01E7 ; Ll # LATIN SMALL LETTER G WITH CARON -01E9 ; Ll # LATIN SMALL LETTER K WITH CARON -01EB ; Ll # LATIN SMALL LETTER O WITH OGONEK -01ED ; Ll # LATIN SMALL LETTER O WITH OGONEK AND MACRON -01EF..01F0 ; Ll # [2] LATIN SMALL LETTER EZH WITH CARON..LATIN SMALL LETTER J WITH CARON -01F3 ; Ll # LATIN SMALL LETTER DZ -01F5 ; Ll # LATIN SMALL LETTER G WITH ACUTE -01F9 ; Ll # LATIN SMALL LETTER N WITH GRAVE -01FB ; Ll # LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE -01FD ; Ll # LATIN SMALL LETTER AE WITH ACUTE -01FF ; Ll # LATIN SMALL LETTER O WITH STROKE AND ACUTE -0201 ; Ll # LATIN SMALL LETTER A WITH DOUBLE GRAVE -0203 ; Ll # LATIN SMALL LETTER A WITH INVERTED BREVE -0205 ; Ll # LATIN SMALL LETTER E WITH DOUBLE GRAVE -0207 ; Ll # LATIN SMALL LETTER E WITH INVERTED BREVE -0209 ; Ll # LATIN SMALL LETTER I WITH DOUBLE GRAVE -020B ; Ll # LATIN SMALL LETTER I WITH INVERTED BREVE -020D ; Ll # LATIN SMALL LETTER O WITH DOUBLE GRAVE -020F ; Ll # LATIN SMALL LETTER O WITH INVERTED BREVE -0211 ; Ll # LATIN SMALL LETTER R WITH DOUBLE GRAVE -0213 ; Ll # LATIN SMALL LETTER R WITH INVERTED BREVE -0215 ; Ll # LATIN SMALL LETTER U WITH DOUBLE GRAVE -0217 ; Ll # LATIN SMALL LETTER U WITH INVERTED BREVE -0219 ; Ll # LATIN SMALL LETTER S WITH COMMA BELOW -021B ; Ll # LATIN SMALL LETTER T WITH COMMA BELOW -021D ; Ll # LATIN SMALL LETTER YOGH -021F ; Ll # LATIN SMALL LETTER H WITH CARON -0221 ; Ll # LATIN SMALL LETTER D WITH CURL -0223 ; Ll # LATIN SMALL LETTER OU -0225 ; Ll # LATIN SMALL LETTER Z WITH HOOK -0227 ; Ll # LATIN SMALL LETTER A WITH DOT ABOVE -0229 ; Ll # LATIN SMALL LETTER E WITH CEDILLA -022B ; Ll # LATIN SMALL LETTER O WITH DIAERESIS AND MACRON -022D ; Ll # LATIN SMALL LETTER O WITH TILDE AND MACRON -022F ; Ll # LATIN SMALL LETTER O WITH DOT ABOVE -0231 ; Ll # LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON -0233..0239 ; Ll # [7] LATIN SMALL LETTER Y WITH MACRON..LATIN SMALL LETTER QP DIGRAPH -023C ; Ll # LATIN SMALL LETTER C WITH STROKE -023F..0240 ; Ll # [2] LATIN SMALL LETTER S WITH SWASH TAIL..LATIN SMALL LETTER Z WITH SWASH TAIL -0242 ; Ll # LATIN SMALL LETTER GLOTTAL STOP -0247 ; Ll # LATIN SMALL LETTER E WITH STROKE -0249 ; Ll # LATIN SMALL LETTER J WITH STROKE -024B ; Ll # LATIN SMALL LETTER Q WITH HOOK TAIL -024D ; Ll # LATIN SMALL LETTER R WITH STROKE -024F..0293 ; Ll # [69] LATIN SMALL LETTER Y WITH STROKE..LATIN SMALL LETTER EZH WITH CURL -0295..02AF ; Ll # [27] LATIN LETTER PHARYNGEAL VOICED FRICATIVE..LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL -0371 ; Ll # GREEK SMALL LETTER HETA -0373 ; Ll # GREEK SMALL LETTER ARCHAIC SAMPI -0377 ; Ll # GREEK SMALL LETTER PAMPHYLIAN DIGAMMA -037B..037D ; Ll # [3] GREEK SMALL REVERSED LUNATE SIGMA SYMBOL..GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL -0390 ; Ll # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS -03AC..03CE ; Ll # [35] GREEK SMALL LETTER ALPHA WITH TONOS..GREEK SMALL LETTER OMEGA WITH TONOS -03D0..03D1 ; Ll # [2] GREEK BETA SYMBOL..GREEK THETA SYMBOL -03D5..03D7 ; Ll # [3] GREEK PHI SYMBOL..GREEK KAI SYMBOL -03D9 ; Ll # GREEK SMALL LETTER ARCHAIC KOPPA -03DB ; Ll # GREEK SMALL LETTER STIGMA -03DD ; Ll # GREEK SMALL LETTER DIGAMMA -03DF ; Ll # GREEK SMALL LETTER KOPPA -03E1 ; Ll # GREEK SMALL LETTER SAMPI -03E3 ; Ll # COPTIC SMALL LETTER SHEI -03E5 ; Ll # COPTIC SMALL LETTER FEI -03E7 ; Ll # COPTIC SMALL LETTER KHEI -03E9 ; Ll # COPTIC SMALL LETTER HORI -03EB ; Ll # COPTIC SMALL LETTER GANGIA -03ED ; Ll # COPTIC SMALL LETTER SHIMA -03EF..03F3 ; Ll # [5] COPTIC SMALL LETTER DEI..GREEK LETTER YOT -03F5 ; Ll # GREEK LUNATE EPSILON SYMBOL -03F8 ; Ll # GREEK SMALL LETTER SHO -03FB..03FC ; Ll # [2] GREEK SMALL LETTER SAN..GREEK RHO WITH STROKE SYMBOL -0430..045F ; Ll # [48] CYRILLIC SMALL LETTER A..CYRILLIC SMALL LETTER DZHE -0461 ; Ll # CYRILLIC SMALL LETTER OMEGA -0463 ; Ll # CYRILLIC SMALL LETTER YAT -0465 ; Ll # CYRILLIC SMALL LETTER IOTIFIED E -0467 ; Ll # CYRILLIC SMALL LETTER LITTLE YUS -0469 ; Ll # CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS -046B ; Ll # CYRILLIC SMALL LETTER BIG YUS -046D ; Ll # CYRILLIC SMALL LETTER IOTIFIED BIG YUS -046F ; Ll # CYRILLIC SMALL LETTER KSI -0471 ; Ll # CYRILLIC SMALL LETTER PSI -0473 ; Ll # CYRILLIC SMALL LETTER FITA -0475 ; Ll # CYRILLIC SMALL LETTER IZHITSA -0477 ; Ll # CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT -0479 ; Ll # CYRILLIC SMALL LETTER UK -047B ; Ll # CYRILLIC SMALL LETTER ROUND OMEGA -047D ; Ll # CYRILLIC SMALL LETTER OMEGA WITH TITLO -047F ; Ll # CYRILLIC SMALL LETTER OT -0481 ; Ll # CYRILLIC SMALL LETTER KOPPA -048B ; Ll # CYRILLIC SMALL LETTER SHORT I WITH TAIL -048D ; Ll # CYRILLIC SMALL LETTER SEMISOFT SIGN -048F ; Ll # CYRILLIC SMALL LETTER ER WITH TICK -0491 ; Ll # CYRILLIC SMALL LETTER GHE WITH UPTURN -0493 ; Ll # CYRILLIC SMALL LETTER GHE WITH STROKE -0495 ; Ll # CYRILLIC SMALL LETTER GHE WITH MIDDLE HOOK -0497 ; Ll # CYRILLIC SMALL LETTER ZHE WITH DESCENDER -0499 ; Ll # CYRILLIC SMALL LETTER ZE WITH DESCENDER -049B ; Ll # CYRILLIC SMALL LETTER KA WITH DESCENDER -049D ; Ll # CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE -049F ; Ll # CYRILLIC SMALL LETTER KA WITH STROKE -04A1 ; Ll # CYRILLIC SMALL LETTER BASHKIR KA -04A3 ; Ll # CYRILLIC SMALL LETTER EN WITH DESCENDER -04A5 ; Ll # CYRILLIC SMALL LIGATURE EN GHE -04A7 ; Ll # CYRILLIC SMALL LETTER PE WITH MIDDLE HOOK -04A9 ; Ll # CYRILLIC SMALL LETTER ABKHASIAN HA -04AB ; Ll # CYRILLIC SMALL LETTER ES WITH DESCENDER -04AD ; Ll # CYRILLIC SMALL LETTER TE WITH DESCENDER -04AF ; Ll # CYRILLIC SMALL LETTER STRAIGHT U -04B1 ; Ll # CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE -04B3 ; Ll # CYRILLIC SMALL LETTER HA WITH DESCENDER -04B5 ; Ll # CYRILLIC SMALL LIGATURE TE TSE -04B7 ; Ll # CYRILLIC SMALL LETTER CHE WITH DESCENDER -04B9 ; Ll # CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE -04BB ; Ll # CYRILLIC SMALL LETTER SHHA -04BD ; Ll # CYRILLIC SMALL LETTER ABKHASIAN CHE -04BF ; Ll # CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER -04C2 ; Ll # CYRILLIC SMALL LETTER ZHE WITH BREVE -04C4 ; Ll # CYRILLIC SMALL LETTER KA WITH HOOK -04C6 ; Ll # CYRILLIC SMALL LETTER EL WITH TAIL -04C8 ; Ll # CYRILLIC SMALL LETTER EN WITH HOOK -04CA ; Ll # CYRILLIC SMALL LETTER EN WITH TAIL -04CC ; Ll # CYRILLIC SMALL LETTER KHAKASSIAN CHE -04CE..04CF ; Ll # [2] CYRILLIC SMALL LETTER EM WITH TAIL..CYRILLIC SMALL LETTER PALOCHKA -04D1 ; Ll # CYRILLIC SMALL LETTER A WITH BREVE -04D3 ; Ll # CYRILLIC SMALL LETTER A WITH DIAERESIS -04D5 ; Ll # CYRILLIC SMALL LIGATURE A IE -04D7 ; Ll # CYRILLIC SMALL LETTER IE WITH BREVE -04D9 ; Ll # CYRILLIC SMALL LETTER SCHWA -04DB ; Ll # CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS -04DD ; Ll # CYRILLIC SMALL LETTER ZHE WITH DIAERESIS -04DF ; Ll # CYRILLIC SMALL LETTER ZE WITH DIAERESIS -04E1 ; Ll # CYRILLIC SMALL LETTER ABKHASIAN DZE -04E3 ; Ll # CYRILLIC SMALL LETTER I WITH MACRON -04E5 ; Ll # CYRILLIC SMALL LETTER I WITH DIAERESIS -04E7 ; Ll # CYRILLIC SMALL LETTER O WITH DIAERESIS -04E9 ; Ll # CYRILLIC SMALL LETTER BARRED O -04EB ; Ll # CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS -04ED ; Ll # CYRILLIC SMALL LETTER E WITH DIAERESIS -04EF ; Ll # CYRILLIC SMALL LETTER U WITH MACRON -04F1 ; Ll # CYRILLIC SMALL LETTER U WITH DIAERESIS -04F3 ; Ll # CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE -04F5 ; Ll # CYRILLIC SMALL LETTER CHE WITH DIAERESIS -04F7 ; Ll # CYRILLIC SMALL LETTER GHE WITH DESCENDER -04F9 ; Ll # CYRILLIC SMALL LETTER YERU WITH DIAERESIS -04FB ; Ll # CYRILLIC SMALL LETTER GHE WITH STROKE AND HOOK -04FD ; Ll # CYRILLIC SMALL LETTER HA WITH HOOK -04FF ; Ll # CYRILLIC SMALL LETTER HA WITH STROKE -0501 ; Ll # CYRILLIC SMALL LETTER KOMI DE -0503 ; Ll # CYRILLIC SMALL LETTER KOMI DJE -0505 ; Ll # CYRILLIC SMALL LETTER KOMI ZJE -0507 ; Ll # CYRILLIC SMALL LETTER KOMI DZJE -0509 ; Ll # CYRILLIC SMALL LETTER KOMI LJE -050B ; Ll # CYRILLIC SMALL LETTER KOMI NJE -050D ; Ll # CYRILLIC SMALL LETTER KOMI SJE -050F ; Ll # CYRILLIC SMALL LETTER KOMI TJE -0511 ; Ll # CYRILLIC SMALL LETTER REVERSED ZE -0513 ; Ll # CYRILLIC SMALL LETTER EL WITH HOOK -0515 ; Ll # CYRILLIC SMALL LETTER LHA -0517 ; Ll # CYRILLIC SMALL LETTER RHA -0519 ; Ll # CYRILLIC SMALL LETTER YAE -051B ; Ll # CYRILLIC SMALL LETTER QA -051D ; Ll # CYRILLIC SMALL LETTER WE -051F ; Ll # CYRILLIC SMALL LETTER ALEUT KA -0521 ; Ll # CYRILLIC SMALL LETTER EL WITH MIDDLE HOOK -0523 ; Ll # CYRILLIC SMALL LETTER EN WITH MIDDLE HOOK -0561..0587 ; Ll # [39] ARMENIAN SMALL LETTER AYB..ARMENIAN SMALL LIGATURE ECH YIWN -1D00..1D2B ; Ll # [44] LATIN LETTER SMALL CAPITAL A..CYRILLIC LETTER SMALL CAPITAL EL -1D62..1D77 ; Ll # [22] LATIN SUBSCRIPT SMALL LETTER I..LATIN SMALL LETTER TURNED G -1D79..1D9A ; Ll # [34] LATIN SMALL LETTER INSULAR G..LATIN SMALL LETTER EZH WITH RETROFLEX HOOK -1E01 ; Ll # LATIN SMALL LETTER A WITH RING BELOW -1E03 ; Ll # LATIN SMALL LETTER B WITH DOT ABOVE -1E05 ; Ll # LATIN SMALL LETTER B WITH DOT BELOW -1E07 ; Ll # LATIN SMALL LETTER B WITH LINE BELOW -1E09 ; Ll # LATIN SMALL LETTER C WITH CEDILLA AND ACUTE -1E0B ; Ll # LATIN SMALL LETTER D WITH DOT ABOVE -1E0D ; Ll # LATIN SMALL LETTER D WITH DOT BELOW -1E0F ; Ll # LATIN SMALL LETTER D WITH LINE BELOW -1E11 ; Ll # LATIN SMALL LETTER D WITH CEDILLA -1E13 ; Ll # LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW -1E15 ; Ll # LATIN SMALL LETTER E WITH MACRON AND GRAVE -1E17 ; Ll # LATIN SMALL LETTER E WITH MACRON AND ACUTE -1E19 ; Ll # LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW -1E1B ; Ll # LATIN SMALL LETTER E WITH TILDE BELOW -1E1D ; Ll # LATIN SMALL LETTER E WITH CEDILLA AND BREVE -1E1F ; Ll # LATIN SMALL LETTER F WITH DOT ABOVE -1E21 ; Ll # LATIN SMALL LETTER G WITH MACRON -1E23 ; Ll # LATIN SMALL LETTER H WITH DOT ABOVE -1E25 ; Ll # LATIN SMALL LETTER H WITH DOT BELOW -1E27 ; Ll # LATIN SMALL LETTER H WITH DIAERESIS -1E29 ; Ll # LATIN SMALL LETTER H WITH CEDILLA -1E2B ; Ll # LATIN SMALL LETTER H WITH BREVE BELOW -1E2D ; Ll # LATIN SMALL LETTER I WITH TILDE BELOW -1E2F ; Ll # LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE -1E31 ; Ll # LATIN SMALL LETTER K WITH ACUTE -1E33 ; Ll # LATIN SMALL LETTER K WITH DOT BELOW -1E35 ; Ll # LATIN SMALL LETTER K WITH LINE BELOW -1E37 ; Ll # LATIN SMALL LETTER L WITH DOT BELOW -1E39 ; Ll # LATIN SMALL LETTER L WITH DOT BELOW AND MACRON -1E3B ; Ll # LATIN SMALL LETTER L WITH LINE BELOW -1E3D ; Ll # LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW -1E3F ; Ll # LATIN SMALL LETTER M WITH ACUTE -1E41 ; Ll # LATIN SMALL LETTER M WITH DOT ABOVE -1E43 ; Ll # LATIN SMALL LETTER M WITH DOT BELOW -1E45 ; Ll # LATIN SMALL LETTER N WITH DOT ABOVE -1E47 ; Ll # LATIN SMALL LETTER N WITH DOT BELOW -1E49 ; Ll # LATIN SMALL LETTER N WITH LINE BELOW -1E4B ; Ll # LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW -1E4D ; Ll # LATIN SMALL LETTER O WITH TILDE AND ACUTE -1E4F ; Ll # LATIN SMALL LETTER O WITH TILDE AND DIAERESIS -1E51 ; Ll # LATIN SMALL LETTER O WITH MACRON AND GRAVE -1E53 ; Ll # LATIN SMALL LETTER O WITH MACRON AND ACUTE -1E55 ; Ll # LATIN SMALL LETTER P WITH ACUTE -1E57 ; Ll # LATIN SMALL LETTER P WITH DOT ABOVE -1E59 ; Ll # LATIN SMALL LETTER R WITH DOT ABOVE -1E5B ; Ll # LATIN SMALL LETTER R WITH DOT BELOW -1E5D ; Ll # LATIN SMALL LETTER R WITH DOT BELOW AND MACRON -1E5F ; Ll # LATIN SMALL LETTER R WITH LINE BELOW -1E61 ; Ll # LATIN SMALL LETTER S WITH DOT ABOVE -1E63 ; Ll # LATIN SMALL LETTER S WITH DOT BELOW -1E65 ; Ll # LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE -1E67 ; Ll # LATIN SMALL LETTER S WITH CARON AND DOT ABOVE -1E69 ; Ll # LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE -1E6B ; Ll # LATIN SMALL LETTER T WITH DOT ABOVE -1E6D ; Ll # LATIN SMALL LETTER T WITH DOT BELOW -1E6F ; Ll # LATIN SMALL LETTER T WITH LINE BELOW -1E71 ; Ll # LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW -1E73 ; Ll # LATIN SMALL LETTER U WITH DIAERESIS BELOW -1E75 ; Ll # LATIN SMALL LETTER U WITH TILDE BELOW -1E77 ; Ll # LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW -1E79 ; Ll # LATIN SMALL LETTER U WITH TILDE AND ACUTE -1E7B ; Ll # LATIN SMALL LETTER U WITH MACRON AND DIAERESIS -1E7D ; Ll # LATIN SMALL LETTER V WITH TILDE -1E7F ; Ll # LATIN SMALL LETTER V WITH DOT BELOW -1E81 ; Ll # LATIN SMALL LETTER W WITH GRAVE -1E83 ; Ll # LATIN SMALL LETTER W WITH ACUTE -1E85 ; Ll # LATIN SMALL LETTER W WITH DIAERESIS -1E87 ; Ll # LATIN SMALL LETTER W WITH DOT ABOVE -1E89 ; Ll # LATIN SMALL LETTER W WITH DOT BELOW -1E8B ; Ll # LATIN SMALL LETTER X WITH DOT ABOVE -1E8D ; Ll # LATIN SMALL LETTER X WITH DIAERESIS -1E8F ; Ll # LATIN SMALL LETTER Y WITH DOT ABOVE -1E91 ; Ll # LATIN SMALL LETTER Z WITH CIRCUMFLEX -1E93 ; Ll # LATIN SMALL LETTER Z WITH DOT BELOW -1E95..1E9D ; Ll # [9] LATIN SMALL LETTER Z WITH LINE BELOW..LATIN SMALL LETTER LONG S WITH HIGH STROKE -1E9F ; Ll # LATIN SMALL LETTER DELTA -1EA1 ; Ll # LATIN SMALL LETTER A WITH DOT BELOW -1EA3 ; Ll # LATIN SMALL LETTER A WITH HOOK ABOVE -1EA5 ; Ll # LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE -1EA7 ; Ll # LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE -1EA9 ; Ll # LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE -1EAB ; Ll # LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE -1EAD ; Ll # LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW -1EAF ; Ll # LATIN SMALL LETTER A WITH BREVE AND ACUTE -1EB1 ; Ll # LATIN SMALL LETTER A WITH BREVE AND GRAVE -1EB3 ; Ll # LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE -1EB5 ; Ll # LATIN SMALL LETTER A WITH BREVE AND TILDE -1EB7 ; Ll # LATIN SMALL LETTER A WITH BREVE AND DOT BELOW -1EB9 ; Ll # LATIN SMALL LETTER E WITH DOT BELOW -1EBB ; Ll # LATIN SMALL LETTER E WITH HOOK ABOVE -1EBD ; Ll # LATIN SMALL LETTER E WITH TILDE -1EBF ; Ll # LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE -1EC1 ; Ll # LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE -1EC3 ; Ll # LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE -1EC5 ; Ll # LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE -1EC7 ; Ll # LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW -1EC9 ; Ll # LATIN SMALL LETTER I WITH HOOK ABOVE -1ECB ; Ll # LATIN SMALL LETTER I WITH DOT BELOW -1ECD ; Ll # LATIN SMALL LETTER O WITH DOT BELOW -1ECF ; Ll # LATIN SMALL LETTER O WITH HOOK ABOVE -1ED1 ; Ll # LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE -1ED3 ; Ll # LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE -1ED5 ; Ll # LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE -1ED7 ; Ll # LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE -1ED9 ; Ll # LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW -1EDB ; Ll # LATIN SMALL LETTER O WITH HORN AND ACUTE -1EDD ; Ll # LATIN SMALL LETTER O WITH HORN AND GRAVE -1EDF ; Ll # LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE -1EE1 ; Ll # LATIN SMALL LETTER O WITH HORN AND TILDE -1EE3 ; Ll # LATIN SMALL LETTER O WITH HORN AND DOT BELOW -1EE5 ; Ll # LATIN SMALL LETTER U WITH DOT BELOW -1EE7 ; Ll # LATIN SMALL LETTER U WITH HOOK ABOVE -1EE9 ; Ll # LATIN SMALL LETTER U WITH HORN AND ACUTE -1EEB ; Ll # LATIN SMALL LETTER U WITH HORN AND GRAVE -1EED ; Ll # LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE -1EEF ; Ll # LATIN SMALL LETTER U WITH HORN AND TILDE -1EF1 ; Ll # LATIN SMALL LETTER U WITH HORN AND DOT BELOW -1EF3 ; Ll # LATIN SMALL LETTER Y WITH GRAVE -1EF5 ; Ll # LATIN SMALL LETTER Y WITH DOT BELOW -1EF7 ; Ll # LATIN SMALL LETTER Y WITH HOOK ABOVE -1EF9 ; Ll # LATIN SMALL LETTER Y WITH TILDE -1EFB ; Ll # LATIN SMALL LETTER MIDDLE-WELSH LL -1EFD ; Ll # LATIN SMALL LETTER MIDDLE-WELSH V -1EFF..1F07 ; Ll # [9] LATIN SMALL LETTER Y WITH LOOP..GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI -1F10..1F15 ; Ll # [6] GREEK SMALL LETTER EPSILON WITH PSILI..GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA -1F20..1F27 ; Ll # [8] GREEK SMALL LETTER ETA WITH PSILI..GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI -1F30..1F37 ; Ll # [8] GREEK SMALL LETTER IOTA WITH PSILI..GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI -1F40..1F45 ; Ll # [6] GREEK SMALL LETTER OMICRON WITH PSILI..GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA -1F50..1F57 ; Ll # [8] GREEK SMALL LETTER UPSILON WITH PSILI..GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI -1F60..1F67 ; Ll # [8] GREEK SMALL LETTER OMEGA WITH PSILI..GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI -1F70..1F7D ; Ll # [14] GREEK SMALL LETTER ALPHA WITH VARIA..GREEK SMALL LETTER OMEGA WITH OXIA -1F80..1F87 ; Ll # [8] GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI..GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI -1F90..1F97 ; Ll # [8] GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI..GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI -1FA0..1FA7 ; Ll # [8] GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI..GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI -1FB0..1FB4 ; Ll # [5] GREEK SMALL LETTER ALPHA WITH VRACHY..GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI -1FB6..1FB7 ; Ll # [2] GREEK SMALL LETTER ALPHA WITH PERISPOMENI..GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI -1FBE ; Ll # GREEK PROSGEGRAMMENI -1FC2..1FC4 ; Ll # [3] GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI -1FC6..1FC7 ; Ll # [2] GREEK SMALL LETTER ETA WITH PERISPOMENI..GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI -1FD0..1FD3 ; Ll # [4] GREEK SMALL LETTER IOTA WITH VRACHY..GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA -1FD6..1FD7 ; Ll # [2] GREEK SMALL LETTER IOTA WITH PERISPOMENI..GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI -1FE0..1FE7 ; Ll # [8] GREEK SMALL LETTER UPSILON WITH VRACHY..GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI -1FF2..1FF4 ; Ll # [3] GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI -1FF6..1FF7 ; Ll # [2] GREEK SMALL LETTER OMEGA WITH PERISPOMENI..GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI -2071 ; Ll # SUPERSCRIPT LATIN SMALL LETTER I -207F ; Ll # SUPERSCRIPT LATIN SMALL LETTER N -210A ; Ll # SCRIPT SMALL G -210E..210F ; Ll # [2] PLANCK CONSTANT..PLANCK CONSTANT OVER TWO PI -2113 ; Ll # SCRIPT SMALL L -212F ; Ll # SCRIPT SMALL E -2134 ; Ll # SCRIPT SMALL O -2139 ; Ll # INFORMATION SOURCE -213C..213D ; Ll # [2] DOUBLE-STRUCK SMALL PI..DOUBLE-STRUCK SMALL GAMMA -2146..2149 ; Ll # [4] DOUBLE-STRUCK ITALIC SMALL D..DOUBLE-STRUCK ITALIC SMALL J -214E ; Ll # TURNED SMALL F -2184 ; Ll # LATIN SMALL LETTER REVERSED C -2C30..2C5E ; Ll # [47] GLAGOLITIC SMALL LETTER AZU..GLAGOLITIC SMALL LETTER LATINATE MYSLITE -2C61 ; Ll # LATIN SMALL LETTER L WITH DOUBLE BAR -2C65..2C66 ; Ll # [2] LATIN SMALL LETTER A WITH STROKE..LATIN SMALL LETTER T WITH DIAGONAL STROKE -2C68 ; Ll # LATIN SMALL LETTER H WITH DESCENDER -2C6A ; Ll # LATIN SMALL LETTER K WITH DESCENDER -2C6C ; Ll # LATIN SMALL LETTER Z WITH DESCENDER -2C71 ; Ll # LATIN SMALL LETTER V WITH RIGHT HOOK -2C73..2C74 ; Ll # [2] LATIN SMALL LETTER W WITH HOOK..LATIN SMALL LETTER V WITH CURL -2C76..2C7C ; Ll # [7] LATIN SMALL LETTER HALF H..LATIN SUBSCRIPT SMALL LETTER J -2C81 ; Ll # COPTIC SMALL LETTER ALFA -2C83 ; Ll # COPTIC SMALL LETTER VIDA -2C85 ; Ll # COPTIC SMALL LETTER GAMMA -2C87 ; Ll # COPTIC SMALL LETTER DALDA -2C89 ; Ll # COPTIC SMALL LETTER EIE -2C8B ; Ll # COPTIC SMALL LETTER SOU -2C8D ; Ll # COPTIC SMALL LETTER ZATA -2C8F ; Ll # COPTIC SMALL LETTER HATE -2C91 ; Ll # COPTIC SMALL LETTER THETHE -2C93 ; Ll # COPTIC SMALL LETTER IAUDA -2C95 ; Ll # COPTIC SMALL LETTER KAPA -2C97 ; Ll # COPTIC SMALL LETTER LAULA -2C99 ; Ll # COPTIC SMALL LETTER MI -2C9B ; Ll # COPTIC SMALL LETTER NI -2C9D ; Ll # COPTIC SMALL LETTER KSI -2C9F ; Ll # COPTIC SMALL LETTER O -2CA1 ; Ll # COPTIC SMALL LETTER PI -2CA3 ; Ll # COPTIC SMALL LETTER RO -2CA5 ; Ll # COPTIC SMALL LETTER SIMA -2CA7 ; Ll # COPTIC SMALL LETTER TAU -2CA9 ; Ll # COPTIC SMALL LETTER UA -2CAB ; Ll # COPTIC SMALL LETTER FI -2CAD ; Ll # COPTIC SMALL LETTER KHI -2CAF ; Ll # COPTIC SMALL LETTER PSI -2CB1 ; Ll # COPTIC SMALL LETTER OOU -2CB3 ; Ll # COPTIC SMALL LETTER DIALECT-P ALEF -2CB5 ; Ll # COPTIC SMALL LETTER OLD COPTIC AIN -2CB7 ; Ll # COPTIC SMALL LETTER CRYPTOGRAMMIC EIE -2CB9 ; Ll # COPTIC SMALL LETTER DIALECT-P KAPA -2CBB ; Ll # COPTIC SMALL LETTER DIALECT-P NI -2CBD ; Ll # COPTIC SMALL LETTER CRYPTOGRAMMIC NI -2CBF ; Ll # COPTIC SMALL LETTER OLD COPTIC OOU -2CC1 ; Ll # COPTIC SMALL LETTER SAMPI -2CC3 ; Ll # COPTIC SMALL LETTER CROSSED SHEI -2CC5 ; Ll # COPTIC SMALL LETTER OLD COPTIC SHEI -2CC7 ; Ll # COPTIC SMALL LETTER OLD COPTIC ESH -2CC9 ; Ll # COPTIC SMALL LETTER AKHMIMIC KHEI -2CCB ; Ll # COPTIC SMALL LETTER DIALECT-P HORI -2CCD ; Ll # COPTIC SMALL LETTER OLD COPTIC HORI -2CCF ; Ll # COPTIC SMALL LETTER OLD COPTIC HA -2CD1 ; Ll # COPTIC SMALL LETTER L-SHAPED HA -2CD3 ; Ll # COPTIC SMALL LETTER OLD COPTIC HEI -2CD5 ; Ll # COPTIC SMALL LETTER OLD COPTIC HAT -2CD7 ; Ll # COPTIC SMALL LETTER OLD COPTIC GANGIA -2CD9 ; Ll # COPTIC SMALL LETTER OLD COPTIC DJA -2CDB ; Ll # COPTIC SMALL LETTER OLD COPTIC SHIMA -2CDD ; Ll # COPTIC SMALL LETTER OLD NUBIAN SHIMA -2CDF ; Ll # COPTIC SMALL LETTER OLD NUBIAN NGI -2CE1 ; Ll # COPTIC SMALL LETTER OLD NUBIAN NYI -2CE3..2CE4 ; Ll # [2] COPTIC SMALL LETTER OLD NUBIAN WAU..COPTIC SYMBOL KAI -2D00..2D25 ; Ll # [38] GEORGIAN SMALL LETTER AN..GEORGIAN SMALL LETTER HOE -A641 ; Ll # CYRILLIC SMALL LETTER ZEMLYA -A643 ; Ll # CYRILLIC SMALL LETTER DZELO -A645 ; Ll # CYRILLIC SMALL LETTER REVERSED DZE -A647 ; Ll # CYRILLIC SMALL LETTER IOTA -A649 ; Ll # CYRILLIC SMALL LETTER DJERV -A64B ; Ll # CYRILLIC SMALL LETTER MONOGRAPH UK -A64D ; Ll # CYRILLIC SMALL LETTER BROAD OMEGA -A64F ; Ll # CYRILLIC SMALL LETTER NEUTRAL YER -A651 ; Ll # CYRILLIC SMALL LETTER YERU WITH BACK YER -A653 ; Ll # CYRILLIC SMALL LETTER IOTIFIED YAT -A655 ; Ll # CYRILLIC SMALL LETTER REVERSED YU -A657 ; Ll # CYRILLIC SMALL LETTER IOTIFIED A -A659 ; Ll # CYRILLIC SMALL LETTER CLOSED LITTLE YUS -A65B ; Ll # CYRILLIC SMALL LETTER BLENDED YUS -A65D ; Ll # CYRILLIC SMALL LETTER IOTIFIED CLOSED LITTLE YUS -A65F ; Ll # CYRILLIC SMALL LETTER YN -A663 ; Ll # CYRILLIC SMALL LETTER SOFT DE -A665 ; Ll # CYRILLIC SMALL LETTER SOFT EL -A667 ; Ll # CYRILLIC SMALL LETTER SOFT EM -A669 ; Ll # CYRILLIC SMALL LETTER MONOCULAR O -A66B ; Ll # CYRILLIC SMALL LETTER BINOCULAR O -A66D ; Ll # CYRILLIC SMALL LETTER DOUBLE MONOCULAR O -A681 ; Ll # CYRILLIC SMALL LETTER DWE -A683 ; Ll # CYRILLIC SMALL LETTER DZWE -A685 ; Ll # CYRILLIC SMALL LETTER ZHWE -A687 ; Ll # CYRILLIC SMALL LETTER CCHE -A689 ; Ll # CYRILLIC SMALL LETTER DZZE -A68B ; Ll # CYRILLIC SMALL LETTER TE WITH MIDDLE HOOK -A68D ; Ll # CYRILLIC SMALL LETTER TWE -A68F ; Ll # CYRILLIC SMALL LETTER TSWE -A691 ; Ll # CYRILLIC SMALL LETTER TSSE -A693 ; Ll # CYRILLIC SMALL LETTER TCHE -A695 ; Ll # CYRILLIC SMALL LETTER HWE -A697 ; Ll # CYRILLIC SMALL LETTER SHWE -A723 ; Ll # LATIN SMALL LETTER EGYPTOLOGICAL ALEF -A725 ; Ll # LATIN SMALL LETTER EGYPTOLOGICAL AIN -A727 ; Ll # LATIN SMALL LETTER HENG -A729 ; Ll # LATIN SMALL LETTER TZ -A72B ; Ll # LATIN SMALL LETTER TRESILLO -A72D ; Ll # LATIN SMALL LETTER CUATRILLO -A72F..A731 ; Ll # [3] LATIN SMALL LETTER CUATRILLO WITH COMMA..LATIN LETTER SMALL CAPITAL S -A733 ; Ll # LATIN SMALL LETTER AA -A735 ; Ll # LATIN SMALL LETTER AO -A737 ; Ll # LATIN SMALL LETTER AU -A739 ; Ll # LATIN SMALL LETTER AV -A73B ; Ll # LATIN SMALL LETTER AV WITH HORIZONTAL BAR -A73D ; Ll # LATIN SMALL LETTER AY -A73F ; Ll # LATIN SMALL LETTER REVERSED C WITH DOT -A741 ; Ll # LATIN SMALL LETTER K WITH STROKE -A743 ; Ll # LATIN SMALL LETTER K WITH DIAGONAL STROKE -A745 ; Ll # LATIN SMALL LETTER K WITH STROKE AND DIAGONAL STROKE -A747 ; Ll # LATIN SMALL LETTER BROKEN L -A749 ; Ll # LATIN SMALL LETTER L WITH HIGH STROKE -A74B ; Ll # LATIN SMALL LETTER O WITH LONG STROKE OVERLAY -A74D ; Ll # LATIN SMALL LETTER O WITH LOOP -A74F ; Ll # LATIN SMALL LETTER OO -A751 ; Ll # LATIN SMALL LETTER P WITH STROKE THROUGH DESCENDER -A753 ; Ll # LATIN SMALL LETTER P WITH FLOURISH -A755 ; Ll # LATIN SMALL LETTER P WITH SQUIRREL TAIL -A757 ; Ll # LATIN SMALL LETTER Q WITH STROKE THROUGH DESCENDER -A759 ; Ll # LATIN SMALL LETTER Q WITH DIAGONAL STROKE -A75B ; Ll # LATIN SMALL LETTER R ROTUNDA -A75D ; Ll # LATIN SMALL LETTER RUM ROTUNDA -A75F ; Ll # LATIN SMALL LETTER V WITH DIAGONAL STROKE -A761 ; Ll # LATIN SMALL LETTER VY -A763 ; Ll # LATIN SMALL LETTER VISIGOTHIC Z -A765 ; Ll # LATIN SMALL LETTER THORN WITH STROKE -A767 ; Ll # LATIN SMALL LETTER THORN WITH STROKE THROUGH DESCENDER -A769 ; Ll # LATIN SMALL LETTER VEND -A76B ; Ll # LATIN SMALL LETTER ET -A76D ; Ll # LATIN SMALL LETTER IS -A76F ; Ll # LATIN SMALL LETTER CON -A771..A778 ; Ll # [8] LATIN SMALL LETTER DUM..LATIN SMALL LETTER UM -A77A ; Ll # LATIN SMALL LETTER INSULAR D -A77C ; Ll # LATIN SMALL LETTER INSULAR F -A77F ; Ll # LATIN SMALL LETTER TURNED INSULAR G -A781 ; Ll # LATIN SMALL LETTER TURNED L -A783 ; Ll # LATIN SMALL LETTER INSULAR R -A785 ; Ll # LATIN SMALL LETTER INSULAR S -A787 ; Ll # LATIN SMALL LETTER INSULAR T -A78C ; Ll # LATIN SMALL LETTER SALTILLO -FB00..FB06 ; Ll # [7] LATIN SMALL LIGATURE FF..LATIN SMALL LIGATURE ST -FB13..FB17 ; Ll # [5] ARMENIAN SMALL LIGATURE MEN NOW..ARMENIAN SMALL LIGATURE MEN XEH -FF41..FF5A ; Ll # [26] FULLWIDTH LATIN SMALL LETTER A..FULLWIDTH LATIN SMALL LETTER Z -10428..1044F ; Ll # [40] DESERET SMALL LETTER LONG I..DESERET SMALL LETTER EW -1D41A..1D433 ; Ll # [26] MATHEMATICAL BOLD SMALL A..MATHEMATICAL BOLD SMALL Z -1D44E..1D454 ; Ll # [7] MATHEMATICAL ITALIC SMALL A..MATHEMATICAL ITALIC SMALL G -1D456..1D467 ; Ll # [18] MATHEMATICAL ITALIC SMALL I..MATHEMATICAL ITALIC SMALL Z -1D482..1D49B ; Ll # [26] MATHEMATICAL BOLD ITALIC SMALL A..MATHEMATICAL BOLD ITALIC SMALL Z -1D4B6..1D4B9 ; Ll # [4] MATHEMATICAL SCRIPT SMALL A..MATHEMATICAL SCRIPT SMALL D -1D4BB ; Ll # MATHEMATICAL SCRIPT SMALL F -1D4BD..1D4C3 ; Ll # [7] MATHEMATICAL SCRIPT SMALL H..MATHEMATICAL SCRIPT SMALL N -1D4C5..1D4CF ; Ll # [11] MATHEMATICAL SCRIPT SMALL P..MATHEMATICAL SCRIPT SMALL Z -1D4EA..1D503 ; Ll # [26] MATHEMATICAL BOLD SCRIPT SMALL A..MATHEMATICAL BOLD SCRIPT SMALL Z -1D51E..1D537 ; Ll # [26] MATHEMATICAL FRAKTUR SMALL A..MATHEMATICAL FRAKTUR SMALL Z -1D552..1D56B ; Ll # [26] MATHEMATICAL DOUBLE-STRUCK SMALL A..MATHEMATICAL DOUBLE-STRUCK SMALL Z -1D586..1D59F ; Ll # [26] MATHEMATICAL BOLD FRAKTUR SMALL A..MATHEMATICAL BOLD FRAKTUR SMALL Z -1D5BA..1D5D3 ; Ll # [26] MATHEMATICAL SANS-SERIF SMALL A..MATHEMATICAL SANS-SERIF SMALL Z -1D5EE..1D607 ; Ll # [26] MATHEMATICAL SANS-SERIF BOLD SMALL A..MATHEMATICAL SANS-SERIF BOLD SMALL Z -1D622..1D63B ; Ll # [26] MATHEMATICAL SANS-SERIF ITALIC SMALL A..MATHEMATICAL SANS-SERIF ITALIC SMALL Z -1D656..1D66F ; Ll # [26] MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL A..MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Z -1D68A..1D6A5 ; Ll # [28] MATHEMATICAL MONOSPACE SMALL A..MATHEMATICAL ITALIC SMALL DOTLESS J -1D6C2..1D6DA ; Ll # [25] MATHEMATICAL BOLD SMALL ALPHA..MATHEMATICAL BOLD SMALL OMEGA -1D6DC..1D6E1 ; Ll # [6] MATHEMATICAL BOLD EPSILON SYMBOL..MATHEMATICAL BOLD PI SYMBOL -1D6FC..1D714 ; Ll # [25] MATHEMATICAL ITALIC SMALL ALPHA..MATHEMATICAL ITALIC SMALL OMEGA -1D716..1D71B ; Ll # [6] MATHEMATICAL ITALIC EPSILON SYMBOL..MATHEMATICAL ITALIC PI SYMBOL -1D736..1D74E ; Ll # [25] MATHEMATICAL BOLD ITALIC SMALL ALPHA..MATHEMATICAL BOLD ITALIC SMALL OMEGA -1D750..1D755 ; Ll # [6] MATHEMATICAL BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD ITALIC PI SYMBOL -1D770..1D788 ; Ll # [25] MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA -1D78A..1D78F ; Ll # [6] MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD PI SYMBOL -1D7AA..1D7C2 ; Ll # [25] MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA -1D7C4..1D7C9 ; Ll # [6] MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD ITALIC PI SYMBOL -1D7CB ; Ll # MATHEMATICAL BOLD SMALL DIGAMMA - -# Total code points: 1748 - -# ================================================ - -# General_Category=Titlecase_Letter - -01C5 ; Lt # LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON -01C8 ; Lt # LATIN CAPITAL LETTER L WITH SMALL LETTER J -01CB ; Lt # LATIN CAPITAL LETTER N WITH SMALL LETTER J -01F2 ; Lt # LATIN CAPITAL LETTER D WITH SMALL LETTER Z -1F88..1F8F ; Lt # [8] GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI..GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI -1F98..1F9F ; Lt # [8] GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI..GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI -1FA8..1FAF ; Lt # [8] GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI..GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI -1FBC ; Lt # GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI -1FCC ; Lt # GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI -1FFC ; Lt # GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI - -# Total code points: 31 - -# ================================================ - -# General_Category=Modifier_Letter - -02B0..02C1 ; Lm # [18] MODIFIER LETTER SMALL H..MODIFIER LETTER REVERSED GLOTTAL STOP -02C6..02D1 ; Lm # [12] MODIFIER LETTER CIRCUMFLEX ACCENT..MODIFIER LETTER HALF TRIANGULAR COLON -02E0..02E4 ; Lm # [5] MODIFIER LETTER SMALL GAMMA..MODIFIER LETTER SMALL REVERSED GLOTTAL STOP -02EC ; Lm # MODIFIER LETTER VOICING -02EE ; Lm # MODIFIER LETTER DOUBLE APOSTROPHE -0374 ; Lm # GREEK NUMERAL SIGN -037A ; Lm # GREEK YPOGEGRAMMENI -0559 ; Lm # ARMENIAN MODIFIER LETTER LEFT HALF RING -0640 ; Lm # ARABIC TATWEEL -06E5..06E6 ; Lm # [2] ARABIC SMALL WAW..ARABIC SMALL YEH -07F4..07F5 ; Lm # [2] NKO HIGH TONE APOSTROPHE..NKO LOW TONE APOSTROPHE -07FA ; Lm # NKO LAJANYALAN -0971 ; Lm # DEVANAGARI SIGN HIGH SPACING DOT -0E46 ; Lm # THAI CHARACTER MAIYAMOK -0EC6 ; Lm # LAO KO LA -10FC ; Lm # MODIFIER LETTER GEORGIAN NAR -17D7 ; Lm # KHMER SIGN LEK TOO -1843 ; Lm # MONGOLIAN LETTER TODO LONG VOWEL SIGN -1C78..1C7D ; Lm # [6] OL CHIKI MU TTUDDAG..OL CHIKI AHAD -1D2C..1D61 ; Lm # [54] MODIFIER LETTER CAPITAL A..MODIFIER LETTER SMALL CHI -1D78 ; Lm # MODIFIER LETTER CYRILLIC EN -1D9B..1DBF ; Lm # [37] MODIFIER LETTER SMALL TURNED ALPHA..MODIFIER LETTER SMALL THETA -2090..2094 ; Lm # [5] LATIN SUBSCRIPT SMALL LETTER A..LATIN SUBSCRIPT SMALL LETTER SCHWA -2C7D ; Lm # MODIFIER LETTER CAPITAL V -2D6F ; Lm # TIFINAGH MODIFIER LETTER LABIALIZATION MARK -2E2F ; Lm # VERTICAL TILDE -3005 ; Lm # IDEOGRAPHIC ITERATION MARK -3031..3035 ; Lm # [5] VERTICAL KANA REPEAT MARK..VERTICAL KANA REPEAT MARK LOWER HALF -303B ; Lm # VERTICAL IDEOGRAPHIC ITERATION MARK -309D..309E ; Lm # [2] HIRAGANA ITERATION MARK..HIRAGANA VOICED ITERATION MARK -30FC..30FE ; Lm # [3] KATAKANA-HIRAGANA PROLONGED SOUND MARK..KATAKANA VOICED ITERATION MARK -A015 ; Lm # YI SYLLABLE WU -A60C ; Lm # VAI SYLLABLE LENGTHENER -A67F ; Lm # CYRILLIC PAYEROK -A717..A71F ; Lm # [9] MODIFIER LETTER DOT VERTICAL BAR..MODIFIER LETTER LOW INVERTED EXCLAMATION MARK -A770 ; Lm # MODIFIER LETTER US -A788 ; Lm # MODIFIER LETTER LOW CIRCUMFLEX ACCENT -FF70 ; Lm # HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK -FF9E..FF9F ; Lm # [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK - -# Total code points: 187 - -# ================================================ - -# General_Category=Other_Letter - -01BB ; Lo # LATIN LETTER TWO WITH STROKE -01C0..01C3 ; Lo # [4] LATIN LETTER DENTAL CLICK..LATIN LETTER RETROFLEX CLICK -0294 ; Lo # LATIN LETTER GLOTTAL STOP -05D0..05EA ; Lo # [27] HEBREW LETTER ALEF..HEBREW LETTER TAV -05F0..05F2 ; Lo # [3] HEBREW LIGATURE YIDDISH DOUBLE VAV..HEBREW LIGATURE YIDDISH DOUBLE YOD -0621..063F ; Lo # [31] ARABIC LETTER HAMZA..ARABIC LETTER FARSI YEH WITH THREE DOTS ABOVE -0641..064A ; Lo # [10] ARABIC LETTER FEH..ARABIC LETTER YEH -066E..066F ; Lo # [2] ARABIC LETTER DOTLESS BEH..ARABIC LETTER DOTLESS QAF -0671..06D3 ; Lo # [99] ARABIC LETTER ALEF WASLA..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE -06D5 ; Lo # ARABIC LETTER AE -06EE..06EF ; Lo # [2] ARABIC LETTER DAL WITH INVERTED V..ARABIC LETTER REH WITH INVERTED V -06FA..06FC ; Lo # [3] ARABIC LETTER SHEEN WITH DOT BELOW..ARABIC LETTER GHAIN WITH DOT BELOW -06FF ; Lo # ARABIC LETTER HEH WITH INVERTED V -0710 ; Lo # SYRIAC LETTER ALAPH -0712..072F ; Lo # [30] SYRIAC LETTER BETH..SYRIAC LETTER PERSIAN DHALATH -074D..07A5 ; Lo # [89] SYRIAC LETTER SOGDIAN ZHAIN..THAANA LETTER WAAVU -07B1 ; Lo # THAANA LETTER NAA -07CA..07EA ; Lo # [33] NKO LETTER A..NKO LETTER JONA RA -0904..0939 ; Lo # [54] DEVANAGARI LETTER SHORT A..DEVANAGARI LETTER HA -093D ; Lo # DEVANAGARI SIGN AVAGRAHA -0950 ; Lo # DEVANAGARI OM -0958..0961 ; Lo # [10] DEVANAGARI LETTER QA..DEVANAGARI LETTER VOCALIC LL -0972 ; Lo # DEVANAGARI LETTER CANDRA A -097B..097F ; Lo # [5] DEVANAGARI LETTER GGA..DEVANAGARI LETTER BBA -0985..098C ; Lo # [8] BENGALI LETTER A..BENGALI LETTER VOCALIC L -098F..0990 ; Lo # [2] BENGALI LETTER E..BENGALI LETTER AI -0993..09A8 ; Lo # [22] BENGALI LETTER O..BENGALI LETTER NA -09AA..09B0 ; Lo # [7] BENGALI LETTER PA..BENGALI LETTER RA -09B2 ; Lo # BENGALI LETTER LA -09B6..09B9 ; Lo # [4] BENGALI LETTER SHA..BENGALI LETTER HA -09BD ; Lo # BENGALI SIGN AVAGRAHA -09CE ; Lo # BENGALI LETTER KHANDA TA -09DC..09DD ; Lo # [2] BENGALI LETTER RRA..BENGALI LETTER RHA -09DF..09E1 ; Lo # [3] BENGALI LETTER YYA..BENGALI LETTER VOCALIC LL -09F0..09F1 ; Lo # [2] BENGALI LETTER RA WITH MIDDLE DIAGONAL..BENGALI LETTER RA WITH LOWER DIAGONAL -0A05..0A0A ; Lo # [6] GURMUKHI LETTER A..GURMUKHI LETTER UU -0A0F..0A10 ; Lo # [2] GURMUKHI LETTER EE..GURMUKHI LETTER AI -0A13..0A28 ; Lo # [22] GURMUKHI LETTER OO..GURMUKHI LETTER NA -0A2A..0A30 ; Lo # [7] GURMUKHI LETTER PA..GURMUKHI LETTER RA -0A32..0A33 ; Lo # [2] GURMUKHI LETTER LA..GURMUKHI LETTER LLA -0A35..0A36 ; Lo # [2] GURMUKHI LETTER VA..GURMUKHI LETTER SHA -0A38..0A39 ; Lo # [2] GURMUKHI LETTER SA..GURMUKHI LETTER HA -0A59..0A5C ; Lo # [4] GURMUKHI LETTER KHHA..GURMUKHI LETTER RRA -0A5E ; Lo # GURMUKHI LETTER FA -0A72..0A74 ; Lo # [3] GURMUKHI IRI..GURMUKHI EK ONKAR -0A85..0A8D ; Lo # [9] GUJARATI LETTER A..GUJARATI VOWEL CANDRA E -0A8F..0A91 ; Lo # [3] GUJARATI LETTER E..GUJARATI VOWEL CANDRA O -0A93..0AA8 ; Lo # [22] GUJARATI LETTER O..GUJARATI LETTER NA -0AAA..0AB0 ; Lo # [7] GUJARATI LETTER PA..GUJARATI LETTER RA -0AB2..0AB3 ; Lo # [2] GUJARATI LETTER LA..GUJARATI LETTER LLA -0AB5..0AB9 ; Lo # [5] GUJARATI LETTER VA..GUJARATI LETTER HA -0ABD ; Lo # GUJARATI SIGN AVAGRAHA -0AD0 ; Lo # GUJARATI OM -0AE0..0AE1 ; Lo # [2] GUJARATI LETTER VOCALIC RR..GUJARATI LETTER VOCALIC LL -0B05..0B0C ; Lo # [8] ORIYA LETTER A..ORIYA LETTER VOCALIC L -0B0F..0B10 ; Lo # [2] ORIYA LETTER E..ORIYA LETTER AI -0B13..0B28 ; Lo # [22] ORIYA LETTER O..ORIYA LETTER NA -0B2A..0B30 ; Lo # [7] ORIYA LETTER PA..ORIYA LETTER RA -0B32..0B33 ; Lo # [2] ORIYA LETTER LA..ORIYA LETTER LLA -0B35..0B39 ; Lo # [5] ORIYA LETTER VA..ORIYA LETTER HA -0B3D ; Lo # ORIYA SIGN AVAGRAHA -0B5C..0B5D ; Lo # [2] ORIYA LETTER RRA..ORIYA LETTER RHA -0B5F..0B61 ; Lo # [3] ORIYA LETTER YYA..ORIYA LETTER VOCALIC LL -0B71 ; Lo # ORIYA LETTER WA -0B83 ; Lo # TAMIL SIGN VISARGA -0B85..0B8A ; Lo # [6] TAMIL LETTER A..TAMIL LETTER UU -0B8E..0B90 ; Lo # [3] TAMIL LETTER E..TAMIL LETTER AI -0B92..0B95 ; Lo # [4] TAMIL LETTER O..TAMIL LETTER KA -0B99..0B9A ; Lo # [2] TAMIL LETTER NGA..TAMIL LETTER CA -0B9C ; Lo # TAMIL LETTER JA -0B9E..0B9F ; Lo # [2] TAMIL LETTER NYA..TAMIL LETTER TTA -0BA3..0BA4 ; Lo # [2] TAMIL LETTER NNA..TAMIL LETTER TA -0BA8..0BAA ; Lo # [3] TAMIL LETTER NA..TAMIL LETTER PA -0BAE..0BB9 ; Lo # [12] TAMIL LETTER MA..TAMIL LETTER HA -0BD0 ; Lo # TAMIL OM -0C05..0C0C ; Lo # [8] TELUGU LETTER A..TELUGU LETTER VOCALIC L -0C0E..0C10 ; Lo # [3] TELUGU LETTER E..TELUGU LETTER AI -0C12..0C28 ; Lo # [23] TELUGU LETTER O..TELUGU LETTER NA -0C2A..0C33 ; Lo # [10] TELUGU LETTER PA..TELUGU LETTER LLA -0C35..0C39 ; Lo # [5] TELUGU LETTER VA..TELUGU LETTER HA -0C3D ; Lo # TELUGU SIGN AVAGRAHA -0C58..0C59 ; Lo # [2] TELUGU LETTER TSA..TELUGU LETTER DZA -0C60..0C61 ; Lo # [2] TELUGU LETTER VOCALIC RR..TELUGU LETTER VOCALIC LL -0C85..0C8C ; Lo # [8] KANNADA LETTER A..KANNADA LETTER VOCALIC L -0C8E..0C90 ; Lo # [3] KANNADA LETTER E..KANNADA LETTER AI -0C92..0CA8 ; Lo # [23] KANNADA LETTER O..KANNADA LETTER NA -0CAA..0CB3 ; Lo # [10] KANNADA LETTER PA..KANNADA LETTER LLA -0CB5..0CB9 ; Lo # [5] KANNADA LETTER VA..KANNADA LETTER HA -0CBD ; Lo # KANNADA SIGN AVAGRAHA -0CDE ; Lo # KANNADA LETTER FA -0CE0..0CE1 ; Lo # [2] KANNADA LETTER VOCALIC RR..KANNADA LETTER VOCALIC LL -0D05..0D0C ; Lo # [8] MALAYALAM LETTER A..MALAYALAM LETTER VOCALIC L -0D0E..0D10 ; Lo # [3] MALAYALAM LETTER E..MALAYALAM LETTER AI -0D12..0D28 ; Lo # [23] MALAYALAM LETTER O..MALAYALAM LETTER NA -0D2A..0D39 ; Lo # [16] MALAYALAM LETTER PA..MALAYALAM LETTER HA -0D3D ; Lo # MALAYALAM SIGN AVAGRAHA -0D60..0D61 ; Lo # [2] MALAYALAM LETTER VOCALIC RR..MALAYALAM LETTER VOCALIC LL -0D7A..0D7F ; Lo # [6] MALAYALAM LETTER CHILLU NN..MALAYALAM LETTER CHILLU K -0D85..0D96 ; Lo # [18] SINHALA LETTER AYANNA..SINHALA LETTER AUYANNA -0D9A..0DB1 ; Lo # [24] SINHALA LETTER ALPAPRAANA KAYANNA..SINHALA LETTER DANTAJA NAYANNA -0DB3..0DBB ; Lo # [9] SINHALA LETTER SANYAKA DAYANNA..SINHALA LETTER RAYANNA -0DBD ; Lo # SINHALA LETTER DANTAJA LAYANNA -0DC0..0DC6 ; Lo # [7] SINHALA LETTER VAYANNA..SINHALA LETTER FAYANNA -0E01..0E30 ; Lo # [48] THAI CHARACTER KO KAI..THAI CHARACTER SARA A -0E32..0E33 ; Lo # [2] THAI CHARACTER SARA AA..THAI CHARACTER SARA AM -0E40..0E45 ; Lo # [6] THAI CHARACTER SARA E..THAI CHARACTER LAKKHANGYAO -0E81..0E82 ; Lo # [2] LAO LETTER KO..LAO LETTER KHO SUNG -0E84 ; Lo # LAO LETTER KHO TAM -0E87..0E88 ; Lo # [2] LAO LETTER NGO..LAO LETTER CO -0E8A ; Lo # LAO LETTER SO TAM -0E8D ; Lo # LAO LETTER NYO -0E94..0E97 ; Lo # [4] LAO LETTER DO..LAO LETTER THO TAM -0E99..0E9F ; Lo # [7] LAO LETTER NO..LAO LETTER FO SUNG -0EA1..0EA3 ; Lo # [3] LAO LETTER MO..LAO LETTER LO LING -0EA5 ; Lo # LAO LETTER LO LOOT -0EA7 ; Lo # LAO LETTER WO -0EAA..0EAB ; Lo # [2] LAO LETTER SO SUNG..LAO LETTER HO SUNG -0EAD..0EB0 ; Lo # [4] LAO LETTER O..LAO VOWEL SIGN A -0EB2..0EB3 ; Lo # [2] LAO VOWEL SIGN AA..LAO VOWEL SIGN AM -0EBD ; Lo # LAO SEMIVOWEL SIGN NYO -0EC0..0EC4 ; Lo # [5] LAO VOWEL SIGN E..LAO VOWEL SIGN AI -0EDC..0EDD ; Lo # [2] LAO HO NO..LAO HO MO -0F00 ; Lo # TIBETAN SYLLABLE OM -0F40..0F47 ; Lo # [8] TIBETAN LETTER KA..TIBETAN LETTER JA -0F49..0F6C ; Lo # [36] TIBETAN LETTER NYA..TIBETAN LETTER RRA -0F88..0F8B ; Lo # [4] TIBETAN SIGN LCE TSA CAN..TIBETAN SIGN GRU MED RGYINGS -1000..102A ; Lo # [43] MYANMAR LETTER KA..MYANMAR LETTER AU -103F ; Lo # MYANMAR LETTER GREAT SA -1050..1055 ; Lo # [6] MYANMAR LETTER SHA..MYANMAR LETTER VOCALIC LL -105A..105D ; Lo # [4] MYANMAR LETTER MON NGA..MYANMAR LETTER MON BBE -1061 ; Lo # MYANMAR LETTER SGAW KAREN SHA -1065..1066 ; Lo # [2] MYANMAR LETTER WESTERN PWO KAREN THA..MYANMAR LETTER WESTERN PWO KAREN PWA -106E..1070 ; Lo # [3] MYANMAR LETTER EASTERN PWO KAREN NNA..MYANMAR LETTER EASTERN PWO KAREN GHWA -1075..1081 ; Lo # [13] MYANMAR LETTER SHAN KA..MYANMAR LETTER SHAN HA -108E ; Lo # MYANMAR LETTER RUMAI PALAUNG FA -10D0..10FA ; Lo # [43] GEORGIAN LETTER AN..GEORGIAN LETTER AIN -1100..1159 ; Lo # [90] HANGUL CHOSEONG KIYEOK..HANGUL CHOSEONG YEORINHIEUH -115F..11A2 ; Lo # [68] HANGUL CHOSEONG FILLER..HANGUL JUNGSEONG SSANGARAEA -11A8..11F9 ; Lo # [82] HANGUL JONGSEONG KIYEOK..HANGUL JONGSEONG YEORINHIEUH -1200..1248 ; Lo # [73] ETHIOPIC SYLLABLE HA..ETHIOPIC SYLLABLE QWA -124A..124D ; Lo # [4] ETHIOPIC SYLLABLE QWI..ETHIOPIC SYLLABLE QWE -1250..1256 ; Lo # [7] ETHIOPIC SYLLABLE QHA..ETHIOPIC SYLLABLE QHO -1258 ; Lo # ETHIOPIC SYLLABLE QHWA -125A..125D ; Lo # [4] ETHIOPIC SYLLABLE QHWI..ETHIOPIC SYLLABLE QHWE -1260..1288 ; Lo # [41] ETHIOPIC SYLLABLE BA..ETHIOPIC SYLLABLE XWA -128A..128D ; Lo # [4] ETHIOPIC SYLLABLE XWI..ETHIOPIC SYLLABLE XWE -1290..12B0 ; Lo # [33] ETHIOPIC SYLLABLE NA..ETHIOPIC SYLLABLE KWA -12B2..12B5 ; Lo # [4] ETHIOPIC SYLLABLE KWI..ETHIOPIC SYLLABLE KWE -12B8..12BE ; Lo # [7] ETHIOPIC SYLLABLE KXA..ETHIOPIC SYLLABLE KXO -12C0 ; Lo # ETHIOPIC SYLLABLE KXWA -12C2..12C5 ; Lo # [4] ETHIOPIC SYLLABLE KXWI..ETHIOPIC SYLLABLE KXWE -12C8..12D6 ; Lo # [15] ETHIOPIC SYLLABLE WA..ETHIOPIC SYLLABLE PHARYNGEAL O -12D8..1310 ; Lo # [57] ETHIOPIC SYLLABLE ZA..ETHIOPIC SYLLABLE GWA -1312..1315 ; Lo # [4] ETHIOPIC SYLLABLE GWI..ETHIOPIC SYLLABLE GWE -1318..135A ; Lo # [67] ETHIOPIC SYLLABLE GGA..ETHIOPIC SYLLABLE FYA -1380..138F ; Lo # [16] ETHIOPIC SYLLABLE SEBATBEIT MWA..ETHIOPIC SYLLABLE PWE -13A0..13F4 ; Lo # [85] CHEROKEE LETTER A..CHEROKEE LETTER YV -1401..166C ; Lo # [620] CANADIAN SYLLABICS E..CANADIAN SYLLABICS CARRIER TTSA -166F..1676 ; Lo # [8] CANADIAN SYLLABICS QAI..CANADIAN SYLLABICS NNGAA -1681..169A ; Lo # [26] OGHAM LETTER BEITH..OGHAM LETTER PEITH -16A0..16EA ; Lo # [75] RUNIC LETTER FEHU FEOH FE F..RUNIC LETTER X -1700..170C ; Lo # [13] TAGALOG LETTER A..TAGALOG LETTER YA -170E..1711 ; Lo # [4] TAGALOG LETTER LA..TAGALOG LETTER HA -1720..1731 ; Lo # [18] HANUNOO LETTER A..HANUNOO LETTER HA -1740..1751 ; Lo # [18] BUHID LETTER A..BUHID LETTER HA -1760..176C ; Lo # [13] TAGBANWA LETTER A..TAGBANWA LETTER YA -176E..1770 ; Lo # [3] TAGBANWA LETTER LA..TAGBANWA LETTER SA -1780..17B3 ; Lo # [52] KHMER LETTER KA..KHMER INDEPENDENT VOWEL QAU -17DC ; Lo # KHMER SIGN AVAKRAHASANYA -1820..1842 ; Lo # [35] MONGOLIAN LETTER A..MONGOLIAN LETTER CHI -1844..1877 ; Lo # [52] MONGOLIAN LETTER TODO E..MONGOLIAN LETTER MANCHU ZHA -1880..18A8 ; Lo # [41] MONGOLIAN LETTER ALI GALI ANUSVARA ONE..MONGOLIAN LETTER MANCHU ALI GALI BHA -18AA ; Lo # MONGOLIAN LETTER MANCHU ALI GALI LHA -1900..191C ; Lo # [29] LIMBU VOWEL-CARRIER LETTER..LIMBU LETTER HA -1950..196D ; Lo # [30] TAI LE LETTER KA..TAI LE LETTER AI -1970..1974 ; Lo # [5] TAI LE LETTER TONE-2..TAI LE LETTER TONE-6 -1980..19A9 ; Lo # [42] NEW TAI LUE LETTER HIGH QA..NEW TAI LUE LETTER LOW XVA -19C1..19C7 ; Lo # [7] NEW TAI LUE LETTER FINAL V..NEW TAI LUE LETTER FINAL B -1A00..1A16 ; Lo # [23] BUGINESE LETTER KA..BUGINESE LETTER HA -1B05..1B33 ; Lo # [47] BALINESE LETTER AKARA..BALINESE LETTER HA -1B45..1B4B ; Lo # [7] BALINESE LETTER KAF SASAK..BALINESE LETTER ASYURA SASAK -1B83..1BA0 ; Lo # [30] SUNDANESE LETTER A..SUNDANESE LETTER HA -1BAE..1BAF ; Lo # [2] SUNDANESE LETTER KHA..SUNDANESE LETTER SYA -1C00..1C23 ; Lo # [36] LEPCHA LETTER KA..LEPCHA LETTER A -1C4D..1C4F ; Lo # [3] LEPCHA LETTER TTA..LEPCHA LETTER DDA -1C5A..1C77 ; Lo # [30] OL CHIKI LETTER LA..OL CHIKI LETTER OH -2135..2138 ; Lo # [4] ALEF SYMBOL..DALET SYMBOL -2D30..2D65 ; Lo # [54] TIFINAGH LETTER YA..TIFINAGH LETTER YAZZ -2D80..2D96 ; Lo # [23] ETHIOPIC SYLLABLE LOA..ETHIOPIC SYLLABLE GGWE -2DA0..2DA6 ; Lo # [7] ETHIOPIC SYLLABLE SSA..ETHIOPIC SYLLABLE SSO -2DA8..2DAE ; Lo # [7] ETHIOPIC SYLLABLE CCA..ETHIOPIC SYLLABLE CCO -2DB0..2DB6 ; Lo # [7] ETHIOPIC SYLLABLE ZZA..ETHIOPIC SYLLABLE ZZO -2DB8..2DBE ; Lo # [7] ETHIOPIC SYLLABLE CCHA..ETHIOPIC SYLLABLE CCHO -2DC0..2DC6 ; Lo # [7] ETHIOPIC SYLLABLE QYA..ETHIOPIC SYLLABLE QYO -2DC8..2DCE ; Lo # [7] ETHIOPIC SYLLABLE KYA..ETHIOPIC SYLLABLE KYO -2DD0..2DD6 ; Lo # [7] ETHIOPIC SYLLABLE XYA..ETHIOPIC SYLLABLE XYO -2DD8..2DDE ; Lo # [7] ETHIOPIC SYLLABLE GYA..ETHIOPIC SYLLABLE GYO -3006 ; Lo # IDEOGRAPHIC CLOSING MARK -303C ; Lo # MASU MARK -3041..3096 ; Lo # [86] HIRAGANA LETTER SMALL A..HIRAGANA LETTER SMALL KE -309F ; Lo # HIRAGANA DIGRAPH YORI -30A1..30FA ; Lo # [90] KATAKANA LETTER SMALL A..KATAKANA LETTER VO -30FF ; Lo # KATAKANA DIGRAPH KOTO -3105..312D ; Lo # [41] BOPOMOFO LETTER B..BOPOMOFO LETTER IH -3131..318E ; Lo # [94] HANGUL LETTER KIYEOK..HANGUL LETTER ARAEAE -31A0..31B7 ; Lo # [24] BOPOMOFO LETTER BU..BOPOMOFO FINAL LETTER H -31F0..31FF ; Lo # [16] KATAKANA LETTER SMALL KU..KATAKANA LETTER SMALL RO -3400..4DB5 ; Lo # [6582] CJK UNIFIED IDEOGRAPH-3400..CJK UNIFIED IDEOGRAPH-4DB5 -4E00..9FC3 ; Lo # [20932] CJK UNIFIED IDEOGRAPH-4E00..CJK UNIFIED IDEOGRAPH-9FC3 -A000..A014 ; Lo # [21] YI SYLLABLE IT..YI SYLLABLE E -A016..A48C ; Lo # [1143] YI SYLLABLE BIT..YI SYLLABLE YYR -A500..A60B ; Lo # [268] VAI SYLLABLE EE..VAI SYLLABLE NG -A610..A61F ; Lo # [16] VAI SYLLABLE NDOLE FA..VAI SYMBOL JONG -A62A..A62B ; Lo # [2] VAI SYLLABLE NDOLE MA..VAI SYLLABLE NDOLE DO -A66E ; Lo # CYRILLIC LETTER MULTIOCULAR O -A7FB..A801 ; Lo # [7] LATIN EPIGRAPHIC LETTER REVERSED F..SYLOTI NAGRI LETTER I -A803..A805 ; Lo # [3] SYLOTI NAGRI LETTER U..SYLOTI NAGRI LETTER O -A807..A80A ; Lo # [4] SYLOTI NAGRI LETTER KO..SYLOTI NAGRI LETTER GHO -A80C..A822 ; Lo # [23] SYLOTI NAGRI LETTER CO..SYLOTI NAGRI LETTER HO -A840..A873 ; Lo # [52] PHAGS-PA LETTER KA..PHAGS-PA LETTER CANDRABINDU -A882..A8B3 ; Lo # [50] SAURASHTRA LETTER A..SAURASHTRA LETTER LLA -A90A..A925 ; Lo # [28] KAYAH LI LETTER KA..KAYAH LI LETTER OO -A930..A946 ; Lo # [23] REJANG LETTER KA..REJANG LETTER A -AA00..AA28 ; Lo # [41] CHAM LETTER A..CHAM LETTER HA -AA40..AA42 ; Lo # [3] CHAM LETTER FINAL K..CHAM LETTER FINAL NG -AA44..AA4B ; Lo # [8] CHAM LETTER FINAL CH..CHAM LETTER FINAL SS -AC00..D7A3 ; Lo # [11172] HANGUL SYLLABLE GA..HANGUL SYLLABLE HIH -F900..FA2D ; Lo # [302] CJK COMPATIBILITY IDEOGRAPH-F900..CJK COMPATIBILITY IDEOGRAPH-FA2D -FA30..FA6A ; Lo # [59] CJK COMPATIBILITY IDEOGRAPH-FA30..CJK COMPATIBILITY IDEOGRAPH-FA6A -FA70..FAD9 ; Lo # [106] CJK COMPATIBILITY IDEOGRAPH-FA70..CJK COMPATIBILITY IDEOGRAPH-FAD9 -FB1D ; Lo # HEBREW LETTER YOD WITH HIRIQ -FB1F..FB28 ; Lo # [10] HEBREW LIGATURE YIDDISH YOD YOD PATAH..HEBREW LETTER WIDE TAV -FB2A..FB36 ; Lo # [13] HEBREW LETTER SHIN WITH SHIN DOT..HEBREW LETTER ZAYIN WITH DAGESH -FB38..FB3C ; Lo # [5] HEBREW LETTER TET WITH DAGESH..HEBREW LETTER LAMED WITH DAGESH -FB3E ; Lo # HEBREW LETTER MEM WITH DAGESH -FB40..FB41 ; Lo # [2] HEBREW LETTER NUN WITH DAGESH..HEBREW LETTER SAMEKH WITH DAGESH -FB43..FB44 ; Lo # [2] HEBREW LETTER FINAL PE WITH DAGESH..HEBREW LETTER PE WITH DAGESH -FB46..FBB1 ; Lo # [108] HEBREW LETTER TSADI WITH DAGESH..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM -FBD3..FD3D ; Lo # [363] ARABIC LETTER NG ISOLATED FORM..ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM -FD50..FD8F ; Lo # [64] ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM..ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM -FD92..FDC7 ; Lo # [54] ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM..ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM -FDF0..FDFB ; Lo # [12] ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM..ARABIC LIGATURE JALLAJALALOUHOU -FE70..FE74 ; Lo # [5] ARABIC FATHATAN ISOLATED FORM..ARABIC KASRATAN ISOLATED FORM -FE76..FEFC ; Lo # [135] ARABIC FATHA ISOLATED FORM..ARABIC LIGATURE LAM WITH ALEF FINAL FORM -FF66..FF6F ; Lo # [10] HALFWIDTH KATAKANA LETTER WO..HALFWIDTH KATAKANA LETTER SMALL TU -FF71..FF9D ; Lo # [45] HALFWIDTH KATAKANA LETTER A..HALFWIDTH KATAKANA LETTER N -FFA0..FFBE ; Lo # [31] HALFWIDTH HANGUL FILLER..HALFWIDTH HANGUL LETTER HIEUH -FFC2..FFC7 ; Lo # [6] HALFWIDTH HANGUL LETTER A..HALFWIDTH HANGUL LETTER E -FFCA..FFCF ; Lo # [6] HALFWIDTH HANGUL LETTER YEO..HALFWIDTH HANGUL LETTER OE -FFD2..FFD7 ; Lo # [6] HALFWIDTH HANGUL LETTER YO..HALFWIDTH HANGUL LETTER YU -FFDA..FFDC ; Lo # [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL LETTER I -10000..1000B ; Lo # [12] LINEAR B SYLLABLE B008 A..LINEAR B SYLLABLE B046 JE -1000D..10026 ; Lo # [26] LINEAR B SYLLABLE B036 JO..LINEAR B SYLLABLE B032 QO -10028..1003A ; Lo # [19] LINEAR B SYLLABLE B060 RA..LINEAR B SYLLABLE B042 WO -1003C..1003D ; Lo # [2] LINEAR B SYLLABLE B017 ZA..LINEAR B SYLLABLE B074 ZE -1003F..1004D ; Lo # [15] LINEAR B SYLLABLE B020 ZO..LINEAR B SYLLABLE B091 TWO -10050..1005D ; Lo # [14] LINEAR B SYMBOL B018..LINEAR B SYMBOL B089 -10080..100FA ; Lo # [123] LINEAR B IDEOGRAM B100 MAN..LINEAR B IDEOGRAM VESSEL B305 -10280..1029C ; Lo # [29] LYCIAN LETTER A..LYCIAN LETTER X -102A0..102D0 ; Lo # [49] CARIAN LETTER A..CARIAN LETTER UUU3 -10300..1031E ; Lo # [31] OLD ITALIC LETTER A..OLD ITALIC LETTER UU -10330..10340 ; Lo # [17] GOTHIC LETTER AHSA..GOTHIC LETTER PAIRTHRA -10342..10349 ; Lo # [8] GOTHIC LETTER RAIDA..GOTHIC LETTER OTHAL -10380..1039D ; Lo # [30] UGARITIC LETTER ALPA..UGARITIC LETTER SSU -103A0..103C3 ; Lo # [36] OLD PERSIAN SIGN A..OLD PERSIAN SIGN HA -103C8..103CF ; Lo # [8] OLD PERSIAN SIGN AURAMAZDAA..OLD PERSIAN SIGN BUUMISH -10450..1049D ; Lo # [78] SHAVIAN LETTER PEEP..OSMANYA LETTER OO -10800..10805 ; Lo # [6] CYPRIOT SYLLABLE A..CYPRIOT SYLLABLE JA -10808 ; Lo # CYPRIOT SYLLABLE JO -1080A..10835 ; Lo # [44] CYPRIOT SYLLABLE KA..CYPRIOT SYLLABLE WO -10837..10838 ; Lo # [2] CYPRIOT SYLLABLE XA..CYPRIOT SYLLABLE XE -1083C ; Lo # CYPRIOT SYLLABLE ZA -1083F ; Lo # CYPRIOT SYLLABLE ZO -10900..10915 ; Lo # [22] PHOENICIAN LETTER ALF..PHOENICIAN LETTER TAU -10920..10939 ; Lo # [26] LYDIAN LETTER A..LYDIAN LETTER C -10A00 ; Lo # KHAROSHTHI LETTER A -10A10..10A13 ; Lo # [4] KHAROSHTHI LETTER KA..KHAROSHTHI LETTER GHA -10A15..10A17 ; Lo # [3] KHAROSHTHI LETTER CA..KHAROSHTHI LETTER JA -10A19..10A33 ; Lo # [27] KHAROSHTHI LETTER NYA..KHAROSHTHI LETTER TTTHA -12000..1236E ; Lo # [879] CUNEIFORM SIGN A..CUNEIFORM SIGN ZUM -20000..2A6D6 ; Lo # [42711] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6D6 -2F800..2FA1D ; Lo # [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D - -# Total code points: 90068 - -# ================================================ - -# General_Category=Nonspacing_Mark - -0300..036F ; Mn # [112] COMBINING GRAVE ACCENT..COMBINING LATIN SMALL LETTER X -0483..0487 ; Mn # [5] COMBINING CYRILLIC TITLO..COMBINING CYRILLIC POKRYTIE -0591..05BD ; Mn # [45] HEBREW ACCENT ETNAHTA..HEBREW POINT METEG -05BF ; Mn # HEBREW POINT RAFE -05C1..05C2 ; Mn # [2] HEBREW POINT SHIN DOT..HEBREW POINT SIN DOT -05C4..05C5 ; Mn # [2] HEBREW MARK UPPER DOT..HEBREW MARK LOWER DOT -05C7 ; Mn # HEBREW POINT QAMATS QATAN -0610..061A ; Mn # [11] ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM..ARABIC SMALL KASRA -064B..065E ; Mn # [20] ARABIC FATHATAN..ARABIC FATHA WITH TWO DOTS -0670 ; Mn # ARABIC LETTER SUPERSCRIPT ALEF -06D6..06DC ; Mn # [7] ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA..ARABIC SMALL HIGH SEEN -06DF..06E4 ; Mn # [6] ARABIC SMALL HIGH ROUNDED ZERO..ARABIC SMALL HIGH MADDA -06E7..06E8 ; Mn # [2] ARABIC SMALL HIGH YEH..ARABIC SMALL HIGH NOON -06EA..06ED ; Mn # [4] ARABIC EMPTY CENTRE LOW STOP..ARABIC SMALL LOW MEEM -0711 ; Mn # SYRIAC LETTER SUPERSCRIPT ALAPH -0730..074A ; Mn # [27] SYRIAC PTHAHA ABOVE..SYRIAC BARREKH -07A6..07B0 ; Mn # [11] THAANA ABAFILI..THAANA SUKUN -07EB..07F3 ; Mn # [9] NKO COMBINING SHORT HIGH TONE..NKO COMBINING DOUBLE DOT ABOVE -0901..0902 ; Mn # [2] DEVANAGARI SIGN CANDRABINDU..DEVANAGARI SIGN ANUSVARA -093C ; Mn # DEVANAGARI SIGN NUKTA -0941..0948 ; Mn # [8] DEVANAGARI VOWEL SIGN U..DEVANAGARI VOWEL SIGN AI -094D ; Mn # DEVANAGARI SIGN VIRAMA -0951..0954 ; Mn # [4] DEVANAGARI STRESS SIGN UDATTA..DEVANAGARI ACUTE ACCENT -0962..0963 ; Mn # [2] DEVANAGARI VOWEL SIGN VOCALIC L..DEVANAGARI VOWEL SIGN VOCALIC LL -0981 ; Mn # BENGALI SIGN CANDRABINDU -09BC ; Mn # BENGALI SIGN NUKTA -09C1..09C4 ; Mn # [4] BENGALI VOWEL SIGN U..BENGALI VOWEL SIGN VOCALIC RR -09CD ; Mn # BENGALI SIGN VIRAMA -09E2..09E3 ; Mn # [2] BENGALI VOWEL SIGN VOCALIC L..BENGALI VOWEL SIGN VOCALIC LL -0A01..0A02 ; Mn # [2] GURMUKHI SIGN ADAK BINDI..GURMUKHI SIGN BINDI -0A3C ; Mn # GURMUKHI SIGN NUKTA -0A41..0A42 ; Mn # [2] GURMUKHI VOWEL SIGN U..GURMUKHI VOWEL SIGN UU -0A47..0A48 ; Mn # [2] GURMUKHI VOWEL SIGN EE..GURMUKHI VOWEL SIGN AI -0A4B..0A4D ; Mn # [3] GURMUKHI VOWEL SIGN OO..GURMUKHI SIGN VIRAMA -0A51 ; Mn # GURMUKHI SIGN UDAAT -0A70..0A71 ; Mn # [2] GURMUKHI TIPPI..GURMUKHI ADDAK -0A75 ; Mn # GURMUKHI SIGN YAKASH -0A81..0A82 ; Mn # [2] GUJARATI SIGN CANDRABINDU..GUJARATI SIGN ANUSVARA -0ABC ; Mn # GUJARATI SIGN NUKTA -0AC1..0AC5 ; Mn # [5] GUJARATI VOWEL SIGN U..GUJARATI VOWEL SIGN CANDRA E -0AC7..0AC8 ; Mn # [2] GUJARATI VOWEL SIGN E..GUJARATI VOWEL SIGN AI -0ACD ; Mn # GUJARATI SIGN VIRAMA -0AE2..0AE3 ; Mn # [2] GUJARATI VOWEL SIGN VOCALIC L..GUJARATI VOWEL SIGN VOCALIC LL -0B01 ; Mn # ORIYA SIGN CANDRABINDU -0B3C ; Mn # ORIYA SIGN NUKTA -0B3F ; Mn # ORIYA VOWEL SIGN I -0B41..0B44 ; Mn # [4] ORIYA VOWEL SIGN U..ORIYA VOWEL SIGN VOCALIC RR -0B4D ; Mn # ORIYA SIGN VIRAMA -0B56 ; Mn # ORIYA AI LENGTH MARK -0B62..0B63 ; Mn # [2] ORIYA VOWEL SIGN VOCALIC L..ORIYA VOWEL SIGN VOCALIC LL -0B82 ; Mn # TAMIL SIGN ANUSVARA -0BC0 ; Mn # TAMIL VOWEL SIGN II -0BCD ; Mn # TAMIL SIGN VIRAMA -0C3E..0C40 ; Mn # [3] TELUGU VOWEL SIGN AA..TELUGU VOWEL SIGN II -0C46..0C48 ; Mn # [3] TELUGU VOWEL SIGN E..TELUGU VOWEL SIGN AI -0C4A..0C4D ; Mn # [4] TELUGU VOWEL SIGN O..TELUGU SIGN VIRAMA -0C55..0C56 ; Mn # [2] TELUGU LENGTH MARK..TELUGU AI LENGTH MARK -0C62..0C63 ; Mn # [2] TELUGU VOWEL SIGN VOCALIC L..TELUGU VOWEL SIGN VOCALIC LL -0CBC ; Mn # KANNADA SIGN NUKTA -0CBF ; Mn # KANNADA VOWEL SIGN I -0CC6 ; Mn # KANNADA VOWEL SIGN E -0CCC..0CCD ; Mn # [2] KANNADA VOWEL SIGN AU..KANNADA SIGN VIRAMA -0CE2..0CE3 ; Mn # [2] KANNADA VOWEL SIGN VOCALIC L..KANNADA VOWEL SIGN VOCALIC LL -0D41..0D44 ; Mn # [4] MALAYALAM VOWEL SIGN U..MALAYALAM VOWEL SIGN VOCALIC RR -0D4D ; Mn # MALAYALAM SIGN VIRAMA -0D62..0D63 ; Mn # [2] MALAYALAM VOWEL SIGN VOCALIC L..MALAYALAM VOWEL SIGN VOCALIC LL -0DCA ; Mn # SINHALA SIGN AL-LAKUNA -0DD2..0DD4 ; Mn # [3] SINHALA VOWEL SIGN KETTI IS-PILLA..SINHALA VOWEL SIGN KETTI PAA-PILLA -0DD6 ; Mn # SINHALA VOWEL SIGN DIGA PAA-PILLA -0E31 ; Mn # THAI CHARACTER MAI HAN-AKAT -0E34..0E3A ; Mn # [7] THAI CHARACTER SARA I..THAI CHARACTER PHINTHU -0E47..0E4E ; Mn # [8] THAI CHARACTER MAITAIKHU..THAI CHARACTER YAMAKKAN -0EB1 ; Mn # LAO VOWEL SIGN MAI KAN -0EB4..0EB9 ; Mn # [6] LAO VOWEL SIGN I..LAO VOWEL SIGN UU -0EBB..0EBC ; Mn # [2] LAO VOWEL SIGN MAI KON..LAO SEMIVOWEL SIGN LO -0EC8..0ECD ; Mn # [6] LAO TONE MAI EK..LAO NIGGAHITA -0F18..0F19 ; Mn # [2] TIBETAN ASTROLOGICAL SIGN -KHYUD PA..TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS -0F35 ; Mn # TIBETAN MARK NGAS BZUNG NYI ZLA -0F37 ; Mn # TIBETAN MARK NGAS BZUNG SGOR RTAGS -0F39 ; Mn # TIBETAN MARK TSA -PHRU -0F71..0F7E ; Mn # [14] TIBETAN VOWEL SIGN AA..TIBETAN SIGN RJES SU NGA RO -0F80..0F84 ; Mn # [5] TIBETAN VOWEL SIGN REVERSED I..TIBETAN MARK HALANTA -0F86..0F87 ; Mn # [2] TIBETAN SIGN LCI RTAGS..TIBETAN SIGN YANG RTAGS -0F90..0F97 ; Mn # [8] TIBETAN SUBJOINED LETTER KA..TIBETAN SUBJOINED LETTER JA -0F99..0FBC ; Mn # [36] TIBETAN SUBJOINED LETTER NYA..TIBETAN SUBJOINED LETTER FIXED-FORM RA -0FC6 ; Mn # TIBETAN SYMBOL PADMA GDAN -102D..1030 ; Mn # [4] MYANMAR VOWEL SIGN I..MYANMAR VOWEL SIGN UU -1032..1037 ; Mn # [6] MYANMAR VOWEL SIGN AI..MYANMAR SIGN DOT BELOW -1039..103A ; Mn # [2] MYANMAR SIGN VIRAMA..MYANMAR SIGN ASAT -103D..103E ; Mn # [2] MYANMAR CONSONANT SIGN MEDIAL WA..MYANMAR CONSONANT SIGN MEDIAL HA -1058..1059 ; Mn # [2] MYANMAR VOWEL SIGN VOCALIC L..MYANMAR VOWEL SIGN VOCALIC LL -105E..1060 ; Mn # [3] MYANMAR CONSONANT SIGN MON MEDIAL NA..MYANMAR CONSONANT SIGN MON MEDIAL LA -1071..1074 ; Mn # [4] MYANMAR VOWEL SIGN GEBA KAREN I..MYANMAR VOWEL SIGN KAYAH EE -1082 ; Mn # MYANMAR CONSONANT SIGN SHAN MEDIAL WA -1085..1086 ; Mn # [2] MYANMAR VOWEL SIGN SHAN E ABOVE..MYANMAR VOWEL SIGN SHAN FINAL Y -108D ; Mn # MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE -135F ; Mn # ETHIOPIC COMBINING GEMINATION MARK -1712..1714 ; Mn # [3] TAGALOG VOWEL SIGN I..TAGALOG SIGN VIRAMA -1732..1734 ; Mn # [3] HANUNOO VOWEL SIGN I..HANUNOO SIGN PAMUDPOD -1752..1753 ; Mn # [2] BUHID VOWEL SIGN I..BUHID VOWEL SIGN U -1772..1773 ; Mn # [2] TAGBANWA VOWEL SIGN I..TAGBANWA VOWEL SIGN U -17B7..17BD ; Mn # [7] KHMER VOWEL SIGN I..KHMER VOWEL SIGN UA -17C6 ; Mn # KHMER SIGN NIKAHIT -17C9..17D3 ; Mn # [11] KHMER SIGN MUUSIKATOAN..KHMER SIGN BATHAMASAT -17DD ; Mn # KHMER SIGN ATTHACAN -180B..180D ; Mn # [3] MONGOLIAN FREE VARIATION SELECTOR ONE..MONGOLIAN FREE VARIATION SELECTOR THREE -18A9 ; Mn # MONGOLIAN LETTER ALI GALI DAGALGA -1920..1922 ; Mn # [3] LIMBU VOWEL SIGN A..LIMBU VOWEL SIGN U -1927..1928 ; Mn # [2] LIMBU VOWEL SIGN E..LIMBU VOWEL SIGN O -1932 ; Mn # LIMBU SMALL LETTER ANUSVARA -1939..193B ; Mn # [3] LIMBU SIGN MUKPHRENG..LIMBU SIGN SA-I -1A17..1A18 ; Mn # [2] BUGINESE VOWEL SIGN I..BUGINESE VOWEL SIGN U -1B00..1B03 ; Mn # [4] BALINESE SIGN ULU RICEM..BALINESE SIGN SURANG -1B34 ; Mn # BALINESE SIGN REREKAN -1B36..1B3A ; Mn # [5] BALINESE VOWEL SIGN ULU..BALINESE VOWEL SIGN RA REPA -1B3C ; Mn # BALINESE VOWEL SIGN LA LENGA -1B42 ; Mn # BALINESE VOWEL SIGN PEPET -1B6B..1B73 ; Mn # [9] BALINESE MUSICAL SYMBOL COMBINING TEGEH..BALINESE MUSICAL SYMBOL COMBINING GONG -1B80..1B81 ; Mn # [2] SUNDANESE SIGN PANYECEK..SUNDANESE SIGN PANGLAYAR -1BA2..1BA5 ; Mn # [4] SUNDANESE CONSONANT SIGN PANYAKRA..SUNDANESE VOWEL SIGN PANYUKU -1BA8..1BA9 ; Mn # [2] SUNDANESE VOWEL SIGN PAMEPET..SUNDANESE VOWEL SIGN PANEULEUNG -1C2C..1C33 ; Mn # [8] LEPCHA VOWEL SIGN E..LEPCHA CONSONANT SIGN T -1C36..1C37 ; Mn # [2] LEPCHA SIGN RAN..LEPCHA SIGN NUKTA -1DC0..1DE6 ; Mn # [39] COMBINING DOTTED GRAVE ACCENT..COMBINING LATIN SMALL LETTER Z -1DFE..1DFF ; Mn # [2] COMBINING LEFT ARROWHEAD ABOVE..COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW -20D0..20DC ; Mn # [13] COMBINING LEFT HARPOON ABOVE..COMBINING FOUR DOTS ABOVE -20E1 ; Mn # COMBINING LEFT RIGHT ARROW ABOVE -20E5..20F0 ; Mn # [12] COMBINING REVERSE SOLIDUS OVERLAY..COMBINING ASTERISK ABOVE -2DE0..2DFF ; Mn # [32] COMBINING CYRILLIC LETTER BE..COMBINING CYRILLIC LETTER IOTIFIED BIG YUS -302A..302F ; Mn # [6] IDEOGRAPHIC LEVEL TONE MARK..HANGUL DOUBLE DOT TONE MARK -3099..309A ; Mn # [2] COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK..COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK -A66F ; Mn # COMBINING CYRILLIC VZMET -A67C..A67D ; Mn # [2] COMBINING CYRILLIC KAVYKA..COMBINING CYRILLIC PAYEROK -A802 ; Mn # SYLOTI NAGRI SIGN DVISVARA -A806 ; Mn # SYLOTI NAGRI SIGN HASANTA -A80B ; Mn # SYLOTI NAGRI SIGN ANUSVARA -A825..A826 ; Mn # [2] SYLOTI NAGRI VOWEL SIGN U..SYLOTI NAGRI VOWEL SIGN E -A8C4 ; Mn # SAURASHTRA SIGN VIRAMA -A926..A92D ; Mn # [8] KAYAH LI VOWEL UE..KAYAH LI TONE CALYA PLOPHU -A947..A951 ; Mn # [11] REJANG VOWEL SIGN I..REJANG CONSONANT SIGN R -AA29..AA2E ; Mn # [6] CHAM VOWEL SIGN AA..CHAM VOWEL SIGN OE -AA31..AA32 ; Mn # [2] CHAM VOWEL SIGN AU..CHAM VOWEL SIGN UE -AA35..AA36 ; Mn # [2] CHAM CONSONANT SIGN LA..CHAM CONSONANT SIGN WA -AA43 ; Mn # CHAM CONSONANT SIGN FINAL NG -AA4C ; Mn # CHAM CONSONANT SIGN FINAL M -FB1E ; Mn # HEBREW POINT JUDEO-SPANISH VARIKA -FE00..FE0F ; Mn # [16] VARIATION SELECTOR-1..VARIATION SELECTOR-16 -FE20..FE26 ; Mn # [7] COMBINING LIGATURE LEFT HALF..COMBINING CONJOINING MACRON -101FD ; Mn # PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE -10A01..10A03 ; Mn # [3] KHAROSHTHI VOWEL SIGN I..KHAROSHTHI VOWEL SIGN VOCALIC R -10A05..10A06 ; Mn # [2] KHAROSHTHI VOWEL SIGN E..KHAROSHTHI VOWEL SIGN O -10A0C..10A0F ; Mn # [4] KHAROSHTHI VOWEL LENGTH MARK..KHAROSHTHI SIGN VISARGA -10A38..10A3A ; Mn # [3] KHAROSHTHI SIGN BAR ABOVE..KHAROSHTHI SIGN DOT BELOW -10A3F ; Mn # KHAROSHTHI VIRAMA -1D167..1D169 ; Mn # [3] MUSICAL SYMBOL COMBINING TREMOLO-1..MUSICAL SYMBOL COMBINING TREMOLO-3 -1D17B..1D182 ; Mn # [8] MUSICAL SYMBOL COMBINING ACCENT..MUSICAL SYMBOL COMBINING LOURE -1D185..1D18B ; Mn # [7] MUSICAL SYMBOL COMBINING DOIT..MUSICAL SYMBOL COMBINING TRIPLE TONGUE -1D1AA..1D1AD ; Mn # [4] MUSICAL SYMBOL COMBINING DOWN BOW..MUSICAL SYMBOL COMBINING SNAP PIZZICATO -1D242..1D244 ; Mn # [3] COMBINING GREEK MUSICAL TRISEME..COMBINING GREEK MUSICAL PENTASEME -E0100..E01EF ; Mn # [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256 - -# Total code points: 1032 - -# ================================================ - -# General_Category=Enclosing_Mark - -0488..0489 ; Me # [2] COMBINING CYRILLIC HUNDRED THOUSANDS SIGN..COMBINING CYRILLIC MILLIONS SIGN -06DE ; Me # ARABIC START OF RUB EL HIZB -20DD..20E0 ; Me # [4] COMBINING ENCLOSING CIRCLE..COMBINING ENCLOSING CIRCLE BACKSLASH -20E2..20E4 ; Me # [3] COMBINING ENCLOSING SCREEN..COMBINING ENCLOSING UPWARD POINTING TRIANGLE -A670..A672 ; Me # [3] COMBINING CYRILLIC TEN MILLIONS SIGN..COMBINING CYRILLIC THOUSAND MILLIONS SIGN - -# Total code points: 13 - -# ================================================ - -# General_Category=Spacing_Mark - -0903 ; Mc # DEVANAGARI SIGN VISARGA -093E..0940 ; Mc # [3] DEVANAGARI VOWEL SIGN AA..DEVANAGARI VOWEL SIGN II -0949..094C ; Mc # [4] DEVANAGARI VOWEL SIGN CANDRA O..DEVANAGARI VOWEL SIGN AU -0982..0983 ; Mc # [2] BENGALI SIGN ANUSVARA..BENGALI SIGN VISARGA -09BE..09C0 ; Mc # [3] BENGALI VOWEL SIGN AA..BENGALI VOWEL SIGN II -09C7..09C8 ; Mc # [2] BENGALI VOWEL SIGN E..BENGALI VOWEL SIGN AI -09CB..09CC ; Mc # [2] BENGALI VOWEL SIGN O..BENGALI VOWEL SIGN AU -09D7 ; Mc # BENGALI AU LENGTH MARK -0A03 ; Mc # GURMUKHI SIGN VISARGA -0A3E..0A40 ; Mc # [3] GURMUKHI VOWEL SIGN AA..GURMUKHI VOWEL SIGN II -0A83 ; Mc # GUJARATI SIGN VISARGA -0ABE..0AC0 ; Mc # [3] GUJARATI VOWEL SIGN AA..GUJARATI VOWEL SIGN II -0AC9 ; Mc # GUJARATI VOWEL SIGN CANDRA O -0ACB..0ACC ; Mc # [2] GUJARATI VOWEL SIGN O..GUJARATI VOWEL SIGN AU -0B02..0B03 ; Mc # [2] ORIYA SIGN ANUSVARA..ORIYA SIGN VISARGA -0B3E ; Mc # ORIYA VOWEL SIGN AA -0B40 ; Mc # ORIYA VOWEL SIGN II -0B47..0B48 ; Mc # [2] ORIYA VOWEL SIGN E..ORIYA VOWEL SIGN AI -0B4B..0B4C ; Mc # [2] ORIYA VOWEL SIGN O..ORIYA VOWEL SIGN AU -0B57 ; Mc # ORIYA AU LENGTH MARK -0BBE..0BBF ; Mc # [2] TAMIL VOWEL SIGN AA..TAMIL VOWEL SIGN I -0BC1..0BC2 ; Mc # [2] TAMIL VOWEL SIGN U..TAMIL VOWEL SIGN UU -0BC6..0BC8 ; Mc # [3] TAMIL VOWEL SIGN E..TAMIL VOWEL SIGN AI -0BCA..0BCC ; Mc # [3] TAMIL VOWEL SIGN O..TAMIL VOWEL SIGN AU -0BD7 ; Mc # TAMIL AU LENGTH MARK -0C01..0C03 ; Mc # [3] TELUGU SIGN CANDRABINDU..TELUGU SIGN VISARGA -0C41..0C44 ; Mc # [4] TELUGU VOWEL SIGN U..TELUGU VOWEL SIGN VOCALIC RR -0C82..0C83 ; Mc # [2] KANNADA SIGN ANUSVARA..KANNADA SIGN VISARGA -0CBE ; Mc # KANNADA VOWEL SIGN AA -0CC0..0CC4 ; Mc # [5] KANNADA VOWEL SIGN II..KANNADA VOWEL SIGN VOCALIC RR -0CC7..0CC8 ; Mc # [2] KANNADA VOWEL SIGN EE..KANNADA VOWEL SIGN AI -0CCA..0CCB ; Mc # [2] KANNADA VOWEL SIGN O..KANNADA VOWEL SIGN OO -0CD5..0CD6 ; Mc # [2] KANNADA LENGTH MARK..KANNADA AI LENGTH MARK -0D02..0D03 ; Mc # [2] MALAYALAM SIGN ANUSVARA..MALAYALAM SIGN VISARGA -0D3E..0D40 ; Mc # [3] MALAYALAM VOWEL SIGN AA..MALAYALAM VOWEL SIGN II -0D46..0D48 ; Mc # [3] MALAYALAM VOWEL SIGN E..MALAYALAM VOWEL SIGN AI -0D4A..0D4C ; Mc # [3] MALAYALAM VOWEL SIGN O..MALAYALAM VOWEL SIGN AU -0D57 ; Mc # MALAYALAM AU LENGTH MARK -0D82..0D83 ; Mc # [2] SINHALA SIGN ANUSVARAYA..SINHALA SIGN VISARGAYA -0DCF..0DD1 ; Mc # [3] SINHALA VOWEL SIGN AELA-PILLA..SINHALA VOWEL SIGN DIGA AEDA-PILLA -0DD8..0DDF ; Mc # [8] SINHALA VOWEL SIGN GAETTA-PILLA..SINHALA VOWEL SIGN GAYANUKITTA -0DF2..0DF3 ; Mc # [2] SINHALA VOWEL SIGN DIGA GAETTA-PILLA..SINHALA VOWEL SIGN DIGA GAYANUKITTA -0F3E..0F3F ; Mc # [2] TIBETAN SIGN YAR TSHES..TIBETAN SIGN MAR TSHES -0F7F ; Mc # TIBETAN SIGN RNAM BCAD -102B..102C ; Mc # [2] MYANMAR VOWEL SIGN TALL AA..MYANMAR VOWEL SIGN AA -1031 ; Mc # MYANMAR VOWEL SIGN E -1038 ; Mc # MYANMAR SIGN VISARGA -103B..103C ; Mc # [2] MYANMAR CONSONANT SIGN MEDIAL YA..MYANMAR CONSONANT SIGN MEDIAL RA -1056..1057 ; Mc # [2] MYANMAR VOWEL SIGN VOCALIC R..MYANMAR VOWEL SIGN VOCALIC RR -1062..1064 ; Mc # [3] MYANMAR VOWEL SIGN SGAW KAREN EU..MYANMAR TONE MARK SGAW KAREN KE PHO -1067..106D ; Mc # [7] MYANMAR VOWEL SIGN WESTERN PWO KAREN EU..MYANMAR SIGN WESTERN PWO KAREN TONE-5 -1083..1084 ; Mc # [2] MYANMAR VOWEL SIGN SHAN AA..MYANMAR VOWEL SIGN SHAN E -1087..108C ; Mc # [6] MYANMAR SIGN SHAN TONE-2..MYANMAR SIGN SHAN COUNCIL TONE-3 -108F ; Mc # MYANMAR SIGN RUMAI PALAUNG TONE-5 -17B6 ; Mc # KHMER VOWEL SIGN AA -17BE..17C5 ; Mc # [8] KHMER VOWEL SIGN OE..KHMER VOWEL SIGN AU -17C7..17C8 ; Mc # [2] KHMER SIGN REAHMUK..KHMER SIGN YUUKALEAPINTU -1923..1926 ; Mc # [4] LIMBU VOWEL SIGN EE..LIMBU VOWEL SIGN AU -1929..192B ; Mc # [3] LIMBU SUBJOINED LETTER YA..LIMBU SUBJOINED LETTER WA -1930..1931 ; Mc # [2] LIMBU SMALL LETTER KA..LIMBU SMALL LETTER NGA -1933..1938 ; Mc # [6] LIMBU SMALL LETTER TA..LIMBU SMALL LETTER LA -19B0..19C0 ; Mc # [17] NEW TAI LUE VOWEL SIGN VOWEL SHORTENER..NEW TAI LUE VOWEL SIGN IY -19C8..19C9 ; Mc # [2] NEW TAI LUE TONE MARK-1..NEW TAI LUE TONE MARK-2 -1A19..1A1B ; Mc # [3] BUGINESE VOWEL SIGN E..BUGINESE VOWEL SIGN AE -1B04 ; Mc # BALINESE SIGN BISAH -1B35 ; Mc # BALINESE VOWEL SIGN TEDUNG -1B3B ; Mc # BALINESE VOWEL SIGN RA REPA TEDUNG -1B3D..1B41 ; Mc # [5] BALINESE VOWEL SIGN LA LENGA TEDUNG..BALINESE VOWEL SIGN TALING REPA TEDUNG -1B43..1B44 ; Mc # [2] BALINESE VOWEL SIGN PEPET TEDUNG..BALINESE ADEG ADEG -1B82 ; Mc # SUNDANESE SIGN PANGWISAD -1BA1 ; Mc # SUNDANESE CONSONANT SIGN PAMINGKAL -1BA6..1BA7 ; Mc # [2] SUNDANESE VOWEL SIGN PANAELAENG..SUNDANESE VOWEL SIGN PANOLONG -1BAA ; Mc # SUNDANESE SIGN PAMAAEH -1C24..1C2B ; Mc # [8] LEPCHA SUBJOINED LETTER YA..LEPCHA VOWEL SIGN UU -1C34..1C35 ; Mc # [2] LEPCHA CONSONANT SIGN NYIN-DO..LEPCHA CONSONANT SIGN KANG -A823..A824 ; Mc # [2] SYLOTI NAGRI VOWEL SIGN A..SYLOTI NAGRI VOWEL SIGN I -A827 ; Mc # SYLOTI NAGRI VOWEL SIGN OO -A880..A881 ; Mc # [2] SAURASHTRA SIGN ANUSVARA..SAURASHTRA SIGN VISARGA -A8B4..A8C3 ; Mc # [16] SAURASHTRA CONSONANT SIGN HAARU..SAURASHTRA VOWEL SIGN AU -A952..A953 ; Mc # [2] REJANG CONSONANT SIGN H..REJANG VIRAMA -AA2F..AA30 ; Mc # [2] CHAM VOWEL SIGN O..CHAM VOWEL SIGN AI -AA33..AA34 ; Mc # [2] CHAM CONSONANT SIGN YA..CHAM CONSONANT SIGN RA -AA4D ; Mc # CHAM CONSONANT SIGN FINAL H -1D165..1D166 ; Mc # [2] MUSICAL SYMBOL COMBINING STEM..MUSICAL SYMBOL COMBINING SPRECHGESANG STEM -1D16D..1D172 ; Mc # [6] MUSICAL SYMBOL COMBINING AUGMENTATION DOT..MUSICAL SYMBOL COMBINING FLAG-5 - -# Total code points: 236 - -# ================================================ - -# General_Category=Decimal_Number - -0030..0039 ; Nd # [10] DIGIT ZERO..DIGIT NINE -0660..0669 ; Nd # [10] ARABIC-INDIC DIGIT ZERO..ARABIC-INDIC DIGIT NINE -06F0..06F9 ; Nd # [10] EXTENDED ARABIC-INDIC DIGIT ZERO..EXTENDED ARABIC-INDIC DIGIT NINE -07C0..07C9 ; Nd # [10] NKO DIGIT ZERO..NKO DIGIT NINE -0966..096F ; Nd # [10] DEVANAGARI DIGIT ZERO..DEVANAGARI DIGIT NINE -09E6..09EF ; Nd # [10] BENGALI DIGIT ZERO..BENGALI DIGIT NINE -0A66..0A6F ; Nd # [10] GURMUKHI DIGIT ZERO..GURMUKHI DIGIT NINE -0AE6..0AEF ; Nd # [10] GUJARATI DIGIT ZERO..GUJARATI DIGIT NINE -0B66..0B6F ; Nd # [10] ORIYA DIGIT ZERO..ORIYA DIGIT NINE -0BE6..0BEF ; Nd # [10] TAMIL DIGIT ZERO..TAMIL DIGIT NINE -0C66..0C6F ; Nd # [10] TELUGU DIGIT ZERO..TELUGU DIGIT NINE -0CE6..0CEF ; Nd # [10] KANNADA DIGIT ZERO..KANNADA DIGIT NINE -0D66..0D6F ; Nd # [10] MALAYALAM DIGIT ZERO..MALAYALAM DIGIT NINE -0E50..0E59 ; Nd # [10] THAI DIGIT ZERO..THAI DIGIT NINE -0ED0..0ED9 ; Nd # [10] LAO DIGIT ZERO..LAO DIGIT NINE -0F20..0F29 ; Nd # [10] TIBETAN DIGIT ZERO..TIBETAN DIGIT NINE -1040..1049 ; Nd # [10] MYANMAR DIGIT ZERO..MYANMAR DIGIT NINE -1090..1099 ; Nd # [10] MYANMAR SHAN DIGIT ZERO..MYANMAR SHAN DIGIT NINE -17E0..17E9 ; Nd # [10] KHMER DIGIT ZERO..KHMER DIGIT NINE -1810..1819 ; Nd # [10] MONGOLIAN DIGIT ZERO..MONGOLIAN DIGIT NINE -1946..194F ; Nd # [10] LIMBU DIGIT ZERO..LIMBU DIGIT NINE -19D0..19D9 ; Nd # [10] NEW TAI LUE DIGIT ZERO..NEW TAI LUE DIGIT NINE -1B50..1B59 ; Nd # [10] BALINESE DIGIT ZERO..BALINESE DIGIT NINE -1BB0..1BB9 ; Nd # [10] SUNDANESE DIGIT ZERO..SUNDANESE DIGIT NINE -1C40..1C49 ; Nd # [10] LEPCHA DIGIT ZERO..LEPCHA DIGIT NINE -1C50..1C59 ; Nd # [10] OL CHIKI DIGIT ZERO..OL CHIKI DIGIT NINE -A620..A629 ; Nd # [10] VAI DIGIT ZERO..VAI DIGIT NINE -A8D0..A8D9 ; Nd # [10] SAURASHTRA DIGIT ZERO..SAURASHTRA DIGIT NINE -A900..A909 ; Nd # [10] KAYAH LI DIGIT ZERO..KAYAH LI DIGIT NINE -AA50..AA59 ; Nd # [10] CHAM DIGIT ZERO..CHAM DIGIT NINE -FF10..FF19 ; Nd # [10] FULLWIDTH DIGIT ZERO..FULLWIDTH DIGIT NINE -104A0..104A9 ; Nd # [10] OSMANYA DIGIT ZERO..OSMANYA DIGIT NINE -1D7CE..1D7FF ; Nd # [50] MATHEMATICAL BOLD DIGIT ZERO..MATHEMATICAL MONOSPACE DIGIT NINE - -# Total code points: 370 - -# ================================================ - -# General_Category=Letter_Number - -16EE..16F0 ; Nl # [3] RUNIC ARLAUG SYMBOL..RUNIC BELGTHOR SYMBOL -2160..2182 ; Nl # [35] ROMAN NUMERAL ONE..ROMAN NUMERAL TEN THOUSAND -2185..2188 ; Nl # [4] ROMAN NUMERAL SIX LATE FORM..ROMAN NUMERAL ONE HUNDRED THOUSAND -3007 ; Nl # IDEOGRAPHIC NUMBER ZERO -3021..3029 ; Nl # [9] HANGZHOU NUMERAL ONE..HANGZHOU NUMERAL NINE -3038..303A ; Nl # [3] HANGZHOU NUMERAL TEN..HANGZHOU NUMERAL THIRTY -10140..10174 ; Nl # [53] GREEK ACROPHONIC ATTIC ONE QUARTER..GREEK ACROPHONIC STRATIAN FIFTY MNAS -10341 ; Nl # GOTHIC LETTER NINETY -1034A ; Nl # GOTHIC LETTER NINE HUNDRED -103D1..103D5 ; Nl # [5] OLD PERSIAN NUMBER ONE..OLD PERSIAN NUMBER HUNDRED -12400..12462 ; Nl # [99] CUNEIFORM NUMERIC SIGN TWO ASH..CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE QUARTER - -# Total code points: 214 - -# ================================================ - -# General_Category=Other_Number - -00B2..00B3 ; No # [2] SUPERSCRIPT TWO..SUPERSCRIPT THREE -00B9 ; No # SUPERSCRIPT ONE -00BC..00BE ; No # [3] VULGAR FRACTION ONE QUARTER..VULGAR FRACTION THREE QUARTERS -09F4..09F9 ; No # [6] BENGALI CURRENCY NUMERATOR ONE..BENGALI CURRENCY DENOMINATOR SIXTEEN -0BF0..0BF2 ; No # [3] TAMIL NUMBER TEN..TAMIL NUMBER ONE THOUSAND -0C78..0C7E ; No # [7] TELUGU FRACTION DIGIT ZERO FOR ODD POWERS OF FOUR..TELUGU FRACTION DIGIT THREE FOR EVEN POWERS OF FOUR -0D70..0D75 ; No # [6] MALAYALAM NUMBER TEN..MALAYALAM FRACTION THREE QUARTERS -0F2A..0F33 ; No # [10] TIBETAN DIGIT HALF ONE..TIBETAN DIGIT HALF ZERO -1369..137C ; No # [20] ETHIOPIC DIGIT ONE..ETHIOPIC NUMBER TEN THOUSAND -17F0..17F9 ; No # [10] KHMER SYMBOL LEK ATTAK SON..KHMER SYMBOL LEK ATTAK PRAM-BUON -2070 ; No # SUPERSCRIPT ZERO -2074..2079 ; No # [6] SUPERSCRIPT FOUR..SUPERSCRIPT NINE -2080..2089 ; No # [10] SUBSCRIPT ZERO..SUBSCRIPT NINE -2153..215F ; No # [13] VULGAR FRACTION ONE THIRD..FRACTION NUMERATOR ONE -2460..249B ; No # [60] CIRCLED DIGIT ONE..NUMBER TWENTY FULL STOP -24EA..24FF ; No # [22] CIRCLED DIGIT ZERO..NEGATIVE CIRCLED DIGIT ZERO -2776..2793 ; No # [30] DINGBAT NEGATIVE CIRCLED DIGIT ONE..DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN -2CFD ; No # COPTIC FRACTION ONE HALF -3192..3195 ; No # [4] IDEOGRAPHIC ANNOTATION ONE MARK..IDEOGRAPHIC ANNOTATION FOUR MARK -3220..3229 ; No # [10] PARENTHESIZED IDEOGRAPH ONE..PARENTHESIZED IDEOGRAPH TEN -3251..325F ; No # [15] CIRCLED NUMBER TWENTY ONE..CIRCLED NUMBER THIRTY FIVE -3280..3289 ; No # [10] CIRCLED IDEOGRAPH ONE..CIRCLED IDEOGRAPH TEN -32B1..32BF ; No # [15] CIRCLED NUMBER THIRTY SIX..CIRCLED NUMBER FIFTY -10107..10133 ; No # [45] AEGEAN NUMBER ONE..AEGEAN NUMBER NINETY THOUSAND -10175..10178 ; No # [4] GREEK ONE HALF SIGN..GREEK THREE QUARTERS SIGN -1018A ; No # GREEK ZERO SIGN -10320..10323 ; No # [4] OLD ITALIC NUMERAL ONE..OLD ITALIC NUMERAL FIFTY -10916..10919 ; No # [4] PHOENICIAN NUMBER ONE..PHOENICIAN NUMBER ONE HUNDRED -10A40..10A47 ; No # [8] KHAROSHTHI DIGIT ONE..KHAROSHTHI NUMBER ONE THOUSAND -1D360..1D371 ; No # [18] COUNTING ROD UNIT DIGIT ONE..COUNTING ROD TENS DIGIT NINE - -# Total code points: 349 - -# ================================================ - -# General_Category=Space_Separator - -0020 ; Zs # SPACE -00A0 ; Zs # NO-BREAK SPACE -1680 ; Zs # OGHAM SPACE MARK -180E ; Zs # MONGOLIAN VOWEL SEPARATOR -2000..200A ; Zs # [11] EN QUAD..HAIR SPACE -202F ; Zs # NARROW NO-BREAK SPACE -205F ; Zs # MEDIUM MATHEMATICAL SPACE -3000 ; Zs # IDEOGRAPHIC SPACE - -# Total code points: 18 - -# ================================================ - -# General_Category=Line_Separator - -2028 ; Zl # LINE SEPARATOR - -# Total code points: 1 - -# ================================================ - -# General_Category=Paragraph_Separator - -2029 ; Zp # PARAGRAPH SEPARATOR - -# Total code points: 1 - -# ================================================ - -# General_Category=Control - -0000..001F ; Cc # [32] .. -007F..009F ; Cc # [33] .. - -# Total code points: 65 - -# ================================================ - -# General_Category=Format - -00AD ; Cf # SOFT HYPHEN -0600..0603 ; Cf # [4] ARABIC NUMBER SIGN..ARABIC SIGN SAFHA -06DD ; Cf # ARABIC END OF AYAH -070F ; Cf # SYRIAC ABBREVIATION MARK -17B4..17B5 ; Cf # [2] KHMER VOWEL INHERENT AQ..KHMER VOWEL INHERENT AA -200B..200F ; Cf # [5] ZERO WIDTH SPACE..RIGHT-TO-LEFT MARK -202A..202E ; Cf # [5] LEFT-TO-RIGHT EMBEDDING..RIGHT-TO-LEFT OVERRIDE -2060..2064 ; Cf # [5] WORD JOINER..INVISIBLE PLUS -206A..206F ; Cf # [6] INHIBIT SYMMETRIC SWAPPING..NOMINAL DIGIT SHAPES -FEFF ; Cf # ZERO WIDTH NO-BREAK SPACE -FFF9..FFFB ; Cf # [3] INTERLINEAR ANNOTATION ANCHOR..INTERLINEAR ANNOTATION TERMINATOR -1D173..1D17A ; Cf # [8] MUSICAL SYMBOL BEGIN BEAM..MUSICAL SYMBOL END PHRASE -E0001 ; Cf # LANGUAGE TAG -E0020..E007F ; Cf # [96] TAG SPACE..CANCEL TAG - -# Total code points: 139 - -# ================================================ - -# General_Category=Private_Use - -E000..F8FF ; Co # [6400] .. -F0000..FFFFD ; Co # [65534] .. -100000..10FFFD; Co # [65534] .. - -# Total code points: 137468 - -# ================================================ - -# General_Category=Surrogate - -D800..DFFF ; Cs # [2048] .. - -# Total code points: 2048 - -# ================================================ - -# General_Category=Dash_Punctuation - -002D ; Pd # HYPHEN-MINUS -058A ; Pd # ARMENIAN HYPHEN -05BE ; Pd # HEBREW PUNCTUATION MAQAF -1806 ; Pd # MONGOLIAN TODO SOFT HYPHEN -2010..2015 ; Pd # [6] HYPHEN..HORIZONTAL BAR -2E17 ; Pd # DOUBLE OBLIQUE HYPHEN -2E1A ; Pd # HYPHEN WITH DIAERESIS -301C ; Pd # WAVE DASH -3030 ; Pd # WAVY DASH -30A0 ; Pd # KATAKANA-HIRAGANA DOUBLE HYPHEN -FE31..FE32 ; Pd # [2] PRESENTATION FORM FOR VERTICAL EM DASH..PRESENTATION FORM FOR VERTICAL EN DASH -FE58 ; Pd # SMALL EM DASH -FE63 ; Pd # SMALL HYPHEN-MINUS -FF0D ; Pd # FULLWIDTH HYPHEN-MINUS - -# Total code points: 20 - -# ================================================ - -# General_Category=Open_Punctuation - -0028 ; Ps # LEFT PARENTHESIS -005B ; Ps # LEFT SQUARE BRACKET -007B ; Ps # LEFT CURLY BRACKET -0F3A ; Ps # TIBETAN MARK GUG RTAGS GYON -0F3C ; Ps # TIBETAN MARK ANG KHANG GYON -169B ; Ps # OGHAM FEATHER MARK -201A ; Ps # SINGLE LOW-9 QUOTATION MARK -201E ; Ps # DOUBLE LOW-9 QUOTATION MARK -2045 ; Ps # LEFT SQUARE BRACKET WITH QUILL -207D ; Ps # SUPERSCRIPT LEFT PARENTHESIS -208D ; Ps # SUBSCRIPT LEFT PARENTHESIS -2329 ; Ps # LEFT-POINTING ANGLE BRACKET -2768 ; Ps # MEDIUM LEFT PARENTHESIS ORNAMENT -276A ; Ps # MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT -276C ; Ps # MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT -276E ; Ps # HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT -2770 ; Ps # HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT -2772 ; Ps # LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT -2774 ; Ps # MEDIUM LEFT CURLY BRACKET ORNAMENT -27C5 ; Ps # LEFT S-SHAPED BAG DELIMITER -27E6 ; Ps # MATHEMATICAL LEFT WHITE SQUARE BRACKET -27E8 ; Ps # MATHEMATICAL LEFT ANGLE BRACKET -27EA ; Ps # MATHEMATICAL LEFT DOUBLE ANGLE BRACKET -27EC ; Ps # MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET -27EE ; Ps # MATHEMATICAL LEFT FLATTENED PARENTHESIS -2983 ; Ps # LEFT WHITE CURLY BRACKET -2985 ; Ps # LEFT WHITE PARENTHESIS -2987 ; Ps # Z NOTATION LEFT IMAGE BRACKET -2989 ; Ps # Z NOTATION LEFT BINDING BRACKET -298B ; Ps # LEFT SQUARE BRACKET WITH UNDERBAR -298D ; Ps # LEFT SQUARE BRACKET WITH TICK IN TOP CORNER -298F ; Ps # LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER -2991 ; Ps # LEFT ANGLE BRACKET WITH DOT -2993 ; Ps # LEFT ARC LESS-THAN BRACKET -2995 ; Ps # DOUBLE LEFT ARC GREATER-THAN BRACKET -2997 ; Ps # LEFT BLACK TORTOISE SHELL BRACKET -29D8 ; Ps # LEFT WIGGLY FENCE -29DA ; Ps # LEFT DOUBLE WIGGLY FENCE -29FC ; Ps # LEFT-POINTING CURVED ANGLE BRACKET -2E22 ; Ps # TOP LEFT HALF BRACKET -2E24 ; Ps # BOTTOM LEFT HALF BRACKET -2E26 ; Ps # LEFT SIDEWAYS U BRACKET -2E28 ; Ps # LEFT DOUBLE PARENTHESIS -3008 ; Ps # LEFT ANGLE BRACKET -300A ; Ps # LEFT DOUBLE ANGLE BRACKET -300C ; Ps # LEFT CORNER BRACKET -300E ; Ps # LEFT WHITE CORNER BRACKET -3010 ; Ps # LEFT BLACK LENTICULAR BRACKET -3014 ; Ps # LEFT TORTOISE SHELL BRACKET -3016 ; Ps # LEFT WHITE LENTICULAR BRACKET -3018 ; Ps # LEFT WHITE TORTOISE SHELL BRACKET -301A ; Ps # LEFT WHITE SQUARE BRACKET -301D ; Ps # REVERSED DOUBLE PRIME QUOTATION MARK -FD3E ; Ps # ORNATE LEFT PARENTHESIS -FE17 ; Ps # PRESENTATION FORM FOR VERTICAL LEFT WHITE LENTICULAR BRACKET -FE35 ; Ps # PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS -FE37 ; Ps # PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET -FE39 ; Ps # PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET -FE3B ; Ps # PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET -FE3D ; Ps # PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET -FE3F ; Ps # PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET -FE41 ; Ps # PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET -FE43 ; Ps # PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET -FE47 ; Ps # PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET -FE59 ; Ps # SMALL LEFT PARENTHESIS -FE5B ; Ps # SMALL LEFT CURLY BRACKET -FE5D ; Ps # SMALL LEFT TORTOISE SHELL BRACKET -FF08 ; Ps # FULLWIDTH LEFT PARENTHESIS -FF3B ; Ps # FULLWIDTH LEFT SQUARE BRACKET -FF5B ; Ps # FULLWIDTH LEFT CURLY BRACKET -FF5F ; Ps # FULLWIDTH LEFT WHITE PARENTHESIS -FF62 ; Ps # HALFWIDTH LEFT CORNER BRACKET - -# Total code points: 72 - -# ================================================ - -# General_Category=Close_Punctuation - -0029 ; Pe # RIGHT PARENTHESIS -005D ; Pe # RIGHT SQUARE BRACKET -007D ; Pe # RIGHT CURLY BRACKET -0F3B ; Pe # TIBETAN MARK GUG RTAGS GYAS -0F3D ; Pe # TIBETAN MARK ANG KHANG GYAS -169C ; Pe # OGHAM REVERSED FEATHER MARK -2046 ; Pe # RIGHT SQUARE BRACKET WITH QUILL -207E ; Pe # SUPERSCRIPT RIGHT PARENTHESIS -208E ; Pe # SUBSCRIPT RIGHT PARENTHESIS -232A ; Pe # RIGHT-POINTING ANGLE BRACKET -2769 ; Pe # MEDIUM RIGHT PARENTHESIS ORNAMENT -276B ; Pe # MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT -276D ; Pe # MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT -276F ; Pe # HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT -2771 ; Pe # HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT -2773 ; Pe # LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT -2775 ; Pe # MEDIUM RIGHT CURLY BRACKET ORNAMENT -27C6 ; Pe # RIGHT S-SHAPED BAG DELIMITER -27E7 ; Pe # MATHEMATICAL RIGHT WHITE SQUARE BRACKET -27E9 ; Pe # MATHEMATICAL RIGHT ANGLE BRACKET -27EB ; Pe # MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET -27ED ; Pe # MATHEMATICAL RIGHT WHITE TORTOISE SHELL BRACKET -27EF ; Pe # MATHEMATICAL RIGHT FLATTENED PARENTHESIS -2984 ; Pe # RIGHT WHITE CURLY BRACKET -2986 ; Pe # RIGHT WHITE PARENTHESIS -2988 ; Pe # Z NOTATION RIGHT IMAGE BRACKET -298A ; Pe # Z NOTATION RIGHT BINDING BRACKET -298C ; Pe # RIGHT SQUARE BRACKET WITH UNDERBAR -298E ; Pe # RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER -2990 ; Pe # RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER -2992 ; Pe # RIGHT ANGLE BRACKET WITH DOT -2994 ; Pe # RIGHT ARC GREATER-THAN BRACKET -2996 ; Pe # DOUBLE RIGHT ARC LESS-THAN BRACKET -2998 ; Pe # RIGHT BLACK TORTOISE SHELL BRACKET -29D9 ; Pe # RIGHT WIGGLY FENCE -29DB ; Pe # RIGHT DOUBLE WIGGLY FENCE -29FD ; Pe # RIGHT-POINTING CURVED ANGLE BRACKET -2E23 ; Pe # TOP RIGHT HALF BRACKET -2E25 ; Pe # BOTTOM RIGHT HALF BRACKET -2E27 ; Pe # RIGHT SIDEWAYS U BRACKET -2E29 ; Pe # RIGHT DOUBLE PARENTHESIS -3009 ; Pe # RIGHT ANGLE BRACKET -300B ; Pe # RIGHT DOUBLE ANGLE BRACKET -300D ; Pe # RIGHT CORNER BRACKET -300F ; Pe # RIGHT WHITE CORNER BRACKET -3011 ; Pe # RIGHT BLACK LENTICULAR BRACKET -3015 ; Pe # RIGHT TORTOISE SHELL BRACKET -3017 ; Pe # RIGHT WHITE LENTICULAR BRACKET -3019 ; Pe # RIGHT WHITE TORTOISE SHELL BRACKET -301B ; Pe # RIGHT WHITE SQUARE BRACKET -301E..301F ; Pe # [2] DOUBLE PRIME QUOTATION MARK..LOW DOUBLE PRIME QUOTATION MARK -FD3F ; Pe # ORNATE RIGHT PARENTHESIS -FE18 ; Pe # PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRAKCET -FE36 ; Pe # PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS -FE38 ; Pe # PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET -FE3A ; Pe # PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET -FE3C ; Pe # PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET -FE3E ; Pe # PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET -FE40 ; Pe # PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET -FE42 ; Pe # PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET -FE44 ; Pe # PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET -FE48 ; Pe # PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET -FE5A ; Pe # SMALL RIGHT PARENTHESIS -FE5C ; Pe # SMALL RIGHT CURLY BRACKET -FE5E ; Pe # SMALL RIGHT TORTOISE SHELL BRACKET -FF09 ; Pe # FULLWIDTH RIGHT PARENTHESIS -FF3D ; Pe # FULLWIDTH RIGHT SQUARE BRACKET -FF5D ; Pe # FULLWIDTH RIGHT CURLY BRACKET -FF60 ; Pe # FULLWIDTH RIGHT WHITE PARENTHESIS -FF63 ; Pe # HALFWIDTH RIGHT CORNER BRACKET - -# Total code points: 71 - -# ================================================ - -# General_Category=Connector_Punctuation - -005F ; Pc # LOW LINE -203F..2040 ; Pc # [2] UNDERTIE..CHARACTER TIE -2054 ; Pc # INVERTED UNDERTIE -FE33..FE34 ; Pc # [2] PRESENTATION FORM FOR VERTICAL LOW LINE..PRESENTATION FORM FOR VERTICAL WAVY LOW LINE -FE4D..FE4F ; Pc # [3] DASHED LOW LINE..WAVY LOW LINE -FF3F ; Pc # FULLWIDTH LOW LINE - -# Total code points: 10 - -# ================================================ - -# General_Category=Other_Punctuation - -0021..0023 ; Po # [3] EXCLAMATION MARK..NUMBER SIGN -0025..0027 ; Po # [3] PERCENT SIGN..APOSTROPHE -002A ; Po # ASTERISK -002C ; Po # COMMA -002E..002F ; Po # [2] FULL STOP..SOLIDUS -003A..003B ; Po # [2] COLON..SEMICOLON -003F..0040 ; Po # [2] QUESTION MARK..COMMERCIAL AT -005C ; Po # REVERSE SOLIDUS -00A1 ; Po # INVERTED EXCLAMATION MARK -00B7 ; Po # MIDDLE DOT -00BF ; Po # INVERTED QUESTION MARK -037E ; Po # GREEK QUESTION MARK -0387 ; Po # GREEK ANO TELEIA -055A..055F ; Po # [6] ARMENIAN APOSTROPHE..ARMENIAN ABBREVIATION MARK -0589 ; Po # ARMENIAN FULL STOP -05C0 ; Po # HEBREW PUNCTUATION PASEQ -05C3 ; Po # HEBREW PUNCTUATION SOF PASUQ -05C6 ; Po # HEBREW PUNCTUATION NUN HAFUKHA -05F3..05F4 ; Po # [2] HEBREW PUNCTUATION GERESH..HEBREW PUNCTUATION GERSHAYIM -0609..060A ; Po # [2] ARABIC-INDIC PER MILLE SIGN..ARABIC-INDIC PER TEN THOUSAND SIGN -060C..060D ; Po # [2] ARABIC COMMA..ARABIC DATE SEPARATOR -061B ; Po # ARABIC SEMICOLON -061E..061F ; Po # [2] ARABIC TRIPLE DOT PUNCTUATION MARK..ARABIC QUESTION MARK -066A..066D ; Po # [4] ARABIC PERCENT SIGN..ARABIC FIVE POINTED STAR -06D4 ; Po # ARABIC FULL STOP -0700..070D ; Po # [14] SYRIAC END OF PARAGRAPH..SYRIAC HARKLEAN ASTERISCUS -07F7..07F9 ; Po # [3] NKO SYMBOL GBAKURUNEN..NKO EXCLAMATION MARK -0964..0965 ; Po # [2] DEVANAGARI DANDA..DEVANAGARI DOUBLE DANDA -0970 ; Po # DEVANAGARI ABBREVIATION SIGN -0DF4 ; Po # SINHALA PUNCTUATION KUNDDALIYA -0E4F ; Po # THAI CHARACTER FONGMAN -0E5A..0E5B ; Po # [2] THAI CHARACTER ANGKHANKHU..THAI CHARACTER KHOMUT -0F04..0F12 ; Po # [15] TIBETAN MARK INITIAL YIG MGO MDUN MA..TIBETAN MARK RGYA GRAM SHAD -0F85 ; Po # TIBETAN MARK PALUTA -0FD0..0FD4 ; Po # [5] TIBETAN MARK BSKA- SHOG GI MGO RGYAN..TIBETAN MARK CLOSING BRDA RNYING YIG MGO SGAB MA -104A..104F ; Po # [6] MYANMAR SIGN LITTLE SECTION..MYANMAR SYMBOL GENITIVE -10FB ; Po # GEORGIAN PARAGRAPH SEPARATOR -1361..1368 ; Po # [8] ETHIOPIC WORDSPACE..ETHIOPIC PARAGRAPH SEPARATOR -166D..166E ; Po # [2] CANADIAN SYLLABICS CHI SIGN..CANADIAN SYLLABICS FULL STOP -16EB..16ED ; Po # [3] RUNIC SINGLE PUNCTUATION..RUNIC CROSS PUNCTUATION -1735..1736 ; Po # [2] PHILIPPINE SINGLE PUNCTUATION..PHILIPPINE DOUBLE PUNCTUATION -17D4..17D6 ; Po # [3] KHMER SIGN KHAN..KHMER SIGN CAMNUC PII KUUH -17D8..17DA ; Po # [3] KHMER SIGN BEYYAL..KHMER SIGN KOOMUUT -1800..1805 ; Po # [6] MONGOLIAN BIRGA..MONGOLIAN FOUR DOTS -1807..180A ; Po # [4] MONGOLIAN SIBE SYLLABLE BOUNDARY MARKER..MONGOLIAN NIRUGU -1944..1945 ; Po # [2] LIMBU EXCLAMATION MARK..LIMBU QUESTION MARK -19DE..19DF ; Po # [2] NEW TAI LUE SIGN LAE..NEW TAI LUE SIGN LAEV -1A1E..1A1F ; Po # [2] BUGINESE PALLAWA..BUGINESE END OF SECTION -1B5A..1B60 ; Po # [7] BALINESE PANTI..BALINESE PAMENENG -1C3B..1C3F ; Po # [5] LEPCHA PUNCTUATION TA-ROL..LEPCHA PUNCTUATION TSHOOK -1C7E..1C7F ; Po # [2] OL CHIKI PUNCTUATION MUCAAD..OL CHIKI PUNCTUATION DOUBLE MUCAAD -2016..2017 ; Po # [2] DOUBLE VERTICAL LINE..DOUBLE LOW LINE -2020..2027 ; Po # [8] DAGGER..HYPHENATION POINT -2030..2038 ; Po # [9] PER MILLE SIGN..CARET -203B..203E ; Po # [4] REFERENCE MARK..OVERLINE -2041..2043 ; Po # [3] CARET INSERTION POINT..HYPHEN BULLET -2047..2051 ; Po # [11] DOUBLE QUESTION MARK..TWO ASTERISKS ALIGNED VERTICALLY -2053 ; Po # SWUNG DASH -2055..205E ; Po # [10] FLOWER PUNCTUATION MARK..VERTICAL FOUR DOTS -2CF9..2CFC ; Po # [4] COPTIC OLD NUBIAN FULL STOP..COPTIC OLD NUBIAN VERSE DIVIDER -2CFE..2CFF ; Po # [2] COPTIC FULL STOP..COPTIC MORPHOLOGICAL DIVIDER -2E00..2E01 ; Po # [2] RIGHT ANGLE SUBSTITUTION MARKER..RIGHT ANGLE DOTTED SUBSTITUTION MARKER -2E06..2E08 ; Po # [3] RAISED INTERPOLATION MARKER..DOTTED TRANSPOSITION MARKER -2E0B ; Po # RAISED SQUARE -2E0E..2E16 ; Po # [9] EDITORIAL CORONIS..DOTTED RIGHT-POINTING ANGLE -2E18..2E19 ; Po # [2] INVERTED INTERROBANG..PALM BRANCH -2E1B ; Po # TILDE WITH RING ABOVE -2E1E..2E1F ; Po # [2] TILDE WITH DOT ABOVE..TILDE WITH DOT BELOW -2E2A..2E2E ; Po # [5] TWO DOTS OVER ONE DOT PUNCTUATION..REVERSED QUESTION MARK -2E30 ; Po # RING POINT -3001..3003 ; Po # [3] IDEOGRAPHIC COMMA..DITTO MARK -303D ; Po # PART ALTERNATION MARK -30FB ; Po # KATAKANA MIDDLE DOT -A60D..A60F ; Po # [3] VAI COMMA..VAI QUESTION MARK -A673 ; Po # SLAVONIC ASTERISK -A67E ; Po # CYRILLIC KAVYKA -A874..A877 ; Po # [4] PHAGS-PA SINGLE HEAD MARK..PHAGS-PA MARK DOUBLE SHAD -A8CE..A8CF ; Po # [2] SAURASHTRA DANDA..SAURASHTRA DOUBLE DANDA -A92E..A92F ; Po # [2] KAYAH LI SIGN CWI..KAYAH LI SIGN SHYA -A95F ; Po # REJANG SECTION MARK -AA5C..AA5F ; Po # [4] CHAM PUNCTUATION SPIRAL..CHAM PUNCTUATION TRIPLE DANDA -FE10..FE16 ; Po # [7] PRESENTATION FORM FOR VERTICAL COMMA..PRESENTATION FORM FOR VERTICAL QUESTION MARK -FE19 ; Po # PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS -FE30 ; Po # PRESENTATION FORM FOR VERTICAL TWO DOT LEADER -FE45..FE46 ; Po # [2] SESAME DOT..WHITE SESAME DOT -FE49..FE4C ; Po # [4] DASHED OVERLINE..DOUBLE WAVY OVERLINE -FE50..FE52 ; Po # [3] SMALL COMMA..SMALL FULL STOP -FE54..FE57 ; Po # [4] SMALL SEMICOLON..SMALL EXCLAMATION MARK -FE5F..FE61 ; Po # [3] SMALL NUMBER SIGN..SMALL ASTERISK -FE68 ; Po # SMALL REVERSE SOLIDUS -FE6A..FE6B ; Po # [2] SMALL PERCENT SIGN..SMALL COMMERCIAL AT -FF01..FF03 ; Po # [3] FULLWIDTH EXCLAMATION MARK..FULLWIDTH NUMBER SIGN -FF05..FF07 ; Po # [3] FULLWIDTH PERCENT SIGN..FULLWIDTH APOSTROPHE -FF0A ; Po # FULLWIDTH ASTERISK -FF0C ; Po # FULLWIDTH COMMA -FF0E..FF0F ; Po # [2] FULLWIDTH FULL STOP..FULLWIDTH SOLIDUS -FF1A..FF1B ; Po # [2] FULLWIDTH COLON..FULLWIDTH SEMICOLON -FF1F..FF20 ; Po # [2] FULLWIDTH QUESTION MARK..FULLWIDTH COMMERCIAL AT -FF3C ; Po # FULLWIDTH REVERSE SOLIDUS -FF61 ; Po # HALFWIDTH IDEOGRAPHIC FULL STOP -FF64..FF65 ; Po # [2] HALFWIDTH IDEOGRAPHIC COMMA..HALFWIDTH KATAKANA MIDDLE DOT -10100..10101 ; Po # [2] AEGEAN WORD SEPARATOR LINE..AEGEAN WORD SEPARATOR DOT -1039F ; Po # UGARITIC WORD DIVIDER -103D0 ; Po # OLD PERSIAN WORD DIVIDER -1091F ; Po # PHOENICIAN WORD SEPARATOR -1093F ; Po # LYDIAN TRIANGULAR MARK -10A50..10A58 ; Po # [9] KHAROSHTHI PUNCTUATION DOT..KHAROSHTHI PUNCTUATION LINES -12470..12473 ; Po # [4] CUNEIFORM PUNCTUATION SIGN OLD ASSYRIAN WORD DIVIDER..CUNEIFORM PUNCTUATION SIGN DIAGONAL TRICOLON - -# Total code points: 315 - -# ================================================ - -# General_Category=Math_Symbol - -002B ; Sm # PLUS SIGN -003C..003E ; Sm # [3] LESS-THAN SIGN..GREATER-THAN SIGN -007C ; Sm # VERTICAL LINE -007E ; Sm # TILDE -00AC ; Sm # NOT SIGN -00B1 ; Sm # PLUS-MINUS SIGN -00D7 ; Sm # MULTIPLICATION SIGN -00F7 ; Sm # DIVISION SIGN -03F6 ; Sm # GREEK REVERSED LUNATE EPSILON SYMBOL -0606..0608 ; Sm # [3] ARABIC-INDIC CUBE ROOT..ARABIC RAY -2044 ; Sm # FRACTION SLASH -2052 ; Sm # COMMERCIAL MINUS SIGN -207A..207C ; Sm # [3] SUPERSCRIPT PLUS SIGN..SUPERSCRIPT EQUALS SIGN -208A..208C ; Sm # [3] SUBSCRIPT PLUS SIGN..SUBSCRIPT EQUALS SIGN -2140..2144 ; Sm # [5] DOUBLE-STRUCK N-ARY SUMMATION..TURNED SANS-SERIF CAPITAL Y -214B ; Sm # TURNED AMPERSAND -2190..2194 ; Sm # [5] LEFTWARDS ARROW..LEFT RIGHT ARROW -219A..219B ; Sm # [2] LEFTWARDS ARROW WITH STROKE..RIGHTWARDS ARROW WITH STROKE -21A0 ; Sm # RIGHTWARDS TWO HEADED ARROW -21A3 ; Sm # RIGHTWARDS ARROW WITH TAIL -21A6 ; Sm # RIGHTWARDS ARROW FROM BAR -21AE ; Sm # LEFT RIGHT ARROW WITH STROKE -21CE..21CF ; Sm # [2] LEFT RIGHT DOUBLE ARROW WITH STROKE..RIGHTWARDS DOUBLE ARROW WITH STROKE -21D2 ; Sm # RIGHTWARDS DOUBLE ARROW -21D4 ; Sm # LEFT RIGHT DOUBLE ARROW -21F4..22FF ; Sm # [268] RIGHT ARROW WITH SMALL CIRCLE..Z NOTATION BAG MEMBERSHIP -2308..230B ; Sm # [4] LEFT CEILING..RIGHT FLOOR -2320..2321 ; Sm # [2] TOP HALF INTEGRAL..BOTTOM HALF INTEGRAL -237C ; Sm # RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW -239B..23B3 ; Sm # [25] LEFT PARENTHESIS UPPER HOOK..SUMMATION BOTTOM -23DC..23E1 ; Sm # [6] TOP PARENTHESIS..BOTTOM TORTOISE SHELL BRACKET -25B7 ; Sm # WHITE RIGHT-POINTING TRIANGLE -25C1 ; Sm # WHITE LEFT-POINTING TRIANGLE -25F8..25FF ; Sm # [8] UPPER LEFT TRIANGLE..LOWER RIGHT TRIANGLE -266F ; Sm # MUSIC SHARP SIGN -27C0..27C4 ; Sm # [5] THREE DIMENSIONAL ANGLE..OPEN SUPERSET -27C7..27CA ; Sm # [4] OR WITH DOT INSIDE..VERTICAL BAR WITH HORIZONTAL STROKE -27CC ; Sm # LONG DIVISION -27D0..27E5 ; Sm # [22] WHITE DIAMOND WITH CENTRED DOT..WHITE SQUARE WITH RIGHTWARDS TICK -27F0..27FF ; Sm # [16] UPWARDS QUADRUPLE ARROW..LONG RIGHTWARDS SQUIGGLE ARROW -2900..2982 ; Sm # [131] RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE..Z NOTATION TYPE COLON -2999..29D7 ; Sm # [63] DOTTED FENCE..BLACK HOURGLASS -29DC..29FB ; Sm # [32] INCOMPLETE INFINITY..TRIPLE PLUS -29FE..2AFF ; Sm # [258] TINY..N-ARY WHITE VERTICAL BAR -2B30..2B44 ; Sm # [21] LEFT ARROW WITH SMALL CIRCLE..RIGHTWARDS ARROW THROUGH SUPERSET -2B47..2B4C ; Sm # [6] REVERSE TILDE OPERATOR ABOVE RIGHTWARDS ARROW..RIGHTWARDS ARROW ABOVE REVERSE TILDE OPERATOR -FB29 ; Sm # HEBREW LETTER ALTERNATIVE PLUS SIGN -FE62 ; Sm # SMALL PLUS SIGN -FE64..FE66 ; Sm # [3] SMALL LESS-THAN SIGN..SMALL EQUALS SIGN -FF0B ; Sm # FULLWIDTH PLUS SIGN -FF1C..FF1E ; Sm # [3] FULLWIDTH LESS-THAN SIGN..FULLWIDTH GREATER-THAN SIGN -FF5C ; Sm # FULLWIDTH VERTICAL LINE -FF5E ; Sm # FULLWIDTH TILDE -FFE2 ; Sm # FULLWIDTH NOT SIGN -FFE9..FFEC ; Sm # [4] HALFWIDTH LEFTWARDS ARROW..HALFWIDTH DOWNWARDS ARROW -1D6C1 ; Sm # MATHEMATICAL BOLD NABLA -1D6DB ; Sm # MATHEMATICAL BOLD PARTIAL DIFFERENTIAL -1D6FB ; Sm # MATHEMATICAL ITALIC NABLA -1D715 ; Sm # MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL -1D735 ; Sm # MATHEMATICAL BOLD ITALIC NABLA -1D74F ; Sm # MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL -1D76F ; Sm # MATHEMATICAL SANS-SERIF BOLD NABLA -1D789 ; Sm # MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL -1D7A9 ; Sm # MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA -1D7C3 ; Sm # MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL - -# Total code points: 945 - -# ================================================ - -# General_Category=Currency_Symbol - -0024 ; Sc # DOLLAR SIGN -00A2..00A5 ; Sc # [4] CENT SIGN..YEN SIGN -060B ; Sc # AFGHANI SIGN -09F2..09F3 ; Sc # [2] BENGALI RUPEE MARK..BENGALI RUPEE SIGN -0AF1 ; Sc # GUJARATI RUPEE SIGN -0BF9 ; Sc # TAMIL RUPEE SIGN -0E3F ; Sc # THAI CURRENCY SYMBOL BAHT -17DB ; Sc # KHMER CURRENCY SYMBOL RIEL -20A0..20B5 ; Sc # [22] EURO-CURRENCY SIGN..CEDI SIGN -FDFC ; Sc # RIAL SIGN -FE69 ; Sc # SMALL DOLLAR SIGN -FF04 ; Sc # FULLWIDTH DOLLAR SIGN -FFE0..FFE1 ; Sc # [2] FULLWIDTH CENT SIGN..FULLWIDTH POUND SIGN -FFE5..FFE6 ; Sc # [2] FULLWIDTH YEN SIGN..FULLWIDTH WON SIGN - -# Total code points: 41 - -# ================================================ - -# General_Category=Modifier_Symbol - -005E ; Sk # CIRCUMFLEX ACCENT -0060 ; Sk # GRAVE ACCENT -00A8 ; Sk # DIAERESIS -00AF ; Sk # MACRON -00B4 ; Sk # ACUTE ACCENT -00B8 ; Sk # CEDILLA -02C2..02C5 ; Sk # [4] MODIFIER LETTER LEFT ARROWHEAD..MODIFIER LETTER DOWN ARROWHEAD -02D2..02DF ; Sk # [14] MODIFIER LETTER CENTRED RIGHT HALF RING..MODIFIER LETTER CROSS ACCENT -02E5..02EB ; Sk # [7] MODIFIER LETTER EXTRA-HIGH TONE BAR..MODIFIER LETTER YANG DEPARTING TONE MARK -02ED ; Sk # MODIFIER LETTER UNASPIRATED -02EF..02FF ; Sk # [17] MODIFIER LETTER LOW DOWN ARROWHEAD..MODIFIER LETTER LOW LEFT ARROW -0375 ; Sk # GREEK LOWER NUMERAL SIGN -0384..0385 ; Sk # [2] GREEK TONOS..GREEK DIALYTIKA TONOS -1FBD ; Sk # GREEK KORONIS -1FBF..1FC1 ; Sk # [3] GREEK PSILI..GREEK DIALYTIKA AND PERISPOMENI -1FCD..1FCF ; Sk # [3] GREEK PSILI AND VARIA..GREEK PSILI AND PERISPOMENI -1FDD..1FDF ; Sk # [3] GREEK DASIA AND VARIA..GREEK DASIA AND PERISPOMENI -1FED..1FEF ; Sk # [3] GREEK DIALYTIKA AND VARIA..GREEK VARIA -1FFD..1FFE ; Sk # [2] GREEK OXIA..GREEK DASIA -309B..309C ; Sk # [2] KATAKANA-HIRAGANA VOICED SOUND MARK..KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK -A700..A716 ; Sk # [23] MODIFIER LETTER CHINESE TONE YIN PING..MODIFIER LETTER EXTRA-LOW LEFT-STEM TONE BAR -A720..A721 ; Sk # [2] MODIFIER LETTER STRESS AND HIGH TONE..MODIFIER LETTER STRESS AND LOW TONE -A789..A78A ; Sk # [2] MODIFIER LETTER COLON..MODIFIER LETTER SHORT EQUALS SIGN -FF3E ; Sk # FULLWIDTH CIRCUMFLEX ACCENT -FF40 ; Sk # FULLWIDTH GRAVE ACCENT -FFE3 ; Sk # FULLWIDTH MACRON - -# Total code points: 99 - -# ================================================ - -# General_Category=Other_Symbol - -00A6..00A7 ; So # [2] BROKEN BAR..SECTION SIGN -00A9 ; So # COPYRIGHT SIGN -00AE ; So # REGISTERED SIGN -00B0 ; So # DEGREE SIGN -00B6 ; So # PILCROW SIGN -0482 ; So # CYRILLIC THOUSANDS SIGN -060E..060F ; So # [2] ARABIC POETIC VERSE SIGN..ARABIC SIGN MISRA -06E9 ; So # ARABIC PLACE OF SAJDAH -06FD..06FE ; So # [2] ARABIC SIGN SINDHI AMPERSAND..ARABIC SIGN SINDHI POSTPOSITION MEN -07F6 ; So # NKO SYMBOL OO DENNEN -09FA ; So # BENGALI ISSHAR -0B70 ; So # ORIYA ISSHAR -0BF3..0BF8 ; So # [6] TAMIL DAY SIGN..TAMIL AS ABOVE SIGN -0BFA ; So # TAMIL NUMBER SIGN -0C7F ; So # TELUGU SIGN TUUMU -0CF1..0CF2 ; So # [2] KANNADA SIGN JIHVAMULIYA..KANNADA SIGN UPADHMANIYA -0D79 ; So # MALAYALAM DATE MARK -0F01..0F03 ; So # [3] TIBETAN MARK GTER YIG MGO TRUNCATED A..TIBETAN MARK GTER YIG MGO -UM GTER TSHEG MA -0F13..0F17 ; So # [5] TIBETAN MARK CARET -DZUD RTAGS ME LONG CAN..TIBETAN ASTROLOGICAL SIGN SGRA GCAN -CHAR RTAGS -0F1A..0F1F ; So # [6] TIBETAN SIGN RDEL DKAR GCIG..TIBETAN SIGN RDEL DKAR RDEL NAG -0F34 ; So # TIBETAN MARK BSDUS RTAGS -0F36 ; So # TIBETAN MARK CARET -DZUD RTAGS BZHI MIG CAN -0F38 ; So # TIBETAN MARK CHE MGO -0FBE..0FC5 ; So # [8] TIBETAN KU RU KHA..TIBETAN SYMBOL RDO RJE -0FC7..0FCC ; So # [6] TIBETAN SYMBOL RDO RJE RGYA GRAM..TIBETAN SYMBOL NOR BU BZHI -KHYIL -0FCE..0FCF ; So # [2] TIBETAN SIGN RDEL NAG RDEL DKAR..TIBETAN SIGN RDEL NAG GSUM -109E..109F ; So # [2] MYANMAR SYMBOL SHAN ONE..MYANMAR SYMBOL SHAN EXCLAMATION -1360 ; So # ETHIOPIC SECTION MARK -1390..1399 ; So # [10] ETHIOPIC TONAL MARK YIZET..ETHIOPIC TONAL MARK KURT -1940 ; So # LIMBU SIGN LOO -19E0..19FF ; So # [32] KHMER SYMBOL PATHAMASAT..KHMER SYMBOL DAP-PRAM ROC -1B61..1B6A ; So # [10] BALINESE MUSICAL SYMBOL DONG..BALINESE MUSICAL SYMBOL DANG GEDE -1B74..1B7C ; So # [9] BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DUG..BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PING -2100..2101 ; So # [2] ACCOUNT OF..ADDRESSED TO THE SUBJECT -2103..2106 ; So # [4] DEGREE CELSIUS..CADA UNA -2108..2109 ; So # [2] SCRUPLE..DEGREE FAHRENHEIT -2114 ; So # L B BAR SYMBOL -2116..2118 ; So # [3] NUMERO SIGN..SCRIPT CAPITAL P -211E..2123 ; So # [6] PRESCRIPTION TAKE..VERSICLE -2125 ; So # OUNCE SIGN -2127 ; So # INVERTED OHM SIGN -2129 ; So # TURNED GREEK SMALL LETTER IOTA -212E ; So # ESTIMATED SYMBOL -213A..213B ; So # [2] ROTATED CAPITAL Q..FACSIMILE SIGN -214A ; So # PROPERTY LINE -214C..214D ; So # [2] PER SIGN..AKTIESELSKAB -214F ; So # SYMBOL FOR SAMARITAN SOURCE -2195..2199 ; So # [5] UP DOWN ARROW..SOUTH WEST ARROW -219C..219F ; So # [4] LEFTWARDS WAVE ARROW..UPWARDS TWO HEADED ARROW -21A1..21A2 ; So # [2] DOWNWARDS TWO HEADED ARROW..LEFTWARDS ARROW WITH TAIL -21A4..21A5 ; So # [2] LEFTWARDS ARROW FROM BAR..UPWARDS ARROW FROM BAR -21A7..21AD ; So # [7] DOWNWARDS ARROW FROM BAR..LEFT RIGHT WAVE ARROW -21AF..21CD ; So # [31] DOWNWARDS ZIGZAG ARROW..LEFTWARDS DOUBLE ARROW WITH STROKE -21D0..21D1 ; So # [2] LEFTWARDS DOUBLE ARROW..UPWARDS DOUBLE ARROW -21D3 ; So # DOWNWARDS DOUBLE ARROW -21D5..21F3 ; So # [31] UP DOWN DOUBLE ARROW..UP DOWN WHITE ARROW -2300..2307 ; So # [8] DIAMETER SIGN..WAVY LINE -230C..231F ; So # [20] BOTTOM RIGHT CROP..BOTTOM RIGHT CORNER -2322..2328 ; So # [7] FROWN..KEYBOARD -232B..237B ; So # [81] ERASE TO THE LEFT..NOT CHECK MARK -237D..239A ; So # [30] SHOULDERED OPEN BOX..CLEAR SCREEN SYMBOL -23B4..23DB ; So # [40] TOP SQUARE BRACKET..FUSE -23E2..23E7 ; So # [6] WHITE TRAPEZIUM..ELECTRICAL INTERSECTION -2400..2426 ; So # [39] SYMBOL FOR NULL..SYMBOL FOR SUBSTITUTE FORM TWO -2440..244A ; So # [11] OCR HOOK..OCR DOUBLE BACKSLASH -249C..24E9 ; So # [78] PARENTHESIZED LATIN SMALL LETTER A..CIRCLED LATIN SMALL LETTER Z -2500..25B6 ; So # [183] BOX DRAWINGS LIGHT HORIZONTAL..BLACK RIGHT-POINTING TRIANGLE -25B8..25C0 ; So # [9] BLACK RIGHT-POINTING SMALL TRIANGLE..BLACK LEFT-POINTING TRIANGLE -25C2..25F7 ; So # [54] BLACK LEFT-POINTING SMALL TRIANGLE..WHITE CIRCLE WITH UPPER RIGHT QUADRANT -2600..266E ; So # [111] BLACK SUN WITH RAYS..MUSIC NATURAL SIGN -2670..269D ; So # [46] WEST SYRIAC CROSS..OUTLINED WHITE STAR -26A0..26BC ; So # [29] WARNING SIGN..SESQUIQUADRATE -26C0..26C3 ; So # [4] WHITE DRAUGHTS MAN..BLACK DRAUGHTS KING -2701..2704 ; So # [4] UPPER BLADE SCISSORS..WHITE SCISSORS -2706..2709 ; So # [4] TELEPHONE LOCATION SIGN..ENVELOPE -270C..2727 ; So # [28] VICTORY HAND..WHITE FOUR POINTED STAR -2729..274B ; So # [35] STRESS OUTLINED WHITE STAR..HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK -274D ; So # SHADOWED WHITE CIRCLE -274F..2752 ; So # [4] LOWER RIGHT DROP-SHADOWED WHITE SQUARE..UPPER RIGHT SHADOWED WHITE SQUARE -2756 ; So # BLACK DIAMOND MINUS WHITE X -2758..275E ; So # [7] LIGHT VERTICAL BAR..HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT -2761..2767 ; So # [7] CURVED STEM PARAGRAPH SIGN ORNAMENT..ROTATED FLORAL HEART BULLET -2794 ; So # HEAVY WIDE-HEADED RIGHTWARDS ARROW -2798..27AF ; So # [24] HEAVY SOUTH EAST ARROW..NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW -27B1..27BE ; So # [14] NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW..OPEN-OUTLINED RIGHTWARDS ARROW -2800..28FF ; So # [256] BRAILLE PATTERN BLANK..BRAILLE PATTERN DOTS-12345678 -2B00..2B2F ; So # [48] NORTH EAST WHITE ARROW..WHITE VERTICAL ELLIPSE -2B45..2B46 ; So # [2] LEFTWARDS QUADRUPLE ARROW..RIGHTWARDS QUADRUPLE ARROW -2B50..2B54 ; So # [5] WHITE MEDIUM STAR..WHITE RIGHT-POINTING PENTAGON -2CE5..2CEA ; So # [6] COPTIC SYMBOL MI RO..COPTIC SYMBOL SHIMA SIMA -2E80..2E99 ; So # [26] CJK RADICAL REPEAT..CJK RADICAL RAP -2E9B..2EF3 ; So # [89] CJK RADICAL CHOKE..CJK RADICAL C-SIMPLIFIED TURTLE -2F00..2FD5 ; So # [214] KANGXI RADICAL ONE..KANGXI RADICAL FLUTE -2FF0..2FFB ; So # [12] IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT..IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID -3004 ; So # JAPANESE INDUSTRIAL STANDARD SYMBOL -3012..3013 ; So # [2] POSTAL MARK..GETA MARK -3020 ; So # POSTAL MARK FACE -3036..3037 ; So # [2] CIRCLED POSTAL MARK..IDEOGRAPHIC TELEGRAPH LINE FEED SEPARATOR SYMBOL -303E..303F ; So # [2] IDEOGRAPHIC VARIATION INDICATOR..IDEOGRAPHIC HALF FILL SPACE -3190..3191 ; So # [2] IDEOGRAPHIC ANNOTATION LINKING MARK..IDEOGRAPHIC ANNOTATION REVERSE MARK -3196..319F ; So # [10] IDEOGRAPHIC ANNOTATION TOP MARK..IDEOGRAPHIC ANNOTATION MAN MARK -31C0..31E3 ; So # [36] CJK STROKE T..CJK STROKE Q -3200..321E ; So # [31] PARENTHESIZED HANGUL KIYEOK..PARENTHESIZED KOREAN CHARACTER O HU -322A..3243 ; So # [26] PARENTHESIZED IDEOGRAPH MOON..PARENTHESIZED IDEOGRAPH REACH -3250 ; So # PARTNERSHIP SIGN -3260..327F ; So # [32] CIRCLED HANGUL KIYEOK..KOREAN STANDARD SYMBOL -328A..32B0 ; So # [39] CIRCLED IDEOGRAPH MOON..CIRCLED IDEOGRAPH NIGHT -32C0..32FE ; So # [63] IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY..CIRCLED KATAKANA WO -3300..33FF ; So # [256] SQUARE APAATO..SQUARE GAL -4DC0..4DFF ; So # [64] HEXAGRAM FOR THE CREATIVE HEAVEN..HEXAGRAM FOR BEFORE COMPLETION -A490..A4C6 ; So # [55] YI RADICAL QOT..YI RADICAL KE -A828..A82B ; So # [4] SYLOTI NAGRI POETRY MARK-1..SYLOTI NAGRI POETRY MARK-4 -FDFD ; So # ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM -FFE4 ; So # FULLWIDTH BROKEN BAR -FFE8 ; So # HALFWIDTH FORMS LIGHT VERTICAL -FFED..FFEE ; So # [2] HALFWIDTH BLACK SQUARE..HALFWIDTH WHITE CIRCLE -FFFC..FFFD ; So # [2] OBJECT REPLACEMENT CHARACTER..REPLACEMENT CHARACTER -10102 ; So # AEGEAN CHECK MARK -10137..1013F ; So # [9] AEGEAN WEIGHT BASE UNIT..AEGEAN MEASURE THIRD SUBUNIT -10179..10189 ; So # [17] GREEK YEAR SIGN..GREEK TRYBLION BASE SIGN -10190..1019B ; So # [12] ROMAN SEXTANS SIGN..ROMAN CENTURIAL SIGN -101D0..101FC ; So # [45] PHAISTOS DISC SIGN PEDESTRIAN..PHAISTOS DISC SIGN WAVY BAND -1D000..1D0F5 ; So # [246] BYZANTINE MUSICAL SYMBOL PSILI..BYZANTINE MUSICAL SYMBOL GORGON NEO KATO -1D100..1D126 ; So # [39] MUSICAL SYMBOL SINGLE BARLINE..MUSICAL SYMBOL DRUM CLEF-2 -1D129..1D164 ; So # [60] MUSICAL SYMBOL MULTIPLE MEASURE REST..MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE -1D16A..1D16C ; So # [3] MUSICAL SYMBOL FINGERED TREMOLO-1..MUSICAL SYMBOL FINGERED TREMOLO-3 -1D183..1D184 ; So # [2] MUSICAL SYMBOL ARPEGGIATO UP..MUSICAL SYMBOL ARPEGGIATO DOWN -1D18C..1D1A9 ; So # [30] MUSICAL SYMBOL RINFORZANDO..MUSICAL SYMBOL DEGREE SLASH -1D1AE..1D1DD ; So # [48] MUSICAL SYMBOL PEDAL MARK..MUSICAL SYMBOL PES SUBPUNCTIS -1D200..1D241 ; So # [66] GREEK VOCAL NOTATION SYMBOL-1..GREEK INSTRUMENTAL NOTATION SYMBOL-54 -1D245 ; So # GREEK MUSICAL LEIMMA -1D300..1D356 ; So # [87] MONOGRAM FOR EARTH..TETRAGRAM FOR FOSTERING -1F000..1F02B ; So # [44] MAHJONG TILE EAST WIND..MAHJONG TILE BACK -1F030..1F093 ; So # [100] DOMINO TILE HORIZONTAL BACK..DOMINO TILE VERTICAL-06-06 - -# Total code points: 3225 - -# ================================================ - -# General_Category=Initial_Punctuation - -00AB ; Pi # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK -2018 ; Pi # LEFT SINGLE QUOTATION MARK -201B..201C ; Pi # [2] SINGLE HIGH-REVERSED-9 QUOTATION MARK..LEFT DOUBLE QUOTATION MARK -201F ; Pi # DOUBLE HIGH-REVERSED-9 QUOTATION MARK -2039 ; Pi # SINGLE LEFT-POINTING ANGLE QUOTATION MARK -2E02 ; Pi # LEFT SUBSTITUTION BRACKET -2E04 ; Pi # LEFT DOTTED SUBSTITUTION BRACKET -2E09 ; Pi # LEFT TRANSPOSITION BRACKET -2E0C ; Pi # LEFT RAISED OMISSION BRACKET -2E1C ; Pi # LEFT LOW PARAPHRASE BRACKET -2E20 ; Pi # LEFT VERTICAL BAR WITH QUILL - -# Total code points: 12 - -# ================================================ - -# General_Category=Final_Punctuation - -00BB ; Pf # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK -2019 ; Pf # RIGHT SINGLE QUOTATION MARK -201D ; Pf # RIGHT DOUBLE QUOTATION MARK -203A ; Pf # SINGLE RIGHT-POINTING ANGLE QUOTATION MARK -2E03 ; Pf # RIGHT SUBSTITUTION BRACKET -2E05 ; Pf # RIGHT DOTTED SUBSTITUTION BRACKET -2E0A ; Pf # RIGHT TRANSPOSITION BRACKET -2E0D ; Pf # RIGHT RAISED OMISSION BRACKET -2E1D ; Pf # RIGHT LOW PARAPHRASE BRACKET -2E21 ; Pf # RIGHT VERTICAL BAR WITH QUILL - -# Total code points: 10 - -# EOF diff --git a/third_party/harfbuzz/contrib/tables/GraphemeBreakProperty.txt b/third_party/harfbuzz/contrib/tables/GraphemeBreakProperty.txt deleted file mode 100644 index 50477a15ea..0000000000 --- a/third_party/harfbuzz/contrib/tables/GraphemeBreakProperty.txt +++ /dev/null @@ -1,1166 +0,0 @@ -# GraphemeBreakProperty-5.1.0.txt -# Date: 2008-03-03, 21:57:47 GMT [MD] -# -# Unicode Character Database -# Copyright (c) 1991-2008 Unicode, Inc. -# For terms of use, see http://www.unicode.org/terms_of_use.html -# For documentation, see UCD.html - -# ================================================ - -# Property: Grapheme_Cluster_Break - -# All code points not explicitly listed for Grapheme_Cluster_Break -# have the value Other (XX). - -# @missing: 0000..10FFFF; Other - -# ================================================ - -000D ; CR # Cc - -# Total code points: 1 - -# ================================================ - -000A ; LF # Cc - -# Total code points: 1 - -# ================================================ - -0000..0009 ; Control # Cc [10] .. -000B..000C ; Control # Cc [2] .. -000E..001F ; Control # Cc [18] .. -007F..009F ; Control # Cc [33] .. -00AD ; Control # Cf SOFT HYPHEN -0600..0603 ; Control # Cf [4] ARABIC NUMBER SIGN..ARABIC SIGN SAFHA -06DD ; Control # Cf ARABIC END OF AYAH -070F ; Control # Cf SYRIAC ABBREVIATION MARK -17B4..17B5 ; Control # Cf [2] KHMER VOWEL INHERENT AQ..KHMER VOWEL INHERENT AA -200B ; Control # Cf ZERO WIDTH SPACE -200E..200F ; Control # Cf [2] LEFT-TO-RIGHT MARK..RIGHT-TO-LEFT MARK -2028 ; Control # Zl LINE SEPARATOR -2029 ; Control # Zp PARAGRAPH SEPARATOR -202A..202E ; Control # Cf [5] LEFT-TO-RIGHT EMBEDDING..RIGHT-TO-LEFT OVERRIDE -2060..2064 ; Control # Cf [5] WORD JOINER..INVISIBLE PLUS -206A..206F ; Control # Cf [6] INHIBIT SYMMETRIC SWAPPING..NOMINAL DIGIT SHAPES -FEFF ; Control # Cf ZERO WIDTH NO-BREAK SPACE -FFF9..FFFB ; Control # Cf [3] INTERLINEAR ANNOTATION ANCHOR..INTERLINEAR ANNOTATION TERMINATOR -1D173..1D17A ; Control # Cf [8] MUSICAL SYMBOL BEGIN BEAM..MUSICAL SYMBOL END PHRASE -E0001 ; Control # Cf LANGUAGE TAG -E0020..E007F ; Control # Cf [96] TAG SPACE..CANCEL TAG - -# Total code points: 202 - -# ================================================ - -0300..036F ; Extend # Mn [112] COMBINING GRAVE ACCENT..COMBINING LATIN SMALL LETTER X -0483..0487 ; Extend # Mn [5] COMBINING CYRILLIC TITLO..COMBINING CYRILLIC POKRYTIE -0488..0489 ; Extend # Me [2] COMBINING CYRILLIC HUNDRED THOUSANDS SIGN..COMBINING CYRILLIC MILLIONS SIGN -0591..05BD ; Extend # Mn [45] HEBREW ACCENT ETNAHTA..HEBREW POINT METEG -05BF ; Extend # Mn HEBREW POINT RAFE -05C1..05C2 ; Extend # Mn [2] HEBREW POINT SHIN DOT..HEBREW POINT SIN DOT -05C4..05C5 ; Extend # Mn [2] HEBREW MARK UPPER DOT..HEBREW MARK LOWER DOT -05C7 ; Extend # Mn HEBREW POINT QAMATS QATAN -0610..061A ; Extend # Mn [11] ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM..ARABIC SMALL KASRA -064B..065E ; Extend # Mn [20] ARABIC FATHATAN..ARABIC FATHA WITH TWO DOTS -0670 ; Extend # Mn ARABIC LETTER SUPERSCRIPT ALEF -06D6..06DC ; Extend # Mn [7] ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA..ARABIC SMALL HIGH SEEN -06DE ; Extend # Me ARABIC START OF RUB EL HIZB -06DF..06E4 ; Extend # Mn [6] ARABIC SMALL HIGH ROUNDED ZERO..ARABIC SMALL HIGH MADDA -06E7..06E8 ; Extend # Mn [2] ARABIC SMALL HIGH YEH..ARABIC SMALL HIGH NOON -06EA..06ED ; Extend # Mn [4] ARABIC EMPTY CENTRE LOW STOP..ARABIC SMALL LOW MEEM -0711 ; Extend # Mn SYRIAC LETTER SUPERSCRIPT ALAPH -0730..074A ; Extend # Mn [27] SYRIAC PTHAHA ABOVE..SYRIAC BARREKH -07A6..07B0 ; Extend # Mn [11] THAANA ABAFILI..THAANA SUKUN -07EB..07F3 ; Extend # Mn [9] NKO COMBINING SHORT HIGH TONE..NKO COMBINING DOUBLE DOT ABOVE -0901..0902 ; Extend # Mn [2] DEVANAGARI SIGN CANDRABINDU..DEVANAGARI SIGN ANUSVARA -093C ; Extend # Mn DEVANAGARI SIGN NUKTA -0941..0948 ; Extend # Mn [8] DEVANAGARI VOWEL SIGN U..DEVANAGARI VOWEL SIGN AI -094D ; Extend # Mn DEVANAGARI SIGN VIRAMA -0951..0954 ; Extend # Mn [4] DEVANAGARI STRESS SIGN UDATTA..DEVANAGARI ACUTE ACCENT -0962..0963 ; Extend # Mn [2] DEVANAGARI VOWEL SIGN VOCALIC L..DEVANAGARI VOWEL SIGN VOCALIC LL -0981 ; Extend # Mn BENGALI SIGN CANDRABINDU -09BC ; Extend # Mn BENGALI SIGN NUKTA -09BE ; Extend # Mc BENGALI VOWEL SIGN AA -09C1..09C4 ; Extend # Mn [4] BENGALI VOWEL SIGN U..BENGALI VOWEL SIGN VOCALIC RR -09CD ; Extend # Mn BENGALI SIGN VIRAMA -09D7 ; Extend # Mc BENGALI AU LENGTH MARK -09E2..09E3 ; Extend # Mn [2] BENGALI VOWEL SIGN VOCALIC L..BENGALI VOWEL SIGN VOCALIC LL -0A01..0A02 ; Extend # Mn [2] GURMUKHI SIGN ADAK BINDI..GURMUKHI SIGN BINDI -0A3C ; Extend # Mn GURMUKHI SIGN NUKTA -0A41..0A42 ; Extend # Mn [2] GURMUKHI VOWEL SIGN U..GURMUKHI VOWEL SIGN UU -0A47..0A48 ; Extend # Mn [2] GURMUKHI VOWEL SIGN EE..GURMUKHI VOWEL SIGN AI -0A4B..0A4D ; Extend # Mn [3] GURMUKHI VOWEL SIGN OO..GURMUKHI SIGN VIRAMA -0A51 ; Extend # Mn GURMUKHI SIGN UDAAT -0A70..0A71 ; Extend # Mn [2] GURMUKHI TIPPI..GURMUKHI ADDAK -0A75 ; Extend # Mn GURMUKHI SIGN YAKASH -0A81..0A82 ; Extend # Mn [2] GUJARATI SIGN CANDRABINDU..GUJARATI SIGN ANUSVARA -0ABC ; Extend # Mn GUJARATI SIGN NUKTA -0AC1..0AC5 ; Extend # Mn [5] GUJARATI VOWEL SIGN U..GUJARATI VOWEL SIGN CANDRA E -0AC7..0AC8 ; Extend # Mn [2] GUJARATI VOWEL SIGN E..GUJARATI VOWEL SIGN AI -0ACD ; Extend # Mn GUJARATI SIGN VIRAMA -0AE2..0AE3 ; Extend # Mn [2] GUJARATI VOWEL SIGN VOCALIC L..GUJARATI VOWEL SIGN VOCALIC LL -0B01 ; Extend # Mn ORIYA SIGN CANDRABINDU -0B3C ; Extend # Mn ORIYA SIGN NUKTA -0B3E ; Extend # Mc ORIYA VOWEL SIGN AA -0B3F ; Extend # Mn ORIYA VOWEL SIGN I -0B41..0B44 ; Extend # Mn [4] ORIYA VOWEL SIGN U..ORIYA VOWEL SIGN VOCALIC RR -0B4D ; Extend # Mn ORIYA SIGN VIRAMA -0B56 ; Extend # Mn ORIYA AI LENGTH MARK -0B57 ; Extend # Mc ORIYA AU LENGTH MARK -0B62..0B63 ; Extend # Mn [2] ORIYA VOWEL SIGN VOCALIC L..ORIYA VOWEL SIGN VOCALIC LL -0B82 ; Extend # Mn TAMIL SIGN ANUSVARA -0BBE ; Extend # Mc TAMIL VOWEL SIGN AA -0BC0 ; Extend # Mn TAMIL VOWEL SIGN II -0BCD ; Extend # Mn TAMIL SIGN VIRAMA -0BD7 ; Extend # Mc TAMIL AU LENGTH MARK -0C3E..0C40 ; Extend # Mn [3] TELUGU VOWEL SIGN AA..TELUGU VOWEL SIGN II -0C46..0C48 ; Extend # Mn [3] TELUGU VOWEL SIGN E..TELUGU VOWEL SIGN AI -0C4A..0C4D ; Extend # Mn [4] TELUGU VOWEL SIGN O..TELUGU SIGN VIRAMA -0C55..0C56 ; Extend # Mn [2] TELUGU LENGTH MARK..TELUGU AI LENGTH MARK -0C62..0C63 ; Extend # Mn [2] TELUGU VOWEL SIGN VOCALIC L..TELUGU VOWEL SIGN VOCALIC LL -0CBC ; Extend # Mn KANNADA SIGN NUKTA -0CBF ; Extend # Mn KANNADA VOWEL SIGN I -0CC2 ; Extend # Mc KANNADA VOWEL SIGN UU -0CC6 ; Extend # Mn KANNADA VOWEL SIGN E -0CCC..0CCD ; Extend # Mn [2] KANNADA VOWEL SIGN AU..KANNADA SIGN VIRAMA -0CD5..0CD6 ; Extend # Mc [2] KANNADA LENGTH MARK..KANNADA AI LENGTH MARK -0CE2..0CE3 ; Extend # Mn [2] KANNADA VOWEL SIGN VOCALIC L..KANNADA VOWEL SIGN VOCALIC LL -0D3E ; Extend # Mc MALAYALAM VOWEL SIGN AA -0D41..0D44 ; Extend # Mn [4] MALAYALAM VOWEL SIGN U..MALAYALAM VOWEL SIGN VOCALIC RR -0D4D ; Extend # Mn MALAYALAM SIGN VIRAMA -0D57 ; Extend # Mc MALAYALAM AU LENGTH MARK -0D62..0D63 ; Extend # Mn [2] MALAYALAM VOWEL SIGN VOCALIC L..MALAYALAM VOWEL SIGN VOCALIC LL -0DCA ; Extend # Mn SINHALA SIGN AL-LAKUNA -0DCF ; Extend # Mc SINHALA VOWEL SIGN AELA-PILLA -0DD2..0DD4 ; Extend # Mn [3] SINHALA VOWEL SIGN KETTI IS-PILLA..SINHALA VOWEL SIGN KETTI PAA-PILLA -0DD6 ; Extend # Mn SINHALA VOWEL SIGN DIGA PAA-PILLA -0DDF ; Extend # Mc SINHALA VOWEL SIGN GAYANUKITTA -0E30 ; Extend # Lo THAI CHARACTER SARA A -0E31 ; Extend # Mn THAI CHARACTER MAI HAN-AKAT -0E32..0E33 ; Extend # Lo [2] THAI CHARACTER SARA AA..THAI CHARACTER SARA AM -0E34..0E3A ; Extend # Mn [7] THAI CHARACTER SARA I..THAI CHARACTER PHINTHU -0E45 ; Extend # Lo THAI CHARACTER LAKKHANGYAO -0E47..0E4E ; Extend # Mn [8] THAI CHARACTER MAITAIKHU..THAI CHARACTER YAMAKKAN -0EB0 ; Extend # Lo LAO VOWEL SIGN A -0EB1 ; Extend # Mn LAO VOWEL SIGN MAI KAN -0EB2..0EB3 ; Extend # Lo [2] LAO VOWEL SIGN AA..LAO VOWEL SIGN AM -0EB4..0EB9 ; Extend # Mn [6] LAO VOWEL SIGN I..LAO VOWEL SIGN UU -0EBB..0EBC ; Extend # Mn [2] LAO VOWEL SIGN MAI KON..LAO SEMIVOWEL SIGN LO -0EC8..0ECD ; Extend # Mn [6] LAO TONE MAI EK..LAO NIGGAHITA -0F18..0F19 ; Extend # Mn [2] TIBETAN ASTROLOGICAL SIGN -KHYUD PA..TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS -0F35 ; Extend # Mn TIBETAN MARK NGAS BZUNG NYI ZLA -0F37 ; Extend # Mn TIBETAN MARK NGAS BZUNG SGOR RTAGS -0F39 ; Extend # Mn TIBETAN MARK TSA -PHRU -0F71..0F7E ; Extend # Mn [14] TIBETAN VOWEL SIGN AA..TIBETAN SIGN RJES SU NGA RO -0F80..0F84 ; Extend # Mn [5] TIBETAN VOWEL SIGN REVERSED I..TIBETAN MARK HALANTA -0F86..0F87 ; Extend # Mn [2] TIBETAN SIGN LCI RTAGS..TIBETAN SIGN YANG RTAGS -0F90..0F97 ; Extend # Mn [8] TIBETAN SUBJOINED LETTER KA..TIBETAN SUBJOINED LETTER JA -0F99..0FBC ; Extend # Mn [36] TIBETAN SUBJOINED LETTER NYA..TIBETAN SUBJOINED LETTER FIXED-FORM RA -0FC6 ; Extend # Mn TIBETAN SYMBOL PADMA GDAN -102D..1030 ; Extend # Mn [4] MYANMAR VOWEL SIGN I..MYANMAR VOWEL SIGN UU -1032..1037 ; Extend # Mn [6] MYANMAR VOWEL SIGN AI..MYANMAR SIGN DOT BELOW -1039..103A ; Extend # Mn [2] MYANMAR SIGN VIRAMA..MYANMAR SIGN ASAT -103D..103E ; Extend # Mn [2] MYANMAR CONSONANT SIGN MEDIAL WA..MYANMAR CONSONANT SIGN MEDIAL HA -1058..1059 ; Extend # Mn [2] MYANMAR VOWEL SIGN VOCALIC L..MYANMAR VOWEL SIGN VOCALIC LL -105E..1060 ; Extend # Mn [3] MYANMAR CONSONANT SIGN MON MEDIAL NA..MYANMAR CONSONANT SIGN MON MEDIAL LA -1071..1074 ; Extend # Mn [4] MYANMAR VOWEL SIGN GEBA KAREN I..MYANMAR VOWEL SIGN KAYAH EE -1082 ; Extend # Mn MYANMAR CONSONANT SIGN SHAN MEDIAL WA -1085..1086 ; Extend # Mn [2] MYANMAR VOWEL SIGN SHAN E ABOVE..MYANMAR VOWEL SIGN SHAN FINAL Y -108D ; Extend # Mn MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE -135F ; Extend # Mn ETHIOPIC COMBINING GEMINATION MARK -1712..1714 ; Extend # Mn [3] TAGALOG VOWEL SIGN I..TAGALOG SIGN VIRAMA -1732..1734 ; Extend # Mn [3] HANUNOO VOWEL SIGN I..HANUNOO SIGN PAMUDPOD -1752..1753 ; Extend # Mn [2] BUHID VOWEL SIGN I..BUHID VOWEL SIGN U -1772..1773 ; Extend # Mn [2] TAGBANWA VOWEL SIGN I..TAGBANWA VOWEL SIGN U -17B7..17BD ; Extend # Mn [7] KHMER VOWEL SIGN I..KHMER VOWEL SIGN UA -17C6 ; Extend # Mn KHMER SIGN NIKAHIT -17C9..17D3 ; Extend # Mn [11] KHMER SIGN MUUSIKATOAN..KHMER SIGN BATHAMASAT -17DD ; Extend # Mn KHMER SIGN ATTHACAN -180B..180D ; Extend # Mn [3] MONGOLIAN FREE VARIATION SELECTOR ONE..MONGOLIAN FREE VARIATION SELECTOR THREE -18A9 ; Extend # Mn MONGOLIAN LETTER ALI GALI DAGALGA -1920..1922 ; Extend # Mn [3] LIMBU VOWEL SIGN A..LIMBU VOWEL SIGN U -1927..1928 ; Extend # Mn [2] LIMBU VOWEL SIGN E..LIMBU VOWEL SIGN O -1932 ; Extend # Mn LIMBU SMALL LETTER ANUSVARA -1939..193B ; Extend # Mn [3] LIMBU SIGN MUKPHRENG..LIMBU SIGN SA-I -1A17..1A18 ; Extend # Mn [2] BUGINESE VOWEL SIGN I..BUGINESE VOWEL SIGN U -1B00..1B03 ; Extend # Mn [4] BALINESE SIGN ULU RICEM..BALINESE SIGN SURANG -1B34 ; Extend # Mn BALINESE SIGN REREKAN -1B36..1B3A ; Extend # Mn [5] BALINESE VOWEL SIGN ULU..BALINESE VOWEL SIGN RA REPA -1B3C ; Extend # Mn BALINESE VOWEL SIGN LA LENGA -1B42 ; Extend # Mn BALINESE VOWEL SIGN PEPET -1B6B..1B73 ; Extend # Mn [9] BALINESE MUSICAL SYMBOL COMBINING TEGEH..BALINESE MUSICAL SYMBOL COMBINING GONG -1B80..1B81 ; Extend # Mn [2] SUNDANESE SIGN PANYECEK..SUNDANESE SIGN PANGLAYAR -1BA2..1BA5 ; Extend # Mn [4] SUNDANESE CONSONANT SIGN PANYAKRA..SUNDANESE VOWEL SIGN PANYUKU -1BA8..1BA9 ; Extend # Mn [2] SUNDANESE VOWEL SIGN PAMEPET..SUNDANESE VOWEL SIGN PANEULEUNG -1C2C..1C33 ; Extend # Mn [8] LEPCHA VOWEL SIGN E..LEPCHA CONSONANT SIGN T -1C36..1C37 ; Extend # Mn [2] LEPCHA SIGN RAN..LEPCHA SIGN NUKTA -1DC0..1DE6 ; Extend # Mn [39] COMBINING DOTTED GRAVE ACCENT..COMBINING LATIN SMALL LETTER Z -1DFE..1DFF ; Extend # Mn [2] COMBINING LEFT ARROWHEAD ABOVE..COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW -200C..200D ; Extend # Cf [2] ZERO WIDTH NON-JOINER..ZERO WIDTH JOINER -20D0..20DC ; Extend # Mn [13] COMBINING LEFT HARPOON ABOVE..COMBINING FOUR DOTS ABOVE -20DD..20E0 ; Extend # Me [4] COMBINING ENCLOSING CIRCLE..COMBINING ENCLOSING CIRCLE BACKSLASH -20E1 ; Extend # Mn COMBINING LEFT RIGHT ARROW ABOVE -20E2..20E4 ; Extend # Me [3] COMBINING ENCLOSING SCREEN..COMBINING ENCLOSING UPWARD POINTING TRIANGLE -20E5..20F0 ; Extend # Mn [12] COMBINING REVERSE SOLIDUS OVERLAY..COMBINING ASTERISK ABOVE -2DE0..2DFF ; Extend # Mn [32] COMBINING CYRILLIC LETTER BE..COMBINING CYRILLIC LETTER IOTIFIED BIG YUS -302A..302F ; Extend # Mn [6] IDEOGRAPHIC LEVEL TONE MARK..HANGUL DOUBLE DOT TONE MARK -3099..309A ; Extend # Mn [2] COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK..COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK -A66F ; Extend # Mn COMBINING CYRILLIC VZMET -A670..A672 ; Extend # Me [3] COMBINING CYRILLIC TEN MILLIONS SIGN..COMBINING CYRILLIC THOUSAND MILLIONS SIGN -A67C..A67D ; Extend # Mn [2] COMBINING CYRILLIC KAVYKA..COMBINING CYRILLIC PAYEROK -A802 ; Extend # Mn SYLOTI NAGRI SIGN DVISVARA -A806 ; Extend # Mn SYLOTI NAGRI SIGN HASANTA -A80B ; Extend # Mn SYLOTI NAGRI SIGN ANUSVARA -A825..A826 ; Extend # Mn [2] SYLOTI NAGRI VOWEL SIGN U..SYLOTI NAGRI VOWEL SIGN E -A8C4 ; Extend # Mn SAURASHTRA SIGN VIRAMA -A926..A92D ; Extend # Mn [8] KAYAH LI VOWEL UE..KAYAH LI TONE CALYA PLOPHU -A947..A951 ; Extend # Mn [11] REJANG VOWEL SIGN I..REJANG CONSONANT SIGN R -AA29..AA2E ; Extend # Mn [6] CHAM VOWEL SIGN AA..CHAM VOWEL SIGN OE -AA31..AA32 ; Extend # Mn [2] CHAM VOWEL SIGN AU..CHAM VOWEL SIGN UE -AA35..AA36 ; Extend # Mn [2] CHAM CONSONANT SIGN LA..CHAM CONSONANT SIGN WA -AA43 ; Extend # Mn CHAM CONSONANT SIGN FINAL NG -AA4C ; Extend # Mn CHAM CONSONANT SIGN FINAL M -FB1E ; Extend # Mn HEBREW POINT JUDEO-SPANISH VARIKA -FE00..FE0F ; Extend # Mn [16] VARIATION SELECTOR-1..VARIATION SELECTOR-16 -FE20..FE26 ; Extend # Mn [7] COMBINING LIGATURE LEFT HALF..COMBINING CONJOINING MACRON -FF9E..FF9F ; Extend # Lm [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK -101FD ; Extend # Mn PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE -10A01..10A03 ; Extend # Mn [3] KHAROSHTHI VOWEL SIGN I..KHAROSHTHI VOWEL SIGN VOCALIC R -10A05..10A06 ; Extend # Mn [2] KHAROSHTHI VOWEL SIGN E..KHAROSHTHI VOWEL SIGN O -10A0C..10A0F ; Extend # Mn [4] KHAROSHTHI VOWEL LENGTH MARK..KHAROSHTHI SIGN VISARGA -10A38..10A3A ; Extend # Mn [3] KHAROSHTHI SIGN BAR ABOVE..KHAROSHTHI SIGN DOT BELOW -10A3F ; Extend # Mn KHAROSHTHI VIRAMA -1D165 ; Extend # Mc MUSICAL SYMBOL COMBINING STEM -1D167..1D169 ; Extend # Mn [3] MUSICAL SYMBOL COMBINING TREMOLO-1..MUSICAL SYMBOL COMBINING TREMOLO-3 -1D16E..1D172 ; Extend # Mc [5] MUSICAL SYMBOL COMBINING FLAG-1..MUSICAL SYMBOL COMBINING FLAG-5 -1D17B..1D182 ; Extend # Mn [8] MUSICAL SYMBOL COMBINING ACCENT..MUSICAL SYMBOL COMBINING LOURE -1D185..1D18B ; Extend # Mn [7] MUSICAL SYMBOL COMBINING DOIT..MUSICAL SYMBOL COMBINING TRIPLE TONGUE -1D1AA..1D1AD ; Extend # Mn [4] MUSICAL SYMBOL COMBINING DOWN BOW..MUSICAL SYMBOL COMBINING SNAP PIZZICATO -1D242..1D244 ; Extend # Mn [3] COMBINING GREEK MUSICAL TRISEME..COMBINING GREEK MUSICAL PENTASEME -E0100..E01EF ; Extend # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256 - -# Total code points: 1075 - -# ================================================ - -0E40..0E44 ; Prepend # Lo [5] THAI CHARACTER SARA E..THAI CHARACTER SARA AI MAIMALAI -0EC0..0EC4 ; Prepend # Lo [5] LAO VOWEL SIGN E..LAO VOWEL SIGN AI - -# Total code points: 10 - -# ================================================ - -0903 ; SpacingMark # Mc DEVANAGARI SIGN VISARGA -093E..0940 ; SpacingMark # Mc [3] DEVANAGARI VOWEL SIGN AA..DEVANAGARI VOWEL SIGN II -0949..094C ; SpacingMark # Mc [4] DEVANAGARI VOWEL SIGN CANDRA O..DEVANAGARI VOWEL SIGN AU -0982..0983 ; SpacingMark # Mc [2] BENGALI SIGN ANUSVARA..BENGALI SIGN VISARGA -09BF..09C0 ; SpacingMark # Mc [2] BENGALI VOWEL SIGN I..BENGALI VOWEL SIGN II -09C7..09C8 ; SpacingMark # Mc [2] BENGALI VOWEL SIGN E..BENGALI VOWEL SIGN AI -09CB..09CC ; SpacingMark # Mc [2] BENGALI VOWEL SIGN O..BENGALI VOWEL SIGN AU -0A03 ; SpacingMark # Mc GURMUKHI SIGN VISARGA -0A3E..0A40 ; SpacingMark # Mc [3] GURMUKHI VOWEL SIGN AA..GURMUKHI VOWEL SIGN II -0A83 ; SpacingMark # Mc GUJARATI SIGN VISARGA -0ABE..0AC0 ; SpacingMark # Mc [3] GUJARATI VOWEL SIGN AA..GUJARATI VOWEL SIGN II -0AC9 ; SpacingMark # Mc GUJARATI VOWEL SIGN CANDRA O -0ACB..0ACC ; SpacingMark # Mc [2] GUJARATI VOWEL SIGN O..GUJARATI VOWEL SIGN AU -0B02..0B03 ; SpacingMark # Mc [2] ORIYA SIGN ANUSVARA..ORIYA SIGN VISARGA -0B40 ; SpacingMark # Mc ORIYA VOWEL SIGN II -0B47..0B48 ; SpacingMark # Mc [2] ORIYA VOWEL SIGN E..ORIYA VOWEL SIGN AI -0B4B..0B4C ; SpacingMark # Mc [2] ORIYA VOWEL SIGN O..ORIYA VOWEL SIGN AU -0BBF ; SpacingMark # Mc TAMIL VOWEL SIGN I -0BC1..0BC2 ; SpacingMark # Mc [2] TAMIL VOWEL SIGN U..TAMIL VOWEL SIGN UU -0BC6..0BC8 ; SpacingMark # Mc [3] TAMIL VOWEL SIGN E..TAMIL VOWEL SIGN AI -0BCA..0BCC ; SpacingMark # Mc [3] TAMIL VOWEL SIGN O..TAMIL VOWEL SIGN AU -0C01..0C03 ; SpacingMark # Mc [3] TELUGU SIGN CANDRABINDU..TELUGU SIGN VISARGA -0C41..0C44 ; SpacingMark # Mc [4] TELUGU VOWEL SIGN U..TELUGU VOWEL SIGN VOCALIC RR -0C82..0C83 ; SpacingMark # Mc [2] KANNADA SIGN ANUSVARA..KANNADA SIGN VISARGA -0CBE ; SpacingMark # Mc KANNADA VOWEL SIGN AA -0CC0..0CC1 ; SpacingMark # Mc [2] KANNADA VOWEL SIGN II..KANNADA VOWEL SIGN U -0CC3..0CC4 ; SpacingMark # Mc [2] KANNADA VOWEL SIGN VOCALIC R..KANNADA VOWEL SIGN VOCALIC RR -0CC7..0CC8 ; SpacingMark # Mc [2] KANNADA VOWEL SIGN EE..KANNADA VOWEL SIGN AI -0CCA..0CCB ; SpacingMark # Mc [2] KANNADA VOWEL SIGN O..KANNADA VOWEL SIGN OO -0D02..0D03 ; SpacingMark # Mc [2] MALAYALAM SIGN ANUSVARA..MALAYALAM SIGN VISARGA -0D3F..0D40 ; SpacingMark # Mc [2] MALAYALAM VOWEL SIGN I..MALAYALAM VOWEL SIGN II -0D46..0D48 ; SpacingMark # Mc [3] MALAYALAM VOWEL SIGN E..MALAYALAM VOWEL SIGN AI -0D4A..0D4C ; SpacingMark # Mc [3] MALAYALAM VOWEL SIGN O..MALAYALAM VOWEL SIGN AU -0D82..0D83 ; SpacingMark # Mc [2] SINHALA SIGN ANUSVARAYA..SINHALA SIGN VISARGAYA -0DD0..0DD1 ; SpacingMark # Mc [2] SINHALA VOWEL SIGN KETTI AEDA-PILLA..SINHALA VOWEL SIGN DIGA AEDA-PILLA -0DD8..0DDE ; SpacingMark # Mc [7] SINHALA VOWEL SIGN GAETTA-PILLA..SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA -0DF2..0DF3 ; SpacingMark # Mc [2] SINHALA VOWEL SIGN DIGA GAETTA-PILLA..SINHALA VOWEL SIGN DIGA GAYANUKITTA -0F3E..0F3F ; SpacingMark # Mc [2] TIBETAN SIGN YAR TSHES..TIBETAN SIGN MAR TSHES -0F7F ; SpacingMark # Mc TIBETAN SIGN RNAM BCAD -102B..102C ; SpacingMark # Mc [2] MYANMAR VOWEL SIGN TALL AA..MYANMAR VOWEL SIGN AA -1031 ; SpacingMark # Mc MYANMAR VOWEL SIGN E -1038 ; SpacingMark # Mc MYANMAR SIGN VISARGA -103B..103C ; SpacingMark # Mc [2] MYANMAR CONSONANT SIGN MEDIAL YA..MYANMAR CONSONANT SIGN MEDIAL RA -1056..1057 ; SpacingMark # Mc [2] MYANMAR VOWEL SIGN VOCALIC R..MYANMAR VOWEL SIGN VOCALIC RR -1062..1064 ; SpacingMark # Mc [3] MYANMAR VOWEL SIGN SGAW KAREN EU..MYANMAR TONE MARK SGAW KAREN KE PHO -1067..106D ; SpacingMark # Mc [7] MYANMAR VOWEL SIGN WESTERN PWO KAREN EU..MYANMAR SIGN WESTERN PWO KAREN TONE-5 -1083..1084 ; SpacingMark # Mc [2] MYANMAR VOWEL SIGN SHAN AA..MYANMAR VOWEL SIGN SHAN E -1087..108C ; SpacingMark # Mc [6] MYANMAR SIGN SHAN TONE-2..MYANMAR SIGN SHAN COUNCIL TONE-3 -108F ; SpacingMark # Mc MYANMAR SIGN RUMAI PALAUNG TONE-5 -17B6 ; SpacingMark # Mc KHMER VOWEL SIGN AA -17BE..17C5 ; SpacingMark # Mc [8] KHMER VOWEL SIGN OE..KHMER VOWEL SIGN AU -17C7..17C8 ; SpacingMark # Mc [2] KHMER SIGN REAHMUK..KHMER SIGN YUUKALEAPINTU -1923..1926 ; SpacingMark # Mc [4] LIMBU VOWEL SIGN EE..LIMBU VOWEL SIGN AU -1929..192B ; SpacingMark # Mc [3] LIMBU SUBJOINED LETTER YA..LIMBU SUBJOINED LETTER WA -1930..1931 ; SpacingMark # Mc [2] LIMBU SMALL LETTER KA..LIMBU SMALL LETTER NGA -1933..1938 ; SpacingMark # Mc [6] LIMBU SMALL LETTER TA..LIMBU SMALL LETTER LA -19B0..19C0 ; SpacingMark # Mc [17] NEW TAI LUE VOWEL SIGN VOWEL SHORTENER..NEW TAI LUE VOWEL SIGN IY -19C8..19C9 ; SpacingMark # Mc [2] NEW TAI LUE TONE MARK-1..NEW TAI LUE TONE MARK-2 -1A19..1A1B ; SpacingMark # Mc [3] BUGINESE VOWEL SIGN E..BUGINESE VOWEL SIGN AE -1B04 ; SpacingMark # Mc BALINESE SIGN BISAH -1B35 ; SpacingMark # Mc BALINESE VOWEL SIGN TEDUNG -1B3B ; SpacingMark # Mc BALINESE VOWEL SIGN RA REPA TEDUNG -1B3D..1B41 ; SpacingMark # Mc [5] BALINESE VOWEL SIGN LA LENGA TEDUNG..BALINESE VOWEL SIGN TALING REPA TEDUNG -1B43..1B44 ; SpacingMark # Mc [2] BALINESE VOWEL SIGN PEPET TEDUNG..BALINESE ADEG ADEG -1B82 ; SpacingMark # Mc SUNDANESE SIGN PANGWISAD -1BA1 ; SpacingMark # Mc SUNDANESE CONSONANT SIGN PAMINGKAL -1BA6..1BA7 ; SpacingMark # Mc [2] SUNDANESE VOWEL SIGN PANAELAENG..SUNDANESE VOWEL SIGN PANOLONG -1BAA ; SpacingMark # Mc SUNDANESE SIGN PAMAAEH -1C24..1C2B ; SpacingMark # Mc [8] LEPCHA SUBJOINED LETTER YA..LEPCHA VOWEL SIGN UU -1C34..1C35 ; SpacingMark # Mc [2] LEPCHA CONSONANT SIGN NYIN-DO..LEPCHA CONSONANT SIGN KANG -A823..A824 ; SpacingMark # Mc [2] SYLOTI NAGRI VOWEL SIGN A..SYLOTI NAGRI VOWEL SIGN I -A827 ; SpacingMark # Mc SYLOTI NAGRI VOWEL SIGN OO -A880..A881 ; SpacingMark # Mc [2] SAURASHTRA SIGN ANUSVARA..SAURASHTRA SIGN VISARGA -A8B4..A8C3 ; SpacingMark # Mc [16] SAURASHTRA CONSONANT SIGN HAARU..SAURASHTRA VOWEL SIGN AU -A952..A953 ; SpacingMark # Mc [2] REJANG CONSONANT SIGN H..REJANG VIRAMA -AA2F..AA30 ; SpacingMark # Mc [2] CHAM VOWEL SIGN O..CHAM VOWEL SIGN AI -AA33..AA34 ; SpacingMark # Mc [2] CHAM CONSONANT SIGN YA..CHAM CONSONANT SIGN RA -AA4D ; SpacingMark # Mc CHAM CONSONANT SIGN FINAL H -1D166 ; SpacingMark # Mc MUSICAL SYMBOL COMBINING SPRECHGESANG STEM -1D16D ; SpacingMark # Mc MUSICAL SYMBOL COMBINING AUGMENTATION DOT - -# Total code points: 217 - -# ================================================ - -1100..1159 ; L # Lo [90] HANGUL CHOSEONG KIYEOK..HANGUL CHOSEONG YEORINHIEUH -115F ; L # Lo HANGUL CHOSEONG FILLER - -# Total code points: 91 - -# ================================================ - -1160..11A2 ; V # Lo [67] HANGUL JUNGSEONG FILLER..HANGUL JUNGSEONG SSANGARAEA - -# Total code points: 67 - -# ================================================ - -11A8..11F9 ; T # Lo [82] HANGUL JONGSEONG KIYEOK..HANGUL JONGSEONG YEORINHIEUH - -# Total code points: 82 - -# ================================================ - -AC00 ; LV # Lo HANGUL SYLLABLE GA -AC1C ; LV # Lo HANGUL SYLLABLE GAE -AC38 ; LV # Lo HANGUL SYLLABLE GYA -AC54 ; LV # Lo HANGUL SYLLABLE GYAE -AC70 ; LV # Lo HANGUL SYLLABLE GEO -AC8C ; LV # Lo HANGUL SYLLABLE GE -ACA8 ; LV # Lo HANGUL SYLLABLE GYEO -ACC4 ; LV # Lo HANGUL SYLLABLE GYE -ACE0 ; LV # Lo HANGUL SYLLABLE GO -ACFC ; LV # Lo HANGUL SYLLABLE GWA -AD18 ; LV # Lo HANGUL SYLLABLE GWAE -AD34 ; LV # Lo HANGUL SYLLABLE GOE -AD50 ; LV # Lo HANGUL SYLLABLE GYO -AD6C ; LV # Lo HANGUL SYLLABLE GU -AD88 ; LV # Lo HANGUL SYLLABLE GWEO -ADA4 ; LV # Lo HANGUL SYLLABLE GWE -ADC0 ; LV # Lo HANGUL SYLLABLE GWI -ADDC ; LV # Lo HANGUL SYLLABLE GYU -ADF8 ; LV # Lo HANGUL SYLLABLE GEU -AE14 ; LV # Lo HANGUL SYLLABLE GYI -AE30 ; LV # Lo HANGUL SYLLABLE GI -AE4C ; LV # Lo HANGUL SYLLABLE GGA -AE68 ; LV # Lo HANGUL SYLLABLE GGAE -AE84 ; LV # Lo HANGUL SYLLABLE GGYA -AEA0 ; LV # Lo HANGUL SYLLABLE GGYAE -AEBC ; LV # Lo HANGUL SYLLABLE GGEO -AED8 ; LV # Lo HANGUL SYLLABLE GGE -AEF4 ; LV # Lo HANGUL SYLLABLE GGYEO -AF10 ; LV # Lo HANGUL SYLLABLE GGYE -AF2C ; LV # Lo HANGUL SYLLABLE GGO -AF48 ; LV # Lo HANGUL SYLLABLE GGWA -AF64 ; LV # Lo HANGUL SYLLABLE GGWAE -AF80 ; LV # Lo HANGUL SYLLABLE GGOE -AF9C ; LV # Lo HANGUL SYLLABLE GGYO -AFB8 ; LV # Lo HANGUL SYLLABLE GGU -AFD4 ; LV # Lo HANGUL SYLLABLE GGWEO -AFF0 ; LV # Lo HANGUL SYLLABLE GGWE -B00C ; LV # Lo HANGUL SYLLABLE GGWI -B028 ; LV # Lo HANGUL SYLLABLE GGYU -B044 ; LV # Lo HANGUL SYLLABLE GGEU -B060 ; LV # Lo HANGUL SYLLABLE GGYI -B07C ; LV # Lo HANGUL SYLLABLE GGI -B098 ; LV # Lo HANGUL SYLLABLE NA -B0B4 ; LV # Lo HANGUL SYLLABLE NAE -B0D0 ; LV # Lo HANGUL SYLLABLE NYA -B0EC ; LV # Lo HANGUL SYLLABLE NYAE -B108 ; LV # Lo HANGUL SYLLABLE NEO -B124 ; LV # Lo HANGUL SYLLABLE NE -B140 ; LV # Lo HANGUL SYLLABLE NYEO -B15C ; LV # Lo HANGUL SYLLABLE NYE -B178 ; LV # Lo HANGUL SYLLABLE NO -B194 ; LV # Lo HANGUL SYLLABLE NWA -B1B0 ; LV # Lo HANGUL SYLLABLE NWAE -B1CC ; LV # Lo HANGUL SYLLABLE NOE -B1E8 ; LV # Lo HANGUL SYLLABLE NYO -B204 ; LV # Lo HANGUL SYLLABLE NU -B220 ; LV # Lo HANGUL SYLLABLE NWEO -B23C ; LV # Lo HANGUL SYLLABLE NWE -B258 ; LV # Lo HANGUL SYLLABLE NWI -B274 ; LV # Lo HANGUL SYLLABLE NYU -B290 ; LV # Lo HANGUL SYLLABLE NEU -B2AC ; LV # Lo HANGUL SYLLABLE NYI -B2C8 ; LV # Lo HANGUL SYLLABLE NI -B2E4 ; LV # Lo HANGUL SYLLABLE DA -B300 ; LV # Lo HANGUL SYLLABLE DAE -B31C ; LV # Lo HANGUL SYLLABLE DYA -B338 ; LV # Lo HANGUL SYLLABLE DYAE -B354 ; LV # Lo HANGUL SYLLABLE DEO -B370 ; LV # Lo HANGUL SYLLABLE DE -B38C ; LV # Lo HANGUL SYLLABLE DYEO -B3A8 ; LV # Lo HANGUL SYLLABLE DYE -B3C4 ; LV # Lo HANGUL SYLLABLE DO -B3E0 ; LV # Lo HANGUL SYLLABLE DWA -B3FC ; LV # Lo HANGUL SYLLABLE DWAE -B418 ; LV # Lo HANGUL SYLLABLE DOE -B434 ; LV # Lo HANGUL SYLLABLE DYO -B450 ; LV # Lo HANGUL SYLLABLE DU -B46C ; LV # Lo HANGUL SYLLABLE DWEO -B488 ; LV # Lo HANGUL SYLLABLE DWE -B4A4 ; LV # Lo HANGUL SYLLABLE DWI -B4C0 ; LV # Lo HANGUL SYLLABLE DYU -B4DC ; LV # Lo HANGUL SYLLABLE DEU -B4F8 ; LV # Lo HANGUL SYLLABLE DYI -B514 ; LV # Lo HANGUL SYLLABLE DI -B530 ; LV # Lo HANGUL SYLLABLE DDA -B54C ; LV # Lo HANGUL SYLLABLE DDAE -B568 ; LV # Lo HANGUL SYLLABLE DDYA -B584 ; LV # Lo HANGUL SYLLABLE DDYAE -B5A0 ; LV # Lo HANGUL SYLLABLE DDEO -B5BC ; LV # Lo HANGUL SYLLABLE DDE -B5D8 ; LV # Lo HANGUL SYLLABLE DDYEO -B5F4 ; LV # Lo HANGUL SYLLABLE DDYE -B610 ; LV # Lo HANGUL SYLLABLE DDO -B62C ; LV # Lo HANGUL SYLLABLE DDWA -B648 ; LV # Lo HANGUL SYLLABLE DDWAE -B664 ; LV # Lo HANGUL SYLLABLE DDOE -B680 ; LV # Lo HANGUL SYLLABLE DDYO -B69C ; LV # Lo HANGUL SYLLABLE DDU -B6B8 ; LV # Lo HANGUL SYLLABLE DDWEO -B6D4 ; LV # Lo HANGUL SYLLABLE DDWE -B6F0 ; LV # Lo HANGUL SYLLABLE DDWI -B70C ; LV # Lo HANGUL SYLLABLE DDYU -B728 ; LV # Lo HANGUL SYLLABLE DDEU -B744 ; LV # Lo HANGUL SYLLABLE DDYI -B760 ; LV # Lo HANGUL SYLLABLE DDI -B77C ; LV # Lo HANGUL SYLLABLE RA -B798 ; LV # Lo HANGUL SYLLABLE RAE -B7B4 ; LV # Lo HANGUL SYLLABLE RYA -B7D0 ; LV # Lo HANGUL SYLLABLE RYAE -B7EC ; LV # Lo HANGUL SYLLABLE REO -B808 ; LV # Lo HANGUL SYLLABLE RE -B824 ; LV # Lo HANGUL SYLLABLE RYEO -B840 ; LV # Lo HANGUL SYLLABLE RYE -B85C ; LV # Lo HANGUL SYLLABLE RO -B878 ; LV # Lo HANGUL SYLLABLE RWA -B894 ; LV # Lo HANGUL SYLLABLE RWAE -B8B0 ; LV # Lo HANGUL SYLLABLE ROE -B8CC ; LV # Lo HANGUL SYLLABLE RYO -B8E8 ; LV # Lo HANGUL SYLLABLE RU -B904 ; LV # Lo HANGUL SYLLABLE RWEO -B920 ; LV # Lo HANGUL SYLLABLE RWE -B93C ; LV # Lo HANGUL SYLLABLE RWI -B958 ; LV # Lo HANGUL SYLLABLE RYU -B974 ; LV # Lo HANGUL SYLLABLE REU -B990 ; LV # Lo HANGUL SYLLABLE RYI -B9AC ; LV # Lo HANGUL SYLLABLE RI -B9C8 ; LV # Lo HANGUL SYLLABLE MA -B9E4 ; LV # Lo HANGUL SYLLABLE MAE -BA00 ; LV # Lo HANGUL SYLLABLE MYA -BA1C ; LV # Lo HANGUL SYLLABLE MYAE -BA38 ; LV # Lo HANGUL SYLLABLE MEO -BA54 ; LV # Lo HANGUL SYLLABLE ME -BA70 ; LV # Lo HANGUL SYLLABLE MYEO -BA8C ; LV # Lo HANGUL SYLLABLE MYE -BAA8 ; LV # Lo HANGUL SYLLABLE MO -BAC4 ; LV # Lo HANGUL SYLLABLE MWA -BAE0 ; LV # Lo HANGUL SYLLABLE MWAE -BAFC ; LV # Lo HANGUL SYLLABLE MOE -BB18 ; LV # Lo HANGUL SYLLABLE MYO -BB34 ; LV # Lo HANGUL SYLLABLE MU -BB50 ; LV # Lo HANGUL SYLLABLE MWEO -BB6C ; LV # Lo HANGUL SYLLABLE MWE -BB88 ; LV # Lo HANGUL SYLLABLE MWI -BBA4 ; LV # Lo HANGUL SYLLABLE MYU -BBC0 ; LV # Lo HANGUL SYLLABLE MEU -BBDC ; LV # Lo HANGUL SYLLABLE MYI -BBF8 ; LV # Lo HANGUL SYLLABLE MI -BC14 ; LV # Lo HANGUL SYLLABLE BA -BC30 ; LV # Lo HANGUL SYLLABLE BAE -BC4C ; LV # Lo HANGUL SYLLABLE BYA -BC68 ; LV # Lo HANGUL SYLLABLE BYAE -BC84 ; LV # Lo HANGUL SYLLABLE BEO -BCA0 ; LV # Lo HANGUL SYLLABLE BE -BCBC ; LV # Lo HANGUL SYLLABLE BYEO -BCD8 ; LV # Lo HANGUL SYLLABLE BYE -BCF4 ; LV # Lo HANGUL SYLLABLE BO -BD10 ; LV # Lo HANGUL SYLLABLE BWA -BD2C ; LV # Lo HANGUL SYLLABLE BWAE -BD48 ; LV # Lo HANGUL SYLLABLE BOE -BD64 ; LV # Lo HANGUL SYLLABLE BYO -BD80 ; LV # Lo HANGUL SYLLABLE BU -BD9C ; LV # Lo HANGUL SYLLABLE BWEO -BDB8 ; LV # Lo HANGUL SYLLABLE BWE -BDD4 ; LV # Lo HANGUL SYLLABLE BWI -BDF0 ; LV # Lo HANGUL SYLLABLE BYU -BE0C ; LV # Lo HANGUL SYLLABLE BEU -BE28 ; LV # Lo HANGUL SYLLABLE BYI -BE44 ; LV # Lo HANGUL SYLLABLE BI -BE60 ; LV # Lo HANGUL SYLLABLE BBA -BE7C ; LV # Lo HANGUL SYLLABLE BBAE -BE98 ; LV # Lo HANGUL SYLLABLE BBYA -BEB4 ; LV # Lo HANGUL SYLLABLE BBYAE -BED0 ; LV # Lo HANGUL SYLLABLE BBEO -BEEC ; LV # Lo HANGUL SYLLABLE BBE -BF08 ; LV # Lo HANGUL SYLLABLE BBYEO -BF24 ; LV # Lo HANGUL SYLLABLE BBYE -BF40 ; LV # Lo HANGUL SYLLABLE BBO -BF5C ; LV # Lo HANGUL SYLLABLE BBWA -BF78 ; LV # Lo HANGUL SYLLABLE BBWAE -BF94 ; LV # Lo HANGUL SYLLABLE BBOE -BFB0 ; LV # Lo HANGUL SYLLABLE BBYO -BFCC ; LV # Lo HANGUL SYLLABLE BBU -BFE8 ; LV # Lo HANGUL SYLLABLE BBWEO -C004 ; LV # Lo HANGUL SYLLABLE BBWE -C020 ; LV # Lo HANGUL SYLLABLE BBWI -C03C ; LV # Lo HANGUL SYLLABLE BBYU -C058 ; LV # Lo HANGUL SYLLABLE BBEU -C074 ; LV # Lo HANGUL SYLLABLE BBYI -C090 ; LV # Lo HANGUL SYLLABLE BBI -C0AC ; LV # Lo HANGUL SYLLABLE SA -C0C8 ; LV # Lo HANGUL SYLLABLE SAE -C0E4 ; LV # Lo HANGUL SYLLABLE SYA -C100 ; LV # Lo HANGUL SYLLABLE SYAE -C11C ; LV # Lo HANGUL SYLLABLE SEO -C138 ; LV # Lo HANGUL SYLLABLE SE -C154 ; LV # Lo HANGUL SYLLABLE SYEO -C170 ; LV # Lo HANGUL SYLLABLE SYE -C18C ; LV # Lo HANGUL SYLLABLE SO -C1A8 ; LV # Lo HANGUL SYLLABLE SWA -C1C4 ; LV # Lo HANGUL SYLLABLE SWAE -C1E0 ; LV # Lo HANGUL SYLLABLE SOE -C1FC ; LV # Lo HANGUL SYLLABLE SYO -C218 ; LV # Lo HANGUL SYLLABLE SU -C234 ; LV # Lo HANGUL SYLLABLE SWEO -C250 ; LV # Lo HANGUL SYLLABLE SWE -C26C ; LV # Lo HANGUL SYLLABLE SWI -C288 ; LV # Lo HANGUL SYLLABLE SYU -C2A4 ; LV # Lo HANGUL SYLLABLE SEU -C2C0 ; LV # Lo HANGUL SYLLABLE SYI -C2DC ; LV # Lo HANGUL SYLLABLE SI -C2F8 ; LV # Lo HANGUL SYLLABLE SSA -C314 ; LV # Lo HANGUL SYLLABLE SSAE -C330 ; LV # Lo HANGUL SYLLABLE SSYA -C34C ; LV # Lo HANGUL SYLLABLE SSYAE -C368 ; LV # Lo HANGUL SYLLABLE SSEO -C384 ; LV # Lo HANGUL SYLLABLE SSE -C3A0 ; LV # Lo HANGUL SYLLABLE SSYEO -C3BC ; LV # Lo HANGUL SYLLABLE SSYE -C3D8 ; LV # Lo HANGUL SYLLABLE SSO -C3F4 ; LV # Lo HANGUL SYLLABLE SSWA -C410 ; LV # Lo HANGUL SYLLABLE SSWAE -C42C ; LV # Lo HANGUL SYLLABLE SSOE -C448 ; LV # Lo HANGUL SYLLABLE SSYO -C464 ; LV # Lo HANGUL SYLLABLE SSU -C480 ; LV # Lo HANGUL SYLLABLE SSWEO -C49C ; LV # Lo HANGUL SYLLABLE SSWE -C4B8 ; LV # Lo HANGUL SYLLABLE SSWI -C4D4 ; LV # Lo HANGUL SYLLABLE SSYU -C4F0 ; LV # Lo HANGUL SYLLABLE SSEU -C50C ; LV # Lo HANGUL SYLLABLE SSYI -C528 ; LV # Lo HANGUL SYLLABLE SSI -C544 ; LV # Lo HANGUL SYLLABLE A -C560 ; LV # Lo HANGUL SYLLABLE AE -C57C ; LV # Lo HANGUL SYLLABLE YA -C598 ; LV # Lo HANGUL SYLLABLE YAE -C5B4 ; LV # Lo HANGUL SYLLABLE EO -C5D0 ; LV # Lo HANGUL SYLLABLE E -C5EC ; LV # Lo HANGUL SYLLABLE YEO -C608 ; LV # Lo HANGUL SYLLABLE YE -C624 ; LV # Lo HANGUL SYLLABLE O -C640 ; LV # Lo HANGUL SYLLABLE WA -C65C ; LV # Lo HANGUL SYLLABLE WAE -C678 ; LV # Lo HANGUL SYLLABLE OE -C694 ; LV # Lo HANGUL SYLLABLE YO -C6B0 ; LV # Lo HANGUL SYLLABLE U -C6CC ; LV # Lo HANGUL SYLLABLE WEO -C6E8 ; LV # Lo HANGUL SYLLABLE WE -C704 ; LV # Lo HANGUL SYLLABLE WI -C720 ; LV # Lo HANGUL SYLLABLE YU -C73C ; LV # Lo HANGUL SYLLABLE EU -C758 ; LV # Lo HANGUL SYLLABLE YI -C774 ; LV # Lo HANGUL SYLLABLE I -C790 ; LV # Lo HANGUL SYLLABLE JA -C7AC ; LV # Lo HANGUL SYLLABLE JAE -C7C8 ; LV # Lo HANGUL SYLLABLE JYA -C7E4 ; LV # Lo HANGUL SYLLABLE JYAE -C800 ; LV # Lo HANGUL SYLLABLE JEO -C81C ; LV # Lo HANGUL SYLLABLE JE -C838 ; LV # Lo HANGUL SYLLABLE JYEO -C854 ; LV # Lo HANGUL SYLLABLE JYE -C870 ; LV # Lo HANGUL SYLLABLE JO -C88C ; LV # Lo HANGUL SYLLABLE JWA -C8A8 ; LV # Lo HANGUL SYLLABLE JWAE -C8C4 ; LV # Lo HANGUL SYLLABLE JOE -C8E0 ; LV # Lo HANGUL SYLLABLE JYO -C8FC ; LV # Lo HANGUL SYLLABLE JU -C918 ; LV # Lo HANGUL SYLLABLE JWEO -C934 ; LV # Lo HANGUL SYLLABLE JWE -C950 ; LV # Lo HANGUL SYLLABLE JWI -C96C ; LV # Lo HANGUL SYLLABLE JYU -C988 ; LV # Lo HANGUL SYLLABLE JEU -C9A4 ; LV # Lo HANGUL SYLLABLE JYI -C9C0 ; LV # Lo HANGUL SYLLABLE JI -C9DC ; LV # Lo HANGUL SYLLABLE JJA -C9F8 ; LV # Lo HANGUL SYLLABLE JJAE -CA14 ; LV # Lo HANGUL SYLLABLE JJYA -CA30 ; LV # Lo HANGUL SYLLABLE JJYAE -CA4C ; LV # Lo HANGUL SYLLABLE JJEO -CA68 ; LV # Lo HANGUL SYLLABLE JJE -CA84 ; LV # Lo HANGUL SYLLABLE JJYEO -CAA0 ; LV # Lo HANGUL SYLLABLE JJYE -CABC ; LV # Lo HANGUL SYLLABLE JJO -CAD8 ; LV # Lo HANGUL SYLLABLE JJWA -CAF4 ; LV # Lo HANGUL SYLLABLE JJWAE -CB10 ; LV # Lo HANGUL SYLLABLE JJOE -CB2C ; LV # Lo HANGUL SYLLABLE JJYO -CB48 ; LV # Lo HANGUL SYLLABLE JJU -CB64 ; LV # Lo HANGUL SYLLABLE JJWEO -CB80 ; LV # Lo HANGUL SYLLABLE JJWE -CB9C ; LV # Lo HANGUL SYLLABLE JJWI -CBB8 ; LV # Lo HANGUL SYLLABLE JJYU -CBD4 ; LV # Lo HANGUL SYLLABLE JJEU -CBF0 ; LV # Lo HANGUL SYLLABLE JJYI -CC0C ; LV # Lo HANGUL SYLLABLE JJI -CC28 ; LV # Lo HANGUL SYLLABLE CA -CC44 ; LV # Lo HANGUL SYLLABLE CAE -CC60 ; LV # Lo HANGUL SYLLABLE CYA -CC7C ; LV # Lo HANGUL SYLLABLE CYAE -CC98 ; LV # Lo HANGUL SYLLABLE CEO -CCB4 ; LV # Lo HANGUL SYLLABLE CE -CCD0 ; LV # Lo HANGUL SYLLABLE CYEO -CCEC ; LV # Lo HANGUL SYLLABLE CYE -CD08 ; LV # Lo HANGUL SYLLABLE CO -CD24 ; LV # Lo HANGUL SYLLABLE CWA -CD40 ; LV # Lo HANGUL SYLLABLE CWAE -CD5C ; LV # Lo HANGUL SYLLABLE COE -CD78 ; LV # Lo HANGUL SYLLABLE CYO -CD94 ; LV # Lo HANGUL SYLLABLE CU -CDB0 ; LV # Lo HANGUL SYLLABLE CWEO -CDCC ; LV # Lo HANGUL SYLLABLE CWE -CDE8 ; LV # Lo HANGUL SYLLABLE CWI -CE04 ; LV # Lo HANGUL SYLLABLE CYU -CE20 ; LV # Lo HANGUL SYLLABLE CEU -CE3C ; LV # Lo HANGUL SYLLABLE CYI -CE58 ; LV # Lo HANGUL SYLLABLE CI -CE74 ; LV # Lo HANGUL SYLLABLE KA -CE90 ; LV # Lo HANGUL SYLLABLE KAE -CEAC ; LV # Lo HANGUL SYLLABLE KYA -CEC8 ; LV # Lo HANGUL SYLLABLE KYAE -CEE4 ; LV # Lo HANGUL SYLLABLE KEO -CF00 ; LV # Lo HANGUL SYLLABLE KE -CF1C ; LV # Lo HANGUL SYLLABLE KYEO -CF38 ; LV # Lo HANGUL SYLLABLE KYE -CF54 ; LV # Lo HANGUL SYLLABLE KO -CF70 ; LV # Lo HANGUL SYLLABLE KWA -CF8C ; LV # Lo HANGUL SYLLABLE KWAE -CFA8 ; LV # Lo HANGUL SYLLABLE KOE -CFC4 ; LV # Lo HANGUL SYLLABLE KYO -CFE0 ; LV # Lo HANGUL SYLLABLE KU -CFFC ; LV # Lo HANGUL SYLLABLE KWEO -D018 ; LV # Lo HANGUL SYLLABLE KWE -D034 ; LV # Lo HANGUL SYLLABLE KWI -D050 ; LV # Lo HANGUL SYLLABLE KYU -D06C ; LV # Lo HANGUL SYLLABLE KEU -D088 ; LV # Lo HANGUL SYLLABLE KYI -D0A4 ; LV # Lo HANGUL SYLLABLE KI -D0C0 ; LV # Lo HANGUL SYLLABLE TA -D0DC ; LV # Lo HANGUL SYLLABLE TAE -D0F8 ; LV # Lo HANGUL SYLLABLE TYA -D114 ; LV # Lo HANGUL SYLLABLE TYAE -D130 ; LV # Lo HANGUL SYLLABLE TEO -D14C ; LV # Lo HANGUL SYLLABLE TE -D168 ; LV # Lo HANGUL SYLLABLE TYEO -D184 ; LV # Lo HANGUL SYLLABLE TYE -D1A0 ; LV # Lo HANGUL SYLLABLE TO -D1BC ; LV # Lo HANGUL SYLLABLE TWA -D1D8 ; LV # Lo HANGUL SYLLABLE TWAE -D1F4 ; LV # Lo HANGUL SYLLABLE TOE -D210 ; LV # Lo HANGUL SYLLABLE TYO -D22C ; LV # Lo HANGUL SYLLABLE TU -D248 ; LV # Lo HANGUL SYLLABLE TWEO -D264 ; LV # Lo HANGUL SYLLABLE TWE -D280 ; LV # Lo HANGUL SYLLABLE TWI -D29C ; LV # Lo HANGUL SYLLABLE TYU -D2B8 ; LV # Lo HANGUL SYLLABLE TEU -D2D4 ; LV # Lo HANGUL SYLLABLE TYI -D2F0 ; LV # Lo HANGUL SYLLABLE TI -D30C ; LV # Lo HANGUL SYLLABLE PA -D328 ; LV # Lo HANGUL SYLLABLE PAE -D344 ; LV # Lo HANGUL SYLLABLE PYA -D360 ; LV # Lo HANGUL SYLLABLE PYAE -D37C ; LV # Lo HANGUL SYLLABLE PEO -D398 ; LV # Lo HANGUL SYLLABLE PE -D3B4 ; LV # Lo HANGUL SYLLABLE PYEO -D3D0 ; LV # Lo HANGUL SYLLABLE PYE -D3EC ; LV # Lo HANGUL SYLLABLE PO -D408 ; LV # Lo HANGUL SYLLABLE PWA -D424 ; LV # Lo HANGUL SYLLABLE PWAE -D440 ; LV # Lo HANGUL SYLLABLE POE -D45C ; LV # Lo HANGUL SYLLABLE PYO -D478 ; LV # Lo HANGUL SYLLABLE PU -D494 ; LV # Lo HANGUL SYLLABLE PWEO -D4B0 ; LV # Lo HANGUL SYLLABLE PWE -D4CC ; LV # Lo HANGUL SYLLABLE PWI -D4E8 ; LV # Lo HANGUL SYLLABLE PYU -D504 ; LV # Lo HANGUL SYLLABLE PEU -D520 ; LV # Lo HANGUL SYLLABLE PYI -D53C ; LV # Lo HANGUL SYLLABLE PI -D558 ; LV # Lo HANGUL SYLLABLE HA -D574 ; LV # Lo HANGUL SYLLABLE HAE -D590 ; LV # Lo HANGUL SYLLABLE HYA -D5AC ; LV # Lo HANGUL SYLLABLE HYAE -D5C8 ; LV # Lo HANGUL SYLLABLE HEO -D5E4 ; LV # Lo HANGUL SYLLABLE HE -D600 ; LV # Lo HANGUL SYLLABLE HYEO -D61C ; LV # Lo HANGUL SYLLABLE HYE -D638 ; LV # Lo HANGUL SYLLABLE HO -D654 ; LV # Lo HANGUL SYLLABLE HWA -D670 ; LV # Lo HANGUL SYLLABLE HWAE -D68C ; LV # Lo HANGUL SYLLABLE HOE -D6A8 ; LV # Lo HANGUL SYLLABLE HYO -D6C4 ; LV # Lo HANGUL SYLLABLE HU -D6E0 ; LV # Lo HANGUL SYLLABLE HWEO -D6FC ; LV # Lo HANGUL SYLLABLE HWE -D718 ; LV # Lo HANGUL SYLLABLE HWI -D734 ; LV # Lo HANGUL SYLLABLE HYU -D750 ; LV # Lo HANGUL SYLLABLE HEU -D76C ; LV # Lo HANGUL SYLLABLE HYI -D788 ; LV # Lo HANGUL SYLLABLE HI - -# Total code points: 399 - -# ================================================ - -AC01..AC1B ; LVT # Lo [27] HANGUL SYLLABLE GAG..HANGUL SYLLABLE GAH -AC1D..AC37 ; LVT # Lo [27] HANGUL SYLLABLE GAEG..HANGUL SYLLABLE GAEH -AC39..AC53 ; LVT # Lo [27] HANGUL SYLLABLE GYAG..HANGUL SYLLABLE GYAH -AC55..AC6F ; LVT # Lo [27] HANGUL SYLLABLE GYAEG..HANGUL SYLLABLE GYAEH -AC71..AC8B ; LVT # Lo [27] HANGUL SYLLABLE GEOG..HANGUL SYLLABLE GEOH -AC8D..ACA7 ; LVT # Lo [27] HANGUL SYLLABLE GEG..HANGUL SYLLABLE GEH -ACA9..ACC3 ; LVT # Lo [27] HANGUL SYLLABLE GYEOG..HANGUL SYLLABLE GYEOH -ACC5..ACDF ; LVT # Lo [27] HANGUL SYLLABLE GYEG..HANGUL SYLLABLE GYEH -ACE1..ACFB ; LVT # Lo [27] HANGUL SYLLABLE GOG..HANGUL SYLLABLE GOH -ACFD..AD17 ; LVT # Lo [27] HANGUL SYLLABLE GWAG..HANGUL SYLLABLE GWAH -AD19..AD33 ; LVT # Lo [27] HANGUL SYLLABLE GWAEG..HANGUL SYLLABLE GWAEH -AD35..AD4F ; LVT # Lo [27] HANGUL SYLLABLE GOEG..HANGUL SYLLABLE GOEH -AD51..AD6B ; LVT # Lo [27] HANGUL SYLLABLE GYOG..HANGUL SYLLABLE GYOH -AD6D..AD87 ; LVT # Lo [27] HANGUL SYLLABLE GUG..HANGUL SYLLABLE GUH -AD89..ADA3 ; LVT # Lo [27] HANGUL SYLLABLE GWEOG..HANGUL SYLLABLE GWEOH -ADA5..ADBF ; LVT # Lo [27] HANGUL SYLLABLE GWEG..HANGUL SYLLABLE GWEH -ADC1..ADDB ; LVT # Lo [27] HANGUL SYLLABLE GWIG..HANGUL SYLLABLE GWIH -ADDD..ADF7 ; LVT # Lo [27] HANGUL SYLLABLE GYUG..HANGUL SYLLABLE GYUH -ADF9..AE13 ; LVT # Lo [27] HANGUL SYLLABLE GEUG..HANGUL SYLLABLE GEUH -AE15..AE2F ; LVT # Lo [27] HANGUL SYLLABLE GYIG..HANGUL SYLLABLE GYIH -AE31..AE4B ; LVT # Lo [27] HANGUL SYLLABLE GIG..HANGUL SYLLABLE GIH -AE4D..AE67 ; LVT # Lo [27] HANGUL SYLLABLE GGAG..HANGUL SYLLABLE GGAH -AE69..AE83 ; LVT # Lo [27] HANGUL SYLLABLE GGAEG..HANGUL SYLLABLE GGAEH -AE85..AE9F ; LVT # Lo [27] HANGUL SYLLABLE GGYAG..HANGUL SYLLABLE GGYAH -AEA1..AEBB ; LVT # Lo [27] HANGUL SYLLABLE GGYAEG..HANGUL SYLLABLE GGYAEH -AEBD..AED7 ; LVT # Lo [27] HANGUL SYLLABLE GGEOG..HANGUL SYLLABLE GGEOH -AED9..AEF3 ; LVT # Lo [27] HANGUL SYLLABLE GGEG..HANGUL SYLLABLE GGEH -AEF5..AF0F ; LVT # Lo [27] HANGUL SYLLABLE GGYEOG..HANGUL SYLLABLE GGYEOH -AF11..AF2B ; LVT # Lo [27] HANGUL SYLLABLE GGYEG..HANGUL SYLLABLE GGYEH -AF2D..AF47 ; LVT # Lo [27] HANGUL SYLLABLE GGOG..HANGUL SYLLABLE GGOH -AF49..AF63 ; LVT # Lo [27] HANGUL SYLLABLE GGWAG..HANGUL SYLLABLE GGWAH -AF65..AF7F ; LVT # Lo [27] HANGUL SYLLABLE GGWAEG..HANGUL SYLLABLE GGWAEH -AF81..AF9B ; LVT # Lo [27] HANGUL SYLLABLE GGOEG..HANGUL SYLLABLE GGOEH -AF9D..AFB7 ; LVT # Lo [27] HANGUL SYLLABLE GGYOG..HANGUL SYLLABLE GGYOH -AFB9..AFD3 ; LVT # Lo [27] HANGUL SYLLABLE GGUG..HANGUL SYLLABLE GGUH -AFD5..AFEF ; LVT # Lo [27] HANGUL SYLLABLE GGWEOG..HANGUL SYLLABLE GGWEOH -AFF1..B00B ; LVT # Lo [27] HANGUL SYLLABLE GGWEG..HANGUL SYLLABLE GGWEH -B00D..B027 ; LVT # Lo [27] HANGUL SYLLABLE GGWIG..HANGUL SYLLABLE GGWIH -B029..B043 ; LVT # Lo [27] HANGUL SYLLABLE GGYUG..HANGUL SYLLABLE GGYUH -B045..B05F ; LVT # Lo [27] HANGUL SYLLABLE GGEUG..HANGUL SYLLABLE GGEUH -B061..B07B ; LVT # Lo [27] HANGUL SYLLABLE GGYIG..HANGUL SYLLABLE GGYIH -B07D..B097 ; LVT # Lo [27] HANGUL SYLLABLE GGIG..HANGUL SYLLABLE GGIH -B099..B0B3 ; LVT # Lo [27] HANGUL SYLLABLE NAG..HANGUL SYLLABLE NAH -B0B5..B0CF ; LVT # Lo [27] HANGUL SYLLABLE NAEG..HANGUL SYLLABLE NAEH -B0D1..B0EB ; LVT # Lo [27] HANGUL SYLLABLE NYAG..HANGUL SYLLABLE NYAH -B0ED..B107 ; LVT # Lo [27] HANGUL SYLLABLE NYAEG..HANGUL SYLLABLE NYAEH -B109..B123 ; LVT # Lo [27] HANGUL SYLLABLE NEOG..HANGUL SYLLABLE NEOH -B125..B13F ; LVT # Lo [27] HANGUL SYLLABLE NEG..HANGUL SYLLABLE NEH -B141..B15B ; LVT # Lo [27] HANGUL SYLLABLE NYEOG..HANGUL SYLLABLE NYEOH -B15D..B177 ; LVT # Lo [27] HANGUL SYLLABLE NYEG..HANGUL SYLLABLE NYEH -B179..B193 ; LVT # Lo [27] HANGUL SYLLABLE NOG..HANGUL SYLLABLE NOH -B195..B1AF ; LVT # Lo [27] HANGUL SYLLABLE NWAG..HANGUL SYLLABLE NWAH -B1B1..B1CB ; LVT # Lo [27] HANGUL SYLLABLE NWAEG..HANGUL SYLLABLE NWAEH -B1CD..B1E7 ; LVT # Lo [27] HANGUL SYLLABLE NOEG..HANGUL SYLLABLE NOEH -B1E9..B203 ; LVT # Lo [27] HANGUL SYLLABLE NYOG..HANGUL SYLLABLE NYOH -B205..B21F ; LVT # Lo [27] HANGUL SYLLABLE NUG..HANGUL SYLLABLE NUH -B221..B23B ; LVT # Lo [27] HANGUL SYLLABLE NWEOG..HANGUL SYLLABLE NWEOH -B23D..B257 ; LVT # Lo [27] HANGUL SYLLABLE NWEG..HANGUL SYLLABLE NWEH -B259..B273 ; LVT # Lo [27] HANGUL SYLLABLE NWIG..HANGUL SYLLABLE NWIH -B275..B28F ; LVT # Lo [27] HANGUL SYLLABLE NYUG..HANGUL SYLLABLE NYUH -B291..B2AB ; LVT # Lo [27] HANGUL SYLLABLE NEUG..HANGUL SYLLABLE NEUH -B2AD..B2C7 ; LVT # Lo [27] HANGUL SYLLABLE NYIG..HANGUL SYLLABLE NYIH -B2C9..B2E3 ; LVT # Lo [27] HANGUL SYLLABLE NIG..HANGUL SYLLABLE NIH -B2E5..B2FF ; LVT # Lo [27] HANGUL SYLLABLE DAG..HANGUL SYLLABLE DAH -B301..B31B ; LVT # Lo [27] HANGUL SYLLABLE DAEG..HANGUL SYLLABLE DAEH -B31D..B337 ; LVT # Lo [27] HANGUL SYLLABLE DYAG..HANGUL SYLLABLE DYAH -B339..B353 ; LVT # Lo [27] HANGUL SYLLABLE DYAEG..HANGUL SYLLABLE DYAEH -B355..B36F ; LVT # Lo [27] HANGUL SYLLABLE DEOG..HANGUL SYLLABLE DEOH -B371..B38B ; LVT # Lo [27] HANGUL SYLLABLE DEG..HANGUL SYLLABLE DEH -B38D..B3A7 ; LVT # Lo [27] HANGUL SYLLABLE DYEOG..HANGUL SYLLABLE DYEOH -B3A9..B3C3 ; LVT # Lo [27] HANGUL SYLLABLE DYEG..HANGUL SYLLABLE DYEH -B3C5..B3DF ; LVT # Lo [27] HANGUL SYLLABLE DOG..HANGUL SYLLABLE DOH -B3E1..B3FB ; LVT # Lo [27] HANGUL SYLLABLE DWAG..HANGUL SYLLABLE DWAH -B3FD..B417 ; LVT # Lo [27] HANGUL SYLLABLE DWAEG..HANGUL SYLLABLE DWAEH -B419..B433 ; LVT # Lo [27] HANGUL SYLLABLE DOEG..HANGUL SYLLABLE DOEH -B435..B44F ; LVT # Lo [27] HANGUL SYLLABLE DYOG..HANGUL SYLLABLE DYOH -B451..B46B ; LVT # Lo [27] HANGUL SYLLABLE DUG..HANGUL SYLLABLE DUH -B46D..B487 ; LVT # Lo [27] HANGUL SYLLABLE DWEOG..HANGUL SYLLABLE DWEOH -B489..B4A3 ; LVT # Lo [27] HANGUL SYLLABLE DWEG..HANGUL SYLLABLE DWEH -B4A5..B4BF ; LVT # Lo [27] HANGUL SYLLABLE DWIG..HANGUL SYLLABLE DWIH -B4C1..B4DB ; LVT # Lo [27] HANGUL SYLLABLE DYUG..HANGUL SYLLABLE DYUH -B4DD..B4F7 ; LVT # Lo [27] HANGUL SYLLABLE DEUG..HANGUL SYLLABLE DEUH -B4F9..B513 ; LVT # Lo [27] HANGUL SYLLABLE DYIG..HANGUL SYLLABLE DYIH -B515..B52F ; LVT # Lo [27] HANGUL SYLLABLE DIG..HANGUL SYLLABLE DIH -B531..B54B ; LVT # Lo [27] HANGUL SYLLABLE DDAG..HANGUL SYLLABLE DDAH -B54D..B567 ; LVT # Lo [27] HANGUL SYLLABLE DDAEG..HANGUL SYLLABLE DDAEH -B569..B583 ; LVT # Lo [27] HANGUL SYLLABLE DDYAG..HANGUL SYLLABLE DDYAH -B585..B59F ; LVT # Lo [27] HANGUL SYLLABLE DDYAEG..HANGUL SYLLABLE DDYAEH -B5A1..B5BB ; LVT # Lo [27] HANGUL SYLLABLE DDEOG..HANGUL SYLLABLE DDEOH -B5BD..B5D7 ; LVT # Lo [27] HANGUL SYLLABLE DDEG..HANGUL SYLLABLE DDEH -B5D9..B5F3 ; LVT # Lo [27] HANGUL SYLLABLE DDYEOG..HANGUL SYLLABLE DDYEOH -B5F5..B60F ; LVT # Lo [27] HANGUL SYLLABLE DDYEG..HANGUL SYLLABLE DDYEH -B611..B62B ; LVT # Lo [27] HANGUL SYLLABLE DDOG..HANGUL SYLLABLE DDOH -B62D..B647 ; LVT # Lo [27] HANGUL SYLLABLE DDWAG..HANGUL SYLLABLE DDWAH -B649..B663 ; LVT # Lo [27] HANGUL SYLLABLE DDWAEG..HANGUL SYLLABLE DDWAEH -B665..B67F ; LVT # Lo [27] HANGUL SYLLABLE DDOEG..HANGUL SYLLABLE DDOEH -B681..B69B ; LVT # Lo [27] HANGUL SYLLABLE DDYOG..HANGUL SYLLABLE DDYOH -B69D..B6B7 ; LVT # Lo [27] HANGUL SYLLABLE DDUG..HANGUL SYLLABLE DDUH -B6B9..B6D3 ; LVT # Lo [27] HANGUL SYLLABLE DDWEOG..HANGUL SYLLABLE DDWEOH -B6D5..B6EF ; LVT # Lo [27] HANGUL SYLLABLE DDWEG..HANGUL SYLLABLE DDWEH -B6F1..B70B ; LVT # Lo [27] HANGUL SYLLABLE DDWIG..HANGUL SYLLABLE DDWIH -B70D..B727 ; LVT # Lo [27] HANGUL SYLLABLE DDYUG..HANGUL SYLLABLE DDYUH -B729..B743 ; LVT # Lo [27] HANGUL SYLLABLE DDEUG..HANGUL SYLLABLE DDEUH -B745..B75F ; LVT # Lo [27] HANGUL SYLLABLE DDYIG..HANGUL SYLLABLE DDYIH -B761..B77B ; LVT # Lo [27] HANGUL SYLLABLE DDIG..HANGUL SYLLABLE DDIH -B77D..B797 ; LVT # Lo [27] HANGUL SYLLABLE RAG..HANGUL SYLLABLE RAH -B799..B7B3 ; LVT # Lo [27] HANGUL SYLLABLE RAEG..HANGUL SYLLABLE RAEH -B7B5..B7CF ; LVT # Lo [27] HANGUL SYLLABLE RYAG..HANGUL SYLLABLE RYAH -B7D1..B7EB ; LVT # Lo [27] HANGUL SYLLABLE RYAEG..HANGUL SYLLABLE RYAEH -B7ED..B807 ; LVT # Lo [27] HANGUL SYLLABLE REOG..HANGUL SYLLABLE REOH -B809..B823 ; LVT # Lo [27] HANGUL SYLLABLE REG..HANGUL SYLLABLE REH -B825..B83F ; LVT # Lo [27] HANGUL SYLLABLE RYEOG..HANGUL SYLLABLE RYEOH -B841..B85B ; LVT # Lo [27] HANGUL SYLLABLE RYEG..HANGUL SYLLABLE RYEH -B85D..B877 ; LVT # Lo [27] HANGUL SYLLABLE ROG..HANGUL SYLLABLE ROH -B879..B893 ; LVT # Lo [27] HANGUL SYLLABLE RWAG..HANGUL SYLLABLE RWAH -B895..B8AF ; LVT # Lo [27] HANGUL SYLLABLE RWAEG..HANGUL SYLLABLE RWAEH -B8B1..B8CB ; LVT # Lo [27] HANGUL SYLLABLE ROEG..HANGUL SYLLABLE ROEH -B8CD..B8E7 ; LVT # Lo [27] HANGUL SYLLABLE RYOG..HANGUL SYLLABLE RYOH -B8E9..B903 ; LVT # Lo [27] HANGUL SYLLABLE RUG..HANGUL SYLLABLE RUH -B905..B91F ; LVT # Lo [27] HANGUL SYLLABLE RWEOG..HANGUL SYLLABLE RWEOH -B921..B93B ; LVT # Lo [27] HANGUL SYLLABLE RWEG..HANGUL SYLLABLE RWEH -B93D..B957 ; LVT # Lo [27] HANGUL SYLLABLE RWIG..HANGUL SYLLABLE RWIH -B959..B973 ; LVT # Lo [27] HANGUL SYLLABLE RYUG..HANGUL SYLLABLE RYUH -B975..B98F ; LVT # Lo [27] HANGUL SYLLABLE REUG..HANGUL SYLLABLE REUH -B991..B9AB ; LVT # Lo [27] HANGUL SYLLABLE RYIG..HANGUL SYLLABLE RYIH -B9AD..B9C7 ; LVT # Lo [27] HANGUL SYLLABLE RIG..HANGUL SYLLABLE RIH -B9C9..B9E3 ; LVT # Lo [27] HANGUL SYLLABLE MAG..HANGUL SYLLABLE MAH -B9E5..B9FF ; LVT # Lo [27] HANGUL SYLLABLE MAEG..HANGUL SYLLABLE MAEH -BA01..BA1B ; LVT # Lo [27] HANGUL SYLLABLE MYAG..HANGUL SYLLABLE MYAH -BA1D..BA37 ; LVT # Lo [27] HANGUL SYLLABLE MYAEG..HANGUL SYLLABLE MYAEH -BA39..BA53 ; LVT # Lo [27] HANGUL SYLLABLE MEOG..HANGUL SYLLABLE MEOH -BA55..BA6F ; LVT # Lo [27] HANGUL SYLLABLE MEG..HANGUL SYLLABLE MEH -BA71..BA8B ; LVT # Lo [27] HANGUL SYLLABLE MYEOG..HANGUL SYLLABLE MYEOH -BA8D..BAA7 ; LVT # Lo [27] HANGUL SYLLABLE MYEG..HANGUL SYLLABLE MYEH -BAA9..BAC3 ; LVT # Lo [27] HANGUL SYLLABLE MOG..HANGUL SYLLABLE MOH -BAC5..BADF ; LVT # Lo [27] HANGUL SYLLABLE MWAG..HANGUL SYLLABLE MWAH -BAE1..BAFB ; LVT # Lo [27] HANGUL SYLLABLE MWAEG..HANGUL SYLLABLE MWAEH -BAFD..BB17 ; LVT # Lo [27] HANGUL SYLLABLE MOEG..HANGUL SYLLABLE MOEH -BB19..BB33 ; LVT # Lo [27] HANGUL SYLLABLE MYOG..HANGUL SYLLABLE MYOH -BB35..BB4F ; LVT # Lo [27] HANGUL SYLLABLE MUG..HANGUL SYLLABLE MUH -BB51..BB6B ; LVT # Lo [27] HANGUL SYLLABLE MWEOG..HANGUL SYLLABLE MWEOH -BB6D..BB87 ; LVT # Lo [27] HANGUL SYLLABLE MWEG..HANGUL SYLLABLE MWEH -BB89..BBA3 ; LVT # Lo [27] HANGUL SYLLABLE MWIG..HANGUL SYLLABLE MWIH -BBA5..BBBF ; LVT # Lo [27] HANGUL SYLLABLE MYUG..HANGUL SYLLABLE MYUH -BBC1..BBDB ; LVT # Lo [27] HANGUL SYLLABLE MEUG..HANGUL SYLLABLE MEUH -BBDD..BBF7 ; LVT # Lo [27] HANGUL SYLLABLE MYIG..HANGUL SYLLABLE MYIH -BBF9..BC13 ; LVT # Lo [27] HANGUL SYLLABLE MIG..HANGUL SYLLABLE MIH -BC15..BC2F ; LVT # Lo [27] HANGUL SYLLABLE BAG..HANGUL SYLLABLE BAH -BC31..BC4B ; LVT # Lo [27] HANGUL SYLLABLE BAEG..HANGUL SYLLABLE BAEH -BC4D..BC67 ; LVT # Lo [27] HANGUL SYLLABLE BYAG..HANGUL SYLLABLE BYAH -BC69..BC83 ; LVT # Lo [27] HANGUL SYLLABLE BYAEG..HANGUL SYLLABLE BYAEH -BC85..BC9F ; LVT # Lo [27] HANGUL SYLLABLE BEOG..HANGUL SYLLABLE BEOH -BCA1..BCBB ; LVT # Lo [27] HANGUL SYLLABLE BEG..HANGUL SYLLABLE BEH -BCBD..BCD7 ; LVT # Lo [27] HANGUL SYLLABLE BYEOG..HANGUL SYLLABLE BYEOH -BCD9..BCF3 ; LVT # Lo [27] HANGUL SYLLABLE BYEG..HANGUL SYLLABLE BYEH -BCF5..BD0F ; LVT # Lo [27] HANGUL SYLLABLE BOG..HANGUL SYLLABLE BOH -BD11..BD2B ; LVT # Lo [27] HANGUL SYLLABLE BWAG..HANGUL SYLLABLE BWAH -BD2D..BD47 ; LVT # Lo [27] HANGUL SYLLABLE BWAEG..HANGUL SYLLABLE BWAEH -BD49..BD63 ; LVT # Lo [27] HANGUL SYLLABLE BOEG..HANGUL SYLLABLE BOEH -BD65..BD7F ; LVT # Lo [27] HANGUL SYLLABLE BYOG..HANGUL SYLLABLE BYOH -BD81..BD9B ; LVT # Lo [27] HANGUL SYLLABLE BUG..HANGUL SYLLABLE BUH -BD9D..BDB7 ; LVT # Lo [27] HANGUL SYLLABLE BWEOG..HANGUL SYLLABLE BWEOH -BDB9..BDD3 ; LVT # Lo [27] HANGUL SYLLABLE BWEG..HANGUL SYLLABLE BWEH -BDD5..BDEF ; LVT # Lo [27] HANGUL SYLLABLE BWIG..HANGUL SYLLABLE BWIH -BDF1..BE0B ; LVT # Lo [27] HANGUL SYLLABLE BYUG..HANGUL SYLLABLE BYUH -BE0D..BE27 ; LVT # Lo [27] HANGUL SYLLABLE BEUG..HANGUL SYLLABLE BEUH -BE29..BE43 ; LVT # Lo [27] HANGUL SYLLABLE BYIG..HANGUL SYLLABLE BYIH -BE45..BE5F ; LVT # Lo [27] HANGUL SYLLABLE BIG..HANGUL SYLLABLE BIH -BE61..BE7B ; LVT # Lo [27] HANGUL SYLLABLE BBAG..HANGUL SYLLABLE BBAH -BE7D..BE97 ; LVT # Lo [27] HANGUL SYLLABLE BBAEG..HANGUL SYLLABLE BBAEH -BE99..BEB3 ; LVT # Lo [27] HANGUL SYLLABLE BBYAG..HANGUL SYLLABLE BBYAH -BEB5..BECF ; LVT # Lo [27] HANGUL SYLLABLE BBYAEG..HANGUL SYLLABLE BBYAEH -BED1..BEEB ; LVT # Lo [27] HANGUL SYLLABLE BBEOG..HANGUL SYLLABLE BBEOH -BEED..BF07 ; LVT # Lo [27] HANGUL SYLLABLE BBEG..HANGUL SYLLABLE BBEH -BF09..BF23 ; LVT # Lo [27] HANGUL SYLLABLE BBYEOG..HANGUL SYLLABLE BBYEOH -BF25..BF3F ; LVT # Lo [27] HANGUL SYLLABLE BBYEG..HANGUL SYLLABLE BBYEH -BF41..BF5B ; LVT # Lo [27] HANGUL SYLLABLE BBOG..HANGUL SYLLABLE BBOH -BF5D..BF77 ; LVT # Lo [27] HANGUL SYLLABLE BBWAG..HANGUL SYLLABLE BBWAH -BF79..BF93 ; LVT # Lo [27] HANGUL SYLLABLE BBWAEG..HANGUL SYLLABLE BBWAEH -BF95..BFAF ; LVT # Lo [27] HANGUL SYLLABLE BBOEG..HANGUL SYLLABLE BBOEH -BFB1..BFCB ; LVT # Lo [27] HANGUL SYLLABLE BBYOG..HANGUL SYLLABLE BBYOH -BFCD..BFE7 ; LVT # Lo [27] HANGUL SYLLABLE BBUG..HANGUL SYLLABLE BBUH -BFE9..C003 ; LVT # Lo [27] HANGUL SYLLABLE BBWEOG..HANGUL SYLLABLE BBWEOH -C005..C01F ; LVT # Lo [27] HANGUL SYLLABLE BBWEG..HANGUL SYLLABLE BBWEH -C021..C03B ; LVT # Lo [27] HANGUL SYLLABLE BBWIG..HANGUL SYLLABLE BBWIH -C03D..C057 ; LVT # Lo [27] HANGUL SYLLABLE BBYUG..HANGUL SYLLABLE BBYUH -C059..C073 ; LVT # Lo [27] HANGUL SYLLABLE BBEUG..HANGUL SYLLABLE BBEUH -C075..C08F ; LVT # Lo [27] HANGUL SYLLABLE BBYIG..HANGUL SYLLABLE BBYIH -C091..C0AB ; LVT # Lo [27] HANGUL SYLLABLE BBIG..HANGUL SYLLABLE BBIH -C0AD..C0C7 ; LVT # Lo [27] HANGUL SYLLABLE SAG..HANGUL SYLLABLE SAH -C0C9..C0E3 ; LVT # Lo [27] HANGUL SYLLABLE SAEG..HANGUL SYLLABLE SAEH -C0E5..C0FF ; LVT # Lo [27] HANGUL SYLLABLE SYAG..HANGUL SYLLABLE SYAH -C101..C11B ; LVT # Lo [27] HANGUL SYLLABLE SYAEG..HANGUL SYLLABLE SYAEH -C11D..C137 ; LVT # Lo [27] HANGUL SYLLABLE SEOG..HANGUL SYLLABLE SEOH -C139..C153 ; LVT # Lo [27] HANGUL SYLLABLE SEG..HANGUL SYLLABLE SEH -C155..C16F ; LVT # Lo [27] HANGUL SYLLABLE SYEOG..HANGUL SYLLABLE SYEOH -C171..C18B ; LVT # Lo [27] HANGUL SYLLABLE SYEG..HANGUL SYLLABLE SYEH -C18D..C1A7 ; LVT # Lo [27] HANGUL SYLLABLE SOG..HANGUL SYLLABLE SOH -C1A9..C1C3 ; LVT # Lo [27] HANGUL SYLLABLE SWAG..HANGUL SYLLABLE SWAH -C1C5..C1DF ; LVT # Lo [27] HANGUL SYLLABLE SWAEG..HANGUL SYLLABLE SWAEH -C1E1..C1FB ; LVT # Lo [27] HANGUL SYLLABLE SOEG..HANGUL SYLLABLE SOEH -C1FD..C217 ; LVT # Lo [27] HANGUL SYLLABLE SYOG..HANGUL SYLLABLE SYOH -C219..C233 ; LVT # Lo [27] HANGUL SYLLABLE SUG..HANGUL SYLLABLE SUH -C235..C24F ; LVT # Lo [27] HANGUL SYLLABLE SWEOG..HANGUL SYLLABLE SWEOH -C251..C26B ; LVT # Lo [27] HANGUL SYLLABLE SWEG..HANGUL SYLLABLE SWEH -C26D..C287 ; LVT # Lo [27] HANGUL SYLLABLE SWIG..HANGUL SYLLABLE SWIH -C289..C2A3 ; LVT # Lo [27] HANGUL SYLLABLE SYUG..HANGUL SYLLABLE SYUH -C2A5..C2BF ; LVT # Lo [27] HANGUL SYLLABLE SEUG..HANGUL SYLLABLE SEUH -C2C1..C2DB ; LVT # Lo [27] HANGUL SYLLABLE SYIG..HANGUL SYLLABLE SYIH -C2DD..C2F7 ; LVT # Lo [27] HANGUL SYLLABLE SIG..HANGUL SYLLABLE SIH -C2F9..C313 ; LVT # Lo [27] HANGUL SYLLABLE SSAG..HANGUL SYLLABLE SSAH -C315..C32F ; LVT # Lo [27] HANGUL SYLLABLE SSAEG..HANGUL SYLLABLE SSAEH -C331..C34B ; LVT # Lo [27] HANGUL SYLLABLE SSYAG..HANGUL SYLLABLE SSYAH -C34D..C367 ; LVT # Lo [27] HANGUL SYLLABLE SSYAEG..HANGUL SYLLABLE SSYAEH -C369..C383 ; LVT # Lo [27] HANGUL SYLLABLE SSEOG..HANGUL SYLLABLE SSEOH -C385..C39F ; LVT # Lo [27] HANGUL SYLLABLE SSEG..HANGUL SYLLABLE SSEH -C3A1..C3BB ; LVT # Lo [27] HANGUL SYLLABLE SSYEOG..HANGUL SYLLABLE SSYEOH -C3BD..C3D7 ; LVT # Lo [27] HANGUL SYLLABLE SSYEG..HANGUL SYLLABLE SSYEH -C3D9..C3F3 ; LVT # Lo [27] HANGUL SYLLABLE SSOG..HANGUL SYLLABLE SSOH -C3F5..C40F ; LVT # Lo [27] HANGUL SYLLABLE SSWAG..HANGUL SYLLABLE SSWAH -C411..C42B ; LVT # Lo [27] HANGUL SYLLABLE SSWAEG..HANGUL SYLLABLE SSWAEH -C42D..C447 ; LVT # Lo [27] HANGUL SYLLABLE SSOEG..HANGUL SYLLABLE SSOEH -C449..C463 ; LVT # Lo [27] HANGUL SYLLABLE SSYOG..HANGUL SYLLABLE SSYOH -C465..C47F ; LVT # Lo [27] HANGUL SYLLABLE SSUG..HANGUL SYLLABLE SSUH -C481..C49B ; LVT # Lo [27] HANGUL SYLLABLE SSWEOG..HANGUL SYLLABLE SSWEOH -C49D..C4B7 ; LVT # Lo [27] HANGUL SYLLABLE SSWEG..HANGUL SYLLABLE SSWEH -C4B9..C4D3 ; LVT # Lo [27] HANGUL SYLLABLE SSWIG..HANGUL SYLLABLE SSWIH -C4D5..C4EF ; LVT # Lo [27] HANGUL SYLLABLE SSYUG..HANGUL SYLLABLE SSYUH -C4F1..C50B ; LVT # Lo [27] HANGUL SYLLABLE SSEUG..HANGUL SYLLABLE SSEUH -C50D..C527 ; LVT # Lo [27] HANGUL SYLLABLE SSYIG..HANGUL SYLLABLE SSYIH -C529..C543 ; LVT # Lo [27] HANGUL SYLLABLE SSIG..HANGUL SYLLABLE SSIH -C545..C55F ; LVT # Lo [27] HANGUL SYLLABLE AG..HANGUL SYLLABLE AH -C561..C57B ; LVT # Lo [27] HANGUL SYLLABLE AEG..HANGUL SYLLABLE AEH -C57D..C597 ; LVT # Lo [27] HANGUL SYLLABLE YAG..HANGUL SYLLABLE YAH -C599..C5B3 ; LVT # Lo [27] HANGUL SYLLABLE YAEG..HANGUL SYLLABLE YAEH -C5B5..C5CF ; LVT # Lo [27] HANGUL SYLLABLE EOG..HANGUL SYLLABLE EOH -C5D1..C5EB ; LVT # Lo [27] HANGUL SYLLABLE EG..HANGUL SYLLABLE EH -C5ED..C607 ; LVT # Lo [27] HANGUL SYLLABLE YEOG..HANGUL SYLLABLE YEOH -C609..C623 ; LVT # Lo [27] HANGUL SYLLABLE YEG..HANGUL SYLLABLE YEH -C625..C63F ; LVT # Lo [27] HANGUL SYLLABLE OG..HANGUL SYLLABLE OH -C641..C65B ; LVT # Lo [27] HANGUL SYLLABLE WAG..HANGUL SYLLABLE WAH -C65D..C677 ; LVT # Lo [27] HANGUL SYLLABLE WAEG..HANGUL SYLLABLE WAEH -C679..C693 ; LVT # Lo [27] HANGUL SYLLABLE OEG..HANGUL SYLLABLE OEH -C695..C6AF ; LVT # Lo [27] HANGUL SYLLABLE YOG..HANGUL SYLLABLE YOH -C6B1..C6CB ; LVT # Lo [27] HANGUL SYLLABLE UG..HANGUL SYLLABLE UH -C6CD..C6E7 ; LVT # Lo [27] HANGUL SYLLABLE WEOG..HANGUL SYLLABLE WEOH -C6E9..C703 ; LVT # Lo [27] HANGUL SYLLABLE WEG..HANGUL SYLLABLE WEH -C705..C71F ; LVT # Lo [27] HANGUL SYLLABLE WIG..HANGUL SYLLABLE WIH -C721..C73B ; LVT # Lo [27] HANGUL SYLLABLE YUG..HANGUL SYLLABLE YUH -C73D..C757 ; LVT # Lo [27] HANGUL SYLLABLE EUG..HANGUL SYLLABLE EUH -C759..C773 ; LVT # Lo [27] HANGUL SYLLABLE YIG..HANGUL SYLLABLE YIH -C775..C78F ; LVT # Lo [27] HANGUL SYLLABLE IG..HANGUL SYLLABLE IH -C791..C7AB ; LVT # Lo [27] HANGUL SYLLABLE JAG..HANGUL SYLLABLE JAH -C7AD..C7C7 ; LVT # Lo [27] HANGUL SYLLABLE JAEG..HANGUL SYLLABLE JAEH -C7C9..C7E3 ; LVT # Lo [27] HANGUL SYLLABLE JYAG..HANGUL SYLLABLE JYAH -C7E5..C7FF ; LVT # Lo [27] HANGUL SYLLABLE JYAEG..HANGUL SYLLABLE JYAEH -C801..C81B ; LVT # Lo [27] HANGUL SYLLABLE JEOG..HANGUL SYLLABLE JEOH -C81D..C837 ; LVT # Lo [27] HANGUL SYLLABLE JEG..HANGUL SYLLABLE JEH -C839..C853 ; LVT # Lo [27] HANGUL SYLLABLE JYEOG..HANGUL SYLLABLE JYEOH -C855..C86F ; LVT # Lo [27] HANGUL SYLLABLE JYEG..HANGUL SYLLABLE JYEH -C871..C88B ; LVT # Lo [27] HANGUL SYLLABLE JOG..HANGUL SYLLABLE JOH -C88D..C8A7 ; LVT # Lo [27] HANGUL SYLLABLE JWAG..HANGUL SYLLABLE JWAH -C8A9..C8C3 ; LVT # Lo [27] HANGUL SYLLABLE JWAEG..HANGUL SYLLABLE JWAEH -C8C5..C8DF ; LVT # Lo [27] HANGUL SYLLABLE JOEG..HANGUL SYLLABLE JOEH -C8E1..C8FB ; LVT # Lo [27] HANGUL SYLLABLE JYOG..HANGUL SYLLABLE JYOH -C8FD..C917 ; LVT # Lo [27] HANGUL SYLLABLE JUG..HANGUL SYLLABLE JUH -C919..C933 ; LVT # Lo [27] HANGUL SYLLABLE JWEOG..HANGUL SYLLABLE JWEOH -C935..C94F ; LVT # Lo [27] HANGUL SYLLABLE JWEG..HANGUL SYLLABLE JWEH -C951..C96B ; LVT # Lo [27] HANGUL SYLLABLE JWIG..HANGUL SYLLABLE JWIH -C96D..C987 ; LVT # Lo [27] HANGUL SYLLABLE JYUG..HANGUL SYLLABLE JYUH -C989..C9A3 ; LVT # Lo [27] HANGUL SYLLABLE JEUG..HANGUL SYLLABLE JEUH -C9A5..C9BF ; LVT # Lo [27] HANGUL SYLLABLE JYIG..HANGUL SYLLABLE JYIH -C9C1..C9DB ; LVT # Lo [27] HANGUL SYLLABLE JIG..HANGUL SYLLABLE JIH -C9DD..C9F7 ; LVT # Lo [27] HANGUL SYLLABLE JJAG..HANGUL SYLLABLE JJAH -C9F9..CA13 ; LVT # Lo [27] HANGUL SYLLABLE JJAEG..HANGUL SYLLABLE JJAEH -CA15..CA2F ; LVT # Lo [27] HANGUL SYLLABLE JJYAG..HANGUL SYLLABLE JJYAH -CA31..CA4B ; LVT # Lo [27] HANGUL SYLLABLE JJYAEG..HANGUL SYLLABLE JJYAEH -CA4D..CA67 ; LVT # Lo [27] HANGUL SYLLABLE JJEOG..HANGUL SYLLABLE JJEOH -CA69..CA83 ; LVT # Lo [27] HANGUL SYLLABLE JJEG..HANGUL SYLLABLE JJEH -CA85..CA9F ; LVT # Lo [27] HANGUL SYLLABLE JJYEOG..HANGUL SYLLABLE JJYEOH -CAA1..CABB ; LVT # Lo [27] HANGUL SYLLABLE JJYEG..HANGUL SYLLABLE JJYEH -CABD..CAD7 ; LVT # Lo [27] HANGUL SYLLABLE JJOG..HANGUL SYLLABLE JJOH -CAD9..CAF3 ; LVT # Lo [27] HANGUL SYLLABLE JJWAG..HANGUL SYLLABLE JJWAH -CAF5..CB0F ; LVT # Lo [27] HANGUL SYLLABLE JJWAEG..HANGUL SYLLABLE JJWAEH -CB11..CB2B ; LVT # Lo [27] HANGUL SYLLABLE JJOEG..HANGUL SYLLABLE JJOEH -CB2D..CB47 ; LVT # Lo [27] HANGUL SYLLABLE JJYOG..HANGUL SYLLABLE JJYOH -CB49..CB63 ; LVT # Lo [27] HANGUL SYLLABLE JJUG..HANGUL SYLLABLE JJUH -CB65..CB7F ; LVT # Lo [27] HANGUL SYLLABLE JJWEOG..HANGUL SYLLABLE JJWEOH -CB81..CB9B ; LVT # Lo [27] HANGUL SYLLABLE JJWEG..HANGUL SYLLABLE JJWEH -CB9D..CBB7 ; LVT # Lo [27] HANGUL SYLLABLE JJWIG..HANGUL SYLLABLE JJWIH -CBB9..CBD3 ; LVT # Lo [27] HANGUL SYLLABLE JJYUG..HANGUL SYLLABLE JJYUH -CBD5..CBEF ; LVT # Lo [27] HANGUL SYLLABLE JJEUG..HANGUL SYLLABLE JJEUH -CBF1..CC0B ; LVT # Lo [27] HANGUL SYLLABLE JJYIG..HANGUL SYLLABLE JJYIH -CC0D..CC27 ; LVT # Lo [27] HANGUL SYLLABLE JJIG..HANGUL SYLLABLE JJIH -CC29..CC43 ; LVT # Lo [27] HANGUL SYLLABLE CAG..HANGUL SYLLABLE CAH -CC45..CC5F ; LVT # Lo [27] HANGUL SYLLABLE CAEG..HANGUL SYLLABLE CAEH -CC61..CC7B ; LVT # Lo [27] HANGUL SYLLABLE CYAG..HANGUL SYLLABLE CYAH -CC7D..CC97 ; LVT # Lo [27] HANGUL SYLLABLE CYAEG..HANGUL SYLLABLE CYAEH -CC99..CCB3 ; LVT # Lo [27] HANGUL SYLLABLE CEOG..HANGUL SYLLABLE CEOH -CCB5..CCCF ; LVT # Lo [27] HANGUL SYLLABLE CEG..HANGUL SYLLABLE CEH -CCD1..CCEB ; LVT # Lo [27] HANGUL SYLLABLE CYEOG..HANGUL SYLLABLE CYEOH -CCED..CD07 ; LVT # Lo [27] HANGUL SYLLABLE CYEG..HANGUL SYLLABLE CYEH -CD09..CD23 ; LVT # Lo [27] HANGUL SYLLABLE COG..HANGUL SYLLABLE COH -CD25..CD3F ; LVT # Lo [27] HANGUL SYLLABLE CWAG..HANGUL SYLLABLE CWAH -CD41..CD5B ; LVT # Lo [27] HANGUL SYLLABLE CWAEG..HANGUL SYLLABLE CWAEH -CD5D..CD77 ; LVT # Lo [27] HANGUL SYLLABLE COEG..HANGUL SYLLABLE COEH -CD79..CD93 ; LVT # Lo [27] HANGUL SYLLABLE CYOG..HANGUL SYLLABLE CYOH -CD95..CDAF ; LVT # Lo [27] HANGUL SYLLABLE CUG..HANGUL SYLLABLE CUH -CDB1..CDCB ; LVT # Lo [27] HANGUL SYLLABLE CWEOG..HANGUL SYLLABLE CWEOH -CDCD..CDE7 ; LVT # Lo [27] HANGUL SYLLABLE CWEG..HANGUL SYLLABLE CWEH -CDE9..CE03 ; LVT # Lo [27] HANGUL SYLLABLE CWIG..HANGUL SYLLABLE CWIH -CE05..CE1F ; LVT # Lo [27] HANGUL SYLLABLE CYUG..HANGUL SYLLABLE CYUH -CE21..CE3B ; LVT # Lo [27] HANGUL SYLLABLE CEUG..HANGUL SYLLABLE CEUH -CE3D..CE57 ; LVT # Lo [27] HANGUL SYLLABLE CYIG..HANGUL SYLLABLE CYIH -CE59..CE73 ; LVT # Lo [27] HANGUL SYLLABLE CIG..HANGUL SYLLABLE CIH -CE75..CE8F ; LVT # Lo [27] HANGUL SYLLABLE KAG..HANGUL SYLLABLE KAH -CE91..CEAB ; LVT # Lo [27] HANGUL SYLLABLE KAEG..HANGUL SYLLABLE KAEH -CEAD..CEC7 ; LVT # Lo [27] HANGUL SYLLABLE KYAG..HANGUL SYLLABLE KYAH -CEC9..CEE3 ; LVT # Lo [27] HANGUL SYLLABLE KYAEG..HANGUL SYLLABLE KYAEH -CEE5..CEFF ; LVT # Lo [27] HANGUL SYLLABLE KEOG..HANGUL SYLLABLE KEOH -CF01..CF1B ; LVT # Lo [27] HANGUL SYLLABLE KEG..HANGUL SYLLABLE KEH -CF1D..CF37 ; LVT # Lo [27] HANGUL SYLLABLE KYEOG..HANGUL SYLLABLE KYEOH -CF39..CF53 ; LVT # Lo [27] HANGUL SYLLABLE KYEG..HANGUL SYLLABLE KYEH -CF55..CF6F ; LVT # Lo [27] HANGUL SYLLABLE KOG..HANGUL SYLLABLE KOH -CF71..CF8B ; LVT # Lo [27] HANGUL SYLLABLE KWAG..HANGUL SYLLABLE KWAH -CF8D..CFA7 ; LVT # Lo [27] HANGUL SYLLABLE KWAEG..HANGUL SYLLABLE KWAEH -CFA9..CFC3 ; LVT # Lo [27] HANGUL SYLLABLE KOEG..HANGUL SYLLABLE KOEH -CFC5..CFDF ; LVT # Lo [27] HANGUL SYLLABLE KYOG..HANGUL SYLLABLE KYOH -CFE1..CFFB ; LVT # Lo [27] HANGUL SYLLABLE KUG..HANGUL SYLLABLE KUH -CFFD..D017 ; LVT # Lo [27] HANGUL SYLLABLE KWEOG..HANGUL SYLLABLE KWEOH -D019..D033 ; LVT # Lo [27] HANGUL SYLLABLE KWEG..HANGUL SYLLABLE KWEH -D035..D04F ; LVT # Lo [27] HANGUL SYLLABLE KWIG..HANGUL SYLLABLE KWIH -D051..D06B ; LVT # Lo [27] HANGUL SYLLABLE KYUG..HANGUL SYLLABLE KYUH -D06D..D087 ; LVT # Lo [27] HANGUL SYLLABLE KEUG..HANGUL SYLLABLE KEUH -D089..D0A3 ; LVT # Lo [27] HANGUL SYLLABLE KYIG..HANGUL SYLLABLE KYIH -D0A5..D0BF ; LVT # Lo [27] HANGUL SYLLABLE KIG..HANGUL SYLLABLE KIH -D0C1..D0DB ; LVT # Lo [27] HANGUL SYLLABLE TAG..HANGUL SYLLABLE TAH -D0DD..D0F7 ; LVT # Lo [27] HANGUL SYLLABLE TAEG..HANGUL SYLLABLE TAEH -D0F9..D113 ; LVT # Lo [27] HANGUL SYLLABLE TYAG..HANGUL SYLLABLE TYAH -D115..D12F ; LVT # Lo [27] HANGUL SYLLABLE TYAEG..HANGUL SYLLABLE TYAEH -D131..D14B ; LVT # Lo [27] HANGUL SYLLABLE TEOG..HANGUL SYLLABLE TEOH -D14D..D167 ; LVT # Lo [27] HANGUL SYLLABLE TEG..HANGUL SYLLABLE TEH -D169..D183 ; LVT # Lo [27] HANGUL SYLLABLE TYEOG..HANGUL SYLLABLE TYEOH -D185..D19F ; LVT # Lo [27] HANGUL SYLLABLE TYEG..HANGUL SYLLABLE TYEH -D1A1..D1BB ; LVT # Lo [27] HANGUL SYLLABLE TOG..HANGUL SYLLABLE TOH -D1BD..D1D7 ; LVT # Lo [27] HANGUL SYLLABLE TWAG..HANGUL SYLLABLE TWAH -D1D9..D1F3 ; LVT # Lo [27] HANGUL SYLLABLE TWAEG..HANGUL SYLLABLE TWAEH -D1F5..D20F ; LVT # Lo [27] HANGUL SYLLABLE TOEG..HANGUL SYLLABLE TOEH -D211..D22B ; LVT # Lo [27] HANGUL SYLLABLE TYOG..HANGUL SYLLABLE TYOH -D22D..D247 ; LVT # Lo [27] HANGUL SYLLABLE TUG..HANGUL SYLLABLE TUH -D249..D263 ; LVT # Lo [27] HANGUL SYLLABLE TWEOG..HANGUL SYLLABLE TWEOH -D265..D27F ; LVT # Lo [27] HANGUL SYLLABLE TWEG..HANGUL SYLLABLE TWEH -D281..D29B ; LVT # Lo [27] HANGUL SYLLABLE TWIG..HANGUL SYLLABLE TWIH -D29D..D2B7 ; LVT # Lo [27] HANGUL SYLLABLE TYUG..HANGUL SYLLABLE TYUH -D2B9..D2D3 ; LVT # Lo [27] HANGUL SYLLABLE TEUG..HANGUL SYLLABLE TEUH -D2D5..D2EF ; LVT # Lo [27] HANGUL SYLLABLE TYIG..HANGUL SYLLABLE TYIH -D2F1..D30B ; LVT # Lo [27] HANGUL SYLLABLE TIG..HANGUL SYLLABLE TIH -D30D..D327 ; LVT # Lo [27] HANGUL SYLLABLE PAG..HANGUL SYLLABLE PAH -D329..D343 ; LVT # Lo [27] HANGUL SYLLABLE PAEG..HANGUL SYLLABLE PAEH -D345..D35F ; LVT # Lo [27] HANGUL SYLLABLE PYAG..HANGUL SYLLABLE PYAH -D361..D37B ; LVT # Lo [27] HANGUL SYLLABLE PYAEG..HANGUL SYLLABLE PYAEH -D37D..D397 ; LVT # Lo [27] HANGUL SYLLABLE PEOG..HANGUL SYLLABLE PEOH -D399..D3B3 ; LVT # Lo [27] HANGUL SYLLABLE PEG..HANGUL SYLLABLE PEH -D3B5..D3CF ; LVT # Lo [27] HANGUL SYLLABLE PYEOG..HANGUL SYLLABLE PYEOH -D3D1..D3EB ; LVT # Lo [27] HANGUL SYLLABLE PYEG..HANGUL SYLLABLE PYEH -D3ED..D407 ; LVT # Lo [27] HANGUL SYLLABLE POG..HANGUL SYLLABLE POH -D409..D423 ; LVT # Lo [27] HANGUL SYLLABLE PWAG..HANGUL SYLLABLE PWAH -D425..D43F ; LVT # Lo [27] HANGUL SYLLABLE PWAEG..HANGUL SYLLABLE PWAEH -D441..D45B ; LVT # Lo [27] HANGUL SYLLABLE POEG..HANGUL SYLLABLE POEH -D45D..D477 ; LVT # Lo [27] HANGUL SYLLABLE PYOG..HANGUL SYLLABLE PYOH -D479..D493 ; LVT # Lo [27] HANGUL SYLLABLE PUG..HANGUL SYLLABLE PUH -D495..D4AF ; LVT # Lo [27] HANGUL SYLLABLE PWEOG..HANGUL SYLLABLE PWEOH -D4B1..D4CB ; LVT # Lo [27] HANGUL SYLLABLE PWEG..HANGUL SYLLABLE PWEH -D4CD..D4E7 ; LVT # Lo [27] HANGUL SYLLABLE PWIG..HANGUL SYLLABLE PWIH -D4E9..D503 ; LVT # Lo [27] HANGUL SYLLABLE PYUG..HANGUL SYLLABLE PYUH -D505..D51F ; LVT # Lo [27] HANGUL SYLLABLE PEUG..HANGUL SYLLABLE PEUH -D521..D53B ; LVT # Lo [27] HANGUL SYLLABLE PYIG..HANGUL SYLLABLE PYIH -D53D..D557 ; LVT # Lo [27] HANGUL SYLLABLE PIG..HANGUL SYLLABLE PIH -D559..D573 ; LVT # Lo [27] HANGUL SYLLABLE HAG..HANGUL SYLLABLE HAH -D575..D58F ; LVT # Lo [27] HANGUL SYLLABLE HAEG..HANGUL SYLLABLE HAEH -D591..D5AB ; LVT # Lo [27] HANGUL SYLLABLE HYAG..HANGUL SYLLABLE HYAH -D5AD..D5C7 ; LVT # Lo [27] HANGUL SYLLABLE HYAEG..HANGUL SYLLABLE HYAEH -D5C9..D5E3 ; LVT # Lo [27] HANGUL SYLLABLE HEOG..HANGUL SYLLABLE HEOH -D5E5..D5FF ; LVT # Lo [27] HANGUL SYLLABLE HEG..HANGUL SYLLABLE HEH -D601..D61B ; LVT # Lo [27] HANGUL SYLLABLE HYEOG..HANGUL SYLLABLE HYEOH -D61D..D637 ; LVT # Lo [27] HANGUL SYLLABLE HYEG..HANGUL SYLLABLE HYEH -D639..D653 ; LVT # Lo [27] HANGUL SYLLABLE HOG..HANGUL SYLLABLE HOH -D655..D66F ; LVT # Lo [27] HANGUL SYLLABLE HWAG..HANGUL SYLLABLE HWAH -D671..D68B ; LVT # Lo [27] HANGUL SYLLABLE HWAEG..HANGUL SYLLABLE HWAEH -D68D..D6A7 ; LVT # Lo [27] HANGUL SYLLABLE HOEG..HANGUL SYLLABLE HOEH -D6A9..D6C3 ; LVT # Lo [27] HANGUL SYLLABLE HYOG..HANGUL SYLLABLE HYOH -D6C5..D6DF ; LVT # Lo [27] HANGUL SYLLABLE HUG..HANGUL SYLLABLE HUH -D6E1..D6FB ; LVT # Lo [27] HANGUL SYLLABLE HWEOG..HANGUL SYLLABLE HWEOH -D6FD..D717 ; LVT # Lo [27] HANGUL SYLLABLE HWEG..HANGUL SYLLABLE HWEH -D719..D733 ; LVT # Lo [27] HANGUL SYLLABLE HWIG..HANGUL SYLLABLE HWIH -D735..D74F ; LVT # Lo [27] HANGUL SYLLABLE HYUG..HANGUL SYLLABLE HYUH -D751..D76B ; LVT # Lo [27] HANGUL SYLLABLE HEUG..HANGUL SYLLABLE HEUH -D76D..D787 ; LVT # Lo [27] HANGUL SYLLABLE HYIG..HANGUL SYLLABLE HYIH -D789..D7A3 ; LVT # Lo [27] HANGUL SYLLABLE HIG..HANGUL SYLLABLE HIH - -# Total code points: 10773 - -# EOF diff --git a/third_party/harfbuzz/contrib/tables/README b/third_party/harfbuzz/contrib/tables/README deleted file mode 100644 index 605d1c097e..0000000000 --- a/third_party/harfbuzz/contrib/tables/README +++ /dev/null @@ -1,17 +0,0 @@ -This directory contains Python script to parse several of the Unicode tables -that are downloadable from the web and generate C header files from them. - -These are the locations of the files which are parsed. You should download these -files and put them in this directory. - -http://www.unicode.org/Public/5.1.0/ucd/extracted/DerivedGeneralCategory.txt -http://www.unicode.org/Public/5.1.0/ucd/extracted/DerivedCombiningClass.txt -http://www.unicode.org/Public/UNIDATA/auxiliary/GraphemeBreakProperty.txt -http://www.unicode.org/Public/5.1.0/ucd/Scripts.txt - -Then you can run the following python scripts to generate the header files: - -python category-parse.py DerivedGeneralCategory.txt category-properties.h -python combining-class-parse.py DerivedCombiningClass.txt combining-properties.h -python grapheme-break-parse.py GraphemeBreakProperty.txt grapheme-break-properties.h -python scripts-parse.py Scripts.txt script-properties.h diff --git a/third_party/harfbuzz/contrib/tables/Scripts.txt b/third_party/harfbuzz/contrib/tables/Scripts.txt deleted file mode 100644 index 7065486d3a..0000000000 --- a/third_party/harfbuzz/contrib/tables/Scripts.txt +++ /dev/null @@ -1,1747 +0,0 @@ -# Scripts-5.1.0.txt -# Date: 2008-03-20, 17:55:33 GMT [MD] -# -# Unicode Character Database -# Copyright (c) 1991-2008 Unicode, Inc. -# For terms of use, see http://www.unicode.org/terms_of_use.html -# For documentation, see UCD.html - -# ================================================ - -# Property: Script - -# All code points not explicitly listed for Script -# have the value Unknown (Zzzz). - -# @missing: 0000..10FFFF; Unknown - -# ================================================ - -0000..001F ; Common # Cc [32] .. -0020 ; Common # Zs SPACE -0021..0023 ; Common # Po [3] EXCLAMATION MARK..NUMBER SIGN -0024 ; Common # Sc DOLLAR SIGN -0025..0027 ; Common # Po [3] PERCENT SIGN..APOSTROPHE -0028 ; Common # Ps LEFT PARENTHESIS -0029 ; Common # Pe RIGHT PARENTHESIS -002A ; Common # Po ASTERISK -002B ; Common # Sm PLUS SIGN -002C ; Common # Po COMMA -002D ; Common # Pd HYPHEN-MINUS -002E..002F ; Common # Po [2] FULL STOP..SOLIDUS -0030..0039 ; Common # Nd [10] DIGIT ZERO..DIGIT NINE -003A..003B ; Common # Po [2] COLON..SEMICOLON -003C..003E ; Common # Sm [3] LESS-THAN SIGN..GREATER-THAN SIGN -003F..0040 ; Common # Po [2] QUESTION MARK..COMMERCIAL AT -005B ; Common # Ps LEFT SQUARE BRACKET -005C ; Common # Po REVERSE SOLIDUS -005D ; Common # Pe RIGHT SQUARE BRACKET -005E ; Common # Sk CIRCUMFLEX ACCENT -005F ; Common # Pc LOW LINE -0060 ; Common # Sk GRAVE ACCENT -007B ; Common # Ps LEFT CURLY BRACKET -007C ; Common # Sm VERTICAL LINE -007D ; Common # Pe RIGHT CURLY BRACKET -007E ; Common # Sm TILDE -007F..009F ; Common # Cc [33] .. -00A0 ; Common # Zs NO-BREAK SPACE -00A1 ; Common # Po INVERTED EXCLAMATION MARK -00A2..00A5 ; Common # Sc [4] CENT SIGN..YEN SIGN -00A6..00A7 ; Common # So [2] BROKEN BAR..SECTION SIGN -00A8 ; Common # Sk DIAERESIS -00A9 ; Common # So COPYRIGHT SIGN -00AB ; Common # Pi LEFT-POINTING DOUBLE ANGLE QUOTATION MARK -00AC ; Common # Sm NOT SIGN -00AD ; Common # Cf SOFT HYPHEN -00AE ; Common # So REGISTERED SIGN -00AF ; Common # Sk MACRON -00B0 ; Common # So DEGREE SIGN -00B1 ; Common # Sm PLUS-MINUS SIGN -00B2..00B3 ; Common # No [2] SUPERSCRIPT TWO..SUPERSCRIPT THREE -00B4 ; Common # Sk ACUTE ACCENT -00B5 ; Common # L& MICRO SIGN -00B6 ; Common # So PILCROW SIGN -00B7 ; Common # Po MIDDLE DOT -00B8 ; Common # Sk CEDILLA -00B9 ; Common # No SUPERSCRIPT ONE -00BB ; Common # Pf RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK -00BC..00BE ; Common # No [3] VULGAR FRACTION ONE QUARTER..VULGAR FRACTION THREE QUARTERS -00BF ; Common # Po INVERTED QUESTION MARK -00D7 ; Common # Sm MULTIPLICATION SIGN -00F7 ; Common # Sm DIVISION SIGN -02B9..02C1 ; Common # Lm [9] MODIFIER LETTER PRIME..MODIFIER LETTER REVERSED GLOTTAL STOP -02C2..02C5 ; Common # Sk [4] MODIFIER LETTER LEFT ARROWHEAD..MODIFIER LETTER DOWN ARROWHEAD -02C6..02D1 ; Common # Lm [12] MODIFIER LETTER CIRCUMFLEX ACCENT..MODIFIER LETTER HALF TRIANGULAR COLON -02D2..02DF ; Common # Sk [14] MODIFIER LETTER CENTRED RIGHT HALF RING..MODIFIER LETTER CROSS ACCENT -02E5..02EB ; Common # Sk [7] MODIFIER LETTER EXTRA-HIGH TONE BAR..MODIFIER LETTER YANG DEPARTING TONE MARK -02EC ; Common # Lm MODIFIER LETTER VOICING -02ED ; Common # Sk MODIFIER LETTER UNASPIRATED -02EE ; Common # Lm MODIFIER LETTER DOUBLE APOSTROPHE -02EF..02FF ; Common # Sk [17] MODIFIER LETTER LOW DOWN ARROWHEAD..MODIFIER LETTER LOW LEFT ARROW -0374 ; Common # Lm GREEK NUMERAL SIGN -037E ; Common # Po GREEK QUESTION MARK -0385 ; Common # Sk GREEK DIALYTIKA TONOS -0387 ; Common # Po GREEK ANO TELEIA -0589 ; Common # Po ARMENIAN FULL STOP -0600..0603 ; Common # Cf [4] ARABIC NUMBER SIGN..ARABIC SIGN SAFHA -060C ; Common # Po ARABIC COMMA -061B ; Common # Po ARABIC SEMICOLON -061F ; Common # Po ARABIC QUESTION MARK -0640 ; Common # Lm ARABIC TATWEEL -0660..0669 ; Common # Nd [10] ARABIC-INDIC DIGIT ZERO..ARABIC-INDIC DIGIT NINE -06DD ; Common # Cf ARABIC END OF AYAH -0964..0965 ; Common # Po [2] DEVANAGARI DANDA..DEVANAGARI DOUBLE DANDA -0970 ; Common # Po DEVANAGARI ABBREVIATION SIGN -0CF1..0CF2 ; Common # So [2] KANNADA SIGN JIHVAMULIYA..KANNADA SIGN UPADHMANIYA -0E3F ; Common # Sc THAI CURRENCY SYMBOL BAHT -10FB ; Common # Po GEORGIAN PARAGRAPH SEPARATOR -16EB..16ED ; Common # Po [3] RUNIC SINGLE PUNCTUATION..RUNIC CROSS PUNCTUATION -1735..1736 ; Common # Po [2] PHILIPPINE SINGLE PUNCTUATION..PHILIPPINE DOUBLE PUNCTUATION -1802..1803 ; Common # Po [2] MONGOLIAN COMMA..MONGOLIAN FULL STOP -1805 ; Common # Po MONGOLIAN FOUR DOTS -2000..200A ; Common # Zs [11] EN QUAD..HAIR SPACE -200B ; Common # Cf ZERO WIDTH SPACE -200E..200F ; Common # Cf [2] LEFT-TO-RIGHT MARK..RIGHT-TO-LEFT MARK -2010..2015 ; Common # Pd [6] HYPHEN..HORIZONTAL BAR -2016..2017 ; Common # Po [2] DOUBLE VERTICAL LINE..DOUBLE LOW LINE -2018 ; Common # Pi LEFT SINGLE QUOTATION MARK -2019 ; Common # Pf RIGHT SINGLE QUOTATION MARK -201A ; Common # Ps SINGLE LOW-9 QUOTATION MARK -201B..201C ; Common # Pi [2] SINGLE HIGH-REVERSED-9 QUOTATION MARK..LEFT DOUBLE QUOTATION MARK -201D ; Common # Pf RIGHT DOUBLE QUOTATION MARK -201E ; Common # Ps DOUBLE LOW-9 QUOTATION MARK -201F ; Common # Pi DOUBLE HIGH-REVERSED-9 QUOTATION MARK -2020..2027 ; Common # Po [8] DAGGER..HYPHENATION POINT -2028 ; Common # Zl LINE SEPARATOR -2029 ; Common # Zp PARAGRAPH SEPARATOR -202A..202E ; Common # Cf [5] LEFT-TO-RIGHT EMBEDDING..RIGHT-TO-LEFT OVERRIDE -202F ; Common # Zs NARROW NO-BREAK SPACE -2030..2038 ; Common # Po [9] PER MILLE SIGN..CARET -2039 ; Common # Pi SINGLE LEFT-POINTING ANGLE QUOTATION MARK -203A ; Common # Pf SINGLE RIGHT-POINTING ANGLE QUOTATION MARK -203B..203E ; Common # Po [4] REFERENCE MARK..OVERLINE -203F..2040 ; Common # Pc [2] UNDERTIE..CHARACTER TIE -2041..2043 ; Common # Po [3] CARET INSERTION POINT..HYPHEN BULLET -2044 ; Common # Sm FRACTION SLASH -2045 ; Common # Ps LEFT SQUARE BRACKET WITH QUILL -2046 ; Common # Pe RIGHT SQUARE BRACKET WITH QUILL -2047..2051 ; Common # Po [11] DOUBLE QUESTION MARK..TWO ASTERISKS ALIGNED VERTICALLY -2052 ; Common # Sm COMMERCIAL MINUS SIGN -2053 ; Common # Po SWUNG DASH -2054 ; Common # Pc INVERTED UNDERTIE -2055..205E ; Common # Po [10] FLOWER PUNCTUATION MARK..VERTICAL FOUR DOTS -205F ; Common # Zs MEDIUM MATHEMATICAL SPACE -2060..2064 ; Common # Cf [5] WORD JOINER..INVISIBLE PLUS -206A..206F ; Common # Cf [6] INHIBIT SYMMETRIC SWAPPING..NOMINAL DIGIT SHAPES -2070 ; Common # No SUPERSCRIPT ZERO -2074..2079 ; Common # No [6] SUPERSCRIPT FOUR..SUPERSCRIPT NINE -207A..207C ; Common # Sm [3] SUPERSCRIPT PLUS SIGN..SUPERSCRIPT EQUALS SIGN -207D ; Common # Ps SUPERSCRIPT LEFT PARENTHESIS -207E ; Common # Pe SUPERSCRIPT RIGHT PARENTHESIS -2080..2089 ; Common # No [10] SUBSCRIPT ZERO..SUBSCRIPT NINE -208A..208C ; Common # Sm [3] SUBSCRIPT PLUS SIGN..SUBSCRIPT EQUALS SIGN -208D ; Common # Ps SUBSCRIPT LEFT PARENTHESIS -208E ; Common # Pe SUBSCRIPT RIGHT PARENTHESIS -20A0..20B5 ; Common # Sc [22] EURO-CURRENCY SIGN..CEDI SIGN -2100..2101 ; Common # So [2] ACCOUNT OF..ADDRESSED TO THE SUBJECT -2102 ; Common # L& DOUBLE-STRUCK CAPITAL C -2103..2106 ; Common # So [4] DEGREE CELSIUS..CADA UNA -2107 ; Common # L& EULER CONSTANT -2108..2109 ; Common # So [2] SCRUPLE..DEGREE FAHRENHEIT -210A..2113 ; Common # L& [10] SCRIPT SMALL G..SCRIPT SMALL L -2114 ; Common # So L B BAR SYMBOL -2115 ; Common # L& DOUBLE-STRUCK CAPITAL N -2116..2118 ; Common # So [3] NUMERO SIGN..SCRIPT CAPITAL P -2119..211D ; Common # L& [5] DOUBLE-STRUCK CAPITAL P..DOUBLE-STRUCK CAPITAL R -211E..2123 ; Common # So [6] PRESCRIPTION TAKE..VERSICLE -2124 ; Common # L& DOUBLE-STRUCK CAPITAL Z -2125 ; Common # So OUNCE SIGN -2127 ; Common # So INVERTED OHM SIGN -2128 ; Common # L& BLACK-LETTER CAPITAL Z -2129 ; Common # So TURNED GREEK SMALL LETTER IOTA -212C..212D ; Common # L& [2] SCRIPT CAPITAL B..BLACK-LETTER CAPITAL C -212E ; Common # So ESTIMATED SYMBOL -212F..2131 ; Common # L& [3] SCRIPT SMALL E..SCRIPT CAPITAL F -2133..2134 ; Common # L& [2] SCRIPT CAPITAL M..SCRIPT SMALL O -2135..2138 ; Common # Lo [4] ALEF SYMBOL..DALET SYMBOL -2139 ; Common # L& INFORMATION SOURCE -213A..213B ; Common # So [2] ROTATED CAPITAL Q..FACSIMILE SIGN -213C..213F ; Common # L& [4] DOUBLE-STRUCK SMALL PI..DOUBLE-STRUCK CAPITAL PI -2140..2144 ; Common # Sm [5] DOUBLE-STRUCK N-ARY SUMMATION..TURNED SANS-SERIF CAPITAL Y -2145..2149 ; Common # L& [5] DOUBLE-STRUCK ITALIC CAPITAL D..DOUBLE-STRUCK ITALIC SMALL J -214A ; Common # So PROPERTY LINE -214B ; Common # Sm TURNED AMPERSAND -214C..214D ; Common # So [2] PER SIGN..AKTIESELSKAB -214F ; Common # So SYMBOL FOR SAMARITAN SOURCE -2153..215F ; Common # No [13] VULGAR FRACTION ONE THIRD..FRACTION NUMERATOR ONE -2190..2194 ; Common # Sm [5] LEFTWARDS ARROW..LEFT RIGHT ARROW -2195..2199 ; Common # So [5] UP DOWN ARROW..SOUTH WEST ARROW -219A..219B ; Common # Sm [2] LEFTWARDS ARROW WITH STROKE..RIGHTWARDS ARROW WITH STROKE -219C..219F ; Common # So [4] LEFTWARDS WAVE ARROW..UPWARDS TWO HEADED ARROW -21A0 ; Common # Sm RIGHTWARDS TWO HEADED ARROW -21A1..21A2 ; Common # So [2] DOWNWARDS TWO HEADED ARROW..LEFTWARDS ARROW WITH TAIL -21A3 ; Common # Sm RIGHTWARDS ARROW WITH TAIL -21A4..21A5 ; Common # So [2] LEFTWARDS ARROW FROM BAR..UPWARDS ARROW FROM BAR -21A6 ; Common # Sm RIGHTWARDS ARROW FROM BAR -21A7..21AD ; Common # So [7] DOWNWARDS ARROW FROM BAR..LEFT RIGHT WAVE ARROW -21AE ; Common # Sm LEFT RIGHT ARROW WITH STROKE -21AF..21CD ; Common # So [31] DOWNWARDS ZIGZAG ARROW..LEFTWARDS DOUBLE ARROW WITH STROKE -21CE..21CF ; Common # Sm [2] LEFT RIGHT DOUBLE ARROW WITH STROKE..RIGHTWARDS DOUBLE ARROW WITH STROKE -21D0..21D1 ; Common # So [2] LEFTWARDS DOUBLE ARROW..UPWARDS DOUBLE ARROW -21D2 ; Common # Sm RIGHTWARDS DOUBLE ARROW -21D3 ; Common # So DOWNWARDS DOUBLE ARROW -21D4 ; Common # Sm LEFT RIGHT DOUBLE ARROW -21D5..21F3 ; Common # So [31] UP DOWN DOUBLE ARROW..UP DOWN WHITE ARROW -21F4..22FF ; Common # Sm [268] RIGHT ARROW WITH SMALL CIRCLE..Z NOTATION BAG MEMBERSHIP -2300..2307 ; Common # So [8] DIAMETER SIGN..WAVY LINE -2308..230B ; Common # Sm [4] LEFT CEILING..RIGHT FLOOR -230C..231F ; Common # So [20] BOTTOM RIGHT CROP..BOTTOM RIGHT CORNER -2320..2321 ; Common # Sm [2] TOP HALF INTEGRAL..BOTTOM HALF INTEGRAL -2322..2328 ; Common # So [7] FROWN..KEYBOARD -2329 ; Common # Ps LEFT-POINTING ANGLE BRACKET -232A ; Common # Pe RIGHT-POINTING ANGLE BRACKET -232B..237B ; Common # So [81] ERASE TO THE LEFT..NOT CHECK MARK -237C ; Common # Sm RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW -237D..239A ; Common # So [30] SHOULDERED OPEN BOX..CLEAR SCREEN SYMBOL -239B..23B3 ; Common # Sm [25] LEFT PARENTHESIS UPPER HOOK..SUMMATION BOTTOM -23B4..23DB ; Common # So [40] TOP SQUARE BRACKET..FUSE -23DC..23E1 ; Common # Sm [6] TOP PARENTHESIS..BOTTOM TORTOISE SHELL BRACKET -23E2..23E7 ; Common # So [6] WHITE TRAPEZIUM..ELECTRICAL INTERSECTION -2400..2426 ; Common # So [39] SYMBOL FOR NULL..SYMBOL FOR SUBSTITUTE FORM TWO -2440..244A ; Common # So [11] OCR HOOK..OCR DOUBLE BACKSLASH -2460..249B ; Common # No [60] CIRCLED DIGIT ONE..NUMBER TWENTY FULL STOP -249C..24E9 ; Common # So [78] PARENTHESIZED LATIN SMALL LETTER A..CIRCLED LATIN SMALL LETTER Z -24EA..24FF ; Common # No [22] CIRCLED DIGIT ZERO..NEGATIVE CIRCLED DIGIT ZERO -2500..25B6 ; Common # So [183] BOX DRAWINGS LIGHT HORIZONTAL..BLACK RIGHT-POINTING TRIANGLE -25B7 ; Common # Sm WHITE RIGHT-POINTING TRIANGLE -25B8..25C0 ; Common # So [9] BLACK RIGHT-POINTING SMALL TRIANGLE..BLACK LEFT-POINTING TRIANGLE -25C1 ; Common # Sm WHITE LEFT-POINTING TRIANGLE -25C2..25F7 ; Common # So [54] BLACK LEFT-POINTING SMALL TRIANGLE..WHITE CIRCLE WITH UPPER RIGHT QUADRANT -25F8..25FF ; Common # Sm [8] UPPER LEFT TRIANGLE..LOWER RIGHT TRIANGLE -2600..266E ; Common # So [111] BLACK SUN WITH RAYS..MUSIC NATURAL SIGN -266F ; Common # Sm MUSIC SHARP SIGN -2670..269D ; Common # So [46] WEST SYRIAC CROSS..OUTLINED WHITE STAR -26A0..26BC ; Common # So [29] WARNING SIGN..SESQUIQUADRATE -26C0..26C3 ; Common # So [4] WHITE DRAUGHTS MAN..BLACK DRAUGHTS KING -2701..2704 ; Common # So [4] UPPER BLADE SCISSORS..WHITE SCISSORS -2706..2709 ; Common # So [4] TELEPHONE LOCATION SIGN..ENVELOPE -270C..2727 ; Common # So [28] VICTORY HAND..WHITE FOUR POINTED STAR -2729..274B ; Common # So [35] STRESS OUTLINED WHITE STAR..HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK -274D ; Common # So SHADOWED WHITE CIRCLE -274F..2752 ; Common # So [4] LOWER RIGHT DROP-SHADOWED WHITE SQUARE..UPPER RIGHT SHADOWED WHITE SQUARE -2756 ; Common # So BLACK DIAMOND MINUS WHITE X -2758..275E ; Common # So [7] LIGHT VERTICAL BAR..HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT -2761..2767 ; Common # So [7] CURVED STEM PARAGRAPH SIGN ORNAMENT..ROTATED FLORAL HEART BULLET -2768 ; Common # Ps MEDIUM LEFT PARENTHESIS ORNAMENT -2769 ; Common # Pe MEDIUM RIGHT PARENTHESIS ORNAMENT -276A ; Common # Ps MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT -276B ; Common # Pe MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT -276C ; Common # Ps MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT -276D ; Common # Pe MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT -276E ; Common # Ps HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT -276F ; Common # Pe HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT -2770 ; Common # Ps HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT -2771 ; Common # Pe HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT -2772 ; Common # Ps LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT -2773 ; Common # Pe LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT -2774 ; Common # Ps MEDIUM LEFT CURLY BRACKET ORNAMENT -2775 ; Common # Pe MEDIUM RIGHT CURLY BRACKET ORNAMENT -2776..2793 ; Common # No [30] DINGBAT NEGATIVE CIRCLED DIGIT ONE..DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN -2794 ; Common # So HEAVY WIDE-HEADED RIGHTWARDS ARROW -2798..27AF ; Common # So [24] HEAVY SOUTH EAST ARROW..NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW -27B1..27BE ; Common # So [14] NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW..OPEN-OUTLINED RIGHTWARDS ARROW -27C0..27C4 ; Common # Sm [5] THREE DIMENSIONAL ANGLE..OPEN SUPERSET -27C5 ; Common # Ps LEFT S-SHAPED BAG DELIMITER -27C6 ; Common # Pe RIGHT S-SHAPED BAG DELIMITER -27C7..27CA ; Common # Sm [4] OR WITH DOT INSIDE..VERTICAL BAR WITH HORIZONTAL STROKE -27CC ; Common # Sm LONG DIVISION -27D0..27E5 ; Common # Sm [22] WHITE DIAMOND WITH CENTRED DOT..WHITE SQUARE WITH RIGHTWARDS TICK -27E6 ; Common # Ps MATHEMATICAL LEFT WHITE SQUARE BRACKET -27E7 ; Common # Pe MATHEMATICAL RIGHT WHITE SQUARE BRACKET -27E8 ; Common # Ps MATHEMATICAL LEFT ANGLE BRACKET -27E9 ; Common # Pe MATHEMATICAL RIGHT ANGLE BRACKET -27EA ; Common # Ps MATHEMATICAL LEFT DOUBLE ANGLE BRACKET -27EB ; Common # Pe MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET -27EC ; Common # Ps MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET -27ED ; Common # Pe MATHEMATICAL RIGHT WHITE TORTOISE SHELL BRACKET -27EE ; Common # Ps MATHEMATICAL LEFT FLATTENED PARENTHESIS -27EF ; Common # Pe MATHEMATICAL RIGHT FLATTENED PARENTHESIS -27F0..27FF ; Common # Sm [16] UPWARDS QUADRUPLE ARROW..LONG RIGHTWARDS SQUIGGLE ARROW -2900..2982 ; Common # Sm [131] RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE..Z NOTATION TYPE COLON -2983 ; Common # Ps LEFT WHITE CURLY BRACKET -2984 ; Common # Pe RIGHT WHITE CURLY BRACKET -2985 ; Common # Ps LEFT WHITE PARENTHESIS -2986 ; Common # Pe RIGHT WHITE PARENTHESIS -2987 ; Common # Ps Z NOTATION LEFT IMAGE BRACKET -2988 ; Common # Pe Z NOTATION RIGHT IMAGE BRACKET -2989 ; Common # Ps Z NOTATION LEFT BINDING BRACKET -298A ; Common # Pe Z NOTATION RIGHT BINDING BRACKET -298B ; Common # Ps LEFT SQUARE BRACKET WITH UNDERBAR -298C ; Common # Pe RIGHT SQUARE BRACKET WITH UNDERBAR -298D ; Common # Ps LEFT SQUARE BRACKET WITH TICK IN TOP CORNER -298E ; Common # Pe RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER -298F ; Common # Ps LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER -2990 ; Common # Pe RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER -2991 ; Common # Ps LEFT ANGLE BRACKET WITH DOT -2992 ; Common # Pe RIGHT ANGLE BRACKET WITH DOT -2993 ; Common # Ps LEFT ARC LESS-THAN BRACKET -2994 ; Common # Pe RIGHT ARC GREATER-THAN BRACKET -2995 ; Common # Ps DOUBLE LEFT ARC GREATER-THAN BRACKET -2996 ; Common # Pe DOUBLE RIGHT ARC LESS-THAN BRACKET -2997 ; Common # Ps LEFT BLACK TORTOISE SHELL BRACKET -2998 ; Common # Pe RIGHT BLACK TORTOISE SHELL BRACKET -2999..29D7 ; Common # Sm [63] DOTTED FENCE..BLACK HOURGLASS -29D8 ; Common # Ps LEFT WIGGLY FENCE -29D9 ; Common # Pe RIGHT WIGGLY FENCE -29DA ; Common # Ps LEFT DOUBLE WIGGLY FENCE -29DB ; Common # Pe RIGHT DOUBLE WIGGLY FENCE -29DC..29FB ; Common # Sm [32] INCOMPLETE INFINITY..TRIPLE PLUS -29FC ; Common # Ps LEFT-POINTING CURVED ANGLE BRACKET -29FD ; Common # Pe RIGHT-POINTING CURVED ANGLE BRACKET -29FE..2AFF ; Common # Sm [258] TINY..N-ARY WHITE VERTICAL BAR -2B00..2B2F ; Common # So [48] NORTH EAST WHITE ARROW..WHITE VERTICAL ELLIPSE -2B30..2B44 ; Common # Sm [21] LEFT ARROW WITH SMALL CIRCLE..RIGHTWARDS ARROW THROUGH SUPERSET -2B45..2B46 ; Common # So [2] LEFTWARDS QUADRUPLE ARROW..RIGHTWARDS QUADRUPLE ARROW -2B47..2B4C ; Common # Sm [6] REVERSE TILDE OPERATOR ABOVE RIGHTWARDS ARROW..RIGHTWARDS ARROW ABOVE REVERSE TILDE OPERATOR -2B50..2B54 ; Common # So [5] WHITE MEDIUM STAR..WHITE RIGHT-POINTING PENTAGON -2E00..2E01 ; Common # Po [2] RIGHT ANGLE SUBSTITUTION MARKER..RIGHT ANGLE DOTTED SUBSTITUTION MARKER -2E02 ; Common # Pi LEFT SUBSTITUTION BRACKET -2E03 ; Common # Pf RIGHT SUBSTITUTION BRACKET -2E04 ; Common # Pi LEFT DOTTED SUBSTITUTION BRACKET -2E05 ; Common # Pf RIGHT DOTTED SUBSTITUTION BRACKET -2E06..2E08 ; Common # Po [3] RAISED INTERPOLATION MARKER..DOTTED TRANSPOSITION MARKER -2E09 ; Common # Pi LEFT TRANSPOSITION BRACKET -2E0A ; Common # Pf RIGHT TRANSPOSITION BRACKET -2E0B ; Common # Po RAISED SQUARE -2E0C ; Common # Pi LEFT RAISED OMISSION BRACKET -2E0D ; Common # Pf RIGHT RAISED OMISSION BRACKET -2E0E..2E16 ; Common # Po [9] EDITORIAL CORONIS..DOTTED RIGHT-POINTING ANGLE -2E17 ; Common # Pd DOUBLE OBLIQUE HYPHEN -2E18..2E19 ; Common # Po [2] INVERTED INTERROBANG..PALM BRANCH -2E1A ; Common # Pd HYPHEN WITH DIAERESIS -2E1B ; Common # Po TILDE WITH RING ABOVE -2E1C ; Common # Pi LEFT LOW PARAPHRASE BRACKET -2E1D ; Common # Pf RIGHT LOW PARAPHRASE BRACKET -2E1E..2E1F ; Common # Po [2] TILDE WITH DOT ABOVE..TILDE WITH DOT BELOW -2E20 ; Common # Pi LEFT VERTICAL BAR WITH QUILL -2E21 ; Common # Pf RIGHT VERTICAL BAR WITH QUILL -2E22 ; Common # Ps TOP LEFT HALF BRACKET -2E23 ; Common # Pe TOP RIGHT HALF BRACKET -2E24 ; Common # Ps BOTTOM LEFT HALF BRACKET -2E25 ; Common # Pe BOTTOM RIGHT HALF BRACKET -2E26 ; Common # Ps LEFT SIDEWAYS U BRACKET -2E27 ; Common # Pe RIGHT SIDEWAYS U BRACKET -2E28 ; Common # Ps LEFT DOUBLE PARENTHESIS -2E29 ; Common # Pe RIGHT DOUBLE PARENTHESIS -2E2A..2E2E ; Common # Po [5] TWO DOTS OVER ONE DOT PUNCTUATION..REVERSED QUESTION MARK -2E2F ; Common # Lm VERTICAL TILDE -2E30 ; Common # Po RING POINT -2FF0..2FFB ; Common # So [12] IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT..IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID -3000 ; Common # Zs IDEOGRAPHIC SPACE -3001..3003 ; Common # Po [3] IDEOGRAPHIC COMMA..DITTO MARK -3004 ; Common # So JAPANESE INDUSTRIAL STANDARD SYMBOL -3006 ; Common # Lo IDEOGRAPHIC CLOSING MARK -3008 ; Common # Ps LEFT ANGLE BRACKET -3009 ; Common # Pe RIGHT ANGLE BRACKET -300A ; Common # Ps LEFT DOUBLE ANGLE BRACKET -300B ; Common # Pe RIGHT DOUBLE ANGLE BRACKET -300C ; Common # Ps LEFT CORNER BRACKET -300D ; Common # Pe RIGHT CORNER BRACKET -300E ; Common # Ps LEFT WHITE CORNER BRACKET -300F ; Common # Pe RIGHT WHITE CORNER BRACKET -3010 ; Common # Ps LEFT BLACK LENTICULAR BRACKET -3011 ; Common # Pe RIGHT BLACK LENTICULAR BRACKET -3012..3013 ; Common # So [2] POSTAL MARK..GETA MARK -3014 ; Common # Ps LEFT TORTOISE SHELL BRACKET -3015 ; Common # Pe RIGHT TORTOISE SHELL BRACKET -3016 ; Common # Ps LEFT WHITE LENTICULAR BRACKET -3017 ; Common # Pe RIGHT WHITE LENTICULAR BRACKET -3018 ; Common # Ps LEFT WHITE TORTOISE SHELL BRACKET -3019 ; Common # Pe RIGHT WHITE TORTOISE SHELL BRACKET -301A ; Common # Ps LEFT WHITE SQUARE BRACKET -301B ; Common # Pe RIGHT WHITE SQUARE BRACKET -301C ; Common # Pd WAVE DASH -301D ; Common # Ps REVERSED DOUBLE PRIME QUOTATION MARK -301E..301F ; Common # Pe [2] DOUBLE PRIME QUOTATION MARK..LOW DOUBLE PRIME QUOTATION MARK -3020 ; Common # So POSTAL MARK FACE -3030 ; Common # Pd WAVY DASH -3031..3035 ; Common # Lm [5] VERTICAL KANA REPEAT MARK..VERTICAL KANA REPEAT MARK LOWER HALF -3036..3037 ; Common # So [2] CIRCLED POSTAL MARK..IDEOGRAPHIC TELEGRAPH LINE FEED SEPARATOR SYMBOL -303C ; Common # Lo MASU MARK -303D ; Common # Po PART ALTERNATION MARK -303E..303F ; Common # So [2] IDEOGRAPHIC VARIATION INDICATOR..IDEOGRAPHIC HALF FILL SPACE -309B..309C ; Common # Sk [2] KATAKANA-HIRAGANA VOICED SOUND MARK..KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK -30A0 ; Common # Pd KATAKANA-HIRAGANA DOUBLE HYPHEN -30FB ; Common # Po KATAKANA MIDDLE DOT -30FC ; Common # Lm KATAKANA-HIRAGANA PROLONGED SOUND MARK -3190..3191 ; Common # So [2] IDEOGRAPHIC ANNOTATION LINKING MARK..IDEOGRAPHIC ANNOTATION REVERSE MARK -3192..3195 ; Common # No [4] IDEOGRAPHIC ANNOTATION ONE MARK..IDEOGRAPHIC ANNOTATION FOUR MARK -3196..319F ; Common # So [10] IDEOGRAPHIC ANNOTATION TOP MARK..IDEOGRAPHIC ANNOTATION MAN MARK -31C0..31E3 ; Common # So [36] CJK STROKE T..CJK STROKE Q -3220..3229 ; Common # No [10] PARENTHESIZED IDEOGRAPH ONE..PARENTHESIZED IDEOGRAPH TEN -322A..3243 ; Common # So [26] PARENTHESIZED IDEOGRAPH MOON..PARENTHESIZED IDEOGRAPH REACH -3250 ; Common # So PARTNERSHIP SIGN -3251..325F ; Common # No [15] CIRCLED NUMBER TWENTY ONE..CIRCLED NUMBER THIRTY FIVE -327F ; Common # So KOREAN STANDARD SYMBOL -3280..3289 ; Common # No [10] CIRCLED IDEOGRAPH ONE..CIRCLED IDEOGRAPH TEN -328A..32B0 ; Common # So [39] CIRCLED IDEOGRAPH MOON..CIRCLED IDEOGRAPH NIGHT -32B1..32BF ; Common # No [15] CIRCLED NUMBER THIRTY SIX..CIRCLED NUMBER FIFTY -32C0..32CF ; Common # So [16] IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY..LIMITED LIABILITY SIGN -3358..33FF ; Common # So [168] IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ZERO..SQUARE GAL -4DC0..4DFF ; Common # So [64] HEXAGRAM FOR THE CREATIVE HEAVEN..HEXAGRAM FOR BEFORE COMPLETION -A700..A716 ; Common # Sk [23] MODIFIER LETTER CHINESE TONE YIN PING..MODIFIER LETTER EXTRA-LOW LEFT-STEM TONE BAR -A717..A71F ; Common # Lm [9] MODIFIER LETTER DOT VERTICAL BAR..MODIFIER LETTER LOW INVERTED EXCLAMATION MARK -A720..A721 ; Common # Sk [2] MODIFIER LETTER STRESS AND HIGH TONE..MODIFIER LETTER STRESS AND LOW TONE -A788 ; Common # Lm MODIFIER LETTER LOW CIRCUMFLEX ACCENT -A789..A78A ; Common # Sk [2] MODIFIER LETTER COLON..MODIFIER LETTER SHORT EQUALS SIGN -FD3E ; Common # Ps ORNATE LEFT PARENTHESIS -FD3F ; Common # Pe ORNATE RIGHT PARENTHESIS -FDFD ; Common # So ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM -FE10..FE16 ; Common # Po [7] PRESENTATION FORM FOR VERTICAL COMMA..PRESENTATION FORM FOR VERTICAL QUESTION MARK -FE17 ; Common # Ps PRESENTATION FORM FOR VERTICAL LEFT WHITE LENTICULAR BRACKET -FE18 ; Common # Pe PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRAKCET -FE19 ; Common # Po PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS -FE30 ; Common # Po PRESENTATION FORM FOR VERTICAL TWO DOT LEADER -FE31..FE32 ; Common # Pd [2] PRESENTATION FORM FOR VERTICAL EM DASH..PRESENTATION FORM FOR VERTICAL EN DASH -FE33..FE34 ; Common # Pc [2] PRESENTATION FORM FOR VERTICAL LOW LINE..PRESENTATION FORM FOR VERTICAL WAVY LOW LINE -FE35 ; Common # Ps PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS -FE36 ; Common # Pe PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS -FE37 ; Common # Ps PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET -FE38 ; Common # Pe PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET -FE39 ; Common # Ps PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET -FE3A ; Common # Pe PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET -FE3B ; Common # Ps PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET -FE3C ; Common # Pe PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET -FE3D ; Common # Ps PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET -FE3E ; Common # Pe PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET -FE3F ; Common # Ps PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET -FE40 ; Common # Pe PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET -FE41 ; Common # Ps PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET -FE42 ; Common # Pe PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET -FE43 ; Common # Ps PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET -FE44 ; Common # Pe PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET -FE45..FE46 ; Common # Po [2] SESAME DOT..WHITE SESAME DOT -FE47 ; Common # Ps PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET -FE48 ; Common # Pe PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET -FE49..FE4C ; Common # Po [4] DASHED OVERLINE..DOUBLE WAVY OVERLINE -FE4D..FE4F ; Common # Pc [3] DASHED LOW LINE..WAVY LOW LINE -FE50..FE52 ; Common # Po [3] SMALL COMMA..SMALL FULL STOP -FE54..FE57 ; Common # Po [4] SMALL SEMICOLON..SMALL EXCLAMATION MARK -FE58 ; Common # Pd SMALL EM DASH -FE59 ; Common # Ps SMALL LEFT PARENTHESIS -FE5A ; Common # Pe SMALL RIGHT PARENTHESIS -FE5B ; Common # Ps SMALL LEFT CURLY BRACKET -FE5C ; Common # Pe SMALL RIGHT CURLY BRACKET -FE5D ; Common # Ps SMALL LEFT TORTOISE SHELL BRACKET -FE5E ; Common # Pe SMALL RIGHT TORTOISE SHELL BRACKET -FE5F..FE61 ; Common # Po [3] SMALL NUMBER SIGN..SMALL ASTERISK -FE62 ; Common # Sm SMALL PLUS SIGN -FE63 ; Common # Pd SMALL HYPHEN-MINUS -FE64..FE66 ; Common # Sm [3] SMALL LESS-THAN SIGN..SMALL EQUALS SIGN -FE68 ; Common # Po SMALL REVERSE SOLIDUS -FE69 ; Common # Sc SMALL DOLLAR SIGN -FE6A..FE6B ; Common # Po [2] SMALL PERCENT SIGN..SMALL COMMERCIAL AT -FEFF ; Common # Cf ZERO WIDTH NO-BREAK SPACE -FF01..FF03 ; Common # Po [3] FULLWIDTH EXCLAMATION MARK..FULLWIDTH NUMBER SIGN -FF04 ; Common # Sc FULLWIDTH DOLLAR SIGN -FF05..FF07 ; Common # Po [3] FULLWIDTH PERCENT SIGN..FULLWIDTH APOSTROPHE -FF08 ; Common # Ps FULLWIDTH LEFT PARENTHESIS -FF09 ; Common # Pe FULLWIDTH RIGHT PARENTHESIS -FF0A ; Common # Po FULLWIDTH ASTERISK -FF0B ; Common # Sm FULLWIDTH PLUS SIGN -FF0C ; Common # Po FULLWIDTH COMMA -FF0D ; Common # Pd FULLWIDTH HYPHEN-MINUS -FF0E..FF0F ; Common # Po [2] FULLWIDTH FULL STOP..FULLWIDTH SOLIDUS -FF10..FF19 ; Common # Nd [10] FULLWIDTH DIGIT ZERO..FULLWIDTH DIGIT NINE -FF1A..FF1B ; Common # Po [2] FULLWIDTH COLON..FULLWIDTH SEMICOLON -FF1C..FF1E ; Common # Sm [3] FULLWIDTH LESS-THAN SIGN..FULLWIDTH GREATER-THAN SIGN -FF1F..FF20 ; Common # Po [2] FULLWIDTH QUESTION MARK..FULLWIDTH COMMERCIAL AT -FF3B ; Common # Ps FULLWIDTH LEFT SQUARE BRACKET -FF3C ; Common # Po FULLWIDTH REVERSE SOLIDUS -FF3D ; Common # Pe FULLWIDTH RIGHT SQUARE BRACKET -FF3E ; Common # Sk FULLWIDTH CIRCUMFLEX ACCENT -FF3F ; Common # Pc FULLWIDTH LOW LINE -FF40 ; Common # Sk FULLWIDTH GRAVE ACCENT -FF5B ; Common # Ps FULLWIDTH LEFT CURLY BRACKET -FF5C ; Common # Sm FULLWIDTH VERTICAL LINE -FF5D ; Common # Pe FULLWIDTH RIGHT CURLY BRACKET -FF5E ; Common # Sm FULLWIDTH TILDE -FF5F ; Common # Ps FULLWIDTH LEFT WHITE PARENTHESIS -FF60 ; Common # Pe FULLWIDTH RIGHT WHITE PARENTHESIS -FF61 ; Common # Po HALFWIDTH IDEOGRAPHIC FULL STOP -FF62 ; Common # Ps HALFWIDTH LEFT CORNER BRACKET -FF63 ; Common # Pe HALFWIDTH RIGHT CORNER BRACKET -FF64..FF65 ; Common # Po [2] HALFWIDTH IDEOGRAPHIC COMMA..HALFWIDTH KATAKANA MIDDLE DOT -FF70 ; Common # Lm HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK -FF9E..FF9F ; Common # Lm [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK -FFE0..FFE1 ; Common # Sc [2] FULLWIDTH CENT SIGN..FULLWIDTH POUND SIGN -FFE2 ; Common # Sm FULLWIDTH NOT SIGN -FFE3 ; Common # Sk FULLWIDTH MACRON -FFE4 ; Common # So FULLWIDTH BROKEN BAR -FFE5..FFE6 ; Common # Sc [2] FULLWIDTH YEN SIGN..FULLWIDTH WON SIGN -FFE8 ; Common # So HALFWIDTH FORMS LIGHT VERTICAL -FFE9..FFEC ; Common # Sm [4] HALFWIDTH LEFTWARDS ARROW..HALFWIDTH DOWNWARDS ARROW -FFED..FFEE ; Common # So [2] HALFWIDTH BLACK SQUARE..HALFWIDTH WHITE CIRCLE -FFF9..FFFB ; Common # Cf [3] INTERLINEAR ANNOTATION ANCHOR..INTERLINEAR ANNOTATION TERMINATOR -FFFC..FFFD ; Common # So [2] OBJECT REPLACEMENT CHARACTER..REPLACEMENT CHARACTER -10100..10101 ; Common # Po [2] AEGEAN WORD SEPARATOR LINE..AEGEAN WORD SEPARATOR DOT -10102 ; Common # So AEGEAN CHECK MARK -10107..10133 ; Common # No [45] AEGEAN NUMBER ONE..AEGEAN NUMBER NINETY THOUSAND -10137..1013F ; Common # So [9] AEGEAN WEIGHT BASE UNIT..AEGEAN MEASURE THIRD SUBUNIT -10190..1019B ; Common # So [12] ROMAN SEXTANS SIGN..ROMAN CENTURIAL SIGN -101D0..101FC ; Common # So [45] PHAISTOS DISC SIGN PEDESTRIAN..PHAISTOS DISC SIGN WAVY BAND -1D000..1D0F5 ; Common # So [246] BYZANTINE MUSICAL SYMBOL PSILI..BYZANTINE MUSICAL SYMBOL GORGON NEO KATO -1D100..1D126 ; Common # So [39] MUSICAL SYMBOL SINGLE BARLINE..MUSICAL SYMBOL DRUM CLEF-2 -1D129..1D164 ; Common # So [60] MUSICAL SYMBOL MULTIPLE MEASURE REST..MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE -1D165..1D166 ; Common # Mc [2] MUSICAL SYMBOL COMBINING STEM..MUSICAL SYMBOL COMBINING SPRECHGESANG STEM -1D16A..1D16C ; Common # So [3] MUSICAL SYMBOL FINGERED TREMOLO-1..MUSICAL SYMBOL FINGERED TREMOLO-3 -1D16D..1D172 ; Common # Mc [6] MUSICAL SYMBOL COMBINING AUGMENTATION DOT..MUSICAL SYMBOL COMBINING FLAG-5 -1D173..1D17A ; Common # Cf [8] MUSICAL SYMBOL BEGIN BEAM..MUSICAL SYMBOL END PHRASE -1D183..1D184 ; Common # So [2] MUSICAL SYMBOL ARPEGGIATO UP..MUSICAL SYMBOL ARPEGGIATO DOWN -1D18C..1D1A9 ; Common # So [30] MUSICAL SYMBOL RINFORZANDO..MUSICAL SYMBOL DEGREE SLASH -1D1AE..1D1DD ; Common # So [48] MUSICAL SYMBOL PEDAL MARK..MUSICAL SYMBOL PES SUBPUNCTIS -1D300..1D356 ; Common # So [87] MONOGRAM FOR EARTH..TETRAGRAM FOR FOSTERING -1D360..1D371 ; Common # No [18] COUNTING ROD UNIT DIGIT ONE..COUNTING ROD TENS DIGIT NINE -1D400..1D454 ; Common # L& [85] MATHEMATICAL BOLD CAPITAL A..MATHEMATICAL ITALIC SMALL G -1D456..1D49C ; Common # L& [71] MATHEMATICAL ITALIC SMALL I..MATHEMATICAL SCRIPT CAPITAL A -1D49E..1D49F ; Common # L& [2] MATHEMATICAL SCRIPT CAPITAL C..MATHEMATICAL SCRIPT CAPITAL D -1D4A2 ; Common # L& MATHEMATICAL SCRIPT CAPITAL G -1D4A5..1D4A6 ; Common # L& [2] MATHEMATICAL SCRIPT CAPITAL J..MATHEMATICAL SCRIPT CAPITAL K -1D4A9..1D4AC ; Common # L& [4] MATHEMATICAL SCRIPT CAPITAL N..MATHEMATICAL SCRIPT CAPITAL Q -1D4AE..1D4B9 ; Common # L& [12] MATHEMATICAL SCRIPT CAPITAL S..MATHEMATICAL SCRIPT SMALL D -1D4BB ; Common # L& MATHEMATICAL SCRIPT SMALL F -1D4BD..1D4C3 ; Common # L& [7] MATHEMATICAL SCRIPT SMALL H..MATHEMATICAL SCRIPT SMALL N -1D4C5..1D505 ; Common # L& [65] MATHEMATICAL SCRIPT SMALL P..MATHEMATICAL FRAKTUR CAPITAL B -1D507..1D50A ; Common # L& [4] MATHEMATICAL FRAKTUR CAPITAL D..MATHEMATICAL FRAKTUR CAPITAL G -1D50D..1D514 ; Common # L& [8] MATHEMATICAL FRAKTUR CAPITAL J..MATHEMATICAL FRAKTUR CAPITAL Q -1D516..1D51C ; Common # L& [7] MATHEMATICAL FRAKTUR CAPITAL S..MATHEMATICAL FRAKTUR CAPITAL Y -1D51E..1D539 ; Common # L& [28] MATHEMATICAL FRAKTUR SMALL A..MATHEMATICAL DOUBLE-STRUCK CAPITAL B -1D53B..1D53E ; Common # L& [4] MATHEMATICAL DOUBLE-STRUCK CAPITAL D..MATHEMATICAL DOUBLE-STRUCK CAPITAL G -1D540..1D544 ; Common # L& [5] MATHEMATICAL DOUBLE-STRUCK CAPITAL I..MATHEMATICAL DOUBLE-STRUCK CAPITAL M -1D546 ; Common # L& MATHEMATICAL DOUBLE-STRUCK CAPITAL O -1D54A..1D550 ; Common # L& [7] MATHEMATICAL DOUBLE-STRUCK CAPITAL S..MATHEMATICAL DOUBLE-STRUCK CAPITAL Y -1D552..1D6A5 ; Common # L& [340] MATHEMATICAL DOUBLE-STRUCK SMALL A..MATHEMATICAL ITALIC SMALL DOTLESS J -1D6A8..1D6C0 ; Common # L& [25] MATHEMATICAL BOLD CAPITAL ALPHA..MATHEMATICAL BOLD CAPITAL OMEGA -1D6C1 ; Common # Sm MATHEMATICAL BOLD NABLA -1D6C2..1D6DA ; Common # L& [25] MATHEMATICAL BOLD SMALL ALPHA..MATHEMATICAL BOLD SMALL OMEGA -1D6DB ; Common # Sm MATHEMATICAL BOLD PARTIAL DIFFERENTIAL -1D6DC..1D6FA ; Common # L& [31] MATHEMATICAL BOLD EPSILON SYMBOL..MATHEMATICAL ITALIC CAPITAL OMEGA -1D6FB ; Common # Sm MATHEMATICAL ITALIC NABLA -1D6FC..1D714 ; Common # L& [25] MATHEMATICAL ITALIC SMALL ALPHA..MATHEMATICAL ITALIC SMALL OMEGA -1D715 ; Common # Sm MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL -1D716..1D734 ; Common # L& [31] MATHEMATICAL ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD ITALIC CAPITAL OMEGA -1D735 ; Common # Sm MATHEMATICAL BOLD ITALIC NABLA -1D736..1D74E ; Common # L& [25] MATHEMATICAL BOLD ITALIC SMALL ALPHA..MATHEMATICAL BOLD ITALIC SMALL OMEGA -1D74F ; Common # Sm MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL -1D750..1D76E ; Common # L& [31] MATHEMATICAL BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA -1D76F ; Common # Sm MATHEMATICAL SANS-SERIF BOLD NABLA -1D770..1D788 ; Common # L& [25] MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA -1D789 ; Common # Sm MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL -1D78A..1D7A8 ; Common # L& [31] MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA -1D7A9 ; Common # Sm MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA -1D7AA..1D7C2 ; Common # L& [25] MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA -1D7C3 ; Common # Sm MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL -1D7C4..1D7CB ; Common # L& [8] MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD SMALL DIGAMMA -1D7CE..1D7FF ; Common # Nd [50] MATHEMATICAL BOLD DIGIT ZERO..MATHEMATICAL MONOSPACE DIGIT NINE -1F000..1F02B ; Common # So [44] MAHJONG TILE EAST WIND..MAHJONG TILE BACK -1F030..1F093 ; Common # So [100] DOMINO TILE HORIZONTAL BACK..DOMINO TILE VERTICAL-06-06 -E0001 ; Common # Cf LANGUAGE TAG -E0020..E007F ; Common # Cf [96] TAG SPACE..CANCEL TAG - -# Total code points: 5178 - -# ================================================ - -0041..005A ; Latin # L& [26] LATIN CAPITAL LETTER A..LATIN CAPITAL LETTER Z -0061..007A ; Latin # L& [26] LATIN SMALL LETTER A..LATIN SMALL LETTER Z -00AA ; Latin # L& FEMININE ORDINAL INDICATOR -00BA ; Latin # L& MASCULINE ORDINAL INDICATOR -00C0..00D6 ; Latin # L& [23] LATIN CAPITAL LETTER A WITH GRAVE..LATIN CAPITAL LETTER O WITH DIAERESIS -00D8..00F6 ; Latin # L& [31] LATIN CAPITAL LETTER O WITH STROKE..LATIN SMALL LETTER O WITH DIAERESIS -00F8..01BA ; Latin # L& [195] LATIN SMALL LETTER O WITH STROKE..LATIN SMALL LETTER EZH WITH TAIL -01BB ; Latin # Lo LATIN LETTER TWO WITH STROKE -01BC..01BF ; Latin # L& [4] LATIN CAPITAL LETTER TONE FIVE..LATIN LETTER WYNN -01C0..01C3 ; Latin # Lo [4] LATIN LETTER DENTAL CLICK..LATIN LETTER RETROFLEX CLICK -01C4..0293 ; Latin # L& [208] LATIN CAPITAL LETTER DZ WITH CARON..LATIN SMALL LETTER EZH WITH CURL -0294 ; Latin # Lo LATIN LETTER GLOTTAL STOP -0295..02AF ; Latin # L& [27] LATIN LETTER PHARYNGEAL VOICED FRICATIVE..LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL -02B0..02B8 ; Latin # Lm [9] MODIFIER LETTER SMALL H..MODIFIER LETTER SMALL Y -02E0..02E4 ; Latin # Lm [5] MODIFIER LETTER SMALL GAMMA..MODIFIER LETTER SMALL REVERSED GLOTTAL STOP -1D00..1D25 ; Latin # L& [38] LATIN LETTER SMALL CAPITAL A..LATIN LETTER AIN -1D2C..1D5C ; Latin # Lm [49] MODIFIER LETTER CAPITAL A..MODIFIER LETTER SMALL AIN -1D62..1D65 ; Latin # L& [4] LATIN SUBSCRIPT SMALL LETTER I..LATIN SUBSCRIPT SMALL LETTER V -1D6B..1D77 ; Latin # L& [13] LATIN SMALL LETTER UE..LATIN SMALL LETTER TURNED G -1D79..1D9A ; Latin # L& [34] LATIN SMALL LETTER INSULAR G..LATIN SMALL LETTER EZH WITH RETROFLEX HOOK -1D9B..1DBE ; Latin # Lm [36] MODIFIER LETTER SMALL TURNED ALPHA..MODIFIER LETTER SMALL EZH -1E00..1EFF ; Latin # L& [256] LATIN CAPITAL LETTER A WITH RING BELOW..LATIN SMALL LETTER Y WITH LOOP -2071 ; Latin # L& SUPERSCRIPT LATIN SMALL LETTER I -207F ; Latin # L& SUPERSCRIPT LATIN SMALL LETTER N -2090..2094 ; Latin # Lm [5] LATIN SUBSCRIPT SMALL LETTER A..LATIN SUBSCRIPT SMALL LETTER SCHWA -212A..212B ; Latin # L& [2] KELVIN SIGN..ANGSTROM SIGN -2132 ; Latin # L& TURNED CAPITAL F -214E ; Latin # L& TURNED SMALL F -2160..2182 ; Latin # Nl [35] ROMAN NUMERAL ONE..ROMAN NUMERAL TEN THOUSAND -2183..2184 ; Latin # L& [2] ROMAN NUMERAL REVERSED ONE HUNDRED..LATIN SMALL LETTER REVERSED C -2185..2188 ; Latin # Nl [4] ROMAN NUMERAL SIX LATE FORM..ROMAN NUMERAL ONE HUNDRED THOUSAND -2C60..2C6F ; Latin # L& [16] LATIN CAPITAL LETTER L WITH DOUBLE BAR..LATIN CAPITAL LETTER TURNED A -2C71..2C7C ; Latin # L& [12] LATIN SMALL LETTER V WITH RIGHT HOOK..LATIN SUBSCRIPT SMALL LETTER J -2C7D ; Latin # Lm MODIFIER LETTER CAPITAL V -A722..A76F ; Latin # L& [78] LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF..LATIN SMALL LETTER CON -A770 ; Latin # Lm MODIFIER LETTER US -A771..A787 ; Latin # L& [23] LATIN SMALL LETTER DUM..LATIN SMALL LETTER INSULAR T -A78B..A78C ; Latin # L& [2] LATIN CAPITAL LETTER SALTILLO..LATIN SMALL LETTER SALTILLO -A7FB..A7FF ; Latin # Lo [5] LATIN EPIGRAPHIC LETTER REVERSED F..LATIN EPIGRAPHIC LETTER ARCHAIC M -FB00..FB06 ; Latin # L& [7] LATIN SMALL LIGATURE FF..LATIN SMALL LIGATURE ST -FF21..FF3A ; Latin # L& [26] FULLWIDTH LATIN CAPITAL LETTER A..FULLWIDTH LATIN CAPITAL LETTER Z -FF41..FF5A ; Latin # L& [26] FULLWIDTH LATIN SMALL LETTER A..FULLWIDTH LATIN SMALL LETTER Z - -# Total code points: 1241 - -# ================================================ - -0370..0373 ; Greek # L& [4] GREEK CAPITAL LETTER HETA..GREEK SMALL LETTER ARCHAIC SAMPI -0375 ; Greek # Sk GREEK LOWER NUMERAL SIGN -0376..0377 ; Greek # L& [2] GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA..GREEK SMALL LETTER PAMPHYLIAN DIGAMMA -037A ; Greek # Lm GREEK YPOGEGRAMMENI -037B..037D ; Greek # L& [3] GREEK SMALL REVERSED LUNATE SIGMA SYMBOL..GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL -0384 ; Greek # Sk GREEK TONOS -0386 ; Greek # L& GREEK CAPITAL LETTER ALPHA WITH TONOS -0388..038A ; Greek # L& [3] GREEK CAPITAL LETTER EPSILON WITH TONOS..GREEK CAPITAL LETTER IOTA WITH TONOS -038C ; Greek # L& GREEK CAPITAL LETTER OMICRON WITH TONOS -038E..03A1 ; Greek # L& [20] GREEK CAPITAL LETTER UPSILON WITH TONOS..GREEK CAPITAL LETTER RHO -03A3..03E1 ; Greek # L& [63] GREEK CAPITAL LETTER SIGMA..GREEK SMALL LETTER SAMPI -03F0..03F5 ; Greek # L& [6] GREEK KAPPA SYMBOL..GREEK LUNATE EPSILON SYMBOL -03F6 ; Greek # Sm GREEK REVERSED LUNATE EPSILON SYMBOL -03F7..03FF ; Greek # L& [9] GREEK CAPITAL LETTER SHO..GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL -1D26..1D2A ; Greek # L& [5] GREEK LETTER SMALL CAPITAL GAMMA..GREEK LETTER SMALL CAPITAL PSI -1D5D..1D61 ; Greek # Lm [5] MODIFIER LETTER SMALL BETA..MODIFIER LETTER SMALL CHI -1D66..1D6A ; Greek # L& [5] GREEK SUBSCRIPT SMALL LETTER BETA..GREEK SUBSCRIPT SMALL LETTER CHI -1DBF ; Greek # Lm MODIFIER LETTER SMALL THETA -1F00..1F15 ; Greek # L& [22] GREEK SMALL LETTER ALPHA WITH PSILI..GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA -1F18..1F1D ; Greek # L& [6] GREEK CAPITAL LETTER EPSILON WITH PSILI..GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA -1F20..1F45 ; Greek # L& [38] GREEK SMALL LETTER ETA WITH PSILI..GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA -1F48..1F4D ; Greek # L& [6] GREEK CAPITAL LETTER OMICRON WITH PSILI..GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA -1F50..1F57 ; Greek # L& [8] GREEK SMALL LETTER UPSILON WITH PSILI..GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI -1F59 ; Greek # L& GREEK CAPITAL LETTER UPSILON WITH DASIA -1F5B ; Greek # L& GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA -1F5D ; Greek # L& GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA -1F5F..1F7D ; Greek # L& [31] GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI..GREEK SMALL LETTER OMEGA WITH OXIA -1F80..1FB4 ; Greek # L& [53] GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI..GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI -1FB6..1FBC ; Greek # L& [7] GREEK SMALL LETTER ALPHA WITH PERISPOMENI..GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI -1FBD ; Greek # Sk GREEK KORONIS -1FBE ; Greek # L& GREEK PROSGEGRAMMENI -1FBF..1FC1 ; Greek # Sk [3] GREEK PSILI..GREEK DIALYTIKA AND PERISPOMENI -1FC2..1FC4 ; Greek # L& [3] GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI -1FC6..1FCC ; Greek # L& [7] GREEK SMALL LETTER ETA WITH PERISPOMENI..GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI -1FCD..1FCF ; Greek # Sk [3] GREEK PSILI AND VARIA..GREEK PSILI AND PERISPOMENI -1FD0..1FD3 ; Greek # L& [4] GREEK SMALL LETTER IOTA WITH VRACHY..GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA -1FD6..1FDB ; Greek # L& [6] GREEK SMALL LETTER IOTA WITH PERISPOMENI..GREEK CAPITAL LETTER IOTA WITH OXIA -1FDD..1FDF ; Greek # Sk [3] GREEK DASIA AND VARIA..GREEK DASIA AND PERISPOMENI -1FE0..1FEC ; Greek # L& [13] GREEK SMALL LETTER UPSILON WITH VRACHY..GREEK CAPITAL LETTER RHO WITH DASIA -1FED..1FEF ; Greek # Sk [3] GREEK DIALYTIKA AND VARIA..GREEK VARIA -1FF2..1FF4 ; Greek # L& [3] GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI -1FF6..1FFC ; Greek # L& [7] GREEK SMALL LETTER OMEGA WITH PERISPOMENI..GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI -1FFD..1FFE ; Greek # Sk [2] GREEK OXIA..GREEK DASIA -2126 ; Greek # L& OHM SIGN -10140..10174 ; Greek # Nl [53] GREEK ACROPHONIC ATTIC ONE QUARTER..GREEK ACROPHONIC STRATIAN FIFTY MNAS -10175..10178 ; Greek # No [4] GREEK ONE HALF SIGN..GREEK THREE QUARTERS SIGN -10179..10189 ; Greek # So [17] GREEK YEAR SIGN..GREEK TRYBLION BASE SIGN -1018A ; Greek # No GREEK ZERO SIGN -1D200..1D241 ; Greek # So [66] GREEK VOCAL NOTATION SYMBOL-1..GREEK INSTRUMENTAL NOTATION SYMBOL-54 -1D242..1D244 ; Greek # Mn [3] COMBINING GREEK MUSICAL TRISEME..COMBINING GREEK MUSICAL PENTASEME -1D245 ; Greek # So GREEK MUSICAL LEIMMA - -# Total code points: 511 - -# ================================================ - -0400..0481 ; Cyrillic # L& [130] CYRILLIC CAPITAL LETTER IE WITH GRAVE..CYRILLIC SMALL LETTER KOPPA -0482 ; Cyrillic # So CYRILLIC THOUSANDS SIGN -0483..0487 ; Cyrillic # Mn [5] COMBINING CYRILLIC TITLO..COMBINING CYRILLIC POKRYTIE -0488..0489 ; Cyrillic # Me [2] COMBINING CYRILLIC HUNDRED THOUSANDS SIGN..COMBINING CYRILLIC MILLIONS SIGN -048A..0523 ; Cyrillic # L& [154] CYRILLIC CAPITAL LETTER SHORT I WITH TAIL..CYRILLIC SMALL LETTER EN WITH MIDDLE HOOK -1D2B ; Cyrillic # L& CYRILLIC LETTER SMALL CAPITAL EL -1D78 ; Cyrillic # Lm MODIFIER LETTER CYRILLIC EN -2DE0..2DFF ; Cyrillic # Mn [32] COMBINING CYRILLIC LETTER BE..COMBINING CYRILLIC LETTER IOTIFIED BIG YUS -A640..A65F ; Cyrillic # L& [32] CYRILLIC CAPITAL LETTER ZEMLYA..CYRILLIC SMALL LETTER YN -A662..A66D ; Cyrillic # L& [12] CYRILLIC CAPITAL LETTER SOFT DE..CYRILLIC SMALL LETTER DOUBLE MONOCULAR O -A66E ; Cyrillic # Lo CYRILLIC LETTER MULTIOCULAR O -A66F ; Cyrillic # Mn COMBINING CYRILLIC VZMET -A670..A672 ; Cyrillic # Me [3] COMBINING CYRILLIC TEN MILLIONS SIGN..COMBINING CYRILLIC THOUSAND MILLIONS SIGN -A673 ; Cyrillic # Po SLAVONIC ASTERISK -A67C..A67D ; Cyrillic # Mn [2] COMBINING CYRILLIC KAVYKA..COMBINING CYRILLIC PAYEROK -A67E ; Cyrillic # Po CYRILLIC KAVYKA -A67F ; Cyrillic # Lm CYRILLIC PAYEROK -A680..A697 ; Cyrillic # L& [24] CYRILLIC CAPITAL LETTER DWE..CYRILLIC SMALL LETTER SHWE - -# Total code points: 404 - -# ================================================ - -0531..0556 ; Armenian # L& [38] ARMENIAN CAPITAL LETTER AYB..ARMENIAN CAPITAL LETTER FEH -0559 ; Armenian # Lm ARMENIAN MODIFIER LETTER LEFT HALF RING -055A..055F ; Armenian # Po [6] ARMENIAN APOSTROPHE..ARMENIAN ABBREVIATION MARK -0561..0587 ; Armenian # L& [39] ARMENIAN SMALL LETTER AYB..ARMENIAN SMALL LIGATURE ECH YIWN -058A ; Armenian # Pd ARMENIAN HYPHEN -FB13..FB17 ; Armenian # L& [5] ARMENIAN SMALL LIGATURE MEN NOW..ARMENIAN SMALL LIGATURE MEN XEH - -# Total code points: 90 - -# ================================================ - -0591..05BD ; Hebrew # Mn [45] HEBREW ACCENT ETNAHTA..HEBREW POINT METEG -05BE ; Hebrew # Pd HEBREW PUNCTUATION MAQAF -05BF ; Hebrew # Mn HEBREW POINT RAFE -05C0 ; Hebrew # Po HEBREW PUNCTUATION PASEQ -05C1..05C2 ; Hebrew # Mn [2] HEBREW POINT SHIN DOT..HEBREW POINT SIN DOT -05C3 ; Hebrew # Po HEBREW PUNCTUATION SOF PASUQ -05C4..05C5 ; Hebrew # Mn [2] HEBREW MARK UPPER DOT..HEBREW MARK LOWER DOT -05C6 ; Hebrew # Po HEBREW PUNCTUATION NUN HAFUKHA -05C7 ; Hebrew # Mn HEBREW POINT QAMATS QATAN -05D0..05EA ; Hebrew # Lo [27] HEBREW LETTER ALEF..HEBREW LETTER TAV -05F0..05F2 ; Hebrew # Lo [3] HEBREW LIGATURE YIDDISH DOUBLE VAV..HEBREW LIGATURE YIDDISH DOUBLE YOD -05F3..05F4 ; Hebrew # Po [2] HEBREW PUNCTUATION GERESH..HEBREW PUNCTUATION GERSHAYIM -FB1D ; Hebrew # Lo HEBREW LETTER YOD WITH HIRIQ -FB1E ; Hebrew # Mn HEBREW POINT JUDEO-SPANISH VARIKA -FB1F..FB28 ; Hebrew # Lo [10] HEBREW LIGATURE YIDDISH YOD YOD PATAH..HEBREW LETTER WIDE TAV -FB29 ; Hebrew # Sm HEBREW LETTER ALTERNATIVE PLUS SIGN -FB2A..FB36 ; Hebrew # Lo [13] HEBREW LETTER SHIN WITH SHIN DOT..HEBREW LETTER ZAYIN WITH DAGESH -FB38..FB3C ; Hebrew # Lo [5] HEBREW LETTER TET WITH DAGESH..HEBREW LETTER LAMED WITH DAGESH -FB3E ; Hebrew # Lo HEBREW LETTER MEM WITH DAGESH -FB40..FB41 ; Hebrew # Lo [2] HEBREW LETTER NUN WITH DAGESH..HEBREW LETTER SAMEKH WITH DAGESH -FB43..FB44 ; Hebrew # Lo [2] HEBREW LETTER FINAL PE WITH DAGESH..HEBREW LETTER PE WITH DAGESH -FB46..FB4F ; Hebrew # Lo [10] HEBREW LETTER TSADI WITH DAGESH..HEBREW LIGATURE ALEF LAMED - -# Total code points: 133 - -# ================================================ - -0606..0608 ; Arabic # Sm [3] ARABIC-INDIC CUBE ROOT..ARABIC RAY -0609..060A ; Arabic # Po [2] ARABIC-INDIC PER MILLE SIGN..ARABIC-INDIC PER TEN THOUSAND SIGN -060B ; Arabic # Sc AFGHANI SIGN -060D ; Arabic # Po ARABIC DATE SEPARATOR -060E..060F ; Arabic # So [2] ARABIC POETIC VERSE SIGN..ARABIC SIGN MISRA -0610..061A ; Arabic # Mn [11] ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM..ARABIC SMALL KASRA -061E ; Arabic # Po ARABIC TRIPLE DOT PUNCTUATION MARK -0621..063F ; Arabic # Lo [31] ARABIC LETTER HAMZA..ARABIC LETTER FARSI YEH WITH THREE DOTS ABOVE -0641..064A ; Arabic # Lo [10] ARABIC LETTER FEH..ARABIC LETTER YEH -0656..065E ; Arabic # Mn [9] ARABIC SUBSCRIPT ALEF..ARABIC FATHA WITH TWO DOTS -066A..066D ; Arabic # Po [4] ARABIC PERCENT SIGN..ARABIC FIVE POINTED STAR -066E..066F ; Arabic # Lo [2] ARABIC LETTER DOTLESS BEH..ARABIC LETTER DOTLESS QAF -0671..06D3 ; Arabic # Lo [99] ARABIC LETTER ALEF WASLA..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE -06D4 ; Arabic # Po ARABIC FULL STOP -06D5 ; Arabic # Lo ARABIC LETTER AE -06D6..06DC ; Arabic # Mn [7] ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA..ARABIC SMALL HIGH SEEN -06DE ; Arabic # Me ARABIC START OF RUB EL HIZB -06DF..06E4 ; Arabic # Mn [6] ARABIC SMALL HIGH ROUNDED ZERO..ARABIC SMALL HIGH MADDA -06E5..06E6 ; Arabic # Lm [2] ARABIC SMALL WAW..ARABIC SMALL YEH -06E7..06E8 ; Arabic # Mn [2] ARABIC SMALL HIGH YEH..ARABIC SMALL HIGH NOON -06E9 ; Arabic # So ARABIC PLACE OF SAJDAH -06EA..06ED ; Arabic # Mn [4] ARABIC EMPTY CENTRE LOW STOP..ARABIC SMALL LOW MEEM -06EE..06EF ; Arabic # Lo [2] ARABIC LETTER DAL WITH INVERTED V..ARABIC LETTER REH WITH INVERTED V -06F0..06F9 ; Arabic # Nd [10] EXTENDED ARABIC-INDIC DIGIT ZERO..EXTENDED ARABIC-INDIC DIGIT NINE -06FA..06FC ; Arabic # Lo [3] ARABIC LETTER SHEEN WITH DOT BELOW..ARABIC LETTER GHAIN WITH DOT BELOW -06FD..06FE ; Arabic # So [2] ARABIC SIGN SINDHI AMPERSAND..ARABIC SIGN SINDHI POSTPOSITION MEN -06FF ; Arabic # Lo ARABIC LETTER HEH WITH INVERTED V -0750..077F ; Arabic # Lo [48] ARABIC LETTER BEH WITH THREE DOTS HORIZONTALLY BELOW..ARABIC LETTER KAF WITH TWO DOTS ABOVE -FB50..FBB1 ; Arabic # Lo [98] ARABIC LETTER ALEF WASLA ISOLATED FORM..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM -FBD3..FD3D ; Arabic # Lo [363] ARABIC LETTER NG ISOLATED FORM..ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM -FD50..FD8F ; Arabic # Lo [64] ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM..ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM -FD92..FDC7 ; Arabic # Lo [54] ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM..ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM -FDF0..FDFB ; Arabic # Lo [12] ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM..ARABIC LIGATURE JALLAJALALOUHOU -FDFC ; Arabic # Sc RIAL SIGN -FE70..FE74 ; Arabic # Lo [5] ARABIC FATHATAN ISOLATED FORM..ARABIC KASRATAN ISOLATED FORM -FE76..FEFC ; Arabic # Lo [135] ARABIC FATHA ISOLATED FORM..ARABIC LIGATURE LAM WITH ALEF FINAL FORM - -# Total code points: 999 - -# ================================================ - -0700..070D ; Syriac # Po [14] SYRIAC END OF PARAGRAPH..SYRIAC HARKLEAN ASTERISCUS -070F ; Syriac # Cf SYRIAC ABBREVIATION MARK -0710 ; Syriac # Lo SYRIAC LETTER ALAPH -0711 ; Syriac # Mn SYRIAC LETTER SUPERSCRIPT ALAPH -0712..072F ; Syriac # Lo [30] SYRIAC LETTER BETH..SYRIAC LETTER PERSIAN DHALATH -0730..074A ; Syriac # Mn [27] SYRIAC PTHAHA ABOVE..SYRIAC BARREKH -074D..074F ; Syriac # Lo [3] SYRIAC LETTER SOGDIAN ZHAIN..SYRIAC LETTER SOGDIAN FE - -# Total code points: 77 - -# ================================================ - -0780..07A5 ; Thaana # Lo [38] THAANA LETTER HAA..THAANA LETTER WAAVU -07A6..07B0 ; Thaana # Mn [11] THAANA ABAFILI..THAANA SUKUN -07B1 ; Thaana # Lo THAANA LETTER NAA - -# Total code points: 50 - -# ================================================ - -0901..0902 ; Devanagari # Mn [2] DEVANAGARI SIGN CANDRABINDU..DEVANAGARI SIGN ANUSVARA -0903 ; Devanagari # Mc DEVANAGARI SIGN VISARGA -0904..0939 ; Devanagari # Lo [54] DEVANAGARI LETTER SHORT A..DEVANAGARI LETTER HA -093C ; Devanagari # Mn DEVANAGARI SIGN NUKTA -093D ; Devanagari # Lo DEVANAGARI SIGN AVAGRAHA -093E..0940 ; Devanagari # Mc [3] DEVANAGARI VOWEL SIGN AA..DEVANAGARI VOWEL SIGN II -0941..0948 ; Devanagari # Mn [8] DEVANAGARI VOWEL SIGN U..DEVANAGARI VOWEL SIGN AI -0949..094C ; Devanagari # Mc [4] DEVANAGARI VOWEL SIGN CANDRA O..DEVANAGARI VOWEL SIGN AU -094D ; Devanagari # Mn DEVANAGARI SIGN VIRAMA -0950 ; Devanagari # Lo DEVANAGARI OM -0953..0954 ; Devanagari # Mn [2] DEVANAGARI GRAVE ACCENT..DEVANAGARI ACUTE ACCENT -0958..0961 ; Devanagari # Lo [10] DEVANAGARI LETTER QA..DEVANAGARI LETTER VOCALIC LL -0962..0963 ; Devanagari # Mn [2] DEVANAGARI VOWEL SIGN VOCALIC L..DEVANAGARI VOWEL SIGN VOCALIC LL -0966..096F ; Devanagari # Nd [10] DEVANAGARI DIGIT ZERO..DEVANAGARI DIGIT NINE -0971 ; Devanagari # Lm DEVANAGARI SIGN HIGH SPACING DOT -0972 ; Devanagari # Lo DEVANAGARI LETTER CANDRA A -097B..097F ; Devanagari # Lo [5] DEVANAGARI LETTER GGA..DEVANAGARI LETTER BBA - -# Total code points: 107 - -# ================================================ - -0981 ; Bengali # Mn BENGALI SIGN CANDRABINDU -0982..0983 ; Bengali # Mc [2] BENGALI SIGN ANUSVARA..BENGALI SIGN VISARGA -0985..098C ; Bengali # Lo [8] BENGALI LETTER A..BENGALI LETTER VOCALIC L -098F..0990 ; Bengali # Lo [2] BENGALI LETTER E..BENGALI LETTER AI -0993..09A8 ; Bengali # Lo [22] BENGALI LETTER O..BENGALI LETTER NA -09AA..09B0 ; Bengali # Lo [7] BENGALI LETTER PA..BENGALI LETTER RA -09B2 ; Bengali # Lo BENGALI LETTER LA -09B6..09B9 ; Bengali # Lo [4] BENGALI LETTER SHA..BENGALI LETTER HA -09BC ; Bengali # Mn BENGALI SIGN NUKTA -09BD ; Bengali # Lo BENGALI SIGN AVAGRAHA -09BE..09C0 ; Bengali # Mc [3] BENGALI VOWEL SIGN AA..BENGALI VOWEL SIGN II -09C1..09C4 ; Bengali # Mn [4] BENGALI VOWEL SIGN U..BENGALI VOWEL SIGN VOCALIC RR -09C7..09C8 ; Bengali # Mc [2] BENGALI VOWEL SIGN E..BENGALI VOWEL SIGN AI -09CB..09CC ; Bengali # Mc [2] BENGALI VOWEL SIGN O..BENGALI VOWEL SIGN AU -09CD ; Bengali # Mn BENGALI SIGN VIRAMA -09CE ; Bengali # Lo BENGALI LETTER KHANDA TA -09D7 ; Bengali # Mc BENGALI AU LENGTH MARK -09DC..09DD ; Bengali # Lo [2] BENGALI LETTER RRA..BENGALI LETTER RHA -09DF..09E1 ; Bengali # Lo [3] BENGALI LETTER YYA..BENGALI LETTER VOCALIC LL -09E2..09E3 ; Bengali # Mn [2] BENGALI VOWEL SIGN VOCALIC L..BENGALI VOWEL SIGN VOCALIC LL -09E6..09EF ; Bengali # Nd [10] BENGALI DIGIT ZERO..BENGALI DIGIT NINE -09F0..09F1 ; Bengali # Lo [2] BENGALI LETTER RA WITH MIDDLE DIAGONAL..BENGALI LETTER RA WITH LOWER DIAGONAL -09F2..09F3 ; Bengali # Sc [2] BENGALI RUPEE MARK..BENGALI RUPEE SIGN -09F4..09F9 ; Bengali # No [6] BENGALI CURRENCY NUMERATOR ONE..BENGALI CURRENCY DENOMINATOR SIXTEEN -09FA ; Bengali # So BENGALI ISSHAR - -# Total code points: 91 - -# ================================================ - -0A01..0A02 ; Gurmukhi # Mn [2] GURMUKHI SIGN ADAK BINDI..GURMUKHI SIGN BINDI -0A03 ; Gurmukhi # Mc GURMUKHI SIGN VISARGA -0A05..0A0A ; Gurmukhi # Lo [6] GURMUKHI LETTER A..GURMUKHI LETTER UU -0A0F..0A10 ; Gurmukhi # Lo [2] GURMUKHI LETTER EE..GURMUKHI LETTER AI -0A13..0A28 ; Gurmukhi # Lo [22] GURMUKHI LETTER OO..GURMUKHI LETTER NA -0A2A..0A30 ; Gurmukhi # Lo [7] GURMUKHI LETTER PA..GURMUKHI LETTER RA -0A32..0A33 ; Gurmukhi # Lo [2] GURMUKHI LETTER LA..GURMUKHI LETTER LLA -0A35..0A36 ; Gurmukhi # Lo [2] GURMUKHI LETTER VA..GURMUKHI LETTER SHA -0A38..0A39 ; Gurmukhi # Lo [2] GURMUKHI LETTER SA..GURMUKHI LETTER HA -0A3C ; Gurmukhi # Mn GURMUKHI SIGN NUKTA -0A3E..0A40 ; Gurmukhi # Mc [3] GURMUKHI VOWEL SIGN AA..GURMUKHI VOWEL SIGN II -0A41..0A42 ; Gurmukhi # Mn [2] GURMUKHI VOWEL SIGN U..GURMUKHI VOWEL SIGN UU -0A47..0A48 ; Gurmukhi # Mn [2] GURMUKHI VOWEL SIGN EE..GURMUKHI VOWEL SIGN AI -0A4B..0A4D ; Gurmukhi # Mn [3] GURMUKHI VOWEL SIGN OO..GURMUKHI SIGN VIRAMA -0A51 ; Gurmukhi # Mn GURMUKHI SIGN UDAAT -0A59..0A5C ; Gurmukhi # Lo [4] GURMUKHI LETTER KHHA..GURMUKHI LETTER RRA -0A5E ; Gurmukhi # Lo GURMUKHI LETTER FA -0A66..0A6F ; Gurmukhi # Nd [10] GURMUKHI DIGIT ZERO..GURMUKHI DIGIT NINE -0A70..0A71 ; Gurmukhi # Mn [2] GURMUKHI TIPPI..GURMUKHI ADDAK -0A72..0A74 ; Gurmukhi # Lo [3] GURMUKHI IRI..GURMUKHI EK ONKAR -0A75 ; Gurmukhi # Mn GURMUKHI SIGN YAKASH - -# Total code points: 79 - -# ================================================ - -0A81..0A82 ; Gujarati # Mn [2] GUJARATI SIGN CANDRABINDU..GUJARATI SIGN ANUSVARA -0A83 ; Gujarati # Mc GUJARATI SIGN VISARGA -0A85..0A8D ; Gujarati # Lo [9] GUJARATI LETTER A..GUJARATI VOWEL CANDRA E -0A8F..0A91 ; Gujarati # Lo [3] GUJARATI LETTER E..GUJARATI VOWEL CANDRA O -0A93..0AA8 ; Gujarati # Lo [22] GUJARATI LETTER O..GUJARATI LETTER NA -0AAA..0AB0 ; Gujarati # Lo [7] GUJARATI LETTER PA..GUJARATI LETTER RA -0AB2..0AB3 ; Gujarati # Lo [2] GUJARATI LETTER LA..GUJARATI LETTER LLA -0AB5..0AB9 ; Gujarati # Lo [5] GUJARATI LETTER VA..GUJARATI LETTER HA -0ABC ; Gujarati # Mn GUJARATI SIGN NUKTA -0ABD ; Gujarati # Lo GUJARATI SIGN AVAGRAHA -0ABE..0AC0 ; Gujarati # Mc [3] GUJARATI VOWEL SIGN AA..GUJARATI VOWEL SIGN II -0AC1..0AC5 ; Gujarati # Mn [5] GUJARATI VOWEL SIGN U..GUJARATI VOWEL SIGN CANDRA E -0AC7..0AC8 ; Gujarati # Mn [2] GUJARATI VOWEL SIGN E..GUJARATI VOWEL SIGN AI -0AC9 ; Gujarati # Mc GUJARATI VOWEL SIGN CANDRA O -0ACB..0ACC ; Gujarati # Mc [2] GUJARATI VOWEL SIGN O..GUJARATI VOWEL SIGN AU -0ACD ; Gujarati # Mn GUJARATI SIGN VIRAMA -0AD0 ; Gujarati # Lo GUJARATI OM -0AE0..0AE1 ; Gujarati # Lo [2] GUJARATI LETTER VOCALIC RR..GUJARATI LETTER VOCALIC LL -0AE2..0AE3 ; Gujarati # Mn [2] GUJARATI VOWEL SIGN VOCALIC L..GUJARATI VOWEL SIGN VOCALIC LL -0AE6..0AEF ; Gujarati # Nd [10] GUJARATI DIGIT ZERO..GUJARATI DIGIT NINE -0AF1 ; Gujarati # Sc GUJARATI RUPEE SIGN - -# Total code points: 83 - -# ================================================ - -0B01 ; Oriya # Mn ORIYA SIGN CANDRABINDU -0B02..0B03 ; Oriya # Mc [2] ORIYA SIGN ANUSVARA..ORIYA SIGN VISARGA -0B05..0B0C ; Oriya # Lo [8] ORIYA LETTER A..ORIYA LETTER VOCALIC L -0B0F..0B10 ; Oriya # Lo [2] ORIYA LETTER E..ORIYA LETTER AI -0B13..0B28 ; Oriya # Lo [22] ORIYA LETTER O..ORIYA LETTER NA -0B2A..0B30 ; Oriya # Lo [7] ORIYA LETTER PA..ORIYA LETTER RA -0B32..0B33 ; Oriya # Lo [2] ORIYA LETTER LA..ORIYA LETTER LLA -0B35..0B39 ; Oriya # Lo [5] ORIYA LETTER VA..ORIYA LETTER HA -0B3C ; Oriya # Mn ORIYA SIGN NUKTA -0B3D ; Oriya # Lo ORIYA SIGN AVAGRAHA -0B3E ; Oriya # Mc ORIYA VOWEL SIGN AA -0B3F ; Oriya # Mn ORIYA VOWEL SIGN I -0B40 ; Oriya # Mc ORIYA VOWEL SIGN II -0B41..0B44 ; Oriya # Mn [4] ORIYA VOWEL SIGN U..ORIYA VOWEL SIGN VOCALIC RR -0B47..0B48 ; Oriya # Mc [2] ORIYA VOWEL SIGN E..ORIYA VOWEL SIGN AI -0B4B..0B4C ; Oriya # Mc [2] ORIYA VOWEL SIGN O..ORIYA VOWEL SIGN AU -0B4D ; Oriya # Mn ORIYA SIGN VIRAMA -0B56 ; Oriya # Mn ORIYA AI LENGTH MARK -0B57 ; Oriya # Mc ORIYA AU LENGTH MARK -0B5C..0B5D ; Oriya # Lo [2] ORIYA LETTER RRA..ORIYA LETTER RHA -0B5F..0B61 ; Oriya # Lo [3] ORIYA LETTER YYA..ORIYA LETTER VOCALIC LL -0B62..0B63 ; Oriya # Mn [2] ORIYA VOWEL SIGN VOCALIC L..ORIYA VOWEL SIGN VOCALIC LL -0B66..0B6F ; Oriya # Nd [10] ORIYA DIGIT ZERO..ORIYA DIGIT NINE -0B70 ; Oriya # So ORIYA ISSHAR -0B71 ; Oriya # Lo ORIYA LETTER WA - -# Total code points: 84 - -# ================================================ - -0B82 ; Tamil # Mn TAMIL SIGN ANUSVARA -0B83 ; Tamil # Lo TAMIL SIGN VISARGA -0B85..0B8A ; Tamil # Lo [6] TAMIL LETTER A..TAMIL LETTER UU -0B8E..0B90 ; Tamil # Lo [3] TAMIL LETTER E..TAMIL LETTER AI -0B92..0B95 ; Tamil # Lo [4] TAMIL LETTER O..TAMIL LETTER KA -0B99..0B9A ; Tamil # Lo [2] TAMIL LETTER NGA..TAMIL LETTER CA -0B9C ; Tamil # Lo TAMIL LETTER JA -0B9E..0B9F ; Tamil # Lo [2] TAMIL LETTER NYA..TAMIL LETTER TTA -0BA3..0BA4 ; Tamil # Lo [2] TAMIL LETTER NNA..TAMIL LETTER TA -0BA8..0BAA ; Tamil # Lo [3] TAMIL LETTER NA..TAMIL LETTER PA -0BAE..0BB9 ; Tamil # Lo [12] TAMIL LETTER MA..TAMIL LETTER HA -0BBE..0BBF ; Tamil # Mc [2] TAMIL VOWEL SIGN AA..TAMIL VOWEL SIGN I -0BC0 ; Tamil # Mn TAMIL VOWEL SIGN II -0BC1..0BC2 ; Tamil # Mc [2] TAMIL VOWEL SIGN U..TAMIL VOWEL SIGN UU -0BC6..0BC8 ; Tamil # Mc [3] TAMIL VOWEL SIGN E..TAMIL VOWEL SIGN AI -0BCA..0BCC ; Tamil # Mc [3] TAMIL VOWEL SIGN O..TAMIL VOWEL SIGN AU -0BCD ; Tamil # Mn TAMIL SIGN VIRAMA -0BD0 ; Tamil # Lo TAMIL OM -0BD7 ; Tamil # Mc TAMIL AU LENGTH MARK -0BE6..0BEF ; Tamil # Nd [10] TAMIL DIGIT ZERO..TAMIL DIGIT NINE -0BF0..0BF2 ; Tamil # No [3] TAMIL NUMBER TEN..TAMIL NUMBER ONE THOUSAND -0BF3..0BF8 ; Tamil # So [6] TAMIL DAY SIGN..TAMIL AS ABOVE SIGN -0BF9 ; Tamil # Sc TAMIL RUPEE SIGN -0BFA ; Tamil # So TAMIL NUMBER SIGN - -# Total code points: 72 - -# ================================================ - -0C01..0C03 ; Telugu # Mc [3] TELUGU SIGN CANDRABINDU..TELUGU SIGN VISARGA -0C05..0C0C ; Telugu # Lo [8] TELUGU LETTER A..TELUGU LETTER VOCALIC L -0C0E..0C10 ; Telugu # Lo [3] TELUGU LETTER E..TELUGU LETTER AI -0C12..0C28 ; Telugu # Lo [23] TELUGU LETTER O..TELUGU LETTER NA -0C2A..0C33 ; Telugu # Lo [10] TELUGU LETTER PA..TELUGU LETTER LLA -0C35..0C39 ; Telugu # Lo [5] TELUGU LETTER VA..TELUGU LETTER HA -0C3D ; Telugu # Lo TELUGU SIGN AVAGRAHA -0C3E..0C40 ; Telugu # Mn [3] TELUGU VOWEL SIGN AA..TELUGU VOWEL SIGN II -0C41..0C44 ; Telugu # Mc [4] TELUGU VOWEL SIGN U..TELUGU VOWEL SIGN VOCALIC RR -0C46..0C48 ; Telugu # Mn [3] TELUGU VOWEL SIGN E..TELUGU VOWEL SIGN AI -0C4A..0C4D ; Telugu # Mn [4] TELUGU VOWEL SIGN O..TELUGU SIGN VIRAMA -0C55..0C56 ; Telugu # Mn [2] TELUGU LENGTH MARK..TELUGU AI LENGTH MARK -0C58..0C59 ; Telugu # Lo [2] TELUGU LETTER TSA..TELUGU LETTER DZA -0C60..0C61 ; Telugu # Lo [2] TELUGU LETTER VOCALIC RR..TELUGU LETTER VOCALIC LL -0C62..0C63 ; Telugu # Mn [2] TELUGU VOWEL SIGN VOCALIC L..TELUGU VOWEL SIGN VOCALIC LL -0C66..0C6F ; Telugu # Nd [10] TELUGU DIGIT ZERO..TELUGU DIGIT NINE -0C78..0C7E ; Telugu # No [7] TELUGU FRACTION DIGIT ZERO FOR ODD POWERS OF FOUR..TELUGU FRACTION DIGIT THREE FOR EVEN POWERS OF FOUR -0C7F ; Telugu # So TELUGU SIGN TUUMU - -# Total code points: 93 - -# ================================================ - -0C82..0C83 ; Kannada # Mc [2] KANNADA SIGN ANUSVARA..KANNADA SIGN VISARGA -0C85..0C8C ; Kannada # Lo [8] KANNADA LETTER A..KANNADA LETTER VOCALIC L -0C8E..0C90 ; Kannada # Lo [3] KANNADA LETTER E..KANNADA LETTER AI -0C92..0CA8 ; Kannada # Lo [23] KANNADA LETTER O..KANNADA LETTER NA -0CAA..0CB3 ; Kannada # Lo [10] KANNADA LETTER PA..KANNADA LETTER LLA -0CB5..0CB9 ; Kannada # Lo [5] KANNADA LETTER VA..KANNADA LETTER HA -0CBC ; Kannada # Mn KANNADA SIGN NUKTA -0CBD ; Kannada # Lo KANNADA SIGN AVAGRAHA -0CBE ; Kannada # Mc KANNADA VOWEL SIGN AA -0CBF ; Kannada # Mn KANNADA VOWEL SIGN I -0CC0..0CC4 ; Kannada # Mc [5] KANNADA VOWEL SIGN II..KANNADA VOWEL SIGN VOCALIC RR -0CC6 ; Kannada # Mn KANNADA VOWEL SIGN E -0CC7..0CC8 ; Kannada # Mc [2] KANNADA VOWEL SIGN EE..KANNADA VOWEL SIGN AI -0CCA..0CCB ; Kannada # Mc [2] KANNADA VOWEL SIGN O..KANNADA VOWEL SIGN OO -0CCC..0CCD ; Kannada # Mn [2] KANNADA VOWEL SIGN AU..KANNADA SIGN VIRAMA -0CD5..0CD6 ; Kannada # Mc [2] KANNADA LENGTH MARK..KANNADA AI LENGTH MARK -0CDE ; Kannada # Lo KANNADA LETTER FA -0CE0..0CE1 ; Kannada # Lo [2] KANNADA LETTER VOCALIC RR..KANNADA LETTER VOCALIC LL -0CE2..0CE3 ; Kannada # Mn [2] KANNADA VOWEL SIGN VOCALIC L..KANNADA VOWEL SIGN VOCALIC LL -0CE6..0CEF ; Kannada # Nd [10] KANNADA DIGIT ZERO..KANNADA DIGIT NINE - -# Total code points: 84 - -# ================================================ - -0D02..0D03 ; Malayalam # Mc [2] MALAYALAM SIGN ANUSVARA..MALAYALAM SIGN VISARGA -0D05..0D0C ; Malayalam # Lo [8] MALAYALAM LETTER A..MALAYALAM LETTER VOCALIC L -0D0E..0D10 ; Malayalam # Lo [3] MALAYALAM LETTER E..MALAYALAM LETTER AI -0D12..0D28 ; Malayalam # Lo [23] MALAYALAM LETTER O..MALAYALAM LETTER NA -0D2A..0D39 ; Malayalam # Lo [16] MALAYALAM LETTER PA..MALAYALAM LETTER HA -0D3D ; Malayalam # Lo MALAYALAM SIGN AVAGRAHA -0D3E..0D40 ; Malayalam # Mc [3] MALAYALAM VOWEL SIGN AA..MALAYALAM VOWEL SIGN II -0D41..0D44 ; Malayalam # Mn [4] MALAYALAM VOWEL SIGN U..MALAYALAM VOWEL SIGN VOCALIC RR -0D46..0D48 ; Malayalam # Mc [3] MALAYALAM VOWEL SIGN E..MALAYALAM VOWEL SIGN AI -0D4A..0D4C ; Malayalam # Mc [3] MALAYALAM VOWEL SIGN O..MALAYALAM VOWEL SIGN AU -0D4D ; Malayalam # Mn MALAYALAM SIGN VIRAMA -0D57 ; Malayalam # Mc MALAYALAM AU LENGTH MARK -0D60..0D61 ; Malayalam # Lo [2] MALAYALAM LETTER VOCALIC RR..MALAYALAM LETTER VOCALIC LL -0D62..0D63 ; Malayalam # Mn [2] MALAYALAM VOWEL SIGN VOCALIC L..MALAYALAM VOWEL SIGN VOCALIC LL -0D66..0D6F ; Malayalam # Nd [10] MALAYALAM DIGIT ZERO..MALAYALAM DIGIT NINE -0D70..0D75 ; Malayalam # No [6] MALAYALAM NUMBER TEN..MALAYALAM FRACTION THREE QUARTERS -0D79 ; Malayalam # So MALAYALAM DATE MARK -0D7A..0D7F ; Malayalam # Lo [6] MALAYALAM LETTER CHILLU NN..MALAYALAM LETTER CHILLU K - -# Total code points: 95 - -# ================================================ - -0D82..0D83 ; Sinhala # Mc [2] SINHALA SIGN ANUSVARAYA..SINHALA SIGN VISARGAYA -0D85..0D96 ; Sinhala # Lo [18] SINHALA LETTER AYANNA..SINHALA LETTER AUYANNA -0D9A..0DB1 ; Sinhala # Lo [24] SINHALA LETTER ALPAPRAANA KAYANNA..SINHALA LETTER DANTAJA NAYANNA -0DB3..0DBB ; Sinhala # Lo [9] SINHALA LETTER SANYAKA DAYANNA..SINHALA LETTER RAYANNA -0DBD ; Sinhala # Lo SINHALA LETTER DANTAJA LAYANNA -0DC0..0DC6 ; Sinhala # Lo [7] SINHALA LETTER VAYANNA..SINHALA LETTER FAYANNA -0DCA ; Sinhala # Mn SINHALA SIGN AL-LAKUNA -0DCF..0DD1 ; Sinhala # Mc [3] SINHALA VOWEL SIGN AELA-PILLA..SINHALA VOWEL SIGN DIGA AEDA-PILLA -0DD2..0DD4 ; Sinhala # Mn [3] SINHALA VOWEL SIGN KETTI IS-PILLA..SINHALA VOWEL SIGN KETTI PAA-PILLA -0DD6 ; Sinhala # Mn SINHALA VOWEL SIGN DIGA PAA-PILLA -0DD8..0DDF ; Sinhala # Mc [8] SINHALA VOWEL SIGN GAETTA-PILLA..SINHALA VOWEL SIGN GAYANUKITTA -0DF2..0DF3 ; Sinhala # Mc [2] SINHALA VOWEL SIGN DIGA GAETTA-PILLA..SINHALA VOWEL SIGN DIGA GAYANUKITTA -0DF4 ; Sinhala # Po SINHALA PUNCTUATION KUNDDALIYA - -# Total code points: 80 - -# ================================================ - -0E01..0E30 ; Thai # Lo [48] THAI CHARACTER KO KAI..THAI CHARACTER SARA A -0E31 ; Thai # Mn THAI CHARACTER MAI HAN-AKAT -0E32..0E33 ; Thai # Lo [2] THAI CHARACTER SARA AA..THAI CHARACTER SARA AM -0E34..0E3A ; Thai # Mn [7] THAI CHARACTER SARA I..THAI CHARACTER PHINTHU -0E40..0E45 ; Thai # Lo [6] THAI CHARACTER SARA E..THAI CHARACTER LAKKHANGYAO -0E46 ; Thai # Lm THAI CHARACTER MAIYAMOK -0E47..0E4E ; Thai # Mn [8] THAI CHARACTER MAITAIKHU..THAI CHARACTER YAMAKKAN -0E4F ; Thai # Po THAI CHARACTER FONGMAN -0E50..0E59 ; Thai # Nd [10] THAI DIGIT ZERO..THAI DIGIT NINE -0E5A..0E5B ; Thai # Po [2] THAI CHARACTER ANGKHANKHU..THAI CHARACTER KHOMUT - -# Total code points: 86 - -# ================================================ - -0E81..0E82 ; Lao # Lo [2] LAO LETTER KO..LAO LETTER KHO SUNG -0E84 ; Lao # Lo LAO LETTER KHO TAM -0E87..0E88 ; Lao # Lo [2] LAO LETTER NGO..LAO LETTER CO -0E8A ; Lao # Lo LAO LETTER SO TAM -0E8D ; Lao # Lo LAO LETTER NYO -0E94..0E97 ; Lao # Lo [4] LAO LETTER DO..LAO LETTER THO TAM -0E99..0E9F ; Lao # Lo [7] LAO LETTER NO..LAO LETTER FO SUNG -0EA1..0EA3 ; Lao # Lo [3] LAO LETTER MO..LAO LETTER LO LING -0EA5 ; Lao # Lo LAO LETTER LO LOOT -0EA7 ; Lao # Lo LAO LETTER WO -0EAA..0EAB ; Lao # Lo [2] LAO LETTER SO SUNG..LAO LETTER HO SUNG -0EAD..0EB0 ; Lao # Lo [4] LAO LETTER O..LAO VOWEL SIGN A -0EB1 ; Lao # Mn LAO VOWEL SIGN MAI KAN -0EB2..0EB3 ; Lao # Lo [2] LAO VOWEL SIGN AA..LAO VOWEL SIGN AM -0EB4..0EB9 ; Lao # Mn [6] LAO VOWEL SIGN I..LAO VOWEL SIGN UU -0EBB..0EBC ; Lao # Mn [2] LAO VOWEL SIGN MAI KON..LAO SEMIVOWEL SIGN LO -0EBD ; Lao # Lo LAO SEMIVOWEL SIGN NYO -0EC0..0EC4 ; Lao # Lo [5] LAO VOWEL SIGN E..LAO VOWEL SIGN AI -0EC6 ; Lao # Lm LAO KO LA -0EC8..0ECD ; Lao # Mn [6] LAO TONE MAI EK..LAO NIGGAHITA -0ED0..0ED9 ; Lao # Nd [10] LAO DIGIT ZERO..LAO DIGIT NINE -0EDC..0EDD ; Lao # Lo [2] LAO HO NO..LAO HO MO - -# Total code points: 65 - -# ================================================ - -0F00 ; Tibetan # Lo TIBETAN SYLLABLE OM -0F01..0F03 ; Tibetan # So [3] TIBETAN MARK GTER YIG MGO TRUNCATED A..TIBETAN MARK GTER YIG MGO -UM GTER TSHEG MA -0F04..0F12 ; Tibetan # Po [15] TIBETAN MARK INITIAL YIG MGO MDUN MA..TIBETAN MARK RGYA GRAM SHAD -0F13..0F17 ; Tibetan # So [5] TIBETAN MARK CARET -DZUD RTAGS ME LONG CAN..TIBETAN ASTROLOGICAL SIGN SGRA GCAN -CHAR RTAGS -0F18..0F19 ; Tibetan # Mn [2] TIBETAN ASTROLOGICAL SIGN -KHYUD PA..TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS -0F1A..0F1F ; Tibetan # So [6] TIBETAN SIGN RDEL DKAR GCIG..TIBETAN SIGN RDEL DKAR RDEL NAG -0F20..0F29 ; Tibetan # Nd [10] TIBETAN DIGIT ZERO..TIBETAN DIGIT NINE -0F2A..0F33 ; Tibetan # No [10] TIBETAN DIGIT HALF ONE..TIBETAN DIGIT HALF ZERO -0F34 ; Tibetan # So TIBETAN MARK BSDUS RTAGS -0F35 ; Tibetan # Mn TIBETAN MARK NGAS BZUNG NYI ZLA -0F36 ; Tibetan # So TIBETAN MARK CARET -DZUD RTAGS BZHI MIG CAN -0F37 ; Tibetan # Mn TIBETAN MARK NGAS BZUNG SGOR RTAGS -0F38 ; Tibetan # So TIBETAN MARK CHE MGO -0F39 ; Tibetan # Mn TIBETAN MARK TSA -PHRU -0F3A ; Tibetan # Ps TIBETAN MARK GUG RTAGS GYON -0F3B ; Tibetan # Pe TIBETAN MARK GUG RTAGS GYAS -0F3C ; Tibetan # Ps TIBETAN MARK ANG KHANG GYON -0F3D ; Tibetan # Pe TIBETAN MARK ANG KHANG GYAS -0F3E..0F3F ; Tibetan # Mc [2] TIBETAN SIGN YAR TSHES..TIBETAN SIGN MAR TSHES -0F40..0F47 ; Tibetan # Lo [8] TIBETAN LETTER KA..TIBETAN LETTER JA -0F49..0F6C ; Tibetan # Lo [36] TIBETAN LETTER NYA..TIBETAN LETTER RRA -0F71..0F7E ; Tibetan # Mn [14] TIBETAN VOWEL SIGN AA..TIBETAN SIGN RJES SU NGA RO -0F7F ; Tibetan # Mc TIBETAN SIGN RNAM BCAD -0F80..0F84 ; Tibetan # Mn [5] TIBETAN VOWEL SIGN REVERSED I..TIBETAN MARK HALANTA -0F85 ; Tibetan # Po TIBETAN MARK PALUTA -0F86..0F87 ; Tibetan # Mn [2] TIBETAN SIGN LCI RTAGS..TIBETAN SIGN YANG RTAGS -0F88..0F8B ; Tibetan # Lo [4] TIBETAN SIGN LCE TSA CAN..TIBETAN SIGN GRU MED RGYINGS -0F90..0F97 ; Tibetan # Mn [8] TIBETAN SUBJOINED LETTER KA..TIBETAN SUBJOINED LETTER JA -0F99..0FBC ; Tibetan # Mn [36] TIBETAN SUBJOINED LETTER NYA..TIBETAN SUBJOINED LETTER FIXED-FORM RA -0FBE..0FC5 ; Tibetan # So [8] TIBETAN KU RU KHA..TIBETAN SYMBOL RDO RJE -0FC6 ; Tibetan # Mn TIBETAN SYMBOL PADMA GDAN -0FC7..0FCC ; Tibetan # So [6] TIBETAN SYMBOL RDO RJE RGYA GRAM..TIBETAN SYMBOL NOR BU BZHI -KHYIL -0FCE..0FCF ; Tibetan # So [2] TIBETAN SIGN RDEL NAG RDEL DKAR..TIBETAN SIGN RDEL NAG GSUM -0FD0..0FD4 ; Tibetan # Po [5] TIBETAN MARK BSKA- SHOG GI MGO RGYAN..TIBETAN MARK CLOSING BRDA RNYING YIG MGO SGAB MA - -# Total code points: 201 - -# ================================================ - -1000..102A ; Myanmar # Lo [43] MYANMAR LETTER KA..MYANMAR LETTER AU -102B..102C ; Myanmar # Mc [2] MYANMAR VOWEL SIGN TALL AA..MYANMAR VOWEL SIGN AA -102D..1030 ; Myanmar # Mn [4] MYANMAR VOWEL SIGN I..MYANMAR VOWEL SIGN UU -1031 ; Myanmar # Mc MYANMAR VOWEL SIGN E -1032..1037 ; Myanmar # Mn [6] MYANMAR VOWEL SIGN AI..MYANMAR SIGN DOT BELOW -1038 ; Myanmar # Mc MYANMAR SIGN VISARGA -1039..103A ; Myanmar # Mn [2] MYANMAR SIGN VIRAMA..MYANMAR SIGN ASAT -103B..103C ; Myanmar # Mc [2] MYANMAR CONSONANT SIGN MEDIAL YA..MYANMAR CONSONANT SIGN MEDIAL RA -103D..103E ; Myanmar # Mn [2] MYANMAR CONSONANT SIGN MEDIAL WA..MYANMAR CONSONANT SIGN MEDIAL HA -103F ; Myanmar # Lo MYANMAR LETTER GREAT SA -1040..1049 ; Myanmar # Nd [10] MYANMAR DIGIT ZERO..MYANMAR DIGIT NINE -104A..104F ; Myanmar # Po [6] MYANMAR SIGN LITTLE SECTION..MYANMAR SYMBOL GENITIVE -1050..1055 ; Myanmar # Lo [6] MYANMAR LETTER SHA..MYANMAR LETTER VOCALIC LL -1056..1057 ; Myanmar # Mc [2] MYANMAR VOWEL SIGN VOCALIC R..MYANMAR VOWEL SIGN VOCALIC RR -1058..1059 ; Myanmar # Mn [2] MYANMAR VOWEL SIGN VOCALIC L..MYANMAR VOWEL SIGN VOCALIC LL -105A..105D ; Myanmar # Lo [4] MYANMAR LETTER MON NGA..MYANMAR LETTER MON BBE -105E..1060 ; Myanmar # Mn [3] MYANMAR CONSONANT SIGN MON MEDIAL NA..MYANMAR CONSONANT SIGN MON MEDIAL LA -1061 ; Myanmar # Lo MYANMAR LETTER SGAW KAREN SHA -1062..1064 ; Myanmar # Mc [3] MYANMAR VOWEL SIGN SGAW KAREN EU..MYANMAR TONE MARK SGAW KAREN KE PHO -1065..1066 ; Myanmar # Lo [2] MYANMAR LETTER WESTERN PWO KAREN THA..MYANMAR LETTER WESTERN PWO KAREN PWA -1067..106D ; Myanmar # Mc [7] MYANMAR VOWEL SIGN WESTERN PWO KAREN EU..MYANMAR SIGN WESTERN PWO KAREN TONE-5 -106E..1070 ; Myanmar # Lo [3] MYANMAR LETTER EASTERN PWO KAREN NNA..MYANMAR LETTER EASTERN PWO KAREN GHWA -1071..1074 ; Myanmar # Mn [4] MYANMAR VOWEL SIGN GEBA KAREN I..MYANMAR VOWEL SIGN KAYAH EE -1075..1081 ; Myanmar # Lo [13] MYANMAR LETTER SHAN KA..MYANMAR LETTER SHAN HA -1082 ; Myanmar # Mn MYANMAR CONSONANT SIGN SHAN MEDIAL WA -1083..1084 ; Myanmar # Mc [2] MYANMAR VOWEL SIGN SHAN AA..MYANMAR VOWEL SIGN SHAN E -1085..1086 ; Myanmar # Mn [2] MYANMAR VOWEL SIGN SHAN E ABOVE..MYANMAR VOWEL SIGN SHAN FINAL Y -1087..108C ; Myanmar # Mc [6] MYANMAR SIGN SHAN TONE-2..MYANMAR SIGN SHAN COUNCIL TONE-3 -108D ; Myanmar # Mn MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE -108E ; Myanmar # Lo MYANMAR LETTER RUMAI PALAUNG FA -108F ; Myanmar # Mc MYANMAR SIGN RUMAI PALAUNG TONE-5 -1090..1099 ; Myanmar # Nd [10] MYANMAR SHAN DIGIT ZERO..MYANMAR SHAN DIGIT NINE -109E..109F ; Myanmar # So [2] MYANMAR SYMBOL SHAN ONE..MYANMAR SYMBOL SHAN EXCLAMATION - -# Total code points: 156 - -# ================================================ - -10A0..10C5 ; Georgian # L& [38] GEORGIAN CAPITAL LETTER AN..GEORGIAN CAPITAL LETTER HOE -10D0..10FA ; Georgian # Lo [43] GEORGIAN LETTER AN..GEORGIAN LETTER AIN -10FC ; Georgian # Lm MODIFIER LETTER GEORGIAN NAR -2D00..2D25 ; Georgian # L& [38] GEORGIAN SMALL LETTER AN..GEORGIAN SMALL LETTER HOE - -# Total code points: 120 - -# ================================================ - -1100..1159 ; Hangul # Lo [90] HANGUL CHOSEONG KIYEOK..HANGUL CHOSEONG YEORINHIEUH -115F..11A2 ; Hangul # Lo [68] HANGUL CHOSEONG FILLER..HANGUL JUNGSEONG SSANGARAEA -11A8..11F9 ; Hangul # Lo [82] HANGUL JONGSEONG KIYEOK..HANGUL JONGSEONG YEORINHIEUH -3131..318E ; Hangul # Lo [94] HANGUL LETTER KIYEOK..HANGUL LETTER ARAEAE -3200..321E ; Hangul # So [31] PARENTHESIZED HANGUL KIYEOK..PARENTHESIZED KOREAN CHARACTER O HU -3260..327E ; Hangul # So [31] CIRCLED HANGUL KIYEOK..CIRCLED HANGUL IEUNG U -AC00..D7A3 ; Hangul # Lo [11172] HANGUL SYLLABLE GA..HANGUL SYLLABLE HIH -FFA0..FFBE ; Hangul # Lo [31] HALFWIDTH HANGUL FILLER..HALFWIDTH HANGUL LETTER HIEUH -FFC2..FFC7 ; Hangul # Lo [6] HALFWIDTH HANGUL LETTER A..HALFWIDTH HANGUL LETTER E -FFCA..FFCF ; Hangul # Lo [6] HALFWIDTH HANGUL LETTER YEO..HALFWIDTH HANGUL LETTER OE -FFD2..FFD7 ; Hangul # Lo [6] HALFWIDTH HANGUL LETTER YO..HALFWIDTH HANGUL LETTER YU -FFDA..FFDC ; Hangul # Lo [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL LETTER I - -# Total code points: 11620 - -# ================================================ - -1200..1248 ; Ethiopic # Lo [73] ETHIOPIC SYLLABLE HA..ETHIOPIC SYLLABLE QWA -124A..124D ; Ethiopic # Lo [4] ETHIOPIC SYLLABLE QWI..ETHIOPIC SYLLABLE QWE -1250..1256 ; Ethiopic # Lo [7] ETHIOPIC SYLLABLE QHA..ETHIOPIC SYLLABLE QHO -1258 ; Ethiopic # Lo ETHIOPIC SYLLABLE QHWA -125A..125D ; Ethiopic # Lo [4] ETHIOPIC SYLLABLE QHWI..ETHIOPIC SYLLABLE QHWE -1260..1288 ; Ethiopic # Lo [41] ETHIOPIC SYLLABLE BA..ETHIOPIC SYLLABLE XWA -128A..128D ; Ethiopic # Lo [4] ETHIOPIC SYLLABLE XWI..ETHIOPIC SYLLABLE XWE -1290..12B0 ; Ethiopic # Lo [33] ETHIOPIC SYLLABLE NA..ETHIOPIC SYLLABLE KWA -12B2..12B5 ; Ethiopic # Lo [4] ETHIOPIC SYLLABLE KWI..ETHIOPIC SYLLABLE KWE -12B8..12BE ; Ethiopic # Lo [7] ETHIOPIC SYLLABLE KXA..ETHIOPIC SYLLABLE KXO -12C0 ; Ethiopic # Lo ETHIOPIC SYLLABLE KXWA -12C2..12C5 ; Ethiopic # Lo [4] ETHIOPIC SYLLABLE KXWI..ETHIOPIC SYLLABLE KXWE -12C8..12D6 ; Ethiopic # Lo [15] ETHIOPIC SYLLABLE WA..ETHIOPIC SYLLABLE PHARYNGEAL O -12D8..1310 ; Ethiopic # Lo [57] ETHIOPIC SYLLABLE ZA..ETHIOPIC SYLLABLE GWA -1312..1315 ; Ethiopic # Lo [4] ETHIOPIC SYLLABLE GWI..ETHIOPIC SYLLABLE GWE -1318..135A ; Ethiopic # Lo [67] ETHIOPIC SYLLABLE GGA..ETHIOPIC SYLLABLE FYA -135F ; Ethiopic # Mn ETHIOPIC COMBINING GEMINATION MARK -1360 ; Ethiopic # So ETHIOPIC SECTION MARK -1361..1368 ; Ethiopic # Po [8] ETHIOPIC WORDSPACE..ETHIOPIC PARAGRAPH SEPARATOR -1369..137C ; Ethiopic # No [20] ETHIOPIC DIGIT ONE..ETHIOPIC NUMBER TEN THOUSAND -1380..138F ; Ethiopic # Lo [16] ETHIOPIC SYLLABLE SEBATBEIT MWA..ETHIOPIC SYLLABLE PWE -1390..1399 ; Ethiopic # So [10] ETHIOPIC TONAL MARK YIZET..ETHIOPIC TONAL MARK KURT -2D80..2D96 ; Ethiopic # Lo [23] ETHIOPIC SYLLABLE LOA..ETHIOPIC SYLLABLE GGWE -2DA0..2DA6 ; Ethiopic # Lo [7] ETHIOPIC SYLLABLE SSA..ETHIOPIC SYLLABLE SSO -2DA8..2DAE ; Ethiopic # Lo [7] ETHIOPIC SYLLABLE CCA..ETHIOPIC SYLLABLE CCO -2DB0..2DB6 ; Ethiopic # Lo [7] ETHIOPIC SYLLABLE ZZA..ETHIOPIC SYLLABLE ZZO -2DB8..2DBE ; Ethiopic # Lo [7] ETHIOPIC SYLLABLE CCHA..ETHIOPIC SYLLABLE CCHO -2DC0..2DC6 ; Ethiopic # Lo [7] ETHIOPIC SYLLABLE QYA..ETHIOPIC SYLLABLE QYO -2DC8..2DCE ; Ethiopic # Lo [7] ETHIOPIC SYLLABLE KYA..ETHIOPIC SYLLABLE KYO -2DD0..2DD6 ; Ethiopic # Lo [7] ETHIOPIC SYLLABLE XYA..ETHIOPIC SYLLABLE XYO -2DD8..2DDE ; Ethiopic # Lo [7] ETHIOPIC SYLLABLE GYA..ETHIOPIC SYLLABLE GYO - -# Total code points: 461 - -# ================================================ - -13A0..13F4 ; Cherokee # Lo [85] CHEROKEE LETTER A..CHEROKEE LETTER YV - -# Total code points: 85 - -# ================================================ - -1401..166C ; Canadian_Aboriginal # Lo [620] CANADIAN SYLLABICS E..CANADIAN SYLLABICS CARRIER TTSA -166D..166E ; Canadian_Aboriginal # Po [2] CANADIAN SYLLABICS CHI SIGN..CANADIAN SYLLABICS FULL STOP -166F..1676 ; Canadian_Aboriginal # Lo [8] CANADIAN SYLLABICS QAI..CANADIAN SYLLABICS NNGAA - -# Total code points: 630 - -# ================================================ - -1680 ; Ogham # Zs OGHAM SPACE MARK -1681..169A ; Ogham # Lo [26] OGHAM LETTER BEITH..OGHAM LETTER PEITH -169B ; Ogham # Ps OGHAM FEATHER MARK -169C ; Ogham # Pe OGHAM REVERSED FEATHER MARK - -# Total code points: 29 - -# ================================================ - -16A0..16EA ; Runic # Lo [75] RUNIC LETTER FEHU FEOH FE F..RUNIC LETTER X -16EE..16F0 ; Runic # Nl [3] RUNIC ARLAUG SYMBOL..RUNIC BELGTHOR SYMBOL - -# Total code points: 78 - -# ================================================ - -1780..17B3 ; Khmer # Lo [52] KHMER LETTER KA..KHMER INDEPENDENT VOWEL QAU -17B4..17B5 ; Khmer # Cf [2] KHMER VOWEL INHERENT AQ..KHMER VOWEL INHERENT AA -17B6 ; Khmer # Mc KHMER VOWEL SIGN AA -17B7..17BD ; Khmer # Mn [7] KHMER VOWEL SIGN I..KHMER VOWEL SIGN UA -17BE..17C5 ; Khmer # Mc [8] KHMER VOWEL SIGN OE..KHMER VOWEL SIGN AU -17C6 ; Khmer # Mn KHMER SIGN NIKAHIT -17C7..17C8 ; Khmer # Mc [2] KHMER SIGN REAHMUK..KHMER SIGN YUUKALEAPINTU -17C9..17D3 ; Khmer # Mn [11] KHMER SIGN MUUSIKATOAN..KHMER SIGN BATHAMASAT -17D4..17D6 ; Khmer # Po [3] KHMER SIGN KHAN..KHMER SIGN CAMNUC PII KUUH -17D7 ; Khmer # Lm KHMER SIGN LEK TOO -17D8..17DA ; Khmer # Po [3] KHMER SIGN BEYYAL..KHMER SIGN KOOMUUT -17DB ; Khmer # Sc KHMER CURRENCY SYMBOL RIEL -17DC ; Khmer # Lo KHMER SIGN AVAKRAHASANYA -17DD ; Khmer # Mn KHMER SIGN ATTHACAN -17E0..17E9 ; Khmer # Nd [10] KHMER DIGIT ZERO..KHMER DIGIT NINE -17F0..17F9 ; Khmer # No [10] KHMER SYMBOL LEK ATTAK SON..KHMER SYMBOL LEK ATTAK PRAM-BUON -19E0..19FF ; Khmer # So [32] KHMER SYMBOL PATHAMASAT..KHMER SYMBOL DAP-PRAM ROC - -# Total code points: 146 - -# ================================================ - -1800..1801 ; Mongolian # Po [2] MONGOLIAN BIRGA..MONGOLIAN ELLIPSIS -1804 ; Mongolian # Po MONGOLIAN COLON -1806 ; Mongolian # Pd MONGOLIAN TODO SOFT HYPHEN -1807..180A ; Mongolian # Po [4] MONGOLIAN SIBE SYLLABLE BOUNDARY MARKER..MONGOLIAN NIRUGU -180B..180D ; Mongolian # Mn [3] MONGOLIAN FREE VARIATION SELECTOR ONE..MONGOLIAN FREE VARIATION SELECTOR THREE -180E ; Mongolian # Zs MONGOLIAN VOWEL SEPARATOR -1810..1819 ; Mongolian # Nd [10] MONGOLIAN DIGIT ZERO..MONGOLIAN DIGIT NINE -1820..1842 ; Mongolian # Lo [35] MONGOLIAN LETTER A..MONGOLIAN LETTER CHI -1843 ; Mongolian # Lm MONGOLIAN LETTER TODO LONG VOWEL SIGN -1844..1877 ; Mongolian # Lo [52] MONGOLIAN LETTER TODO E..MONGOLIAN LETTER MANCHU ZHA -1880..18A8 ; Mongolian # Lo [41] MONGOLIAN LETTER ALI GALI ANUSVARA ONE..MONGOLIAN LETTER MANCHU ALI GALI BHA -18A9 ; Mongolian # Mn MONGOLIAN LETTER ALI GALI DAGALGA -18AA ; Mongolian # Lo MONGOLIAN LETTER MANCHU ALI GALI LHA - -# Total code points: 153 - -# ================================================ - -3041..3096 ; Hiragana # Lo [86] HIRAGANA LETTER SMALL A..HIRAGANA LETTER SMALL KE -309D..309E ; Hiragana # Lm [2] HIRAGANA ITERATION MARK..HIRAGANA VOICED ITERATION MARK -309F ; Hiragana # Lo HIRAGANA DIGRAPH YORI - -# Total code points: 89 - -# ================================================ - -30A1..30FA ; Katakana # Lo [90] KATAKANA LETTER SMALL A..KATAKANA LETTER VO -30FD..30FE ; Katakana # Lm [2] KATAKANA ITERATION MARK..KATAKANA VOICED ITERATION MARK -30FF ; Katakana # Lo KATAKANA DIGRAPH KOTO -31F0..31FF ; Katakana # Lo [16] KATAKANA LETTER SMALL KU..KATAKANA LETTER SMALL RO -32D0..32FE ; Katakana # So [47] CIRCLED KATAKANA A..CIRCLED KATAKANA WO -3300..3357 ; Katakana # So [88] SQUARE APAATO..SQUARE WATTO -FF66..FF6F ; Katakana # Lo [10] HALFWIDTH KATAKANA LETTER WO..HALFWIDTH KATAKANA LETTER SMALL TU -FF71..FF9D ; Katakana # Lo [45] HALFWIDTH KATAKANA LETTER A..HALFWIDTH KATAKANA LETTER N - -# Total code points: 299 - -# ================================================ - -3105..312D ; Bopomofo # Lo [41] BOPOMOFO LETTER B..BOPOMOFO LETTER IH -31A0..31B7 ; Bopomofo # Lo [24] BOPOMOFO LETTER BU..BOPOMOFO FINAL LETTER H - -# Total code points: 65 - -# ================================================ - -2E80..2E99 ; Han # So [26] CJK RADICAL REPEAT..CJK RADICAL RAP -2E9B..2EF3 ; Han # So [89] CJK RADICAL CHOKE..CJK RADICAL C-SIMPLIFIED TURTLE -2F00..2FD5 ; Han # So [214] KANGXI RADICAL ONE..KANGXI RADICAL FLUTE -3005 ; Han # Lm IDEOGRAPHIC ITERATION MARK -3007 ; Han # Nl IDEOGRAPHIC NUMBER ZERO -3021..3029 ; Han # Nl [9] HANGZHOU NUMERAL ONE..HANGZHOU NUMERAL NINE -3038..303A ; Han # Nl [3] HANGZHOU NUMERAL TEN..HANGZHOU NUMERAL THIRTY -303B ; Han # Lm VERTICAL IDEOGRAPHIC ITERATION MARK -3400..4DB5 ; Han # Lo [6582] CJK UNIFIED IDEOGRAPH-3400..CJK UNIFIED IDEOGRAPH-4DB5 -4E00..9FC3 ; Han # Lo [20932] CJK UNIFIED IDEOGRAPH-4E00..CJK UNIFIED IDEOGRAPH-9FC3 -F900..FA2D ; Han # Lo [302] CJK COMPATIBILITY IDEOGRAPH-F900..CJK COMPATIBILITY IDEOGRAPH-FA2D -FA30..FA6A ; Han # Lo [59] CJK COMPATIBILITY IDEOGRAPH-FA30..CJK COMPATIBILITY IDEOGRAPH-FA6A -FA70..FAD9 ; Han # Lo [106] CJK COMPATIBILITY IDEOGRAPH-FA70..CJK COMPATIBILITY IDEOGRAPH-FAD9 -20000..2A6D6 ; Han # Lo [42711] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6D6 -2F800..2FA1D ; Han # Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D - -# Total code points: 71578 - -# ================================================ - -A000..A014 ; Yi # Lo [21] YI SYLLABLE IT..YI SYLLABLE E -A015 ; Yi # Lm YI SYLLABLE WU -A016..A48C ; Yi # Lo [1143] YI SYLLABLE BIT..YI SYLLABLE YYR -A490..A4C6 ; Yi # So [55] YI RADICAL QOT..YI RADICAL KE - -# Total code points: 1220 - -# ================================================ - -10300..1031E ; Old_Italic # Lo [31] OLD ITALIC LETTER A..OLD ITALIC LETTER UU -10320..10323 ; Old_Italic # No [4] OLD ITALIC NUMERAL ONE..OLD ITALIC NUMERAL FIFTY - -# Total code points: 35 - -# ================================================ - -10330..10340 ; Gothic # Lo [17] GOTHIC LETTER AHSA..GOTHIC LETTER PAIRTHRA -10341 ; Gothic # Nl GOTHIC LETTER NINETY -10342..10349 ; Gothic # Lo [8] GOTHIC LETTER RAIDA..GOTHIC LETTER OTHAL -1034A ; Gothic # Nl GOTHIC LETTER NINE HUNDRED - -# Total code points: 27 - -# ================================================ - -10400..1044F ; Deseret # L& [80] DESERET CAPITAL LETTER LONG I..DESERET SMALL LETTER EW - -# Total code points: 80 - -# ================================================ - -0300..036F ; Inherited # Mn [112] COMBINING GRAVE ACCENT..COMBINING LATIN SMALL LETTER X -064B..0655 ; Inherited # Mn [11] ARABIC FATHATAN..ARABIC HAMZA BELOW -0670 ; Inherited # Mn ARABIC LETTER SUPERSCRIPT ALEF -0951..0952 ; Inherited # Mn [2] DEVANAGARI STRESS SIGN UDATTA..DEVANAGARI STRESS SIGN ANUDATTA -1DC0..1DE6 ; Inherited # Mn [39] COMBINING DOTTED GRAVE ACCENT..COMBINING LATIN SMALL LETTER Z -1DFE..1DFF ; Inherited # Mn [2] COMBINING LEFT ARROWHEAD ABOVE..COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW -200C..200D ; Inherited # Cf [2] ZERO WIDTH NON-JOINER..ZERO WIDTH JOINER -20D0..20DC ; Inherited # Mn [13] COMBINING LEFT HARPOON ABOVE..COMBINING FOUR DOTS ABOVE -20DD..20E0 ; Inherited # Me [4] COMBINING ENCLOSING CIRCLE..COMBINING ENCLOSING CIRCLE BACKSLASH -20E1 ; Inherited # Mn COMBINING LEFT RIGHT ARROW ABOVE -20E2..20E4 ; Inherited # Me [3] COMBINING ENCLOSING SCREEN..COMBINING ENCLOSING UPWARD POINTING TRIANGLE -20E5..20F0 ; Inherited # Mn [12] COMBINING REVERSE SOLIDUS OVERLAY..COMBINING ASTERISK ABOVE -302A..302F ; Inherited # Mn [6] IDEOGRAPHIC LEVEL TONE MARK..HANGUL DOUBLE DOT TONE MARK -3099..309A ; Inherited # Mn [2] COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK..COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK -FE00..FE0F ; Inherited # Mn [16] VARIATION SELECTOR-1..VARIATION SELECTOR-16 -FE20..FE26 ; Inherited # Mn [7] COMBINING LIGATURE LEFT HALF..COMBINING CONJOINING MACRON -101FD ; Inherited # Mn PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE -1D167..1D169 ; Inherited # Mn [3] MUSICAL SYMBOL COMBINING TREMOLO-1..MUSICAL SYMBOL COMBINING TREMOLO-3 -1D17B..1D182 ; Inherited # Mn [8] MUSICAL SYMBOL COMBINING ACCENT..MUSICAL SYMBOL COMBINING LOURE -1D185..1D18B ; Inherited # Mn [7] MUSICAL SYMBOL COMBINING DOIT..MUSICAL SYMBOL COMBINING TRIPLE TONGUE -1D1AA..1D1AD ; Inherited # Mn [4] MUSICAL SYMBOL COMBINING DOWN BOW..MUSICAL SYMBOL COMBINING SNAP PIZZICATO -E0100..E01EF ; Inherited # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256 - -# Total code points: 496 - -# ================================================ - -1700..170C ; Tagalog # Lo [13] TAGALOG LETTER A..TAGALOG LETTER YA -170E..1711 ; Tagalog # Lo [4] TAGALOG LETTER LA..TAGALOG LETTER HA -1712..1714 ; Tagalog # Mn [3] TAGALOG VOWEL SIGN I..TAGALOG SIGN VIRAMA - -# Total code points: 20 - -# ================================================ - -1720..1731 ; Hanunoo # Lo [18] HANUNOO LETTER A..HANUNOO LETTER HA -1732..1734 ; Hanunoo # Mn [3] HANUNOO VOWEL SIGN I..HANUNOO SIGN PAMUDPOD - -# Total code points: 21 - -# ================================================ - -1740..1751 ; Buhid # Lo [18] BUHID LETTER A..BUHID LETTER HA -1752..1753 ; Buhid # Mn [2] BUHID VOWEL SIGN I..BUHID VOWEL SIGN U - -# Total code points: 20 - -# ================================================ - -1760..176C ; Tagbanwa # Lo [13] TAGBANWA LETTER A..TAGBANWA LETTER YA -176E..1770 ; Tagbanwa # Lo [3] TAGBANWA LETTER LA..TAGBANWA LETTER SA -1772..1773 ; Tagbanwa # Mn [2] TAGBANWA VOWEL SIGN I..TAGBANWA VOWEL SIGN U - -# Total code points: 18 - -# ================================================ - -1900..191C ; Limbu # Lo [29] LIMBU VOWEL-CARRIER LETTER..LIMBU LETTER HA -1920..1922 ; Limbu # Mn [3] LIMBU VOWEL SIGN A..LIMBU VOWEL SIGN U -1923..1926 ; Limbu # Mc [4] LIMBU VOWEL SIGN EE..LIMBU VOWEL SIGN AU -1927..1928 ; Limbu # Mn [2] LIMBU VOWEL SIGN E..LIMBU VOWEL SIGN O -1929..192B ; Limbu # Mc [3] LIMBU SUBJOINED LETTER YA..LIMBU SUBJOINED LETTER WA -1930..1931 ; Limbu # Mc [2] LIMBU SMALL LETTER KA..LIMBU SMALL LETTER NGA -1932 ; Limbu # Mn LIMBU SMALL LETTER ANUSVARA -1933..1938 ; Limbu # Mc [6] LIMBU SMALL LETTER TA..LIMBU SMALL LETTER LA -1939..193B ; Limbu # Mn [3] LIMBU SIGN MUKPHRENG..LIMBU SIGN SA-I -1940 ; Limbu # So LIMBU SIGN LOO -1944..1945 ; Limbu # Po [2] LIMBU EXCLAMATION MARK..LIMBU QUESTION MARK -1946..194F ; Limbu # Nd [10] LIMBU DIGIT ZERO..LIMBU DIGIT NINE - -# Total code points: 66 - -# ================================================ - -1950..196D ; Tai_Le # Lo [30] TAI LE LETTER KA..TAI LE LETTER AI -1970..1974 ; Tai_Le # Lo [5] TAI LE LETTER TONE-2..TAI LE LETTER TONE-6 - -# Total code points: 35 - -# ================================================ - -10000..1000B ; Linear_B # Lo [12] LINEAR B SYLLABLE B008 A..LINEAR B SYLLABLE B046 JE -1000D..10026 ; Linear_B # Lo [26] LINEAR B SYLLABLE B036 JO..LINEAR B SYLLABLE B032 QO -10028..1003A ; Linear_B # Lo [19] LINEAR B SYLLABLE B060 RA..LINEAR B SYLLABLE B042 WO -1003C..1003D ; Linear_B # Lo [2] LINEAR B SYLLABLE B017 ZA..LINEAR B SYLLABLE B074 ZE -1003F..1004D ; Linear_B # Lo [15] LINEAR B SYLLABLE B020 ZO..LINEAR B SYLLABLE B091 TWO -10050..1005D ; Linear_B # Lo [14] LINEAR B SYMBOL B018..LINEAR B SYMBOL B089 -10080..100FA ; Linear_B # Lo [123] LINEAR B IDEOGRAM B100 MAN..LINEAR B IDEOGRAM VESSEL B305 - -# Total code points: 211 - -# ================================================ - -10380..1039D ; Ugaritic # Lo [30] UGARITIC LETTER ALPA..UGARITIC LETTER SSU -1039F ; Ugaritic # Po UGARITIC WORD DIVIDER - -# Total code points: 31 - -# ================================================ - -10450..1047F ; Shavian # Lo [48] SHAVIAN LETTER PEEP..SHAVIAN LETTER YEW - -# Total code points: 48 - -# ================================================ - -10480..1049D ; Osmanya # Lo [30] OSMANYA LETTER ALEF..OSMANYA LETTER OO -104A0..104A9 ; Osmanya # Nd [10] OSMANYA DIGIT ZERO..OSMANYA DIGIT NINE - -# Total code points: 40 - -# ================================================ - -10800..10805 ; Cypriot # Lo [6] CYPRIOT SYLLABLE A..CYPRIOT SYLLABLE JA -10808 ; Cypriot # Lo CYPRIOT SYLLABLE JO -1080A..10835 ; Cypriot # Lo [44] CYPRIOT SYLLABLE KA..CYPRIOT SYLLABLE WO -10837..10838 ; Cypriot # Lo [2] CYPRIOT SYLLABLE XA..CYPRIOT SYLLABLE XE -1083C ; Cypriot # Lo CYPRIOT SYLLABLE ZA -1083F ; Cypriot # Lo CYPRIOT SYLLABLE ZO - -# Total code points: 55 - -# ================================================ - -2800..28FF ; Braille # So [256] BRAILLE PATTERN BLANK..BRAILLE PATTERN DOTS-12345678 - -# Total code points: 256 - -# ================================================ - -1A00..1A16 ; Buginese # Lo [23] BUGINESE LETTER KA..BUGINESE LETTER HA -1A17..1A18 ; Buginese # Mn [2] BUGINESE VOWEL SIGN I..BUGINESE VOWEL SIGN U -1A19..1A1B ; Buginese # Mc [3] BUGINESE VOWEL SIGN E..BUGINESE VOWEL SIGN AE -1A1E..1A1F ; Buginese # Po [2] BUGINESE PALLAWA..BUGINESE END OF SECTION - -# Total code points: 30 - -# ================================================ - -03E2..03EF ; Coptic # L& [14] COPTIC CAPITAL LETTER SHEI..COPTIC SMALL LETTER DEI -2C80..2CE4 ; Coptic # L& [101] COPTIC CAPITAL LETTER ALFA..COPTIC SYMBOL KAI -2CE5..2CEA ; Coptic # So [6] COPTIC SYMBOL MI RO..COPTIC SYMBOL SHIMA SIMA -2CF9..2CFC ; Coptic # Po [4] COPTIC OLD NUBIAN FULL STOP..COPTIC OLD NUBIAN VERSE DIVIDER -2CFD ; Coptic # No COPTIC FRACTION ONE HALF -2CFE..2CFF ; Coptic # Po [2] COPTIC FULL STOP..COPTIC MORPHOLOGICAL DIVIDER - -# Total code points: 128 - -# ================================================ - -1980..19A9 ; New_Tai_Lue # Lo [42] NEW TAI LUE LETTER HIGH QA..NEW TAI LUE LETTER LOW XVA -19B0..19C0 ; New_Tai_Lue # Mc [17] NEW TAI LUE VOWEL SIGN VOWEL SHORTENER..NEW TAI LUE VOWEL SIGN IY -19C1..19C7 ; New_Tai_Lue # Lo [7] NEW TAI LUE LETTER FINAL V..NEW TAI LUE LETTER FINAL B -19C8..19C9 ; New_Tai_Lue # Mc [2] NEW TAI LUE TONE MARK-1..NEW TAI LUE TONE MARK-2 -19D0..19D9 ; New_Tai_Lue # Nd [10] NEW TAI LUE DIGIT ZERO..NEW TAI LUE DIGIT NINE -19DE..19DF ; New_Tai_Lue # Po [2] NEW TAI LUE SIGN LAE..NEW TAI LUE SIGN LAEV - -# Total code points: 80 - -# ================================================ - -2C00..2C2E ; Glagolitic # L& [47] GLAGOLITIC CAPITAL LETTER AZU..GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE -2C30..2C5E ; Glagolitic # L& [47] GLAGOLITIC SMALL LETTER AZU..GLAGOLITIC SMALL LETTER LATINATE MYSLITE - -# Total code points: 94 - -# ================================================ - -2D30..2D65 ; Tifinagh # Lo [54] TIFINAGH LETTER YA..TIFINAGH LETTER YAZZ -2D6F ; Tifinagh # Lm TIFINAGH MODIFIER LETTER LABIALIZATION MARK - -# Total code points: 55 - -# ================================================ - -A800..A801 ; Syloti_Nagri # Lo [2] SYLOTI NAGRI LETTER A..SYLOTI NAGRI LETTER I -A802 ; Syloti_Nagri # Mn SYLOTI NAGRI SIGN DVISVARA -A803..A805 ; Syloti_Nagri # Lo [3] SYLOTI NAGRI LETTER U..SYLOTI NAGRI LETTER O -A806 ; Syloti_Nagri # Mn SYLOTI NAGRI SIGN HASANTA -A807..A80A ; Syloti_Nagri # Lo [4] SYLOTI NAGRI LETTER KO..SYLOTI NAGRI LETTER GHO -A80B ; Syloti_Nagri # Mn SYLOTI NAGRI SIGN ANUSVARA -A80C..A822 ; Syloti_Nagri # Lo [23] SYLOTI NAGRI LETTER CO..SYLOTI NAGRI LETTER HO -A823..A824 ; Syloti_Nagri # Mc [2] SYLOTI NAGRI VOWEL SIGN A..SYLOTI NAGRI VOWEL SIGN I -A825..A826 ; Syloti_Nagri # Mn [2] SYLOTI NAGRI VOWEL SIGN U..SYLOTI NAGRI VOWEL SIGN E -A827 ; Syloti_Nagri # Mc SYLOTI NAGRI VOWEL SIGN OO -A828..A82B ; Syloti_Nagri # So [4] SYLOTI NAGRI POETRY MARK-1..SYLOTI NAGRI POETRY MARK-4 - -# Total code points: 44 - -# ================================================ - -103A0..103C3 ; Old_Persian # Lo [36] OLD PERSIAN SIGN A..OLD PERSIAN SIGN HA -103C8..103CF ; Old_Persian # Lo [8] OLD PERSIAN SIGN AURAMAZDAA..OLD PERSIAN SIGN BUUMISH -103D0 ; Old_Persian # Po OLD PERSIAN WORD DIVIDER -103D1..103D5 ; Old_Persian # Nl [5] OLD PERSIAN NUMBER ONE..OLD PERSIAN NUMBER HUNDRED - -# Total code points: 50 - -# ================================================ - -10A00 ; Kharoshthi # Lo KHAROSHTHI LETTER A -10A01..10A03 ; Kharoshthi # Mn [3] KHAROSHTHI VOWEL SIGN I..KHAROSHTHI VOWEL SIGN VOCALIC R -10A05..10A06 ; Kharoshthi # Mn [2] KHAROSHTHI VOWEL SIGN E..KHAROSHTHI VOWEL SIGN O -10A0C..10A0F ; Kharoshthi # Mn [4] KHAROSHTHI VOWEL LENGTH MARK..KHAROSHTHI SIGN VISARGA -10A10..10A13 ; Kharoshthi # Lo [4] KHAROSHTHI LETTER KA..KHAROSHTHI LETTER GHA -10A15..10A17 ; Kharoshthi # Lo [3] KHAROSHTHI LETTER CA..KHAROSHTHI LETTER JA -10A19..10A33 ; Kharoshthi # Lo [27] KHAROSHTHI LETTER NYA..KHAROSHTHI LETTER TTTHA -10A38..10A3A ; Kharoshthi # Mn [3] KHAROSHTHI SIGN BAR ABOVE..KHAROSHTHI SIGN DOT BELOW -10A3F ; Kharoshthi # Mn KHAROSHTHI VIRAMA -10A40..10A47 ; Kharoshthi # No [8] KHAROSHTHI DIGIT ONE..KHAROSHTHI NUMBER ONE THOUSAND -10A50..10A58 ; Kharoshthi # Po [9] KHAROSHTHI PUNCTUATION DOT..KHAROSHTHI PUNCTUATION LINES - -# Total code points: 65 - -# ================================================ - -1B00..1B03 ; Balinese # Mn [4] BALINESE SIGN ULU RICEM..BALINESE SIGN SURANG -1B04 ; Balinese # Mc BALINESE SIGN BISAH -1B05..1B33 ; Balinese # Lo [47] BALINESE LETTER AKARA..BALINESE LETTER HA -1B34 ; Balinese # Mn BALINESE SIGN REREKAN -1B35 ; Balinese # Mc BALINESE VOWEL SIGN TEDUNG -1B36..1B3A ; Balinese # Mn [5] BALINESE VOWEL SIGN ULU..BALINESE VOWEL SIGN RA REPA -1B3B ; Balinese # Mc BALINESE VOWEL SIGN RA REPA TEDUNG -1B3C ; Balinese # Mn BALINESE VOWEL SIGN LA LENGA -1B3D..1B41 ; Balinese # Mc [5] BALINESE VOWEL SIGN LA LENGA TEDUNG..BALINESE VOWEL SIGN TALING REPA TEDUNG -1B42 ; Balinese # Mn BALINESE VOWEL SIGN PEPET -1B43..1B44 ; Balinese # Mc [2] BALINESE VOWEL SIGN PEPET TEDUNG..BALINESE ADEG ADEG -1B45..1B4B ; Balinese # Lo [7] BALINESE LETTER KAF SASAK..BALINESE LETTER ASYURA SASAK -1B50..1B59 ; Balinese # Nd [10] BALINESE DIGIT ZERO..BALINESE DIGIT NINE -1B5A..1B60 ; Balinese # Po [7] BALINESE PANTI..BALINESE PAMENENG -1B61..1B6A ; Balinese # So [10] BALINESE MUSICAL SYMBOL DONG..BALINESE MUSICAL SYMBOL DANG GEDE -1B6B..1B73 ; Balinese # Mn [9] BALINESE MUSICAL SYMBOL COMBINING TEGEH..BALINESE MUSICAL SYMBOL COMBINING GONG -1B74..1B7C ; Balinese # So [9] BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DUG..BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PING - -# Total code points: 121 - -# ================================================ - -12000..1236E ; Cuneiform # Lo [879] CUNEIFORM SIGN A..CUNEIFORM SIGN ZUM -12400..12462 ; Cuneiform # Nl [99] CUNEIFORM NUMERIC SIGN TWO ASH..CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE QUARTER -12470..12473 ; Cuneiform # Po [4] CUNEIFORM PUNCTUATION SIGN OLD ASSYRIAN WORD DIVIDER..CUNEIFORM PUNCTUATION SIGN DIAGONAL TRICOLON - -# Total code points: 982 - -# ================================================ - -10900..10915 ; Phoenician # Lo [22] PHOENICIAN LETTER ALF..PHOENICIAN LETTER TAU -10916..10919 ; Phoenician # No [4] PHOENICIAN NUMBER ONE..PHOENICIAN NUMBER ONE HUNDRED -1091F ; Phoenician # Po PHOENICIAN WORD SEPARATOR - -# Total code points: 27 - -# ================================================ - -A840..A873 ; Phags_Pa # Lo [52] PHAGS-PA LETTER KA..PHAGS-PA LETTER CANDRABINDU -A874..A877 ; Phags_Pa # Po [4] PHAGS-PA SINGLE HEAD MARK..PHAGS-PA MARK DOUBLE SHAD - -# Total code points: 56 - -# ================================================ - -07C0..07C9 ; Nko # Nd [10] NKO DIGIT ZERO..NKO DIGIT NINE -07CA..07EA ; Nko # Lo [33] NKO LETTER A..NKO LETTER JONA RA -07EB..07F3 ; Nko # Mn [9] NKO COMBINING SHORT HIGH TONE..NKO COMBINING DOUBLE DOT ABOVE -07F4..07F5 ; Nko # Lm [2] NKO HIGH TONE APOSTROPHE..NKO LOW TONE APOSTROPHE -07F6 ; Nko # So NKO SYMBOL OO DENNEN -07F7..07F9 ; Nko # Po [3] NKO SYMBOL GBAKURUNEN..NKO EXCLAMATION MARK -07FA ; Nko # Lm NKO LAJANYALAN - -# Total code points: 59 - -# ================================================ - -1B80..1B81 ; Sundanese # Mn [2] SUNDANESE SIGN PANYECEK..SUNDANESE SIGN PANGLAYAR -1B82 ; Sundanese # Mc SUNDANESE SIGN PANGWISAD -1B83..1BA0 ; Sundanese # Lo [30] SUNDANESE LETTER A..SUNDANESE LETTER HA -1BA1 ; Sundanese # Mc SUNDANESE CONSONANT SIGN PAMINGKAL -1BA2..1BA5 ; Sundanese # Mn [4] SUNDANESE CONSONANT SIGN PANYAKRA..SUNDANESE VOWEL SIGN PANYUKU -1BA6..1BA7 ; Sundanese # Mc [2] SUNDANESE VOWEL SIGN PANAELAENG..SUNDANESE VOWEL SIGN PANOLONG -1BA8..1BA9 ; Sundanese # Mn [2] SUNDANESE VOWEL SIGN PAMEPET..SUNDANESE VOWEL SIGN PANEULEUNG -1BAA ; Sundanese # Mc SUNDANESE SIGN PAMAAEH -1BAE..1BAF ; Sundanese # Lo [2] SUNDANESE LETTER KHA..SUNDANESE LETTER SYA -1BB0..1BB9 ; Sundanese # Nd [10] SUNDANESE DIGIT ZERO..SUNDANESE DIGIT NINE - -# Total code points: 55 - -# ================================================ - -1C00..1C23 ; Lepcha # Lo [36] LEPCHA LETTER KA..LEPCHA LETTER A -1C24..1C2B ; Lepcha # Mc [8] LEPCHA SUBJOINED LETTER YA..LEPCHA VOWEL SIGN UU -1C2C..1C33 ; Lepcha # Mn [8] LEPCHA VOWEL SIGN E..LEPCHA CONSONANT SIGN T -1C34..1C35 ; Lepcha # Mc [2] LEPCHA CONSONANT SIGN NYIN-DO..LEPCHA CONSONANT SIGN KANG -1C36..1C37 ; Lepcha # Mn [2] LEPCHA SIGN RAN..LEPCHA SIGN NUKTA -1C3B..1C3F ; Lepcha # Po [5] LEPCHA PUNCTUATION TA-ROL..LEPCHA PUNCTUATION TSHOOK -1C40..1C49 ; Lepcha # Nd [10] LEPCHA DIGIT ZERO..LEPCHA DIGIT NINE -1C4D..1C4F ; Lepcha # Lo [3] LEPCHA LETTER TTA..LEPCHA LETTER DDA - -# Total code points: 74 - -# ================================================ - -1C50..1C59 ; Ol_Chiki # Nd [10] OL CHIKI DIGIT ZERO..OL CHIKI DIGIT NINE -1C5A..1C77 ; Ol_Chiki # Lo [30] OL CHIKI LETTER LA..OL CHIKI LETTER OH -1C78..1C7D ; Ol_Chiki # Lm [6] OL CHIKI MU TTUDDAG..OL CHIKI AHAD -1C7E..1C7F ; Ol_Chiki # Po [2] OL CHIKI PUNCTUATION MUCAAD..OL CHIKI PUNCTUATION DOUBLE MUCAAD - -# Total code points: 48 - -# ================================================ - -A500..A60B ; Vai # Lo [268] VAI SYLLABLE EE..VAI SYLLABLE NG -A60C ; Vai # Lm VAI SYLLABLE LENGTHENER -A60D..A60F ; Vai # Po [3] VAI COMMA..VAI QUESTION MARK -A610..A61F ; Vai # Lo [16] VAI SYLLABLE NDOLE FA..VAI SYMBOL JONG -A620..A629 ; Vai # Nd [10] VAI DIGIT ZERO..VAI DIGIT NINE -A62A..A62B ; Vai # Lo [2] VAI SYLLABLE NDOLE MA..VAI SYLLABLE NDOLE DO - -# Total code points: 300 - -# ================================================ - -A880..A881 ; Saurashtra # Mc [2] SAURASHTRA SIGN ANUSVARA..SAURASHTRA SIGN VISARGA -A882..A8B3 ; Saurashtra # Lo [50] SAURASHTRA LETTER A..SAURASHTRA LETTER LLA -A8B4..A8C3 ; Saurashtra # Mc [16] SAURASHTRA CONSONANT SIGN HAARU..SAURASHTRA VOWEL SIGN AU -A8C4 ; Saurashtra # Mn SAURASHTRA SIGN VIRAMA -A8CE..A8CF ; Saurashtra # Po [2] SAURASHTRA DANDA..SAURASHTRA DOUBLE DANDA -A8D0..A8D9 ; Saurashtra # Nd [10] SAURASHTRA DIGIT ZERO..SAURASHTRA DIGIT NINE - -# Total code points: 81 - -# ================================================ - -A900..A909 ; Kayah_Li # Nd [10] KAYAH LI DIGIT ZERO..KAYAH LI DIGIT NINE -A90A..A925 ; Kayah_Li # Lo [28] KAYAH LI LETTER KA..KAYAH LI LETTER OO -A926..A92D ; Kayah_Li # Mn [8] KAYAH LI VOWEL UE..KAYAH LI TONE CALYA PLOPHU -A92E..A92F ; Kayah_Li # Po [2] KAYAH LI SIGN CWI..KAYAH LI SIGN SHYA - -# Total code points: 48 - -# ================================================ - -A930..A946 ; Rejang # Lo [23] REJANG LETTER KA..REJANG LETTER A -A947..A951 ; Rejang # Mn [11] REJANG VOWEL SIGN I..REJANG CONSONANT SIGN R -A952..A953 ; Rejang # Mc [2] REJANG CONSONANT SIGN H..REJANG VIRAMA -A95F ; Rejang # Po REJANG SECTION MARK - -# Total code points: 37 - -# ================================================ - -10280..1029C ; Lycian # Lo [29] LYCIAN LETTER A..LYCIAN LETTER X - -# Total code points: 29 - -# ================================================ - -102A0..102D0 ; Carian # Lo [49] CARIAN LETTER A..CARIAN LETTER UUU3 - -# Total code points: 49 - -# ================================================ - -10920..10939 ; Lydian # Lo [26] LYDIAN LETTER A..LYDIAN LETTER C -1093F ; Lydian # Po LYDIAN TRIANGULAR MARK - -# Total code points: 27 - -# ================================================ - -AA00..AA28 ; Cham # Lo [41] CHAM LETTER A..CHAM LETTER HA -AA29..AA2E ; Cham # Mn [6] CHAM VOWEL SIGN AA..CHAM VOWEL SIGN OE -AA2F..AA30 ; Cham # Mc [2] CHAM VOWEL SIGN O..CHAM VOWEL SIGN AI -AA31..AA32 ; Cham # Mn [2] CHAM VOWEL SIGN AU..CHAM VOWEL SIGN UE -AA33..AA34 ; Cham # Mc [2] CHAM CONSONANT SIGN YA..CHAM CONSONANT SIGN RA -AA35..AA36 ; Cham # Mn [2] CHAM CONSONANT SIGN LA..CHAM CONSONANT SIGN WA -AA40..AA42 ; Cham # Lo [3] CHAM LETTER FINAL K..CHAM LETTER FINAL NG -AA43 ; Cham # Mn CHAM CONSONANT SIGN FINAL NG -AA44..AA4B ; Cham # Lo [8] CHAM LETTER FINAL CH..CHAM LETTER FINAL SS -AA4C ; Cham # Mn CHAM CONSONANT SIGN FINAL M -AA4D ; Cham # Mc CHAM CONSONANT SIGN FINAL H -AA50..AA59 ; Cham # Nd [10] CHAM DIGIT ZERO..CHAM DIGIT NINE -AA5C..AA5F ; Cham # Po [4] CHAM PUNCTUATION SPIRAL..CHAM PUNCTUATION TRIPLE DANDA - -# Total code points: 83 - -# EOF diff --git a/third_party/harfbuzz/contrib/tables/category-parse.py b/third_party/harfbuzz/contrib/tables/category-parse.py deleted file mode 100644 index 6818c1dbfc..0000000000 --- a/third_party/harfbuzz/contrib/tables/category-parse.py +++ /dev/null @@ -1,70 +0,0 @@ -import sys -from unicode_parse_common import * - -# http://www.unicode.org/Public/5.1.0/ucd/extracted/DerivedGeneralCategory.txt - -category_to_harfbuzz = { - 'Mn': 'HB_Mark_NonSpacing', - 'Mc': 'HB_Mark_SpacingCombining', - 'Me': 'HB_Mark_Enclosing', - - 'Nd': 'HB_Number_DecimalDigit', - 'Nl': 'HB_Number_Letter', - 'No': 'HB_Number_Other', - - 'Zs': 'HB_Separator_Space', - 'Zl': 'HB_Separator_Line', - 'Zp': 'HB_Separator_Paragraph', - - 'Cc': 'HB_Other_Control', - 'Cf': 'HB_Other_Format', - 'Cs': 'HB_Other_Surrogate', - 'Co': 'HB_Other_PrivateUse', - 'Cn': 'HB_Other_NotAssigned', - - 'Lu': 'HB_Letter_Uppercase', - 'Ll': 'HB_Letter_Lowercase', - 'Lt': 'HB_Letter_Titlecase', - 'Lm': 'HB_Letter_Modifier', - 'Lo': 'HB_Letter_Other', - - 'Pc': 'HB_Punctuation_Connector', - 'Pd': 'HB_Punctuation_Dash', - 'Ps': 'HB_Punctuation_Open', - 'Pe': 'HB_Punctuation_Close', - 'Pi': 'HB_Punctuation_InitialQuote', - 'Pf': 'HB_Punctuation_FinalQuote', - 'Po': 'HB_Punctuation_Other', - - 'Sm': 'HB_Symbol_Math', - 'Sc': 'HB_Symbol_Currency', - 'Sk': 'HB_Symbol_Modifier', - 'So': 'HB_Symbol_Other', -} - -def main(infile, outfile): - ranges = unicode_file_parse(infile, category_to_harfbuzz) - ranges = sort_and_merge(ranges) - - print >>outfile, '// Generated from Unicode script tables\n' - print >>outfile, '#ifndef CATEGORY_PROPERTIES_H_' - print >>outfile, '#define CATEGORY_PROPERTIES_H_\n' - print >>outfile, '#include ' - print >>outfile, '#include "harfbuzz-external.h"\n' - print >>outfile, 'struct category_property {' - print >>outfile, ' uint32_t range_start;' - print >>outfile, ' uint32_t range_end;' - print >>outfile, ' HB_CharCategory category;' - print >>outfile, '};\n' - print >>outfile, 'static const struct category_property category_properties[] = {' - for (start, end, value) in ranges: - print >>outfile, ' {0x%x, 0x%x, %s},' % (start, end, value) - print >>outfile, '};\n' - print >>outfile, 'static const unsigned category_properties_count = %d;\n' % len(ranges) - print >>outfile, '#endif // CATEGORY_PROPERTIES_H_' - -if __name__ == '__main__': - if len(sys.argv) != 3: - print 'Usage: %s ' % sys.argv[0] - else: - main(file(sys.argv[1], 'r'), file(sys.argv[2], 'w+')) diff --git a/third_party/harfbuzz/contrib/tables/category-properties.h b/third_party/harfbuzz/contrib/tables/category-properties.h deleted file mode 100644 index 3b7c7cafc5..0000000000 --- a/third_party/harfbuzz/contrib/tables/category-properties.h +++ /dev/null @@ -1,2869 +0,0 @@ -// Generated from Unicode script tables - -#ifndef CATEGORY_PROPERTIES_H_ -#define CATEGORY_PROPERTIES_H_ - -#include -#include "harfbuzz-external.h" - -struct category_property { - uint32_t range_start; - uint32_t range_end; - HB_CharCategory category; -}; - -static const struct category_property category_properties[] = { - {0x0, 0x1f, HB_Other_Control}, - {0x20, 0x20, HB_Separator_Space}, - {0x21, 0x23, HB_Punctuation_Other}, - {0x24, 0x24, HB_Symbol_Currency}, - {0x25, 0x27, HB_Punctuation_Other}, - {0x28, 0x28, HB_Punctuation_Open}, - {0x29, 0x29, HB_Punctuation_Close}, - {0x2a, 0x2a, HB_Punctuation_Other}, - {0x2b, 0x2b, HB_Symbol_Math}, - {0x2c, 0x2c, HB_Punctuation_Other}, - {0x2d, 0x2d, HB_Punctuation_Dash}, - {0x2e, 0x2f, HB_Punctuation_Other}, - {0x30, 0x39, HB_Number_DecimalDigit}, - {0x3a, 0x3b, HB_Punctuation_Other}, - {0x3c, 0x3e, HB_Symbol_Math}, - {0x3f, 0x40, HB_Punctuation_Other}, - {0x41, 0x5a, HB_Letter_Uppercase}, - {0x5b, 0x5b, HB_Punctuation_Open}, - {0x5c, 0x5c, HB_Punctuation_Other}, - {0x5d, 0x5d, HB_Punctuation_Close}, - {0x5e, 0x5e, HB_Symbol_Modifier}, - {0x5f, 0x5f, HB_Punctuation_Connector}, - {0x60, 0x60, HB_Symbol_Modifier}, - {0x61, 0x7a, HB_Letter_Lowercase}, - {0x7b, 0x7b, HB_Punctuation_Open}, - {0x7c, 0x7c, HB_Symbol_Math}, - {0x7d, 0x7d, HB_Punctuation_Close}, - {0x7e, 0x7e, HB_Symbol_Math}, - {0x7f, 0x9f, HB_Other_Control}, - {0xa0, 0xa0, HB_Separator_Space}, - {0xa1, 0xa1, HB_Punctuation_Other}, - {0xa2, 0xa5, HB_Symbol_Currency}, - {0xa6, 0xa7, HB_Symbol_Other}, - {0xa8, 0xa8, HB_Symbol_Modifier}, - {0xa9, 0xa9, HB_Symbol_Other}, - {0xaa, 0xaa, HB_Letter_Lowercase}, - {0xab, 0xab, HB_Punctuation_InitialQuote}, - {0xac, 0xac, HB_Symbol_Math}, - {0xad, 0xad, HB_Other_Format}, - {0xae, 0xae, HB_Symbol_Other}, - {0xaf, 0xaf, HB_Symbol_Modifier}, - {0xb0, 0xb0, HB_Symbol_Other}, - {0xb1, 0xb1, HB_Symbol_Math}, - {0xb2, 0xb3, HB_Number_Other}, - {0xb4, 0xb4, HB_Symbol_Modifier}, - {0xb5, 0xb5, HB_Letter_Lowercase}, - {0xb6, 0xb6, HB_Symbol_Other}, - {0xb7, 0xb7, HB_Punctuation_Other}, - {0xb8, 0xb8, HB_Symbol_Modifier}, - {0xb9, 0xb9, HB_Number_Other}, - {0xba, 0xba, HB_Letter_Lowercase}, - {0xbb, 0xbb, HB_Punctuation_FinalQuote}, - {0xbc, 0xbe, HB_Number_Other}, - {0xbf, 0xbf, HB_Punctuation_Other}, - {0xc0, 0xd6, HB_Letter_Uppercase}, - {0xd7, 0xd7, HB_Symbol_Math}, - {0xd8, 0xde, HB_Letter_Uppercase}, - {0xdf, 0xf6, HB_Letter_Lowercase}, - {0xf7, 0xf7, HB_Symbol_Math}, - {0xf8, 0xff, HB_Letter_Lowercase}, - {0x100, 0x100, HB_Letter_Uppercase}, - {0x101, 0x101, HB_Letter_Lowercase}, - {0x102, 0x102, HB_Letter_Uppercase}, - {0x103, 0x103, HB_Letter_Lowercase}, - {0x104, 0x104, HB_Letter_Uppercase}, - {0x105, 0x105, HB_Letter_Lowercase}, - {0x106, 0x106, HB_Letter_Uppercase}, - {0x107, 0x107, HB_Letter_Lowercase}, - {0x108, 0x108, HB_Letter_Uppercase}, - {0x109, 0x109, HB_Letter_Lowercase}, - {0x10a, 0x10a, HB_Letter_Uppercase}, - {0x10b, 0x10b, HB_Letter_Lowercase}, - {0x10c, 0x10c, HB_Letter_Uppercase}, - {0x10d, 0x10d, HB_Letter_Lowercase}, - {0x10e, 0x10e, HB_Letter_Uppercase}, - {0x10f, 0x10f, HB_Letter_Lowercase}, - {0x110, 0x110, HB_Letter_Uppercase}, - {0x111, 0x111, HB_Letter_Lowercase}, - {0x112, 0x112, HB_Letter_Uppercase}, - {0x113, 0x113, HB_Letter_Lowercase}, - {0x114, 0x114, HB_Letter_Uppercase}, - {0x115, 0x115, HB_Letter_Lowercase}, - {0x116, 0x116, HB_Letter_Uppercase}, - {0x117, 0x117, HB_Letter_Lowercase}, - {0x118, 0x118, HB_Letter_Uppercase}, - {0x119, 0x119, HB_Letter_Lowercase}, - {0x11a, 0x11a, HB_Letter_Uppercase}, - {0x11b, 0x11b, HB_Letter_Lowercase}, - {0x11c, 0x11c, HB_Letter_Uppercase}, - {0x11d, 0x11d, HB_Letter_Lowercase}, - {0x11e, 0x11e, HB_Letter_Uppercase}, - {0x11f, 0x11f, HB_Letter_Lowercase}, - {0x120, 0x120, HB_Letter_Uppercase}, - {0x121, 0x121, HB_Letter_Lowercase}, - {0x122, 0x122, HB_Letter_Uppercase}, - {0x123, 0x123, HB_Letter_Lowercase}, - {0x124, 0x124, HB_Letter_Uppercase}, - {0x125, 0x125, HB_Letter_Lowercase}, - {0x126, 0x126, HB_Letter_Uppercase}, - {0x127, 0x127, HB_Letter_Lowercase}, - {0x128, 0x128, HB_Letter_Uppercase}, - {0x129, 0x129, HB_Letter_Lowercase}, - {0x12a, 0x12a, HB_Letter_Uppercase}, - {0x12b, 0x12b, HB_Letter_Lowercase}, - {0x12c, 0x12c, HB_Letter_Uppercase}, - {0x12d, 0x12d, HB_Letter_Lowercase}, - {0x12e, 0x12e, HB_Letter_Uppercase}, - {0x12f, 0x12f, HB_Letter_Lowercase}, - {0x130, 0x130, HB_Letter_Uppercase}, - {0x131, 0x131, HB_Letter_Lowercase}, - {0x132, 0x132, HB_Letter_Uppercase}, - {0x133, 0x133, HB_Letter_Lowercase}, - {0x134, 0x134, HB_Letter_Uppercase}, - {0x135, 0x135, HB_Letter_Lowercase}, - {0x136, 0x136, HB_Letter_Uppercase}, - {0x137, 0x138, HB_Letter_Lowercase}, - {0x139, 0x139, HB_Letter_Uppercase}, - {0x13a, 0x13a, HB_Letter_Lowercase}, - {0x13b, 0x13b, HB_Letter_Uppercase}, - {0x13c, 0x13c, HB_Letter_Lowercase}, - {0x13d, 0x13d, HB_Letter_Uppercase}, - {0x13e, 0x13e, HB_Letter_Lowercase}, - {0x13f, 0x13f, HB_Letter_Uppercase}, - {0x140, 0x140, HB_Letter_Lowercase}, - {0x141, 0x141, HB_Letter_Uppercase}, - {0x142, 0x142, HB_Letter_Lowercase}, - {0x143, 0x143, HB_Letter_Uppercase}, - {0x144, 0x144, HB_Letter_Lowercase}, - {0x145, 0x145, HB_Letter_Uppercase}, - {0x146, 0x146, HB_Letter_Lowercase}, - {0x147, 0x147, HB_Letter_Uppercase}, - {0x148, 0x149, HB_Letter_Lowercase}, - {0x14a, 0x14a, HB_Letter_Uppercase}, - {0x14b, 0x14b, HB_Letter_Lowercase}, - {0x14c, 0x14c, HB_Letter_Uppercase}, - {0x14d, 0x14d, HB_Letter_Lowercase}, - {0x14e, 0x14e, HB_Letter_Uppercase}, - {0x14f, 0x14f, HB_Letter_Lowercase}, - {0x150, 0x150, HB_Letter_Uppercase}, - {0x151, 0x151, HB_Letter_Lowercase}, - {0x152, 0x152, HB_Letter_Uppercase}, - {0x153, 0x153, HB_Letter_Lowercase}, - {0x154, 0x154, HB_Letter_Uppercase}, - {0x155, 0x155, HB_Letter_Lowercase}, - {0x156, 0x156, HB_Letter_Uppercase}, - {0x157, 0x157, HB_Letter_Lowercase}, - {0x158, 0x158, HB_Letter_Uppercase}, - {0x159, 0x159, HB_Letter_Lowercase}, - {0x15a, 0x15a, HB_Letter_Uppercase}, - {0x15b, 0x15b, HB_Letter_Lowercase}, - {0x15c, 0x15c, HB_Letter_Uppercase}, - {0x15d, 0x15d, HB_Letter_Lowercase}, - {0x15e, 0x15e, HB_Letter_Uppercase}, - {0x15f, 0x15f, HB_Letter_Lowercase}, - {0x160, 0x160, HB_Letter_Uppercase}, - {0x161, 0x161, HB_Letter_Lowercase}, - {0x162, 0x162, HB_Letter_Uppercase}, - {0x163, 0x163, HB_Letter_Lowercase}, - {0x164, 0x164, HB_Letter_Uppercase}, - {0x165, 0x165, HB_Letter_Lowercase}, - {0x166, 0x166, HB_Letter_Uppercase}, - {0x167, 0x167, HB_Letter_Lowercase}, - {0x168, 0x168, HB_Letter_Uppercase}, - {0x169, 0x169, HB_Letter_Lowercase}, - {0x16a, 0x16a, HB_Letter_Uppercase}, - {0x16b, 0x16b, HB_Letter_Lowercase}, - {0x16c, 0x16c, HB_Letter_Uppercase}, - {0x16d, 0x16d, HB_Letter_Lowercase}, - {0x16e, 0x16e, HB_Letter_Uppercase}, - {0x16f, 0x16f, HB_Letter_Lowercase}, - {0x170, 0x170, HB_Letter_Uppercase}, - {0x171, 0x171, HB_Letter_Lowercase}, - {0x172, 0x172, HB_Letter_Uppercase}, - {0x173, 0x173, HB_Letter_Lowercase}, - {0x174, 0x174, HB_Letter_Uppercase}, - {0x175, 0x175, HB_Letter_Lowercase}, - {0x176, 0x176, HB_Letter_Uppercase}, - {0x177, 0x177, HB_Letter_Lowercase}, - {0x178, 0x179, HB_Letter_Uppercase}, - {0x17a, 0x17a, HB_Letter_Lowercase}, - {0x17b, 0x17b, HB_Letter_Uppercase}, - {0x17c, 0x17c, HB_Letter_Lowercase}, - {0x17d, 0x17d, HB_Letter_Uppercase}, - {0x17e, 0x180, HB_Letter_Lowercase}, - {0x181, 0x182, HB_Letter_Uppercase}, - {0x183, 0x183, HB_Letter_Lowercase}, - {0x184, 0x184, HB_Letter_Uppercase}, - {0x185, 0x185, HB_Letter_Lowercase}, - {0x186, 0x187, HB_Letter_Uppercase}, - {0x188, 0x188, HB_Letter_Lowercase}, - {0x189, 0x18b, HB_Letter_Uppercase}, - {0x18c, 0x18d, HB_Letter_Lowercase}, - {0x18e, 0x191, HB_Letter_Uppercase}, - {0x192, 0x192, HB_Letter_Lowercase}, - {0x193, 0x194, HB_Letter_Uppercase}, - {0x195, 0x195, HB_Letter_Lowercase}, - {0x196, 0x198, HB_Letter_Uppercase}, - {0x199, 0x19b, HB_Letter_Lowercase}, - {0x19c, 0x19d, HB_Letter_Uppercase}, - {0x19e, 0x19e, HB_Letter_Lowercase}, - {0x19f, 0x1a0, HB_Letter_Uppercase}, - {0x1a1, 0x1a1, HB_Letter_Lowercase}, - {0x1a2, 0x1a2, HB_Letter_Uppercase}, - {0x1a3, 0x1a3, HB_Letter_Lowercase}, - {0x1a4, 0x1a4, HB_Letter_Uppercase}, - {0x1a5, 0x1a5, HB_Letter_Lowercase}, - {0x1a6, 0x1a7, HB_Letter_Uppercase}, - {0x1a8, 0x1a8, HB_Letter_Lowercase}, - {0x1a9, 0x1a9, HB_Letter_Uppercase}, - {0x1aa, 0x1ab, HB_Letter_Lowercase}, - {0x1ac, 0x1ac, HB_Letter_Uppercase}, - {0x1ad, 0x1ad, HB_Letter_Lowercase}, - {0x1ae, 0x1af, HB_Letter_Uppercase}, - {0x1b0, 0x1b0, HB_Letter_Lowercase}, - {0x1b1, 0x1b3, HB_Letter_Uppercase}, - {0x1b4, 0x1b4, HB_Letter_Lowercase}, - {0x1b5, 0x1b5, HB_Letter_Uppercase}, - {0x1b6, 0x1b6, HB_Letter_Lowercase}, - {0x1b7, 0x1b8, HB_Letter_Uppercase}, - {0x1b9, 0x1ba, HB_Letter_Lowercase}, - {0x1bb, 0x1bb, HB_Letter_Other}, - {0x1bc, 0x1bc, HB_Letter_Uppercase}, - {0x1bd, 0x1bf, HB_Letter_Lowercase}, - {0x1c0, 0x1c3, HB_Letter_Other}, - {0x1c4, 0x1c4, HB_Letter_Uppercase}, - {0x1c5, 0x1c5, HB_Letter_Titlecase}, - {0x1c6, 0x1c6, HB_Letter_Lowercase}, - {0x1c7, 0x1c7, HB_Letter_Uppercase}, - {0x1c8, 0x1c8, HB_Letter_Titlecase}, - {0x1c9, 0x1c9, HB_Letter_Lowercase}, - {0x1ca, 0x1ca, HB_Letter_Uppercase}, - {0x1cb, 0x1cb, HB_Letter_Titlecase}, - {0x1cc, 0x1cc, HB_Letter_Lowercase}, - {0x1cd, 0x1cd, HB_Letter_Uppercase}, - {0x1ce, 0x1ce, HB_Letter_Lowercase}, - {0x1cf, 0x1cf, HB_Letter_Uppercase}, - {0x1d0, 0x1d0, HB_Letter_Lowercase}, - {0x1d1, 0x1d1, HB_Letter_Uppercase}, - {0x1d2, 0x1d2, HB_Letter_Lowercase}, - {0x1d3, 0x1d3, HB_Letter_Uppercase}, - {0x1d4, 0x1d4, HB_Letter_Lowercase}, - {0x1d5, 0x1d5, HB_Letter_Uppercase}, - {0x1d6, 0x1d6, HB_Letter_Lowercase}, - {0x1d7, 0x1d7, HB_Letter_Uppercase}, - {0x1d8, 0x1d8, HB_Letter_Lowercase}, - {0x1d9, 0x1d9, HB_Letter_Uppercase}, - {0x1da, 0x1da, HB_Letter_Lowercase}, - {0x1db, 0x1db, HB_Letter_Uppercase}, - {0x1dc, 0x1dd, HB_Letter_Lowercase}, - {0x1de, 0x1de, HB_Letter_Uppercase}, - {0x1df, 0x1df, HB_Letter_Lowercase}, - {0x1e0, 0x1e0, HB_Letter_Uppercase}, - {0x1e1, 0x1e1, HB_Letter_Lowercase}, - {0x1e2, 0x1e2, HB_Letter_Uppercase}, - {0x1e3, 0x1e3, HB_Letter_Lowercase}, - {0x1e4, 0x1e4, HB_Letter_Uppercase}, - {0x1e5, 0x1e5, HB_Letter_Lowercase}, - {0x1e6, 0x1e6, HB_Letter_Uppercase}, - {0x1e7, 0x1e7, HB_Letter_Lowercase}, - {0x1e8, 0x1e8, HB_Letter_Uppercase}, - {0x1e9, 0x1e9, HB_Letter_Lowercase}, - {0x1ea, 0x1ea, HB_Letter_Uppercase}, - {0x1eb, 0x1eb, HB_Letter_Lowercase}, - {0x1ec, 0x1ec, HB_Letter_Uppercase}, - {0x1ed, 0x1ed, HB_Letter_Lowercase}, - {0x1ee, 0x1ee, HB_Letter_Uppercase}, - {0x1ef, 0x1f0, HB_Letter_Lowercase}, - {0x1f1, 0x1f1, HB_Letter_Uppercase}, - {0x1f2, 0x1f2, HB_Letter_Titlecase}, - {0x1f3, 0x1f3, HB_Letter_Lowercase}, - {0x1f4, 0x1f4, HB_Letter_Uppercase}, - {0x1f5, 0x1f5, HB_Letter_Lowercase}, - {0x1f6, 0x1f8, HB_Letter_Uppercase}, - {0x1f9, 0x1f9, HB_Letter_Lowercase}, - {0x1fa, 0x1fa, HB_Letter_Uppercase}, - {0x1fb, 0x1fb, HB_Letter_Lowercase}, - {0x1fc, 0x1fc, HB_Letter_Uppercase}, - {0x1fd, 0x1fd, HB_Letter_Lowercase}, - {0x1fe, 0x1fe, HB_Letter_Uppercase}, - {0x1ff, 0x1ff, HB_Letter_Lowercase}, - {0x200, 0x200, HB_Letter_Uppercase}, - {0x201, 0x201, HB_Letter_Lowercase}, - {0x202, 0x202, HB_Letter_Uppercase}, - {0x203, 0x203, HB_Letter_Lowercase}, - {0x204, 0x204, HB_Letter_Uppercase}, - {0x205, 0x205, HB_Letter_Lowercase}, - {0x206, 0x206, HB_Letter_Uppercase}, - {0x207, 0x207, HB_Letter_Lowercase}, - {0x208, 0x208, HB_Letter_Uppercase}, - {0x209, 0x209, HB_Letter_Lowercase}, - {0x20a, 0x20a, HB_Letter_Uppercase}, - {0x20b, 0x20b, HB_Letter_Lowercase}, - {0x20c, 0x20c, HB_Letter_Uppercase}, - {0x20d, 0x20d, HB_Letter_Lowercase}, - {0x20e, 0x20e, HB_Letter_Uppercase}, - {0x20f, 0x20f, HB_Letter_Lowercase}, - {0x210, 0x210, HB_Letter_Uppercase}, - {0x211, 0x211, HB_Letter_Lowercase}, - {0x212, 0x212, HB_Letter_Uppercase}, - {0x213, 0x213, HB_Letter_Lowercase}, - {0x214, 0x214, HB_Letter_Uppercase}, - {0x215, 0x215, HB_Letter_Lowercase}, - {0x216, 0x216, HB_Letter_Uppercase}, - {0x217, 0x217, HB_Letter_Lowercase}, - {0x218, 0x218, HB_Letter_Uppercase}, - {0x219, 0x219, HB_Letter_Lowercase}, - {0x21a, 0x21a, HB_Letter_Uppercase}, - {0x21b, 0x21b, HB_Letter_Lowercase}, - {0x21c, 0x21c, HB_Letter_Uppercase}, - {0x21d, 0x21d, HB_Letter_Lowercase}, - {0x21e, 0x21e, HB_Letter_Uppercase}, - {0x21f, 0x21f, HB_Letter_Lowercase}, - {0x220, 0x220, HB_Letter_Uppercase}, - {0x221, 0x221, HB_Letter_Lowercase}, - {0x222, 0x222, HB_Letter_Uppercase}, - {0x223, 0x223, HB_Letter_Lowercase}, - {0x224, 0x224, HB_Letter_Uppercase}, - {0x225, 0x225, HB_Letter_Lowercase}, - {0x226, 0x226, HB_Letter_Uppercase}, - {0x227, 0x227, HB_Letter_Lowercase}, - {0x228, 0x228, HB_Letter_Uppercase}, - {0x229, 0x229, HB_Letter_Lowercase}, - {0x22a, 0x22a, HB_Letter_Uppercase}, - {0x22b, 0x22b, HB_Letter_Lowercase}, - {0x22c, 0x22c, HB_Letter_Uppercase}, - {0x22d, 0x22d, HB_Letter_Lowercase}, - {0x22e, 0x22e, HB_Letter_Uppercase}, - {0x22f, 0x22f, HB_Letter_Lowercase}, - {0x230, 0x230, HB_Letter_Uppercase}, - {0x231, 0x231, HB_Letter_Lowercase}, - {0x232, 0x232, HB_Letter_Uppercase}, - {0x233, 0x239, HB_Letter_Lowercase}, - {0x23a, 0x23b, HB_Letter_Uppercase}, - {0x23c, 0x23c, HB_Letter_Lowercase}, - {0x23d, 0x23e, HB_Letter_Uppercase}, - {0x23f, 0x240, HB_Letter_Lowercase}, - {0x241, 0x241, HB_Letter_Uppercase}, - {0x242, 0x242, HB_Letter_Lowercase}, - {0x243, 0x246, HB_Letter_Uppercase}, - {0x247, 0x247, HB_Letter_Lowercase}, - {0x248, 0x248, HB_Letter_Uppercase}, - {0x249, 0x249, HB_Letter_Lowercase}, - {0x24a, 0x24a, HB_Letter_Uppercase}, - {0x24b, 0x24b, HB_Letter_Lowercase}, - {0x24c, 0x24c, HB_Letter_Uppercase}, - {0x24d, 0x24d, HB_Letter_Lowercase}, - {0x24e, 0x24e, HB_Letter_Uppercase}, - {0x24f, 0x293, HB_Letter_Lowercase}, - {0x294, 0x294, HB_Letter_Other}, - {0x295, 0x2af, HB_Letter_Lowercase}, - {0x2b0, 0x2c1, HB_Letter_Modifier}, - {0x2c2, 0x2c5, HB_Symbol_Modifier}, - {0x2c6, 0x2d1, HB_Letter_Modifier}, - {0x2d2, 0x2df, HB_Symbol_Modifier}, - {0x2e0, 0x2e4, HB_Letter_Modifier}, - {0x2e5, 0x2eb, HB_Symbol_Modifier}, - {0x2ec, 0x2ec, HB_Letter_Modifier}, - {0x2ed, 0x2ed, HB_Symbol_Modifier}, - {0x2ee, 0x2ee, HB_Letter_Modifier}, - {0x2ef, 0x2ff, HB_Symbol_Modifier}, - {0x300, 0x36f, HB_Mark_NonSpacing}, - {0x370, 0x370, HB_Letter_Uppercase}, - {0x371, 0x371, HB_Letter_Lowercase}, - {0x372, 0x372, HB_Letter_Uppercase}, - {0x373, 0x373, HB_Letter_Lowercase}, - {0x374, 0x374, HB_Letter_Modifier}, - {0x375, 0x375, HB_Symbol_Modifier}, - {0x376, 0x376, HB_Letter_Uppercase}, - {0x377, 0x377, HB_Letter_Lowercase}, - {0x378, 0x379, HB_Other_NotAssigned}, - {0x37a, 0x37a, HB_Letter_Modifier}, - {0x37b, 0x37d, HB_Letter_Lowercase}, - {0x37e, 0x37e, HB_Punctuation_Other}, - {0x37f, 0x383, HB_Other_NotAssigned}, - {0x384, 0x385, HB_Symbol_Modifier}, - {0x386, 0x386, HB_Letter_Uppercase}, - {0x387, 0x387, HB_Punctuation_Other}, - {0x388, 0x38a, HB_Letter_Uppercase}, - {0x38b, 0x38b, HB_Other_NotAssigned}, - {0x38c, 0x38c, HB_Letter_Uppercase}, - {0x38d, 0x38d, HB_Other_NotAssigned}, - {0x38e, 0x38f, HB_Letter_Uppercase}, - {0x390, 0x390, HB_Letter_Lowercase}, - {0x391, 0x3a1, HB_Letter_Uppercase}, - {0x3a2, 0x3a2, HB_Other_NotAssigned}, - {0x3a3, 0x3ab, HB_Letter_Uppercase}, - {0x3ac, 0x3ce, HB_Letter_Lowercase}, - {0x3cf, 0x3cf, HB_Letter_Uppercase}, - {0x3d0, 0x3d1, HB_Letter_Lowercase}, - {0x3d2, 0x3d4, HB_Letter_Uppercase}, - {0x3d5, 0x3d7, HB_Letter_Lowercase}, - {0x3d8, 0x3d8, HB_Letter_Uppercase}, - {0x3d9, 0x3d9, HB_Letter_Lowercase}, - {0x3da, 0x3da, HB_Letter_Uppercase}, - {0x3db, 0x3db, HB_Letter_Lowercase}, - {0x3dc, 0x3dc, HB_Letter_Uppercase}, - {0x3dd, 0x3dd, HB_Letter_Lowercase}, - {0x3de, 0x3de, HB_Letter_Uppercase}, - {0x3df, 0x3df, HB_Letter_Lowercase}, - {0x3e0, 0x3e0, HB_Letter_Uppercase}, - {0x3e1, 0x3e1, HB_Letter_Lowercase}, - {0x3e2, 0x3e2, HB_Letter_Uppercase}, - {0x3e3, 0x3e3, HB_Letter_Lowercase}, - {0x3e4, 0x3e4, HB_Letter_Uppercase}, - {0x3e5, 0x3e5, HB_Letter_Lowercase}, - {0x3e6, 0x3e6, HB_Letter_Uppercase}, - {0x3e7, 0x3e7, HB_Letter_Lowercase}, - {0x3e8, 0x3e8, HB_Letter_Uppercase}, - {0x3e9, 0x3e9, HB_Letter_Lowercase}, - {0x3ea, 0x3ea, HB_Letter_Uppercase}, - {0x3eb, 0x3eb, HB_Letter_Lowercase}, - {0x3ec, 0x3ec, HB_Letter_Uppercase}, - {0x3ed, 0x3ed, HB_Letter_Lowercase}, - {0x3ee, 0x3ee, HB_Letter_Uppercase}, - {0x3ef, 0x3f3, HB_Letter_Lowercase}, - {0x3f4, 0x3f4, HB_Letter_Uppercase}, - {0x3f5, 0x3f5, HB_Letter_Lowercase}, - {0x3f6, 0x3f6, HB_Symbol_Math}, - {0x3f7, 0x3f7, HB_Letter_Uppercase}, - {0x3f8, 0x3f8, HB_Letter_Lowercase}, - {0x3f9, 0x3fa, HB_Letter_Uppercase}, - {0x3fb, 0x3fc, HB_Letter_Lowercase}, - {0x3fd, 0x42f, HB_Letter_Uppercase}, - {0x430, 0x45f, HB_Letter_Lowercase}, - {0x460, 0x460, HB_Letter_Uppercase}, - {0x461, 0x461, HB_Letter_Lowercase}, - {0x462, 0x462, HB_Letter_Uppercase}, - {0x463, 0x463, HB_Letter_Lowercase}, - {0x464, 0x464, HB_Letter_Uppercase}, - {0x465, 0x465, HB_Letter_Lowercase}, - {0x466, 0x466, HB_Letter_Uppercase}, - {0x467, 0x467, HB_Letter_Lowercase}, - {0x468, 0x468, HB_Letter_Uppercase}, - {0x469, 0x469, HB_Letter_Lowercase}, - {0x46a, 0x46a, HB_Letter_Uppercase}, - {0x46b, 0x46b, HB_Letter_Lowercase}, - {0x46c, 0x46c, HB_Letter_Uppercase}, - {0x46d, 0x46d, HB_Letter_Lowercase}, - {0x46e, 0x46e, HB_Letter_Uppercase}, - {0x46f, 0x46f, HB_Letter_Lowercase}, - {0x470, 0x470, HB_Letter_Uppercase}, - {0x471, 0x471, HB_Letter_Lowercase}, - {0x472, 0x472, HB_Letter_Uppercase}, - {0x473, 0x473, HB_Letter_Lowercase}, - {0x474, 0x474, HB_Letter_Uppercase}, - {0x475, 0x475, HB_Letter_Lowercase}, - {0x476, 0x476, HB_Letter_Uppercase}, - {0x477, 0x477, HB_Letter_Lowercase}, - {0x478, 0x478, HB_Letter_Uppercase}, - {0x479, 0x479, HB_Letter_Lowercase}, - {0x47a, 0x47a, HB_Letter_Uppercase}, - {0x47b, 0x47b, HB_Letter_Lowercase}, - {0x47c, 0x47c, HB_Letter_Uppercase}, - {0x47d, 0x47d, HB_Letter_Lowercase}, - {0x47e, 0x47e, HB_Letter_Uppercase}, - {0x47f, 0x47f, HB_Letter_Lowercase}, - {0x480, 0x480, HB_Letter_Uppercase}, - {0x481, 0x481, HB_Letter_Lowercase}, - {0x482, 0x482, HB_Symbol_Other}, - {0x483, 0x487, HB_Mark_NonSpacing}, - {0x488, 0x489, HB_Mark_Enclosing}, - {0x48a, 0x48a, HB_Letter_Uppercase}, - {0x48b, 0x48b, HB_Letter_Lowercase}, - {0x48c, 0x48c, HB_Letter_Uppercase}, - {0x48d, 0x48d, HB_Letter_Lowercase}, - {0x48e, 0x48e, HB_Letter_Uppercase}, - {0x48f, 0x48f, HB_Letter_Lowercase}, - {0x490, 0x490, HB_Letter_Uppercase}, - {0x491, 0x491, HB_Letter_Lowercase}, - {0x492, 0x492, HB_Letter_Uppercase}, - {0x493, 0x493, HB_Letter_Lowercase}, - {0x494, 0x494, HB_Letter_Uppercase}, - {0x495, 0x495, HB_Letter_Lowercase}, - {0x496, 0x496, HB_Letter_Uppercase}, - {0x497, 0x497, HB_Letter_Lowercase}, - {0x498, 0x498, HB_Letter_Uppercase}, - {0x499, 0x499, HB_Letter_Lowercase}, - {0x49a, 0x49a, HB_Letter_Uppercase}, - {0x49b, 0x49b, HB_Letter_Lowercase}, - {0x49c, 0x49c, HB_Letter_Uppercase}, - {0x49d, 0x49d, HB_Letter_Lowercase}, - {0x49e, 0x49e, HB_Letter_Uppercase}, - {0x49f, 0x49f, HB_Letter_Lowercase}, - {0x4a0, 0x4a0, HB_Letter_Uppercase}, - {0x4a1, 0x4a1, HB_Letter_Lowercase}, - {0x4a2, 0x4a2, HB_Letter_Uppercase}, - {0x4a3, 0x4a3, HB_Letter_Lowercase}, - {0x4a4, 0x4a4, HB_Letter_Uppercase}, - {0x4a5, 0x4a5, HB_Letter_Lowercase}, - {0x4a6, 0x4a6, HB_Letter_Uppercase}, - {0x4a7, 0x4a7, HB_Letter_Lowercase}, - {0x4a8, 0x4a8, HB_Letter_Uppercase}, - {0x4a9, 0x4a9, HB_Letter_Lowercase}, - {0x4aa, 0x4aa, HB_Letter_Uppercase}, - {0x4ab, 0x4ab, HB_Letter_Lowercase}, - {0x4ac, 0x4ac, HB_Letter_Uppercase}, - {0x4ad, 0x4ad, HB_Letter_Lowercase}, - {0x4ae, 0x4ae, HB_Letter_Uppercase}, - {0x4af, 0x4af, HB_Letter_Lowercase}, - {0x4b0, 0x4b0, HB_Letter_Uppercase}, - {0x4b1, 0x4b1, HB_Letter_Lowercase}, - {0x4b2, 0x4b2, HB_Letter_Uppercase}, - {0x4b3, 0x4b3, HB_Letter_Lowercase}, - {0x4b4, 0x4b4, HB_Letter_Uppercase}, - {0x4b5, 0x4b5, HB_Letter_Lowercase}, - {0x4b6, 0x4b6, HB_Letter_Uppercase}, - {0x4b7, 0x4b7, HB_Letter_Lowercase}, - {0x4b8, 0x4b8, HB_Letter_Uppercase}, - {0x4b9, 0x4b9, HB_Letter_Lowercase}, - {0x4ba, 0x4ba, HB_Letter_Uppercase}, - {0x4bb, 0x4bb, HB_Letter_Lowercase}, - {0x4bc, 0x4bc, HB_Letter_Uppercase}, - {0x4bd, 0x4bd, HB_Letter_Lowercase}, - {0x4be, 0x4be, HB_Letter_Uppercase}, - {0x4bf, 0x4bf, HB_Letter_Lowercase}, - {0x4c0, 0x4c1, HB_Letter_Uppercase}, - {0x4c2, 0x4c2, HB_Letter_Lowercase}, - {0x4c3, 0x4c3, HB_Letter_Uppercase}, - {0x4c4, 0x4c4, HB_Letter_Lowercase}, - {0x4c5, 0x4c5, HB_Letter_Uppercase}, - {0x4c6, 0x4c6, HB_Letter_Lowercase}, - {0x4c7, 0x4c7, HB_Letter_Uppercase}, - {0x4c8, 0x4c8, HB_Letter_Lowercase}, - {0x4c9, 0x4c9, HB_Letter_Uppercase}, - {0x4ca, 0x4ca, HB_Letter_Lowercase}, - {0x4cb, 0x4cb, HB_Letter_Uppercase}, - {0x4cc, 0x4cc, HB_Letter_Lowercase}, - {0x4cd, 0x4cd, HB_Letter_Uppercase}, - {0x4ce, 0x4cf, HB_Letter_Lowercase}, - {0x4d0, 0x4d0, HB_Letter_Uppercase}, - {0x4d1, 0x4d1, HB_Letter_Lowercase}, - {0x4d2, 0x4d2, HB_Letter_Uppercase}, - {0x4d3, 0x4d3, HB_Letter_Lowercase}, - {0x4d4, 0x4d4, HB_Letter_Uppercase}, - {0x4d5, 0x4d5, HB_Letter_Lowercase}, - {0x4d6, 0x4d6, HB_Letter_Uppercase}, - {0x4d7, 0x4d7, HB_Letter_Lowercase}, - {0x4d8, 0x4d8, HB_Letter_Uppercase}, - {0x4d9, 0x4d9, HB_Letter_Lowercase}, - {0x4da, 0x4da, HB_Letter_Uppercase}, - {0x4db, 0x4db, HB_Letter_Lowercase}, - {0x4dc, 0x4dc, HB_Letter_Uppercase}, - {0x4dd, 0x4dd, HB_Letter_Lowercase}, - {0x4de, 0x4de, HB_Letter_Uppercase}, - {0x4df, 0x4df, HB_Letter_Lowercase}, - {0x4e0, 0x4e0, HB_Letter_Uppercase}, - {0x4e1, 0x4e1, HB_Letter_Lowercase}, - {0x4e2, 0x4e2, HB_Letter_Uppercase}, - {0x4e3, 0x4e3, HB_Letter_Lowercase}, - {0x4e4, 0x4e4, HB_Letter_Uppercase}, - {0x4e5, 0x4e5, HB_Letter_Lowercase}, - {0x4e6, 0x4e6, HB_Letter_Uppercase}, - {0x4e7, 0x4e7, HB_Letter_Lowercase}, - {0x4e8, 0x4e8, HB_Letter_Uppercase}, - {0x4e9, 0x4e9, HB_Letter_Lowercase}, - {0x4ea, 0x4ea, HB_Letter_Uppercase}, - {0x4eb, 0x4eb, HB_Letter_Lowercase}, - {0x4ec, 0x4ec, HB_Letter_Uppercase}, - {0x4ed, 0x4ed, HB_Letter_Lowercase}, - {0x4ee, 0x4ee, HB_Letter_Uppercase}, - {0x4ef, 0x4ef, HB_Letter_Lowercase}, - {0x4f0, 0x4f0, HB_Letter_Uppercase}, - {0x4f1, 0x4f1, HB_Letter_Lowercase}, - {0x4f2, 0x4f2, HB_Letter_Uppercase}, - {0x4f3, 0x4f3, HB_Letter_Lowercase}, - {0x4f4, 0x4f4, HB_Letter_Uppercase}, - {0x4f5, 0x4f5, HB_Letter_Lowercase}, - {0x4f6, 0x4f6, HB_Letter_Uppercase}, - {0x4f7, 0x4f7, HB_Letter_Lowercase}, - {0x4f8, 0x4f8, HB_Letter_Uppercase}, - {0x4f9, 0x4f9, HB_Letter_Lowercase}, - {0x4fa, 0x4fa, HB_Letter_Uppercase}, - {0x4fb, 0x4fb, HB_Letter_Lowercase}, - {0x4fc, 0x4fc, HB_Letter_Uppercase}, - {0x4fd, 0x4fd, HB_Letter_Lowercase}, - {0x4fe, 0x4fe, HB_Letter_Uppercase}, - {0x4ff, 0x4ff, HB_Letter_Lowercase}, - {0x500, 0x500, HB_Letter_Uppercase}, - {0x501, 0x501, HB_Letter_Lowercase}, - {0x502, 0x502, HB_Letter_Uppercase}, - {0x503, 0x503, HB_Letter_Lowercase}, - {0x504, 0x504, HB_Letter_Uppercase}, - {0x505, 0x505, HB_Letter_Lowercase}, - {0x506, 0x506, HB_Letter_Uppercase}, - {0x507, 0x507, HB_Letter_Lowercase}, - {0x508, 0x508, HB_Letter_Uppercase}, - {0x509, 0x509, HB_Letter_Lowercase}, - {0x50a, 0x50a, HB_Letter_Uppercase}, - {0x50b, 0x50b, HB_Letter_Lowercase}, - {0x50c, 0x50c, HB_Letter_Uppercase}, - {0x50d, 0x50d, HB_Letter_Lowercase}, - {0x50e, 0x50e, HB_Letter_Uppercase}, - {0x50f, 0x50f, HB_Letter_Lowercase}, - {0x510, 0x510, HB_Letter_Uppercase}, - {0x511, 0x511, HB_Letter_Lowercase}, - {0x512, 0x512, HB_Letter_Uppercase}, - {0x513, 0x513, HB_Letter_Lowercase}, - {0x514, 0x514, HB_Letter_Uppercase}, - {0x515, 0x515, HB_Letter_Lowercase}, - {0x516, 0x516, HB_Letter_Uppercase}, - {0x517, 0x517, HB_Letter_Lowercase}, - {0x518, 0x518, HB_Letter_Uppercase}, - {0x519, 0x519, HB_Letter_Lowercase}, - {0x51a, 0x51a, HB_Letter_Uppercase}, - {0x51b, 0x51b, HB_Letter_Lowercase}, - {0x51c, 0x51c, HB_Letter_Uppercase}, - {0x51d, 0x51d, HB_Letter_Lowercase}, - {0x51e, 0x51e, HB_Letter_Uppercase}, - {0x51f, 0x51f, HB_Letter_Lowercase}, - {0x520, 0x520, HB_Letter_Uppercase}, - {0x521, 0x521, HB_Letter_Lowercase}, - {0x522, 0x522, HB_Letter_Uppercase}, - {0x523, 0x523, HB_Letter_Lowercase}, - {0x524, 0x530, HB_Other_NotAssigned}, - {0x531, 0x556, HB_Letter_Uppercase}, - {0x557, 0x558, HB_Other_NotAssigned}, - {0x559, 0x559, HB_Letter_Modifier}, - {0x55a, 0x55f, HB_Punctuation_Other}, - {0x560, 0x560, HB_Other_NotAssigned}, - {0x561, 0x587, HB_Letter_Lowercase}, - {0x588, 0x588, HB_Other_NotAssigned}, - {0x589, 0x589, HB_Punctuation_Other}, - {0x58a, 0x58a, HB_Punctuation_Dash}, - {0x58b, 0x590, HB_Other_NotAssigned}, - {0x591, 0x5bd, HB_Mark_NonSpacing}, - {0x5be, 0x5be, HB_Punctuation_Dash}, - {0x5bf, 0x5bf, HB_Mark_NonSpacing}, - {0x5c0, 0x5c0, HB_Punctuation_Other}, - {0x5c1, 0x5c2, HB_Mark_NonSpacing}, - {0x5c3, 0x5c3, HB_Punctuation_Other}, - {0x5c4, 0x5c5, HB_Mark_NonSpacing}, - {0x5c6, 0x5c6, HB_Punctuation_Other}, - {0x5c7, 0x5c7, HB_Mark_NonSpacing}, - {0x5c8, 0x5cf, HB_Other_NotAssigned}, - {0x5d0, 0x5ea, HB_Letter_Other}, - {0x5eb, 0x5ef, HB_Other_NotAssigned}, - {0x5f0, 0x5f2, HB_Letter_Other}, - {0x5f3, 0x5f4, HB_Punctuation_Other}, - {0x5f5, 0x5ff, HB_Other_NotAssigned}, - {0x600, 0x603, HB_Other_Format}, - {0x604, 0x605, HB_Other_NotAssigned}, - {0x606, 0x608, HB_Symbol_Math}, - {0x609, 0x60a, HB_Punctuation_Other}, - {0x60b, 0x60b, HB_Symbol_Currency}, - {0x60c, 0x60d, HB_Punctuation_Other}, - {0x60e, 0x60f, HB_Symbol_Other}, - {0x610, 0x61a, HB_Mark_NonSpacing}, - {0x61b, 0x61b, HB_Punctuation_Other}, - {0x61c, 0x61d, HB_Other_NotAssigned}, - {0x61e, 0x61f, HB_Punctuation_Other}, - {0x620, 0x620, HB_Other_NotAssigned}, - {0x621, 0x63f, HB_Letter_Other}, - {0x640, 0x640, HB_Letter_Modifier}, - {0x641, 0x64a, HB_Letter_Other}, - {0x64b, 0x65e, HB_Mark_NonSpacing}, - {0x65f, 0x65f, HB_Other_NotAssigned}, - {0x660, 0x669, HB_Number_DecimalDigit}, - {0x66a, 0x66d, HB_Punctuation_Other}, - {0x66e, 0x66f, HB_Letter_Other}, - {0x670, 0x670, HB_Mark_NonSpacing}, - {0x671, 0x6d3, HB_Letter_Other}, - {0x6d4, 0x6d4, HB_Punctuation_Other}, - {0x6d5, 0x6d5, HB_Letter_Other}, - {0x6d6, 0x6dc, HB_Mark_NonSpacing}, - {0x6dd, 0x6dd, HB_Other_Format}, - {0x6de, 0x6de, HB_Mark_Enclosing}, - {0x6df, 0x6e4, HB_Mark_NonSpacing}, - {0x6e5, 0x6e6, HB_Letter_Modifier}, - {0x6e7, 0x6e8, HB_Mark_NonSpacing}, - {0x6e9, 0x6e9, HB_Symbol_Other}, - {0x6ea, 0x6ed, HB_Mark_NonSpacing}, - {0x6ee, 0x6ef, HB_Letter_Other}, - {0x6f0, 0x6f9, HB_Number_DecimalDigit}, - {0x6fa, 0x6fc, HB_Letter_Other}, - {0x6fd, 0x6fe, HB_Symbol_Other}, - {0x6ff, 0x6ff, HB_Letter_Other}, - {0x700, 0x70d, HB_Punctuation_Other}, - {0x70e, 0x70e, HB_Other_NotAssigned}, - {0x70f, 0x70f, HB_Other_Format}, - {0x710, 0x710, HB_Letter_Other}, - {0x711, 0x711, HB_Mark_NonSpacing}, - {0x712, 0x72f, HB_Letter_Other}, - {0x730, 0x74a, HB_Mark_NonSpacing}, - {0x74b, 0x74c, HB_Other_NotAssigned}, - {0x74d, 0x7a5, HB_Letter_Other}, - {0x7a6, 0x7b0, HB_Mark_NonSpacing}, - {0x7b1, 0x7b1, HB_Letter_Other}, - {0x7b2, 0x7bf, HB_Other_NotAssigned}, - {0x7c0, 0x7c9, HB_Number_DecimalDigit}, - {0x7ca, 0x7ea, HB_Letter_Other}, - {0x7eb, 0x7f3, HB_Mark_NonSpacing}, - {0x7f4, 0x7f5, HB_Letter_Modifier}, - {0x7f6, 0x7f6, HB_Symbol_Other}, - {0x7f7, 0x7f9, HB_Punctuation_Other}, - {0x7fa, 0x7fa, HB_Letter_Modifier}, - {0x7fb, 0x900, HB_Other_NotAssigned}, - {0x901, 0x902, HB_Mark_NonSpacing}, - {0x903, 0x903, HB_Mark_SpacingCombining}, - {0x904, 0x939, HB_Letter_Other}, - {0x93a, 0x93b, HB_Other_NotAssigned}, - {0x93c, 0x93c, HB_Mark_NonSpacing}, - {0x93d, 0x93d, HB_Letter_Other}, - {0x93e, 0x940, HB_Mark_SpacingCombining}, - {0x941, 0x948, HB_Mark_NonSpacing}, - {0x949, 0x94c, HB_Mark_SpacingCombining}, - {0x94d, 0x94d, HB_Mark_NonSpacing}, - {0x94e, 0x94f, HB_Other_NotAssigned}, - {0x950, 0x950, HB_Letter_Other}, - {0x951, 0x954, HB_Mark_NonSpacing}, - {0x955, 0x957, HB_Other_NotAssigned}, - {0x958, 0x961, HB_Letter_Other}, - {0x962, 0x963, HB_Mark_NonSpacing}, - {0x964, 0x965, HB_Punctuation_Other}, - {0x966, 0x96f, HB_Number_DecimalDigit}, - {0x970, 0x970, HB_Punctuation_Other}, - {0x971, 0x971, HB_Letter_Modifier}, - {0x972, 0x972, HB_Letter_Other}, - {0x973, 0x97a, HB_Other_NotAssigned}, - {0x97b, 0x97f, HB_Letter_Other}, - {0x980, 0x980, HB_Other_NotAssigned}, - {0x981, 0x981, HB_Mark_NonSpacing}, - {0x982, 0x983, HB_Mark_SpacingCombining}, - {0x984, 0x984, HB_Other_NotAssigned}, - {0x985, 0x98c, HB_Letter_Other}, - {0x98d, 0x98e, HB_Other_NotAssigned}, - {0x98f, 0x990, HB_Letter_Other}, - {0x991, 0x992, HB_Other_NotAssigned}, - {0x993, 0x9a8, HB_Letter_Other}, - {0x9a9, 0x9a9, HB_Other_NotAssigned}, - {0x9aa, 0x9b0, HB_Letter_Other}, - {0x9b1, 0x9b1, HB_Other_NotAssigned}, - {0x9b2, 0x9b2, HB_Letter_Other}, - {0x9b3, 0x9b5, HB_Other_NotAssigned}, - {0x9b6, 0x9b9, HB_Letter_Other}, - {0x9ba, 0x9bb, HB_Other_NotAssigned}, - {0x9bc, 0x9bc, HB_Mark_NonSpacing}, - {0x9bd, 0x9bd, HB_Letter_Other}, - {0x9be, 0x9c0, HB_Mark_SpacingCombining}, - {0x9c1, 0x9c4, HB_Mark_NonSpacing}, - {0x9c5, 0x9c6, HB_Other_NotAssigned}, - {0x9c7, 0x9c8, HB_Mark_SpacingCombining}, - {0x9c9, 0x9ca, HB_Other_NotAssigned}, - {0x9cb, 0x9cc, HB_Mark_SpacingCombining}, - {0x9cd, 0x9cd, HB_Mark_NonSpacing}, - {0x9ce, 0x9ce, HB_Letter_Other}, - {0x9cf, 0x9d6, HB_Other_NotAssigned}, - {0x9d7, 0x9d7, HB_Mark_SpacingCombining}, - {0x9d8, 0x9db, HB_Other_NotAssigned}, - {0x9dc, 0x9dd, HB_Letter_Other}, - {0x9de, 0x9de, HB_Other_NotAssigned}, - {0x9df, 0x9e1, HB_Letter_Other}, - {0x9e2, 0x9e3, HB_Mark_NonSpacing}, - {0x9e4, 0x9e5, HB_Other_NotAssigned}, - {0x9e6, 0x9ef, HB_Number_DecimalDigit}, - {0x9f0, 0x9f1, HB_Letter_Other}, - {0x9f2, 0x9f3, HB_Symbol_Currency}, - {0x9f4, 0x9f9, HB_Number_Other}, - {0x9fa, 0x9fa, HB_Symbol_Other}, - {0x9fb, 0xa00, HB_Other_NotAssigned}, - {0xa01, 0xa02, HB_Mark_NonSpacing}, - {0xa03, 0xa03, HB_Mark_SpacingCombining}, - {0xa04, 0xa04, HB_Other_NotAssigned}, - {0xa05, 0xa0a, HB_Letter_Other}, - {0xa0b, 0xa0e, HB_Other_NotAssigned}, - {0xa0f, 0xa10, HB_Letter_Other}, - {0xa11, 0xa12, HB_Other_NotAssigned}, - {0xa13, 0xa28, HB_Letter_Other}, - {0xa29, 0xa29, HB_Other_NotAssigned}, - {0xa2a, 0xa30, HB_Letter_Other}, - {0xa31, 0xa31, HB_Other_NotAssigned}, - {0xa32, 0xa33, HB_Letter_Other}, - {0xa34, 0xa34, HB_Other_NotAssigned}, - {0xa35, 0xa36, HB_Letter_Other}, - {0xa37, 0xa37, HB_Other_NotAssigned}, - {0xa38, 0xa39, HB_Letter_Other}, - {0xa3a, 0xa3b, HB_Other_NotAssigned}, - {0xa3c, 0xa3c, HB_Mark_NonSpacing}, - {0xa3d, 0xa3d, HB_Other_NotAssigned}, - {0xa3e, 0xa40, HB_Mark_SpacingCombining}, - {0xa41, 0xa42, HB_Mark_NonSpacing}, - {0xa43, 0xa46, HB_Other_NotAssigned}, - {0xa47, 0xa48, HB_Mark_NonSpacing}, - {0xa49, 0xa4a, HB_Other_NotAssigned}, - {0xa4b, 0xa4d, HB_Mark_NonSpacing}, - {0xa4e, 0xa50, HB_Other_NotAssigned}, - {0xa51, 0xa51, HB_Mark_NonSpacing}, - {0xa52, 0xa58, HB_Other_NotAssigned}, - {0xa59, 0xa5c, HB_Letter_Other}, - {0xa5d, 0xa5d, HB_Other_NotAssigned}, - {0xa5e, 0xa5e, HB_Letter_Other}, - {0xa5f, 0xa65, HB_Other_NotAssigned}, - {0xa66, 0xa6f, HB_Number_DecimalDigit}, - {0xa70, 0xa71, HB_Mark_NonSpacing}, - {0xa72, 0xa74, HB_Letter_Other}, - {0xa75, 0xa75, HB_Mark_NonSpacing}, - {0xa76, 0xa80, HB_Other_NotAssigned}, - {0xa81, 0xa82, HB_Mark_NonSpacing}, - {0xa83, 0xa83, HB_Mark_SpacingCombining}, - {0xa84, 0xa84, HB_Other_NotAssigned}, - {0xa85, 0xa8d, HB_Letter_Other}, - {0xa8e, 0xa8e, HB_Other_NotAssigned}, - {0xa8f, 0xa91, HB_Letter_Other}, - {0xa92, 0xa92, HB_Other_NotAssigned}, - {0xa93, 0xaa8, HB_Letter_Other}, - {0xaa9, 0xaa9, HB_Other_NotAssigned}, - {0xaaa, 0xab0, HB_Letter_Other}, - {0xab1, 0xab1, HB_Other_NotAssigned}, - {0xab2, 0xab3, HB_Letter_Other}, - {0xab4, 0xab4, HB_Other_NotAssigned}, - {0xab5, 0xab9, HB_Letter_Other}, - {0xaba, 0xabb, HB_Other_NotAssigned}, - {0xabc, 0xabc, HB_Mark_NonSpacing}, - {0xabd, 0xabd, HB_Letter_Other}, - {0xabe, 0xac0, HB_Mark_SpacingCombining}, - {0xac1, 0xac5, HB_Mark_NonSpacing}, - {0xac6, 0xac6, HB_Other_NotAssigned}, - {0xac7, 0xac8, HB_Mark_NonSpacing}, - {0xac9, 0xac9, HB_Mark_SpacingCombining}, - {0xaca, 0xaca, HB_Other_NotAssigned}, - {0xacb, 0xacc, HB_Mark_SpacingCombining}, - {0xacd, 0xacd, HB_Mark_NonSpacing}, - {0xace, 0xacf, HB_Other_NotAssigned}, - {0xad0, 0xad0, HB_Letter_Other}, - {0xad1, 0xadf, HB_Other_NotAssigned}, - {0xae0, 0xae1, HB_Letter_Other}, - {0xae2, 0xae3, HB_Mark_NonSpacing}, - {0xae4, 0xae5, HB_Other_NotAssigned}, - {0xae6, 0xaef, HB_Number_DecimalDigit}, - {0xaf0, 0xaf0, HB_Other_NotAssigned}, - {0xaf1, 0xaf1, HB_Symbol_Currency}, - {0xaf2, 0xb00, HB_Other_NotAssigned}, - {0xb01, 0xb01, HB_Mark_NonSpacing}, - {0xb02, 0xb03, HB_Mark_SpacingCombining}, - {0xb04, 0xb04, HB_Other_NotAssigned}, - {0xb05, 0xb0c, HB_Letter_Other}, - {0xb0d, 0xb0e, HB_Other_NotAssigned}, - {0xb0f, 0xb10, HB_Letter_Other}, - {0xb11, 0xb12, HB_Other_NotAssigned}, - {0xb13, 0xb28, HB_Letter_Other}, - {0xb29, 0xb29, HB_Other_NotAssigned}, - {0xb2a, 0xb30, HB_Letter_Other}, - {0xb31, 0xb31, HB_Other_NotAssigned}, - {0xb32, 0xb33, HB_Letter_Other}, - {0xb34, 0xb34, HB_Other_NotAssigned}, - {0xb35, 0xb39, HB_Letter_Other}, - {0xb3a, 0xb3b, HB_Other_NotAssigned}, - {0xb3c, 0xb3c, HB_Mark_NonSpacing}, - {0xb3d, 0xb3d, HB_Letter_Other}, - {0xb3e, 0xb3e, HB_Mark_SpacingCombining}, - {0xb3f, 0xb3f, HB_Mark_NonSpacing}, - {0xb40, 0xb40, HB_Mark_SpacingCombining}, - {0xb41, 0xb44, HB_Mark_NonSpacing}, - {0xb45, 0xb46, HB_Other_NotAssigned}, - {0xb47, 0xb48, HB_Mark_SpacingCombining}, - {0xb49, 0xb4a, HB_Other_NotAssigned}, - {0xb4b, 0xb4c, HB_Mark_SpacingCombining}, - {0xb4d, 0xb4d, HB_Mark_NonSpacing}, - {0xb4e, 0xb55, HB_Other_NotAssigned}, - {0xb56, 0xb56, HB_Mark_NonSpacing}, - {0xb57, 0xb57, HB_Mark_SpacingCombining}, - {0xb58, 0xb5b, HB_Other_NotAssigned}, - {0xb5c, 0xb5d, HB_Letter_Other}, - {0xb5e, 0xb5e, HB_Other_NotAssigned}, - {0xb5f, 0xb61, HB_Letter_Other}, - {0xb62, 0xb63, HB_Mark_NonSpacing}, - {0xb64, 0xb65, HB_Other_NotAssigned}, - {0xb66, 0xb6f, HB_Number_DecimalDigit}, - {0xb70, 0xb70, HB_Symbol_Other}, - {0xb71, 0xb71, HB_Letter_Other}, - {0xb72, 0xb81, HB_Other_NotAssigned}, - {0xb82, 0xb82, HB_Mark_NonSpacing}, - {0xb83, 0xb83, HB_Letter_Other}, - {0xb84, 0xb84, HB_Other_NotAssigned}, - {0xb85, 0xb8a, HB_Letter_Other}, - {0xb8b, 0xb8d, HB_Other_NotAssigned}, - {0xb8e, 0xb90, HB_Letter_Other}, - {0xb91, 0xb91, HB_Other_NotAssigned}, - {0xb92, 0xb95, HB_Letter_Other}, - {0xb96, 0xb98, HB_Other_NotAssigned}, - {0xb99, 0xb9a, HB_Letter_Other}, - {0xb9b, 0xb9b, HB_Other_NotAssigned}, - {0xb9c, 0xb9c, HB_Letter_Other}, - {0xb9d, 0xb9d, HB_Other_NotAssigned}, - {0xb9e, 0xb9f, HB_Letter_Other}, - {0xba0, 0xba2, HB_Other_NotAssigned}, - {0xba3, 0xba4, HB_Letter_Other}, - {0xba5, 0xba7, HB_Other_NotAssigned}, - {0xba8, 0xbaa, HB_Letter_Other}, - {0xbab, 0xbad, HB_Other_NotAssigned}, - {0xbae, 0xbb9, HB_Letter_Other}, - {0xbba, 0xbbd, HB_Other_NotAssigned}, - {0xbbe, 0xbbf, HB_Mark_SpacingCombining}, - {0xbc0, 0xbc0, HB_Mark_NonSpacing}, - {0xbc1, 0xbc2, HB_Mark_SpacingCombining}, - {0xbc3, 0xbc5, HB_Other_NotAssigned}, - {0xbc6, 0xbc8, HB_Mark_SpacingCombining}, - {0xbc9, 0xbc9, HB_Other_NotAssigned}, - {0xbca, 0xbcc, HB_Mark_SpacingCombining}, - {0xbcd, 0xbcd, HB_Mark_NonSpacing}, - {0xbce, 0xbcf, HB_Other_NotAssigned}, - {0xbd0, 0xbd0, HB_Letter_Other}, - {0xbd1, 0xbd6, HB_Other_NotAssigned}, - {0xbd7, 0xbd7, HB_Mark_SpacingCombining}, - {0xbd8, 0xbe5, HB_Other_NotAssigned}, - {0xbe6, 0xbef, HB_Number_DecimalDigit}, - {0xbf0, 0xbf2, HB_Number_Other}, - {0xbf3, 0xbf8, HB_Symbol_Other}, - {0xbf9, 0xbf9, HB_Symbol_Currency}, - {0xbfa, 0xbfa, HB_Symbol_Other}, - {0xbfb, 0xc00, HB_Other_NotAssigned}, - {0xc01, 0xc03, HB_Mark_SpacingCombining}, - {0xc04, 0xc04, HB_Other_NotAssigned}, - {0xc05, 0xc0c, HB_Letter_Other}, - {0xc0d, 0xc0d, HB_Other_NotAssigned}, - {0xc0e, 0xc10, HB_Letter_Other}, - {0xc11, 0xc11, HB_Other_NotAssigned}, - {0xc12, 0xc28, HB_Letter_Other}, - {0xc29, 0xc29, HB_Other_NotAssigned}, - {0xc2a, 0xc33, HB_Letter_Other}, - {0xc34, 0xc34, HB_Other_NotAssigned}, - {0xc35, 0xc39, HB_Letter_Other}, - {0xc3a, 0xc3c, HB_Other_NotAssigned}, - {0xc3d, 0xc3d, HB_Letter_Other}, - {0xc3e, 0xc40, HB_Mark_NonSpacing}, - {0xc41, 0xc44, HB_Mark_SpacingCombining}, - {0xc45, 0xc45, HB_Other_NotAssigned}, - {0xc46, 0xc48, HB_Mark_NonSpacing}, - {0xc49, 0xc49, HB_Other_NotAssigned}, - {0xc4a, 0xc4d, HB_Mark_NonSpacing}, - {0xc4e, 0xc54, HB_Other_NotAssigned}, - {0xc55, 0xc56, HB_Mark_NonSpacing}, - {0xc57, 0xc57, HB_Other_NotAssigned}, - {0xc58, 0xc59, HB_Letter_Other}, - {0xc5a, 0xc5f, HB_Other_NotAssigned}, - {0xc60, 0xc61, HB_Letter_Other}, - {0xc62, 0xc63, HB_Mark_NonSpacing}, - {0xc64, 0xc65, HB_Other_NotAssigned}, - {0xc66, 0xc6f, HB_Number_DecimalDigit}, - {0xc70, 0xc77, HB_Other_NotAssigned}, - {0xc78, 0xc7e, HB_Number_Other}, - {0xc7f, 0xc7f, HB_Symbol_Other}, - {0xc80, 0xc81, HB_Other_NotAssigned}, - {0xc82, 0xc83, HB_Mark_SpacingCombining}, - {0xc84, 0xc84, HB_Other_NotAssigned}, - {0xc85, 0xc8c, HB_Letter_Other}, - {0xc8d, 0xc8d, HB_Other_NotAssigned}, - {0xc8e, 0xc90, HB_Letter_Other}, - {0xc91, 0xc91, HB_Other_NotAssigned}, - {0xc92, 0xca8, HB_Letter_Other}, - {0xca9, 0xca9, HB_Other_NotAssigned}, - {0xcaa, 0xcb3, HB_Letter_Other}, - {0xcb4, 0xcb4, HB_Other_NotAssigned}, - {0xcb5, 0xcb9, HB_Letter_Other}, - {0xcba, 0xcbb, HB_Other_NotAssigned}, - {0xcbc, 0xcbc, HB_Mark_NonSpacing}, - {0xcbd, 0xcbd, HB_Letter_Other}, - {0xcbe, 0xcbe, HB_Mark_SpacingCombining}, - {0xcbf, 0xcbf, HB_Mark_NonSpacing}, - {0xcc0, 0xcc4, HB_Mark_SpacingCombining}, - {0xcc5, 0xcc5, HB_Other_NotAssigned}, - {0xcc6, 0xcc6, HB_Mark_NonSpacing}, - {0xcc7, 0xcc8, HB_Mark_SpacingCombining}, - {0xcc9, 0xcc9, HB_Other_NotAssigned}, - {0xcca, 0xccb, HB_Mark_SpacingCombining}, - {0xccc, 0xccd, HB_Mark_NonSpacing}, - {0xcce, 0xcd4, HB_Other_NotAssigned}, - {0xcd5, 0xcd6, HB_Mark_SpacingCombining}, - {0xcd7, 0xcdd, HB_Other_NotAssigned}, - {0xcde, 0xcde, HB_Letter_Other}, - {0xcdf, 0xcdf, HB_Other_NotAssigned}, - {0xce0, 0xce1, HB_Letter_Other}, - {0xce2, 0xce3, HB_Mark_NonSpacing}, - {0xce4, 0xce5, HB_Other_NotAssigned}, - {0xce6, 0xcef, HB_Number_DecimalDigit}, - {0xcf0, 0xcf0, HB_Other_NotAssigned}, - {0xcf1, 0xcf2, HB_Symbol_Other}, - {0xcf3, 0xd01, HB_Other_NotAssigned}, - {0xd02, 0xd03, HB_Mark_SpacingCombining}, - {0xd04, 0xd04, HB_Other_NotAssigned}, - {0xd05, 0xd0c, HB_Letter_Other}, - {0xd0d, 0xd0d, HB_Other_NotAssigned}, - {0xd0e, 0xd10, HB_Letter_Other}, - {0xd11, 0xd11, HB_Other_NotAssigned}, - {0xd12, 0xd28, HB_Letter_Other}, - {0xd29, 0xd29, HB_Other_NotAssigned}, - {0xd2a, 0xd39, HB_Letter_Other}, - {0xd3a, 0xd3c, HB_Other_NotAssigned}, - {0xd3d, 0xd3d, HB_Letter_Other}, - {0xd3e, 0xd40, HB_Mark_SpacingCombining}, - {0xd41, 0xd44, HB_Mark_NonSpacing}, - {0xd45, 0xd45, HB_Other_NotAssigned}, - {0xd46, 0xd48, HB_Mark_SpacingCombining}, - {0xd49, 0xd49, HB_Other_NotAssigned}, - {0xd4a, 0xd4c, HB_Mark_SpacingCombining}, - {0xd4d, 0xd4d, HB_Mark_NonSpacing}, - {0xd4e, 0xd56, HB_Other_NotAssigned}, - {0xd57, 0xd57, HB_Mark_SpacingCombining}, - {0xd58, 0xd5f, HB_Other_NotAssigned}, - {0xd60, 0xd61, HB_Letter_Other}, - {0xd62, 0xd63, HB_Mark_NonSpacing}, - {0xd64, 0xd65, HB_Other_NotAssigned}, - {0xd66, 0xd6f, HB_Number_DecimalDigit}, - {0xd70, 0xd75, HB_Number_Other}, - {0xd76, 0xd78, HB_Other_NotAssigned}, - {0xd79, 0xd79, HB_Symbol_Other}, - {0xd7a, 0xd7f, HB_Letter_Other}, - {0xd80, 0xd81, HB_Other_NotAssigned}, - {0xd82, 0xd83, HB_Mark_SpacingCombining}, - {0xd84, 0xd84, HB_Other_NotAssigned}, - {0xd85, 0xd96, HB_Letter_Other}, - {0xd97, 0xd99, HB_Other_NotAssigned}, - {0xd9a, 0xdb1, HB_Letter_Other}, - {0xdb2, 0xdb2, HB_Other_NotAssigned}, - {0xdb3, 0xdbb, HB_Letter_Other}, - {0xdbc, 0xdbc, HB_Other_NotAssigned}, - {0xdbd, 0xdbd, HB_Letter_Other}, - {0xdbe, 0xdbf, HB_Other_NotAssigned}, - {0xdc0, 0xdc6, HB_Letter_Other}, - {0xdc7, 0xdc9, HB_Other_NotAssigned}, - {0xdca, 0xdca, HB_Mark_NonSpacing}, - {0xdcb, 0xdce, HB_Other_NotAssigned}, - {0xdcf, 0xdd1, HB_Mark_SpacingCombining}, - {0xdd2, 0xdd4, HB_Mark_NonSpacing}, - {0xdd5, 0xdd5, HB_Other_NotAssigned}, - {0xdd6, 0xdd6, HB_Mark_NonSpacing}, - {0xdd7, 0xdd7, HB_Other_NotAssigned}, - {0xdd8, 0xddf, HB_Mark_SpacingCombining}, - {0xde0, 0xdf1, HB_Other_NotAssigned}, - {0xdf2, 0xdf3, HB_Mark_SpacingCombining}, - {0xdf4, 0xdf4, HB_Punctuation_Other}, - {0xdf5, 0xe00, HB_Other_NotAssigned}, - {0xe01, 0xe30, HB_Letter_Other}, - {0xe31, 0xe31, HB_Mark_NonSpacing}, - {0xe32, 0xe33, HB_Letter_Other}, - {0xe34, 0xe3a, HB_Mark_NonSpacing}, - {0xe3b, 0xe3e, HB_Other_NotAssigned}, - {0xe3f, 0xe3f, HB_Symbol_Currency}, - {0xe40, 0xe45, HB_Letter_Other}, - {0xe46, 0xe46, HB_Letter_Modifier}, - {0xe47, 0xe4e, HB_Mark_NonSpacing}, - {0xe4f, 0xe4f, HB_Punctuation_Other}, - {0xe50, 0xe59, HB_Number_DecimalDigit}, - {0xe5a, 0xe5b, HB_Punctuation_Other}, - {0xe5c, 0xe80, HB_Other_NotAssigned}, - {0xe81, 0xe82, HB_Letter_Other}, - {0xe83, 0xe83, HB_Other_NotAssigned}, - {0xe84, 0xe84, HB_Letter_Other}, - {0xe85, 0xe86, HB_Other_NotAssigned}, - {0xe87, 0xe88, HB_Letter_Other}, - {0xe89, 0xe89, HB_Other_NotAssigned}, - {0xe8a, 0xe8a, HB_Letter_Other}, - {0xe8b, 0xe8c, HB_Other_NotAssigned}, - {0xe8d, 0xe8d, HB_Letter_Other}, - {0xe8e, 0xe93, HB_Other_NotAssigned}, - {0xe94, 0xe97, HB_Letter_Other}, - {0xe98, 0xe98, HB_Other_NotAssigned}, - {0xe99, 0xe9f, HB_Letter_Other}, - {0xea0, 0xea0, HB_Other_NotAssigned}, - {0xea1, 0xea3, HB_Letter_Other}, - {0xea4, 0xea4, HB_Other_NotAssigned}, - {0xea5, 0xea5, HB_Letter_Other}, - {0xea6, 0xea6, HB_Other_NotAssigned}, - {0xea7, 0xea7, HB_Letter_Other}, - {0xea8, 0xea9, HB_Other_NotAssigned}, - {0xeaa, 0xeab, HB_Letter_Other}, - {0xeac, 0xeac, HB_Other_NotAssigned}, - {0xead, 0xeb0, HB_Letter_Other}, - {0xeb1, 0xeb1, HB_Mark_NonSpacing}, - {0xeb2, 0xeb3, HB_Letter_Other}, - {0xeb4, 0xeb9, HB_Mark_NonSpacing}, - {0xeba, 0xeba, HB_Other_NotAssigned}, - {0xebb, 0xebc, HB_Mark_NonSpacing}, - {0xebd, 0xebd, HB_Letter_Other}, - {0xebe, 0xebf, HB_Other_NotAssigned}, - {0xec0, 0xec4, HB_Letter_Other}, - {0xec5, 0xec5, HB_Other_NotAssigned}, - {0xec6, 0xec6, HB_Letter_Modifier}, - {0xec7, 0xec7, HB_Other_NotAssigned}, - {0xec8, 0xecd, HB_Mark_NonSpacing}, - {0xece, 0xecf, HB_Other_NotAssigned}, - {0xed0, 0xed9, HB_Number_DecimalDigit}, - {0xeda, 0xedb, HB_Other_NotAssigned}, - {0xedc, 0xedd, HB_Letter_Other}, - {0xede, 0xeff, HB_Other_NotAssigned}, - {0xf00, 0xf00, HB_Letter_Other}, - {0xf01, 0xf03, HB_Symbol_Other}, - {0xf04, 0xf12, HB_Punctuation_Other}, - {0xf13, 0xf17, HB_Symbol_Other}, - {0xf18, 0xf19, HB_Mark_NonSpacing}, - {0xf1a, 0xf1f, HB_Symbol_Other}, - {0xf20, 0xf29, HB_Number_DecimalDigit}, - {0xf2a, 0xf33, HB_Number_Other}, - {0xf34, 0xf34, HB_Symbol_Other}, - {0xf35, 0xf35, HB_Mark_NonSpacing}, - {0xf36, 0xf36, HB_Symbol_Other}, - {0xf37, 0xf37, HB_Mark_NonSpacing}, - {0xf38, 0xf38, HB_Symbol_Other}, - {0xf39, 0xf39, HB_Mark_NonSpacing}, - {0xf3a, 0xf3a, HB_Punctuation_Open}, - {0xf3b, 0xf3b, HB_Punctuation_Close}, - {0xf3c, 0xf3c, HB_Punctuation_Open}, - {0xf3d, 0xf3d, HB_Punctuation_Close}, - {0xf3e, 0xf3f, HB_Mark_SpacingCombining}, - {0xf40, 0xf47, HB_Letter_Other}, - {0xf48, 0xf48, HB_Other_NotAssigned}, - {0xf49, 0xf6c, HB_Letter_Other}, - {0xf6d, 0xf70, HB_Other_NotAssigned}, - {0xf71, 0xf7e, HB_Mark_NonSpacing}, - {0xf7f, 0xf7f, HB_Mark_SpacingCombining}, - {0xf80, 0xf84, HB_Mark_NonSpacing}, - {0xf85, 0xf85, HB_Punctuation_Other}, - {0xf86, 0xf87, HB_Mark_NonSpacing}, - {0xf88, 0xf8b, HB_Letter_Other}, - {0xf8c, 0xf8f, HB_Other_NotAssigned}, - {0xf90, 0xf97, HB_Mark_NonSpacing}, - {0xf98, 0xf98, HB_Other_NotAssigned}, - {0xf99, 0xfbc, HB_Mark_NonSpacing}, - {0xfbd, 0xfbd, HB_Other_NotAssigned}, - {0xfbe, 0xfc5, HB_Symbol_Other}, - {0xfc6, 0xfc6, HB_Mark_NonSpacing}, - {0xfc7, 0xfcc, HB_Symbol_Other}, - {0xfcd, 0xfcd, HB_Other_NotAssigned}, - {0xfce, 0xfcf, HB_Symbol_Other}, - {0xfd0, 0xfd4, HB_Punctuation_Other}, - {0xfd5, 0xfff, HB_Other_NotAssigned}, - {0x1000, 0x102a, HB_Letter_Other}, - {0x102b, 0x102c, HB_Mark_SpacingCombining}, - {0x102d, 0x1030, HB_Mark_NonSpacing}, - {0x1031, 0x1031, HB_Mark_SpacingCombining}, - {0x1032, 0x1037, HB_Mark_NonSpacing}, - {0x1038, 0x1038, HB_Mark_SpacingCombining}, - {0x1039, 0x103a, HB_Mark_NonSpacing}, - {0x103b, 0x103c, HB_Mark_SpacingCombining}, - {0x103d, 0x103e, HB_Mark_NonSpacing}, - {0x103f, 0x103f, HB_Letter_Other}, - {0x1040, 0x1049, HB_Number_DecimalDigit}, - {0x104a, 0x104f, HB_Punctuation_Other}, - {0x1050, 0x1055, HB_Letter_Other}, - {0x1056, 0x1057, HB_Mark_SpacingCombining}, - {0x1058, 0x1059, HB_Mark_NonSpacing}, - {0x105a, 0x105d, HB_Letter_Other}, - {0x105e, 0x1060, HB_Mark_NonSpacing}, - {0x1061, 0x1061, HB_Letter_Other}, - {0x1062, 0x1064, HB_Mark_SpacingCombining}, - {0x1065, 0x1066, HB_Letter_Other}, - {0x1067, 0x106d, HB_Mark_SpacingCombining}, - {0x106e, 0x1070, HB_Letter_Other}, - {0x1071, 0x1074, HB_Mark_NonSpacing}, - {0x1075, 0x1081, HB_Letter_Other}, - {0x1082, 0x1082, HB_Mark_NonSpacing}, - {0x1083, 0x1084, HB_Mark_SpacingCombining}, - {0x1085, 0x1086, HB_Mark_NonSpacing}, - {0x1087, 0x108c, HB_Mark_SpacingCombining}, - {0x108d, 0x108d, HB_Mark_NonSpacing}, - {0x108e, 0x108e, HB_Letter_Other}, - {0x108f, 0x108f, HB_Mark_SpacingCombining}, - {0x1090, 0x1099, HB_Number_DecimalDigit}, - {0x109a, 0x109d, HB_Other_NotAssigned}, - {0x109e, 0x109f, HB_Symbol_Other}, - {0x10a0, 0x10c5, HB_Letter_Uppercase}, - {0x10c6, 0x10cf, HB_Other_NotAssigned}, - {0x10d0, 0x10fa, HB_Letter_Other}, - {0x10fb, 0x10fb, HB_Punctuation_Other}, - {0x10fc, 0x10fc, HB_Letter_Modifier}, - {0x10fd, 0x10ff, HB_Other_NotAssigned}, - {0x1100, 0x1159, HB_Letter_Other}, - {0x115a, 0x115e, HB_Other_NotAssigned}, - {0x115f, 0x11a2, HB_Letter_Other}, - {0x11a3, 0x11a7, HB_Other_NotAssigned}, - {0x11a8, 0x11f9, HB_Letter_Other}, - {0x11fa, 0x11ff, HB_Other_NotAssigned}, - {0x1200, 0x1248, HB_Letter_Other}, - {0x1249, 0x1249, HB_Other_NotAssigned}, - {0x124a, 0x124d, HB_Letter_Other}, - {0x124e, 0x124f, HB_Other_NotAssigned}, - {0x1250, 0x1256, HB_Letter_Other}, - {0x1257, 0x1257, HB_Other_NotAssigned}, - {0x1258, 0x1258, HB_Letter_Other}, - {0x1259, 0x1259, HB_Other_NotAssigned}, - {0x125a, 0x125d, HB_Letter_Other}, - {0x125e, 0x125f, HB_Other_NotAssigned}, - {0x1260, 0x1288, HB_Letter_Other}, - {0x1289, 0x1289, HB_Other_NotAssigned}, - {0x128a, 0x128d, HB_Letter_Other}, - {0x128e, 0x128f, HB_Other_NotAssigned}, - {0x1290, 0x12b0, HB_Letter_Other}, - {0x12b1, 0x12b1, HB_Other_NotAssigned}, - {0x12b2, 0x12b5, HB_Letter_Other}, - {0x12b6, 0x12b7, HB_Other_NotAssigned}, - {0x12b8, 0x12be, HB_Letter_Other}, - {0x12bf, 0x12bf, HB_Other_NotAssigned}, - {0x12c0, 0x12c0, HB_Letter_Other}, - {0x12c1, 0x12c1, HB_Other_NotAssigned}, - {0x12c2, 0x12c5, HB_Letter_Other}, - {0x12c6, 0x12c7, HB_Other_NotAssigned}, - {0x12c8, 0x12d6, HB_Letter_Other}, - {0x12d7, 0x12d7, HB_Other_NotAssigned}, - {0x12d8, 0x1310, HB_Letter_Other}, - {0x1311, 0x1311, HB_Other_NotAssigned}, - {0x1312, 0x1315, HB_Letter_Other}, - {0x1316, 0x1317, HB_Other_NotAssigned}, - {0x1318, 0x135a, HB_Letter_Other}, - {0x135b, 0x135e, HB_Other_NotAssigned}, - {0x135f, 0x135f, HB_Mark_NonSpacing}, - {0x1360, 0x1360, HB_Symbol_Other}, - {0x1361, 0x1368, HB_Punctuation_Other}, - {0x1369, 0x137c, HB_Number_Other}, - {0x137d, 0x137f, HB_Other_NotAssigned}, - {0x1380, 0x138f, HB_Letter_Other}, - {0x1390, 0x1399, HB_Symbol_Other}, - {0x139a, 0x139f, HB_Other_NotAssigned}, - {0x13a0, 0x13f4, HB_Letter_Other}, - {0x13f5, 0x1400, HB_Other_NotAssigned}, - {0x1401, 0x166c, HB_Letter_Other}, - {0x166d, 0x166e, HB_Punctuation_Other}, - {0x166f, 0x1676, HB_Letter_Other}, - {0x1677, 0x167f, HB_Other_NotAssigned}, - {0x1680, 0x1680, HB_Separator_Space}, - {0x1681, 0x169a, HB_Letter_Other}, - {0x169b, 0x169b, HB_Punctuation_Open}, - {0x169c, 0x169c, HB_Punctuation_Close}, - {0x169d, 0x169f, HB_Other_NotAssigned}, - {0x16a0, 0x16ea, HB_Letter_Other}, - {0x16eb, 0x16ed, HB_Punctuation_Other}, - {0x16ee, 0x16f0, HB_Number_Letter}, - {0x16f1, 0x16ff, HB_Other_NotAssigned}, - {0x1700, 0x170c, HB_Letter_Other}, - {0x170d, 0x170d, HB_Other_NotAssigned}, - {0x170e, 0x1711, HB_Letter_Other}, - {0x1712, 0x1714, HB_Mark_NonSpacing}, - {0x1715, 0x171f, HB_Other_NotAssigned}, - {0x1720, 0x1731, HB_Letter_Other}, - {0x1732, 0x1734, HB_Mark_NonSpacing}, - {0x1735, 0x1736, HB_Punctuation_Other}, - {0x1737, 0x173f, HB_Other_NotAssigned}, - {0x1740, 0x1751, HB_Letter_Other}, - {0x1752, 0x1753, HB_Mark_NonSpacing}, - {0x1754, 0x175f, HB_Other_NotAssigned}, - {0x1760, 0x176c, HB_Letter_Other}, - {0x176d, 0x176d, HB_Other_NotAssigned}, - {0x176e, 0x1770, HB_Letter_Other}, - {0x1771, 0x1771, HB_Other_NotAssigned}, - {0x1772, 0x1773, HB_Mark_NonSpacing}, - {0x1774, 0x177f, HB_Other_NotAssigned}, - {0x1780, 0x17b3, HB_Letter_Other}, - {0x17b4, 0x17b5, HB_Other_Format}, - {0x17b6, 0x17b6, HB_Mark_SpacingCombining}, - {0x17b7, 0x17bd, HB_Mark_NonSpacing}, - {0x17be, 0x17c5, HB_Mark_SpacingCombining}, - {0x17c6, 0x17c6, HB_Mark_NonSpacing}, - {0x17c7, 0x17c8, HB_Mark_SpacingCombining}, - {0x17c9, 0x17d3, HB_Mark_NonSpacing}, - {0x17d4, 0x17d6, HB_Punctuation_Other}, - {0x17d7, 0x17d7, HB_Letter_Modifier}, - {0x17d8, 0x17da, HB_Punctuation_Other}, - {0x17db, 0x17db, HB_Symbol_Currency}, - {0x17dc, 0x17dc, HB_Letter_Other}, - {0x17dd, 0x17dd, HB_Mark_NonSpacing}, - {0x17de, 0x17df, HB_Other_NotAssigned}, - {0x17e0, 0x17e9, HB_Number_DecimalDigit}, - {0x17ea, 0x17ef, HB_Other_NotAssigned}, - {0x17f0, 0x17f9, HB_Number_Other}, - {0x17fa, 0x17ff, HB_Other_NotAssigned}, - {0x1800, 0x1805, HB_Punctuation_Other}, - {0x1806, 0x1806, HB_Punctuation_Dash}, - {0x1807, 0x180a, HB_Punctuation_Other}, - {0x180b, 0x180d, HB_Mark_NonSpacing}, - {0x180e, 0x180e, HB_Separator_Space}, - {0x180f, 0x180f, HB_Other_NotAssigned}, - {0x1810, 0x1819, HB_Number_DecimalDigit}, - {0x181a, 0x181f, HB_Other_NotAssigned}, - {0x1820, 0x1842, HB_Letter_Other}, - {0x1843, 0x1843, HB_Letter_Modifier}, - {0x1844, 0x1877, HB_Letter_Other}, - {0x1878, 0x187f, HB_Other_NotAssigned}, - {0x1880, 0x18a8, HB_Letter_Other}, - {0x18a9, 0x18a9, HB_Mark_NonSpacing}, - {0x18aa, 0x18aa, HB_Letter_Other}, - {0x18ab, 0x18ff, HB_Other_NotAssigned}, - {0x1900, 0x191c, HB_Letter_Other}, - {0x191d, 0x191f, HB_Other_NotAssigned}, - {0x1920, 0x1922, HB_Mark_NonSpacing}, - {0x1923, 0x1926, HB_Mark_SpacingCombining}, - {0x1927, 0x1928, HB_Mark_NonSpacing}, - {0x1929, 0x192b, HB_Mark_SpacingCombining}, - {0x192c, 0x192f, HB_Other_NotAssigned}, - {0x1930, 0x1931, HB_Mark_SpacingCombining}, - {0x1932, 0x1932, HB_Mark_NonSpacing}, - {0x1933, 0x1938, HB_Mark_SpacingCombining}, - {0x1939, 0x193b, HB_Mark_NonSpacing}, - {0x193c, 0x193f, HB_Other_NotAssigned}, - {0x1940, 0x1940, HB_Symbol_Other}, - {0x1941, 0x1943, HB_Other_NotAssigned}, - {0x1944, 0x1945, HB_Punctuation_Other}, - {0x1946, 0x194f, HB_Number_DecimalDigit}, - {0x1950, 0x196d, HB_Letter_Other}, - {0x196e, 0x196f, HB_Other_NotAssigned}, - {0x1970, 0x1974, HB_Letter_Other}, - {0x1975, 0x197f, HB_Other_NotAssigned}, - {0x1980, 0x19a9, HB_Letter_Other}, - {0x19aa, 0x19af, HB_Other_NotAssigned}, - {0x19b0, 0x19c0, HB_Mark_SpacingCombining}, - {0x19c1, 0x19c7, HB_Letter_Other}, - {0x19c8, 0x19c9, HB_Mark_SpacingCombining}, - {0x19ca, 0x19cf, HB_Other_NotAssigned}, - {0x19d0, 0x19d9, HB_Number_DecimalDigit}, - {0x19da, 0x19dd, HB_Other_NotAssigned}, - {0x19de, 0x19df, HB_Punctuation_Other}, - {0x19e0, 0x19ff, HB_Symbol_Other}, - {0x1a00, 0x1a16, HB_Letter_Other}, - {0x1a17, 0x1a18, HB_Mark_NonSpacing}, - {0x1a19, 0x1a1b, HB_Mark_SpacingCombining}, - {0x1a1c, 0x1a1d, HB_Other_NotAssigned}, - {0x1a1e, 0x1a1f, HB_Punctuation_Other}, - {0x1a20, 0x1aff, HB_Other_NotAssigned}, - {0x1b00, 0x1b03, HB_Mark_NonSpacing}, - {0x1b04, 0x1b04, HB_Mark_SpacingCombining}, - {0x1b05, 0x1b33, HB_Letter_Other}, - {0x1b34, 0x1b34, HB_Mark_NonSpacing}, - {0x1b35, 0x1b35, HB_Mark_SpacingCombining}, - {0x1b36, 0x1b3a, HB_Mark_NonSpacing}, - {0x1b3b, 0x1b3b, HB_Mark_SpacingCombining}, - {0x1b3c, 0x1b3c, HB_Mark_NonSpacing}, - {0x1b3d, 0x1b41, HB_Mark_SpacingCombining}, - {0x1b42, 0x1b42, HB_Mark_NonSpacing}, - {0x1b43, 0x1b44, HB_Mark_SpacingCombining}, - {0x1b45, 0x1b4b, HB_Letter_Other}, - {0x1b4c, 0x1b4f, HB_Other_NotAssigned}, - {0x1b50, 0x1b59, HB_Number_DecimalDigit}, - {0x1b5a, 0x1b60, HB_Punctuation_Other}, - {0x1b61, 0x1b6a, HB_Symbol_Other}, - {0x1b6b, 0x1b73, HB_Mark_NonSpacing}, - {0x1b74, 0x1b7c, HB_Symbol_Other}, - {0x1b7d, 0x1b7f, HB_Other_NotAssigned}, - {0x1b80, 0x1b81, HB_Mark_NonSpacing}, - {0x1b82, 0x1b82, HB_Mark_SpacingCombining}, - {0x1b83, 0x1ba0, HB_Letter_Other}, - {0x1ba1, 0x1ba1, HB_Mark_SpacingCombining}, - {0x1ba2, 0x1ba5, HB_Mark_NonSpacing}, - {0x1ba6, 0x1ba7, HB_Mark_SpacingCombining}, - {0x1ba8, 0x1ba9, HB_Mark_NonSpacing}, - {0x1baa, 0x1baa, HB_Mark_SpacingCombining}, - {0x1bab, 0x1bad, HB_Other_NotAssigned}, - {0x1bae, 0x1baf, HB_Letter_Other}, - {0x1bb0, 0x1bb9, HB_Number_DecimalDigit}, - {0x1bba, 0x1bff, HB_Other_NotAssigned}, - {0x1c00, 0x1c23, HB_Letter_Other}, - {0x1c24, 0x1c2b, HB_Mark_SpacingCombining}, - {0x1c2c, 0x1c33, HB_Mark_NonSpacing}, - {0x1c34, 0x1c35, HB_Mark_SpacingCombining}, - {0x1c36, 0x1c37, HB_Mark_NonSpacing}, - {0x1c38, 0x1c3a, HB_Other_NotAssigned}, - {0x1c3b, 0x1c3f, HB_Punctuation_Other}, - {0x1c40, 0x1c49, HB_Number_DecimalDigit}, - {0x1c4a, 0x1c4c, HB_Other_NotAssigned}, - {0x1c4d, 0x1c4f, HB_Letter_Other}, - {0x1c50, 0x1c59, HB_Number_DecimalDigit}, - {0x1c5a, 0x1c77, HB_Letter_Other}, - {0x1c78, 0x1c7d, HB_Letter_Modifier}, - {0x1c7e, 0x1c7f, HB_Punctuation_Other}, - {0x1c80, 0x1cff, HB_Other_NotAssigned}, - {0x1d00, 0x1d2b, HB_Letter_Lowercase}, - {0x1d2c, 0x1d61, HB_Letter_Modifier}, - {0x1d62, 0x1d77, HB_Letter_Lowercase}, - {0x1d78, 0x1d78, HB_Letter_Modifier}, - {0x1d79, 0x1d9a, HB_Letter_Lowercase}, - {0x1d9b, 0x1dbf, HB_Letter_Modifier}, - {0x1dc0, 0x1de6, HB_Mark_NonSpacing}, - {0x1de7, 0x1dfd, HB_Other_NotAssigned}, - {0x1dfe, 0x1dff, HB_Mark_NonSpacing}, - {0x1e00, 0x1e00, HB_Letter_Uppercase}, - {0x1e01, 0x1e01, HB_Letter_Lowercase}, - {0x1e02, 0x1e02, HB_Letter_Uppercase}, - {0x1e03, 0x1e03, HB_Letter_Lowercase}, - {0x1e04, 0x1e04, HB_Letter_Uppercase}, - {0x1e05, 0x1e05, HB_Letter_Lowercase}, - {0x1e06, 0x1e06, HB_Letter_Uppercase}, - {0x1e07, 0x1e07, HB_Letter_Lowercase}, - {0x1e08, 0x1e08, HB_Letter_Uppercase}, - {0x1e09, 0x1e09, HB_Letter_Lowercase}, - {0x1e0a, 0x1e0a, HB_Letter_Uppercase}, - {0x1e0b, 0x1e0b, HB_Letter_Lowercase}, - {0x1e0c, 0x1e0c, HB_Letter_Uppercase}, - {0x1e0d, 0x1e0d, HB_Letter_Lowercase}, - {0x1e0e, 0x1e0e, HB_Letter_Uppercase}, - {0x1e0f, 0x1e0f, HB_Letter_Lowercase}, - {0x1e10, 0x1e10, HB_Letter_Uppercase}, - {0x1e11, 0x1e11, HB_Letter_Lowercase}, - {0x1e12, 0x1e12, HB_Letter_Uppercase}, - {0x1e13, 0x1e13, HB_Letter_Lowercase}, - {0x1e14, 0x1e14, HB_Letter_Uppercase}, - {0x1e15, 0x1e15, HB_Letter_Lowercase}, - {0x1e16, 0x1e16, HB_Letter_Uppercase}, - {0x1e17, 0x1e17, HB_Letter_Lowercase}, - {0x1e18, 0x1e18, HB_Letter_Uppercase}, - {0x1e19, 0x1e19, HB_Letter_Lowercase}, - {0x1e1a, 0x1e1a, HB_Letter_Uppercase}, - {0x1e1b, 0x1e1b, HB_Letter_Lowercase}, - {0x1e1c, 0x1e1c, HB_Letter_Uppercase}, - {0x1e1d, 0x1e1d, HB_Letter_Lowercase}, - {0x1e1e, 0x1e1e, HB_Letter_Uppercase}, - {0x1e1f, 0x1e1f, HB_Letter_Lowercase}, - {0x1e20, 0x1e20, HB_Letter_Uppercase}, - {0x1e21, 0x1e21, HB_Letter_Lowercase}, - {0x1e22, 0x1e22, HB_Letter_Uppercase}, - {0x1e23, 0x1e23, HB_Letter_Lowercase}, - {0x1e24, 0x1e24, HB_Letter_Uppercase}, - {0x1e25, 0x1e25, HB_Letter_Lowercase}, - {0x1e26, 0x1e26, HB_Letter_Uppercase}, - {0x1e27, 0x1e27, HB_Letter_Lowercase}, - {0x1e28, 0x1e28, HB_Letter_Uppercase}, - {0x1e29, 0x1e29, HB_Letter_Lowercase}, - {0x1e2a, 0x1e2a, HB_Letter_Uppercase}, - {0x1e2b, 0x1e2b, HB_Letter_Lowercase}, - {0x1e2c, 0x1e2c, HB_Letter_Uppercase}, - {0x1e2d, 0x1e2d, HB_Letter_Lowercase}, - {0x1e2e, 0x1e2e, HB_Letter_Uppercase}, - {0x1e2f, 0x1e2f, HB_Letter_Lowercase}, - {0x1e30, 0x1e30, HB_Letter_Uppercase}, - {0x1e31, 0x1e31, HB_Letter_Lowercase}, - {0x1e32, 0x1e32, HB_Letter_Uppercase}, - {0x1e33, 0x1e33, HB_Letter_Lowercase}, - {0x1e34, 0x1e34, HB_Letter_Uppercase}, - {0x1e35, 0x1e35, HB_Letter_Lowercase}, - {0x1e36, 0x1e36, HB_Letter_Uppercase}, - {0x1e37, 0x1e37, HB_Letter_Lowercase}, - {0x1e38, 0x1e38, HB_Letter_Uppercase}, - {0x1e39, 0x1e39, HB_Letter_Lowercase}, - {0x1e3a, 0x1e3a, HB_Letter_Uppercase}, - {0x1e3b, 0x1e3b, HB_Letter_Lowercase}, - {0x1e3c, 0x1e3c, HB_Letter_Uppercase}, - {0x1e3d, 0x1e3d, HB_Letter_Lowercase}, - {0x1e3e, 0x1e3e, HB_Letter_Uppercase}, - {0x1e3f, 0x1e3f, HB_Letter_Lowercase}, - {0x1e40, 0x1e40, HB_Letter_Uppercase}, - {0x1e41, 0x1e41, HB_Letter_Lowercase}, - {0x1e42, 0x1e42, HB_Letter_Uppercase}, - {0x1e43, 0x1e43, HB_Letter_Lowercase}, - {0x1e44, 0x1e44, HB_Letter_Uppercase}, - {0x1e45, 0x1e45, HB_Letter_Lowercase}, - {0x1e46, 0x1e46, HB_Letter_Uppercase}, - {0x1e47, 0x1e47, HB_Letter_Lowercase}, - {0x1e48, 0x1e48, HB_Letter_Uppercase}, - {0x1e49, 0x1e49, HB_Letter_Lowercase}, - {0x1e4a, 0x1e4a, HB_Letter_Uppercase}, - {0x1e4b, 0x1e4b, HB_Letter_Lowercase}, - {0x1e4c, 0x1e4c, HB_Letter_Uppercase}, - {0x1e4d, 0x1e4d, HB_Letter_Lowercase}, - {0x1e4e, 0x1e4e, HB_Letter_Uppercase}, - {0x1e4f, 0x1e4f, HB_Letter_Lowercase}, - {0x1e50, 0x1e50, HB_Letter_Uppercase}, - {0x1e51, 0x1e51, HB_Letter_Lowercase}, - {0x1e52, 0x1e52, HB_Letter_Uppercase}, - {0x1e53, 0x1e53, HB_Letter_Lowercase}, - {0x1e54, 0x1e54, HB_Letter_Uppercase}, - {0x1e55, 0x1e55, HB_Letter_Lowercase}, - {0x1e56, 0x1e56, HB_Letter_Uppercase}, - {0x1e57, 0x1e57, HB_Letter_Lowercase}, - {0x1e58, 0x1e58, HB_Letter_Uppercase}, - {0x1e59, 0x1e59, HB_Letter_Lowercase}, - {0x1e5a, 0x1e5a, HB_Letter_Uppercase}, - {0x1e5b, 0x1e5b, HB_Letter_Lowercase}, - {0x1e5c, 0x1e5c, HB_Letter_Uppercase}, - {0x1e5d, 0x1e5d, HB_Letter_Lowercase}, - {0x1e5e, 0x1e5e, HB_Letter_Uppercase}, - {0x1e5f, 0x1e5f, HB_Letter_Lowercase}, - {0x1e60, 0x1e60, HB_Letter_Uppercase}, - {0x1e61, 0x1e61, HB_Letter_Lowercase}, - {0x1e62, 0x1e62, HB_Letter_Uppercase}, - {0x1e63, 0x1e63, HB_Letter_Lowercase}, - {0x1e64, 0x1e64, HB_Letter_Uppercase}, - {0x1e65, 0x1e65, HB_Letter_Lowercase}, - {0x1e66, 0x1e66, HB_Letter_Uppercase}, - {0x1e67, 0x1e67, HB_Letter_Lowercase}, - {0x1e68, 0x1e68, HB_Letter_Uppercase}, - {0x1e69, 0x1e69, HB_Letter_Lowercase}, - {0x1e6a, 0x1e6a, HB_Letter_Uppercase}, - {0x1e6b, 0x1e6b, HB_Letter_Lowercase}, - {0x1e6c, 0x1e6c, HB_Letter_Uppercase}, - {0x1e6d, 0x1e6d, HB_Letter_Lowercase}, - {0x1e6e, 0x1e6e, HB_Letter_Uppercase}, - {0x1e6f, 0x1e6f, HB_Letter_Lowercase}, - {0x1e70, 0x1e70, HB_Letter_Uppercase}, - {0x1e71, 0x1e71, HB_Letter_Lowercase}, - {0x1e72, 0x1e72, HB_Letter_Uppercase}, - {0x1e73, 0x1e73, HB_Letter_Lowercase}, - {0x1e74, 0x1e74, HB_Letter_Uppercase}, - {0x1e75, 0x1e75, HB_Letter_Lowercase}, - {0x1e76, 0x1e76, HB_Letter_Uppercase}, - {0x1e77, 0x1e77, HB_Letter_Lowercase}, - {0x1e78, 0x1e78, HB_Letter_Uppercase}, - {0x1e79, 0x1e79, HB_Letter_Lowercase}, - {0x1e7a, 0x1e7a, HB_Letter_Uppercase}, - {0x1e7b, 0x1e7b, HB_Letter_Lowercase}, - {0x1e7c, 0x1e7c, HB_Letter_Uppercase}, - {0x1e7d, 0x1e7d, HB_Letter_Lowercase}, - {0x1e7e, 0x1e7e, HB_Letter_Uppercase}, - {0x1e7f, 0x1e7f, HB_Letter_Lowercase}, - {0x1e80, 0x1e80, HB_Letter_Uppercase}, - {0x1e81, 0x1e81, HB_Letter_Lowercase}, - {0x1e82, 0x1e82, HB_Letter_Uppercase}, - {0x1e83, 0x1e83, HB_Letter_Lowercase}, - {0x1e84, 0x1e84, HB_Letter_Uppercase}, - {0x1e85, 0x1e85, HB_Letter_Lowercase}, - {0x1e86, 0x1e86, HB_Letter_Uppercase}, - {0x1e87, 0x1e87, HB_Letter_Lowercase}, - {0x1e88, 0x1e88, HB_Letter_Uppercase}, - {0x1e89, 0x1e89, HB_Letter_Lowercase}, - {0x1e8a, 0x1e8a, HB_Letter_Uppercase}, - {0x1e8b, 0x1e8b, HB_Letter_Lowercase}, - {0x1e8c, 0x1e8c, HB_Letter_Uppercase}, - {0x1e8d, 0x1e8d, HB_Letter_Lowercase}, - {0x1e8e, 0x1e8e, HB_Letter_Uppercase}, - {0x1e8f, 0x1e8f, HB_Letter_Lowercase}, - {0x1e90, 0x1e90, HB_Letter_Uppercase}, - {0x1e91, 0x1e91, HB_Letter_Lowercase}, - {0x1e92, 0x1e92, HB_Letter_Uppercase}, - {0x1e93, 0x1e93, HB_Letter_Lowercase}, - {0x1e94, 0x1e94, HB_Letter_Uppercase}, - {0x1e95, 0x1e9d, HB_Letter_Lowercase}, - {0x1e9e, 0x1e9e, HB_Letter_Uppercase}, - {0x1e9f, 0x1e9f, HB_Letter_Lowercase}, - {0x1ea0, 0x1ea0, HB_Letter_Uppercase}, - {0x1ea1, 0x1ea1, HB_Letter_Lowercase}, - {0x1ea2, 0x1ea2, HB_Letter_Uppercase}, - {0x1ea3, 0x1ea3, HB_Letter_Lowercase}, - {0x1ea4, 0x1ea4, HB_Letter_Uppercase}, - {0x1ea5, 0x1ea5, HB_Letter_Lowercase}, - {0x1ea6, 0x1ea6, HB_Letter_Uppercase}, - {0x1ea7, 0x1ea7, HB_Letter_Lowercase}, - {0x1ea8, 0x1ea8, HB_Letter_Uppercase}, - {0x1ea9, 0x1ea9, HB_Letter_Lowercase}, - {0x1eaa, 0x1eaa, HB_Letter_Uppercase}, - {0x1eab, 0x1eab, HB_Letter_Lowercase}, - {0x1eac, 0x1eac, HB_Letter_Uppercase}, - {0x1ead, 0x1ead, HB_Letter_Lowercase}, - {0x1eae, 0x1eae, HB_Letter_Uppercase}, - {0x1eaf, 0x1eaf, HB_Letter_Lowercase}, - {0x1eb0, 0x1eb0, HB_Letter_Uppercase}, - {0x1eb1, 0x1eb1, HB_Letter_Lowercase}, - {0x1eb2, 0x1eb2, HB_Letter_Uppercase}, - {0x1eb3, 0x1eb3, HB_Letter_Lowercase}, - {0x1eb4, 0x1eb4, HB_Letter_Uppercase}, - {0x1eb5, 0x1eb5, HB_Letter_Lowercase}, - {0x1eb6, 0x1eb6, HB_Letter_Uppercase}, - {0x1eb7, 0x1eb7, HB_Letter_Lowercase}, - {0x1eb8, 0x1eb8, HB_Letter_Uppercase}, - {0x1eb9, 0x1eb9, HB_Letter_Lowercase}, - {0x1eba, 0x1eba, HB_Letter_Uppercase}, - {0x1ebb, 0x1ebb, HB_Letter_Lowercase}, - {0x1ebc, 0x1ebc, HB_Letter_Uppercase}, - {0x1ebd, 0x1ebd, HB_Letter_Lowercase}, - {0x1ebe, 0x1ebe, HB_Letter_Uppercase}, - {0x1ebf, 0x1ebf, HB_Letter_Lowercase}, - {0x1ec0, 0x1ec0, HB_Letter_Uppercase}, - {0x1ec1, 0x1ec1, HB_Letter_Lowercase}, - {0x1ec2, 0x1ec2, HB_Letter_Uppercase}, - {0x1ec3, 0x1ec3, HB_Letter_Lowercase}, - {0x1ec4, 0x1ec4, HB_Letter_Uppercase}, - {0x1ec5, 0x1ec5, HB_Letter_Lowercase}, - {0x1ec6, 0x1ec6, HB_Letter_Uppercase}, - {0x1ec7, 0x1ec7, HB_Letter_Lowercase}, - {0x1ec8, 0x1ec8, HB_Letter_Uppercase}, - {0x1ec9, 0x1ec9, HB_Letter_Lowercase}, - {0x1eca, 0x1eca, HB_Letter_Uppercase}, - {0x1ecb, 0x1ecb, HB_Letter_Lowercase}, - {0x1ecc, 0x1ecc, HB_Letter_Uppercase}, - {0x1ecd, 0x1ecd, HB_Letter_Lowercase}, - {0x1ece, 0x1ece, HB_Letter_Uppercase}, - {0x1ecf, 0x1ecf, HB_Letter_Lowercase}, - {0x1ed0, 0x1ed0, HB_Letter_Uppercase}, - {0x1ed1, 0x1ed1, HB_Letter_Lowercase}, - {0x1ed2, 0x1ed2, HB_Letter_Uppercase}, - {0x1ed3, 0x1ed3, HB_Letter_Lowercase}, - {0x1ed4, 0x1ed4, HB_Letter_Uppercase}, - {0x1ed5, 0x1ed5, HB_Letter_Lowercase}, - {0x1ed6, 0x1ed6, HB_Letter_Uppercase}, - {0x1ed7, 0x1ed7, HB_Letter_Lowercase}, - {0x1ed8, 0x1ed8, HB_Letter_Uppercase}, - {0x1ed9, 0x1ed9, HB_Letter_Lowercase}, - {0x1eda, 0x1eda, HB_Letter_Uppercase}, - {0x1edb, 0x1edb, HB_Letter_Lowercase}, - {0x1edc, 0x1edc, HB_Letter_Uppercase}, - {0x1edd, 0x1edd, HB_Letter_Lowercase}, - {0x1ede, 0x1ede, HB_Letter_Uppercase}, - {0x1edf, 0x1edf, HB_Letter_Lowercase}, - {0x1ee0, 0x1ee0, HB_Letter_Uppercase}, - {0x1ee1, 0x1ee1, HB_Letter_Lowercase}, - {0x1ee2, 0x1ee2, HB_Letter_Uppercase}, - {0x1ee3, 0x1ee3, HB_Letter_Lowercase}, - {0x1ee4, 0x1ee4, HB_Letter_Uppercase}, - {0x1ee5, 0x1ee5, HB_Letter_Lowercase}, - {0x1ee6, 0x1ee6, HB_Letter_Uppercase}, - {0x1ee7, 0x1ee7, HB_Letter_Lowercase}, - {0x1ee8, 0x1ee8, HB_Letter_Uppercase}, - {0x1ee9, 0x1ee9, HB_Letter_Lowercase}, - {0x1eea, 0x1eea, HB_Letter_Uppercase}, - {0x1eeb, 0x1eeb, HB_Letter_Lowercase}, - {0x1eec, 0x1eec, HB_Letter_Uppercase}, - {0x1eed, 0x1eed, HB_Letter_Lowercase}, - {0x1eee, 0x1eee, HB_Letter_Uppercase}, - {0x1eef, 0x1eef, HB_Letter_Lowercase}, - {0x1ef0, 0x1ef0, HB_Letter_Uppercase}, - {0x1ef1, 0x1ef1, HB_Letter_Lowercase}, - {0x1ef2, 0x1ef2, HB_Letter_Uppercase}, - {0x1ef3, 0x1ef3, HB_Letter_Lowercase}, - {0x1ef4, 0x1ef4, HB_Letter_Uppercase}, - {0x1ef5, 0x1ef5, HB_Letter_Lowercase}, - {0x1ef6, 0x1ef6, HB_Letter_Uppercase}, - {0x1ef7, 0x1ef7, HB_Letter_Lowercase}, - {0x1ef8, 0x1ef8, HB_Letter_Uppercase}, - {0x1ef9, 0x1ef9, HB_Letter_Lowercase}, - {0x1efa, 0x1efa, HB_Letter_Uppercase}, - {0x1efb, 0x1efb, HB_Letter_Lowercase}, - {0x1efc, 0x1efc, HB_Letter_Uppercase}, - {0x1efd, 0x1efd, HB_Letter_Lowercase}, - {0x1efe, 0x1efe, HB_Letter_Uppercase}, - {0x1eff, 0x1f07, HB_Letter_Lowercase}, - {0x1f08, 0x1f0f, HB_Letter_Uppercase}, - {0x1f10, 0x1f15, HB_Letter_Lowercase}, - {0x1f16, 0x1f17, HB_Other_NotAssigned}, - {0x1f18, 0x1f1d, HB_Letter_Uppercase}, - {0x1f1e, 0x1f1f, HB_Other_NotAssigned}, - {0x1f20, 0x1f27, HB_Letter_Lowercase}, - {0x1f28, 0x1f2f, HB_Letter_Uppercase}, - {0x1f30, 0x1f37, HB_Letter_Lowercase}, - {0x1f38, 0x1f3f, HB_Letter_Uppercase}, - {0x1f40, 0x1f45, HB_Letter_Lowercase}, - {0x1f46, 0x1f47, HB_Other_NotAssigned}, - {0x1f48, 0x1f4d, HB_Letter_Uppercase}, - {0x1f4e, 0x1f4f, HB_Other_NotAssigned}, - {0x1f50, 0x1f57, HB_Letter_Lowercase}, - {0x1f58, 0x1f58, HB_Other_NotAssigned}, - {0x1f59, 0x1f59, HB_Letter_Uppercase}, - {0x1f5a, 0x1f5a, HB_Other_NotAssigned}, - {0x1f5b, 0x1f5b, HB_Letter_Uppercase}, - {0x1f5c, 0x1f5c, HB_Other_NotAssigned}, - {0x1f5d, 0x1f5d, HB_Letter_Uppercase}, - {0x1f5e, 0x1f5e, HB_Other_NotAssigned}, - {0x1f5f, 0x1f5f, HB_Letter_Uppercase}, - {0x1f60, 0x1f67, HB_Letter_Lowercase}, - {0x1f68, 0x1f6f, HB_Letter_Uppercase}, - {0x1f70, 0x1f7d, HB_Letter_Lowercase}, - {0x1f7e, 0x1f7f, HB_Other_NotAssigned}, - {0x1f80, 0x1f87, HB_Letter_Lowercase}, - {0x1f88, 0x1f8f, HB_Letter_Titlecase}, - {0x1f90, 0x1f97, HB_Letter_Lowercase}, - {0x1f98, 0x1f9f, HB_Letter_Titlecase}, - {0x1fa0, 0x1fa7, HB_Letter_Lowercase}, - {0x1fa8, 0x1faf, HB_Letter_Titlecase}, - {0x1fb0, 0x1fb4, HB_Letter_Lowercase}, - {0x1fb5, 0x1fb5, HB_Other_NotAssigned}, - {0x1fb6, 0x1fb7, HB_Letter_Lowercase}, - {0x1fb8, 0x1fbb, HB_Letter_Uppercase}, - {0x1fbc, 0x1fbc, HB_Letter_Titlecase}, - {0x1fbd, 0x1fbd, HB_Symbol_Modifier}, - {0x1fbe, 0x1fbe, HB_Letter_Lowercase}, - {0x1fbf, 0x1fc1, HB_Symbol_Modifier}, - {0x1fc2, 0x1fc4, HB_Letter_Lowercase}, - {0x1fc5, 0x1fc5, HB_Other_NotAssigned}, - {0x1fc6, 0x1fc7, HB_Letter_Lowercase}, - {0x1fc8, 0x1fcb, HB_Letter_Uppercase}, - {0x1fcc, 0x1fcc, HB_Letter_Titlecase}, - {0x1fcd, 0x1fcf, HB_Symbol_Modifier}, - {0x1fd0, 0x1fd3, HB_Letter_Lowercase}, - {0x1fd4, 0x1fd5, HB_Other_NotAssigned}, - {0x1fd6, 0x1fd7, HB_Letter_Lowercase}, - {0x1fd8, 0x1fdb, HB_Letter_Uppercase}, - {0x1fdc, 0x1fdc, HB_Other_NotAssigned}, - {0x1fdd, 0x1fdf, HB_Symbol_Modifier}, - {0x1fe0, 0x1fe7, HB_Letter_Lowercase}, - {0x1fe8, 0x1fec, HB_Letter_Uppercase}, - {0x1fed, 0x1fef, HB_Symbol_Modifier}, - {0x1ff0, 0x1ff1, HB_Other_NotAssigned}, - {0x1ff2, 0x1ff4, HB_Letter_Lowercase}, - {0x1ff5, 0x1ff5, HB_Other_NotAssigned}, - {0x1ff6, 0x1ff7, HB_Letter_Lowercase}, - {0x1ff8, 0x1ffb, HB_Letter_Uppercase}, - {0x1ffc, 0x1ffc, HB_Letter_Titlecase}, - {0x1ffd, 0x1ffe, HB_Symbol_Modifier}, - {0x1fff, 0x1fff, HB_Other_NotAssigned}, - {0x2000, 0x200a, HB_Separator_Space}, - {0x200b, 0x200f, HB_Other_Format}, - {0x2010, 0x2015, HB_Punctuation_Dash}, - {0x2016, 0x2017, HB_Punctuation_Other}, - {0x2018, 0x2018, HB_Punctuation_InitialQuote}, - {0x2019, 0x2019, HB_Punctuation_FinalQuote}, - {0x201a, 0x201a, HB_Punctuation_Open}, - {0x201b, 0x201c, HB_Punctuation_InitialQuote}, - {0x201d, 0x201d, HB_Punctuation_FinalQuote}, - {0x201e, 0x201e, HB_Punctuation_Open}, - {0x201f, 0x201f, HB_Punctuation_InitialQuote}, - {0x2020, 0x2027, HB_Punctuation_Other}, - {0x2028, 0x2028, HB_Separator_Line}, - {0x2029, 0x2029, HB_Separator_Paragraph}, - {0x202a, 0x202e, HB_Other_Format}, - {0x202f, 0x202f, HB_Separator_Space}, - {0x2030, 0x2038, HB_Punctuation_Other}, - {0x2039, 0x2039, HB_Punctuation_InitialQuote}, - {0x203a, 0x203a, HB_Punctuation_FinalQuote}, - {0x203b, 0x203e, HB_Punctuation_Other}, - {0x203f, 0x2040, HB_Punctuation_Connector}, - {0x2041, 0x2043, HB_Punctuation_Other}, - {0x2044, 0x2044, HB_Symbol_Math}, - {0x2045, 0x2045, HB_Punctuation_Open}, - {0x2046, 0x2046, HB_Punctuation_Close}, - {0x2047, 0x2051, HB_Punctuation_Other}, - {0x2052, 0x2052, HB_Symbol_Math}, - {0x2053, 0x2053, HB_Punctuation_Other}, - {0x2054, 0x2054, HB_Punctuation_Connector}, - {0x2055, 0x205e, HB_Punctuation_Other}, - {0x205f, 0x205f, HB_Separator_Space}, - {0x2060, 0x2064, HB_Other_Format}, - {0x2065, 0x2069, HB_Other_NotAssigned}, - {0x206a, 0x206f, HB_Other_Format}, - {0x2070, 0x2070, HB_Number_Other}, - {0x2071, 0x2071, HB_Letter_Lowercase}, - {0x2072, 0x2073, HB_Other_NotAssigned}, - {0x2074, 0x2079, HB_Number_Other}, - {0x207a, 0x207c, HB_Symbol_Math}, - {0x207d, 0x207d, HB_Punctuation_Open}, - {0x207e, 0x207e, HB_Punctuation_Close}, - {0x207f, 0x207f, HB_Letter_Lowercase}, - {0x2080, 0x2089, HB_Number_Other}, - {0x208a, 0x208c, HB_Symbol_Math}, - {0x208d, 0x208d, HB_Punctuation_Open}, - {0x208e, 0x208e, HB_Punctuation_Close}, - {0x208f, 0x208f, HB_Other_NotAssigned}, - {0x2090, 0x2094, HB_Letter_Modifier}, - {0x2095, 0x209f, HB_Other_NotAssigned}, - {0x20a0, 0x20b5, HB_Symbol_Currency}, - {0x20b6, 0x20cf, HB_Other_NotAssigned}, - {0x20d0, 0x20dc, HB_Mark_NonSpacing}, - {0x20dd, 0x20e0, HB_Mark_Enclosing}, - {0x20e1, 0x20e1, HB_Mark_NonSpacing}, - {0x20e2, 0x20e4, HB_Mark_Enclosing}, - {0x20e5, 0x20f0, HB_Mark_NonSpacing}, - {0x20f1, 0x20ff, HB_Other_NotAssigned}, - {0x2100, 0x2101, HB_Symbol_Other}, - {0x2102, 0x2102, HB_Letter_Uppercase}, - {0x2103, 0x2106, HB_Symbol_Other}, - {0x2107, 0x2107, HB_Letter_Uppercase}, - {0x2108, 0x2109, HB_Symbol_Other}, - {0x210a, 0x210a, HB_Letter_Lowercase}, - {0x210b, 0x210d, HB_Letter_Uppercase}, - {0x210e, 0x210f, HB_Letter_Lowercase}, - {0x2110, 0x2112, HB_Letter_Uppercase}, - {0x2113, 0x2113, HB_Letter_Lowercase}, - {0x2114, 0x2114, HB_Symbol_Other}, - {0x2115, 0x2115, HB_Letter_Uppercase}, - {0x2116, 0x2118, HB_Symbol_Other}, - {0x2119, 0x211d, HB_Letter_Uppercase}, - {0x211e, 0x2123, HB_Symbol_Other}, - {0x2124, 0x2124, HB_Letter_Uppercase}, - {0x2125, 0x2125, HB_Symbol_Other}, - {0x2126, 0x2126, HB_Letter_Uppercase}, - {0x2127, 0x2127, HB_Symbol_Other}, - {0x2128, 0x2128, HB_Letter_Uppercase}, - {0x2129, 0x2129, HB_Symbol_Other}, - {0x212a, 0x212d, HB_Letter_Uppercase}, - {0x212e, 0x212e, HB_Symbol_Other}, - {0x212f, 0x212f, HB_Letter_Lowercase}, - {0x2130, 0x2133, HB_Letter_Uppercase}, - {0x2134, 0x2134, HB_Letter_Lowercase}, - {0x2135, 0x2138, HB_Letter_Other}, - {0x2139, 0x2139, HB_Letter_Lowercase}, - {0x213a, 0x213b, HB_Symbol_Other}, - {0x213c, 0x213d, HB_Letter_Lowercase}, - {0x213e, 0x213f, HB_Letter_Uppercase}, - {0x2140, 0x2144, HB_Symbol_Math}, - {0x2145, 0x2145, HB_Letter_Uppercase}, - {0x2146, 0x2149, HB_Letter_Lowercase}, - {0x214a, 0x214a, HB_Symbol_Other}, - {0x214b, 0x214b, HB_Symbol_Math}, - {0x214c, 0x214d, HB_Symbol_Other}, - {0x214e, 0x214e, HB_Letter_Lowercase}, - {0x214f, 0x214f, HB_Symbol_Other}, - {0x2150, 0x2152, HB_Other_NotAssigned}, - {0x2153, 0x215f, HB_Number_Other}, - {0x2160, 0x2182, HB_Number_Letter}, - {0x2183, 0x2183, HB_Letter_Uppercase}, - {0x2184, 0x2184, HB_Letter_Lowercase}, - {0x2185, 0x2188, HB_Number_Letter}, - {0x2189, 0x218f, HB_Other_NotAssigned}, - {0x2190, 0x2194, HB_Symbol_Math}, - {0x2195, 0x2199, HB_Symbol_Other}, - {0x219a, 0x219b, HB_Symbol_Math}, - {0x219c, 0x219f, HB_Symbol_Other}, - {0x21a0, 0x21a0, HB_Symbol_Math}, - {0x21a1, 0x21a2, HB_Symbol_Other}, - {0x21a3, 0x21a3, HB_Symbol_Math}, - {0x21a4, 0x21a5, HB_Symbol_Other}, - {0x21a6, 0x21a6, HB_Symbol_Math}, - {0x21a7, 0x21ad, HB_Symbol_Other}, - {0x21ae, 0x21ae, HB_Symbol_Math}, - {0x21af, 0x21cd, HB_Symbol_Other}, - {0x21ce, 0x21cf, HB_Symbol_Math}, - {0x21d0, 0x21d1, HB_Symbol_Other}, - {0x21d2, 0x21d2, HB_Symbol_Math}, - {0x21d3, 0x21d3, HB_Symbol_Other}, - {0x21d4, 0x21d4, HB_Symbol_Math}, - {0x21d5, 0x21f3, HB_Symbol_Other}, - {0x21f4, 0x22ff, HB_Symbol_Math}, - {0x2300, 0x2307, HB_Symbol_Other}, - {0x2308, 0x230b, HB_Symbol_Math}, - {0x230c, 0x231f, HB_Symbol_Other}, - {0x2320, 0x2321, HB_Symbol_Math}, - {0x2322, 0x2328, HB_Symbol_Other}, - {0x2329, 0x2329, HB_Punctuation_Open}, - {0x232a, 0x232a, HB_Punctuation_Close}, - {0x232b, 0x237b, HB_Symbol_Other}, - {0x237c, 0x237c, HB_Symbol_Math}, - {0x237d, 0x239a, HB_Symbol_Other}, - {0x239b, 0x23b3, HB_Symbol_Math}, - {0x23b4, 0x23db, HB_Symbol_Other}, - {0x23dc, 0x23e1, HB_Symbol_Math}, - {0x23e2, 0x23e7, HB_Symbol_Other}, - {0x23e8, 0x23ff, HB_Other_NotAssigned}, - {0x2400, 0x2426, HB_Symbol_Other}, - {0x2427, 0x243f, HB_Other_NotAssigned}, - {0x2440, 0x244a, HB_Symbol_Other}, - {0x244b, 0x245f, HB_Other_NotAssigned}, - {0x2460, 0x249b, HB_Number_Other}, - {0x249c, 0x24e9, HB_Symbol_Other}, - {0x24ea, 0x24ff, HB_Number_Other}, - {0x2500, 0x25b6, HB_Symbol_Other}, - {0x25b7, 0x25b7, HB_Symbol_Math}, - {0x25b8, 0x25c0, HB_Symbol_Other}, - {0x25c1, 0x25c1, HB_Symbol_Math}, - {0x25c2, 0x25f7, HB_Symbol_Other}, - {0x25f8, 0x25ff, HB_Symbol_Math}, - {0x2600, 0x266e, HB_Symbol_Other}, - {0x266f, 0x266f, HB_Symbol_Math}, - {0x2670, 0x269d, HB_Symbol_Other}, - {0x269e, 0x269f, HB_Other_NotAssigned}, - {0x26a0, 0x26bc, HB_Symbol_Other}, - {0x26bd, 0x26bf, HB_Other_NotAssigned}, - {0x26c0, 0x26c3, HB_Symbol_Other}, - {0x26c4, 0x2700, HB_Other_NotAssigned}, - {0x2701, 0x2704, HB_Symbol_Other}, - {0x2705, 0x2705, HB_Other_NotAssigned}, - {0x2706, 0x2709, HB_Symbol_Other}, - {0x270a, 0x270b, HB_Other_NotAssigned}, - {0x270c, 0x2727, HB_Symbol_Other}, - {0x2728, 0x2728, HB_Other_NotAssigned}, - {0x2729, 0x274b, HB_Symbol_Other}, - {0x274c, 0x274c, HB_Other_NotAssigned}, - {0x274d, 0x274d, HB_Symbol_Other}, - {0x274e, 0x274e, HB_Other_NotAssigned}, - {0x274f, 0x2752, HB_Symbol_Other}, - {0x2753, 0x2755, HB_Other_NotAssigned}, - {0x2756, 0x2756, HB_Symbol_Other}, - {0x2757, 0x2757, HB_Other_NotAssigned}, - {0x2758, 0x275e, HB_Symbol_Other}, - {0x275f, 0x2760, HB_Other_NotAssigned}, - {0x2761, 0x2767, HB_Symbol_Other}, - {0x2768, 0x2768, HB_Punctuation_Open}, - {0x2769, 0x2769, HB_Punctuation_Close}, - {0x276a, 0x276a, HB_Punctuation_Open}, - {0x276b, 0x276b, HB_Punctuation_Close}, - {0x276c, 0x276c, HB_Punctuation_Open}, - {0x276d, 0x276d, HB_Punctuation_Close}, - {0x276e, 0x276e, HB_Punctuation_Open}, - {0x276f, 0x276f, HB_Punctuation_Close}, - {0x2770, 0x2770, HB_Punctuation_Open}, - {0x2771, 0x2771, HB_Punctuation_Close}, - {0x2772, 0x2772, HB_Punctuation_Open}, - {0x2773, 0x2773, HB_Punctuation_Close}, - {0x2774, 0x2774, HB_Punctuation_Open}, - {0x2775, 0x2775, HB_Punctuation_Close}, - {0x2776, 0x2793, HB_Number_Other}, - {0x2794, 0x2794, HB_Symbol_Other}, - {0x2795, 0x2797, HB_Other_NotAssigned}, - {0x2798, 0x27af, HB_Symbol_Other}, - {0x27b0, 0x27b0, HB_Other_NotAssigned}, - {0x27b1, 0x27be, HB_Symbol_Other}, - {0x27bf, 0x27bf, HB_Other_NotAssigned}, - {0x27c0, 0x27c4, HB_Symbol_Math}, - {0x27c5, 0x27c5, HB_Punctuation_Open}, - {0x27c6, 0x27c6, HB_Punctuation_Close}, - {0x27c7, 0x27ca, HB_Symbol_Math}, - {0x27cb, 0x27cb, HB_Other_NotAssigned}, - {0x27cc, 0x27cc, HB_Symbol_Math}, - {0x27cd, 0x27cf, HB_Other_NotAssigned}, - {0x27d0, 0x27e5, HB_Symbol_Math}, - {0x27e6, 0x27e6, HB_Punctuation_Open}, - {0x27e7, 0x27e7, HB_Punctuation_Close}, - {0x27e8, 0x27e8, HB_Punctuation_Open}, - {0x27e9, 0x27e9, HB_Punctuation_Close}, - {0x27ea, 0x27ea, HB_Punctuation_Open}, - {0x27eb, 0x27eb, HB_Punctuation_Close}, - {0x27ec, 0x27ec, HB_Punctuation_Open}, - {0x27ed, 0x27ed, HB_Punctuation_Close}, - {0x27ee, 0x27ee, HB_Punctuation_Open}, - {0x27ef, 0x27ef, HB_Punctuation_Close}, - {0x27f0, 0x27ff, HB_Symbol_Math}, - {0x2800, 0x28ff, HB_Symbol_Other}, - {0x2900, 0x2982, HB_Symbol_Math}, - {0x2983, 0x2983, HB_Punctuation_Open}, - {0x2984, 0x2984, HB_Punctuation_Close}, - {0x2985, 0x2985, HB_Punctuation_Open}, - {0x2986, 0x2986, HB_Punctuation_Close}, - {0x2987, 0x2987, HB_Punctuation_Open}, - {0x2988, 0x2988, HB_Punctuation_Close}, - {0x2989, 0x2989, HB_Punctuation_Open}, - {0x298a, 0x298a, HB_Punctuation_Close}, - {0x298b, 0x298b, HB_Punctuation_Open}, - {0x298c, 0x298c, HB_Punctuation_Close}, - {0x298d, 0x298d, HB_Punctuation_Open}, - {0x298e, 0x298e, HB_Punctuation_Close}, - {0x298f, 0x298f, HB_Punctuation_Open}, - {0x2990, 0x2990, HB_Punctuation_Close}, - {0x2991, 0x2991, HB_Punctuation_Open}, - {0x2992, 0x2992, HB_Punctuation_Close}, - {0x2993, 0x2993, HB_Punctuation_Open}, - {0x2994, 0x2994, HB_Punctuation_Close}, - {0x2995, 0x2995, HB_Punctuation_Open}, - {0x2996, 0x2996, HB_Punctuation_Close}, - {0x2997, 0x2997, HB_Punctuation_Open}, - {0x2998, 0x2998, HB_Punctuation_Close}, - {0x2999, 0x29d7, HB_Symbol_Math}, - {0x29d8, 0x29d8, HB_Punctuation_Open}, - {0x29d9, 0x29d9, HB_Punctuation_Close}, - {0x29da, 0x29da, HB_Punctuation_Open}, - {0x29db, 0x29db, HB_Punctuation_Close}, - {0x29dc, 0x29fb, HB_Symbol_Math}, - {0x29fc, 0x29fc, HB_Punctuation_Open}, - {0x29fd, 0x29fd, HB_Punctuation_Close}, - {0x29fe, 0x2aff, HB_Symbol_Math}, - {0x2b00, 0x2b2f, HB_Symbol_Other}, - {0x2b30, 0x2b44, HB_Symbol_Math}, - {0x2b45, 0x2b46, HB_Symbol_Other}, - {0x2b47, 0x2b4c, HB_Symbol_Math}, - {0x2b4d, 0x2b4f, HB_Other_NotAssigned}, - {0x2b50, 0x2b54, HB_Symbol_Other}, - {0x2b55, 0x2bff, HB_Other_NotAssigned}, - {0x2c00, 0x2c2e, HB_Letter_Uppercase}, - {0x2c2f, 0x2c2f, HB_Other_NotAssigned}, - {0x2c30, 0x2c5e, HB_Letter_Lowercase}, - {0x2c5f, 0x2c5f, HB_Other_NotAssigned}, - {0x2c60, 0x2c60, HB_Letter_Uppercase}, - {0x2c61, 0x2c61, HB_Letter_Lowercase}, - {0x2c62, 0x2c64, HB_Letter_Uppercase}, - {0x2c65, 0x2c66, HB_Letter_Lowercase}, - {0x2c67, 0x2c67, HB_Letter_Uppercase}, - {0x2c68, 0x2c68, HB_Letter_Lowercase}, - {0x2c69, 0x2c69, HB_Letter_Uppercase}, - {0x2c6a, 0x2c6a, HB_Letter_Lowercase}, - {0x2c6b, 0x2c6b, HB_Letter_Uppercase}, - {0x2c6c, 0x2c6c, HB_Letter_Lowercase}, - {0x2c6d, 0x2c6f, HB_Letter_Uppercase}, - {0x2c70, 0x2c70, HB_Other_NotAssigned}, - {0x2c71, 0x2c71, HB_Letter_Lowercase}, - {0x2c72, 0x2c72, HB_Letter_Uppercase}, - {0x2c73, 0x2c74, HB_Letter_Lowercase}, - {0x2c75, 0x2c75, HB_Letter_Uppercase}, - {0x2c76, 0x2c7c, HB_Letter_Lowercase}, - {0x2c7d, 0x2c7d, HB_Letter_Modifier}, - {0x2c7e, 0x2c7f, HB_Other_NotAssigned}, - {0x2c80, 0x2c80, HB_Letter_Uppercase}, - {0x2c81, 0x2c81, HB_Letter_Lowercase}, - {0x2c82, 0x2c82, HB_Letter_Uppercase}, - {0x2c83, 0x2c83, HB_Letter_Lowercase}, - {0x2c84, 0x2c84, HB_Letter_Uppercase}, - {0x2c85, 0x2c85, HB_Letter_Lowercase}, - {0x2c86, 0x2c86, HB_Letter_Uppercase}, - {0x2c87, 0x2c87, HB_Letter_Lowercase}, - {0x2c88, 0x2c88, HB_Letter_Uppercase}, - {0x2c89, 0x2c89, HB_Letter_Lowercase}, - {0x2c8a, 0x2c8a, HB_Letter_Uppercase}, - {0x2c8b, 0x2c8b, HB_Letter_Lowercase}, - {0x2c8c, 0x2c8c, HB_Letter_Uppercase}, - {0x2c8d, 0x2c8d, HB_Letter_Lowercase}, - {0x2c8e, 0x2c8e, HB_Letter_Uppercase}, - {0x2c8f, 0x2c8f, HB_Letter_Lowercase}, - {0x2c90, 0x2c90, HB_Letter_Uppercase}, - {0x2c91, 0x2c91, HB_Letter_Lowercase}, - {0x2c92, 0x2c92, HB_Letter_Uppercase}, - {0x2c93, 0x2c93, HB_Letter_Lowercase}, - {0x2c94, 0x2c94, HB_Letter_Uppercase}, - {0x2c95, 0x2c95, HB_Letter_Lowercase}, - {0x2c96, 0x2c96, HB_Letter_Uppercase}, - {0x2c97, 0x2c97, HB_Letter_Lowercase}, - {0x2c98, 0x2c98, HB_Letter_Uppercase}, - {0x2c99, 0x2c99, HB_Letter_Lowercase}, - {0x2c9a, 0x2c9a, HB_Letter_Uppercase}, - {0x2c9b, 0x2c9b, HB_Letter_Lowercase}, - {0x2c9c, 0x2c9c, HB_Letter_Uppercase}, - {0x2c9d, 0x2c9d, HB_Letter_Lowercase}, - {0x2c9e, 0x2c9e, HB_Letter_Uppercase}, - {0x2c9f, 0x2c9f, HB_Letter_Lowercase}, - {0x2ca0, 0x2ca0, HB_Letter_Uppercase}, - {0x2ca1, 0x2ca1, HB_Letter_Lowercase}, - {0x2ca2, 0x2ca2, HB_Letter_Uppercase}, - {0x2ca3, 0x2ca3, HB_Letter_Lowercase}, - {0x2ca4, 0x2ca4, HB_Letter_Uppercase}, - {0x2ca5, 0x2ca5, HB_Letter_Lowercase}, - {0x2ca6, 0x2ca6, HB_Letter_Uppercase}, - {0x2ca7, 0x2ca7, HB_Letter_Lowercase}, - {0x2ca8, 0x2ca8, HB_Letter_Uppercase}, - {0x2ca9, 0x2ca9, HB_Letter_Lowercase}, - {0x2caa, 0x2caa, HB_Letter_Uppercase}, - {0x2cab, 0x2cab, HB_Letter_Lowercase}, - {0x2cac, 0x2cac, HB_Letter_Uppercase}, - {0x2cad, 0x2cad, HB_Letter_Lowercase}, - {0x2cae, 0x2cae, HB_Letter_Uppercase}, - {0x2caf, 0x2caf, HB_Letter_Lowercase}, - {0x2cb0, 0x2cb0, HB_Letter_Uppercase}, - {0x2cb1, 0x2cb1, HB_Letter_Lowercase}, - {0x2cb2, 0x2cb2, HB_Letter_Uppercase}, - {0x2cb3, 0x2cb3, HB_Letter_Lowercase}, - {0x2cb4, 0x2cb4, HB_Letter_Uppercase}, - {0x2cb5, 0x2cb5, HB_Letter_Lowercase}, - {0x2cb6, 0x2cb6, HB_Letter_Uppercase}, - {0x2cb7, 0x2cb7, HB_Letter_Lowercase}, - {0x2cb8, 0x2cb8, HB_Letter_Uppercase}, - {0x2cb9, 0x2cb9, HB_Letter_Lowercase}, - {0x2cba, 0x2cba, HB_Letter_Uppercase}, - {0x2cbb, 0x2cbb, HB_Letter_Lowercase}, - {0x2cbc, 0x2cbc, HB_Letter_Uppercase}, - {0x2cbd, 0x2cbd, HB_Letter_Lowercase}, - {0x2cbe, 0x2cbe, HB_Letter_Uppercase}, - {0x2cbf, 0x2cbf, HB_Letter_Lowercase}, - {0x2cc0, 0x2cc0, HB_Letter_Uppercase}, - {0x2cc1, 0x2cc1, HB_Letter_Lowercase}, - {0x2cc2, 0x2cc2, HB_Letter_Uppercase}, - {0x2cc3, 0x2cc3, HB_Letter_Lowercase}, - {0x2cc4, 0x2cc4, HB_Letter_Uppercase}, - {0x2cc5, 0x2cc5, HB_Letter_Lowercase}, - {0x2cc6, 0x2cc6, HB_Letter_Uppercase}, - {0x2cc7, 0x2cc7, HB_Letter_Lowercase}, - {0x2cc8, 0x2cc8, HB_Letter_Uppercase}, - {0x2cc9, 0x2cc9, HB_Letter_Lowercase}, - {0x2cca, 0x2cca, HB_Letter_Uppercase}, - {0x2ccb, 0x2ccb, HB_Letter_Lowercase}, - {0x2ccc, 0x2ccc, HB_Letter_Uppercase}, - {0x2ccd, 0x2ccd, HB_Letter_Lowercase}, - {0x2cce, 0x2cce, HB_Letter_Uppercase}, - {0x2ccf, 0x2ccf, HB_Letter_Lowercase}, - {0x2cd0, 0x2cd0, HB_Letter_Uppercase}, - {0x2cd1, 0x2cd1, HB_Letter_Lowercase}, - {0x2cd2, 0x2cd2, HB_Letter_Uppercase}, - {0x2cd3, 0x2cd3, HB_Letter_Lowercase}, - {0x2cd4, 0x2cd4, HB_Letter_Uppercase}, - {0x2cd5, 0x2cd5, HB_Letter_Lowercase}, - {0x2cd6, 0x2cd6, HB_Letter_Uppercase}, - {0x2cd7, 0x2cd7, HB_Letter_Lowercase}, - {0x2cd8, 0x2cd8, HB_Letter_Uppercase}, - {0x2cd9, 0x2cd9, HB_Letter_Lowercase}, - {0x2cda, 0x2cda, HB_Letter_Uppercase}, - {0x2cdb, 0x2cdb, HB_Letter_Lowercase}, - {0x2cdc, 0x2cdc, HB_Letter_Uppercase}, - {0x2cdd, 0x2cdd, HB_Letter_Lowercase}, - {0x2cde, 0x2cde, HB_Letter_Uppercase}, - {0x2cdf, 0x2cdf, HB_Letter_Lowercase}, - {0x2ce0, 0x2ce0, HB_Letter_Uppercase}, - {0x2ce1, 0x2ce1, HB_Letter_Lowercase}, - {0x2ce2, 0x2ce2, HB_Letter_Uppercase}, - {0x2ce3, 0x2ce4, HB_Letter_Lowercase}, - {0x2ce5, 0x2cea, HB_Symbol_Other}, - {0x2ceb, 0x2cf8, HB_Other_NotAssigned}, - {0x2cf9, 0x2cfc, HB_Punctuation_Other}, - {0x2cfd, 0x2cfd, HB_Number_Other}, - {0x2cfe, 0x2cff, HB_Punctuation_Other}, - {0x2d00, 0x2d25, HB_Letter_Lowercase}, - {0x2d26, 0x2d2f, HB_Other_NotAssigned}, - {0x2d30, 0x2d65, HB_Letter_Other}, - {0x2d66, 0x2d6e, HB_Other_NotAssigned}, - {0x2d6f, 0x2d6f, HB_Letter_Modifier}, - {0x2d70, 0x2d7f, HB_Other_NotAssigned}, - {0x2d80, 0x2d96, HB_Letter_Other}, - {0x2d97, 0x2d9f, HB_Other_NotAssigned}, - {0x2da0, 0x2da6, HB_Letter_Other}, - {0x2da7, 0x2da7, HB_Other_NotAssigned}, - {0x2da8, 0x2dae, HB_Letter_Other}, - {0x2daf, 0x2daf, HB_Other_NotAssigned}, - {0x2db0, 0x2db6, HB_Letter_Other}, - {0x2db7, 0x2db7, HB_Other_NotAssigned}, - {0x2db8, 0x2dbe, HB_Letter_Other}, - {0x2dbf, 0x2dbf, HB_Other_NotAssigned}, - {0x2dc0, 0x2dc6, HB_Letter_Other}, - {0x2dc7, 0x2dc7, HB_Other_NotAssigned}, - {0x2dc8, 0x2dce, HB_Letter_Other}, - {0x2dcf, 0x2dcf, HB_Other_NotAssigned}, - {0x2dd0, 0x2dd6, HB_Letter_Other}, - {0x2dd7, 0x2dd7, HB_Other_NotAssigned}, - {0x2dd8, 0x2dde, HB_Letter_Other}, - {0x2ddf, 0x2ddf, HB_Other_NotAssigned}, - {0x2de0, 0x2dff, HB_Mark_NonSpacing}, - {0x2e00, 0x2e01, HB_Punctuation_Other}, - {0x2e02, 0x2e02, HB_Punctuation_InitialQuote}, - {0x2e03, 0x2e03, HB_Punctuation_FinalQuote}, - {0x2e04, 0x2e04, HB_Punctuation_InitialQuote}, - {0x2e05, 0x2e05, HB_Punctuation_FinalQuote}, - {0x2e06, 0x2e08, HB_Punctuation_Other}, - {0x2e09, 0x2e09, HB_Punctuation_InitialQuote}, - {0x2e0a, 0x2e0a, HB_Punctuation_FinalQuote}, - {0x2e0b, 0x2e0b, HB_Punctuation_Other}, - {0x2e0c, 0x2e0c, HB_Punctuation_InitialQuote}, - {0x2e0d, 0x2e0d, HB_Punctuation_FinalQuote}, - {0x2e0e, 0x2e16, HB_Punctuation_Other}, - {0x2e17, 0x2e17, HB_Punctuation_Dash}, - {0x2e18, 0x2e19, HB_Punctuation_Other}, - {0x2e1a, 0x2e1a, HB_Punctuation_Dash}, - {0x2e1b, 0x2e1b, HB_Punctuation_Other}, - {0x2e1c, 0x2e1c, HB_Punctuation_InitialQuote}, - {0x2e1d, 0x2e1d, HB_Punctuation_FinalQuote}, - {0x2e1e, 0x2e1f, HB_Punctuation_Other}, - {0x2e20, 0x2e20, HB_Punctuation_InitialQuote}, - {0x2e21, 0x2e21, HB_Punctuation_FinalQuote}, - {0x2e22, 0x2e22, HB_Punctuation_Open}, - {0x2e23, 0x2e23, HB_Punctuation_Close}, - {0x2e24, 0x2e24, HB_Punctuation_Open}, - {0x2e25, 0x2e25, HB_Punctuation_Close}, - {0x2e26, 0x2e26, HB_Punctuation_Open}, - {0x2e27, 0x2e27, HB_Punctuation_Close}, - {0x2e28, 0x2e28, HB_Punctuation_Open}, - {0x2e29, 0x2e29, HB_Punctuation_Close}, - {0x2e2a, 0x2e2e, HB_Punctuation_Other}, - {0x2e2f, 0x2e2f, HB_Letter_Modifier}, - {0x2e30, 0x2e30, HB_Punctuation_Other}, - {0x2e31, 0x2e7f, HB_Other_NotAssigned}, - {0x2e80, 0x2e99, HB_Symbol_Other}, - {0x2e9a, 0x2e9a, HB_Other_NotAssigned}, - {0x2e9b, 0x2ef3, HB_Symbol_Other}, - {0x2ef4, 0x2eff, HB_Other_NotAssigned}, - {0x2f00, 0x2fd5, HB_Symbol_Other}, - {0x2fd6, 0x2fef, HB_Other_NotAssigned}, - {0x2ff0, 0x2ffb, HB_Symbol_Other}, - {0x2ffc, 0x2fff, HB_Other_NotAssigned}, - {0x3000, 0x3000, HB_Separator_Space}, - {0x3001, 0x3003, HB_Punctuation_Other}, - {0x3004, 0x3004, HB_Symbol_Other}, - {0x3005, 0x3005, HB_Letter_Modifier}, - {0x3006, 0x3006, HB_Letter_Other}, - {0x3007, 0x3007, HB_Number_Letter}, - {0x3008, 0x3008, HB_Punctuation_Open}, - {0x3009, 0x3009, HB_Punctuation_Close}, - {0x300a, 0x300a, HB_Punctuation_Open}, - {0x300b, 0x300b, HB_Punctuation_Close}, - {0x300c, 0x300c, HB_Punctuation_Open}, - {0x300d, 0x300d, HB_Punctuation_Close}, - {0x300e, 0x300e, HB_Punctuation_Open}, - {0x300f, 0x300f, HB_Punctuation_Close}, - {0x3010, 0x3010, HB_Punctuation_Open}, - {0x3011, 0x3011, HB_Punctuation_Close}, - {0x3012, 0x3013, HB_Symbol_Other}, - {0x3014, 0x3014, HB_Punctuation_Open}, - {0x3015, 0x3015, HB_Punctuation_Close}, - {0x3016, 0x3016, HB_Punctuation_Open}, - {0x3017, 0x3017, HB_Punctuation_Close}, - {0x3018, 0x3018, HB_Punctuation_Open}, - {0x3019, 0x3019, HB_Punctuation_Close}, - {0x301a, 0x301a, HB_Punctuation_Open}, - {0x301b, 0x301b, HB_Punctuation_Close}, - {0x301c, 0x301c, HB_Punctuation_Dash}, - {0x301d, 0x301d, HB_Punctuation_Open}, - {0x301e, 0x301f, HB_Punctuation_Close}, - {0x3020, 0x3020, HB_Symbol_Other}, - {0x3021, 0x3029, HB_Number_Letter}, - {0x302a, 0x302f, HB_Mark_NonSpacing}, - {0x3030, 0x3030, HB_Punctuation_Dash}, - {0x3031, 0x3035, HB_Letter_Modifier}, - {0x3036, 0x3037, HB_Symbol_Other}, - {0x3038, 0x303a, HB_Number_Letter}, - {0x303b, 0x303b, HB_Letter_Modifier}, - {0x303c, 0x303c, HB_Letter_Other}, - {0x303d, 0x303d, HB_Punctuation_Other}, - {0x303e, 0x303f, HB_Symbol_Other}, - {0x3040, 0x3040, HB_Other_NotAssigned}, - {0x3041, 0x3096, HB_Letter_Other}, - {0x3097, 0x3098, HB_Other_NotAssigned}, - {0x3099, 0x309a, HB_Mark_NonSpacing}, - {0x309b, 0x309c, HB_Symbol_Modifier}, - {0x309d, 0x309e, HB_Letter_Modifier}, - {0x309f, 0x309f, HB_Letter_Other}, - {0x30a0, 0x30a0, HB_Punctuation_Dash}, - {0x30a1, 0x30fa, HB_Letter_Other}, - {0x30fb, 0x30fb, HB_Punctuation_Other}, - {0x30fc, 0x30fe, HB_Letter_Modifier}, - {0x30ff, 0x30ff, HB_Letter_Other}, - {0x3100, 0x3104, HB_Other_NotAssigned}, - {0x3105, 0x312d, HB_Letter_Other}, - {0x312e, 0x3130, HB_Other_NotAssigned}, - {0x3131, 0x318e, HB_Letter_Other}, - {0x318f, 0x318f, HB_Other_NotAssigned}, - {0x3190, 0x3191, HB_Symbol_Other}, - {0x3192, 0x3195, HB_Number_Other}, - {0x3196, 0x319f, HB_Symbol_Other}, - {0x31a0, 0x31b7, HB_Letter_Other}, - {0x31b8, 0x31bf, HB_Other_NotAssigned}, - {0x31c0, 0x31e3, HB_Symbol_Other}, - {0x31e4, 0x31ef, HB_Other_NotAssigned}, - {0x31f0, 0x31ff, HB_Letter_Other}, - {0x3200, 0x321e, HB_Symbol_Other}, - {0x321f, 0x321f, HB_Other_NotAssigned}, - {0x3220, 0x3229, HB_Number_Other}, - {0x322a, 0x3243, HB_Symbol_Other}, - {0x3244, 0x324f, HB_Other_NotAssigned}, - {0x3250, 0x3250, HB_Symbol_Other}, - {0x3251, 0x325f, HB_Number_Other}, - {0x3260, 0x327f, HB_Symbol_Other}, - {0x3280, 0x3289, HB_Number_Other}, - {0x328a, 0x32b0, HB_Symbol_Other}, - {0x32b1, 0x32bf, HB_Number_Other}, - {0x32c0, 0x32fe, HB_Symbol_Other}, - {0x32ff, 0x32ff, HB_Other_NotAssigned}, - {0x3300, 0x33ff, HB_Symbol_Other}, - {0x3400, 0x4db5, HB_Letter_Other}, - {0x4db6, 0x4dbf, HB_Other_NotAssigned}, - {0x4dc0, 0x4dff, HB_Symbol_Other}, - {0x4e00, 0x9fc3, HB_Letter_Other}, - {0x9fc4, 0x9fff, HB_Other_NotAssigned}, - {0xa000, 0xa014, HB_Letter_Other}, - {0xa015, 0xa015, HB_Letter_Modifier}, - {0xa016, 0xa48c, HB_Letter_Other}, - {0xa48d, 0xa48f, HB_Other_NotAssigned}, - {0xa490, 0xa4c6, HB_Symbol_Other}, - {0xa4c7, 0xa4ff, HB_Other_NotAssigned}, - {0xa500, 0xa60b, HB_Letter_Other}, - {0xa60c, 0xa60c, HB_Letter_Modifier}, - {0xa60d, 0xa60f, HB_Punctuation_Other}, - {0xa610, 0xa61f, HB_Letter_Other}, - {0xa620, 0xa629, HB_Number_DecimalDigit}, - {0xa62a, 0xa62b, HB_Letter_Other}, - {0xa62c, 0xa63f, HB_Other_NotAssigned}, - {0xa640, 0xa640, HB_Letter_Uppercase}, - {0xa641, 0xa641, HB_Letter_Lowercase}, - {0xa642, 0xa642, HB_Letter_Uppercase}, - {0xa643, 0xa643, HB_Letter_Lowercase}, - {0xa644, 0xa644, HB_Letter_Uppercase}, - {0xa645, 0xa645, HB_Letter_Lowercase}, - {0xa646, 0xa646, HB_Letter_Uppercase}, - {0xa647, 0xa647, HB_Letter_Lowercase}, - {0xa648, 0xa648, HB_Letter_Uppercase}, - {0xa649, 0xa649, HB_Letter_Lowercase}, - {0xa64a, 0xa64a, HB_Letter_Uppercase}, - {0xa64b, 0xa64b, HB_Letter_Lowercase}, - {0xa64c, 0xa64c, HB_Letter_Uppercase}, - {0xa64d, 0xa64d, HB_Letter_Lowercase}, - {0xa64e, 0xa64e, HB_Letter_Uppercase}, - {0xa64f, 0xa64f, HB_Letter_Lowercase}, - {0xa650, 0xa650, HB_Letter_Uppercase}, - {0xa651, 0xa651, HB_Letter_Lowercase}, - {0xa652, 0xa652, HB_Letter_Uppercase}, - {0xa653, 0xa653, HB_Letter_Lowercase}, - {0xa654, 0xa654, HB_Letter_Uppercase}, - {0xa655, 0xa655, HB_Letter_Lowercase}, - {0xa656, 0xa656, HB_Letter_Uppercase}, - {0xa657, 0xa657, HB_Letter_Lowercase}, - {0xa658, 0xa658, HB_Letter_Uppercase}, - {0xa659, 0xa659, HB_Letter_Lowercase}, - {0xa65a, 0xa65a, HB_Letter_Uppercase}, - {0xa65b, 0xa65b, HB_Letter_Lowercase}, - {0xa65c, 0xa65c, HB_Letter_Uppercase}, - {0xa65d, 0xa65d, HB_Letter_Lowercase}, - {0xa65e, 0xa65e, HB_Letter_Uppercase}, - {0xa65f, 0xa65f, HB_Letter_Lowercase}, - {0xa660, 0xa661, HB_Other_NotAssigned}, - {0xa662, 0xa662, HB_Letter_Uppercase}, - {0xa663, 0xa663, HB_Letter_Lowercase}, - {0xa664, 0xa664, HB_Letter_Uppercase}, - {0xa665, 0xa665, HB_Letter_Lowercase}, - {0xa666, 0xa666, HB_Letter_Uppercase}, - {0xa667, 0xa667, HB_Letter_Lowercase}, - {0xa668, 0xa668, HB_Letter_Uppercase}, - {0xa669, 0xa669, HB_Letter_Lowercase}, - {0xa66a, 0xa66a, HB_Letter_Uppercase}, - {0xa66b, 0xa66b, HB_Letter_Lowercase}, - {0xa66c, 0xa66c, HB_Letter_Uppercase}, - {0xa66d, 0xa66d, HB_Letter_Lowercase}, - {0xa66e, 0xa66e, HB_Letter_Other}, - {0xa66f, 0xa66f, HB_Mark_NonSpacing}, - {0xa670, 0xa672, HB_Mark_Enclosing}, - {0xa673, 0xa673, HB_Punctuation_Other}, - {0xa674, 0xa67b, HB_Other_NotAssigned}, - {0xa67c, 0xa67d, HB_Mark_NonSpacing}, - {0xa67e, 0xa67e, HB_Punctuation_Other}, - {0xa67f, 0xa67f, HB_Letter_Modifier}, - {0xa680, 0xa680, HB_Letter_Uppercase}, - {0xa681, 0xa681, HB_Letter_Lowercase}, - {0xa682, 0xa682, HB_Letter_Uppercase}, - {0xa683, 0xa683, HB_Letter_Lowercase}, - {0xa684, 0xa684, HB_Letter_Uppercase}, - {0xa685, 0xa685, HB_Letter_Lowercase}, - {0xa686, 0xa686, HB_Letter_Uppercase}, - {0xa687, 0xa687, HB_Letter_Lowercase}, - {0xa688, 0xa688, HB_Letter_Uppercase}, - {0xa689, 0xa689, HB_Letter_Lowercase}, - {0xa68a, 0xa68a, HB_Letter_Uppercase}, - {0xa68b, 0xa68b, HB_Letter_Lowercase}, - {0xa68c, 0xa68c, HB_Letter_Uppercase}, - {0xa68d, 0xa68d, HB_Letter_Lowercase}, - {0xa68e, 0xa68e, HB_Letter_Uppercase}, - {0xa68f, 0xa68f, HB_Letter_Lowercase}, - {0xa690, 0xa690, HB_Letter_Uppercase}, - {0xa691, 0xa691, HB_Letter_Lowercase}, - {0xa692, 0xa692, HB_Letter_Uppercase}, - {0xa693, 0xa693, HB_Letter_Lowercase}, - {0xa694, 0xa694, HB_Letter_Uppercase}, - {0xa695, 0xa695, HB_Letter_Lowercase}, - {0xa696, 0xa696, HB_Letter_Uppercase}, - {0xa697, 0xa697, HB_Letter_Lowercase}, - {0xa698, 0xa6ff, HB_Other_NotAssigned}, - {0xa700, 0xa716, HB_Symbol_Modifier}, - {0xa717, 0xa71f, HB_Letter_Modifier}, - {0xa720, 0xa721, HB_Symbol_Modifier}, - {0xa722, 0xa722, HB_Letter_Uppercase}, - {0xa723, 0xa723, HB_Letter_Lowercase}, - {0xa724, 0xa724, HB_Letter_Uppercase}, - {0xa725, 0xa725, HB_Letter_Lowercase}, - {0xa726, 0xa726, HB_Letter_Uppercase}, - {0xa727, 0xa727, HB_Letter_Lowercase}, - {0xa728, 0xa728, HB_Letter_Uppercase}, - {0xa729, 0xa729, HB_Letter_Lowercase}, - {0xa72a, 0xa72a, HB_Letter_Uppercase}, - {0xa72b, 0xa72b, HB_Letter_Lowercase}, - {0xa72c, 0xa72c, HB_Letter_Uppercase}, - {0xa72d, 0xa72d, HB_Letter_Lowercase}, - {0xa72e, 0xa72e, HB_Letter_Uppercase}, - {0xa72f, 0xa731, HB_Letter_Lowercase}, - {0xa732, 0xa732, HB_Letter_Uppercase}, - {0xa733, 0xa733, HB_Letter_Lowercase}, - {0xa734, 0xa734, HB_Letter_Uppercase}, - {0xa735, 0xa735, HB_Letter_Lowercase}, - {0xa736, 0xa736, HB_Letter_Uppercase}, - {0xa737, 0xa737, HB_Letter_Lowercase}, - {0xa738, 0xa738, HB_Letter_Uppercase}, - {0xa739, 0xa739, HB_Letter_Lowercase}, - {0xa73a, 0xa73a, HB_Letter_Uppercase}, - {0xa73b, 0xa73b, HB_Letter_Lowercase}, - {0xa73c, 0xa73c, HB_Letter_Uppercase}, - {0xa73d, 0xa73d, HB_Letter_Lowercase}, - {0xa73e, 0xa73e, HB_Letter_Uppercase}, - {0xa73f, 0xa73f, HB_Letter_Lowercase}, - {0xa740, 0xa740, HB_Letter_Uppercase}, - {0xa741, 0xa741, HB_Letter_Lowercase}, - {0xa742, 0xa742, HB_Letter_Uppercase}, - {0xa743, 0xa743, HB_Letter_Lowercase}, - {0xa744, 0xa744, HB_Letter_Uppercase}, - {0xa745, 0xa745, HB_Letter_Lowercase}, - {0xa746, 0xa746, HB_Letter_Uppercase}, - {0xa747, 0xa747, HB_Letter_Lowercase}, - {0xa748, 0xa748, HB_Letter_Uppercase}, - {0xa749, 0xa749, HB_Letter_Lowercase}, - {0xa74a, 0xa74a, HB_Letter_Uppercase}, - {0xa74b, 0xa74b, HB_Letter_Lowercase}, - {0xa74c, 0xa74c, HB_Letter_Uppercase}, - {0xa74d, 0xa74d, HB_Letter_Lowercase}, - {0xa74e, 0xa74e, HB_Letter_Uppercase}, - {0xa74f, 0xa74f, HB_Letter_Lowercase}, - {0xa750, 0xa750, HB_Letter_Uppercase}, - {0xa751, 0xa751, HB_Letter_Lowercase}, - {0xa752, 0xa752, HB_Letter_Uppercase}, - {0xa753, 0xa753, HB_Letter_Lowercase}, - {0xa754, 0xa754, HB_Letter_Uppercase}, - {0xa755, 0xa755, HB_Letter_Lowercase}, - {0xa756, 0xa756, HB_Letter_Uppercase}, - {0xa757, 0xa757, HB_Letter_Lowercase}, - {0xa758, 0xa758, HB_Letter_Uppercase}, - {0xa759, 0xa759, HB_Letter_Lowercase}, - {0xa75a, 0xa75a, HB_Letter_Uppercase}, - {0xa75b, 0xa75b, HB_Letter_Lowercase}, - {0xa75c, 0xa75c, HB_Letter_Uppercase}, - {0xa75d, 0xa75d, HB_Letter_Lowercase}, - {0xa75e, 0xa75e, HB_Letter_Uppercase}, - {0xa75f, 0xa75f, HB_Letter_Lowercase}, - {0xa760, 0xa760, HB_Letter_Uppercase}, - {0xa761, 0xa761, HB_Letter_Lowercase}, - {0xa762, 0xa762, HB_Letter_Uppercase}, - {0xa763, 0xa763, HB_Letter_Lowercase}, - {0xa764, 0xa764, HB_Letter_Uppercase}, - {0xa765, 0xa765, HB_Letter_Lowercase}, - {0xa766, 0xa766, HB_Letter_Uppercase}, - {0xa767, 0xa767, HB_Letter_Lowercase}, - {0xa768, 0xa768, HB_Letter_Uppercase}, - {0xa769, 0xa769, HB_Letter_Lowercase}, - {0xa76a, 0xa76a, HB_Letter_Uppercase}, - {0xa76b, 0xa76b, HB_Letter_Lowercase}, - {0xa76c, 0xa76c, HB_Letter_Uppercase}, - {0xa76d, 0xa76d, HB_Letter_Lowercase}, - {0xa76e, 0xa76e, HB_Letter_Uppercase}, - {0xa76f, 0xa76f, HB_Letter_Lowercase}, - {0xa770, 0xa770, HB_Letter_Modifier}, - {0xa771, 0xa778, HB_Letter_Lowercase}, - {0xa779, 0xa779, HB_Letter_Uppercase}, - {0xa77a, 0xa77a, HB_Letter_Lowercase}, - {0xa77b, 0xa77b, HB_Letter_Uppercase}, - {0xa77c, 0xa77c, HB_Letter_Lowercase}, - {0xa77d, 0xa77e, HB_Letter_Uppercase}, - {0xa77f, 0xa77f, HB_Letter_Lowercase}, - {0xa780, 0xa780, HB_Letter_Uppercase}, - {0xa781, 0xa781, HB_Letter_Lowercase}, - {0xa782, 0xa782, HB_Letter_Uppercase}, - {0xa783, 0xa783, HB_Letter_Lowercase}, - {0xa784, 0xa784, HB_Letter_Uppercase}, - {0xa785, 0xa785, HB_Letter_Lowercase}, - {0xa786, 0xa786, HB_Letter_Uppercase}, - {0xa787, 0xa787, HB_Letter_Lowercase}, - {0xa788, 0xa788, HB_Letter_Modifier}, - {0xa789, 0xa78a, HB_Symbol_Modifier}, - {0xa78b, 0xa78b, HB_Letter_Uppercase}, - {0xa78c, 0xa78c, HB_Letter_Lowercase}, - {0xa78d, 0xa7fa, HB_Other_NotAssigned}, - {0xa7fb, 0xa801, HB_Letter_Other}, - {0xa802, 0xa802, HB_Mark_NonSpacing}, - {0xa803, 0xa805, HB_Letter_Other}, - {0xa806, 0xa806, HB_Mark_NonSpacing}, - {0xa807, 0xa80a, HB_Letter_Other}, - {0xa80b, 0xa80b, HB_Mark_NonSpacing}, - {0xa80c, 0xa822, HB_Letter_Other}, - {0xa823, 0xa824, HB_Mark_SpacingCombining}, - {0xa825, 0xa826, HB_Mark_NonSpacing}, - {0xa827, 0xa827, HB_Mark_SpacingCombining}, - {0xa828, 0xa82b, HB_Symbol_Other}, - {0xa82c, 0xa83f, HB_Other_NotAssigned}, - {0xa840, 0xa873, HB_Letter_Other}, - {0xa874, 0xa877, HB_Punctuation_Other}, - {0xa878, 0xa87f, HB_Other_NotAssigned}, - {0xa880, 0xa881, HB_Mark_SpacingCombining}, - {0xa882, 0xa8b3, HB_Letter_Other}, - {0xa8b4, 0xa8c3, HB_Mark_SpacingCombining}, - {0xa8c4, 0xa8c4, HB_Mark_NonSpacing}, - {0xa8c5, 0xa8cd, HB_Other_NotAssigned}, - {0xa8ce, 0xa8cf, HB_Punctuation_Other}, - {0xa8d0, 0xa8d9, HB_Number_DecimalDigit}, - {0xa8da, 0xa8ff, HB_Other_NotAssigned}, - {0xa900, 0xa909, HB_Number_DecimalDigit}, - {0xa90a, 0xa925, HB_Letter_Other}, - {0xa926, 0xa92d, HB_Mark_NonSpacing}, - {0xa92e, 0xa92f, HB_Punctuation_Other}, - {0xa930, 0xa946, HB_Letter_Other}, - {0xa947, 0xa951, HB_Mark_NonSpacing}, - {0xa952, 0xa953, HB_Mark_SpacingCombining}, - {0xa954, 0xa95e, HB_Other_NotAssigned}, - {0xa95f, 0xa95f, HB_Punctuation_Other}, - {0xa960, 0xa9ff, HB_Other_NotAssigned}, - {0xaa00, 0xaa28, HB_Letter_Other}, - {0xaa29, 0xaa2e, HB_Mark_NonSpacing}, - {0xaa2f, 0xaa30, HB_Mark_SpacingCombining}, - {0xaa31, 0xaa32, HB_Mark_NonSpacing}, - {0xaa33, 0xaa34, HB_Mark_SpacingCombining}, - {0xaa35, 0xaa36, HB_Mark_NonSpacing}, - {0xaa37, 0xaa3f, HB_Other_NotAssigned}, - {0xaa40, 0xaa42, HB_Letter_Other}, - {0xaa43, 0xaa43, HB_Mark_NonSpacing}, - {0xaa44, 0xaa4b, HB_Letter_Other}, - {0xaa4c, 0xaa4c, HB_Mark_NonSpacing}, - {0xaa4d, 0xaa4d, HB_Mark_SpacingCombining}, - {0xaa4e, 0xaa4f, HB_Other_NotAssigned}, - {0xaa50, 0xaa59, HB_Number_DecimalDigit}, - {0xaa5a, 0xaa5b, HB_Other_NotAssigned}, - {0xaa5c, 0xaa5f, HB_Punctuation_Other}, - {0xaa60, 0xabff, HB_Other_NotAssigned}, - {0xac00, 0xd7a3, HB_Letter_Other}, - {0xd7a4, 0xd7ff, HB_Other_NotAssigned}, - {0xd800, 0xdfff, HB_Other_Surrogate}, - {0xe000, 0xf8ff, HB_Other_PrivateUse}, - {0xf900, 0xfa2d, HB_Letter_Other}, - {0xfa2e, 0xfa2f, HB_Other_NotAssigned}, - {0xfa30, 0xfa6a, HB_Letter_Other}, - {0xfa6b, 0xfa6f, HB_Other_NotAssigned}, - {0xfa70, 0xfad9, HB_Letter_Other}, - {0xfada, 0xfaff, HB_Other_NotAssigned}, - {0xfb00, 0xfb06, HB_Letter_Lowercase}, - {0xfb07, 0xfb12, HB_Other_NotAssigned}, - {0xfb13, 0xfb17, HB_Letter_Lowercase}, - {0xfb18, 0xfb1c, HB_Other_NotAssigned}, - {0xfb1d, 0xfb1d, HB_Letter_Other}, - {0xfb1e, 0xfb1e, HB_Mark_NonSpacing}, - {0xfb1f, 0xfb28, HB_Letter_Other}, - {0xfb29, 0xfb29, HB_Symbol_Math}, - {0xfb2a, 0xfb36, HB_Letter_Other}, - {0xfb37, 0xfb37, HB_Other_NotAssigned}, - {0xfb38, 0xfb3c, HB_Letter_Other}, - {0xfb3d, 0xfb3d, HB_Other_NotAssigned}, - {0xfb3e, 0xfb3e, HB_Letter_Other}, - {0xfb3f, 0xfb3f, HB_Other_NotAssigned}, - {0xfb40, 0xfb41, HB_Letter_Other}, - {0xfb42, 0xfb42, HB_Other_NotAssigned}, - {0xfb43, 0xfb44, HB_Letter_Other}, - {0xfb45, 0xfb45, HB_Other_NotAssigned}, - {0xfb46, 0xfbb1, HB_Letter_Other}, - {0xfbb2, 0xfbd2, HB_Other_NotAssigned}, - {0xfbd3, 0xfd3d, HB_Letter_Other}, - {0xfd3e, 0xfd3e, HB_Punctuation_Open}, - {0xfd3f, 0xfd3f, HB_Punctuation_Close}, - {0xfd40, 0xfd4f, HB_Other_NotAssigned}, - {0xfd50, 0xfd8f, HB_Letter_Other}, - {0xfd90, 0xfd91, HB_Other_NotAssigned}, - {0xfd92, 0xfdc7, HB_Letter_Other}, - {0xfdc8, 0xfdef, HB_Other_NotAssigned}, - {0xfdf0, 0xfdfb, HB_Letter_Other}, - {0xfdfc, 0xfdfc, HB_Symbol_Currency}, - {0xfdfd, 0xfdfd, HB_Symbol_Other}, - {0xfdfe, 0xfdff, HB_Other_NotAssigned}, - {0xfe00, 0xfe0f, HB_Mark_NonSpacing}, - {0xfe10, 0xfe16, HB_Punctuation_Other}, - {0xfe17, 0xfe17, HB_Punctuation_Open}, - {0xfe18, 0xfe18, HB_Punctuation_Close}, - {0xfe19, 0xfe19, HB_Punctuation_Other}, - {0xfe1a, 0xfe1f, HB_Other_NotAssigned}, - {0xfe20, 0xfe26, HB_Mark_NonSpacing}, - {0xfe27, 0xfe2f, HB_Other_NotAssigned}, - {0xfe30, 0xfe30, HB_Punctuation_Other}, - {0xfe31, 0xfe32, HB_Punctuation_Dash}, - {0xfe33, 0xfe34, HB_Punctuation_Connector}, - {0xfe35, 0xfe35, HB_Punctuation_Open}, - {0xfe36, 0xfe36, HB_Punctuation_Close}, - {0xfe37, 0xfe37, HB_Punctuation_Open}, - {0xfe38, 0xfe38, HB_Punctuation_Close}, - {0xfe39, 0xfe39, HB_Punctuation_Open}, - {0xfe3a, 0xfe3a, HB_Punctuation_Close}, - {0xfe3b, 0xfe3b, HB_Punctuation_Open}, - {0xfe3c, 0xfe3c, HB_Punctuation_Close}, - {0xfe3d, 0xfe3d, HB_Punctuation_Open}, - {0xfe3e, 0xfe3e, HB_Punctuation_Close}, - {0xfe3f, 0xfe3f, HB_Punctuation_Open}, - {0xfe40, 0xfe40, HB_Punctuation_Close}, - {0xfe41, 0xfe41, HB_Punctuation_Open}, - {0xfe42, 0xfe42, HB_Punctuation_Close}, - {0xfe43, 0xfe43, HB_Punctuation_Open}, - {0xfe44, 0xfe44, HB_Punctuation_Close}, - {0xfe45, 0xfe46, HB_Punctuation_Other}, - {0xfe47, 0xfe47, HB_Punctuation_Open}, - {0xfe48, 0xfe48, HB_Punctuation_Close}, - {0xfe49, 0xfe4c, HB_Punctuation_Other}, - {0xfe4d, 0xfe4f, HB_Punctuation_Connector}, - {0xfe50, 0xfe52, HB_Punctuation_Other}, - {0xfe53, 0xfe53, HB_Other_NotAssigned}, - {0xfe54, 0xfe57, HB_Punctuation_Other}, - {0xfe58, 0xfe58, HB_Punctuation_Dash}, - {0xfe59, 0xfe59, HB_Punctuation_Open}, - {0xfe5a, 0xfe5a, HB_Punctuation_Close}, - {0xfe5b, 0xfe5b, HB_Punctuation_Open}, - {0xfe5c, 0xfe5c, HB_Punctuation_Close}, - {0xfe5d, 0xfe5d, HB_Punctuation_Open}, - {0xfe5e, 0xfe5e, HB_Punctuation_Close}, - {0xfe5f, 0xfe61, HB_Punctuation_Other}, - {0xfe62, 0xfe62, HB_Symbol_Math}, - {0xfe63, 0xfe63, HB_Punctuation_Dash}, - {0xfe64, 0xfe66, HB_Symbol_Math}, - {0xfe67, 0xfe67, HB_Other_NotAssigned}, - {0xfe68, 0xfe68, HB_Punctuation_Other}, - {0xfe69, 0xfe69, HB_Symbol_Currency}, - {0xfe6a, 0xfe6b, HB_Punctuation_Other}, - {0xfe6c, 0xfe6f, HB_Other_NotAssigned}, - {0xfe70, 0xfe74, HB_Letter_Other}, - {0xfe75, 0xfe75, HB_Other_NotAssigned}, - {0xfe76, 0xfefc, HB_Letter_Other}, - {0xfefd, 0xfefe, HB_Other_NotAssigned}, - {0xfeff, 0xfeff, HB_Other_Format}, - {0xff00, 0xff00, HB_Other_NotAssigned}, - {0xff01, 0xff03, HB_Punctuation_Other}, - {0xff04, 0xff04, HB_Symbol_Currency}, - {0xff05, 0xff07, HB_Punctuation_Other}, - {0xff08, 0xff08, HB_Punctuation_Open}, - {0xff09, 0xff09, HB_Punctuation_Close}, - {0xff0a, 0xff0a, HB_Punctuation_Other}, - {0xff0b, 0xff0b, HB_Symbol_Math}, - {0xff0c, 0xff0c, HB_Punctuation_Other}, - {0xff0d, 0xff0d, HB_Punctuation_Dash}, - {0xff0e, 0xff0f, HB_Punctuation_Other}, - {0xff10, 0xff19, HB_Number_DecimalDigit}, - {0xff1a, 0xff1b, HB_Punctuation_Other}, - {0xff1c, 0xff1e, HB_Symbol_Math}, - {0xff1f, 0xff20, HB_Punctuation_Other}, - {0xff21, 0xff3a, HB_Letter_Uppercase}, - {0xff3b, 0xff3b, HB_Punctuation_Open}, - {0xff3c, 0xff3c, HB_Punctuation_Other}, - {0xff3d, 0xff3d, HB_Punctuation_Close}, - {0xff3e, 0xff3e, HB_Symbol_Modifier}, - {0xff3f, 0xff3f, HB_Punctuation_Connector}, - {0xff40, 0xff40, HB_Symbol_Modifier}, - {0xff41, 0xff5a, HB_Letter_Lowercase}, - {0xff5b, 0xff5b, HB_Punctuation_Open}, - {0xff5c, 0xff5c, HB_Symbol_Math}, - {0xff5d, 0xff5d, HB_Punctuation_Close}, - {0xff5e, 0xff5e, HB_Symbol_Math}, - {0xff5f, 0xff5f, HB_Punctuation_Open}, - {0xff60, 0xff60, HB_Punctuation_Close}, - {0xff61, 0xff61, HB_Punctuation_Other}, - {0xff62, 0xff62, HB_Punctuation_Open}, - {0xff63, 0xff63, HB_Punctuation_Close}, - {0xff64, 0xff65, HB_Punctuation_Other}, - {0xff66, 0xff6f, HB_Letter_Other}, - {0xff70, 0xff70, HB_Letter_Modifier}, - {0xff71, 0xff9d, HB_Letter_Other}, - {0xff9e, 0xff9f, HB_Letter_Modifier}, - {0xffa0, 0xffbe, HB_Letter_Other}, - {0xffbf, 0xffc1, HB_Other_NotAssigned}, - {0xffc2, 0xffc7, HB_Letter_Other}, - {0xffc8, 0xffc9, HB_Other_NotAssigned}, - {0xffca, 0xffcf, HB_Letter_Other}, - {0xffd0, 0xffd1, HB_Other_NotAssigned}, - {0xffd2, 0xffd7, HB_Letter_Other}, - {0xffd8, 0xffd9, HB_Other_NotAssigned}, - {0xffda, 0xffdc, HB_Letter_Other}, - {0xffdd, 0xffdf, HB_Other_NotAssigned}, - {0xffe0, 0xffe1, HB_Symbol_Currency}, - {0xffe2, 0xffe2, HB_Symbol_Math}, - {0xffe3, 0xffe3, HB_Symbol_Modifier}, - {0xffe4, 0xffe4, HB_Symbol_Other}, - {0xffe5, 0xffe6, HB_Symbol_Currency}, - {0xffe7, 0xffe7, HB_Other_NotAssigned}, - {0xffe8, 0xffe8, HB_Symbol_Other}, - {0xffe9, 0xffec, HB_Symbol_Math}, - {0xffed, 0xffee, HB_Symbol_Other}, - {0xffef, 0xfff8, HB_Other_NotAssigned}, - {0xfff9, 0xfffb, HB_Other_Format}, - {0xfffc, 0xfffd, HB_Symbol_Other}, - {0xfffe, 0xffff, HB_Other_NotAssigned}, - {0x10000, 0x1000b, HB_Letter_Other}, - {0x1000c, 0x1000c, HB_Other_NotAssigned}, - {0x1000d, 0x10026, HB_Letter_Other}, - {0x10027, 0x10027, HB_Other_NotAssigned}, - {0x10028, 0x1003a, HB_Letter_Other}, - {0x1003b, 0x1003b, HB_Other_NotAssigned}, - {0x1003c, 0x1003d, HB_Letter_Other}, - {0x1003e, 0x1003e, HB_Other_NotAssigned}, - {0x1003f, 0x1004d, HB_Letter_Other}, - {0x1004e, 0x1004f, HB_Other_NotAssigned}, - {0x10050, 0x1005d, HB_Letter_Other}, - {0x1005e, 0x1007f, HB_Other_NotAssigned}, - {0x10080, 0x100fa, HB_Letter_Other}, - {0x100fb, 0x100ff, HB_Other_NotAssigned}, - {0x10100, 0x10101, HB_Punctuation_Other}, - {0x10102, 0x10102, HB_Symbol_Other}, - {0x10103, 0x10106, HB_Other_NotAssigned}, - {0x10107, 0x10133, HB_Number_Other}, - {0x10134, 0x10136, HB_Other_NotAssigned}, - {0x10137, 0x1013f, HB_Symbol_Other}, - {0x10140, 0x10174, HB_Number_Letter}, - {0x10175, 0x10178, HB_Number_Other}, - {0x10179, 0x10189, HB_Symbol_Other}, - {0x1018a, 0x1018a, HB_Number_Other}, - {0x1018b, 0x1018f, HB_Other_NotAssigned}, - {0x10190, 0x1019b, HB_Symbol_Other}, - {0x1019c, 0x101cf, HB_Other_NotAssigned}, - {0x101d0, 0x101fc, HB_Symbol_Other}, - {0x101fd, 0x101fd, HB_Mark_NonSpacing}, - {0x101fe, 0x1027f, HB_Other_NotAssigned}, - {0x10280, 0x1029c, HB_Letter_Other}, - {0x1029d, 0x1029f, HB_Other_NotAssigned}, - {0x102a0, 0x102d0, HB_Letter_Other}, - {0x102d1, 0x102ff, HB_Other_NotAssigned}, - {0x10300, 0x1031e, HB_Letter_Other}, - {0x1031f, 0x1031f, HB_Other_NotAssigned}, - {0x10320, 0x10323, HB_Number_Other}, - {0x10324, 0x1032f, HB_Other_NotAssigned}, - {0x10330, 0x10340, HB_Letter_Other}, - {0x10341, 0x10341, HB_Number_Letter}, - {0x10342, 0x10349, HB_Letter_Other}, - {0x1034a, 0x1034a, HB_Number_Letter}, - {0x1034b, 0x1037f, HB_Other_NotAssigned}, - {0x10380, 0x1039d, HB_Letter_Other}, - {0x1039e, 0x1039e, HB_Other_NotAssigned}, - {0x1039f, 0x1039f, HB_Punctuation_Other}, - {0x103a0, 0x103c3, HB_Letter_Other}, - {0x103c4, 0x103c7, HB_Other_NotAssigned}, - {0x103c8, 0x103cf, HB_Letter_Other}, - {0x103d0, 0x103d0, HB_Punctuation_Other}, - {0x103d1, 0x103d5, HB_Number_Letter}, - {0x103d6, 0x103ff, HB_Other_NotAssigned}, - {0x10400, 0x10427, HB_Letter_Uppercase}, - {0x10428, 0x1044f, HB_Letter_Lowercase}, - {0x10450, 0x1049d, HB_Letter_Other}, - {0x1049e, 0x1049f, HB_Other_NotAssigned}, - {0x104a0, 0x104a9, HB_Number_DecimalDigit}, - {0x104aa, 0x107ff, HB_Other_NotAssigned}, - {0x10800, 0x10805, HB_Letter_Other}, - {0x10806, 0x10807, HB_Other_NotAssigned}, - {0x10808, 0x10808, HB_Letter_Other}, - {0x10809, 0x10809, HB_Other_NotAssigned}, - {0x1080a, 0x10835, HB_Letter_Other}, - {0x10836, 0x10836, HB_Other_NotAssigned}, - {0x10837, 0x10838, HB_Letter_Other}, - {0x10839, 0x1083b, HB_Other_NotAssigned}, - {0x1083c, 0x1083c, HB_Letter_Other}, - {0x1083d, 0x1083e, HB_Other_NotAssigned}, - {0x1083f, 0x1083f, HB_Letter_Other}, - {0x10840, 0x108ff, HB_Other_NotAssigned}, - {0x10900, 0x10915, HB_Letter_Other}, - {0x10916, 0x10919, HB_Number_Other}, - {0x1091a, 0x1091e, HB_Other_NotAssigned}, - {0x1091f, 0x1091f, HB_Punctuation_Other}, - {0x10920, 0x10939, HB_Letter_Other}, - {0x1093a, 0x1093e, HB_Other_NotAssigned}, - {0x1093f, 0x1093f, HB_Punctuation_Other}, - {0x10940, 0x109ff, HB_Other_NotAssigned}, - {0x10a00, 0x10a00, HB_Letter_Other}, - {0x10a01, 0x10a03, HB_Mark_NonSpacing}, - {0x10a04, 0x10a04, HB_Other_NotAssigned}, - {0x10a05, 0x10a06, HB_Mark_NonSpacing}, - {0x10a07, 0x10a0b, HB_Other_NotAssigned}, - {0x10a0c, 0x10a0f, HB_Mark_NonSpacing}, - {0x10a10, 0x10a13, HB_Letter_Other}, - {0x10a14, 0x10a14, HB_Other_NotAssigned}, - {0x10a15, 0x10a17, HB_Letter_Other}, - {0x10a18, 0x10a18, HB_Other_NotAssigned}, - {0x10a19, 0x10a33, HB_Letter_Other}, - {0x10a34, 0x10a37, HB_Other_NotAssigned}, - {0x10a38, 0x10a3a, HB_Mark_NonSpacing}, - {0x10a3b, 0x10a3e, HB_Other_NotAssigned}, - {0x10a3f, 0x10a3f, HB_Mark_NonSpacing}, - {0x10a40, 0x10a47, HB_Number_Other}, - {0x10a48, 0x10a4f, HB_Other_NotAssigned}, - {0x10a50, 0x10a58, HB_Punctuation_Other}, - {0x10a59, 0x11fff, HB_Other_NotAssigned}, - {0x12000, 0x1236e, HB_Letter_Other}, - {0x1236f, 0x123ff, HB_Other_NotAssigned}, - {0x12400, 0x12462, HB_Number_Letter}, - {0x12463, 0x1246f, HB_Other_NotAssigned}, - {0x12470, 0x12473, HB_Punctuation_Other}, - {0x12474, 0x1cfff, HB_Other_NotAssigned}, - {0x1d000, 0x1d0f5, HB_Symbol_Other}, - {0x1d0f6, 0x1d0ff, HB_Other_NotAssigned}, - {0x1d100, 0x1d126, HB_Symbol_Other}, - {0x1d127, 0x1d128, HB_Other_NotAssigned}, - {0x1d129, 0x1d164, HB_Symbol_Other}, - {0x1d165, 0x1d166, HB_Mark_SpacingCombining}, - {0x1d167, 0x1d169, HB_Mark_NonSpacing}, - {0x1d16a, 0x1d16c, HB_Symbol_Other}, - {0x1d16d, 0x1d172, HB_Mark_SpacingCombining}, - {0x1d173, 0x1d17a, HB_Other_Format}, - {0x1d17b, 0x1d182, HB_Mark_NonSpacing}, - {0x1d183, 0x1d184, HB_Symbol_Other}, - {0x1d185, 0x1d18b, HB_Mark_NonSpacing}, - {0x1d18c, 0x1d1a9, HB_Symbol_Other}, - {0x1d1aa, 0x1d1ad, HB_Mark_NonSpacing}, - {0x1d1ae, 0x1d1dd, HB_Symbol_Other}, - {0x1d1de, 0x1d1ff, HB_Other_NotAssigned}, - {0x1d200, 0x1d241, HB_Symbol_Other}, - {0x1d242, 0x1d244, HB_Mark_NonSpacing}, - {0x1d245, 0x1d245, HB_Symbol_Other}, - {0x1d246, 0x1d2ff, HB_Other_NotAssigned}, - {0x1d300, 0x1d356, HB_Symbol_Other}, - {0x1d357, 0x1d35f, HB_Other_NotAssigned}, - {0x1d360, 0x1d371, HB_Number_Other}, - {0x1d372, 0x1d3ff, HB_Other_NotAssigned}, - {0x1d400, 0x1d419, HB_Letter_Uppercase}, - {0x1d41a, 0x1d433, HB_Letter_Lowercase}, - {0x1d434, 0x1d44d, HB_Letter_Uppercase}, - {0x1d44e, 0x1d454, HB_Letter_Lowercase}, - {0x1d455, 0x1d455, HB_Other_NotAssigned}, - {0x1d456, 0x1d467, HB_Letter_Lowercase}, - {0x1d468, 0x1d481, HB_Letter_Uppercase}, - {0x1d482, 0x1d49b, HB_Letter_Lowercase}, - {0x1d49c, 0x1d49c, HB_Letter_Uppercase}, - {0x1d49d, 0x1d49d, HB_Other_NotAssigned}, - {0x1d49e, 0x1d49f, HB_Letter_Uppercase}, - {0x1d4a0, 0x1d4a1, HB_Other_NotAssigned}, - {0x1d4a2, 0x1d4a2, HB_Letter_Uppercase}, - {0x1d4a3, 0x1d4a4, HB_Other_NotAssigned}, - {0x1d4a5, 0x1d4a6, HB_Letter_Uppercase}, - {0x1d4a7, 0x1d4a8, HB_Other_NotAssigned}, - {0x1d4a9, 0x1d4ac, HB_Letter_Uppercase}, - {0x1d4ad, 0x1d4ad, HB_Other_NotAssigned}, - {0x1d4ae, 0x1d4b5, HB_Letter_Uppercase}, - {0x1d4b6, 0x1d4b9, HB_Letter_Lowercase}, - {0x1d4ba, 0x1d4ba, HB_Other_NotAssigned}, - {0x1d4bb, 0x1d4bb, HB_Letter_Lowercase}, - {0x1d4bc, 0x1d4bc, HB_Other_NotAssigned}, - {0x1d4bd, 0x1d4c3, HB_Letter_Lowercase}, - {0x1d4c4, 0x1d4c4, HB_Other_NotAssigned}, - {0x1d4c5, 0x1d4cf, HB_Letter_Lowercase}, - {0x1d4d0, 0x1d4e9, HB_Letter_Uppercase}, - {0x1d4ea, 0x1d503, HB_Letter_Lowercase}, - {0x1d504, 0x1d505, HB_Letter_Uppercase}, - {0x1d506, 0x1d506, HB_Other_NotAssigned}, - {0x1d507, 0x1d50a, HB_Letter_Uppercase}, - {0x1d50b, 0x1d50c, HB_Other_NotAssigned}, - {0x1d50d, 0x1d514, HB_Letter_Uppercase}, - {0x1d515, 0x1d515, HB_Other_NotAssigned}, - {0x1d516, 0x1d51c, HB_Letter_Uppercase}, - {0x1d51d, 0x1d51d, HB_Other_NotAssigned}, - {0x1d51e, 0x1d537, HB_Letter_Lowercase}, - {0x1d538, 0x1d539, HB_Letter_Uppercase}, - {0x1d53a, 0x1d53a, HB_Other_NotAssigned}, - {0x1d53b, 0x1d53e, HB_Letter_Uppercase}, - {0x1d53f, 0x1d53f, HB_Other_NotAssigned}, - {0x1d540, 0x1d544, HB_Letter_Uppercase}, - {0x1d545, 0x1d545, HB_Other_NotAssigned}, - {0x1d546, 0x1d546, HB_Letter_Uppercase}, - {0x1d547, 0x1d549, HB_Other_NotAssigned}, - {0x1d54a, 0x1d550, HB_Letter_Uppercase}, - {0x1d551, 0x1d551, HB_Other_NotAssigned}, - {0x1d552, 0x1d56b, HB_Letter_Lowercase}, - {0x1d56c, 0x1d585, HB_Letter_Uppercase}, - {0x1d586, 0x1d59f, HB_Letter_Lowercase}, - {0x1d5a0, 0x1d5b9, HB_Letter_Uppercase}, - {0x1d5ba, 0x1d5d3, HB_Letter_Lowercase}, - {0x1d5d4, 0x1d5ed, HB_Letter_Uppercase}, - {0x1d5ee, 0x1d607, HB_Letter_Lowercase}, - {0x1d608, 0x1d621, HB_Letter_Uppercase}, - {0x1d622, 0x1d63b, HB_Letter_Lowercase}, - {0x1d63c, 0x1d655, HB_Letter_Uppercase}, - {0x1d656, 0x1d66f, HB_Letter_Lowercase}, - {0x1d670, 0x1d689, HB_Letter_Uppercase}, - {0x1d68a, 0x1d6a5, HB_Letter_Lowercase}, - {0x1d6a6, 0x1d6a7, HB_Other_NotAssigned}, - {0x1d6a8, 0x1d6c0, HB_Letter_Uppercase}, - {0x1d6c1, 0x1d6c1, HB_Symbol_Math}, - {0x1d6c2, 0x1d6da, HB_Letter_Lowercase}, - {0x1d6db, 0x1d6db, HB_Symbol_Math}, - {0x1d6dc, 0x1d6e1, HB_Letter_Lowercase}, - {0x1d6e2, 0x1d6fa, HB_Letter_Uppercase}, - {0x1d6fb, 0x1d6fb, HB_Symbol_Math}, - {0x1d6fc, 0x1d714, HB_Letter_Lowercase}, - {0x1d715, 0x1d715, HB_Symbol_Math}, - {0x1d716, 0x1d71b, HB_Letter_Lowercase}, - {0x1d71c, 0x1d734, HB_Letter_Uppercase}, - {0x1d735, 0x1d735, HB_Symbol_Math}, - {0x1d736, 0x1d74e, HB_Letter_Lowercase}, - {0x1d74f, 0x1d74f, HB_Symbol_Math}, - {0x1d750, 0x1d755, HB_Letter_Lowercase}, - {0x1d756, 0x1d76e, HB_Letter_Uppercase}, - {0x1d76f, 0x1d76f, HB_Symbol_Math}, - {0x1d770, 0x1d788, HB_Letter_Lowercase}, - {0x1d789, 0x1d789, HB_Symbol_Math}, - {0x1d78a, 0x1d78f, HB_Letter_Lowercase}, - {0x1d790, 0x1d7a8, HB_Letter_Uppercase}, - {0x1d7a9, 0x1d7a9, HB_Symbol_Math}, - {0x1d7aa, 0x1d7c2, HB_Letter_Lowercase}, - {0x1d7c3, 0x1d7c3, HB_Symbol_Math}, - {0x1d7c4, 0x1d7c9, HB_Letter_Lowercase}, - {0x1d7ca, 0x1d7ca, HB_Letter_Uppercase}, - {0x1d7cb, 0x1d7cb, HB_Letter_Lowercase}, - {0x1d7cc, 0x1d7cd, HB_Other_NotAssigned}, - {0x1d7ce, 0x1d7ff, HB_Number_DecimalDigit}, - {0x1d800, 0x1efff, HB_Other_NotAssigned}, - {0x1f000, 0x1f02b, HB_Symbol_Other}, - {0x1f02c, 0x1f02f, HB_Other_NotAssigned}, - {0x1f030, 0x1f093, HB_Symbol_Other}, - {0x1f094, 0x1ffff, HB_Other_NotAssigned}, - {0x20000, 0x2a6d6, HB_Letter_Other}, - {0x2a6d7, 0x2f7ff, HB_Other_NotAssigned}, - {0x2f800, 0x2fa1d, HB_Letter_Other}, - {0x2fa1e, 0xe0000, HB_Other_NotAssigned}, - {0xe0001, 0xe0001, HB_Other_Format}, - {0xe0002, 0xe001f, HB_Other_NotAssigned}, - {0xe0020, 0xe007f, HB_Other_Format}, - {0xe0080, 0xe00ff, HB_Other_NotAssigned}, - {0xe0100, 0xe01ef, HB_Mark_NonSpacing}, - {0xe01f0, 0xeffff, HB_Other_NotAssigned}, - {0xf0000, 0xffffd, HB_Other_PrivateUse}, - {0xffffe, 0xfffff, HB_Other_NotAssigned}, - {0x100000, 0x10fffd, HB_Other_PrivateUse}, - {0x10fffe, 0x10ffff, HB_Other_NotAssigned}, -}; - -static const unsigned category_properties_count = 2849; - -#endif // CATEGORY_PROPERTIES_H_ diff --git a/third_party/harfbuzz/contrib/tables/combining-class-parse.py b/third_party/harfbuzz/contrib/tables/combining-class-parse.py deleted file mode 100644 index c591dddc42..0000000000 --- a/third_party/harfbuzz/contrib/tables/combining-class-parse.py +++ /dev/null @@ -1,34 +0,0 @@ -import sys -from unicode_parse_common import * - -# http://www.unicode.org/Public/5.1.0/ucd/extracted/DerivedCombiningClass.txt - -class IdentityMap(object): - def __getitem__(_, key): - return key - -def main(infile, outfile): - ranges = unicode_file_parse(infile, IdentityMap(), '0') - ranges = sort_and_merge(ranges) - - print >>outfile, '// Generated from Unicode tables\n' - print >>outfile, '#ifndef COMBINING_PROPERTIES_H_' - print >>outfile, '#define COMBINING_PROPERTIES_H_\n' - print >>outfile, '#include ' - print >>outfile, 'struct combining_property {' - print >>outfile, ' uint32_t range_start;' - print >>outfile, ' uint32_t range_end;' - print >>outfile, ' uint8_t klass;' - print >>outfile, '};\n' - print >>outfile, 'static const struct combining_property combining_properties[] = {' - for (start, end, value) in ranges: - print >>outfile, ' {0x%x, 0x%x, %s},' % (start, end, value) - print >>outfile, '};\n' - print >>outfile, 'static const unsigned combining_properties_count = %d;\n' % len(ranges) - print >>outfile, '#endif // COMBINING_PROPERTIES_H_' - -if __name__ == '__main__': - if len(sys.argv) != 3: - print 'Usage: %s ' % sys.argv[0] - else: - main(file(sys.argv[1], 'r'), file(sys.argv[2], 'w+')) diff --git a/third_party/harfbuzz/contrib/tables/combining-properties.h b/third_party/harfbuzz/contrib/tables/combining-properties.h deleted file mode 100644 index 552ed355eb..0000000000 --- a/third_party/harfbuzz/contrib/tables/combining-properties.h +++ /dev/null @@ -1,247 +0,0 @@ -// Generated from Unicode tables - -#ifndef COMBINING_PROPERTIES_H_ -#define COMBINING_PROPERTIES_H_ - -#include -struct combining_property { - uint32_t range_start; - uint32_t range_end; - uint8_t klass; -}; - -static const struct combining_property combining_properties[] = { - {0x300, 0x314, 230}, - {0x315, 0x315, 232}, - {0x316, 0x319, 220}, - {0x31a, 0x31a, 232}, - {0x31b, 0x31b, 216}, - {0x31c, 0x320, 220}, - {0x321, 0x322, 202}, - {0x323, 0x326, 220}, - {0x327, 0x328, 202}, - {0x329, 0x333, 220}, - {0x334, 0x338, 1}, - {0x339, 0x33c, 220}, - {0x33d, 0x344, 230}, - {0x345, 0x345, 240}, - {0x346, 0x346, 230}, - {0x347, 0x349, 220}, - {0x34a, 0x34c, 230}, - {0x34d, 0x34e, 220}, - {0x350, 0x352, 230}, - {0x353, 0x356, 220}, - {0x357, 0x357, 230}, - {0x358, 0x358, 232}, - {0x359, 0x35a, 220}, - {0x35b, 0x35b, 230}, - {0x35c, 0x35c, 233}, - {0x35d, 0x35e, 234}, - {0x35f, 0x35f, 233}, - {0x360, 0x361, 234}, - {0x362, 0x362, 233}, - {0x363, 0x36f, 230}, - {0x483, 0x487, 230}, - {0x591, 0x591, 220}, - {0x592, 0x595, 230}, - {0x596, 0x596, 220}, - {0x597, 0x599, 230}, - {0x59a, 0x59a, 222}, - {0x59b, 0x59b, 220}, - {0x59c, 0x5a1, 230}, - {0x5a2, 0x5a7, 220}, - {0x5a8, 0x5a9, 230}, - {0x5aa, 0x5aa, 220}, - {0x5ab, 0x5ac, 230}, - {0x5ad, 0x5ad, 222}, - {0x5ae, 0x5ae, 228}, - {0x5af, 0x5af, 230}, - {0x5b0, 0x5b0, 10}, - {0x5b1, 0x5b1, 11}, - {0x5b2, 0x5b2, 12}, - {0x5b3, 0x5b3, 13}, - {0x5b4, 0x5b4, 14}, - {0x5b5, 0x5b5, 15}, - {0x5b6, 0x5b6, 16}, - {0x5b7, 0x5b7, 17}, - {0x5b8, 0x5b8, 18}, - {0x5b9, 0x5ba, 19}, - {0x5bb, 0x5bb, 20}, - {0x5bc, 0x5bc, 21}, - {0x5bd, 0x5bd, 22}, - {0x5bf, 0x5bf, 23}, - {0x5c1, 0x5c1, 24}, - {0x5c2, 0x5c2, 25}, - {0x5c4, 0x5c4, 230}, - {0x5c5, 0x5c5, 220}, - {0x5c7, 0x5c7, 18}, - {0x610, 0x617, 230}, - {0x618, 0x618, 30}, - {0x619, 0x619, 31}, - {0x61a, 0x61a, 32}, - {0x64b, 0x64b, 27}, - {0x64c, 0x64c, 28}, - {0x64d, 0x64d, 29}, - {0x64e, 0x64e, 30}, - {0x64f, 0x64f, 31}, - {0x650, 0x650, 32}, - {0x651, 0x651, 33}, - {0x652, 0x652, 34}, - {0x653, 0x654, 230}, - {0x655, 0x656, 220}, - {0x657, 0x65b, 230}, - {0x65c, 0x65c, 220}, - {0x65d, 0x65e, 230}, - {0x670, 0x670, 35}, - {0x6d6, 0x6dc, 230}, - {0x6df, 0x6e2, 230}, - {0x6e3, 0x6e3, 220}, - {0x6e4, 0x6e4, 230}, - {0x6e7, 0x6e8, 230}, - {0x6ea, 0x6ea, 220}, - {0x6eb, 0x6ec, 230}, - {0x6ed, 0x6ed, 220}, - {0x711, 0x711, 36}, - {0x730, 0x730, 230}, - {0x731, 0x731, 220}, - {0x732, 0x733, 230}, - {0x734, 0x734, 220}, - {0x735, 0x736, 230}, - {0x737, 0x739, 220}, - {0x73a, 0x73a, 230}, - {0x73b, 0x73c, 220}, - {0x73d, 0x73d, 230}, - {0x73e, 0x73e, 220}, - {0x73f, 0x741, 230}, - {0x742, 0x742, 220}, - {0x743, 0x743, 230}, - {0x744, 0x744, 220}, - {0x745, 0x745, 230}, - {0x746, 0x746, 220}, - {0x747, 0x747, 230}, - {0x748, 0x748, 220}, - {0x749, 0x74a, 230}, - {0x7eb, 0x7f1, 230}, - {0x7f2, 0x7f2, 220}, - {0x7f3, 0x7f3, 230}, - {0x93c, 0x93c, 7}, - {0x94d, 0x94d, 9}, - {0x951, 0x951, 230}, - {0x952, 0x952, 220}, - {0x953, 0x954, 230}, - {0x9bc, 0x9bc, 7}, - {0x9cd, 0x9cd, 9}, - {0xa3c, 0xa3c, 7}, - {0xa4d, 0xa4d, 9}, - {0xabc, 0xabc, 7}, - {0xacd, 0xacd, 9}, - {0xb3c, 0xb3c, 7}, - {0xb4d, 0xb4d, 9}, - {0xbcd, 0xbcd, 9}, - {0xc4d, 0xc4d, 9}, - {0xc55, 0xc55, 84}, - {0xc56, 0xc56, 91}, - {0xcbc, 0xcbc, 7}, - {0xccd, 0xccd, 9}, - {0xd4d, 0xd4d, 9}, - {0xdca, 0xdca, 9}, - {0xe38, 0xe39, 103}, - {0xe3a, 0xe3a, 9}, - {0xe48, 0xe4b, 107}, - {0xeb8, 0xeb9, 118}, - {0xec8, 0xecb, 122}, - {0xf18, 0xf19, 220}, - {0xf35, 0xf35, 220}, - {0xf37, 0xf37, 220}, - {0xf39, 0xf39, 216}, - {0xf71, 0xf71, 129}, - {0xf72, 0xf72, 130}, - {0xf74, 0xf74, 132}, - {0xf7a, 0xf7d, 130}, - {0xf80, 0xf80, 130}, - {0xf82, 0xf83, 230}, - {0xf84, 0xf84, 9}, - {0xf86, 0xf87, 230}, - {0xfc6, 0xfc6, 220}, - {0x1037, 0x1037, 7}, - {0x1039, 0x103a, 9}, - {0x108d, 0x108d, 220}, - {0x135f, 0x135f, 230}, - {0x1714, 0x1714, 9}, - {0x1734, 0x1734, 9}, - {0x17d2, 0x17d2, 9}, - {0x17dd, 0x17dd, 230}, - {0x18a9, 0x18a9, 228}, - {0x1939, 0x1939, 222}, - {0x193a, 0x193a, 230}, - {0x193b, 0x193b, 220}, - {0x1a17, 0x1a17, 230}, - {0x1a18, 0x1a18, 220}, - {0x1b34, 0x1b34, 7}, - {0x1b44, 0x1b44, 9}, - {0x1b6b, 0x1b6b, 230}, - {0x1b6c, 0x1b6c, 220}, - {0x1b6d, 0x1b73, 230}, - {0x1baa, 0x1baa, 9}, - {0x1c37, 0x1c37, 7}, - {0x1dc0, 0x1dc1, 230}, - {0x1dc2, 0x1dc2, 220}, - {0x1dc3, 0x1dc9, 230}, - {0x1dca, 0x1dca, 220}, - {0x1dcb, 0x1dcc, 230}, - {0x1dcd, 0x1dcd, 234}, - {0x1dce, 0x1dce, 214}, - {0x1dcf, 0x1dcf, 220}, - {0x1dd0, 0x1dd0, 202}, - {0x1dd1, 0x1de6, 230}, - {0x1dfe, 0x1dfe, 230}, - {0x1dff, 0x1dff, 220}, - {0x20d0, 0x20d1, 230}, - {0x20d2, 0x20d3, 1}, - {0x20d4, 0x20d7, 230}, - {0x20d8, 0x20da, 1}, - {0x20db, 0x20dc, 230}, - {0x20e1, 0x20e1, 230}, - {0x20e5, 0x20e6, 1}, - {0x20e7, 0x20e7, 230}, - {0x20e8, 0x20e8, 220}, - {0x20e9, 0x20e9, 230}, - {0x20ea, 0x20eb, 1}, - {0x20ec, 0x20ef, 220}, - {0x20f0, 0x20f0, 230}, - {0x2de0, 0x2dff, 230}, - {0x302a, 0x302a, 218}, - {0x302b, 0x302b, 228}, - {0x302c, 0x302c, 232}, - {0x302d, 0x302d, 222}, - {0x302e, 0x302f, 224}, - {0x3099, 0x309a, 8}, - {0xa66f, 0xa66f, 230}, - {0xa67c, 0xa67d, 230}, - {0xa806, 0xa806, 9}, - {0xa8c4, 0xa8c4, 9}, - {0xa92b, 0xa92d, 220}, - {0xa953, 0xa953, 9}, - {0xfb1e, 0xfb1e, 26}, - {0xfe20, 0xfe26, 230}, - {0x101fd, 0x101fd, 220}, - {0x10a0d, 0x10a0d, 220}, - {0x10a0f, 0x10a0f, 230}, - {0x10a38, 0x10a38, 230}, - {0x10a39, 0x10a39, 1}, - {0x10a3a, 0x10a3a, 220}, - {0x10a3f, 0x10a3f, 9}, - {0x1d165, 0x1d166, 216}, - {0x1d167, 0x1d169, 1}, - {0x1d16d, 0x1d16d, 226}, - {0x1d16e, 0x1d172, 216}, - {0x1d17b, 0x1d182, 220}, - {0x1d185, 0x1d189, 230}, - {0x1d18a, 0x1d18b, 220}, - {0x1d1aa, 0x1d1ad, 230}, - {0x1d242, 0x1d244, 230}, -}; - -static const unsigned combining_properties_count = 229; - -#endif // COMBINING_PROPERTIES_H_ diff --git a/third_party/harfbuzz/contrib/tables/grapheme-break-parse.py b/third_party/harfbuzz/contrib/tables/grapheme-break-parse.py deleted file mode 100644 index a4b3534243..0000000000 --- a/third_party/harfbuzz/contrib/tables/grapheme-break-parse.py +++ /dev/null @@ -1,45 +0,0 @@ -import sys -from unicode_parse_common import * - -# http://www.unicode.org/Public/UNIDATA/auxiliary/GraphemeBreakProperty.txt - -property_to_harfbuzz = { - 'CR': 'HB_Grapheme_CR', - 'LF': 'HB_Grapheme_LF', - 'Control': 'HB_Grapheme_Control', - 'Extend': 'HB_Grapheme_Extend', - 'Prepend': 'HB_Grapheme_Other', - 'SpacingMark': 'HB_Grapheme_Other', - 'L': 'HB_Grapheme_L', - 'V': 'HB_Grapheme_V', - 'T': 'HB_Grapheme_T', - 'LV': 'HB_Grapheme_LV', - 'LVT': 'HB_Grapheme_LVT', -} - -def main(infile, outfile): - ranges = unicode_file_parse(infile, property_to_harfbuzz) - ranges.sort() - - print >>outfile, '// Generated from Unicode Grapheme break tables\n' - print >>outfile, '#ifndef GRAPHEME_BREAK_PROPERTY_H_' - print >>outfile, '#define GRAPHEME_BREAK_PROPERTY_H_\n' - print >>outfile, '#include ' - print >>outfile, '#include "harfbuzz-external.h"\n' - print >>outfile, 'struct grapheme_break_property {' - print >>outfile, ' uint32_t range_start;' - print >>outfile, ' uint32_t range_end;' - print >>outfile, ' HB_GraphemeClass klass;' - print >>outfile, '};\n' - print >>outfile, 'static const struct grapheme_break_property grapheme_break_properties[] = {' - for (start, end, value) in ranges: - print >>outfile, ' {0x%x, 0x%x, %s},' % (start, end, value) - print >>outfile, '};\n' - print >>outfile, 'static const unsigned grapheme_break_properties_count = %d;\n' % len(ranges) - print >>outfile, '#endif // GRAPHEME_BREAK_PROPERTY_H_' - -if __name__ == '__main__': - if len(sys.argv) != 3: - print 'Usage: %s ' % sys.argv[0] - else: - main(file(sys.argv[1], 'r'), file(sys.argv[2], 'w+')) diff --git a/third_party/harfbuzz/contrib/tables/grapheme-break-properties.h b/third_party/harfbuzz/contrib/tables/grapheme-break-properties.h deleted file mode 100644 index 73f47d44d2..0000000000 --- a/third_party/harfbuzz/contrib/tables/grapheme-break-properties.h +++ /dev/null @@ -1,1113 +0,0 @@ -// Generated from Unicode Grapheme break tables - -#ifndef GRAPHEME_BREAK_PROPERTY_H_ -#define GRAPHEME_BREAK_PROPERTY_H_ - -#include -#include "harfbuzz-external.h" - -struct grapheme_break_property { - uint32_t range_start; - uint32_t range_end; - HB_GraphemeClass klass; -}; - -static const struct grapheme_break_property grapheme_break_properties[] = { - {0x0, 0x9, HB_Grapheme_Control}, - {0xa, 0xa, HB_Grapheme_LF}, - {0xb, 0xc, HB_Grapheme_Control}, - {0xd, 0xd, HB_Grapheme_CR}, - {0xe, 0x1f, HB_Grapheme_Control}, - {0x7f, 0x9f, HB_Grapheme_Control}, - {0xad, 0xad, HB_Grapheme_Control}, - {0x300, 0x36f, HB_Grapheme_Extend}, - {0x483, 0x487, HB_Grapheme_Extend}, - {0x488, 0x489, HB_Grapheme_Extend}, - {0x591, 0x5bd, HB_Grapheme_Extend}, - {0x5bf, 0x5bf, HB_Grapheme_Extend}, - {0x5c1, 0x5c2, HB_Grapheme_Extend}, - {0x5c4, 0x5c5, HB_Grapheme_Extend}, - {0x5c7, 0x5c7, HB_Grapheme_Extend}, - {0x600, 0x603, HB_Grapheme_Control}, - {0x610, 0x61a, HB_Grapheme_Extend}, - {0x64b, 0x65e, HB_Grapheme_Extend}, - {0x670, 0x670, HB_Grapheme_Extend}, - {0x6d6, 0x6dc, HB_Grapheme_Extend}, - {0x6dd, 0x6dd, HB_Grapheme_Control}, - {0x6de, 0x6de, HB_Grapheme_Extend}, - {0x6df, 0x6e4, HB_Grapheme_Extend}, - {0x6e7, 0x6e8, HB_Grapheme_Extend}, - {0x6ea, 0x6ed, HB_Grapheme_Extend}, - {0x70f, 0x70f, HB_Grapheme_Control}, - {0x711, 0x711, HB_Grapheme_Extend}, - {0x730, 0x74a, HB_Grapheme_Extend}, - {0x7a6, 0x7b0, HB_Grapheme_Extend}, - {0x7eb, 0x7f3, HB_Grapheme_Extend}, - {0x901, 0x902, HB_Grapheme_Extend}, - {0x903, 0x903, HB_Grapheme_Other}, - {0x93c, 0x93c, HB_Grapheme_Extend}, - {0x93e, 0x940, HB_Grapheme_Other}, - {0x941, 0x948, HB_Grapheme_Extend}, - {0x949, 0x94c, HB_Grapheme_Other}, - {0x94d, 0x94d, HB_Grapheme_Extend}, - {0x951, 0x954, HB_Grapheme_Extend}, - {0x962, 0x963, HB_Grapheme_Extend}, - {0x981, 0x981, HB_Grapheme_Extend}, - {0x982, 0x983, HB_Grapheme_Other}, - {0x9bc, 0x9bc, HB_Grapheme_Extend}, - {0x9be, 0x9be, HB_Grapheme_Extend}, - {0x9bf, 0x9c0, HB_Grapheme_Other}, - {0x9c1, 0x9c4, HB_Grapheme_Extend}, - {0x9c7, 0x9c8, HB_Grapheme_Other}, - {0x9cb, 0x9cc, HB_Grapheme_Other}, - {0x9cd, 0x9cd, HB_Grapheme_Extend}, - {0x9d7, 0x9d7, HB_Grapheme_Extend}, - {0x9e2, 0x9e3, HB_Grapheme_Extend}, - {0xa01, 0xa02, HB_Grapheme_Extend}, - {0xa03, 0xa03, HB_Grapheme_Other}, - {0xa3c, 0xa3c, HB_Grapheme_Extend}, - {0xa3e, 0xa40, HB_Grapheme_Other}, - {0xa41, 0xa42, HB_Grapheme_Extend}, - {0xa47, 0xa48, HB_Grapheme_Extend}, - {0xa4b, 0xa4d, HB_Grapheme_Extend}, - {0xa51, 0xa51, HB_Grapheme_Extend}, - {0xa70, 0xa71, HB_Grapheme_Extend}, - {0xa75, 0xa75, HB_Grapheme_Extend}, - {0xa81, 0xa82, HB_Grapheme_Extend}, - {0xa83, 0xa83, HB_Grapheme_Other}, - {0xabc, 0xabc, HB_Grapheme_Extend}, - {0xabe, 0xac0, HB_Grapheme_Other}, - {0xac1, 0xac5, HB_Grapheme_Extend}, - {0xac7, 0xac8, HB_Grapheme_Extend}, - {0xac9, 0xac9, HB_Grapheme_Other}, - {0xacb, 0xacc, HB_Grapheme_Other}, - {0xacd, 0xacd, HB_Grapheme_Extend}, - {0xae2, 0xae3, HB_Grapheme_Extend}, - {0xb01, 0xb01, HB_Grapheme_Extend}, - {0xb02, 0xb03, HB_Grapheme_Other}, - {0xb3c, 0xb3c, HB_Grapheme_Extend}, - {0xb3e, 0xb3e, HB_Grapheme_Extend}, - {0xb3f, 0xb3f, HB_Grapheme_Extend}, - {0xb40, 0xb40, HB_Grapheme_Other}, - {0xb41, 0xb44, HB_Grapheme_Extend}, - {0xb47, 0xb48, HB_Grapheme_Other}, - {0xb4b, 0xb4c, HB_Grapheme_Other}, - {0xb4d, 0xb4d, HB_Grapheme_Extend}, - {0xb56, 0xb56, HB_Grapheme_Extend}, - {0xb57, 0xb57, HB_Grapheme_Extend}, - {0xb62, 0xb63, HB_Grapheme_Extend}, - {0xb82, 0xb82, HB_Grapheme_Extend}, - {0xbbe, 0xbbe, HB_Grapheme_Extend}, - {0xbbf, 0xbbf, HB_Grapheme_Other}, - {0xbc0, 0xbc0, HB_Grapheme_Extend}, - {0xbc1, 0xbc2, HB_Grapheme_Other}, - {0xbc6, 0xbc8, HB_Grapheme_Other}, - {0xbca, 0xbcc, HB_Grapheme_Other}, - {0xbcd, 0xbcd, HB_Grapheme_Extend}, - {0xbd7, 0xbd7, HB_Grapheme_Extend}, - {0xc01, 0xc03, HB_Grapheme_Other}, - {0xc3e, 0xc40, HB_Grapheme_Extend}, - {0xc41, 0xc44, HB_Grapheme_Other}, - {0xc46, 0xc48, HB_Grapheme_Extend}, - {0xc4a, 0xc4d, HB_Grapheme_Extend}, - {0xc55, 0xc56, HB_Grapheme_Extend}, - {0xc62, 0xc63, HB_Grapheme_Extend}, - {0xc82, 0xc83, HB_Grapheme_Other}, - {0xcbc, 0xcbc, HB_Grapheme_Extend}, - {0xcbe, 0xcbe, HB_Grapheme_Other}, - {0xcbf, 0xcbf, HB_Grapheme_Extend}, - {0xcc0, 0xcc1, HB_Grapheme_Other}, - {0xcc2, 0xcc2, HB_Grapheme_Extend}, - {0xcc3, 0xcc4, HB_Grapheme_Other}, - {0xcc6, 0xcc6, HB_Grapheme_Extend}, - {0xcc7, 0xcc8, HB_Grapheme_Other}, - {0xcca, 0xccb, HB_Grapheme_Other}, - {0xccc, 0xccd, HB_Grapheme_Extend}, - {0xcd5, 0xcd6, HB_Grapheme_Extend}, - {0xce2, 0xce3, HB_Grapheme_Extend}, - {0xd02, 0xd03, HB_Grapheme_Other}, - {0xd3e, 0xd3e, HB_Grapheme_Extend}, - {0xd3f, 0xd40, HB_Grapheme_Other}, - {0xd41, 0xd44, HB_Grapheme_Extend}, - {0xd46, 0xd48, HB_Grapheme_Other}, - {0xd4a, 0xd4c, HB_Grapheme_Other}, - {0xd4d, 0xd4d, HB_Grapheme_Extend}, - {0xd57, 0xd57, HB_Grapheme_Extend}, - {0xd62, 0xd63, HB_Grapheme_Extend}, - {0xd82, 0xd83, HB_Grapheme_Other}, - {0xdca, 0xdca, HB_Grapheme_Extend}, - {0xdcf, 0xdcf, HB_Grapheme_Extend}, - {0xdd0, 0xdd1, HB_Grapheme_Other}, - {0xdd2, 0xdd4, HB_Grapheme_Extend}, - {0xdd6, 0xdd6, HB_Grapheme_Extend}, - {0xdd8, 0xdde, HB_Grapheme_Other}, - {0xddf, 0xddf, HB_Grapheme_Extend}, - {0xdf2, 0xdf3, HB_Grapheme_Other}, - {0xe30, 0xe30, HB_Grapheme_Extend}, - {0xe31, 0xe31, HB_Grapheme_Extend}, - {0xe32, 0xe33, HB_Grapheme_Extend}, - {0xe34, 0xe3a, HB_Grapheme_Extend}, - {0xe40, 0xe44, HB_Grapheme_Other}, - {0xe45, 0xe45, HB_Grapheme_Extend}, - {0xe47, 0xe4e, HB_Grapheme_Extend}, - {0xeb0, 0xeb0, HB_Grapheme_Extend}, - {0xeb1, 0xeb1, HB_Grapheme_Extend}, - {0xeb2, 0xeb3, HB_Grapheme_Extend}, - {0xeb4, 0xeb9, HB_Grapheme_Extend}, - {0xebb, 0xebc, HB_Grapheme_Extend}, - {0xec0, 0xec4, HB_Grapheme_Other}, - {0xec8, 0xecd, HB_Grapheme_Extend}, - {0xf18, 0xf19, HB_Grapheme_Extend}, - {0xf35, 0xf35, HB_Grapheme_Extend}, - {0xf37, 0xf37, HB_Grapheme_Extend}, - {0xf39, 0xf39, HB_Grapheme_Extend}, - {0xf3e, 0xf3f, HB_Grapheme_Other}, - {0xf71, 0xf7e, HB_Grapheme_Extend}, - {0xf7f, 0xf7f, HB_Grapheme_Other}, - {0xf80, 0xf84, HB_Grapheme_Extend}, - {0xf86, 0xf87, HB_Grapheme_Extend}, - {0xf90, 0xf97, HB_Grapheme_Extend}, - {0xf99, 0xfbc, HB_Grapheme_Extend}, - {0xfc6, 0xfc6, HB_Grapheme_Extend}, - {0x102b, 0x102c, HB_Grapheme_Other}, - {0x102d, 0x1030, HB_Grapheme_Extend}, - {0x1031, 0x1031, HB_Grapheme_Other}, - {0x1032, 0x1037, HB_Grapheme_Extend}, - {0x1038, 0x1038, HB_Grapheme_Other}, - {0x1039, 0x103a, HB_Grapheme_Extend}, - {0x103b, 0x103c, HB_Grapheme_Other}, - {0x103d, 0x103e, HB_Grapheme_Extend}, - {0x1056, 0x1057, HB_Grapheme_Other}, - {0x1058, 0x1059, HB_Grapheme_Extend}, - {0x105e, 0x1060, HB_Grapheme_Extend}, - {0x1062, 0x1064, HB_Grapheme_Other}, - {0x1067, 0x106d, HB_Grapheme_Other}, - {0x1071, 0x1074, HB_Grapheme_Extend}, - {0x1082, 0x1082, HB_Grapheme_Extend}, - {0x1083, 0x1084, HB_Grapheme_Other}, - {0x1085, 0x1086, HB_Grapheme_Extend}, - {0x1087, 0x108c, HB_Grapheme_Other}, - {0x108d, 0x108d, HB_Grapheme_Extend}, - {0x108f, 0x108f, HB_Grapheme_Other}, - {0x1100, 0x1159, HB_Grapheme_L}, - {0x115f, 0x115f, HB_Grapheme_L}, - {0x1160, 0x11a2, HB_Grapheme_V}, - {0x11a8, 0x11f9, HB_Grapheme_T}, - {0x135f, 0x135f, HB_Grapheme_Extend}, - {0x1712, 0x1714, HB_Grapheme_Extend}, - {0x1732, 0x1734, HB_Grapheme_Extend}, - {0x1752, 0x1753, HB_Grapheme_Extend}, - {0x1772, 0x1773, HB_Grapheme_Extend}, - {0x17b4, 0x17b5, HB_Grapheme_Control}, - {0x17b6, 0x17b6, HB_Grapheme_Other}, - {0x17b7, 0x17bd, HB_Grapheme_Extend}, - {0x17be, 0x17c5, HB_Grapheme_Other}, - {0x17c6, 0x17c6, HB_Grapheme_Extend}, - {0x17c7, 0x17c8, HB_Grapheme_Other}, - {0x17c9, 0x17d3, HB_Grapheme_Extend}, - {0x17dd, 0x17dd, HB_Grapheme_Extend}, - {0x180b, 0x180d, HB_Grapheme_Extend}, - {0x18a9, 0x18a9, HB_Grapheme_Extend}, - {0x1920, 0x1922, HB_Grapheme_Extend}, - {0x1923, 0x1926, HB_Grapheme_Other}, - {0x1927, 0x1928, HB_Grapheme_Extend}, - {0x1929, 0x192b, HB_Grapheme_Other}, - {0x1930, 0x1931, HB_Grapheme_Other}, - {0x1932, 0x1932, HB_Grapheme_Extend}, - {0x1933, 0x1938, HB_Grapheme_Other}, - {0x1939, 0x193b, HB_Grapheme_Extend}, - {0x19b0, 0x19c0, HB_Grapheme_Other}, - {0x19c8, 0x19c9, HB_Grapheme_Other}, - {0x1a17, 0x1a18, HB_Grapheme_Extend}, - {0x1a19, 0x1a1b, HB_Grapheme_Other}, - {0x1b00, 0x1b03, HB_Grapheme_Extend}, - {0x1b04, 0x1b04, HB_Grapheme_Other}, - {0x1b34, 0x1b34, HB_Grapheme_Extend}, - {0x1b35, 0x1b35, HB_Grapheme_Other}, - {0x1b36, 0x1b3a, HB_Grapheme_Extend}, - {0x1b3b, 0x1b3b, HB_Grapheme_Other}, - {0x1b3c, 0x1b3c, HB_Grapheme_Extend}, - {0x1b3d, 0x1b41, HB_Grapheme_Other}, - {0x1b42, 0x1b42, HB_Grapheme_Extend}, - {0x1b43, 0x1b44, HB_Grapheme_Other}, - {0x1b6b, 0x1b73, HB_Grapheme_Extend}, - {0x1b80, 0x1b81, HB_Grapheme_Extend}, - {0x1b82, 0x1b82, HB_Grapheme_Other}, - {0x1ba1, 0x1ba1, HB_Grapheme_Other}, - {0x1ba2, 0x1ba5, HB_Grapheme_Extend}, - {0x1ba6, 0x1ba7, HB_Grapheme_Other}, - {0x1ba8, 0x1ba9, HB_Grapheme_Extend}, - {0x1baa, 0x1baa, HB_Grapheme_Other}, - {0x1c24, 0x1c2b, HB_Grapheme_Other}, - {0x1c2c, 0x1c33, HB_Grapheme_Extend}, - {0x1c34, 0x1c35, HB_Grapheme_Other}, - {0x1c36, 0x1c37, HB_Grapheme_Extend}, - {0x1dc0, 0x1de6, HB_Grapheme_Extend}, - {0x1dfe, 0x1dff, HB_Grapheme_Extend}, - {0x200b, 0x200b, HB_Grapheme_Control}, - {0x200c, 0x200d, HB_Grapheme_Extend}, - {0x200e, 0x200f, HB_Grapheme_Control}, - {0x2028, 0x2028, HB_Grapheme_Control}, - {0x2029, 0x2029, HB_Grapheme_Control}, - {0x202a, 0x202e, HB_Grapheme_Control}, - {0x2060, 0x2064, HB_Grapheme_Control}, - {0x206a, 0x206f, HB_Grapheme_Control}, - {0x20d0, 0x20dc, HB_Grapheme_Extend}, - {0x20dd, 0x20e0, HB_Grapheme_Extend}, - {0x20e1, 0x20e1, HB_Grapheme_Extend}, - {0x20e2, 0x20e4, HB_Grapheme_Extend}, - {0x20e5, 0x20f0, HB_Grapheme_Extend}, - {0x2de0, 0x2dff, HB_Grapheme_Extend}, - {0x302a, 0x302f, HB_Grapheme_Extend}, - {0x3099, 0x309a, HB_Grapheme_Extend}, - {0xa66f, 0xa66f, HB_Grapheme_Extend}, - {0xa670, 0xa672, HB_Grapheme_Extend}, - {0xa67c, 0xa67d, HB_Grapheme_Extend}, - {0xa802, 0xa802, HB_Grapheme_Extend}, - {0xa806, 0xa806, HB_Grapheme_Extend}, - {0xa80b, 0xa80b, HB_Grapheme_Extend}, - {0xa823, 0xa824, HB_Grapheme_Other}, - {0xa825, 0xa826, HB_Grapheme_Extend}, - {0xa827, 0xa827, HB_Grapheme_Other}, - {0xa880, 0xa881, HB_Grapheme_Other}, - {0xa8b4, 0xa8c3, HB_Grapheme_Other}, - {0xa8c4, 0xa8c4, HB_Grapheme_Extend}, - {0xa926, 0xa92d, HB_Grapheme_Extend}, - {0xa947, 0xa951, HB_Grapheme_Extend}, - {0xa952, 0xa953, HB_Grapheme_Other}, - {0xaa29, 0xaa2e, HB_Grapheme_Extend}, - {0xaa2f, 0xaa30, HB_Grapheme_Other}, - {0xaa31, 0xaa32, HB_Grapheme_Extend}, - {0xaa33, 0xaa34, HB_Grapheme_Other}, - {0xaa35, 0xaa36, HB_Grapheme_Extend}, - {0xaa43, 0xaa43, HB_Grapheme_Extend}, - {0xaa4c, 0xaa4c, HB_Grapheme_Extend}, - {0xaa4d, 0xaa4d, HB_Grapheme_Other}, - {0xac00, 0xac00, HB_Grapheme_LV}, - {0xac01, 0xac1b, HB_Grapheme_LVT}, - {0xac1c, 0xac1c, HB_Grapheme_LV}, - {0xac1d, 0xac37, HB_Grapheme_LVT}, - {0xac38, 0xac38, HB_Grapheme_LV}, - {0xac39, 0xac53, HB_Grapheme_LVT}, - {0xac54, 0xac54, HB_Grapheme_LV}, - {0xac55, 0xac6f, HB_Grapheme_LVT}, - {0xac70, 0xac70, HB_Grapheme_LV}, - {0xac71, 0xac8b, HB_Grapheme_LVT}, - {0xac8c, 0xac8c, HB_Grapheme_LV}, - {0xac8d, 0xaca7, HB_Grapheme_LVT}, - {0xaca8, 0xaca8, HB_Grapheme_LV}, - {0xaca9, 0xacc3, HB_Grapheme_LVT}, - {0xacc4, 0xacc4, HB_Grapheme_LV}, - {0xacc5, 0xacdf, HB_Grapheme_LVT}, - {0xace0, 0xace0, HB_Grapheme_LV}, - {0xace1, 0xacfb, HB_Grapheme_LVT}, - {0xacfc, 0xacfc, HB_Grapheme_LV}, - {0xacfd, 0xad17, HB_Grapheme_LVT}, - {0xad18, 0xad18, HB_Grapheme_LV}, - {0xad19, 0xad33, HB_Grapheme_LVT}, - {0xad34, 0xad34, HB_Grapheme_LV}, - {0xad35, 0xad4f, HB_Grapheme_LVT}, - {0xad50, 0xad50, HB_Grapheme_LV}, - {0xad51, 0xad6b, HB_Grapheme_LVT}, - {0xad6c, 0xad6c, HB_Grapheme_LV}, - {0xad6d, 0xad87, HB_Grapheme_LVT}, - {0xad88, 0xad88, HB_Grapheme_LV}, - {0xad89, 0xada3, HB_Grapheme_LVT}, - {0xada4, 0xada4, HB_Grapheme_LV}, - {0xada5, 0xadbf, HB_Grapheme_LVT}, - {0xadc0, 0xadc0, HB_Grapheme_LV}, - {0xadc1, 0xaddb, HB_Grapheme_LVT}, - {0xaddc, 0xaddc, HB_Grapheme_LV}, - {0xaddd, 0xadf7, HB_Grapheme_LVT}, - {0xadf8, 0xadf8, HB_Grapheme_LV}, - {0xadf9, 0xae13, HB_Grapheme_LVT}, - {0xae14, 0xae14, HB_Grapheme_LV}, - {0xae15, 0xae2f, HB_Grapheme_LVT}, - {0xae30, 0xae30, HB_Grapheme_LV}, - {0xae31, 0xae4b, HB_Grapheme_LVT}, - {0xae4c, 0xae4c, HB_Grapheme_LV}, - {0xae4d, 0xae67, HB_Grapheme_LVT}, - {0xae68, 0xae68, HB_Grapheme_LV}, - {0xae69, 0xae83, HB_Grapheme_LVT}, - {0xae84, 0xae84, HB_Grapheme_LV}, - {0xae85, 0xae9f, HB_Grapheme_LVT}, - {0xaea0, 0xaea0, HB_Grapheme_LV}, - {0xaea1, 0xaebb, HB_Grapheme_LVT}, - {0xaebc, 0xaebc, HB_Grapheme_LV}, - {0xaebd, 0xaed7, HB_Grapheme_LVT}, - {0xaed8, 0xaed8, HB_Grapheme_LV}, - {0xaed9, 0xaef3, HB_Grapheme_LVT}, - {0xaef4, 0xaef4, HB_Grapheme_LV}, - {0xaef5, 0xaf0f, HB_Grapheme_LVT}, - {0xaf10, 0xaf10, HB_Grapheme_LV}, - {0xaf11, 0xaf2b, HB_Grapheme_LVT}, - {0xaf2c, 0xaf2c, HB_Grapheme_LV}, - {0xaf2d, 0xaf47, HB_Grapheme_LVT}, - {0xaf48, 0xaf48, HB_Grapheme_LV}, - {0xaf49, 0xaf63, HB_Grapheme_LVT}, - {0xaf64, 0xaf64, HB_Grapheme_LV}, - {0xaf65, 0xaf7f, HB_Grapheme_LVT}, - {0xaf80, 0xaf80, HB_Grapheme_LV}, - {0xaf81, 0xaf9b, HB_Grapheme_LVT}, - {0xaf9c, 0xaf9c, HB_Grapheme_LV}, - {0xaf9d, 0xafb7, HB_Grapheme_LVT}, - {0xafb8, 0xafb8, HB_Grapheme_LV}, - {0xafb9, 0xafd3, HB_Grapheme_LVT}, - {0xafd4, 0xafd4, HB_Grapheme_LV}, - {0xafd5, 0xafef, HB_Grapheme_LVT}, - {0xaff0, 0xaff0, HB_Grapheme_LV}, - {0xaff1, 0xb00b, HB_Grapheme_LVT}, - {0xb00c, 0xb00c, HB_Grapheme_LV}, - {0xb00d, 0xb027, HB_Grapheme_LVT}, - {0xb028, 0xb028, HB_Grapheme_LV}, - {0xb029, 0xb043, HB_Grapheme_LVT}, - {0xb044, 0xb044, HB_Grapheme_LV}, - {0xb045, 0xb05f, HB_Grapheme_LVT}, - {0xb060, 0xb060, HB_Grapheme_LV}, - {0xb061, 0xb07b, HB_Grapheme_LVT}, - {0xb07c, 0xb07c, HB_Grapheme_LV}, - {0xb07d, 0xb097, HB_Grapheme_LVT}, - {0xb098, 0xb098, HB_Grapheme_LV}, - {0xb099, 0xb0b3, HB_Grapheme_LVT}, - {0xb0b4, 0xb0b4, HB_Grapheme_LV}, - {0xb0b5, 0xb0cf, HB_Grapheme_LVT}, - {0xb0d0, 0xb0d0, HB_Grapheme_LV}, - {0xb0d1, 0xb0eb, HB_Grapheme_LVT}, - {0xb0ec, 0xb0ec, HB_Grapheme_LV}, - {0xb0ed, 0xb107, HB_Grapheme_LVT}, - {0xb108, 0xb108, HB_Grapheme_LV}, - {0xb109, 0xb123, HB_Grapheme_LVT}, - {0xb124, 0xb124, HB_Grapheme_LV}, - {0xb125, 0xb13f, HB_Grapheme_LVT}, - {0xb140, 0xb140, HB_Grapheme_LV}, - {0xb141, 0xb15b, HB_Grapheme_LVT}, - {0xb15c, 0xb15c, HB_Grapheme_LV}, - {0xb15d, 0xb177, HB_Grapheme_LVT}, - {0xb178, 0xb178, HB_Grapheme_LV}, - {0xb179, 0xb193, HB_Grapheme_LVT}, - {0xb194, 0xb194, HB_Grapheme_LV}, - {0xb195, 0xb1af, HB_Grapheme_LVT}, - {0xb1b0, 0xb1b0, HB_Grapheme_LV}, - {0xb1b1, 0xb1cb, HB_Grapheme_LVT}, - {0xb1cc, 0xb1cc, HB_Grapheme_LV}, - {0xb1cd, 0xb1e7, HB_Grapheme_LVT}, - {0xb1e8, 0xb1e8, HB_Grapheme_LV}, - {0xb1e9, 0xb203, HB_Grapheme_LVT}, - {0xb204, 0xb204, HB_Grapheme_LV}, - {0xb205, 0xb21f, HB_Grapheme_LVT}, - {0xb220, 0xb220, HB_Grapheme_LV}, - {0xb221, 0xb23b, HB_Grapheme_LVT}, - {0xb23c, 0xb23c, HB_Grapheme_LV}, - {0xb23d, 0xb257, HB_Grapheme_LVT}, - {0xb258, 0xb258, HB_Grapheme_LV}, - {0xb259, 0xb273, HB_Grapheme_LVT}, - {0xb274, 0xb274, HB_Grapheme_LV}, - {0xb275, 0xb28f, HB_Grapheme_LVT}, - {0xb290, 0xb290, HB_Grapheme_LV}, - {0xb291, 0xb2ab, HB_Grapheme_LVT}, - {0xb2ac, 0xb2ac, HB_Grapheme_LV}, - {0xb2ad, 0xb2c7, HB_Grapheme_LVT}, - {0xb2c8, 0xb2c8, HB_Grapheme_LV}, - {0xb2c9, 0xb2e3, HB_Grapheme_LVT}, - {0xb2e4, 0xb2e4, HB_Grapheme_LV}, - {0xb2e5, 0xb2ff, HB_Grapheme_LVT}, - {0xb300, 0xb300, HB_Grapheme_LV}, - {0xb301, 0xb31b, HB_Grapheme_LVT}, - {0xb31c, 0xb31c, HB_Grapheme_LV}, - {0xb31d, 0xb337, HB_Grapheme_LVT}, - {0xb338, 0xb338, HB_Grapheme_LV}, - {0xb339, 0xb353, HB_Grapheme_LVT}, - {0xb354, 0xb354, HB_Grapheme_LV}, - {0xb355, 0xb36f, HB_Grapheme_LVT}, - {0xb370, 0xb370, HB_Grapheme_LV}, - {0xb371, 0xb38b, HB_Grapheme_LVT}, - {0xb38c, 0xb38c, HB_Grapheme_LV}, - {0xb38d, 0xb3a7, HB_Grapheme_LVT}, - {0xb3a8, 0xb3a8, HB_Grapheme_LV}, - {0xb3a9, 0xb3c3, HB_Grapheme_LVT}, - {0xb3c4, 0xb3c4, HB_Grapheme_LV}, - {0xb3c5, 0xb3df, HB_Grapheme_LVT}, - {0xb3e0, 0xb3e0, HB_Grapheme_LV}, - {0xb3e1, 0xb3fb, HB_Grapheme_LVT}, - {0xb3fc, 0xb3fc, HB_Grapheme_LV}, - {0xb3fd, 0xb417, HB_Grapheme_LVT}, - {0xb418, 0xb418, HB_Grapheme_LV}, - {0xb419, 0xb433, HB_Grapheme_LVT}, - {0xb434, 0xb434, HB_Grapheme_LV}, - {0xb435, 0xb44f, HB_Grapheme_LVT}, - {0xb450, 0xb450, HB_Grapheme_LV}, - {0xb451, 0xb46b, HB_Grapheme_LVT}, - {0xb46c, 0xb46c, HB_Grapheme_LV}, - {0xb46d, 0xb487, HB_Grapheme_LVT}, - {0xb488, 0xb488, HB_Grapheme_LV}, - {0xb489, 0xb4a3, HB_Grapheme_LVT}, - {0xb4a4, 0xb4a4, HB_Grapheme_LV}, - {0xb4a5, 0xb4bf, HB_Grapheme_LVT}, - {0xb4c0, 0xb4c0, HB_Grapheme_LV}, - {0xb4c1, 0xb4db, HB_Grapheme_LVT}, - {0xb4dc, 0xb4dc, HB_Grapheme_LV}, - {0xb4dd, 0xb4f7, HB_Grapheme_LVT}, - {0xb4f8, 0xb4f8, HB_Grapheme_LV}, - {0xb4f9, 0xb513, HB_Grapheme_LVT}, - {0xb514, 0xb514, HB_Grapheme_LV}, - {0xb515, 0xb52f, HB_Grapheme_LVT}, - {0xb530, 0xb530, HB_Grapheme_LV}, - {0xb531, 0xb54b, HB_Grapheme_LVT}, - {0xb54c, 0xb54c, HB_Grapheme_LV}, - {0xb54d, 0xb567, HB_Grapheme_LVT}, - {0xb568, 0xb568, HB_Grapheme_LV}, - {0xb569, 0xb583, HB_Grapheme_LVT}, - {0xb584, 0xb584, HB_Grapheme_LV}, - {0xb585, 0xb59f, HB_Grapheme_LVT}, - {0xb5a0, 0xb5a0, HB_Grapheme_LV}, - {0xb5a1, 0xb5bb, HB_Grapheme_LVT}, - {0xb5bc, 0xb5bc, HB_Grapheme_LV}, - {0xb5bd, 0xb5d7, HB_Grapheme_LVT}, - {0xb5d8, 0xb5d8, HB_Grapheme_LV}, - {0xb5d9, 0xb5f3, HB_Grapheme_LVT}, - {0xb5f4, 0xb5f4, HB_Grapheme_LV}, - {0xb5f5, 0xb60f, HB_Grapheme_LVT}, - {0xb610, 0xb610, HB_Grapheme_LV}, - {0xb611, 0xb62b, HB_Grapheme_LVT}, - {0xb62c, 0xb62c, HB_Grapheme_LV}, - {0xb62d, 0xb647, HB_Grapheme_LVT}, - {0xb648, 0xb648, HB_Grapheme_LV}, - {0xb649, 0xb663, HB_Grapheme_LVT}, - {0xb664, 0xb664, HB_Grapheme_LV}, - {0xb665, 0xb67f, HB_Grapheme_LVT}, - {0xb680, 0xb680, HB_Grapheme_LV}, - {0xb681, 0xb69b, HB_Grapheme_LVT}, - {0xb69c, 0xb69c, HB_Grapheme_LV}, - {0xb69d, 0xb6b7, HB_Grapheme_LVT}, - {0xb6b8, 0xb6b8, HB_Grapheme_LV}, - {0xb6b9, 0xb6d3, HB_Grapheme_LVT}, - {0xb6d4, 0xb6d4, HB_Grapheme_LV}, - {0xb6d5, 0xb6ef, HB_Grapheme_LVT}, - {0xb6f0, 0xb6f0, HB_Grapheme_LV}, - {0xb6f1, 0xb70b, HB_Grapheme_LVT}, - {0xb70c, 0xb70c, HB_Grapheme_LV}, - {0xb70d, 0xb727, HB_Grapheme_LVT}, - {0xb728, 0xb728, HB_Grapheme_LV}, - {0xb729, 0xb743, HB_Grapheme_LVT}, - {0xb744, 0xb744, HB_Grapheme_LV}, - {0xb745, 0xb75f, HB_Grapheme_LVT}, - {0xb760, 0xb760, HB_Grapheme_LV}, - {0xb761, 0xb77b, HB_Grapheme_LVT}, - {0xb77c, 0xb77c, HB_Grapheme_LV}, - {0xb77d, 0xb797, HB_Grapheme_LVT}, - {0xb798, 0xb798, HB_Grapheme_LV}, - {0xb799, 0xb7b3, HB_Grapheme_LVT}, - {0xb7b4, 0xb7b4, HB_Grapheme_LV}, - {0xb7b5, 0xb7cf, HB_Grapheme_LVT}, - {0xb7d0, 0xb7d0, HB_Grapheme_LV}, - {0xb7d1, 0xb7eb, HB_Grapheme_LVT}, - {0xb7ec, 0xb7ec, HB_Grapheme_LV}, - {0xb7ed, 0xb807, HB_Grapheme_LVT}, - {0xb808, 0xb808, HB_Grapheme_LV}, - {0xb809, 0xb823, HB_Grapheme_LVT}, - {0xb824, 0xb824, HB_Grapheme_LV}, - {0xb825, 0xb83f, HB_Grapheme_LVT}, - {0xb840, 0xb840, HB_Grapheme_LV}, - {0xb841, 0xb85b, HB_Grapheme_LVT}, - {0xb85c, 0xb85c, HB_Grapheme_LV}, - {0xb85d, 0xb877, HB_Grapheme_LVT}, - {0xb878, 0xb878, HB_Grapheme_LV}, - {0xb879, 0xb893, HB_Grapheme_LVT}, - {0xb894, 0xb894, HB_Grapheme_LV}, - {0xb895, 0xb8af, HB_Grapheme_LVT}, - {0xb8b0, 0xb8b0, HB_Grapheme_LV}, - {0xb8b1, 0xb8cb, HB_Grapheme_LVT}, - {0xb8cc, 0xb8cc, HB_Grapheme_LV}, - {0xb8cd, 0xb8e7, HB_Grapheme_LVT}, - {0xb8e8, 0xb8e8, HB_Grapheme_LV}, - {0xb8e9, 0xb903, HB_Grapheme_LVT}, - {0xb904, 0xb904, HB_Grapheme_LV}, - {0xb905, 0xb91f, HB_Grapheme_LVT}, - {0xb920, 0xb920, HB_Grapheme_LV}, - {0xb921, 0xb93b, HB_Grapheme_LVT}, - {0xb93c, 0xb93c, HB_Grapheme_LV}, - {0xb93d, 0xb957, HB_Grapheme_LVT}, - {0xb958, 0xb958, HB_Grapheme_LV}, - {0xb959, 0xb973, HB_Grapheme_LVT}, - {0xb974, 0xb974, HB_Grapheme_LV}, - {0xb975, 0xb98f, HB_Grapheme_LVT}, - {0xb990, 0xb990, HB_Grapheme_LV}, - {0xb991, 0xb9ab, HB_Grapheme_LVT}, - {0xb9ac, 0xb9ac, HB_Grapheme_LV}, - {0xb9ad, 0xb9c7, HB_Grapheme_LVT}, - {0xb9c8, 0xb9c8, HB_Grapheme_LV}, - {0xb9c9, 0xb9e3, HB_Grapheme_LVT}, - {0xb9e4, 0xb9e4, HB_Grapheme_LV}, - {0xb9e5, 0xb9ff, HB_Grapheme_LVT}, - {0xba00, 0xba00, HB_Grapheme_LV}, - {0xba01, 0xba1b, HB_Grapheme_LVT}, - {0xba1c, 0xba1c, HB_Grapheme_LV}, - {0xba1d, 0xba37, HB_Grapheme_LVT}, - {0xba38, 0xba38, HB_Grapheme_LV}, - {0xba39, 0xba53, HB_Grapheme_LVT}, - {0xba54, 0xba54, HB_Grapheme_LV}, - {0xba55, 0xba6f, HB_Grapheme_LVT}, - {0xba70, 0xba70, HB_Grapheme_LV}, - {0xba71, 0xba8b, HB_Grapheme_LVT}, - {0xba8c, 0xba8c, HB_Grapheme_LV}, - {0xba8d, 0xbaa7, HB_Grapheme_LVT}, - {0xbaa8, 0xbaa8, HB_Grapheme_LV}, - {0xbaa9, 0xbac3, HB_Grapheme_LVT}, - {0xbac4, 0xbac4, HB_Grapheme_LV}, - {0xbac5, 0xbadf, HB_Grapheme_LVT}, - {0xbae0, 0xbae0, HB_Grapheme_LV}, - {0xbae1, 0xbafb, HB_Grapheme_LVT}, - {0xbafc, 0xbafc, HB_Grapheme_LV}, - {0xbafd, 0xbb17, HB_Grapheme_LVT}, - {0xbb18, 0xbb18, HB_Grapheme_LV}, - {0xbb19, 0xbb33, HB_Grapheme_LVT}, - {0xbb34, 0xbb34, HB_Grapheme_LV}, - {0xbb35, 0xbb4f, HB_Grapheme_LVT}, - {0xbb50, 0xbb50, HB_Grapheme_LV}, - {0xbb51, 0xbb6b, HB_Grapheme_LVT}, - {0xbb6c, 0xbb6c, HB_Grapheme_LV}, - {0xbb6d, 0xbb87, HB_Grapheme_LVT}, - {0xbb88, 0xbb88, HB_Grapheme_LV}, - {0xbb89, 0xbba3, HB_Grapheme_LVT}, - {0xbba4, 0xbba4, HB_Grapheme_LV}, - {0xbba5, 0xbbbf, HB_Grapheme_LVT}, - {0xbbc0, 0xbbc0, HB_Grapheme_LV}, - {0xbbc1, 0xbbdb, HB_Grapheme_LVT}, - {0xbbdc, 0xbbdc, HB_Grapheme_LV}, - {0xbbdd, 0xbbf7, HB_Grapheme_LVT}, - {0xbbf8, 0xbbf8, HB_Grapheme_LV}, - {0xbbf9, 0xbc13, HB_Grapheme_LVT}, - {0xbc14, 0xbc14, HB_Grapheme_LV}, - {0xbc15, 0xbc2f, HB_Grapheme_LVT}, - {0xbc30, 0xbc30, HB_Grapheme_LV}, - {0xbc31, 0xbc4b, HB_Grapheme_LVT}, - {0xbc4c, 0xbc4c, HB_Grapheme_LV}, - {0xbc4d, 0xbc67, HB_Grapheme_LVT}, - {0xbc68, 0xbc68, HB_Grapheme_LV}, - {0xbc69, 0xbc83, HB_Grapheme_LVT}, - {0xbc84, 0xbc84, HB_Grapheme_LV}, - {0xbc85, 0xbc9f, HB_Grapheme_LVT}, - {0xbca0, 0xbca0, HB_Grapheme_LV}, - {0xbca1, 0xbcbb, HB_Grapheme_LVT}, - {0xbcbc, 0xbcbc, HB_Grapheme_LV}, - {0xbcbd, 0xbcd7, HB_Grapheme_LVT}, - {0xbcd8, 0xbcd8, HB_Grapheme_LV}, - {0xbcd9, 0xbcf3, HB_Grapheme_LVT}, - {0xbcf4, 0xbcf4, HB_Grapheme_LV}, - {0xbcf5, 0xbd0f, HB_Grapheme_LVT}, - {0xbd10, 0xbd10, HB_Grapheme_LV}, - {0xbd11, 0xbd2b, HB_Grapheme_LVT}, - {0xbd2c, 0xbd2c, HB_Grapheme_LV}, - {0xbd2d, 0xbd47, HB_Grapheme_LVT}, - {0xbd48, 0xbd48, HB_Grapheme_LV}, - {0xbd49, 0xbd63, HB_Grapheme_LVT}, - {0xbd64, 0xbd64, HB_Grapheme_LV}, - {0xbd65, 0xbd7f, HB_Grapheme_LVT}, - {0xbd80, 0xbd80, HB_Grapheme_LV}, - {0xbd81, 0xbd9b, HB_Grapheme_LVT}, - {0xbd9c, 0xbd9c, HB_Grapheme_LV}, - {0xbd9d, 0xbdb7, HB_Grapheme_LVT}, - {0xbdb8, 0xbdb8, HB_Grapheme_LV}, - {0xbdb9, 0xbdd3, HB_Grapheme_LVT}, - {0xbdd4, 0xbdd4, HB_Grapheme_LV}, - {0xbdd5, 0xbdef, HB_Grapheme_LVT}, - {0xbdf0, 0xbdf0, HB_Grapheme_LV}, - {0xbdf1, 0xbe0b, HB_Grapheme_LVT}, - {0xbe0c, 0xbe0c, HB_Grapheme_LV}, - {0xbe0d, 0xbe27, HB_Grapheme_LVT}, - {0xbe28, 0xbe28, HB_Grapheme_LV}, - {0xbe29, 0xbe43, HB_Grapheme_LVT}, - {0xbe44, 0xbe44, HB_Grapheme_LV}, - {0xbe45, 0xbe5f, HB_Grapheme_LVT}, - {0xbe60, 0xbe60, HB_Grapheme_LV}, - {0xbe61, 0xbe7b, HB_Grapheme_LVT}, - {0xbe7c, 0xbe7c, HB_Grapheme_LV}, - {0xbe7d, 0xbe97, HB_Grapheme_LVT}, - {0xbe98, 0xbe98, HB_Grapheme_LV}, - {0xbe99, 0xbeb3, HB_Grapheme_LVT}, - {0xbeb4, 0xbeb4, HB_Grapheme_LV}, - {0xbeb5, 0xbecf, HB_Grapheme_LVT}, - {0xbed0, 0xbed0, HB_Grapheme_LV}, - {0xbed1, 0xbeeb, HB_Grapheme_LVT}, - {0xbeec, 0xbeec, HB_Grapheme_LV}, - {0xbeed, 0xbf07, HB_Grapheme_LVT}, - {0xbf08, 0xbf08, HB_Grapheme_LV}, - {0xbf09, 0xbf23, HB_Grapheme_LVT}, - {0xbf24, 0xbf24, HB_Grapheme_LV}, - {0xbf25, 0xbf3f, HB_Grapheme_LVT}, - {0xbf40, 0xbf40, HB_Grapheme_LV}, - {0xbf41, 0xbf5b, HB_Grapheme_LVT}, - {0xbf5c, 0xbf5c, HB_Grapheme_LV}, - {0xbf5d, 0xbf77, HB_Grapheme_LVT}, - {0xbf78, 0xbf78, HB_Grapheme_LV}, - {0xbf79, 0xbf93, HB_Grapheme_LVT}, - {0xbf94, 0xbf94, HB_Grapheme_LV}, - {0xbf95, 0xbfaf, HB_Grapheme_LVT}, - {0xbfb0, 0xbfb0, HB_Grapheme_LV}, - {0xbfb1, 0xbfcb, HB_Grapheme_LVT}, - {0xbfcc, 0xbfcc, HB_Grapheme_LV}, - {0xbfcd, 0xbfe7, HB_Grapheme_LVT}, - {0xbfe8, 0xbfe8, HB_Grapheme_LV}, - {0xbfe9, 0xc003, HB_Grapheme_LVT}, - {0xc004, 0xc004, HB_Grapheme_LV}, - {0xc005, 0xc01f, HB_Grapheme_LVT}, - {0xc020, 0xc020, HB_Grapheme_LV}, - {0xc021, 0xc03b, HB_Grapheme_LVT}, - {0xc03c, 0xc03c, HB_Grapheme_LV}, - {0xc03d, 0xc057, HB_Grapheme_LVT}, - {0xc058, 0xc058, HB_Grapheme_LV}, - {0xc059, 0xc073, HB_Grapheme_LVT}, - {0xc074, 0xc074, HB_Grapheme_LV}, - {0xc075, 0xc08f, HB_Grapheme_LVT}, - {0xc090, 0xc090, HB_Grapheme_LV}, - {0xc091, 0xc0ab, HB_Grapheme_LVT}, - {0xc0ac, 0xc0ac, HB_Grapheme_LV}, - {0xc0ad, 0xc0c7, HB_Grapheme_LVT}, - {0xc0c8, 0xc0c8, HB_Grapheme_LV}, - {0xc0c9, 0xc0e3, HB_Grapheme_LVT}, - {0xc0e4, 0xc0e4, HB_Grapheme_LV}, - {0xc0e5, 0xc0ff, HB_Grapheme_LVT}, - {0xc100, 0xc100, HB_Grapheme_LV}, - {0xc101, 0xc11b, HB_Grapheme_LVT}, - {0xc11c, 0xc11c, HB_Grapheme_LV}, - {0xc11d, 0xc137, HB_Grapheme_LVT}, - {0xc138, 0xc138, HB_Grapheme_LV}, - {0xc139, 0xc153, HB_Grapheme_LVT}, - {0xc154, 0xc154, HB_Grapheme_LV}, - {0xc155, 0xc16f, HB_Grapheme_LVT}, - {0xc170, 0xc170, HB_Grapheme_LV}, - {0xc171, 0xc18b, HB_Grapheme_LVT}, - {0xc18c, 0xc18c, HB_Grapheme_LV}, - {0xc18d, 0xc1a7, HB_Grapheme_LVT}, - {0xc1a8, 0xc1a8, HB_Grapheme_LV}, - {0xc1a9, 0xc1c3, HB_Grapheme_LVT}, - {0xc1c4, 0xc1c4, HB_Grapheme_LV}, - {0xc1c5, 0xc1df, HB_Grapheme_LVT}, - {0xc1e0, 0xc1e0, HB_Grapheme_LV}, - {0xc1e1, 0xc1fb, HB_Grapheme_LVT}, - {0xc1fc, 0xc1fc, HB_Grapheme_LV}, - {0xc1fd, 0xc217, HB_Grapheme_LVT}, - {0xc218, 0xc218, HB_Grapheme_LV}, - {0xc219, 0xc233, HB_Grapheme_LVT}, - {0xc234, 0xc234, HB_Grapheme_LV}, - {0xc235, 0xc24f, HB_Grapheme_LVT}, - {0xc250, 0xc250, HB_Grapheme_LV}, - {0xc251, 0xc26b, HB_Grapheme_LVT}, - {0xc26c, 0xc26c, HB_Grapheme_LV}, - {0xc26d, 0xc287, HB_Grapheme_LVT}, - {0xc288, 0xc288, HB_Grapheme_LV}, - {0xc289, 0xc2a3, HB_Grapheme_LVT}, - {0xc2a4, 0xc2a4, HB_Grapheme_LV}, - {0xc2a5, 0xc2bf, HB_Grapheme_LVT}, - {0xc2c0, 0xc2c0, HB_Grapheme_LV}, - {0xc2c1, 0xc2db, HB_Grapheme_LVT}, - {0xc2dc, 0xc2dc, HB_Grapheme_LV}, - {0xc2dd, 0xc2f7, HB_Grapheme_LVT}, - {0xc2f8, 0xc2f8, HB_Grapheme_LV}, - {0xc2f9, 0xc313, HB_Grapheme_LVT}, - {0xc314, 0xc314, HB_Grapheme_LV}, - {0xc315, 0xc32f, HB_Grapheme_LVT}, - {0xc330, 0xc330, HB_Grapheme_LV}, - {0xc331, 0xc34b, HB_Grapheme_LVT}, - {0xc34c, 0xc34c, HB_Grapheme_LV}, - {0xc34d, 0xc367, HB_Grapheme_LVT}, - {0xc368, 0xc368, HB_Grapheme_LV}, - {0xc369, 0xc383, HB_Grapheme_LVT}, - {0xc384, 0xc384, HB_Grapheme_LV}, - {0xc385, 0xc39f, HB_Grapheme_LVT}, - {0xc3a0, 0xc3a0, HB_Grapheme_LV}, - {0xc3a1, 0xc3bb, HB_Grapheme_LVT}, - {0xc3bc, 0xc3bc, HB_Grapheme_LV}, - {0xc3bd, 0xc3d7, HB_Grapheme_LVT}, - {0xc3d8, 0xc3d8, HB_Grapheme_LV}, - {0xc3d9, 0xc3f3, HB_Grapheme_LVT}, - {0xc3f4, 0xc3f4, HB_Grapheme_LV}, - {0xc3f5, 0xc40f, HB_Grapheme_LVT}, - {0xc410, 0xc410, HB_Grapheme_LV}, - {0xc411, 0xc42b, HB_Grapheme_LVT}, - {0xc42c, 0xc42c, HB_Grapheme_LV}, - {0xc42d, 0xc447, HB_Grapheme_LVT}, - {0xc448, 0xc448, HB_Grapheme_LV}, - {0xc449, 0xc463, HB_Grapheme_LVT}, - {0xc464, 0xc464, HB_Grapheme_LV}, - {0xc465, 0xc47f, HB_Grapheme_LVT}, - {0xc480, 0xc480, HB_Grapheme_LV}, - {0xc481, 0xc49b, HB_Grapheme_LVT}, - {0xc49c, 0xc49c, HB_Grapheme_LV}, - {0xc49d, 0xc4b7, HB_Grapheme_LVT}, - {0xc4b8, 0xc4b8, HB_Grapheme_LV}, - {0xc4b9, 0xc4d3, HB_Grapheme_LVT}, - {0xc4d4, 0xc4d4, HB_Grapheme_LV}, - {0xc4d5, 0xc4ef, HB_Grapheme_LVT}, - {0xc4f0, 0xc4f0, HB_Grapheme_LV}, - {0xc4f1, 0xc50b, HB_Grapheme_LVT}, - {0xc50c, 0xc50c, HB_Grapheme_LV}, - {0xc50d, 0xc527, HB_Grapheme_LVT}, - {0xc528, 0xc528, HB_Grapheme_LV}, - {0xc529, 0xc543, HB_Grapheme_LVT}, - {0xc544, 0xc544, HB_Grapheme_LV}, - {0xc545, 0xc55f, HB_Grapheme_LVT}, - {0xc560, 0xc560, HB_Grapheme_LV}, - {0xc561, 0xc57b, HB_Grapheme_LVT}, - {0xc57c, 0xc57c, HB_Grapheme_LV}, - {0xc57d, 0xc597, HB_Grapheme_LVT}, - {0xc598, 0xc598, HB_Grapheme_LV}, - {0xc599, 0xc5b3, HB_Grapheme_LVT}, - {0xc5b4, 0xc5b4, HB_Grapheme_LV}, - {0xc5b5, 0xc5cf, HB_Grapheme_LVT}, - {0xc5d0, 0xc5d0, HB_Grapheme_LV}, - {0xc5d1, 0xc5eb, HB_Grapheme_LVT}, - {0xc5ec, 0xc5ec, HB_Grapheme_LV}, - {0xc5ed, 0xc607, HB_Grapheme_LVT}, - {0xc608, 0xc608, HB_Grapheme_LV}, - {0xc609, 0xc623, HB_Grapheme_LVT}, - {0xc624, 0xc624, HB_Grapheme_LV}, - {0xc625, 0xc63f, HB_Grapheme_LVT}, - {0xc640, 0xc640, HB_Grapheme_LV}, - {0xc641, 0xc65b, HB_Grapheme_LVT}, - {0xc65c, 0xc65c, HB_Grapheme_LV}, - {0xc65d, 0xc677, HB_Grapheme_LVT}, - {0xc678, 0xc678, HB_Grapheme_LV}, - {0xc679, 0xc693, HB_Grapheme_LVT}, - {0xc694, 0xc694, HB_Grapheme_LV}, - {0xc695, 0xc6af, HB_Grapheme_LVT}, - {0xc6b0, 0xc6b0, HB_Grapheme_LV}, - {0xc6b1, 0xc6cb, HB_Grapheme_LVT}, - {0xc6cc, 0xc6cc, HB_Grapheme_LV}, - {0xc6cd, 0xc6e7, HB_Grapheme_LVT}, - {0xc6e8, 0xc6e8, HB_Grapheme_LV}, - {0xc6e9, 0xc703, HB_Grapheme_LVT}, - {0xc704, 0xc704, HB_Grapheme_LV}, - {0xc705, 0xc71f, HB_Grapheme_LVT}, - {0xc720, 0xc720, HB_Grapheme_LV}, - {0xc721, 0xc73b, HB_Grapheme_LVT}, - {0xc73c, 0xc73c, HB_Grapheme_LV}, - {0xc73d, 0xc757, HB_Grapheme_LVT}, - {0xc758, 0xc758, HB_Grapheme_LV}, - {0xc759, 0xc773, HB_Grapheme_LVT}, - {0xc774, 0xc774, HB_Grapheme_LV}, - {0xc775, 0xc78f, HB_Grapheme_LVT}, - {0xc790, 0xc790, HB_Grapheme_LV}, - {0xc791, 0xc7ab, HB_Grapheme_LVT}, - {0xc7ac, 0xc7ac, HB_Grapheme_LV}, - {0xc7ad, 0xc7c7, HB_Grapheme_LVT}, - {0xc7c8, 0xc7c8, HB_Grapheme_LV}, - {0xc7c9, 0xc7e3, HB_Grapheme_LVT}, - {0xc7e4, 0xc7e4, HB_Grapheme_LV}, - {0xc7e5, 0xc7ff, HB_Grapheme_LVT}, - {0xc800, 0xc800, HB_Grapheme_LV}, - {0xc801, 0xc81b, HB_Grapheme_LVT}, - {0xc81c, 0xc81c, HB_Grapheme_LV}, - {0xc81d, 0xc837, HB_Grapheme_LVT}, - {0xc838, 0xc838, HB_Grapheme_LV}, - {0xc839, 0xc853, HB_Grapheme_LVT}, - {0xc854, 0xc854, HB_Grapheme_LV}, - {0xc855, 0xc86f, HB_Grapheme_LVT}, - {0xc870, 0xc870, HB_Grapheme_LV}, - {0xc871, 0xc88b, HB_Grapheme_LVT}, - {0xc88c, 0xc88c, HB_Grapheme_LV}, - {0xc88d, 0xc8a7, HB_Grapheme_LVT}, - {0xc8a8, 0xc8a8, HB_Grapheme_LV}, - {0xc8a9, 0xc8c3, HB_Grapheme_LVT}, - {0xc8c4, 0xc8c4, HB_Grapheme_LV}, - {0xc8c5, 0xc8df, HB_Grapheme_LVT}, - {0xc8e0, 0xc8e0, HB_Grapheme_LV}, - {0xc8e1, 0xc8fb, HB_Grapheme_LVT}, - {0xc8fc, 0xc8fc, HB_Grapheme_LV}, - {0xc8fd, 0xc917, HB_Grapheme_LVT}, - {0xc918, 0xc918, HB_Grapheme_LV}, - {0xc919, 0xc933, HB_Grapheme_LVT}, - {0xc934, 0xc934, HB_Grapheme_LV}, - {0xc935, 0xc94f, HB_Grapheme_LVT}, - {0xc950, 0xc950, HB_Grapheme_LV}, - {0xc951, 0xc96b, HB_Grapheme_LVT}, - {0xc96c, 0xc96c, HB_Grapheme_LV}, - {0xc96d, 0xc987, HB_Grapheme_LVT}, - {0xc988, 0xc988, HB_Grapheme_LV}, - {0xc989, 0xc9a3, HB_Grapheme_LVT}, - {0xc9a4, 0xc9a4, HB_Grapheme_LV}, - {0xc9a5, 0xc9bf, HB_Grapheme_LVT}, - {0xc9c0, 0xc9c0, HB_Grapheme_LV}, - {0xc9c1, 0xc9db, HB_Grapheme_LVT}, - {0xc9dc, 0xc9dc, HB_Grapheme_LV}, - {0xc9dd, 0xc9f7, HB_Grapheme_LVT}, - {0xc9f8, 0xc9f8, HB_Grapheme_LV}, - {0xc9f9, 0xca13, HB_Grapheme_LVT}, - {0xca14, 0xca14, HB_Grapheme_LV}, - {0xca15, 0xca2f, HB_Grapheme_LVT}, - {0xca30, 0xca30, HB_Grapheme_LV}, - {0xca31, 0xca4b, HB_Grapheme_LVT}, - {0xca4c, 0xca4c, HB_Grapheme_LV}, - {0xca4d, 0xca67, HB_Grapheme_LVT}, - {0xca68, 0xca68, HB_Grapheme_LV}, - {0xca69, 0xca83, HB_Grapheme_LVT}, - {0xca84, 0xca84, HB_Grapheme_LV}, - {0xca85, 0xca9f, HB_Grapheme_LVT}, - {0xcaa0, 0xcaa0, HB_Grapheme_LV}, - {0xcaa1, 0xcabb, HB_Grapheme_LVT}, - {0xcabc, 0xcabc, HB_Grapheme_LV}, - {0xcabd, 0xcad7, HB_Grapheme_LVT}, - {0xcad8, 0xcad8, HB_Grapheme_LV}, - {0xcad9, 0xcaf3, HB_Grapheme_LVT}, - {0xcaf4, 0xcaf4, HB_Grapheme_LV}, - {0xcaf5, 0xcb0f, HB_Grapheme_LVT}, - {0xcb10, 0xcb10, HB_Grapheme_LV}, - {0xcb11, 0xcb2b, HB_Grapheme_LVT}, - {0xcb2c, 0xcb2c, HB_Grapheme_LV}, - {0xcb2d, 0xcb47, HB_Grapheme_LVT}, - {0xcb48, 0xcb48, HB_Grapheme_LV}, - {0xcb49, 0xcb63, HB_Grapheme_LVT}, - {0xcb64, 0xcb64, HB_Grapheme_LV}, - {0xcb65, 0xcb7f, HB_Grapheme_LVT}, - {0xcb80, 0xcb80, HB_Grapheme_LV}, - {0xcb81, 0xcb9b, HB_Grapheme_LVT}, - {0xcb9c, 0xcb9c, HB_Grapheme_LV}, - {0xcb9d, 0xcbb7, HB_Grapheme_LVT}, - {0xcbb8, 0xcbb8, HB_Grapheme_LV}, - {0xcbb9, 0xcbd3, HB_Grapheme_LVT}, - {0xcbd4, 0xcbd4, HB_Grapheme_LV}, - {0xcbd5, 0xcbef, HB_Grapheme_LVT}, - {0xcbf0, 0xcbf0, HB_Grapheme_LV}, - {0xcbf1, 0xcc0b, HB_Grapheme_LVT}, - {0xcc0c, 0xcc0c, HB_Grapheme_LV}, - {0xcc0d, 0xcc27, HB_Grapheme_LVT}, - {0xcc28, 0xcc28, HB_Grapheme_LV}, - {0xcc29, 0xcc43, HB_Grapheme_LVT}, - {0xcc44, 0xcc44, HB_Grapheme_LV}, - {0xcc45, 0xcc5f, HB_Grapheme_LVT}, - {0xcc60, 0xcc60, HB_Grapheme_LV}, - {0xcc61, 0xcc7b, HB_Grapheme_LVT}, - {0xcc7c, 0xcc7c, HB_Grapheme_LV}, - {0xcc7d, 0xcc97, HB_Grapheme_LVT}, - {0xcc98, 0xcc98, HB_Grapheme_LV}, - {0xcc99, 0xccb3, HB_Grapheme_LVT}, - {0xccb4, 0xccb4, HB_Grapheme_LV}, - {0xccb5, 0xcccf, HB_Grapheme_LVT}, - {0xccd0, 0xccd0, HB_Grapheme_LV}, - {0xccd1, 0xcceb, HB_Grapheme_LVT}, - {0xccec, 0xccec, HB_Grapheme_LV}, - {0xcced, 0xcd07, HB_Grapheme_LVT}, - {0xcd08, 0xcd08, HB_Grapheme_LV}, - {0xcd09, 0xcd23, HB_Grapheme_LVT}, - {0xcd24, 0xcd24, HB_Grapheme_LV}, - {0xcd25, 0xcd3f, HB_Grapheme_LVT}, - {0xcd40, 0xcd40, HB_Grapheme_LV}, - {0xcd41, 0xcd5b, HB_Grapheme_LVT}, - {0xcd5c, 0xcd5c, HB_Grapheme_LV}, - {0xcd5d, 0xcd77, HB_Grapheme_LVT}, - {0xcd78, 0xcd78, HB_Grapheme_LV}, - {0xcd79, 0xcd93, HB_Grapheme_LVT}, - {0xcd94, 0xcd94, HB_Grapheme_LV}, - {0xcd95, 0xcdaf, HB_Grapheme_LVT}, - {0xcdb0, 0xcdb0, HB_Grapheme_LV}, - {0xcdb1, 0xcdcb, HB_Grapheme_LVT}, - {0xcdcc, 0xcdcc, HB_Grapheme_LV}, - {0xcdcd, 0xcde7, HB_Grapheme_LVT}, - {0xcde8, 0xcde8, HB_Grapheme_LV}, - {0xcde9, 0xce03, HB_Grapheme_LVT}, - {0xce04, 0xce04, HB_Grapheme_LV}, - {0xce05, 0xce1f, HB_Grapheme_LVT}, - {0xce20, 0xce20, HB_Grapheme_LV}, - {0xce21, 0xce3b, HB_Grapheme_LVT}, - {0xce3c, 0xce3c, HB_Grapheme_LV}, - {0xce3d, 0xce57, HB_Grapheme_LVT}, - {0xce58, 0xce58, HB_Grapheme_LV}, - {0xce59, 0xce73, HB_Grapheme_LVT}, - {0xce74, 0xce74, HB_Grapheme_LV}, - {0xce75, 0xce8f, HB_Grapheme_LVT}, - {0xce90, 0xce90, HB_Grapheme_LV}, - {0xce91, 0xceab, HB_Grapheme_LVT}, - {0xceac, 0xceac, HB_Grapheme_LV}, - {0xcead, 0xcec7, HB_Grapheme_LVT}, - {0xcec8, 0xcec8, HB_Grapheme_LV}, - {0xcec9, 0xcee3, HB_Grapheme_LVT}, - {0xcee4, 0xcee4, HB_Grapheme_LV}, - {0xcee5, 0xceff, HB_Grapheme_LVT}, - {0xcf00, 0xcf00, HB_Grapheme_LV}, - {0xcf01, 0xcf1b, HB_Grapheme_LVT}, - {0xcf1c, 0xcf1c, HB_Grapheme_LV}, - {0xcf1d, 0xcf37, HB_Grapheme_LVT}, - {0xcf38, 0xcf38, HB_Grapheme_LV}, - {0xcf39, 0xcf53, HB_Grapheme_LVT}, - {0xcf54, 0xcf54, HB_Grapheme_LV}, - {0xcf55, 0xcf6f, HB_Grapheme_LVT}, - {0xcf70, 0xcf70, HB_Grapheme_LV}, - {0xcf71, 0xcf8b, HB_Grapheme_LVT}, - {0xcf8c, 0xcf8c, HB_Grapheme_LV}, - {0xcf8d, 0xcfa7, HB_Grapheme_LVT}, - {0xcfa8, 0xcfa8, HB_Grapheme_LV}, - {0xcfa9, 0xcfc3, HB_Grapheme_LVT}, - {0xcfc4, 0xcfc4, HB_Grapheme_LV}, - {0xcfc5, 0xcfdf, HB_Grapheme_LVT}, - {0xcfe0, 0xcfe0, HB_Grapheme_LV}, - {0xcfe1, 0xcffb, HB_Grapheme_LVT}, - {0xcffc, 0xcffc, HB_Grapheme_LV}, - {0xcffd, 0xd017, HB_Grapheme_LVT}, - {0xd018, 0xd018, HB_Grapheme_LV}, - {0xd019, 0xd033, HB_Grapheme_LVT}, - {0xd034, 0xd034, HB_Grapheme_LV}, - {0xd035, 0xd04f, HB_Grapheme_LVT}, - {0xd050, 0xd050, HB_Grapheme_LV}, - {0xd051, 0xd06b, HB_Grapheme_LVT}, - {0xd06c, 0xd06c, HB_Grapheme_LV}, - {0xd06d, 0xd087, HB_Grapheme_LVT}, - {0xd088, 0xd088, HB_Grapheme_LV}, - {0xd089, 0xd0a3, HB_Grapheme_LVT}, - {0xd0a4, 0xd0a4, HB_Grapheme_LV}, - {0xd0a5, 0xd0bf, HB_Grapheme_LVT}, - {0xd0c0, 0xd0c0, HB_Grapheme_LV}, - {0xd0c1, 0xd0db, HB_Grapheme_LVT}, - {0xd0dc, 0xd0dc, HB_Grapheme_LV}, - {0xd0dd, 0xd0f7, HB_Grapheme_LVT}, - {0xd0f8, 0xd0f8, HB_Grapheme_LV}, - {0xd0f9, 0xd113, HB_Grapheme_LVT}, - {0xd114, 0xd114, HB_Grapheme_LV}, - {0xd115, 0xd12f, HB_Grapheme_LVT}, - {0xd130, 0xd130, HB_Grapheme_LV}, - {0xd131, 0xd14b, HB_Grapheme_LVT}, - {0xd14c, 0xd14c, HB_Grapheme_LV}, - {0xd14d, 0xd167, HB_Grapheme_LVT}, - {0xd168, 0xd168, HB_Grapheme_LV}, - {0xd169, 0xd183, HB_Grapheme_LVT}, - {0xd184, 0xd184, HB_Grapheme_LV}, - {0xd185, 0xd19f, HB_Grapheme_LVT}, - {0xd1a0, 0xd1a0, HB_Grapheme_LV}, - {0xd1a1, 0xd1bb, HB_Grapheme_LVT}, - {0xd1bc, 0xd1bc, HB_Grapheme_LV}, - {0xd1bd, 0xd1d7, HB_Grapheme_LVT}, - {0xd1d8, 0xd1d8, HB_Grapheme_LV}, - {0xd1d9, 0xd1f3, HB_Grapheme_LVT}, - {0xd1f4, 0xd1f4, HB_Grapheme_LV}, - {0xd1f5, 0xd20f, HB_Grapheme_LVT}, - {0xd210, 0xd210, HB_Grapheme_LV}, - {0xd211, 0xd22b, HB_Grapheme_LVT}, - {0xd22c, 0xd22c, HB_Grapheme_LV}, - {0xd22d, 0xd247, HB_Grapheme_LVT}, - {0xd248, 0xd248, HB_Grapheme_LV}, - {0xd249, 0xd263, HB_Grapheme_LVT}, - {0xd264, 0xd264, HB_Grapheme_LV}, - {0xd265, 0xd27f, HB_Grapheme_LVT}, - {0xd280, 0xd280, HB_Grapheme_LV}, - {0xd281, 0xd29b, HB_Grapheme_LVT}, - {0xd29c, 0xd29c, HB_Grapheme_LV}, - {0xd29d, 0xd2b7, HB_Grapheme_LVT}, - {0xd2b8, 0xd2b8, HB_Grapheme_LV}, - {0xd2b9, 0xd2d3, HB_Grapheme_LVT}, - {0xd2d4, 0xd2d4, HB_Grapheme_LV}, - {0xd2d5, 0xd2ef, HB_Grapheme_LVT}, - {0xd2f0, 0xd2f0, HB_Grapheme_LV}, - {0xd2f1, 0xd30b, HB_Grapheme_LVT}, - {0xd30c, 0xd30c, HB_Grapheme_LV}, - {0xd30d, 0xd327, HB_Grapheme_LVT}, - {0xd328, 0xd328, HB_Grapheme_LV}, - {0xd329, 0xd343, HB_Grapheme_LVT}, - {0xd344, 0xd344, HB_Grapheme_LV}, - {0xd345, 0xd35f, HB_Grapheme_LVT}, - {0xd360, 0xd360, HB_Grapheme_LV}, - {0xd361, 0xd37b, HB_Grapheme_LVT}, - {0xd37c, 0xd37c, HB_Grapheme_LV}, - {0xd37d, 0xd397, HB_Grapheme_LVT}, - {0xd398, 0xd398, HB_Grapheme_LV}, - {0xd399, 0xd3b3, HB_Grapheme_LVT}, - {0xd3b4, 0xd3b4, HB_Grapheme_LV}, - {0xd3b5, 0xd3cf, HB_Grapheme_LVT}, - {0xd3d0, 0xd3d0, HB_Grapheme_LV}, - {0xd3d1, 0xd3eb, HB_Grapheme_LVT}, - {0xd3ec, 0xd3ec, HB_Grapheme_LV}, - {0xd3ed, 0xd407, HB_Grapheme_LVT}, - {0xd408, 0xd408, HB_Grapheme_LV}, - {0xd409, 0xd423, HB_Grapheme_LVT}, - {0xd424, 0xd424, HB_Grapheme_LV}, - {0xd425, 0xd43f, HB_Grapheme_LVT}, - {0xd440, 0xd440, HB_Grapheme_LV}, - {0xd441, 0xd45b, HB_Grapheme_LVT}, - {0xd45c, 0xd45c, HB_Grapheme_LV}, - {0xd45d, 0xd477, HB_Grapheme_LVT}, - {0xd478, 0xd478, HB_Grapheme_LV}, - {0xd479, 0xd493, HB_Grapheme_LVT}, - {0xd494, 0xd494, HB_Grapheme_LV}, - {0xd495, 0xd4af, HB_Grapheme_LVT}, - {0xd4b0, 0xd4b0, HB_Grapheme_LV}, - {0xd4b1, 0xd4cb, HB_Grapheme_LVT}, - {0xd4cc, 0xd4cc, HB_Grapheme_LV}, - {0xd4cd, 0xd4e7, HB_Grapheme_LVT}, - {0xd4e8, 0xd4e8, HB_Grapheme_LV}, - {0xd4e9, 0xd503, HB_Grapheme_LVT}, - {0xd504, 0xd504, HB_Grapheme_LV}, - {0xd505, 0xd51f, HB_Grapheme_LVT}, - {0xd520, 0xd520, HB_Grapheme_LV}, - {0xd521, 0xd53b, HB_Grapheme_LVT}, - {0xd53c, 0xd53c, HB_Grapheme_LV}, - {0xd53d, 0xd557, HB_Grapheme_LVT}, - {0xd558, 0xd558, HB_Grapheme_LV}, - {0xd559, 0xd573, HB_Grapheme_LVT}, - {0xd574, 0xd574, HB_Grapheme_LV}, - {0xd575, 0xd58f, HB_Grapheme_LVT}, - {0xd590, 0xd590, HB_Grapheme_LV}, - {0xd591, 0xd5ab, HB_Grapheme_LVT}, - {0xd5ac, 0xd5ac, HB_Grapheme_LV}, - {0xd5ad, 0xd5c7, HB_Grapheme_LVT}, - {0xd5c8, 0xd5c8, HB_Grapheme_LV}, - {0xd5c9, 0xd5e3, HB_Grapheme_LVT}, - {0xd5e4, 0xd5e4, HB_Grapheme_LV}, - {0xd5e5, 0xd5ff, HB_Grapheme_LVT}, - {0xd600, 0xd600, HB_Grapheme_LV}, - {0xd601, 0xd61b, HB_Grapheme_LVT}, - {0xd61c, 0xd61c, HB_Grapheme_LV}, - {0xd61d, 0xd637, HB_Grapheme_LVT}, - {0xd638, 0xd638, HB_Grapheme_LV}, - {0xd639, 0xd653, HB_Grapheme_LVT}, - {0xd654, 0xd654, HB_Grapheme_LV}, - {0xd655, 0xd66f, HB_Grapheme_LVT}, - {0xd670, 0xd670, HB_Grapheme_LV}, - {0xd671, 0xd68b, HB_Grapheme_LVT}, - {0xd68c, 0xd68c, HB_Grapheme_LV}, - {0xd68d, 0xd6a7, HB_Grapheme_LVT}, - {0xd6a8, 0xd6a8, HB_Grapheme_LV}, - {0xd6a9, 0xd6c3, HB_Grapheme_LVT}, - {0xd6c4, 0xd6c4, HB_Grapheme_LV}, - {0xd6c5, 0xd6df, HB_Grapheme_LVT}, - {0xd6e0, 0xd6e0, HB_Grapheme_LV}, - {0xd6e1, 0xd6fb, HB_Grapheme_LVT}, - {0xd6fc, 0xd6fc, HB_Grapheme_LV}, - {0xd6fd, 0xd717, HB_Grapheme_LVT}, - {0xd718, 0xd718, HB_Grapheme_LV}, - {0xd719, 0xd733, HB_Grapheme_LVT}, - {0xd734, 0xd734, HB_Grapheme_LV}, - {0xd735, 0xd74f, HB_Grapheme_LVT}, - {0xd750, 0xd750, HB_Grapheme_LV}, - {0xd751, 0xd76b, HB_Grapheme_LVT}, - {0xd76c, 0xd76c, HB_Grapheme_LV}, - {0xd76d, 0xd787, HB_Grapheme_LVT}, - {0xd788, 0xd788, HB_Grapheme_LV}, - {0xd789, 0xd7a3, HB_Grapheme_LVT}, - {0xfb1e, 0xfb1e, HB_Grapheme_Extend}, - {0xfe00, 0xfe0f, HB_Grapheme_Extend}, - {0xfe20, 0xfe26, HB_Grapheme_Extend}, - {0xfeff, 0xfeff, HB_Grapheme_Control}, - {0xff9e, 0xff9f, HB_Grapheme_Extend}, - {0xfff9, 0xfffb, HB_Grapheme_Control}, - {0x101fd, 0x101fd, HB_Grapheme_Extend}, - {0x10a01, 0x10a03, HB_Grapheme_Extend}, - {0x10a05, 0x10a06, HB_Grapheme_Extend}, - {0x10a0c, 0x10a0f, HB_Grapheme_Extend}, - {0x10a38, 0x10a3a, HB_Grapheme_Extend}, - {0x10a3f, 0x10a3f, HB_Grapheme_Extend}, - {0x1d165, 0x1d165, HB_Grapheme_Extend}, - {0x1d166, 0x1d166, HB_Grapheme_Other}, - {0x1d167, 0x1d169, HB_Grapheme_Extend}, - {0x1d16d, 0x1d16d, HB_Grapheme_Other}, - {0x1d16e, 0x1d172, HB_Grapheme_Extend}, - {0x1d173, 0x1d17a, HB_Grapheme_Control}, - {0x1d17b, 0x1d182, HB_Grapheme_Extend}, - {0x1d185, 0x1d18b, HB_Grapheme_Extend}, - {0x1d1aa, 0x1d1ad, HB_Grapheme_Extend}, - {0x1d242, 0x1d244, HB_Grapheme_Extend}, - {0xe0001, 0xe0001, HB_Grapheme_Control}, - {0xe0020, 0xe007f, HB_Grapheme_Control}, - {0xe0100, 0xe01ef, HB_Grapheme_Extend}, -}; - -static const unsigned grapheme_break_properties_count = 1093; - -#endif // GRAPHEME_BREAK_PROPERTY_H_ diff --git a/third_party/harfbuzz/contrib/tables/mirroring-parse.py b/third_party/harfbuzz/contrib/tables/mirroring-parse.py deleted file mode 100644 index 5724e19d75..0000000000 --- a/third_party/harfbuzz/contrib/tables/mirroring-parse.py +++ /dev/null @@ -1,50 +0,0 @@ -import sys - -# http://www.unicode.org/Public/UNIDATA/auxiliary/BidiMirroring.txt - -# This parses a file in the format of the above file and outputs a table -# suitable for bsearch(3). This table maps Unicode code points to their -# 'mirror'. (Mirroring is used when rendering RTL characters, see the Unicode -# standard). By convention, this mapping should be commutative, but this code -# doesn't enforce or check this. - -def main(infile, outfile): - pairs = [] - for line in infile: - line = line[:-1] - if len(line) == 0 or line[0] == '#': - continue - if '#' in line: - (data, _) = line.split('#', 1) - else: - data = line - if ';' not in data: - continue - (a, b) = data.split(';', 1) - a = int(a, 16) - b = int(b, 16) - - pairs.append((a, b)) - - pairs.sort() - - print >>outfile, '// Generated from Unicode Bidi Mirroring tables\n' - print >>outfile, '#ifndef MIRRORING_PROPERTY_H_' - print >>outfile, '#define MIRRORING_PROPERTY_H_\n' - print >>outfile, '#include ' - print >>outfile, 'struct mirroring_property {' - print >>outfile, ' uint32_t a;' - print >>outfile, ' uint32_t b;' - print >>outfile, '};\n' - print >>outfile, 'static const struct mirroring_property mirroring_properties[] = {' - for pair in pairs: - print >>outfile, ' {0x%x, 0x%x},' % pair - print >>outfile, '};\n' - print >>outfile, 'static const unsigned mirroring_properties_count = %d;\n' % len(pairs) - print >>outfile, '#endif // MIRRORING_PROPERTY_H_' - -if __name__ == '__main__': - if len(sys.argv) != 3: - print 'Usage: %s ' % sys.argv[0] - else: - main(file(sys.argv[1], 'r'), file(sys.argv[2], 'w+')) diff --git a/third_party/harfbuzz/contrib/tables/mirroring-properties.h b/third_party/harfbuzz/contrib/tables/mirroring-properties.h deleted file mode 100644 index f9be2f666f..0000000000 --- a/third_party/harfbuzz/contrib/tables/mirroring-properties.h +++ /dev/null @@ -1,379 +0,0 @@ -// Generated from Unicode Bidi Mirroring tables - -#ifndef MIRRORING_PROPERTY_H_ -#define MIRRORING_PROPERTY_H_ - -#include -struct mirroring_property { - uint32_t a; - uint32_t b; -}; - -static const struct mirroring_property mirroring_properties[] = { - {0x28, 0x29}, - {0x29, 0x28}, - {0x3c, 0x3e}, - {0x3e, 0x3c}, - {0x5b, 0x5d}, - {0x5d, 0x5b}, - {0x7b, 0x7d}, - {0x7d, 0x7b}, - {0xab, 0xbb}, - {0xbb, 0xab}, - {0xf3a, 0xf3b}, - {0xf3b, 0xf3a}, - {0xf3c, 0xf3d}, - {0xf3d, 0xf3c}, - {0x169b, 0x169c}, - {0x169c, 0x169b}, - {0x2039, 0x203a}, - {0x203a, 0x2039}, - {0x2045, 0x2046}, - {0x2046, 0x2045}, - {0x207d, 0x207e}, - {0x207e, 0x207d}, - {0x208d, 0x208e}, - {0x208e, 0x208d}, - {0x2208, 0x220b}, - {0x2209, 0x220c}, - {0x220a, 0x220d}, - {0x220b, 0x2208}, - {0x220c, 0x2209}, - {0x220d, 0x220a}, - {0x2215, 0x29f5}, - {0x223c, 0x223d}, - {0x223d, 0x223c}, - {0x2243, 0x22cd}, - {0x2252, 0x2253}, - {0x2253, 0x2252}, - {0x2254, 0x2255}, - {0x2255, 0x2254}, - {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}, - {0x2276, 0x2277}, - {0x2277, 0x2276}, - {0x2278, 0x2279}, - {0x2279, 0x2278}, - {0x227a, 0x227b}, - {0x227b, 0x227a}, - {0x227c, 0x227d}, - {0x227d, 0x227c}, - {0x227e, 0x227f}, - {0x227f, 0x227e}, - {0x2280, 0x2281}, - {0x2281, 0x2280}, - {0x2282, 0x2283}, - {0x2283, 0x2282}, - {0x2284, 0x2285}, - {0x2285, 0x2284}, - {0x2286, 0x2287}, - {0x2287, 0x2286}, - {0x2288, 0x2289}, - {0x2289, 0x2288}, - {0x228a, 0x228b}, - {0x228b, 0x228a}, - {0x228f, 0x2290}, - {0x2290, 0x228f}, - {0x2291, 0x2292}, - {0x2292, 0x2291}, - {0x2298, 0x29b8}, - {0x22a2, 0x22a3}, - {0x22a3, 0x22a2}, - {0x22a6, 0x2ade}, - {0x22a8, 0x2ae4}, - {0x22a9, 0x2ae3}, - {0x22ab, 0x2ae5}, - {0x22b0, 0x22b1}, - {0x22b1, 0x22b0}, - {0x22b2, 0x22b3}, - {0x22b3, 0x22b2}, - {0x22b4, 0x22b5}, - {0x22b5, 0x22b4}, - {0x22b6, 0x22b7}, - {0x22b7, 0x22b6}, - {0x22c9, 0x22ca}, - {0x22ca, 0x22c9}, - {0x22cb, 0x22cc}, - {0x22cc, 0x22cb}, - {0x22cd, 0x2243}, - {0x22d0, 0x22d1}, - {0x22d1, 0x22d0}, - {0x22d6, 0x22d7}, - {0x22d7, 0x22d6}, - {0x22d8, 0x22d9}, - {0x22d9, 0x22d8}, - {0x22da, 0x22db}, - {0x22db, 0x22da}, - {0x22dc, 0x22dd}, - {0x22dd, 0x22dc}, - {0x22de, 0x22df}, - {0x22df, 0x22de}, - {0x22e0, 0x22e1}, - {0x22e1, 0x22e0}, - {0x22e2, 0x22e3}, - {0x22e3, 0x22e2}, - {0x22e4, 0x22e5}, - {0x22e5, 0x22e4}, - {0x22e6, 0x22e7}, - {0x22e7, 0x22e6}, - {0x22e8, 0x22e9}, - {0x22e9, 0x22e8}, - {0x22ea, 0x22eb}, - {0x22eb, 0x22ea}, - {0x22ec, 0x22ed}, - {0x22ed, 0x22ec}, - {0x22f0, 0x22f1}, - {0x22f1, 0x22f0}, - {0x22f2, 0x22fa}, - {0x22f3, 0x22fb}, - {0x22f4, 0x22fc}, - {0x22f6, 0x22fd}, - {0x22f7, 0x22fe}, - {0x22fa, 0x22f2}, - {0x22fb, 0x22f3}, - {0x22fc, 0x22f4}, - {0x22fd, 0x22f6}, - {0x22fe, 0x22f7}, - {0x2308, 0x2309}, - {0x2309, 0x2308}, - {0x230a, 0x230b}, - {0x230b, 0x230a}, - {0x2329, 0x232a}, - {0x232a, 0x2329}, - {0x2768, 0x2769}, - {0x2769, 0x2768}, - {0x276a, 0x276b}, - {0x276b, 0x276a}, - {0x276c, 0x276d}, - {0x276d, 0x276c}, - {0x276e, 0x276f}, - {0x276f, 0x276e}, - {0x2770, 0x2771}, - {0x2771, 0x2770}, - {0x2772, 0x2773}, - {0x2773, 0x2772}, - {0x2774, 0x2775}, - {0x2775, 0x2774}, - {0x27c3, 0x27c4}, - {0x27c4, 0x27c3}, - {0x27c5, 0x27c6}, - {0x27c6, 0x27c5}, - {0x27c8, 0x27c9}, - {0x27c9, 0x27c8}, - {0x27d5, 0x27d6}, - {0x27d6, 0x27d5}, - {0x27dd, 0x27de}, - {0x27de, 0x27dd}, - {0x27e2, 0x27e3}, - {0x27e3, 0x27e2}, - {0x27e4, 0x27e5}, - {0x27e5, 0x27e4}, - {0x27e6, 0x27e7}, - {0x27e7, 0x27e6}, - {0x27e8, 0x27e9}, - {0x27e9, 0x27e8}, - {0x27ea, 0x27eb}, - {0x27eb, 0x27ea}, - {0x27ec, 0x27ed}, - {0x27ed, 0x27ec}, - {0x27ee, 0x27ef}, - {0x27ef, 0x27ee}, - {0x2983, 0x2984}, - {0x2984, 0x2983}, - {0x2985, 0x2986}, - {0x2986, 0x2985}, - {0x2987, 0x2988}, - {0x2988, 0x2987}, - {0x2989, 0x298a}, - {0x298a, 0x2989}, - {0x298b, 0x298c}, - {0x298c, 0x298b}, - {0x298d, 0x2990}, - {0x298e, 0x298f}, - {0x298f, 0x298e}, - {0x2990, 0x298d}, - {0x2991, 0x2992}, - {0x2992, 0x2991}, - {0x2993, 0x2994}, - {0x2994, 0x2993}, - {0x2995, 0x2996}, - {0x2996, 0x2995}, - {0x2997, 0x2998}, - {0x2998, 0x2997}, - {0x29b8, 0x2298}, - {0x29c0, 0x29c1}, - {0x29c1, 0x29c0}, - {0x29c4, 0x29c5}, - {0x29c5, 0x29c4}, - {0x29cf, 0x29d0}, - {0x29d0, 0x29cf}, - {0x29d1, 0x29d2}, - {0x29d2, 0x29d1}, - {0x29d4, 0x29d5}, - {0x29d5, 0x29d4}, - {0x29d8, 0x29d9}, - {0x29d9, 0x29d8}, - {0x29da, 0x29db}, - {0x29db, 0x29da}, - {0x29f5, 0x2215}, - {0x29f8, 0x29f9}, - {0x29f9, 0x29f8}, - {0x29fc, 0x29fd}, - {0x29fd, 0x29fc}, - {0x2a2b, 0x2a2c}, - {0x2a2c, 0x2a2b}, - {0x2a2d, 0x2a2e}, - {0x2a2e, 0x2a2d}, - {0x2a34, 0x2a35}, - {0x2a35, 0x2a34}, - {0x2a3c, 0x2a3d}, - {0x2a3d, 0x2a3c}, - {0x2a64, 0x2a65}, - {0x2a65, 0x2a64}, - {0x2a79, 0x2a7a}, - {0x2a7a, 0x2a79}, - {0x2a7d, 0x2a7e}, - {0x2a7e, 0x2a7d}, - {0x2a7f, 0x2a80}, - {0x2a80, 0x2a7f}, - {0x2a81, 0x2a82}, - {0x2a82, 0x2a81}, - {0x2a83, 0x2a84}, - {0x2a84, 0x2a83}, - {0x2a8b, 0x2a8c}, - {0x2a8c, 0x2a8b}, - {0x2a91, 0x2a92}, - {0x2a92, 0x2a91}, - {0x2a93, 0x2a94}, - {0x2a94, 0x2a93}, - {0x2a95, 0x2a96}, - {0x2a96, 0x2a95}, - {0x2a97, 0x2a98}, - {0x2a98, 0x2a97}, - {0x2a99, 0x2a9a}, - {0x2a9a, 0x2a99}, - {0x2a9b, 0x2a9c}, - {0x2a9c, 0x2a9b}, - {0x2aa1, 0x2aa2}, - {0x2aa2, 0x2aa1}, - {0x2aa6, 0x2aa7}, - {0x2aa7, 0x2aa6}, - {0x2aa8, 0x2aa9}, - {0x2aa9, 0x2aa8}, - {0x2aaa, 0x2aab}, - {0x2aab, 0x2aaa}, - {0x2aac, 0x2aad}, - {0x2aad, 0x2aac}, - {0x2aaf, 0x2ab0}, - {0x2ab0, 0x2aaf}, - {0x2ab3, 0x2ab4}, - {0x2ab4, 0x2ab3}, - {0x2abb, 0x2abc}, - {0x2abc, 0x2abb}, - {0x2abd, 0x2abe}, - {0x2abe, 0x2abd}, - {0x2abf, 0x2ac0}, - {0x2ac0, 0x2abf}, - {0x2ac1, 0x2ac2}, - {0x2ac2, 0x2ac1}, - {0x2ac3, 0x2ac4}, - {0x2ac4, 0x2ac3}, - {0x2ac5, 0x2ac6}, - {0x2ac6, 0x2ac5}, - {0x2acd, 0x2ace}, - {0x2ace, 0x2acd}, - {0x2acf, 0x2ad0}, - {0x2ad0, 0x2acf}, - {0x2ad1, 0x2ad2}, - {0x2ad2, 0x2ad1}, - {0x2ad3, 0x2ad4}, - {0x2ad4, 0x2ad3}, - {0x2ad5, 0x2ad6}, - {0x2ad6, 0x2ad5}, - {0x2ade, 0x22a6}, - {0x2ae3, 0x22a9}, - {0x2ae4, 0x22a8}, - {0x2ae5, 0x22ab}, - {0x2aec, 0x2aed}, - {0x2aed, 0x2aec}, - {0x2af7, 0x2af8}, - {0x2af8, 0x2af7}, - {0x2af9, 0x2afa}, - {0x2afa, 0x2af9}, - {0x2e02, 0x2e03}, - {0x2e03, 0x2e02}, - {0x2e04, 0x2e05}, - {0x2e05, 0x2e04}, - {0x2e09, 0x2e0a}, - {0x2e0a, 0x2e09}, - {0x2e0c, 0x2e0d}, - {0x2e0d, 0x2e0c}, - {0x2e1c, 0x2e1d}, - {0x2e1d, 0x2e1c}, - {0x2e20, 0x2e21}, - {0x2e21, 0x2e20}, - {0x2e22, 0x2e23}, - {0x2e23, 0x2e22}, - {0x2e24, 0x2e25}, - {0x2e25, 0x2e24}, - {0x2e26, 0x2e27}, - {0x2e27, 0x2e26}, - {0x2e28, 0x2e29}, - {0x2e29, 0x2e28}, - {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}, - {0xfe59, 0xfe5a}, - {0xfe5a, 0xfe59}, - {0xfe5b, 0xfe5c}, - {0xfe5c, 0xfe5b}, - {0xfe5d, 0xfe5e}, - {0xfe5e, 0xfe5d}, - {0xfe64, 0xfe65}, - {0xfe65, 0xfe64}, - {0xff08, 0xff09}, - {0xff09, 0xff08}, - {0xff1c, 0xff1e}, - {0xff1e, 0xff1c}, - {0xff3b, 0xff3d}, - {0xff3d, 0xff3b}, - {0xff5b, 0xff5d}, - {0xff5d, 0xff5b}, - {0xff5f, 0xff60}, - {0xff60, 0xff5f}, - {0xff62, 0xff63}, - {0xff63, 0xff62}, -}; - -static const unsigned mirroring_properties_count = 362; - -#endif // MIRRORING_PROPERTY_H_ diff --git a/third_party/harfbuzz/contrib/tables/script-properties.h b/third_party/harfbuzz/contrib/tables/script-properties.h deleted file mode 100644 index a6ff50b060..0000000000 --- a/third_party/harfbuzz/contrib/tables/script-properties.h +++ /dev/null @@ -1,297 +0,0 @@ -// Generated from Unicode script tables - -#ifndef SCRIPT_PROPERTIES_H_ -#define SCRIPT_PROPERTIES_H_ - -#include -#include "harfbuzz-shaper.h" - -struct script_property { - uint32_t range_start; - uint32_t range_end; - HB_Script script; -}; - -static const struct script_property script_properties[] = { - {0x300, 0x36f, HB_Script_Inherited}, - {0x370, 0x373, HB_Script_Greek}, - {0x375, 0x377, HB_Script_Greek}, - {0x37a, 0x37d, HB_Script_Greek}, - {0x384, 0x384, HB_Script_Greek}, - {0x386, 0x386, HB_Script_Greek}, - {0x388, 0x38a, HB_Script_Greek}, - {0x38c, 0x38c, HB_Script_Greek}, - {0x38e, 0x3a1, HB_Script_Greek}, - {0x3a3, 0x3e1, HB_Script_Greek}, - {0x3f0, 0x3ff, HB_Script_Greek}, - {0x400, 0x523, HB_Script_Cyrillic}, - {0x531, 0x556, HB_Script_Armenian}, - {0x559, 0x55f, HB_Script_Armenian}, - {0x561, 0x587, HB_Script_Armenian}, - {0x58a, 0x58a, HB_Script_Armenian}, - {0x591, 0x5c7, HB_Script_Hebrew}, - {0x5d0, 0x5ea, HB_Script_Hebrew}, - {0x5f0, 0x5f4, HB_Script_Hebrew}, - {0x606, 0x60b, HB_Script_Arabic}, - {0x60d, 0x61a, HB_Script_Arabic}, - {0x61e, 0x61e, HB_Script_Arabic}, - {0x621, 0x63f, HB_Script_Arabic}, - {0x641, 0x64a, HB_Script_Arabic}, - {0x64b, 0x655, HB_Script_Inherited}, - {0x656, 0x65e, HB_Script_Arabic}, - {0x66a, 0x66f, HB_Script_Arabic}, - {0x670, 0x670, HB_Script_Inherited}, - {0x671, 0x6dc, HB_Script_Arabic}, - {0x6de, 0x6ff, HB_Script_Arabic}, - {0x700, 0x70d, HB_Script_Syriac}, - {0x70f, 0x74a, HB_Script_Syriac}, - {0x74d, 0x74f, HB_Script_Syriac}, - {0x750, 0x77f, HB_Script_Arabic}, - {0x780, 0x7b1, HB_Script_Thaana}, - {0x901, 0x939, HB_Script_Devanagari}, - {0x93c, 0x94d, HB_Script_Devanagari}, - {0x950, 0x950, HB_Script_Devanagari}, - {0x951, 0x952, HB_Script_Inherited}, - {0x953, 0x954, HB_Script_Devanagari}, - {0x958, 0x963, HB_Script_Devanagari}, - {0x966, 0x96f, HB_Script_Devanagari}, - {0x971, 0x972, HB_Script_Devanagari}, - {0x97b, 0x97f, HB_Script_Devanagari}, - {0x981, 0x983, HB_Script_Bengali}, - {0x985, 0x98c, HB_Script_Bengali}, - {0x98f, 0x990, HB_Script_Bengali}, - {0x993, 0x9a8, HB_Script_Bengali}, - {0x9aa, 0x9b0, HB_Script_Bengali}, - {0x9b2, 0x9b2, HB_Script_Bengali}, - {0x9b6, 0x9b9, HB_Script_Bengali}, - {0x9bc, 0x9c4, HB_Script_Bengali}, - {0x9c7, 0x9c8, HB_Script_Bengali}, - {0x9cb, 0x9ce, HB_Script_Bengali}, - {0x9d7, 0x9d7, HB_Script_Bengali}, - {0x9dc, 0x9dd, HB_Script_Bengali}, - {0x9df, 0x9e3, HB_Script_Bengali}, - {0x9e6, 0x9fa, HB_Script_Bengali}, - {0xa01, 0xa03, HB_Script_Gurmukhi}, - {0xa05, 0xa0a, HB_Script_Gurmukhi}, - {0xa0f, 0xa10, HB_Script_Gurmukhi}, - {0xa13, 0xa28, HB_Script_Gurmukhi}, - {0xa2a, 0xa30, HB_Script_Gurmukhi}, - {0xa32, 0xa33, HB_Script_Gurmukhi}, - {0xa35, 0xa36, HB_Script_Gurmukhi}, - {0xa38, 0xa39, HB_Script_Gurmukhi}, - {0xa3c, 0xa3c, HB_Script_Gurmukhi}, - {0xa3e, 0xa42, HB_Script_Gurmukhi}, - {0xa47, 0xa48, HB_Script_Gurmukhi}, - {0xa4b, 0xa4d, HB_Script_Gurmukhi}, - {0xa51, 0xa51, HB_Script_Gurmukhi}, - {0xa59, 0xa5c, HB_Script_Gurmukhi}, - {0xa5e, 0xa5e, HB_Script_Gurmukhi}, - {0xa66, 0xa75, HB_Script_Gurmukhi}, - {0xa81, 0xa83, HB_Script_Gujarati}, - {0xa85, 0xa8d, HB_Script_Gujarati}, - {0xa8f, 0xa91, HB_Script_Gujarati}, - {0xa93, 0xaa8, HB_Script_Gujarati}, - {0xaaa, 0xab0, HB_Script_Gujarati}, - {0xab2, 0xab3, HB_Script_Gujarati}, - {0xab5, 0xab9, HB_Script_Gujarati}, - {0xabc, 0xac5, HB_Script_Gujarati}, - {0xac7, 0xac9, HB_Script_Gujarati}, - {0xacb, 0xacd, HB_Script_Gujarati}, - {0xad0, 0xad0, HB_Script_Gujarati}, - {0xae0, 0xae3, HB_Script_Gujarati}, - {0xae6, 0xaef, HB_Script_Gujarati}, - {0xaf1, 0xaf1, HB_Script_Gujarati}, - {0xb01, 0xb03, HB_Script_Oriya}, - {0xb05, 0xb0c, HB_Script_Oriya}, - {0xb0f, 0xb10, HB_Script_Oriya}, - {0xb13, 0xb28, HB_Script_Oriya}, - {0xb2a, 0xb30, HB_Script_Oriya}, - {0xb32, 0xb33, HB_Script_Oriya}, - {0xb35, 0xb39, HB_Script_Oriya}, - {0xb3c, 0xb44, HB_Script_Oriya}, - {0xb47, 0xb48, HB_Script_Oriya}, - {0xb4b, 0xb4d, HB_Script_Oriya}, - {0xb56, 0xb57, HB_Script_Oriya}, - {0xb5c, 0xb5d, HB_Script_Oriya}, - {0xb5f, 0xb63, HB_Script_Oriya}, - {0xb66, 0xb71, HB_Script_Oriya}, - {0xb82, 0xb83, HB_Script_Tamil}, - {0xb85, 0xb8a, HB_Script_Tamil}, - {0xb8e, 0xb90, HB_Script_Tamil}, - {0xb92, 0xb95, HB_Script_Tamil}, - {0xb99, 0xb9a, HB_Script_Tamil}, - {0xb9c, 0xb9c, HB_Script_Tamil}, - {0xb9e, 0xb9f, HB_Script_Tamil}, - {0xba3, 0xba4, HB_Script_Tamil}, - {0xba8, 0xbaa, HB_Script_Tamil}, - {0xbae, 0xbb9, HB_Script_Tamil}, - {0xbbe, 0xbc2, HB_Script_Tamil}, - {0xbc6, 0xbc8, HB_Script_Tamil}, - {0xbca, 0xbcd, HB_Script_Tamil}, - {0xbd0, 0xbd0, HB_Script_Tamil}, - {0xbd7, 0xbd7, HB_Script_Tamil}, - {0xbe6, 0xbfa, HB_Script_Tamil}, - {0xc01, 0xc03, HB_Script_Telugu}, - {0xc05, 0xc0c, HB_Script_Telugu}, - {0xc0e, 0xc10, HB_Script_Telugu}, - {0xc12, 0xc28, HB_Script_Telugu}, - {0xc2a, 0xc33, HB_Script_Telugu}, - {0xc35, 0xc39, HB_Script_Telugu}, - {0xc3d, 0xc44, HB_Script_Telugu}, - {0xc46, 0xc48, HB_Script_Telugu}, - {0xc4a, 0xc4d, HB_Script_Telugu}, - {0xc55, 0xc56, HB_Script_Telugu}, - {0xc58, 0xc59, HB_Script_Telugu}, - {0xc60, 0xc63, HB_Script_Telugu}, - {0xc66, 0xc6f, HB_Script_Telugu}, - {0xc78, 0xc7f, HB_Script_Telugu}, - {0xc82, 0xc83, HB_Script_Kannada}, - {0xc85, 0xc8c, HB_Script_Kannada}, - {0xc8e, 0xc90, HB_Script_Kannada}, - {0xc92, 0xca8, HB_Script_Kannada}, - {0xcaa, 0xcb3, HB_Script_Kannada}, - {0xcb5, 0xcb9, HB_Script_Kannada}, - {0xcbc, 0xcc4, HB_Script_Kannada}, - {0xcc6, 0xcc8, HB_Script_Kannada}, - {0xcca, 0xccd, HB_Script_Kannada}, - {0xcd5, 0xcd6, HB_Script_Kannada}, - {0xcde, 0xcde, HB_Script_Kannada}, - {0xce0, 0xce3, HB_Script_Kannada}, - {0xce6, 0xcef, HB_Script_Kannada}, - {0xd02, 0xd03, HB_Script_Malayalam}, - {0xd05, 0xd0c, HB_Script_Malayalam}, - {0xd0e, 0xd10, HB_Script_Malayalam}, - {0xd12, 0xd28, HB_Script_Malayalam}, - {0xd2a, 0xd39, HB_Script_Malayalam}, - {0xd3d, 0xd44, HB_Script_Malayalam}, - {0xd46, 0xd48, HB_Script_Malayalam}, - {0xd4a, 0xd4d, HB_Script_Malayalam}, - {0xd57, 0xd57, HB_Script_Malayalam}, - {0xd60, 0xd63, HB_Script_Malayalam}, - {0xd66, 0xd75, HB_Script_Malayalam}, - {0xd79, 0xd7f, HB_Script_Malayalam}, - {0xd82, 0xd83, HB_Script_Sinhala}, - {0xd85, 0xd96, HB_Script_Sinhala}, - {0xd9a, 0xdb1, HB_Script_Sinhala}, - {0xdb3, 0xdbb, HB_Script_Sinhala}, - {0xdbd, 0xdbd, HB_Script_Sinhala}, - {0xdc0, 0xdc6, HB_Script_Sinhala}, - {0xdca, 0xdca, HB_Script_Sinhala}, - {0xdcf, 0xdd4, HB_Script_Sinhala}, - {0xdd6, 0xdd6, HB_Script_Sinhala}, - {0xdd8, 0xddf, HB_Script_Sinhala}, - {0xdf2, 0xdf4, HB_Script_Sinhala}, - {0xe01, 0xe3a, HB_Script_Thai}, - {0xe40, 0xe5b, HB_Script_Thai}, - {0xe81, 0xe82, HB_Script_Lao}, - {0xe84, 0xe84, HB_Script_Lao}, - {0xe87, 0xe88, HB_Script_Lao}, - {0xe8a, 0xe8a, HB_Script_Lao}, - {0xe8d, 0xe8d, HB_Script_Lao}, - {0xe94, 0xe97, HB_Script_Lao}, - {0xe99, 0xe9f, HB_Script_Lao}, - {0xea1, 0xea3, HB_Script_Lao}, - {0xea5, 0xea5, HB_Script_Lao}, - {0xea7, 0xea7, HB_Script_Lao}, - {0xeaa, 0xeab, HB_Script_Lao}, - {0xead, 0xeb9, HB_Script_Lao}, - {0xebb, 0xebd, HB_Script_Lao}, - {0xec0, 0xec4, HB_Script_Lao}, - {0xec6, 0xec6, HB_Script_Lao}, - {0xec8, 0xecd, HB_Script_Lao}, - {0xed0, 0xed9, HB_Script_Lao}, - {0xedc, 0xedd, HB_Script_Lao}, - {0xf00, 0xf47, HB_Script_Tibetan}, - {0xf49, 0xf6c, HB_Script_Tibetan}, - {0xf71, 0xf8b, HB_Script_Tibetan}, - {0xf90, 0xf97, HB_Script_Tibetan}, - {0xf99, 0xfbc, HB_Script_Tibetan}, - {0xfbe, 0xfcc, HB_Script_Tibetan}, - {0xfce, 0xfd4, HB_Script_Tibetan}, - {0x1000, 0x1099, HB_Script_Myanmar}, - {0x109e, 0x109f, HB_Script_Myanmar}, - {0x10a0, 0x10c5, HB_Script_Georgian}, - {0x10d0, 0x10fa, HB_Script_Georgian}, - {0x10fc, 0x10fc, HB_Script_Georgian}, - {0x1100, 0x1159, HB_Script_Hangul}, - {0x115f, 0x11a2, HB_Script_Hangul}, - {0x11a8, 0x11f9, HB_Script_Hangul}, - {0x1680, 0x169c, HB_Script_Ogham}, - {0x16a0, 0x16ea, HB_Script_Runic}, - {0x16ee, 0x16f0, HB_Script_Runic}, - {0x1780, 0x17dd, HB_Script_Khmer}, - {0x17e0, 0x17e9, HB_Script_Khmer}, - {0x17f0, 0x17f9, HB_Script_Khmer}, - {0x19e0, 0x19ff, HB_Script_Khmer}, - {0x1d26, 0x1d2a, HB_Script_Greek}, - {0x1d2b, 0x1d2b, HB_Script_Cyrillic}, - {0x1d5d, 0x1d61, HB_Script_Greek}, - {0x1d66, 0x1d6a, HB_Script_Greek}, - {0x1d78, 0x1d78, HB_Script_Cyrillic}, - {0x1dbf, 0x1dbf, HB_Script_Greek}, - {0x1dc0, 0x1de6, HB_Script_Inherited}, - {0x1dfe, 0x1dff, HB_Script_Inherited}, - {0x1f00, 0x1f15, HB_Script_Greek}, - {0x1f18, 0x1f1d, HB_Script_Greek}, - {0x1f20, 0x1f45, HB_Script_Greek}, - {0x1f48, 0x1f4d, HB_Script_Greek}, - {0x1f50, 0x1f57, HB_Script_Greek}, - {0x1f59, 0x1f59, HB_Script_Greek}, - {0x1f5b, 0x1f5b, HB_Script_Greek}, - {0x1f5d, 0x1f5d, HB_Script_Greek}, - {0x1f5f, 0x1f7d, HB_Script_Greek}, - {0x1f80, 0x1fb4, HB_Script_Greek}, - {0x1fb6, 0x1fc4, HB_Script_Greek}, - {0x1fc6, 0x1fd3, HB_Script_Greek}, - {0x1fd6, 0x1fdb, HB_Script_Greek}, - {0x1fdd, 0x1fef, HB_Script_Greek}, - {0x1ff2, 0x1ff4, HB_Script_Greek}, - {0x1ff6, 0x1ffe, HB_Script_Greek}, - {0x200c, 0x200d, HB_Script_Inherited}, - {0x20d0, 0x20f0, HB_Script_Inherited}, - {0x2126, 0x2126, HB_Script_Greek}, - {0x2d00, 0x2d25, HB_Script_Georgian}, - {0x2de0, 0x2dff, HB_Script_Cyrillic}, - {0x302a, 0x302f, HB_Script_Inherited}, - {0x3099, 0x309a, HB_Script_Inherited}, - {0x3131, 0x318e, HB_Script_Hangul}, - {0x3200, 0x321e, HB_Script_Hangul}, - {0x3260, 0x327e, HB_Script_Hangul}, - {0xa640, 0xa65f, HB_Script_Cyrillic}, - {0xa662, 0xa673, HB_Script_Cyrillic}, - {0xa67c, 0xa697, HB_Script_Cyrillic}, - {0xac00, 0xd7a3, HB_Script_Hangul}, - {0xfb13, 0xfb17, HB_Script_Armenian}, - {0xfb1d, 0xfb36, HB_Script_Hebrew}, - {0xfb38, 0xfb3c, HB_Script_Hebrew}, - {0xfb3e, 0xfb3e, HB_Script_Hebrew}, - {0xfb40, 0xfb41, HB_Script_Hebrew}, - {0xfb43, 0xfb44, HB_Script_Hebrew}, - {0xfb46, 0xfb4f, HB_Script_Hebrew}, - {0xfb50, 0xfbb1, HB_Script_Arabic}, - {0xfbd3, 0xfd3d, HB_Script_Arabic}, - {0xfd50, 0xfd8f, HB_Script_Arabic}, - {0xfd92, 0xfdc7, HB_Script_Arabic}, - {0xfdf0, 0xfdfc, HB_Script_Arabic}, - {0xfe00, 0xfe0f, HB_Script_Inherited}, - {0xfe20, 0xfe26, HB_Script_Inherited}, - {0xfe70, 0xfe74, HB_Script_Arabic}, - {0xfe76, 0xfefc, HB_Script_Arabic}, - {0xffa0, 0xffbe, HB_Script_Hangul}, - {0xffc2, 0xffc7, HB_Script_Hangul}, - {0xffca, 0xffcf, HB_Script_Hangul}, - {0xffd2, 0xffd7, HB_Script_Hangul}, - {0xffda, 0xffdc, HB_Script_Hangul}, - {0x10140, 0x1018a, HB_Script_Greek}, - {0x101fd, 0x101fd, HB_Script_Inherited}, - {0x1d167, 0x1d169, HB_Script_Inherited}, - {0x1d17b, 0x1d182, HB_Script_Inherited}, - {0x1d185, 0x1d18b, HB_Script_Inherited}, - {0x1d1aa, 0x1d1ad, HB_Script_Inherited}, - {0x1d200, 0x1d245, HB_Script_Greek}, - {0xe0100, 0xe01ef, HB_Script_Inherited}, -}; - -static const unsigned script_properties_count = 277; - -#endif // SCRIPT_PROPERTIES_H_ diff --git a/third_party/harfbuzz/contrib/tables/scripts-parse.py b/third_party/harfbuzz/contrib/tables/scripts-parse.py deleted file mode 100644 index 23bac10f27..0000000000 --- a/third_party/harfbuzz/contrib/tables/scripts-parse.py +++ /dev/null @@ -1,75 +0,0 @@ -import sys -from unicode_parse_common import * - -# http://www.unicode.org/Public/5.1.0/ucd/Scripts.txt - -script_to_harfbuzz = { - # This is the list of HB_Script_* at the time of writing - 'Common': 'HB_Script_Common', - 'Greek': 'HB_Script_Greek', - 'Cyrillic': 'HB_Script_Cyrillic', - 'Armenian': 'HB_Script_Armenian', - 'Hebrew': 'HB_Script_Hebrew', - 'Arabic': 'HB_Script_Arabic', - 'Syriac': 'HB_Script_Syriac', - 'Thaana': 'HB_Script_Thaana', - 'Devanagari': 'HB_Script_Devanagari', - 'Bengali': 'HB_Script_Bengali', - 'Gurmukhi': 'HB_Script_Gurmukhi', - 'Gujarati': 'HB_Script_Gujarati', - 'Oriya': 'HB_Script_Oriya', - 'Tamil': 'HB_Script_Tamil', - 'Telugu': 'HB_Script_Telugu', - 'Kannada': 'HB_Script_Kannada', - 'Malayalam': 'HB_Script_Malayalam', - 'Sinhala': 'HB_Script_Sinhala', - 'Thai': 'HB_Script_Thai', - 'Lao': 'HB_Script_Lao', - 'Tibetan': 'HB_Script_Tibetan', - 'Myanmar': 'HB_Script_Myanmar', - 'Georgian': 'HB_Script_Georgian', - 'Hangul': 'HB_Script_Hangul', - 'Ogham': 'HB_Script_Ogham', - 'Runic': 'HB_Script_Runic', - 'Khmer': 'HB_Script_Khmer', - 'Inherited': 'HB_Script_Inherited', -} - -class ScriptDict(object): - def __init__(self, base): - self.base = base - - def __getitem__(self, key): - r = self.base.get(key, None) - if r is None: - return 'HB_Script_Common' - return r - -def main(infile, outfile): - ranges = unicode_file_parse(infile, - ScriptDict(script_to_harfbuzz), - 'HB_Script_Common') - ranges = sort_and_merge(ranges) - - print >>outfile, '// Generated from Unicode script tables\n' - print >>outfile, '#ifndef SCRIPT_PROPERTIES_H_' - print >>outfile, '#define SCRIPT_PROPERTIES_H_\n' - print >>outfile, '#include ' - print >>outfile, '#include "harfbuzz-shaper.h"\n' - print >>outfile, 'struct script_property {' - print >>outfile, ' uint32_t range_start;' - print >>outfile, ' uint32_t range_end;' - print >>outfile, ' HB_Script script;' - print >>outfile, '};\n' - print >>outfile, 'static const struct script_property script_properties[] = {' - for (start, end, value) in ranges: - print >>outfile, ' {0x%x, 0x%x, %s},' % (start, end, value) - print >>outfile, '};\n' - print >>outfile, 'static const unsigned script_properties_count = %d;\n' % len(ranges) - print >>outfile, '#endif // SCRIPT_PROPERTIES_H_' - -if __name__ == '__main__': - if len(sys.argv) != 3: - print 'Usage: %s ' % sys.argv[0] - else: - main(file(sys.argv[1], 'r'), file(sys.argv[2], 'w+')) diff --git a/third_party/harfbuzz/contrib/tables/unicode_parse_common.py b/third_party/harfbuzz/contrib/tables/unicode_parse_common.py deleted file mode 100644 index ac26ecae3d..0000000000 --- a/third_party/harfbuzz/contrib/tables/unicode_parse_common.py +++ /dev/null @@ -1,70 +0,0 @@ -def lines_get(f): - '''Parse a file like object, removing comments and returning a list of - lines.''' - def cut_comment(line): - first_hash = line.find('#') - if first_hash == -1: - return line - return line[:first_hash] - - return [x for x in [cut_comment(x[:-1]) for x in f.readlines()] if len(x)] - -def line_split(line): - '''Split a line based on a semicolon separator.''' - def normalise(word): - return word.lstrip().rstrip() - return [normalise(x) for x in line.split(';')] - -def codepoints_parse(token): - '''Parse a Unicode style code-point range. Return either a single value or a - tuple of (start, end) for a range of code-points.''' - def fromHex(token): - return int(token, 16) - parts = token.split('..') - if len(parts) == 2: - return (fromHex(parts[0]), fromHex(parts[1])) - elif len(parts) == 1: - return fromHex(parts[0]) - else: - raise ValueError(token) - -def unicode_file_parse(input, map, default_value = None): - '''Parse a file like object, @input where the first column is a code-point - range and the second column is mapped via the given dict, @map.''' - ranges = [] - tokens = [line_split(x) for x in lines_get(input)] - for line in tokens: - if len(line) == 2: - codepoints = codepoints_parse(line[0]) - value = map[line[1]] - if value == default_value: - continue - - if type(codepoints) == int: - codepoints = (codepoints, codepoints) - - ranges.append((codepoints[0], codepoints[1], value)) - else: - raise ValueError(line) - - return ranges - -def sort_and_merge(ranges): - '''Given a list of (start, end, value), merge elements where the ranges are - continuous and the values are the same.''' - output = [] - ranges.sort() - current = None - for v in ranges: - if current is None: - current = v - continue - if current[1] + 1 == v[0] and current[2] == v[2]: - current = (current[0], v[1], v[2]) - else: - output.append(current) - current = v - if current is not None: - output.append(current) - - return output diff --git a/third_party/harfbuzz/harfbuzz.gyp b/third_party/harfbuzz/harfbuzz.gyp deleted file mode 100644 index 1e3296f6be..0000000000 --- a/third_party/harfbuzz/harfbuzz.gyp +++ /dev/null @@ -1,63 +0,0 @@ -# Copyright (c) 2009 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -{ - 'targets': [ - { - 'target_name': 'harfbuzz', - 'type': '<(library)', - 'sources': [ - 'src/harfbuzz-buffer.c', - 'src/harfbuzz-stream.c', - 'src/harfbuzz-dump.c', - 'src/harfbuzz-gdef.c', - 'src/harfbuzz-gpos.c', - 'src/harfbuzz-gsub.c', - 'src/harfbuzz-impl.c', - 'src/harfbuzz-open.c', - 'src/harfbuzz-shaper.cpp', - 'src/harfbuzz-tibetan.c', - 'src/harfbuzz-khmer.c', - 'src/harfbuzz-indic.cpp', - 'src/harfbuzz-hebrew.c', - 'src/harfbuzz-arabic.c', - 'src/harfbuzz-hangul.c', - 'src/harfbuzz-myanmar.c', - 'src/harfbuzz-thai.c', - ], - 'include_dirs': [ - 'src', - ], - 'direct_dependent_settings': { - 'include_dirs': [ - 'src', - ], - }, - 'dependencies': [ - '../../build/linux/system.gyp:freetype2', - ], - }, - { - 'target_name': 'harfbuzz_interface', - 'type': '<(library)', - 'sources': [ - 'contrib/harfbuzz-freetype.c', - 'contrib/harfbuzz-unicode.c', - 'contrib/harfbuzz-unicode-tables.c', - ], - 'include_dirs': [ - 'src', - 'contrib', - ], - 'direct_dependent_settings': { - 'include_dirs': [ - 'contrib', - ], - }, - 'dependencies': [ - '../../build/linux/system.gyp:freetype2', - ], - }, - ], -} diff --git a/third_party/harfbuzz/src/.gitignore b/third_party/harfbuzz/src/.gitignore deleted file mode 100644 index 74de98b140..0000000000 --- a/third_party/harfbuzz/src/.gitignore +++ /dev/null @@ -1,7 +0,0 @@ -*.o -*.lo -Makefile -*.la -.deps -.libs -*~ diff --git a/third_party/harfbuzz/src/Makefile.am b/third_party/harfbuzz/src/Makefile.am deleted file mode 100644 index 2b0fb1daa1..0000000000 --- a/third_party/harfbuzz/src/Makefile.am +++ /dev/null @@ -1,68 +0,0 @@ -## Process this file with automake to produce Makefile.in - -noinst_LTLIBRARIES = libharfbuzz-1.la - -MAINSOURCES = \ - harfbuzz-buffer.c \ - harfbuzz-stream.c \ - harfbuzz-dump.c \ - harfbuzz-gdef.c \ - harfbuzz-gpos.c \ - harfbuzz-gsub.c \ - harfbuzz-impl.c \ - harfbuzz-open.c \ - harfbuzz-shaper.cpp \ - harfbuzz-tibetan.c \ - harfbuzz-khmer.c \ - harfbuzz-indic.cpp \ - harfbuzz-hebrew.c \ - harfbuzz-arabic.c \ - harfbuzz-hangul.c \ - harfbuzz-myanmar.c \ - harfbuzz-thai.c - -EXTRA_SOURCES = harfbuzz.c - -PUBLICHEADERS = \ - harfbuzz.h \ - harfbuzz-buffer.h \ - harfbuzz-dump.h \ - harfbuzz-gdef.h \ - harfbuzz-gpos.h \ - harfbuzz-gsub.h \ - harfbuzz-open.h \ - harfbuzz-global.h \ - harfbuzz-external.h \ - harfbuzz-shaper.h \ - harfbuzz-stream.h - -PRIVATEHEADERS = \ - harfbuzz-impl.h \ - harfbuzz-buffer-private.h \ - harfbuzz-stream-private.h \ - harfbuzz-gdef-private.h \ - harfbuzz-gpos-private.h \ - harfbuzz-gsub-private.h \ - harfbuzz-open-private.h \ - harfbuzz-shaper-private.h - -libharfbuzz_1_la_SOURCES = \ - $(MAINSOURCES) \ - $(PUBLICHEADERS) \ - $(PRIVATEHEADERS) - -#noinst_PROGRAMS = harfbuzz-dump -# -#harfbuzz_dump_SOURCES = \ -# harfbuzz-dump-main.c -# -#harfbuzz_dump_LDADD = \ -# libharfbuzz-1.la - -EXTRA_DIST = \ - README \ - COPYING.FTL \ - COPYING.GPL \ - COPYING \ - $(EXTRA_SOURCES) - diff --git a/third_party/harfbuzz/src/harfbuzz-arabic.c b/third_party/harfbuzz/src/harfbuzz-arabic.c deleted file mode 100644 index ce2ca6c961..0000000000 --- a/third_party/harfbuzz/src/harfbuzz-arabic.c +++ /dev/null @@ -1,1145 +0,0 @@ -/* - * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) - * - * This is part of HarfBuzz, an OpenType Layout engine library. - * - * Permission is hereby granted, without written agreement and without - * license or royalty fees, to use, copy, modify, and distribute this - * software and its documentation for any purpose, provided that the - * above copyright notice and the following two paragraphs appear in - * all copies of this software. - * - * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR - * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES - * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN - * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE. - * - * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, - * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS - * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO - * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. - */ - -#include "harfbuzz-shaper.h" -#include "harfbuzz-shaper-private.h" - -#include - -static const HB_UChar16 ReplacementCharacter = 0xfffd; - -typedef struct { - unsigned char shape; - unsigned char justification; -} HB_ArabicProperties; - -typedef enum { - XIsolated, - XFinal, - XInitial, - XMedial, - /* intermediate state */ - XCausing -} ArabicShape; - -/* -// these groups correspond to the groups defined in the Unicode standard. -// Some of these groups are equal with regards to both joining and line breaking behaviour, -// and thus have the same enum value -// -// I'm not sure the mapping of syriac to arabic enums is correct with regards to justification, but as -// I couldn't find any better document I'll hope for the best. -*/ -typedef enum { - /* NonJoining */ - ArabicNone, - ArabicSpace, - /* Transparent */ - Transparent, - /* Causing */ - Center, - Kashida, - - /* Arabic */ - /* Dual */ - Beh, - Noon, - Meem = Noon, - Heh = Noon, - KnottedHeh = Noon, - HehGoal = Noon, - SwashKaf = Noon, - Yeh, - Hah, - Seen, - Sad = Seen, - Tah, - Kaf = Tah, - Gaf = Tah, - Lam = Tah, - Ain, - Feh = Ain, - Qaf = Ain, - /* Right */ - Alef, - Waw, - Dal, - TehMarbuta = Dal, - Reh, - HamzaOnHehGoal, - YehWithTail = HamzaOnHehGoal, - YehBarre = HamzaOnHehGoal, - - /* Syriac */ - /* Dual */ - Beth = Beh, - Gamal = Ain, - Heth = Noon, - Teth = Hah, - Yudh = Noon, - Kaph = Noon, - Lamadh = Lam, - Mim = Noon, - Nun = Noon, - Semakh = Noon, - FinalSemakh = Noon, - SyriacE = Ain, - Pe = Ain, - ReversedPe = Hah, - Qaph = Noon, - Shin = Noon, - Fe = Ain, - - /* Right */ - Alaph = Alef, - Dalath = Dal, - He = Dal, - SyriacWaw = Waw, - Zain = Alef, - YudhHe = Waw, - Sadhe = HamzaOnHehGoal, - Taw = Dal, - - /* Compiler bug? Otherwise ArabicGroupsEnd would be equal to Dal + 1. */ - Dummy = HamzaOnHehGoal, - ArabicGroupsEnd -} ArabicGroup; - -static const unsigned char arabic_group[0x150] = { - ArabicNone, ArabicNone, ArabicNone, ArabicNone, - ArabicNone, ArabicNone, ArabicNone, ArabicNone, - ArabicNone, ArabicNone, ArabicNone, ArabicNone, - ArabicNone, ArabicNone, ArabicNone, ArabicNone, - - Transparent, Transparent, Transparent, Transparent, - Transparent, Transparent, ArabicNone, ArabicNone, - ArabicNone, ArabicNone, ArabicNone, ArabicNone, - ArabicNone, ArabicNone, ArabicNone, ArabicNone, - - ArabicNone, ArabicNone, Alef, Alef, - Waw, Alef, Yeh, Alef, - Beh, TehMarbuta, Beh, Beh, - Hah, Hah, Hah, Dal, - - Dal, Reh, Reh, Seen, - Seen, Sad, Sad, Tah, - Tah, Ain, Ain, ArabicNone, - ArabicNone, ArabicNone, ArabicNone, ArabicNone, - - /* 0x640 */ - Kashida, Feh, Qaf, Kaf, - Lam, Meem, Noon, Heh, - Waw, Yeh, Yeh, Transparent, - Transparent, Transparent, Transparent, Transparent, - - Transparent, Transparent, Transparent, Transparent, - Transparent, Transparent, Transparent, Transparent, - Transparent, ArabicNone, ArabicNone, ArabicNone, - ArabicNone, ArabicNone, ArabicNone, ArabicNone, - - ArabicNone, ArabicNone, ArabicNone, ArabicNone, - ArabicNone, ArabicNone, ArabicNone, ArabicNone, - ArabicNone, ArabicNone, ArabicNone, ArabicNone, - ArabicNone, ArabicNone, Beh, Qaf, - - Transparent, Alef, Alef, Alef, - ArabicNone, Alef, Waw, Waw, - Yeh, Beh, Beh, Beh, - Beh, Beh, Beh, Beh, - - /* 0x680 */ - Beh, Hah, Hah, Hah, - Hah, Hah, Hah, Hah, - Dal, Dal, Dal, Dal, - Dal, Dal, Dal, Dal, - - Dal, Reh, Reh, Reh, - Reh, Reh, Reh, Reh, - Reh, Reh, Seen, Seen, - Seen, Sad, Sad, Tah, - - Ain, Feh, Feh, Feh, - Feh, Feh, Feh, Qaf, - Qaf, Gaf, SwashKaf, Gaf, - Kaf, Kaf, Kaf, Gaf, - - Gaf, Gaf, Gaf, Gaf, - Gaf, Lam, Lam, Lam, - Lam, Noon, Noon, Noon, - Noon, Noon, KnottedHeh, Hah, - - /* 0x6c0 */ - TehMarbuta, HehGoal, HamzaOnHehGoal, HamzaOnHehGoal, - Waw, Waw, Waw, Waw, - Waw, Waw, Waw, Waw, - Yeh, YehWithTail, Yeh, Waw, - - Yeh, Yeh, YehBarre, YehBarre, - ArabicNone, TehMarbuta, Transparent, Transparent, - Transparent, Transparent, Transparent, Transparent, - Transparent, ArabicNone, ArabicNone, Transparent, - - Transparent, Transparent, Transparent, Transparent, - Transparent, ArabicNone, ArabicNone, Transparent, - Transparent, ArabicNone, Transparent, Transparent, - Transparent, Transparent, Dal, Reh, - - ArabicNone, ArabicNone, ArabicNone, ArabicNone, - ArabicNone, ArabicNone, ArabicNone, ArabicNone, - ArabicNone, ArabicNone, Seen, Sad, - Ain, ArabicNone, ArabicNone, KnottedHeh, - - /* 0x700 */ - ArabicNone, ArabicNone, ArabicNone, ArabicNone, - ArabicNone, ArabicNone, ArabicNone, ArabicNone, - ArabicNone, ArabicNone, ArabicNone, ArabicNone, - ArabicNone, ArabicNone, ArabicNone, ArabicNone, - - Alaph, Transparent, Beth, Gamal, - Gamal, Dalath, Dalath, He, - SyriacWaw, Zain, Heth, Teth, - Teth, Yudh, YudhHe, Kaph, - - Lamadh, Mim, Nun, Semakh, - FinalSemakh, SyriacE, Pe, ReversedPe, - Sadhe, Qaph, Dalath, Shin, - Taw, Beth, Gamal, Dalath, - - Transparent, Transparent, Transparent, Transparent, - Transparent, Transparent, Transparent, Transparent, - Transparent, Transparent, Transparent, Transparent, - Transparent, Transparent, Transparent, Transparent, - - Transparent, Transparent, Transparent, Transparent, - Transparent, Transparent, Transparent, Transparent, - Transparent, Transparent, Transparent, ArabicNone, - ArabicNone, Zain, Kaph, Fe, -}; - -static ArabicGroup arabicGroup(unsigned short uc) -{ - if (uc >= 0x0600 && uc < 0x750) - return (ArabicGroup) arabic_group[uc-0x600]; - else if (uc == 0x200d) - return Center; - else if (HB_GetUnicodeCharCategory(uc) == HB_Separator_Space) - return ArabicSpace; - else - return ArabicNone; -} - - -/* - Arabic shaping obeys a number of rules according to the joining classes (see Unicode book, section on - arabic). - - Each unicode char has a joining class (right, dual (left&right), center (joincausing) or transparent). - transparent joining is not encoded in HB_UChar16::joining(), but applies to all combining marks and format marks. - - Right join-causing: dual + center - Left join-causing: dual + right + center - - Rules are as follows (for a string already in visual order, as we have it here): - - R1 Transparent characters do not affect joining behaviour. - R2 A right joining character, that has a right join-causing char on the right will get form XRight - (R3 A left joining character, that has a left join-causing char on the left will get form XLeft) - Note: the above rule is meaningless, as there are no pure left joining characters defined in Unicode - R4 A dual joining character, that has a left join-causing char on the left and a right join-causing char on - the right will get form XMedial - R5 A dual joining character, that has a right join causing char on the right, and no left join causing char on the left - will get form XRight - R6 A dual joining character, that has a left join causing char on the left, and no right join causing char on the right - will get form XLeft - R7 Otherwise the character will get form XIsolated - - Additionally we have to do the minimal ligature support for lam-alef ligatures: - - L1 Transparent characters do not affect ligature behaviour. - L2 Any sequence of Alef(XRight) + Lam(XMedial) will form the ligature Alef.Lam(XLeft) - L3 Any sequence of Alef(XRight) + Lam(XLeft) will form the ligature Alef.Lam(XIsolated) - - The state table below handles rules R1-R7. -*/ - -typedef enum { - JNone, - JCausing, - JDual, - JRight, - JTransparent -} Joining; - -static const Joining joining_for_group[ArabicGroupsEnd] = { - /* NonJoining */ - JNone, /* ArabicNone */ - JNone, /* ArabicSpace */ - /* Transparent */ - JTransparent, /* Transparent */ - /* Causing */ - JCausing, /* Center */ - JCausing, /* Kashida */ - /* Dual */ - JDual, /* Beh */ - JDual, /* Noon */ - JDual, /* Yeh */ - JDual, /* Hah */ - JDual, /* Seen */ - JDual, /* Tah */ - JDual, /* Ain */ - /* Right */ - JRight, /* Alef */ - JRight, /* Waw */ - JRight, /* Dal */ - JRight, /* Reh */ - JRight /* HamzaOnHehGoal */ -}; - - -typedef struct { - ArabicShape form1; - ArabicShape form2; -} JoiningPair; - -static const JoiningPair joining_table[5][4] = -/* None, Causing, Dual, Right */ -{ - { { XIsolated, XIsolated }, { XIsolated, XCausing }, { XIsolated, XInitial }, { XIsolated, XIsolated } }, /* XIsolated */ - { { XFinal, XIsolated }, { XFinal, XCausing }, { XFinal, XInitial }, { XFinal, XIsolated } }, /* XFinal */ - { { XIsolated, XIsolated }, { XInitial, XCausing }, { XInitial, XMedial }, { XInitial, XFinal } }, /* XInitial */ - { { XFinal, XIsolated }, { XMedial, XCausing }, { XMedial, XMedial }, { XMedial, XFinal } }, /* XMedial */ - { { XIsolated, XIsolated }, { XIsolated, XCausing }, { XIsolated, XMedial }, { XIsolated, XFinal } }, /* XCausing */ -}; - - -/* -According to http://www.microsoft.com/middleeast/Arabicdev/IE6/KBase.asp - -1. Find the priority of the connecting opportunities in each word -2. Add expansion at the highest priority connection opportunity -3. If more than one connection opportunity have the same highest value, - use the opportunity closest to the end of the word. - -Following is a chart that provides the priority for connection -opportunities and where expansion occurs. The character group names -are those in table 6.6 of the UNICODE 2.0 book. - - -PrioritY Glyph Condition Kashida Location - -Arabic_Kashida User inserted Kashida The user entered a Kashida in a position. After the user - (Shift+j or Shift+[E with hat]) Thus, it is the highest priority to insert an inserted kashida - automatic kashida. - -Arabic_Seen Seen, Sad Connecting to the next character. After the character. - (Initial or medial form). - -Arabic_HaaDal Teh Marbutah, Haa, Dal Connecting to previous character. Before the final form - of these characters. - -Arabic_Alef Alef, Tah, Lam, Connecting to previous character. Before the final form - Kaf and Gaf of these characters. - -Arabic_BaRa Reh, Yeh Connected to medial Beh Before preceding medial Baa - -Arabic_Waw Waw, Ain, Qaf, Feh Connecting to previous character. Before the final form of - these characters. - -Arabic_Normal Other connecting Connecting to previous character. Before the final form - characters of these characters. - - - -This seems to imply that we have at most one kashida point per arabic word. - -*/ - -static void getArabicProperties(const unsigned short *chars, int len, HB_ArabicProperties *properties) -{ -/* qDebug("arabicSyriacOpenTypeShape: properties:"); */ - int lastPos = 0; - int lastGroup = ArabicNone; - int i = 0; - - ArabicGroup group = arabicGroup(chars[0]); - Joining j = joining_for_group[group]; - ArabicShape shape = joining_table[XIsolated][j].form2; - properties[0].justification = HB_NoJustification; - - for (i = 1; i < len; ++i) { - /* #### fix handling for spaces and punktuation */ - properties[i].justification = HB_NoJustification; - - group = arabicGroup(chars[i]); - j = joining_for_group[group]; - - if (j == JTransparent) { - properties[i].shape = XIsolated; - continue; - } - - properties[lastPos].shape = joining_table[shape][j].form1; - shape = joining_table[shape][j].form2; - - switch(lastGroup) { - case Seen: - if (properties[lastPos].shape == XInitial || properties[lastPos].shape == XMedial) - properties[i-1].justification = HB_Arabic_Seen; - break; - case Hah: - if (properties[lastPos].shape == XFinal) - properties[lastPos-1].justification = HB_Arabic_HaaDal; - break; - case Alef: - if (properties[lastPos].shape == XFinal) - properties[lastPos-1].justification = HB_Arabic_Alef; - break; - case Ain: - if (properties[lastPos].shape == XFinal) - properties[lastPos-1].justification = HB_Arabic_Waw; - break; - case Noon: - if (properties[lastPos].shape == XFinal) - properties[lastPos-1].justification = HB_Arabic_Normal; - break; - case ArabicNone: - break; - - default: - assert(FALSE); - } - - lastGroup = ArabicNone; - - switch(group) { - case ArabicNone: - case Transparent: - /* ### Center should probably be treated as transparent when it comes to justification. */ - case Center: - break; - case ArabicSpace: - properties[i].justification = HB_Arabic_Space; - break; - case Kashida: - properties[i].justification = HB_Arabic_Kashida; - break; - case Seen: - lastGroup = Seen; - break; - - case Hah: - case Dal: - lastGroup = Hah; - break; - - case Alef: - case Tah: - lastGroup = Alef; - break; - - case Yeh: - case Reh: - if (properties[lastPos].shape == XMedial && arabicGroup(chars[lastPos]) == Beh) - properties[lastPos-1].justification = HB_Arabic_BaRa; - break; - - case Ain: - case Waw: - lastGroup = Ain; - break; - - case Noon: - case Beh: - case HamzaOnHehGoal: - lastGroup = Noon; - break; - case ArabicGroupsEnd: - assert(FALSE); - } - - lastPos = i; - } - properties[lastPos].shape = joining_table[shape][JNone].form1; - - - /* - for (int i = 0; i < len; ++i) - qDebug("arabic properties(%d): uc=%x shape=%d, justification=%d", i, chars[i], properties[i].shape, properties[i].justification); - */ -} - -static Joining getNkoJoining(unsigned short uc) -{ - if (uc < 0x7ca) - return JNone; - if (uc <= 0x7ea) - return JDual; - if (uc <= 0x7f3) - return JTransparent; - if (uc <= 0x7f9) - return JNone; - if (uc == 0x7fa) - return JCausing; - return JNone; -} - -static void getNkoProperties(const unsigned short *chars, int len, HB_ArabicProperties *properties) -{ - int lastPos = 0; - int i = 0; - - Joining j = getNkoJoining(chars[0]); - ArabicShape shape = joining_table[XIsolated][j].form2; - properties[0].justification = HB_NoJustification; - - for (i = 1; i < len; ++i) { - properties[i].justification = (HB_GetUnicodeCharCategory(chars[i]) == HB_Separator_Space) ? - ArabicSpace : ArabicNone; - - j = getNkoJoining(chars[i]); - - if (j == JTransparent) { - properties[i].shape = XIsolated; - continue; - } - - properties[lastPos].shape = joining_table[shape][j].form1; - shape = joining_table[shape][j].form2; - - - lastPos = i; - } - properties[lastPos].shape = joining_table[shape][JNone].form1; - - - /* - for (int i = 0; i < len; ++i) - qDebug("nko properties(%d): uc=%x shape=%d, justification=%d", i, chars[i], properties[i].shape, properties[i].justification); - */ -} - -/* -// The unicode to unicode shaping codec. -// does only presentation forms B at the moment, but that should be enough for -// simple display -*/ -static const hb_uint16 arabicUnicodeMapping[256][2] = { - /* base of shaped forms, and number-1 of them (0 for non shaping, - 1 for right binding and 3 for dual binding */ - - /* These are just the glyphs available in Unicode, - some characters are in R class, but have no glyphs in Unicode. */ - - { 0x0600, 0 }, /* 0x0600 */ - { 0x0601, 0 }, /* 0x0601 */ - { 0x0602, 0 }, /* 0x0602 */ - { 0x0603, 0 }, /* 0x0603 */ - { 0x0604, 0 }, /* 0x0604 */ - { 0x0605, 0 }, /* 0x0605 */ - { 0x0606, 0 }, /* 0x0606 */ - { 0x0607, 0 }, /* 0x0607 */ - { 0x0608, 0 }, /* 0x0608 */ - { 0x0609, 0 }, /* 0x0609 */ - { 0x060A, 0 }, /* 0x060A */ - { 0x060B, 0 }, /* 0x060B */ - { 0x060C, 0 }, /* 0x060C */ - { 0x060D, 0 }, /* 0x060D */ - { 0x060E, 0 }, /* 0x060E */ - { 0x060F, 0 }, /* 0x060F */ - - { 0x0610, 0 }, /* 0x0610 */ - { 0x0611, 0 }, /* 0x0611 */ - { 0x0612, 0 }, /* 0x0612 */ - { 0x0613, 0 }, /* 0x0613 */ - { 0x0614, 0 }, /* 0x0614 */ - { 0x0615, 0 }, /* 0x0615 */ - { 0x0616, 0 }, /* 0x0616 */ - { 0x0617, 0 }, /* 0x0617 */ - { 0x0618, 0 }, /* 0x0618 */ - { 0x0619, 0 }, /* 0x0619 */ - { 0x061A, 0 }, /* 0x061A */ - { 0x061B, 0 }, /* 0x061B */ - { 0x061C, 0 }, /* 0x061C */ - { 0x061D, 0 }, /* 0x061D */ - { 0x061E, 0 }, /* 0x061E */ - { 0x061F, 0 }, /* 0x061F */ - - { 0x0620, 0 }, /* 0x0620 */ - { 0xFE80, 0 }, /* 0x0621 HAMZA */ - { 0xFE81, 1 }, /* 0x0622 R ALEF WITH MADDA ABOVE */ - { 0xFE83, 1 }, /* 0x0623 R ALEF WITH HAMZA ABOVE */ - { 0xFE85, 1 }, /* 0x0624 R WAW WITH HAMZA ABOVE */ - { 0xFE87, 1 }, /* 0x0625 R ALEF WITH HAMZA BELOW */ - { 0xFE89, 3 }, /* 0x0626 D YEH WITH HAMZA ABOVE */ - { 0xFE8D, 1 }, /* 0x0627 R ALEF */ - { 0xFE8F, 3 }, /* 0x0628 D BEH */ - { 0xFE93, 1 }, /* 0x0629 R TEH MARBUTA */ - { 0xFE95, 3 }, /* 0x062A D TEH */ - { 0xFE99, 3 }, /* 0x062B D THEH */ - { 0xFE9D, 3 }, /* 0x062C D JEEM */ - { 0xFEA1, 3 }, /* 0x062D D HAH */ - { 0xFEA5, 3 }, /* 0x062E D KHAH */ - { 0xFEA9, 1 }, /* 0x062F R DAL */ - - { 0xFEAB, 1 }, /* 0x0630 R THAL */ - { 0xFEAD, 1 }, /* 0x0631 R REH */ - { 0xFEAF, 1 }, /* 0x0632 R ZAIN */ - { 0xFEB1, 3 }, /* 0x0633 D SEEN */ - { 0xFEB5, 3 }, /* 0x0634 D SHEEN */ - { 0xFEB9, 3 }, /* 0x0635 D SAD */ - { 0xFEBD, 3 }, /* 0x0636 D DAD */ - { 0xFEC1, 3 }, /* 0x0637 D TAH */ - { 0xFEC5, 3 }, /* 0x0638 D ZAH */ - { 0xFEC9, 3 }, /* 0x0639 D AIN */ - { 0xFECD, 3 }, /* 0x063A D GHAIN */ - { 0x063B, 0 }, /* 0x063B */ - { 0x063C, 0 }, /* 0x063C */ - { 0x063D, 0 }, /* 0x063D */ - { 0x063E, 0 }, /* 0x063E */ - { 0x063F, 0 }, /* 0x063F */ - - { 0x0640, 0 }, /* 0x0640 C TATWEEL // ### Join Causing, only one glyph */ - { 0xFED1, 3 }, /* 0x0641 D FEH */ - { 0xFED5, 3 }, /* 0x0642 D QAF */ - { 0xFED9, 3 }, /* 0x0643 D KAF */ - { 0xFEDD, 3 }, /* 0x0644 D LAM */ - { 0xFEE1, 3 }, /* 0x0645 D MEEM */ - { 0xFEE5, 3 }, /* 0x0646 D NOON */ - { 0xFEE9, 3 }, /* 0x0647 D HEH */ - { 0xFEED, 1 }, /* 0x0648 R WAW */ - { 0x0649, 3 }, /* 0x0649 ALEF MAKSURA // ### Dual, glyphs not consecutive, handle in code. */ - { 0xFEF1, 3 }, /* 0x064A D YEH */ - { 0x064B, 0 }, /* 0x064B */ - { 0x064C, 0 }, /* 0x064C */ - { 0x064D, 0 }, /* 0x064D */ - { 0x064E, 0 }, /* 0x064E */ - { 0x064F, 0 }, /* 0x064F */ - - { 0x0650, 0 }, /* 0x0650 */ - { 0x0651, 0 }, /* 0x0651 */ - { 0x0652, 0 }, /* 0x0652 */ - { 0x0653, 0 }, /* 0x0653 */ - { 0x0654, 0 }, /* 0x0654 */ - { 0x0655, 0 }, /* 0x0655 */ - { 0x0656, 0 }, /* 0x0656 */ - { 0x0657, 0 }, /* 0x0657 */ - { 0x0658, 0 }, /* 0x0658 */ - { 0x0659, 0 }, /* 0x0659 */ - { 0x065A, 0 }, /* 0x065A */ - { 0x065B, 0 }, /* 0x065B */ - { 0x065C, 0 }, /* 0x065C */ - { 0x065D, 0 }, /* 0x065D */ - { 0x065E, 0 }, /* 0x065E */ - { 0x065F, 0 }, /* 0x065F */ - - { 0x0660, 0 }, /* 0x0660 */ - { 0x0661, 0 }, /* 0x0661 */ - { 0x0662, 0 }, /* 0x0662 */ - { 0x0663, 0 }, /* 0x0663 */ - { 0x0664, 0 }, /* 0x0664 */ - { 0x0665, 0 }, /* 0x0665 */ - { 0x0666, 0 }, /* 0x0666 */ - { 0x0667, 0 }, /* 0x0667 */ - { 0x0668, 0 }, /* 0x0668 */ - { 0x0669, 0 }, /* 0x0669 */ - { 0x066A, 0 }, /* 0x066A */ - { 0x066B, 0 }, /* 0x066B */ - { 0x066C, 0 }, /* 0x066C */ - { 0x066D, 0 }, /* 0x066D */ - { 0x066E, 0 }, /* 0x066E */ - { 0x066F, 0 }, /* 0x066F */ - - { 0x0670, 0 }, /* 0x0670 */ - { 0xFB50, 1 }, /* 0x0671 R ALEF WASLA */ - { 0x0672, 0 }, /* 0x0672 */ - { 0x0673, 0 }, /* 0x0673 */ - { 0x0674, 0 }, /* 0x0674 */ - { 0x0675, 0 }, /* 0x0675 */ - { 0x0676, 0 }, /* 0x0676 */ - { 0x0677, 0 }, /* 0x0677 */ - { 0x0678, 0 }, /* 0x0678 */ - { 0xFB66, 3 }, /* 0x0679 D TTEH */ - { 0xFB5E, 3 }, /* 0x067A D TTEHEH */ - { 0xFB52, 3 }, /* 0x067B D BEEH */ - { 0x067C, 0 }, /* 0x067C */ - { 0x067D, 0 }, /* 0x067D */ - { 0xFB56, 3 }, /* 0x067E D PEH */ - { 0xFB62, 3 }, /* 0x067F D TEHEH */ - - { 0xFB5A, 3 }, /* 0x0680 D BEHEH */ - { 0x0681, 0 }, /* 0x0681 */ - { 0x0682, 0 }, /* 0x0682 */ - { 0xFB76, 3 }, /* 0x0683 D NYEH */ - { 0xFB72, 3 }, /* 0x0684 D DYEH */ - { 0x0685, 0 }, /* 0x0685 */ - { 0xFB7A, 3 }, /* 0x0686 D TCHEH */ - { 0xFB7E, 3 }, /* 0x0687 D TCHEHEH */ - { 0xFB88, 1 }, /* 0x0688 R DDAL */ - { 0x0689, 0 }, /* 0x0689 */ - { 0x068A, 0 }, /* 0x068A */ - { 0x068B, 0 }, /* 0x068B */ - { 0xFB84, 1 }, /* 0x068C R DAHAL */ - { 0xFB82, 1 }, /* 0x068D R DDAHAL */ - { 0xFB86, 1 }, /* 0x068E R DUL */ - { 0x068F, 0 }, /* 0x068F */ - - { 0x0690, 0 }, /* 0x0690 */ - { 0xFB8C, 1 }, /* 0x0691 R RREH */ - { 0x0692, 0 }, /* 0x0692 */ - { 0x0693, 0 }, /* 0x0693 */ - { 0x0694, 0 }, /* 0x0694 */ - { 0x0695, 0 }, /* 0x0695 */ - { 0x0696, 0 }, /* 0x0696 */ - { 0x0697, 0 }, /* 0x0697 */ - { 0xFB8A, 1 }, /* 0x0698 R JEH */ - { 0x0699, 0 }, /* 0x0699 */ - { 0x069A, 0 }, /* 0x069A */ - { 0x069B, 0 }, /* 0x069B */ - { 0x069C, 0 }, /* 0x069C */ - { 0x069D, 0 }, /* 0x069D */ - { 0x069E, 0 }, /* 0x069E */ - { 0x069F, 0 }, /* 0x069F */ - - { 0x06A0, 0 }, /* 0x06A0 */ - { 0x06A1, 0 }, /* 0x06A1 */ - { 0x06A2, 0 }, /* 0x06A2 */ - { 0x06A3, 0 }, /* 0x06A3 */ - { 0xFB6A, 3 }, /* 0x06A4 D VEH */ - { 0x06A5, 0 }, /* 0x06A5 */ - { 0xFB6E, 3 }, /* 0x06A6 D PEHEH */ - { 0x06A7, 0 }, /* 0x06A7 */ - { 0x06A8, 0 }, /* 0x06A8 */ - { 0xFB8E, 3 }, /* 0x06A9 D KEHEH */ - { 0x06AA, 0 }, /* 0x06AA */ - { 0x06AB, 0 }, /* 0x06AB */ - { 0x06AC, 0 }, /* 0x06AC */ - { 0xFBD3, 3 }, /* 0x06AD D NG */ - { 0x06AE, 0 }, /* 0x06AE */ - { 0xFB92, 3 }, /* 0x06AF D GAF */ - - { 0x06B0, 0 }, /* 0x06B0 */ - { 0xFB9A, 3 }, /* 0x06B1 D NGOEH */ - { 0x06B2, 0 }, /* 0x06B2 */ - { 0xFB96, 3 }, /* 0x06B3 D GUEH */ - { 0x06B4, 0 }, /* 0x06B4 */ - { 0x06B5, 0 }, /* 0x06B5 */ - { 0x06B6, 0 }, /* 0x06B6 */ - { 0x06B7, 0 }, /* 0x06B7 */ - { 0x06B8, 0 }, /* 0x06B8 */ - { 0x06B9, 0 }, /* 0x06B9 */ - { 0xFB9E, 1 }, /* 0x06BA R NOON GHUNNA */ - { 0xFBA0, 3 }, /* 0x06BB D RNOON */ - { 0x06BC, 0 }, /* 0x06BC */ - { 0x06BD, 0 }, /* 0x06BD */ - { 0xFBAA, 3 }, /* 0x06BE D HEH DOACHASHMEE */ - { 0x06BF, 0 }, /* 0x06BF */ - - { 0xFBA4, 1 }, /* 0x06C0 R HEH WITH YEH ABOVE */ - { 0xFBA6, 3 }, /* 0x06C1 D HEH GOAL */ - { 0x06C2, 0 }, /* 0x06C2 */ - { 0x06C3, 0 }, /* 0x06C3 */ - { 0x06C4, 0 }, /* 0x06C4 */ - { 0xFBE0, 1 }, /* 0x06C5 R KIRGHIZ OE */ - { 0xFBD9, 1 }, /* 0x06C6 R OE */ - { 0xFBD7, 1 }, /* 0x06C7 R U */ - { 0xFBDB, 1 }, /* 0x06C8 R YU */ - { 0xFBE2, 1 }, /* 0x06C9 R KIRGHIZ YU */ - { 0x06CA, 0 }, /* 0x06CA */ - { 0xFBDE, 1 }, /* 0x06CB R VE */ - { 0xFBFC, 3 }, /* 0x06CC D FARSI YEH */ - { 0x06CD, 0 }, /* 0x06CD */ - { 0x06CE, 0 }, /* 0x06CE */ - { 0x06CF, 0 }, /* 0x06CF */ - - { 0xFBE4, 3 }, /* 0x06D0 D E */ - { 0x06D1, 0 }, /* 0x06D1 */ - { 0xFBAE, 1 }, /* 0x06D2 R YEH BARREE */ - { 0xFBB0, 1 }, /* 0x06D3 R YEH BARREE WITH HAMZA ABOVE */ - { 0x06D4, 0 }, /* 0x06D4 */ - { 0x06D5, 0 }, /* 0x06D5 */ - { 0x06D6, 0 }, /* 0x06D6 */ - { 0x06D7, 0 }, /* 0x06D7 */ - { 0x06D8, 0 }, /* 0x06D8 */ - { 0x06D9, 0 }, /* 0x06D9 */ - { 0x06DA, 0 }, /* 0x06DA */ - { 0x06DB, 0 }, /* 0x06DB */ - { 0x06DC, 0 }, /* 0x06DC */ - { 0x06DD, 0 }, /* 0x06DD */ - { 0x06DE, 0 }, /* 0x06DE */ - { 0x06DF, 0 }, /* 0x06DF */ - - { 0x06E0, 0 }, /* 0x06E0 */ - { 0x06E1, 0 }, /* 0x06E1 */ - { 0x06E2, 0 }, /* 0x06E2 */ - { 0x06E3, 0 }, /* 0x06E3 */ - { 0x06E4, 0 }, /* 0x06E4 */ - { 0x06E5, 0 }, /* 0x06E5 */ - { 0x06E6, 0 }, /* 0x06E6 */ - { 0x06E7, 0 }, /* 0x06E7 */ - { 0x06E8, 0 }, /* 0x06E8 */ - { 0x06E9, 0 }, /* 0x06E9 */ - { 0x06EA, 0 }, /* 0x06EA */ - { 0x06EB, 0 }, /* 0x06EB */ - { 0x06EC, 0 }, /* 0x06EC */ - { 0x06ED, 0 }, /* 0x06ED */ - { 0x06EE, 0 }, /* 0x06EE */ - { 0x06EF, 0 }, /* 0x06EF */ - - { 0x06F0, 0 }, /* 0x06F0 */ - { 0x06F1, 0 }, /* 0x06F1 */ - { 0x06F2, 0 }, /* 0x06F2 */ - { 0x06F3, 0 }, /* 0x06F3 */ - { 0x06F4, 0 }, /* 0x06F4 */ - { 0x06F5, 0 }, /* 0x06F5 */ - { 0x06F6, 0 }, /* 0x06F6 */ - { 0x06F7, 0 }, /* 0x06F7 */ - { 0x06F8, 0 }, /* 0x06F8 */ - { 0x06F9, 0 }, /* 0x06F9 */ - { 0x06FA, 0 }, /* 0x06FA */ - { 0x06FB, 0 }, /* 0x06FB */ - { 0x06FC, 0 }, /* 0x06FC */ - { 0x06FD, 0 }, /* 0x06FD */ - { 0x06FE, 0 }, /* 0x06FE */ - { 0x06FF, 0 } /* 0x06FF */ -}; - -/* the arabicUnicodeMapping does not work for U+0649 ALEF MAKSURA, this table does */ -static const hb_uint16 alefMaksura[4] = {0xFEEF, 0xFEF0, 0xFBE8, 0xFBE9}; - -/* -// this is a bit tricky. Alef always binds to the right, so the second parameter descibing the shape -// of the lam can be either initial of medial. So initial maps to the isolated form of the ligature, -// medial to the final form -*/ -static const hb_uint16 arabicUnicodeLamAlefMapping[6][4] = { - { 0xfffd, 0xfffd, 0xfef5, 0xfef6 }, /* 0x622 R Alef with Madda above */ - { 0xfffd, 0xfffd, 0xfef7, 0xfef8 }, /* 0x623 R Alef with Hamza above */ - { 0xfffd, 0xfffd, 0xfffd, 0xfffd }, /* 0x624 // Just to fill the table ;-) */ - { 0xfffd, 0xfffd, 0xfef9, 0xfefa }, /* 0x625 R Alef with Hamza below */ - { 0xfffd, 0xfffd, 0xfffd, 0xfffd }, /* 0x626 // Just to fill the table ;-) */ - { 0xfffd, 0xfffd, 0xfefb, 0xfefc } /* 0x627 R Alef */ -}; - -static int getShape(hb_uint8 cell, int shape) -{ - /* the arabicUnicodeMapping does not work for U+0649 ALEF MAKSURA, handle this here */ - int ch = (cell != 0x49) - ? (shape ? arabicUnicodeMapping[cell][0] + shape : 0x600+cell) - : alefMaksura[shape] ; - return ch; -} - - -/* - Two small helper functions for arabic shaping. -*/ -static HB_UChar16 prevChar(const HB_UChar16 *str, int pos) -{ - /*qDebug("leftChar: pos=%d", pos); */ - const HB_UChar16 *ch = str + pos - 1; - pos--; - while(pos > -1) { - if(HB_GetUnicodeCharCategory(*ch) != HB_Mark_NonSpacing) - return *ch; - pos--; - ch--; - } - return ReplacementCharacter; -} - -static HB_UChar16 nextChar(const HB_UChar16 *str, hb_uint32 len, hb_uint32 pos) -{ - const HB_UChar16 *ch = str + pos + 1; - pos++; - while(pos < len) { - /*qDebug("rightChar: %d isLetter=%d, joining=%d", pos, ch.isLetter(), ch.joining()); */ - if(HB_GetUnicodeCharCategory(*ch) != HB_Mark_NonSpacing) - return *ch; - /* assume it's a transparent char, this might not be 100% correct */ - pos++; - ch++; - } - return ReplacementCharacter; -} - -static void shapedString(const HB_UChar16 *uc, hb_uint32 stringLength, hb_uint32 from, hb_uint32 len, HB_UChar16 *shapeBuffer, int *shapedLength, - HB_Bool reverse, HB_GlyphAttributes *attributes, unsigned short *logClusters) -{ - HB_ArabicProperties *properties; - hb_int32 f = from; - hb_uint32 l = len; - const HB_UChar16 *ch; - HB_UChar16 *data; - int clusterStart; - hb_uint32 i; - HB_STACKARRAY(HB_ArabicProperties, props, len + 2); - properties = props; - - assert(stringLength >= from + len); - - if(len == 0) { - *shapedLength = 0; - return; - } - - if (from > 0) { - --f; - ++l; - ++properties; - } - if (f + l < stringLength) - ++l; - getArabicProperties(uc+f, l, props); - - ch = uc + from; - data = shapeBuffer; - clusterStart = 0; - - for (i = 0; i < len; i++) { - hb_uint8 r = *ch >> 8; - int gpos = data - shapeBuffer; - - if (r != 0x06) { - if (r == 0x20) { - if (*ch == 0x200c || *ch == 0x200d) - /* remove ZWJ and ZWNJ */ - goto skip; - } - if (reverse) - *data = HB_GetMirroredChar(*ch); - else - *data = *ch; - } else { - hb_uint8 c = *ch & 0xff; - int pos = i + from; - int shape = properties[i].shape; -/* qDebug("mapping U+%x to shape %d glyph=0x%x", ch->unicode(), shape, getShape(c, shape)); */ - /* take care of lam-alef ligatures (lam right of alef) */ - hb_uint16 map; - switch (c) { - case 0x44: { /* lam */ - const HB_UChar16 pch = nextChar(uc, stringLength, pos); - if ((pch >> 8) == 0x06) { - switch (pch & 0xff) { - case 0x22: - case 0x23: - case 0x25: - case 0x27: -/* qDebug(" lam of lam-alef ligature"); */ - map = arabicUnicodeLamAlefMapping[(pch & 0xff) - 0x22][shape]; - goto next; - default: - break; - } - } - break; - } - case 0x22: /* alef with madda */ - case 0x23: /* alef with hamza above */ - case 0x25: /* alef with hamza below */ - case 0x27: /* alef */ - if (prevChar(uc, pos) == 0x0644) { - /* have a lam alef ligature */ - /*qDebug(" alef of lam-alef ligature"); */ - goto skip; - } - default: - break; - } - map = getShape(c, shape); - next: - *data = map; - } - /* ##### Fixme */ - /*glyphs[gpos].attributes.zeroWidth = zeroWidth; */ - if (HB_GetUnicodeCharCategory(*ch) == HB_Mark_NonSpacing) { - attributes[gpos].mark = TRUE; -/* qDebug("glyph %d (char %d) is mark!", gpos, i); */ - } else { - attributes[gpos].mark = FALSE; - clusterStart = data - shapeBuffer; - } - attributes[gpos].clusterStart = !attributes[gpos].mark; - attributes[gpos].combiningClass = HB_GetUnicodeCharCombiningClass(*ch); - attributes[gpos].justification = properties[i].justification; -/* qDebug("data[%d] = %x (from %x)", gpos, (uint)data->unicode(), ch->unicode());*/ - data++; - skip: - ch++; - logClusters[i] = clusterStart; - } - *shapedLength = data - shapeBuffer; - - HB_FREE_STACKARRAY(props); -} - -#ifndef NO_OPENTYPE - -static const HB_OpenTypeFeature arabic_features[] = { - { HB_MAKE_TAG('c', 'c', 'm', 'p'), CcmpProperty }, - { HB_MAKE_TAG('i', 's', 'o', 'l'), IsolProperty }, - { HB_MAKE_TAG('f', 'i', 'n', 'a'), FinaProperty }, - { HB_MAKE_TAG('m', 'e', 'd', 'i'), MediProperty }, - { HB_MAKE_TAG('i', 'n', 'i', 't'), InitProperty }, - { HB_MAKE_TAG('r', 'l', 'i', 'g'), RligProperty }, - { HB_MAKE_TAG('c', 'a', 'l', 't'), CaltProperty }, - { HB_MAKE_TAG('l', 'i', 'g', 'a'), LigaProperty }, - { HB_MAKE_TAG('d', 'l', 'i', 'g'), DligProperty }, - { HB_MAKE_TAG('c', 's', 'w', 'h'), CswhProperty }, - /* mset is used in old Win95 fonts that don't have a 'mark' positioning table. */ - { HB_MAKE_TAG('m', 's', 'e', 't'), MsetProperty }, - {0, 0} -}; - -static const HB_OpenTypeFeature syriac_features[] = { - { HB_MAKE_TAG('c', 'c', 'm', 'p'), CcmpProperty }, - { HB_MAKE_TAG('i', 's', 'o', 'l'), IsolProperty }, - { HB_MAKE_TAG('f', 'i', 'n', 'a'), FinaProperty }, - { HB_MAKE_TAG('f', 'i', 'n', '2'), FinaProperty }, - { HB_MAKE_TAG('f', 'i', 'n', '3'), FinaProperty }, - { HB_MAKE_TAG('m', 'e', 'd', 'i'), MediProperty }, - { HB_MAKE_TAG('m', 'e', 'd', '2'), MediProperty }, - { HB_MAKE_TAG('i', 'n', 'i', 't'), InitProperty }, - { HB_MAKE_TAG('r', 'l', 'i', 'g'), RligProperty }, - { HB_MAKE_TAG('c', 'a', 'l', 't'), CaltProperty }, - { HB_MAKE_TAG('l', 'i', 'g', 'a'), LigaProperty }, - { HB_MAKE_TAG('d', 'l', 'i', 'g'), DligProperty }, - {0, 0} -}; - -static HB_Bool arabicSyriacOpenTypeShape(HB_ShaperItem *item, HB_Bool *ot_ok) -{ - const HB_UChar16 *uc; - const int nglyphs = item->num_glyphs; - hb_int32 f; - hb_uint32 l; - HB_ArabicProperties *properties; - HB_DECLARE_STACKARRAY(HB_ArabicProperties, props) - HB_DECLARE_STACKARRAY(hb_uint32, apply) - HB_Bool shaped; - int i = 0; - - *ot_ok = TRUE; - - if (!HB_ConvertStringToGlyphIndices(item)) - return FALSE; - HB_HeuristicSetGlyphAttributes(item); - - HB_INIT_STACKARRAY(HB_ArabicProperties, props, item->item.length + 2); - HB_INIT_STACKARRAY(hb_uint32, apply, item->num_glyphs); - - uc = item->string + item->item.pos; - - properties = props; - f = 0; - l = item->item.length; - if (item->item.pos > 0) { - --f; - ++l; - ++properties; - } - if (f + l + item->item.pos < item->stringLength) { - ++l; - } - if (item->item.script == HB_Script_Nko) - getNkoProperties(uc+f, l, props); - else - getArabicProperties(uc+f, l, props); - - for (i = 0; i < (int)item->num_glyphs; i++) { - apply[i] = 0; - - if (properties[i].shape == XIsolated) - apply[i] |= MediProperty|FinaProperty|InitProperty; - else if (properties[i].shape == XMedial) - apply[i] |= IsolProperty|FinaProperty|InitProperty; - else if (properties[i].shape == XFinal) - apply[i] |= IsolProperty|MediProperty|InitProperty; - else if (properties[i].shape == XInitial) - apply[i] |= IsolProperty|MediProperty|FinaProperty; - - item->attributes[i].justification = properties[i].justification; - } - - HB_FREE_STACKARRAY(props); - - shaped = HB_OpenTypeShape(item, apply); - - HB_FREE_STACKARRAY(apply); - - if (!shaped) { - *ot_ok = FALSE; - return FALSE; - } - return HB_OpenTypePosition(item, nglyphs, /*doLogClusters*/TRUE); -} - -#endif - -/* #### stil missing: identify invalid character combinations */ -HB_Bool HB_ArabicShape(HB_ShaperItem *item) -{ - int slen; - HB_Bool haveGlyphs; - HB_STACKARRAY(HB_UChar16, shapedChars, item->item.length); - - assert(item->item.script == HB_Script_Arabic || item->item.script == HB_Script_Syriac - || item->item.script == HB_Script_Nko); - - item->shaperFlags |= HB_ShaperFlag_ForceMarksToZeroWidth; -#ifndef NO_OPENTYPE - - if (HB_SelectScript(item, item->item.script == HB_Script_Arabic ? arabic_features : syriac_features)) { - HB_Bool ot_ok; - if (arabicSyriacOpenTypeShape(item, &ot_ok)) - return TRUE; - if (ot_ok) - return FALSE; - /* fall through to the non OT code*/ - } -#endif - - if (item->item.script != HB_Script_Arabic) - return HB_BasicShape(item); - - shapedString(item->string, item->stringLength, item->item.pos, item->item.length, shapedChars, &slen, - item->item.bidiLevel % 2, - item->attributes, item->log_clusters); - - haveGlyphs = item->font->klass - ->convertStringToGlyphIndices(item->font, - shapedChars, slen, - item->glyphs, &item->num_glyphs, - item->item.bidiLevel % 2); - - HB_FREE_STACKARRAY(shapedChars); - - if (!haveGlyphs) - return FALSE; - - HB_HeuristicPosition(item); - return TRUE; -} - - diff --git a/third_party/harfbuzz/src/harfbuzz-buffer-private.h b/third_party/harfbuzz/src/harfbuzz-buffer-private.h deleted file mode 100644 index 5065f2e031..0000000000 --- a/third_party/harfbuzz/src/harfbuzz-buffer-private.h +++ /dev/null @@ -1,107 +0,0 @@ -/* - * Copyright (C) 1998-2004 David Turner and Werner Lemberg - * Copyright (C) 2004,2007 Red Hat, Inc. - * - * This is part of HarfBuzz, an OpenType Layout engine library. - * - * Permission is hereby granted, without written agreement and without - * license or royalty fees, to use, copy, modify, and distribute this - * software and its documentation for any purpose, provided that the - * above copyright notice and the following two paragraphs appear in - * all copies of this software. - * - * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR - * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES - * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN - * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE. - * - * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, - * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS - * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO - * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. - * - * Red Hat Author(s): Owen Taylor, Behdad Esfahbod - */ - -#ifndef HARFBUZZ_BUFFER_PRIVATE_H -#define HARFBUZZ_BUFFER_PRIVATE_H - -#include "harfbuzz-impl.h" -#include "harfbuzz-buffer.h" - -HB_BEGIN_HEADER - -#define HB_GLYPH_PROPERTIES_UNKNOWN 0xFFFF - -HB_INTERNAL void -_hb_buffer_swap( HB_Buffer buffer ); - -HB_INTERNAL void -_hb_buffer_clear_output( HB_Buffer buffer ); - -HB_INTERNAL HB_Error -_hb_buffer_clear_positions( HB_Buffer buffer ); - -HB_INTERNAL HB_Error -_hb_buffer_add_output_glyphs( HB_Buffer buffer, - HB_UShort num_in, - HB_UShort num_out, - HB_UShort *glyph_data, - HB_UShort component, - HB_UShort ligID ); - -HB_INTERNAL HB_Error -_hb_buffer_add_output_glyph ( HB_Buffer buffer, - HB_UInt glyph_index, - HB_UShort component, - HB_UShort ligID ); - -HB_INTERNAL HB_Error -_hb_buffer_copy_output_glyph ( HB_Buffer buffer ); - -HB_INTERNAL HB_Error -_hb_buffer_replace_output_glyph ( HB_Buffer buffer, - HB_UInt glyph_index, - HB_Bool inplace ); - -HB_INTERNAL HB_UShort -_hb_buffer_allocate_ligid( HB_Buffer buffer ); - - -/* convenience macros */ - -#define IN_GLYPH( pos ) (buffer->in_string[(pos)].gindex) -#define IN_ITEM( pos ) (&buffer->in_string[(pos)]) -#define IN_CURGLYPH() (buffer->in_string[buffer->in_pos].gindex) -#define IN_CURITEM() (&buffer->in_string[buffer->in_pos]) -#define IN_PROPERTIES( pos ) (buffer->in_string[(pos)].properties) -#define IN_LIGID( pos ) (buffer->in_string[(pos)].ligID) -#define IN_COMPONENT( pos ) (buffer->in_string[(pos)].component) -#define POSITION( pos ) (&buffer->positions[(pos)]) -#define OUT_GLYPH( pos ) (buffer->out_string[(pos)].gindex) -#define OUT_ITEM( pos ) (&buffer->out_string[(pos)]) - -#define CHECK_Property( gdef, index, flags, property ) \ - ( ( error = _HB_GDEF_Check_Property( (gdef), (index), (flags), \ - (property) ) ) != HB_Err_Ok ) - -#define ADD_String( buffer, num_in, num_out, glyph_data, component, ligID ) \ - ( ( error = _hb_buffer_add_output_glyphs( (buffer), \ - (num_in), (num_out), \ - (glyph_data), (component), (ligID) \ - ) ) != HB_Err_Ok ) -#define ADD_Glyph( buffer, glyph_index, component, ligID ) \ - ( ( error = _hb_buffer_add_output_glyph( (buffer), \ - (glyph_index), (component), (ligID) \ - ) ) != HB_Err_Ok ) -#define REPLACE_Glyph( buffer, glyph_index, nesting_level ) \ - ( ( error = _hb_buffer_replace_output_glyph( (buffer), (glyph_index), \ - (nesting_level) == 1 ) ) != HB_Err_Ok ) -#define COPY_Glyph( buffer ) \ - ( (error = _hb_buffer_copy_output_glyph ( buffer ) ) != HB_Err_Ok ) - -HB_END_HEADER - -#endif /* HARFBUZZ_BUFFER_PRIVATE_H */ diff --git a/third_party/harfbuzz/src/harfbuzz-buffer.c b/third_party/harfbuzz/src/harfbuzz-buffer.c deleted file mode 100644 index 4d4c16717f..0000000000 --- a/third_party/harfbuzz/src/harfbuzz-buffer.c +++ /dev/null @@ -1,383 +0,0 @@ -/* - * Copyright (C) 1998-2004 David Turner and Werner Lemberg - * Copyright (C) 2004,2007 Red Hat, Inc. - * - * This is part of HarfBuzz, an OpenType Layout engine library. - * - * Permission is hereby granted, without written agreement and without - * license or royalty fees, to use, copy, modify, and distribute this - * software and its documentation for any purpose, provided that the - * above copyright notice and the following two paragraphs appear in - * all copies of this software. - * - * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR - * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES - * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN - * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE. - * - * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, - * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS - * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO - * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. - * - * Red Hat Author(s): Owen Taylor, Behdad Esfahbod - */ - -#include "harfbuzz-impl.h" -#include "harfbuzz-buffer-private.h" -#include "harfbuzz-gsub-private.h" -#include "harfbuzz-gpos-private.h" - -/* Here is how the buffer works internally: - * - * There are two string pointers: in_string and out_string. They - * always have same allocated size, but different length and positions. - * - * As an optimization, both in_string and out_string may point to the - * same piece of memory, which is owned by in_string. This remains the - * case as long as: - * - * - copy_glyph() is called - * - replace_glyph() is called with inplace=TRUE - * - add_output_glyph() and add_output_glyphs() are not called - * - * In that case swap(), and copy_glyph(), and replace_glyph() are all - * mostly no-op. - * - * As soon an add_output_glyph[s]() or replace_glyph() with inplace=FALSE is - * called, out_string is moved over to an alternate buffer (alt_string), and - * its current contents (out_length entries) are copied to the alt buffer. - * This should all remain transparent to the user. swap() then switches - * in_string and alt_string. alt_string is not allocated until its needed, - * but after that it's grown with in_string unconditionally. - * - * The buffer->separate_out boolean keeps status of whether out_string points - * to in_string (FALSE) or alt_string (TRUE). - */ - -/* Internal API */ - -static HB_Error -hb_buffer_ensure( HB_Buffer buffer, - HB_UInt size ) -{ - HB_UInt new_allocated = buffer->allocated; - - if (size > new_allocated) - { - HB_Error error; - - while (size > new_allocated) - new_allocated += (new_allocated >> 1) + 8; - - if ( buffer->positions ) - { - if ( REALLOC_ARRAY( buffer->positions, new_allocated, HB_PositionRec ) ) - return error; - } - - if ( REALLOC_ARRAY( buffer->in_string, new_allocated, HB_GlyphItemRec ) ) - return error; - - if ( buffer->separate_out ) - { - if ( REALLOC_ARRAY( buffer->alt_string, new_allocated, HB_GlyphItemRec ) ) - return error; - - buffer->out_string = buffer->alt_string; - } - else - { - buffer->out_string = buffer->in_string; - - if ( buffer->alt_string ) - { - if ( REALLOC_ARRAY( buffer->alt_string, new_allocated, HB_GlyphItemRec ) ) - return error; - } - } - - buffer->allocated = new_allocated; - } - - return HB_Err_Ok; -} - -static HB_Error -hb_buffer_duplicate_out_buffer( HB_Buffer buffer ) -{ - if ( !buffer->alt_string ) - { - HB_Error error; - - if ( ALLOC_ARRAY( buffer->alt_string, buffer->allocated, HB_GlyphItemRec ) ) - return error; - } - - buffer->out_string = buffer->alt_string; - memcpy( buffer->out_string, buffer->in_string, buffer->out_length * sizeof (buffer->out_string[0]) ); - buffer->separate_out = TRUE; - - return HB_Err_Ok; -} - -/* Public API */ - -HB_Error -hb_buffer_new( HB_Buffer *pbuffer ) -{ - HB_Buffer buffer; - HB_Error error; - - if ( ALLOC( buffer, sizeof( HB_BufferRec ) ) ) - return error; - - buffer->allocated = 0; - buffer->in_string = NULL; - buffer->alt_string = NULL; - buffer->positions = NULL; - - hb_buffer_clear( buffer ); - - *pbuffer = buffer; - - return HB_Err_Ok; -} - -void -hb_buffer_free( HB_Buffer buffer ) -{ - FREE( buffer->in_string ); - FREE( buffer->alt_string ); - buffer->out_string = NULL; - FREE( buffer->positions ); - FREE( buffer ); -} - -void -hb_buffer_clear( HB_Buffer buffer ) -{ - buffer->in_length = 0; - buffer->out_length = 0; - buffer->in_pos = 0; - buffer->out_pos = 0; - buffer->out_string = buffer->in_string; - buffer->separate_out = FALSE; - buffer->max_ligID = 0; -} - -HB_Error -hb_buffer_add_glyph( HB_Buffer buffer, - HB_UInt glyph_index, - HB_UInt properties, - HB_UInt cluster ) -{ - HB_Error error; - HB_GlyphItem glyph; - - error = hb_buffer_ensure( buffer, buffer->in_length + 1 ); - if ( error ) - return error; - - glyph = &buffer->in_string[buffer->in_length]; - glyph->gindex = glyph_index; - glyph->properties = properties; - glyph->cluster = cluster; - glyph->component = 0; - glyph->ligID = 0; - glyph->gproperties = HB_GLYPH_PROPERTIES_UNKNOWN; - - buffer->in_length++; - - return HB_Err_Ok; -} - -/* HarfBuzz-Internal API */ - -HB_INTERNAL void -_hb_buffer_clear_output( HB_Buffer buffer ) -{ - buffer->out_length = 0; - buffer->out_pos = 0; - buffer->out_string = buffer->in_string; - buffer->separate_out = FALSE; -} - -HB_INTERNAL HB_Error -_hb_buffer_clear_positions( HB_Buffer buffer ) -{ - if ( !buffer->positions ) - { - HB_Error error; - - if ( ALLOC_ARRAY( buffer->positions, buffer->allocated, HB_PositionRec ) ) - return error; - } - - memset (buffer->positions, 0, sizeof (buffer->positions[0]) * buffer->in_length); - - return HB_Err_Ok; -} - -HB_INTERNAL void -_hb_buffer_swap( HB_Buffer buffer ) -{ - HB_GlyphItem tmp_string; - int tmp_length; - int tmp_pos; - - if ( buffer->separate_out ) - { - tmp_string = buffer->in_string; - buffer->in_string = buffer->out_string; - buffer->out_string = tmp_string; - buffer->alt_string = buffer->out_string; - } - - tmp_length = buffer->in_length; - buffer->in_length = buffer->out_length; - buffer->out_length = tmp_length; - - tmp_pos = buffer->in_pos; - buffer->in_pos = buffer->out_pos; - buffer->out_pos = tmp_pos; -} - -/* The following function copies `num_out' elements from `glyph_data' - to `buffer->out_string', advancing the in array pointer in the structure - by `num_in' elements, and the out array pointer by `num_out' elements. - Finally, it sets the `length' field of `out' equal to - `pos' of the `out' structure. - - If `component' is 0xFFFF, the component value from buffer->in_pos - will copied `num_out' times, otherwise `component' itself will - be used to fill the `component' fields. - - If `ligID' is 0xFFFF, the ligID value from buffer->in_pos - will copied `num_out' times, otherwise `ligID' itself will - be used to fill the `ligID' fields. - - The properties for all replacement glyphs are taken - from the glyph at position `buffer->in_pos'. - - The cluster value for the glyph at position buffer->in_pos is used - for all replacement glyphs */ -HB_INTERNAL HB_Error -_hb_buffer_add_output_glyphs( HB_Buffer buffer, - HB_UShort num_in, - HB_UShort num_out, - HB_UShort *glyph_data, - HB_UShort component, - HB_UShort ligID ) -{ - HB_Error error; - HB_UShort i; - HB_UInt properties; - HB_UInt cluster; - - error = hb_buffer_ensure( buffer, buffer->out_pos + num_out ); - if ( error ) - return error; - - if ( !buffer->separate_out ) - { - error = hb_buffer_duplicate_out_buffer( buffer ); - if ( error ) - return error; - } - - properties = buffer->in_string[buffer->in_pos].properties; - cluster = buffer->in_string[buffer->in_pos].cluster; - if ( component == 0xFFFF ) - component = buffer->in_string[buffer->in_pos].component; - if ( ligID == 0xFFFF ) - ligID = buffer->in_string[buffer->in_pos].ligID; - - for ( i = 0; i < num_out; i++ ) - { - HB_GlyphItem item = &buffer->out_string[buffer->out_pos + i]; - - item->gindex = glyph_data[i]; - item->properties = properties; - item->cluster = cluster; - item->component = component; - item->ligID = ligID; - item->gproperties = HB_GLYPH_PROPERTIES_UNKNOWN; - } - - buffer->in_pos += num_in; - buffer->out_pos += num_out; - - buffer->out_length = buffer->out_pos; - - return HB_Err_Ok; -} - -HB_INTERNAL HB_Error -_hb_buffer_add_output_glyph( HB_Buffer buffer, - HB_UInt glyph_index, - HB_UShort component, - HB_UShort ligID ) -{ - HB_UShort glyph_data = glyph_index; - - return _hb_buffer_add_output_glyphs ( buffer, 1, 1, - &glyph_data, component, ligID ); -} - -HB_INTERNAL HB_Error -_hb_buffer_copy_output_glyph ( HB_Buffer buffer ) -{ - HB_Error error; - - error = hb_buffer_ensure( buffer, buffer->out_pos + 1 ); - if ( error ) - return error; - - if ( buffer->separate_out ) - { - buffer->out_string[buffer->out_pos] = buffer->in_string[buffer->in_pos]; - } - - buffer->in_pos++; - buffer->out_pos++; - buffer->out_length = buffer->out_pos; - - return HB_Err_Ok; -} - -HB_INTERNAL HB_Error -_hb_buffer_replace_output_glyph( HB_Buffer buffer, - HB_UInt glyph_index, - HB_Bool inplace ) -{ - - HB_Error error; - - if ( inplace ) - { - error = _hb_buffer_copy_output_glyph ( buffer ); - if ( error ) - return error; - - buffer->out_string[buffer->out_pos-1].gindex = glyph_index; - } - else - { - return _hb_buffer_add_output_glyph( buffer, glyph_index, 0xFFFF, 0xFFFF ); - } - - return HB_Err_Ok; -} - -HB_INTERNAL HB_UShort -_hb_buffer_allocate_ligid( HB_Buffer buffer ) -{ - buffer->max_ligID++; - if (HB_UNLIKELY (buffer->max_ligID == 0)) - buffer->max_ligID++; - - return buffer->max_ligID; -} diff --git a/third_party/harfbuzz/src/harfbuzz-buffer.h b/third_party/harfbuzz/src/harfbuzz-buffer.h deleted file mode 100644 index b1344072da..0000000000 --- a/third_party/harfbuzz/src/harfbuzz-buffer.h +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Copyright (C) 1998-2004 David Turner and Werner Lemberg - * Copyright (C) 2004,2007 Red Hat, Inc. - * - * This is part of HarfBuzz, an OpenType Layout engine library. - * - * Permission is hereby granted, without written agreement and without - * license or royalty fees, to use, copy, modify, and distribute this - * software and its documentation for any purpose, provided that the - * above copyright notice and the following two paragraphs appear in - * all copies of this software. - * - * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR - * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES - * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN - * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE. - * - * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, - * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS - * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO - * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. - * - * Red Hat Author(s): Owen Taylor, Behdad Esfahbod - */ - -#ifndef HARFBUZZ_BUFFER_H -#define HARFBUZZ_BUFFER_H - -#include "harfbuzz-global.h" - -HB_BEGIN_HEADER - -typedef struct HB_GlyphItemRec_ { - HB_UInt gindex; - HB_UInt properties; - HB_UInt cluster; - HB_UShort component; - HB_UShort ligID; - HB_UShort gproperties; -} HB_GlyphItemRec, *HB_GlyphItem; - -typedef struct HB_PositionRec_ { - HB_Fixed x_pos; - HB_Fixed y_pos; - HB_Fixed x_advance; - HB_Fixed y_advance; - HB_UShort back; /* number of glyphs to go back - for drawing current glyph */ - HB_Bool new_advance; /* if set, the advance width values are - absolute, i.e., they won't be - added to the original glyph's value - but rather replace them. */ - HB_Short cursive_chain; /* character to which this connects, - may be positive or negative; used - only internally */ -} HB_PositionRec, *HB_Position; - - -typedef struct HB_BufferRec_{ - HB_UInt allocated; - - HB_UInt in_length; - HB_UInt out_length; - HB_UInt in_pos; - HB_UInt out_pos; - - HB_Bool separate_out; - HB_GlyphItem in_string; - HB_GlyphItem out_string; - HB_GlyphItem alt_string; - HB_Position positions; - HB_UShort max_ligID; -} HB_BufferRec, *HB_Buffer; - -HB_Error -hb_buffer_new( HB_Buffer *buffer ); - -void -hb_buffer_free( HB_Buffer buffer ); - -void -hb_buffer_clear( HB_Buffer buffer ); - -HB_Error -hb_buffer_add_glyph( HB_Buffer buffer, - HB_UInt glyph_index, - HB_UInt properties, - HB_UInt cluster ); - -HB_END_HEADER - -#endif /* HARFBUZZ_BUFFER_H */ diff --git a/third_party/harfbuzz/src/harfbuzz-dump-main.c b/third_party/harfbuzz/src/harfbuzz-dump-main.c deleted file mode 100644 index dfb35fbaaf..0000000000 --- a/third_party/harfbuzz/src/harfbuzz-dump-main.c +++ /dev/null @@ -1,97 +0,0 @@ -/* - * Copyright (C) 2000 Red Hat, Inc. - * - * This is part of HarfBuzz, an OpenType Layout engine library. - * - * Permission is hereby granted, without written agreement and without - * license or royalty fees, to use, copy, modify, and distribute this - * software and its documentation for any purpose, provided that the - * above copyright notice and the following two paragraphs appear in - * all copies of this software. - * - * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR - * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES - * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN - * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE. - * - * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, - * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS - * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO - * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. - * - * Red Hat Author(s): Owen Taylor - */ - -#include -#include - -#include "harfbuzz.h" -#include "harfbuzz-dump.h" - -#define N_ELEMENTS(arr) (sizeof(arr)/ sizeof((arr)[0])) - -static int -croak (const char *situation, HB_Error error) -{ - fprintf (stderr, "%s: Error %d\n", situation, error); - - exit (1); -} - -int -main (int argc, char **argv) -{ - HB_Error error; - FT_Library library; - HB_Font font; - HB_GSUB gsub; - HB_GPOS gpos; - - if (argc != 2) - { - fprintf (stderr, "Usage: harfbuzz-dump MYFONT.TTF\n"); - exit(1); - } - - if ((error = FT_Init_FreeType (&library))) - croak ("FT_Init_FreeType", error); - - if ((error = FT_New_Face (library, argv[1], 0, &font))) - croak ("FT_New_Face", error); - - printf ("\n"); - printf ("\n"); - - if (!(error = HB_Load_GSUB_Table (font, &gsub, NULL))) - { - HB_Dump_GSUB_Table (gsub, stdout); - - if ((error = HB_Done_GSUB_Table (gsub))) - croak ("HB_Done_GSUB_Table", error); - } - else if (error != HB_Err_Not_Covered) - fprintf (stderr, "HB_Load_GSUB_Table: error 0x%x\n", error); - - if (!(error = HB_Load_GPOS_Table (font, &gpos, NULL))) - { - HB_Dump_GPOS_Table (gpos, stdout); - - if ((error = HB_Done_GPOS_Table (gpos))) - croak ("HB_Done_GPOS_Table", error); - } - else if (error != HB_Err_Not_Covered) - fprintf (stderr, "HB_Load_GPOS_Table: error 0x%x\n", error); - - printf ("\n"); - - if ((error = FT_Done_Face (font))) - croak ("FT_Done_Face", error); - - if ((error = FT_Done_FreeType (library))) - croak ("FT_Done_FreeType", error); - - return 0; -} - diff --git a/third_party/harfbuzz/src/harfbuzz-dump.c b/third_party/harfbuzz/src/harfbuzz-dump.c deleted file mode 100644 index 8c81da12fc..0000000000 --- a/third_party/harfbuzz/src/harfbuzz-dump.c +++ /dev/null @@ -1,765 +0,0 @@ -/* - * Copyright (C) 2000, 2007 Red Hat, Inc. - * - * This is part of HarfBuzz, an OpenType Layout engine library. - * - * Permission is hereby granted, without written agreement and without - * license or royalty fees, to use, copy, modify, and distribute this - * software and its documentation for any purpose, provided that the - * above copyright notice and the following two paragraphs appear in - * all copies of this software. - * - * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR - * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES - * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN - * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE. - * - * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, - * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS - * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO - * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. - * - * Red Hat Author(s): Owen Taylor, Behdad Esfahbod - */ - -#include "harfbuzz-impl.h" -#include "harfbuzz-dump.h" -#include "harfbuzz-gdef-private.h" -#include "harfbuzz-gsub-private.h" -#include "harfbuzz-gpos-private.h" -#include "harfbuzz-open-private.h" -#include - -#define DUMP(format) dump (stream, indent, format) -#define DUMP1(format, arg1) dump (stream, indent, format, arg1) -#define DUMP2(format, arg1, arg2) dump (stream, indent, format, arg1, arg2) -#define DUMP3(format, arg1, arg2, arg3) dump (stream, indent, format, arg1, arg2, arg3) - -#define DUMP_FINT(strct,fld) dump (stream, indent, "<" #fld ">%d\n", (strct)->fld) -#define DUMP_FUINT(strct,fld) dump (stream, indent, "<" #fld ">%u\n", (strct)->fld) -#define DUMP_FGLYPH(strct,fld) dump (stream, indent, "<" #fld ">%#06x\n", (strct)->fld) -#define DUMP_FGLYPH(strct,fld) dump (stream, indent, "<" #fld ">%#06x\n", (strct)->fld) -#define DUMP_USHORT_ARRAY(strct,fld,cnt) Dump_UShort_Array ((strct)->fld, cnt, #fld, stream, indent); - -#define DEF_DUMP(type) static void Dump_ ## type (HB_ ## type *type, FILE *stream, int indent, HB_Type hb_type) -#define RECURSE(name, type, val) do { DUMP ("<" #name ">\n"); Dump_ ## type (val, stream, indent + 1, hb_type); DUMP ("\n"); } while (0) -#define RECURSE_NUM(name, i, type, val) do { DUMP1 ("<" #name "> \n", i); Dump_ ## type (val, stream, indent + 1, hb_type); DUMP ("\n"); } while (0) -#define DUMP_VALUE_RECORD(val, frmt) do { DUMP ("\n"); Dump_ValueRecord (val, stream, indent + 1, hb_type, frmt); DUMP ("\n"); } while (0) - -static void -do_indent (FILE *stream, int indent) -{ - fprintf (stream, "%*s", indent * 3, ""); -} - -static void -dump (FILE *stream, int indent, const char *format, ...) -{ - va_list list; - - do_indent (stream, indent); - - va_start (list, format); - vfprintf (stream, format, list); - va_end (list); -} - -static void -Dump_UShort_Array (HB_UShort *array, int count, const char *name, FILE *stream, int indent) -{ - int i; - - do_indent (stream, indent); - - fprintf (stream, "<%s>", name); - for (i = 0; i < count; i++) - fprintf (stream, "%d%s", array[i], i == 0 ? "" : " "); - fprintf (stream, "\n", name); -} - -static void -Print_Tag (HB_UInt tag, FILE *stream) -{ - fprintf (stream, "%c%c%c%c", - (unsigned char)(tag >> 24), - (unsigned char)((tag >> 16) & 0xff), - (unsigned char)((tag >> 8) & 0xff), - (unsigned char)(tag & 0xff)); -} - -DEF_DUMP (LangSys) -{ - int i; - - HB_UNUSED(hb_type); - - DUMP_FUINT (LangSys, LookupOrderOffset); - DUMP_FUINT (LangSys, ReqFeatureIndex); - DUMP_FUINT (LangSys, FeatureCount); - - for (i=0; i < LangSys->FeatureCount; i++) - DUMP1("%d\n", LangSys->FeatureIndex[i]); -} - -DEF_DUMP (ScriptTable) -{ - int i; - - RECURSE (DefaultLangSys, LangSys, &ScriptTable->DefaultLangSys); - - DUMP_FUINT (ScriptTable, LangSysCount); - - for (i=0; i < ScriptTable->LangSysCount; i++) - { - do_indent (stream, indent); - fprintf (stream, ""); - Print_Tag (ScriptTable->LangSysRecord[i].LangSysTag, stream); - fprintf (stream, "\n"); - RECURSE_NUM (LangSys, i, LangSys, &ScriptTable->LangSysRecord[i].LangSys); - } -} - -DEF_DUMP (ScriptList) -{ - int i; - - DUMP_FUINT (ScriptList, ScriptCount); - - for (i=0; i < ScriptList->ScriptCount; i++) - { - do_indent (stream, indent); - fprintf (stream, ""); - Print_Tag (ScriptList->ScriptRecord[i].ScriptTag, stream); - fprintf (stream, "\n"); - RECURSE_NUM (Script, i, ScriptTable, &ScriptList->ScriptRecord[i].Script); - } -} - -DEF_DUMP (Feature) -{ - int i; - - HB_UNUSED(hb_type); - - DUMP_FUINT (Feature, FeatureParams); - DUMP_FUINT (Feature, LookupListCount); - - for (i=0; i < Feature->LookupListCount; i++) - DUMP1("%d\n", Feature->LookupListIndex[i]); -} - -DEF_DUMP (MarkRecord) -{ - HB_UNUSED(hb_type); - - DUMP_FUINT (MarkRecord, Class); - DUMP1("%d\n", MarkRecord->MarkAnchor.PosFormat ); -} - -DEF_DUMP (MarkArray) -{ - int i; - - DUMP_FUINT (MarkArray, MarkCount); - - for (i=0; i < MarkArray->MarkCount; i++) - RECURSE_NUM (MarkRecord, i, MarkRecord, &MarkArray->MarkRecord[i]); -} - -DEF_DUMP (FeatureList) -{ - int i; - - DUMP_FUINT (FeatureList, FeatureCount); - - for (i=0; i < FeatureList->FeatureCount; i++) - { - do_indent (stream, indent); - fprintf (stream, ""); - Print_Tag (FeatureList->FeatureRecord[i].FeatureTag, stream); - fprintf (stream, " \n", i); - RECURSE_NUM (Feature, i, Feature, &FeatureList->FeatureRecord[i].Feature); - } -} - -DEF_DUMP (Coverage) -{ - HB_UNUSED(hb_type); - - DUMP_FUINT (Coverage, CoverageFormat); - - if (Coverage->CoverageFormat == 1) - { - int i; - DUMP_FUINT (&Coverage->cf.cf1, GlyphCount); - - for (i = 0; i < Coverage->cf.cf1.GlyphCount; i++) - DUMP2("%#06x \n", - Coverage->cf.cf1.GlyphArray[i], i); - } - else - { - int i; - DUMP_FUINT (&Coverage->cf.cf2, RangeCount); - - for ( i = 0; i < Coverage->cf.cf2.RangeCount; i++ ) - DUMP3("%#06x - %#06x \n", - Coverage->cf.cf2.RangeRecord[i].Start, - Coverage->cf.cf2.RangeRecord[i].End, i); - } -} - -DEF_DUMP (ClassRangeRecord) -{ - HB_UNUSED(hb_type); - - DUMP_FGLYPH (ClassRangeRecord, Start); - DUMP_FGLYPH (ClassRangeRecord, End); - DUMP_FUINT (ClassRangeRecord, Class); -} - -DEF_DUMP (ClassDefinition) -{ - HB_UNUSED(hb_type); - - DUMP_FUINT( ClassDefinition, ClassFormat); - DUMP_FUINT( ClassDefinition, loaded); - - if (ClassDefinition->ClassFormat == 1) - { - int i; - HB_ClassDefFormat1 *ClassDefFormat1 = &ClassDefinition->cd.cd1; - DUMP("\n"); - DUMP_FUINT (ClassDefFormat1, StartGlyph ); - DUMP_FUINT (ClassDefFormat1, GlyphCount ); - for (i = 0; i < ClassDefFormat1->GlyphCount; i++) - DUMP2(" %d ", ClassDefFormat1->ClassValueArray[i], - ClassDefFormat1->StartGlyph+i ); - } - else if (ClassDefinition->ClassFormat == 2) - { - int i; - HB_ClassDefFormat2 *ClassDefFormat2 = &ClassDefinition->cd.cd2; - DUMP_FUINT (ClassDefFormat2, ClassRangeCount); - - for (i = 0; i < ClassDefFormat2->ClassRangeCount; i++) - RECURSE_NUM (ClassRangeRecord, i, ClassRangeRecord, &ClassDefFormat2->ClassRangeRecord[i]); - } - else - fprintf(stderr, "invalid class def table!!!\n"); -} - -DEF_DUMP (SubstLookupRecord) -{ - HB_UNUSED(hb_type); - - DUMP_FUINT (SubstLookupRecord, SequenceIndex); - DUMP_FUINT (SubstLookupRecord, LookupListIndex); -} - -DEF_DUMP (ChainSubClassRule) -{ - int i; - - DUMP_USHORT_ARRAY (ChainSubClassRule, Backtrack, ChainSubClassRule->BacktrackGlyphCount); - DUMP_USHORT_ARRAY (ChainSubClassRule, Input, ChainSubClassRule->InputGlyphCount - 1); - DUMP_USHORT_ARRAY (ChainSubClassRule, Lookahead, ChainSubClassRule->LookaheadGlyphCount); - - for (i = 0; i < ChainSubClassRule->SubstCount; i++) - RECURSE_NUM (SubstLookupRecord, i, SubstLookupRecord, &ChainSubClassRule->SubstLookupRecord[i]); - - indent--; -} - -DEF_DUMP (ChainSubClassSet) -{ - int i; - - DUMP_FUINT( ChainSubClassSet, ChainSubClassRuleCount ); - for (i = 0; i < ChainSubClassSet->ChainSubClassRuleCount; i++) - RECURSE_NUM (ChainSubClassRule, i, ChainSubClassRule, &ChainSubClassSet->ChainSubClassRule[i]); -} - -static void -Dump_GSUB_Lookup_Single (HB_SubTable *subtable, FILE *stream, int indent, HB_Type hb_type) -{ - HB_SingleSubst *SingleSubst = &subtable->st.gsub.single; - - DUMP_FUINT (SingleSubst, SubstFormat); - RECURSE (Coverage, Coverage, &SingleSubst->Coverage); - - if (SingleSubst->SubstFormat == 1) - { - DUMP_FINT (&SingleSubst->ssf.ssf1, DeltaGlyphID); - } - else - { - int i; - - DUMP_FINT (&SingleSubst->ssf.ssf2, GlyphCount); - for (i=0; i < SingleSubst->ssf.ssf2.GlyphCount; i++) - DUMP2("%#06x \n", SingleSubst->ssf.ssf2.Substitute[i], i); - } -} - -DEF_DUMP (Ligature) -{ - int i; - - HB_UNUSED(hb_type); - - DUMP_FGLYPH (Ligature, LigGlyph); - DUMP_FUINT (Ligature, ComponentCount); - - for (i=0; i < Ligature->ComponentCount - 1; i++) - DUMP1("%#06x\n", Ligature->Component[i]); -} - -DEF_DUMP (LigatureSet) -{ - int i; - - DUMP_FUINT (LigatureSet, LigatureCount); - - for (i=0; i < LigatureSet->LigatureCount; i++) - RECURSE_NUM (Ligature, i, Ligature, &LigatureSet->Ligature[i]); -} - -static void -Dump_GSUB_Lookup_Ligature (HB_SubTable *subtable, FILE *stream, int indent, HB_Type hb_type) -{ - int i; - HB_LigatureSubst *LigatureSubst = &subtable->st.gsub.ligature; - - DUMP_FUINT (LigatureSubst, SubstFormat); - RECURSE (Coverage, Coverage, &LigatureSubst->Coverage); - - DUMP_FUINT (LigatureSubst, LigatureSetCount); - - for (i=0; i < LigatureSubst->LigatureSetCount; i++) - RECURSE_NUM (LigatureSet, i, LigatureSet, &LigatureSubst->LigatureSet[i]); -} - -DEF_DUMP (ContextSubstFormat1) -{ - HB_UNUSED(hb_type); - HB_UNUSED(ContextSubstFormat1); - - - DUMP("\n"); -} - -DEF_DUMP (ContextSubstFormat2) -{ - DUMP_FUINT (ContextSubstFormat2, MaxContextLength); - RECURSE (Coverage, Coverage, &ContextSubstFormat2->Coverage); - RECURSE (ClassDefinition, ClassDefinition, &ContextSubstFormat2->ClassDef); -} - -DEF_DUMP (ContextSubstFormat3) -{ - HB_UNUSED(hb_type); - HB_UNUSED(ContextSubstFormat3); - - DUMP("\n"); -} - -static void -Dump_GSUB_Lookup_Context (HB_SubTable *subtable, FILE *stream, int indent, HB_Type hb_type) -{ - HB_ContextSubst *ContextSubst = &subtable->st.gsub.context; - - DUMP_FUINT (ContextSubst, SubstFormat); - switch( ContextSubst->SubstFormat ) - { - case 1: - Dump_ContextSubstFormat1 (&ContextSubst->csf.csf1, stream, indent+2, hb_type); - break; - case 2: - Dump_ContextSubstFormat2 (&ContextSubst->csf.csf2, stream, indent+2, hb_type); - break; - case 3: - Dump_ContextSubstFormat3 (&ContextSubst->csf.csf3, stream, indent+2, hb_type); - break; - default: - fprintf(stderr, "invalid subformat!!!!!\n"); - } -} - -DEF_DUMP (ChainContextSubstFormat1) -{ - HB_UNUSED(hb_type); - HB_UNUSED(ChainContextSubstFormat1); - - DUMP("\n"); -} - -DEF_DUMP (ChainContextSubstFormat2) -{ - int i; - - RECURSE (Coverage, Coverage, &ChainContextSubstFormat2->Coverage); - DUMP_FUINT (ChainContextSubstFormat2, MaxBacktrackLength); - RECURSE (ClassDefinition, ClassDefinition, &ChainContextSubstFormat2->BacktrackClassDef); - DUMP_FUINT (ChainContextSubstFormat2, MaxInputLength); - RECURSE (ClassDefinition, ClassDefinition, &ChainContextSubstFormat2->InputClassDef); - DUMP_FUINT (ChainContextSubstFormat2, MaxLookaheadLength); - RECURSE (ClassDefinition, ClassDefinition, &ChainContextSubstFormat2->LookaheadClassDef); - - DUMP_FUINT (ChainContextSubstFormat2, ChainSubClassSetCount); - for (i = 0; i < ChainContextSubstFormat2->ChainSubClassSetCount; i++) - RECURSE (ChainSubClassSet, ChainSubClassSet, &ChainContextSubstFormat2->ChainSubClassSet[i]); -} - -DEF_DUMP (ChainContextSubstFormat3) -{ - int i; - - DUMP_FUINT (ChainContextSubstFormat3, BacktrackGlyphCount); - for (i = 0; i < ChainContextSubstFormat3->BacktrackGlyphCount; i++) - RECURSE (BacktrackCoverage, Coverage, &ChainContextSubstFormat3->BacktrackCoverage[i]); - DUMP_FUINT (ChainContextSubstFormat3, InputGlyphCount); - for (i = 0; i < ChainContextSubstFormat3->InputGlyphCount; i++) - RECURSE (InputCoverage, Coverage, &ChainContextSubstFormat3->InputCoverage[i]); - DUMP_FUINT (ChainContextSubstFormat3, LookaheadGlyphCount); - for (i = 0; i < ChainContextSubstFormat3->LookaheadGlyphCount; i++) - RECURSE (LookaheadCoverage, Coverage, &ChainContextSubstFormat3->LookaheadCoverage[i]); - - for (i = 0; i < ChainContextSubstFormat3->SubstCount; i++) - RECURSE_NUM (SubstLookupRecord, i, SubstLookupRecord, &ChainContextSubstFormat3->SubstLookupRecord[i]); - -} - -static void -Dump_GSUB_Lookup_Chain (HB_SubTable *subtable, FILE *stream, int indent, HB_Type hb_type) -{ - HB_ChainContextSubst *chain = &subtable->st.gsub.chain; - - DUMP_FUINT (chain, SubstFormat); - switch (chain->SubstFormat) - { - case 1: - Dump_ChainContextSubstFormat1 (&chain->ccsf.ccsf1, stream, indent+2, hb_type); - break; - case 2: - Dump_ChainContextSubstFormat2 (&chain->ccsf.ccsf2, stream, indent+2, hb_type); - break; - case 3: - Dump_ChainContextSubstFormat3 (&chain->ccsf.ccsf3, stream, indent+2, hb_type); - break; - default: - fprintf(stderr, "invalid subformat!!!!!\n"); - } -} - -static void -Dump_Device (HB_Device *Device, FILE *stream, int indent, HB_Type hb_type) -{ - int i; - int bits; - int n_per; - unsigned int mask; - - HB_UNUSED(hb_type); - - DUMP_FUINT (Device, StartSize); - DUMP_FUINT (Device, EndSize); - DUMP_FUINT (Device, DeltaFormat); - switch (Device->DeltaFormat) - { - case 1: - bits = 2; - break; - case 2: - bits = 4; - break; - case 3: - bits = 8; - break; - default: - bits = 0; - break; - } - - DUMP (""); - if (!bits) - { - - fprintf(stderr, "invalid DeltaFormat!!!!!\n"); - } - else - { - n_per = 16 / bits; - mask = (1 << bits) - 1; - mask = mask << (16 - bits); - - for (i = Device->StartSize; i <= Device->EndSize ; i++) - { - HB_UShort val = Device->DeltaValue[i / n_per]; - HB_Short signed_val = ((val << ((i % n_per) * bits)) & mask); - dump (stream, indent, "%d", signed_val >> (16 - bits)); - if (i != Device->EndSize) - DUMP (", "); - } - } - DUMP ("\n"); -} - -static void -Dump_ValueRecord (HB_ValueRecord *ValueRecord, FILE *stream, int indent, HB_Type hb_type, HB_UShort value_format) -{ - if (value_format & HB_GPOS_FORMAT_HAVE_X_PLACEMENT) - DUMP_FINT (ValueRecord, XPlacement); - if (value_format & HB_GPOS_FORMAT_HAVE_Y_PLACEMENT) - DUMP_FINT (ValueRecord, YPlacement); - if (value_format & HB_GPOS_FORMAT_HAVE_X_ADVANCE) - DUMP_FINT (ValueRecord, XAdvance); - if (value_format & HB_GPOS_FORMAT_HAVE_Y_ADVANCE) - DUMP_FINT (ValueRecord, XAdvance); - if (value_format & HB_GPOS_FORMAT_HAVE_X_PLACEMENT_DEVICE) - RECURSE (Device, Device, &ValueRecord->XPlacementDevice); - if (value_format & HB_GPOS_FORMAT_HAVE_Y_PLACEMENT_DEVICE) - RECURSE (Device, Device, &ValueRecord->YPlacementDevice); - if (value_format & HB_GPOS_FORMAT_HAVE_X_ADVANCE_DEVICE) - RECURSE (Device, Device, &ValueRecord->XAdvanceDevice); - if (value_format & HB_GPOS_FORMAT_HAVE_Y_ADVANCE_DEVICE) - RECURSE (Device, Device, &ValueRecord->YAdvanceDevice); - if (value_format & HB_GPOS_FORMAT_HAVE_X_ID_PLACEMENT) - DUMP_FUINT (ValueRecord, XIdPlacement); - if (value_format & HB_GPOS_FORMAT_HAVE_Y_ID_PLACEMENT) - DUMP_FUINT (ValueRecord, YIdPlacement); - if (value_format & HB_GPOS_FORMAT_HAVE_X_ID_ADVANCE) - DUMP_FUINT (ValueRecord, XIdAdvance); - if (value_format & HB_GPOS_FORMAT_HAVE_Y_ID_ADVANCE) - DUMP_FUINT (ValueRecord, XIdAdvance); -} - -static void -Dump_GPOS_Lookup_Single (HB_SubTable *subtable, FILE *stream, int indent, HB_Type hb_type) -{ - HB_SinglePos *SinglePos = &subtable->st.gpos.single; - - DUMP_FUINT (SinglePos, PosFormat); - RECURSE (Coverage, Coverage, &SinglePos->Coverage); - - DUMP_FUINT (SinglePos, ValueFormat); - - if (SinglePos->PosFormat == 1) - { - DUMP_VALUE_RECORD (&SinglePos->spf.spf1.Value, SinglePos->ValueFormat); - } - else - { - int i; - - DUMP_FUINT (&SinglePos->spf.spf2, ValueCount); - for (i = 0; i < SinglePos->spf.spf2.ValueCount; i++) - DUMP_VALUE_RECORD (&SinglePos->spf.spf2.Value[i], SinglePos->ValueFormat); - } -} - -static void -Dump_PairValueRecord (HB_PairValueRecord *PairValueRecord, FILE *stream, int indent, HB_Type hb_type, HB_UShort ValueFormat1, HB_UShort ValueFormat2) -{ - DUMP_FUINT (PairValueRecord, SecondGlyph); - DUMP_VALUE_RECORD (&PairValueRecord->Value1, ValueFormat1); - DUMP_VALUE_RECORD (&PairValueRecord->Value2, ValueFormat2); -} - -static void -Dump_PairSet (HB_PairSet *PairSet, FILE *stream, int indent, HB_Type hb_type, HB_UShort ValueFormat1, HB_UShort ValueFormat2) -{ - int i; - DUMP_FUINT (PairSet, PairValueCount); - - for (i = 0; i < PairSet->PairValueCount; i++) - { - DUMP ("\n"); - Dump_PairValueRecord (&PairSet->PairValueRecord[i], stream, indent + 1, hb_type, ValueFormat1, ValueFormat2); - DUMP ("\n"); - } -} - -static void -Dump_GPOS_Lookup_Pair (HB_SubTable *subtable, FILE *stream, int indent, HB_Type hb_type) -{ - HB_PairPos *PairPos = &subtable->st.gpos.pair; - - DUMP_FUINT (PairPos, PosFormat); - RECURSE (Coverage, Coverage, &PairPos->Coverage); - - DUMP_FUINT (PairPos, ValueFormat1); - DUMP_FUINT (PairPos, ValueFormat2); - - if (PairPos->PosFormat == 1) - { - int i; - - DUMP_FUINT (&PairPos->ppf.ppf1, PairSetCount); - for (i = 0; i < PairPos->ppf.ppf1.PairSetCount; i++) - { - DUMP ("\n"); - Dump_PairSet (&PairPos->ppf.ppf1.PairSet[i], stream, indent + 1, hb_type, PairPos->ValueFormat1, PairPos->ValueFormat2); - DUMP ("\n"); - } - } - else - { - } -} - -static void -Dump_GPOS_Lookup_Markbase (HB_SubTable *subtable, FILE *stream, int indent, HB_Type hb_type) -{ - int i; - HB_MarkBasePos *markbase = &subtable->st.gpos.markbase; - - DUMP_FUINT (markbase, PosFormat); - RECURSE (Coverage, Coverage, &markbase->MarkCoverage); - RECURSE (Coverage, Coverage, &markbase->BaseCoverage); - DUMP_FUINT (markbase, ClassCount); - RECURSE (MarkArray, MarkArray, &markbase->MarkArray); - - DUMP ("\n"); - indent++; - - DUMP_FUINT (&markbase->BaseArray, BaseCount); - for (i = 0; i < markbase->BaseArray.BaseCount; i++) - { - int j; - HB_BaseRecord *r = &markbase->BaseArray.BaseRecord[i]; - DUMP1 (" \n", i); - for (j = 0; j < markbase->ClassCount; j++) - DUMP1 (" %d\n", r->BaseAnchor->PosFormat); - DUMP ("\n"); - } - - indent--; - DUMP ("\n"); -} - -DEF_DUMP (Lookup) -{ - int i; - const char *lookup_name; - void (*lookup_func) (HB_SubTable *subtable, FILE *stream, int indent, HB_Type hb_type) = NULL; - - if (hb_type == HB_Type_GSUB) - { - switch (Lookup->LookupType) - { - case HB_GSUB_LOOKUP_SINGLE: - lookup_name = "SINGLE"; - lookup_func = Dump_GSUB_Lookup_Single; - break; - case HB_GSUB_LOOKUP_MULTIPLE: - lookup_name = "MULTIPLE"; - break; - case HB_GSUB_LOOKUP_ALTERNATE: - lookup_name = "ALTERNATE"; - break; - case HB_GSUB_LOOKUP_LIGATURE: - lookup_name = "LIGATURE"; - lookup_func = Dump_GSUB_Lookup_Ligature; - break; - case HB_GSUB_LOOKUP_CONTEXT: - lookup_name = "CONTEXT"; - lookup_func = Dump_GSUB_Lookup_Context; - break; - case HB_GSUB_LOOKUP_CHAIN: - lookup_name = "CHAIN"; - lookup_func = Dump_GSUB_Lookup_Chain; - break; - default: - lookup_name = "(unknown)"; - lookup_func = NULL; - break; - } - } - else - { - switch (Lookup->LookupType) - { - case HB_GPOS_LOOKUP_SINGLE: - lookup_name = "SINGLE"; - lookup_func = Dump_GPOS_Lookup_Single; - break; - case HB_GPOS_LOOKUP_PAIR: - lookup_name = "PAIR"; - lookup_func = Dump_GPOS_Lookup_Pair; - break; - case HB_GPOS_LOOKUP_CURSIVE: - lookup_name = "CURSIVE"; - break; - case HB_GPOS_LOOKUP_MARKBASE: - lookup_name = "MARKBASE"; - lookup_func = Dump_GPOS_Lookup_Markbase; - break; - case HB_GPOS_LOOKUP_MARKLIG: - lookup_name = "MARKLIG"; - break; - case HB_GPOS_LOOKUP_MARKMARK: - lookup_name = "MARKMARK"; - break; - case HB_GPOS_LOOKUP_CONTEXT: - lookup_name = "CONTEXT"; - break; - case HB_GPOS_LOOKUP_CHAIN: - lookup_name = "CHAIN"; - break; - default: - lookup_name = "(unknown)"; - lookup_func = NULL; - break; - } - } - - DUMP2("%s \n", lookup_name, Lookup->LookupType); - DUMP1("%#06x\n", Lookup->LookupFlag); - - for (i=0; i < Lookup->SubTableCount; i++) - { - DUMP ("\n"); - if (lookup_func) - (*lookup_func) (&Lookup->SubTable[i], stream, indent + 1, hb_type); - DUMP ("\n"); - } -} - -DEF_DUMP (LookupList) -{ - int i; - - DUMP_FUINT (LookupList, LookupCount); - - for (i=0; i < LookupList->LookupCount; i++) - RECURSE_NUM (Lookup, i, Lookup, &LookupList->Lookup[i]); -} - -void -HB_Dump_GSUB_Table (HB_GSUB gsub, FILE *stream) -{ - int indent = 1; - HB_Type hb_type = HB_Type_GSUB; - - do_indent (stream, indent); - fprintf(stream, "\n"); - RECURSE (ScriptList, ScriptList, &gsub->ScriptList); - RECURSE (FeatureList, FeatureList, &gsub->FeatureList); - RECURSE (LookupList, LookupList, &gsub->LookupList); -} - -void -HB_Dump_GPOS_Table (HB_GPOS gpos, FILE *stream) -{ - int indent = 1; - HB_Type hb_type = HB_Type_GPOS; - - do_indent (stream, indent); - fprintf(stream, "\n"); - RECURSE (ScriptList, ScriptList, &gpos->ScriptList); - RECURSE (FeatureList, FeatureList, &gpos->FeatureList); - RECURSE (LookupList, LookupList, &gpos->LookupList); -} diff --git a/third_party/harfbuzz/src/harfbuzz-dump.h b/third_party/harfbuzz/src/harfbuzz-dump.h deleted file mode 100644 index ea4a62b2e1..0000000000 --- a/third_party/harfbuzz/src/harfbuzz-dump.h +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (C) 2000, 2007 Red Hat, Inc. - * - * This is part of HarfBuzz, an OpenType Layout engine library. - * - * Permission is hereby granted, without written agreement and without - * license or royalty fees, to use, copy, modify, and distribute this - * software and its documentation for any purpose, provided that the - * above copyright notice and the following two paragraphs appear in - * all copies of this software. - * - * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR - * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES - * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN - * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE. - * - * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, - * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS - * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO - * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. - * - * Red Hat Author(s): Owen Taylor, Behdad Esfahbod - */ - -#ifndef HARFBUZZ_DUMP_H -#define HARFBUZZ_DUMP_H - -#include -#include "harfbuzz-gsub.h" -#include "harfbuzz-gpos.h" - -HB_BEGIN_HEADER - -void HB_Dump_GSUB_Table (HB_GSUB gsub, FILE *stream); -void HB_Dump_GPOS_Table (HB_GPOS gpos, FILE *stream); - -HB_END_HEADER - -#endif /* HARFBUZZ_DUMP_H */ diff --git a/third_party/harfbuzz/src/harfbuzz-external.h b/third_party/harfbuzz/src/harfbuzz-external.h deleted file mode 100644 index 760749b950..0000000000 --- a/third_party/harfbuzz/src/harfbuzz-external.h +++ /dev/null @@ -1,157 +0,0 @@ -/* - * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) - * - * This is part of HarfBuzz, an OpenType Layout engine library. - * - * Permission is hereby granted, without written agreement and without - * license or royalty fees, to use, copy, modify, and distribute this - * software and its documentation for any purpose, provided that the - * above copyright notice and the following two paragraphs appear in - * all copies of this software. - * - * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR - * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES - * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN - * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE. - * - * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, - * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS - * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO - * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. - */ - -#ifndef HARFBUZZ_EXTERNAL_H -#define HARFBUZZ_EXTERNAL_H - -#include "harfbuzz-global.h" - -HB_BEGIN_HEADER - -/* This header contains some methods that are not part of - Harfbuzz itself, but referenced by it. - They need to be provided by the application/library -*/ - - -/* - see http://www.unicode.org/reports/tr14/tr14-19.html - we don't use the XX, AI and CB properties and map them to AL instead. - as we don't support any EBDIC based OS'es, NL is ignored and mapped to AL as well. -*/ -typedef enum { - HB_LineBreak_OP, HB_LineBreak_CL, HB_LineBreak_QU, HB_LineBreak_GL, HB_LineBreak_NS, - HB_LineBreak_EX, HB_LineBreak_SY, HB_LineBreak_IS, HB_LineBreak_PR, HB_LineBreak_PO, - HB_LineBreak_NU, HB_LineBreak_AL, HB_LineBreak_ID, HB_LineBreak_IN, HB_LineBreak_HY, - HB_LineBreak_BA, HB_LineBreak_BB, HB_LineBreak_B2, HB_LineBreak_ZW, HB_LineBreak_CM, - HB_LineBreak_WJ, HB_LineBreak_H2, HB_LineBreak_H3, HB_LineBreak_JL, HB_LineBreak_JV, - HB_LineBreak_JT, HB_LineBreak_SA, HB_LineBreak_SG, - HB_LineBreak_SP, HB_LineBreak_CR, HB_LineBreak_LF, HB_LineBreak_BK -} HB_LineBreakClass; - -typedef enum -{ - HB_NoCategory, - - HB_Mark_NonSpacing, /* Mn */ - HB_Mark_SpacingCombining, /* Mc */ - HB_Mark_Enclosing, /* Me */ - - HB_Number_DecimalDigit, /* Nd */ - HB_Number_Letter, /* Nl */ - HB_Number_Other, /* No */ - - HB_Separator_Space, /* Zs */ - HB_Separator_Line, /* Zl */ - HB_Separator_Paragraph, /* Zp */ - - HB_Other_Control, /* Cc */ - HB_Other_Format, /* Cf */ - HB_Other_Surrogate, /* Cs */ - HB_Other_PrivateUse, /* Co */ - HB_Other_NotAssigned, /* Cn */ - - HB_Letter_Uppercase, /* Lu */ - HB_Letter_Lowercase, /* Ll */ - HB_Letter_Titlecase, /* Lt */ - HB_Letter_Modifier, /* Lm */ - HB_Letter_Other, /* Lo */ - - HB_Punctuation_Connector, /* Pc */ - HB_Punctuation_Dash, /* Pd */ - HB_Punctuation_Open, /* Ps */ - HB_Punctuation_Close, /* Pe */ - HB_Punctuation_InitialQuote, /* Pi */ - HB_Punctuation_FinalQuote, /* Pf */ - HB_Punctuation_Other, /* Po */ - - HB_Symbol_Math, /* Sm */ - HB_Symbol_Currency, /* Sc */ - HB_Symbol_Modifier, /* Sk */ - HB_Symbol_Other /* So */ -} HB_CharCategory; - -typedef enum -{ - HB_Grapheme_Other, - HB_Grapheme_CR, - HB_Grapheme_LF, - HB_Grapheme_Control, - HB_Grapheme_Extend, - HB_Grapheme_L, - HB_Grapheme_V, - HB_Grapheme_T, - HB_Grapheme_LV, - HB_Grapheme_LVT -} HB_GraphemeClass; - - -typedef enum -{ - HB_Word_Other, - HB_Word_Format, - HB_Word_Katakana, - HB_Word_ALetter, - HB_Word_MidLetter, - HB_Word_MidNum, - HB_Word_Numeric, - HB_Word_ExtendNumLet -} HB_WordClass; - - -typedef enum -{ - HB_Sentence_Other, - HB_Sentence_Sep, - HB_Sentence_Format, - HB_Sentence_Sp, - HB_Sentence_Lower, - HB_Sentence_Upper, - HB_Sentence_OLetter, - HB_Sentence_Numeric, - HB_Sentence_ATerm, - HB_Sentence_STerm, - HB_Sentence_Close -} HB_SentenceClass; - -HB_GraphemeClass HB_GetGraphemeClass(HB_UChar32 ch); -HB_WordClass HB_GetWordClass(HB_UChar32 ch); -HB_SentenceClass HB_GetSentenceClass(HB_UChar32 ch); -HB_LineBreakClass HB_GetLineBreakClass(HB_UChar32 ch); - -void HB_GetGraphemeAndLineBreakClass(HB_UChar32 ch, HB_GraphemeClass *grapheme, HB_LineBreakClass *lineBreak); -void HB_GetUnicodeCharProperties(HB_UChar32 ch, HB_CharCategory *category, int *combiningClass); -HB_CharCategory HB_GetUnicodeCharCategory(HB_UChar32 ch); -int HB_GetUnicodeCharCombiningClass(HB_UChar32 ch); -HB_UChar16 HB_GetMirroredChar(HB_UChar16 ch); - -void *HB_Library_Resolve(const char *library, const char *symbol); - -void *HB_TextCodecForMib(int mib); -char *HB_TextCodec_ConvertFromUnicode(void *codec, const HB_UChar16 *unicode, hb_uint32 length, hb_uint32 *outputLength); -void HB_TextCodec_FreeResult(char *); - -HB_END_HEADER - -#endif diff --git a/third_party/harfbuzz/src/harfbuzz-gdef-private.h b/third_party/harfbuzz/src/harfbuzz-gdef-private.h deleted file mode 100644 index da06b6fb94..0000000000 --- a/third_party/harfbuzz/src/harfbuzz-gdef-private.h +++ /dev/null @@ -1,124 +0,0 @@ -/* - * Copyright (C) 1998-2004 David Turner and Werner Lemberg - * Copyright (C) 2006 Behdad Esfahbod - * - * This is part of HarfBuzz, an OpenType Layout engine library. - * - * Permission is hereby granted, without written agreement and without - * license or royalty fees, to use, copy, modify, and distribute this - * software and its documentation for any purpose, provided that the - * above copyright notice and the following two paragraphs appear in - * all copies of this software. - * - * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR - * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES - * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN - * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE. - * - * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, - * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS - * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO - * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. - */ - -#ifndef HARFBUZZ_GDEF_PRIVATE_H -#define HARFBUZZ_GDEF_PRIVATE_H - -#include "harfbuzz-impl.h" -#include "harfbuzz-stream-private.h" -#include "harfbuzz-buffer-private.h" -#include "harfbuzz-gdef.h" - -HB_BEGIN_HEADER - - -/* Attachment related structures */ - -struct HB_AttachPoint_ -{ - HB_UShort PointCount; /* size of the PointIndex array */ - HB_UShort* PointIndex; /* array of contour points */ -}; - -/* Ligature Caret related structures */ - -struct HB_CaretValueFormat1_ -{ - HB_Short Coordinate; /* x or y value (in design units) */ -}; - -typedef struct HB_CaretValueFormat1_ HB_CaretValueFormat1; - - -struct HB_CaretValueFormat2_ -{ - HB_UShort CaretValuePoint; /* contour point index on glyph */ -}; - -typedef struct HB_CaretValueFormat2_ HB_CaretValueFormat2; - - -struct HB_CaretValueFormat3_ -{ - HB_Short Coordinate; /* x or y value (in design units) */ - HB_Device Device; /* Device table for x or y value */ -}; - -typedef struct HB_CaretValueFormat3_ HB_CaretValueFormat3; - - -struct HB_CaretValueFormat4_ -{ - HB_UShort IdCaretValue; /* metric ID */ -}; - -typedef struct HB_CaretValueFormat4_ HB_CaretValueFormat4; - - -struct HB_CaretValue_ -{ - HB_UShort CaretValueFormat; /* 1, 2, 3, or 4 */ - - union - { - HB_CaretValueFormat1 cvf1; - HB_CaretValueFormat2 cvf2; - HB_CaretValueFormat3 cvf3; - HB_CaretValueFormat4 cvf4; - } cvf; -}; - -typedef struct HB_CaretValue_ HB_CaretValue; - - -struct HB_LigGlyph_ -{ - HB_Bool loaded; - - HB_UShort CaretCount; /* number of caret values */ - HB_CaretValue* CaretValue; /* array of caret values */ -}; - - -HB_INTERNAL HB_Error -_HB_GDEF_Add_Glyph_Property( HB_GDEFHeader* gdef, - HB_UShort glyphID, - HB_UShort property ); - -HB_INTERNAL HB_Error -_HB_GDEF_Check_Property( HB_GDEFHeader* gdef, - HB_GlyphItem item, - HB_UShort flags, - HB_UShort* property ); - -HB_INTERNAL HB_Error -_HB_GDEF_LoadMarkAttachClassDef_From_LookupFlags( HB_GDEFHeader* gdef, - HB_Stream input, - HB_Lookup* lo, - HB_UShort num_lookups ); - -HB_END_HEADER - -#endif /* HARFBUZZ_GDEF_PRIVATE_H */ diff --git a/third_party/harfbuzz/src/harfbuzz-gdef.c b/third_party/harfbuzz/src/harfbuzz-gdef.c deleted file mode 100644 index ff3a1f4738..0000000000 --- a/third_party/harfbuzz/src/harfbuzz-gdef.c +++ /dev/null @@ -1,1159 +0,0 @@ -/* - * Copyright (C) 1998-2004 David Turner and Werner Lemberg - * Copyright (C) 2006 Behdad Esfahbod - * - * This is part of HarfBuzz, an OpenType Layout engine library. - * - * Permission is hereby granted, without written agreement and without - * license or royalty fees, to use, copy, modify, and distribute this - * software and its documentation for any purpose, provided that the - * above copyright notice and the following two paragraphs appear in - * all copies of this software. - * - * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR - * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES - * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN - * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE. - * - * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, - * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS - * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO - * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. - */ - -#include "harfbuzz-impl.h" -#include "harfbuzz-gdef-private.h" -#include "harfbuzz-open-private.h" - -static HB_Error Load_AttachList( HB_AttachList* al, - HB_Stream stream ); -static HB_Error Load_LigCaretList( HB_LigCaretList* lcl, - HB_Stream stream ); - -static void Free_AttachList( HB_AttachList* al); -static void Free_LigCaretList( HB_LigCaretList* lcl); - -static void Free_NewGlyphClasses( HB_GDEFHeader* gdef); - - - -/* GDEF glyph classes */ - -#define UNCLASSIFIED_GLYPH 0 -#define SIMPLE_GLYPH 1 -#define LIGATURE_GLYPH 2 -#define MARK_GLYPH 3 -#define COMPONENT_GLYPH 4 - - - - - - -HB_Error HB_New_GDEF_Table( HB_GDEFHeader** retptr ) -{ - HB_Error error; - - HB_GDEFHeader* gdef; - - if ( !retptr ) - return ERR(HB_Err_Invalid_Argument); - - if ( ALLOC( gdef, sizeof( *gdef ) ) ) - return error; - - gdef->GlyphClassDef.loaded = FALSE; - gdef->AttachList.loaded = FALSE; - gdef->LigCaretList.loaded = FALSE; - gdef->MarkAttachClassDef_offset = 0; - gdef->MarkAttachClassDef.loaded = FALSE; - - gdef->LastGlyph = 0; - gdef->NewGlyphClasses = NULL; - - *retptr = gdef; - - return HB_Err_Ok; -} - - -HB_Error HB_Load_GDEF_Table( HB_Stream stream, - HB_GDEFHeader** retptr ) -{ - HB_Error error; - HB_UInt cur_offset, new_offset, base_offset; - - HB_GDEFHeader* gdef; - - - if ( !retptr ) - return ERR(HB_Err_Invalid_Argument); - - if ( GOTO_Table( TTAG_GDEF ) ) - return error; - - if (( error = HB_New_GDEF_Table ( &gdef ) )) - return error; - - base_offset = FILE_Pos(); - - /* skip version */ - - if ( FILE_Seek( base_offset + 4L ) || - ACCESS_Frame( 2L ) ) - goto Fail0; - - new_offset = GET_UShort(); - - FORGET_Frame(); - - /* all GDEF subtables are optional */ - - if ( new_offset ) - { - new_offset += base_offset; - - /* only classes 1-4 are allowed here */ - - cur_offset = FILE_Pos(); - if ( FILE_Seek( new_offset ) || - ( error = _HB_OPEN_Load_ClassDefinition( &gdef->GlyphClassDef, 5, - stream ) ) != HB_Err_Ok ) - goto Fail0; - (void)FILE_Seek( cur_offset ); - } - - if ( ACCESS_Frame( 2L ) ) - goto Fail1; - - new_offset = GET_UShort(); - - FORGET_Frame(); - - if ( new_offset ) - { - new_offset += base_offset; - - cur_offset = FILE_Pos(); - if ( FILE_Seek( new_offset ) || - ( error = Load_AttachList( &gdef->AttachList, - stream ) ) != HB_Err_Ok ) - goto Fail1; - (void)FILE_Seek( cur_offset ); - } - - if ( ACCESS_Frame( 2L ) ) - goto Fail2; - - new_offset = GET_UShort(); - - FORGET_Frame(); - - if ( new_offset ) - { - new_offset += base_offset; - - cur_offset = FILE_Pos(); - if ( FILE_Seek( new_offset ) || - ( error = Load_LigCaretList( &gdef->LigCaretList, - stream ) ) != HB_Err_Ok ) - goto Fail2; - (void)FILE_Seek( cur_offset ); - } - - /* OpenType 1.2 has introduced the `MarkAttachClassDef' field. We - first have to scan the LookupFlag values to find out whether we - must load it or not. Here we only store the offset of the table. */ - - if ( ACCESS_Frame( 2L ) ) - goto Fail3; - - new_offset = GET_UShort(); - - FORGET_Frame(); - - if ( new_offset ) - gdef->MarkAttachClassDef_offset = new_offset + base_offset; - else - gdef->MarkAttachClassDef_offset = 0; - - *retptr = gdef; - - return HB_Err_Ok; - -Fail3: - Free_LigCaretList( &gdef->LigCaretList ); - -Fail2: - Free_AttachList( &gdef->AttachList ); - -Fail1: - _HB_OPEN_Free_ClassDefinition( &gdef->GlyphClassDef ); - -Fail0: - FREE( gdef ); - - return error; -} - - -HB_Error HB_Done_GDEF_Table ( HB_GDEFHeader* gdef ) -{ - Free_LigCaretList( &gdef->LigCaretList ); - Free_AttachList( &gdef->AttachList ); - _HB_OPEN_Free_ClassDefinition( &gdef->GlyphClassDef ); - _HB_OPEN_Free_ClassDefinition( &gdef->MarkAttachClassDef ); - - Free_NewGlyphClasses( gdef ); - - FREE( gdef ); - - return HB_Err_Ok; -} - - - - -/******************************* - * AttachList related functions - *******************************/ - - -/* AttachPoint */ - -static HB_Error Load_AttachPoint( HB_AttachPoint* ap, - HB_Stream stream ) -{ - HB_Error error; - - HB_UShort n, count; - HB_UShort* pi; - - - if ( ACCESS_Frame( 2L ) ) - return error; - - count = ap->PointCount = GET_UShort(); - - FORGET_Frame(); - - ap->PointIndex = NULL; - - if ( count ) - { - if ( ALLOC_ARRAY( ap->PointIndex, count, HB_UShort ) ) - return error; - - pi = ap->PointIndex; - - if ( ACCESS_Frame( count * 2L ) ) - { - FREE( pi ); - return error; - } - - for ( n = 0; n < count; n++ ) - pi[n] = GET_UShort(); - - FORGET_Frame(); - } - - return HB_Err_Ok; -} - - -static void Free_AttachPoint( HB_AttachPoint* ap ) -{ - FREE( ap->PointIndex ); -} - - -/* AttachList */ - -static HB_Error Load_AttachList( HB_AttachList* al, - HB_Stream stream ) -{ - HB_Error error; - - HB_UShort n, m, count; - HB_UInt cur_offset, new_offset, base_offset; - - HB_AttachPoint* ap; - - - base_offset = FILE_Pos(); - - if ( ACCESS_Frame( 2L ) ) - return error; - - new_offset = GET_UShort() + base_offset; - - FORGET_Frame(); - - cur_offset = FILE_Pos(); - if ( FILE_Seek( new_offset ) || - ( error = _HB_OPEN_Load_Coverage( &al->Coverage, stream ) ) != HB_Err_Ok ) - return error; - (void)FILE_Seek( cur_offset ); - - if ( ACCESS_Frame( 2L ) ) - goto Fail2; - - count = al->GlyphCount = GET_UShort(); - - FORGET_Frame(); - - al->AttachPoint = NULL; - - if ( ALLOC_ARRAY( al->AttachPoint, count, HB_AttachPoint ) ) - goto Fail2; - - ap = al->AttachPoint; - - for ( n = 0; n < count; n++ ) - { - if ( ACCESS_Frame( 2L ) ) - goto Fail1; - - new_offset = GET_UShort() + base_offset; - - FORGET_Frame(); - - cur_offset = FILE_Pos(); - if ( FILE_Seek( new_offset ) || - ( error = Load_AttachPoint( &ap[n], stream ) ) != HB_Err_Ok ) - goto Fail1; - (void)FILE_Seek( cur_offset ); - } - - al->loaded = TRUE; - - return HB_Err_Ok; - -Fail1: - for ( m = 0; m < n; m++ ) - Free_AttachPoint( &ap[m] ); - - FREE( ap ); - -Fail2: - _HB_OPEN_Free_Coverage( &al->Coverage ); - return error; -} - - -static void Free_AttachList( HB_AttachList* al) -{ - HB_UShort n, count; - - HB_AttachPoint* ap; - - - if ( !al->loaded ) - return; - - if ( al->AttachPoint ) - { - count = al->GlyphCount; - ap = al->AttachPoint; - - for ( n = 0; n < count; n++ ) - Free_AttachPoint( &ap[n] ); - - FREE( ap ); - } - - _HB_OPEN_Free_Coverage( &al->Coverage ); -} - - - -/********************************* - * LigCaretList related functions - *********************************/ - - -/* CaretValueFormat1 */ -/* CaretValueFormat2 */ -/* CaretValueFormat3 */ -/* CaretValueFormat4 */ - -static HB_Error Load_CaretValue( HB_CaretValue* cv, - HB_Stream stream ) -{ - HB_Error error; - - HB_UInt cur_offset, new_offset, base_offset; - - - base_offset = FILE_Pos(); - - if ( ACCESS_Frame( 2L ) ) - return error; - - cv->CaretValueFormat = GET_UShort(); - - FORGET_Frame(); - - switch ( cv->CaretValueFormat ) - { - case 1: - if ( ACCESS_Frame( 2L ) ) - return error; - - cv->cvf.cvf1.Coordinate = GET_Short(); - - FORGET_Frame(); - - break; - - case 2: - if ( ACCESS_Frame( 2L ) ) - return error; - - cv->cvf.cvf2.CaretValuePoint = GET_UShort(); - - FORGET_Frame(); - - break; - - case 3: - if ( ACCESS_Frame( 4L ) ) - return error; - - cv->cvf.cvf3.Coordinate = GET_Short(); - - new_offset = GET_UShort() + base_offset; - - FORGET_Frame(); - - cur_offset = FILE_Pos(); - if ( FILE_Seek( new_offset ) || - ( error = _HB_OPEN_Load_Device( &cv->cvf.cvf3.Device, - stream ) ) != HB_Err_Ok ) - return error; - (void)FILE_Seek( cur_offset ); - - break; - - case 4: - if ( ACCESS_Frame( 2L ) ) - return error; - - cv->cvf.cvf4.IdCaretValue = GET_UShort(); - - FORGET_Frame(); - break; - - default: - return ERR(HB_Err_Invalid_SubTable_Format); - } - - return HB_Err_Ok; -} - - -static void Free_CaretValue( HB_CaretValue* cv) -{ - if ( cv->CaretValueFormat == 3 ) - _HB_OPEN_Free_Device( &cv->cvf.cvf3.Device ); -} - - -/* LigGlyph */ - -static HB_Error Load_LigGlyph( HB_LigGlyph* lg, - HB_Stream stream ) -{ - HB_Error error; - - HB_UShort n, m, count; - HB_UInt cur_offset, new_offset, base_offset; - - HB_CaretValue* cv; - - - base_offset = FILE_Pos(); - - if ( ACCESS_Frame( 2L ) ) - return error; - - count = lg->CaretCount = GET_UShort(); - - FORGET_Frame(); - - lg->CaretValue = NULL; - - if ( ALLOC_ARRAY( lg->CaretValue, count, HB_CaretValue ) ) - return error; - - cv = lg->CaretValue; - - for ( n = 0; n < count; n++ ) - { - if ( ACCESS_Frame( 2L ) ) - goto Fail; - - new_offset = GET_UShort() + base_offset; - - FORGET_Frame(); - - cur_offset = FILE_Pos(); - if ( FILE_Seek( new_offset ) || - ( error = Load_CaretValue( &cv[n], stream ) ) != HB_Err_Ok ) - goto Fail; - (void)FILE_Seek( cur_offset ); - } - - return HB_Err_Ok; - -Fail: - for ( m = 0; m < n; m++ ) - Free_CaretValue( &cv[m] ); - - FREE( cv ); - return error; -} - - -static void Free_LigGlyph( HB_LigGlyph* lg) -{ - HB_UShort n, count; - - HB_CaretValue* cv; - - - if ( lg->CaretValue ) - { - count = lg->CaretCount; - cv = lg->CaretValue; - - for ( n = 0; n < count; n++ ) - Free_CaretValue( &cv[n] ); - - FREE( cv ); - } -} - - -/* LigCaretList */ - -static HB_Error Load_LigCaretList( HB_LigCaretList* lcl, - HB_Stream stream ) -{ - HB_Error error; - - HB_UShort m, n, count; - HB_UInt cur_offset, new_offset, base_offset; - - HB_LigGlyph* lg; - - - base_offset = FILE_Pos(); - - if ( ACCESS_Frame( 2L ) ) - return error; - - new_offset = GET_UShort() + base_offset; - - FORGET_Frame(); - - cur_offset = FILE_Pos(); - if ( FILE_Seek( new_offset ) || - ( error = _HB_OPEN_Load_Coverage( &lcl->Coverage, stream ) ) != HB_Err_Ok ) - return error; - (void)FILE_Seek( cur_offset ); - - if ( ACCESS_Frame( 2L ) ) - goto Fail2; - - count = lcl->LigGlyphCount = GET_UShort(); - - FORGET_Frame(); - - lcl->LigGlyph = NULL; - - if ( ALLOC_ARRAY( lcl->LigGlyph, count, HB_LigGlyph ) ) - goto Fail2; - - lg = lcl->LigGlyph; - - for ( n = 0; n < count; n++ ) - { - if ( ACCESS_Frame( 2L ) ) - goto Fail1; - - new_offset = GET_UShort() + base_offset; - - FORGET_Frame(); - - cur_offset = FILE_Pos(); - if ( FILE_Seek( new_offset ) || - ( error = Load_LigGlyph( &lg[n], stream ) ) != HB_Err_Ok ) - goto Fail1; - (void)FILE_Seek( cur_offset ); - } - - lcl->loaded = TRUE; - - return HB_Err_Ok; - -Fail1: - for ( m = 0; m < n; m++ ) - Free_LigGlyph( &lg[m] ); - - FREE( lg ); - -Fail2: - _HB_OPEN_Free_Coverage( &lcl->Coverage ); - return error; -} - - -static void Free_LigCaretList( HB_LigCaretList* lcl ) -{ - HB_UShort n, count; - - HB_LigGlyph* lg; - - - if ( !lcl->loaded ) - return; - - if ( lcl->LigGlyph ) - { - count = lcl->LigGlyphCount; - lg = lcl->LigGlyph; - - for ( n = 0; n < count; n++ ) - Free_LigGlyph( &lg[n] ); - - FREE( lg ); - } - - _HB_OPEN_Free_Coverage( &lcl->Coverage ); -} - - - -/*********** - * GDEF API - ***********/ - - -static HB_UShort Get_New_Class( HB_GDEFHeader* gdef, - HB_UShort glyphID, - HB_UShort index ) -{ - HB_UShort glyph_index, array_index, count; - HB_UShort byte, bits; - - HB_ClassRangeRecord* gcrr; - HB_UShort** ngc; - - - if ( glyphID >= gdef->LastGlyph ) - return 0; - - count = gdef->GlyphClassDef.cd.cd2.ClassRangeCount; - gcrr = gdef->GlyphClassDef.cd.cd2.ClassRangeRecord; - ngc = gdef->NewGlyphClasses; - - if ( index < count && glyphID < gcrr[index].Start ) - { - array_index = index; - if ( index == 0 ) - glyph_index = glyphID; - else - glyph_index = glyphID - gcrr[index - 1].End - 1; - } - else - { - array_index = index + 1; - glyph_index = glyphID - gcrr[index].End - 1; - } - - byte = ngc[array_index][glyph_index / 4]; - bits = byte >> ( 16 - ( glyph_index % 4 + 1 ) * 4 ); - - return bits & 0x000F; -} - - - -HB_Error HB_GDEF_Get_Glyph_Property( HB_GDEFHeader* gdef, - HB_UShort glyphID, - HB_UShort* property ) -{ - HB_UShort class = 0, index = 0; /* shut compiler up */ - - HB_Error error; - - - if ( !gdef || !property ) - return ERR(HB_Err_Invalid_Argument); - - /* first, we check for mark attach classes */ - - if ( gdef->MarkAttachClassDef.loaded ) - { - error = _HB_OPEN_Get_Class( &gdef->MarkAttachClassDef, glyphID, &class, &index ); - if ( error && error != HB_Err_Not_Covered ) - return error; - if ( !error ) - { - *property = class << 8; - return HB_Err_Ok; - } - } - - error = _HB_OPEN_Get_Class( &gdef->GlyphClassDef, glyphID, &class, &index ); - if ( error && error != HB_Err_Not_Covered ) - return error; - - /* if we have a constructed class table, check whether additional - values have been assigned */ - - if ( error == HB_Err_Not_Covered && gdef->NewGlyphClasses ) - class = Get_New_Class( gdef, glyphID, index ); - - switch ( class ) - { - default: - case UNCLASSIFIED_GLYPH: - *property = 0; - break; - - case SIMPLE_GLYPH: - *property = HB_GDEF_BASE_GLYPH; - break; - - case LIGATURE_GLYPH: - *property = HB_GDEF_LIGATURE; - break; - - case MARK_GLYPH: - *property = HB_GDEF_MARK; - break; - - case COMPONENT_GLYPH: - *property = HB_GDEF_COMPONENT; - break; - } - - return HB_Err_Ok; -} - - -static HB_Error Make_ClassRange( HB_ClassDefinition* cd, - HB_UShort start, - HB_UShort end, - HB_UShort class ) -{ - HB_Error error; - HB_UShort index; - - HB_ClassDefFormat2* cdf2; - HB_ClassRangeRecord* crr; - - - cdf2 = &cd->cd.cd2; - - if ( REALLOC_ARRAY( cdf2->ClassRangeRecord, - cdf2->ClassRangeCount + 1 , - HB_ClassRangeRecord ) ) - return error; - - cdf2->ClassRangeCount++; - - crr = cdf2->ClassRangeRecord; - index = cdf2->ClassRangeCount - 1; - - crr[index].Start = start; - crr[index].End = end; - crr[index].Class = class; - - return HB_Err_Ok; -} - - - -HB_Error HB_GDEF_Build_ClassDefinition( HB_GDEFHeader* gdef, - HB_UShort num_glyphs, - HB_UShort glyph_count, - HB_UShort* glyph_array, - HB_UShort* class_array ) -{ - HB_UShort start, curr_glyph, curr_class; - HB_UShort n, m, count; - HB_Error error; - - HB_ClassDefinition* gcd; - HB_ClassRangeRecord* gcrr; - HB_UShort** ngc; - - - if ( !gdef || !glyph_array || !class_array ) - return ERR(HB_Err_Invalid_Argument); - - gcd = &gdef->GlyphClassDef; - - /* We build a format 2 table */ - - gcd->ClassFormat = 2; - - gcd->cd.cd2.ClassRangeCount = 0; - gcd->cd.cd2.ClassRangeRecord = NULL; - - start = glyph_array[0]; - curr_class = class_array[0]; - curr_glyph = start; - - if ( curr_class >= 5 ) - { - error = ERR(HB_Err_Invalid_Argument); - goto Fail4; - } - - glyph_count--; - - for ( n = 0; n < glyph_count + 1; n++ ) - { - if ( curr_glyph == glyph_array[n] && curr_class == class_array[n] ) - { - if ( n == glyph_count ) - { - if ( ( error = Make_ClassRange( gcd, start, - curr_glyph, - curr_class) ) != HB_Err_Ok ) - goto Fail3; - } - else - { - if ( curr_glyph == 0xFFFF ) - { - error = ERR(HB_Err_Invalid_Argument); - goto Fail3; - } - else - curr_glyph++; - } - } - else - { - if ( ( error = Make_ClassRange( gcd, start, - curr_glyph - 1, - curr_class) ) != HB_Err_Ok ) - goto Fail3; - - if ( curr_glyph > glyph_array[n] ) - { - error = ERR(HB_Err_Invalid_Argument); - goto Fail3; - } - - start = glyph_array[n]; - curr_class = class_array[n]; - curr_glyph = start; - - if ( curr_class >= 5 ) - { - error = ERR(HB_Err_Invalid_Argument); - goto Fail3; - } - - if ( n == glyph_count ) - { - if ( ( error = Make_ClassRange( gcd, start, - curr_glyph, - curr_class) ) != HB_Err_Ok ) - goto Fail3; - } - else - { - if ( curr_glyph == 0xFFFF ) - { - error = ERR(HB_Err_Invalid_Argument); - goto Fail3; - } - else - curr_glyph++; - } - } - } - - /* now prepare the arrays for class values assigned during the lookup - process */ - - if ( ALLOC_ARRAY( gdef->NewGlyphClasses, - gcd->cd.cd2.ClassRangeCount + 1, HB_UShort* ) ) - goto Fail3; - - count = gcd->cd.cd2.ClassRangeCount; - gcrr = gcd->cd.cd2.ClassRangeRecord; - ngc = gdef->NewGlyphClasses; - - /* We allocate arrays for all glyphs not covered by the class range - records. Each element holds four class values. */ - - if ( count > 0 ) - { - if ( gcrr[0].Start ) - { - if ( ALLOC_ARRAY( ngc[0], ( gcrr[0].Start + 3 ) / 4, HB_UShort ) ) - goto Fail2; - } - - for ( n = 1; n < count; n++ ) - { - if ( gcrr[n].Start - gcrr[n - 1].End > 1 ) - if ( ALLOC_ARRAY( ngc[n], - ( gcrr[n].Start - gcrr[n - 1].End + 2 ) / 4, - HB_UShort ) ) - goto Fail1; - } - - if ( gcrr[count - 1].End != num_glyphs - 1 ) - { - if ( ALLOC_ARRAY( ngc[count], - ( num_glyphs - gcrr[count - 1].End + 2 ) / 4, - HB_UShort ) ) - goto Fail1; - } - } - else if ( num_glyphs > 0 ) - { - if ( ALLOC_ARRAY( ngc[count], - ( num_glyphs + 3 ) / 4, - HB_UShort ) ) - goto Fail2; - } - - gdef->LastGlyph = num_glyphs - 1; - - gdef->MarkAttachClassDef_offset = 0L; - gdef->MarkAttachClassDef.loaded = FALSE; - - gcd->loaded = TRUE; - - return HB_Err_Ok; - -Fail1: - for ( m = 0; m < n; m++ ) - FREE( ngc[m] ); - -Fail2: - FREE( gdef->NewGlyphClasses ); - -Fail3: - FREE( gcd->cd.cd2.ClassRangeRecord ); - -Fail4: - return error; -} - - -static void Free_NewGlyphClasses( HB_GDEFHeader* gdef ) -{ - HB_UShort** ngc; - HB_UShort n, count; - - - if ( gdef->NewGlyphClasses ) - { - count = gdef->GlyphClassDef.cd.cd2.ClassRangeCount + 1; - ngc = gdef->NewGlyphClasses; - - for ( n = 0; n < count; n++ ) - FREE( ngc[n] ); - - FREE( ngc ); - } -} - - -HB_INTERNAL HB_Error -_HB_GDEF_Add_Glyph_Property( HB_GDEFHeader* gdef, - HB_UShort glyphID, - HB_UShort property ) -{ - HB_Error error; - HB_UShort class, new_class, index = 0; /* shut compiler up */ - HB_UShort byte, bits, mask; - HB_UShort array_index, glyph_index, count; - - HB_ClassRangeRecord* gcrr; - HB_UShort** ngc; - - - error = _HB_OPEN_Get_Class( &gdef->GlyphClassDef, glyphID, &class, &index ); - if ( error && error != HB_Err_Not_Covered ) - return error; - - /* we don't accept glyphs covered in `GlyphClassDef' */ - - if ( !error ) - return HB_Err_Not_Covered; - - switch ( property ) - { - case 0: - new_class = UNCLASSIFIED_GLYPH; - break; - - case HB_GDEF_BASE_GLYPH: - new_class = SIMPLE_GLYPH; - break; - - case HB_GDEF_LIGATURE: - new_class = LIGATURE_GLYPH; - break; - - case HB_GDEF_MARK: - new_class = MARK_GLYPH; - break; - - case HB_GDEF_COMPONENT: - new_class = COMPONENT_GLYPH; - break; - - default: - return ERR(HB_Err_Invalid_Argument); - } - - count = gdef->GlyphClassDef.cd.cd2.ClassRangeCount; - gcrr = gdef->GlyphClassDef.cd.cd2.ClassRangeRecord; - ngc = gdef->NewGlyphClasses; - - if ( index < count && glyphID < gcrr[index].Start ) - { - array_index = index; - if ( index == 0 ) - glyph_index = glyphID; - else - glyph_index = glyphID - gcrr[index - 1].End - 1; - } - else - { - array_index = index + 1; - glyph_index = glyphID - gcrr[index].End - 1; - } - - byte = ngc[array_index][glyph_index / 4]; - bits = byte >> ( 16 - ( glyph_index % 4 + 1 ) * 4 ); - class = bits & 0x000F; - - /* we don't overwrite existing entries */ - - if ( !class ) - { - bits = new_class << ( 16 - ( glyph_index % 4 + 1 ) * 4 ); - mask = ~( 0x000F << ( 16 - ( glyph_index % 4 + 1 ) * 4 ) ); - - ngc[array_index][glyph_index / 4] &= mask; - ngc[array_index][glyph_index / 4] |= bits; - } - - return HB_Err_Ok; -} - - -HB_INTERNAL HB_Error -_HB_GDEF_Check_Property( HB_GDEFHeader* gdef, - HB_GlyphItem gitem, - HB_UShort flags, - HB_UShort* property ) -{ - HB_Error error; - - if ( gdef ) - { - HB_UShort basic_glyph_class; - HB_UShort desired_attachment_class; - - if ( gitem->gproperties == HB_GLYPH_PROPERTIES_UNKNOWN ) - { - error = HB_GDEF_Get_Glyph_Property( gdef, gitem->gindex, &gitem->gproperties ); - if ( error ) - return error; - } - - *property = gitem->gproperties; - - /* If the glyph was found in the MarkAttachmentClass table, - * then that class value is the high byte of the result, - * otherwise the low byte contains the basic type of the glyph - * as defined by the GlyphClassDef table. - */ - if ( *property & HB_LOOKUP_FLAG_IGNORE_SPECIAL_MARKS ) - basic_glyph_class = HB_GDEF_MARK; - else - basic_glyph_class = *property; - - /* Return Not_Covered, if, for example, basic_glyph_class - * is HB_GDEF_LIGATURE and LookFlags includes HB_LOOKUP_FLAG_IGNORE_LIGATURES - */ - if ( flags & basic_glyph_class ) - return HB_Err_Not_Covered; - - /* The high byte of LookupFlags has the meaning - * "ignore marks of attachment type different than - * the attachment type specified." - */ - desired_attachment_class = flags & HB_LOOKUP_FLAG_IGNORE_SPECIAL_MARKS; - if ( desired_attachment_class ) - { - if ( basic_glyph_class == HB_GDEF_MARK && - *property != desired_attachment_class ) - return HB_Err_Not_Covered; - } - } else { - *property = 0; - } - - return HB_Err_Ok; -} - -HB_INTERNAL HB_Error -_HB_GDEF_LoadMarkAttachClassDef_From_LookupFlags( HB_GDEFHeader* gdef, - HB_Stream stream, - HB_Lookup* lo, - HB_UShort num_lookups) -{ - HB_Error error = HB_Err_Ok; - HB_UShort i; - - /* We now check the LookupFlags for values larger than 0xFF to find - out whether we need to load the `MarkAttachClassDef' field of the - GDEF table -- this hack is necessary for OpenType 1.2 tables since - the version field of the GDEF table hasn't been incremented. - - For constructed GDEF tables, we only load it if - `MarkAttachClassDef_offset' is not zero (nevertheless, a build of - a constructed mark attach table is not supported currently). */ - - if ( gdef && - gdef->MarkAttachClassDef_offset && !gdef->MarkAttachClassDef.loaded ) - { - for ( i = 0; i < num_lookups; i++ ) - { - - if ( lo[i].LookupFlag & HB_LOOKUP_FLAG_IGNORE_SPECIAL_MARKS ) - { - if ( FILE_Seek( gdef->MarkAttachClassDef_offset ) || - ( error = _HB_OPEN_Load_ClassDefinition( &gdef->MarkAttachClassDef, - 256, stream ) ) != HB_Err_Ok ) - goto Done; - - break; - } - } - } - -Done: - return error; -} - -/* END */ diff --git a/third_party/harfbuzz/src/harfbuzz-gdef.h b/third_party/harfbuzz/src/harfbuzz-gdef.h deleted file mode 100644 index b6dcadcf88..0000000000 --- a/third_party/harfbuzz/src/harfbuzz-gdef.h +++ /dev/null @@ -1,135 +0,0 @@ -/* - * Copyright (C) 1998-2004 David Turner and Werner Lemberg - * Copyright (C) 2006 Behdad Esfahbod - * - * This is part of HarfBuzz, an OpenType Layout engine library. - * - * Permission is hereby granted, without written agreement and without - * license or royalty fees, to use, copy, modify, and distribute this - * software and its documentation for any purpose, provided that the - * above copyright notice and the following two paragraphs appear in - * all copies of this software. - * - * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR - * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES - * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN - * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE. - * - * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, - * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS - * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO - * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. - */ - -#ifndef HARFBUZZ_GDEF_H -#define HARFBUZZ_GDEF_H - -#include "harfbuzz-open.h" -#include "harfbuzz-stream.h" - -HB_BEGIN_HEADER - -/* GDEF glyph properties. Note that HB_GDEF_COMPONENT has no corresponding - * flag in the LookupFlag field. */ -#define HB_GDEF_BASE_GLYPH 0x0002 -#define HB_GDEF_LIGATURE 0x0004 -#define HB_GDEF_MARK 0x0008 -#define HB_GDEF_COMPONENT 0x0010 - - -typedef struct HB_AttachPoint_ HB_AttachPoint; - - -struct HB_AttachList_ -{ - HB_Bool loaded; - - HB_Coverage Coverage; /* Coverage table */ - HB_UShort GlyphCount; /* number of glyphs with - attachments */ - HB_AttachPoint* AttachPoint; /* array of AttachPoint tables */ -}; - -typedef struct HB_AttachList_ HB_AttachList; - -typedef struct HB_LigGlyph_ HB_LigGlyph; - -struct HB_LigCaretList_ -{ - HB_Bool loaded; - - HB_Coverage Coverage; /* Coverage table */ - HB_UShort LigGlyphCount; /* number of ligature glyphs */ - HB_LigGlyph* LigGlyph; /* array of LigGlyph tables */ -}; - -typedef struct HB_LigCaretList_ HB_LigCaretList; - - - -/* The `NewGlyphClasses' field is not defined in the TTO specification. - We use it for fonts with a constructed `GlyphClassDef' structure - (i.e., which don't have a GDEF table) to collect glyph classes - assigned during the lookup process. The number of arrays in this - pointer array is GlyphClassDef->cd.cd2.ClassRangeCount+1; the nth - array then contains the glyph class values of the glyphs not covered - by the ClassRangeRecords structures with index n-1 and n. We store - glyph class values for four glyphs in a single array element. - - `LastGlyph' is identical to the number of glyphs minus one in the - font; we need it only if `NewGlyphClasses' is not NULL (to have an - upper bound for the last array). - - Note that we first store the file offset to the `MarkAttachClassDef' - field (which has been introduced in OpenType 1.2) -- since the - `Version' field value hasn't been increased to indicate that we have - one more field for some obscure reason, we must parse the GSUB table - to find out whether class values refer to this table. Only then we - can finally load the MarkAttachClassDef structure if necessary. */ - -struct HB_GDEFHeader_ -{ - HB_UInt offset; - - HB_16Dot16 Version; - - HB_ClassDefinition GlyphClassDef; - HB_AttachList AttachList; - HB_LigCaretList LigCaretList; - HB_UInt MarkAttachClassDef_offset; - HB_ClassDefinition MarkAttachClassDef; /* new in OT 1.2 */ - - HB_UShort LastGlyph; - HB_UShort** NewGlyphClasses; -}; - -typedef struct HB_GDEFHeader_ HB_GDEFHeader; -typedef struct HB_GDEFHeader_* HB_GDEF; - - -HB_Error HB_New_GDEF_Table( HB_GDEFHeader** retptr ); - - -HB_Error HB_Load_GDEF_Table( HB_Stream stream, - HB_GDEFHeader** gdef ); - - -HB_Error HB_Done_GDEF_Table ( HB_GDEFHeader* gdef ); - - -HB_Error HB_GDEF_Get_Glyph_Property( HB_GDEFHeader* gdef, - HB_UShort glyphID, - HB_UShort* property ); - -HB_Error HB_GDEF_Build_ClassDefinition( HB_GDEFHeader* gdef, - HB_UShort num_glyphs, - HB_UShort glyph_count, - HB_UShort* glyph_array, - HB_UShort* class_array ); - - -HB_END_HEADER - -#endif /* HARFBUZZ_GDEF_H */ diff --git a/third_party/harfbuzz/src/harfbuzz-global.h b/third_party/harfbuzz/src/harfbuzz-global.h deleted file mode 100644 index d4e6b466b6..0000000000 --- a/third_party/harfbuzz/src/harfbuzz-global.h +++ /dev/null @@ -1,118 +0,0 @@ -/* - * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) - * Copyright (C) 2007 Red Hat, Inc. - * - * This is part of HarfBuzz, an OpenType Layout engine library. - * - * Permission is hereby granted, without written agreement and without - * license or royalty fees, to use, copy, modify, and distribute this - * software and its documentation for any purpose, provided that the - * above copyright notice and the following two paragraphs appear in - * all copies of this software. - * - * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR - * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES - * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN - * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE. - * - * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, - * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS - * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO - * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. - * - * Red Hat Author(s): Behdad Esfahbod - */ - -#ifndef HARFBUZZ_GLOBAL_H -#define HARFBUZZ_GLOBAL_H - -#include -#include - -#ifdef __cplusplus -#define HB_BEGIN_HEADER extern "C" { -#define HB_END_HEADER } -#else -#define HB_BEGIN_HEADER /* nothing */ -#define HB_END_HEADER /* nothing */ -#endif - -HB_BEGIN_HEADER - -#ifndef FALSE -#define FALSE 0 -#endif - -#ifndef TRUE -#define TRUE (!FALSE) -#endif - -#define HB_MAKE_TAG( _x1, _x2, _x3, _x4 ) \ - ( ( (HB_UInt)_x1 << 24 ) | \ - ( (HB_UInt)_x2 << 16 ) | \ - ( (HB_UInt)_x3 << 8 ) | \ - (HB_UInt)_x4 ) - -typedef char hb_int8; -typedef unsigned char hb_uint8; -typedef short hb_int16; -typedef unsigned short hb_uint16; -typedef int hb_int32; -typedef unsigned int hb_uint32; - -typedef hb_uint8 HB_Bool; - -typedef hb_uint8 HB_Byte; -typedef hb_uint16 HB_UShort; -typedef hb_uint32 HB_UInt; -typedef hb_int8 HB_Char; -typedef hb_int16 HB_Short; -typedef hb_int32 HB_Int; - -typedef hb_uint16 HB_UChar16; -typedef hb_uint32 HB_UChar32; -typedef hb_uint32 HB_Glyph; -typedef hb_int32 HB_Fixed; /* 26.6 */ - -#define HB_FIXED_CONSTANT(v) ((v) * 64) -#define HB_FIXED_ROUND(v) (((v)+32) & -64) - -typedef hb_int32 HB_16Dot16; /* 16.16 */ - -typedef void * HB_Pointer; -typedef hb_uint32 HB_Tag; - -typedef enum { - /* no error */ - HB_Err_Ok = 0x0000, - HB_Err_Not_Covered = 0xFFFF, - - /* _hb_err() is called whenever returning the following errors, - * and in a couple places for HB_Err_Not_Covered too. */ - - /* programmer error */ - HB_Err_Invalid_Argument = 0x1A66, - - /* font error */ - HB_Err_Invalid_SubTable_Format = 0x157F, - HB_Err_Invalid_SubTable = 0x1570, - HB_Err_Read_Error = 0x6EAD, - - /* system error */ - HB_Err_Out_Of_Memory = 0xDEAD -} HB_Error; - -typedef struct { - HB_Fixed x; - HB_Fixed y; -} HB_FixedPoint; - -typedef struct HB_Font_ *HB_Font; -typedef struct HB_StreamRec_ *HB_Stream; -typedef struct HB_FaceRec_ *HB_Face; - -HB_END_HEADER - -#endif diff --git a/third_party/harfbuzz/src/harfbuzz-gpos-private.h b/third_party/harfbuzz/src/harfbuzz-gpos-private.h deleted file mode 100644 index 4110700844..0000000000 --- a/third_party/harfbuzz/src/harfbuzz-gpos-private.h +++ /dev/null @@ -1,712 +0,0 @@ -/* - * Copyright (C) 1998-2004 David Turner and Werner Lemberg - * Copyright (C) 2006 Behdad Esfahbod - * - * This is part of HarfBuzz, an OpenType Layout engine library. - * - * Permission is hereby granted, without written agreement and without - * license or royalty fees, to use, copy, modify, and distribute this - * software and its documentation for any purpose, provided that the - * above copyright notice and the following two paragraphs appear in - * all copies of this software. - * - * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR - * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES - * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN - * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE. - * - * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, - * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS - * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO - * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. - */ - -#ifndef HARFBUZZ_GPOS_PRIVATE_H -#define HARFBUZZ_GPOS_PRIVATE_H - -#include "harfbuzz-impl.h" -#include "harfbuzz-stream-private.h" -#include "harfbuzz-gpos.h" - -HB_BEGIN_HEADER - - -/* shared tables */ - -struct HB_ValueRecord_ -{ - HB_Short XPlacement; /* horizontal adjustment for - placement */ - HB_Short YPlacement; /* vertical adjustment for - placement */ - HB_Short XAdvance; /* horizontal adjustment for - advance */ - HB_Short YAdvance; /* vertical adjustment for - advance */ - HB_Device XPlacementDevice; /* device table for horizontal - placement */ - HB_Device YPlacementDevice; /* device table for vertical - placement */ - HB_Device XAdvanceDevice; /* device table for horizontal - advance */ - HB_Device YAdvanceDevice; /* device table for vertical - advance */ - HB_UShort XIdPlacement; /* horizontal placement metric ID */ - HB_UShort YIdPlacement; /* vertical placement metric ID */ - HB_UShort XIdAdvance; /* horizontal advance metric ID */ - HB_UShort YIdAdvance; /* vertical advance metric ID */ -}; - -typedef struct HB_ValueRecord_ HB_ValueRecord; - - -/* Mask values to scan the value format of the ValueRecord structure. - We always expand compressed ValueRecords of the font. */ - -#define HB_GPOS_FORMAT_HAVE_X_PLACEMENT 0x0001 -#define HB_GPOS_FORMAT_HAVE_Y_PLACEMENT 0x0002 -#define HB_GPOS_FORMAT_HAVE_X_ADVANCE 0x0004 -#define HB_GPOS_FORMAT_HAVE_Y_ADVANCE 0x0008 -#define HB_GPOS_FORMAT_HAVE_X_PLACEMENT_DEVICE 0x0010 -#define HB_GPOS_FORMAT_HAVE_Y_PLACEMENT_DEVICE 0x0020 -#define HB_GPOS_FORMAT_HAVE_X_ADVANCE_DEVICE 0x0040 -#define HB_GPOS_FORMAT_HAVE_Y_ADVANCE_DEVICE 0x0080 -#define HB_GPOS_FORMAT_HAVE_X_ID_PLACEMENT 0x0100 -#define HB_GPOS_FORMAT_HAVE_Y_ID_PLACEMENT 0x0200 -#define HB_GPOS_FORMAT_HAVE_X_ID_ADVANCE 0x0400 -#define HB_GPOS_FORMAT_HAVE_Y_ID_ADVANCE 0x0800 - - -struct HB_AnchorFormat1_ -{ - HB_Short XCoordinate; /* horizontal value */ - HB_Short YCoordinate; /* vertical value */ -}; - -typedef struct HB_AnchorFormat1_ HB_AnchorFormat1; - - -struct HB_AnchorFormat2_ -{ - HB_Short XCoordinate; /* horizontal value */ - HB_Short YCoordinate; /* vertical value */ - HB_UShort AnchorPoint; /* index to glyph contour point */ -}; - -typedef struct HB_AnchorFormat2_ HB_AnchorFormat2; - - -struct HB_AnchorFormat3_ -{ - HB_Short XCoordinate; /* horizontal value */ - HB_Short YCoordinate; /* vertical value */ - HB_Device XDeviceTable; /* device table for X coordinate */ - HB_Device YDeviceTable; /* device table for Y coordinate */ -}; - -typedef struct HB_AnchorFormat3_ HB_AnchorFormat3; - - -struct HB_AnchorFormat4_ -{ - HB_UShort XIdAnchor; /* horizontal metric ID */ - HB_UShort YIdAnchor; /* vertical metric ID */ -}; - -typedef struct HB_AnchorFormat4_ HB_AnchorFormat4; - - -struct HB_Anchor_ -{ - HB_UShort PosFormat; /* 1, 2, 3, or 4 -- 0 indicates - that there is no Anchor table */ - - union - { - HB_AnchorFormat1 af1; - HB_AnchorFormat2 af2; - HB_AnchorFormat3 af3; - HB_AnchorFormat4 af4; - } af; -}; - -typedef struct HB_Anchor_ HB_Anchor; - - -struct HB_MarkRecord_ -{ - HB_UShort Class; /* mark class */ - HB_Anchor MarkAnchor; /* anchor table */ -}; - -typedef struct HB_MarkRecord_ HB_MarkRecord; - - -struct HB_MarkArray_ -{ - HB_UShort MarkCount; /* number of MarkRecord tables */ - HB_MarkRecord* MarkRecord; /* array of MarkRecord tables */ -}; - -typedef struct HB_MarkArray_ HB_MarkArray; - - -/* LookupType 1 */ - -struct HB_SinglePosFormat1_ -{ - HB_ValueRecord Value; /* ValueRecord for all covered - glyphs */ -}; - -typedef struct HB_SinglePosFormat1_ HB_SinglePosFormat1; - - -struct HB_SinglePosFormat2_ -{ - HB_UShort ValueCount; /* number of ValueRecord tables */ - HB_ValueRecord* Value; /* array of ValueRecord tables */ -}; - -typedef struct HB_SinglePosFormat2_ HB_SinglePosFormat2; - - -struct HB_SinglePos_ -{ - HB_UShort PosFormat; /* 1 or 2 */ - HB_Coverage Coverage; /* Coverage table */ - - HB_UShort ValueFormat; /* format of ValueRecord table */ - - union - { - HB_SinglePosFormat1 spf1; - HB_SinglePosFormat2 spf2; - } spf; -}; - -typedef struct HB_SinglePos_ HB_SinglePos; - - -/* LookupType 2 */ - -struct HB_PairValueRecord_ -{ - HB_UShort SecondGlyph; /* glyph ID for second glyph */ - HB_ValueRecord Value1; /* pos. data for first glyph */ - HB_ValueRecord Value2; /* pos. data for second glyph */ -}; - -typedef struct HB_PairValueRecord_ HB_PairValueRecord; - - -struct HB_PairSet_ -{ - HB_UShort PairValueCount; - /* number of PairValueRecord tables */ - HB_PairValueRecord* PairValueRecord; - /* array of PairValueRecord tables */ -}; - -typedef struct HB_PairSet_ HB_PairSet; - - -struct HB_PairPosFormat1_ -{ - HB_UShort PairSetCount; /* number of PairSet tables */ - HB_PairSet* PairSet; /* array of PairSet tables */ -}; - -typedef struct HB_PairPosFormat1_ HB_PairPosFormat1; - - -struct HB_Class2Record_ -{ - HB_ValueRecord Value1; /* pos. data for first glyph */ - HB_ValueRecord Value2; /* pos. data for second glyph */ -}; - -typedef struct HB_Class2Record_ HB_Class2Record; - - -struct HB_Class1Record_ -{ - HB_Class2Record* Class2Record; /* array of Class2Record tables */ -}; - -typedef struct HB_Class1Record_ HB_Class1Record; - - -struct HB_PairPosFormat2_ -{ - HB_ClassDefinition ClassDef1; /* class def. for first glyph */ - HB_ClassDefinition ClassDef2; /* class def. for second glyph */ - HB_UShort Class1Count; /* number of classes in ClassDef1 - table */ - HB_UShort Class2Count; /* number of classes in ClassDef2 - table */ - HB_Class1Record* Class1Record; /* array of Class1Record tables */ -}; - -typedef struct HB_PairPosFormat2_ HB_PairPosFormat2; - - -struct HB_PairPos_ -{ - HB_UShort PosFormat; /* 1 or 2 */ - HB_Coverage Coverage; /* Coverage table */ - HB_UShort ValueFormat1; /* format of ValueRecord table - for first glyph */ - HB_UShort ValueFormat2; /* format of ValueRecord table - for second glyph */ - - union - { - HB_PairPosFormat1 ppf1; - HB_PairPosFormat2 ppf2; - } ppf; -}; - -typedef struct HB_PairPos_ HB_PairPos; - - -/* LookupType 3 */ - -struct HB_EntryExitRecord_ -{ - HB_Anchor EntryAnchor; /* entry Anchor table */ - HB_Anchor ExitAnchor; /* exit Anchor table */ -}; - - -typedef struct HB_EntryExitRecord_ HB_EntryExitRecord; - -struct HB_CursivePos_ -{ - HB_UShort PosFormat; /* always 1 */ - HB_Coverage Coverage; /* Coverage table */ - HB_UShort EntryExitCount; - /* number of EntryExitRecord tables */ - HB_EntryExitRecord* EntryExitRecord; - /* array of EntryExitRecord tables */ -}; - -typedef struct HB_CursivePos_ HB_CursivePos; - - -/* LookupType 4 */ - -struct HB_BaseRecord_ -{ - HB_Anchor* BaseAnchor; /* array of base glyph anchor - tables */ -}; - -typedef struct HB_BaseRecord_ HB_BaseRecord; - - -struct HB_BaseArray_ -{ - HB_UShort BaseCount; /* number of BaseRecord tables */ - HB_BaseRecord* BaseRecord; /* array of BaseRecord tables */ -}; - -typedef struct HB_BaseArray_ HB_BaseArray; - - -struct HB_MarkBasePos_ -{ - HB_UShort PosFormat; /* always 1 */ - HB_Coverage MarkCoverage; /* mark glyph coverage table */ - HB_Coverage BaseCoverage; /* base glyph coverage table */ - HB_UShort ClassCount; /* number of mark classes */ - HB_MarkArray MarkArray; /* mark array table */ - HB_BaseArray BaseArray; /* base array table */ -}; - -typedef struct HB_MarkBasePos_ HB_MarkBasePos; - - -/* LookupType 5 */ - -struct HB_ComponentRecord_ -{ - HB_Anchor* LigatureAnchor; /* array of ligature glyph anchor - tables */ -}; - -typedef struct HB_ComponentRecord_ HB_ComponentRecord; - - -struct HB_LigatureAttach_ -{ - HB_UShort ComponentCount; - /* number of ComponentRecord tables */ - HB_ComponentRecord* ComponentRecord; - /* array of ComponentRecord tables */ -}; - -typedef struct HB_LigatureAttach_ HB_LigatureAttach; - - -struct HB_LigatureArray_ -{ - HB_UShort LigatureCount; /* number of LigatureAttach tables */ - HB_LigatureAttach* LigatureAttach; - /* array of LigatureAttach tables */ -}; - -typedef struct HB_LigatureArray_ HB_LigatureArray; - - -struct HB_MarkLigPos_ -{ - HB_UShort PosFormat; /* always 1 */ - HB_Coverage MarkCoverage; /* mark glyph coverage table */ - HB_Coverage LigatureCoverage; - /* ligature glyph coverage table */ - HB_UShort ClassCount; /* number of mark classes */ - HB_MarkArray MarkArray; /* mark array table */ - HB_LigatureArray LigatureArray; /* ligature array table */ -}; - -typedef struct HB_MarkLigPos_ HB_MarkLigPos; - - -/* LookupType 6 */ - -struct HB_Mark2Record_ -{ - HB_Anchor* Mark2Anchor; /* array of mark glyph anchor - tables */ -}; - -typedef struct HB_Mark2Record_ HB_Mark2Record; - - -struct HB_Mark2Array_ -{ - HB_UShort Mark2Count; /* number of Mark2Record tables */ - HB_Mark2Record* Mark2Record; /* array of Mark2Record tables */ -}; - -typedef struct HB_Mark2Array_ HB_Mark2Array; - - -struct HB_MarkMarkPos_ -{ - HB_UShort PosFormat; /* always 1 */ - HB_Coverage Mark1Coverage; /* first mark glyph coverage table */ - HB_Coverage Mark2Coverage; /* second mark glyph coverave table */ - HB_UShort ClassCount; /* number of combining mark classes */ - HB_MarkArray Mark1Array; /* MarkArray table for first mark */ - HB_Mark2Array Mark2Array; /* MarkArray table for second mark */ -}; - -typedef struct HB_MarkMarkPos_ HB_MarkMarkPos; - - -/* needed by both lookup type 7 and 8 */ - -struct HB_PosLookupRecord_ -{ - HB_UShort SequenceIndex; /* index into current - glyph sequence */ - HB_UShort LookupListIndex; /* Lookup to apply to that pos. */ -}; - -typedef struct HB_PosLookupRecord_ HB_PosLookupRecord; - - -/* LookupType 7 */ - -struct HB_PosRule_ -{ - HB_UShort GlyphCount; /* total number of input glyphs */ - HB_UShort PosCount; /* number of PosLookupRecord tables */ - HB_UShort* Input; /* array of input glyph IDs */ - HB_PosLookupRecord* PosLookupRecord; - /* array of PosLookupRecord tables */ -}; - -typedef struct HB_PosRule_ HB_PosRule; - - -struct HB_PosRuleSet_ -{ - HB_UShort PosRuleCount; /* number of PosRule tables */ - HB_PosRule* PosRule; /* array of PosRule tables */ -}; - -typedef struct HB_PosRuleSet_ HB_PosRuleSet; - - -struct HB_ContextPosFormat1_ -{ - HB_Coverage Coverage; /* Coverage table */ - HB_UShort PosRuleSetCount; /* number of PosRuleSet tables */ - HB_PosRuleSet* PosRuleSet; /* array of PosRuleSet tables */ -}; - -typedef struct HB_ContextPosFormat1_ HB_ContextPosFormat1; - - -struct HB_PosClassRule_ -{ - HB_UShort GlyphCount; /* total number of context classes */ - HB_UShort PosCount; /* number of PosLookupRecord tables */ - HB_UShort* Class; /* array of classes */ - HB_PosLookupRecord* PosLookupRecord; - /* array of PosLookupRecord tables */ -}; - -typedef struct HB_PosClassRule_ HB_PosClassRule; - - -struct HB_PosClassSet_ -{ - HB_UShort PosClassRuleCount; - /* number of PosClassRule tables */ - HB_PosClassRule* PosClassRule; /* array of PosClassRule tables */ -}; - -typedef struct HB_PosClassSet_ HB_PosClassSet; - - -/* The `MaxContextLength' field is not defined in the TTO specification - but simplifies the implementation of this format. It holds the - maximal context length used in the context rules. */ - -struct HB_ContextPosFormat2_ -{ - HB_UShort MaxContextLength; - /* maximal context length */ - HB_Coverage Coverage; /* Coverage table */ - HB_ClassDefinition ClassDef; /* ClassDef table */ - HB_UShort PosClassSetCount; - /* number of PosClassSet tables */ - HB_PosClassSet* PosClassSet; /* array of PosClassSet tables */ -}; - -typedef struct HB_ContextPosFormat2_ HB_ContextPosFormat2; - - -struct HB_ContextPosFormat3_ -{ - HB_UShort GlyphCount; /* number of input glyphs */ - HB_UShort PosCount; /* number of PosLookupRecord tables */ - HB_Coverage* Coverage; /* array of Coverage tables */ - HB_PosLookupRecord* PosLookupRecord; - /* array of PosLookupRecord tables */ -}; - -typedef struct HB_ContextPosFormat3_ HB_ContextPosFormat3; - - -struct HB_ContextPos_ -{ - HB_UShort PosFormat; /* 1, 2, or 3 */ - - union - { - HB_ContextPosFormat1 cpf1; - HB_ContextPosFormat2 cpf2; - HB_ContextPosFormat3 cpf3; - } cpf; -}; - -typedef struct HB_ContextPos_ HB_ContextPos; - - -/* LookupType 8 */ - -struct HB_ChainPosRule_ -{ - HB_UShort BacktrackGlyphCount; - /* total number of backtrack glyphs */ - HB_UShort* Backtrack; /* array of backtrack glyph IDs */ - HB_UShort InputGlyphCount; - /* total number of input glyphs */ - HB_UShort* Input; /* array of input glyph IDs */ - HB_UShort LookaheadGlyphCount; - /* total number of lookahead glyphs */ - HB_UShort* Lookahead; /* array of lookahead glyph IDs */ - HB_UShort PosCount; /* number of PosLookupRecords */ - HB_PosLookupRecord* PosLookupRecord; - /* array of PosLookupRecords */ -}; - -typedef struct HB_ChainPosRule_ HB_ChainPosRule; - - -struct HB_ChainPosRuleSet_ -{ - HB_UShort ChainPosRuleCount; - /* number of ChainPosRule tables */ - HB_ChainPosRule* ChainPosRule; /* array of ChainPosRule tables */ -}; - -typedef struct HB_ChainPosRuleSet_ HB_ChainPosRuleSet; - - -struct HB_ChainContextPosFormat1_ -{ - HB_Coverage Coverage; /* Coverage table */ - HB_UShort ChainPosRuleSetCount; - /* number of ChainPosRuleSet tables */ - HB_ChainPosRuleSet* ChainPosRuleSet; - /* array of ChainPosRuleSet tables */ -}; - -typedef struct HB_ChainContextPosFormat1_ HB_ChainContextPosFormat1; - - -struct HB_ChainPosClassRule_ -{ - HB_UShort BacktrackGlyphCount; - /* total number of backtrack - classes */ - HB_UShort* Backtrack; /* array of backtrack classes */ - HB_UShort InputGlyphCount; - /* total number of context classes */ - HB_UShort* Input; /* array of context classes */ - HB_UShort LookaheadGlyphCount; - /* total number of lookahead - classes */ - HB_UShort* Lookahead; /* array of lookahead classes */ - HB_UShort PosCount; /* number of PosLookupRecords */ - HB_PosLookupRecord* PosLookupRecord; - /* array of substitution lookups */ -}; - -typedef struct HB_ChainPosClassRule_ HB_ChainPosClassRule; - - -struct HB_ChainPosClassSet_ -{ - HB_UShort ChainPosClassRuleCount; - /* number of ChainPosClassRule - tables */ - HB_ChainPosClassRule* ChainPosClassRule; - /* array of ChainPosClassRule - tables */ -}; - -typedef struct HB_ChainPosClassSet_ HB_ChainPosClassSet; - - -/* The `MaxXXXLength' fields are not defined in the TTO specification - but simplifies the implementation of this format. It holds the - maximal context length used in the specific context rules. */ - -struct HB_ChainContextPosFormat2_ -{ - HB_Coverage Coverage; /* Coverage table */ - - HB_UShort MaxBacktrackLength; - /* maximal backtrack length */ - HB_ClassDefinition BacktrackClassDef; - /* BacktrackClassDef table */ - HB_UShort MaxInputLength; - /* maximal input length */ - HB_ClassDefinition InputClassDef; - /* InputClassDef table */ - HB_UShort MaxLookaheadLength; - /* maximal lookahead length */ - HB_ClassDefinition LookaheadClassDef; - /* LookaheadClassDef table */ - - HB_UShort ChainPosClassSetCount; - /* number of ChainPosClassSet - tables */ - HB_ChainPosClassSet* ChainPosClassSet; - /* array of ChainPosClassSet - tables */ -}; - -typedef struct HB_ChainContextPosFormat2_ HB_ChainContextPosFormat2; - - -struct HB_ChainContextPosFormat3_ -{ - HB_UShort BacktrackGlyphCount; - /* number of backtrack glyphs */ - HB_Coverage* BacktrackCoverage; - /* array of backtrack Coverage - tables */ - HB_UShort InputGlyphCount; - /* number of input glyphs */ - HB_Coverage* InputCoverage; - /* array of input coverage - tables */ - HB_UShort LookaheadGlyphCount; - /* number of lookahead glyphs */ - HB_Coverage* LookaheadCoverage; - /* array of lookahead coverage - tables */ - HB_UShort PosCount; /* number of PosLookupRecords */ - HB_PosLookupRecord* PosLookupRecord; - /* array of substitution lookups */ -}; - -typedef struct HB_ChainContextPosFormat3_ HB_ChainContextPosFormat3; - - -struct HB_ChainContextPos_ -{ - HB_UShort PosFormat; /* 1, 2, or 3 */ - - union - { - HB_ChainContextPosFormat1 ccpf1; - HB_ChainContextPosFormat2 ccpf2; - HB_ChainContextPosFormat3 ccpf3; - } ccpf; -}; - -typedef struct HB_ChainContextPos_ HB_ChainContextPos; - - -#if 0 -/* LookupType 10 */ -struct HB_ExtensionPos_ -{ - HB_UShort PosFormat; /* always 1 */ - HB_UShort LookuptType; /* lookup-type of referenced subtable */ - HB_GPOS_SubTable *subtable; /* referenced subtable */ -}; - -typedef struct HB_ExtensionPos_ HB_ExtensionPos; -#endif - - -union HB_GPOS_SubTable_ -{ - HB_SinglePos single; - HB_PairPos pair; - HB_CursivePos cursive; - HB_MarkBasePos markbase; - HB_MarkLigPos marklig; - HB_MarkMarkPos markmark; - HB_ContextPos context; - HB_ChainContextPos chain; -}; - -typedef union HB_GPOS_SubTable_ HB_GPOS_SubTable; - - - -HB_INTERNAL HB_Error -_HB_GPOS_Load_SubTable( HB_GPOS_SubTable* st, - HB_Stream stream, - HB_UShort lookup_type ); - -HB_INTERNAL void -_HB_GPOS_Free_SubTable( HB_GPOS_SubTable* st, - HB_UShort lookup_type ); - -HB_END_HEADER - -#endif /* HARFBUZZ_GPOS_PRIVATE_H */ diff --git a/third_party/harfbuzz/src/harfbuzz-gpos.c b/third_party/harfbuzz/src/harfbuzz-gpos.c deleted file mode 100644 index 356dc01099..0000000000 --- a/third_party/harfbuzz/src/harfbuzz-gpos.c +++ /dev/null @@ -1,6055 +0,0 @@ -/* - * Copyright (C) 1998-2004 David Turner and Werner Lemberg - * Copyright (C) 2006 Behdad Esfahbod - * Copyright (C) 2007 Red Hat, Inc. - * - * This is part of HarfBuzz, an OpenType Layout engine library. - * - * Permission is hereby granted, without written agreement and without - * license or royalty fees, to use, copy, modify, and distribute this - * software and its documentation for any purpose, provided that the - * above copyright notice and the following two paragraphs appear in - * all copies of this software. - * - * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR - * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES - * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN - * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE. - * - * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, - * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS - * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO - * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. - * - * Red Hat Author(s): Behdad Esfahbod - */ - -#include "harfbuzz-impl.h" -#include "harfbuzz-gpos-private.h" -#include "harfbuzz-open-private.h" -#include "harfbuzz-gdef-private.h" -#include "harfbuzz-shaper.h" - -struct GPOS_Instance_ -{ - HB_GPOSHeader* gpos; - HB_Font font; - HB_Bool dvi; - HB_UShort load_flags; /* how the glyph should be loaded */ - HB_Bool r2l; - - HB_UShort last; /* the last valid glyph -- used - with cursive positioning */ - HB_Fixed anchor_x; /* the coordinates of the anchor point */ - HB_Fixed anchor_y; /* of the last valid glyph */ -}; - -typedef struct GPOS_Instance_ GPOS_Instance; - - -static HB_Error GPOS_Do_Glyph_Lookup( GPOS_Instance* gpi, - HB_UShort lookup_index, - HB_Buffer buffer, - HB_UShort context_length, - int nesting_level ); - - - -/* the client application must replace this with something more - meaningful if multiple master fonts are to be supported. */ - -static HB_Error default_mmfunc( HB_Font font, - HB_UShort metric_id, - HB_Fixed* metric_value, - void* data ) -{ - HB_UNUSED(font); - HB_UNUSED(metric_id); - HB_UNUSED(metric_value); - HB_UNUSED(data); - return ERR(HB_Err_Not_Covered); /* ERR() call intended */ -} - - - -HB_Error HB_Load_GPOS_Table( HB_Stream stream, - HB_GPOSHeader** retptr, - HB_GDEFHeader* gdef, - HB_Stream gdefStream ) -{ - HB_UInt cur_offset, new_offset, base_offset; - - HB_GPOSHeader* gpos; - - HB_Error error; - - - if ( !retptr ) - return ERR(HB_Err_Invalid_Argument); - - if ( GOTO_Table( TTAG_GPOS ) ) - return error; - - base_offset = FILE_Pos(); - - if ( ALLOC ( gpos, sizeof( *gpos ) ) ) - return error; - - gpos->mmfunc = default_mmfunc; - - /* skip version */ - - if ( FILE_Seek( base_offset + 4L ) || - ACCESS_Frame( 2L ) ) - goto Fail4; - - new_offset = GET_UShort() + base_offset; - - FORGET_Frame(); - - cur_offset = FILE_Pos(); - if ( FILE_Seek( new_offset ) || - ( error = _HB_OPEN_Load_ScriptList( &gpos->ScriptList, - stream ) ) != HB_Err_Ok ) - goto Fail4; - (void)FILE_Seek( cur_offset ); - - if ( ACCESS_Frame( 2L ) ) - goto Fail3; - - new_offset = GET_UShort() + base_offset; - - FORGET_Frame(); - - cur_offset = FILE_Pos(); - if ( FILE_Seek( new_offset ) || - ( error = _HB_OPEN_Load_FeatureList( &gpos->FeatureList, - stream ) ) != HB_Err_Ok ) - goto Fail3; - (void)FILE_Seek( cur_offset ); - - if ( ACCESS_Frame( 2L ) ) - goto Fail2; - - new_offset = GET_UShort() + base_offset; - - FORGET_Frame(); - - cur_offset = FILE_Pos(); - if ( FILE_Seek( new_offset ) || - ( error = _HB_OPEN_Load_LookupList( &gpos->LookupList, - stream, HB_Type_GPOS ) ) != HB_Err_Ok ) - goto Fail2; - - gpos->gdef = gdef; /* can be NULL */ - - if ( ( error = _HB_GDEF_LoadMarkAttachClassDef_From_LookupFlags( gdef, gdefStream, - gpos->LookupList.Lookup, - gpos->LookupList.LookupCount ) ) ) - goto Fail1; - - *retptr = gpos; - - return HB_Err_Ok; - -Fail1: - _HB_OPEN_Free_LookupList( &gpos->LookupList, HB_Type_GPOS ); - -Fail2: - _HB_OPEN_Free_FeatureList( &gpos->FeatureList ); - -Fail3: - _HB_OPEN_Free_ScriptList( &gpos->ScriptList ); - -Fail4: - FREE( gpos ); - - return error; -} - - -HB_Error HB_Done_GPOS_Table( HB_GPOSHeader* gpos ) -{ - _HB_OPEN_Free_LookupList( &gpos->LookupList, HB_Type_GPOS ); - _HB_OPEN_Free_FeatureList( &gpos->FeatureList ); - _HB_OPEN_Free_ScriptList( &gpos->ScriptList ); - - FREE( gpos ); - - return HB_Err_Ok; -} - - -/***************************** - * SubTable related functions - *****************************/ - -/* shared tables */ - -/* ValueRecord */ - -/* There is a subtle difference in the specs between a `table' and a - `record' -- offsets for device tables in ValueRecords are taken from - the parent table and not the parent record. */ - -static HB_Error Load_ValueRecord( HB_ValueRecord* vr, - HB_UShort format, - HB_UInt base_offset, - HB_Stream stream ) -{ - HB_Error error; - - HB_UInt cur_offset, new_offset; - - - if ( format & HB_GPOS_FORMAT_HAVE_X_PLACEMENT ) - { - if ( ACCESS_Frame( 2L ) ) - return error; - - vr->XPlacement = GET_Short(); - - FORGET_Frame(); - } - else - vr->XPlacement = 0; - - if ( format & HB_GPOS_FORMAT_HAVE_Y_PLACEMENT ) - { - if ( ACCESS_Frame( 2L ) ) - return error; - - vr->YPlacement = GET_Short(); - - FORGET_Frame(); - } - else - vr->YPlacement = 0; - - if ( format & HB_GPOS_FORMAT_HAVE_X_ADVANCE ) - { - if ( ACCESS_Frame( 2L ) ) - return error; - - vr->XAdvance = GET_Short(); - - FORGET_Frame(); - } - else - vr->XAdvance = 0; - - if ( format & HB_GPOS_FORMAT_HAVE_Y_ADVANCE ) - { - if ( ACCESS_Frame( 2L ) ) - return error; - - vr->YAdvance = GET_Short(); - - FORGET_Frame(); - } - else - vr->YAdvance = 0; - - if ( format & HB_GPOS_FORMAT_HAVE_X_PLACEMENT_DEVICE ) - { - if ( ACCESS_Frame( 2L ) ) - return error; - - new_offset = GET_UShort(); - - FORGET_Frame(); - - if ( new_offset ) - { - new_offset += base_offset; - - cur_offset = FILE_Pos(); - if ( FILE_Seek( new_offset ) || - ( error = _HB_OPEN_Load_Device( &vr->XPlacementDevice, - stream ) ) != HB_Err_Ok ) - return error; - (void)FILE_Seek( cur_offset ); - } - else - goto empty1; - } - else - { - empty1: - vr->XPlacementDevice.StartSize = 0; - vr->XPlacementDevice.EndSize = 0; - vr->XPlacementDevice.DeltaValue = NULL; - } - - if ( format & HB_GPOS_FORMAT_HAVE_Y_PLACEMENT_DEVICE ) - { - if ( ACCESS_Frame( 2L ) ) - goto Fail3; - - new_offset = GET_UShort(); - - FORGET_Frame(); - - if ( new_offset ) - { - new_offset += base_offset; - - cur_offset = FILE_Pos(); - if ( FILE_Seek( new_offset ) || - ( error = _HB_OPEN_Load_Device( &vr->YPlacementDevice, - stream ) ) != HB_Err_Ok ) - goto Fail3; - (void)FILE_Seek( cur_offset ); - } - else - goto empty2; - } - else - { - empty2: - vr->YPlacementDevice.StartSize = 0; - vr->YPlacementDevice.EndSize = 0; - vr->YPlacementDevice.DeltaValue = NULL; - } - - if ( format & HB_GPOS_FORMAT_HAVE_X_ADVANCE_DEVICE ) - { - if ( ACCESS_Frame( 2L ) ) - goto Fail2; - - new_offset = GET_UShort(); - - FORGET_Frame(); - - if ( new_offset ) - { - new_offset += base_offset; - - cur_offset = FILE_Pos(); - if ( FILE_Seek( new_offset ) || - ( error = _HB_OPEN_Load_Device( &vr->XAdvanceDevice, - stream ) ) != HB_Err_Ok ) - goto Fail2; - (void)FILE_Seek( cur_offset ); - } - else - goto empty3; - } - else - { - empty3: - vr->XAdvanceDevice.StartSize = 0; - vr->XAdvanceDevice.EndSize = 0; - vr->XAdvanceDevice.DeltaValue = NULL; - } - - if ( format & HB_GPOS_FORMAT_HAVE_Y_ADVANCE_DEVICE ) - { - if ( ACCESS_Frame( 2L ) ) - goto Fail1; - - new_offset = GET_UShort(); - - FORGET_Frame(); - - if ( new_offset ) - { - new_offset += base_offset; - - cur_offset = FILE_Pos(); - if ( FILE_Seek( new_offset ) || - ( error = _HB_OPEN_Load_Device( &vr->YAdvanceDevice, - stream ) ) != HB_Err_Ok ) - goto Fail1; - (void)FILE_Seek( cur_offset ); - } - else - goto empty4; - } - else - { - empty4: - vr->YAdvanceDevice.StartSize = 0; - vr->YAdvanceDevice.EndSize = 0; - vr->YAdvanceDevice.DeltaValue = NULL; - } - - if ( format & HB_GPOS_FORMAT_HAVE_X_ID_PLACEMENT ) - { - if ( ACCESS_Frame( 2L ) ) - goto Fail1; - - vr->XIdPlacement = GET_UShort(); - - FORGET_Frame(); - } - else - vr->XIdPlacement = 0; - - if ( format & HB_GPOS_FORMAT_HAVE_Y_ID_PLACEMENT ) - { - if ( ACCESS_Frame( 2L ) ) - goto Fail1; - - vr->YIdPlacement = GET_UShort(); - - FORGET_Frame(); - } - else - vr->YIdPlacement = 0; - - if ( format & HB_GPOS_FORMAT_HAVE_X_ID_ADVANCE ) - { - if ( ACCESS_Frame( 2L ) ) - goto Fail1; - - vr->XIdAdvance = GET_UShort(); - - FORGET_Frame(); - } - else - vr->XIdAdvance = 0; - - if ( format & HB_GPOS_FORMAT_HAVE_Y_ID_ADVANCE ) - { - if ( ACCESS_Frame( 2L ) ) - goto Fail1; - - vr->YIdAdvance = GET_UShort(); - - FORGET_Frame(); - } - else - vr->YIdAdvance = 0; - - return HB_Err_Ok; - -Fail1: - _HB_OPEN_Free_Device( &vr->YAdvanceDevice ); - -Fail2: - _HB_OPEN_Free_Device( &vr->XAdvanceDevice ); - -Fail3: - _HB_OPEN_Free_Device( &vr->YPlacementDevice ); - return error; -} - - -static void Free_ValueRecord( HB_ValueRecord* vr, - HB_UShort format ) -{ - if ( format & HB_GPOS_FORMAT_HAVE_Y_ADVANCE_DEVICE ) - _HB_OPEN_Free_Device( &vr->YAdvanceDevice ); - if ( format & HB_GPOS_FORMAT_HAVE_X_ADVANCE_DEVICE ) - _HB_OPEN_Free_Device( &vr->XAdvanceDevice ); - if ( format & HB_GPOS_FORMAT_HAVE_Y_PLACEMENT_DEVICE ) - _HB_OPEN_Free_Device( &vr->YPlacementDevice ); - if ( format & HB_GPOS_FORMAT_HAVE_X_PLACEMENT_DEVICE ) - _HB_OPEN_Free_Device( &vr->XPlacementDevice ); -} - - -static HB_Error Get_ValueRecord( GPOS_Instance* gpi, - HB_ValueRecord* vr, - HB_UShort format, - HB_Position gd ) -{ - HB_Fixed value; - HB_Short pixel_value; - HB_Error error = HB_Err_Ok; - HB_GPOSHeader* gpos = gpi->gpos; - - HB_UShort x_ppem, y_ppem; - HB_16Dot16 x_scale, y_scale; - - - if ( !format ) - return HB_Err_Ok; - - x_ppem = gpi->font->x_ppem; - y_ppem = gpi->font->y_ppem; - x_scale = gpi->font->x_scale; - y_scale = gpi->font->y_scale; - - /* design units -> fractional pixel */ - - if ( format & HB_GPOS_FORMAT_HAVE_X_PLACEMENT ) - gd->x_pos += x_scale * vr->XPlacement / 0x10000; - if ( format & HB_GPOS_FORMAT_HAVE_Y_PLACEMENT ) - gd->y_pos += y_scale * vr->YPlacement / 0x10000; - if ( format & HB_GPOS_FORMAT_HAVE_X_ADVANCE ) - gd->x_advance += x_scale * vr->XAdvance / 0x10000; - if ( format & HB_GPOS_FORMAT_HAVE_Y_ADVANCE ) - gd->y_advance += y_scale * vr->YAdvance / 0x10000; - - if ( !gpi->dvi ) - { - /* pixel -> fractional pixel */ - - if ( format & HB_GPOS_FORMAT_HAVE_X_PLACEMENT_DEVICE ) - { - _HB_OPEN_Get_Device( &vr->XPlacementDevice, x_ppem, &pixel_value ); - gd->x_pos += pixel_value << 6; - } - if ( format & HB_GPOS_FORMAT_HAVE_Y_PLACEMENT_DEVICE ) - { - _HB_OPEN_Get_Device( &vr->YPlacementDevice, y_ppem, &pixel_value ); - gd->y_pos += pixel_value << 6; - } - if ( format & HB_GPOS_FORMAT_HAVE_X_ADVANCE_DEVICE ) - { - _HB_OPEN_Get_Device( &vr->XAdvanceDevice, x_ppem, &pixel_value ); - gd->x_advance += pixel_value << 6; - } - if ( format & HB_GPOS_FORMAT_HAVE_Y_ADVANCE_DEVICE ) - { - _HB_OPEN_Get_Device( &vr->YAdvanceDevice, y_ppem, &pixel_value ); - gd->y_advance += pixel_value << 6; - } - } - - /* values returned from mmfunc() are already in fractional pixels */ - - if ( format & HB_GPOS_FORMAT_HAVE_X_ID_PLACEMENT ) - { - error = (gpos->mmfunc)( gpi->font, vr->XIdPlacement, - &value, gpos->data ); - if ( error ) - return error; - gd->x_pos += value; - } - if ( format & HB_GPOS_FORMAT_HAVE_Y_ID_PLACEMENT ) - { - error = (gpos->mmfunc)( gpi->font, vr->YIdPlacement, - &value, gpos->data ); - if ( error ) - return error; - gd->y_pos += value; - } - if ( format & HB_GPOS_FORMAT_HAVE_X_ID_ADVANCE ) - { - error = (gpos->mmfunc)( gpi->font, vr->XIdAdvance, - &value, gpos->data ); - if ( error ) - return error; - gd->x_advance += value; - } - if ( format & HB_GPOS_FORMAT_HAVE_Y_ID_ADVANCE ) - { - error = (gpos->mmfunc)( gpi->font, vr->YIdAdvance, - &value, gpos->data ); - if ( error ) - return error; - gd->y_advance += value; - } - - return error; -} - - -/* AnchorFormat1 */ -/* AnchorFormat2 */ -/* AnchorFormat3 */ -/* AnchorFormat4 */ - -static HB_Error Load_Anchor( HB_Anchor* an, - HB_Stream stream ) -{ - HB_Error error; - - HB_UInt cur_offset, new_offset, base_offset; - - - base_offset = FILE_Pos(); - - if ( ACCESS_Frame( 2L ) ) - return error; - - an->PosFormat = GET_UShort(); - - FORGET_Frame(); - - switch ( an->PosFormat ) - { - case 1: - if ( ACCESS_Frame( 4L ) ) - return error; - - an->af.af1.XCoordinate = GET_Short(); - an->af.af1.YCoordinate = GET_Short(); - - FORGET_Frame(); - break; - - case 2: - if ( ACCESS_Frame( 6L ) ) - return error; - - an->af.af2.XCoordinate = GET_Short(); - an->af.af2.YCoordinate = GET_Short(); - an->af.af2.AnchorPoint = GET_UShort(); - - FORGET_Frame(); - break; - - case 3: - if ( ACCESS_Frame( 6L ) ) - return error; - - an->af.af3.XCoordinate = GET_Short(); - an->af.af3.YCoordinate = GET_Short(); - - new_offset = GET_UShort(); - - FORGET_Frame(); - - if ( new_offset ) - { - new_offset += base_offset; - - cur_offset = FILE_Pos(); - if ( FILE_Seek( new_offset ) || - ( error = _HB_OPEN_Load_Device( &an->af.af3.XDeviceTable, - stream ) ) != HB_Err_Ok ) - return error; - (void)FILE_Seek( cur_offset ); - } - else - { - an->af.af3.XDeviceTable.StartSize = 0; - an->af.af3.XDeviceTable.EndSize = 0; - an->af.af3.XDeviceTable.DeltaValue = NULL; - } - - if ( ACCESS_Frame( 2L ) ) - goto Fail; - - new_offset = GET_UShort(); - - FORGET_Frame(); - - if ( new_offset ) - { - new_offset += base_offset; - - cur_offset = FILE_Pos(); - if ( FILE_Seek( new_offset ) || - ( error = _HB_OPEN_Load_Device( &an->af.af3.YDeviceTable, - stream ) ) != HB_Err_Ok ) - goto Fail; - (void)FILE_Seek( cur_offset ); - } - else - { - an->af.af3.YDeviceTable.StartSize = 0; - an->af.af3.YDeviceTable.EndSize = 0; - an->af.af3.YDeviceTable.DeltaValue = NULL; - } - break; - - case 4: - if ( ACCESS_Frame( 4L ) ) - return error; - - an->af.af4.XIdAnchor = GET_UShort(); - an->af.af4.YIdAnchor = GET_UShort(); - - FORGET_Frame(); - break; - - default: - return ERR(HB_Err_Invalid_SubTable_Format); - } - - return HB_Err_Ok; - -Fail: - _HB_OPEN_Free_Device( &an->af.af3.XDeviceTable ); - return error; -} - - -static void Free_Anchor( HB_Anchor* an) -{ - if ( an->PosFormat == 3 ) - { - _HB_OPEN_Free_Device( &an->af.af3.YDeviceTable ); - _HB_OPEN_Free_Device( &an->af.af3.XDeviceTable ); - } -} - - -static HB_Error Get_Anchor( GPOS_Instance* gpi, - HB_Anchor* an, - HB_UShort glyph_index, - HB_Fixed* x_value, - HB_Fixed* y_value ) -{ - HB_Error error = HB_Err_Ok; - - HB_GPOSHeader* gpos = gpi->gpos; - HB_UShort ap; - - HB_Short pixel_value; - - HB_UShort x_ppem, y_ppem; - HB_16Dot16 x_scale, y_scale; - - - x_ppem = gpi->font->x_ppem; - y_ppem = gpi->font->y_ppem; - x_scale = gpi->font->x_scale; - y_scale = gpi->font->y_scale; - - switch ( an->PosFormat ) - { - case 0: - /* The special case of an empty AnchorTable */ - default: - - return HB_Err_Not_Covered; - - case 1: - *x_value = x_scale * an->af.af1.XCoordinate / 0x10000; - *y_value = y_scale * an->af.af1.YCoordinate / 0x10000; - break; - - case 2: - if ( !gpi->dvi ) - { - hb_uint32 n_points = 0; - ap = an->af.af2.AnchorPoint; - if (!gpi->font->klass->getPointInOutline) - goto no_contour_point; - error = gpi->font->klass->getPointInOutline(gpi->font, glyph_index, gpi->load_flags, ap, x_value, y_value, &n_points); - if (error) - return error; - /* if n_points is set to zero, we use the design coordinate value pair. - * This can happen e.g. for sbit glyphs. */ - if (!n_points) - goto no_contour_point; - } - else - { - no_contour_point: - *x_value = x_scale * an->af.af3.XCoordinate / 0x10000; - *y_value = y_scale * an->af.af3.YCoordinate / 0x10000; - } - break; - - case 3: - if ( !gpi->dvi ) - { - _HB_OPEN_Get_Device( &an->af.af3.XDeviceTable, x_ppem, &pixel_value ); - *x_value = pixel_value << 6; - _HB_OPEN_Get_Device( &an->af.af3.YDeviceTable, y_ppem, &pixel_value ); - *y_value = pixel_value << 6; - } - else - *x_value = *y_value = 0; - - *x_value += x_scale * an->af.af3.XCoordinate / 0x10000; - *y_value += y_scale * an->af.af3.YCoordinate / 0x10000; - break; - - case 4: - error = (gpos->mmfunc)( gpi->font, an->af.af4.XIdAnchor, - x_value, gpos->data ); - if ( error ) - return error; - - error = (gpos->mmfunc)( gpi->font, an->af.af4.YIdAnchor, - y_value, gpos->data ); - if ( error ) - return error; - break; - } - - return error; -} - - -/* MarkArray */ - -static HB_Error Load_MarkArray ( HB_MarkArray* ma, - HB_Stream stream ) -{ - HB_Error error; - - HB_UShort n, m, count; - HB_UInt cur_offset, new_offset, base_offset; - - HB_MarkRecord* mr; - - - base_offset = FILE_Pos(); - - if ( ACCESS_Frame( 2L ) ) - return error; - - count = ma->MarkCount = GET_UShort(); - - FORGET_Frame(); - - ma->MarkRecord = NULL; - - if ( ALLOC_ARRAY( ma->MarkRecord, count, HB_MarkRecord ) ) - return error; - - mr = ma->MarkRecord; - - for ( n = 0; n < count; n++ ) - { - if ( ACCESS_Frame( 4L ) ) - goto Fail; - - mr[n].Class = GET_UShort(); - new_offset = GET_UShort() + base_offset; - - FORGET_Frame(); - - cur_offset = FILE_Pos(); - if ( FILE_Seek( new_offset ) || - ( error = Load_Anchor( &mr[n].MarkAnchor, stream ) ) != HB_Err_Ok ) - goto Fail; - (void)FILE_Seek( cur_offset ); - } - - return HB_Err_Ok; - -Fail: - for ( m = 0; m < n; m++ ) - Free_Anchor( &mr[m].MarkAnchor ); - - FREE( mr ); - return error; -} - - -static void Free_MarkArray( HB_MarkArray* ma ) -{ - HB_UShort n, count; - - HB_MarkRecord* mr; - - - if ( ma->MarkRecord ) - { - count = ma->MarkCount; - mr = ma->MarkRecord; - - for ( n = 0; n < count; n++ ) - Free_Anchor( &mr[n].MarkAnchor ); - - FREE( mr ); - } -} - - -/* LookupType 1 */ - -/* SinglePosFormat1 */ -/* SinglePosFormat2 */ - -static HB_Error Load_SinglePos( HB_GPOS_SubTable* st, - HB_Stream stream ) -{ - HB_Error error; - HB_SinglePos* sp = &st->single; - - HB_UShort n, m, count, format; - HB_UInt cur_offset, new_offset, base_offset; - - HB_ValueRecord* vr; - - - base_offset = FILE_Pos(); - - if ( ACCESS_Frame( 6L ) ) - return error; - - sp->PosFormat = GET_UShort(); - new_offset = GET_UShort() + base_offset; - - format = sp->ValueFormat = GET_UShort(); - - FORGET_Frame(); - - if ( !format ) - return ERR(HB_Err_Invalid_SubTable); - - cur_offset = FILE_Pos(); - if ( FILE_Seek( new_offset ) || - ( error = _HB_OPEN_Load_Coverage( &sp->Coverage, stream ) ) != HB_Err_Ok ) - return error; - (void)FILE_Seek( cur_offset ); - - switch ( sp->PosFormat ) - { - case 1: - error = Load_ValueRecord( &sp->spf.spf1.Value, format, - base_offset, stream ); - if ( error ) - goto Fail2; - break; - - case 2: - if ( ACCESS_Frame( 2L ) ) - goto Fail2; - - count = sp->spf.spf2.ValueCount = GET_UShort(); - - FORGET_Frame(); - - sp->spf.spf2.Value = NULL; - - if ( ALLOC_ARRAY( sp->spf.spf2.Value, count, HB_ValueRecord ) ) - goto Fail2; - - vr = sp->spf.spf2.Value; - - for ( n = 0; n < count; n++ ) - { - error = Load_ValueRecord( &vr[n], format, base_offset, stream ); - if ( error ) - goto Fail1; - } - break; - - default: - return ERR(HB_Err_Invalid_SubTable_Format); - } - - return HB_Err_Ok; - -Fail1: - for ( m = 0; m < n; m++ ) - Free_ValueRecord( &vr[m], format ); - - FREE( vr ); - -Fail2: - _HB_OPEN_Free_Coverage( &sp->Coverage ); - return error; -} - - -static void Free_SinglePos( HB_GPOS_SubTable* st ) -{ - HB_UShort n, count, format; - HB_SinglePos* sp = &st->single; - - HB_ValueRecord* v; - - - format = sp->ValueFormat; - - switch ( sp->PosFormat ) - { - case 1: - Free_ValueRecord( &sp->spf.spf1.Value, format ); - break; - - case 2: - if ( sp->spf.spf2.Value ) - { - count = sp->spf.spf2.ValueCount; - v = sp->spf.spf2.Value; - - for ( n = 0; n < count; n++ ) - Free_ValueRecord( &v[n], format ); - - FREE( v ); - } - break; - default: - break; - } - - _HB_OPEN_Free_Coverage( &sp->Coverage ); -} - -static HB_Error Lookup_SinglePos( GPOS_Instance* gpi, - HB_GPOS_SubTable* st, - HB_Buffer buffer, - HB_UShort flags, - HB_UShort context_length, - int nesting_level ) -{ - HB_UShort index, property; - HB_Error error; - HB_GPOSHeader* gpos = gpi->gpos; - HB_SinglePos* sp = &st->single; - - HB_UNUSED(nesting_level); - - if ( context_length != 0xFFFF && context_length < 1 ) - return HB_Err_Not_Covered; - - if ( CHECK_Property( gpos->gdef, IN_CURITEM(), flags, &property ) ) - return error; - - error = _HB_OPEN_Coverage_Index( &sp->Coverage, IN_CURGLYPH(), &index ); - if ( error ) - return error; - - switch ( sp->PosFormat ) - { - case 1: - error = Get_ValueRecord( gpi, &sp->spf.spf1.Value, - sp->ValueFormat, POSITION( buffer->in_pos ) ); - if ( error ) - return error; - break; - - case 2: - if ( index >= sp->spf.spf2.ValueCount ) - return ERR(HB_Err_Invalid_SubTable); - error = Get_ValueRecord( gpi, &sp->spf.spf2.Value[index], - sp->ValueFormat, POSITION( buffer->in_pos ) ); - if ( error ) - return error; - break; - - default: - return ERR(HB_Err_Invalid_SubTable); - } - - (buffer->in_pos)++; - - return HB_Err_Ok; -} - - -/* LookupType 2 */ - -/* PairSet */ - -static HB_Error Load_PairSet ( HB_PairSet* ps, - HB_UShort format1, - HB_UShort format2, - HB_Stream stream ) -{ - HB_Error error; - - HB_UShort n, m, count; - HB_UInt base_offset; - - HB_PairValueRecord* pvr; - - - base_offset = FILE_Pos(); - - if ( ACCESS_Frame( 2L ) ) - return error; - - count = ps->PairValueCount = GET_UShort(); - - FORGET_Frame(); - - ps->PairValueRecord = NULL; - - if ( ALLOC_ARRAY( ps->PairValueRecord, count, HB_PairValueRecord ) ) - return error; - - pvr = ps->PairValueRecord; - - for ( n = 0; n < count; n++ ) - { - if ( ACCESS_Frame( 2L ) ) - goto Fail; - - pvr[n].SecondGlyph = GET_UShort(); - - FORGET_Frame(); - - if ( format1 ) - { - error = Load_ValueRecord( &pvr[n].Value1, format1, - base_offset, stream ); - if ( error ) - goto Fail; - } - if ( format2 ) - { - error = Load_ValueRecord( &pvr[n].Value2, format2, - base_offset, stream ); - if ( error ) - { - if ( format1 ) - Free_ValueRecord( &pvr[n].Value1, format1 ); - goto Fail; - } - } - } - - return HB_Err_Ok; - -Fail: - for ( m = 0; m < n; m++ ) - { - if ( format1 ) - Free_ValueRecord( &pvr[m].Value1, format1 ); - if ( format2 ) - Free_ValueRecord( &pvr[m].Value2, format2 ); - } - - FREE( pvr ); - return error; -} - - -static void Free_PairSet( HB_PairSet* ps, - HB_UShort format1, - HB_UShort format2 ) -{ - HB_UShort n, count; - - HB_PairValueRecord* pvr; - - - if ( ps->PairValueRecord ) - { - count = ps->PairValueCount; - pvr = ps->PairValueRecord; - - for ( n = 0; n < count; n++ ) - { - if ( format1 ) - Free_ValueRecord( &pvr[n].Value1, format1 ); - if ( format2 ) - Free_ValueRecord( &pvr[n].Value2, format2 ); - } - - FREE( pvr ); - } -} - - -/* PairPosFormat1 */ - -static HB_Error Load_PairPos1( HB_PairPosFormat1* ppf1, - HB_UShort format1, - HB_UShort format2, - HB_Stream stream ) -{ - HB_Error error; - - HB_UShort n, m, count; - HB_UInt cur_offset, new_offset, base_offset; - - HB_PairSet* ps; - - - base_offset = FILE_Pos() - 8L; - - if ( ACCESS_Frame( 2L ) ) - return error; - - count = ppf1->PairSetCount = GET_UShort(); - - FORGET_Frame(); - - ppf1->PairSet = NULL; - - if ( ALLOC_ARRAY( ppf1->PairSet, count, HB_PairSet ) ) - return error; - - ps = ppf1->PairSet; - - for ( n = 0; n < count; n++ ) - { - if ( ACCESS_Frame( 2L ) ) - goto Fail; - - new_offset = GET_UShort() + base_offset; - - FORGET_Frame(); - - cur_offset = FILE_Pos(); - if ( FILE_Seek( new_offset ) || - ( error = Load_PairSet( &ps[n], format1, - format2, stream ) ) != HB_Err_Ok ) - goto Fail; - (void)FILE_Seek( cur_offset ); - } - - return HB_Err_Ok; - -Fail: - for ( m = 0; m < n; m++ ) - Free_PairSet( &ps[m], format1, format2 ); - - FREE( ps ); - return error; -} - - -static void Free_PairPos1( HB_PairPosFormat1* ppf1, - HB_UShort format1, - HB_UShort format2 ) -{ - HB_UShort n, count; - - HB_PairSet* ps; - - - if ( ppf1->PairSet ) - { - count = ppf1->PairSetCount; - ps = ppf1->PairSet; - - for ( n = 0; n < count; n++ ) - Free_PairSet( &ps[n], format1, format2 ); - - FREE( ps ); - } -} - - -/* PairPosFormat2 */ - -static HB_Error Load_PairPos2( HB_PairPosFormat2* ppf2, - HB_UShort format1, - HB_UShort format2, - HB_Stream stream ) -{ - HB_Error error; - - HB_UShort m, n, k, count1, count2; - HB_UInt cur_offset, new_offset1, new_offset2, base_offset; - - HB_Class1Record* c1r; - HB_Class2Record* c2r; - - - base_offset = FILE_Pos() - 8L; - - if ( ACCESS_Frame( 8L ) ) - return error; - - new_offset1 = GET_UShort() + base_offset; - new_offset2 = GET_UShort() + base_offset; - - /* `Class1Count' and `Class2Count' are the upper limits for class - values, thus we read it now to make additional safety checks. */ - - count1 = ppf2->Class1Count = GET_UShort(); - count2 = ppf2->Class2Count = GET_UShort(); - - FORGET_Frame(); - - cur_offset = FILE_Pos(); - if ( FILE_Seek( new_offset1 ) || - ( error = _HB_OPEN_Load_ClassDefinition( &ppf2->ClassDef1, count1, - stream ) ) != HB_Err_Ok ) - return error; - if ( FILE_Seek( new_offset2 ) || - ( error = _HB_OPEN_Load_ClassDefinition( &ppf2->ClassDef2, count2, - stream ) ) != HB_Err_Ok ) - goto Fail3; - (void)FILE_Seek( cur_offset ); - - ppf2->Class1Record = NULL; - - if ( ALLOC_ARRAY( ppf2->Class1Record, count1, HB_Class1Record ) ) - goto Fail2; - - c1r = ppf2->Class1Record; - - for ( m = 0; m < count1; m++ ) - { - c1r[m].Class2Record = NULL; - - if ( ALLOC_ARRAY( c1r[m].Class2Record, count2, HB_Class2Record ) ) - goto Fail1; - - c2r = c1r[m].Class2Record; - - for ( n = 0; n < count2; n++ ) - { - if ( format1 ) - { - error = Load_ValueRecord( &c2r[n].Value1, format1, - base_offset, stream ); - if ( error ) - goto Fail0; - } - if ( format2 ) - { - error = Load_ValueRecord( &c2r[n].Value2, format2, - base_offset, stream ); - if ( error ) - { - if ( format1 ) - Free_ValueRecord( &c2r[n].Value1, format1 ); - goto Fail0; - } - } - } - - continue; - - Fail0: - for ( k = 0; k < n; k++ ) - { - if ( format1 ) - Free_ValueRecord( &c2r[k].Value1, format1 ); - if ( format2 ) - Free_ValueRecord( &c2r[k].Value2, format2 ); - } - goto Fail1; - } - - return HB_Err_Ok; - -Fail1: - for ( k = 0; k < m; k++ ) - { - c2r = c1r[k].Class2Record; - - for ( n = 0; n < count2; n++ ) - { - if ( format1 ) - Free_ValueRecord( &c2r[n].Value1, format1 ); - if ( format2 ) - Free_ValueRecord( &c2r[n].Value2, format2 ); - } - - FREE( c2r ); - } - - FREE( c1r ); -Fail2: - - _HB_OPEN_Free_ClassDefinition( &ppf2->ClassDef2 ); - -Fail3: - _HB_OPEN_Free_ClassDefinition( &ppf2->ClassDef1 ); - return error; -} - - -static void Free_PairPos2( HB_PairPosFormat2* ppf2, - HB_UShort format1, - HB_UShort format2) -{ - HB_UShort m, n, count1, count2; - - HB_Class1Record* c1r; - HB_Class2Record* c2r; - - - if ( ppf2->Class1Record ) - { - c1r = ppf2->Class1Record; - count1 = ppf2->Class1Count; - count2 = ppf2->Class2Count; - - for ( m = 0; m < count1; m++ ) - { - c2r = c1r[m].Class2Record; - - for ( n = 0; n < count2; n++ ) - { - if ( format1 ) - Free_ValueRecord( &c2r[n].Value1, format1 ); - if ( format2 ) - Free_ValueRecord( &c2r[n].Value2, format2 ); - } - - FREE( c2r ); - } - - FREE( c1r ); - - _HB_OPEN_Free_ClassDefinition( &ppf2->ClassDef2 ); - _HB_OPEN_Free_ClassDefinition( &ppf2->ClassDef1 ); - } -} - - -static HB_Error Load_PairPos( HB_GPOS_SubTable* st, - HB_Stream stream ) -{ - HB_Error error; - HB_PairPos* pp = &st->pair; - - HB_UShort format1, format2; - HB_UInt cur_offset, new_offset, base_offset; - - - base_offset = FILE_Pos(); - - if ( ACCESS_Frame( 8L ) ) - return error; - - pp->PosFormat = GET_UShort(); - new_offset = GET_UShort() + base_offset; - - format1 = pp->ValueFormat1 = GET_UShort(); - format2 = pp->ValueFormat2 = GET_UShort(); - - FORGET_Frame(); - - cur_offset = FILE_Pos(); - if ( FILE_Seek( new_offset ) || - ( error = _HB_OPEN_Load_Coverage( &pp->Coverage, stream ) ) != HB_Err_Ok ) - return error; - (void)FILE_Seek( cur_offset ); - - switch ( pp->PosFormat ) - { - case 1: - error = Load_PairPos1( &pp->ppf.ppf1, format1, format2, stream ); - if ( error ) - goto Fail; - break; - - case 2: - error = Load_PairPos2( &pp->ppf.ppf2, format1, format2, stream ); - if ( error ) - goto Fail; - break; - - default: - return ERR(HB_Err_Invalid_SubTable_Format); - } - - return HB_Err_Ok; - -Fail: - _HB_OPEN_Free_Coverage( &pp->Coverage ); - return error; -} - - -static void Free_PairPos( HB_GPOS_SubTable* st ) -{ - HB_UShort format1, format2; - HB_PairPos* pp = &st->pair; - - - format1 = pp->ValueFormat1; - format2 = pp->ValueFormat2; - - switch ( pp->PosFormat ) - { - case 1: - Free_PairPos1( &pp->ppf.ppf1, format1, format2 ); - break; - - case 2: - Free_PairPos2( &pp->ppf.ppf2, format1, format2 ); - break; - - default: - break; - } - - _HB_OPEN_Free_Coverage( &pp->Coverage ); -} - - -static HB_Error Lookup_PairPos1( GPOS_Instance* gpi, - HB_PairPosFormat1* ppf1, - HB_Buffer buffer, - HB_UInt first_pos, - HB_UShort index, - HB_UShort format1, - HB_UShort format2 ) -{ - HB_Error error; - HB_UShort numpvr, glyph2; - - HB_PairValueRecord* pvr; - - - if ( index >= ppf1->PairSetCount ) - return ERR(HB_Err_Invalid_SubTable); - - pvr = ppf1->PairSet[index].PairValueRecord; - if ( !pvr ) - return ERR(HB_Err_Invalid_SubTable); - - glyph2 = IN_CURGLYPH(); - - for ( numpvr = ppf1->PairSet[index].PairValueCount; - numpvr; - numpvr--, pvr++ ) - { - if ( glyph2 == pvr->SecondGlyph ) - { - error = Get_ValueRecord( gpi, &pvr->Value1, format1, - POSITION( first_pos ) ); - if ( error ) - return error; - return Get_ValueRecord( gpi, &pvr->Value2, format2, - POSITION( buffer->in_pos ) ); - } - } - - return HB_Err_Not_Covered; -} - - -static HB_Error Lookup_PairPos2( GPOS_Instance* gpi, - HB_PairPosFormat2* ppf2, - HB_Buffer buffer, - HB_UInt first_pos, - HB_UShort format1, - HB_UShort format2 ) -{ - HB_Error error; - HB_UShort cl1 = 0, cl2 = 0; /* shut compiler up */ - - HB_Class1Record* c1r; - HB_Class2Record* c2r; - - - error = _HB_OPEN_Get_Class( &ppf2->ClassDef1, IN_GLYPH( first_pos ), - &cl1, NULL ); - if ( error && error != HB_Err_Not_Covered ) - return error; - error = _HB_OPEN_Get_Class( &ppf2->ClassDef2, IN_CURGLYPH(), - &cl2, NULL ); - if ( error && error != HB_Err_Not_Covered ) - return error; - - c1r = &ppf2->Class1Record[cl1]; - if ( !c1r ) - return ERR(HB_Err_Invalid_SubTable); - c2r = &c1r->Class2Record[cl2]; - - error = Get_ValueRecord( gpi, &c2r->Value1, format1, POSITION( first_pos ) ); - if ( error ) - return error; - return Get_ValueRecord( gpi, &c2r->Value2, format2, POSITION( buffer->in_pos ) ); -} - - -static HB_Error Lookup_PairPos( GPOS_Instance* gpi, - HB_GPOS_SubTable* st, - HB_Buffer buffer, - HB_UShort flags, - HB_UShort context_length, - int nesting_level ) -{ - HB_Error error; - HB_UShort index, property; - HB_UInt first_pos; - HB_GPOSHeader* gpos = gpi->gpos; - HB_PairPos* pp = &st->pair; - - HB_UNUSED(nesting_level); - - if ( buffer->in_pos >= buffer->in_length - 1 ) - return HB_Err_Not_Covered; /* Not enough glyphs in stream */ - - if ( context_length != 0xFFFF && context_length < 2 ) - return HB_Err_Not_Covered; - - if ( CHECK_Property( gpos->gdef, IN_CURITEM(), flags, &property ) ) - return error; - - error = _HB_OPEN_Coverage_Index( &pp->Coverage, IN_CURGLYPH(), &index ); - if ( error ) - return error; - - /* second glyph */ - - first_pos = buffer->in_pos; - (buffer->in_pos)++; - - while ( CHECK_Property( gpos->gdef, IN_CURITEM(), - flags, &property ) ) - { - if ( error && error != HB_Err_Not_Covered ) - return error; - - if ( buffer->in_pos == buffer->in_length ) - { - buffer->in_pos = first_pos; - return HB_Err_Not_Covered; - } - (buffer->in_pos)++; - - } - - switch ( pp->PosFormat ) - { - case 1: - error = Lookup_PairPos1( gpi, &pp->ppf.ppf1, buffer, - first_pos, index, - pp->ValueFormat1, pp->ValueFormat2 ); - break; - - case 2: - error = Lookup_PairPos2( gpi, &pp->ppf.ppf2, buffer, first_pos, - pp->ValueFormat1, pp->ValueFormat2 ); - break; - - default: - return ERR(HB_Err_Invalid_SubTable_Format); - } - - /* if we don't have coverage for the second glyph don't skip it for - further lookups but reset in_pos back to the first_glyph and let - the caller in Do_String_Lookup increment in_pos */ - if ( error == HB_Err_Not_Covered ) - buffer->in_pos = first_pos; - - /* adjusting the `next' glyph */ - - if ( pp->ValueFormat2 ) - (buffer->in_pos)++; - - return error; -} - - -/* LookupType 3 */ - -/* CursivePosFormat1 */ - -static HB_Error Load_CursivePos( HB_GPOS_SubTable* st, - HB_Stream stream ) -{ - HB_Error error; - HB_CursivePos* cp = &st->cursive; - - HB_UShort n, m, count; - HB_UInt cur_offset, new_offset, base_offset; - - HB_EntryExitRecord* eer; - - - base_offset = FILE_Pos(); - - if ( ACCESS_Frame( 4L ) ) - return error; - - cp->PosFormat = GET_UShort(); - new_offset = GET_UShort() + base_offset; - - FORGET_Frame(); - - cur_offset = FILE_Pos(); - if ( FILE_Seek( new_offset ) || - ( error = _HB_OPEN_Load_Coverage( &cp->Coverage, stream ) ) != HB_Err_Ok ) - return error; - (void)FILE_Seek( cur_offset ); - - if ( ACCESS_Frame( 2L ) ) - goto Fail2; - - count = cp->EntryExitCount = GET_UShort(); - - FORGET_Frame(); - - cp->EntryExitRecord = NULL; - - if ( ALLOC_ARRAY( cp->EntryExitRecord, count, HB_EntryExitRecord ) ) - goto Fail2; - - eer = cp->EntryExitRecord; - - for ( n = 0; n < count; n++ ) - { - HB_UInt entry_offset; - - if ( ACCESS_Frame( 2L ) ) - return error; - - entry_offset = new_offset = GET_UShort(); - - FORGET_Frame(); - - if ( new_offset ) - { - new_offset += base_offset; - - cur_offset = FILE_Pos(); - if ( FILE_Seek( new_offset ) || - ( error = Load_Anchor( &eer[n].EntryAnchor, - stream ) ) != HB_Err_Ok ) - goto Fail1; - (void)FILE_Seek( cur_offset ); - } - else - eer[n].EntryAnchor.PosFormat = 0; - - if ( ACCESS_Frame( 2L ) ) - return error; - - new_offset = GET_UShort(); - - FORGET_Frame(); - - if ( new_offset ) - { - new_offset += base_offset; - - cur_offset = FILE_Pos(); - if ( FILE_Seek( new_offset ) || - ( error = Load_Anchor( &eer[n].ExitAnchor, - stream ) ) != HB_Err_Ok ) - { - if ( entry_offset ) - Free_Anchor( &eer[n].EntryAnchor ); - goto Fail1; - } - (void)FILE_Seek( cur_offset ); - } - else - eer[n].ExitAnchor.PosFormat = 0; - } - - return HB_Err_Ok; - -Fail1: - for ( m = 0; m < n; m++ ) - { - Free_Anchor( &eer[m].EntryAnchor ); - Free_Anchor( &eer[m].ExitAnchor ); - } - - FREE( eer ); - -Fail2: - _HB_OPEN_Free_Coverage( &cp->Coverage ); - return error; -} - - -static void Free_CursivePos( HB_GPOS_SubTable* st ) -{ - HB_UShort n, count; - HB_CursivePos* cp = &st->cursive; - - HB_EntryExitRecord* eer; - - - if ( cp->EntryExitRecord ) - { - count = cp->EntryExitCount; - eer = cp->EntryExitRecord; - - for ( n = 0; n < count; n++ ) - { - Free_Anchor( &eer[n].EntryAnchor ); - Free_Anchor( &eer[n].ExitAnchor ); - } - - FREE( eer ); - } - - _HB_OPEN_Free_Coverage( &cp->Coverage ); -} - - -static HB_Error Lookup_CursivePos( GPOS_Instance* gpi, - HB_GPOS_SubTable* st, - HB_Buffer buffer, - HB_UShort flags, - HB_UShort context_length, - int nesting_level ) -{ - HB_UShort index, property; - HB_Error error; - HB_GPOSHeader* gpos = gpi->gpos; - HB_CursivePos* cp = &st->cursive; - - HB_EntryExitRecord* eer; - HB_Fixed entry_x, entry_y; - HB_Fixed exit_x, exit_y; - - HB_UNUSED(nesting_level); - - if ( context_length != 0xFFFF && context_length < 1 ) - { - gpi->last = 0xFFFF; - return HB_Err_Not_Covered; - } - - /* Glyphs not having the right GDEF properties will be ignored, i.e., - gpi->last won't be reset (contrary to user defined properties). */ - - if ( CHECK_Property( gpos->gdef, IN_CURITEM(), flags, &property ) ) - return error; - - /* We don't handle mark glyphs here. According to Andrei, this isn't - possible, but who knows... */ - - if ( property == HB_GDEF_MARK ) - { - gpi->last = 0xFFFF; - return HB_Err_Not_Covered; - } - - error = _HB_OPEN_Coverage_Index( &cp->Coverage, IN_CURGLYPH(), &index ); - if ( error ) - { - gpi->last = 0xFFFF; - return error; - } - - if ( index >= cp->EntryExitCount ) - return ERR(HB_Err_Invalid_SubTable); - - eer = &cp->EntryExitRecord[index]; - - /* Now comes the messiest part of the whole OpenType - specification. At first glance, cursive connections seem easy - to understand, but there are pitfalls! The reason is that - the specs don't mention how to compute the advance values - resp. glyph offsets. I was told it would be an omission, to - be fixed in the next OpenType version... Again many thanks to - Andrei Burago for clarifications. - - Consider the following example: - - | xadv1 | - +---------+ - | | - +-----+--+ 1 | - | | .| | - | 0+--+------+ - | 2 | - | | - 0+--------+ - | xadv2 | - - glyph1: advance width = 12 - anchor point = (3,1) - - glyph2: advance width = 11 - anchor point = (9,4) - - LSB is 1 for both glyphs (so the boxes drawn above are glyph - bboxes). Writing direction is R2L; `0' denotes the glyph's - coordinate origin. - - Now the surprising part: The advance width of the *left* glyph - (resp. of the *bottom* glyph) will be modified, no matter - whether the writing direction is L2R or R2L (resp. T2B or - B2T)! This assymetry is caused by the fact that the glyph's - coordinate origin is always the lower left corner for all - writing directions. - - Continuing the above example, we can compute the new - (horizontal) advance width of glyph2 as - - 9 - 3 = 6 , - - and the new vertical offset of glyph2 as - - 1 - 4 = -3 . - - - Vertical writing direction is far more complicated: - - a) Assuming that we recompute the advance height of the lower glyph: - - -- - +---------+ - -- | | - +-----+--+ 1 | yadv1 - | | .| | - yadv2 | 0+--+------+ -- BSB1 -- - | 2 | -- -- y_offset - | | - BSB2 -- 0+--------+ -- - -- -- - - glyph1: advance height = 6 - anchor point = (3,1) - - glyph2: advance height = 7 - anchor point = (9,4) - - TSB is 1 for both glyphs; writing direction is T2B. - - - BSB1 = yadv1 - (TSB1 + ymax1) - BSB2 = yadv2 - (TSB2 + ymax2) - y_offset = y2 - y1 - - vertical advance width of glyph2 - = y_offset + BSB2 - BSB1 - = (y2 - y1) + (yadv2 - (TSB2 + ymax2)) - (yadv1 - (TSB1 + ymax1)) - = y2 - y1 + yadv2 - TSB2 - ymax2 - (yadv1 - TSB1 - ymax1) - = y2 - y1 + yadv2 - TSB2 - ymax2 - yadv1 + TSB1 + ymax1 - - - b) Assuming that we recompute the advance height of the upper glyph: - - -- -- - +---------+ -- TSB1 - -- -- | | - TSB2 -- +-----+--+ 1 | yadv1 ymax1 - | | .| | - yadv2 | 0+--+------+ -- -- - ymax2 | 2 | -- y_offset - | | - -- 0+--------+ -- - -- - - glyph1: advance height = 6 - anchor point = (3,1) - - glyph2: advance height = 7 - anchor point = (9,4) - - TSB is 1 for both glyphs; writing direction is T2B. - - y_offset = y2 - y1 - - vertical advance width of glyph2 - = TSB1 + ymax1 + y_offset - (TSB2 + ymax2) - = TSB1 + ymax1 + y2 - y1 - TSB2 - ymax2 - - - Comparing a) with b) shows that b) is easier to compute. I'll wait - for a reply from Andrei to see what should really be implemented... - - Since horizontal advance widths or vertical advance heights - can be used alone but not together, no ambiguity occurs. */ - - if ( gpi->last == 0xFFFF ) - goto end; - - /* Get_Anchor() returns HB_Err_Not_Covered if there is no anchor - table. */ - - error = Get_Anchor( gpi, &eer->EntryAnchor, IN_CURGLYPH(), - &entry_x, &entry_y ); - if ( error == HB_Err_Not_Covered ) - goto end; - if ( error ) - return error; - - if ( gpi->r2l ) - { - POSITION( buffer->in_pos )->x_advance = entry_x - gpi->anchor_x; - POSITION( buffer->in_pos )->new_advance = TRUE; - } - else - { - POSITION( gpi->last )->x_advance = gpi->anchor_x - entry_x; - POSITION( gpi->last )->new_advance = TRUE; - } - - if ( flags & HB_LOOKUP_FLAG_RIGHT_TO_LEFT ) - { - POSITION( gpi->last )->cursive_chain = gpi->last - buffer->in_pos; - POSITION( gpi->last )->y_pos = entry_y - gpi->anchor_y; - } - else - { - POSITION( buffer->in_pos )->cursive_chain = buffer->in_pos - gpi->last; - POSITION( buffer->in_pos )->y_pos = gpi->anchor_y - entry_y; - } - -end: - error = Get_Anchor( gpi, &eer->ExitAnchor, IN_CURGLYPH(), - &exit_x, &exit_y ); - if ( error == HB_Err_Not_Covered ) - gpi->last = 0xFFFF; - else - { - gpi->last = buffer->in_pos; - gpi->anchor_x = exit_x; - gpi->anchor_y = exit_y; - } - if ( error ) - return error; - - (buffer->in_pos)++; - - return HB_Err_Ok; -} - - -/* LookupType 4 */ - -/* BaseArray */ - -static HB_Error Load_BaseArray( HB_BaseArray* ba, - HB_UShort num_classes, - HB_Stream stream ) -{ - HB_Error error; - - HB_UShort m, n, count; - HB_UInt cur_offset, new_offset, base_offset; - - HB_BaseRecord *br; - HB_Anchor *ban, *bans; - - - base_offset = FILE_Pos(); - - if ( ACCESS_Frame( 2L ) ) - return error; - - count = ba->BaseCount = GET_UShort(); - - FORGET_Frame(); - - ba->BaseRecord = NULL; - - if ( ALLOC_ARRAY( ba->BaseRecord, count, HB_BaseRecord ) ) - return error; - - br = ba->BaseRecord; - - bans = NULL; - - if ( ALLOC_ARRAY( bans, count * num_classes, HB_Anchor ) ) - goto Fail; - - for ( m = 0; m < count; m++ ) - { - br[m].BaseAnchor = NULL; - - ban = br[m].BaseAnchor = bans + m * num_classes; - - for ( n = 0; n < num_classes; n++ ) - { - if ( ACCESS_Frame( 2L ) ) - goto Fail; - - new_offset = GET_UShort() + base_offset; - - FORGET_Frame(); - - if (new_offset == base_offset) { - /* XXX - * Doulos SIL Regular is buggy and has zero offsets here. - * Skip it - */ - ban[n].PosFormat = 0; - continue; - } - - cur_offset = FILE_Pos(); - if ( FILE_Seek( new_offset ) || - ( error = Load_Anchor( &ban[n], stream ) ) != HB_Err_Ok ) - goto Fail; - (void)FILE_Seek( cur_offset ); - } - } - - return HB_Err_Ok; - -Fail: - FREE( bans ); - FREE( br ); - return error; -} - - -static void Free_BaseArray( HB_BaseArray* ba, - HB_UShort num_classes ) -{ - HB_BaseRecord *br; - HB_Anchor *bans; - - if ( ba->BaseRecord ) - { - br = ba->BaseRecord; - - if ( ba->BaseCount ) - { - HB_UShort i, count; - count = num_classes * ba->BaseCount; - bans = br[0].BaseAnchor; - for (i = 0; i < count; i++) - Free_Anchor (&bans[i]); - FREE( bans ); - } - - FREE( br ); - } -} - - -/* MarkBasePosFormat1 */ - -static HB_Error Load_MarkBasePos( HB_GPOS_SubTable* st, - HB_Stream stream ) -{ - HB_Error error; - HB_MarkBasePos* mbp = &st->markbase; - - HB_UInt cur_offset, new_offset, base_offset; - - - base_offset = FILE_Pos(); - - if ( ACCESS_Frame( 4L ) ) - return error; - - mbp->PosFormat = GET_UShort(); - new_offset = GET_UShort() + base_offset; - - FORGET_Frame(); - - if (mbp->PosFormat != 1) - return ERR(HB_Err_Invalid_SubTable_Format); - - cur_offset = FILE_Pos(); - if ( FILE_Seek( new_offset ) || - ( error = _HB_OPEN_Load_Coverage( &mbp->MarkCoverage, stream ) ) != HB_Err_Ok ) - return error; - (void)FILE_Seek( cur_offset ); - - if ( ACCESS_Frame( 2L ) ) - goto Fail3; - - new_offset = GET_UShort() + base_offset; - - FORGET_Frame(); - - cur_offset = FILE_Pos(); - if ( FILE_Seek( new_offset ) || - ( error = _HB_OPEN_Load_Coverage( &mbp->BaseCoverage, stream ) ) != HB_Err_Ok ) - goto Fail3; - (void)FILE_Seek( cur_offset ); - - if ( ACCESS_Frame( 4L ) ) - goto Fail2; - - mbp->ClassCount = GET_UShort(); - new_offset = GET_UShort() + base_offset; - - FORGET_Frame(); - - cur_offset = FILE_Pos(); - if ( FILE_Seek( new_offset ) || - ( error = Load_MarkArray( &mbp->MarkArray, stream ) ) != HB_Err_Ok ) - goto Fail2; - (void)FILE_Seek( cur_offset ); - - if ( ACCESS_Frame( 2L ) ) - goto Fail1; - - new_offset = GET_UShort() + base_offset; - - FORGET_Frame(); - - cur_offset = FILE_Pos(); - if ( FILE_Seek( new_offset ) || - ( error = Load_BaseArray( &mbp->BaseArray, mbp->ClassCount, - stream ) ) != HB_Err_Ok ) - goto Fail1; - - return HB_Err_Ok; - -Fail1: - Free_MarkArray( &mbp->MarkArray ); - -Fail2: - _HB_OPEN_Free_Coverage( &mbp->BaseCoverage ); - -Fail3: - _HB_OPEN_Free_Coverage( &mbp->MarkCoverage ); - return error; -} - - -static void Free_MarkBasePos( HB_GPOS_SubTable* st ) -{ - HB_MarkBasePos* mbp = &st->markbase; - - Free_BaseArray( &mbp->BaseArray, mbp->ClassCount ); - Free_MarkArray( &mbp->MarkArray ); - _HB_OPEN_Free_Coverage( &mbp->BaseCoverage ); - _HB_OPEN_Free_Coverage( &mbp->MarkCoverage ); -} - - -static HB_Error Lookup_MarkBasePos( GPOS_Instance* gpi, - HB_GPOS_SubTable* st, - HB_Buffer buffer, - HB_UShort flags, - HB_UShort context_length, - int nesting_level ) -{ - HB_UShort i, j, mark_index, base_index, property, class; - HB_Fixed x_mark_value, y_mark_value, x_base_value, y_base_value; - HB_Error error; - HB_GPOSHeader* gpos = gpi->gpos; - HB_MarkBasePos* mbp = &st->markbase; - - HB_MarkArray* ma; - HB_BaseArray* ba; - HB_BaseRecord* br; - HB_Anchor* mark_anchor; - HB_Anchor* base_anchor; - - HB_Position o; - - HB_UNUSED(nesting_level); - - if ( context_length != 0xFFFF && context_length < 1 ) - return HB_Err_Not_Covered; - - if ( flags & HB_LOOKUP_FLAG_IGNORE_BASE_GLYPHS ) - return HB_Err_Not_Covered; - - if ( CHECK_Property( gpos->gdef, IN_CURITEM(), - flags, &property ) ) - return error; - - error = _HB_OPEN_Coverage_Index( &mbp->MarkCoverage, IN_CURGLYPH(), - &mark_index ); - if ( error ) - return error; - - /* now we search backwards for a non-mark glyph */ - - i = 1; - j = buffer->in_pos - 1; - - while ( i <= buffer->in_pos ) - { - error = HB_GDEF_Get_Glyph_Property( gpos->gdef, IN_GLYPH( j ), - &property ); - if ( error ) - return error; - - if ( !( property == HB_GDEF_MARK || property & HB_LOOKUP_FLAG_IGNORE_SPECIAL_MARKS ) ) - break; - - i++; - j--; - } - - /* The following assertion is too strong -- at least for mangal.ttf. */ -#if 0 - if ( property != HB_GDEF_BASE_GLYPH ) - return HB_Err_Not_Covered; -#endif - - if ( i > buffer->in_pos ) - return HB_Err_Not_Covered; - - error = _HB_OPEN_Coverage_Index( &mbp->BaseCoverage, IN_GLYPH( j ), - &base_index ); - if ( error ) - return error; - - ma = &mbp->MarkArray; - - if ( mark_index >= ma->MarkCount ) - return ERR(HB_Err_Invalid_SubTable); - - class = ma->MarkRecord[mark_index].Class; - mark_anchor = &ma->MarkRecord[mark_index].MarkAnchor; - - if ( class >= mbp->ClassCount ) - return ERR(HB_Err_Invalid_SubTable); - - ba = &mbp->BaseArray; - - if ( base_index >= ba->BaseCount ) - return ERR(HB_Err_Invalid_SubTable); - - br = &ba->BaseRecord[base_index]; - base_anchor = &br->BaseAnchor[class]; - - error = Get_Anchor( gpi, mark_anchor, IN_CURGLYPH(), - &x_mark_value, &y_mark_value ); - if ( error ) - return error; - - error = Get_Anchor( gpi, base_anchor, IN_GLYPH( j ), - &x_base_value, &y_base_value ); - if ( error ) - return error; - - /* anchor points are not cumulative */ - - o = POSITION( buffer->in_pos ); - - o->x_pos = x_base_value - x_mark_value; - o->y_pos = y_base_value - y_mark_value; - o->x_advance = 0; - o->y_advance = 0; - o->back = i; - - (buffer->in_pos)++; - - return HB_Err_Ok; -} - - -/* LookupType 5 */ - -/* LigatureAttach */ - -static HB_Error Load_LigatureAttach( HB_LigatureAttach* lat, - HB_UShort num_classes, - HB_Stream stream ) -{ - HB_Error error; - - HB_UShort m, n, k, count; - HB_UInt cur_offset, new_offset, base_offset; - - HB_ComponentRecord* cr; - HB_Anchor* lan; - - - base_offset = FILE_Pos(); - - if ( ACCESS_Frame( 2L ) ) - return error; - - count = lat->ComponentCount = GET_UShort(); - - FORGET_Frame(); - - lat->ComponentRecord = NULL; - - if ( ALLOC_ARRAY( lat->ComponentRecord, count, HB_ComponentRecord ) ) - return error; - - cr = lat->ComponentRecord; - - for ( m = 0; m < count; m++ ) - { - cr[m].LigatureAnchor = NULL; - - if ( ALLOC_ARRAY( cr[m].LigatureAnchor, num_classes, HB_Anchor ) ) - goto Fail; - - lan = cr[m].LigatureAnchor; - - for ( n = 0; n < num_classes; n++ ) - { - if ( ACCESS_Frame( 2L ) ) - goto Fail0; - - new_offset = GET_UShort(); - - FORGET_Frame(); - - if ( new_offset ) - { - new_offset += base_offset; - - cur_offset = FILE_Pos(); - if ( FILE_Seek( new_offset ) || - ( error = Load_Anchor( &lan[n], stream ) ) != HB_Err_Ok ) - goto Fail0; - (void)FILE_Seek( cur_offset ); - } - else - lan[n].PosFormat = 0; - } - - continue; - Fail0: - for ( k = 0; k < n; k++ ) - Free_Anchor( &lan[k] ); - goto Fail; - } - - return HB_Err_Ok; - -Fail: - for ( k = 0; k < m; k++ ) - { - lan = cr[k].LigatureAnchor; - - for ( n = 0; n < num_classes; n++ ) - Free_Anchor( &lan[n] ); - - FREE( lan ); - } - - FREE( cr ); - return error; -} - - -static void Free_LigatureAttach( HB_LigatureAttach* lat, - HB_UShort num_classes ) -{ - HB_UShort m, n, count; - - HB_ComponentRecord* cr; - HB_Anchor* lan; - - - if ( lat->ComponentRecord ) - { - count = lat->ComponentCount; - cr = lat->ComponentRecord; - - for ( m = 0; m < count; m++ ) - { - lan = cr[m].LigatureAnchor; - - for ( n = 0; n < num_classes; n++ ) - Free_Anchor( &lan[n] ); - - FREE( lan ); - } - - FREE( cr ); - } -} - - -/* LigatureArray */ - -static HB_Error Load_LigatureArray( HB_LigatureArray* la, - HB_UShort num_classes, - HB_Stream stream ) -{ - HB_Error error; - - HB_UShort n, m, count; - HB_UInt cur_offset, new_offset, base_offset; - - HB_LigatureAttach* lat; - - - base_offset = FILE_Pos(); - - if ( ACCESS_Frame( 2L ) ) - return error; - - count = la->LigatureCount = GET_UShort(); - - FORGET_Frame(); - - la->LigatureAttach = NULL; - - if ( ALLOC_ARRAY( la->LigatureAttach, count, HB_LigatureAttach ) ) - return error; - - lat = la->LigatureAttach; - - for ( n = 0; n < count; n++ ) - { - if ( ACCESS_Frame( 2L ) ) - goto Fail; - - new_offset = GET_UShort() + base_offset; - - FORGET_Frame(); - - cur_offset = FILE_Pos(); - if ( FILE_Seek( new_offset ) || - ( error = Load_LigatureAttach( &lat[n], num_classes, - stream ) ) != HB_Err_Ok ) - goto Fail; - (void)FILE_Seek( cur_offset ); - } - - return HB_Err_Ok; - -Fail: - for ( m = 0; m < n; m++ ) - Free_LigatureAttach( &lat[m], num_classes ); - - FREE( lat ); - return error; -} - - -static void Free_LigatureArray( HB_LigatureArray* la, - HB_UShort num_classes ) -{ - HB_UShort n, count; - - HB_LigatureAttach* lat; - - - if ( la->LigatureAttach ) - { - count = la->LigatureCount; - lat = la->LigatureAttach; - - for ( n = 0; n < count; n++ ) - Free_LigatureAttach( &lat[n], num_classes ); - - FREE( lat ); - } -} - - -/* MarkLigPosFormat1 */ - -static HB_Error Load_MarkLigPos( HB_GPOS_SubTable* st, - HB_Stream stream ) -{ - HB_Error error; - HB_MarkLigPos* mlp = &st->marklig; - - HB_UInt cur_offset, new_offset, base_offset; - - - base_offset = FILE_Pos(); - - if ( ACCESS_Frame( 4L ) ) - return error; - - mlp->PosFormat = GET_UShort(); - new_offset = GET_UShort() + base_offset; - - FORGET_Frame(); - - cur_offset = FILE_Pos(); - if ( FILE_Seek( new_offset ) || - ( error = _HB_OPEN_Load_Coverage( &mlp->MarkCoverage, stream ) ) != HB_Err_Ok ) - return error; - (void)FILE_Seek( cur_offset ); - - if ( ACCESS_Frame( 2L ) ) - goto Fail3; - - new_offset = GET_UShort() + base_offset; - - FORGET_Frame(); - - cur_offset = FILE_Pos(); - if ( FILE_Seek( new_offset ) || - ( error = _HB_OPEN_Load_Coverage( &mlp->LigatureCoverage, - stream ) ) != HB_Err_Ok ) - goto Fail3; - (void)FILE_Seek( cur_offset ); - - if ( ACCESS_Frame( 4L ) ) - goto Fail2; - - mlp->ClassCount = GET_UShort(); - new_offset = GET_UShort() + base_offset; - - FORGET_Frame(); - - cur_offset = FILE_Pos(); - if ( FILE_Seek( new_offset ) || - ( error = Load_MarkArray( &mlp->MarkArray, stream ) ) != HB_Err_Ok ) - goto Fail2; - (void)FILE_Seek( cur_offset ); - - if ( ACCESS_Frame( 2L ) ) - goto Fail1; - - new_offset = GET_UShort() + base_offset; - - FORGET_Frame(); - - cur_offset = FILE_Pos(); - if ( FILE_Seek( new_offset ) || - ( error = Load_LigatureArray( &mlp->LigatureArray, mlp->ClassCount, - stream ) ) != HB_Err_Ok ) - goto Fail1; - - return HB_Err_Ok; - -Fail1: - Free_MarkArray( &mlp->MarkArray ); - -Fail2: - _HB_OPEN_Free_Coverage( &mlp->LigatureCoverage ); - -Fail3: - _HB_OPEN_Free_Coverage( &mlp->MarkCoverage ); - return error; -} - - -static void Free_MarkLigPos( HB_GPOS_SubTable* st) -{ - HB_MarkLigPos* mlp = &st->marklig; - - Free_LigatureArray( &mlp->LigatureArray, mlp->ClassCount ); - Free_MarkArray( &mlp->MarkArray ); - _HB_OPEN_Free_Coverage( &mlp->LigatureCoverage ); - _HB_OPEN_Free_Coverage( &mlp->MarkCoverage ); -} - - -static HB_Error Lookup_MarkLigPos( GPOS_Instance* gpi, - HB_GPOS_SubTable* st, - HB_Buffer buffer, - HB_UShort flags, - HB_UShort context_length, - int nesting_level ) -{ - HB_UShort i, j, mark_index, lig_index, property, class; - HB_UShort mark_glyph; - HB_Fixed x_mark_value, y_mark_value, x_lig_value, y_lig_value; - HB_Error error; - HB_GPOSHeader* gpos = gpi->gpos; - HB_MarkLigPos* mlp = &st->marklig; - - HB_MarkArray* ma; - HB_LigatureArray* la; - HB_LigatureAttach* lat; - HB_ComponentRecord* cr; - HB_UShort comp_index; - HB_Anchor* mark_anchor; - HB_Anchor* lig_anchor; - - HB_Position o; - - HB_UNUSED(nesting_level); - - if ( context_length != 0xFFFF && context_length < 1 ) - return HB_Err_Not_Covered; - - if ( flags & HB_LOOKUP_FLAG_IGNORE_LIGATURES ) - return HB_Err_Not_Covered; - - mark_glyph = IN_CURGLYPH(); - - if ( CHECK_Property( gpos->gdef, IN_CURITEM(), flags, &property ) ) - return error; - - error = _HB_OPEN_Coverage_Index( &mlp->MarkCoverage, mark_glyph, &mark_index ); - if ( error ) - return error; - - /* now we search backwards for a non-mark glyph */ - - i = 1; - j = buffer->in_pos - 1; - - while ( i <= buffer->in_pos ) - { - error = HB_GDEF_Get_Glyph_Property( gpos->gdef, IN_GLYPH( j ), - &property ); - if ( error ) - return error; - - if ( !( property == HB_GDEF_MARK || property & HB_LOOKUP_FLAG_IGNORE_SPECIAL_MARKS ) ) - break; - - i++; - j--; - } - - /* Similar to Lookup_MarkBasePos(), I suspect that this assertion is - too strong, thus it is commented out. */ -#if 0 - if ( property != HB_GDEF_LIGATURE ) - return HB_Err_Not_Covered; -#endif - - if ( i > buffer->in_pos ) - return HB_Err_Not_Covered; - - error = _HB_OPEN_Coverage_Index( &mlp->LigatureCoverage, IN_GLYPH( j ), - &lig_index ); - if ( error ) - return error; - - ma = &mlp->MarkArray; - - if ( mark_index >= ma->MarkCount ) - return ERR(HB_Err_Invalid_SubTable); - - class = ma->MarkRecord[mark_index].Class; - mark_anchor = &ma->MarkRecord[mark_index].MarkAnchor; - - if ( class >= mlp->ClassCount ) - return ERR(HB_Err_Invalid_SubTable); - - la = &mlp->LigatureArray; - - if ( lig_index >= la->LigatureCount ) - return ERR(HB_Err_Invalid_SubTable); - - lat = &la->LigatureAttach[lig_index]; - - /* We must now check whether the ligature ID of the current mark glyph - is identical to the ligature ID of the found ligature. If yes, we - can directly use the component index. If not, we attach the mark - glyph to the last component of the ligature. */ - - if ( IN_LIGID( j ) == IN_LIGID( buffer->in_pos) ) - { - comp_index = IN_COMPONENT( buffer->in_pos ); - if ( comp_index >= lat->ComponentCount ) - return HB_Err_Not_Covered; - } - else - comp_index = lat->ComponentCount - 1; - - cr = &lat->ComponentRecord[comp_index]; - lig_anchor = &cr->LigatureAnchor[class]; - - error = Get_Anchor( gpi, mark_anchor, IN_CURGLYPH(), - &x_mark_value, &y_mark_value ); - if ( error ) - return error; - error = Get_Anchor( gpi, lig_anchor, IN_GLYPH( j ), - &x_lig_value, &y_lig_value ); - if ( error ) - return error; - - /* anchor points are not cumulative */ - - o = POSITION( buffer->in_pos ); - - o->x_pos = x_lig_value - x_mark_value; - o->y_pos = y_lig_value - y_mark_value; - o->x_advance = 0; - o->y_advance = 0; - o->back = i; - - (buffer->in_pos)++; - - return HB_Err_Ok; -} - - -/* LookupType 6 */ - -/* Mark2Array */ - -static HB_Error Load_Mark2Array( HB_Mark2Array* m2a, - HB_UShort num_classes, - HB_Stream stream ) -{ - HB_Error error; - - HB_UShort m, n, count; - HB_UInt cur_offset, new_offset, base_offset; - - HB_Mark2Record *m2r; - HB_Anchor *m2an, *m2ans; - - - base_offset = FILE_Pos(); - - if ( ACCESS_Frame( 2L ) ) - return error; - - count = m2a->Mark2Count = GET_UShort(); - - FORGET_Frame(); - - m2a->Mark2Record = NULL; - - if ( ALLOC_ARRAY( m2a->Mark2Record, count, HB_Mark2Record ) ) - return error; - - m2r = m2a->Mark2Record; - - m2ans = NULL; - - if ( ALLOC_ARRAY( m2ans, count * num_classes, HB_Anchor ) ) - goto Fail; - - for ( m = 0; m < count; m++ ) - { - m2an = m2r[m].Mark2Anchor = m2ans + m * num_classes; - - for ( n = 0; n < num_classes; n++ ) - { - if ( ACCESS_Frame( 2L ) ) - goto Fail; - - new_offset = GET_UShort() + base_offset; - - FORGET_Frame(); - - if (new_offset == base_offset) { - /* Anchor table not provided. Skip loading. - * Some versions of FreeSans hit this. */ - m2an[n].PosFormat = 0; - continue; - } - - cur_offset = FILE_Pos(); - if ( FILE_Seek( new_offset ) || - ( error = Load_Anchor( &m2an[n], stream ) ) != HB_Err_Ok ) - goto Fail; - (void)FILE_Seek( cur_offset ); - } - } - - return HB_Err_Ok; - -Fail: - FREE( m2ans ); - FREE( m2r ); - return error; -} - - -static void Free_Mark2Array( HB_Mark2Array* m2a, - HB_UShort num_classes ) -{ - HB_Mark2Record *m2r; - HB_Anchor *m2ans; - - HB_UNUSED(num_classes); - - if ( m2a->Mark2Record ) - { - m2r = m2a->Mark2Record; - - if ( m2a->Mark2Count ) - { - m2ans = m2r[0].Mark2Anchor; - FREE( m2ans ); - } - - FREE( m2r ); - } -} - - -/* MarkMarkPosFormat1 */ - -static HB_Error Load_MarkMarkPos( HB_GPOS_SubTable* st, - HB_Stream stream ) -{ - HB_Error error; - HB_MarkMarkPos* mmp = &st->markmark; - - HB_UInt cur_offset, new_offset, base_offset; - - - base_offset = FILE_Pos(); - - if ( ACCESS_Frame( 4L ) ) - return error; - - mmp->PosFormat = GET_UShort(); - new_offset = GET_UShort() + base_offset; - - FORGET_Frame(); - - cur_offset = FILE_Pos(); - if ( FILE_Seek( new_offset ) || - ( error = _HB_OPEN_Load_Coverage( &mmp->Mark1Coverage, - stream ) ) != HB_Err_Ok ) - return error; - (void)FILE_Seek( cur_offset ); - - if ( ACCESS_Frame( 2L ) ) - goto Fail3; - - new_offset = GET_UShort() + base_offset; - - FORGET_Frame(); - - cur_offset = FILE_Pos(); - if ( FILE_Seek( new_offset ) || - ( error = _HB_OPEN_Load_Coverage( &mmp->Mark2Coverage, - stream ) ) != HB_Err_Ok ) - goto Fail3; - (void)FILE_Seek( cur_offset ); - - if ( ACCESS_Frame( 4L ) ) - goto Fail2; - - mmp->ClassCount = GET_UShort(); - new_offset = GET_UShort() + base_offset; - - FORGET_Frame(); - - cur_offset = FILE_Pos(); - if ( FILE_Seek( new_offset ) || - ( error = Load_MarkArray( &mmp->Mark1Array, stream ) ) != HB_Err_Ok ) - goto Fail2; - (void)FILE_Seek( cur_offset ); - - if ( ACCESS_Frame( 2L ) ) - goto Fail1; - - new_offset = GET_UShort() + base_offset; - - FORGET_Frame(); - - cur_offset = FILE_Pos(); - if ( FILE_Seek( new_offset ) || - ( error = Load_Mark2Array( &mmp->Mark2Array, mmp->ClassCount, - stream ) ) != HB_Err_Ok ) - goto Fail1; - - return HB_Err_Ok; - -Fail1: - Free_MarkArray( &mmp->Mark1Array ); - -Fail2: - _HB_OPEN_Free_Coverage( &mmp->Mark2Coverage ); - -Fail3: - _HB_OPEN_Free_Coverage( &mmp->Mark1Coverage ); - return error; -} - - -static void Free_MarkMarkPos( HB_GPOS_SubTable* st) -{ - HB_MarkMarkPos* mmp = &st->markmark; - - Free_Mark2Array( &mmp->Mark2Array, mmp->ClassCount ); - Free_MarkArray( &mmp->Mark1Array ); - _HB_OPEN_Free_Coverage( &mmp->Mark2Coverage ); - _HB_OPEN_Free_Coverage( &mmp->Mark1Coverage ); -} - - -static HB_Error Lookup_MarkMarkPos( GPOS_Instance* gpi, - HB_GPOS_SubTable* st, - HB_Buffer buffer, - HB_UShort flags, - HB_UShort context_length, - int nesting_level ) -{ - HB_UShort i, j, mark1_index, mark2_index, property, class; - HB_Fixed x_mark1_value, y_mark1_value, - x_mark2_value, y_mark2_value; - HB_Error error; - HB_GPOSHeader* gpos = gpi->gpos; - HB_MarkMarkPos* mmp = &st->markmark; - - HB_MarkArray* ma1; - HB_Mark2Array* ma2; - HB_Mark2Record* m2r; - HB_Anchor* mark1_anchor; - HB_Anchor* mark2_anchor; - - HB_Position o; - - HB_UNUSED(nesting_level); - - if ( context_length != 0xFFFF && context_length < 1 ) - return HB_Err_Not_Covered; - - if ( flags & HB_LOOKUP_FLAG_IGNORE_MARKS ) - return HB_Err_Not_Covered; - - if ( CHECK_Property( gpos->gdef, IN_CURITEM(), - flags, &property ) ) - return error; - - error = _HB_OPEN_Coverage_Index( &mmp->Mark1Coverage, IN_CURGLYPH(), - &mark1_index ); - if ( error ) - return error; - - /* now we search backwards for a suitable mark glyph until a non-mark - glyph */ - - if ( buffer->in_pos == 0 ) - return HB_Err_Not_Covered; - - i = 1; - j = buffer->in_pos - 1; - while ( i <= buffer->in_pos ) - { - error = HB_GDEF_Get_Glyph_Property( gpos->gdef, IN_GLYPH( j ), - &property ); - if ( error ) - return error; - - if ( !( property == HB_GDEF_MARK || property & HB_LOOKUP_FLAG_IGNORE_SPECIAL_MARKS ) ) - return HB_Err_Not_Covered; - - if ( flags & HB_LOOKUP_FLAG_IGNORE_SPECIAL_MARKS ) - { - if ( property == (flags & 0xFF00) ) - break; - } - else - break; - - i++; - j--; - } - - error = _HB_OPEN_Coverage_Index( &mmp->Mark2Coverage, IN_GLYPH( j ), - &mark2_index ); - if ( error ) - return error; - - ma1 = &mmp->Mark1Array; - - if ( mark1_index >= ma1->MarkCount ) - return ERR(HB_Err_Invalid_SubTable); - - class = ma1->MarkRecord[mark1_index].Class; - mark1_anchor = &ma1->MarkRecord[mark1_index].MarkAnchor; - - if ( class >= mmp->ClassCount ) - return ERR(HB_Err_Invalid_SubTable); - - ma2 = &mmp->Mark2Array; - - if ( mark2_index >= ma2->Mark2Count ) - return ERR(HB_Err_Invalid_SubTable); - - m2r = &ma2->Mark2Record[mark2_index]; - mark2_anchor = &m2r->Mark2Anchor[class]; - - error = Get_Anchor( gpi, mark1_anchor, IN_CURGLYPH(), - &x_mark1_value, &y_mark1_value ); - if ( error ) - return error; - error = Get_Anchor( gpi, mark2_anchor, IN_GLYPH( j ), - &x_mark2_value, &y_mark2_value ); - if ( error ) - return error; - - /* anchor points are not cumulative */ - - o = POSITION( buffer->in_pos ); - - o->x_pos = x_mark2_value - x_mark1_value; - o->y_pos = y_mark2_value - y_mark1_value; - o->x_advance = 0; - o->y_advance = 0; - o->back = 1; - - (buffer->in_pos)++; - - return HB_Err_Ok; -} - - -/* Do the actual positioning for a context positioning (either format - 7 or 8). This is only called after we've determined that the stream - matches the subrule. */ - -static HB_Error Do_ContextPos( GPOS_Instance* gpi, - HB_UShort GlyphCount, - HB_UShort PosCount, - HB_PosLookupRecord* pos, - HB_Buffer buffer, - int nesting_level ) -{ - HB_Error error; - HB_UInt i, old_pos; - - - i = 0; - - while ( i < GlyphCount ) - { - if ( PosCount && i == pos->SequenceIndex ) - { - old_pos = buffer->in_pos; - - /* Do a positioning */ - - error = GPOS_Do_Glyph_Lookup( gpi, pos->LookupListIndex, buffer, - GlyphCount, nesting_level ); - - if ( error ) - return error; - - pos++; - PosCount--; - i += buffer->in_pos - old_pos; - } - else - { - i++; - (buffer->in_pos)++; - } - } - - return HB_Err_Ok; -} - - -/* LookupType 7 */ - -/* PosRule */ - -static HB_Error Load_PosRule( HB_PosRule* pr, - HB_Stream stream ) -{ - HB_Error error; - - HB_UShort n, count; - HB_UShort* i; - - HB_PosLookupRecord* plr; - - - if ( ACCESS_Frame( 4L ) ) - return error; - - pr->GlyphCount = GET_UShort(); - pr->PosCount = GET_UShort(); - - FORGET_Frame(); - - pr->Input = NULL; - - count = pr->GlyphCount - 1; /* only GlyphCount - 1 elements */ - - if ( ALLOC_ARRAY( pr->Input, count, HB_UShort ) ) - return error; - - i = pr->Input; - - if ( ACCESS_Frame( count * 2L ) ) - goto Fail2; - - for ( n = 0; n < count; n++ ) - i[n] = GET_UShort(); - - FORGET_Frame(); - - pr->PosLookupRecord = NULL; - - count = pr->PosCount; - - if ( ALLOC_ARRAY( pr->PosLookupRecord, count, HB_PosLookupRecord ) ) - goto Fail2; - - plr = pr->PosLookupRecord; - - if ( ACCESS_Frame( count * 4L ) ) - goto Fail1; - - for ( n = 0; n < count; n++ ) - { - plr[n].SequenceIndex = GET_UShort(); - plr[n].LookupListIndex = GET_UShort(); - } - - FORGET_Frame(); - - return HB_Err_Ok; - -Fail1: - FREE( plr ); - -Fail2: - FREE( i ); - return error; -} - - -static void Free_PosRule( HB_PosRule* pr ) -{ - FREE( pr->PosLookupRecord ); - FREE( pr->Input ); -} - - -/* PosRuleSet */ - -static HB_Error Load_PosRuleSet( HB_PosRuleSet* prs, - HB_Stream stream ) -{ - HB_Error error; - - HB_UShort n, m, count; - HB_UInt cur_offset, new_offset, base_offset; - - HB_PosRule* pr; - - - base_offset = FILE_Pos(); - - if ( ACCESS_Frame( 2L ) ) - return error; - - count = prs->PosRuleCount = GET_UShort(); - - FORGET_Frame(); - - prs->PosRule = NULL; - - if ( ALLOC_ARRAY( prs->PosRule, count, HB_PosRule ) ) - return error; - - pr = prs->PosRule; - - for ( n = 0; n < count; n++ ) - { - if ( ACCESS_Frame( 2L ) ) - goto Fail; - - new_offset = GET_UShort() + base_offset; - - FORGET_Frame(); - - cur_offset = FILE_Pos(); - if ( FILE_Seek( new_offset ) || - ( error = Load_PosRule( &pr[n], stream ) ) != HB_Err_Ok ) - goto Fail; - (void)FILE_Seek( cur_offset ); - } - - return HB_Err_Ok; - -Fail: - for ( m = 0; m < n; m++ ) - Free_PosRule( &pr[m] ); - - FREE( pr ); - return error; -} - - -static void Free_PosRuleSet( HB_PosRuleSet* prs ) -{ - HB_UShort n, count; - - HB_PosRule* pr; - - - if ( prs->PosRule ) - { - count = prs->PosRuleCount; - pr = prs->PosRule; - - for ( n = 0; n < count; n++ ) - Free_PosRule( &pr[n] ); - - FREE( pr ); - } -} - - -/* ContextPosFormat1 */ - -static HB_Error Load_ContextPos1( HB_ContextPosFormat1* cpf1, - HB_Stream stream ) -{ - HB_Error error; - - HB_UShort n, m, count; - HB_UInt cur_offset, new_offset, base_offset; - - HB_PosRuleSet* prs; - - - base_offset = FILE_Pos() - 2L; - - if ( ACCESS_Frame( 2L ) ) - return error; - - new_offset = GET_UShort() + base_offset; - - FORGET_Frame(); - - cur_offset = FILE_Pos(); - if ( FILE_Seek( new_offset ) || - ( error = _HB_OPEN_Load_Coverage( &cpf1->Coverage, stream ) ) != HB_Err_Ok ) - return error; - (void)FILE_Seek( cur_offset ); - - if ( ACCESS_Frame( 2L ) ) - goto Fail2; - - count = cpf1->PosRuleSetCount = GET_UShort(); - - FORGET_Frame(); - - cpf1->PosRuleSet = NULL; - - if ( ALLOC_ARRAY( cpf1->PosRuleSet, count, HB_PosRuleSet ) ) - goto Fail2; - - prs = cpf1->PosRuleSet; - - for ( n = 0; n < count; n++ ) - { - if ( ACCESS_Frame( 2L ) ) - goto Fail1; - - new_offset = GET_UShort() + base_offset; - - FORGET_Frame(); - - cur_offset = FILE_Pos(); - if ( FILE_Seek( new_offset ) || - ( error = Load_PosRuleSet( &prs[n], stream ) ) != HB_Err_Ok ) - goto Fail1; - (void)FILE_Seek( cur_offset ); - } - - return HB_Err_Ok; - -Fail1: - for ( m = 0; m < n; m++ ) - Free_PosRuleSet( &prs[m] ); - - FREE( prs ); - -Fail2: - _HB_OPEN_Free_Coverage( &cpf1->Coverage ); - return error; -} - - -static void Free_ContextPos1( HB_ContextPosFormat1* cpf1 ) -{ - HB_UShort n, count; - - HB_PosRuleSet* prs; - - - if ( cpf1->PosRuleSet ) - { - count = cpf1->PosRuleSetCount; - prs = cpf1->PosRuleSet; - - for ( n = 0; n < count; n++ ) - Free_PosRuleSet( &prs[n] ); - - FREE( prs ); - } - - _HB_OPEN_Free_Coverage( &cpf1->Coverage ); -} - - -/* PosClassRule */ - -static HB_Error Load_PosClassRule( HB_ContextPosFormat2* cpf2, - HB_PosClassRule* pcr, - HB_Stream stream ) -{ - HB_Error error; - - HB_UShort n, count; - - HB_UShort* c; - HB_PosLookupRecord* plr; - - - if ( ACCESS_Frame( 4L ) ) - return error; - - pcr->GlyphCount = GET_UShort(); - pcr->PosCount = GET_UShort(); - - FORGET_Frame(); - - if ( pcr->GlyphCount > cpf2->MaxContextLength ) - cpf2->MaxContextLength = pcr->GlyphCount; - - pcr->Class = NULL; - - count = pcr->GlyphCount - 1; /* only GlyphCount - 1 elements */ - - if ( ALLOC_ARRAY( pcr->Class, count, HB_UShort ) ) - return error; - - c = pcr->Class; - - if ( ACCESS_Frame( count * 2L ) ) - goto Fail2; - - for ( n = 0; n < count; n++ ) - c[n] = GET_UShort(); - - FORGET_Frame(); - - pcr->PosLookupRecord = NULL; - - count = pcr->PosCount; - - if ( ALLOC_ARRAY( pcr->PosLookupRecord, count, HB_PosLookupRecord ) ) - goto Fail2; - - plr = pcr->PosLookupRecord; - - if ( ACCESS_Frame( count * 4L ) ) - goto Fail1; - - for ( n = 0; n < count; n++ ) - { - plr[n].SequenceIndex = GET_UShort(); - plr[n].LookupListIndex = GET_UShort(); - } - - FORGET_Frame(); - - return HB_Err_Ok; - -Fail1: - FREE( plr ); - -Fail2: - FREE( c ); - return error; -} - - -static void Free_PosClassRule( HB_PosClassRule* pcr ) -{ - FREE( pcr->PosLookupRecord ); - FREE( pcr->Class ); -} - - -/* PosClassSet */ - -static HB_Error Load_PosClassSet( HB_ContextPosFormat2* cpf2, - HB_PosClassSet* pcs, - HB_Stream stream ) -{ - HB_Error error; - - HB_UShort n, m, count; - HB_UInt cur_offset, new_offset, base_offset; - - HB_PosClassRule* pcr; - - - base_offset = FILE_Pos(); - - if ( ACCESS_Frame( 2L ) ) - return error; - - count = pcs->PosClassRuleCount = GET_UShort(); - - FORGET_Frame(); - - pcs->PosClassRule = NULL; - - if ( ALLOC_ARRAY( pcs->PosClassRule, count, HB_PosClassRule ) ) - return error; - - pcr = pcs->PosClassRule; - - for ( n = 0; n < count; n++ ) - { - if ( ACCESS_Frame( 2L ) ) - goto Fail; - - new_offset = GET_UShort() + base_offset; - - FORGET_Frame(); - - cur_offset = FILE_Pos(); - if ( FILE_Seek( new_offset ) || - ( error = Load_PosClassRule( cpf2, &pcr[n], - stream ) ) != HB_Err_Ok ) - goto Fail; - (void)FILE_Seek( cur_offset ); - } - - return HB_Err_Ok; - -Fail: - for ( m = 0; m < n; m++ ) - Free_PosClassRule( &pcr[m] ); - - FREE( pcr ); - return error; -} - - -static void Free_PosClassSet( HB_PosClassSet* pcs ) -{ - HB_UShort n, count; - - HB_PosClassRule* pcr; - - - if ( pcs->PosClassRule ) - { - count = pcs->PosClassRuleCount; - pcr = pcs->PosClassRule; - - for ( n = 0; n < count; n++ ) - Free_PosClassRule( &pcr[n] ); - - FREE( pcr ); - } -} - - -/* ContextPosFormat2 */ - -static HB_Error Load_ContextPos2( HB_ContextPosFormat2* cpf2, - HB_Stream stream ) -{ - HB_Error error; - - HB_UShort n, m, count; - HB_UInt cur_offset, new_offset, base_offset; - - HB_PosClassSet* pcs; - - - base_offset = FILE_Pos() - 2; - - if ( ACCESS_Frame( 2L ) ) - return error; - - new_offset = GET_UShort() + base_offset; - - FORGET_Frame(); - - cur_offset = FILE_Pos(); - if ( FILE_Seek( new_offset ) || - ( error = _HB_OPEN_Load_Coverage( &cpf2->Coverage, stream ) ) != HB_Err_Ok ) - return error; - (void)FILE_Seek( cur_offset ); - - if ( ACCESS_Frame( 4L ) ) - goto Fail3; - - new_offset = GET_UShort() + base_offset; - - /* `PosClassSetCount' is the upper limit for class values, thus we - read it now to make an additional safety check. */ - - count = cpf2->PosClassSetCount = GET_UShort(); - - FORGET_Frame(); - - cur_offset = FILE_Pos(); - if ( FILE_Seek( new_offset ) || - ( error = _HB_OPEN_Load_ClassDefinition( &cpf2->ClassDef, count, - stream ) ) != HB_Err_Ok ) - goto Fail3; - (void)FILE_Seek( cur_offset ); - - cpf2->PosClassSet = NULL; - cpf2->MaxContextLength = 0; - - if ( ALLOC_ARRAY( cpf2->PosClassSet, count, HB_PosClassSet ) ) - goto Fail2; - - pcs = cpf2->PosClassSet; - - for ( n = 0; n < count; n++ ) - { - if ( ACCESS_Frame( 2L ) ) - goto Fail1; - - new_offset = GET_UShort() + base_offset; - - FORGET_Frame(); - - if ( new_offset != base_offset ) /* not a NULL offset */ - { - cur_offset = FILE_Pos(); - if ( FILE_Seek( new_offset ) || - ( error = Load_PosClassSet( cpf2, &pcs[n], - stream ) ) != HB_Err_Ok ) - goto Fail1; - (void)FILE_Seek( cur_offset ); - } - else - { - /* we create a PosClassSet table with no entries */ - - cpf2->PosClassSet[n].PosClassRuleCount = 0; - cpf2->PosClassSet[n].PosClassRule = NULL; - } - } - - return HB_Err_Ok; - -Fail1: - for ( m = 0; m < n; n++ ) - Free_PosClassSet( &pcs[m] ); - - FREE( pcs ); - -Fail2: - _HB_OPEN_Free_ClassDefinition( &cpf2->ClassDef ); - -Fail3: - _HB_OPEN_Free_Coverage( &cpf2->Coverage ); - return error; -} - - -static void Free_ContextPos2( HB_ContextPosFormat2* cpf2 ) -{ - HB_UShort n, count; - - HB_PosClassSet* pcs; - - - if ( cpf2->PosClassSet ) - { - count = cpf2->PosClassSetCount; - pcs = cpf2->PosClassSet; - - for ( n = 0; n < count; n++ ) - Free_PosClassSet( &pcs[n] ); - - FREE( pcs ); - } - - _HB_OPEN_Free_ClassDefinition( &cpf2->ClassDef ); - _HB_OPEN_Free_Coverage( &cpf2->Coverage ); -} - - -/* ContextPosFormat3 */ - -static HB_Error Load_ContextPos3( HB_ContextPosFormat3* cpf3, - HB_Stream stream ) -{ - HB_Error error; - - HB_UShort n, count; - HB_UInt cur_offset, new_offset, base_offset; - - HB_Coverage* c; - HB_PosLookupRecord* plr; - - - base_offset = FILE_Pos() - 2L; - - if ( ACCESS_Frame( 4L ) ) - return error; - - cpf3->GlyphCount = GET_UShort(); - cpf3->PosCount = GET_UShort(); - - FORGET_Frame(); - - cpf3->Coverage = NULL; - - count = cpf3->GlyphCount; - - if ( ALLOC_ARRAY( cpf3->Coverage, count, HB_Coverage ) ) - return error; - - c = cpf3->Coverage; - - for ( n = 0; n < count; n++ ) - { - if ( ACCESS_Frame( 2L ) ) - goto Fail2; - - new_offset = GET_UShort() + base_offset; - - FORGET_Frame(); - - cur_offset = FILE_Pos(); - if ( FILE_Seek( new_offset ) || - ( error = _HB_OPEN_Load_Coverage( &c[n], stream ) ) != HB_Err_Ok ) - goto Fail2; - (void)FILE_Seek( cur_offset ); - } - - cpf3->PosLookupRecord = NULL; - - count = cpf3->PosCount; - - if ( ALLOC_ARRAY( cpf3->PosLookupRecord, count, HB_PosLookupRecord ) ) - goto Fail2; - - plr = cpf3->PosLookupRecord; - - if ( ACCESS_Frame( count * 4L ) ) - goto Fail1; - - for ( n = 0; n < count; n++ ) - { - plr[n].SequenceIndex = GET_UShort(); - plr[n].LookupListIndex = GET_UShort(); - } - - FORGET_Frame(); - - return HB_Err_Ok; - -Fail1: - FREE( plr ); - -Fail2: - for ( n = 0; n < count; n++ ) - _HB_OPEN_Free_Coverage( &c[n] ); - - FREE( c ); - return error; -} - - -static void Free_ContextPos3( HB_ContextPosFormat3* cpf3 ) -{ - HB_UShort n, count; - - HB_Coverage* c; - - - FREE( cpf3->PosLookupRecord ); - - if ( cpf3->Coverage ) - { - count = cpf3->GlyphCount; - c = cpf3->Coverage; - - for ( n = 0; n < count; n++ ) - _HB_OPEN_Free_Coverage( &c[n] ); - - FREE( c ); - } -} - - -/* ContextPos */ - -static HB_Error Load_ContextPos( HB_GPOS_SubTable* st, - HB_Stream stream ) -{ - HB_Error error; - HB_ContextPos* cp = &st->context; - - - if ( ACCESS_Frame( 2L ) ) - return error; - - cp->PosFormat = GET_UShort(); - - FORGET_Frame(); - - switch ( cp->PosFormat ) - { - case 1: - return Load_ContextPos1( &cp->cpf.cpf1, stream ); - - case 2: - return Load_ContextPos2( &cp->cpf.cpf2, stream ); - - case 3: - return Load_ContextPos3( &cp->cpf.cpf3, stream ); - - default: - return ERR(HB_Err_Invalid_SubTable_Format); - } - - return HB_Err_Ok; /* never reached */ -} - - -static void Free_ContextPos( HB_GPOS_SubTable* st ) -{ - HB_ContextPos* cp = &st->context; - - switch ( cp->PosFormat ) - { - case 1: Free_ContextPos1( &cp->cpf.cpf1 ); break; - case 2: Free_ContextPos2( &cp->cpf.cpf2 ); break; - case 3: Free_ContextPos3( &cp->cpf.cpf3 ); break; - default: break; - } -} - - -static HB_Error Lookup_ContextPos1( GPOS_Instance* gpi, - HB_ContextPosFormat1* cpf1, - HB_Buffer buffer, - HB_UShort flags, - HB_UShort context_length, - int nesting_level ) -{ - HB_UShort index, property; - HB_UShort i, j, k, numpr; - HB_Error error; - HB_GPOSHeader* gpos = gpi->gpos; - - HB_PosRule* pr; - HB_GDEFHeader* gdef; - - - gdef = gpos->gdef; - - if ( CHECK_Property( gdef, IN_CURITEM(), flags, &property ) ) - return error; - - error = _HB_OPEN_Coverage_Index( &cpf1->Coverage, IN_CURGLYPH(), &index ); - if ( error ) - return error; - - pr = cpf1->PosRuleSet[index].PosRule; - numpr = cpf1->PosRuleSet[index].PosRuleCount; - - for ( k = 0; k < numpr; k++ ) - { - if ( context_length != 0xFFFF && context_length < pr[k].GlyphCount ) - goto next_posrule; - - if ( buffer->in_pos + pr[k].GlyphCount > buffer->in_length ) - goto next_posrule; /* context is too long */ - - for ( i = 1, j = buffer->in_pos + 1; i < pr[k].GlyphCount; i++, j++ ) - { - while ( CHECK_Property( gdef, IN_ITEM( j ), flags, &property ) ) - { - if ( error && error != HB_Err_Not_Covered ) - return error; - - if ( j + pr[k].GlyphCount - i == (HB_Int)buffer->in_length ) - goto next_posrule; - j++; - } - - if ( IN_GLYPH( j ) != pr[k].Input[i - 1] ) - goto next_posrule; - } - - return Do_ContextPos( gpi, pr[k].GlyphCount, - pr[k].PosCount, pr[k].PosLookupRecord, - buffer, - nesting_level ); - - next_posrule: - ; - } - - return HB_Err_Not_Covered; -} - - -static HB_Error Lookup_ContextPos2( GPOS_Instance* gpi, - HB_ContextPosFormat2* cpf2, - HB_Buffer buffer, - HB_UShort flags, - HB_UShort context_length, - int nesting_level ) -{ - HB_UShort index, property; - HB_Error error; - HB_UShort i, j, k, known_classes; - - HB_UShort* classes; - HB_UShort* cl; - HB_GPOSHeader* gpos = gpi->gpos; - - HB_PosClassSet* pcs; - HB_PosClassRule* pr; - HB_GDEFHeader* gdef; - - - gdef = gpos->gdef; - - if ( CHECK_Property( gdef, IN_CURITEM(), flags, &property ) ) - return error; - - /* Note: The coverage table in format 2 doesn't give an index into - anything. It just lets us know whether or not we need to - do any lookup at all. */ - - error = _HB_OPEN_Coverage_Index( &cpf2->Coverage, IN_CURGLYPH(), &index ); - if ( error ) - return error; - - if (cpf2->MaxContextLength < 1) - return HB_Err_Not_Covered; - - if ( ALLOC_ARRAY( classes, cpf2->MaxContextLength, HB_UShort ) ) - return error; - - error = _HB_OPEN_Get_Class( &cpf2->ClassDef, IN_CURGLYPH(), - &classes[0], NULL ); - if ( error && error != HB_Err_Not_Covered ) - goto End; - known_classes = 0; - - pcs = &cpf2->PosClassSet[classes[0]]; - if ( !pcs ) - { - error = ERR(HB_Err_Invalid_SubTable); - goto End; - } - - for ( k = 0; k < pcs->PosClassRuleCount; k++ ) - { - pr = &pcs->PosClassRule[k]; - - if ( context_length != 0xFFFF && context_length < pr->GlyphCount ) - goto next_posclassrule; - - if ( buffer->in_pos + pr->GlyphCount > buffer->in_length ) - goto next_posclassrule; /* context is too long */ - - cl = pr->Class; - - /* Start at 1 because [0] is implied */ - - for ( i = 1, j = buffer->in_pos + 1; i < pr->GlyphCount; i++, j++ ) - { - while ( CHECK_Property( gdef, IN_ITEM( j ), flags, &property ) ) - { - if ( error && error != HB_Err_Not_Covered ) - goto End; - - if ( j + pr->GlyphCount - i == (HB_Int)buffer->in_length ) - goto next_posclassrule; - j++; - } - - if ( i > known_classes ) - { - /* Keeps us from having to do this for each rule */ - - error = _HB_OPEN_Get_Class( &cpf2->ClassDef, IN_GLYPH( j ), &classes[i], NULL ); - if ( error && error != HB_Err_Not_Covered ) - goto End; - known_classes = i; - } - - if ( cl[i - 1] != classes[i] ) - goto next_posclassrule; - } - - error = Do_ContextPos( gpi, pr->GlyphCount, - pr->PosCount, pr->PosLookupRecord, - buffer, - nesting_level ); - goto End; - - next_posclassrule: - ; - } - - error = HB_Err_Not_Covered; - -End: - FREE( classes ); - return error; -} - - -static HB_Error Lookup_ContextPos3( GPOS_Instance* gpi, - HB_ContextPosFormat3* cpf3, - HB_Buffer buffer, - HB_UShort flags, - HB_UShort context_length, - int nesting_level ) -{ - HB_Error error; - HB_UShort index, i, j, property; - HB_GPOSHeader* gpos = gpi->gpos; - - HB_Coverage* c; - HB_GDEFHeader* gdef; - - - gdef = gpos->gdef; - - if ( CHECK_Property( gdef, IN_CURITEM(), flags, &property ) ) - return error; - - if ( context_length != 0xFFFF && context_length < cpf3->GlyphCount ) - return HB_Err_Not_Covered; - - if ( buffer->in_pos + cpf3->GlyphCount > buffer->in_length ) - return HB_Err_Not_Covered; /* context is too long */ - - c = cpf3->Coverage; - - for ( i = 1, j = 1; i < cpf3->GlyphCount; i++, j++ ) - { - while ( CHECK_Property( gdef, IN_ITEM( j ), flags, &property ) ) - { - if ( error && error != HB_Err_Not_Covered ) - return error; - - if ( j + cpf3->GlyphCount - i == (HB_Int)buffer->in_length ) - return HB_Err_Not_Covered; - j++; - } - - error = _HB_OPEN_Coverage_Index( &c[i], IN_GLYPH( j ), &index ); - if ( error ) - return error; - } - - return Do_ContextPos( gpi, cpf3->GlyphCount, - cpf3->PosCount, cpf3->PosLookupRecord, - buffer, - nesting_level ); -} - - -static HB_Error Lookup_ContextPos( GPOS_Instance* gpi, - HB_GPOS_SubTable* st, - HB_Buffer buffer, - HB_UShort flags, - HB_UShort context_length, - int nesting_level ) -{ - HB_ContextPos* cp = &st->context; - - switch ( cp->PosFormat ) - { - case 1: - return Lookup_ContextPos1( gpi, &cp->cpf.cpf1, buffer, - flags, context_length, nesting_level ); - - case 2: - return Lookup_ContextPos2( gpi, &cp->cpf.cpf2, buffer, - flags, context_length, nesting_level ); - - case 3: - return Lookup_ContextPos3( gpi, &cp->cpf.cpf3, buffer, - flags, context_length, nesting_level ); - - default: - return ERR(HB_Err_Invalid_SubTable_Format); - } - - return HB_Err_Ok; /* never reached */ -} - - -/* LookupType 8 */ - -/* ChainPosRule */ - -static HB_Error Load_ChainPosRule( HB_ChainPosRule* cpr, - HB_Stream stream ) -{ - HB_Error error; - - HB_UShort n, count; - HB_UShort* b; - HB_UShort* i; - HB_UShort* l; - - HB_PosLookupRecord* plr; - - - if ( ACCESS_Frame( 2L ) ) - return error; - - cpr->BacktrackGlyphCount = GET_UShort(); - - FORGET_Frame(); - - cpr->Backtrack = NULL; - - count = cpr->BacktrackGlyphCount; - - if ( ALLOC_ARRAY( cpr->Backtrack, count, HB_UShort ) ) - return error; - - b = cpr->Backtrack; - - if ( ACCESS_Frame( count * 2L ) ) - goto Fail4; - - for ( n = 0; n < count; n++ ) - b[n] = GET_UShort(); - - FORGET_Frame(); - - if ( ACCESS_Frame( 2L ) ) - goto Fail4; - - cpr->InputGlyphCount = GET_UShort(); - - FORGET_Frame(); - - cpr->Input = NULL; - - count = cpr->InputGlyphCount - 1; /* only InputGlyphCount - 1 elements */ - - if ( ALLOC_ARRAY( cpr->Input, count, HB_UShort ) ) - goto Fail4; - - i = cpr->Input; - - if ( ACCESS_Frame( count * 2L ) ) - goto Fail3; - - for ( n = 0; n < count; n++ ) - i[n] = GET_UShort(); - - FORGET_Frame(); - - if ( ACCESS_Frame( 2L ) ) - goto Fail3; - - cpr->LookaheadGlyphCount = GET_UShort(); - - FORGET_Frame(); - - cpr->Lookahead = NULL; - - count = cpr->LookaheadGlyphCount; - - if ( ALLOC_ARRAY( cpr->Lookahead, count, HB_UShort ) ) - goto Fail3; - - l = cpr->Lookahead; - - if ( ACCESS_Frame( count * 2L ) ) - goto Fail2; - - for ( n = 0; n < count; n++ ) - l[n] = GET_UShort(); - - FORGET_Frame(); - - if ( ACCESS_Frame( 2L ) ) - goto Fail2; - - cpr->PosCount = GET_UShort(); - - FORGET_Frame(); - - cpr->PosLookupRecord = NULL; - - count = cpr->PosCount; - - if ( ALLOC_ARRAY( cpr->PosLookupRecord, count, HB_PosLookupRecord ) ) - goto Fail2; - - plr = cpr->PosLookupRecord; - - if ( ACCESS_Frame( count * 4L ) ) - goto Fail1; - - for ( n = 0; n < count; n++ ) - { - plr[n].SequenceIndex = GET_UShort(); - plr[n].LookupListIndex = GET_UShort(); - } - - FORGET_Frame(); - - return HB_Err_Ok; - -Fail1: - FREE( plr ); - -Fail2: - FREE( l ); - -Fail3: - FREE( i ); - -Fail4: - FREE( b ); - return error; -} - - -static void Free_ChainPosRule( HB_ChainPosRule* cpr ) -{ - FREE( cpr->PosLookupRecord ); - FREE( cpr->Lookahead ); - FREE( cpr->Input ); - FREE( cpr->Backtrack ); -} - - -/* ChainPosRuleSet */ - -static HB_Error Load_ChainPosRuleSet( HB_ChainPosRuleSet* cprs, - HB_Stream stream ) -{ - HB_Error error; - - HB_UShort n, m, count; - HB_UInt cur_offset, new_offset, base_offset; - - HB_ChainPosRule* cpr; - - - base_offset = FILE_Pos(); - - if ( ACCESS_Frame( 2L ) ) - return error; - - count = cprs->ChainPosRuleCount = GET_UShort(); - - FORGET_Frame(); - - cprs->ChainPosRule = NULL; - - if ( ALLOC_ARRAY( cprs->ChainPosRule, count, HB_ChainPosRule ) ) - return error; - - cpr = cprs->ChainPosRule; - - for ( n = 0; n < count; n++ ) - { - if ( ACCESS_Frame( 2L ) ) - goto Fail; - - new_offset = GET_UShort() + base_offset; - - FORGET_Frame(); - - cur_offset = FILE_Pos(); - if ( FILE_Seek( new_offset ) || - ( error = Load_ChainPosRule( &cpr[n], stream ) ) != HB_Err_Ok ) - goto Fail; - (void)FILE_Seek( cur_offset ); - } - - return HB_Err_Ok; - -Fail: - for ( m = 0; m < n; m++ ) - Free_ChainPosRule( &cpr[m] ); - - FREE( cpr ); - return error; -} - - -static void Free_ChainPosRuleSet( HB_ChainPosRuleSet* cprs ) -{ - HB_UShort n, count; - - HB_ChainPosRule* cpr; - - - if ( cprs->ChainPosRule ) - { - count = cprs->ChainPosRuleCount; - cpr = cprs->ChainPosRule; - - for ( n = 0; n < count; n++ ) - Free_ChainPosRule( &cpr[n] ); - - FREE( cpr ); - } -} - - -/* ChainContextPosFormat1 */ - -static HB_Error Load_ChainContextPos1( HB_ChainContextPosFormat1* ccpf1, - HB_Stream stream ) -{ - HB_Error error; - - HB_UShort n, m, count; - HB_UInt cur_offset, new_offset, base_offset; - - HB_ChainPosRuleSet* cprs; - - - base_offset = FILE_Pos() - 2L; - - if ( ACCESS_Frame( 2L ) ) - return error; - - new_offset = GET_UShort() + base_offset; - - FORGET_Frame(); - - cur_offset = FILE_Pos(); - if ( FILE_Seek( new_offset ) || - ( error = _HB_OPEN_Load_Coverage( &ccpf1->Coverage, stream ) ) != HB_Err_Ok ) - return error; - (void)FILE_Seek( cur_offset ); - - if ( ACCESS_Frame( 2L ) ) - goto Fail2; - - count = ccpf1->ChainPosRuleSetCount = GET_UShort(); - - FORGET_Frame(); - - ccpf1->ChainPosRuleSet = NULL; - - if ( ALLOC_ARRAY( ccpf1->ChainPosRuleSet, count, HB_ChainPosRuleSet ) ) - goto Fail2; - - cprs = ccpf1->ChainPosRuleSet; - - for ( n = 0; n < count; n++ ) - { - if ( ACCESS_Frame( 2L ) ) - goto Fail1; - - new_offset = GET_UShort() + base_offset; - - FORGET_Frame(); - - cur_offset = FILE_Pos(); - if ( FILE_Seek( new_offset ) || - ( error = Load_ChainPosRuleSet( &cprs[n], stream ) ) != HB_Err_Ok ) - goto Fail1; - (void)FILE_Seek( cur_offset ); - } - - return HB_Err_Ok; - -Fail1: - for ( m = 0; m < n; m++ ) - Free_ChainPosRuleSet( &cprs[m] ); - - FREE( cprs ); - -Fail2: - _HB_OPEN_Free_Coverage( &ccpf1->Coverage ); - return error; -} - - -static void Free_ChainContextPos1( HB_ChainContextPosFormat1* ccpf1 ) -{ - HB_UShort n, count; - - HB_ChainPosRuleSet* cprs; - - - if ( ccpf1->ChainPosRuleSet ) - { - count = ccpf1->ChainPosRuleSetCount; - cprs = ccpf1->ChainPosRuleSet; - - for ( n = 0; n < count; n++ ) - Free_ChainPosRuleSet( &cprs[n] ); - - FREE( cprs ); - } - - _HB_OPEN_Free_Coverage( &ccpf1->Coverage ); -} - - -/* ChainPosClassRule */ - -static HB_Error Load_ChainPosClassRule( - HB_ChainContextPosFormat2* ccpf2, - HB_ChainPosClassRule* cpcr, - HB_Stream stream ) -{ - HB_Error error; - - HB_UShort n, count; - - HB_UShort* b; - HB_UShort* i; - HB_UShort* l; - HB_PosLookupRecord* plr; - - - if ( ACCESS_Frame( 2L ) ) - return error; - - cpcr->BacktrackGlyphCount = GET_UShort(); - - FORGET_Frame(); - - if ( cpcr->BacktrackGlyphCount > ccpf2->MaxBacktrackLength ) - ccpf2->MaxBacktrackLength = cpcr->BacktrackGlyphCount; - - cpcr->Backtrack = NULL; - - count = cpcr->BacktrackGlyphCount; - - if ( ALLOC_ARRAY( cpcr->Backtrack, count, HB_UShort ) ) - return error; - - b = cpcr->Backtrack; - - if ( ACCESS_Frame( count * 2L ) ) - goto Fail4; - - for ( n = 0; n < count; n++ ) - b[n] = GET_UShort(); - - FORGET_Frame(); - - if ( ACCESS_Frame( 2L ) ) - goto Fail4; - - cpcr->InputGlyphCount = GET_UShort(); - - if ( cpcr->InputGlyphCount > ccpf2->MaxInputLength ) - ccpf2->MaxInputLength = cpcr->InputGlyphCount; - - FORGET_Frame(); - - cpcr->Input = NULL; - - count = cpcr->InputGlyphCount - 1; /* only InputGlyphCount - 1 elements */ - - if ( ALLOC_ARRAY( cpcr->Input, count, HB_UShort ) ) - goto Fail4; - - i = cpcr->Input; - - if ( ACCESS_Frame( count * 2L ) ) - goto Fail3; - - for ( n = 0; n < count; n++ ) - i[n] = GET_UShort(); - - FORGET_Frame(); - - if ( ACCESS_Frame( 2L ) ) - goto Fail3; - - cpcr->LookaheadGlyphCount = GET_UShort(); - - FORGET_Frame(); - - if ( cpcr->LookaheadGlyphCount > ccpf2->MaxLookaheadLength ) - ccpf2->MaxLookaheadLength = cpcr->LookaheadGlyphCount; - - cpcr->Lookahead = NULL; - - count = cpcr->LookaheadGlyphCount; - - if ( ALLOC_ARRAY( cpcr->Lookahead, count, HB_UShort ) ) - goto Fail3; - - l = cpcr->Lookahead; - - if ( ACCESS_Frame( count * 2L ) ) - goto Fail2; - - for ( n = 0; n < count; n++ ) - l[n] = GET_UShort(); - - FORGET_Frame(); - - if ( ACCESS_Frame( 2L ) ) - goto Fail2; - - cpcr->PosCount = GET_UShort(); - - FORGET_Frame(); - - cpcr->PosLookupRecord = NULL; - - count = cpcr->PosCount; - - if ( ALLOC_ARRAY( cpcr->PosLookupRecord, count, HB_PosLookupRecord ) ) - goto Fail2; - - plr = cpcr->PosLookupRecord; - - if ( ACCESS_Frame( count * 4L ) ) - goto Fail1; - - for ( n = 0; n < count; n++ ) - { - plr[n].SequenceIndex = GET_UShort(); - plr[n].LookupListIndex = GET_UShort(); - } - - FORGET_Frame(); - - return HB_Err_Ok; - -Fail1: - FREE( plr ); - -Fail2: - FREE( l ); - -Fail3: - FREE( i ); - -Fail4: - FREE( b ); - return error; -} - - -static void Free_ChainPosClassRule( HB_ChainPosClassRule* cpcr ) -{ - FREE( cpcr->PosLookupRecord ); - FREE( cpcr->Lookahead ); - FREE( cpcr->Input ); - FREE( cpcr->Backtrack ); -} - - -/* PosClassSet */ - -static HB_Error Load_ChainPosClassSet( - HB_ChainContextPosFormat2* ccpf2, - HB_ChainPosClassSet* cpcs, - HB_Stream stream ) -{ - HB_Error error; - - HB_UShort n, m, count; - HB_UInt cur_offset, new_offset, base_offset; - - HB_ChainPosClassRule* cpcr; - - - base_offset = FILE_Pos(); - - if ( ACCESS_Frame( 2L ) ) - return error; - - count = cpcs->ChainPosClassRuleCount = GET_UShort(); - - FORGET_Frame(); - - cpcs->ChainPosClassRule = NULL; - - if ( ALLOC_ARRAY( cpcs->ChainPosClassRule, count, - HB_ChainPosClassRule ) ) - return error; - - cpcr = cpcs->ChainPosClassRule; - - for ( n = 0; n < count; n++ ) - { - if ( ACCESS_Frame( 2L ) ) - goto Fail; - - new_offset = GET_UShort() + base_offset; - - FORGET_Frame(); - - cur_offset = FILE_Pos(); - if ( FILE_Seek( new_offset ) || - ( error = Load_ChainPosClassRule( ccpf2, &cpcr[n], - stream ) ) != HB_Err_Ok ) - goto Fail; - (void)FILE_Seek( cur_offset ); - } - - return HB_Err_Ok; - -Fail: - for ( m = 0; m < n; m++ ) - Free_ChainPosClassRule( &cpcr[m] ); - - FREE( cpcr ); - return error; -} - - -static void Free_ChainPosClassSet( HB_ChainPosClassSet* cpcs ) -{ - HB_UShort n, count; - - HB_ChainPosClassRule* cpcr; - - - if ( cpcs->ChainPosClassRule ) - { - count = cpcs->ChainPosClassRuleCount; - cpcr = cpcs->ChainPosClassRule; - - for ( n = 0; n < count; n++ ) - Free_ChainPosClassRule( &cpcr[n] ); - - FREE( cpcr ); - } -} - - -/* ChainContextPosFormat2 */ - -static HB_Error Load_ChainContextPos2( HB_ChainContextPosFormat2* ccpf2, - HB_Stream stream ) -{ - HB_Error error; - - HB_UShort n, m, count; - HB_UInt cur_offset, new_offset, base_offset; - HB_UInt backtrack_offset, input_offset, lookahead_offset; - - HB_ChainPosClassSet* cpcs; - - - base_offset = FILE_Pos() - 2; - - if ( ACCESS_Frame( 2L ) ) - return error; - - new_offset = GET_UShort() + base_offset; - - FORGET_Frame(); - - cur_offset = FILE_Pos(); - if ( FILE_Seek( new_offset ) || - ( error = _HB_OPEN_Load_Coverage( &ccpf2->Coverage, stream ) ) != HB_Err_Ok ) - return error; - (void)FILE_Seek( cur_offset ); - - if ( ACCESS_Frame( 8L ) ) - goto Fail5; - - backtrack_offset = GET_UShort(); - input_offset = GET_UShort(); - lookahead_offset = GET_UShort(); - - /* `ChainPosClassSetCount' is the upper limit for input class values, - thus we read it now to make an additional safety check. No limit - is known or needed for the other two class definitions */ - - count = ccpf2->ChainPosClassSetCount = GET_UShort(); - - FORGET_Frame(); - - if ( ( error = _HB_OPEN_Load_EmptyOrClassDefinition( &ccpf2->BacktrackClassDef, 65535, - backtrack_offset, base_offset, - stream ) ) != HB_Err_Ok ) - goto Fail5; - if ( ( error = _HB_OPEN_Load_EmptyOrClassDefinition( &ccpf2->InputClassDef, count, - input_offset, base_offset, - stream ) ) != HB_Err_Ok ) - goto Fail4; - if ( ( error = _HB_OPEN_Load_EmptyOrClassDefinition( &ccpf2->LookaheadClassDef, 65535, - lookahead_offset, base_offset, - stream ) ) != HB_Err_Ok ) - goto Fail3; - - ccpf2->ChainPosClassSet = NULL; - ccpf2->MaxBacktrackLength = 0; - ccpf2->MaxInputLength = 0; - ccpf2->MaxLookaheadLength = 0; - - if ( ALLOC_ARRAY( ccpf2->ChainPosClassSet, count, HB_ChainPosClassSet ) ) - goto Fail2; - - cpcs = ccpf2->ChainPosClassSet; - - for ( n = 0; n < count; n++ ) - { - if ( ACCESS_Frame( 2L ) ) - goto Fail1; - - new_offset = GET_UShort() + base_offset; - - FORGET_Frame(); - - if ( new_offset != base_offset ) /* not a NULL offset */ - { - cur_offset = FILE_Pos(); - if ( FILE_Seek( new_offset ) || - ( error = Load_ChainPosClassSet( ccpf2, &cpcs[n], - stream ) ) != HB_Err_Ok ) - goto Fail1; - (void)FILE_Seek( cur_offset ); - } - else - { - /* we create a ChainPosClassSet table with no entries */ - - ccpf2->ChainPosClassSet[n].ChainPosClassRuleCount = 0; - ccpf2->ChainPosClassSet[n].ChainPosClassRule = NULL; - } - } - - return HB_Err_Ok; - -Fail1: - for ( m = 0; m < n; m++ ) - Free_ChainPosClassSet( &cpcs[m] ); - - FREE( cpcs ); - -Fail2: - _HB_OPEN_Free_ClassDefinition( &ccpf2->LookaheadClassDef ); - -Fail3: - _HB_OPEN_Free_ClassDefinition( &ccpf2->InputClassDef ); - -Fail4: - _HB_OPEN_Free_ClassDefinition( &ccpf2->BacktrackClassDef ); - -Fail5: - _HB_OPEN_Free_Coverage( &ccpf2->Coverage ); - return error; -} - - -static void Free_ChainContextPos2( HB_ChainContextPosFormat2* ccpf2 ) -{ - HB_UShort n, count; - - HB_ChainPosClassSet* cpcs; - - - if ( ccpf2->ChainPosClassSet ) - { - count = ccpf2->ChainPosClassSetCount; - cpcs = ccpf2->ChainPosClassSet; - - for ( n = 0; n < count; n++ ) - Free_ChainPosClassSet( &cpcs[n] ); - - FREE( cpcs ); - } - - _HB_OPEN_Free_ClassDefinition( &ccpf2->LookaheadClassDef ); - _HB_OPEN_Free_ClassDefinition( &ccpf2->InputClassDef ); - _HB_OPEN_Free_ClassDefinition( &ccpf2->BacktrackClassDef ); - - _HB_OPEN_Free_Coverage( &ccpf2->Coverage ); -} - - -/* ChainContextPosFormat3 */ - -static HB_Error Load_ChainContextPos3( HB_ChainContextPosFormat3* ccpf3, - HB_Stream stream ) -{ - HB_Error error; - - HB_UShort n, nb, ni, nl, m, count; - HB_UShort backtrack_count, input_count, lookahead_count; - HB_UInt cur_offset, new_offset, base_offset; - - HB_Coverage* b; - HB_Coverage* i; - HB_Coverage* l; - HB_PosLookupRecord* plr; - - - base_offset = FILE_Pos() - 2L; - - if ( ACCESS_Frame( 2L ) ) - return error; - - ccpf3->BacktrackGlyphCount = GET_UShort(); - - FORGET_Frame(); - - ccpf3->BacktrackCoverage = NULL; - - backtrack_count = ccpf3->BacktrackGlyphCount; - - if ( ALLOC_ARRAY( ccpf3->BacktrackCoverage, backtrack_count, - HB_Coverage ) ) - return error; - - b = ccpf3->BacktrackCoverage; - - for ( nb = 0; nb < backtrack_count; nb++ ) - { - if ( ACCESS_Frame( 2L ) ) - goto Fail4; - - new_offset = GET_UShort() + base_offset; - - FORGET_Frame(); - - cur_offset = FILE_Pos(); - if ( FILE_Seek( new_offset ) || - ( error = _HB_OPEN_Load_Coverage( &b[nb], stream ) ) != HB_Err_Ok ) - goto Fail4; - (void)FILE_Seek( cur_offset ); - } - - if ( ACCESS_Frame( 2L ) ) - goto Fail4; - - ccpf3->InputGlyphCount = GET_UShort(); - - FORGET_Frame(); - - ccpf3->InputCoverage = NULL; - - input_count = ccpf3->InputGlyphCount; - - if ( ALLOC_ARRAY( ccpf3->InputCoverage, input_count, HB_Coverage ) ) - goto Fail4; - - i = ccpf3->InputCoverage; - - for ( ni = 0; ni < input_count; ni++ ) - { - if ( ACCESS_Frame( 2L ) ) - goto Fail3; - - new_offset = GET_UShort() + base_offset; - - FORGET_Frame(); - - cur_offset = FILE_Pos(); - if ( FILE_Seek( new_offset ) || - ( error = _HB_OPEN_Load_Coverage( &i[ni], stream ) ) != HB_Err_Ok ) - goto Fail3; - (void)FILE_Seek( cur_offset ); - } - - if ( ACCESS_Frame( 2L ) ) - goto Fail3; - - ccpf3->LookaheadGlyphCount = GET_UShort(); - - FORGET_Frame(); - - ccpf3->LookaheadCoverage = NULL; - - lookahead_count = ccpf3->LookaheadGlyphCount; - - if ( ALLOC_ARRAY( ccpf3->LookaheadCoverage, lookahead_count, - HB_Coverage ) ) - goto Fail3; - - l = ccpf3->LookaheadCoverage; - - for ( nl = 0; nl < lookahead_count; nl++ ) - { - if ( ACCESS_Frame( 2L ) ) - goto Fail2; - - new_offset = GET_UShort() + base_offset; - - FORGET_Frame(); - - cur_offset = FILE_Pos(); - if ( FILE_Seek( new_offset ) || - ( error = _HB_OPEN_Load_Coverage( &l[nl], stream ) ) != HB_Err_Ok ) - goto Fail2; - (void)FILE_Seek( cur_offset ); - } - - if ( ACCESS_Frame( 2L ) ) - goto Fail2; - - ccpf3->PosCount = GET_UShort(); - - FORGET_Frame(); - - ccpf3->PosLookupRecord = NULL; - - count = ccpf3->PosCount; - - if ( ALLOC_ARRAY( ccpf3->PosLookupRecord, count, HB_PosLookupRecord ) ) - goto Fail2; - - plr = ccpf3->PosLookupRecord; - - if ( ACCESS_Frame( count * 4L ) ) - goto Fail1; - - for ( n = 0; n < count; n++ ) - { - plr[n].SequenceIndex = GET_UShort(); - plr[n].LookupListIndex = GET_UShort(); - } - - FORGET_Frame(); - - return HB_Err_Ok; - -Fail1: - FREE( plr ); - -Fail2: - for ( m = 0; m < nl; m++ ) - _HB_OPEN_Free_Coverage( &l[m] ); - - FREE( l ); - -Fail3: - for ( m = 0; m < ni; m++ ) - _HB_OPEN_Free_Coverage( &i[m] ); - - FREE( i ); - -Fail4: - for ( m = 0; m < nb; m++ ) - _HB_OPEN_Free_Coverage( &b[m] ); - - FREE( b ); - return error; -} - - -static void Free_ChainContextPos3( HB_ChainContextPosFormat3* ccpf3 ) -{ - HB_UShort n, count; - - HB_Coverage* c; - - - FREE( ccpf3->PosLookupRecord ); - - if ( ccpf3->LookaheadCoverage ) - { - count = ccpf3->LookaheadGlyphCount; - c = ccpf3->LookaheadCoverage; - - for ( n = 0; n < count; n++ ) - _HB_OPEN_Free_Coverage( &c[n] ); - - FREE( c ); - } - - if ( ccpf3->InputCoverage ) - { - count = ccpf3->InputGlyphCount; - c = ccpf3->InputCoverage; - - for ( n = 0; n < count; n++ ) - _HB_OPEN_Free_Coverage( &c[n] ); - - FREE( c ); - } - - if ( ccpf3->BacktrackCoverage ) - { - count = ccpf3->BacktrackGlyphCount; - c = ccpf3->BacktrackCoverage; - - for ( n = 0; n < count; n++ ) - _HB_OPEN_Free_Coverage( &c[n] ); - - FREE( c ); - } -} - - -/* ChainContextPos */ - -static HB_Error Load_ChainContextPos( HB_GPOS_SubTable* st, - HB_Stream stream ) -{ - HB_Error error; - HB_ChainContextPos* ccp = &st->chain; - - - if ( ACCESS_Frame( 2L ) ) - return error; - - ccp->PosFormat = GET_UShort(); - - FORGET_Frame(); - - switch ( ccp->PosFormat ) - { - case 1: - return Load_ChainContextPos1( &ccp->ccpf.ccpf1, stream ); - - case 2: - return Load_ChainContextPos2( &ccp->ccpf.ccpf2, stream ); - - case 3: - return Load_ChainContextPos3( &ccp->ccpf.ccpf3, stream ); - - default: - return ERR(HB_Err_Invalid_SubTable_Format); - } - - return HB_Err_Ok; /* never reached */ -} - - -static void Free_ChainContextPos( HB_GPOS_SubTable* st ) -{ - HB_ChainContextPos* ccp = &st->chain; - - switch ( ccp->PosFormat ) - { - case 1: Free_ChainContextPos1( &ccp->ccpf.ccpf1 ); break; - case 2: Free_ChainContextPos2( &ccp->ccpf.ccpf2 ); break; - case 3: Free_ChainContextPos3( &ccp->ccpf.ccpf3 ); break; - default: break; - } -} - - -static HB_Error Lookup_ChainContextPos1( - GPOS_Instance* gpi, - HB_ChainContextPosFormat1* ccpf1, - HB_Buffer buffer, - HB_UShort flags, - HB_UShort context_length, - int nesting_level ) -{ - HB_UShort index, property; - HB_UShort i, j, k, num_cpr; - HB_UShort bgc, igc, lgc; - HB_Error error; - HB_GPOSHeader* gpos = gpi->gpos; - - HB_ChainPosRule* cpr; - HB_ChainPosRule curr_cpr; - HB_GDEFHeader* gdef; - - - gdef = gpos->gdef; - - if ( CHECK_Property( gdef, IN_CURITEM(), flags, &property ) ) - return error; - - error = _HB_OPEN_Coverage_Index( &ccpf1->Coverage, IN_CURGLYPH(), &index ); - if ( error ) - return error; - - cpr = ccpf1->ChainPosRuleSet[index].ChainPosRule; - num_cpr = ccpf1->ChainPosRuleSet[index].ChainPosRuleCount; - - for ( k = 0; k < num_cpr; k++ ) - { - curr_cpr = cpr[k]; - bgc = curr_cpr.BacktrackGlyphCount; - igc = curr_cpr.InputGlyphCount; - lgc = curr_cpr.LookaheadGlyphCount; - - if ( context_length != 0xFFFF && context_length < igc ) - goto next_chainposrule; - - /* check whether context is too long; it is a first guess only */ - - if ( bgc > buffer->in_pos || buffer->in_pos + igc + lgc > buffer->in_length ) - goto next_chainposrule; - - if ( bgc ) - { - /* Since we don't know in advance the number of glyphs to inspect, - we search backwards for matches in the backtrack glyph array */ - - for ( i = 0, j = buffer->in_pos - 1; i < bgc; i++, j-- ) - { - while ( CHECK_Property( gdef, IN_ITEM( j ), flags, &property ) ) - { - if ( error && error != HB_Err_Not_Covered ) - return error; - - if ( j + 1 == bgc - i ) - goto next_chainposrule; - j--; - } - - /* In OpenType 1.3, it is undefined whether the offsets of - backtrack glyphs is in logical order or not. Version 1.4 - will clarify this: - - Logical order - a b c d e f g h i j - i - Input offsets - 0 1 - Backtrack offsets - 3 2 1 0 - Lookahead offsets - 0 1 2 3 */ - - if ( IN_GLYPH( j ) != curr_cpr.Backtrack[i] ) - goto next_chainposrule; - } - } - - /* Start at 1 because [0] is implied */ - - for ( i = 1, j = buffer->in_pos + 1; i < igc; i++, j++ ) - { - while ( CHECK_Property( gdef, IN_ITEM( j ), flags, &property ) ) - { - if ( error && error != HB_Err_Not_Covered ) - return error; - - if ( j + igc - i + lgc == (HB_Int)buffer->in_length ) - goto next_chainposrule; - j++; - } - - if ( IN_GLYPH( j ) != curr_cpr.Input[i - 1] ) - goto next_chainposrule; - } - - /* we are starting to check for lookahead glyphs right after the - last context glyph */ - - for ( i = 0; i < lgc; i++, j++ ) - { - while ( CHECK_Property( gdef, IN_ITEM( j ), flags, &property ) ) - { - if ( error && error != HB_Err_Not_Covered ) - return error; - - if ( j + lgc - i == (HB_Int)buffer->in_length ) - goto next_chainposrule; - j++; - } - - if ( IN_GLYPH( j ) != curr_cpr.Lookahead[i] ) - goto next_chainposrule; - } - - return Do_ContextPos( gpi, igc, - curr_cpr.PosCount, - curr_cpr.PosLookupRecord, - buffer, - nesting_level ); - - next_chainposrule: - ; - } - - return HB_Err_Not_Covered; -} - - -static HB_Error Lookup_ChainContextPos2( - GPOS_Instance* gpi, - HB_ChainContextPosFormat2* ccpf2, - HB_Buffer buffer, - HB_UShort flags, - HB_UShort context_length, - int nesting_level ) -{ - HB_UShort index, property; - HB_Error error; - HB_UShort i, j, k; - HB_UShort bgc, igc, lgc; - HB_UShort known_backtrack_classes, - known_input_classes, - known_lookahead_classes; - - HB_UShort* backtrack_classes; - HB_UShort* input_classes; - HB_UShort* lookahead_classes; - - HB_UShort* bc; - HB_UShort* ic; - HB_UShort* lc; - HB_GPOSHeader* gpos = gpi->gpos; - - HB_ChainPosClassSet* cpcs; - HB_ChainPosClassRule cpcr; - HB_GDEFHeader* gdef; - - - gdef = gpos->gdef; - - if ( CHECK_Property( gdef, IN_CURITEM(), flags, &property ) ) - return error; - - /* Note: The coverage table in format 2 doesn't give an index into - anything. It just lets us know whether or not we need to - do any lookup at all. */ - - error = _HB_OPEN_Coverage_Index( &ccpf2->Coverage, IN_CURGLYPH(), &index ); - if ( error ) - return error; - - if ( ALLOC_ARRAY( backtrack_classes, ccpf2->MaxBacktrackLength, HB_UShort ) ) - return error; - known_backtrack_classes = 0; - - if (ccpf2->MaxInputLength < 1) - return HB_Err_Not_Covered; - - if ( ALLOC_ARRAY( input_classes, ccpf2->MaxInputLength, HB_UShort ) ) - goto End3; - known_input_classes = 1; - - if ( ALLOC_ARRAY( lookahead_classes, ccpf2->MaxLookaheadLength, HB_UShort ) ) - goto End2; - known_lookahead_classes = 0; - - error = _HB_OPEN_Get_Class( &ccpf2->InputClassDef, IN_CURGLYPH(), - &input_classes[0], NULL ); - if ( error && error != HB_Err_Not_Covered ) - goto End1; - - cpcs = &ccpf2->ChainPosClassSet[input_classes[0]]; - if ( !cpcs ) - { - error = ERR(HB_Err_Invalid_SubTable); - goto End1; - } - - for ( k = 0; k < cpcs->ChainPosClassRuleCount; k++ ) - { - cpcr = cpcs->ChainPosClassRule[k]; - bgc = cpcr.BacktrackGlyphCount; - igc = cpcr.InputGlyphCount; - lgc = cpcr.LookaheadGlyphCount; - - if ( context_length != 0xFFFF && context_length < igc ) - goto next_chainposclassrule; - - /* check whether context is too long; it is a first guess only */ - - if ( bgc > buffer->in_pos || buffer->in_pos + igc + lgc > buffer->in_length ) - goto next_chainposclassrule; - - if ( bgc ) - { - /* Since we don't know in advance the number of glyphs to inspect, - we search backwards for matches in the backtrack glyph array. - Note that `known_backtrack_classes' starts at index 0. */ - - bc = cpcr.Backtrack; - - for ( i = 0, j = buffer->in_pos - 1; i < bgc; i++, j-- ) - { - while ( CHECK_Property( gdef, IN_ITEM( j ), flags, &property ) ) - { - if ( error && error != HB_Err_Not_Covered ) - goto End1; - - if ( j + 1 == bgc - i ) - goto next_chainposclassrule; - j++; - } - - if ( i >= known_backtrack_classes ) - { - /* Keeps us from having to do this for each rule */ - - error = _HB_OPEN_Get_Class( &ccpf2->BacktrackClassDef, IN_GLYPH( j ), - &backtrack_classes[i], NULL ); - if ( error && error != HB_Err_Not_Covered ) - goto End1; - known_backtrack_classes = i; - } - - if ( bc[i] != backtrack_classes[i] ) - goto next_chainposclassrule; - } - } - - ic = cpcr.Input; - - /* Start at 1 because [0] is implied */ - - for ( i = 1, j = buffer->in_pos + 1; i < igc; i++, j++ ) - { - while ( CHECK_Property( gdef, IN_ITEM( j ), flags, &property ) ) - { - if ( error && error != HB_Err_Not_Covered ) - goto End1; - - if ( j + igc - i + lgc == (HB_Int)buffer->in_length ) - goto next_chainposclassrule; - j++; - } - - if ( i >= known_input_classes ) - { - error = _HB_OPEN_Get_Class( &ccpf2->InputClassDef, IN_GLYPH( j ), - &input_classes[i], NULL ); - if ( error && error != HB_Err_Not_Covered ) - goto End1; - known_input_classes = i; - } - - if ( ic[i - 1] != input_classes[i] ) - goto next_chainposclassrule; - } - - /* we are starting to check for lookahead glyphs right after the - last context glyph */ - - lc = cpcr.Lookahead; - - for ( i = 0; i < lgc; i++, j++ ) - { - while ( CHECK_Property( gdef, IN_ITEM( j ), flags, &property ) ) - { - if ( error && error != HB_Err_Not_Covered ) - goto End1; - - if ( j + lgc - i == (HB_Int)buffer->in_length ) - goto next_chainposclassrule; - j++; - } - - if ( i >= known_lookahead_classes ) - { - error = _HB_OPEN_Get_Class( &ccpf2->LookaheadClassDef, IN_GLYPH( j ), - &lookahead_classes[i], NULL ); - if ( error && error != HB_Err_Not_Covered ) - goto End1; - known_lookahead_classes = i; - } - - if ( lc[i] != lookahead_classes[i] ) - goto next_chainposclassrule; - } - - error = Do_ContextPos( gpi, igc, - cpcr.PosCount, - cpcr.PosLookupRecord, - buffer, - nesting_level ); - goto End1; - - next_chainposclassrule: - ; - } - - error = HB_Err_Not_Covered; - -End1: - FREE( lookahead_classes ); - -End2: - FREE( input_classes ); - -End3: - FREE( backtrack_classes ); - return error; -} - - -static HB_Error Lookup_ChainContextPos3( - GPOS_Instance* gpi, - HB_ChainContextPosFormat3* ccpf3, - HB_Buffer buffer, - HB_UShort flags, - HB_UShort context_length, - int nesting_level ) -{ - HB_UShort index, i, j, property; - HB_UShort bgc, igc, lgc; - HB_Error error; - HB_GPOSHeader* gpos = gpi->gpos; - - HB_Coverage* bc; - HB_Coverage* ic; - HB_Coverage* lc; - HB_GDEFHeader* gdef; - - - gdef = gpos->gdef; - - if ( CHECK_Property( gdef, IN_CURITEM(), flags, &property ) ) - return error; - - bgc = ccpf3->BacktrackGlyphCount; - igc = ccpf3->InputGlyphCount; - lgc = ccpf3->LookaheadGlyphCount; - - if ( context_length != 0xFFFF && context_length < igc ) - return HB_Err_Not_Covered; - - /* check whether context is too long; it is a first guess only */ - - if ( bgc > buffer->in_pos || buffer->in_pos + igc + lgc > buffer->in_length ) - return HB_Err_Not_Covered; - - if ( bgc ) - { - /* Since we don't know in advance the number of glyphs to inspect, - we search backwards for matches in the backtrack glyph array */ - - bc = ccpf3->BacktrackCoverage; - - for ( i = 0, j = buffer->in_pos - 1; i < bgc; i++, j-- ) - { - while ( CHECK_Property( gdef, IN_ITEM( j ), flags, &property ) ) - { - if ( error && error != HB_Err_Not_Covered ) - return error; - - if ( j + 1 == bgc - i ) - return HB_Err_Not_Covered; - j--; - } - - error = _HB_OPEN_Coverage_Index( &bc[i], IN_GLYPH( j ), &index ); - if ( error ) - return error; - } - } - - ic = ccpf3->InputCoverage; - - for ( i = 0, j = buffer->in_pos; i < igc; i++, j++ ) - { - /* We already called CHECK_Property for IN_GLYPH ( buffer->in_pos ) */ - while ( j > buffer->in_pos && CHECK_Property( gdef, IN_ITEM( j ), flags, &property ) ) - { - if ( error && error != HB_Err_Not_Covered ) - return error; - - if ( j + igc - i + lgc == (HB_Int)buffer->in_length ) - return HB_Err_Not_Covered; - j++; - } - - error = _HB_OPEN_Coverage_Index( &ic[i], IN_GLYPH( j ), &index ); - if ( error ) - return error; - } - - /* we are starting to check for lookahead glyphs right after the - last context glyph */ - - lc = ccpf3->LookaheadCoverage; - - for ( i = 0; i < lgc; i++, j++ ) - { - while ( CHECK_Property( gdef, IN_ITEM( j ), flags, &property ) ) - { - if ( error && error != HB_Err_Not_Covered ) - return error; - - if ( j + lgc - i == (HB_Int)buffer->in_length ) - return HB_Err_Not_Covered; - j++; - } - - error = _HB_OPEN_Coverage_Index( &lc[i], IN_GLYPH( j ), &index ); - if ( error ) - return error; - } - - return Do_ContextPos( gpi, igc, - ccpf3->PosCount, - ccpf3->PosLookupRecord, - buffer, - nesting_level ); -} - - -static HB_Error Lookup_ChainContextPos( - GPOS_Instance* gpi, - HB_GPOS_SubTable* st, - HB_Buffer buffer, - HB_UShort flags, - HB_UShort context_length, - int nesting_level ) -{ - HB_ChainContextPos* ccp = &st->chain; - - switch ( ccp->PosFormat ) - { - case 1: - return Lookup_ChainContextPos1( gpi, &ccp->ccpf.ccpf1, buffer, - flags, context_length, - nesting_level ); - - case 2: - return Lookup_ChainContextPos2( gpi, &ccp->ccpf.ccpf2, buffer, - flags, context_length, - nesting_level ); - - case 3: - return Lookup_ChainContextPos3( gpi, &ccp->ccpf.ccpf3, buffer, - flags, context_length, - nesting_level ); - - default: - return ERR(HB_Err_Invalid_SubTable_Format); - } - - return HB_Err_Ok; /* never reached */ -} - - - -/*********** - * GPOS API - ***********/ - - - -HB_Error HB_GPOS_Select_Script( HB_GPOSHeader* gpos, - HB_UInt script_tag, - HB_UShort* script_index ) -{ - HB_UShort n; - - HB_ScriptList* sl; - HB_ScriptRecord* sr; - - - if ( !gpos || !script_index ) - return ERR(HB_Err_Invalid_Argument); - - sl = &gpos->ScriptList; - sr = sl->ScriptRecord; - - for ( n = 0; n < sl->ScriptCount; n++ ) - if ( script_tag == sr[n].ScriptTag ) - { - *script_index = n; - - return HB_Err_Ok; - } - - return HB_Err_Not_Covered; -} - - - -HB_Error HB_GPOS_Select_Language( HB_GPOSHeader* gpos, - HB_UInt language_tag, - HB_UShort script_index, - HB_UShort* language_index, - HB_UShort* req_feature_index ) -{ - HB_UShort n; - - HB_ScriptList* sl; - HB_ScriptRecord* sr; - HB_ScriptTable* s; - HB_LangSysRecord* lsr; - - - if ( !gpos || !language_index || !req_feature_index ) - return ERR(HB_Err_Invalid_Argument); - - sl = &gpos->ScriptList; - sr = sl->ScriptRecord; - - if ( script_index >= sl->ScriptCount ) - return ERR(HB_Err_Invalid_Argument); - - s = &sr[script_index].Script; - lsr = s->LangSysRecord; - - for ( n = 0; n < s->LangSysCount; n++ ) - if ( language_tag == lsr[n].LangSysTag ) - { - *language_index = n; - *req_feature_index = lsr[n].LangSys.ReqFeatureIndex; - - return HB_Err_Ok; - } - - return HB_Err_Not_Covered; -} - - -/* selecting 0xFFFF for language_index asks for the values of the - default language (DefaultLangSys) */ - - -HB_Error HB_GPOS_Select_Feature( HB_GPOSHeader* gpos, - HB_UInt feature_tag, - HB_UShort script_index, - HB_UShort language_index, - HB_UShort* feature_index ) -{ - HB_UShort n; - - HB_ScriptList* sl; - HB_ScriptRecord* sr; - HB_ScriptTable* s; - HB_LangSysRecord* lsr; - HB_LangSys* ls; - HB_UShort* fi; - - HB_FeatureList* fl; - HB_FeatureRecord* fr; - - - if ( !gpos || !feature_index ) - return ERR(HB_Err_Invalid_Argument); - - sl = &gpos->ScriptList; - sr = sl->ScriptRecord; - - fl = &gpos->FeatureList; - fr = fl->FeatureRecord; - - if ( script_index >= sl->ScriptCount ) - return ERR(HB_Err_Invalid_Argument); - - s = &sr[script_index].Script; - lsr = s->LangSysRecord; - - if ( language_index == 0xFFFF ) - ls = &s->DefaultLangSys; - else - { - if ( language_index >= s->LangSysCount ) - return ERR(HB_Err_Invalid_Argument); - - ls = &lsr[language_index].LangSys; - } - - fi = ls->FeatureIndex; - - for ( n = 0; n < ls->FeatureCount; n++ ) - { - if ( fi[n] >= fl->FeatureCount ) - return ERR(HB_Err_Invalid_SubTable_Format); - - if ( feature_tag == fr[fi[n]].FeatureTag ) - { - *feature_index = fi[n]; - - return HB_Err_Ok; - } - } - - return HB_Err_Not_Covered; -} - - -/* The next three functions return a null-terminated list */ - - -HB_Error HB_GPOS_Query_Scripts( HB_GPOSHeader* gpos, - HB_UInt** script_tag_list ) -{ - HB_Error error; - HB_UShort n; - HB_UInt* stl; - - HB_ScriptList* sl; - HB_ScriptRecord* sr; - - - if ( !gpos || !script_tag_list ) - return ERR(HB_Err_Invalid_Argument); - - sl = &gpos->ScriptList; - sr = sl->ScriptRecord; - - if ( ALLOC_ARRAY( stl, sl->ScriptCount + 1, HB_UInt ) ) - return error; - - for ( n = 0; n < sl->ScriptCount; n++ ) - stl[n] = sr[n].ScriptTag; - stl[n] = 0; - - *script_tag_list = stl; - - return HB_Err_Ok; -} - - - -HB_Error HB_GPOS_Query_Languages( HB_GPOSHeader* gpos, - HB_UShort script_index, - HB_UInt** language_tag_list ) -{ - HB_Error error; - HB_UShort n; - HB_UInt* ltl; - - HB_ScriptList* sl; - HB_ScriptRecord* sr; - HB_ScriptTable* s; - HB_LangSysRecord* lsr; - - - if ( !gpos || !language_tag_list ) - return ERR(HB_Err_Invalid_Argument); - - sl = &gpos->ScriptList; - sr = sl->ScriptRecord; - - if ( script_index >= sl->ScriptCount ) - return ERR(HB_Err_Invalid_Argument); - - s = &sr[script_index].Script; - lsr = s->LangSysRecord; - - if ( ALLOC_ARRAY( ltl, s->LangSysCount + 1, HB_UInt ) ) - return error; - - for ( n = 0; n < s->LangSysCount; n++ ) - ltl[n] = lsr[n].LangSysTag; - ltl[n] = 0; - - *language_tag_list = ltl; - - return HB_Err_Ok; -} - - -/* selecting 0xFFFF for language_index asks for the values of the - default language (DefaultLangSys) */ - - -HB_Error HB_GPOS_Query_Features( HB_GPOSHeader* gpos, - HB_UShort script_index, - HB_UShort language_index, - HB_UInt** feature_tag_list ) -{ - HB_UShort n; - HB_Error error; - HB_UInt* ftl; - - HB_ScriptList* sl; - HB_ScriptRecord* sr; - HB_ScriptTable* s; - HB_LangSysRecord* lsr; - HB_LangSys* ls; - HB_UShort* fi; - - HB_FeatureList* fl; - HB_FeatureRecord* fr; - - - if ( !gpos || !feature_tag_list ) - return ERR(HB_Err_Invalid_Argument); - - sl = &gpos->ScriptList; - sr = sl->ScriptRecord; - - fl = &gpos->FeatureList; - fr = fl->FeatureRecord; - - if ( script_index >= sl->ScriptCount ) - return ERR(HB_Err_Invalid_Argument); - - s = &sr[script_index].Script; - lsr = s->LangSysRecord; - - if ( language_index == 0xFFFF ) - ls = &s->DefaultLangSys; - else - { - if ( language_index >= s->LangSysCount ) - return ERR(HB_Err_Invalid_Argument); - - ls = &lsr[language_index].LangSys; - } - - fi = ls->FeatureIndex; - - if ( ALLOC_ARRAY( ftl, ls->FeatureCount + 1, HB_UInt ) ) - return error; - - for ( n = 0; n < ls->FeatureCount; n++ ) - { - if ( fi[n] >= fl->FeatureCount ) - { - FREE( ftl ); - return ERR(HB_Err_Invalid_SubTable_Format); - } - ftl[n] = fr[fi[n]].FeatureTag; - } - ftl[n] = 0; - - *feature_tag_list = ftl; - - return HB_Err_Ok; -} - - -/* Do an individual subtable lookup. Returns HB_Err_Ok if positioning - has been done, or HB_Err_Not_Covered if not. */ -static HB_Error GPOS_Do_Glyph_Lookup( GPOS_Instance* gpi, - HB_UShort lookup_index, - HB_Buffer buffer, - HB_UShort context_length, - int nesting_level ) -{ - HB_Error error = HB_Err_Not_Covered; - HB_UShort i, flags, lookup_count; - HB_GPOSHeader* gpos = gpi->gpos; - HB_Lookup* lo; - int lookup_type; - - - nesting_level++; - - if ( nesting_level > HB_MAX_NESTING_LEVEL ) - return ERR(HB_Err_Not_Covered); /* ERR() call intended */ - - lookup_count = gpos->LookupList.LookupCount; - if (lookup_index >= lookup_count) - return error; - - lo = &gpos->LookupList.Lookup[lookup_index]; - flags = lo->LookupFlag; - lookup_type = lo->LookupType; - - for ( i = 0; i < lo->SubTableCount; i++ ) - { - HB_GPOS_SubTable *st = &lo->SubTable[i].st.gpos; - - switch (lookup_type) { - case HB_GPOS_LOOKUP_SINGLE: - error = Lookup_SinglePos ( gpi, st, buffer, flags, context_length, nesting_level ); break; - case HB_GPOS_LOOKUP_PAIR: - error = Lookup_PairPos ( gpi, st, buffer, flags, context_length, nesting_level ); break; - case HB_GPOS_LOOKUP_CURSIVE: - error = Lookup_CursivePos ( gpi, st, buffer, flags, context_length, nesting_level ); break; - case HB_GPOS_LOOKUP_MARKBASE: - error = Lookup_MarkBasePos ( gpi, st, buffer, flags, context_length, nesting_level ); break; - case HB_GPOS_LOOKUP_MARKLIG: - error = Lookup_MarkLigPos ( gpi, st, buffer, flags, context_length, nesting_level ); break; - case HB_GPOS_LOOKUP_MARKMARK: - error = Lookup_MarkMarkPos ( gpi, st, buffer, flags, context_length, nesting_level ); break; - case HB_GPOS_LOOKUP_CONTEXT: - error = Lookup_ContextPos ( gpi, st, buffer, flags, context_length, nesting_level ); break; - case HB_GPOS_LOOKUP_CHAIN: - error = Lookup_ChainContextPos ( gpi, st, buffer, flags, context_length, nesting_level ); break; - /*case HB_GPOS_LOOKUP_EXTENSION: - error = Lookup_ExtensionPos ( gpi, st, buffer, flags, context_length, nesting_level ); break;*/ - default: - error = HB_Err_Not_Covered; - } - - /* Check whether we have a successful positioning or an error other - than HB_Err_Not_Covered */ - if ( error != HB_Err_Not_Covered ) - return error; - } - - return HB_Err_Not_Covered; -} - - -HB_INTERNAL HB_Error -_HB_GPOS_Load_SubTable( HB_GPOS_SubTable* st, - HB_Stream stream, - HB_UShort lookup_type ) -{ - switch ( lookup_type ) { - case HB_GPOS_LOOKUP_SINGLE: return Load_SinglePos ( st, stream ); - case HB_GPOS_LOOKUP_PAIR: return Load_PairPos ( st, stream ); - case HB_GPOS_LOOKUP_CURSIVE: return Load_CursivePos ( st, stream ); - case HB_GPOS_LOOKUP_MARKBASE: return Load_MarkBasePos ( st, stream ); - case HB_GPOS_LOOKUP_MARKLIG: return Load_MarkLigPos ( st, stream ); - case HB_GPOS_LOOKUP_MARKMARK: return Load_MarkMarkPos ( st, stream ); - case HB_GPOS_LOOKUP_CONTEXT: return Load_ContextPos ( st, stream ); - case HB_GPOS_LOOKUP_CHAIN: return Load_ChainContextPos ( st, stream ); - /*case HB_GPOS_LOOKUP_EXTENSION: return Load_ExtensionPos ( st, stream );*/ - default: return ERR(HB_Err_Invalid_SubTable_Format); - } -} - - -HB_INTERNAL void -_HB_GPOS_Free_SubTable( HB_GPOS_SubTable* st, - HB_UShort lookup_type ) -{ - switch ( lookup_type ) { - case HB_GPOS_LOOKUP_SINGLE: Free_SinglePos ( st ); return; - case HB_GPOS_LOOKUP_PAIR: Free_PairPos ( st ); return; - case HB_GPOS_LOOKUP_CURSIVE: Free_CursivePos ( st ); return; - case HB_GPOS_LOOKUP_MARKBASE: Free_MarkBasePos ( st ); return; - case HB_GPOS_LOOKUP_MARKLIG: Free_MarkLigPos ( st ); return; - case HB_GPOS_LOOKUP_MARKMARK: Free_MarkMarkPos ( st ); return; - case HB_GPOS_LOOKUP_CONTEXT: Free_ContextPos ( st ); return; - case HB_GPOS_LOOKUP_CHAIN: Free_ChainContextPos ( st ); return; - /*case HB_GPOS_LOOKUP_EXTENSION: Free_ExtensionPos ( st ); return;*/ - default: return; - } -} - - -/* apply one lookup to the input string object */ - -static HB_Error GPOS_Do_String_Lookup( GPOS_Instance* gpi, - HB_UShort lookup_index, - HB_Buffer buffer ) -{ - HB_Error error, retError = HB_Err_Not_Covered; - HB_GPOSHeader* gpos = gpi->gpos; - - HB_UInt* properties = gpos->LookupList.Properties; - - const int nesting_level = 0; - /* 0xFFFF indicates that we don't have a context length yet */ - const HB_UShort context_length = 0xFFFF; - - - gpi->last = 0xFFFF; /* no last valid glyph for cursive pos. */ - - buffer->in_pos = 0; - while ( buffer->in_pos < buffer->in_length ) - { - if ( ~IN_PROPERTIES( buffer->in_pos ) & properties[lookup_index] ) - { - /* Note that the connection between mark and base glyphs hold - exactly one (string) lookup. For example, it would be possible - that in the first lookup, mark glyph X is attached to base - glyph A, and in the next lookup it is attached to base glyph B. - It is up to the font designer to provide meaningful lookups and - lookup order. */ - - error = GPOS_Do_Glyph_Lookup( gpi, lookup_index, buffer, context_length, nesting_level ); - if ( error && error != HB_Err_Not_Covered ) - return error; - } - else - { - /* Contrary to properties defined in GDEF, user-defined properties - will always stop a possible cursive positioning. */ - gpi->last = 0xFFFF; - - error = HB_Err_Not_Covered; - } - - if ( error == HB_Err_Not_Covered ) - (buffer->in_pos)++; - else - retError = error; - } - - return retError; -} - - -static HB_Error Position_CursiveChain ( HB_Buffer buffer ) -{ - HB_UInt i, j; - HB_Position positions = buffer->positions; - - /* First handle all left-to-right connections */ - for (j = 0; j < buffer->in_length; j++) - { - if (positions[j].cursive_chain > 0) - positions[j].y_pos += positions[j - positions[j].cursive_chain].y_pos; - } - - /* Then handle all right-to-left connections */ - for (i = buffer->in_length; i > 0; i--) - { - j = i - 1; - - if (positions[j].cursive_chain < 0) - positions[j].y_pos += positions[j - positions[j].cursive_chain].y_pos; - } - - return HB_Err_Ok; -} - - -HB_Error HB_GPOS_Add_Feature( HB_GPOSHeader* gpos, - HB_UShort feature_index, - HB_UInt property ) -{ - HB_UShort i; - - HB_Feature feature; - HB_UInt* properties; - HB_UShort* index; - HB_UShort lookup_count; - - /* Each feature can only be added once */ - - if ( !gpos || - feature_index >= gpos->FeatureList.FeatureCount || - gpos->FeatureList.ApplyCount == gpos->FeatureList.FeatureCount ) - return ERR(HB_Err_Invalid_Argument); - - gpos->FeatureList.ApplyOrder[gpos->FeatureList.ApplyCount++] = feature_index; - - properties = gpos->LookupList.Properties; - - feature = gpos->FeatureList.FeatureRecord[feature_index].Feature; - index = feature.LookupListIndex; - lookup_count = gpos->LookupList.LookupCount; - - for ( i = 0; i < feature.LookupListCount; i++ ) - { - HB_UShort lookup_index = index[i]; - if (lookup_index < lookup_count) - properties[lookup_index] |= property; - } - - return HB_Err_Ok; -} - - - -HB_Error HB_GPOS_Clear_Features( HB_GPOSHeader* gpos ) -{ - HB_UShort i; - - HB_UInt* properties; - - - if ( !gpos ) - return ERR(HB_Err_Invalid_Argument); - - gpos->FeatureList.ApplyCount = 0; - - properties = gpos->LookupList.Properties; - - for ( i = 0; i < gpos->LookupList.LookupCount; i++ ) - properties[i] = 0; - - return HB_Err_Ok; -} - - - -HB_Error HB_GPOS_Register_MM_Function( HB_GPOSHeader* gpos, - HB_MMFunction mmfunc, - void* data ) -{ - if ( !gpos ) - return ERR(HB_Err_Invalid_Argument); - - gpos->mmfunc = mmfunc; - gpos->data = data; - - return HB_Err_Ok; -} - -/* If `dvi' is TRUE, glyph contour points for anchor points and device - tables are ignored -- you will get device independent values. */ - - -HB_Error HB_GPOS_Apply_String( HB_Font font, - HB_GPOSHeader* gpos, - HB_UShort load_flags, - HB_Buffer buffer, - HB_Bool dvi, - HB_Bool r2l ) -{ - HB_Error error, retError = HB_Err_Not_Covered; - GPOS_Instance gpi; - int i, j, lookup_count, num_features; - - if ( !font || !gpos || !buffer ) - return ERR(HB_Err_Invalid_Argument); - - if ( buffer->in_length == 0 ) - return HB_Err_Not_Covered; - - gpi.font = font; - gpi.gpos = gpos; - gpi.load_flags = load_flags; - gpi.r2l = r2l; - gpi.dvi = dvi; - - lookup_count = gpos->LookupList.LookupCount; - num_features = gpos->FeatureList.ApplyCount; - - if ( num_features ) - { - error = _hb_buffer_clear_positions( buffer ); - if ( error ) - return error; - } - - for ( i = 0; i < num_features; i++ ) - { - HB_UShort feature_index = gpos->FeatureList.ApplyOrder[i]; - HB_Feature feature = gpos->FeatureList.FeatureRecord[feature_index].Feature; - - for ( j = 0; j < feature.LookupListCount; j++ ) - { - HB_UShort lookup_index = feature.LookupListIndex[j]; - - /* Skip nonexistant lookups */ - if (lookup_index >= lookup_count) - continue; - - error = GPOS_Do_String_Lookup( &gpi, lookup_index, buffer ); - if ( error ) - { - if ( error != HB_Err_Not_Covered ) - return error; - } - else - retError = error; - } - } - - if ( num_features ) - { - error = Position_CursiveChain ( buffer ); - if ( error ) - return error; - } - - return retError; -} - -/* END */ diff --git a/third_party/harfbuzz/src/harfbuzz-gpos.h b/third_party/harfbuzz/src/harfbuzz-gpos.h deleted file mode 100644 index 2840dae480..0000000000 --- a/third_party/harfbuzz/src/harfbuzz-gpos.h +++ /dev/null @@ -1,149 +0,0 @@ -/* - * Copyright (C) 1998-2004 David Turner and Werner Lemberg - * Copyright (C) 2006 Behdad Esfahbod - * - * This is part of HarfBuzz, an OpenType Layout engine library. - * - * Permission is hereby granted, without written agreement and without - * license or royalty fees, to use, copy, modify, and distribute this - * software and its documentation for any purpose, provided that the - * above copyright notice and the following two paragraphs appear in - * all copies of this software. - * - * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR - * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES - * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN - * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE. - * - * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, - * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS - * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO - * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. - */ - -#ifndef HARFBUZZ_GPOS_H -#define HARFBUZZ_GPOS_H - -#include "harfbuzz-gdef.h" -#include "harfbuzz-buffer.h" - -HB_BEGIN_HEADER - - -/* Lookup types for glyph positioning */ - -#define HB_GPOS_LOOKUP_SINGLE 1 -#define HB_GPOS_LOOKUP_PAIR 2 -#define HB_GPOS_LOOKUP_CURSIVE 3 -#define HB_GPOS_LOOKUP_MARKBASE 4 -#define HB_GPOS_LOOKUP_MARKLIG 5 -#define HB_GPOS_LOOKUP_MARKMARK 6 -#define HB_GPOS_LOOKUP_CONTEXT 7 -#define HB_GPOS_LOOKUP_CHAIN 8 -#define HB_GPOS_LOOKUP_EXTENSION 9 - -/* A pointer to a function which accesses the PostScript interpreter. - Multiple Master fonts need this interface to convert a metric ID - (as stored in an OpenType font version 1.2 or higher) `metric_id' - into a metric value (returned in `metric_value'). - - `data' points to the user-defined structure specified during a - call to HB_GPOS_Register_MM_Function(). - - `metric_value' must be returned as a scaled value (but shouldn't - be rounded). */ - -typedef HB_Error (*HB_MMFunction)(HB_Font font, - HB_UShort metric_id, - HB_Fixed* metric_value, - void* data ); - - -struct HB_GPOSHeader_ -{ - HB_16Dot16 Version; - - HB_ScriptList ScriptList; - HB_FeatureList FeatureList; - HB_LookupList LookupList; - - HB_GDEFHeader* gdef; - - /* this is OpenType 1.2 -- Multiple Master fonts need this - callback function to get various metric values from the - PostScript interpreter. */ - - HB_MMFunction mmfunc; - void* data; -}; - -typedef struct HB_GPOSHeader_ HB_GPOSHeader; -typedef HB_GPOSHeader* HB_GPOS; - - -HB_Error HB_Load_GPOS_Table( HB_Stream stream, - HB_GPOSHeader** gpos, - HB_GDEFHeader* gdef, - HB_Stream gdefStream ); - - -HB_Error HB_Done_GPOS_Table( HB_GPOSHeader* gpos ); - - -HB_Error HB_GPOS_Select_Script( HB_GPOSHeader* gpos, - HB_UInt script_tag, - HB_UShort* script_index ); - -HB_Error HB_GPOS_Select_Language( HB_GPOSHeader* gpos, - HB_UInt language_tag, - HB_UShort script_index, - HB_UShort* language_index, - HB_UShort* req_feature_index ); - -HB_Error HB_GPOS_Select_Feature( HB_GPOSHeader* gpos, - HB_UInt feature_tag, - HB_UShort script_index, - HB_UShort language_index, - HB_UShort* feature_index ); - - -HB_Error HB_GPOS_Query_Scripts( HB_GPOSHeader* gpos, - HB_UInt** script_tag_list ); - -HB_Error HB_GPOS_Query_Languages( HB_GPOSHeader* gpos, - HB_UShort script_index, - HB_UInt** language_tag_list ); - -HB_Error HB_GPOS_Query_Features( HB_GPOSHeader* gpos, - HB_UShort script_index, - HB_UShort language_index, - HB_UInt** feature_tag_list ); - - -HB_Error HB_GPOS_Add_Feature( HB_GPOSHeader* gpos, - HB_UShort feature_index, - HB_UInt property ); - -HB_Error HB_GPOS_Clear_Features( HB_GPOSHeader* gpos ); - - -HB_Error HB_GPOS_Register_MM_Function( HB_GPOSHeader* gpos, - HB_MMFunction mmfunc, - void* data ); - -/* If `dvi' is TRUE, glyph contour points for anchor points and device - tables are ignored -- you will get device independent values. */ - - -HB_Error HB_GPOS_Apply_String( HB_Font font, - HB_GPOSHeader* gpos, - HB_UShort load_flags, - HB_Buffer buffer, - HB_Bool dvi, - HB_Bool r2l ); - -HB_END_HEADER - -#endif /* HARFBUZZ_GPOS_H */ diff --git a/third_party/harfbuzz/src/harfbuzz-gsub-private.h b/third_party/harfbuzz/src/harfbuzz-gsub-private.h deleted file mode 100644 index dd5ffdf6f5..0000000000 --- a/third_party/harfbuzz/src/harfbuzz-gsub-private.h +++ /dev/null @@ -1,476 +0,0 @@ -/* - * Copyright (C) 1998-2004 David Turner and Werner Lemberg - * Copyright (C) 2006 Behdad Esfahbod - * - * This is part of HarfBuzz, an OpenType Layout engine library. - * - * Permission is hereby granted, without written agreement and without - * license or royalty fees, to use, copy, modify, and distribute this - * software and its documentation for any purpose, provided that the - * above copyright notice and the following two paragraphs appear in - * all copies of this software. - * - * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR - * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES - * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN - * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE. - * - * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, - * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS - * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO - * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. - */ - -#ifndef HARFBUZZ_GSUB_PRIVATE_H -#define HARFBUZZ_GSUB_PRIVATE_H - -#include "harfbuzz-impl.h" -#include "harfbuzz-stream-private.h" -#include "harfbuzz-gsub.h" - -HB_BEGIN_HEADER - - -typedef union HB_GSUB_SubTable_ HB_GSUB_SubTable; - -/* LookupType 1 */ - -struct HB_SingleSubstFormat1_ -{ - HB_Short DeltaGlyphID; /* constant added to get - substitution glyph index */ -}; - -typedef struct HB_SingleSubstFormat1_ HB_SingleSubstFormat1; - - -struct HB_SingleSubstFormat2_ -{ - HB_UShort GlyphCount; /* number of glyph IDs in - Substitute array */ - HB_UShort* Substitute; /* array of substitute glyph IDs */ -}; - -typedef struct HB_SingleSubstFormat2_ HB_SingleSubstFormat2; - - -struct HB_SingleSubst_ -{ - HB_UShort SubstFormat; /* 1 or 2 */ - HB_Coverage Coverage; /* Coverage table */ - - union - { - HB_SingleSubstFormat1 ssf1; - HB_SingleSubstFormat2 ssf2; - } ssf; -}; - -typedef struct HB_SingleSubst_ HB_SingleSubst; - - -/* LookupType 2 */ - -struct HB_Sequence_ -{ - HB_UShort GlyphCount; /* number of glyph IDs in the - Substitute array */ - HB_UShort* Substitute; /* string of glyph IDs to - substitute */ -}; - -typedef struct HB_Sequence_ HB_Sequence; - - -struct HB_MultipleSubst_ -{ - HB_UShort SubstFormat; /* always 1 */ - HB_Coverage Coverage; /* Coverage table */ - HB_UShort SequenceCount; /* number of Sequence tables */ - HB_Sequence* Sequence; /* array of Sequence tables */ -}; - -typedef struct HB_MultipleSubst_ HB_MultipleSubst; - - -/* LookupType 3 */ - -struct HB_AlternateSet_ -{ - HB_UShort GlyphCount; /* number of glyph IDs in the - Alternate array */ - HB_UShort* Alternate; /* array of alternate glyph IDs */ -}; - -typedef struct HB_AlternateSet_ HB_AlternateSet; - - -struct HB_AlternateSubst_ -{ - HB_UShort SubstFormat; /* always 1 */ - HB_Coverage Coverage; /* Coverage table */ - HB_UShort AlternateSetCount; - /* number of AlternateSet tables */ - HB_AlternateSet* AlternateSet; /* array of AlternateSet tables */ -}; - -typedef struct HB_AlternateSubst_ HB_AlternateSubst; - - -/* LookupType 4 */ - -struct HB_Ligature_ -{ - HB_UShort LigGlyph; /* glyphID of ligature - to substitute */ - HB_UShort ComponentCount; /* number of components in ligature */ - HB_UShort* Component; /* array of component glyph IDs */ -}; - -typedef struct HB_Ligature_ HB_Ligature; - - -struct HB_LigatureSet_ -{ - HB_UShort LigatureCount; /* number of Ligature tables */ - HB_Ligature* Ligature; /* array of Ligature tables */ -}; - -typedef struct HB_LigatureSet_ HB_LigatureSet; - - -struct HB_LigatureSubst_ -{ - HB_UShort SubstFormat; /* always 1 */ - HB_Coverage Coverage; /* Coverage table */ - HB_UShort LigatureSetCount; /* number of LigatureSet tables */ - HB_LigatureSet* LigatureSet; /* array of LigatureSet tables */ -}; - -typedef struct HB_LigatureSubst_ HB_LigatureSubst; - - -/* needed by both lookup type 5 and 6 */ - -struct HB_SubstLookupRecord_ -{ - HB_UShort SequenceIndex; /* index into current - glyph sequence */ - HB_UShort LookupListIndex; /* Lookup to apply to that pos. */ -}; - -typedef struct HB_SubstLookupRecord_ HB_SubstLookupRecord; - - -/* LookupType 5 */ - -struct HB_SubRule_ -{ - HB_UShort GlyphCount; /* total number of input glyphs */ - HB_UShort SubstCount; /* number of SubstLookupRecord - tables */ - HB_UShort* Input; /* array of input glyph IDs */ - HB_SubstLookupRecord* SubstLookupRecord; - /* array of SubstLookupRecord - tables */ -}; - -typedef struct HB_SubRule_ HB_SubRule; - - -struct HB_SubRuleSet_ -{ - HB_UShort SubRuleCount; /* number of SubRule tables */ - HB_SubRule* SubRule; /* array of SubRule tables */ -}; - -typedef struct HB_SubRuleSet_ HB_SubRuleSet; - - -struct HB_ContextSubstFormat1_ -{ - HB_Coverage Coverage; /* Coverage table */ - HB_UShort SubRuleSetCount; /* number of SubRuleSet tables */ - HB_SubRuleSet* SubRuleSet; /* array of SubRuleSet tables */ -}; - -typedef struct HB_ContextSubstFormat1_ HB_ContextSubstFormat1; - - -struct HB_SubClassRule_ -{ - HB_UShort GlyphCount; /* total number of context classes */ - HB_UShort SubstCount; /* number of SubstLookupRecord - tables */ - HB_UShort* Class; /* array of classes */ - HB_SubstLookupRecord* SubstLookupRecord; - /* array of SubstLookupRecord - tables */ -}; - -typedef struct HB_SubClassRule_ HB_SubClassRule; - - -struct HB_SubClassSet_ -{ - HB_UShort SubClassRuleCount; - /* number of SubClassRule tables */ - HB_SubClassRule* SubClassRule; /* array of SubClassRule tables */ -}; - -typedef struct HB_SubClassSet_ HB_SubClassSet; - - -/* The `MaxContextLength' field is not defined in the TTO specification - but simplifies the implementation of this format. It holds the - maximal context length used in the context rules. */ - -struct HB_ContextSubstFormat2_ -{ - HB_UShort MaxContextLength; - /* maximal context length */ - HB_Coverage Coverage; /* Coverage table */ - HB_ClassDefinition ClassDef; /* ClassDef table */ - HB_UShort SubClassSetCount; - /* number of SubClassSet tables */ - HB_SubClassSet* SubClassSet; /* array of SubClassSet tables */ -}; - -typedef struct HB_ContextSubstFormat2_ HB_ContextSubstFormat2; - - -struct HB_ContextSubstFormat3_ -{ - HB_UShort GlyphCount; /* number of input glyphs */ - HB_UShort SubstCount; /* number of SubstLookupRecords */ - HB_Coverage* Coverage; /* array of Coverage tables */ - HB_SubstLookupRecord* SubstLookupRecord; - /* array of substitution lookups */ -}; - -typedef struct HB_ContextSubstFormat3_ HB_ContextSubstFormat3; - - -struct HB_ContextSubst_ -{ - HB_UShort SubstFormat; /* 1, 2, or 3 */ - - union - { - HB_ContextSubstFormat1 csf1; - HB_ContextSubstFormat2 csf2; - HB_ContextSubstFormat3 csf3; - } csf; -}; - -typedef struct HB_ContextSubst_ HB_ContextSubst; - - -/* LookupType 6 */ - -struct HB_ChainSubRule_ -{ - HB_UShort BacktrackGlyphCount; - /* total number of backtrack glyphs */ - HB_UShort* Backtrack; /* array of backtrack glyph IDs */ - HB_UShort InputGlyphCount; - /* total number of input glyphs */ - HB_UShort* Input; /* array of input glyph IDs */ - HB_UShort LookaheadGlyphCount; - /* total number of lookahead glyphs */ - HB_UShort* Lookahead; /* array of lookahead glyph IDs */ - HB_UShort SubstCount; /* number of SubstLookupRecords */ - HB_SubstLookupRecord* SubstLookupRecord; - /* array of SubstLookupRecords */ -}; - -typedef struct HB_ChainSubRule_ HB_ChainSubRule; - - -struct HB_ChainSubRuleSet_ -{ - HB_UShort ChainSubRuleCount; - /* number of ChainSubRule tables */ - HB_ChainSubRule* ChainSubRule; /* array of ChainSubRule tables */ -}; - -typedef struct HB_ChainSubRuleSet_ HB_ChainSubRuleSet; - - -struct HB_ChainContextSubstFormat1_ -{ - HB_Coverage Coverage; /* Coverage table */ - HB_UShort ChainSubRuleSetCount; - /* number of ChainSubRuleSet tables */ - HB_ChainSubRuleSet* ChainSubRuleSet; - /* array of ChainSubRuleSet tables */ -}; - -typedef struct HB_ChainContextSubstFormat1_ HB_ChainContextSubstFormat1; - - -struct HB_ChainSubClassRule_ -{ - HB_UShort BacktrackGlyphCount; - /* total number of backtrack - classes */ - HB_UShort* Backtrack; /* array of backtrack classes */ - HB_UShort InputGlyphCount; - /* total number of context classes */ - HB_UShort* Input; /* array of context classes */ - HB_UShort LookaheadGlyphCount; - /* total number of lookahead - classes */ - HB_UShort* Lookahead; /* array of lookahead classes */ - HB_UShort SubstCount; /* number of SubstLookupRecords */ - HB_SubstLookupRecord* SubstLookupRecord; - /* array of substitution lookups */ -}; - -typedef struct HB_ChainSubClassRule_ HB_ChainSubClassRule; - - -struct HB_ChainSubClassSet_ -{ - HB_UShort ChainSubClassRuleCount; - /* number of ChainSubClassRule - tables */ - HB_ChainSubClassRule* ChainSubClassRule; - /* array of ChainSubClassRule - tables */ -}; - -typedef struct HB_ChainSubClassSet_ HB_ChainSubClassSet; - - -/* The `MaxXXXLength' fields are not defined in the TTO specification - but simplifies the implementation of this format. It holds the - maximal context length used in the specific context rules. */ - -struct HB_ChainContextSubstFormat2_ -{ - HB_Coverage Coverage; /* Coverage table */ - - HB_UShort MaxBacktrackLength; - /* maximal backtrack length */ - HB_ClassDefinition BacktrackClassDef; - /* BacktrackClassDef table */ - HB_UShort MaxInputLength; - /* maximal input length */ - HB_ClassDefinition InputClassDef; - /* InputClassDef table */ - HB_UShort MaxLookaheadLength; - /* maximal lookahead length */ - HB_ClassDefinition LookaheadClassDef; - /* LookaheadClassDef table */ - - HB_UShort ChainSubClassSetCount; - /* number of ChainSubClassSet - tables */ - HB_ChainSubClassSet* ChainSubClassSet; - /* array of ChainSubClassSet - tables */ -}; - -typedef struct HB_ChainContextSubstFormat2_ HB_ChainContextSubstFormat2; - - -struct HB_ChainContextSubstFormat3_ -{ - HB_UShort BacktrackGlyphCount; - /* number of backtrack glyphs */ - HB_Coverage* BacktrackCoverage; - /* array of backtrack Coverage - tables */ - HB_UShort InputGlyphCount; - /* number of input glyphs */ - HB_Coverage* InputCoverage; - /* array of input coverage - tables */ - HB_UShort LookaheadGlyphCount; - /* number of lookahead glyphs */ - HB_Coverage* LookaheadCoverage; - /* array of lookahead coverage - tables */ - HB_UShort SubstCount; /* number of SubstLookupRecords */ - HB_SubstLookupRecord* SubstLookupRecord; - /* array of substitution lookups */ -}; - -typedef struct HB_ChainContextSubstFormat3_ HB_ChainContextSubstFormat3; - - -struct HB_ChainContextSubst_ -{ - HB_UShort SubstFormat; /* 1, 2, or 3 */ - - union - { - HB_ChainContextSubstFormat1 ccsf1; - HB_ChainContextSubstFormat2 ccsf2; - HB_ChainContextSubstFormat3 ccsf3; - } ccsf; -}; - -typedef struct HB_ChainContextSubst_ HB_ChainContextSubst; - - -#if 0 -/* LookupType 7 */ -struct HB_ExtensionSubst_ -{ - HB_UShort SubstFormat; /* always 1 */ - HB_UShort LookuptType; /* lookup-type of referenced subtable */ - HB_GSUB_SubTable *subtable; /* referenced subtable */ -}; - -typedef struct HB_ExtensionSubst_ HB_ExtensionSubst; -#endif - - -/* LookupType 8 */ -struct HB_ReverseChainContextSubst_ -{ - HB_UShort SubstFormat; /* always 1 */ - HB_Coverage Coverage; /* coverage table for input glyphs */ - HB_UShort BacktrackGlyphCount; /* number of backtrack glyphs */ - HB_Coverage* BacktrackCoverage; /* array of backtrack Coverage - tables */ - HB_UShort LookaheadGlyphCount; /* number of lookahead glyphs */ - HB_Coverage* LookaheadCoverage; /* array of lookahead Coverage - tables */ - HB_UShort GlyphCount; /* number of Glyph IDs */ - HB_UShort* Substitute; /* array of substitute Glyph ID */ -}; - -typedef struct HB_ReverseChainContextSubst_ HB_ReverseChainContextSubst; - - -union HB_GSUB_SubTable_ -{ - HB_SingleSubst single; - HB_MultipleSubst multiple; - HB_AlternateSubst alternate; - HB_LigatureSubst ligature; - HB_ContextSubst context; - HB_ChainContextSubst chain; - HB_ReverseChainContextSubst reverse; -}; - - - - -HB_INTERNAL HB_Error -_HB_GSUB_Load_SubTable( HB_GSUB_SubTable* st, - HB_Stream stream, - HB_UShort lookup_type ); - -HB_INTERNAL void -_HB_GSUB_Free_SubTable( HB_GSUB_SubTable* st, - HB_UShort lookup_type ); - -HB_END_HEADER - -#endif /* HARFBUZZ_GSUB_PRIVATE_H */ diff --git a/third_party/harfbuzz/src/harfbuzz-gsub.c b/third_party/harfbuzz/src/harfbuzz-gsub.c deleted file mode 100644 index 21fec51924..0000000000 --- a/third_party/harfbuzz/src/harfbuzz-gsub.c +++ /dev/null @@ -1,4329 +0,0 @@ -/* - * Copyright (C) 1998-2004 David Turner and Werner Lemberg - * Copyright (C) 2006 Behdad Esfahbod - * Copyright (C) 2007 Red Hat, Inc. - * - * This is part of HarfBuzz, an OpenType Layout engine library. - * - * Permission is hereby granted, without written agreement and without - * license or royalty fees, to use, copy, modify, and distribute this - * software and its documentation for any purpose, provided that the - * above copyright notice and the following two paragraphs appear in - * all copies of this software. - * - * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR - * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES - * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN - * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE. - * - * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, - * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS - * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO - * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. - * - * Red Hat Author(s): Behdad Esfahbod - */ - -#include "harfbuzz-impl.h" -#include "harfbuzz-gsub-private.h" -#include "harfbuzz-open-private.h" -#include "harfbuzz-gdef-private.h" - -static HB_Error GSUB_Do_Glyph_Lookup( HB_GSUBHeader* gsub, - HB_UShort lookup_index, - HB_Buffer buffer, - HB_UShort context_length, - int nesting_level ); - - - -/********************** - * Auxiliary functions - **********************/ - - - -HB_Error HB_Load_GSUB_Table( HB_Stream stream, - HB_GSUBHeader** retptr, - HB_GDEFHeader* gdef, - HB_Stream gdefStream ) -{ - HB_Error error; - HB_UInt cur_offset, new_offset, base_offset; - - HB_GSUBHeader* gsub; - - if ( !retptr ) - return ERR(HB_Err_Invalid_Argument); - - if ( GOTO_Table( TTAG_GSUB ) ) - return error; - - base_offset = FILE_Pos(); - - if ( ALLOC ( gsub, sizeof( *gsub ) ) ) - return error; - - - /* skip version */ - - if ( FILE_Seek( base_offset + 4L ) || - ACCESS_Frame( 2L ) ) - goto Fail4; - - new_offset = GET_UShort() + base_offset; - - FORGET_Frame(); - - cur_offset = FILE_Pos(); - if ( FILE_Seek( new_offset ) || - ( error = _HB_OPEN_Load_ScriptList( &gsub->ScriptList, - stream ) ) != HB_Err_Ok ) - goto Fail4; - (void)FILE_Seek( cur_offset ); - - if ( ACCESS_Frame( 2L ) ) - goto Fail3; - - new_offset = GET_UShort() + base_offset; - - FORGET_Frame(); - - cur_offset = FILE_Pos(); - if ( FILE_Seek( new_offset ) || - ( error = _HB_OPEN_Load_FeatureList( &gsub->FeatureList, - stream ) ) != HB_Err_Ok ) - goto Fail3; - (void)FILE_Seek( cur_offset ); - - if ( ACCESS_Frame( 2L ) ) - goto Fail2; - - new_offset = GET_UShort() + base_offset; - - FORGET_Frame(); - - cur_offset = FILE_Pos(); - if ( FILE_Seek( new_offset ) || - ( error = _HB_OPEN_Load_LookupList( &gsub->LookupList, - stream, HB_Type_GSUB ) ) != HB_Err_Ok ) - goto Fail2; - - gsub->gdef = gdef; /* can be NULL */ - - if ( ( error = _HB_GDEF_LoadMarkAttachClassDef_From_LookupFlags( gdef, gdefStream, - gsub->LookupList.Lookup, - gsub->LookupList.LookupCount ) ) ) - goto Fail1; - - *retptr = gsub; - - return HB_Err_Ok; - -Fail1: - _HB_OPEN_Free_LookupList( &gsub->LookupList, HB_Type_GSUB ); - -Fail2: - _HB_OPEN_Free_FeatureList( &gsub->FeatureList ); - -Fail3: - _HB_OPEN_Free_ScriptList( &gsub->ScriptList ); - -Fail4: - FREE ( gsub ); - - - return error; -} - - -HB_Error HB_Done_GSUB_Table( HB_GSUBHeader* gsub ) -{ - _HB_OPEN_Free_LookupList( &gsub->LookupList, HB_Type_GSUB ); - _HB_OPEN_Free_FeatureList( &gsub->FeatureList ); - _HB_OPEN_Free_ScriptList( &gsub->ScriptList ); - - FREE( gsub ); - - return HB_Err_Ok; -} - -/***************************** - * SubTable related functions - *****************************/ - - -/* LookupType 1 */ - -/* SingleSubstFormat1 */ -/* SingleSubstFormat2 */ - -static HB_Error Load_SingleSubst( HB_GSUB_SubTable* st, - HB_Stream stream ) -{ - HB_Error error; - HB_SingleSubst* ss = &st->single; - - HB_UShort n, count; - HB_UInt cur_offset, new_offset, base_offset; - - HB_UShort* s; - - - base_offset = FILE_Pos(); - - if ( ACCESS_Frame( 4L ) ) - return error; - - ss->SubstFormat = GET_UShort(); - new_offset = GET_UShort() + base_offset; - - FORGET_Frame(); - - cur_offset = FILE_Pos(); - if ( FILE_Seek( new_offset ) || - ( error = _HB_OPEN_Load_Coverage( &ss->Coverage, stream ) ) != HB_Err_Ok ) - return error; - (void)FILE_Seek( cur_offset ); - - switch ( ss->SubstFormat ) - { - case 1: - if ( ACCESS_Frame( 2L ) ) - goto Fail2; - - ss->ssf.ssf1.DeltaGlyphID = GET_UShort(); - - FORGET_Frame(); - - break; - - case 2: - if ( ACCESS_Frame( 2L ) ) - goto Fail2; - - count = ss->ssf.ssf2.GlyphCount = GET_UShort(); - - FORGET_Frame(); - - ss->ssf.ssf2.Substitute = NULL; - - if ( ALLOC_ARRAY( ss->ssf.ssf2.Substitute, count, HB_UShort ) ) - goto Fail2; - - s = ss->ssf.ssf2.Substitute; - - if ( ACCESS_Frame( count * 2L ) ) - goto Fail1; - - for ( n = 0; n < count; n++ ) - s[n] = GET_UShort(); - - FORGET_Frame(); - - break; - - default: - return ERR(HB_Err_Invalid_SubTable_Format); - } - - return HB_Err_Ok; - -Fail1: - FREE( s ); - -Fail2: - _HB_OPEN_Free_Coverage( &ss->Coverage ); - return error; -} - - -static void Free_SingleSubst( HB_GSUB_SubTable* st ) -{ - HB_SingleSubst* ss = &st->single; - - switch ( ss->SubstFormat ) - { - case 1: - break; - - case 2: - FREE( ss->ssf.ssf2.Substitute ); - break; - - default: - break; - } - - _HB_OPEN_Free_Coverage( &ss->Coverage ); -} - - -static HB_Error Lookup_SingleSubst( HB_GSUBHeader* gsub, - HB_GSUB_SubTable* st, - HB_Buffer buffer, - HB_UShort flags, - HB_UShort context_length, - int nesting_level ) -{ - HB_UShort index, value, property; - HB_Error error; - HB_SingleSubst* ss = &st->single; - HB_GDEFHeader* gdef = gsub->gdef; - - HB_UNUSED(nesting_level); - - if ( context_length != 0xFFFF && context_length < 1 ) - return HB_Err_Not_Covered; - - if ( CHECK_Property( gdef, IN_CURITEM(), flags, &property ) ) - return error; - - error = _HB_OPEN_Coverage_Index( &ss->Coverage, IN_CURGLYPH(), &index ); - if ( error ) - return error; - - switch ( ss->SubstFormat ) - { - case 1: - value = ( IN_CURGLYPH() + ss->ssf.ssf1.DeltaGlyphID ) & 0xFFFF; - if ( REPLACE_Glyph( buffer, value, nesting_level ) ) - return error; - break; - - case 2: - if ( index >= ss->ssf.ssf2.GlyphCount ) - return ERR(HB_Err_Invalid_SubTable); - value = ss->ssf.ssf2.Substitute[index]; - if ( REPLACE_Glyph( buffer, value, nesting_level ) ) - return error; - break; - - default: - return ERR(HB_Err_Invalid_SubTable); - } - - if ( gdef && gdef->NewGlyphClasses ) - { - /* we inherit the old glyph class to the substituted glyph */ - - error = _HB_GDEF_Add_Glyph_Property( gdef, value, property ); - if ( error && error != HB_Err_Not_Covered ) - return error; - } - - return HB_Err_Ok; -} - - -/* LookupType 2 */ - -/* Sequence */ - -static HB_Error Load_Sequence( HB_Sequence* s, - HB_Stream stream ) -{ - HB_Error error; - - HB_UShort n, count; - HB_UShort* sub; - - - if ( ACCESS_Frame( 2L ) ) - return error; - - count = s->GlyphCount = GET_UShort(); - - FORGET_Frame(); - - s->Substitute = NULL; - - if ( count ) - { - if ( ALLOC_ARRAY( s->Substitute, count, HB_UShort ) ) - return error; - - sub = s->Substitute; - - if ( ACCESS_Frame( count * 2L ) ) - { - FREE( sub ); - return error; - } - - for ( n = 0; n < count; n++ ) - sub[n] = GET_UShort(); - - FORGET_Frame(); - } - - return HB_Err_Ok; -} - - -static void Free_Sequence( HB_Sequence* s ) -{ - FREE( s->Substitute ); -} - - -/* MultipleSubstFormat1 */ - -static HB_Error Load_MultipleSubst( HB_GSUB_SubTable* st, - HB_Stream stream ) -{ - HB_Error error; - HB_MultipleSubst* ms = &st->multiple; - - HB_UShort n = 0, m, count; - HB_UInt cur_offset, new_offset, base_offset; - - HB_Sequence* s; - - - base_offset = FILE_Pos(); - - if ( ACCESS_Frame( 4L ) ) - return error; - - ms->SubstFormat = GET_UShort(); /* should be 1 */ - new_offset = GET_UShort() + base_offset; - - FORGET_Frame(); - - cur_offset = FILE_Pos(); - if ( FILE_Seek( new_offset ) || - ( error = _HB_OPEN_Load_Coverage( &ms->Coverage, stream ) ) != HB_Err_Ok ) - return error; - (void)FILE_Seek( cur_offset ); - - if ( ACCESS_Frame( 2L ) ) - goto Fail2; - - count = ms->SequenceCount = GET_UShort(); - - FORGET_Frame(); - - ms->Sequence = NULL; - - if ( ALLOC_ARRAY( ms->Sequence, count, HB_Sequence ) ) - goto Fail2; - - s = ms->Sequence; - - for ( n = 0; n < count; n++ ) - { - if ( ACCESS_Frame( 2L ) ) - goto Fail1; - - new_offset = GET_UShort() + base_offset; - - FORGET_Frame(); - - cur_offset = FILE_Pos(); - if ( FILE_Seek( new_offset ) || - ( error = Load_Sequence( &s[n], stream ) ) != HB_Err_Ok ) - goto Fail1; - (void)FILE_Seek( cur_offset ); - } - - return HB_Err_Ok; - -Fail1: - for ( m = 0; m < n; m++ ) - Free_Sequence( &s[m] ); - - FREE( s ); - -Fail2: - _HB_OPEN_Free_Coverage( &ms->Coverage ); - return error; -} - - -static void Free_MultipleSubst( HB_GSUB_SubTable* st ) -{ - HB_UShort n, count; - HB_MultipleSubst* ms = &st->multiple; - - HB_Sequence* s; - - - if ( ms->Sequence ) - { - count = ms->SequenceCount; - s = ms->Sequence; - - for ( n = 0; n < count; n++ ) - Free_Sequence( &s[n] ); - - FREE( s ); - } - - _HB_OPEN_Free_Coverage( &ms->Coverage ); -} - - -static HB_Error Lookup_MultipleSubst( HB_GSUBHeader* gsub, - HB_GSUB_SubTable* st, - HB_Buffer buffer, - HB_UShort flags, - HB_UShort context_length, - int nesting_level ) -{ - HB_Error error; - HB_UShort index, property, n, count; - HB_UShort*s; - HB_MultipleSubst* ms = &st->multiple; - HB_GDEFHeader* gdef = gsub->gdef; - - HB_UNUSED(nesting_level); - - if ( context_length != 0xFFFF && context_length < 1 ) - return HB_Err_Not_Covered; - - if ( CHECK_Property( gdef, IN_CURITEM(), flags, &property ) ) - return error; - - error = _HB_OPEN_Coverage_Index( &ms->Coverage, IN_CURGLYPH(), &index ); - if ( error ) - return error; - - if ( index >= ms->SequenceCount ) - return ERR(HB_Err_Invalid_SubTable); - - count = ms->Sequence[index].GlyphCount; - s = ms->Sequence[index].Substitute; - - if ( ADD_String( buffer, 1, count, s, 0xFFFF, 0xFFFF ) ) - return error; - - if ( gdef && gdef->NewGlyphClasses ) - { - /* this is a guess only ... */ - - if ( property == HB_GDEF_LIGATURE ) - property = HB_GDEF_BASE_GLYPH; - - for ( n = 0; n < count; n++ ) - { - error = _HB_GDEF_Add_Glyph_Property( gdef, s[n], property ); - if ( error && error != HB_Err_Not_Covered ) - return error; - } - } - - return HB_Err_Ok; -} - - -/* LookupType 3 */ - -/* AlternateSet */ - -static HB_Error Load_AlternateSet( HB_AlternateSet* as, - HB_Stream stream ) -{ - HB_Error error; - - HB_UShort n, count; - HB_UShort* a; - - - if ( ACCESS_Frame( 2L ) ) - return error; - - count = as->GlyphCount = GET_UShort(); - - FORGET_Frame(); - - as->Alternate = NULL; - - if ( ALLOC_ARRAY( as->Alternate, count, HB_UShort ) ) - return error; - - a = as->Alternate; - - if ( ACCESS_Frame( count * 2L ) ) - { - FREE( a ); - return error; - } - - for ( n = 0; n < count; n++ ) - a[n] = GET_UShort(); - - FORGET_Frame(); - - return HB_Err_Ok; -} - - -static void Free_AlternateSet( HB_AlternateSet* as ) -{ - FREE( as->Alternate ); -} - - -/* AlternateSubstFormat1 */ - -static HB_Error Load_AlternateSubst( HB_GSUB_SubTable* st, - HB_Stream stream ) -{ - HB_Error error; - HB_AlternateSubst* as = &st->alternate; - - HB_UShort n = 0, m, count; - HB_UInt cur_offset, new_offset, base_offset; - - HB_AlternateSet* aset; - - - base_offset = FILE_Pos(); - - if ( ACCESS_Frame( 4L ) ) - return error; - - as->SubstFormat = GET_UShort(); /* should be 1 */ - new_offset = GET_UShort() + base_offset; - - FORGET_Frame(); - - cur_offset = FILE_Pos(); - if ( FILE_Seek( new_offset ) || - ( error = _HB_OPEN_Load_Coverage( &as->Coverage, stream ) ) != HB_Err_Ok ) - return error; - (void)FILE_Seek( cur_offset ); - - if ( ACCESS_Frame( 2L ) ) - goto Fail2; - - count = as->AlternateSetCount = GET_UShort(); - - FORGET_Frame(); - - as->AlternateSet = NULL; - - if ( ALLOC_ARRAY( as->AlternateSet, count, HB_AlternateSet ) ) - goto Fail2; - - aset = as->AlternateSet; - - for ( n = 0; n < count; n++ ) - { - if ( ACCESS_Frame( 2L ) ) - goto Fail1; - - new_offset = GET_UShort() + base_offset; - - FORGET_Frame(); - - cur_offset = FILE_Pos(); - if ( FILE_Seek( new_offset ) || - ( error = Load_AlternateSet( &aset[n], stream ) ) != HB_Err_Ok ) - goto Fail1; - (void)FILE_Seek( cur_offset ); - } - - return HB_Err_Ok; - -Fail1: - for ( m = 0; m < n; m++ ) - Free_AlternateSet( &aset[m] ); - - FREE( aset ); - -Fail2: - _HB_OPEN_Free_Coverage( &as->Coverage ); - return error; -} - - -static void Free_AlternateSubst( HB_GSUB_SubTable* st ) -{ - HB_UShort n, count; - HB_AlternateSubst* as = &st->alternate; - - HB_AlternateSet* aset; - - - if ( as->AlternateSet ) - { - count = as->AlternateSetCount; - aset = as->AlternateSet; - - for ( n = 0; n < count; n++ ) - Free_AlternateSet( &aset[n] ); - - FREE( aset ); - } - - _HB_OPEN_Free_Coverage( &as->Coverage ); -} - - -static HB_Error Lookup_AlternateSubst( HB_GSUBHeader* gsub, - HB_GSUB_SubTable* st, - HB_Buffer buffer, - HB_UShort flags, - HB_UShort context_length, - int nesting_level ) -{ - HB_Error error; - HB_UShort index, value, alt_index, property; - HB_AlternateSubst* as = &st->alternate; - HB_GDEFHeader* gdef = gsub->gdef; - HB_AlternateSet aset; - - HB_UNUSED(nesting_level); - - if ( context_length != 0xFFFF && context_length < 1 ) - return HB_Err_Not_Covered; - - if ( CHECK_Property( gdef, IN_CURITEM(), flags, &property ) ) - return error; - - error = _HB_OPEN_Coverage_Index( &as->Coverage, IN_CURGLYPH(), &index ); - if ( error ) - return error; - - aset = as->AlternateSet[index]; - - /* we use a user-defined callback function to get the alternate index */ - - if ( gsub->altfunc ) - alt_index = (gsub->altfunc)( buffer->out_pos, IN_CURGLYPH(), - aset.GlyphCount, aset.Alternate, - gsub->data ); - else - alt_index = 0; - - value = aset.Alternate[alt_index]; - if ( REPLACE_Glyph( buffer, value, nesting_level ) ) - return error; - - if ( gdef && gdef->NewGlyphClasses ) - { - /* we inherit the old glyph class to the substituted glyph */ - - error = _HB_GDEF_Add_Glyph_Property( gdef, value, property ); - if ( error && error != HB_Err_Not_Covered ) - return error; - } - - return HB_Err_Ok; -} - - -/* LookupType 4 */ - -/* Ligature */ - -static HB_Error Load_Ligature( HB_Ligature* l, - HB_Stream stream ) -{ - HB_Error error; - - HB_UShort n, count; - HB_UShort* c; - - - if ( ACCESS_Frame( 4L ) ) - return error; - - l->LigGlyph = GET_UShort(); - l->ComponentCount = GET_UShort(); - - FORGET_Frame(); - - l->Component = NULL; - - count = l->ComponentCount - 1; /* only ComponentCount - 1 elements */ - - if ( ALLOC_ARRAY( l->Component, count, HB_UShort ) ) - return error; - - c = l->Component; - - if ( ACCESS_Frame( count * 2L ) ) - { - FREE( c ); - return error; - } - - for ( n = 0; n < count; n++ ) - c[n] = GET_UShort(); - - FORGET_Frame(); - - return HB_Err_Ok; -} - - -static void Free_Ligature( HB_Ligature* l ) -{ - FREE( l->Component ); -} - - -/* LigatureSet */ - -static HB_Error Load_LigatureSet( HB_LigatureSet* ls, - HB_Stream stream ) -{ - HB_Error error; - - HB_UShort n = 0, m, count; - HB_UInt cur_offset, new_offset, base_offset; - - HB_Ligature* l; - - - base_offset = FILE_Pos(); - - if ( ACCESS_Frame( 2L ) ) - return error; - - count = ls->LigatureCount = GET_UShort(); - - FORGET_Frame(); - - ls->Ligature = NULL; - - if ( ALLOC_ARRAY( ls->Ligature, count, HB_Ligature ) ) - return error; - - l = ls->Ligature; - - for ( n = 0; n < count; n++ ) - { - if ( ACCESS_Frame( 2L ) ) - goto Fail; - - new_offset = GET_UShort() + base_offset; - - FORGET_Frame(); - - cur_offset = FILE_Pos(); - if ( FILE_Seek( new_offset ) || - ( error = Load_Ligature( &l[n], stream ) ) != HB_Err_Ok ) - goto Fail; - (void)FILE_Seek( cur_offset ); - } - - return HB_Err_Ok; - -Fail: - for ( m = 0; m < n; m++ ) - Free_Ligature( &l[m] ); - - FREE( l ); - return error; -} - - -static void Free_LigatureSet( HB_LigatureSet* ls ) -{ - HB_UShort n, count; - - HB_Ligature* l; - - - if ( ls->Ligature ) - { - count = ls->LigatureCount; - l = ls->Ligature; - - for ( n = 0; n < count; n++ ) - Free_Ligature( &l[n] ); - - FREE( l ); - } -} - - -/* LigatureSubstFormat1 */ - -static HB_Error Load_LigatureSubst( HB_GSUB_SubTable* st, - HB_Stream stream ) -{ - HB_Error error; - HB_LigatureSubst* ls = &st->ligature; - - HB_UShort n = 0, m, count; - HB_UInt cur_offset, new_offset, base_offset; - - HB_LigatureSet* lset; - - - base_offset = FILE_Pos(); - - if ( ACCESS_Frame( 4L ) ) - return error; - - ls->SubstFormat = GET_UShort(); /* should be 1 */ - new_offset = GET_UShort() + base_offset; - - FORGET_Frame(); - - cur_offset = FILE_Pos(); - if ( FILE_Seek( new_offset ) || - ( error = _HB_OPEN_Load_Coverage( &ls->Coverage, stream ) ) != HB_Err_Ok ) - return error; - (void)FILE_Seek( cur_offset ); - - if ( ACCESS_Frame( 2L ) ) - goto Fail2; - - count = ls->LigatureSetCount = GET_UShort(); - - FORGET_Frame(); - - ls->LigatureSet = NULL; - - if ( ALLOC_ARRAY( ls->LigatureSet, count, HB_LigatureSet ) ) - goto Fail2; - - lset = ls->LigatureSet; - - for ( n = 0; n < count; n++ ) - { - if ( ACCESS_Frame( 2L ) ) - goto Fail1; - - new_offset = GET_UShort() + base_offset; - - FORGET_Frame(); - - cur_offset = FILE_Pos(); - if ( FILE_Seek( new_offset ) || - ( error = Load_LigatureSet( &lset[n], stream ) ) != HB_Err_Ok ) - goto Fail1; - (void)FILE_Seek( cur_offset ); - } - - return HB_Err_Ok; - -Fail1: - for ( m = 0; m < n; m++ ) - Free_LigatureSet( &lset[m] ); - - FREE( lset ); - -Fail2: - _HB_OPEN_Free_Coverage( &ls->Coverage ); - return error; -} - - -static void Free_LigatureSubst( HB_GSUB_SubTable* st ) -{ - HB_UShort n, count; - HB_LigatureSubst* ls = &st->ligature; - - HB_LigatureSet* lset; - - - if ( ls->LigatureSet ) - { - count = ls->LigatureSetCount; - lset = ls->LigatureSet; - - for ( n = 0; n < count; n++ ) - Free_LigatureSet( &lset[n] ); - - FREE( lset ); - } - - _HB_OPEN_Free_Coverage( &ls->Coverage ); -} - - -static HB_Error Lookup_LigatureSubst( HB_GSUBHeader* gsub, - HB_GSUB_SubTable* st, - HB_Buffer buffer, - HB_UShort flags, - HB_UShort context_length, - int nesting_level ) -{ - HB_UShort index, property; - HB_Error error; - HB_UShort numlig, i, j, is_mark, first_is_mark = FALSE; - HB_UShort* c; - HB_LigatureSubst* ls = &st->ligature; - HB_GDEFHeader* gdef = gsub->gdef; - - HB_Ligature* lig; - - HB_UNUSED(nesting_level); - - if ( CHECK_Property( gdef, IN_CURITEM(), flags, &property ) ) - return error; - - if ( property == HB_GDEF_MARK || property & HB_LOOKUP_FLAG_IGNORE_SPECIAL_MARKS ) - first_is_mark = TRUE; - - error = _HB_OPEN_Coverage_Index( &ls->Coverage, IN_CURGLYPH(), &index ); - if ( error ) - return error; - - if ( index >= ls->LigatureSetCount ) - return ERR(HB_Err_Invalid_SubTable); - - lig = ls->LigatureSet[index].Ligature; - - for ( numlig = ls->LigatureSet[index].LigatureCount; - numlig; - numlig--, lig++ ) - { - if ( buffer->in_pos + lig->ComponentCount > buffer->in_length ) - goto next_ligature; /* Not enough glyphs in input */ - - c = lig->Component; - - is_mark = first_is_mark; - - if ( context_length != 0xFFFF && context_length < lig->ComponentCount ) - break; - - for ( i = 1, j = buffer->in_pos + 1; i < lig->ComponentCount; i++, j++ ) - { - while ( CHECK_Property( gdef, IN_ITEM( j ), flags, &property ) ) - { - if ( error && error != HB_Err_Not_Covered ) - return error; - - if ( j + lig->ComponentCount - i == (HB_Int)buffer->in_length ) - goto next_ligature; - j++; - } - - if ( !( property == HB_GDEF_MARK || property & HB_LOOKUP_FLAG_IGNORE_SPECIAL_MARKS ) ) - is_mark = FALSE; - - if ( IN_GLYPH( j ) != c[i - 1] ) - goto next_ligature; - } - - if ( gdef && gdef->NewGlyphClasses ) - { - /* this is just a guess ... */ - - error = _HB_GDEF_Add_Glyph_Property( gdef, lig->LigGlyph, - is_mark ? HB_GDEF_MARK : HB_GDEF_LIGATURE ); - if ( error && error != HB_Err_Not_Covered ) - return error; - } - - if ( j == buffer->in_pos + i ) /* No input glyphs skipped */ - { - /* We don't use a new ligature ID if there are no skipped - glyphs and the ligature already has an ID. */ - - if ( IN_LIGID( buffer->in_pos ) ) - { - if ( ADD_String( buffer, i, 1, &lig->LigGlyph, - 0xFFFF, 0xFFFF ) ) - return error; - } - else - { - HB_UShort ligID = _hb_buffer_allocate_ligid( buffer ); - if ( ADD_String( buffer, i, 1, &lig->LigGlyph, - 0xFFFF, ligID ) ) - return error; - } - } - else - { - HB_UShort ligID = _hb_buffer_allocate_ligid( buffer ); - if ( ADD_Glyph( buffer, lig->LigGlyph, 0xFFFF, ligID ) ) - return error; - - /* Now we must do a second loop to copy the skipped glyphs to - `out' and assign component values to it. We start with the - glyph after the first component. Glyphs between component - i and i+1 belong to component i. Together with the ligID - value it is later possible to check whether a specific - component value really belongs to a given ligature. */ - - for ( i = 0; i < lig->ComponentCount - 1; i++ ) - { - while ( CHECK_Property( gdef, IN_CURITEM(), - flags, &property ) ) - if ( ADD_Glyph( buffer, IN_CURGLYPH(), i, ligID ) ) - return error; - - (buffer->in_pos)++; - } - } - - return HB_Err_Ok; - - next_ligature: - ; - } - - return HB_Err_Not_Covered; -} - - -/* Do the actual substitution for a context substitution (either format - 5 or 6). This is only called after we've determined that the input - matches the subrule. */ - -static HB_Error Do_ContextSubst( HB_GSUBHeader* gsub, - HB_UShort GlyphCount, - HB_UShort SubstCount, - HB_SubstLookupRecord* subst, - HB_Buffer buffer, - int nesting_level ) -{ - HB_Error error; - HB_UInt i, old_pos; - - - i = 0; - - while ( i < GlyphCount ) - { - if ( SubstCount && i == subst->SequenceIndex ) - { - old_pos = buffer->in_pos; - - /* Do a substitution */ - - error = GSUB_Do_Glyph_Lookup( gsub, subst->LookupListIndex, buffer, - GlyphCount, nesting_level ); - - subst++; - SubstCount--; - i += buffer->in_pos - old_pos; - - if ( error == HB_Err_Not_Covered ) - { - if ( COPY_Glyph( buffer ) ) - return error; - i++; - } - else if ( error ) - return error; - } - else - { - /* No substitution for this index */ - - if ( COPY_Glyph( buffer ) ) - return error; - i++; - } - } - - return HB_Err_Ok; -} - - -/* LookupType 5 */ - -/* SubRule */ - -static HB_Error Load_SubRule( HB_SubRule* sr, - HB_Stream stream ) -{ - HB_Error error; - - HB_UShort n, count; - HB_UShort* i; - - HB_SubstLookupRecord* slr; - - - if ( ACCESS_Frame( 4L ) ) - return error; - - sr->GlyphCount = GET_UShort(); - sr->SubstCount = GET_UShort(); - - FORGET_Frame(); - - sr->Input = NULL; - - count = sr->GlyphCount - 1; /* only GlyphCount - 1 elements */ - - if ( ALLOC_ARRAY( sr->Input, count, HB_UShort ) ) - return error; - - i = sr->Input; - - if ( ACCESS_Frame( count * 2L ) ) - goto Fail2; - - for ( n = 0; n < count; n++ ) - i[n] = GET_UShort(); - - FORGET_Frame(); - - sr->SubstLookupRecord = NULL; - - count = sr->SubstCount; - - if ( ALLOC_ARRAY( sr->SubstLookupRecord, count, HB_SubstLookupRecord ) ) - goto Fail2; - - slr = sr->SubstLookupRecord; - - if ( ACCESS_Frame( count * 4L ) ) - goto Fail1; - - for ( n = 0; n < count; n++ ) - { - slr[n].SequenceIndex = GET_UShort(); - slr[n].LookupListIndex = GET_UShort(); - } - - FORGET_Frame(); - - return HB_Err_Ok; - -Fail1: - FREE( slr ); - -Fail2: - FREE( i ); - return error; -} - - -static void Free_SubRule( HB_SubRule* sr ) -{ - FREE( sr->SubstLookupRecord ); - FREE( sr->Input ); -} - - -/* SubRuleSet */ - -static HB_Error Load_SubRuleSet( HB_SubRuleSet* srs, - HB_Stream stream ) -{ - HB_Error error; - - HB_UShort n = 0, m, count; - HB_UInt cur_offset, new_offset, base_offset; - - HB_SubRule* sr; - - - base_offset = FILE_Pos(); - - if ( ACCESS_Frame( 2L ) ) - return error; - - count = srs->SubRuleCount = GET_UShort(); - - FORGET_Frame(); - - srs->SubRule = NULL; - - if ( ALLOC_ARRAY( srs->SubRule, count, HB_SubRule ) ) - return error; - - sr = srs->SubRule; - - for ( n = 0; n < count; n++ ) - { - if ( ACCESS_Frame( 2L ) ) - goto Fail; - - new_offset = GET_UShort() + base_offset; - - FORGET_Frame(); - - cur_offset = FILE_Pos(); - if ( FILE_Seek( new_offset ) || - ( error = Load_SubRule( &sr[n], stream ) ) != HB_Err_Ok ) - goto Fail; - (void)FILE_Seek( cur_offset ); - } - - return HB_Err_Ok; - -Fail: - for ( m = 0; m < n; m++ ) - Free_SubRule( &sr[m] ); - - FREE( sr ); - return error; -} - - -static void Free_SubRuleSet( HB_SubRuleSet* srs ) -{ - HB_UShort n, count; - - HB_SubRule* sr; - - - if ( srs->SubRule ) - { - count = srs->SubRuleCount; - sr = srs->SubRule; - - for ( n = 0; n < count; n++ ) - Free_SubRule( &sr[n] ); - - FREE( sr ); - } -} - - -/* ContextSubstFormat1 */ - -static HB_Error Load_ContextSubst1( HB_ContextSubstFormat1* csf1, - HB_Stream stream ) -{ - HB_Error error; - - HB_UShort n = 0, m, count; - HB_UInt cur_offset, new_offset, base_offset; - - HB_SubRuleSet* srs; - - - base_offset = FILE_Pos() - 2L; - - if ( ACCESS_Frame( 2L ) ) - return error; - - new_offset = GET_UShort() + base_offset; - - FORGET_Frame(); - - cur_offset = FILE_Pos(); - if ( FILE_Seek( new_offset ) || - ( error = _HB_OPEN_Load_Coverage( &csf1->Coverage, stream ) ) != HB_Err_Ok ) - return error; - (void)FILE_Seek( cur_offset ); - - if ( ACCESS_Frame( 2L ) ) - goto Fail2; - - count = csf1->SubRuleSetCount = GET_UShort(); - - FORGET_Frame(); - - csf1->SubRuleSet = NULL; - - if ( ALLOC_ARRAY( csf1->SubRuleSet, count, HB_SubRuleSet ) ) - goto Fail2; - - srs = csf1->SubRuleSet; - - for ( n = 0; n < count; n++ ) - { - if ( ACCESS_Frame( 2L ) ) - goto Fail1; - - new_offset = GET_UShort() + base_offset; - - FORGET_Frame(); - - cur_offset = FILE_Pos(); - if ( FILE_Seek( new_offset ) || - ( error = Load_SubRuleSet( &srs[n], stream ) ) != HB_Err_Ok ) - goto Fail1; - (void)FILE_Seek( cur_offset ); - } - - return HB_Err_Ok; - -Fail1: - for ( m = 0; m < n; m++ ) - Free_SubRuleSet( &srs[m] ); - - FREE( srs ); - -Fail2: - _HB_OPEN_Free_Coverage( &csf1->Coverage ); - return error; -} - - -static void Free_ContextSubst1( HB_ContextSubstFormat1* csf1 ) -{ - HB_UShort n, count; - - HB_SubRuleSet* srs; - - - if ( csf1->SubRuleSet ) - { - count = csf1->SubRuleSetCount; - srs = csf1->SubRuleSet; - - for ( n = 0; n < count; n++ ) - Free_SubRuleSet( &srs[n] ); - - FREE( srs ); - } - - _HB_OPEN_Free_Coverage( &csf1->Coverage ); -} - - -/* SubClassRule */ - -static HB_Error Load_SubClassRule( HB_ContextSubstFormat2* csf2, - HB_SubClassRule* scr, - HB_Stream stream ) -{ - HB_Error error; - - HB_UShort n, count; - - HB_UShort* c; - HB_SubstLookupRecord* slr; - - - if ( ACCESS_Frame( 4L ) ) - return error; - - scr->GlyphCount = GET_UShort(); - scr->SubstCount = GET_UShort(); - - if ( scr->GlyphCount > csf2->MaxContextLength ) - csf2->MaxContextLength = scr->GlyphCount; - - FORGET_Frame(); - - scr->Class = NULL; - - count = scr->GlyphCount - 1; /* only GlyphCount - 1 elements */ - - if ( ALLOC_ARRAY( scr->Class, count, HB_UShort ) ) - return error; - - c = scr->Class; - - if ( ACCESS_Frame( count * 2L ) ) - goto Fail2; - - for ( n = 0; n < count; n++ ) - c[n] = GET_UShort(); - - FORGET_Frame(); - - scr->SubstLookupRecord = NULL; - - count = scr->SubstCount; - - if ( ALLOC_ARRAY( scr->SubstLookupRecord, count, HB_SubstLookupRecord ) ) - goto Fail2; - - slr = scr->SubstLookupRecord; - - if ( ACCESS_Frame( count * 4L ) ) - goto Fail1; - - for ( n = 0; n < count; n++ ) - { - slr[n].SequenceIndex = GET_UShort(); - slr[n].LookupListIndex = GET_UShort(); - } - - FORGET_Frame(); - - return HB_Err_Ok; - -Fail1: - FREE( slr ); - -Fail2: - FREE( c ); - return error; -} - - -static void Free_SubClassRule( HB_SubClassRule* scr ) -{ - FREE( scr->SubstLookupRecord ); - FREE( scr->Class ); -} - - -/* SubClassSet */ - -static HB_Error Load_SubClassSet( HB_ContextSubstFormat2* csf2, - HB_SubClassSet* scs, - HB_Stream stream ) -{ - HB_Error error; - - HB_UShort n = 0, m, count; - HB_UInt cur_offset, new_offset, base_offset; - - HB_SubClassRule* scr; - - - base_offset = FILE_Pos(); - - if ( ACCESS_Frame( 2L ) ) - return error; - - count = scs->SubClassRuleCount = GET_UShort(); - - FORGET_Frame(); - - scs->SubClassRule = NULL; - - if ( ALLOC_ARRAY( scs->SubClassRule, count, HB_SubClassRule ) ) - return error; - - scr = scs->SubClassRule; - - for ( n = 0; n < count; n++ ) - { - if ( ACCESS_Frame( 2L ) ) - goto Fail; - - new_offset = GET_UShort() + base_offset; - - FORGET_Frame(); - - cur_offset = FILE_Pos(); - if ( FILE_Seek( new_offset ) || - ( error = Load_SubClassRule( csf2, &scr[n], - stream ) ) != HB_Err_Ok ) - goto Fail; - (void)FILE_Seek( cur_offset ); - } - - return HB_Err_Ok; - -Fail: - for ( m = 0; m < n; m++ ) - Free_SubClassRule( &scr[m] ); - - FREE( scr ); - return error; -} - - -static void Free_SubClassSet( HB_SubClassSet* scs ) -{ - HB_UShort n, count; - - HB_SubClassRule* scr; - - - if ( scs->SubClassRule ) - { - count = scs->SubClassRuleCount; - scr = scs->SubClassRule; - - for ( n = 0; n < count; n++ ) - Free_SubClassRule( &scr[n] ); - - FREE( scr ); - } -} - - -/* ContextSubstFormat2 */ - -static HB_Error Load_ContextSubst2( HB_ContextSubstFormat2* csf2, - HB_Stream stream ) -{ - HB_Error error; - - HB_UShort n = 0, m, count; - HB_UInt cur_offset, new_offset, base_offset; - - HB_SubClassSet* scs; - - - base_offset = FILE_Pos() - 2; - - if ( ACCESS_Frame( 2L ) ) - return error; - - new_offset = GET_UShort() + base_offset; - - FORGET_Frame(); - - cur_offset = FILE_Pos(); - if ( FILE_Seek( new_offset ) || - ( error = _HB_OPEN_Load_Coverage( &csf2->Coverage, stream ) ) != HB_Err_Ok ) - return error; - (void)FILE_Seek( cur_offset ); - - if ( ACCESS_Frame( 4L ) ) - goto Fail3; - - new_offset = GET_UShort() + base_offset; - - /* `SubClassSetCount' is the upper limit for class values, thus we - read it now to make an additional safety check. */ - - count = csf2->SubClassSetCount = GET_UShort(); - - FORGET_Frame(); - - cur_offset = FILE_Pos(); - if ( FILE_Seek( new_offset ) || - ( error = _HB_OPEN_Load_ClassDefinition( &csf2->ClassDef, count, - stream ) ) != HB_Err_Ok ) - goto Fail3; - (void)FILE_Seek( cur_offset ); - - csf2->SubClassSet = NULL; - csf2->MaxContextLength = 0; - - if ( ALLOC_ARRAY( csf2->SubClassSet, count, HB_SubClassSet ) ) - goto Fail2; - - scs = csf2->SubClassSet; - - for ( n = 0; n < count; n++ ) - { - if ( ACCESS_Frame( 2L ) ) - goto Fail1; - - new_offset = GET_UShort() + base_offset; - - FORGET_Frame(); - - if ( new_offset != base_offset ) /* not a NULL offset */ - { - cur_offset = FILE_Pos(); - if ( FILE_Seek( new_offset ) || - ( error = Load_SubClassSet( csf2, &scs[n], - stream ) ) != HB_Err_Ok ) - goto Fail1; - (void)FILE_Seek( cur_offset ); - } - else - { - /* we create a SubClassSet table with no entries */ - - csf2->SubClassSet[n].SubClassRuleCount = 0; - csf2->SubClassSet[n].SubClassRule = NULL; - } - } - - return HB_Err_Ok; - -Fail1: - for ( m = 0; m < n; m++ ) - Free_SubClassSet( &scs[m] ); - - FREE( scs ); - -Fail2: - _HB_OPEN_Free_ClassDefinition( &csf2->ClassDef ); - -Fail3: - _HB_OPEN_Free_Coverage( &csf2->Coverage ); - return error; -} - - -static void Free_ContextSubst2( HB_ContextSubstFormat2* csf2 ) -{ - HB_UShort n, count; - - HB_SubClassSet* scs; - - - if ( csf2->SubClassSet ) - { - count = csf2->SubClassSetCount; - scs = csf2->SubClassSet; - - for ( n = 0; n < count; n++ ) - Free_SubClassSet( &scs[n] ); - - FREE( scs ); - } - - _HB_OPEN_Free_ClassDefinition( &csf2->ClassDef ); - _HB_OPEN_Free_Coverage( &csf2->Coverage ); -} - - -/* ContextSubstFormat3 */ - -static HB_Error Load_ContextSubst3( HB_ContextSubstFormat3* csf3, - HB_Stream stream ) -{ - HB_Error error; - - HB_UShort n = 0, m, count; - HB_UInt cur_offset, new_offset, base_offset; - - HB_Coverage* c; - HB_SubstLookupRecord* slr; - - - base_offset = FILE_Pos() - 2L; - - if ( ACCESS_Frame( 4L ) ) - return error; - - csf3->GlyphCount = GET_UShort(); - csf3->SubstCount = GET_UShort(); - - FORGET_Frame(); - - csf3->Coverage = NULL; - - count = csf3->GlyphCount; - - if ( ALLOC_ARRAY( csf3->Coverage, count, HB_Coverage ) ) - return error; - - c = csf3->Coverage; - - for ( n = 0; n < count; n++ ) - { - if ( ACCESS_Frame( 2L ) ) - goto Fail2; - - new_offset = GET_UShort() + base_offset; - - FORGET_Frame(); - - cur_offset = FILE_Pos(); - if ( FILE_Seek( new_offset ) || - ( error = _HB_OPEN_Load_Coverage( &c[n], stream ) ) != HB_Err_Ok ) - goto Fail2; - (void)FILE_Seek( cur_offset ); - } - - csf3->SubstLookupRecord = NULL; - - count = csf3->SubstCount; - - if ( ALLOC_ARRAY( csf3->SubstLookupRecord, count, - HB_SubstLookupRecord ) ) - goto Fail2; - - slr = csf3->SubstLookupRecord; - - if ( ACCESS_Frame( count * 4L ) ) - goto Fail1; - - for ( n = 0; n < count; n++ ) - { - slr[n].SequenceIndex = GET_UShort(); - slr[n].LookupListIndex = GET_UShort(); - } - - FORGET_Frame(); - - return HB_Err_Ok; - -Fail1: - FREE( slr ); - -Fail2: - for ( m = 0; m < n; m++ ) - _HB_OPEN_Free_Coverage( &c[m] ); - - FREE( c ); - return error; -} - - -static void Free_ContextSubst3( HB_ContextSubstFormat3* csf3 ) -{ - HB_UShort n, count; - - HB_Coverage* c; - - - FREE( csf3->SubstLookupRecord ); - - if ( csf3->Coverage ) - { - count = csf3->GlyphCount; - c = csf3->Coverage; - - for ( n = 0; n < count; n++ ) - _HB_OPEN_Free_Coverage( &c[n] ); - - FREE( c ); - } -} - - -/* ContextSubst */ - -static HB_Error Load_ContextSubst( HB_GSUB_SubTable* st, - HB_Stream stream ) -{ - HB_Error error; - HB_ContextSubst* cs = &st->context; - - - if ( ACCESS_Frame( 2L ) ) - return error; - - cs->SubstFormat = GET_UShort(); - - FORGET_Frame(); - - switch ( cs->SubstFormat ) - { - case 1: return Load_ContextSubst1( &cs->csf.csf1, stream ); - case 2: return Load_ContextSubst2( &cs->csf.csf2, stream ); - case 3: return Load_ContextSubst3( &cs->csf.csf3, stream ); - default: return ERR(HB_Err_Invalid_SubTable_Format); - } - - return HB_Err_Ok; /* never reached */ -} - - -static void Free_ContextSubst( HB_GSUB_SubTable* st ) -{ - HB_ContextSubst* cs = &st->context; - - switch ( cs->SubstFormat ) - { - case 1: Free_ContextSubst1( &cs->csf.csf1 ); break; - case 2: Free_ContextSubst2( &cs->csf.csf2 ); break; - case 3: Free_ContextSubst3( &cs->csf.csf3 ); break; - default: break; - } -} - - -static HB_Error Lookup_ContextSubst1( HB_GSUBHeader* gsub, - HB_ContextSubstFormat1* csf1, - HB_Buffer buffer, - HB_UShort flags, - HB_UShort context_length, - int nesting_level ) -{ - HB_UShort index, property; - HB_UShort i, j, k, numsr; - HB_Error error; - - HB_SubRule* sr; - HB_GDEFHeader* gdef; - - - gdef = gsub->gdef; - - if ( CHECK_Property( gdef, IN_CURITEM(), flags, &property ) ) - return error; - - error = _HB_OPEN_Coverage_Index( &csf1->Coverage, IN_CURGLYPH(), &index ); - if ( error ) - return error; - - sr = csf1->SubRuleSet[index].SubRule; - numsr = csf1->SubRuleSet[index].SubRuleCount; - - for ( k = 0; k < numsr; k++ ) - { - if ( context_length != 0xFFFF && context_length < sr[k].GlyphCount ) - goto next_subrule; - - if ( buffer->in_pos + sr[k].GlyphCount > buffer->in_length ) - goto next_subrule; /* context is too long */ - - for ( i = 1, j = buffer->in_pos + 1; i < sr[k].GlyphCount; i++, j++ ) - { - while ( CHECK_Property( gdef, IN_ITEM( j ), flags, &property ) ) - { - if ( error && error != HB_Err_Not_Covered ) - return error; - - if ( j + sr[k].GlyphCount - i == (HB_Int)buffer->in_length ) - goto next_subrule; - j++; - } - - if ( IN_GLYPH( j ) != sr[k].Input[i - 1] ) - goto next_subrule; - } - - return Do_ContextSubst( gsub, sr[k].GlyphCount, - sr[k].SubstCount, sr[k].SubstLookupRecord, - buffer, - nesting_level ); - next_subrule: - ; - } - - return HB_Err_Not_Covered; -} - - -static HB_Error Lookup_ContextSubst2( HB_GSUBHeader* gsub, - HB_ContextSubstFormat2* csf2, - HB_Buffer buffer, - HB_UShort flags, - HB_UShort context_length, - int nesting_level ) -{ - HB_UShort index, property; - HB_Error error; - HB_UShort i, j, k, known_classes; - - HB_UShort* classes; - HB_UShort* cl; - - HB_SubClassSet* scs; - HB_SubClassRule* sr; - HB_GDEFHeader* gdef; - - - gdef = gsub->gdef; - - if ( CHECK_Property( gdef, IN_CURITEM(), flags, &property ) ) - return error; - - /* Note: The coverage table in format 2 doesn't give an index into - anything. It just lets us know whether or not we need to - do any lookup at all. */ - - error = _HB_OPEN_Coverage_Index( &csf2->Coverage, IN_CURGLYPH(), &index ); - if ( error ) - return error; - - if (csf2->MaxContextLength < 1) - return HB_Err_Not_Covered; - - if ( ALLOC_ARRAY( classes, csf2->MaxContextLength, HB_UShort ) ) - return error; - - error = _HB_OPEN_Get_Class( &csf2->ClassDef, IN_CURGLYPH(), - &classes[0], NULL ); - if ( error && error != HB_Err_Not_Covered ) - goto End; - known_classes = 0; - - scs = &csf2->SubClassSet[classes[0]]; - if ( !scs ) - { - error = ERR(HB_Err_Invalid_SubTable); - goto End; - } - - for ( k = 0; k < scs->SubClassRuleCount; k++ ) - { - sr = &scs->SubClassRule[k]; - - if ( context_length != 0xFFFF && context_length < sr->GlyphCount ) - goto next_subclassrule; - - if ( buffer->in_pos + sr->GlyphCount > buffer->in_length ) - goto next_subclassrule; /* context is too long */ - - cl = sr->Class; - - /* Start at 1 because [0] is implied */ - - for ( i = 1, j = buffer->in_pos + 1; i < sr->GlyphCount; i++, j++ ) - { - while ( CHECK_Property( gdef, IN_ITEM( j ), flags, &property ) ) - { - if ( error && error != HB_Err_Not_Covered ) - goto End; - - if ( j + sr->GlyphCount - i < (HB_Int)buffer->in_length ) - goto next_subclassrule; - j++; - } - - if ( i > known_classes ) - { - /* Keeps us from having to do this for each rule */ - - error = _HB_OPEN_Get_Class( &csf2->ClassDef, IN_GLYPH( j ), &classes[i], NULL ); - if ( error && error != HB_Err_Not_Covered ) - goto End; - known_classes = i; - } - - if ( cl[i - 1] != classes[i] ) - goto next_subclassrule; - } - - error = Do_ContextSubst( gsub, sr->GlyphCount, - sr->SubstCount, sr->SubstLookupRecord, - buffer, - nesting_level ); - goto End; - - next_subclassrule: - ; - } - - error = HB_Err_Not_Covered; - -End: - FREE( classes ); - return error; -} - - -static HB_Error Lookup_ContextSubst3( HB_GSUBHeader* gsub, - HB_ContextSubstFormat3* csf3, - HB_Buffer buffer, - HB_UShort flags, - HB_UShort context_length, - int nesting_level ) -{ - HB_Error error; - HB_UShort index, i, j, property; - - HB_Coverage* c; - HB_GDEFHeader* gdef; - - - gdef = gsub->gdef; - - if ( CHECK_Property( gdef, IN_CURITEM(), flags, &property ) ) - return error; - - if ( context_length != 0xFFFF && context_length < csf3->GlyphCount ) - return HB_Err_Not_Covered; - - if ( buffer->in_pos + csf3->GlyphCount > buffer->in_length ) - return HB_Err_Not_Covered; /* context is too long */ - - c = csf3->Coverage; - - for ( i = 1, j = buffer->in_pos + 1; i < csf3->GlyphCount; i++, j++ ) - { - while ( CHECK_Property( gdef, IN_ITEM( j ), flags, &property ) ) - { - if ( error && error != HB_Err_Not_Covered ) - return error; - - if ( j + csf3->GlyphCount - i == (HB_Int)buffer->in_length ) - return HB_Err_Not_Covered; - j++; - } - - error = _HB_OPEN_Coverage_Index( &c[i], IN_GLYPH( j ), &index ); - if ( error ) - return error; - } - - return Do_ContextSubst( gsub, csf3->GlyphCount, - csf3->SubstCount, csf3->SubstLookupRecord, - buffer, - nesting_level ); -} - - -static HB_Error Lookup_ContextSubst( HB_GSUBHeader* gsub, - HB_GSUB_SubTable* st, - HB_Buffer buffer, - HB_UShort flags, - HB_UShort context_length, - int nesting_level ) -{ - HB_ContextSubst* cs = &st->context; - - switch ( cs->SubstFormat ) - { - case 1: return Lookup_ContextSubst1( gsub, &cs->csf.csf1, buffer, flags, context_length, nesting_level ); - case 2: return Lookup_ContextSubst2( gsub, &cs->csf.csf2, buffer, flags, context_length, nesting_level ); - case 3: return Lookup_ContextSubst3( gsub, &cs->csf.csf3, buffer, flags, context_length, nesting_level ); - default: return ERR(HB_Err_Invalid_SubTable_Format); - } - - return HB_Err_Ok; /* never reached */ -} - - -/* LookupType 6 */ - -/* ChainSubRule */ - -static HB_Error Load_ChainSubRule( HB_ChainSubRule* csr, - HB_Stream stream ) -{ - HB_Error error; - - HB_UShort n, count; - HB_UShort* b; - HB_UShort* i; - HB_UShort* l; - - HB_SubstLookupRecord* slr; - - - if ( ACCESS_Frame( 2L ) ) - return error; - - csr->BacktrackGlyphCount = GET_UShort(); - - FORGET_Frame(); - - csr->Backtrack = NULL; - - count = csr->BacktrackGlyphCount; - - if ( ALLOC_ARRAY( csr->Backtrack, count, HB_UShort ) ) - return error; - - b = csr->Backtrack; - - if ( ACCESS_Frame( count * 2L ) ) - goto Fail4; - - for ( n = 0; n < count; n++ ) - b[n] = GET_UShort(); - - FORGET_Frame(); - - if ( ACCESS_Frame( 2L ) ) - goto Fail4; - - csr->InputGlyphCount = GET_UShort(); - - FORGET_Frame(); - - csr->Input = NULL; - - count = csr->InputGlyphCount - 1; /* only InputGlyphCount - 1 elements */ - - if ( ALLOC_ARRAY( csr->Input, count, HB_UShort ) ) - goto Fail4; - - i = csr->Input; - - if ( ACCESS_Frame( count * 2L ) ) - goto Fail3; - - for ( n = 0; n < count; n++ ) - i[n] = GET_UShort(); - - FORGET_Frame(); - - if ( ACCESS_Frame( 2L ) ) - goto Fail3; - - csr->LookaheadGlyphCount = GET_UShort(); - - FORGET_Frame(); - - csr->Lookahead = NULL; - - count = csr->LookaheadGlyphCount; - - if ( ALLOC_ARRAY( csr->Lookahead, count, HB_UShort ) ) - goto Fail3; - - l = csr->Lookahead; - - if ( ACCESS_Frame( count * 2L ) ) - goto Fail2; - - for ( n = 0; n < count; n++ ) - l[n] = GET_UShort(); - - FORGET_Frame(); - - if ( ACCESS_Frame( 2L ) ) - goto Fail2; - - csr->SubstCount = GET_UShort(); - - FORGET_Frame(); - - csr->SubstLookupRecord = NULL; - - count = csr->SubstCount; - - if ( ALLOC_ARRAY( csr->SubstLookupRecord, count, HB_SubstLookupRecord ) ) - goto Fail2; - - slr = csr->SubstLookupRecord; - - if ( ACCESS_Frame( count * 4L ) ) - goto Fail1; - - for ( n = 0; n < count; n++ ) - { - slr[n].SequenceIndex = GET_UShort(); - slr[n].LookupListIndex = GET_UShort(); - } - - FORGET_Frame(); - - return HB_Err_Ok; - -Fail1: - FREE( slr ); - -Fail2: - FREE( l ); - -Fail3: - FREE( i ); - -Fail4: - FREE( b ); - return error; -} - - -static void Free_ChainSubRule( HB_ChainSubRule* csr ) -{ - FREE( csr->SubstLookupRecord ); - FREE( csr->Lookahead ); - FREE( csr->Input ); - FREE( csr->Backtrack ); -} - - -/* ChainSubRuleSet */ - -static HB_Error Load_ChainSubRuleSet( HB_ChainSubRuleSet* csrs, - HB_Stream stream ) -{ - HB_Error error; - - HB_UShort n = 0, m, count; - HB_UInt cur_offset, new_offset, base_offset; - - HB_ChainSubRule* csr; - - - base_offset = FILE_Pos(); - - if ( ACCESS_Frame( 2L ) ) - return error; - - count = csrs->ChainSubRuleCount = GET_UShort(); - - FORGET_Frame(); - - csrs->ChainSubRule = NULL; - - if ( ALLOC_ARRAY( csrs->ChainSubRule, count, HB_ChainSubRule ) ) - return error; - - csr = csrs->ChainSubRule; - - for ( n = 0; n < count; n++ ) - { - if ( ACCESS_Frame( 2L ) ) - goto Fail; - - new_offset = GET_UShort() + base_offset; - - FORGET_Frame(); - - cur_offset = FILE_Pos(); - if ( FILE_Seek( new_offset ) || - ( error = Load_ChainSubRule( &csr[n], stream ) ) != HB_Err_Ok ) - goto Fail; - (void)FILE_Seek( cur_offset ); - } - - return HB_Err_Ok; - -Fail: - for ( m = 0; m < n; m++ ) - Free_ChainSubRule( &csr[m] ); - - FREE( csr ); - return error; -} - - -static void Free_ChainSubRuleSet( HB_ChainSubRuleSet* csrs ) -{ - HB_UShort n, count; - - HB_ChainSubRule* csr; - - - if ( csrs->ChainSubRule ) - { - count = csrs->ChainSubRuleCount; - csr = csrs->ChainSubRule; - - for ( n = 0; n < count; n++ ) - Free_ChainSubRule( &csr[n] ); - - FREE( csr ); - } -} - - -/* ChainContextSubstFormat1 */ - -static HB_Error Load_ChainContextSubst1( - HB_ChainContextSubstFormat1* ccsf1, - HB_Stream stream ) -{ - HB_Error error; - - HB_UShort n = 0, m, count; - HB_UInt cur_offset, new_offset, base_offset; - - HB_ChainSubRuleSet* csrs; - - - base_offset = FILE_Pos() - 2L; - - if ( ACCESS_Frame( 2L ) ) - return error; - - new_offset = GET_UShort() + base_offset; - - FORGET_Frame(); - - cur_offset = FILE_Pos(); - if ( FILE_Seek( new_offset ) || - ( error = _HB_OPEN_Load_Coverage( &ccsf1->Coverage, stream ) ) != HB_Err_Ok ) - return error; - (void)FILE_Seek( cur_offset ); - - if ( ACCESS_Frame( 2L ) ) - goto Fail2; - - count = ccsf1->ChainSubRuleSetCount = GET_UShort(); - - FORGET_Frame(); - - ccsf1->ChainSubRuleSet = NULL; - - if ( ALLOC_ARRAY( ccsf1->ChainSubRuleSet, count, HB_ChainSubRuleSet ) ) - goto Fail2; - - csrs = ccsf1->ChainSubRuleSet; - - for ( n = 0; n < count; n++ ) - { - if ( ACCESS_Frame( 2L ) ) - goto Fail1; - - new_offset = GET_UShort() + base_offset; - - FORGET_Frame(); - - cur_offset = FILE_Pos(); - if ( FILE_Seek( new_offset ) || - ( error = Load_ChainSubRuleSet( &csrs[n], stream ) ) != HB_Err_Ok ) - goto Fail1; - (void)FILE_Seek( cur_offset ); - } - - return HB_Err_Ok; - -Fail1: - for ( m = 0; m < n; m++ ) - Free_ChainSubRuleSet( &csrs[m] ); - - FREE( csrs ); - -Fail2: - _HB_OPEN_Free_Coverage( &ccsf1->Coverage ); - return error; -} - - -static void Free_ChainContextSubst1( HB_ChainContextSubstFormat1* ccsf1 ) -{ - HB_UShort n, count; - - HB_ChainSubRuleSet* csrs; - - - if ( ccsf1->ChainSubRuleSet ) - { - count = ccsf1->ChainSubRuleSetCount; - csrs = ccsf1->ChainSubRuleSet; - - for ( n = 0; n < count; n++ ) - Free_ChainSubRuleSet( &csrs[n] ); - - FREE( csrs ); - } - - _HB_OPEN_Free_Coverage( &ccsf1->Coverage ); -} - - -/* ChainSubClassRule */ - -static HB_Error Load_ChainSubClassRule( - HB_ChainContextSubstFormat2* ccsf2, - HB_ChainSubClassRule* cscr, - HB_Stream stream ) -{ - HB_Error error; - - HB_UShort n, count; - - HB_UShort* b; - HB_UShort* i; - HB_UShort* l; - HB_SubstLookupRecord* slr; - - - if ( ACCESS_Frame( 2L ) ) - return error; - - cscr->BacktrackGlyphCount = GET_UShort(); - - FORGET_Frame(); - - if ( cscr->BacktrackGlyphCount > ccsf2->MaxBacktrackLength ) - ccsf2->MaxBacktrackLength = cscr->BacktrackGlyphCount; - - cscr->Backtrack = NULL; - - count = cscr->BacktrackGlyphCount; - - if ( ALLOC_ARRAY( cscr->Backtrack, count, HB_UShort ) ) - return error; - - b = cscr->Backtrack; - - if ( ACCESS_Frame( count * 2L ) ) - goto Fail4; - - for ( n = 0; n < count; n++ ) - b[n] = GET_UShort(); - - FORGET_Frame(); - - if ( ACCESS_Frame( 2L ) ) - goto Fail4; - - cscr->InputGlyphCount = GET_UShort(); - - FORGET_Frame(); - - if ( cscr->InputGlyphCount > ccsf2->MaxInputLength ) - ccsf2->MaxInputLength = cscr->InputGlyphCount; - - cscr->Input = NULL; - - count = cscr->InputGlyphCount - 1; /* only InputGlyphCount - 1 elements */ - - if ( ALLOC_ARRAY( cscr->Input, count, HB_UShort ) ) - goto Fail4; - - i = cscr->Input; - - if ( ACCESS_Frame( count * 2L ) ) - goto Fail3; - - for ( n = 0; n < count; n++ ) - i[n] = GET_UShort(); - - FORGET_Frame(); - - if ( ACCESS_Frame( 2L ) ) - goto Fail3; - - cscr->LookaheadGlyphCount = GET_UShort(); - - FORGET_Frame(); - - if ( cscr->LookaheadGlyphCount > ccsf2->MaxLookaheadLength ) - ccsf2->MaxLookaheadLength = cscr->LookaheadGlyphCount; - - cscr->Lookahead = NULL; - - count = cscr->LookaheadGlyphCount; - - if ( ALLOC_ARRAY( cscr->Lookahead, count, HB_UShort ) ) - goto Fail3; - - l = cscr->Lookahead; - - if ( ACCESS_Frame( count * 2L ) ) - goto Fail2; - - for ( n = 0; n < count; n++ ) - l[n] = GET_UShort(); - - FORGET_Frame(); - - if ( ACCESS_Frame( 2L ) ) - goto Fail2; - - cscr->SubstCount = GET_UShort(); - - FORGET_Frame(); - - cscr->SubstLookupRecord = NULL; - - count = cscr->SubstCount; - - if ( ALLOC_ARRAY( cscr->SubstLookupRecord, count, - HB_SubstLookupRecord ) ) - goto Fail2; - - slr = cscr->SubstLookupRecord; - - if ( ACCESS_Frame( count * 4L ) ) - goto Fail1; - - for ( n = 0; n < count; n++ ) - { - slr[n].SequenceIndex = GET_UShort(); - slr[n].LookupListIndex = GET_UShort(); - } - - FORGET_Frame(); - - return HB_Err_Ok; - -Fail1: - FREE( slr ); - -Fail2: - FREE( l ); - -Fail3: - FREE( i ); - -Fail4: - FREE( b ); - return error; -} - - -static void Free_ChainSubClassRule( HB_ChainSubClassRule* cscr ) -{ - FREE( cscr->SubstLookupRecord ); - FREE( cscr->Lookahead ); - FREE( cscr->Input ); - FREE( cscr->Backtrack ); -} - - -/* SubClassSet */ - -static HB_Error Load_ChainSubClassSet( - HB_ChainContextSubstFormat2* ccsf2, - HB_ChainSubClassSet* cscs, - HB_Stream stream ) -{ - HB_Error error; - - HB_UShort n = 0, m, count; - HB_UInt cur_offset, new_offset, base_offset; - - HB_ChainSubClassRule* cscr; - - - base_offset = FILE_Pos(); - - if ( ACCESS_Frame( 2L ) ) - return error; - - count = cscs->ChainSubClassRuleCount = GET_UShort(); - - FORGET_Frame(); - - cscs->ChainSubClassRule = NULL; - - if ( ALLOC_ARRAY( cscs->ChainSubClassRule, count, - HB_ChainSubClassRule ) ) - return error; - - cscr = cscs->ChainSubClassRule; - - for ( n = 0; n < count; n++ ) - { - if ( ACCESS_Frame( 2L ) ) - goto Fail; - - new_offset = GET_UShort() + base_offset; - - FORGET_Frame(); - - cur_offset = FILE_Pos(); - if ( FILE_Seek( new_offset ) || - ( error = Load_ChainSubClassRule( ccsf2, &cscr[n], - stream ) ) != HB_Err_Ok ) - goto Fail; - (void)FILE_Seek( cur_offset ); - } - - return HB_Err_Ok; - -Fail: - for ( m = 0; m < n; m++ ) - Free_ChainSubClassRule( &cscr[m] ); - - FREE( cscr ); - return error; -} - - -static void Free_ChainSubClassSet( HB_ChainSubClassSet* cscs ) -{ - HB_UShort n, count; - - HB_ChainSubClassRule* cscr; - - - if ( cscs->ChainSubClassRule ) - { - count = cscs->ChainSubClassRuleCount; - cscr = cscs->ChainSubClassRule; - - for ( n = 0; n < count; n++ ) - Free_ChainSubClassRule( &cscr[n] ); - - FREE( cscr ); - } -} - - -/* ChainContextSubstFormat2 */ - -static HB_Error Load_ChainContextSubst2( - HB_ChainContextSubstFormat2* ccsf2, - HB_Stream stream ) -{ - HB_Error error; - - HB_UShort n = 0, m, count; - HB_UInt cur_offset, new_offset, base_offset; - HB_UInt backtrack_offset, input_offset, lookahead_offset; - - HB_ChainSubClassSet* cscs; - - - base_offset = FILE_Pos() - 2; - - if ( ACCESS_Frame( 2L ) ) - return error; - - new_offset = GET_UShort() + base_offset; - - FORGET_Frame(); - - cur_offset = FILE_Pos(); - if ( FILE_Seek( new_offset ) || - ( error = _HB_OPEN_Load_Coverage( &ccsf2->Coverage, stream ) ) != HB_Err_Ok ) - return error; - (void)FILE_Seek( cur_offset ); - - if ( ACCESS_Frame( 8L ) ) - goto Fail5; - - backtrack_offset = GET_UShort(); - input_offset = GET_UShort(); - lookahead_offset = GET_UShort(); - - /* `ChainSubClassSetCount' is the upper limit for input class values, - thus we read it now to make an additional safety check. No limit - is known or needed for the other two class definitions */ - - count = ccsf2->ChainSubClassSetCount = GET_UShort(); - - FORGET_Frame(); - - if ( ( error = _HB_OPEN_Load_EmptyOrClassDefinition( &ccsf2->BacktrackClassDef, 65535, - backtrack_offset, base_offset, - stream ) ) != HB_Err_Ok ) - goto Fail5; - - if ( ( error = _HB_OPEN_Load_EmptyOrClassDefinition( &ccsf2->InputClassDef, count, - input_offset, base_offset, - stream ) ) != HB_Err_Ok ) - goto Fail4; - if ( ( error = _HB_OPEN_Load_EmptyOrClassDefinition( &ccsf2->LookaheadClassDef, 65535, - lookahead_offset, base_offset, - stream ) ) != HB_Err_Ok ) - goto Fail3; - - ccsf2->ChainSubClassSet = NULL; - ccsf2->MaxBacktrackLength = 0; - ccsf2->MaxInputLength = 0; - ccsf2->MaxLookaheadLength = 0; - - if ( ALLOC_ARRAY( ccsf2->ChainSubClassSet, count, HB_ChainSubClassSet ) ) - goto Fail2; - - cscs = ccsf2->ChainSubClassSet; - - for ( n = 0; n < count; n++ ) - { - if ( ACCESS_Frame( 2L ) ) - goto Fail1; - - new_offset = GET_UShort() + base_offset; - - FORGET_Frame(); - - if ( new_offset != base_offset ) /* not a NULL offset */ - { - cur_offset = FILE_Pos(); - if ( FILE_Seek( new_offset ) || - ( error = Load_ChainSubClassSet( ccsf2, &cscs[n], - stream ) ) != HB_Err_Ok ) - goto Fail1; - (void)FILE_Seek( cur_offset ); - } - else - { - /* we create a ChainSubClassSet table with no entries */ - - ccsf2->ChainSubClassSet[n].ChainSubClassRuleCount = 0; - ccsf2->ChainSubClassSet[n].ChainSubClassRule = NULL; - } - } - - return HB_Err_Ok; - -Fail1: - for ( m = 0; m < n; m++ ) - Free_ChainSubClassSet( &cscs[m] ); - - FREE( cscs ); - -Fail2: - _HB_OPEN_Free_ClassDefinition( &ccsf2->LookaheadClassDef ); - -Fail3: - _HB_OPEN_Free_ClassDefinition( &ccsf2->InputClassDef ); - -Fail4: - _HB_OPEN_Free_ClassDefinition( &ccsf2->BacktrackClassDef ); - -Fail5: - _HB_OPEN_Free_Coverage( &ccsf2->Coverage ); - return error; -} - - -static void Free_ChainContextSubst2( HB_ChainContextSubstFormat2* ccsf2 ) -{ - HB_UShort n, count; - - HB_ChainSubClassSet* cscs; - - - if ( ccsf2->ChainSubClassSet ) - { - count = ccsf2->ChainSubClassSetCount; - cscs = ccsf2->ChainSubClassSet; - - for ( n = 0; n < count; n++ ) - Free_ChainSubClassSet( &cscs[n] ); - - FREE( cscs ); - } - - _HB_OPEN_Free_ClassDefinition( &ccsf2->LookaheadClassDef ); - _HB_OPEN_Free_ClassDefinition( &ccsf2->InputClassDef ); - _HB_OPEN_Free_ClassDefinition( &ccsf2->BacktrackClassDef ); - - _HB_OPEN_Free_Coverage( &ccsf2->Coverage ); -} - - -/* ChainContextSubstFormat3 */ - -static HB_Error Load_ChainContextSubst3( - HB_ChainContextSubstFormat3* ccsf3, - HB_Stream stream ) -{ - HB_Error error; - - HB_UShort n, nb = 0, ni =0, nl = 0, m, count; - HB_UShort backtrack_count, input_count, lookahead_count; - HB_UInt cur_offset, new_offset, base_offset; - - HB_Coverage* b; - HB_Coverage* i; - HB_Coverage* l; - HB_SubstLookupRecord* slr; - - - base_offset = FILE_Pos() - 2L; - - if ( ACCESS_Frame( 2L ) ) - return error; - - ccsf3->BacktrackGlyphCount = GET_UShort(); - - FORGET_Frame(); - - ccsf3->BacktrackCoverage = NULL; - - backtrack_count = ccsf3->BacktrackGlyphCount; - - if ( ALLOC_ARRAY( ccsf3->BacktrackCoverage, backtrack_count, - HB_Coverage ) ) - return error; - - b = ccsf3->BacktrackCoverage; - - for ( nb = 0; nb < backtrack_count; nb++ ) - { - if ( ACCESS_Frame( 2L ) ) - goto Fail4; - - new_offset = GET_UShort() + base_offset; - - FORGET_Frame(); - - cur_offset = FILE_Pos(); - if ( FILE_Seek( new_offset ) || - ( error = _HB_OPEN_Load_Coverage( &b[nb], stream ) ) != HB_Err_Ok ) - goto Fail4; - (void)FILE_Seek( cur_offset ); - } - - if ( ACCESS_Frame( 2L ) ) - goto Fail4; - - ccsf3->InputGlyphCount = GET_UShort(); - - FORGET_Frame(); - - ccsf3->InputCoverage = NULL; - - input_count = ccsf3->InputGlyphCount; - - if ( ALLOC_ARRAY( ccsf3->InputCoverage, input_count, HB_Coverage ) ) - goto Fail4; - - i = ccsf3->InputCoverage; - - for ( ni = 0; ni < input_count; ni++ ) - { - if ( ACCESS_Frame( 2L ) ) - goto Fail3; - - new_offset = GET_UShort() + base_offset; - - FORGET_Frame(); - - cur_offset = FILE_Pos(); - if ( FILE_Seek( new_offset ) || - ( error = _HB_OPEN_Load_Coverage( &i[ni], stream ) ) != HB_Err_Ok ) - goto Fail3; - (void)FILE_Seek( cur_offset ); - } - - if ( ACCESS_Frame( 2L ) ) - goto Fail3; - - ccsf3->LookaheadGlyphCount = GET_UShort(); - - FORGET_Frame(); - - ccsf3->LookaheadCoverage = NULL; - - lookahead_count = ccsf3->LookaheadGlyphCount; - - if ( ALLOC_ARRAY( ccsf3->LookaheadCoverage, lookahead_count, - HB_Coverage ) ) - goto Fail3; - - l = ccsf3->LookaheadCoverage; - - for ( nl = 0; nl < lookahead_count; nl++ ) - { - if ( ACCESS_Frame( 2L ) ) - goto Fail2; - - new_offset = GET_UShort() + base_offset; - - FORGET_Frame(); - - cur_offset = FILE_Pos(); - if ( FILE_Seek( new_offset ) || - ( error = _HB_OPEN_Load_Coverage( &l[nl], stream ) ) != HB_Err_Ok ) - goto Fail2; - (void)FILE_Seek( cur_offset ); - } - - if ( ACCESS_Frame( 2L ) ) - goto Fail2; - - ccsf3->SubstCount = GET_UShort(); - - FORGET_Frame(); - - ccsf3->SubstLookupRecord = NULL; - - count = ccsf3->SubstCount; - - if ( ALLOC_ARRAY( ccsf3->SubstLookupRecord, count, - HB_SubstLookupRecord ) ) - goto Fail2; - - slr = ccsf3->SubstLookupRecord; - - if ( ACCESS_Frame( count * 4L ) ) - goto Fail1; - - for ( n = 0; n < count; n++ ) - { - slr[n].SequenceIndex = GET_UShort(); - slr[n].LookupListIndex = GET_UShort(); - } - - FORGET_Frame(); - - return HB_Err_Ok; - -Fail1: - FREE( slr ); - -Fail2: - for ( m = 0; m < nl; m++ ) - _HB_OPEN_Free_Coverage( &l[m] ); - - FREE( l ); - -Fail3: - for ( m = 0; m < ni; m++ ) - _HB_OPEN_Free_Coverage( &i[m] ); - - FREE( i ); - -Fail4: - for ( m = 0; m < nb; m++ ) - _HB_OPEN_Free_Coverage( &b[m] ); - - FREE( b ); - return error; -} - - -static void Free_ChainContextSubst3( HB_ChainContextSubstFormat3* ccsf3 ) -{ - HB_UShort n, count; - - HB_Coverage* c; - - - FREE( ccsf3->SubstLookupRecord ); - - if ( ccsf3->LookaheadCoverage ) - { - count = ccsf3->LookaheadGlyphCount; - c = ccsf3->LookaheadCoverage; - - for ( n = 0; n < count; n++ ) - _HB_OPEN_Free_Coverage( &c[n] ); - - FREE( c ); - } - - if ( ccsf3->InputCoverage ) - { - count = ccsf3->InputGlyphCount; - c = ccsf3->InputCoverage; - - for ( n = 0; n < count; n++ ) - _HB_OPEN_Free_Coverage( &c[n] ); - - FREE( c ); - } - - if ( ccsf3->BacktrackCoverage ) - { - count = ccsf3->BacktrackGlyphCount; - c = ccsf3->BacktrackCoverage; - - for ( n = 0; n < count; n++ ) - _HB_OPEN_Free_Coverage( &c[n] ); - - FREE( c ); - } -} - - -/* ChainContextSubst */ - -static HB_Error Load_ChainContextSubst( HB_GSUB_SubTable* st, - HB_Stream stream ) -{ - HB_Error error; - HB_ChainContextSubst* ccs = &st->chain; - - if ( ACCESS_Frame( 2L ) ) - return error; - - ccs->SubstFormat = GET_UShort(); - - FORGET_Frame(); - - switch ( ccs->SubstFormat ) { - case 1: return Load_ChainContextSubst1( &ccs->ccsf.ccsf1, stream ); - case 2: return Load_ChainContextSubst2( &ccs->ccsf.ccsf2, stream ); - case 3: return Load_ChainContextSubst3( &ccs->ccsf.ccsf3, stream ); - default: return ERR(HB_Err_Invalid_SubTable_Format); - } - - return HB_Err_Ok; /* never reached */ -} - - -static void Free_ChainContextSubst( HB_GSUB_SubTable* st ) -{ - HB_ChainContextSubst* ccs = &st->chain; - - switch ( ccs->SubstFormat ) { - case 1: Free_ChainContextSubst1( &ccs->ccsf.ccsf1 ); break; - case 2: Free_ChainContextSubst2( &ccs->ccsf.ccsf2 ); break; - case 3: Free_ChainContextSubst3( &ccs->ccsf.ccsf3 ); break; - default: break; - } -} - - -static HB_Error Lookup_ChainContextSubst1( HB_GSUBHeader* gsub, - HB_ChainContextSubstFormat1* ccsf1, - HB_Buffer buffer, - HB_UShort flags, - HB_UShort context_length, - int nesting_level ) -{ - HB_UShort index, property; - HB_UShort i, j, k, num_csr; - HB_UShort bgc, igc, lgc; - HB_Error error; - - HB_ChainSubRule* csr; - HB_ChainSubRule curr_csr; - HB_GDEFHeader* gdef; - - - gdef = gsub->gdef; - - if ( CHECK_Property( gdef, IN_CURITEM(), flags, &property ) ) - return error; - - error = _HB_OPEN_Coverage_Index( &ccsf1->Coverage, IN_CURGLYPH(), &index ); - if ( error ) - return error; - - csr = ccsf1->ChainSubRuleSet[index].ChainSubRule; - num_csr = ccsf1->ChainSubRuleSet[index].ChainSubRuleCount; - - for ( k = 0; k < num_csr; k++ ) - { - curr_csr = csr[k]; - bgc = curr_csr.BacktrackGlyphCount; - igc = curr_csr.InputGlyphCount; - lgc = curr_csr.LookaheadGlyphCount; - - if ( context_length != 0xFFFF && context_length < igc ) - goto next_chainsubrule; - - /* check whether context is too long; it is a first guess only */ - - if ( bgc > buffer->out_pos || buffer->in_pos + igc + lgc > buffer->in_length ) - goto next_chainsubrule; - - if ( bgc ) - { - /* since we don't know in advance the number of glyphs to inspect, - we search backwards for matches in the backtrack glyph array */ - - for ( i = 0, j = buffer->out_pos - 1; i < bgc; i++, j-- ) - { - while ( CHECK_Property( gdef, OUT_ITEM( j ), flags, &property ) ) - { - if ( error && error != HB_Err_Not_Covered ) - return error; - - if ( j + 1 == bgc - i ) - goto next_chainsubrule; - j--; - } - - /* In OpenType 1.3, it is undefined whether the offsets of - backtrack glyphs is in logical order or not. Version 1.4 - will clarify this: - - Logical order - a b c d e f g h i j - i - Input offsets - 0 1 - Backtrack offsets - 3 2 1 0 - Lookahead offsets - 0 1 2 3 */ - - if ( OUT_GLYPH( j ) != curr_csr.Backtrack[i] ) - goto next_chainsubrule; - } - } - - /* Start at 1 because [0] is implied */ - - for ( i = 1, j = buffer->in_pos + 1; i < igc; i++, j++ ) - { - while ( CHECK_Property( gdef, IN_ITEM( j ), flags, &property ) ) - { - if ( error && error != HB_Err_Not_Covered ) - return error; - - if ( j + igc - i + lgc == (HB_Int)buffer->in_length ) - goto next_chainsubrule; - j++; - } - - if ( IN_GLYPH( j ) != curr_csr.Input[i - 1] ) - goto next_chainsubrule; - } - - /* we are starting to check for lookahead glyphs right after the - last context glyph */ - - for ( i = 0; i < lgc; i++, j++ ) - { - while ( CHECK_Property( gdef, IN_ITEM( j ), flags, &property ) ) - { - if ( error && error != HB_Err_Not_Covered ) - return error; - - if ( j + lgc - i == (HB_Int)buffer->in_length ) - goto next_chainsubrule; - j++; - } - - if ( IN_GLYPH( j ) != curr_csr.Lookahead[i] ) - goto next_chainsubrule; - } - - return Do_ContextSubst( gsub, igc, - curr_csr.SubstCount, - curr_csr.SubstLookupRecord, - buffer, - nesting_level ); - - next_chainsubrule: - ; - } - - return HB_Err_Not_Covered; -} - - -static HB_Error Lookup_ChainContextSubst2( HB_GSUBHeader* gsub, - HB_ChainContextSubstFormat2* ccsf2, - HB_Buffer buffer, - HB_UShort flags, - HB_UShort context_length, - int nesting_level ) -{ - HB_UShort index, property; - HB_Error error; - HB_UShort i, j, k; - HB_UShort bgc, igc, lgc; - HB_UShort known_backtrack_classes, - known_input_classes, - known_lookahead_classes; - - HB_UShort* backtrack_classes; - HB_UShort* input_classes; - HB_UShort* lookahead_classes; - - HB_UShort* bc; - HB_UShort* ic; - HB_UShort* lc; - - HB_ChainSubClassSet* cscs; - HB_ChainSubClassRule ccsr; - HB_GDEFHeader* gdef; - - - gdef = gsub->gdef; - - if ( CHECK_Property( gdef, IN_CURITEM(), flags, &property ) ) - return error; - - /* Note: The coverage table in format 2 doesn't give an index into - anything. It just lets us know whether or not we need to - do any lookup at all. */ - - error = _HB_OPEN_Coverage_Index( &ccsf2->Coverage, IN_CURGLYPH(), &index ); - if ( error ) - return error; - - if ( ALLOC_ARRAY( backtrack_classes, ccsf2->MaxBacktrackLength, HB_UShort ) ) - return error; - known_backtrack_classes = 0; - - if (ccsf2->MaxInputLength < 1) - return HB_Err_Not_Covered; - - if ( ALLOC_ARRAY( input_classes, ccsf2->MaxInputLength, HB_UShort ) ) - goto End3; - known_input_classes = 1; - - if ( ALLOC_ARRAY( lookahead_classes, ccsf2->MaxLookaheadLength, HB_UShort ) ) - goto End2; - known_lookahead_classes = 0; - - error = _HB_OPEN_Get_Class( &ccsf2->InputClassDef, IN_CURGLYPH(), - &input_classes[0], NULL ); - if ( error && error != HB_Err_Not_Covered ) - goto End1; - - cscs = &ccsf2->ChainSubClassSet[input_classes[0]]; - if ( !cscs ) - { - error = ERR(HB_Err_Invalid_SubTable); - goto End1; - } - - for ( k = 0; k < cscs->ChainSubClassRuleCount; k++ ) - { - ccsr = cscs->ChainSubClassRule[k]; - bgc = ccsr.BacktrackGlyphCount; - igc = ccsr.InputGlyphCount; - lgc = ccsr.LookaheadGlyphCount; - - if ( context_length != 0xFFFF && context_length < igc ) - goto next_chainsubclassrule; - - /* check whether context is too long; it is a first guess only */ - - if ( bgc > buffer->out_pos || buffer->in_pos + igc + lgc > buffer->in_length ) - goto next_chainsubclassrule; - - if ( bgc ) - { - /* Since we don't know in advance the number of glyphs to inspect, - we search backwards for matches in the backtrack glyph array. - Note that `known_backtrack_classes' starts at index 0. */ - - bc = ccsr.Backtrack; - - for ( i = 0, j = buffer->out_pos - 1; i < bgc; i++, j-- ) - { - while ( CHECK_Property( gdef, OUT_ITEM( j ), flags, &property ) ) - { - if ( error && error != HB_Err_Not_Covered ) - goto End1; - - if ( j + 1 == bgc - i ) - goto next_chainsubclassrule; - j--; - } - - if ( i >= known_backtrack_classes ) - { - /* Keeps us from having to do this for each rule */ - - error = _HB_OPEN_Get_Class( &ccsf2->BacktrackClassDef, OUT_GLYPH( j ), - &backtrack_classes[i], NULL ); - if ( error && error != HB_Err_Not_Covered ) - goto End1; - known_backtrack_classes = i; - } - - if ( bc[i] != backtrack_classes[i] ) - goto next_chainsubclassrule; - } - } - - ic = ccsr.Input; - - /* Start at 1 because [0] is implied */ - - for ( i = 1, j = buffer->in_pos + 1; i < igc; i++, j++ ) - { - while ( CHECK_Property( gdef, IN_ITEM( j ), flags, &property ) ) - { - if ( error && error != HB_Err_Not_Covered ) - goto End1; - - if ( j + igc - i + lgc == (HB_Int)buffer->in_length ) - goto next_chainsubclassrule; - j++; - } - - if ( i >= known_input_classes ) - { - error = _HB_OPEN_Get_Class( &ccsf2->InputClassDef, IN_GLYPH( j ), - &input_classes[i], NULL ); - if ( error && error != HB_Err_Not_Covered ) - goto End1; - known_input_classes = i; - } - - if ( ic[i - 1] != input_classes[i] ) - goto next_chainsubclassrule; - } - - /* we are starting to check for lookahead glyphs right after the - last context glyph */ - - lc = ccsr.Lookahead; - - for ( i = 0; i < lgc; i++, j++ ) - { - while ( CHECK_Property( gdef, IN_ITEM( j ), flags, &property ) ) - { - if ( error && error != HB_Err_Not_Covered ) - goto End1; - - if ( j + lgc - i == (HB_Int)buffer->in_length ) - goto next_chainsubclassrule; - j++; - } - - if ( i >= known_lookahead_classes ) - { - error = _HB_OPEN_Get_Class( &ccsf2->LookaheadClassDef, IN_GLYPH( j ), - &lookahead_classes[i], NULL ); - if ( error && error != HB_Err_Not_Covered ) - goto End1; - known_lookahead_classes = i; - } - - if ( lc[i] != lookahead_classes[i] ) - goto next_chainsubclassrule; - } - - error = Do_ContextSubst( gsub, igc, - ccsr.SubstCount, - ccsr.SubstLookupRecord, - buffer, - nesting_level ); - goto End1; - - next_chainsubclassrule: - ; - } - - error = HB_Err_Not_Covered; - -End1: - FREE( lookahead_classes ); - -End2: - FREE( input_classes ); - -End3: - FREE( backtrack_classes ); - return error; -} - - -static HB_Error Lookup_ChainContextSubst3( HB_GSUBHeader* gsub, - HB_ChainContextSubstFormat3* ccsf3, - HB_Buffer buffer, - HB_UShort flags, - HB_UShort context_length, - int nesting_level ) -{ - HB_UShort index, i, j, property; - HB_UShort bgc, igc, lgc; - HB_Error error; - - HB_Coverage* bc; - HB_Coverage* ic; - HB_Coverage* lc; - HB_GDEFHeader* gdef; - - - gdef = gsub->gdef; - - if ( CHECK_Property( gdef, IN_CURITEM(), flags, &property ) ) - return error; - - bgc = ccsf3->BacktrackGlyphCount; - igc = ccsf3->InputGlyphCount; - lgc = ccsf3->LookaheadGlyphCount; - - if ( context_length != 0xFFFF && context_length < igc ) - return HB_Err_Not_Covered; - - /* check whether context is too long; it is a first guess only */ - - if ( bgc > buffer->out_pos || buffer->in_pos + igc + lgc > buffer->in_length ) - return HB_Err_Not_Covered; - - if ( bgc ) - { - /* Since we don't know in advance the number of glyphs to inspect, - we search backwards for matches in the backtrack glyph array */ - - bc = ccsf3->BacktrackCoverage; - - for ( i = 0, j = buffer->out_pos - 1; i < bgc; i++, j-- ) - { - while ( CHECK_Property( gdef, OUT_ITEM( j ), flags, &property ) ) - { - if ( error && error != HB_Err_Not_Covered ) - return error; - - if ( j + 1 == bgc - i ) - return HB_Err_Not_Covered; - j--; - } - - error = _HB_OPEN_Coverage_Index( &bc[i], OUT_GLYPH( j ), &index ); - if ( error ) - return error; - } - } - - ic = ccsf3->InputCoverage; - - for ( i = 0, j = buffer->in_pos; i < igc; i++, j++ ) - { - /* We already called CHECK_Property for IN_GLYPH( buffer->in_pos ) */ - while ( j > buffer->in_pos && CHECK_Property( gdef, IN_ITEM( j ), flags, &property ) ) - { - if ( error && error != HB_Err_Not_Covered ) - return error; - - if ( j + igc - i + lgc == (HB_Int)buffer->in_length ) - return HB_Err_Not_Covered; - j++; - } - - error = _HB_OPEN_Coverage_Index( &ic[i], IN_GLYPH( j ), &index ); - if ( error ) - return error; - } - - /* we are starting for lookahead glyphs right after the last context - glyph */ - - lc = ccsf3->LookaheadCoverage; - - for ( i = 0; i < lgc; i++, j++ ) - { - while ( CHECK_Property( gdef, IN_ITEM( j ), flags, &property ) ) - { - if ( error && error != HB_Err_Not_Covered ) - return error; - - if ( j + lgc - i == (HB_Int)buffer->in_length ) - return HB_Err_Not_Covered; - j++; - } - - error = _HB_OPEN_Coverage_Index( &lc[i], IN_GLYPH( j ), &index ); - if ( error ) - return error; - } - - return Do_ContextSubst( gsub, igc, - ccsf3->SubstCount, - ccsf3->SubstLookupRecord, - buffer, - nesting_level ); -} - - -static HB_Error Lookup_ChainContextSubst( HB_GSUBHeader* gsub, - HB_GSUB_SubTable* st, - HB_Buffer buffer, - HB_UShort flags, - HB_UShort context_length, - int nesting_level ) -{ - HB_ChainContextSubst* ccs = &st->chain; - - switch ( ccs->SubstFormat ) { - case 1: return Lookup_ChainContextSubst1( gsub, &ccs->ccsf.ccsf1, buffer, flags, context_length, nesting_level ); - case 2: return Lookup_ChainContextSubst2( gsub, &ccs->ccsf.ccsf2, buffer, flags, context_length, nesting_level ); - case 3: return Lookup_ChainContextSubst3( gsub, &ccs->ccsf.ccsf3, buffer, flags, context_length, nesting_level ); - default: return ERR(HB_Err_Invalid_SubTable_Format); - } -} - - -static HB_Error Load_ReverseChainContextSubst( HB_GSUB_SubTable* st, - HB_Stream stream ) -{ - HB_Error error; - HB_ReverseChainContextSubst* rccs = &st->reverse; - - HB_UShort m, count; - - HB_UShort nb = 0, nl = 0, n; - HB_UShort backtrack_count, lookahead_count; - HB_UInt cur_offset, new_offset, base_offset; - - HB_Coverage* b; - HB_Coverage* l; - HB_UShort* sub; - - base_offset = FILE_Pos(); - - if ( ACCESS_Frame( 2L ) ) - return error; - - rccs->SubstFormat = GET_UShort(); - - if ( rccs->SubstFormat != 1 ) - return ERR(HB_Err_Invalid_SubTable_Format); - - FORGET_Frame(); - - if ( ACCESS_Frame( 2L ) ) - return error; - - new_offset = GET_UShort() + base_offset; - - FORGET_Frame(); - - cur_offset = FILE_Pos(); - if ( FILE_Seek( new_offset ) || - ( error = _HB_OPEN_Load_Coverage( &rccs->Coverage, stream ) ) != HB_Err_Ok ) - return error; - (void)FILE_Seek( cur_offset ); - - - if ( ACCESS_Frame( 2L ) ) - goto Fail4; - - rccs->BacktrackGlyphCount = GET_UShort(); - - FORGET_Frame(); - - rccs->BacktrackCoverage = NULL; - - backtrack_count = rccs->BacktrackGlyphCount; - - if ( ALLOC_ARRAY( rccs->BacktrackCoverage, backtrack_count, - HB_Coverage ) ) - goto Fail4; - - b = rccs->BacktrackCoverage; - - for ( nb = 0; nb < backtrack_count; nb++ ) - { - if ( ACCESS_Frame( 2L ) ) - goto Fail3; - - new_offset = GET_UShort() + base_offset; - - FORGET_Frame(); - - cur_offset = FILE_Pos(); - if ( FILE_Seek( new_offset ) || - ( error = _HB_OPEN_Load_Coverage( &b[nb], stream ) ) != HB_Err_Ok ) - goto Fail3; - (void)FILE_Seek( cur_offset ); - } - - - if ( ACCESS_Frame( 2L ) ) - goto Fail3; - - rccs->LookaheadGlyphCount = GET_UShort(); - - FORGET_Frame(); - - rccs->LookaheadCoverage = NULL; - - lookahead_count = rccs->LookaheadGlyphCount; - - if ( ALLOC_ARRAY( rccs->LookaheadCoverage, lookahead_count, - HB_Coverage ) ) - goto Fail3; - - l = rccs->LookaheadCoverage; - - for ( nl = 0; nl < lookahead_count; nl++ ) - { - if ( ACCESS_Frame( 2L ) ) - goto Fail2; - - new_offset = GET_UShort() + base_offset; - - FORGET_Frame(); - - cur_offset = FILE_Pos(); - if ( FILE_Seek( new_offset ) || - ( error = _HB_OPEN_Load_Coverage( &l[nl], stream ) ) != HB_Err_Ok ) - goto Fail2; - (void)FILE_Seek( cur_offset ); - } - - if ( ACCESS_Frame( 2L ) ) - goto Fail2; - - rccs->GlyphCount = GET_UShort(); - - FORGET_Frame(); - - rccs->Substitute = NULL; - - count = rccs->GlyphCount; - - if ( ALLOC_ARRAY( rccs->Substitute, count, - HB_UShort ) ) - goto Fail2; - - sub = rccs->Substitute; - - if ( ACCESS_Frame( count * 2L ) ) - goto Fail1; - - for ( n = 0; n < count; n++ ) - sub[n] = GET_UShort(); - - FORGET_Frame(); - - return HB_Err_Ok; - -Fail1: - FREE( sub ); - -Fail2: - for ( m = 0; m < nl; m++ ) - _HB_OPEN_Free_Coverage( &l[m] ); - - FREE( l ); - -Fail3: - for ( m = 0; m < nb; m++ ) - _HB_OPEN_Free_Coverage( &b[m] ); - - FREE( b ); - -Fail4: - _HB_OPEN_Free_Coverage( &rccs->Coverage ); - return error; -} - - -static void Free_ReverseChainContextSubst( HB_GSUB_SubTable* st ) -{ - HB_UShort n, count; - HB_ReverseChainContextSubst* rccs = &st->reverse; - - HB_Coverage* c; - - _HB_OPEN_Free_Coverage( &rccs->Coverage ); - - if ( rccs->LookaheadCoverage ) - { - count = rccs->LookaheadGlyphCount; - c = rccs->LookaheadCoverage; - - for ( n = 0; n < count; n++ ) - _HB_OPEN_Free_Coverage( &c[n] ); - - FREE( c ); - } - - if ( rccs->BacktrackCoverage ) - { - count = rccs->BacktrackGlyphCount; - c = rccs->BacktrackCoverage; - - for ( n = 0; n < count; n++ ) - _HB_OPEN_Free_Coverage( &c[n] ); - - FREE( c ); - } - - FREE ( rccs->Substitute ); -} - - -static HB_Error Lookup_ReverseChainContextSubst( HB_GSUBHeader* gsub, - HB_GSUB_SubTable* st, - HB_Buffer buffer, - HB_UShort flags, - HB_UShort context_length, - int nesting_level ) -{ - HB_UShort index, input_index, i, j, property; - HB_UShort bgc, lgc; - HB_Error error; - - HB_ReverseChainContextSubst* rccs = &st->reverse; - HB_Coverage* bc; - HB_Coverage* lc; - HB_GDEFHeader* gdef; - - if ( nesting_level != 1 || context_length != 0xFFFF ) - return HB_Err_Not_Covered; - - gdef = gsub->gdef; - - if ( CHECK_Property( gdef, IN_CURITEM(), flags, &property ) ) - return error; - - bgc = rccs->BacktrackGlyphCount; - lgc = rccs->LookaheadGlyphCount; - - /* check whether context is too long; it is a first guess only */ - - if ( bgc > buffer->in_pos || buffer->in_pos + 1 + lgc > buffer->in_length ) - return HB_Err_Not_Covered; - - if ( bgc ) - { - /* Since we don't know in advance the number of glyphs to inspect, - we search backwards for matches in the backtrack glyph array */ - - bc = rccs->BacktrackCoverage; - - for ( i = 0, j = buffer->in_pos - 1; i < bgc; i++, j-- ) - { - while ( CHECK_Property( gdef, IN_ITEM( j ), flags, &property ) ) - { - if ( error && error != HB_Err_Not_Covered ) - return error; - - if ( j + 1 == bgc - i ) - return HB_Err_Not_Covered; - j--; - } - - error = _HB_OPEN_Coverage_Index( &bc[i], IN_GLYPH( j ), &index ); - if ( error ) - return error; - } - } - - j = buffer->in_pos; - - error = _HB_OPEN_Coverage_Index( &rccs->Coverage, IN_GLYPH( j ), &input_index ); - if ( error ) - return error; - - lc = rccs->LookaheadCoverage; - - for ( i = 0, j = buffer->in_pos + 1; i < lgc; i++, j++ ) - { - while ( CHECK_Property( gdef, IN_ITEM( j ), flags, &property ) ) - { - if ( error && error != HB_Err_Not_Covered ) - return error; - - if ( j + lgc - i == (HB_Int)buffer->in_length ) - return HB_Err_Not_Covered; - j++; - } - - error = _HB_OPEN_Coverage_Index( &lc[i], IN_GLYPH( j ), &index ); - if ( error ) - return error; - } - - IN_CURGLYPH() = rccs->Substitute[input_index]; - buffer->in_pos--; /* Reverse! */ - - return error; -} - - - -/*********** - * GSUB API - ***********/ - - - -HB_Error HB_GSUB_Select_Script( HB_GSUBHeader* gsub, - HB_UInt script_tag, - HB_UShort* script_index ) -{ - HB_UShort n; - - HB_ScriptList* sl; - HB_ScriptRecord* sr; - - - if ( !gsub || !script_index ) - return ERR(HB_Err_Invalid_Argument); - - sl = &gsub->ScriptList; - sr = sl->ScriptRecord; - - for ( n = 0; n < sl->ScriptCount; n++ ) - if ( script_tag == sr[n].ScriptTag ) - { - *script_index = n; - - return HB_Err_Ok; - } - - return HB_Err_Not_Covered; -} - - - -HB_Error HB_GSUB_Select_Language( HB_GSUBHeader* gsub, - HB_UInt language_tag, - HB_UShort script_index, - HB_UShort* language_index, - HB_UShort* req_feature_index ) -{ - HB_UShort n; - - HB_ScriptList* sl; - HB_ScriptRecord* sr; - HB_ScriptTable* s; - HB_LangSysRecord* lsr; - - - if ( !gsub || !language_index || !req_feature_index ) - return ERR(HB_Err_Invalid_Argument); - - sl = &gsub->ScriptList; - sr = sl->ScriptRecord; - - if ( script_index >= sl->ScriptCount ) - return ERR(HB_Err_Invalid_Argument); - - s = &sr[script_index].Script; - lsr = s->LangSysRecord; - - for ( n = 0; n < s->LangSysCount; n++ ) - if ( language_tag == lsr[n].LangSysTag ) - { - *language_index = n; - *req_feature_index = lsr[n].LangSys.ReqFeatureIndex; - - return HB_Err_Ok; - } - - return HB_Err_Not_Covered; -} - - -/* selecting 0xFFFF for language_index asks for the values of the - default language (DefaultLangSys) */ - - -HB_Error HB_GSUB_Select_Feature( HB_GSUBHeader* gsub, - HB_UInt feature_tag, - HB_UShort script_index, - HB_UShort language_index, - HB_UShort* feature_index ) -{ - HB_UShort n; - - HB_ScriptList* sl; - HB_ScriptRecord* sr; - HB_ScriptTable* s; - HB_LangSysRecord* lsr; - HB_LangSys* ls; - HB_UShort* fi; - - HB_FeatureList* fl; - HB_FeatureRecord* fr; - - - if ( !gsub || !feature_index ) - return ERR(HB_Err_Invalid_Argument); - - sl = &gsub->ScriptList; - sr = sl->ScriptRecord; - - fl = &gsub->FeatureList; - fr = fl->FeatureRecord; - - if ( script_index >= sl->ScriptCount ) - return ERR(HB_Err_Invalid_Argument); - - s = &sr[script_index].Script; - lsr = s->LangSysRecord; - - if ( language_index == 0xFFFF ) - ls = &s->DefaultLangSys; - else - { - if ( language_index >= s->LangSysCount ) - return ERR(HB_Err_Invalid_Argument); - - ls = &lsr[language_index].LangSys; - } - - fi = ls->FeatureIndex; - - for ( n = 0; n < ls->FeatureCount; n++ ) - { - if ( fi[n] >= fl->FeatureCount ) - return ERR(HB_Err_Invalid_SubTable_Format); - - if ( feature_tag == fr[fi[n]].FeatureTag ) - { - *feature_index = fi[n]; - - return HB_Err_Ok; - } - } - - return HB_Err_Not_Covered; -} - - -/* The next three functions return a null-terminated list */ - - -HB_Error HB_GSUB_Query_Scripts( HB_GSUBHeader* gsub, - HB_UInt** script_tag_list ) -{ - HB_UShort n; - HB_Error error; - HB_UInt* stl; - - HB_ScriptList* sl; - HB_ScriptRecord* sr; - - - if ( !gsub || !script_tag_list ) - return ERR(HB_Err_Invalid_Argument); - - sl = &gsub->ScriptList; - sr = sl->ScriptRecord; - - if ( ALLOC_ARRAY( stl, sl->ScriptCount + 1, HB_UInt ) ) - return error; - - for ( n = 0; n < sl->ScriptCount; n++ ) - stl[n] = sr[n].ScriptTag; - stl[n] = 0; - - *script_tag_list = stl; - - return HB_Err_Ok; -} - - - -HB_Error HB_GSUB_Query_Languages( HB_GSUBHeader* gsub, - HB_UShort script_index, - HB_UInt** language_tag_list ) -{ - HB_UShort n; - HB_Error error; - HB_UInt* ltl; - - HB_ScriptList* sl; - HB_ScriptRecord* sr; - HB_ScriptTable* s; - HB_LangSysRecord* lsr; - - - if ( !gsub || !language_tag_list ) - return ERR(HB_Err_Invalid_Argument); - - sl = &gsub->ScriptList; - sr = sl->ScriptRecord; - - if ( script_index >= sl->ScriptCount ) - return ERR(HB_Err_Invalid_Argument); - - s = &sr[script_index].Script; - lsr = s->LangSysRecord; - - if ( ALLOC_ARRAY( ltl, s->LangSysCount + 1, HB_UInt ) ) - return error; - - for ( n = 0; n < s->LangSysCount; n++ ) - ltl[n] = lsr[n].LangSysTag; - ltl[n] = 0; - - *language_tag_list = ltl; - - return HB_Err_Ok; -} - - -/* selecting 0xFFFF for language_index asks for the values of the - default language (DefaultLangSys) */ - - -HB_Error HB_GSUB_Query_Features( HB_GSUBHeader* gsub, - HB_UShort script_index, - HB_UShort language_index, - HB_UInt** feature_tag_list ) -{ - HB_UShort n; - HB_Error error; - HB_UInt* ftl; - - HB_ScriptList* sl; - HB_ScriptRecord* sr; - HB_ScriptTable* s; - HB_LangSysRecord* lsr; - HB_LangSys* ls; - HB_UShort* fi; - - HB_FeatureList* fl; - HB_FeatureRecord* fr; - - - if ( !gsub || !feature_tag_list ) - return ERR(HB_Err_Invalid_Argument); - - sl = &gsub->ScriptList; - sr = sl->ScriptRecord; - - fl = &gsub->FeatureList; - fr = fl->FeatureRecord; - - if ( script_index >= sl->ScriptCount ) - return ERR(HB_Err_Invalid_Argument); - - s = &sr[script_index].Script; - lsr = s->LangSysRecord; - - if ( language_index == 0xFFFF ) - ls = &s->DefaultLangSys; - else - { - if ( language_index >= s->LangSysCount ) - return ERR(HB_Err_Invalid_Argument); - - ls = &lsr[language_index].LangSys; - } - - fi = ls->FeatureIndex; - - if ( ALLOC_ARRAY( ftl, ls->FeatureCount + 1, HB_UInt ) ) - return error; - - for ( n = 0; n < ls->FeatureCount; n++ ) - { - if ( fi[n] >= fl->FeatureCount ) - { - FREE( ftl ); - return ERR(HB_Err_Invalid_SubTable_Format); - } - ftl[n] = fr[fi[n]].FeatureTag; - } - ftl[n] = 0; - - *feature_tag_list = ftl; - - return HB_Err_Ok; -} - - -/* Do an individual subtable lookup. Returns HB_Err_Ok if substitution - has been done, or HB_Err_Not_Covered if not. */ -static HB_Error GSUB_Do_Glyph_Lookup( HB_GSUBHeader* gsub, - HB_UShort lookup_index, - HB_Buffer buffer, - HB_UShort context_length, - int nesting_level ) -{ - HB_Error error = HB_Err_Not_Covered; - HB_UShort i, flags, lookup_count; - HB_Lookup* lo; - int lookup_type; - - nesting_level++; - - if ( nesting_level > HB_MAX_NESTING_LEVEL ) - return ERR(HB_Err_Not_Covered); /* ERR() call intended */ - - lookup_count = gsub->LookupList.LookupCount; - if (lookup_index >= lookup_count) - return error; - - lo = &gsub->LookupList.Lookup[lookup_index]; - flags = lo->LookupFlag; - lookup_type = lo->LookupType; - - for ( i = 0; i < lo->SubTableCount; i++ ) - { - HB_GSUB_SubTable *st = &lo->SubTable[i].st.gsub; - - switch (lookup_type) { - case HB_GSUB_LOOKUP_SINGLE: - error = Lookup_SingleSubst ( gsub, st, buffer, flags, context_length, nesting_level ); break; - case HB_GSUB_LOOKUP_MULTIPLE: - error = Lookup_MultipleSubst ( gsub, st, buffer, flags, context_length, nesting_level ); break; - case HB_GSUB_LOOKUP_ALTERNATE: - error = Lookup_AlternateSubst ( gsub, st, buffer, flags, context_length, nesting_level ); break; - case HB_GSUB_LOOKUP_LIGATURE: - error = Lookup_LigatureSubst ( gsub, st, buffer, flags, context_length, nesting_level ); break; - case HB_GSUB_LOOKUP_CONTEXT: - error = Lookup_ContextSubst ( gsub, st, buffer, flags, context_length, nesting_level ); break; - case HB_GSUB_LOOKUP_CHAIN: - error = Lookup_ChainContextSubst ( gsub, st, buffer, flags, context_length, nesting_level ); break; - /*case HB_GSUB_LOOKUP_EXTENSION: - error = Lookup_ExtensionSubst ( gsub, st, buffer, flags, context_length, nesting_level ); break;*/ - case HB_GSUB_LOOKUP_REVERSE_CHAIN: - error = Lookup_ReverseChainContextSubst ( gsub, st, buffer, flags, context_length, nesting_level ); break; - default: - error = HB_Err_Not_Covered; - }; - - /* Check whether we have a successful substitution or an error other - than HB_Err_Not_Covered */ - if ( error != HB_Err_Not_Covered ) - return error; - } - - return HB_Err_Not_Covered; -} - - -HB_INTERNAL HB_Error -_HB_GSUB_Load_SubTable( HB_GSUB_SubTable* st, - HB_Stream stream, - HB_UShort lookup_type ) -{ - switch (lookup_type) { - case HB_GSUB_LOOKUP_SINGLE: return Load_SingleSubst ( st, stream ); - case HB_GSUB_LOOKUP_MULTIPLE: return Load_MultipleSubst ( st, stream ); - case HB_GSUB_LOOKUP_ALTERNATE: return Load_AlternateSubst ( st, stream ); - case HB_GSUB_LOOKUP_LIGATURE: return Load_LigatureSubst ( st, stream ); - case HB_GSUB_LOOKUP_CONTEXT: return Load_ContextSubst ( st, stream ); - case HB_GSUB_LOOKUP_CHAIN: return Load_ChainContextSubst ( st, stream ); - /*case HB_GSUB_LOOKUP_EXTENSION: return Load_ExtensionSubst ( st, stream );*/ - case HB_GSUB_LOOKUP_REVERSE_CHAIN: return Load_ReverseChainContextSubst ( st, stream ); - default: return ERR(HB_Err_Invalid_SubTable_Format); - }; -} - - -HB_INTERNAL void -_HB_GSUB_Free_SubTable( HB_GSUB_SubTable* st, - HB_UShort lookup_type ) -{ - switch ( lookup_type ) { - case HB_GSUB_LOOKUP_SINGLE: Free_SingleSubst ( st ); return; - case HB_GSUB_LOOKUP_MULTIPLE: Free_MultipleSubst ( st ); return; - case HB_GSUB_LOOKUP_ALTERNATE: Free_AlternateSubst ( st ); return; - case HB_GSUB_LOOKUP_LIGATURE: Free_LigatureSubst ( st ); return; - case HB_GSUB_LOOKUP_CONTEXT: Free_ContextSubst ( st ); return; - case HB_GSUB_LOOKUP_CHAIN: Free_ChainContextSubst ( st ); return; - /*case HB_GSUB_LOOKUP_EXTENSION: Free_ExtensionSubst ( st ); return;*/ - case HB_GSUB_LOOKUP_REVERSE_CHAIN: Free_ReverseChainContextSubst ( st ); return; - default: return; - }; -} - - - -/* apply one lookup to the input string object */ - -static HB_Error GSUB_Do_String_Lookup( HB_GSUBHeader* gsub, - HB_UShort lookup_index, - HB_Buffer buffer ) -{ - HB_Error error, retError = HB_Err_Not_Covered; - - HB_UInt* properties = gsub->LookupList.Properties; - int lookup_type = gsub->LookupList.Lookup[lookup_index].LookupType; - - const int nesting_level = 0; - /* 0xFFFF indicates that we don't have a context length yet */ - const HB_UShort context_length = 0xFFFF; - - switch (lookup_type) { - - case HB_GSUB_LOOKUP_SINGLE: - case HB_GSUB_LOOKUP_MULTIPLE: - case HB_GSUB_LOOKUP_ALTERNATE: - case HB_GSUB_LOOKUP_LIGATURE: - case HB_GSUB_LOOKUP_CONTEXT: - case HB_GSUB_LOOKUP_CHAIN: - /* in/out forward substitution (implemented lazy) */ - - _hb_buffer_clear_output ( buffer ); - buffer->in_pos = 0; - while ( buffer->in_pos < buffer->in_length ) - { - if ( ~IN_PROPERTIES( buffer->in_pos ) & properties[lookup_index] ) - { - error = GSUB_Do_Glyph_Lookup( gsub, lookup_index, buffer, context_length, nesting_level ); - if ( error ) - { - if ( error != HB_Err_Not_Covered ) - return error; - } - else - retError = error; - } - else - error = HB_Err_Not_Covered; - - if ( error == HB_Err_Not_Covered ) - if ( COPY_Glyph ( buffer ) ) - return error; - } - /* we shouldn't swap if error occurred. - * - * also don't swap if nothing changed (ie HB_Err_Not_Covered). - * shouldn't matter in that case though. - */ - if ( retError == HB_Err_Ok ) - _hb_buffer_swap( buffer ); - - return retError; - - case HB_GSUB_LOOKUP_REVERSE_CHAIN: - /* in-place backward substitution */ - - buffer->in_pos = buffer->in_length - 1; - do - { - if ( ~IN_PROPERTIES( buffer->in_pos ) & properties[lookup_index] ) - { - error = GSUB_Do_Glyph_Lookup( gsub, lookup_index, buffer, context_length, nesting_level ); - if ( error ) - { - if ( error != HB_Err_Not_Covered ) - return error; - } - else - retError = error; - } - else - error = HB_Err_Not_Covered; - - if ( error == HB_Err_Not_Covered ) - buffer->in_pos--; - } - while ((HB_Int) buffer->in_pos >= 0); - - return retError; - - /*case HB_GSUB_LOOKUP_EXTENSION:*/ - default: - return retError; - }; -} - - -HB_Error HB_GSUB_Add_Feature( HB_GSUBHeader* gsub, - HB_UShort feature_index, - HB_UInt property ) -{ - HB_UShort i; - - HB_Feature feature; - HB_UInt* properties; - HB_UShort* index; - HB_UShort lookup_count; - - /* Each feature can only be added once */ - - if ( !gsub || - feature_index >= gsub->FeatureList.FeatureCount || - gsub->FeatureList.ApplyCount == gsub->FeatureList.FeatureCount ) - return ERR(HB_Err_Invalid_Argument); - - gsub->FeatureList.ApplyOrder[gsub->FeatureList.ApplyCount++] = feature_index; - - properties = gsub->LookupList.Properties; - - feature = gsub->FeatureList.FeatureRecord[feature_index].Feature; - index = feature.LookupListIndex; - lookup_count = gsub->LookupList.LookupCount; - - for ( i = 0; i < feature.LookupListCount; i++ ) - { - HB_UShort lookup_index = index[i]; - if (lookup_index < lookup_count) - properties[lookup_index] |= property; - } - - return HB_Err_Ok; -} - - - -HB_Error HB_GSUB_Clear_Features( HB_GSUBHeader* gsub ) -{ - HB_UShort i; - - HB_UInt* properties; - - - if ( !gsub ) - return ERR(HB_Err_Invalid_Argument); - - gsub->FeatureList.ApplyCount = 0; - - properties = gsub->LookupList.Properties; - - for ( i = 0; i < gsub->LookupList.LookupCount; i++ ) - properties[i] = 0; - - return HB_Err_Ok; -} - - - -HB_Error HB_GSUB_Register_Alternate_Function( HB_GSUBHeader* gsub, - HB_AltFunction altfunc, - void* data ) -{ - if ( !gsub ) - return ERR(HB_Err_Invalid_Argument); - - gsub->altfunc = altfunc; - gsub->data = data; - - return HB_Err_Ok; -} - -/* returns error if one happened, otherwise returns HB_Err_Not_Covered if no - * feature were applied, or HB_Err_Ok otherwise. - */ -HB_Error HB_GSUB_Apply_String( HB_GSUBHeader* gsub, - HB_Buffer buffer ) -{ - HB_Error error, retError = HB_Err_Not_Covered; - int i, j, lookup_count, num_features; - - if ( !gsub || - !buffer) - return ERR(HB_Err_Invalid_Argument); - - if ( buffer->in_length == 0 ) - return retError; - - lookup_count = gsub->LookupList.LookupCount; - num_features = gsub->FeatureList.ApplyCount; - - for ( i = 0; i < num_features; i++) - { - HB_UShort feature_index = gsub->FeatureList.ApplyOrder[i]; - HB_Feature feature = gsub->FeatureList.FeatureRecord[feature_index].Feature; - - for ( j = 0; j < feature.LookupListCount; j++ ) - { - HB_UShort lookup_index = feature.LookupListIndex[j]; - - /* Skip nonexistant lookups */ - if (lookup_index >= lookup_count) - continue; - - error = GSUB_Do_String_Lookup( gsub, lookup_index, buffer ); - if ( error ) - { - if ( error != HB_Err_Not_Covered ) - return error; - } - else - retError = error; - } - } - - error = retError; - - return error; -} - - -/* END */ diff --git a/third_party/harfbuzz/src/harfbuzz-gsub.h b/third_party/harfbuzz/src/harfbuzz-gsub.h deleted file mode 100644 index 1ca3f0c3c8..0000000000 --- a/third_party/harfbuzz/src/harfbuzz-gsub.h +++ /dev/null @@ -1,141 +0,0 @@ -/* - * Copyright (C) 1998-2004 David Turner and Werner Lemberg - * Copyright (C) 2006 Behdad Esfahbod - * - * This is part of HarfBuzz, an OpenType Layout engine library. - * - * Permission is hereby granted, without written agreement and without - * license or royalty fees, to use, copy, modify, and distribute this - * software and its documentation for any purpose, provided that the - * above copyright notice and the following two paragraphs appear in - * all copies of this software. - * - * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR - * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES - * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN - * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE. - * - * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, - * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS - * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO - * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. - */ - -#ifndef HARFBUZZ_GSUB_H -#define HARFBUZZ_GSUB_H - -#include "harfbuzz-gdef.h" -#include "harfbuzz-buffer.h" - -HB_BEGIN_HEADER - - -/* Lookup types for glyph substitution */ - -#define HB_GSUB_LOOKUP_SINGLE 1 -#define HB_GSUB_LOOKUP_MULTIPLE 2 -#define HB_GSUB_LOOKUP_ALTERNATE 3 -#define HB_GSUB_LOOKUP_LIGATURE 4 -#define HB_GSUB_LOOKUP_CONTEXT 5 -#define HB_GSUB_LOOKUP_CHAIN 6 -#define HB_GSUB_LOOKUP_EXTENSION 7 -#define HB_GSUB_LOOKUP_REVERSE_CHAIN 8 - - -/* A pointer to a function which selects the alternate glyph. `pos' is - the position of the glyph with index `glyphID', `num_alternates' - gives the number of alternates in the `alternates' array. `data' - points to the user-defined structure specified during a call to - HB_GSUB_Register_Alternate_Function(). The function must return an - index into the `alternates' array. */ - -typedef HB_UShort (*HB_AltFunction)(HB_UInt pos, - HB_UShort glyphID, - HB_UShort num_alternates, - HB_UShort* alternates, - void* data ); - - -struct HB_GSUBHeader_ -{ - HB_UInt offset; - - HB_16Dot16 Version; - - HB_ScriptList ScriptList; - HB_FeatureList FeatureList; - HB_LookupList LookupList; - - HB_GDEFHeader* gdef; - - /* the next two fields are used for an alternate substitution callback - function to select the proper alternate glyph. */ - - HB_AltFunction altfunc; - void* data; -}; - -typedef struct HB_GSUBHeader_ HB_GSUBHeader; -typedef HB_GSUBHeader* HB_GSUB; - - -HB_Error HB_Load_GSUB_Table( HB_Stream stream, - HB_GSUBHeader** gsub, - HB_GDEFHeader* gdef, - HB_Stream gdefStream ); - - -HB_Error HB_Done_GSUB_Table( HB_GSUBHeader* gsub ); - - -HB_Error HB_GSUB_Select_Script( HB_GSUBHeader* gsub, - HB_UInt script_tag, - HB_UShort* script_index ); - -HB_Error HB_GSUB_Select_Language( HB_GSUBHeader* gsub, - HB_UInt language_tag, - HB_UShort script_index, - HB_UShort* language_index, - HB_UShort* req_feature_index ); - -HB_Error HB_GSUB_Select_Feature( HB_GSUBHeader* gsub, - HB_UInt feature_tag, - HB_UShort script_index, - HB_UShort language_index, - HB_UShort* feature_index ); - - -HB_Error HB_GSUB_Query_Scripts( HB_GSUBHeader* gsub, - HB_UInt** script_tag_list ); - -HB_Error HB_GSUB_Query_Languages( HB_GSUBHeader* gsub, - HB_UShort script_index, - HB_UInt** language_tag_list ); - -HB_Error HB_GSUB_Query_Features( HB_GSUBHeader* gsub, - HB_UShort script_index, - HB_UShort language_index, - HB_UInt** feature_tag_list ); - - -HB_Error HB_GSUB_Add_Feature( HB_GSUBHeader* gsub, - HB_UShort feature_index, - HB_UInt property ); - -HB_Error HB_GSUB_Clear_Features( HB_GSUBHeader* gsub ); - - -HB_Error HB_GSUB_Register_Alternate_Function( HB_GSUBHeader* gsub, - HB_AltFunction altfunc, - void* data ); - - -HB_Error HB_GSUB_Apply_String( HB_GSUBHeader* gsub, - HB_Buffer buffer ); - - -HB_END_HEADER - -#endif /* HARFBUZZ_GSUB_H */ diff --git a/third_party/harfbuzz/src/harfbuzz-hangul.c b/third_party/harfbuzz/src/harfbuzz-hangul.c deleted file mode 100644 index a819dacf7f..0000000000 --- a/third_party/harfbuzz/src/harfbuzz-hangul.c +++ /dev/null @@ -1,268 +0,0 @@ -/* - * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) - * - * This is part of HarfBuzz, an OpenType Layout engine library. - * - * Permission is hereby granted, without written agreement and without - * license or royalty fees, to use, copy, modify, and distribute this - * software and its documentation for any purpose, provided that the - * above copyright notice and the following two paragraphs appear in - * all copies of this software. - * - * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR - * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES - * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN - * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE. - * - * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, - * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS - * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO - * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. - */ - -#include "harfbuzz-shaper.h" -#include "harfbuzz-shaper-private.h" - -#include - -/* -// Hangul is a syllable based script. Unicode reserves a large range -// for precomposed hangul, where syllables are already precomposed to -// their final glyph shape. In addition, a so called jamo range is -// defined, that can be used to express old Hangul. Modern hangul -// syllables can also be expressed as jamo, and should be composed -// into syllables. The operation is rather simple and mathematical. - -// Every hangul jamo is classified as being either a Leading consonant -// (L), and intermediat Vowel (V) or a trailing consonant (T). Modern -// hangul syllables (the ones in the precomposed area can be of type -// LV or LVT. -// -// Syllable breaks do _not_ occur between: -// -// L L, V or precomposed -// V, LV V, T -// LVT, T T -// -// A standard syllable is of the form L+V+T*. The above rules allow -// nonstandard syllables L*V*T*. To transform them into standard -// syllables fill characters L_f and V_f can be inserted. -*/ - -enum { - Hangul_SBase = 0xac00, - Hangul_LBase = 0x1100, - Hangul_VBase = 0x1161, - Hangul_TBase = 0x11a7, - Hangul_SCount = 11172, - Hangul_LCount = 19, - Hangul_VCount = 21, - Hangul_TCount = 28, - Hangul_NCount = 21*28 -}; - -#define hangul_isPrecomposed(uc) \ - (uc >= Hangul_SBase && uc < Hangul_SBase + Hangul_SCount) - -#define hangul_isLV(uc) \ - ((uc - Hangul_SBase) % Hangul_TCount == 0) - -typedef enum { - L, - V, - T, - LV, - LVT, - X -} HangulType; - -static HangulType hangul_type(unsigned short uc) { - if (uc > Hangul_SBase && uc < Hangul_SBase + Hangul_SCount) - return hangul_isLV(uc) ? LV : LVT; - if (uc < Hangul_LBase || uc > 0x11ff) - return X; - if (uc < Hangul_VBase) - return L; - if (uc < Hangul_TBase) - return V; - return T; -} - -static int hangul_nextSyllableBoundary(const HB_UChar16 *s, int start, int end) -{ - const HB_UChar16 *uc = s + start; - - HangulType state = hangul_type(*uc); - int pos = 1; - - while (pos < end - start) { - HangulType newState = hangul_type(uc[pos]); - switch(newState) { - case X: - goto finish; - case L: - case V: - case T: - if (state > newState) - goto finish; - state = newState; - break; - case LV: - if (state > L) - goto finish; - state = V; - break; - case LVT: - if (state > L) - goto finish; - state = T; - } - ++pos; - } - - finish: - return start+pos; -} - -#ifndef NO_OPENTYPE -static const HB_OpenTypeFeature hangul_features [] = { - { HB_MAKE_TAG('c', 'c', 'm', 'p'), CcmpProperty }, - { HB_MAKE_TAG('l', 'j', 'm', 'o'), CcmpProperty }, - { HB_MAKE_TAG('j', 'j', 'm', 'o'), CcmpProperty }, - { HB_MAKE_TAG('t', 'j', 'm', 'o'), CcmpProperty }, - { 0, 0 } -}; -#endif - -static HB_Bool hangul_shape_syllable(HB_ShaperItem *item, HB_Bool openType) -{ - const HB_UChar16 *ch = item->string + item->item.pos; - int len = item->item.length; -#ifndef NO_OPENTYPE - const int availableGlyphs = item->num_glyphs; -#endif - - int i; - HB_UChar16 composed = 0; - /* see if we can compose the syllable into a modern hangul */ - if (item->item.length == 2) { - int LIndex = ch[0] - Hangul_LBase; - int VIndex = ch[1] - Hangul_VBase; - if (LIndex >= 0 && LIndex < Hangul_LCount && - VIndex >= 0 && VIndex < Hangul_VCount) - composed = (LIndex * Hangul_VCount + VIndex) * Hangul_TCount + Hangul_SBase; - } else if (item->item.length == 3) { - int LIndex = ch[0] - Hangul_LBase; - int VIndex = ch[1] - Hangul_VBase; - int TIndex = ch[2] - Hangul_TBase; - if (LIndex >= 0 && LIndex < Hangul_LCount && - VIndex >= 0 && VIndex < Hangul_VCount && - TIndex >= 0 && TIndex < Hangul_TCount) - composed = (LIndex * Hangul_VCount + VIndex) * Hangul_TCount + TIndex + Hangul_SBase; - } - - - - /* if we have a modern hangul use the composed form */ - if (composed) { - ch = &composed; - len = 1; - } - - if (!item->font->klass->convertStringToGlyphIndices(item->font, - ch, len, - item->glyphs, &item->num_glyphs, - item->item.bidiLevel % 2)) - return FALSE; - for (i = 0; i < len; i++) { - item->attributes[i].mark = FALSE; - item->attributes[i].clusterStart = FALSE; - item->attributes[i].justification = 0; - item->attributes[i].zeroWidth = FALSE; - /*IDEBUG(" %d: %4x", i, ch[i].unicode()); */ - } - -#ifndef NO_OPENTYPE - if (!composed && openType) { - HB_Bool positioned; - - HB_STACKARRAY(unsigned short, logClusters, len); - for (i = 0; i < len; ++i) - logClusters[i] = i; - item->log_clusters = logClusters; - - HB_OpenTypeShape(item, /*properties*/0); - - positioned = HB_OpenTypePosition(item, availableGlyphs, /*doLogClusters*/FALSE); - - HB_FREE_STACKARRAY(logClusters); - - if (!positioned) - return FALSE; - } else { - HB_HeuristicPosition(item); - } -#endif - - item->attributes[0].clusterStart = TRUE; - return TRUE; -} - -HB_Bool HB_HangulShape(HB_ShaperItem *item) -{ - const HB_UChar16 *uc = item->string + item->item.pos; - HB_Bool allPrecomposed = TRUE; - int i; - - assert(item->item.script == HB_Script_Hangul); - - for (i = 0; i < (int)item->item.length; ++i) { - if (!hangul_isPrecomposed(uc[i])) { - allPrecomposed = FALSE; - break; - } - } - - if (!allPrecomposed) { - HB_Bool openType = FALSE; - unsigned short *logClusters = item->log_clusters; - HB_ShaperItem syllable; - int first_glyph = 0; - int sstart = item->item.pos; - int end = sstart + item->item.length; - -#ifndef NO_OPENTYPE - openType = HB_SelectScript(item, hangul_features); -#endif - syllable = *item; - - while (sstart < end) { - int send = hangul_nextSyllableBoundary(item->string, sstart, end); - - syllable.item.pos = sstart; - syllable.item.length = send-sstart; - syllable.glyphs = item->glyphs + first_glyph; - syllable.attributes = item->attributes + first_glyph; - syllable.offsets = item->offsets + first_glyph; - syllable.advances = item->advances + first_glyph; - syllable.num_glyphs = item->num_glyphs - first_glyph; - if (!hangul_shape_syllable(&syllable, openType)) { - item->num_glyphs += syllable.num_glyphs; - return FALSE; - } - /* fix logcluster array */ - for (i = sstart; i < send; ++i) - logClusters[i-item->item.pos] = first_glyph; - sstart = send; - first_glyph += syllable.num_glyphs; - } - item->num_glyphs = first_glyph; - return TRUE; - } - - return HB_BasicShape(item); -} - - diff --git a/third_party/harfbuzz/src/harfbuzz-hebrew.c b/third_party/harfbuzz/src/harfbuzz-hebrew.c deleted file mode 100644 index d2664deefa..0000000000 --- a/third_party/harfbuzz/src/harfbuzz-hebrew.c +++ /dev/null @@ -1,189 +0,0 @@ -/* - * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) - * - * This is part of HarfBuzz, an OpenType Layout engine library. - * - * Permission is hereby granted, without written agreement and without - * license or royalty fees, to use, copy, modify, and distribute this - * software and its documentation for any purpose, provided that the - * above copyright notice and the following two paragraphs appear in - * all copies of this software. - * - * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR - * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES - * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN - * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE. - * - * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, - * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS - * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO - * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. - */ - -#include "harfbuzz-shaper.h" -#include "harfbuzz-shaper-private.h" -#include - -/* -// Uniscribe also defines dlig for Hebrew, but we leave this out for now, as it's mostly -// ligatures one does not want in modern Hebrew (as lam-alef ligatures). -*/ -#ifndef NO_OPENTYPE -static const HB_OpenTypeFeature hebrew_features[] = { - { HB_MAKE_TAG('c', 'c', 'm', 'p'), CcmpProperty }, - {0, 0} -}; -#endif - -/* Hebrew shaping. In the non opentype case we try to use the - presentation forms specified for Hebrew. Especially for the - ligatures with Dagesh this gives much better results than we could - achieve manually. -*/ -HB_Bool HB_HebrewShape(HB_ShaperItem *shaper_item) -{ - enum { - Dagesh = 0x5bc, - ShinDot = 0x5c1, - SinDot = 0x5c2, - Patah = 0x5b7, - Qamats = 0x5b8, - Holam = 0x5b9, - Rafe = 0x5bf - }; - - assert(shaper_item->item.script == HB_Script_Hebrew); - - HB_HeuristicSetGlyphAttributes(shaper_item); - -#ifndef NO_OPENTYPE - if (HB_SelectScript(shaper_item, hebrew_features)) { - - const int availableGlyphs = shaper_item->num_glyphs; - if (!HB_ConvertStringToGlyphIndices(shaper_item)) - return FALSE; - - - HB_OpenTypeShape(shaper_item, /*properties*/0); - return HB_OpenTypePosition(shaper_item, availableGlyphs, /*doLogClusters*/TRUE); - } -#endif - - { - const HB_UChar16 *uc = shaper_item->string + shaper_item->item.pos; - unsigned short *logClusters = shaper_item->log_clusters; - HB_GlyphAttributes *attributes = shaper_item->attributes; - - HB_Bool haveGlyphs; - int slen = 1; - int cluster_start = 0; - hb_uint32 i; - - HB_STACKARRAY(HB_UChar16, shapedChars, 2 * shaper_item->item.length); - *shapedChars = *uc; - logClusters[0] = 0; - - for (i = 1; i < shaper_item->item.length; ++i) { - hb_uint16 base = shapedChars[cluster_start]; - hb_uint16 shaped = 0; - HB_Bool invalid = FALSE; - if (uc[i] == Dagesh) { - if (base >= 0x5d0 - && base <= 0x5ea - && base != 0x5d7 - && base != 0x5dd - && base != 0x5df - && base != 0x5e2 - && base != 0x5e5) { - shaped = base - 0x5d0 + 0xfb30; - } else if (base == 0xfb2a || base == 0xfb2b /* Shin with Shin or Sin dot */) { - shaped = base + 2; - } else { - invalid = TRUE; - } - } else if (uc[i] == ShinDot) { - if (base == 0x05e9) - shaped = 0xfb2a; - else if (base == 0xfb49) - shaped = 0xfb2c; - else - invalid = TRUE; - } else if (uc[i] == SinDot) { - if (base == 0x05e9) - shaped = 0xfb2b; - else if (base == 0xfb49) - shaped = 0xfb2d; - else - invalid = TRUE; - } else if (uc[i] == Patah) { - if (base == 0x5d0) - shaped = 0xfb2e; - } else if (uc[i] == Qamats) { - if (base == 0x5d0) - shaped = 0xfb2f; - } else if (uc[i] == Holam) { - if (base == 0x5d5) - shaped = 0xfb4b; - } else if (uc[i] == Rafe) { - if (base == 0x5d1) - shaped = 0xfb4c; - else if (base == 0x5db) - shaped = 0xfb4d; - else if (base == 0x5e4) - shaped = 0xfb4e; - } - - if (invalid) { - shapedChars[slen] = 0x25cc; - attributes[slen].clusterStart = TRUE; - attributes[slen].mark = FALSE; - attributes[slen].combiningClass = 0; - cluster_start = slen; - ++slen; - } - if (shaped) { - if (shaper_item->font->klass->canRender(shaper_item->font, (HB_UChar16 *)&shaped, 1)) { - shapedChars[cluster_start] = shaped; - } else - shaped = 0; - } - if (!shaped) { - HB_CharCategory category; - int cmb; - shapedChars[slen] = uc[i]; - HB_GetUnicodeCharProperties(uc[i], &category, &cmb); - if (category != HB_Mark_NonSpacing) { - attributes[slen].clusterStart = TRUE; - attributes[slen].mark = FALSE; - attributes[slen].combiningClass = 0; - attributes[slen].dontPrint = HB_IsControlChar(uc[i]); - cluster_start = slen; - } else { - attributes[slen].clusterStart = FALSE; - attributes[slen].mark = TRUE; - attributes[slen].combiningClass = cmb; - } - ++slen; - } - logClusters[i] = cluster_start; - } - - haveGlyphs = shaper_item->font->klass - ->convertStringToGlyphIndices(shaper_item->font, - shapedChars, slen, - shaper_item->glyphs, &shaper_item->num_glyphs, - shaper_item->item.bidiLevel % 2); - - HB_FREE_STACKARRAY(shapedChars); - - if (!haveGlyphs) - return FALSE; - - HB_HeuristicPosition(shaper_item); - } - - return TRUE; -} - diff --git a/third_party/harfbuzz/src/harfbuzz-impl.c b/third_party/harfbuzz/src/harfbuzz-impl.c deleted file mode 100644 index ddbf36be0e..0000000000 --- a/third_party/harfbuzz/src/harfbuzz-impl.c +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Copyright (C) 1998-2004 David Turner and Werner Lemberg - * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) - * Copyright (C) 2007 Red Hat, Inc. - * - * This is part of HarfBuzz, an OpenType Layout engine library. - * - * Permission is hereby granted, without written agreement and without - * license or royalty fees, to use, copy, modify, and distribute this - * software and its documentation for any purpose, provided that the - * above copyright notice and the following two paragraphs appear in - * all copies of this software. - * - * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR - * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES - * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN - * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE. - * - * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, - * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS - * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO - * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. - * - * Red Hat Author(s): Behdad Esfahbod - */ - -#include "harfbuzz-impl.h" - - -HB_INTERNAL HB_Pointer -_hb_alloc(size_t size, - HB_Error *perror ) -{ - HB_Error error = (HB_Error)0; - HB_Pointer block = NULL; - - if ( size > 0 ) - { - block = calloc( 1, size ); - if ( !block ) - error = ERR(HB_Err_Out_Of_Memory); - } - - *perror = error; - return block; -} - - -HB_INTERNAL HB_Pointer -_hb_realloc(HB_Pointer block, - size_t new_size, - HB_Error *perror ) -{ - HB_Pointer block2 = NULL; - HB_Error error = (HB_Error)0; - - block2 = realloc( block, new_size ); - if ( block2 == NULL && new_size != 0 ) - error = ERR(HB_Err_Out_Of_Memory); - - if ( !error ) - block = block2; - - *perror = error; - return block; -} - - -HB_INTERNAL void -_hb_free( HB_Pointer block ) -{ - if ( block ) - free( block ); -} - - -/* helper func to set a breakpoint on */ -HB_INTERNAL HB_Error -_hb_err (HB_Error code) -{ - return code; -} diff --git a/third_party/harfbuzz/src/harfbuzz-impl.h b/third_party/harfbuzz/src/harfbuzz-impl.h deleted file mode 100644 index 5f430498c4..0000000000 --- a/third_party/harfbuzz/src/harfbuzz-impl.h +++ /dev/null @@ -1,131 +0,0 @@ -/* - * Copyright (C) 1998-2004 David Turner and Werner Lemberg - * Copyright (C) 2006 Behdad Esfahbod - * - * This is part of HarfBuzz, an OpenType Layout engine library. - * - * Permission is hereby granted, without written agreement and without - * license or royalty fees, to use, copy, modify, and distribute this - * software and its documentation for any purpose, provided that the - * above copyright notice and the following two paragraphs appear in - * all copies of this software. - * - * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR - * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES - * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN - * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE. - * - * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, - * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS - * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO - * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. - */ - -#ifndef HARFBUZZ_IMPL_H -#define HARFBUZZ_IMPL_H - -#include "harfbuzz-global.h" - -#include - -HB_BEGIN_HEADER - -#ifndef HB_INTERNAL -# define HB_INTERNAL -#endif - -#ifndef NULL -# define NULL ((void *)0) -#endif - -#ifndef FALSE -# define FALSE 0 -#endif - -#ifndef TRUE -# define TRUE 1 -#endif - -#ifndef TTAG_GDEF -# define TTAG_GDEF HB_MAKE_TAG( 'G', 'D', 'E', 'F' ) -#endif -#ifndef TTAG_GPOS -# define TTAG_GPOS HB_MAKE_TAG( 'G', 'P', 'O', 'S' ) -#endif -#ifndef TTAG_GSUB -# define TTAG_GSUB HB_MAKE_TAG( 'G', 'S', 'U', 'B' ) -#endif - -#ifndef HB_UNUSED -# define HB_UNUSED(arg) ((arg) = (arg)) -#endif - -#define HB_LIKELY(cond) (cond) -#define HB_UNLIKELY(cond) (cond) - -#define ARRAY_LEN(Array) ((int)(sizeof (Array) / sizeof (Array)[0])) - - - -#define HB_IsHighSurrogate(ucs) \ - (((ucs) & 0xfc00) == 0xd800) - -#define HB_IsLowSurrogate(ucs) \ - (((ucs) & 0xfc00) == 0xdc00) - -#define HB_SurrogateToUcs4(high, low) \ - (((HB_UChar32)(high))<<10) + (low) - 0x35fdc00; - - - - - -#define ALLOC(_ptr,_size) \ - ( (_ptr) = _hb_alloc( _size, &error ), error != 0 ) - -#define REALLOC(_ptr,_newsz) \ - ( (_ptr) = _hb_realloc( (_ptr), (_newsz), &error ), error != 0 ) - -#define FREE(_ptr) \ - do { \ - if ( (_ptr) ) \ - { \ - _hb_free( _ptr ); \ - _ptr = NULL; \ - } \ - } while (0) - -#define ALLOC_ARRAY(_ptr,_count,_type) \ - ALLOC(_ptr,(_count)*sizeof(_type)) - -#define REALLOC_ARRAY(_ptr,_newcnt,_type) \ - REALLOC(_ptr,(_newcnt)*sizeof(_type)) - -#define MEM_Copy(dest,source,count) memcpy( (char*)(dest), (const char*)(source), (size_t)(count) ) - -#define ERR(err) _hb_err (err) - - -HB_INTERNAL HB_Pointer -_hb_alloc( size_t size, - HB_Error *perror_ ); - -HB_INTERNAL HB_Pointer -_hb_realloc( HB_Pointer block, - size_t new_size, - HB_Error *perror_ ); - -HB_INTERNAL void -_hb_free( HB_Pointer block ); - - -/* helper func to set a breakpoint on */ -HB_INTERNAL HB_Error -_hb_err (HB_Error code); - - -HB_END_HEADER - -#endif /* HARFBUZZ_IMPL_H */ diff --git a/third_party/harfbuzz/src/harfbuzz-indic.cpp b/third_party/harfbuzz/src/harfbuzz-indic.cpp deleted file mode 100644 index 3c9df93787..0000000000 --- a/third_party/harfbuzz/src/harfbuzz-indic.cpp +++ /dev/null @@ -1,1873 +0,0 @@ -/* - * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) - * - * This is part of HarfBuzz, an OpenType Layout engine library. - * - * Permission is hereby granted, without written agreement and without - * license or royalty fees, to use, copy, modify, and distribute this - * software and its documentation for any purpose, provided that the - * above copyright notice and the following two paragraphs appear in - * all copies of this software. - * - * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR - * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES - * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN - * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE. - * - * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, - * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS - * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO - * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. - */ - -#include "harfbuzz-shaper.h" -#include "harfbuzz-shaper-private.h" - -#include -#include - -#define FLAG(x) (1 << (x)) - -static HB_Bool isLetter(HB_UChar16 ucs) -{ - const int test = FLAG(HB_Letter_Uppercase) | - FLAG(HB_Letter_Lowercase) | - FLAG(HB_Letter_Titlecase) | - FLAG(HB_Letter_Modifier) | - FLAG(HB_Letter_Other); - return FLAG(HB_GetUnicodeCharCategory(ucs)) & test; -} - -static HB_Bool isMark(HB_UChar16 ucs) -{ - const int test = FLAG(HB_Mark_NonSpacing) | - FLAG(HB_Mark_SpacingCombining) | - FLAG(HB_Mark_Enclosing); - return FLAG(HB_GetUnicodeCharCategory(ucs)) & test; -} - -enum Form { - Invalid = 0x0, - UnknownForm = Invalid, - Consonant, - Nukta, - Halant, - Matra, - VowelMark, - StressMark, - IndependentVowel, - LengthMark, - Control, - Other -}; - -static const unsigned char indicForms[0xe00-0x900] = { - // Devangari - Invalid, VowelMark, VowelMark, VowelMark, - IndependentVowel, IndependentVowel, IndependentVowel, IndependentVowel, - IndependentVowel, IndependentVowel, IndependentVowel, IndependentVowel, - IndependentVowel, IndependentVowel, IndependentVowel, IndependentVowel, - - IndependentVowel, IndependentVowel, IndependentVowel, IndependentVowel, - IndependentVowel, Consonant, Consonant, Consonant, - Consonant, Consonant, Consonant, Consonant, - Consonant, Consonant, Consonant, Consonant, - - Consonant, Consonant, Consonant, Consonant, - Consonant, Consonant, Consonant, Consonant, - Consonant, Consonant, Consonant, Consonant, - Consonant, Consonant, Consonant, Consonant, - - Consonant, Consonant, Consonant, Consonant, - Consonant, Consonant, Consonant, Consonant, - Consonant, Consonant, UnknownForm, UnknownForm, - Nukta, Other, Matra, Matra, - - Matra, Matra, Matra, Matra, - Matra, Matra, Matra, Matra, - Matra, Matra, Matra, Matra, - Matra, Halant, UnknownForm, UnknownForm, - - Other, StressMark, StressMark, StressMark, - StressMark, UnknownForm, UnknownForm, UnknownForm, - Consonant, Consonant, Consonant, Consonant, - Consonant, Consonant, Consonant, Consonant, - - IndependentVowel, IndependentVowel, VowelMark, VowelMark, - Other, Other, Other, Other, - Other, Other, Other, Other, - Other, Other, Other, Other, - - Other, Other, Other, Other, - Other, Other, Other, Other, - Other, Other, Other, Consonant, - Consonant, Consonant /* ??? */, Consonant, Consonant, - - // Bengali - Invalid, VowelMark, VowelMark, VowelMark, - Invalid, IndependentVowel, IndependentVowel, IndependentVowel, - IndependentVowel, IndependentVowel, IndependentVowel, IndependentVowel, - IndependentVowel, Invalid, Invalid, IndependentVowel, - - IndependentVowel, Invalid, Invalid, IndependentVowel, - IndependentVowel, Consonant, Consonant, Consonant, - Consonant, Consonant, Consonant, Consonant, - Consonant, Consonant, Consonant, Consonant, - - Consonant, Consonant, Consonant, Consonant, - Consonant, Consonant, Consonant, Consonant, - Consonant, Invalid, Consonant, Consonant, - Consonant, Consonant, Consonant, Consonant, - - Consonant, Invalid, Consonant, Invalid, - Invalid, Invalid, Consonant, Consonant, - Consonant, Consonant, UnknownForm, UnknownForm, - Nukta, Other, Matra, Matra, - - Matra, Matra, Matra, Matra, - Matra, Invalid, Invalid, Matra, - Matra, Invalid, Invalid, Matra, - Matra, Halant, Consonant, UnknownForm, - - Invalid, Invalid, Invalid, Invalid, - Invalid, Invalid, Invalid, VowelMark, - Invalid, Invalid, Invalid, Invalid, - Consonant, Consonant, Invalid, Consonant, - - IndependentVowel, IndependentVowel, VowelMark, VowelMark, - Other, Other, Other, Other, - Other, Other, Other, Other, - Other, Other, Other, Other, - - Consonant, Consonant, Other, Other, - Other, Other, Other, Other, - Other, Other, Other, Other, - Other, Other, Other, Other, - - // Gurmukhi - Invalid, VowelMark, VowelMark, VowelMark, - Invalid, IndependentVowel, IndependentVowel, IndependentVowel, - IndependentVowel, IndependentVowel, IndependentVowel, Invalid, - Invalid, Invalid, Invalid, IndependentVowel, - - IndependentVowel, Invalid, Invalid, IndependentVowel, - IndependentVowel, Consonant, Consonant, Consonant, - Consonant, Consonant, Consonant, Consonant, - Consonant, Consonant, Consonant, Consonant, - - Consonant, Consonant, Consonant, Consonant, - Consonant, Consonant, Consonant, Consonant, - Consonant, Invalid, Consonant, Consonant, - Consonant, Consonant, Consonant, Consonant, - - Consonant, Invalid, Consonant, Consonant, - Invalid, Consonant, Consonant, Invalid, - Consonant, Consonant, UnknownForm, UnknownForm, - Nukta, Other, Matra, Matra, - - Matra, Matra, Matra, Invalid, - Invalid, Invalid, Invalid, Matra, - Matra, Invalid, Invalid, Matra, - Matra, Halant, UnknownForm, UnknownForm, - - Invalid, Invalid, Invalid, Invalid, - Invalid, UnknownForm, UnknownForm, UnknownForm, - Invalid, Consonant, Consonant, Consonant, - Consonant, Invalid, Consonant, Invalid, - - Other, Other, Invalid, Invalid, - Other, Other, Other, Other, - Other, Other, Other, Other, - Other, Other, Other, Other, - - StressMark, StressMark, Consonant, Consonant, - Other, Other, Other, Other, - Other, Other, Other, Other, - Other, Other, Other, Other, - - // Gujarati - Invalid, VowelMark, VowelMark, VowelMark, - Invalid, IndependentVowel, IndependentVowel, IndependentVowel, - IndependentVowel, IndependentVowel, IndependentVowel, IndependentVowel, - IndependentVowel, IndependentVowel, Invalid, IndependentVowel, - - IndependentVowel, IndependentVowel, Invalid, IndependentVowel, - IndependentVowel, Consonant, Consonant, Consonant, - Consonant, Consonant, Consonant, Consonant, - Consonant, Consonant, Consonant, Consonant, - - Consonant, Consonant, Consonant, Consonant, - Consonant, Consonant, Consonant, Consonant, - Consonant, Invalid, Consonant, Consonant, - Consonant, Consonant, Consonant, Consonant, - - Consonant, Invalid, Consonant, Consonant, - Invalid, Consonant, Consonant, Consonant, - Consonant, Consonant, UnknownForm, UnknownForm, - Nukta, Other, Matra, Matra, - - Matra, Matra, Matra, Matra, - Matra, Matra, Invalid, Matra, - Matra, Matra, Invalid, Matra, - Matra, Halant, UnknownForm, UnknownForm, - - Other, UnknownForm, UnknownForm, UnknownForm, - UnknownForm, UnknownForm, UnknownForm, UnknownForm, - UnknownForm, UnknownForm, UnknownForm, UnknownForm, - UnknownForm, UnknownForm, UnknownForm, UnknownForm, - - IndependentVowel, IndependentVowel, VowelMark, VowelMark, - Other, Other, Other, Other, - Other, Other, Other, Other, - Other, Other, Other, Other, - - Other, Other, Other, Other, - Other, Other, Other, Other, - Other, Other, Other, Other, - Other, Other, Other, Other, - - // Oriya - Invalid, VowelMark, VowelMark, VowelMark, - Invalid, IndependentVowel, IndependentVowel, IndependentVowel, - IndependentVowel, IndependentVowel, IndependentVowel, IndependentVowel, - IndependentVowel, Invalid, Invalid, IndependentVowel, - - IndependentVowel, Invalid, Invalid, IndependentVowel, - IndependentVowel, Consonant, Consonant, Consonant, - Consonant, Consonant, Consonant, Consonant, - Consonant, Consonant, Consonant, Consonant, - - Consonant, Consonant, Consonant, Consonant, - Consonant, Consonant, Consonant, Consonant, - Consonant, Invalid, Consonant, Consonant, - Consonant, Consonant, Consonant, Consonant, - - Consonant, Invalid, Consonant, Consonant, - Invalid, Consonant, Consonant, Consonant, - Consonant, Consonant, UnknownForm, UnknownForm, - Nukta, Other, Matra, Matra, - - Matra, Matra, Matra, Matra, - Invalid, Invalid, Invalid, Matra, - Matra, Invalid, Invalid, Matra, - Matra, Halant, UnknownForm, UnknownForm, - - Other, Invalid, Invalid, Invalid, - Invalid, UnknownForm, LengthMark, LengthMark, - Invalid, Invalid, Invalid, Invalid, - Consonant, Consonant, Invalid, Consonant, - - IndependentVowel, IndependentVowel, Invalid, Invalid, - Invalid, Invalid, Other, Other, - Other, Other, Other, Other, - Other, Other, Other, Other, - - Other, Consonant, Other, Other, - Other, Other, Other, Other, - Other, Other, Other, Other, - Other, Other, Other, Other, - - //Tamil - Invalid, Invalid, VowelMark, Other, - Invalid, IndependentVowel, IndependentVowel, IndependentVowel, - IndependentVowel, IndependentVowel, IndependentVowel, Invalid, - Invalid, Invalid, IndependentVowel, IndependentVowel, - - IndependentVowel, Invalid, IndependentVowel, IndependentVowel, - IndependentVowel, Consonant, Invalid, Invalid, - Invalid, Consonant, Consonant, Invalid, - Consonant, Invalid, Consonant, Consonant, - - Invalid, Invalid, Invalid, Consonant, - Consonant, Invalid, Invalid, Invalid, - Consonant, Consonant, Consonant, Invalid, - Invalid, Invalid, Consonant, Consonant, - - Consonant, Consonant, Consonant, Consonant, - Consonant, Consonant, Consonant, Consonant, - Consonant, Consonant, UnknownForm, UnknownForm, - Invalid, Invalid, Matra, Matra, - - Matra, Matra, Matra, Invalid, - Invalid, Invalid, Matra, Matra, - Matra, Invalid, Matra, Matra, - Matra, Halant, Invalid, Invalid, - - Invalid, Invalid, Invalid, Invalid, - Invalid, Invalid, Invalid, LengthMark, - Invalid, Invalid, Invalid, Invalid, - Invalid, Invalid, Invalid, Invalid, - - Invalid, Invalid, Invalid, Invalid, - Invalid, Invalid, Other, Other, - Other, Other, Other, Other, - Other, Other, Other, Other, - - Other, Other, Other, Other, - Other, Other, Other, Other, - Other, Other, Other, Other, - Other, Other, Other, Other, - - // Telugu - Invalid, VowelMark, VowelMark, VowelMark, - Invalid, IndependentVowel, IndependentVowel, IndependentVowel, - IndependentVowel, IndependentVowel, IndependentVowel, IndependentVowel, - IndependentVowel, Invalid, IndependentVowel, IndependentVowel, - - IndependentVowel, Invalid, IndependentVowel, IndependentVowel, - IndependentVowel, Consonant, Consonant, Consonant, - Consonant, Consonant, Consonant, Consonant, - Consonant, Consonant, Consonant, Consonant, - - Consonant, Consonant, Consonant, Consonant, - Consonant, Consonant, Consonant, Consonant, - Consonant, Invalid, Consonant, Consonant, - Consonant, Consonant, Consonant, Consonant, - - Consonant, Consonant, Consonant, Consonant, - Invalid, Consonant, Consonant, Consonant, - Consonant, Consonant, UnknownForm, UnknownForm, - Invalid, Invalid, Matra, Matra, - - Matra, Matra, Matra, Matra, - Matra, Invalid, Matra, Matra, - Matra, Invalid, Matra, Matra, - Matra, Halant, Invalid, Invalid, - - Invalid, Invalid, Invalid, Invalid, - Invalid, LengthMark, Matra, Invalid, - Invalid, Invalid, Invalid, Invalid, - Invalid, Invalid, Invalid, Invalid, - - IndependentVowel, IndependentVowel, Invalid, Invalid, - Invalid, Invalid, Other, Other, - Other, Other, Other, Other, - Other, Other, Other, Other, - - Other, Other, Other, Other, - Other, Other, Other, Other, - Other, Other, Other, Other, - Other, Other, Other, Other, - - // Kannada - Invalid, Invalid, VowelMark, VowelMark, - Invalid, IndependentVowel, IndependentVowel, IndependentVowel, - IndependentVowel, IndependentVowel, IndependentVowel, IndependentVowel, - IndependentVowel, Invalid, IndependentVowel, IndependentVowel, - - IndependentVowel, Invalid, IndependentVowel, IndependentVowel, - IndependentVowel, Consonant, Consonant, Consonant, - Consonant, Consonant, Consonant, Consonant, - Consonant, Consonant, Consonant, Consonant, - - Consonant, Consonant, Consonant, Consonant, - Consonant, Consonant, Consonant, Consonant, - Consonant, Invalid, Consonant, Consonant, - Consonant, Consonant, Consonant, Consonant, - - Consonant, Consonant, Consonant, Consonant, - Invalid, Consonant, Consonant, Consonant, - Consonant, Consonant, UnknownForm, UnknownForm, - Nukta, Other, Matra, Matra, - - Matra, Matra, Matra, Matra, - Matra, Invalid, Matra, Matra, - Matra, Invalid, Matra, Matra, - Matra, Halant, Invalid, Invalid, - - Invalid, Invalid, Invalid, Invalid, - Invalid, LengthMark, LengthMark, Invalid, - Invalid, Invalid, Invalid, Invalid, - Invalid, Invalid, Consonant, Invalid, - - IndependentVowel, IndependentVowel, VowelMark, VowelMark, - Invalid, Invalid, Other, Other, - Other, Other, Other, Other, - Other, Other, Other, Other, - - Other, Other, Other, Other, - Other, Other, Other, Other, - Other, Other, Other, Other, - Other, Other, Other, Other, - - // Malayalam - Invalid, Invalid, VowelMark, VowelMark, - Invalid, IndependentVowel, IndependentVowel, IndependentVowel, - IndependentVowel, IndependentVowel, IndependentVowel, IndependentVowel, - IndependentVowel, Invalid, IndependentVowel, IndependentVowel, - - IndependentVowel, Invalid, IndependentVowel, IndependentVowel, - IndependentVowel, Consonant, Consonant, Consonant, - Consonant, Consonant, Consonant, Consonant, - Consonant, Consonant, Consonant, Consonant, - - Consonant, Consonant, Consonant, Consonant, - Consonant, Consonant, Consonant, Consonant, - Consonant, Invalid, Consonant, Consonant, - Consonant, Consonant, Consonant, Consonant, - - Consonant, Consonant, Consonant, Consonant, - Consonant, Consonant, Consonant, Consonant, - Consonant, Consonant, UnknownForm, UnknownForm, - Invalid, Invalid, Matra, Matra, - - Matra, Matra, Matra, Matra, - Invalid, Invalid, Matra, Matra, - Matra, Invalid, Matra, Matra, - Matra, Halant, Invalid, Invalid, - - Invalid, Invalid, Invalid, Invalid, - Invalid, Invalid, Invalid, Matra, - Invalid, Invalid, Invalid, Invalid, - Invalid, Invalid, Invalid, Invalid, - - IndependentVowel, IndependentVowel, Invalid, Invalid, - Invalid, Invalid, Other, Other, - Other, Other, Other, Other, - Other, Other, Other, Other, - - Other, Other, Other, Other, - Other, Other, Other, Other, - Other, Other, Other, Other, - Other, Other, Other, Other, - - // Sinhala - Invalid, Invalid, VowelMark, VowelMark, - Invalid, IndependentVowel, IndependentVowel, IndependentVowel, - IndependentVowel, IndependentVowel, IndependentVowel, IndependentVowel, - IndependentVowel, IndependentVowel, IndependentVowel, IndependentVowel, - - IndependentVowel, IndependentVowel, IndependentVowel, IndependentVowel, - IndependentVowel, IndependentVowel, IndependentVowel, Invalid, - Invalid, Invalid, Consonant, Consonant, - Consonant, Consonant, Consonant, Consonant, - - Consonant, Consonant, Consonant, Consonant, - Consonant, Consonant, Consonant, Consonant, - Consonant, Consonant, Consonant, Consonant, - Consonant, Consonant, Consonant, Consonant, - - Consonant, Consonant, Invalid, Consonant, - Consonant, Consonant, Consonant, Consonant, - Consonant, Consonant, Consonant, Consonant, - Invalid, Consonant, Invalid, Invalid, - - Consonant, Consonant, Consonant, Consonant, - Consonant, Consonant, Consonant, Invalid, - Invalid, Invalid, Halant, Invalid, - Invalid, Invalid, Invalid, Matra, - - Matra, Matra, Matra, Matra, - Matra, Invalid, Matra, Invalid, - Matra, Matra, Matra, Matra, - Matra, Matra, Matra, Matra, - - Invalid, Invalid, Invalid, Invalid, - Invalid, Invalid, Invalid, Invalid, - Invalid, Invalid, Invalid, Invalid, - Invalid, Invalid, Invalid, Invalid, - - Invalid, Invalid, Matra, Matra, - Other, Other, Other, Other, - Other, Other, Other, Other, - Other, Other, Other, Other, -}; - -enum Position { - None, - Pre, - Above, - Below, - Post, - Split, - Base, - Reph, - Vattu, - Inherit -}; - -static const unsigned char indicPosition[0xe00-0x900] = { - // Devanagari - None, Above, Above, Post, - None, None, None, None, - None, None, None, None, - None, None, None, None, - - None, None, None, None, - None, None, None, None, - None, None, None, None, - None, None, None, None, - - None, None, None, None, - None, None, None, None, - None, None, None, None, - None, None, None, None, - - Below, None, None, None, - None, None, None, None, - None, None, None, None, - None, None, Post, Pre, - - Post, Below, Below, Below, - Below, Above, Above, Above, - Above, Post, Post, Post, - Post, None, None, None, - - None, Above, Below, Above, - Above, None, None, None, - None, None, None, None, - None, None, None, None, - - None, None, Below, Below, - None, None, None, None, - None, None, None, None, - None, None, None, None, - - None, None, None, None, - None, None, None, None, - None, None, None, None, - None, None, None, None, - - // Bengali - None, Above, Post, Post, - None, None, None, None, - None, None, None, None, - None, None, None, None, - - None, None, None, None, - None, None, None, None, - None, None, None, None, - None, None, None, None, - - None, None, None, None, - None, None, None, None, - None, None, None, None, - Below, None, None, Post, - - Below, None, None, None, - None, None, None, None, - None, None, None, None, - Below, None, Post, Pre, - - Post, Below, Below, Below, - Below, None, None, Pre, - Pre, None, None, Split, - Split, Below, None, None, - - None, None, None, None, - None, None, None, Post, - None, None, None, None, - None, None, None, None, - - None, None, Below, Below, - None, None, None, None, - None, None, None, None, - None, None, None, None, - - Below, None, None, None, - None, None, None, None, - None, None, None, None, - None, None, None, None, - - // Gurmukhi - None, Above, Above, Post, - None, None, None, None, - None, None, None, None, - None, None, None, None, - - None, None, None, None, - None, None, None, None, - None, None, None, None, - None, None, None, None, - - None, None, None, None, - None, None, None, None, - None, None, None, None, - None, None, None, Post, - - Below, None, None, None, - None, Below, None, None, - None, Below, None, None, - Below, None, Post, Pre, - - Post, Below, Below, None, - None, None, None, Above, - Above, None, None, Above, - Above, None, None, None, - - None, None, None, None, - None, None, None, None, - None, None, None, None, - None, None, None, None, - - None, None, None, None, - None, None, None, None, - None, None, None, None, - None, None, None, None, - - Above, Above, None, None, - None, None, None, None, - None, None, None, None, - None, None, None, None, - - // Gujarati - None, Above, Above, Post, - None, None, None, None, - None, None, None, None, - None, None, None, None, - - None, None, None, None, - None, None, None, None, - None, None, None, None, - None, None, None, None, - - None, None, None, None, - None, None, None, None, - None, None, None, None, - None, None, None, None, - - Below, None, None, None, - None, None, None, None, - None, None, None, None, - None, None, Post, Pre, - - Post, Below, Below, Below, - Below, Above, None, Above, - Above, Post, None, Post, - Post, None, None, None, - - None, None, None, None, - None, None, None, None, - None, None, None, None, - None, None, None, None, - - None, None, Below, Below, - None, None, None, None, - None, None, None, None, - None, None, None, None, - - None, None, None, None, - None, None, None, None, - None, None, None, None, - None, None, None, None, - - // Oriya - None, Above, Post, Post, - None, None, None, None, - None, None, None, None, - None, None, None, None, - - None, None, None, None, - None, None, None, None, - None, None, None, None, - None, None, None, None, - - None, None, None, None, - Below, None, None, None, - Below, None, None, None, - Below, Below, Below, Post, - - Below, None, Below, Below, - None, None, None, None, - None, None, None, None, - None, None, Post, Above, - - Post, Below, Below, Below, - None, None, None, Pre, - Split, None, None, Split, - Split, None, None, None, - - None, None, None, None, - None, None, Above, Post, - None, None, None, None, - None, None, None, Post, - - None, None, None, None, - None, None, None, None, - None, None, None, None, - None, None, None, None, - - None, Below, None, None, - None, None, None, None, - None, None, None, None, - None, None, None, None, - - // Tamil - None, None, Above, None, - None, None, None, None, - None, None, None, None, - None, None, None, None, - - None, None, None, None, - None, None, None, None, - None, None, None, None, - None, None, None, None, - - None, None, None, None, - None, None, None, None, - None, None, None, None, - None, None, None, None, - - None, None, None, None, - None, None, None, None, - None, None, None, None, - None, None, Post, Post, - - Above, Below, Below, None, - None, None, Pre, Pre, - Pre, None, Split, Split, - Split, Halant, None, None, - - None, None, None, None, - None, None, None, Post, - None, None, None, None, - None, None, None, None, - - None, None, None, None, - None, None, None, None, - None, None, None, None, - None, None, None, None, - - None, None, None, None, - None, None, None, None, - None, None, None, None, - None, None, None, None, - - // Telugu - None, Post, Post, Post, - None, None, None, None, - None, None, None, None, - None, None, None, None, - - None, None, None, None, - None, Below, Below, Below, - Below, Below, Below, Below, - Below, Below, Below, Below, - - Below, Below, Below, Below, - Below, Below, Below, Below, - Below, None, Below, Below, - Below, Below, Below, Below, - - Below, None, Below, Below, - None, Below, Below, Below, - Below, Below, None, None, - None, None, Post, Above, - - Above, Post, Post, Post, - Post, None, Above, Above, - Split, None, Post, Above, - Above, Halant, None, None, - - None, None, None, None, - None, Above, Below, None, - None, None, None, None, - None, None, None, None, - - None, None, None, None, - None, None, None, None, - None, None, None, None, - None, None, None, None, - - None, None, None, None, - None, None, None, None, - None, None, None, None, - None, None, None, None, - - // Kannada - None, None, Post, Post, - None, None, None, None, - None, None, None, None, - None, None, None, None, - - None, None, None, None, - None, Below, Below, Below, - Below, Below, Below, Below, - Below, Below, Below, Below, - - Below, Below, Below, Below, - Below, Below, Below, Below, - Below, Below, Below, Below, - Below, Below, Below, Below, - - Below, None, Below, Below, - None, Below, Below, Below, - Below, Below, None, None, - None, None, Post, Above, - - Split, Post, Post, Post, - Post, None, Above, Split, - Split, None, Split, Split, - Above, Halant, None, None, - - None, None, None, None, - None, Post, Post, None, - None, None, None, None, - None, None, Below, None, - - None, None, Below, Below, - None, None, None, None, - None, None, None, None, - None, None, None, None, - - None, None, None, None, - None, None, None, None, - None, None, None, None, - None, None, None, None, - - // Malayalam - None, None, Post, Post, - None, None, None, None, - None, None, None, None, - None, None, None, None, - - None, None, None, None, - None, None, None, None, - None, None, None, None, - None, None, None, None, - - None, None, None, None, - None, None, None, None, - None, None, None, None, - None, None, None, Post, - - Post, None, Below, None, - None, Post, None, None, - None, None, None, None, - None, None, Post, Post, - - Post, Post, Post, Post, - None, None, Pre, Pre, - Pre, None, Split, Split, - Split, Halant, None, None, - - None, None, None, None, - None, None, None, Post, - None, None, None, None, - None, None, None, None, - - None, None, None, None, - None, None, None, None, - None, None, None, None, - None, None, None, None, - - None, None, None, None, - None, None, None, None, - None, None, None, None, - None, None, None, None, - - // Sinhala - None, None, Post, Post, - None, None, None, None, - None, None, None, None, - None, None, None, None, - - None, None, None, None, - None, None, None, None, - None, None, None, None, - None, None, None, None, - - None, None, None, None, - None, None, None, None, - None, None, None, None, - None, None, None, None, - - None, None, None, None, - None, None, None, None, - None, None, None, None, - None, None, None, None, - - None, None, None, None, - None, None, None, None, - None, None, None, None, - None, None, None, Post, - - Post, Post, Above, Above, - Below, None, Below, None, - Post, Pre, Split, Pre, - Split, Split, Split, Post, - - None, None, None, None, - None, None, None, None, - None, None, None, None, - None, None, None, None, - - None, None, Post, Post, - None, None, None, None, - None, None, None, None, - None, None, None, None -}; - -static inline Form form(unsigned short uc) { - if (uc < 0x900 || uc > 0xdff) { - if (uc == 0x25cc) - return Consonant; - if (uc == 0x200c || uc == 0x200d) - return Control; - return Other; - } - return (Form)indicForms[uc-0x900]; -} - -static inline Position indic_position(unsigned short uc) { - if (uc < 0x900 || uc > 0xdff) - return None; - return (Position) indicPosition[uc-0x900]; -} - - -enum IndicScriptProperties { - HasReph = 0x01, - HasSplit = 0x02 -}; - -const hb_uint8 scriptProperties[10] = { - // Devanagari, - HasReph, - // Bengali, - HasReph|HasSplit, - // Gurmukhi, - 0, - // Gujarati, - HasReph, - // Oriya, - HasReph|HasSplit, - // Tamil, - HasSplit, - // Telugu, - HasSplit, - // Kannada, - HasSplit|HasReph, - // Malayalam, - HasSplit, - // Sinhala, - HasSplit -}; - -struct IndicOrdering { - Form form; - Position position; -}; - -static const IndicOrdering devanagari_order [] = { - { Consonant, Below }, - { Matra, Below }, - { VowelMark, Below }, - { StressMark, Below }, - { Matra, Above }, - { Matra, Post }, - { Consonant, Reph }, - { VowelMark, Above }, - { StressMark, Above }, - { VowelMark, Post }, - { (Form)0, None } -}; - -static const IndicOrdering bengali_order [] = { - { Consonant, Below }, - { Matra, Below }, - { Matra, Above }, - { Consonant, Reph }, - { VowelMark, Above }, - { Consonant, Post }, - { Matra, Post }, - { VowelMark, Post }, - { (Form)0, None } -}; - -static const IndicOrdering gurmukhi_order [] = { - { Consonant, Below }, - { Matra, Below }, - { Matra, Above }, - { Consonant, Post }, - { Matra, Post }, - { VowelMark, Above }, - { (Form)0, None } -}; - -static const IndicOrdering tamil_order [] = { - { Matra, Above }, - { Matra, Post }, - { VowelMark, Post }, - { (Form)0, None } -}; - -static const IndicOrdering telugu_order [] = { - { Matra, Above }, - { Matra, Below }, - { Matra, Post }, - { Consonant, Below }, - { Consonant, Post }, - { VowelMark, Post }, - { (Form)0, None } -}; - -static const IndicOrdering kannada_order [] = { - { Matra, Above }, - { Matra, Post }, - { Consonant, Below }, - { Consonant, Post }, - { LengthMark, Post }, - { Consonant, Reph }, - { VowelMark, Post }, - { (Form)0, None } -}; - -static const IndicOrdering malayalam_order [] = { - { Consonant, Below }, - { Matra, Below }, - { Consonant, Reph }, - { Consonant, Post }, - { Matra, Post }, - { VowelMark, Post }, - { (Form)0, None } -}; - -static const IndicOrdering sinhala_order [] = { - { Matra, Below }, - { Matra, Above }, - { Matra, Post }, - { VowelMark, Post }, - { (Form)0, None } -}; - -static const IndicOrdering * const indic_order[] = { - devanagari_order, // Devanagari - bengali_order, // Bengali - gurmukhi_order, // Gurmukhi - devanagari_order, // Gujarati - bengali_order, // Oriya - tamil_order, // Tamil - telugu_order, // Telugu - kannada_order, // Kannada - malayalam_order, // Malayalam - sinhala_order // Sinhala -}; - - - -// vowel matras that have to be split into two parts. -static const unsigned short split_matras[] = { - // matra, split1, split2, split3 - - // bengalis - 0x9cb, 0x9c7, 0x9be, 0x0, - 0x9cc, 0x9c7, 0x9d7, 0x0, - // oriya - 0xb48, 0xb47, 0xb56, 0x0, - 0xb4b, 0xb47, 0xb3e, 0x0, - 0xb4c, 0xb47, 0xb57, 0x0, - // tamil - 0xbca, 0xbc6, 0xbbe, 0x0, - 0xbcb, 0xbc7, 0xbbe, 0x0, - 0xbcc, 0xbc6, 0xbd7, 0x0, - // telugu - 0xc48, 0xc46, 0xc56, 0x0, - // kannada - 0xcc0, 0xcbf, 0xcd5, 0x0, - 0xcc7, 0xcc6, 0xcd5, 0x0, - 0xcc8, 0xcc6, 0xcd6, 0x0, - 0xcca, 0xcc6, 0xcc2, 0x0, - 0xccb, 0xcc6, 0xcc2, 0xcd5, - // malayalam - 0xd4a, 0xd46, 0xd3e, 0x0, - 0xd4b, 0xd47, 0xd3e, 0x0, - 0xd4c, 0xd46, 0xd57, 0x0, - // sinhala - 0xdda, 0xdd9, 0xdca, 0x0, - 0xddc, 0xdd9, 0xdcf, 0x0, - 0xddd, 0xdd9, 0xdcf, 0xdca, - 0xdde, 0xdd9, 0xddf, 0x0, - 0xffff -}; - -static inline void splitMatra(unsigned short *reordered, int matra, int &len) -{ - unsigned short matra_uc = reordered[matra]; - //qDebug("matra=%d, reordered[matra]=%x", matra, reordered[matra]); - - const unsigned short *split = split_matras; - while (split[0] < matra_uc) - split += 4; - - assert(*split == matra_uc); - ++split; - - int added_chars = split[2] == 0x0 ? 1 : 2; - - memmove(reordered + matra + added_chars, reordered + matra, (len-matra)*sizeof(unsigned short)); - reordered[matra] = split[0]; - reordered[matra+1] = split[1]; - if(added_chars == 2) - reordered[matra+2] = split[2]; - len += added_chars; -} - -#ifndef NO_OPENTYPE -static const HB_OpenTypeFeature indic_features[] = { - { HB_MAKE_TAG('c', 'c', 'm', 'p'), CcmpProperty }, - { HB_MAKE_TAG('i', 'n', 'i', 't'), InitProperty }, - { HB_MAKE_TAG('n', 'u', 'k', 't'), NuktaProperty }, - { HB_MAKE_TAG('a', 'k', 'h', 'n'), AkhantProperty }, - { HB_MAKE_TAG('r', 'p', 'h', 'f'), RephProperty }, - { HB_MAKE_TAG('b', 'l', 'w', 'f'), BelowFormProperty }, - { HB_MAKE_TAG('h', 'a', 'l', 'f'), HalfFormProperty }, - { HB_MAKE_TAG('p', 's', 't', 'f'), PostFormProperty }, - { HB_MAKE_TAG('v', 'a', 't', 'u'), VattuProperty }, - { HB_MAKE_TAG('p', 'r', 'e', 's'), PreSubstProperty }, - { HB_MAKE_TAG('b', 'l', 'w', 's'), BelowSubstProperty }, - { HB_MAKE_TAG('a', 'b', 'v', 's'), AboveSubstProperty }, - { HB_MAKE_TAG('p', 's', 't', 's'), PostSubstProperty }, - { HB_MAKE_TAG('h', 'a', 'l', 'n'), HalantProperty }, - { 0, 0 } -}; -#endif - -// #define INDIC_DEBUG -#ifdef INDIC_DEBUG -#define IDEBUG hb_debug -#include - -static void hb_debug(const char *msg, ...) -{ - va_list ap; - va_start(ap, msg); // use variable arg list - vfprintf(stderr, msg, ap); - va_end(ap); - fprintf(stderr, "\n"); -} - -#else -#define IDEBUG if(0) printf -#endif - -#if 0 //def INDIC_DEBUG -static QString propertiesToString(int properties) -{ - QString res; - properties = ~properties; - if (properties & CcmpProperty) - res += "Ccmp "; - if (properties & InitProperty) - res += "Init "; - if (properties & NuktaProperty) - res += "Nukta "; - if (properties & AkhantProperty) - res += "Akhant "; - if (properties & RephProperty) - res += "Reph "; - if (properties & PreFormProperty) - res += "PreForm "; - if (properties & BelowFormProperty) - res += "BelowForm "; - if (properties & AboveFormProperty) - res += "AboveForm "; - if (properties & HalfFormProperty) - res += "HalfForm "; - if (properties & PostFormProperty) - res += "PostForm "; - if (properties & VattuProperty) - res += "Vattu "; - if (properties & PreSubstProperty) - res += "PreSubst "; - if (properties & BelowSubstProperty) - res += "BelowSubst "; - if (properties & AboveSubstProperty) - res += "AboveSubst "; - if (properties & PostSubstProperty) - res += "PostSubst "; - if (properties & HalantProperty) - res += "Halant "; - if (properties & CligProperty) - res += "Clig "; - return res; -} -#endif - -static bool indic_shape_syllable(HB_Bool openType, HB_ShaperItem *item, bool invalid) -{ - HB_Script script = item->item.script; - assert(script >= HB_Script_Devanagari && script <= HB_Script_Sinhala); - const unsigned short script_base = 0x0900 + 0x80*(script-HB_Script_Devanagari); - const unsigned short ra = script_base + 0x30; - const unsigned short halant = script_base + 0x4d; - const unsigned short nukta = script_base + 0x3c; - bool control = false; - - int len = (int)item->item.length; - IDEBUG(">>>>> indic shape: from=%d, len=%d invalid=%d", item->item.pos, item->item.length, invalid); - - if ((int)item->num_glyphs < len+4) { - item->num_glyphs = len+4; - return false; - } - - HB_STACKARRAY(HB_UChar16, reordered, len + 4); - HB_STACKARRAY(hb_uint8, position, len + 4); - - unsigned char properties = scriptProperties[script-HB_Script_Devanagari]; - - if (invalid) { - *reordered = 0x25cc; - memcpy(reordered+1, item->string + item->item.pos, len*sizeof(HB_UChar16)); - len++; - } else { - memcpy(reordered, item->string + item->item.pos, len*sizeof(HB_UChar16)); - } - if (reordered[len-1] == 0x200c) // zero width non joiner - len--; - - int i; - int base = 0; - int reph = -1; - -#ifdef INDIC_DEBUG - IDEBUG("original:"); - for (i = 0; i < len; i++) { - IDEBUG(" %d: %4x", i, reordered[i]); - } -#endif - - if (len != 1) { - HB_UChar16 *uc = reordered; - bool beginsWithRa = false; - - // Rule 1: find base consonant - // - // The shaping engine finds the base consonant of the - // syllable, using the following algorithm: starting from the - // end of the syllable, move backwards until a consonant is - // found that does not have a below-base or post-base form - // (post-base forms have to follow below-base forms), or - // arrive at the first consonant. The consonant stopped at - // will be the base. - // - // * If the syllable starts with Ra + H (in a script that has - // 'Reph'), Ra is excluded from candidates for base - // consonants. - // - // * In Kannada and Telugu, the base consonant cannot be - // farther than 3 consonants from the end of the syllable. - // #### replace the HasReph property by testing if the feature exists in the font! - if (form(*uc) == Consonant || (script == HB_Script_Bengali && form(*uc) == IndependentVowel)) { - if ((properties & HasReph) && (len > 2) && - (*uc == ra || *uc == 0x9f0) && *(uc+1) == halant) - beginsWithRa = true; - - if (beginsWithRa && form(*(uc+2)) == Control) - beginsWithRa = false; - - base = (beginsWithRa ? 2 : 0); - IDEBUG(" length = %d, beginsWithRa = %d, base=%d", len, beginsWithRa, base); - - int lastConsonant = 0; - int matra = -1; - // we remember: - // * the last consonant since we need it for rule 2 - // * the matras position for rule 3 and 4 - - // figure out possible base glyphs - memset(position, 0, len); - if (script == HB_Script_Devanagari || script == HB_Script_Gujarati) { - bool vattu = false; - for (i = base; i < len; ++i) { - position[i] = form(uc[i]); - if (position[i] == Consonant) { - lastConsonant = i; - vattu = (!vattu && uc[i] == ra); - if (vattu) { - IDEBUG("excluding vattu glyph at %d from base candidates", i); - position[i] = Vattu; - } - } else if (position[i] == Matra) { - matra = i; - } - } - } else { - for (i = base; i < len; ++i) { - position[i] = form(uc[i]); - if (position[i] == Consonant) - lastConsonant = i; - else if (matra < 0 && position[i] == Matra) - matra = i; - } - } - int skipped = 0; - Position pos = Post; - for (i = len-1; i > base; i--) { - if (position[i] != Consonant && (position[i] != Control || script == HB_Script_Kannada)) - continue; - - Position charPosition = indic_position(uc[i]); - if (pos == Post && charPosition == Post) { - pos = Post; - } else if ((pos == Post || pos == Below) && charPosition == Below) { - if (script == HB_Script_Devanagari || script == HB_Script_Gujarati) - base = i; - pos = Below; - } else { - base = i; - break; - } - if (skipped == 2 && (script == HB_Script_Kannada || script == HB_Script_Telugu)) { - base = i; - break; - } - ++skipped; - } - - IDEBUG(" base consonant at %d skipped=%d, lastConsonant=%d", base, skipped, lastConsonant); - - // Rule 2: - // - // If the base consonant is not the last one, Uniscribe - // moves the halant from the base consonant to the last - // one. - if (lastConsonant > base) { - int halantPos = 0; - if (uc[base+1] == halant) - halantPos = base + 1; - else if (uc[base+1] == nukta && uc[base+2] == halant) - halantPos = base + 2; - if (halantPos > 0) { - IDEBUG(" moving halant from %d to %d!", base+1, lastConsonant); - for (i = halantPos; i < lastConsonant; i++) - uc[i] = uc[i+1]; - uc[lastConsonant] = halant; - } - } - - // Rule 3: - // - // If the syllable starts with Ra + H, Uniscribe moves - // this combination so that it follows either: - - // * the post-base 'matra' (if any) or the base consonant - // (in scripts that show similarity to Devanagari, i.e., - // Devanagari, Gujarati, Bengali) - // * the base consonant (other scripts) - // * the end of the syllable (Kannada) - - Position matra_position = None; - if (matra > 0) - matra_position = indic_position(uc[matra]); - IDEBUG(" matra at %d with form %d, base=%d", matra, matra_position, base); - - if (beginsWithRa && base != 0) { - int toPos = base+1; - if (toPos < len && uc[toPos] == nukta) - toPos++; - if (toPos < len && uc[toPos] == halant) - toPos++; - if (toPos < len && uc[toPos] == 0x200d) - toPos++; - if (toPos < len-1 && uc[toPos] == ra && uc[toPos+1] == halant) - toPos += 2; - if (script == HB_Script_Devanagari || script == HB_Script_Gujarati || script == HB_Script_Bengali) { - if (matra_position == Post || matra_position == Split) { - toPos = matra+1; - matra -= 2; - } - } else if (script == HB_Script_Kannada) { - toPos = len; - matra -= 2; - } - - IDEBUG("moving leading ra+halant to position %d", toPos); - for (i = 2; i < toPos; i++) - uc[i-2] = uc[i]; - uc[toPos-2] = ra; - uc[toPos-1] = halant; - base -= 2; - if (properties & HasReph) - reph = toPos-2; - } - - // Rule 4: - - // Uniscribe splits two- or three-part matras into their - // parts. This splitting is a character-to-character - // operation). - // - // Uniscribe describes some moving operations for these - // matras here. For shaping however all pre matras need - // to be at the beginning of the syllable, so we just move - // them there now. - if (matra_position == Split) { - splitMatra(uc, matra, len); - // Handle three-part matras (0xccb in Kannada) - matra_position = indic_position(uc[matra]); - } - - if (matra_position == Pre) { - unsigned short m = uc[matra]; - while (matra--) - uc[matra+1] = uc[matra]; - uc[0] = m; - base++; - } - } - - // Rule 5: - // - // Uniscribe classifies consonants and 'matra' parts as - // pre-base, above-base (Reph), below-base or post-base. This - // classification exists on the character code level and is - // language-dependent, not font-dependent. - for (i = 0; i < base; ++i) - position[i] = Pre; - position[base] = Base; - for (i = base+1; i < len; ++i) { - position[i] = indic_position(uc[i]); - // #### replace by adjusting table - if (uc[i] == nukta || uc[i] == halant) - position[i] = Inherit; - } - if (reph > 0) { - // recalculate reph, it might have changed. - for (i = base+1; i < len; ++i) - if (uc[i] == ra) - reph = i; - position[reph] = Reph; - position[reph+1] = Inherit; - } - - // all reordering happens now to the chars after the base - int fixed = base+1; - if (fixed < len && uc[fixed] == nukta) - fixed++; - if (fixed < len && uc[fixed] == halant) - fixed++; - if (fixed < len && uc[fixed] == 0x200d) - fixed++; - -#ifdef INDIC_DEBUG - for (i = fixed; i < len; ++i) - IDEBUG("position[%d] = %d, form=%d uc=%x", i, position[i], form(uc[i]), uc[i]); -#endif - // we continuosly position the matras and vowel marks and increase the fixed - // until we reached the end. - const IndicOrdering *finalOrder = indic_order[script-HB_Script_Devanagari]; - - IDEBUG(" reordering pass:"); - IDEBUG(" base=%d fixed=%d", base, fixed); - int toMove = 0; - while (finalOrder[toMove].form && fixed < len-1) { - IDEBUG(" fixed = %d, toMove=%d, moving form %d with pos %d", fixed, toMove, finalOrder[toMove].form, finalOrder[toMove].position); - for (i = fixed; i < len; i++) { -// IDEBUG() << " i=" << i << "uc=" << hex << uc[i] << "form=" << form(uc[i]) -// << "position=" << position[i]; - if (form(uc[i]) == finalOrder[toMove].form && - position[i] == finalOrder[toMove].position) { - // need to move this glyph - int to = fixed; - if (i < len-1 && position[i+1] == Inherit) { - IDEBUG(" moving two chars from %d to %d", i, to); - unsigned short ch = uc[i]; - unsigned short ch2 = uc[i+1]; - unsigned char pos = position[i]; - for (int j = i+1; j > to+1; j--) { - uc[j] = uc[j-2]; - position[j] = position[j-2]; - } - uc[to] = ch; - uc[to+1] = ch2; - position[to] = pos; - position[to+1] = pos; - fixed += 2; - } else { - IDEBUG(" moving one char from %d to %d", i, to); - unsigned short ch = uc[i]; - unsigned char pos = position[i]; - for (int j = i; j > to; j--) { - uc[j] = uc[j-1]; - position[j] = position[j-1]; - } - uc[to] = ch; - position[to] = pos; - fixed++; - } - } - } - toMove++; - } - - } - - if (reph > 0) { - // recalculate reph, it might have changed. - for (i = base+1; i < len; ++i) - if (reordered[i] == ra) - reph = i; - } - -#ifndef NO_OPENTYPE - const int availableGlyphs = item->num_glyphs; -#endif - if (!item->font->klass->convertStringToGlyphIndices(item->font, - reordered, len, - item->glyphs, &item->num_glyphs, - item->item.bidiLevel % 2)) - goto error; - - - IDEBUG(" base=%d, reph=%d", base, reph); - IDEBUG("reordered:"); - for (i = 0; i < len; i++) { - item->attributes[i].mark = false; - item->attributes[i].clusterStart = false; - item->attributes[i].justification = 0; - item->attributes[i].zeroWidth = false; - IDEBUG(" %d: %4x", i, reordered[i]); - } - - // now we have the syllable in the right order, and can start running it through open type. - - for (i = 0; i < len; ++i) - control |= (form(reordered[i]) == Control); - -#ifndef NO_OPENTYPE - if (openType) { - - // we need to keep track of where the base glyph is for some - // scripts and use the cluster feature for this. This - // also means we have to correct the logCluster output from - // the open type engine manually afterwards. for indic this - // is rather simple, as all chars just point to the first - // glyph in the syllable. - HB_STACKARRAY(unsigned short, clusters, len); - HB_STACKARRAY(unsigned int, properties, len); - - for (i = 0; i < len; ++i) - clusters[i] = i; - - // features we should always apply - for (i = 0; i < len; ++i) - properties[i] = ~(CcmpProperty - | NuktaProperty - | VattuProperty - | PreSubstProperty - | BelowSubstProperty - | AboveSubstProperty - | PostSubstProperty - | HalantProperty - | PositioningProperties); - - // Ccmp always applies - // Init - if (item->item.pos == 0 - || !(isLetter(item->string[item->item.pos-1]) || isMark(item->string[item->item.pos-1]))) - properties[0] &= ~InitProperty; - - // Nukta always applies - // Akhant - for (i = 0; i <= base; ++i) - properties[i] &= ~AkhantProperty; - // Reph - if (reph >= 0) { - properties[reph] &= ~RephProperty; - properties[reph+1] &= ~RephProperty; - } - // BelowForm - for (i = base+1; i < len; ++i) - properties[i] &= ~BelowFormProperty; - - if (script == HB_Script_Devanagari || script == HB_Script_Gujarati) { - // vattu glyphs need this aswell - bool vattu = false; - for (i = base-2; i > 1; --i) { - if (form(reordered[i]) == Consonant) { - vattu = (!vattu && reordered[i] == ra); - if (vattu) { - IDEBUG("forming vattu ligature at %d", i); - properties[i] &= ~BelowFormProperty; - properties[i+1] &= ~BelowFormProperty; - } - } - } - } - // HalfFormProperty - for (i = 0; i < base; ++i) - properties[i] &= ~HalfFormProperty; - if (control) { - for (i = 2; i < len; ++i) { - if (reordered[i] == 0x200d /* ZWJ */) { - properties[i-1] &= ~HalfFormProperty; - properties[i-2] &= ~HalfFormProperty; - } else if (reordered[i] == 0x200c /* ZWNJ */) { - properties[i-1] &= ~HalfFormProperty; - properties[i-2] &= ~HalfFormProperty; - } - } - } - // PostFormProperty - for (i = base+1; i < len; ++i) - properties[i] &= ~PostFormProperty; - // vattu always applies - // pres always applies - // blws always applies - // abvs always applies - // psts always applies - // halant always applies - -#ifdef INDIC_DEBUG -// { -// IDEBUG("OT properties:"); -// for (int i = 0; i < len; ++i) -// qDebug(" i: %s", ::propertiesToString(properties[i]).toLatin1().data()); -// } -#endif - - // initialize - item->log_clusters = clusters; - HB_OpenTypeShape(item, properties); - - int newLen = item->face->buffer->in_length; - HB_GlyphItem otl_glyphs = item->face->buffer->in_string; - - // move the left matra back to its correct position in malayalam and tamil - if ((script == HB_Script_Malayalam || script == HB_Script_Tamil) && (form(reordered[0]) == Matra)) { -// qDebug("reordering matra, len=%d", newLen); - // need to find the base in the shaped string and move the matra there - int basePos = 0; - while (basePos < newLen && (int)otl_glyphs[basePos].cluster <= base) - basePos++; - --basePos; - if (basePos < newLen && basePos > 1) { -// qDebug("moving prebase matra to position %d in syllable newlen=%d", basePos, newLen); - HB_GlyphItemRec m = otl_glyphs[0]; - --basePos; - for (i = 0; i < basePos; ++i) - otl_glyphs[i] = otl_glyphs[i+1]; - otl_glyphs[basePos] = m; - } - } - - HB_Bool positioned = HB_OpenTypePosition(item, availableGlyphs, false); - - HB_FREE_STACKARRAY(clusters); - HB_FREE_STACKARRAY(properties); - - if (!positioned) - goto error; - - if (control) { - IDEBUG("found a control char in the syllable"); - hb_uint32 i = 0, j = 0; - while (i < item->num_glyphs) { - if (form(reordered[otl_glyphs[i].cluster]) == Control) { - ++i; - if (i >= item->num_glyphs) - break; - } - item->glyphs[j] = item->glyphs[i]; - item->attributes[j] = item->attributes[i]; - ++i; - ++j; - } - item->num_glyphs = j; - } - - } else { - HB_HeuristicPosition(item); - } -#endif // NO_OPENTYPE - item->attributes[0].clusterStart = true; - - HB_FREE_STACKARRAY(reordered); - HB_FREE_STACKARRAY(position); - - IDEBUG("<<<<<<"); - return true; - -error: - HB_FREE_STACKARRAY(reordered); - HB_FREE_STACKARRAY(position); - return false; -} - -/* syllables are of the form: - - (Consonant Nukta? Halant)* Consonant Matra? VowelMark? StressMark? - (Consonant Nukta? Halant)* Consonant Halant - IndependentVowel VowelMark? StressMark? - - We return syllable boundaries on invalid combinations aswell -*/ -static int indic_nextSyllableBoundary(HB_Script script, const HB_UChar16 *s, int start, int end, bool *invalid) -{ - *invalid = false; - IDEBUG("indic_nextSyllableBoundary: start=%d, end=%d", start, end); - const HB_UChar16 *uc = s+start; - - int pos = 0; - Form state = form(uc[pos]); - IDEBUG("state[%d]=%d (uc=%4x)", pos, state, uc[pos]); - pos++; - - if (state != Consonant && state != IndependentVowel) { - if (state != Other) - *invalid = true; - goto finish; - } - - while (pos < end - start) { - Form newState = form(uc[pos]); - IDEBUG("state[%d]=%d (uc=%4x)", pos, newState, uc[pos]); - switch(newState) { - case Control: - newState = state; - if (state == Halant && uc[pos] == 0x200d /* ZWJ */) - break; - // the control character should be the last char in the item - ++pos; - goto finish; - case Consonant: - if (state == Halant && (script != HB_Script_Sinhala || uc[pos-1] == 0x200d /* ZWJ */)) - break; - goto finish; - case Halant: - if (state == Nukta || state == Consonant) - break; - // Bengali has a special exception allowing the combination Vowel_A/E + Halant + Ya - if (script == HB_Script_Bengali && pos == 1 && - (uc[0] == 0x0985 || uc[0] == 0x098f)) - break; - // Sinhala uses the Halant as a component of certain matras. Allow these, but keep the state on Matra. - if (script == HB_Script_Sinhala && state == Matra) { - ++pos; - continue; - } - if (script == HB_Script_Malayalam && state == Matra && uc[pos-1] == 0x0d41) { - ++pos; - continue; - } - goto finish; - case Nukta: - if (state == Consonant) - break; - goto finish; - case StressMark: - if (state == VowelMark) - break; - // fall through - case VowelMark: - if (state == Matra || state == LengthMark || state == IndependentVowel) - break; - // fall through - case Matra: - if (state == Consonant || state == Nukta) - break; - if (state == Matra) { - // ### needs proper testing for correct two/three part matras - break; - } - // ### not sure if this is correct. If it is, does it apply only to Bengali or should - // it work for all Indic languages? - // the combination Independent_A + Vowel Sign AA is allowed. - if (script == HB_Script_Bengali && uc[pos] == 0x9be && uc[pos-1] == 0x985) - break; - if (script == HB_Script_Tamil && state == Matra) { - if (uc[pos-1] == 0x0bc6 && - (uc[pos] == 0xbbe || uc[pos] == 0xbd7)) - break; - if (uc[pos-1] == 0x0bc7 && uc[pos] == 0xbbe) - break; - } - goto finish; - - case LengthMark: - if (state == Matra) { - // ### needs proper testing for correct two/three part matras - break; - } - case IndependentVowel: - case Invalid: - case Other: - goto finish; - } - state = newState; - pos++; - } - finish: - return pos+start; -} - -HB_Bool HB_IndicShape(HB_ShaperItem *item) -{ - assert(item->item.script >= HB_Script_Devanagari && item->item.script <= HB_Script_Sinhala); - - HB_Bool openType = false; -#ifndef NO_OPENTYPE - openType = HB_SelectScript(item, indic_features); -#endif - unsigned short *logClusters = item->log_clusters; - - HB_ShaperItem syllable = *item; - int first_glyph = 0; - - int sstart = item->item.pos; - int end = sstart + item->item.length; - IDEBUG("indic_shape: from %d length %d", item->item.pos, item->item.length); - while (sstart < end) { - bool invalid; - int send = indic_nextSyllableBoundary(item->item.script, item->string, sstart, end, &invalid); - IDEBUG("syllable from %d, length %d, invalid=%s", sstart, send-sstart, - invalid ? "true" : "false"); - syllable.item.pos = sstart; - syllable.item.length = send-sstart; - syllable.glyphs = item->glyphs + first_glyph; - syllable.attributes = item->attributes + first_glyph; - syllable.offsets = item->offsets + first_glyph; - syllable.advances = item->advances + first_glyph; - syllable.num_glyphs = item->num_glyphs - first_glyph; - if (!indic_shape_syllable(openType, &syllable, invalid)) { - IDEBUG("syllable shaping failed, syllable requests %d glyphs", syllable.num_glyphs); - item->num_glyphs += syllable.num_glyphs; - return false; - } - // fix logcluster array - IDEBUG("syllable:"); - hb_uint32 g; - for (g = first_glyph; g < first_glyph + syllable.num_glyphs; ++g) - IDEBUG(" %d -> glyph %x", g, item->glyphs[g]); - IDEBUG(" logclusters:"); - int i; - for (i = sstart; i < send; ++i) { - IDEBUG(" %d -> glyph %d", i, first_glyph); - logClusters[i-item->item.pos] = first_glyph; - } - sstart = send; - first_glyph += syllable.num_glyphs; - } - item->num_glyphs = first_glyph; - return true; -} - -void HB_IndicAttributes(HB_Script script, const HB_UChar16 *text, hb_uint32 from, hb_uint32 len, HB_CharAttributes *attributes) -{ - int end = from + len; - const HB_UChar16 *uc = text + from; - attributes += from; - hb_uint32 i = 0; - while (i < len) { - bool invalid; - hb_uint32 boundary = indic_nextSyllableBoundary(script, text, from+i, end, &invalid) - from; - attributes[i].charStop = true; - - if (boundary > len-1) boundary = len; - i++; - while (i < boundary) { - attributes[i].charStop = false; - ++uc; - ++i; - } - assert(i == boundary); - } - - -} - - diff --git a/third_party/harfbuzz/src/harfbuzz-khmer.c b/third_party/harfbuzz/src/harfbuzz-khmer.c deleted file mode 100644 index 958069e866..0000000000 --- a/third_party/harfbuzz/src/harfbuzz-khmer.c +++ /dev/null @@ -1,667 +0,0 @@ -/* - * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) - * - * This is part of HarfBuzz, an OpenType Layout engine library. - * - * Permission is hereby granted, without written agreement and without - * license or royalty fees, to use, copy, modify, and distribute this - * software and its documentation for any purpose, provided that the - * above copyright notice and the following two paragraphs appear in - * all copies of this software. - * - * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR - * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES - * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN - * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE. - * - * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, - * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS - * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO - * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. - */ - -#include "harfbuzz-shaper.h" -#include "harfbuzz-shaper-private.h" - -#include -#include - -/* -// Vocabulary -// Base -> A consonant or an independent vowel in its full (not subscript) form. It is the -// center of the syllable, it can be surrounded by coeng (subscript) consonants, vowels, -// split vowels, signs... but there is only one base in a syllable, it has to be coded as -// the first character of the syllable. -// split vowel --> vowel that has two parts placed separately (e.g. Before and after the consonant). -// Khmer language has five of them. Khmer split vowels either have one part before the -// base and one after the base or they have a part before the base and a part above the base. -// The first part of all Khmer split vowels is the same character, identical to -// the glyph of Khmer dependent vowel SRA EI -// coeng --> modifier used in Khmer to construct coeng (subscript) consonants -// Differently than indian languages, the coeng modifies the consonant that follows it, -// not the one preceding it Each consonant has two forms, the base form and the subscript form -// the base form is the normal one (using the consonants code-point), the subscript form is -// displayed when the combination coeng + consonant is encountered. -// Consonant of type 1 -> A consonant which has subscript for that only occupies space under a base consonant -// Consonant of type 2.-> Its subscript form occupies space under and before the base (only one, RO) -// Consonant of Type 3 -> Its subscript form occupies space under and after the base (KHO, CHHO, THHO, BA, YO, SA) -// Consonant shifter -> Khmer has to series of consonants. The same dependent vowel has different sounds -// if it is attached to a consonant of the first series or a consonant of the second series -// Most consonants have an equivalent in the other series, but some of theme exist only in -// one series (for example SA). If we want to use the consonant SA with a vowel sound that -// can only be done with a vowel sound that corresponds to a vowel accompanying a consonant -// of the other series, then we need to use a consonant shifter: TRIISAP or MUSIKATOAN -// x17C9 y x17CA. TRIISAP changes a first series consonant to second series sound and -// MUSIKATOAN a second series consonant to have a first series vowel sound. -// Consonant shifter are both normally supercript marks, but, when they are followed by a -// superscript, they change shape and take the form of subscript dependent vowel SRA U. -// If they are in the same syllable as a coeng consonant, Unicode 3.0 says that they -// should be typed before the coeng. Unicode 4.0 breaks the standard and says that it should -// be placed after the coeng consonant. -// Dependent vowel -> In khmer dependent vowels can be placed above, below, before or after the base -// Each vowel has its own position. Only one vowel per syllable is allowed. -// Signs -> Khmer has above signs and post signs. Only one above sign and/or one post sign are -// Allowed in a syllable. -// -// -// order is important here! This order must be the same that is found in each horizontal -// line in the statetable for Khmer (see khmerStateTable) . -*/ -enum KhmerCharClassValues { - CC_RESERVED = 0, - CC_CONSONANT = 1, /* Consonant of type 1 or independent vowel */ - CC_CONSONANT2 = 2, /* Consonant of type 2 */ - CC_CONSONANT3 = 3, /* Consonant of type 3 */ - CC_ZERO_WIDTH_NJ_MARK = 4, /* Zero Width non joiner character (0x200C) */ - CC_CONSONANT_SHIFTER = 5, - CC_ROBAT = 6, /* Khmer special diacritic accent -treated differently in state table */ - CC_COENG = 7, /* Subscript consonant combining character */ - CC_DEPENDENT_VOWEL = 8, - CC_SIGN_ABOVE = 9, - CC_SIGN_AFTER = 10, - CC_ZERO_WIDTH_J_MARK = 11, /* Zero width joiner character */ - CC_COUNT = 12 /* This is the number of character classes */ -}; - - -enum KhmerCharClassFlags { - CF_CLASS_MASK = 0x0000FFFF, - - CF_CONSONANT = 0x01000000, /* flag to speed up comparing */ - CF_SPLIT_VOWEL = 0x02000000, /* flag for a split vowel -> the first part is added in front of the syllable */ - CF_DOTTED_CIRCLE = 0x04000000, /* add a dotted circle if a character with this flag is the first in a syllable */ - CF_COENG = 0x08000000, /* flag to speed up comparing */ - CF_SHIFTER = 0x10000000, /* flag to speed up comparing */ - CF_ABOVE_VOWEL = 0x20000000, /* flag to speed up comparing */ - - /* position flags */ - CF_POS_BEFORE = 0x00080000, - CF_POS_BELOW = 0x00040000, - CF_POS_ABOVE = 0x00020000, - CF_POS_AFTER = 0x00010000, - CF_POS_MASK = 0x000f0000 -}; - - -/* Characters that get referred to by name */ -enum KhmerChar { - C_SIGN_ZWNJ = 0x200C, - C_SIGN_ZWJ = 0x200D, - C_RO = 0x179A, - C_VOWEL_AA = 0x17B6, - C_SIGN_NIKAHIT = 0x17C6, - C_VOWEL_E = 0x17C1, - C_COENG = 0x17D2 -}; - - -/* -// simple classes, they are used in the statetable (in this file) to control the length of a syllable -// they are also used to know where a character should be placed (location in reference to the base character) -// and also to know if a character, when independently displayed, should be displayed with a dotted-circle to -// indicate error in syllable construction -*/ -enum { - _xx = CC_RESERVED, - _sa = CC_SIGN_ABOVE | CF_DOTTED_CIRCLE | CF_POS_ABOVE, - _sp = CC_SIGN_AFTER | CF_DOTTED_CIRCLE| CF_POS_AFTER, - _c1 = CC_CONSONANT | CF_CONSONANT, - _c2 = CC_CONSONANT2 | CF_CONSONANT, - _c3 = CC_CONSONANT3 | CF_CONSONANT, - _rb = CC_ROBAT | CF_POS_ABOVE | CF_DOTTED_CIRCLE, - _cs = CC_CONSONANT_SHIFTER | CF_DOTTED_CIRCLE | CF_SHIFTER, - _dl = CC_DEPENDENT_VOWEL | CF_POS_BEFORE | CF_DOTTED_CIRCLE, - _db = CC_DEPENDENT_VOWEL | CF_POS_BELOW | CF_DOTTED_CIRCLE, - _da = CC_DEPENDENT_VOWEL | CF_POS_ABOVE | CF_DOTTED_CIRCLE | CF_ABOVE_VOWEL, - _dr = CC_DEPENDENT_VOWEL | CF_POS_AFTER | CF_DOTTED_CIRCLE, - _co = CC_COENG | CF_COENG | CF_DOTTED_CIRCLE, - - /* split vowel */ - _va = _da | CF_SPLIT_VOWEL, - _vr = _dr | CF_SPLIT_VOWEL -}; - - -/* -// Character class: a character class value -// ORed with character class flags. -*/ -typedef unsigned long KhmerCharClass; - - -/* -// Character class tables -// _xx character does not combine into syllable, such as numbers, puntuation marks, non-Khmer signs... -// _sa Sign placed above the base -// _sp Sign placed after the base -// _c1 Consonant of type 1 or independent vowel (independent vowels behave as type 1 consonants) -// _c2 Consonant of type 2 (only RO) -// _c3 Consonant of type 3 -// _rb Khmer sign robat u17CC. combining mark for subscript consonants -// _cd Consonant-shifter -// _dl Dependent vowel placed before the base (left of the base) -// _db Dependent vowel placed below the base -// _da Dependent vowel placed above the base -// _dr Dependent vowel placed behind the base (right of the base) -// _co Khmer combining mark COENG u17D2, combines with the consonant or independent vowel following -// it to create a subscript consonant or independent vowel -// _va Khmer split vowel in which the first part is before the base and the second one above the base -// _vr Khmer split vowel in which the first part is before the base and the second one behind (right of) the base -*/ -static const KhmerCharClass khmerCharClasses[] = { - _c1, _c1, _c1, _c3, _c1, _c1, _c1, _c1, _c3, _c1, _c1, _c1, _c1, _c3, _c1, _c1, /* 1780 - 178F */ - _c1, _c1, _c1, _c1, _c3, _c1, _c1, _c1, _c1, _c3, _c2, _c1, _c1, _c1, _c3, _c3, /* 1790 - 179F */ - _c1, _c3, _c1, _c1, _c1, _c1, _c1, _c1, _c1, _c1, _c1, _c1, _c1, _c1, _c1, _c1, /* 17A0 - 17AF */ - _c1, _c1, _c1, _c1, _dr, _dr, _dr, _da, _da, _da, _da, _db, _db, _db, _va, _vr, /* 17B0 - 17BF */ - _vr, _dl, _dl, _dl, _vr, _vr, _sa, _sp, _sp, _cs, _cs, _sa, _rb, _sa, _sa, _sa, /* 17C0 - 17CF */ - _sa, _sa, _co, _sa, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _xx, _sa, _xx, _xx /* 17D0 - 17DF */ -}; - -/* this enum must reflect the range of khmerCharClasses */ -enum KhmerCharClassesRange { - KhmerFirstChar = 0x1780, - KhmerLastChar = 0x17df -}; - -/* -// Below we define how a character in the input string is either in the khmerCharClasses table -// (in which case we get its type back), a ZWJ or ZWNJ (two characters that may appear -// within the syllable, but are not in the table) we also get their type back, or an unknown object -// in which case we get _xx (CC_RESERVED) back -*/ -static KhmerCharClass getKhmerCharClass(HB_UChar16 uc) -{ - if (uc == C_SIGN_ZWJ) { - return CC_ZERO_WIDTH_J_MARK; - } - - if (uc == C_SIGN_ZWNJ) { - return CC_ZERO_WIDTH_NJ_MARK; - } - - if (uc < KhmerFirstChar || uc > KhmerLastChar) { - return CC_RESERVED; - } - - return khmerCharClasses[uc - KhmerFirstChar]; -} - - -/* -// The stateTable is used to calculate the end (the length) of a well -// formed Khmer Syllable. -// -// Each horizontal line is ordered exactly the same way as the values in KhmerClassTable -// CharClassValues. This coincidence of values allows the follow up of the table. -// -// Each line corresponds to a state, which does not necessarily need to be a type -// of component... for example, state 2 is a base, with is always a first character -// in the syllable, but the state could be produced a consonant of any type when -// it is the first character that is analysed (in ground state). -// -// Differentiating 3 types of consonants is necessary in order to -// forbid the use of certain combinations, such as having a second -// coeng after a coeng RO, -// The inexistent possibility of having a type 3 after another type 3 is permitted, -// eliminating it would very much complicate the table, and it does not create typing -// problems, as the case above. -// -// The table is quite complex, in order to limit the number of coeng consonants -// to 2 (by means of the table). -// -// There a peculiarity, as far as Unicode is concerned: -// - The consonant-shifter is considered in two possible different -// locations, the one considered in Unicode 3.0 and the one considered in -// Unicode 4.0. (there is a backwards compatibility problem in this standard). -// -// -// xx independent character, such as a number, punctuation sign or non-khmer char -// -// c1 Khmer consonant of type 1 or an independent vowel -// that is, a letter in which the subscript for is only under the -// base, not taking any space to the right or to the left -// -// c2 Khmer consonant of type 2, the coeng form takes space under -// and to the left of the base (only RO is of this type) -// -// c3 Khmer consonant of type 3. Its subscript form takes space under -// and to the right of the base. -// -// cs Khmer consonant shifter -// -// rb Khmer robat -// -// co coeng character (u17D2) -// -// dv dependent vowel (including split vowels, they are treated in the same way). -// even if dv is not defined above, the component that is really tested for is -// KhmerClassTable::CC_DEPENDENT_VOWEL, which is common to all dependent vowels -// -// zwj Zero Width joiner -// -// zwnj Zero width non joiner -// -// sa above sign -// -// sp post sign -// -// there are lines with equal content but for an easier understanding -// (and maybe change in the future) we did not join them -*/ -static const signed char khmerStateTable[][CC_COUNT] = -{ - /* xx c1 c2 c3 zwnj cs rb co dv sa sp zwj */ - { 1, 2, 2, 2, 1, 1, 1, 6, 1, 1, 1, 2}, /* 0 - ground state */ - {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, /* 1 - exit state (or sign to the right of the syllable) */ - {-1, -1, -1, -1, 3, 4, 5, 6, 16, 17, 1, -1}, /* 2 - Base consonant */ - {-1, -1, -1, -1, -1, 4, -1, -1, 16, -1, -1, -1}, /* 3 - First ZWNJ before a register shifter It can only be followed by a shifter or a vowel */ - {-1, -1, -1, -1, 15, -1, -1, 6, 16, 17, 1, 14}, /* 4 - First register shifter */ - {-1, -1, -1, -1, -1, -1, -1, -1, 20, -1, 1, -1}, /* 5 - Robat */ - {-1, 7, 8, 9, -1, -1, -1, -1, -1, -1, -1, -1}, /* 6 - First Coeng */ - {-1, -1, -1, -1, 12, 13, -1, 10, 16, 17, 1, 14}, /* 7 - First consonant of type 1 after coeng */ - {-1, -1, -1, -1, 12, 13, -1, -1, 16, 17, 1, 14}, /* 8 - First consonant of type 2 after coeng */ - {-1, -1, -1, -1, 12, 13, -1, 10, 16, 17, 1, 14}, /* 9 - First consonant or type 3 after ceong */ - {-1, 11, 11, 11, -1, -1, -1, -1, -1, -1, -1, -1}, /* 10 - Second Coeng (no register shifter before) */ - {-1, -1, -1, -1, 15, -1, -1, -1, 16, 17, 1, 14}, /* 11 - Second coeng consonant (or ind. vowel) no register shifter before */ - {-1, -1, -1, -1, -1, 13, -1, -1, 16, -1, -1, -1}, /* 12 - Second ZWNJ before a register shifter */ - {-1, -1, -1, -1, 15, -1, -1, -1, 16, 17, 1, 14}, /* 13 - Second register shifter */ - {-1, -1, -1, -1, -1, -1, -1, -1, 16, -1, -1, -1}, /* 14 - ZWJ before vowel */ - {-1, -1, -1, -1, -1, -1, -1, -1, 16, -1, -1, -1}, /* 15 - ZWNJ before vowel */ - {-1, -1, -1, -1, -1, -1, -1, -1, -1, 17, 1, 18}, /* 16 - dependent vowel */ - {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 18}, /* 17 - sign above */ - {-1, -1, -1, -1, -1, -1, -1, 19, -1, -1, -1, -1}, /* 18 - ZWJ after vowel */ - {-1, 1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1}, /* 19 - Third coeng */ - {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1}, /* 20 - dependent vowel after a Robat */ -}; - - -/* #define KHMER_DEBUG */ -#ifdef KHMER_DEBUG -#define KHDEBUG qDebug -#else -#define KHDEBUG if(0) printf -#endif - -/* -// Given an input string of characters and a location in which to start looking -// calculate, using the state table, which one is the last character of the syllable -// that starts in the starting position. -*/ -static int khmer_nextSyllableBoundary(const HB_UChar16 *s, int start, int end, HB_Bool *invalid) -{ - const HB_UChar16 *uc = s + start; - int state = 0; - int pos = start; - *invalid = FALSE; - - while (pos < end) { - KhmerCharClass charClass = getKhmerCharClass(*uc); - if (pos == start) { - *invalid = (charClass > 0) && ! (charClass & CF_CONSONANT); - } - state = khmerStateTable[state][charClass & CF_CLASS_MASK]; - - KHDEBUG("state[%d]=%d class=%8lx (uc=%4x)", pos - start, state, - charClass, *uc ); - - if (state < 0) { - break; - } - ++uc; - ++pos; - } - return pos; -} - -#ifndef NO_OPENTYPE -static const HB_OpenTypeFeature khmer_features[] = { - { HB_MAKE_TAG( 'p', 'r', 'e', 'f' ), PreFormProperty }, - { HB_MAKE_TAG( 'b', 'l', 'w', 'f' ), BelowFormProperty }, - { HB_MAKE_TAG( 'a', 'b', 'v', 'f' ), AboveFormProperty }, - { HB_MAKE_TAG( 'p', 's', 't', 'f' ), PostFormProperty }, - { HB_MAKE_TAG( 'p', 'r', 'e', 's' ), PreSubstProperty }, - { HB_MAKE_TAG( 'b', 'l', 'w', 's' ), BelowSubstProperty }, - { HB_MAKE_TAG( 'a', 'b', 'v', 's' ), AboveSubstProperty }, - { HB_MAKE_TAG( 'p', 's', 't', 's' ), PostSubstProperty }, - { HB_MAKE_TAG( 'c', 'l', 'i', 'g' ), CligProperty }, - { 0, 0 } -}; -#endif - - -static HB_Bool khmer_shape_syllable(HB_Bool openType, HB_ShaperItem *item) -{ -/* KHDEBUG("syllable from %d len %d, str='%s'", item->from, item->length, - item->string->mid(item->from, item->length).toUtf8().data()); */ - - int len = 0; - int syllableEnd = item->item.pos + item->item.length; - unsigned short reordered[16]; - unsigned char properties[16]; - enum { - AboveForm = 0x01, - PreForm = 0x02, - PostForm = 0x04, - BelowForm = 0x08 - }; -#ifndef NO_OPENTYPE - const int availableGlyphs = item->num_glyphs; -#endif - int coengRo; - int i; - - /* according to the specs this is the max length one can get - ### the real value should be smaller */ - assert(item->item.length < 13); - - memset(properties, 0, 16*sizeof(unsigned char)); - -#ifdef KHMER_DEBUG - qDebug("original:"); - for (int i = from; i < syllableEnd; i++) { - qDebug(" %d: %4x", i, string[i]); - } -#endif - - /* - // write a pre vowel or the pre part of a split vowel first - // and look out for coeng + ro. RO is the only vowel of type 2, and - // therefore the only one that requires saving space before the base. - */ - coengRo = -1; /* There is no Coeng Ro, if found this value will change */ - for (i = item->item.pos; i < syllableEnd; i += 1) { - KhmerCharClass charClass = getKhmerCharClass(item->string[i]); - - /* if a split vowel, write the pre part. In Khmer the pre part - is the same for all split vowels, same glyph as pre vowel C_VOWEL_E */ - if (charClass & CF_SPLIT_VOWEL) { - reordered[len] = C_VOWEL_E; - properties[len] = PreForm; - ++len; - break; /* there can be only one vowel */ - } - /* if a vowel with pos before write it out */ - if (charClass & CF_POS_BEFORE) { - reordered[len] = item->string[i]; - properties[len] = PreForm; - ++len; - break; /* there can be only one vowel */ - } - /* look for coeng + ro and remember position - works because coeng + ro is always in front of a vowel (if there is a vowel) - and because CC_CONSONANT2 is enough to identify it, as it is the only consonant - with this flag */ - if ( (charClass & CF_COENG) && (i + 1 < syllableEnd) && - ( (getKhmerCharClass(item->string[i+1]) & CF_CLASS_MASK) == CC_CONSONANT2) ) { - coengRo = i; - } - } - - /* write coeng + ro if found */ - if (coengRo > -1) { - reordered[len] = C_COENG; - properties[len] = PreForm; - ++len; - reordered[len] = C_RO; - properties[len] = PreForm; - ++len; - } - - /* - shall we add a dotted circle? - If in the position in which the base should be (first char in the string) there is - a character that has the Dotted circle flag (a character that cannot be a base) - then write a dotted circle */ - if (getKhmerCharClass(item->string[item->item.pos]) & CF_DOTTED_CIRCLE) { - reordered[len] = C_DOTTED_CIRCLE; - ++len; - } - - /* copy what is left to the output, skipping before vowels and - coeng Ro if they are present */ - for (i = item->item.pos; i < syllableEnd; i += 1) { - HB_UChar16 uc = item->string[i]; - KhmerCharClass charClass = getKhmerCharClass(uc); - - /* skip a before vowel, it was already processed */ - if (charClass & CF_POS_BEFORE) { - continue; - } - - /* skip coeng + ro, it was already processed */ - if (i == coengRo) { - i += 1; - continue; - } - - switch (charClass & CF_POS_MASK) - { - case CF_POS_ABOVE : - reordered[len] = uc; - properties[len] = AboveForm; - ++len; - break; - - case CF_POS_AFTER : - reordered[len] = uc; - properties[len] = PostForm; - ++len; - break; - - case CF_POS_BELOW : - reordered[len] = uc; - properties[len] = BelowForm; - ++len; - break; - - default: - /* assign the correct flags to a coeng consonant - Consonants of type 3 are taged as Post forms and those type 1 as below forms */ - if ( (charClass & CF_COENG) && i + 1 < syllableEnd ) { - unsigned char property = (getKhmerCharClass(item->string[i+1]) & CF_CLASS_MASK) == CC_CONSONANT3 ? - PostForm : BelowForm; - reordered[len] = uc; - properties[len] = property; - ++len; - i += 1; - reordered[len] = item->string[i]; - properties[len] = property; - ++len; - break; - } - - /* if a shifter is followed by an above vowel change the shifter to below form, - an above vowel can have two possible positions i + 1 or i + 3 - (position i+1 corresponds to unicode 3, position i+3 to Unicode 4) - and there is an extra rule for C_VOWEL_AA + C_SIGN_NIKAHIT also for two - different positions, right after the shifter or after a vowel (Unicode 4) */ - if ( (charClass & CF_SHIFTER) && (i + 1 < syllableEnd) ) { - if (getKhmerCharClass(item->string[i+1]) & CF_ABOVE_VOWEL ) { - reordered[len] = uc; - properties[len] = BelowForm; - ++len; - break; - } - if (i + 2 < syllableEnd && - (item->string[i+1] == C_VOWEL_AA) && - (item->string[i+2] == C_SIGN_NIKAHIT) ) - { - reordered[len] = uc; - properties[len] = BelowForm; - ++len; - break; - } - if (i + 3 < syllableEnd && (getKhmerCharClass(item->string[i+3]) & CF_ABOVE_VOWEL) ) { - reordered[len] = uc; - properties[len] = BelowForm; - ++len; - break; - } - if (i + 4 < syllableEnd && - (item->string[i+3] == C_VOWEL_AA) && - (item->string[i+4] == C_SIGN_NIKAHIT) ) - { - reordered[len] = uc; - properties[len] = BelowForm; - ++len; - break; - } - } - - /* default - any other characters */ - reordered[len] = uc; - ++len; - break; - } /* switch */ - } /* for */ - - if (!item->font->klass->convertStringToGlyphIndices(item->font, - reordered, len, - item->glyphs, &item->num_glyphs, - item->item.bidiLevel % 2)) - return FALSE; - - - KHDEBUG("after shaping: len=%d", len); - for (i = 0; i < len; i++) { - item->attributes[i].mark = FALSE; - item->attributes[i].clusterStart = FALSE; - item->attributes[i].justification = 0; - item->attributes[i].zeroWidth = FALSE; - KHDEBUG(" %d: %4x property=%x", i, reordered[i], properties[i]); - } - - /* now we have the syllable in the right order, and can start running it through open type. */ - -#ifndef NO_OPENTYPE - if (openType) { - hb_uint32 where[16]; - for (i = 0; i < len; ++i) { - where[i] = ~(PreSubstProperty - | BelowSubstProperty - | AboveSubstProperty - | PostSubstProperty - | CligProperty - | PositioningProperties); - if (properties[i] == PreForm) - where[i] &= ~PreFormProperty; - else if (properties[i] == BelowForm) - where[i] &= ~BelowFormProperty; - else if (properties[i] == AboveForm) - where[i] &= ~AboveFormProperty; - else if (properties[i] == PostForm) - where[i] &= ~PostFormProperty; - } - - HB_OpenTypeShape(item, where); - if (!HB_OpenTypePosition(item, availableGlyphs, /*doLogClusters*/FALSE)) - return FALSE; - } else -#endif - { - KHDEBUG("Not using openType"); - HB_HeuristicPosition(item); - } - - item->attributes[0].clusterStart = TRUE; - return TRUE; -} - -HB_Bool HB_KhmerShape(HB_ShaperItem *item) -{ - HB_Bool openType = FALSE; - unsigned short *logClusters = item->log_clusters; - int i; - - HB_ShaperItem syllable = *item; - int first_glyph = 0; - - int sstart = item->item.pos; - int end = sstart + item->item.length; - - assert(item->item.script == HB_Script_Khmer); - -#ifndef NO_OPENTYPE - openType = HB_SelectScript(item, khmer_features); -#endif - - KHDEBUG("khmer_shape: from %d length %d", item->item.pos, item->item.length); - while (sstart < end) { - HB_Bool invalid; - int send = khmer_nextSyllableBoundary(item->string, sstart, end, &invalid); - KHDEBUG("syllable from %d, length %d, invalid=%s", sstart, send-sstart, - invalid ? "TRUE" : "FALSE"); - syllable.item.pos = sstart; - syllable.item.length = send-sstart; - syllable.glyphs = item->glyphs + first_glyph; - syllable.attributes = item->attributes + first_glyph; - syllable.offsets = item->offsets + first_glyph; - syllable.advances = item->advances + first_glyph; - syllable.num_glyphs = item->num_glyphs - first_glyph; - if (!khmer_shape_syllable(openType, &syllable)) { - KHDEBUG("syllable shaping failed, syllable requests %d glyphs", syllable.num_glyphs); - item->num_glyphs += syllable.num_glyphs; - return FALSE; - } - /* fix logcluster array */ - KHDEBUG("syllable:"); - for (i = first_glyph; i < first_glyph + (int)syllable.num_glyphs; ++i) - KHDEBUG(" %d -> glyph %x", i, item->glyphs[i]); - KHDEBUG(" logclusters:"); - for (i = sstart; i < send; ++i) { - KHDEBUG(" %d -> glyph %d", i, first_glyph); - logClusters[i-item->item.pos] = first_glyph; - } - sstart = send; - first_glyph += syllable.num_glyphs; - } - item->num_glyphs = first_glyph; - return TRUE; -} - -void HB_KhmerAttributes(HB_Script script, const HB_UChar16 *text, hb_uint32 from, hb_uint32 len, HB_CharAttributes *attributes) -{ - int end = from + len; - const HB_UChar16 *uc = text + from; - hb_uint32 i = 0; - HB_UNUSED(script); - attributes += from; - while ( i < len ) { - HB_Bool invalid; - hb_uint32 boundary = khmer_nextSyllableBoundary( text, from+i, end, &invalid ) - from; - - attributes[i].charStop = TRUE; - - if ( boundary > len-1 ) boundary = len; - i++; - while ( i < boundary ) { - attributes[i].charStop = FALSE; - ++uc; - ++i; - } - assert( i == boundary ); - } -} - diff --git a/third_party/harfbuzz/src/harfbuzz-myanmar.c b/third_party/harfbuzz/src/harfbuzz-myanmar.c deleted file mode 100644 index 7cd82bb1e6..0000000000 --- a/third_party/harfbuzz/src/harfbuzz-myanmar.c +++ /dev/null @@ -1,542 +0,0 @@ -/* - * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) - * - * This is part of HarfBuzz, an OpenType Layout engine library. - * - * Permission is hereby granted, without written agreement and without - * license or royalty fees, to use, copy, modify, and distribute this - * software and its documentation for any purpose, provided that the - * above copyright notice and the following two paragraphs appear in - * all copies of this software. - * - * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR - * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES - * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN - * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE. - * - * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, - * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS - * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO - * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. - */ - -#include "harfbuzz-shaper.h" -#include "harfbuzz-shaper-private.h" - -#include -#include - -enum MymrCharClassValues -{ - Mymr_CC_RESERVED = 0, - Mymr_CC_CONSONANT = 1, /* Consonant of type 1, that has subscript form */ - Mymr_CC_CONSONANT2 = 2, /* Consonant of type 2, that has no subscript form */ - Mymr_CC_NGA = 3, /* Consonant NGA */ - Mymr_CC_YA = 4, /* Consonant YA */ - Mymr_CC_RA = 5, /* Consonant RA */ - Mymr_CC_WA = 6, /* Consonant WA */ - Mymr_CC_HA = 7, /* Consonant HA */ - Mymr_CC_IND_VOWEL = 8, /* Independent vowel */ - Mymr_CC_ZERO_WIDTH_NJ_MARK = 9, /* Zero Width non joiner character (0x200C) */ - Mymr_CC_VIRAMA = 10, /* Subscript consonant combining character */ - Mymr_CC_PRE_VOWEL = 11, /* Dependent vowel, prebase (Vowel e) */ - Mymr_CC_BELOW_VOWEL = 12, /* Dependent vowel, prebase (Vowel u, uu) */ - Mymr_CC_ABOVE_VOWEL = 13, /* Dependent vowel, prebase (Vowel i, ii, ai) */ - Mymr_CC_POST_VOWEL = 14, /* Dependent vowel, prebase (Vowel aa) */ - Mymr_CC_SIGN_ABOVE = 15, - Mymr_CC_SIGN_BELOW = 16, - Mymr_CC_SIGN_AFTER = 17, - Mymr_CC_ZERO_WIDTH_J_MARK = 18, /* Zero width joiner character */ - Mymr_CC_COUNT = 19 /* This is the number of character classes */ -}; - -enum MymrCharClassFlags -{ - Mymr_CF_CLASS_MASK = 0x0000FFFF, - - Mymr_CF_CONSONANT = 0x01000000, /* flag to speed up comparing */ - Mymr_CF_MEDIAL = 0x02000000, /* flag to speed up comparing */ - Mymr_CF_IND_VOWEL = 0x04000000, /* flag to speed up comparing */ - Mymr_CF_DEP_VOWEL = 0x08000000, /* flag to speed up comparing */ - Mymr_CF_DOTTED_CIRCLE = 0x10000000, /* add a dotted circle if a character with this flag is the first in a syllable */ - Mymr_CF_VIRAMA = 0x20000000, /* flag to speed up comparing */ - - /* position flags */ - Mymr_CF_POS_BEFORE = 0x00080000, - Mymr_CF_POS_BELOW = 0x00040000, - Mymr_CF_POS_ABOVE = 0x00020000, - Mymr_CF_POS_AFTER = 0x00010000, - Mymr_CF_POS_MASK = 0x000f0000, - - Mymr_CF_AFTER_KINZI = 0x00100000 -}; - -/* Characters that get refrered to by name */ -enum MymrChar -{ - Mymr_C_SIGN_ZWNJ = 0x200C, - Mymr_C_SIGN_ZWJ = 0x200D, - Mymr_C_DOTTED_CIRCLE = 0x25CC, - Mymr_C_RA = 0x101B, - Mymr_C_YA = 0x101A, - Mymr_C_NGA = 0x1004, - Mymr_C_VOWEL_E = 0x1031, - Mymr_C_VIRAMA = 0x1039 -}; - -enum -{ - Mymr_xx = Mymr_CC_RESERVED, - Mymr_c1 = Mymr_CC_CONSONANT | Mymr_CF_CONSONANT | Mymr_CF_POS_BELOW, - Mymr_c2 = Mymr_CC_CONSONANT2 | Mymr_CF_CONSONANT, - Mymr_ng = Mymr_CC_NGA | Mymr_CF_CONSONANT | Mymr_CF_POS_ABOVE, - Mymr_ya = Mymr_CC_YA | Mymr_CF_CONSONANT | Mymr_CF_MEDIAL | Mymr_CF_POS_AFTER | Mymr_CF_AFTER_KINZI, - Mymr_ra = Mymr_CC_RA | Mymr_CF_CONSONANT | Mymr_CF_MEDIAL | Mymr_CF_POS_BEFORE, - Mymr_wa = Mymr_CC_WA | Mymr_CF_CONSONANT | Mymr_CF_MEDIAL | Mymr_CF_POS_BELOW, - Mymr_ha = Mymr_CC_HA | Mymr_CF_CONSONANT | Mymr_CF_MEDIAL | Mymr_CF_POS_BELOW, - Mymr_id = Mymr_CC_IND_VOWEL | Mymr_CF_IND_VOWEL, - Mymr_vi = Mymr_CC_VIRAMA | Mymr_CF_VIRAMA | Mymr_CF_POS_ABOVE | Mymr_CF_DOTTED_CIRCLE, - Mymr_dl = Mymr_CC_PRE_VOWEL | Mymr_CF_DEP_VOWEL | Mymr_CF_POS_BEFORE | Mymr_CF_DOTTED_CIRCLE | Mymr_CF_AFTER_KINZI, - Mymr_db = Mymr_CC_BELOW_VOWEL | Mymr_CF_DEP_VOWEL | Mymr_CF_POS_BELOW | Mymr_CF_DOTTED_CIRCLE | Mymr_CF_AFTER_KINZI, - Mymr_da = Mymr_CC_ABOVE_VOWEL | Mymr_CF_DEP_VOWEL | Mymr_CF_POS_ABOVE | Mymr_CF_DOTTED_CIRCLE | Mymr_CF_AFTER_KINZI, - Mymr_dr = Mymr_CC_POST_VOWEL | Mymr_CF_DEP_VOWEL | Mymr_CF_POS_AFTER | Mymr_CF_DOTTED_CIRCLE | Mymr_CF_AFTER_KINZI, - Mymr_sa = Mymr_CC_SIGN_ABOVE | Mymr_CF_DOTTED_CIRCLE | Mymr_CF_POS_ABOVE | Mymr_CF_AFTER_KINZI, - Mymr_sb = Mymr_CC_SIGN_BELOW | Mymr_CF_DOTTED_CIRCLE | Mymr_CF_POS_BELOW | Mymr_CF_AFTER_KINZI, - Mymr_sp = Mymr_CC_SIGN_AFTER | Mymr_CF_DOTTED_CIRCLE | Mymr_CF_AFTER_KINZI -}; - - -typedef int MymrCharClass; - - -static const MymrCharClass mymrCharClasses[] = -{ - Mymr_c1, Mymr_c1, Mymr_c1, Mymr_c1, Mymr_ng, Mymr_c1, Mymr_c1, Mymr_c1, - Mymr_c1, Mymr_c1, Mymr_c2, Mymr_c1, Mymr_c1, Mymr_c1, Mymr_c1, Mymr_c1, /* 1000 - 100F */ - Mymr_c1, Mymr_c1, Mymr_c1, Mymr_c1, Mymr_c1, Mymr_c1, Mymr_c1, Mymr_c1, - Mymr_c1, Mymr_c1, Mymr_ya, Mymr_ra, Mymr_c1, Mymr_wa, Mymr_c1, Mymr_ha, /* 1010 - 101F */ - Mymr_c2, Mymr_c2, Mymr_xx, Mymr_id, Mymr_id, Mymr_id, Mymr_id, Mymr_id, - Mymr_xx, Mymr_id, Mymr_id, Mymr_xx, Mymr_dr, Mymr_da, Mymr_da, Mymr_db, /* 1020 - 102F */ - Mymr_db, Mymr_dl, Mymr_da, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_sa, Mymr_sb, - Mymr_sp, Mymr_vi, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, /* 1030 - 103F */ - Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, - Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, /* 1040 - 104F */ - Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, - Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, Mymr_xx, /* 1050 - 105F */ -}; - -static MymrCharClass -getMyanmarCharClass (HB_UChar16 ch) -{ - if (ch == Mymr_C_SIGN_ZWJ) - return Mymr_CC_ZERO_WIDTH_J_MARK; - - if (ch == Mymr_C_SIGN_ZWNJ) - return Mymr_CC_ZERO_WIDTH_NJ_MARK; - - if (ch < 0x1000 || ch > 0x105f) - return Mymr_CC_RESERVED; - - return mymrCharClasses[ch - 0x1000]; -} - -static const signed char mymrStateTable[][Mymr_CC_COUNT] = -{ -/* xx c1, c2 ng ya ra wa ha id zwnj vi dl db da dr sa sb sp zwj */ - { 1, 4, 4, 2, 4, 4, 4, 4, 24, 1, 27, 17, 18, 19, 20, 21, 1, 1, 4}, /* 0 - ground state */ - {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, /* 1 - exit state (or sp to the right of the syllable) */ - {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 3, 17, 18, 19, 20, 21, -1, -1, 4}, /* 2 - NGA */ - {-1, 4, 4, 4, 4, 4, 4, 4, -1, 23, -1, -1, -1, -1, -1, -1, -1, -1, -1}, /* 3 - Virama after NGA */ - {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5, 17, 18, 19, 20, 21, 1, 1, -1}, /* 4 - Base consonant */ - {-2, 6, -2, -2, 7, 8, 9, 10, -2, 23, -2, -2, -2, -2, -2, -2, -2, -2, -2}, /* 5 - First virama */ - {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 25, 17, 18, 19, 20, 21, -1, -1, -1}, /* 6 - c1 after virama */ - {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12, 17, 18, 19, 20, 21, -1, -1, -1}, /* 7 - ya after virama */ - {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12, 17, 18, 19, 20, 21, -1, -1, -1}, /* 8 - ra after virama */ - {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12, 17, 18, 19, 20, 21, -1, -1, -1}, /* 9 - wa after virama */ - {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 17, 18, 19, 20, 21, -1, -1, -1}, /* 10 - ha after virama */ - {-1, -1, -1, -1, 7, 8, 9, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, /* 11 - Virama after NGA+zwj */ - {-2, -2, -2, -2, -2, -2, 13, 14, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2}, /* 12 - Second virama */ - {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 15, 17, 18, 19, 20, 21, -1, -1, -1}, /* 13 - wa after virama */ - {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 17, 18, 19, 20, 21, -1, -1, -1}, /* 14 - ha after virama */ - {-2, -2, -2, -2, -2, -2, -2, 16, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2}, /* 15 - Third virama */ - {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 17, 18, 19, 20, 21, -1, -1, -1}, /* 16 - ha after virama */ - {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 20, 21, 1, 1, -1}, /* 17 - dl, Dependent vowel e */ - {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 19, -1, 21, 1, 1, -1}, /* 18 - db, Dependent vowel u,uu */ - {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 1, 1, -1}, /* 19 - da, Dependent vowel i,ii,ai */ - {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 22, -1, -1, -1, -1, -1, 1, 1, -1}, /* 20 - dr, Dependent vowel aa */ - {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 1, -1}, /* 21 - sa, Sign anusvara */ - {-1, -1, -1, -1, -1, -1, -1, -1, -1, 23, -1, -1, -1, -1, -1, -1, -1, -1, -1}, /* 22 - atha */ - {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 1, -1}, /* 23 - zwnj for atha */ - {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1}, /* 24 - Independent vowel */ - {-2, -2, -2, -2, 26, 26, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2}, /* 25 - Virama after subscript consonant */ - {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 12, 17, 18, 19, 20, 21, -1, 1, -1}, /* 26 - ra/ya after subscript consonant + virama */ - {-1, 6, -1, -1, 7, 8, 9, 10, -1, 23, -1, -1, -1, -1, -1, -1, -1, -1, -1}, /* 27 - Virama after ground state */ -/* exit state -2 is for invalid order of medials and combination of invalids - with virama where virama should treat as start of next syllable - */ -}; - - - -/*#define MYANMAR_DEBUG */ -#ifdef MYANMAR_DEBUG -#define MMDEBUG qDebug -#else -#define MMDEBUG if(0) printf -#endif - -/* -// Given an input string of characters and a location in which to start looking -// calculate, using the state table, which one is the last character of the syllable -// that starts in the starting position. -*/ -static int myanmar_nextSyllableBoundary(const HB_UChar16 *s, int start, int end, HB_Bool *invalid) -{ - const HB_UChar16 *uc = s + start; - int state = 0; - int pos = start; - *invalid = FALSE; - - while (pos < end) { - MymrCharClass charClass = getMyanmarCharClass(*uc); - state = mymrStateTable[state][charClass & Mymr_CF_CLASS_MASK]; - if (pos == start) - *invalid = (HB_Bool)(charClass & Mymr_CF_DOTTED_CIRCLE); - - MMDEBUG("state[%d]=%d class=%8x (uc=%4x)", pos - start, state, charClass, *uc); - - if (state < 0) { - if (state < -1) - --pos; - break; - } - ++uc; - ++pos; - } - return pos; -} - -#ifndef NO_OPENTYPE -/* ###### might have to change order of above and below forms and substitutions, - but according to Unicode below comes before above */ -static const HB_OpenTypeFeature myanmar_features[] = { - { HB_MAKE_TAG('p', 'r', 'e', 'f'), PreFormProperty }, - { HB_MAKE_TAG('b', 'l', 'w', 'f'), BelowFormProperty }, - { HB_MAKE_TAG('a', 'b', 'v', 'f'), AboveFormProperty }, - { HB_MAKE_TAG('p', 's', 't', 'f'), PostFormProperty }, - { HB_MAKE_TAG('p', 'r', 'e', 's'), PreSubstProperty }, - { HB_MAKE_TAG('b', 'l', 'w', 's'), BelowSubstProperty }, - { HB_MAKE_TAG('a', 'b', 'v', 's'), AboveSubstProperty }, - { HB_MAKE_TAG('p', 's', 't', 's'), PostSubstProperty }, - { HB_MAKE_TAG('r', 'l', 'i', 'g'), CligProperty }, /* Myanmar1 uses this instead of the other features */ - { 0, 0 } -}; -#endif - - -/* -// Visual order before shaping should be: -// -// [Vowel Mark E] -// [Virama + Medial Ra] -// [Base] -// [Virama + Consonant] -// [Nga + Virama] (Kinzi) ### should probably come before post forms (medial ya) -// [Vowels] -// [Marks] -// -// This means that we can keep the logical order apart from having to -// move the pre vowel, medial ra and kinzi -*/ - -static HB_Bool myanmar_shape_syllable(HB_Bool openType, HB_ShaperItem *item, HB_Bool invalid) -{ - /* -// MMDEBUG("\nsyllable from %d len %d, str='%s'", item->item.pos, item->item.length, -// item->string->mid(item->from, item->length).toUtf8().data()); - */ - -#ifndef NO_OPENTYPE - const int availableGlyphs = item->num_glyphs; -#endif - const HB_UChar16 *uc = item->string + item->item.pos; - int vowel_e = -1; - int kinzi = -1; - int medial_ra = -1; - int base = -1; - int i; - int len = 0; - unsigned short reordered[32]; - unsigned char properties[32]; - enum { - AboveForm = 0x01, - PreForm = 0x02, - PostForm = 0x04, - BelowForm = 0x08 - }; - HB_Bool lastWasVirama = FALSE; - int basePos = -1; - - memset(properties, 0, 32*sizeof(unsigned char)); - - /* according to the table the max length of a syllable should be around 14 chars */ - assert(item->item.length < 32); - -#ifdef MYANMAR_DEBUG - printf("original:"); - for (i = 0; i < (int)item->item.length; i++) { - printf(" %d: %4x", i, uc[i]); - } -#endif - for (i = 0; i < (int)item->item.length; ++i) { - HB_UChar16 chr = uc[i]; - - if (chr == Mymr_C_VOWEL_E) { - vowel_e = i; - continue; - } - if (i == 0 - && chr == Mymr_C_NGA - && i + 2 < (int)item->item.length - && uc[i+1] == Mymr_C_VIRAMA) { - int mc = getMyanmarCharClass(uc[i+2]); - /*MMDEBUG("maybe kinzi: mc=%x", mc);*/ - if ((mc & Mymr_CF_CONSONANT) == Mymr_CF_CONSONANT) { - kinzi = i; - continue; - } - } - if (base >= 0 - && chr == Mymr_C_VIRAMA - && i + 1 < (int)item->item.length - && uc[i+1] == Mymr_C_RA) { - medial_ra = i; - continue; - } - if (base < 0) - base = i; - } - - MMDEBUG("\n base=%d, vowel_e=%d, kinzi=%d, medial_ra=%d", base, vowel_e, kinzi, medial_ra); - /* write vowel_e if found */ - if (vowel_e >= 0) { - reordered[0] = Mymr_C_VOWEL_E; - len = 1; - } - /* write medial_ra */ - if (medial_ra >= 0) { - reordered[len] = Mymr_C_VIRAMA; - reordered[len+1] = Mymr_C_RA; - properties[len] = PreForm; - properties[len+1] = PreForm; - len += 2; - } - - /* shall we add a dotted circle? - If in the position in which the base should be (first char in the string) there is - a character that has the Dotted circle flag (a character that cannot be a base) - then write a dotted circle */ - if (invalid) { - reordered[len] = C_DOTTED_CIRCLE; - ++len; - } - - /* copy the rest of the syllable to the output, inserting the kinzi - at the correct place */ - for (i = 0; i < (int)item->item.length; ++i) { - hb_uint16 chr = uc[i]; - MymrCharClass cc; - if (i == vowel_e) - continue; - if (i == medial_ra || i == kinzi) { - ++i; - continue; - } - - cc = getMyanmarCharClass(uc[i]); - if (kinzi >= 0 && i > base && (cc & Mymr_CF_AFTER_KINZI)) { - reordered[len] = Mymr_C_NGA; - reordered[len+1] = Mymr_C_VIRAMA; - properties[len-1] = AboveForm; - properties[len] = AboveForm; - len += 2; - kinzi = -1; - } - - if (lastWasVirama) { - int prop = 0; - switch(cc & Mymr_CF_POS_MASK) { - case Mymr_CF_POS_BEFORE: - prop = PreForm; - break; - case Mymr_CF_POS_BELOW: - prop = BelowForm; - break; - case Mymr_CF_POS_ABOVE: - prop = AboveForm; - break; - case Mymr_CF_POS_AFTER: - prop = PostForm; - break; - default: - break; - } - properties[len-1] = prop; - properties[len] = prop; - if(basePos >= 0 && basePos == len-2) - properties[len-2] = prop; - } - lastWasVirama = (chr == Mymr_C_VIRAMA); - if(i == base) - basePos = len; - - if ((chr != Mymr_C_SIGN_ZWNJ && chr != Mymr_C_SIGN_ZWJ) || !len) { - reordered[len] = chr; - ++len; - } - } - if (kinzi >= 0) { - reordered[len] = Mymr_C_NGA; - reordered[len+1] = Mymr_C_VIRAMA; - properties[len] = AboveForm; - properties[len+1] = AboveForm; - len += 2; - } - - if (!item->font->klass->convertStringToGlyphIndices(item->font, - reordered, len, - item->glyphs, &item->num_glyphs, - item->item.bidiLevel % 2)) - return FALSE; - - MMDEBUG("after shaping: len=%d", len); - for (i = 0; i < len; i++) { - item->attributes[i].mark = FALSE; - item->attributes[i].clusterStart = FALSE; - item->attributes[i].justification = 0; - item->attributes[i].zeroWidth = FALSE; - MMDEBUG(" %d: %4x property=%x", i, reordered[i], properties[i]); - } - - /* now we have the syllable in the right order, and can start running it through open type. */ - -#ifndef NO_OPENTYPE - if (openType) { - unsigned short logClusters[32]; - hb_uint32 where[32]; - - for (i = 0; i < len; ++i) - logClusters[i] = i; - - for (i = 0; i < len; ++i) { - where[i] = ~(PreSubstProperty - | BelowSubstProperty - | AboveSubstProperty - | PostSubstProperty - | CligProperty - | PositioningProperties); - if (properties[i] & PreForm) - where[i] &= ~PreFormProperty; - if (properties[i] & BelowForm) - where[i] &= ~BelowFormProperty; - if (properties[i] & AboveForm) - where[i] &= ~AboveFormProperty; - if (properties[i] & PostForm) - where[i] &= ~PostFormProperty; - } - - HB_OpenTypeShape(item, where); - if (!HB_OpenTypePosition(item, availableGlyphs, /*doLogClusters*/FALSE)) - return FALSE; - } else -#endif - { - MMDEBUG("Not using openType"); - HB_HeuristicPosition(item); - } - - item->attributes[0].clusterStart = TRUE; - return TRUE; -} - -HB_Bool HB_MyanmarShape(HB_ShaperItem *item) -{ - HB_Bool openType = FALSE; - unsigned short *logClusters = item->log_clusters; - - HB_ShaperItem syllable = *item; - int first_glyph = 0; - - int sstart = item->item.pos; - int end = sstart + item->item.length; - int i = 0; - - assert(item->item.script == HB_Script_Myanmar); -#ifndef NO_OPENTYPE - openType = HB_SelectScript(item, myanmar_features); -#endif - - MMDEBUG("myanmar_shape: from %d length %d", item->item.pos, item->item.length); - while (sstart < end) { - HB_Bool invalid; - int send = myanmar_nextSyllableBoundary(item->string, sstart, end, &invalid); - MMDEBUG("syllable from %d, length %d, invalid=%s", sstart, send-sstart, - invalid ? "TRUE" : "FALSE"); - syllable.item.pos = sstart; - syllable.item.length = send-sstart; - syllable.glyphs = item->glyphs + first_glyph; - syllable.attributes = item->attributes + first_glyph; - syllable.advances = item->advances + first_glyph; - syllable.offsets = item->offsets + first_glyph; - syllable.num_glyphs = item->num_glyphs - first_glyph; - if (!myanmar_shape_syllable(openType, &syllable, invalid)) { - MMDEBUG("syllable shaping failed, syllable requests %d glyphs", syllable.num_glyphs); - item->num_glyphs += syllable.num_glyphs; - return FALSE; - } - - /* fix logcluster array */ - MMDEBUG("syllable:"); - for (i = first_glyph; i < first_glyph + (int)syllable.num_glyphs; ++i) - MMDEBUG(" %d -> glyph %x", i, item->glyphs[i]); - MMDEBUG(" logclusters:"); - for (i = sstart; i < send; ++i) { - MMDEBUG(" %d -> glyph %d", i, first_glyph); - logClusters[i-item->item.pos] = first_glyph; - } - sstart = send; - first_glyph += syllable.num_glyphs; - } - item->num_glyphs = first_glyph; - return TRUE; -} - -void HB_MyanmarAttributes(HB_Script script, const HB_UChar16 *text, hb_uint32 from, hb_uint32 len, HB_CharAttributes *attributes) -{ - int end = from + len; - const HB_UChar16 *uc = text + from; - hb_uint32 i = 0; - HB_UNUSED(script); - attributes += from; - while (i < len) { - HB_Bool invalid; - hb_uint32 boundary = myanmar_nextSyllableBoundary(text, from+i, end, &invalid) - from; - - attributes[i].charStop = TRUE; - if (i) - attributes[i-1].lineBreakType = HB_Break; - - if (boundary > len-1) - boundary = len; - i++; - while (i < boundary) { - attributes[i].charStop = FALSE; - ++uc; - ++i; - } - assert(i == boundary); - } -} - diff --git a/third_party/harfbuzz/src/harfbuzz-open-private.h b/third_party/harfbuzz/src/harfbuzz-open-private.h deleted file mode 100644 index 73dd383d52..0000000000 --- a/third_party/harfbuzz/src/harfbuzz-open-private.h +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Copyright (C) 1998-2004 David Turner and Werner Lemberg - * Copyright (C) 2006 Behdad Esfahbod - * - * This is part of HarfBuzz, an OpenType Layout engine library. - * - * Permission is hereby granted, without written agreement and without - * license or royalty fees, to use, copy, modify, and distribute this - * software and its documentation for any purpose, provided that the - * above copyright notice and the following two paragraphs appear in - * all copies of this software. - * - * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR - * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES - * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN - * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE. - * - * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, - * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS - * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO - * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. - */ - -#ifndef HARFBUZZ_OPEN_PRIVATE_H -#define HARFBUZZ_OPEN_PRIVATE_H - -#include "harfbuzz-impl.h" -#include "harfbuzz-open.h" -#include "harfbuzz-gsub-private.h" -#include "harfbuzz-gpos-private.h" - -HB_BEGIN_HEADER - - -struct HB_SubTable_ -{ - union - { - HB_GSUB_SubTable gsub; - HB_GPOS_SubTable gpos; - } st; -}; - - -HB_INTERNAL HB_Error -_HB_OPEN_Load_ScriptList( HB_ScriptList* sl, - HB_Stream input ); -HB_INTERNAL HB_Error -_HB_OPEN_Load_FeatureList( HB_FeatureList* fl, - HB_Stream input ); -HB_INTERNAL HB_Error -_HB_OPEN_Load_LookupList( HB_LookupList* ll, - HB_Stream input, - HB_Type type ); - -HB_INTERNAL HB_Error -_HB_OPEN_Load_Coverage( HB_Coverage* c, - HB_Stream input ); -HB_INTERNAL HB_Error -_HB_OPEN_Load_ClassDefinition( HB_ClassDefinition* cd, - HB_UShort limit, - HB_Stream input ); -HB_INTERNAL HB_Error -_HB_OPEN_Load_EmptyOrClassDefinition( HB_ClassDefinition* cd, - HB_UShort limit, - HB_UInt class_offset, - HB_UInt base_offset, - HB_Stream input ); -HB_INTERNAL HB_Error -_HB_OPEN_Load_Device( HB_Device* d, - HB_Stream input ); - -HB_INTERNAL void _HB_OPEN_Free_ScriptList( HB_ScriptList* sl ); -HB_INTERNAL void _HB_OPEN_Free_FeatureList( HB_FeatureList* fl ); -HB_INTERNAL void _HB_OPEN_Free_LookupList( HB_LookupList* ll, - HB_Type type ); - -HB_INTERNAL void _HB_OPEN_Free_Coverage( HB_Coverage* c ); -HB_INTERNAL void _HB_OPEN_Free_ClassDefinition( HB_ClassDefinition* cd ); -HB_INTERNAL void _HB_OPEN_Free_Device( HB_Device* d ); - - - -HB_INTERNAL HB_Error -_HB_OPEN_Coverage_Index( HB_Coverage* c, - HB_UShort glyphID, - HB_UShort* index ); -HB_INTERNAL HB_Error -_HB_OPEN_Get_Class( HB_ClassDefinition* cd, - HB_UShort glyphID, - HB_UShort* klass, - HB_UShort* index ); -HB_INTERNAL HB_Error -_HB_OPEN_Get_Device( HB_Device* d, - HB_UShort size, - HB_Short* value ); - -HB_END_HEADER - -#endif /* HARFBUZZ_OPEN_PRIVATE_H */ diff --git a/third_party/harfbuzz/src/harfbuzz-open.c b/third_party/harfbuzz/src/harfbuzz-open.c deleted file mode 100644 index 0fe1e4ddb3..0000000000 --- a/third_party/harfbuzz/src/harfbuzz-open.c +++ /dev/null @@ -1,1416 +0,0 @@ -/* - * Copyright (C) 1998-2004 David Turner and Werner Lemberg - * Copyright (C) 2006 Behdad Esfahbod - * - * This is part of HarfBuzz, an OpenType Layout engine library. - * - * Permission is hereby granted, without written agreement and without - * license or royalty fees, to use, copy, modify, and distribute this - * software and its documentation for any purpose, provided that the - * above copyright notice and the following two paragraphs appear in - * all copies of this software. - * - * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR - * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES - * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN - * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE. - * - * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, - * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS - * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO - * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. - */ - -#include "harfbuzz-impl.h" -#include "harfbuzz-open-private.h" - - -/*************************** - * Script related functions - ***************************/ - - -/* LangSys */ - -static HB_Error Load_LangSys( HB_LangSys* ls, - HB_Stream stream ) -{ - HB_Error error; - HB_UShort n, count; - HB_UShort* fi; - - - if ( ACCESS_Frame( 6L ) ) - return error; - - ls->LookupOrderOffset = GET_UShort(); /* should be 0 */ - ls->ReqFeatureIndex = GET_UShort(); - count = ls->FeatureCount = GET_UShort(); - - FORGET_Frame(); - - ls->FeatureIndex = NULL; - - if ( ALLOC_ARRAY( ls->FeatureIndex, count, HB_UShort ) ) - return error; - - if ( ACCESS_Frame( count * 2L ) ) - { - FREE( ls->FeatureIndex ); - return error; - } - - fi = ls->FeatureIndex; - - for ( n = 0; n < count; n++ ) - fi[n] = GET_UShort(); - - FORGET_Frame(); - - return HB_Err_Ok; -} - - -static void Free_LangSys( HB_LangSys* ls ) -{ - FREE( ls->FeatureIndex ); -} - - -/* Script */ - -static HB_Error Load_Script( HB_ScriptTable* s, - HB_Stream stream ) -{ - HB_Error error; - HB_UShort n, m, count; - HB_UInt cur_offset, new_offset, base_offset; - - HB_LangSysRecord* lsr; - - - base_offset = FILE_Pos(); - - if ( ACCESS_Frame( 2L ) ) - return error; - - new_offset = GET_UShort() + base_offset; - - FORGET_Frame(); - - if ( new_offset != base_offset ) /* not a NULL offset */ - { - cur_offset = FILE_Pos(); - if ( FILE_Seek( new_offset ) || - ( error = Load_LangSys( &s->DefaultLangSys, - stream ) ) != HB_Err_Ok ) - return error; - (void)FILE_Seek( cur_offset ); - } - else - { - /* we create a DefaultLangSys table with no entries */ - - s->DefaultLangSys.LookupOrderOffset = 0; - s->DefaultLangSys.ReqFeatureIndex = 0xFFFF; - s->DefaultLangSys.FeatureCount = 0; - s->DefaultLangSys.FeatureIndex = NULL; - } - - if ( ACCESS_Frame( 2L ) ) - goto Fail2; - - count = s->LangSysCount = GET_UShort(); - - /* safety check; otherwise the official handling of TrueType Open - fonts won't work */ - - if ( s->LangSysCount == 0 && s->DefaultLangSys.FeatureCount == 0 ) - { - error = HB_Err_Not_Covered; - goto Fail2; - } - - FORGET_Frame(); - - s->LangSysRecord = NULL; - - if ( ALLOC_ARRAY( s->LangSysRecord, count, HB_LangSysRecord ) ) - goto Fail2; - - lsr = s->LangSysRecord; - - for ( n = 0; n < count; n++ ) - { - if ( ACCESS_Frame( 6L ) ) - goto Fail1; - - lsr[n].LangSysTag = GET_ULong(); - new_offset = GET_UShort() + base_offset; - - FORGET_Frame(); - - cur_offset = FILE_Pos(); - if ( FILE_Seek( new_offset ) || - ( error = Load_LangSys( &lsr[n].LangSys, stream ) ) != HB_Err_Ok ) - goto Fail1; - (void)FILE_Seek( cur_offset ); - } - - return HB_Err_Ok; - -Fail1: - for ( m = 0; m < n; m++ ) - Free_LangSys( &lsr[m].LangSys ); - - FREE( s->LangSysRecord ); - -Fail2: - Free_LangSys( &s->DefaultLangSys ); - return error; -} - - -static void Free_Script( HB_ScriptTable* s ) -{ - HB_UShort n, count; - - HB_LangSysRecord* lsr; - - - Free_LangSys( &s->DefaultLangSys ); - - if ( s->LangSysRecord ) - { - count = s->LangSysCount; - lsr = s->LangSysRecord; - - for ( n = 0; n < count; n++ ) - Free_LangSys( &lsr[n].LangSys ); - - FREE( lsr ); - } -} - - -/* ScriptList */ - -HB_INTERNAL HB_Error -_HB_OPEN_Load_ScriptList( HB_ScriptList* sl, - HB_Stream stream ) -{ - HB_Error error; - - HB_UShort n, script_count; - HB_UInt cur_offset, new_offset, base_offset; - - HB_ScriptRecord* sr; - - - base_offset = FILE_Pos(); - - if ( ACCESS_Frame( 2L ) ) - return error; - - script_count = GET_UShort(); - - FORGET_Frame(); - - sl->ScriptRecord = NULL; - - if ( ALLOC_ARRAY( sl->ScriptRecord, script_count, HB_ScriptRecord ) ) - return error; - - sr = sl->ScriptRecord; - - sl->ScriptCount= 0; - for ( n = 0; n < script_count; n++ ) - { - if ( ACCESS_Frame( 6L ) ) - goto Fail; - - sr[sl->ScriptCount].ScriptTag = GET_ULong(); - new_offset = GET_UShort() + base_offset; - - FORGET_Frame(); - - cur_offset = FILE_Pos(); - - if ( FILE_Seek( new_offset ) ) - goto Fail; - - error = Load_Script( &sr[sl->ScriptCount].Script, stream ); - if ( error == HB_Err_Ok ) - sl->ScriptCount += 1; - else if ( error != HB_Err_Not_Covered ) - goto Fail; - - (void)FILE_Seek( cur_offset ); - } - - /* Empty tables are harmless and generated by fontforge. - * See http://bugzilla.gnome.org/show_bug.cgi?id=347073 - */ -#if 0 - if ( sl->ScriptCount == 0 ) - { - error = ERR(HB_Err_Invalid_SubTable); - goto Fail; - } -#endif - - return HB_Err_Ok; - -Fail: - for ( n = 0; n < sl->ScriptCount; n++ ) - Free_Script( &sr[n].Script ); - - FREE( sl->ScriptRecord ); - return error; -} - - -HB_INTERNAL void -_HB_OPEN_Free_ScriptList( HB_ScriptList* sl ) -{ - HB_UShort n, count; - - HB_ScriptRecord* sr; - - - if ( sl->ScriptRecord ) - { - count = sl->ScriptCount; - sr = sl->ScriptRecord; - - for ( n = 0; n < count; n++ ) - Free_Script( &sr[n].Script ); - - FREE( sr ); - } -} - - - -/********************************* - * Feature List related functions - *********************************/ - - -/* Feature */ - -static HB_Error Load_Feature( HB_Feature* f, - HB_Stream stream ) -{ - HB_Error error; - - HB_UShort n, count; - - HB_UShort* lli; - - - if ( ACCESS_Frame( 4L ) ) - return error; - - f->FeatureParams = GET_UShort(); /* should be 0 */ - count = f->LookupListCount = GET_UShort(); - - FORGET_Frame(); - - f->LookupListIndex = NULL; - - if ( ALLOC_ARRAY( f->LookupListIndex, count, HB_UShort ) ) - return error; - - lli = f->LookupListIndex; - - if ( ACCESS_Frame( count * 2L ) ) - { - FREE( f->LookupListIndex ); - return error; - } - - for ( n = 0; n < count; n++ ) - lli[n] = GET_UShort(); - - FORGET_Frame(); - - return HB_Err_Ok; -} - - -static void Free_Feature( HB_Feature* f ) -{ - FREE( f->LookupListIndex ); -} - - -/* FeatureList */ - -HB_INTERNAL HB_Error -_HB_OPEN_Load_FeatureList( HB_FeatureList* fl, - HB_Stream stream ) -{ - HB_Error error; - - HB_UShort n, m, count; - HB_UInt cur_offset, new_offset, base_offset; - - HB_FeatureRecord* fr; - - - base_offset = FILE_Pos(); - - if ( ACCESS_Frame( 2L ) ) - return error; - - count = fl->FeatureCount = GET_UShort(); - - FORGET_Frame(); - - fl->FeatureRecord = NULL; - - if ( ALLOC_ARRAY( fl->FeatureRecord, count, HB_FeatureRecord ) ) - return error; - if ( ALLOC_ARRAY( fl->ApplyOrder, count, HB_UShort ) ) - goto Fail2; - - fl->ApplyCount = 0; - - fr = fl->FeatureRecord; - - for ( n = 0; n < count; n++ ) - { - if ( ACCESS_Frame( 6L ) ) - goto Fail1; - - fr[n].FeatureTag = GET_ULong(); - new_offset = GET_UShort() + base_offset; - - FORGET_Frame(); - - cur_offset = FILE_Pos(); - if ( FILE_Seek( new_offset ) || - ( error = Load_Feature( &fr[n].Feature, stream ) ) != HB_Err_Ok ) - goto Fail1; - (void)FILE_Seek( cur_offset ); - } - - return HB_Err_Ok; - -Fail1: - for ( m = 0; m < n; m++ ) - Free_Feature( &fr[m].Feature ); - - FREE( fl->ApplyOrder ); - -Fail2: - FREE( fl->FeatureRecord ); - - return error; -} - - -HB_INTERNAL void -_HB_OPEN_Free_FeatureList( HB_FeatureList* fl ) -{ - HB_UShort n, count; - - HB_FeatureRecord* fr; - - - if ( fl->FeatureRecord ) - { - count = fl->FeatureCount; - fr = fl->FeatureRecord; - - for ( n = 0; n < count; n++ ) - Free_Feature( &fr[n].Feature ); - - FREE( fr ); - } - - FREE( fl->ApplyOrder ); -} - - - -/******************************** - * Lookup List related functions - ********************************/ - -/* the subroutines of the following two functions are defined in - ftxgsub.c and ftxgpos.c respectively */ - - -/* SubTable */ - -static HB_Error Load_SubTable( HB_SubTable* st, - HB_Stream stream, - HB_Type table_type, - HB_UShort lookup_type ) -{ - if ( table_type == HB_Type_GSUB ) - return _HB_GSUB_Load_SubTable ( &st->st.gsub, stream, lookup_type ); - else - return _HB_GPOS_Load_SubTable ( &st->st.gpos, stream, lookup_type ); -} - - -static void Free_SubTable( HB_SubTable* st, - HB_Type table_type, - HB_UShort lookup_type ) -{ - if ( table_type == HB_Type_GSUB ) - _HB_GSUB_Free_SubTable ( &st->st.gsub, lookup_type ); - else - _HB_GPOS_Free_SubTable ( &st->st.gpos, lookup_type ); -} - - -/* Lookup */ - -static HB_Error Load_Lookup( HB_Lookup* l, - HB_Stream stream, - HB_Type type ) -{ - HB_Error error; - - HB_UShort n, m, count; - HB_UInt cur_offset, new_offset, base_offset; - - HB_SubTable* st; - - HB_Bool is_extension = FALSE; - - - base_offset = FILE_Pos(); - - if ( ACCESS_Frame( 6L ) ) - return error; - - l->LookupType = GET_UShort(); - l->LookupFlag = GET_UShort(); - count = l->SubTableCount = GET_UShort(); - - FORGET_Frame(); - - l->SubTable = NULL; - - if ( ALLOC_ARRAY( l->SubTable, count, HB_SubTable ) ) - return error; - - st = l->SubTable; - - if ( ( type == HB_Type_GSUB && l->LookupType == HB_GSUB_LOOKUP_EXTENSION ) || - ( type == HB_Type_GPOS && l->LookupType == HB_GPOS_LOOKUP_EXTENSION ) ) - is_extension = TRUE; - - for ( n = 0; n < count; n++ ) - { - if ( ACCESS_Frame( 2L ) ) - goto Fail; - - new_offset = GET_UShort() + base_offset; - - FORGET_Frame(); - - cur_offset = FILE_Pos(); - - if ( is_extension ) - { - if ( FILE_Seek( new_offset ) || ACCESS_Frame( 8L ) ) - goto Fail; - - if (GET_UShort() != 1) /* format should be 1 */ - goto Fail; - - l->LookupType = GET_UShort(); - new_offset += GET_ULong(); - - FORGET_Frame(); - } - - if ( FILE_Seek( new_offset ) || - ( error = Load_SubTable( &st[n], stream, - type, l->LookupType ) ) != HB_Err_Ok ) - goto Fail; - (void)FILE_Seek( cur_offset ); - } - - return HB_Err_Ok; - -Fail: - for ( m = 0; m < n; m++ ) - Free_SubTable( &st[m], type, l->LookupType ); - - FREE( l->SubTable ); - return error; -} - - -static void Free_Lookup( HB_Lookup* l, - HB_Type type) -{ - HB_UShort n, count; - - HB_SubTable* st; - - - if ( l->SubTable ) - { - count = l->SubTableCount; - st = l->SubTable; - - for ( n = 0; n < count; n++ ) - Free_SubTable( &st[n], type, l->LookupType ); - - FREE( st ); - } -} - - -/* LookupList */ - -HB_INTERNAL HB_Error -_HB_OPEN_Load_LookupList( HB_LookupList* ll, - HB_Stream stream, - HB_Type type ) -{ - HB_Error error; - - HB_UShort n, m, count; - HB_UInt cur_offset, new_offset, base_offset; - - HB_Lookup* l; - - - base_offset = FILE_Pos(); - - if ( ACCESS_Frame( 2L ) ) - return error; - - count = ll->LookupCount = GET_UShort(); - - FORGET_Frame(); - - ll->Lookup = NULL; - - if ( ALLOC_ARRAY( ll->Lookup, count, HB_Lookup ) ) - return error; - if ( ALLOC_ARRAY( ll->Properties, count, HB_UInt ) ) - goto Fail2; - - l = ll->Lookup; - - for ( n = 0; n < count; n++ ) - { - if ( ACCESS_Frame( 2L ) ) - goto Fail1; - - new_offset = GET_UShort() + base_offset; - - FORGET_Frame(); - - cur_offset = FILE_Pos(); - if ( FILE_Seek( new_offset ) || - ( error = Load_Lookup( &l[n], stream, type ) ) != HB_Err_Ok ) - goto Fail1; - (void)FILE_Seek( cur_offset ); - } - - return HB_Err_Ok; - -Fail1: - FREE( ll->Properties ); - - for ( m = 0; m < n; m++ ) - Free_Lookup( &l[m], type ); - -Fail2: - FREE( ll->Lookup ); - return error; -} - - -HB_INTERNAL void -_HB_OPEN_Free_LookupList( HB_LookupList* ll, - HB_Type type ) -{ - HB_UShort n, count; - - HB_Lookup* l; - - - FREE( ll->Properties ); - - if ( ll->Lookup ) - { - count = ll->LookupCount; - l = ll->Lookup; - - for ( n = 0; n < count; n++ ) - Free_Lookup( &l[n], type ); - - FREE( l ); - } -} - - - -/***************************** - * Coverage related functions - *****************************/ - - -/* CoverageFormat1 */ - -static HB_Error Load_Coverage1( HB_CoverageFormat1* cf1, - HB_Stream stream ) -{ - HB_Error error; - - HB_UShort n, count; - - HB_UShort* ga; - - - if ( ACCESS_Frame( 2L ) ) - return error; - - count = cf1->GlyphCount = GET_UShort(); - - FORGET_Frame(); - - cf1->GlyphArray = NULL; - - if ( ALLOC_ARRAY( cf1->GlyphArray, count, HB_UShort ) ) - return error; - - ga = cf1->GlyphArray; - - if ( ACCESS_Frame( count * 2L ) ) - { - FREE( cf1->GlyphArray ); - return error; - } - - for ( n = 0; n < count; n++ ) - ga[n] = GET_UShort(); - - FORGET_Frame(); - - return HB_Err_Ok; -} - - -static void Free_Coverage1( HB_CoverageFormat1* cf1) -{ - FREE( cf1->GlyphArray ); -} - - -/* CoverageFormat2 */ - -static HB_Error Load_Coverage2( HB_CoverageFormat2* cf2, - HB_Stream stream ) -{ - HB_Error error; - - HB_UShort n, count; - - HB_RangeRecord* rr; - - - if ( ACCESS_Frame( 2L ) ) - return error; - - count = cf2->RangeCount = GET_UShort(); - - FORGET_Frame(); - - cf2->RangeRecord = NULL; - - if ( ALLOC_ARRAY( cf2->RangeRecord, count, HB_RangeRecord ) ) - return error; - - rr = cf2->RangeRecord; - - if ( ACCESS_Frame( count * 6L ) ) - goto Fail; - - for ( n = 0; n < count; n++ ) - { - rr[n].Start = GET_UShort(); - rr[n].End = GET_UShort(); - rr[n].StartCoverageIndex = GET_UShort(); - - /* sanity check; we are limited to 16bit integers */ - if ( rr[n].Start > rr[n].End || - ( rr[n].End - rr[n].Start + (long)rr[n].StartCoverageIndex ) >= - 0x10000L ) - { - error = ERR(HB_Err_Invalid_SubTable); - goto Fail; - } - } - - FORGET_Frame(); - - return HB_Err_Ok; - -Fail: - FREE( cf2->RangeRecord ); - return error; -} - - -static void Free_Coverage2( HB_CoverageFormat2* cf2 ) -{ - FREE( cf2->RangeRecord ); -} - - -HB_INTERNAL HB_Error -_HB_OPEN_Load_Coverage( HB_Coverage* c, - HB_Stream stream ) -{ - HB_Error error; - - if ( ACCESS_Frame( 2L ) ) - return error; - - c->CoverageFormat = GET_UShort(); - - FORGET_Frame(); - - switch ( c->CoverageFormat ) - { - case 1: return Load_Coverage1( &c->cf.cf1, stream ); - case 2: return Load_Coverage2( &c->cf.cf2, stream ); - default: return ERR(HB_Err_Invalid_SubTable_Format); - } - - return HB_Err_Ok; /* never reached */ -} - - -HB_INTERNAL void -_HB_OPEN_Free_Coverage( HB_Coverage* c ) -{ - switch ( c->CoverageFormat ) - { - case 1: Free_Coverage1( &c->cf.cf1 ); break; - case 2: Free_Coverage2( &c->cf.cf2 ); break; - default: break; - } -} - - -static HB_Error Coverage_Index1( HB_CoverageFormat1* cf1, - HB_UShort glyphID, - HB_UShort* index ) -{ - HB_UShort min, max, new_min, new_max, middle; - - HB_UShort* array = cf1->GlyphArray; - - - /* binary search */ - - if ( cf1->GlyphCount == 0 ) - return HB_Err_Not_Covered; - - new_min = 0; - new_max = cf1->GlyphCount - 1; - - do - { - min = new_min; - max = new_max; - - /* we use (min + max) / 2 = max - (max - min) / 2 to avoid - overflow and rounding errors */ - - middle = max - ( ( max - min ) >> 1 ); - - if ( glyphID == array[middle] ) - { - *index = middle; - return HB_Err_Ok; - } - else if ( glyphID < array[middle] ) - { - if ( middle == min ) - break; - new_max = middle - 1; - } - else - { - if ( middle == max ) - break; - new_min = middle + 1; - } - } while ( min < max ); - - return HB_Err_Not_Covered; -} - - -static HB_Error Coverage_Index2( HB_CoverageFormat2* cf2, - HB_UShort glyphID, - HB_UShort* index ) -{ - HB_UShort min, max, new_min, new_max, middle; - - HB_RangeRecord* rr = cf2->RangeRecord; - - - /* binary search */ - - if ( cf2->RangeCount == 0 ) - return HB_Err_Not_Covered; - - new_min = 0; - new_max = cf2->RangeCount - 1; - - do - { - min = new_min; - max = new_max; - - /* we use (min + max) / 2 = max - (max - min) / 2 to avoid - overflow and rounding errors */ - - middle = max - ( ( max - min ) >> 1 ); - - if ( glyphID >= rr[middle].Start && glyphID <= rr[middle].End ) - { - *index = rr[middle].StartCoverageIndex + glyphID - rr[middle].Start; - return HB_Err_Ok; - } - else if ( glyphID < rr[middle].Start ) - { - if ( middle == min ) - break; - new_max = middle - 1; - } - else - { - if ( middle == max ) - break; - new_min = middle + 1; - } - } while ( min < max ); - - return HB_Err_Not_Covered; -} - - -HB_INTERNAL HB_Error -_HB_OPEN_Coverage_Index( HB_Coverage* c, - HB_UShort glyphID, - HB_UShort* index ) -{ - switch ( c->CoverageFormat ) - { - case 1: return Coverage_Index1( &c->cf.cf1, glyphID, index ); - case 2: return Coverage_Index2( &c->cf.cf2, glyphID, index ); - default: return ERR(HB_Err_Invalid_SubTable_Format); - } - - return HB_Err_Ok; /* never reached */ -} - - - -/************************************* - * Class Definition related functions - *************************************/ - - -/* ClassDefFormat1 */ - -static HB_Error Load_ClassDef1( HB_ClassDefinition* cd, - HB_UShort limit, - HB_Stream stream ) -{ - HB_Error error; - - HB_UShort n, count; - - HB_UShort* cva; - - HB_ClassDefFormat1* cdf1; - - - cdf1 = &cd->cd.cd1; - - if ( ACCESS_Frame( 4L ) ) - return error; - - cdf1->StartGlyph = GET_UShort(); - count = cdf1->GlyphCount = GET_UShort(); - - FORGET_Frame(); - - /* sanity check; we are limited to 16bit integers */ - - if ( cdf1->StartGlyph + (long)count >= 0x10000L ) - return ERR(HB_Err_Invalid_SubTable); - - cdf1->ClassValueArray = NULL; - - if ( ALLOC_ARRAY( cdf1->ClassValueArray, count, HB_UShort ) ) - return error; - - cva = cdf1->ClassValueArray; - - if ( ACCESS_Frame( count * 2L ) ) - goto Fail; - - for ( n = 0; n < count; n++ ) - { - cva[n] = GET_UShort(); - if ( cva[n] >= limit ) - { - error = ERR(HB_Err_Invalid_SubTable); - goto Fail; - } - } - - FORGET_Frame(); - - return HB_Err_Ok; - -Fail: - FREE( cva ); - - return error; -} - - -static void Free_ClassDef1( HB_ClassDefFormat1* cdf1 ) -{ - FREE( cdf1->ClassValueArray ); -} - - -/* ClassDefFormat2 */ - -static HB_Error Load_ClassDef2( HB_ClassDefinition* cd, - HB_UShort limit, - HB_Stream stream ) -{ - HB_Error error; - - HB_UShort n, count; - - HB_ClassRangeRecord* crr; - - HB_ClassDefFormat2* cdf2; - - - cdf2 = &cd->cd.cd2; - - if ( ACCESS_Frame( 2L ) ) - return error; - - count = GET_UShort(); - cdf2->ClassRangeCount = 0; /* zero for now. we fill with the number of good entries later */ - - FORGET_Frame(); - - cdf2->ClassRangeRecord = NULL; - - if ( ALLOC_ARRAY( cdf2->ClassRangeRecord, count, HB_ClassRangeRecord ) ) - return error; - - crr = cdf2->ClassRangeRecord; - - if ( ACCESS_Frame( count * 6L ) ) - goto Fail; - - for ( n = 0; n < count; n++ ) - { - crr[n].Start = GET_UShort(); - crr[n].End = GET_UShort(); - crr[n].Class = GET_UShort(); - - /* sanity check */ - - if ( crr[n].Start > crr[n].End || - crr[n].Class >= limit ) - { - /* XXX - * Corrupt entry. Skip it. - * This is hit by Nafees Nastaliq font for example - */ - n--; - count--; - } - } - - FORGET_Frame(); - - cdf2->ClassRangeCount = count; - - return HB_Err_Ok; - -Fail: - FREE( crr ); - - return error; -} - - -static void Free_ClassDef2( HB_ClassDefFormat2* cdf2 ) -{ - FREE( cdf2->ClassRangeRecord ); -} - - -/* ClassDefinition */ - -HB_INTERNAL HB_Error -_HB_OPEN_Load_ClassDefinition( HB_ClassDefinition* cd, - HB_UShort limit, - HB_Stream stream ) -{ - HB_Error error; - - if ( ACCESS_Frame( 2L ) ) - return error; - - cd->ClassFormat = GET_UShort(); - - FORGET_Frame(); - - switch ( cd->ClassFormat ) - { - case 1: error = Load_ClassDef1( cd, limit, stream ); break; - case 2: error = Load_ClassDef2( cd, limit, stream ); break; - default: error = ERR(HB_Err_Invalid_SubTable_Format); break; - } - - if ( error ) - return error; - - cd->loaded = TRUE; - - return HB_Err_Ok; -} - - -static HB_Error -_HB_OPEN_Load_EmptyClassDefinition( HB_ClassDefinition* cd ) -{ - HB_Error error; - - cd->ClassFormat = 1; /* Meaningless */ - - if ( ALLOC_ARRAY( cd->cd.cd1.ClassValueArray, 1, HB_UShort ) ) - return error; - - cd->loaded = TRUE; - - return HB_Err_Ok; -} - -HB_INTERNAL HB_Error -_HB_OPEN_Load_EmptyOrClassDefinition( HB_ClassDefinition* cd, - HB_UShort limit, - HB_UInt class_offset, - HB_UInt base_offset, - HB_Stream stream ) -{ - HB_Error error; - HB_UInt cur_offset; - - cur_offset = FILE_Pos(); - - if ( class_offset ) - { - if ( !FILE_Seek( class_offset + base_offset ) ) - error = _HB_OPEN_Load_ClassDefinition( cd, limit, stream ); - } - else - error = _HB_OPEN_Load_EmptyClassDefinition ( cd ); - - if (error == HB_Err_Ok) - (void)FILE_Seek( cur_offset ); /* Changes error as a side-effect */ - - return error; -} - -HB_INTERNAL void -_HB_OPEN_Free_ClassDefinition( HB_ClassDefinition* cd ) -{ - if ( !cd->loaded ) - return; - - switch ( cd->ClassFormat ) - { - case 1: Free_ClassDef1( &cd->cd.cd1 ); break; - case 2: Free_ClassDef2( &cd->cd.cd2 ); break; - default: break; - } -} - - -static HB_Error Get_Class1( HB_ClassDefFormat1* cdf1, - HB_UShort glyphID, - HB_UShort* klass, - HB_UShort* index ) -{ - HB_UShort* cva = cdf1->ClassValueArray; - - - if ( index ) - *index = 0; - - if ( glyphID >= cdf1->StartGlyph && - glyphID < cdf1->StartGlyph + cdf1->GlyphCount ) - { - *klass = cva[glyphID - cdf1->StartGlyph]; - return HB_Err_Ok; - } - else - { - *klass = 0; - return HB_Err_Not_Covered; - } -} - - -/* we need the index value of the last searched class range record - in case of failure for constructed GDEF tables */ - -static HB_Error Get_Class2( HB_ClassDefFormat2* cdf2, - HB_UShort glyphID, - HB_UShort* klass, - HB_UShort* index ) -{ - HB_Error error = HB_Err_Ok; - HB_UShort min, max, new_min, new_max, middle; - - HB_ClassRangeRecord* crr = cdf2->ClassRangeRecord; - - - /* binary search */ - - if ( cdf2->ClassRangeCount == 0 ) - { - *klass = 0; - if ( index ) - *index = 0; - - return HB_Err_Not_Covered; - } - - new_min = 0; - new_max = cdf2->ClassRangeCount - 1; - - do - { - min = new_min; - max = new_max; - - /* we use (min + max) / 2 = max - (max - min) / 2 to avoid - overflow and rounding errors */ - - middle = max - ( ( max - min ) >> 1 ); - - if ( glyphID >= crr[middle].Start && glyphID <= crr[middle].End ) - { - *klass = crr[middle].Class; - error = HB_Err_Ok; - break; - } - else if ( glyphID < crr[middle].Start ) - { - if ( middle == min ) - { - *klass = 0; - error = HB_Err_Not_Covered; - break; - } - new_max = middle - 1; - } - else - { - if ( middle == max ) - { - *klass = 0; - error = HB_Err_Not_Covered; - break; - } - new_min = middle + 1; - } - } while ( min < max ); - - if ( index ) - *index = middle; - - return error; -} - - -HB_INTERNAL HB_Error -_HB_OPEN_Get_Class( HB_ClassDefinition* cd, - HB_UShort glyphID, - HB_UShort* klass, - HB_UShort* index ) -{ - switch ( cd->ClassFormat ) - { - case 1: return Get_Class1( &cd->cd.cd1, glyphID, klass, index ); - case 2: return Get_Class2( &cd->cd.cd2, glyphID, klass, index ); - default: return ERR(HB_Err_Invalid_SubTable_Format); - } - - return HB_Err_Ok; /* never reached */ -} - - - -/*************************** - * Device related functions - ***************************/ - - -HB_INTERNAL HB_Error -_HB_OPEN_Load_Device( HB_Device* d, - HB_Stream stream ) -{ - HB_Error error; - - HB_UShort n, count; - - HB_UShort* dv; - - - if ( ACCESS_Frame( 6L ) ) - return error; - - d->StartSize = GET_UShort(); - d->EndSize = GET_UShort(); - d->DeltaFormat = GET_UShort(); - - FORGET_Frame(); - - d->DeltaValue = NULL; - - if ( d->StartSize > d->EndSize || - d->DeltaFormat == 0 || d->DeltaFormat > 3 ) - { - /* XXX - * I've seen fontforge generate DeltaFormat == 0. - * Just return Ok and let the NULL DeltaValue disable - * this table. - */ - return HB_Err_Ok; - } - - count = ( ( d->EndSize - d->StartSize + 1 ) >> - ( 4 - d->DeltaFormat ) ) + 1; - - if ( ALLOC_ARRAY( d->DeltaValue, count, HB_UShort ) ) - return error; - - if ( ACCESS_Frame( count * 2L ) ) - { - FREE( d->DeltaValue ); - return error; - } - - dv = d->DeltaValue; - - for ( n = 0; n < count; n++ ) - dv[n] = GET_UShort(); - - FORGET_Frame(); - - return HB_Err_Ok; -} - - -HB_INTERNAL void -_HB_OPEN_Free_Device( HB_Device* d ) -{ - FREE( d->DeltaValue ); -} - - -/* Since we have the delta values stored in compressed form, we must - uncompress it now. To simplify the interface, the function always - returns a meaningful value in `value'; the error is just for - information. - | | - format = 1: 0011223344556677|8899101112131415|... - | | - byte 1 byte 2 - - 00: (byte >> 14) & mask - 11: (byte >> 12) & mask - ... - - mask = 0x0003 - | | - format = 2: 0000111122223333|4444555566667777|... - | | - byte 1 byte 2 - - 0000: (byte >> 12) & mask - 1111: (byte >> 8) & mask - ... - - mask = 0x000F - | | - format = 3: 0000000011111111|2222222233333333|... - | | - byte 1 byte 2 - - 00000000: (byte >> 8) & mask - 11111111: (byte >> 0) & mask - .... - - mask = 0x00FF */ - -HB_INTERNAL HB_Error -_HB_OPEN_Get_Device( HB_Device* d, - HB_UShort size, - HB_Short* value ) -{ - HB_UShort byte, bits, mask, f, s; - - - f = d->DeltaFormat; - - if ( d->DeltaValue && size >= d->StartSize && size <= d->EndSize ) - { - s = size - d->StartSize; - byte = d->DeltaValue[s >> ( 4 - f )]; - bits = byte >> ( 16 - ( ( s % ( 1 << ( 4 - f ) ) + 1 ) << f ) ); - mask = 0xFFFF >> ( 16 - ( 1 << f ) ); - - *value = (HB_Short)( bits & mask ); - - /* conversion to a signed value */ - - if ( *value >= ( ( mask + 1 ) >> 1 ) ) - *value -= mask + 1; - - return HB_Err_Ok; - } - else - { - *value = 0; - return HB_Err_Not_Covered; - } -} - - -/* END */ diff --git a/third_party/harfbuzz/src/harfbuzz-open.h b/third_party/harfbuzz/src/harfbuzz-open.h deleted file mode 100644 index bdc635832e..0000000000 --- a/third_party/harfbuzz/src/harfbuzz-open.h +++ /dev/null @@ -1,282 +0,0 @@ -/* - * Copyright (C) 1998-2004 David Turner and Werner Lemberg - * Copyright (C) 2006 Behdad Esfahbod - * - * This is part of HarfBuzz, an OpenType Layout engine library. - * - * Permission is hereby granted, without written agreement and without - * license or royalty fees, to use, copy, modify, and distribute this - * software and its documentation for any purpose, provided that the - * above copyright notice and the following two paragraphs appear in - * all copies of this software. - * - * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR - * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES - * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN - * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE. - * - * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, - * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS - * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO - * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. - */ - -#ifndef HARFBUZZ_OPEN_H -#define HARFBUZZ_OPEN_H - -#include "harfbuzz-global.h" - -HB_BEGIN_HEADER - -/* Use this if a feature applies to all glyphs */ -#define HB_ALL_GLYPHS 0xFFFF - -#define HB_DEFAULT_LANGUAGE 0xFFFF - -#define HB_MAX_NESTING_LEVEL 100 - - -/* Script list related structures */ - -struct HB_LangSys_ -{ - HB_UShort LookupOrderOffset; /* always 0 for TT Open 1.0 */ - HB_UShort ReqFeatureIndex; /* required FeatureIndex */ - HB_UShort FeatureCount; /* number of Feature indices */ - HB_UShort* FeatureIndex; /* array of Feature indices */ -}; - -typedef struct HB_LangSys_ HB_LangSys; - - -struct HB_LangSysRecord_ -{ - HB_UInt LangSysTag; /* LangSysTag identifier */ - HB_LangSys LangSys; /* LangSys table */ -}; - -typedef struct HB_LangSysRecord_ HB_LangSysRecord; - - -struct HB_ScriptTable_ -{ - HB_LangSys DefaultLangSys; /* DefaultLangSys table */ - HB_UShort LangSysCount; /* number of LangSysRecords */ - HB_LangSysRecord* LangSysRecord; /* array of LangSysRecords */ -}; - -typedef struct HB_ScriptTable_ HB_ScriptTable; - - -struct HB_ScriptRecord_ -{ - HB_UInt ScriptTag; /* ScriptTag identifier */ - HB_ScriptTable Script; /* Script table */ -}; - -typedef struct HB_ScriptRecord_ HB_ScriptRecord; - - -struct HB_ScriptList_ -{ - HB_UShort ScriptCount; /* number of ScriptRecords */ - HB_ScriptRecord* ScriptRecord; /* array of ScriptRecords */ -}; - -typedef struct HB_ScriptList_ HB_ScriptList; - - -/* Feature list related structures */ - -struct HB_Feature_ -{ - HB_UShort FeatureParams; /* always 0 for TT Open 1.0 */ - HB_UShort LookupListCount; /* number of LookupList indices */ - HB_UShort* LookupListIndex; /* array of LookupList indices */ -}; - -typedef struct HB_Feature_ HB_Feature; - - -struct HB_FeatureRecord_ -{ - HB_UInt FeatureTag; /* FeatureTag identifier */ - HB_Feature Feature; /* Feature table */ -}; - -typedef struct HB_FeatureRecord_ HB_FeatureRecord; - - -struct HB_FeatureList_ -{ - HB_UShort FeatureCount; /* number of FeatureRecords */ - HB_FeatureRecord* FeatureRecord; /* array of FeatureRecords */ - HB_UShort* ApplyOrder; /* order to apply features */ - HB_UShort ApplyCount; /* number of elements in ApplyOrder */ -}; - -typedef struct HB_FeatureList_ HB_FeatureList; - - -/* Lookup list related structures */ - -typedef struct HB_SubTable_ HB_SubTable; - - -struct HB_Lookup_ -{ - HB_UShort LookupType; /* Lookup type */ - HB_UShort LookupFlag; /* Lookup qualifiers */ - HB_UShort SubTableCount; /* number of SubTables */ - HB_SubTable* SubTable; /* array of SubTables */ -}; - -typedef struct HB_Lookup_ HB_Lookup; - - -/* The `Properties' field is not defined in the OpenType specification but - is needed for processing lookups. If properties[n] is > 0, the - functions HB_GSUB_Apply_String() resp. HB_GPOS_Apply_String() will - process Lookup[n] for glyphs which have the specific bit not set in - the `properties' field of the input string object. */ - -struct HB_LookupList_ -{ - HB_UShort LookupCount; /* number of Lookups */ - HB_Lookup* Lookup; /* array of Lookup records */ - HB_UInt* Properties; /* array of flags */ -}; - -typedef struct HB_LookupList_ HB_LookupList; - - -/* Possible LookupFlag bit masks. `HB_LOOKUP_FLAG_IGNORE_SPECIAL_MARKS' comes from the - OpenType 1.2 specification; HB_LOOKUP_FLAG_RIGHT_TO_LEFT has been (re)introduced in - OpenType 1.3 -- if set, the last glyph in a cursive attachment - sequence has to be positioned on the baseline -- regardless of the - writing direction. */ - -#define HB_LOOKUP_FLAG_RIGHT_TO_LEFT 0x0001 -#define HB_LOOKUP_FLAG_IGNORE_BASE_GLYPHS 0x0002 -#define HB_LOOKUP_FLAG_IGNORE_LIGATURES 0x0004 -#define HB_LOOKUP_FLAG_IGNORE_MARKS 0x0008 -#define HB_LOOKUP_FLAG_IGNORE_SPECIAL_MARKS 0xFF00 - - -struct HB_CoverageFormat1_ -{ - HB_UShort GlyphCount; /* number of glyphs in GlyphArray */ - HB_UShort* GlyphArray; /* array of glyph IDs */ -}; - -typedef struct HB_CoverageFormat1_ HB_CoverageFormat1; - - -struct HB_RangeRecord_ -{ - HB_UShort Start; /* first glyph ID in the range */ - HB_UShort End; /* last glyph ID in the range */ - HB_UShort StartCoverageIndex; /* coverage index of first - glyph ID in the range */ -}; - -typedef struct HB_RangeRecord_ HB_RangeRecord; - - -struct HB_CoverageFormat2_ -{ - HB_UShort RangeCount; /* number of RangeRecords */ - HB_RangeRecord* RangeRecord; /* array of RangeRecords */ -}; - -typedef struct HB_CoverageFormat2_ HB_CoverageFormat2; - - -struct HB_Coverage_ -{ - HB_UShort CoverageFormat; /* 1 or 2 */ - - union - { - HB_CoverageFormat1 cf1; - HB_CoverageFormat2 cf2; - } cf; -}; - -typedef struct HB_Coverage_ HB_Coverage; - - -struct HB_ClassDefFormat1_ -{ - HB_UShort StartGlyph; /* first glyph ID of the - ClassValueArray */ - HB_UShort GlyphCount; /* size of the ClassValueArray */ - HB_UShort* ClassValueArray; /* array of class values */ -}; - -typedef struct HB_ClassDefFormat1_ HB_ClassDefFormat1; - - -struct HB_ClassRangeRecord_ -{ - HB_UShort Start; /* first glyph ID in the range */ - HB_UShort End; /* last glyph ID in the range */ - HB_UShort Class; /* applied to all glyphs in range */ -}; - -typedef struct HB_ClassRangeRecord_ HB_ClassRangeRecord; - - -struct HB_ClassDefFormat2_ -{ - HB_UShort ClassRangeCount; - /* number of ClassRangeRecords */ - HB_ClassRangeRecord* ClassRangeRecord; - /* array of ClassRangeRecords */ -}; - -typedef struct HB_ClassDefFormat2_ HB_ClassDefFormat2; - - -struct HB_ClassDefinition_ -{ - HB_Bool loaded; - - HB_UShort ClassFormat; /* 1 or 2 */ - - union - { - HB_ClassDefFormat1 cd1; - HB_ClassDefFormat2 cd2; - } cd; -}; - -typedef struct HB_ClassDefinition_ HB_ClassDefinition; - - -struct HB_Device_ -{ - HB_UShort StartSize; /* smallest size to correct */ - HB_UShort EndSize; /* largest size to correct */ - HB_UShort DeltaFormat; /* DeltaValue array data format: - 1, 2, or 3 */ - HB_UShort* DeltaValue; /* array of compressed data */ -}; - -typedef struct HB_Device_ HB_Device; - - -enum HB_Type_ -{ - HB_Type_GSUB, - HB_Type_GPOS -}; - -typedef enum HB_Type_ HB_Type; - - -HB_END_HEADER - -#endif /* HARFBUZZ_OPEN_H */ diff --git a/third_party/harfbuzz/src/harfbuzz-shape.h b/third_party/harfbuzz/src/harfbuzz-shape.h deleted file mode 100644 index e4b5f9ad8a..0000000000 --- a/third_party/harfbuzz/src/harfbuzz-shape.h +++ /dev/null @@ -1,199 +0,0 @@ -/* - * Copyright (C) 2006 Red Hat, Inc. - * - * This is part of HarfBuzz, an OpenType Layout engine library. - * - * Permission is hereby granted, without written agreement and without - * license or royalty fees, to use, copy, modify, and distribute this - * software and its documentation for any purpose, provided that the - * above copyright notice and the following two paragraphs appear in - * all copies of this software. - * - * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR - * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES - * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN - * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE. - * - * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, - * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS - * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO - * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. - * - * Red Hat Author(s): Owen Taylor - */ - -#include - -/* Base Types */ - -typedef hb_uint16 HB_CodePoint; /* UTF-16 codepoint (not character ) */ -typedef char HB_Boolean; -typedef hb_uint32 HB_Fixed; /* 26.6 */ -typedef hb_uint32 HB_Glyph; -typedef hb_uint32 HB_Unichar; - -/* Metrics reported by the font backend for use of the shaper */ -typedef struct _HB_GlyphMetrics HB_GlyphMetrics; -struct _HB_GlyphMetrics -{ - HB_Fixed advance; - - /* Do we need ink/logical extents for the glyph here? */ -}; - -/* - * HB_Font: Abstract font interface. - * First pass of this might just have FT_Face *getFace(); - */ -typedef struct _HB_Font HB_Font; -typedef struct _HB_FontClass HB_FontClass; - -struct HB_FontClass { - HB_Glyph (*charToGlyph)(HB_Font *font, HB_Unichar chr); - void (*getMetrics)(HB_Font *font, HB_Glyph glyph, HB_GlyphMetrics *metrics); - HB_Boolean (*getSFontTable)(HB_Font *font, void **cookie, char **start, int *len); - HB_Boolean (*freeSFontTable)(void **cookie); -}; - -struct _HB_Font { - HB_FontClass *clazz; -}; - -/* - * Language tags, of the form en-us; represented as interned, canonicalized - * strings. hb_language_from_string("en_US"), hb_language_from_string("en-us") - * both return the same (pointer-comparable) HB_Language). - */ -typedef struct HB_Language_ *HB_Language; - -HB_Language hb_language_from_string(const char *str); -const char *hb_language_to_string(HB_Language language); - -/* Special treatment for the edges of runs. - */ -typedef enum { - HB_RUN_EDGE_LINE_VISUAL_EDGE = 1 << 0, - HB_RUN_EDGE_LINE_LOGICAL_EDGE = 1 << 1, - HB_RUN_EDGE_LINE_ADD_HYPHEN = 1 << 2 /* ???? */ -} HB_RunEdge; - -/* Defines optional informaiton in HB_ShapeInput; this allows extension - * of HB_ShapeInput while keeping binary compatibility - */ -typedef enum { - HB_SHAPE_START_TYPE = 1 << 0, - HB_SHAPE_END_TYPE = 1 << 1 -} HB_ShapeFlags; - -/* Attributes types are described by "interned strings"; this is a little - * annoying if you want to write a switch statement, but keeps things - * simple. - */ -typedef struct _HB_AttributeType *HB_AttributeType; - -HB_AttributeType hb_attribute_type_from_string(const char *str); -const char *hb_attribute_type_to_string(HB_AttributeType attribute_type); - -struct HB_Attribute { - HB_AttributeType type; - int start; - int end; -}; - - -/** - * You could handle this like HB_Language, but an enum seems a little nicer; - * another approach would be to use OpenType script tags. - */ -typedef enum { - HB_SCRIPT_LATIN - /* ... */ -} HB_ShapeScript; - -/* This is just the subset of direction information needed by the shaper */ -typedef enum { - HB_DIRECTION_LTR, - HB_DIRECTION_RTL, - HB_DIRECTION_TTB -} HB_Direction; - -typedef struct _HB_ShapeInput HB_ShapeInput; -struct _HB_ShapeInput { - /* Defines what fields the caller has initialized - fields not in - * the enum are mandatory. - */ - HB_ShapeFlags flags; - - HB_CodePoint *text; - int length; /* total length of text to shape */ - int shape_offset; /* start of section to shape */ - int shape_length; /* number of code points to shape */ - - HB_Direction direction; - HB_ShapeScript script; - HB_Language language; - - HB_AttributeType *attributes; - int n_attributes; - - HB_RunEdge start_type; - HB_RunEdge end_type; -}; - -struct HB_GlyphItem { - HB_Glyph glyph; - - HB_Fixed x_offset; - HB_Fixed y_offset; - HB_Fixed advance; - - /* Add kashida information, etc, here */ -}; - -typedef enum { - HB_RESULT_SUCCESS, - HB_RESULT_NO_MEMORY, - HB_SHAPE_RESULT_FAILED -} HB_Result; - -/* - * Buffer for output - */ -typedef struct _HB_GlyphBuffer HB_GlyphBuffer; -struct _HB_GlyphBuffer { - int glyph_item_size; - int total_glyphs; - - int *log_clusters; /* Uniscribe style */ - int cluster_space; - - int glyph_space; - void *glyph_buffer; -}; - -/* Making this self-allocating simplifies writing shapers and - * also keeps things easier for caller. item_size passed in - * must be at least sizeof(HB_GlyphItem) but can be bigger, - * to accomodate application structures that extend HB_GlyphItem. - * The allocated items will be zero-initialized. - * - * (Hack: Harfbuzz could choose to use even a *bigger* item size - * and stick internal information before the public item structure. - * This hack could possibly be used to unify this with HB_Buffer) - */ -HB_GlyphBuffer *hb_glyph_buffer_new (size_t item_size); -void hb_glyph_buffer_clear (HB_GlyphBuffer *buf); -HB_Result hb_glyph_buffer_extend_glyphs (HB_GlyphBuffer *buf, int n_items); -HB_Result hb_glyph_buffer_extend_clusters (HB_GlyphBuffer *buf, int n_clusters); -void hb_glyph_buffer_free (HB_GlyphBuffer *buf); - - -/* Accessor for a particular glyph */ -#define HB_GLYPH_BUFFER_ITEM(buffer, index) - -/* - * Main shaping function - */ -HB_Result hb_shape(HB_ShapeInput *input, HB_GlyphBuffer *output); diff --git a/third_party/harfbuzz/src/harfbuzz-shaper-all.cpp b/third_party/harfbuzz/src/harfbuzz-shaper-all.cpp deleted file mode 100644 index d2f902fc9b..0000000000 --- a/third_party/harfbuzz/src/harfbuzz-shaper-all.cpp +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) - * - * This is part of HarfBuzz, an OpenType Layout engine library. - * - * Permission is hereby granted, without written agreement and without - * license or royalty fees, to use, copy, modify, and distribute this - * software and its documentation for any purpose, provided that the - * above copyright notice and the following two paragraphs appear in - * all copies of this software. - * - * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR - * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES - * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN - * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE. - * - * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, - * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS - * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO - * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. - */ - -#include "harfbuzz-shaper.cpp" -#include "harfbuzz-indic.cpp" -extern "C" { -#include "harfbuzz-tibetan.c" -#include "harfbuzz-khmer.c" -#include "harfbuzz-hebrew.c" -#include "harfbuzz-arabic.c" -#include "harfbuzz-hangul.c" -#include "harfbuzz-myanmar.c" -#include "harfbuzz-thai.c" -} - diff --git a/third_party/harfbuzz/src/harfbuzz-shaper-private.h b/third_party/harfbuzz/src/harfbuzz-shaper-private.h deleted file mode 100644 index 80bccf83d4..0000000000 --- a/third_party/harfbuzz/src/harfbuzz-shaper-private.h +++ /dev/null @@ -1,167 +0,0 @@ -/* - * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) - * - * This is part of HarfBuzz, an OpenType Layout engine library. - * - * Permission is hereby granted, without written agreement and without - * license or royalty fees, to use, copy, modify, and distribute this - * software and its documentation for any purpose, provided that the - * above copyright notice and the following two paragraphs appear in - * all copies of this software. - * - * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR - * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES - * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN - * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE. - * - * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, - * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS - * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO - * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. - */ - -#ifndef HARFBUZZ_SHAPER_PRIVATE_H -#define HARFBUZZ_SHAPER_PRIVATE_H - -HB_BEGIN_HEADER - -enum { - C_DOTTED_CIRCLE = 0x25CC -}; - -typedef enum -{ - HB_Combining_BelowLeftAttached = 200, - HB_Combining_BelowAttached = 202, - HB_Combining_BelowRightAttached = 204, - HB_Combining_LeftAttached = 208, - HB_Combining_RightAttached = 210, - HB_Combining_AboveLeftAttached = 212, - HB_Combining_AboveAttached = 214, - HB_Combining_AboveRightAttached = 216, - - HB_Combining_BelowLeft = 218, - HB_Combining_Below = 220, - HB_Combining_BelowRight = 222, - HB_Combining_Left = 224, - HB_Combining_Right = 226, - HB_Combining_AboveLeft = 228, - HB_Combining_Above = 230, - HB_Combining_AboveRight = 232, - - HB_Combining_DoubleBelow = 233, - HB_Combining_DoubleAbove = 234, - HB_Combining_IotaSubscript = 240 -} HB_CombiningClass; - -typedef enum { - CcmpProperty = 0x1, - InitProperty = 0x2, - IsolProperty = 0x4, - FinaProperty = 0x8, - MediProperty = 0x10, - RligProperty = 0x20, - CaltProperty = 0x40, - LigaProperty = 0x80, - DligProperty = 0x100, - CswhProperty = 0x200, - MsetProperty = 0x400, - - /* used by indic and myanmar shaper */ - NuktaProperty = 0x4, - AkhantProperty = 0x8, - RephProperty = 0x10, - PreFormProperty = 0x20, - BelowFormProperty = 0x40, - AboveFormProperty = 0x80, - HalfFormProperty = 0x100, - PostFormProperty = 0x200, - VattuProperty = 0x400, - PreSubstProperty = 0x800, - BelowSubstProperty = 0x1000, - AboveSubstProperty = 0x2000, - PostSubstProperty = 0x4000, - HalantProperty = 0x8000, - CligProperty = 0x10000 - -} HB_OpenTypeProperty; - -/* return true if ok. */ -typedef HB_Bool (*HB_ShapeFunction)(HB_ShaperItem *shaper_item); -typedef void (*HB_AttributeFunction)(HB_Script script, const HB_UChar16 *string, hb_uint32 from, hb_uint32 len, HB_CharAttributes *attributes); - -typedef struct { - HB_ShapeFunction shape; - HB_AttributeFunction charAttributes; -} HB_ScriptEngine; - -extern const HB_ScriptEngine hb_scriptEngines[]; - -extern HB_Bool HB_BasicShape(HB_ShaperItem *shaper_item); -extern HB_Bool HB_TibetanShape(HB_ShaperItem *shaper_item); -extern HB_Bool HB_HebrewShape(HB_ShaperItem *shaper_item); -extern HB_Bool HB_ArabicShape(HB_ShaperItem *shaper_item); -extern HB_Bool HB_HangulShape(HB_ShaperItem *shaper_item); -extern HB_Bool HB_MyanmarShape(HB_ShaperItem *shaper_item); -extern HB_Bool HB_KhmerShape(HB_ShaperItem *shaper_item); -extern HB_Bool HB_IndicShape(HB_ShaperItem *shaper_item); - -extern void HB_TibetanAttributes(HB_Script script, const HB_UChar16 *string, hb_uint32 from, hb_uint32 len, HB_CharAttributes *attributes); - -extern void HB_MyanmarAttributes(HB_Script script, const HB_UChar16 *string, hb_uint32 from, hb_uint32 len, HB_CharAttributes *attributes); - -extern void HB_KhmerAttributes(HB_Script script, const HB_UChar16 *string, hb_uint32 from, hb_uint32 len, HB_CharAttributes *attributes); - -extern void HB_IndicAttributes(HB_Script script, const HB_UChar16 *string, hb_uint32 from, hb_uint32 len, HB_CharAttributes *attributes); - -extern void HB_ThaiAttributes(HB_Script script, const HB_UChar16 *string, hb_uint32 from, hb_uint32 len, HB_CharAttributes *attributes); - -typedef struct { - hb_uint32 tag; - hb_uint32 property; -} HB_OpenTypeFeature; - -#define PositioningProperties 0x80000000 - -HB_Bool HB_SelectScript(HB_ShaperItem *item, const HB_OpenTypeFeature *features); - -HB_Bool HB_OpenTypeShape(HB_ShaperItem *item, const hb_uint32 *properties); -HB_Bool HB_OpenTypePosition(HB_ShaperItem *item, int availableGlyphs, HB_Bool doLogClusters); - -void HB_HeuristicPosition(HB_ShaperItem *item); -void HB_HeuristicSetGlyphAttributes(HB_ShaperItem *item); - -#define HB_IsControlChar(uc) \ - ((uc >= 0x200b && uc <= 0x200f /* ZW Space, ZWNJ, ZWJ, LRM and RLM */) \ - || (uc >= 0x2028 && uc <= 0x202f /* LS, PS, LRE, RLE, PDF, LRO, RLO, NNBSP */) \ - || (uc >= 0x206a && uc <= 0x206f /* ISS, ASS, IAFS, AFS, NADS, NODS */)) - -HB_Bool HB_ConvertStringToGlyphIndices(HB_ShaperItem *shaper_item); - -#define HB_GetGlyphAdvances(shaper_item) \ - shaper_item->font->klass->getGlyphAdvances(shaper_item->font, \ - shaper_item->glyphs, shaper_item->num_glyphs, \ - shaper_item->advances, \ - shaper_item->face->current_flags); - -#define HB_DECLARE_STACKARRAY(Type, Name) \ - Type stack##Name[512]; \ - Type *Name = stack##Name; - -#define HB_INIT_STACKARRAY(Type, Name, Length) \ - if ((Length) >= 512) \ - Name = (Type *)malloc((Length) * sizeof(Type)); - -#define HB_STACKARRAY(Type, Name, Length) \ - HB_DECLARE_STACKARRAY(Type, Name) \ - HB_INIT_STACKARRAY(Type, Name, Length) - -#define HB_FREE_STACKARRAY(Name) \ - if (stack##Name != Name) \ - free(Name); - -HB_END_HEADER - -#endif diff --git a/third_party/harfbuzz/src/harfbuzz-shaper.cpp b/third_party/harfbuzz/src/harfbuzz-shaper.cpp deleted file mode 100644 index f1606e6a79..0000000000 --- a/third_party/harfbuzz/src/harfbuzz-shaper.cpp +++ /dev/null @@ -1,1357 +0,0 @@ -/* - * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) - * - * This is part of HarfBuzz, an OpenType Layout engine library. - * - * Permission is hereby granted, without written agreement and without - * license or royalty fees, to use, copy, modify, and distribute this - * software and its documentation for any purpose, provided that the - * above copyright notice and the following two paragraphs appear in - * all copies of this software. - * - * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR - * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES - * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN - * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE. - * - * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, - * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS - * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO - * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. - */ - -#include "harfbuzz-shaper.h" -#include "harfbuzz-shaper-private.h" - -#include "harfbuzz-stream-private.h" -#include -#include - -#define HB_MIN(a, b) ((a) < (b) ? (a) : (b)) -#define HB_MAX(a, b) ((a) > (b) ? (a) : (b)) - -// ----------------------------------------------------------------------------------------------------- -// -// The line break algorithm. See http://www.unicode.org/reports/tr14/tr14-13.html -// -// ----------------------------------------------------------------------------------------------------- - -/* The Unicode algorithm does in our opinion allow line breaks at some - places they shouldn't be allowed. The following changes were thus - made in comparison to the Unicode reference: - - EX->AL from DB to IB - SY->AL from DB to IB - SY->PO from DB to IB - SY->PR from DB to IB - SY->OP from DB to IB - AL->PR from DB to IB - AL->PO from DB to IB - PR->PR from DB to IB - PO->PO from DB to IB - PR->PO from DB to IB - PO->PR from DB to IB - HY->PO from DB to IB - HY->PR from DB to IB - HY->OP from DB to IB - NU->EX from PB to IB - EX->PO from DB to IB -*/ - -// The following line break classes are not treated by the table: -// AI, BK, CB, CR, LF, NL, SA, SG, SP, XX - -enum break_class { - // the first 4 values have to agree with the enum in QCharAttributes - ProhibitedBreak, // PB in table - DirectBreak, // DB in table - IndirectBreak, // IB in table - CombiningIndirectBreak, // CI in table - CombiningProhibitedBreak // CP in table -}; -#define DB DirectBreak -#define IB IndirectBreak -#define CI CombiningIndirectBreak -#define CP CombiningProhibitedBreak -#define PB ProhibitedBreak - -static const hb_uint8 breakTable[HB_LineBreak_JT+1][HB_LineBreak_JT+1] = -{ -/* OP CL QU GL NS EX SY IS PR PO NU AL ID IN HY BA BB B2 ZW CM WJ H2 H3 JL JV JT */ -/* OP */ { PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, PB, CP, PB, PB, PB, PB, PB, PB }, -/* CL */ { DB, PB, IB, IB, PB, PB, PB, PB, IB, IB, IB, IB, DB, DB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB }, -/* QU */ { PB, PB, IB, IB, IB, PB, PB, PB, IB, IB, IB, IB, IB, IB, IB, IB, IB, IB, PB, CI, PB, IB, IB, IB, IB, IB }, -/* GL */ { IB, PB, IB, IB, IB, PB, PB, PB, IB, IB, IB, IB, IB, IB, IB, IB, IB, IB, PB, CI, PB, IB, IB, IB, IB, IB }, -/* NS */ { DB, PB, IB, IB, IB, PB, PB, PB, DB, DB, DB, DB, DB, DB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB }, -/* EX */ { DB, PB, IB, IB, IB, PB, PB, PB, DB, IB, DB, IB, DB, DB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB }, -/* SY */ { IB, PB, IB, IB, IB, PB, PB, PB, IB, IB, IB, IB, DB, DB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB }, -/* IS */ { DB, PB, IB, IB, IB, PB, PB, PB, DB, DB, IB, IB, DB, DB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB }, -/* PR */ { IB, PB, IB, IB, IB, PB, PB, PB, IB, IB, IB, IB, IB, DB, IB, IB, DB, DB, PB, CI, PB, IB, IB, IB, IB, IB }, -/* PO */ { IB, PB, IB, IB, IB, PB, PB, PB, IB, IB, IB, IB, DB, DB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB }, -/* NU */ { IB, PB, IB, IB, IB, IB, PB, PB, IB, IB, IB, IB, DB, IB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB }, -/* AL */ { IB, PB, IB, IB, IB, PB, PB, PB, IB, IB, IB, IB, DB, IB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB }, -/* ID */ { DB, PB, IB, IB, IB, PB, PB, PB, DB, IB, DB, DB, DB, IB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB }, -/* IN */ { DB, PB, IB, IB, IB, PB, PB, PB, DB, DB, DB, DB, DB, IB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB }, -/* HY */ { IB, PB, IB, IB, IB, PB, PB, PB, IB, IB, IB, DB, DB, DB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB }, -/* BA */ { DB, PB, IB, IB, IB, PB, PB, PB, DB, DB, DB, DB, DB, DB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB }, -/* BB */ { IB, PB, IB, IB, IB, PB, PB, PB, IB, IB, IB, IB, IB, IB, IB, IB, IB, IB, PB, CI, PB, IB, IB, IB, IB, IB }, -/* B2 */ { DB, PB, IB, IB, IB, PB, PB, PB, DB, DB, DB, DB, DB, DB, IB, IB, DB, PB, PB, CI, PB, DB, DB, DB, DB, DB }, -/* ZW */ { DB, DB, DB, DB, DB, DB, DB, DB, DB, DB, DB, DB, DB, DB, DB, DB, DB, DB, PB, DB, DB, DB, DB, DB, DB, DB }, -/* CM */ { DB, PB, IB, IB, IB, PB, PB, PB, DB, DB, IB, IB, DB, IB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, DB }, -/* WJ */ { IB, PB, IB, IB, IB, PB, PB, PB, IB, IB, IB, IB, IB, IB, IB, IB, IB, IB, PB, CI, PB, IB, IB, IB, IB, IB }, -/* H2 */ { DB, PB, IB, IB, IB, PB, PB, PB, DB, IB, DB, DB, DB, IB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, IB, IB }, -/* H3 */ { DB, PB, IB, IB, IB, PB, PB, PB, DB, IB, DB, DB, DB, IB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, IB }, -/* JL */ { DB, PB, IB, IB, IB, PB, PB, PB, DB, IB, DB, DB, DB, IB, IB, IB, DB, DB, PB, CI, PB, IB, IB, IB, IB, DB }, -/* JV */ { DB, PB, IB, IB, IB, PB, PB, PB, DB, IB, DB, DB, DB, IB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, IB, IB }, -/* JT */ { DB, PB, IB, IB, IB, PB, PB, PB, DB, IB, DB, DB, DB, IB, IB, IB, DB, DB, PB, CI, PB, DB, DB, DB, DB, IB } -}; -#undef DB -#undef IB -#undef CI -#undef CP -#undef PB - -static const hb_uint8 graphemeTable[HB_Grapheme_LVT + 1][HB_Grapheme_LVT + 1] = -{ -// Other, CR, LF, Control,Extend,L, V, T, LV, LVT - { true , true , true , true , true , true , true , true , true , true }, // Other, - { true , true , true , true , true , true , true , true , true , true }, // CR, - { true , false, true , true , true , true , true , true , true , true }, // LF, - { true , true , true , true , true , true , true , true , true , true }, // Control, - { false, true , true , true , false, false, false, false, false, false }, // Extend, - { true , true , true , true , true , false, true , true , true , true }, // L, - { true , true , true , true , true , false, false, true , false, true }, // V, - { true , true , true , true , true , true , false, false, false, false }, // T, - { true , true , true , true , true , false, true , true , true , true }, // LV, - { true , true , true , true , true , false, true , true , true , true }, // LVT -}; - -static void calcLineBreaks(const HB_UChar16 *uc, hb_uint32 len, HB_CharAttributes *charAttributes) -{ - if (!len) - return; - - // ##### can this fail if the first char is a surrogate? - HB_LineBreakClass cls; - HB_GraphemeClass grapheme; - HB_GetGraphemeAndLineBreakClass(*uc, &grapheme, &cls); - // handle case where input starts with an LF - if (cls == HB_LineBreak_LF) - cls = HB_LineBreak_BK; - - charAttributes[0].whiteSpace = (cls == HB_LineBreak_SP || cls == HB_LineBreak_BK); - charAttributes[0].charStop = true; - - int lcls = cls; - for (hb_uint32 i = 1; i < len; ++i) { - charAttributes[i].whiteSpace = false; - charAttributes[i].charStop = true; - - HB_UChar32 code = uc[i]; - HB_GraphemeClass ngrapheme; - HB_LineBreakClass ncls; - HB_GetGraphemeAndLineBreakClass(code, &ngrapheme, &ncls); - charAttributes[i].charStop = graphemeTable[ngrapheme][grapheme]; - // handle surrogates - if (ncls == HB_LineBreak_SG) { - if (HB_IsHighSurrogate(uc[i]) && i < len - 1 && HB_IsLowSurrogate(uc[i+1])) { - continue; - } else if (HB_IsLowSurrogate(uc[i]) && HB_IsHighSurrogate(uc[i-1])) { - code = HB_SurrogateToUcs4(uc[i-1], uc[i]); - HB_GetGraphemeAndLineBreakClass(code, &ngrapheme, &ncls); - charAttributes[i].charStop = false; - } else { - ncls = HB_LineBreak_AL; - } - } - - // set white space and char stop flag - if (ncls >= HB_LineBreak_SP) - charAttributes[i].whiteSpace = true; - - HB_LineBreakType lineBreakType = HB_NoBreak; - if (cls >= HB_LineBreak_LF) { - lineBreakType = HB_ForcedBreak; - } else if(cls == HB_LineBreak_CR) { - lineBreakType = (ncls == HB_LineBreak_LF) ? HB_NoBreak : HB_ForcedBreak; - } - - if (ncls == HB_LineBreak_SP) - goto next_no_cls_update; - if (ncls >= HB_LineBreak_CR) - goto next; - - // two complex chars (thai or lao), thai_attributes might override, but here we do a best guess - if (cls == HB_LineBreak_SA && ncls == HB_LineBreak_SA) { - lineBreakType = HB_Break; - goto next; - } - - { - int tcls = ncls; - if (tcls >= HB_LineBreak_SA) - tcls = HB_LineBreak_ID; - if (cls >= HB_LineBreak_SA) - cls = HB_LineBreak_ID; - - int brk = breakTable[cls][tcls]; - switch (brk) { - case DirectBreak: - lineBreakType = HB_Break; - if (uc[i-1] == 0xad) // soft hyphen - lineBreakType = HB_SoftHyphen; - break; - case IndirectBreak: - lineBreakType = (lcls == HB_LineBreak_SP) ? HB_Break : HB_NoBreak; - break; - case CombiningIndirectBreak: - lineBreakType = HB_NoBreak; - if (lcls == HB_LineBreak_SP){ - if (i > 1) - charAttributes[i-2].lineBreakType = HB_Break; - } else { - goto next_no_cls_update; - } - break; - case CombiningProhibitedBreak: - lineBreakType = HB_NoBreak; - if (lcls != HB_LineBreak_SP) - goto next_no_cls_update; - case ProhibitedBreak: - default: - break; - } - } - next: - cls = ncls; - next_no_cls_update: - lcls = ncls; - grapheme = ngrapheme; - charAttributes[i-1].lineBreakType = lineBreakType; - } - charAttributes[len-1].lineBreakType = HB_ForcedBreak; -} - -// -------------------------------------------------------------------------------------------------------------------------------------------- -// -// Basic processing -// -// -------------------------------------------------------------------------------------------------------------------------------------------- - -static inline void positionCluster(HB_ShaperItem *item, int gfrom, int glast) -{ - int nmarks = glast - gfrom; - assert(nmarks > 0); - - HB_Glyph *glyphs = item->glyphs; - HB_GlyphAttributes *attributes = item->attributes; - - HB_GlyphMetrics baseMetrics; - item->font->klass->getGlyphMetrics(item->font, glyphs[gfrom], &baseMetrics); - - if (item->item.script == HB_Script_Hebrew - && (-baseMetrics.y) > baseMetrics.height) - // we need to attach below the baseline, because of the hebrew iud. - baseMetrics.height = -baseMetrics.y; - -// qDebug("---> positionCluster: cluster from %d to %d", gfrom, glast); -// qDebug("baseInfo: %f/%f (%f/%f) off=%f/%f", baseInfo.x, baseInfo.y, baseInfo.width, baseInfo.height, baseInfo.xoff, baseInfo.yoff); - - HB_Fixed size = item->font->klass->getFontMetric(item->font, HB_FontAscent) / 10; - HB_Fixed offsetBase = HB_FIXED_CONSTANT(1) + (size - HB_FIXED_CONSTANT(4)) / 4; - if (size > HB_FIXED_CONSTANT(4)) - offsetBase += HB_FIXED_CONSTANT(4); - else - offsetBase += size; - //qreal offsetBase = (size - 4) / 4 + qMin(size, 4) + 1; -// qDebug("offset = %f", offsetBase); - - bool rightToLeft = item->item.bidiLevel % 2; - - int i; - unsigned char lastCmb = 0; - HB_GlyphMetrics attachmentRect; - memset(&attachmentRect, 0, sizeof(attachmentRect)); - - for(i = 1; i <= nmarks; i++) { - HB_Glyph mark = glyphs[gfrom+i]; - HB_GlyphMetrics markMetrics; - item->font->klass->getGlyphMetrics(item->font, mark, &markMetrics); - HB_FixedPoint p; - p.x = p.y = 0; -// qDebug("markInfo: %f/%f (%f/%f) off=%f/%f", markInfo.x, markInfo.y, markInfo.width, markInfo.height, markInfo.xoff, markInfo.yoff); - - HB_Fixed offset = offsetBase; - unsigned char cmb = attributes[gfrom+i].combiningClass; - - // ### maybe the whole position determination should move down to heuristicSetGlyphAttributes. Would save some - // bits in the glyphAttributes structure. - if (cmb < 200) { - // fixed position classes. We approximate by mapping to one of the others. - // currently I added only the ones for arabic, hebrew, lao and thai. - - // for Lao and Thai marks with class 0, see below (heuristicSetGlyphAttributes) - - // add a bit more offset to arabic, a bit hacky - if (cmb >= 27 && cmb <= 36 && offset < 3) - offset +=1; - // below - if ((cmb >= 10 && cmb <= 18) || - cmb == 20 || cmb == 22 || - cmb == 29 || cmb == 32) - cmb = HB_Combining_Below; - // above - else if (cmb == 23 || cmb == 27 || cmb == 28 || - cmb == 30 || cmb == 31 || (cmb >= 33 && cmb <= 36)) - cmb = HB_Combining_Above; - //below-right - else if (cmb == 9 || cmb == 103 || cmb == 118) - cmb = HB_Combining_BelowRight; - // above-right - else if (cmb == 24 || cmb == 107 || cmb == 122) - cmb = HB_Combining_AboveRight; - else if (cmb == 25) - cmb = HB_Combining_AboveLeft; - // fixed: - // 19 21 - - } - - // combining marks of different class don't interact. Reset the rectangle. - if (cmb != lastCmb) { - //qDebug("resetting rect"); - attachmentRect = baseMetrics; - } - - switch(cmb) { - case HB_Combining_DoubleBelow: - // ### wrong in rtl context! - case HB_Combining_BelowLeft: - p.y += offset; - case HB_Combining_BelowLeftAttached: - p.x += attachmentRect.x - markMetrics.x; - p.y += (attachmentRect.y + attachmentRect.height) - markMetrics.y; - break; - case HB_Combining_Below: - p.y += offset; - case HB_Combining_BelowAttached: - p.x += attachmentRect.x - markMetrics.x; - p.y += (attachmentRect.y + attachmentRect.height) - markMetrics.y; - - p.x += (attachmentRect.width - markMetrics.width) / 2; - break; - case HB_Combining_BelowRight: - p.y += offset; - case HB_Combining_BelowRightAttached: - p.x += attachmentRect.x + attachmentRect.width - markMetrics.width - markMetrics.x; - p.y += attachmentRect.y + attachmentRect.height - markMetrics.y; - break; - case HB_Combining_Left: - p.x -= offset; - case HB_Combining_LeftAttached: - break; - case HB_Combining_Right: - p.x += offset; - case HB_Combining_RightAttached: - break; - case HB_Combining_DoubleAbove: - // ### wrong in RTL context! - case HB_Combining_AboveLeft: - p.y -= offset; - case HB_Combining_AboveLeftAttached: - p.x += attachmentRect.x - markMetrics.x; - p.y += attachmentRect.y - markMetrics.y - markMetrics.height; - break; - case HB_Combining_Above: - p.y -= offset; - case HB_Combining_AboveAttached: - p.x += attachmentRect.x - markMetrics.x; - p.y += attachmentRect.y - markMetrics.y - markMetrics.height; - - p.x += (attachmentRect.width - markMetrics.width) / 2; - break; - case HB_Combining_AboveRight: - p.y -= offset; - case HB_Combining_AboveRightAttached: - p.x += attachmentRect.x + attachmentRect.width - markMetrics.x - markMetrics.width; - p.y += attachmentRect.y - markMetrics.y - markMetrics.height; - break; - - case HB_Combining_IotaSubscript: - default: - break; - } -// qDebug("char=%x combiningClass = %d offset=%f/%f", mark, cmb, p.x(), p.y()); - markMetrics.x += p.x; - markMetrics.y += p.y; - - HB_GlyphMetrics unitedAttachmentRect = attachmentRect; - unitedAttachmentRect.x = HB_MIN(attachmentRect.x, markMetrics.x); - unitedAttachmentRect.y = HB_MIN(attachmentRect.y, markMetrics.y); - unitedAttachmentRect.width = HB_MAX(attachmentRect.x + attachmentRect.width, markMetrics.x + markMetrics.width) - unitedAttachmentRect.x; - unitedAttachmentRect.height = HB_MAX(attachmentRect.y + attachmentRect.height, markMetrics.y + markMetrics.height) - unitedAttachmentRect.y; - attachmentRect = unitedAttachmentRect; - - lastCmb = cmb; - if (rightToLeft) { - item->offsets[gfrom+i].x = p.x; - item->offsets[gfrom+i].y = p.y; - } else { - item->offsets[gfrom+i].x = p.x - baseMetrics.xOffset; - item->offsets[gfrom+i].y = p.y - baseMetrics.yOffset; - } - item->advances[gfrom+i] = 0; - } -} - -void HB_HeuristicPosition(HB_ShaperItem *item) -{ - HB_GetGlyphAdvances(item); - HB_GlyphAttributes *attributes = item->attributes; - - int cEnd = -1; - int i = item->num_glyphs; - while (i--) { - if (cEnd == -1 && attributes[i].mark) { - cEnd = i; - } else if (cEnd != -1 && !attributes[i].mark) { - positionCluster(item, i, cEnd); - cEnd = -1; - } - } -} - -// set the glyph attributes heuristically. Assumes a 1 to 1 relationship between chars and glyphs -// and no reordering. -// also computes logClusters heuristically -void HB_HeuristicSetGlyphAttributes(HB_ShaperItem *item) -{ - const HB_UChar16 *uc = item->string + item->item.pos; - hb_uint32 length = item->item.length; - - // ### zeroWidth and justification are missing here!!!!! - - assert(length <= item->num_glyphs); - -// qDebug("QScriptEngine::heuristicSetGlyphAttributes, num_glyphs=%d", item->num_glyphs); - HB_GlyphAttributes *attributes = item->attributes; - unsigned short *logClusters = item->log_clusters; - - hb_uint32 glyph_pos = 0; - hb_uint32 i; - for (i = 0; i < length; i++) { - if (HB_IsHighSurrogate(uc[i]) && i < length - 1 - && HB_IsLowSurrogate(uc[i + 1])) { - logClusters[i] = glyph_pos; - logClusters[++i] = glyph_pos; - } else { - logClusters[i] = glyph_pos; - } - ++glyph_pos; - } - - // first char in a run is never (treated as) a mark - int cStart = 0; - const bool symbolFont = item->face->isSymbolFont; - attributes[0].mark = false; - attributes[0].clusterStart = true; - attributes[0].dontPrint = (!symbolFont && uc[0] == 0x00ad) || HB_IsControlChar(uc[0]); - - int pos = 0; - HB_CharCategory lastCat; - int dummy; - HB_GetUnicodeCharProperties(uc[0], &lastCat, &dummy); - for (i = 1; i < length; ++i) { - if (logClusters[i] == pos) - // same glyph - continue; - ++pos; - while (pos < logClusters[i]) { - attributes[pos] = attributes[pos-1]; - ++pos; - } - // hide soft-hyphens by default - if ((!symbolFont && uc[i] == 0x00ad) || HB_IsControlChar(uc[i])) - attributes[pos].dontPrint = true; - HB_CharCategory cat; - int cmb; - HB_GetUnicodeCharProperties(uc[i], &cat, &cmb); - if (cat != HB_Mark_NonSpacing) { - attributes[pos].mark = false; - attributes[pos].clusterStart = true; - attributes[pos].combiningClass = 0; - cStart = logClusters[i]; - } else { - if (cmb == 0) { - // Fix 0 combining classes - if ((uc[pos] & 0xff00) == 0x0e00) { - // thai or lao - if (uc[pos] == 0xe31 || - uc[pos] == 0xe34 || - uc[pos] == 0xe35 || - uc[pos] == 0xe36 || - uc[pos] == 0xe37 || - uc[pos] == 0xe47 || - uc[pos] == 0xe4c || - uc[pos] == 0xe4d || - uc[pos] == 0xe4e) { - cmb = HB_Combining_AboveRight; - } else if (uc[pos] == 0xeb1 || - uc[pos] == 0xeb4 || - uc[pos] == 0xeb5 || - uc[pos] == 0xeb6 || - uc[pos] == 0xeb7 || - uc[pos] == 0xebb || - uc[pos] == 0xecc || - uc[pos] == 0xecd) { - cmb = HB_Combining_Above; - } else if (uc[pos] == 0xebc) { - cmb = HB_Combining_Below; - } - } - } - - attributes[pos].mark = true; - attributes[pos].clusterStart = false; - attributes[pos].combiningClass = cmb; - logClusters[i] = cStart; - } - // one gets an inter character justification point if the current char is not a non spacing mark. - // as then the current char belongs to the last one and one gets a space justification point - // after the space char. - if (lastCat == HB_Separator_Space) - attributes[pos-1].justification = HB_Space; - else if (cat != HB_Mark_NonSpacing) - attributes[pos-1].justification = HB_Character; - else - attributes[pos-1].justification = HB_NoJustification; - - lastCat = cat; - } - pos = logClusters[length-1]; - if (lastCat == HB_Separator_Space) - attributes[pos].justification = HB_Space; - else - attributes[pos].justification = HB_Character; -} - -#ifndef NO_OPENTYPE -static const HB_OpenTypeFeature basic_features[] = { - { HB_MAKE_TAG('c', 'c', 'm', 'p'), CcmpProperty }, - { HB_MAKE_TAG('l', 'i', 'g', 'a'), CcmpProperty }, - { HB_MAKE_TAG('c', 'l', 'i', 'g'), CcmpProperty }, - {0, 0} -}; -#endif - -HB_Bool HB_ConvertStringToGlyphIndices(HB_ShaperItem *shaper_item) -{ - if (shaper_item->glyphIndicesPresent) { - shaper_item->num_glyphs = shaper_item->initialGlyphCount; - shaper_item->glyphIndicesPresent = false; - return true; - } - return shaper_item->font->klass - ->convertStringToGlyphIndices(shaper_item->font, - shaper_item->string + shaper_item->item.pos, shaper_item->item.length, - shaper_item->glyphs, &shaper_item->num_glyphs, - shaper_item->item.bidiLevel % 2); -} - -HB_Bool HB_BasicShape(HB_ShaperItem *shaper_item) -{ -#ifndef NO_OPENTYPE - const int availableGlyphs = shaper_item->num_glyphs; -#endif - - if (!HB_ConvertStringToGlyphIndices(shaper_item)) - return false; - - HB_HeuristicSetGlyphAttributes(shaper_item); - -#ifndef NO_OPENTYPE - if (HB_SelectScript(shaper_item, basic_features)) { - HB_OpenTypeShape(shaper_item, /*properties*/0); - return HB_OpenTypePosition(shaper_item, availableGlyphs, /*doLogClusters*/true); - } -#endif - - HB_HeuristicPosition(shaper_item); - return true; -} - -const HB_ScriptEngine HB_ScriptEngines[] = { - // Common - { HB_BasicShape, 0}, - // Greek - { HB_BasicShape, 0}, - // Cyrillic - { HB_BasicShape, 0}, - // Armenian - { HB_BasicShape, 0}, - // Hebrew - { HB_HebrewShape, 0 }, - // Arabic - { HB_ArabicShape, 0}, - // Syriac - { HB_ArabicShape, 0}, - // Thaana - { HB_BasicShape, 0 }, - // Devanagari - { HB_IndicShape, HB_IndicAttributes }, - // Bengali - { HB_IndicShape, HB_IndicAttributes }, - // Gurmukhi - { HB_IndicShape, HB_IndicAttributes }, - // Gujarati - { HB_IndicShape, HB_IndicAttributes }, - // Oriya - { HB_IndicShape, HB_IndicAttributes }, - // Tamil - { HB_IndicShape, HB_IndicAttributes }, - // Telugu - { HB_IndicShape, HB_IndicAttributes }, - // Kannada - { HB_IndicShape, HB_IndicAttributes }, - // Malayalam - { HB_IndicShape, HB_IndicAttributes }, - // Sinhala - { HB_IndicShape, HB_IndicAttributes }, - // Thai - { HB_BasicShape, HB_ThaiAttributes }, - // Lao - { HB_BasicShape, 0 }, - // Tibetan - { HB_TibetanShape, HB_TibetanAttributes }, - // Myanmar - { HB_MyanmarShape, HB_MyanmarAttributes }, - // Georgian - { HB_BasicShape, 0 }, - // Hangul - { HB_HangulShape, 0 }, - // Ogham - { HB_BasicShape, 0 }, - // Runic - { HB_BasicShape, 0 }, - // Khmer - { HB_KhmerShape, HB_KhmerAttributes }, - // N'Ko - { HB_ArabicShape, 0} -}; - -void HB_GetCharAttributes(const HB_UChar16 *string, hb_uint32 stringLength, - const HB_ScriptItem *items, hb_uint32 numItems, - HB_CharAttributes *attributes) -{ - calcLineBreaks(string, stringLength, attributes); - - for (hb_uint32 i = 0; i < numItems; ++i) { - HB_Script script = items[i].script; - if (script == HB_Script_Inherited) - script = HB_Script_Common; - HB_AttributeFunction attributeFunction = HB_ScriptEngines[script].charAttributes; - if (!attributeFunction) - continue; - attributeFunction(script, string, items[i].pos, items[i].length, attributes); - } -} - - -enum BreakRule { NoBreak = 0, Break = 1, Middle = 2 }; - -static const hb_uint8 wordbreakTable[HB_Word_ExtendNumLet + 1][HB_Word_ExtendNumLet + 1] = { -// Other Format Katakana ALetter MidLetter MidNum Numeric ExtendNumLet - { Break, Break, Break, Break, Break, Break, Break, Break }, // Other - { Break, Break, Break, Break, Break, Break, Break, Break }, // Format - { Break, Break, NoBreak, Break, Break, Break, Break, NoBreak }, // Katakana - { Break, Break, Break, NoBreak, Middle, Break, NoBreak, NoBreak }, // ALetter - { Break, Break, Break, Break, Break, Break, Break, Break }, // MidLetter - { Break, Break, Break, Break, Break, Break, Break, Break }, // MidNum - { Break, Break, Break, NoBreak, Break, Middle, NoBreak, NoBreak }, // Numeric - { Break, Break, NoBreak, NoBreak, Break, Break, NoBreak, NoBreak }, // ExtendNumLet -}; - -void HB_GetWordBoundaries(const HB_UChar16 *string, hb_uint32 stringLength, - const HB_ScriptItem * /*items*/, hb_uint32 /*numItems*/, - HB_CharAttributes *attributes) -{ - if (stringLength == 0) - return; - unsigned int brk = HB_GetWordClass(string[0]); - attributes[0].wordBoundary = true; - for (hb_uint32 i = 1; i < stringLength; ++i) { - if (!attributes[i].charStop) { - attributes[i].wordBoundary = false; - continue; - } - hb_uint32 nbrk = HB_GetWordClass(string[i]); - if (nbrk == HB_Word_Format) { - attributes[i].wordBoundary = (HB_GetSentenceClass(string[i-1]) == HB_Sentence_Sep); - continue; - } - BreakRule rule = (BreakRule)wordbreakTable[brk][nbrk]; - if (rule == Middle) { - rule = Break; - hb_uint32 lookahead = i + 1; - while (lookahead < stringLength) { - hb_uint32 testbrk = HB_GetWordClass(string[lookahead]); - if (testbrk == HB_Word_Format && HB_GetSentenceClass(string[lookahead]) != HB_Sentence_Sep) { - ++lookahead; - continue; - } - if (testbrk == brk) { - rule = NoBreak; - while (i < lookahead) - attributes[i++].wordBoundary = false; - nbrk = testbrk; - } - break; - } - } - attributes[i].wordBoundary = (rule == Break); - brk = nbrk; - } -} - - -enum SentenceBreakStates { - SB_Initial, - SB_Upper, - SB_UpATerm, - SB_ATerm, - SB_ATermC, - SB_ACS, - SB_STerm, - SB_STermC, - SB_SCS, - SB_BAfter, - SB_Break, - SB_Look -}; - -static const hb_uint8 sentenceBreakTable[HB_Sentence_Close + 1][HB_Sentence_Close + 1] = { -// Other Sep Format Sp Lower Upper OLetter Numeric ATerm STerm Close - { SB_Initial, SB_BAfter , SB_Initial, SB_Initial, SB_Initial, SB_Upper , SB_Initial, SB_Initial, SB_ATerm , SB_STerm , SB_Initial }, // SB_Initial, - { SB_Initial, SB_BAfter , SB_Upper , SB_Initial, SB_Initial, SB_Upper , SB_Initial, SB_Initial, SB_UpATerm, SB_STerm , SB_Initial }, // SB_Upper - - { SB_Look , SB_BAfter , SB_UpATerm, SB_ACS , SB_Initial, SB_Upper , SB_Break , SB_Initial, SB_ATerm , SB_STerm , SB_ATermC }, // SB_UpATerm - { SB_Look , SB_BAfter , SB_ATerm , SB_ACS , SB_Initial, SB_Break , SB_Break , SB_Initial, SB_ATerm , SB_STerm , SB_ATermC }, // SB_ATerm - { SB_Look , SB_BAfter , SB_ATermC , SB_ACS , SB_Initial, SB_Break , SB_Break , SB_Look , SB_ATerm , SB_STerm , SB_ATermC }, // SB_ATermC, - { SB_Look , SB_BAfter , SB_ACS , SB_ACS , SB_Initial, SB_Break , SB_Break , SB_Look , SB_ATerm , SB_STerm , SB_Look }, // SB_ACS, - - { SB_Break , SB_BAfter , SB_STerm , SB_SCS , SB_Break , SB_Break , SB_Break , SB_Break , SB_ATerm , SB_STerm , SB_STermC }, // SB_STerm, - { SB_Break , SB_BAfter , SB_STermC , SB_SCS , SB_Break , SB_Break , SB_Break , SB_Break , SB_ATerm , SB_STerm , SB_STermC }, // SB_STermC, - { SB_Break , SB_BAfter , SB_SCS , SB_SCS , SB_Break , SB_Break , SB_Break , SB_Break , SB_ATerm , SB_STerm , SB_Break }, // SB_SCS, - { SB_Break , SB_Break , SB_Break , SB_Break , SB_Break , SB_Break , SB_Break , SB_Break , SB_Break , SB_Break , SB_Break }, // SB_BAfter, -}; - -void HB_GetSentenceBoundaries(const HB_UChar16 *string, hb_uint32 stringLength, - const HB_ScriptItem * /*items*/, hb_uint32 /*numItems*/, - HB_CharAttributes *attributes) -{ - if (stringLength == 0) - return; - hb_uint32 brk = sentenceBreakTable[SB_Initial][HB_GetSentenceClass(string[0])]; - attributes[0].sentenceBoundary = true; - for (hb_uint32 i = 1; i < stringLength; ++i) { - if (!attributes[i].charStop) { - attributes[i].sentenceBoundary = false; - continue; - } - brk = sentenceBreakTable[brk][HB_GetSentenceClass(string[i])]; - if (brk == SB_Look) { - brk = SB_Break; - hb_uint32 lookahead = i + 1; - while (lookahead < stringLength) { - hb_uint32 sbrk = HB_GetSentenceClass(string[lookahead]); - if (sbrk != HB_Sentence_Other && sbrk != HB_Sentence_Numeric && sbrk != HB_Sentence_Close) { - break; - } else if (sbrk == HB_Sentence_Lower) { - brk = SB_Initial; - break; - } - ++lookahead; - } - if (brk == SB_Initial) { - while (i < lookahead) - attributes[i++].sentenceBoundary = false; - } - } - if (brk == SB_Break) { - attributes[i].sentenceBoundary = true; - brk = sentenceBreakTable[SB_Initial][HB_GetSentenceClass(string[i])]; - } else { - attributes[i].sentenceBoundary = false; - } - } -} - - -static inline char *tag_to_string(HB_UInt tag) -{ - static char string[5]; - string[0] = (tag >> 24)&0xff; - string[1] = (tag >> 16)&0xff; - string[2] = (tag >> 8)&0xff; - string[3] = tag&0xff; - string[4] = 0; - return string; -} - -#ifdef OT_DEBUG -static void dump_string(HB_Buffer buffer) -{ - for (uint i = 0; i < buffer->in_length; ++i) { - qDebug(" %x: cluster=%d", buffer->in_string[i].gindex, buffer->in_string[i].cluster); - } -} -#define DEBUG printf -#else -#define DEBUG if (1) ; else printf -#endif - -#define DefaultLangSys 0xffff -#define DefaultScript HB_MAKE_TAG('D', 'F', 'L', 'T') - -enum { - RequiresGsub = 1, - RequiresGpos = 2 -}; - -struct OTScripts { - unsigned int tag; - int flags; -}; -static const OTScripts ot_scripts [] = { - // Common - { HB_MAKE_TAG('l', 'a', 't', 'n'), 0 }, - // Greek - { HB_MAKE_TAG('g', 'r', 'e', 'k'), 0 }, - // Cyrillic - { HB_MAKE_TAG('c', 'y', 'r', 'l'), 0 }, - // Armenian - { HB_MAKE_TAG('a', 'r', 'm', 'n'), 0 }, - // Hebrew - { HB_MAKE_TAG('h', 'e', 'b', 'r'), 1 }, - // Arabic - { HB_MAKE_TAG('a', 'r', 'a', 'b'), 1 }, - // Syriac - { HB_MAKE_TAG('s', 'y', 'r', 'c'), 1 }, - // Thaana - { HB_MAKE_TAG('t', 'h', 'a', 'a'), 1 }, - // Devanagari - { HB_MAKE_TAG('d', 'e', 'v', 'a'), 1 }, - // Bengali - { HB_MAKE_TAG('b', 'e', 'n', 'g'), 1 }, - // Gurmukhi - { HB_MAKE_TAG('g', 'u', 'r', 'u'), 1 }, - // Gujarati - { HB_MAKE_TAG('g', 'u', 'j', 'r'), 1 }, - // Oriya - { HB_MAKE_TAG('o', 'r', 'y', 'a'), 1 }, - // Tamil - { HB_MAKE_TAG('t', 'a', 'm', 'l'), 1 }, - // Telugu - { HB_MAKE_TAG('t', 'e', 'l', 'u'), 1 }, - // Kannada - { HB_MAKE_TAG('k', 'n', 'd', 'a'), 1 }, - // Malayalam - { HB_MAKE_TAG('m', 'l', 'y', 'm'), 1 }, - // Sinhala - { HB_MAKE_TAG('s', 'i', 'n', 'h'), 1 }, - // Thai - { HB_MAKE_TAG('t', 'h', 'a', 'i'), 1 }, - // Lao - { HB_MAKE_TAG('l', 'a', 'o', ' '), 1 }, - // Tibetan - { HB_MAKE_TAG('t', 'i', 'b', 't'), 1 }, - // Myanmar - { HB_MAKE_TAG('m', 'y', 'm', 'r'), 1 }, - // Georgian - { HB_MAKE_TAG('g', 'e', 'o', 'r'), 0 }, - // Hangul - { HB_MAKE_TAG('h', 'a', 'n', 'g'), 1 }, - // Ogham - { HB_MAKE_TAG('o', 'g', 'a', 'm'), 0 }, - // Runic - { HB_MAKE_TAG('r', 'u', 'n', 'r'), 0 }, - // Khmer - { HB_MAKE_TAG('k', 'h', 'm', 'r'), 1 }, - // N'Ko - { HB_MAKE_TAG('n', 'k', 'o', ' '), 1 } -}; -enum { NumOTScripts = sizeof(ot_scripts)/sizeof(OTScripts) }; - -static HB_Bool checkScript(HB_Face face, int script) -{ - assert(script < HB_ScriptCount); - - if (!face->gsub && !face->gpos) - return false; - - unsigned int tag = ot_scripts[script].tag; - int requirements = ot_scripts[script].flags; - - if (requirements & RequiresGsub) { - if (!face->gsub) - return false; - - HB_UShort script_index; - HB_Error error = HB_GSUB_Select_Script(face->gsub, tag, &script_index); - if (error) { - DEBUG("could not select script %d in GSub table: %d", (int)script, error); - error = HB_GSUB_Select_Script(face->gsub, HB_MAKE_TAG('D', 'F', 'L', 'T'), &script_index); - if (error) - return false; - } - } - - if (requirements & RequiresGpos) { - if (!face->gpos) - return false; - - HB_UShort script_index; - HB_Error error = HB_GPOS_Select_Script(face->gpos, script, &script_index); - if (error) { - DEBUG("could not select script in gpos table: %d", error); - error = HB_GPOS_Select_Script(face->gpos, HB_MAKE_TAG('D', 'F', 'L', 'T'), &script_index); - if (error) - return false; - } - - } - return true; -} - -static HB_Stream getTableStream(void *font, HB_GetFontTableFunc tableFunc, HB_Tag tag) -{ - HB_Error error; - HB_UInt length = 0; - HB_Stream stream = 0; - - if (!font) - return 0; - - error = tableFunc(font, tag, 0, &length); - if (error) - return 0; - stream = (HB_Stream)malloc(sizeof(HB_StreamRec)); - if (!stream) - return 0; - stream->base = (HB_Byte*)malloc(length); - if (!stream->base) { - free(stream); - return 0; - } - error = tableFunc(font, tag, stream->base, &length); - if (error) { - _hb_close_stream(stream); - return 0; - } - stream->size = length; - stream->pos = 0; - stream->cursor = NULL; - return stream; -} - -HB_Face HB_NewFace(void *font, HB_GetFontTableFunc tableFunc) -{ - HB_Face face = (HB_Face )malloc(sizeof(HB_FaceRec)); - if (!face) - return 0; - - face->isSymbolFont = false; - face->gdef = 0; - face->gpos = 0; - face->gsub = 0; - face->current_script = HB_ScriptCount; - face->current_flags = HB_ShaperFlag_Default; - face->has_opentype_kerning = false; - face->tmpAttributes = 0; - face->tmpLogClusters = 0; - face->glyphs_substituted = false; - face->buffer = 0; - - HB_Error error; - HB_Stream stream; - HB_Stream gdefStream; - - gdefStream = getTableStream(font, tableFunc, TTAG_GDEF); - if (!gdefStream || (error = HB_Load_GDEF_Table(gdefStream, &face->gdef))) { - //DEBUG("error loading gdef table: %d", error); - face->gdef = 0; - } - - //DEBUG() << "trying to load gsub table"; - stream = getTableStream(font, tableFunc, TTAG_GSUB); - if (!stream || (error = HB_Load_GSUB_Table(stream, &face->gsub, face->gdef, gdefStream))) { - face->gsub = 0; - if (error != HB_Err_Not_Covered) { - //DEBUG("error loading gsub table: %d", error); - } else { - //DEBUG("face doesn't have a gsub table"); - } - } - _hb_close_stream(stream); - - stream = getTableStream(font, tableFunc, TTAG_GPOS); - if (!stream || (error = HB_Load_GPOS_Table(stream, &face->gpos, face->gdef, gdefStream))) { - face->gpos = 0; - DEBUG("error loading gpos table: %d", error); - } - _hb_close_stream(stream); - - _hb_close_stream(gdefStream); - - for (unsigned int i = 0; i < HB_ScriptCount; ++i) - face->supported_scripts[i] = checkScript(face, i); - - if (hb_buffer_new(&face->buffer) != HB_Err_Ok) { - HB_FreeFace(face); - return 0; - } - - return face; -} - -void HB_FreeFace(HB_Face face) -{ - if (!face) - return; - if (face->gpos) - HB_Done_GPOS_Table(face->gpos); - if (face->gsub) - HB_Done_GSUB_Table(face->gsub); - if (face->gdef) - HB_Done_GDEF_Table(face->gdef); - if (face->buffer) - hb_buffer_free(face->buffer); - if (face->tmpAttributes) - free(face->tmpAttributes); - if (face->tmpLogClusters) - free(face->tmpLogClusters); - free(face); -} - -HB_Bool HB_SelectScript(HB_ShaperItem *shaper_item, const HB_OpenTypeFeature *features) -{ - HB_Script script = shaper_item->item.script; - - if (!shaper_item->face->supported_scripts[script]) - return false; - - HB_Face face = shaper_item->face; - if (face->current_script == script && face->current_flags == shaper_item->shaperFlags) - return true; - - face->current_script = script; - face->current_flags = shaper_item->shaperFlags; - - assert(script < HB_ScriptCount); - // find script in our list of supported scripts. - unsigned int tag = ot_scripts[script].tag; - - if (face->gsub && features) { -#ifdef OT_DEBUG - { - HB_FeatureList featurelist = face->gsub->FeatureList; - int numfeatures = featurelist.FeatureCount; - DEBUG("gsub table has %d features", numfeatures); - for (int i = 0; i < numfeatures; i++) { - HB_FeatureRecord *r = featurelist.FeatureRecord + i; - DEBUG(" feature '%s'", tag_to_string(r->FeatureTag)); - } - } -#endif - HB_GSUB_Clear_Features(face->gsub); - HB_UShort script_index; - HB_Error error = HB_GSUB_Select_Script(face->gsub, tag, &script_index); - if (!error) { - DEBUG("script %s has script index %d", tag_to_string(script), script_index); - while (features->tag) { - HB_UShort feature_index; - error = HB_GSUB_Select_Feature(face->gsub, features->tag, script_index, 0xffff, &feature_index); - if (!error) { - DEBUG(" adding feature %s", tag_to_string(features->tag)); - HB_GSUB_Add_Feature(face->gsub, feature_index, features->property); - } - ++features; - } - } - } - - // reset - face->has_opentype_kerning = false; - - if (face->gpos) { - HB_GPOS_Clear_Features(face->gpos); - HB_UShort script_index; - HB_Error error = HB_GPOS_Select_Script(face->gpos, tag, &script_index); - if (!error) { -#ifdef OT_DEBUG - { - HB_FeatureList featurelist = face->gpos->FeatureList; - int numfeatures = featurelist.FeatureCount; - DEBUG("gpos table has %d features", numfeatures); - for(int i = 0; i < numfeatures; i++) { - HB_FeatureRecord *r = featurelist.FeatureRecord + i; - HB_UShort feature_index; - HB_GPOS_Select_Feature(face->gpos, r->FeatureTag, script_index, 0xffff, &feature_index); - DEBUG(" feature '%s'", tag_to_string(r->FeatureTag)); - } - } -#endif - HB_UInt *feature_tag_list_buffer; - error = HB_GPOS_Query_Features(face->gpos, script_index, 0xffff, &feature_tag_list_buffer); - if (!error) { - HB_UInt *feature_tag_list = feature_tag_list_buffer; - while (*feature_tag_list) { - HB_UShort feature_index; - if (*feature_tag_list == HB_MAKE_TAG('k', 'e', 'r', 'n')) { - if (face->current_flags & HB_ShaperFlag_NoKerning) { - ++feature_tag_list; - continue; - } - face->has_opentype_kerning = true; - } - error = HB_GPOS_Select_Feature(face->gpos, *feature_tag_list, script_index, 0xffff, &feature_index); - if (!error) - HB_GPOS_Add_Feature(face->gpos, feature_index, PositioningProperties); - ++feature_tag_list; - } - FREE(feature_tag_list_buffer); - } - } - } - - return true; -} - -HB_Bool HB_OpenTypeShape(HB_ShaperItem *item, const hb_uint32 *properties) -{ - HB_GlyphAttributes *tmpAttributes; - unsigned int *tmpLogClusters; - - HB_Face face = item->face; - - face->length = item->num_glyphs; - - hb_buffer_clear(face->buffer); - - tmpAttributes = (HB_GlyphAttributes *) realloc(face->tmpAttributes, face->length*sizeof(HB_GlyphAttributes)); - if (!tmpAttributes) - return false; - face->tmpAttributes = tmpAttributes; - - tmpLogClusters = (unsigned int *) realloc(face->tmpLogClusters, face->length*sizeof(unsigned int)); - if (!tmpLogClusters) - return false; - face->tmpLogClusters = tmpLogClusters; - - for (int i = 0; i < face->length; ++i) { - hb_buffer_add_glyph(face->buffer, item->glyphs[i], properties ? properties[i] : 0, i); - face->tmpAttributes[i] = item->attributes[i]; - face->tmpLogClusters[i] = item->log_clusters[i]; - } - -#ifdef OT_DEBUG - DEBUG("-----------------------------------------"); -// DEBUG("log clusters before shaping:"); -// for (int j = 0; j < length; j++) -// DEBUG(" log[%d] = %d", j, item->log_clusters[j]); - DEBUG("original glyphs: %p", item->glyphs); - for (int i = 0; i < length; ++i) - DEBUG(" glyph=%4x", hb_buffer->in_string[i].gindex); -// dump_string(hb_buffer); -#endif - - face->glyphs_substituted = false; - if (face->gsub) { - unsigned int error = HB_GSUB_Apply_String(face->gsub, face->buffer); - if (error && error != HB_Err_Not_Covered) - return false; - face->glyphs_substituted = (error != HB_Err_Not_Covered); - } - -#ifdef OT_DEBUG -// DEBUG("log clusters before shaping:"); -// for (int j = 0; j < length; j++) -// DEBUG(" log[%d] = %d", j, item->log_clusters[j]); - DEBUG("shaped glyphs:"); - for (int i = 0; i < length; ++i) - DEBUG(" glyph=%4x", hb_buffer->in_string[i].gindex); - DEBUG("-----------------------------------------"); -// dump_string(hb_buffer); -#endif - - return true; -} - -/* See comments near the definition of HB_ShaperFlag_ForceMarksToZeroWidth for a description - of why this function exists. */ -void HB_FixupZeroWidth(HB_ShaperItem *item) -{ - HB_UShort property; - - if (!item->face->gdef) - return; - - for (unsigned int i = 0; i < item->num_glyphs; ++i) { - /* If the glyph is a mark, force its advance to zero. */ - if (HB_GDEF_Get_Glyph_Property (item->face->gdef, item->glyphs[i], &property) == HB_Err_Ok && - property == HB_GDEF_MARK) { - item->advances[i] = 0; - } - } -} - -HB_Bool HB_OpenTypePosition(HB_ShaperItem *item, int availableGlyphs, HB_Bool doLogClusters) -{ - HB_Face face = item->face; - - bool glyphs_positioned = false; - if (face->gpos) { - if (face->buffer->positions) - memset(face->buffer->positions, 0, face->buffer->in_length*sizeof(HB_PositionRec)); - // #### check that passing "false,false" is correct - glyphs_positioned = HB_GPOS_Apply_String(item->font, face->gpos, face->current_flags, face->buffer, false, false) != HB_Err_Not_Covered; - } - - if (!face->glyphs_substituted && !glyphs_positioned) { - HB_GetGlyphAdvances(item); - if (item->face->current_flags & HB_ShaperFlag_ForceMarksToZeroWidth) - HB_FixupZeroWidth(item); - return true; // nothing to do for us - } - - // make sure we have enough space to write everything back - if (availableGlyphs < (int)face->buffer->in_length) { - item->num_glyphs = face->buffer->in_length; - return false; - } - - HB_Glyph *glyphs = item->glyphs; - HB_GlyphAttributes *attributes = item->attributes; - - for (unsigned int i = 0; i < face->buffer->in_length; ++i) { - glyphs[i] = face->buffer->in_string[i].gindex; - attributes[i] = face->tmpAttributes[face->buffer->in_string[i].cluster]; - if (i && face->buffer->in_string[i].cluster == face->buffer->in_string[i-1].cluster) - attributes[i].clusterStart = false; - } - item->num_glyphs = face->buffer->in_length; - - if (doLogClusters && face->glyphs_substituted) { - // we can't do this for indic, as we pass the stuf in syllables and it's easier to do it in the shaper. - unsigned short *logClusters = item->log_clusters; - int clusterStart = 0; - int oldCi = 0; - // #### the reconstruction of the logclusters currently does not work if the original string - // contains surrogate pairs - for (unsigned int i = 0; i < face->buffer->in_length; ++i) { - int ci = face->buffer->in_string[i].cluster; - // DEBUG(" ci[%d] = %d mark=%d, cmb=%d, cs=%d", - // i, ci, glyphAttributes[i].mark, glyphAttributes[i].combiningClass, glyphAttributes[i].clusterStart); - if (!attributes[i].mark && attributes[i].clusterStart && ci != oldCi) { - for (int j = oldCi; j < ci; j++) - logClusters[j] = clusterStart; - clusterStart = i; - oldCi = ci; - } - } - for (int j = oldCi; j < face->length; j++) - logClusters[j] = clusterStart; - } - - // calulate the advances for the shaped glyphs -// DEBUG("unpositioned: "); - - // positioning code: - if (glyphs_positioned) { - HB_GetGlyphAdvances(item); - HB_Position positions = face->buffer->positions; - HB_Fixed *advances = item->advances; - -// DEBUG("positioned glyphs:"); - for (unsigned int i = 0; i < face->buffer->in_length; i++) { -// DEBUG(" %d:\t orig advance: (%d/%d)\tadv=(%d/%d)\tpos=(%d/%d)\tback=%d\tnew_advance=%d", i, -// glyphs[i].advance.x.toInt(), glyphs[i].advance.y.toInt(), -// (int)(positions[i].x_advance >> 6), (int)(positions[i].y_advance >> 6), -// (int)(positions[i].x_pos >> 6), (int)(positions[i].y_pos >> 6), -// positions[i].back, positions[i].new_advance); - - HB_Fixed adjustment = (item->item.bidiLevel % 2) ? -positions[i].x_advance : positions[i].x_advance; - - if (!(face->current_flags & HB_ShaperFlag_UseDesignMetrics)) - adjustment = HB_FIXED_ROUND(adjustment); - - if (positions[i].new_advance) { - advances[i] = adjustment; - } else { - advances[i] += adjustment; - } - - int back = 0; - HB_FixedPoint *offsets = item->offsets; - offsets[i].x = positions[i].x_pos; - offsets[i].y = positions[i].y_pos; - while (positions[i - back].back) { - back += positions[i - back].back; - offsets[i].x += positions[i - back].x_pos; - offsets[i].y += positions[i - back].y_pos; - } - offsets[i].y = -offsets[i].y; - - if (item->item.bidiLevel % 2) { - // ### may need to go back multiple glyphs like in ltr - back = positions[i].back; - while (back--) - offsets[i].x -= advances[i-back]; - } else { - back = 0; - while (positions[i - back].back) { - back += positions[i - back].back; - offsets[i].x -= advances[i-back]; - } - } -// DEBUG(" ->\tadv=%d\tpos=(%d/%d)", -// glyphs[i].advance.x.toInt(), glyphs[i].offset.x.toInt(), glyphs[i].offset.y.toInt()); - } - item->kerning_applied = face->has_opentype_kerning; - } else { - HB_HeuristicPosition(item); - } - -#ifdef OT_DEBUG - if (doLogClusters) { - DEBUG("log clusters after shaping:"); - for (int j = 0; j < length; j++) - DEBUG(" log[%d] = %d", j, item->log_clusters[j]); - } - DEBUG("final glyphs:"); - for (int i = 0; i < (int)hb_buffer->in_length; ++i) - DEBUG(" glyph=%4x char_index=%d mark: %d cmp: %d, clusterStart: %d advance=%d/%d offset=%d/%d", - glyphs[i].glyph, hb_buffer->in_string[i].cluster, glyphs[i].attributes.mark, - glyphs[i].attributes.combiningClass, glyphs[i].attributes.clusterStart, - glyphs[i].advance.x.toInt(), glyphs[i].advance.y.toInt(), - glyphs[i].offset.x.toInt(), glyphs[i].offset.y.toInt()); - DEBUG("-----------------------------------------"); -#endif - return true; -} - -HB_Bool HB_ShapeItem(HB_ShaperItem *shaper_item) -{ - HB_Bool result = false; - if (shaper_item->num_glyphs < shaper_item->item.length) { - shaper_item->num_glyphs = shaper_item->item.length; - return false; - } - assert(shaper_item->item.script < HB_ScriptCount); - result = HB_ScriptEngines[shaper_item->item.script].shape(shaper_item); - shaper_item->glyphIndicesPresent = false; - return result; -} - diff --git a/third_party/harfbuzz/src/harfbuzz-shaper.h b/third_party/harfbuzz/src/harfbuzz-shaper.h deleted file mode 100644 index 33fc85aeb1..0000000000 --- a/third_party/harfbuzz/src/harfbuzz-shaper.h +++ /dev/null @@ -1,278 +0,0 @@ -/* - * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) - * - * This is part of HarfBuzz, an OpenType Layout engine library. - * - * Permission is hereby granted, without written agreement and without - * license or royalty fees, to use, copy, modify, and distribute this - * software and its documentation for any purpose, provided that the - * above copyright notice and the following two paragraphs appear in - * all copies of this software. - * - * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR - * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES - * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN - * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE. - * - * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, - * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS - * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO - * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. - */ - -#ifndef HARFBUZZ_SHAPER_H -#define HARFBUZZ_SHAPER_H - -#include "harfbuzz-global.h" -#include "harfbuzz-gdef.h" -#include "harfbuzz-gpos.h" -#include "harfbuzz-gsub.h" -#include "harfbuzz-external.h" -#include "harfbuzz-stream-private.h" - -HB_BEGIN_HEADER - -typedef enum { - HB_Script_Common, - HB_Script_Greek, - HB_Script_Cyrillic, - HB_Script_Armenian, - HB_Script_Hebrew, - HB_Script_Arabic, - HB_Script_Syriac, - HB_Script_Thaana, - HB_Script_Devanagari, - HB_Script_Bengali, - HB_Script_Gurmukhi, - HB_Script_Gujarati, - HB_Script_Oriya, - HB_Script_Tamil, - HB_Script_Telugu, - HB_Script_Kannada, - HB_Script_Malayalam, - HB_Script_Sinhala, - HB_Script_Thai, - HB_Script_Lao, - HB_Script_Tibetan, - HB_Script_Myanmar, - HB_Script_Georgian, - HB_Script_Hangul, - HB_Script_Ogham, - HB_Script_Runic, - HB_Script_Khmer, - HB_Script_Nko, - HB_Script_Inherited, - HB_ScriptCount = HB_Script_Inherited - /* - HB_Script_Latin = Common, - HB_Script_Ethiopic = Common, - HB_Script_Cherokee = Common, - HB_Script_CanadianAboriginal = Common, - HB_Script_Mongolian = Common, - HB_Script_Hiragana = Common, - HB_Script_Katakana = Common, - HB_Script_Bopomofo = Common, - HB_Script_Han = Common, - HB_Script_Yi = Common, - HB_Script_OldItalic = Common, - HB_Script_Gothic = Common, - HB_Script_Deseret = Common, - HB_Script_Tagalog = Common, - HB_Script_Hanunoo = Common, - HB_Script_Buhid = Common, - HB_Script_Tagbanwa = Common, - HB_Script_Limbu = Common, - HB_Script_TaiLe = Common, - HB_Script_LinearB = Common, - HB_Script_Ugaritic = Common, - HB_Script_Shavian = Common, - HB_Script_Osmanya = Common, - HB_Script_Cypriot = Common, - HB_Script_Braille = Common, - HB_Script_Buginese = Common, - HB_Script_Coptic = Common, - HB_Script_NewTaiLue = Common, - HB_Script_Glagolitic = Common, - HB_Script_Tifinagh = Common, - HB_Script_SylotiNagri = Common, - HB_Script_OldPersian = Common, - HB_Script_Kharoshthi = Common, - HB_Script_Balinese = Common, - HB_Script_Cuneiform = Common, - HB_Script_Phoenician = Common, - HB_Script_PhagsPa = Common, - */ -} HB_Script; - -typedef struct -{ - hb_uint32 pos; - hb_uint32 length; - HB_Script script; - hb_uint8 bidiLevel; -} HB_ScriptItem; - -typedef enum { - HB_NoBreak, - HB_SoftHyphen, - HB_Break, - HB_ForcedBreak -} HB_LineBreakType; - - -typedef struct { - /*HB_LineBreakType*/ unsigned lineBreakType :2; - /*HB_Bool*/ unsigned whiteSpace :1; /* A unicode whitespace character, except NBSP, ZWNBSP */ - /*HB_Bool*/ unsigned charStop :1; /* Valid cursor position (for left/right arrow) */ - /*HB_Bool*/ unsigned wordBoundary :1; - /*HB_Bool*/ unsigned sentenceBoundary :1; - unsigned unused :2; -} HB_CharAttributes; - -void HB_GetCharAttributes(const HB_UChar16 *string, hb_uint32 stringLength, - const HB_ScriptItem *items, hb_uint32 numItems, - HB_CharAttributes *attributes); - -/* requires HB_GetCharAttributes to be called before */ -void HB_GetWordBoundaries(const HB_UChar16 *string, hb_uint32 stringLength, - const HB_ScriptItem *items, hb_uint32 numItems, - HB_CharAttributes *attributes); - -/* requires HB_GetCharAttributes to be called before */ -void HB_GetSentenceBoundaries(const HB_UChar16 *string, hb_uint32 stringLength, - const HB_ScriptItem *items, hb_uint32 numItems, - HB_CharAttributes *attributes); - - -typedef enum { - HB_LeftToRight = 0, - HB_RightToLeft = 1 -} HB_StringToGlyphsFlags; - -typedef enum { - HB_ShaperFlag_Default = 0, - HB_ShaperFlag_NoKerning = 1, - HB_ShaperFlag_UseDesignMetrics = 1 << 1, - /* Arabic vowels in some fonts (Times New Roman, at least) have - non-zero advances, when they should be zero. Setting this shaper - flag causes us to zero out the advances for mark glyphs. */ - HB_ShaperFlag_ForceMarksToZeroWidth = 1 << 2 -} HB_ShaperFlag; - -/* - highest value means highest priority for justification. Justification is done by first inserting kashidas - starting with the highest priority positions, then stretching spaces, afterwards extending inter char - spacing, and last spacing between arabic words. - NoJustification is for example set for arabic where no Kashida can be inserted or for diacritics. -*/ -typedef enum { - HB_NoJustification= 0, /* Justification can't be applied after this glyph */ - HB_Arabic_Space = 1, /* This glyph represents a space inside arabic text */ - HB_Character = 2, /* Inter-character justification point follows this glyph */ - HB_Space = 4, /* This glyph represents a blank outside an Arabic run */ - HB_Arabic_Normal = 7, /* Normal Middle-Of-Word glyph that connects to the right (begin) */ - HB_Arabic_Waw = 8, /* Next character is final form of Waw/Ain/Qaf/Fa */ - HB_Arabic_BaRa = 9, /* Next two chars are Ba + Ra/Ya/AlefMaksura */ - HB_Arabic_Alef = 10, /* Next character is final form of Alef/Tah/Lam/Kaf/Gaf */ - HB_Arabic_HaaDal = 11, /* Next character is final form of Haa/Dal/Taa Marbutah */ - HB_Arabic_Seen = 12, /* Initial or Medial form Of Seen/Sad */ - HB_Arabic_Kashida = 13 /* Kashida(U+640) in middle of word */ -} HB_JustificationClass; - -/* This structure is binary compatible with Uniscribe's SCRIPT_VISATTR. Would be nice to keep - * it like that. If this is a problem please tell Trolltech :) - */ -typedef struct { - unsigned justification :4; /* Justification class */ - unsigned clusterStart :1; /* First glyph of representation of cluster */ - unsigned mark :1; /* needs to be positioned around base char */ - unsigned zeroWidth :1; /* ZWJ, ZWNJ etc, with no width */ - unsigned dontPrint :1; - unsigned combiningClass :8; -} HB_GlyphAttributes; - -typedef struct HB_FaceRec_ { - HB_Bool isSymbolFont; - - HB_GDEF gdef; - HB_GSUB gsub; - HB_GPOS gpos; - HB_Bool supported_scripts[HB_ScriptCount]; - HB_Buffer buffer; - HB_Script current_script; - int current_flags; /* HB_ShaperFlags */ - HB_Bool has_opentype_kerning; - HB_Bool glyphs_substituted; - HB_GlyphAttributes *tmpAttributes; - unsigned int *tmpLogClusters; - int length; - int orig_nglyphs; -} HB_FaceRec; - -typedef HB_Error (*HB_GetFontTableFunc)(void *font, HB_Tag tag, HB_Byte *buffer, HB_UInt *length); - -HB_Face HB_NewFace(void *font, HB_GetFontTableFunc tableFunc); -void HB_FreeFace(HB_Face face); - -typedef struct { - HB_Fixed x, y; - HB_Fixed width, height; - HB_Fixed xOffset, yOffset; -} HB_GlyphMetrics; - -typedef enum { - HB_FontAscent -} HB_FontMetric; - -typedef struct { - HB_Bool (*convertStringToGlyphIndices)(HB_Font font, const HB_UChar16 *string, hb_uint32 length, HB_Glyph *glyphs, hb_uint32 *numGlyphs, HB_Bool rightToLeft); - void (*getGlyphAdvances)(HB_Font font, const HB_Glyph *glyphs, hb_uint32 numGlyphs, HB_Fixed *advances, int flags /*HB_ShaperFlag*/); - HB_Bool (*canRender)(HB_Font font, const HB_UChar16 *string, hb_uint32 length); - /* implementation needs to make sure to load a scaled glyph, so /no/ FT_LOAD_NO_SCALE */ - HB_Error (*getPointInOutline)(HB_Font font, HB_Glyph glyph, int flags /*HB_ShaperFlag*/, hb_uint32 point, HB_Fixed *xpos, HB_Fixed *ypos, hb_uint32 *nPoints); - void (*getGlyphMetrics)(HB_Font font, HB_Glyph glyph, HB_GlyphMetrics *metrics); - HB_Fixed (*getFontMetric)(HB_Font font, HB_FontMetric metric); -} HB_FontClass; - -typedef struct HB_Font_ { - const HB_FontClass *klass; - - /* Metrics */ - HB_UShort x_ppem, y_ppem; - HB_16Dot16 x_scale, y_scale; - - void *userData; -} HB_FontRec; - -typedef struct HB_ShaperItem_ HB_ShaperItem; - -struct HB_ShaperItem_ { - const HB_UChar16 *string; /* input: the Unicode UTF16 text to be shaped */ - hb_uint32 stringLength; /* input: the length of the input in 16-bit words */ - HB_ScriptItem item; /* input: the current run to be shaped: a run of text all in the same script that is a substring of */ - HB_Font font; /* input: the font: scale, units and function pointers supplying glyph indices and metrics */ - HB_Face face; /* input: the shaper state; current script, access to the OpenType tables , etc. */ - int shaperFlags; /* input (unused) should be set to 0; intended to support flags defined in HB_ShaperFlag */ - HB_Bool glyphIndicesPresent; /* input: true if the array contains glyph indices ready to be shaped */ - hb_uint32 initialGlyphCount; /* input: if glyphIndicesPresent is true, the number of glyph indices in the array */ - - hb_uint32 num_glyphs; /* input: capacity of output arrays , , , , and ; */ - /* output: required capacity (may be larger than actual capacity) */ - - HB_Glyph *glyphs; /* output: indices of shaped glyphs */ - HB_GlyphAttributes *attributes; /* output: glyph attributes */ - HB_Fixed *advances; /* output: advances */ - HB_FixedPoint *offsets; /* output: offsets */ - unsigned short *log_clusters; /* output: for each output glyph, the index in the input of the start of its logical cluster */ - - /* internal */ - HB_Bool kerning_applied; /* output: true if kerning was applied by the shaper */ -}; - -HB_Bool HB_ShapeItem(HB_ShaperItem *item); - -HB_END_HEADER - -#endif diff --git a/third_party/harfbuzz/src/harfbuzz-stream-private.h b/third_party/harfbuzz/src/harfbuzz-stream-private.h deleted file mode 100644 index fbd9f81379..0000000000 --- a/third_party/harfbuzz/src/harfbuzz-stream-private.h +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright (C) 1998-2004 David Turner and Werner Lemberg - * Copyright (C) 2006 Behdad Esfahbod - * - * This is part of HarfBuzz, an OpenType Layout engine library. - * - * Permission is hereby granted, without written agreement and without - * license or royalty fees, to use, copy, modify, and distribute this - * software and its documentation for any purpose, provided that the - * above copyright notice and the following two paragraphs appear in - * all copies of this software. - * - * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR - * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES - * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN - * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE. - * - * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, - * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS - * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO - * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. - */ - -#ifndef HARFBUZZ_STREAM_PRIVATE_H -#define HARFBUZZ_STREAM_PRIVATE_H - -#include "harfbuzz-impl.h" -#include "harfbuzz-stream.h" - -HB_BEGIN_HEADER - -HB_INTERNAL void -_hb_close_stream( HB_Stream stream ); - -HB_INTERNAL HB_Int -_hb_stream_pos( HB_Stream stream ); - -HB_INTERNAL HB_Error -_hb_stream_seek( HB_Stream stream, - HB_UInt pos ); - -HB_INTERNAL HB_Error -_hb_stream_frame_enter( HB_Stream stream, - HB_UInt size ); - -HB_INTERNAL void -_hb_stream_frame_exit( HB_Stream stream ); - -/* convenience macros */ - -#define SET_ERR(c) ( (error = (c)) != 0 ) - -#define GOTO_Table(tag) (0) -#define FILE_Pos() _hb_stream_pos( stream ) -#define FILE_Seek(pos) SET_ERR( _hb_stream_seek( stream, pos ) ) -#define ACCESS_Frame(size) SET_ERR( _hb_stream_frame_enter( stream, size ) ) -#define FORGET_Frame() _hb_stream_frame_exit( stream ) - -#define GET_Byte() (*stream->cursor++) -#define GET_Short() (stream->cursor += 2, (HB_Short)( \ - (*(((HB_Byte*)stream->cursor)-2) << 8) | \ - *(((HB_Byte*)stream->cursor)-1) \ - )) -#define GET_Long() (stream->cursor += 4, (HB_Int)( \ - (*(((HB_Byte*)stream->cursor)-4) << 24) | \ - (*(((HB_Byte*)stream->cursor)-3) << 16) | \ - (*(((HB_Byte*)stream->cursor)-2) << 8) | \ - *(((HB_Byte*)stream->cursor)-1) \ - )) - - -#define GET_Char() ((HB_Char)GET_Byte()) -#define GET_UShort() ((HB_UShort)GET_Short()) -#define GET_ULong() ((HB_UInt)GET_Long()) -#define GET_Tag4() GET_ULong() - -HB_END_HEADER - -#endif /* HARFBUZZ_STREAM_PRIVATE_H */ diff --git a/third_party/harfbuzz/src/harfbuzz-stream.c b/third_party/harfbuzz/src/harfbuzz-stream.c deleted file mode 100644 index 2d9638f6b6..0000000000 --- a/third_party/harfbuzz/src/harfbuzz-stream.c +++ /dev/null @@ -1,114 +0,0 @@ -/* - * Copyright (C) 2005 David Turner - * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) - * Copyright (C) 2007 Red Hat, Inc. - * - * This is part of HarfBuzz, an OpenType Layout engine library. - * - * Permission is hereby granted, without written agreement and without - * license or royalty fees, to use, copy, modify, and distribute this - * software and its documentation for any purpose, provided that the - * above copyright notice and the following two paragraphs appear in - * all copies of this software. - * - * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR - * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES - * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN - * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE. - * - * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, - * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS - * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO - * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. - * - * Red Hat Author(s): Behdad Esfahbod - */ - -#include "harfbuzz-impl.h" -#include "harfbuzz-stream-private.h" -#include - -#if 0 -#include -#define LOG(x) _hb_log x - -static void -_hb_log( const char* format, ... ) -{ - va_list ap; - - va_start( ap, format ); - vfprintf( stderr, format, ap ); - va_end( ap ); -} - -#else -#define LOG(x) do {} while (0) -#endif - -HB_INTERNAL void -_hb_close_stream( HB_Stream stream ) -{ - if (!stream) - return; - free(stream->base); - free(stream); -} - - -HB_INTERNAL HB_Int -_hb_stream_pos( HB_Stream stream ) -{ - LOG(( "_hb_stream_pos() -> %ld\n", stream->pos )); - return stream->pos; -} - - -HB_INTERNAL HB_Error -_hb_stream_seek( HB_Stream stream, - HB_UInt pos ) -{ - HB_Error error = (HB_Error)0; - - stream->pos = pos; - if (pos > stream->size) - error = ERR(HB_Err_Read_Error); - - LOG(( "_hb_stream_seek(%ld) -> 0x%04X\n", pos, error )); - return error; -} - - -HB_INTERNAL HB_Error -_hb_stream_frame_enter( HB_Stream stream, - HB_UInt count ) -{ - HB_Error error = HB_Err_Ok; - - /* check new position, watch for overflow */ - if (HB_UNLIKELY (stream->pos + count > stream->size || - stream->pos + count < stream->pos)) - { - error = ERR(HB_Err_Read_Error); - goto Exit; - } - - /* set cursor */ - stream->cursor = stream->base + stream->pos; - stream->pos += count; - -Exit: - LOG(( "_hb_stream_frame_enter(%ld) -> 0x%04X\n", count, error )); - return error; -} - - -HB_INTERNAL void -_hb_stream_frame_exit( HB_Stream stream ) -{ - stream->cursor = NULL; - - LOG(( "_hb_stream_frame_exit()\n" )); -} diff --git a/third_party/harfbuzz/src/harfbuzz-stream.h b/third_party/harfbuzz/src/harfbuzz-stream.h deleted file mode 100644 index 999193696d..0000000000 --- a/third_party/harfbuzz/src/harfbuzz-stream.h +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (C) 2005 David Turner - * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) - * - * This is part of HarfBuzz, an OpenType Layout engine library. - * - * Permission is hereby granted, without written agreement and without - * license or royalty fees, to use, copy, modify, and distribute this - * software and its documentation for any purpose, provided that the - * above copyright notice and the following two paragraphs appear in - * all copies of this software. - * - * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR - * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES - * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN - * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE. - * - * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, - * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS - * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO - * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. - */ - -#ifndef HARFBUZZ_STREAM_H -#define HARFBUZZ_STREAM_H - -#include "harfbuzz-global.h" - -HB_BEGIN_HEADER - -typedef struct HB_StreamRec_ -{ - HB_Byte* base; - HB_UInt size; - HB_UInt pos; - - HB_Byte* cursor; -} HB_StreamRec; - - -HB_END_HEADER - -#endif diff --git a/third_party/harfbuzz/src/harfbuzz-thai.c b/third_party/harfbuzz/src/harfbuzz-thai.c deleted file mode 100644 index 1d1aa2fcfc..0000000000 --- a/third_party/harfbuzz/src/harfbuzz-thai.c +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) - * - * This is part of HarfBuzz, an OpenType Layout engine library. - * - * Permission is hereby granted, without written agreement and without - * license or royalty fees, to use, copy, modify, and distribute this - * software and its documentation for any purpose, provided that the - * above copyright notice and the following two paragraphs appear in - * all copies of this software. - * - * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR - * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES - * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN - * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE. - * - * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, - * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS - * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO - * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. - */ - -#include "harfbuzz-shaper.h" -#include "harfbuzz-shaper-private.h" -#include "harfbuzz-external.h" - -#include - -static void thaiWordBreaks(const HB_UChar16 *string, hb_uint32 len, HB_CharAttributes *attributes) -{ - typedef int (*th_brk_def)(const char*, int[], int); - static void *thaiCodec = 0; - static th_brk_def th_brk = 0; - char *cstr = 0; - int brp[128]; - int *break_positions = brp; - hb_uint32 numbreaks; - hb_uint32 i; - - if (!thaiCodec) - thaiCodec = HB_TextCodecForMib(2259); - - /* load libthai dynamically */ - if (!th_brk && thaiCodec) { - th_brk = (th_brk_def)HB_Library_Resolve("thai", "th_brk"); - if (!th_brk) - thaiCodec = 0; - } - - if (!th_brk) - return; - - cstr = HB_TextCodec_ConvertFromUnicode(thaiCodec, string, len, 0); - if (!cstr) - return; - - break_positions = brp; - numbreaks = th_brk(cstr, break_positions, 128); - if (numbreaks > 128) { - break_positions = (int *)malloc(numbreaks * sizeof(int)); - numbreaks = th_brk(cstr, break_positions, numbreaks); - } - - for (i = 0; i < len; ++i) - attributes[i].lineBreakType = HB_NoBreak; - - for (i = 0; i < numbreaks; ++i) { - if (break_positions[i] > 0) - attributes[break_positions[i]-1].lineBreakType = HB_Break; - } - - if (break_positions != brp) - free(break_positions); - - HB_TextCodec_FreeResult(cstr); -} - - -void HB_ThaiAttributes(HB_Script script, const HB_UChar16 *text, hb_uint32 from, hb_uint32 len, HB_CharAttributes *attributes) -{ - assert(script == HB_Script_Thai); - attributes += from; - thaiWordBreaks(text + from, len, attributes); -} - diff --git a/third_party/harfbuzz/src/harfbuzz-tibetan.c b/third_party/harfbuzz/src/harfbuzz-tibetan.c deleted file mode 100644 index bfa31b1def..0000000000 --- a/third_party/harfbuzz/src/harfbuzz-tibetan.c +++ /dev/null @@ -1,274 +0,0 @@ -/* - * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) - * - * This is part of HarfBuzz, an OpenType Layout engine library. - * - * Permission is hereby granted, without written agreement and without - * license or royalty fees, to use, copy, modify, and distribute this - * software and its documentation for any purpose, provided that the - * above copyright notice and the following two paragraphs appear in - * all copies of this software. - * - * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR - * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES - * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN - * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE. - * - * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, - * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS - * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO - * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. - */ - -#include "harfbuzz-shaper.h" -#include "harfbuzz-shaper-private.h" - -#include - -/* - tibetan syllables are of the form: - head position consonant - first sub-joined consonant - ....intermediate sub-joined consonants (if any) - last sub-joined consonant - sub-joined vowel (a-chung U+0F71) - standard or compound vowel sign (or 'virama' for devanagari transliteration) -*/ - -typedef enum { - TibetanOther, - TibetanHeadConsonant, - TibetanSubjoinedConsonant, - TibetanSubjoinedVowel, - TibetanVowel -} TibetanForm; - -/* this table starts at U+0f40 */ -static const unsigned char tibetanForm[0x80] = { - TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant, - TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant, - TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant, - TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant, - - TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant, - TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant, - TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant, - TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant, - - TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant, - TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant, - TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant, TibetanHeadConsonant, - TibetanOther, TibetanOther, TibetanOther, TibetanOther, - - TibetanOther, TibetanVowel, TibetanVowel, TibetanVowel, - TibetanVowel, TibetanVowel, TibetanVowel, TibetanVowel, - TibetanVowel, TibetanVowel, TibetanVowel, TibetanVowel, - TibetanVowel, TibetanVowel, TibetanVowel, TibetanVowel, - - TibetanVowel, TibetanVowel, TibetanVowel, TibetanVowel, - TibetanVowel, TibetanVowel, TibetanVowel, TibetanVowel, - TibetanOther, TibetanOther, TibetanOther, TibetanOther, - TibetanOther, TibetanOther, TibetanOther, TibetanOther, - - TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, - TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, - TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, - TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, - - TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, - TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, - TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, - TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, - - TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, - TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, - TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, TibetanSubjoinedConsonant, - TibetanSubjoinedConsonant, TibetanOther, TibetanOther, TibetanOther -}; - - -#define tibetan_form(c) \ - (TibetanForm)tibetanForm[c - 0x0f40] - -static const HB_OpenTypeFeature tibetan_features[] = { - { HB_MAKE_TAG('c', 'c', 'm', 'p'), CcmpProperty }, - { HB_MAKE_TAG('a', 'b', 'v', 's'), AboveSubstProperty }, - { HB_MAKE_TAG('b', 'l', 'w', 's'), BelowSubstProperty }, - { HB_MAKE_TAG('c', 'a', 'l', 't'), CaltProperty }, - {0, 0} -}; - -static HB_Bool tibetan_shape_syllable(HB_Bool openType, HB_ShaperItem *item, HB_Bool invalid) -{ - hb_uint32 i; - const HB_UChar16 *str = item->string + item->item.pos; - int len = item->item.length; -#ifndef NO_OPENTYPE - const int availableGlyphs = item->num_glyphs; -#endif - HB_Bool haveGlyphs; - HB_STACKARRAY(HB_UChar16, reordered, len + 4); - - if (item->num_glyphs < item->item.length + 4) { - item->num_glyphs = item->item.length + 4; - return FALSE; - } - - if (invalid) { - *reordered = 0x25cc; - memcpy(reordered+1, str, len*sizeof(HB_UChar16)); - len++; - str = reordered; - } - - haveGlyphs = item->font->klass->convertStringToGlyphIndices(item->font, - str, len, - item->glyphs, &item->num_glyphs, - item->item.bidiLevel % 2); - - HB_FREE_STACKARRAY(reordered); - - if (!haveGlyphs) - return FALSE; - - for (i = 0; i < item->item.length; i++) { - item->attributes[i].mark = FALSE; - item->attributes[i].clusterStart = FALSE; - item->attributes[i].justification = 0; - item->attributes[i].zeroWidth = FALSE; -/* IDEBUG(" %d: %4x", i, str[i]); */ - } - - /* now we have the syllable in the right order, and can start running it through open type. */ - -#ifndef NO_OPENTYPE - if (openType) { - HB_OpenTypeShape(item, /*properties*/0); - if (!HB_OpenTypePosition(item, availableGlyphs, /*doLogClusters*/FALSE)) - return FALSE; - } else { - HB_HeuristicPosition(item); - } -#endif - - item->attributes[0].clusterStart = TRUE; - return TRUE; -} - - -static int tibetan_nextSyllableBoundary(const HB_UChar16 *s, int start, int end, HB_Bool *invalid) -{ - const HB_UChar16 *uc = s + start; - - int pos = 0; - TibetanForm state = tibetan_form(*uc); - -/* qDebug("state[%d]=%d (uc=%4x)", pos, state, uc[pos]);*/ - pos++; - - if (state != TibetanHeadConsonant) { - if (state != TibetanOther) - *invalid = TRUE; - goto finish; - } - - while (pos < end - start) { - TibetanForm newState = tibetan_form(uc[pos]); - switch(newState) { - case TibetanSubjoinedConsonant: - case TibetanSubjoinedVowel: - if (state != TibetanHeadConsonant && - state != TibetanSubjoinedConsonant) - goto finish; - state = newState; - break; - case TibetanVowel: - if (state != TibetanHeadConsonant && - state != TibetanSubjoinedConsonant && - state != TibetanSubjoinedVowel) - goto finish; - break; - case TibetanOther: - case TibetanHeadConsonant: - goto finish; - } - pos++; - } - -finish: - *invalid = FALSE; - return start+pos; -} - -HB_Bool HB_TibetanShape(HB_ShaperItem *item) -{ - - HB_Bool openType = FALSE; - unsigned short *logClusters = item->log_clusters; - - HB_ShaperItem syllable = *item; - int first_glyph = 0; - - int sstart = item->item.pos; - int end = sstart + item->item.length; - - assert(item->item.script == HB_Script_Tibetan); - -#ifndef QT_NO_OPENTYPE - openType = HB_SelectScript(item, tibetan_features); -#endif - - while (sstart < end) { - HB_Bool invalid; - int i; - int send = tibetan_nextSyllableBoundary(item->string, sstart, end, &invalid); -/* IDEBUG("syllable from %d, length %d, invalid=%s", sstart, send-sstart, - invalid ? "TRUE" : "FALSE"); */ - syllable.item.pos = sstart; - syllable.item.length = send-sstart; - syllable.glyphs = item->glyphs + first_glyph; - syllable.attributes = item->attributes + first_glyph; - syllable.offsets = item->offsets + first_glyph; - syllable.advances = item->advances + first_glyph; - syllable.num_glyphs = item->num_glyphs - first_glyph; - if (!tibetan_shape_syllable(openType, &syllable, invalid)) { - item->num_glyphs += syllable.num_glyphs; - return FALSE; - } - /* fix logcluster array */ - for (i = sstart; i < send; ++i) - logClusters[i-item->item.pos] = first_glyph; - sstart = send; - first_glyph += syllable.num_glyphs; - } - item->num_glyphs = first_glyph; - return TRUE; -} - -void HB_TibetanAttributes(HB_Script script, const HB_UChar16 *text, hb_uint32 from, hb_uint32 len, HB_CharAttributes *attributes) -{ - int end = from + len; - const HB_UChar16 *uc = text + from; - hb_uint32 i = 0; - HB_UNUSED(script); - attributes += from; - while (i < len) { - HB_Bool invalid; - hb_uint32 boundary = tibetan_nextSyllableBoundary(text, from+i, end, &invalid) - from; - - attributes[i].charStop = TRUE; - - if (boundary > len-1) boundary = len; - i++; - while (i < boundary) { - attributes[i].charStop = FALSE; - ++uc; - ++i; - } - assert(i == boundary); - } -} - - diff --git a/third_party/harfbuzz/src/harfbuzz.c b/third_party/harfbuzz/src/harfbuzz.c deleted file mode 100644 index 3e4a30a125..0000000000 --- a/third_party/harfbuzz/src/harfbuzz.c +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (C) 2006 Behdad Esfahbod - * - * This is part of HarfBuzz, an OpenType Layout engine library. - * - * Permission is hereby granted, without written agreement and without - * license or royalty fees, to use, copy, modify, and distribute this - * software and its documentation for any purpose, provided that the - * above copyright notice and the following two paragraphs appear in - * all copies of this software. - * - * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR - * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES - * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN - * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE. - * - * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, - * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS - * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO - * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. - */ - -#define HB_INTERNAL static -#include "harfbuzz-buffer.c" -#include "harfbuzz-gdef.c" -#include "harfbuzz-gsub.c" -#include "harfbuzz-gpos.c" -#include "harfbuzz-impl.c" -#include "harfbuzz-open.c" -#include "harfbuzz-stream.c" diff --git a/third_party/harfbuzz/src/harfbuzz.h b/third_party/harfbuzz/src/harfbuzz.h deleted file mode 100644 index e91a33eb71..0000000000 --- a/third_party/harfbuzz/src/harfbuzz.h +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (C) 1998-2004 David Turner and Werner Lemberg - * Copyright (C) 2006 Behdad Esfahbod - * - * This is part of HarfBuzz, an OpenType Layout engine library. - * - * Permission is hereby granted, without written agreement and without - * license or royalty fees, to use, copy, modify, and distribute this - * software and its documentation for any purpose, provided that the - * above copyright notice and the following two paragraphs appear in - * all copies of this software. - * - * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR - * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES - * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN - * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE. - * - * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, - * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS - * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO - * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. - */ - -#ifndef HARFBUZZ_H -#define HARFBUZZ_H - -#include "harfbuzz-external.h" -#include "harfbuzz-global.h" -#include "harfbuzz-buffer.h" -#include "harfbuzz-gdef.h" -#include "harfbuzz-gsub.h" -#include "harfbuzz-gpos.h" -#include "harfbuzz-open.h" -#include "harfbuzz-shaper.h" - -#endif /* HARFBUZZ_OPEN_H */ diff --git a/third_party/harfbuzz/tests/Makefile.am b/third_party/harfbuzz/tests/Makefile.am deleted file mode 100644 index febf8909fa..0000000000 --- a/third_party/harfbuzz/tests/Makefile.am +++ /dev/null @@ -1,7 +0,0 @@ - -SUBDIRS = - -if QT -SUBDIRS += linebreaking shaping -endif - diff --git a/third_party/harfbuzz/tests/linebreaking/.gitignore b/third_party/harfbuzz/tests/linebreaking/.gitignore deleted file mode 100644 index 81e019d5b9..0000000000 --- a/third_party/harfbuzz/tests/linebreaking/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -.deps -linebreaking -*.moc -*.o diff --git a/third_party/harfbuzz/tests/linebreaking/Makefile.am b/third_party/harfbuzz/tests/linebreaking/Makefile.am deleted file mode 100644 index b710896d6f..0000000000 --- a/third_party/harfbuzz/tests/linebreaking/Makefile.am +++ /dev/null @@ -1,12 +0,0 @@ - -check_PROGRAMS = linebreaking - -linebreaking_SOURCES = main.cpp harfbuzz-qt.cpp -linebreaking_LDADD = $(QT_GUI_LIBS) $(QT_QTEST_LIBS) ../../src/libharfbuzz-1.la - -main.o: main.moc - -main.moc: $(srcdir)/main.cpp - $(QT_MOC) -o main.moc $(srcdir)/main.cpp - -INCLUDES = -I$(top_srcdir)/src $(FREETYPE_CFLAGS) $(QT_GUI_CFLAGS) $(QT_QTEST_CFLAGS) diff --git a/third_party/harfbuzz/tests/linebreaking/harfbuzz-qt.cpp b/third_party/harfbuzz/tests/linebreaking/harfbuzz-qt.cpp deleted file mode 100644 index ea030526c6..0000000000 --- a/third_party/harfbuzz/tests/linebreaking/harfbuzz-qt.cpp +++ /dev/null @@ -1,108 +0,0 @@ -/* - * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) - * - * This is part of HarfBuzz, an OpenType Layout engine library. - * - * Permission is hereby granted, without written agreement and without - * license or royalty fees, to use, copy, modify, and distribute this - * software and its documentation for any purpose, provided that the - * above copyright notice and the following two paragraphs appear in - * all copies of this software. - * - * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR - * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES - * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN - * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE. - * - * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, - * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS - * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO - * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. - */ - -#include -#include -#include -#include - -extern "C" { - -HB_LineBreakClass HB_GetLineBreakClass(HB_UChar32 ch) -{ -#if QT_VERSION >= 0x040300 - return (HB_LineBreakClass)QUnicodeTables::lineBreakClass(ch); -#else -#error "This test currently requires Qt >= 4.3" -#endif -} - -void HB_GetUnicodeCharProperties(HB_UChar32 ch, HB_CharCategory *category, int *combiningClass) -{ - *category = (HB_CharCategory)QChar::category(ch); - *combiningClass = QChar::combiningClass(ch); -} - -HB_CharCategory HB_GetUnicodeCharCategory(HB_UChar32 ch) -{ - return (HB_CharCategory)QChar::category(ch); -} - -int HB_GetUnicodeCharCombiningClass(HB_UChar32 ch) -{ - return QChar::combiningClass(ch); -} - -HB_UChar16 HB_GetMirroredChar(HB_UChar16 ch) -{ - return QChar::mirroredChar(ch); -} - -HB_WordClass HB_GetWordClass(HB_UChar32 ch) -{ - const QUnicodeTables::Properties *prop = QUnicodeTables::properties(ch); - return (HB_WordClass) prop->wordBreak; -} - - -HB_SentenceClass HB_GetSentenceClass(HB_UChar32 ch) -{ - const QUnicodeTables::Properties *prop = QUnicodeTables::properties(ch); - return (HB_SentenceClass) prop->sentenceBreak; -} - -void HB_GetGraphemeAndLineBreakClass(HB_UChar32 ch, HB_GraphemeClass *grapheme, HB_LineBreakClass *lineBreak) -{ - const QUnicodeTables::Properties *prop = QUnicodeTables::properties(ch); - *grapheme = (HB_GraphemeClass) prop->graphemeBreak; - *lineBreak = (HB_LineBreakClass) prop->line_break_class; -} - -void *HB_Library_Resolve(const char *library, const char *symbol) -{ - return QLibrary::resolve(library, symbol); -} - -void *HB_TextCodecForMib(int mib) -{ - return QTextCodec::codecForMib(mib); -} - -char *HB_TextCodec_ConvertFromUnicode(void *codec, const HB_UChar16 *unicode, hb_uint32 length, hb_uint32 *outputLength) -{ - QByteArray data = reinterpret_cast(codec)->fromUnicode((const QChar *)unicode, length); - // ### suboptimal - char *output = (char *)malloc(data.length() + 1); - memcpy(output, data.constData(), data.length() + 1); - if (outputLength) - *outputLength = data.length(); - return output; -} - -void HB_TextCodec_FreeResult(char *string) -{ - free(string); -} - -} diff --git a/third_party/harfbuzz/tests/linebreaking/main.cpp b/third_party/harfbuzz/tests/linebreaking/main.cpp deleted file mode 100644 index 3b2734ac02..0000000000 --- a/third_party/harfbuzz/tests/linebreaking/main.cpp +++ /dev/null @@ -1,230 +0,0 @@ -/* - * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) - * - * This is part of HarfBuzz, an OpenType Layout engine library. - * - * Permission is hereby granted, without written agreement and without - * license or royalty fees, to use, copy, modify, and distribute this - * software and its documentation for any purpose, provided that the - * above copyright notice and the following two paragraphs appear in - * all copies of this software. - * - * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR - * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES - * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN - * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE. - * - * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, - * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS - * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO - * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. - */ - -/* - !!!!!! Warning !!!!! - Please don't save this file in emacs. It contains utf8 text sequences emacs will - silently convert to a series of question marks. - */ -#include -#include - -#include - -static QVector getCharAttributes(const QString &str, HB_Script script = HB_Script_Common) -{ - QVector attrs(str.length()); - HB_ScriptItem item; - item.pos = 0; - item.length = str.length(); - item.script = script; - HB_GetCharAttributes(str.utf16(), str.length(), - &item, 1, - attrs.data()); - return attrs; -} - -class tst_CharAttributes : public QObject -{ - Q_OBJECT - -public: - tst_CharAttributes(); - virtual ~tst_CharAttributes(); - -public slots: - void init(); - void cleanup(); -private slots: - void lineBreaking(); - void charWordStopOnLineSeparator(); - void charStopForSurrogatePairs(); - void thaiWordBreak(); -}; - - -tst_CharAttributes::tst_CharAttributes() -{ -} - -tst_CharAttributes::~tst_CharAttributes() -{ -} - -void tst_CharAttributes::init() -{ -} - -void tst_CharAttributes::cleanup() -{ -} - - -void tst_CharAttributes::lineBreaking() -{ - struct Breaks { - const char *utf8; - uchar breaks[32]; - }; - Breaks brks[] = { - { "11", { false, 0xff } }, - { "aa", { false, 0xff } }, - { "++", { false, 0xff } }, - { "--", { false, 0xff } }, - { "((", { false, 0xff } }, - { "))", { false, 0xff } }, - { "..", { false, 0xff } }, - { "\"\"", { false, 0xff } }, - { "$$", { false, 0xff } }, - { "!!", { false, 0xff } }, - { "??", { false, 0xff } }, - { ",,", { false, 0xff } }, - - { ")()", { true, false, 0xff } }, - { "?!?", { false, false, 0xff } }, - { ".,.", { false, false, 0xff } }, - { "+-+", { false, false, 0xff } }, - { "+=+", { false, false, 0xff } }, - { "+(+", { false, false, 0xff } }, - { "+)+", { false, false, 0xff } }, - - { "a b", { false, true, 0xff } }, - { "a(b", { false, false, 0xff } }, - { "a)b", { false, false, 0xff } }, - { "a-b", { false, true, 0xff } }, - { "a.b", { false, false, 0xff } }, - { "a+b", { false, false, 0xff } }, - { "a?b", { false, false, 0xff } }, - { "a!b", { false, false, 0xff } }, - { "a$b", { false, false, 0xff } }, - { "a,b", { false, false, 0xff } }, - { "a/b", { false, false, 0xff } }, - { "1/2", { false, false, 0xff } }, - { "./.", { false, false, 0xff } }, - { ",/,", { false, false, 0xff } }, - { "!/!", { false, false, 0xff } }, - { "\\/\\", { false, false, 0xff } }, - { "1 2", { false, true, 0xff } }, - { "1(2", { false, false, 0xff } }, - { "1)2", { false, false, 0xff } }, - { "1-2", { false, false, 0xff } }, - { "1.2", { false, false, 0xff } }, - { "1+2", { false, false, 0xff } }, - { "1?2", { false, true, 0xff } }, - { "1!2", { false, true, 0xff } }, - { "1$2", { false, false, 0xff } }, - { "1,2", { false, false, 0xff } }, - { "1/2", { false, false, 0xff } }, - { "\330\260\331\216\331\204\331\220\331\203\331\216", { false, false, false, false, false, 0xff } }, - { "\330\247\331\204\331\205 \330\247\331\204\331\205", { false, false, false, true, false, false, 0xff } }, - { "1#2", { false, false, 0xff } }, - { "!#!", { false, false, 0xff } }, - { 0, {} } - }; - Breaks *b = brks; - while (b->utf8) { - QString str = QString::fromUtf8(b->utf8); - - QVector attrs = getCharAttributes(str); - - int i; - for (i = 0; i < (int)str.length() - 1; ++i) { - QVERIFY(b->breaks[i] != 0xff); - if ( (attrs[i].lineBreakType != HB_NoBreak) != (bool)b->breaks[i] ) { - qDebug("test case \"%s\" failed at char %d; break type: %d", b->utf8, i, attrs[i].lineBreakType); - QCOMPARE( (attrs[i].lineBreakType != HB_NoBreak), (bool)b->breaks[i] ); - } - } - QVERIFY(attrs[i].lineBreakType == HB_ForcedBreak); - QCOMPARE(b->breaks[i], (uchar)0xff); - ++b; - } -} - -void tst_CharAttributes::charWordStopOnLineSeparator() -{ - const QChar lineSeparator(QChar::LineSeparator); - QString txt; - txt.append(lineSeparator); - txt.append(lineSeparator); - QVector attrs = getCharAttributes(txt); - QVERIFY(attrs[1].charStop); -} - -void tst_CharAttributes::charStopForSurrogatePairs() -{ - QString txt; - txt.append("a"); - txt.append(0xd87e); - txt.append(0xdc25); - txt.append("b"); - QVector attrs = getCharAttributes(txt); - QVERIFY(attrs[0].charStop); - QVERIFY(attrs[1].charStop); - QVERIFY(!attrs[2].charStop); - QVERIFY(attrs[3].charStop); -} - -void tst_CharAttributes::thaiWordBreak() -{ - // สวัสดีครับ นี่เป็นการงทดสอบตัวเอ - QTextCodec *codec = QTextCodec::codecForMib(2259); - QString txt = codec->toUnicode(QByteArray("\xca\xc7\xd1\xca\xb4\xd5\xa4\xc3\xd1\xba\x20\xb9\xd5\xe8\xe0\xbb\xe7\xb9\xa1\xd2\xc3\xb7\xb4\xca\xcd\xba\xb5\xd1\xc7\xe0\xcd\xa7")); - - - QCOMPARE(txt.length(), 32); - QVector attrs = getCharAttributes(txt, HB_Script_Thai); - QVERIFY(attrs[0].lineBreakType == HB_NoBreak); - QVERIFY(attrs[1].lineBreakType == HB_NoBreak); - QVERIFY(attrs[2].lineBreakType == HB_NoBreak); - QVERIFY(attrs[3].lineBreakType == HB_NoBreak); - QVERIFY(attrs[4].lineBreakType == HB_NoBreak); - QVERIFY(attrs[5].lineBreakType == HB_Break); - QVERIFY(attrs[6].lineBreakType == HB_NoBreak); - QVERIFY(attrs[7].lineBreakType == HB_NoBreak); - QVERIFY(attrs[8].lineBreakType == HB_NoBreak); - QVERIFY(attrs[9].lineBreakType == HB_NoBreak); - QVERIFY(attrs[10].lineBreakType == HB_Break); - QVERIFY(attrs[11].lineBreakType == HB_NoBreak); - QVERIFY(attrs[12].lineBreakType == HB_NoBreak); - QVERIFY(attrs[13].lineBreakType == HB_Break); - QVERIFY(attrs[14].lineBreakType == HB_NoBreak); - QVERIFY(attrs[15].lineBreakType == HB_NoBreak); - QVERIFY(attrs[16].lineBreakType == HB_NoBreak); - QVERIFY(attrs[17].lineBreakType == HB_Break); - QVERIFY(attrs[18].lineBreakType == HB_NoBreak); - QVERIFY(attrs[19].lineBreakType == HB_NoBreak); - QVERIFY(attrs[20].lineBreakType == HB_Break); - QVERIFY(attrs[21].lineBreakType == HB_NoBreak); - QVERIFY(attrs[22].lineBreakType == HB_NoBreak); - QVERIFY(attrs[23].lineBreakType == HB_NoBreak); - QVERIFY(attrs[24].lineBreakType == HB_NoBreak); - QVERIFY(attrs[25].lineBreakType == HB_Break); - QVERIFY(attrs[26].lineBreakType == HB_NoBreak); - for (int i = 27; i < 32; ++i) - QVERIFY(attrs[i].lineBreakType == HB_NoBreak); -} - -QTEST_MAIN(tst_CharAttributes) -#include "main.moc" diff --git a/third_party/harfbuzz/tests/shaping/.gitignore b/third_party/harfbuzz/tests/shaping/.gitignore deleted file mode 100644 index 3f32cbeb9a..0000000000 --- a/third_party/harfbuzz/tests/shaping/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -harfbuzz-test-fonts-0.1.tar.bz2 -fonts diff --git a/third_party/harfbuzz/tests/shaping/Makefile.am b/third_party/harfbuzz/tests/shaping/Makefile.am deleted file mode 100644 index 31c6db73b4..0000000000 --- a/third_party/harfbuzz/tests/shaping/Makefile.am +++ /dev/null @@ -1,14 +0,0 @@ - -check_PROGRAMS = shaping - -shaping_SOURCES = main.cpp ../linebreaking/harfbuzz-qt.cpp -shaping_LDADD = $(QT_GUI_LIBS) $(QT_QTEST_LIBS) ../../src/libharfbuzz-1.la - -main.o: main.moc - -main.moc: $(srcdir)/main.cpp - $(QT_MOC) -o main.moc $(srcdir)/main.cpp - -INCLUDES = -I$(top_srcdir)/src $(FREETYPE_CFLAGS) $(QT_GUI_CFLAGS) $(QT_QTEST_CFLAGS) -AM_CPPFLAGS = -DQT_GUI_LIB -DSRCDIR=\"$(srcdir)\" - diff --git a/third_party/harfbuzz/tests/shaping/README b/third_party/harfbuzz/tests/shaping/README deleted file mode 100644 index 1db1c5a708..0000000000 --- a/third_party/harfbuzz/tests/shaping/README +++ /dev/null @@ -1,9 +0,0 @@ -These shaper tests need some specific TrueType fonts. You can get a package of -them from - - http://people.freedesktop.org/~hausmann/harfbuzz-test-fonts-0.1.tar.bz2 - -In addition you may need two fonts (Mangal and Tunga) from Microsoft Windows -for some of the test cases. These fonts are not freely redistributable. - -The test program looks for them in a fonts/ subdirectory. diff --git a/third_party/harfbuzz/tests/shaping/main.cpp b/third_party/harfbuzz/tests/shaping/main.cpp deleted file mode 100644 index 1a3ef4f705..0000000000 --- a/third_party/harfbuzz/tests/shaping/main.cpp +++ /dev/null @@ -1,1035 +0,0 @@ -/* - * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) - * - * This is part of HarfBuzz, an OpenType Layout engine library. - * - * Permission is hereby granted, without written agreement and without - * license or royalty fees, to use, copy, modify, and distribute this - * software and its documentation for any purpose, provided that the - * above copyright notice and the following two paragraphs appear in - * all copies of this software. - * - * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR - * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES - * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN - * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE. - * - * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, - * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS - * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO - * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. - */ - -#include - -#include -#include FT_FREETYPE_H -#include FT_TRUETYPE_TABLES_H - -#include -#include -#include - -static FT_Library freetype; - -static FT_Face loadFace(const char *name) -{ - FT_Face face; - char path[256]; - - strcpy(path, SRCDIR); - strcat(path, "/fonts/"); - strcat(path, name); - - if (FT_New_Face(freetype, path, /*index*/0, &face)) - return 0; - return face; -} - -static HB_UChar32 getChar(const HB_UChar16 *string, hb_uint32 length, hb_uint32 &i) -{ - HB_UChar32 ch; - if (HB_IsHighSurrogate(string[i]) - && i < length - 1 - && HB_IsLowSurrogate(string[i + 1])) { - ch = HB_SurrogateToUcs4(string[i], string[i + 1]); - ++i; - } else { - ch = string[i]; - } - return ch; -} - -static HB_Bool hb_stringToGlyphs(HB_Font font, const HB_UChar16 *string, hb_uint32 length, HB_Glyph *glyphs, hb_uint32 *numGlyphs, HB_Bool /*rightToLeft*/) -{ - FT_Face face = (FT_Face)font->userData; - if (length > *numGlyphs) - return false; - - int glyph_pos = 0; - for (hb_uint32 i = 0; i < length; ++i) { - glyphs[glyph_pos] = FT_Get_Char_Index(face, getChar(string, length, i)); - ++glyph_pos; - } - - *numGlyphs = glyph_pos; - - return true; -} - -static void hb_getAdvances(HB_Font /*font*/, const HB_Glyph * /*glyphs*/, hb_uint32 numGlyphs, HB_Fixed *advances, int /*flags*/) -{ - for (hb_uint32 i = 0; i < numGlyphs; ++i) - advances[i] = 0; // ### not tested right now -} - -static HB_Bool hb_canRender(HB_Font font, const HB_UChar16 *string, hb_uint32 length) -{ - FT_Face face = (FT_Face)font->userData; - - for (hb_uint32 i = 0; i < length; ++i) - if (!FT_Get_Char_Index(face, getChar(string, length, i))) - return false; - - return true; -} - -static HB_Error hb_getSFntTable(void *font, HB_Tag tableTag, HB_Byte *buffer, HB_UInt *length) -{ - FT_Face face = (FT_Face)font; - FT_ULong ftlen = *length; - FT_Error error = 0; - - if (!FT_IS_SFNT(face)) - return HB_Err_Invalid_Argument; - - error = FT_Load_Sfnt_Table(face, tableTag, 0, buffer, &ftlen); - *length = ftlen; - return (HB_Error)error; -} - -HB_Error hb_getPointInOutline(HB_Font font, HB_Glyph glyph, int flags, hb_uint32 point, HB_Fixed *xpos, HB_Fixed *ypos, hb_uint32 *nPoints) -{ - HB_Error error = HB_Err_Ok; - FT_Face face = (FT_Face)font->userData; - - int load_flags = (flags & HB_ShaperFlag_UseDesignMetrics) ? FT_LOAD_NO_HINTING : FT_LOAD_DEFAULT; - - if ((error = (HB_Error)FT_Load_Glyph(face, glyph, load_flags))) - return error; - - if (face->glyph->format != ft_glyph_format_outline) - return (HB_Error)HB_Err_Invalid_SubTable; - - *nPoints = face->glyph->outline.n_points; - if (!(*nPoints)) - return HB_Err_Ok; - - if (point > *nPoints) - return (HB_Error)HB_Err_Invalid_SubTable; - - *xpos = face->glyph->outline.points[point].x; - *ypos = face->glyph->outline.points[point].y; - - return HB_Err_Ok; -} - -void hb_getGlyphMetrics(HB_Font font, HB_Glyph glyph, HB_GlyphMetrics *metrics) -{ - // ### - metrics->x = metrics->y = metrics->width = metrics->height = metrics->xOffset = metrics->yOffset = 0; -} - -HB_Fixed hb_getFontMetric(HB_Font font, HB_FontMetric metric) -{ - return 0; // #### -} - -const HB_FontClass hb_fontClass = { - hb_stringToGlyphs, hb_getAdvances, hb_canRender, - hb_getPointInOutline, hb_getGlyphMetrics, hb_getFontMetric -}; - - -//TESTED_CLASS= -//TESTED_FILES= gui/text/qscriptengine.cpp - -class tst_QScriptEngine : public QObject -{ -Q_OBJECT - -public: - tst_QScriptEngine(); - virtual ~tst_QScriptEngine(); - - -public slots: - void initTestCase(); - void cleanupTestCase(); -private slots: - void devanagari(); - void bengali(); - void gurmukhi(); - // gujarati missing - void oriya(); - void tamil(); - void telugu(); - void kannada(); - void malayalam(); - // sinhala missing - - void khmer(); - void linearB(); -}; - -tst_QScriptEngine::tst_QScriptEngine() -{ -} - -tst_QScriptEngine::~tst_QScriptEngine() -{ -} - -void tst_QScriptEngine::initTestCase() -{ - FT_Init_FreeType(&freetype); -} - -void tst_QScriptEngine::cleanupTestCase() -{ - FT_Done_FreeType(freetype); -} - -struct ShapeTable { - unsigned short unicode[16]; - unsigned short glyphs[16]; -}; - -static bool shaping(FT_Face face, const ShapeTable *s, HB_Script script) -{ - QString str = QString::fromUtf16( s->unicode ); - - HB_Face hbFace = HB_NewFace(face, hb_getSFntTable); - - HB_FontRec hbFont; - hbFont.klass = &hb_fontClass; - hbFont.userData = face; - hbFont.x_ppem = face->size->metrics.x_ppem; - hbFont.y_ppem = face->size->metrics.y_ppem; - hbFont.x_scale = face->size->metrics.x_scale; - hbFont.y_scale = face->size->metrics.y_scale; - - HB_ShaperItem shaper_item; - shaper_item.kerning_applied = false; - shaper_item.string = reinterpret_cast(str.constData()); - shaper_item.stringLength = str.length(); - shaper_item.item.script = script; - shaper_item.item.pos = 0; - shaper_item.item.length = shaper_item.stringLength; - shaper_item.item.bidiLevel = 0; // ### - shaper_item.shaperFlags = 0; - shaper_item.font = &hbFont; - shaper_item.face = hbFace; - shaper_item.num_glyphs = shaper_item.item.length; - shaper_item.glyphIndicesPresent = false; - shaper_item.initialGlyphCount = 0; - - QVarLengthArray hb_glyphs(shaper_item.num_glyphs); - QVarLengthArray hb_attributes(shaper_item.num_glyphs); - QVarLengthArray hb_advances(shaper_item.num_glyphs); - QVarLengthArray hb_offsets(shaper_item.num_glyphs); - QVarLengthArray hb_logClusters(shaper_item.num_glyphs); - - while (1) { - hb_glyphs.resize(shaper_item.num_glyphs); - hb_attributes.resize(shaper_item.num_glyphs); - hb_advances.resize(shaper_item.num_glyphs); - hb_offsets.resize(shaper_item.num_glyphs); - hb_logClusters.resize(shaper_item.num_glyphs); - - memset(hb_glyphs.data(), 0, hb_glyphs.size() * sizeof(HB_Glyph)); - memset(hb_attributes.data(), 0, hb_attributes.size() * sizeof(HB_GlyphAttributes)); - memset(hb_advances.data(), 0, hb_advances.size() * sizeof(HB_Fixed)); - memset(hb_offsets.data(), 0, hb_offsets.size() * sizeof(HB_FixedPoint)); - - shaper_item.glyphs = hb_glyphs.data(); - shaper_item.attributes = hb_attributes.data(); - shaper_item.advances = hb_advances.data(); - shaper_item.offsets = hb_offsets.data(); - shaper_item.log_clusters = hb_logClusters.data(); - - if (HB_ShapeItem(&shaper_item)) - break; - - } - - HB_FreeFace(hbFace); - - hb_uint32 nglyphs = 0; - const unsigned short *g = s->glyphs; - while ( *g ) { - nglyphs++; - g++; - } - - if( nglyphs != shaper_item.num_glyphs ) - goto error; - - for (hb_uint32 i = 0; i < nglyphs; ++i) { - if ((shaper_item.glyphs[i]&0xffffff) != s->glyphs[i]) - goto error; - } - return true; - error: - str = ""; - const unsigned short *uc = s->unicode; - while (*uc) { - str += QString("%1 ").arg(*uc, 4, 16); - ++uc; - } - qDebug("%s: shaping of string %s failed, nglyphs=%d, expected %d", - face->family_name, - str.toLatin1().constData(), - shaper_item.num_glyphs, nglyphs); - - str = ""; - hb_uint32 i = 0; - while (i < shaper_item.num_glyphs) { - str += QString("%1 ").arg(shaper_item.glyphs[i], 4, 16); - ++i; - } - qDebug(" glyph result = %s", str.toLatin1().constData()); - return false; -} - -void tst_QScriptEngine::devanagari() -{ - { - FT_Face face = loadFace("raghu.ttf"); - if (face) { - const ShapeTable shape_table [] = { - // Ka - { { 0x0915, 0x0 }, - { 0x0080, 0x0 } }, - // Ka Halant - { { 0x0915, 0x094d, 0x0 }, - { 0x0080, 0x0051, 0x0 } }, - // Ka Halant Ka - { { 0x0915, 0x094d, 0x0915, 0x0 }, - { 0x00c8, 0x0080, 0x0 } }, - // Ka MatraI - { { 0x0915, 0x093f, 0x0 }, - { 0x01d1, 0x0080, 0x0 } }, - // Ra Halant Ka - { { 0x0930, 0x094d, 0x0915, 0x0 }, - { 0x0080, 0x005b, 0x0 } }, - // Ra Halant Ka MatraI - { { 0x0930, 0x094d, 0x0915, 0x093f, 0x0 }, - { 0x01d1, 0x0080, 0x005b, 0x0 } }, - // MatraI - { { 0x093f, 0x0 }, - { 0x01d4, 0x029c, 0x0 } }, - // Ka Nukta - { { 0x0915, 0x093c, 0x0 }, - { 0x00a4, 0x0 } }, - // Ka Halant Ra - { { 0x0915, 0x094d, 0x0930, 0x0 }, - { 0x0110, 0x0 } }, - // Ka Halant Ra Halant Ka - { { 0x0915, 0x094d, 0x0930, 0x094d, 0x0915, 0x0 }, - { 0x0158, 0x0080, 0x0 } }, - { { 0x0930, 0x094d, 0x200d, 0x0 }, - { 0x00e2, 0x0 } }, - { { 0x0915, 0x094d, 0x0930, 0x094d, 0x200d, 0x0 }, - { 0x0158, 0x0 } }, - - { {0}, {0} } - }; - - - const ShapeTable *s = shape_table; - while (s->unicode[0]) { - QVERIFY( shaping(face, s, HB_Script_Devanagari) ); - ++s; - } - - FT_Done_Face(face); - } else { - QSKIP("couln't find raghu.ttf", SkipAll); - } - } - - { - FT_Face face = loadFace("mangal.ttf"); - if (face) { - const ShapeTable shape_table [] = { - // Ka - { { 0x0915, 0x0 }, - { 0x0080, 0x0 } }, - // Ka Halant - { { 0x0915, 0x094d, 0x0 }, - { 0x0080, 0x0051, 0x0 } }, - // Ka Halant Ka - { { 0x0915, 0x094d, 0x0915, 0x0 }, - { 0x00c8, 0x0080, 0x0 } }, - // Ka MatraI - { { 0x0915, 0x093f, 0x0 }, - { 0x01d1, 0x0080, 0x0 } }, - // Ra Halant Ka - { { 0x0930, 0x094d, 0x0915, 0x0 }, - { 0x0080, 0x005b, 0x0 } }, - // Ra Halant Ka MatraI - { { 0x0930, 0x094d, 0x0915, 0x093f, 0x0 }, - { 0x01d1, 0x0080, 0x005b, 0x0 } }, - // MatraI - { { 0x093f, 0x0 }, - { 0x01d4, 0x029c, 0x0 } }, - // Ka Nukta - { { 0x0915, 0x093c, 0x0 }, - { 0x00a4, 0x0 } }, - // Ka Halant Ra - { { 0x0915, 0x094d, 0x0930, 0x0 }, - { 0x0110, 0x0 } }, - // Ka Halant Ra Halant Ka - { { 0x0915, 0x094d, 0x0930, 0x094d, 0x0915, 0x0 }, - { 0x0158, 0x0080, 0x0 } }, - - { { 0x92b, 0x94d, 0x930, 0x0 }, - { 0x125, 0x0 } }, - { { 0x92b, 0x93c, 0x94d, 0x930, 0x0 }, - { 0x149, 0x0 } }, - { {0}, {0} } - }; - - const ShapeTable *s = shape_table; - while (s->unicode[0]) { - QVERIFY( shaping(face, s, HB_Script_Devanagari) ); - ++s; - } - - FT_Done_Face(face); - } else { - QSKIP("couldn't find mangal.ttf", SkipAll); - } - } -} - -void tst_QScriptEngine::bengali() -{ - { - FT_Face face = loadFace("AkaashNormal.ttf"); - if (face) { - const ShapeTable shape_table [] = { - // Ka - { { 0x0995, 0x0 }, - { 0x0151, 0x0 } }, - // Ka Halant - { { 0x0995, 0x09cd, 0x0 }, - { 0x0151, 0x017d, 0x0 } }, - // Ka Halant Ka - { { 0x0995, 0x09cd, 0x0995, 0x0 }, - { 0x019b, 0x0 } }, - // Ka MatraI - { { 0x0995, 0x09bf, 0x0 }, - { 0x0173, 0x0151, 0x0 } }, - // Ra Halant Ka - { { 0x09b0, 0x09cd, 0x0995, 0x0 }, - { 0x0151, 0x0276, 0x0 } }, - // Ra Halant Ka MatraI - { { 0x09b0, 0x09cd, 0x0995, 0x09bf, 0x0 }, - { 0x0173, 0x0151, 0x0276, 0x0 } }, - // Ka Nukta - { { 0x0995, 0x09bc, 0x0 }, - { 0x0151, 0x0171, 0x0 } }, - // Ka Halant Ra - { { 0x0995, 0x09cd, 0x09b0, 0x0 }, - { 0x01f4, 0x0 } }, - // Ka Halant Ra Halant Ka - { { 0x0995, 0x09cd, 0x09b0, 0x09cd, 0x0995, 0x0 }, - { 0x025c, 0x0276, 0x0151, 0x0 } }, - // Ya + Halant - { { 0x09af, 0x09cd, 0x0 }, - { 0x016a, 0x017d, 0x0 } }, - // Da Halant Ya -> Da Ya-Phala - { { 0x09a6, 0x09cd, 0x09af, 0x0 }, - { 0x01e5, 0x0 } }, - // A Halant Ya -> A Ya-phala - { { 0x0985, 0x09cd, 0x09af, 0x0 }, - { 0x0145, 0x01cf, 0x0 } }, - // Na Halant Ka - { { 0x09a8, 0x09cd, 0x0995, 0x0 }, - { 0x026f, 0x0151, 0x0 } }, - // Na Halant ZWNJ Ka - { { 0x09a8, 0x09cd, 0x200c, 0x0995, 0x0 }, - { 0x0164, 0x017d, 0x0151, 0x0 } }, - // Na Halant ZWJ Ka - { { 0x09a8, 0x09cd, 0x200d, 0x0995, 0x0 }, - { 0x026f, 0x0151, 0x0 } }, - // Ka Halant ZWNJ Ka - { { 0x0995, 0x09cd, 0x200c, 0x0995, 0x0 }, - { 0x0151, 0x017d, 0x0151, 0x0 } }, - // Ka Halant ZWJ Ka - { { 0x0995, 0x09cd, 0x200d, 0x0995, 0x0 }, - { 0x025c, 0x0151, 0x0 } }, - // Na Halant Ra - { { 0x09a8, 0x09cd, 0x09b0, 0x0 }, - { 0x0207, 0x0 } }, - // Na Halant ZWNJ Ra - { { 0x09a8, 0x09cd, 0x200c, 0x09b0, 0x0 }, - { 0x0164, 0x017d, 0x016b, 0x0 } }, - // Na Halant ZWJ Ra - { { 0x09a8, 0x09cd, 0x200d, 0x09b0, 0x0 }, - { 0x026f, 0x016b, 0x0 } }, - // Na Halant Ba - { { 0x09a8, 0x09cd, 0x09ac, 0x0 }, - { 0x022f, 0x0 } }, - // Na Halant ZWNJ Ba - { { 0x09a8, 0x09cd, 0x200c, 0x09ac, 0x0 }, - { 0x0164, 0x017d, 0x0167, 0x0 } }, - // Na Halant ZWJ Ba - { { 0x09a8, 0x09cd, 0x200d, 0x09ac, 0x0 }, - { 0x026f, 0x0167, 0x0 } }, - // Na Halant Dha - { { 0x09a8, 0x09cd, 0x09a7, 0x0 }, - { 0x01d3, 0x0 } }, - // Na Halant ZWNJ Dha - { { 0x09a8, 0x09cd, 0x200c, 0x09a7, 0x0 }, - { 0x0164, 0x017d, 0x0163, 0x0 } }, - // Na Halant ZWJ Dha - { { 0x09a8, 0x09cd, 0x200d, 0x09a7, 0x0 }, - { 0x026f, 0x0163, 0x0 } }, - // Ra Halant Ka MatraAU - { { 0x09b0, 0x09cd, 0x0995, 0x09cc, 0x0 }, - { 0x0179, 0x0151, 0x0276, 0x017e, 0x0 } }, - // Ra Halant Ba Halant Ba - { { 0x09b0, 0x09cd, 0x09ac, 0x09cd, 0x09ac, 0x0 }, - { 0x0232, 0x0276, 0x0 } }, - { { 0x9b0, 0x9cd, 0x995, 0x9be, 0x982, 0x0 }, - { 0x151, 0x276, 0x172, 0x143, 0x0 } }, - { { 0x9b0, 0x9cd, 0x995, 0x9be, 0x983, 0x0 }, - { 0x151, 0x276, 0x172, 0x144, 0x0 } }, - - { {0}, {0} } - }; - - - const ShapeTable *s = shape_table; - while (s->unicode[0]) { - QVERIFY( shaping(face, s, HB_Script_Bengali) ); - ++s; - } - - FT_Done_Face(face); - } else { - QSKIP("couln't find AkaashNormal.ttf", SkipAll); - } - } - { - FT_Face face = loadFace("MuktiNarrow.ttf"); - if (face) { - const ShapeTable shape_table [] = { - // Ka - { { 0x0995, 0x0 }, - { 0x0073, 0x0 } }, - // Ka Halant - { { 0x0995, 0x09cd, 0x0 }, - { 0x00b9, 0x0 } }, - // Ka Halant Ka - { { 0x0995, 0x09cd, 0x0995, 0x0 }, - { 0x0109, 0x0 } }, - // Ka MatraI - { { 0x0995, 0x09bf, 0x0 }, - { 0x0095, 0x0073, 0x0 } }, - // Ra Halant Ka - { { 0x09b0, 0x09cd, 0x0995, 0x0 }, - { 0x0073, 0x00e1, 0x0 } }, - // Ra Halant Ka MatraI - { { 0x09b0, 0x09cd, 0x0995, 0x09bf, 0x0 }, - { 0x0095, 0x0073, 0x00e1, 0x0 } }, - // MatraI - { { 0x09bf, 0x0 }, - { 0x0095, 0x01c8, 0x0 } }, - // Ka Nukta - { { 0x0995, 0x09bc, 0x0 }, - { 0x0073, 0x0093, 0x0 } }, - // Ka Halant Ra - { { 0x0995, 0x09cd, 0x09b0, 0x0 }, - { 0x00e5, 0x0 } }, - // Ka Halant Ra Halant Ka - { { 0x995, 0x9cd, 0x9b0, 0x9cd, 0x995, 0x0 }, - { 0x234, 0x24e, 0x73, 0x0 } }, - // Ya + Halant - { { 0x09af, 0x09cd, 0x0 }, - { 0x00d2, 0x0 } }, - // Da Halant Ya -> Da Ya-Phala - { { 0x09a6, 0x09cd, 0x09af, 0x0 }, - { 0x0084, 0x00e2, 0x0 } }, - // A Halant Ya -> A Ya-phala - { { 0x0985, 0x09cd, 0x09af, 0x0 }, - { 0x0067, 0x00e2, 0x0 } }, - // Na Halant Ka - { { 0x09a8, 0x09cd, 0x0995, 0x0 }, - { 0x0188, 0x0 } }, - // Na Halant ZWNJ Ka - { { 0x9a8, 0x9cd, 0x200c, 0x995, 0x0 }, - { 0xcc, 0x73, 0x0 } }, - // Na Halant ZWJ Ka - { { 0x9a8, 0x9cd, 0x200d, 0x995, 0x0 }, - { 0x247, 0x73, 0x0 } }, - // Ka Halant ZWNJ Ka - { { 0x9a8, 0x9cd, 0x200d, 0x995, 0x0 }, - { 0x247, 0x73, 0x0 } }, - // Ka Halant ZWJ Ka - { { 0x9a8, 0x9cd, 0x200d, 0x995, 0x0 }, - { 0x247, 0x73, 0x0 } }, - // Na Halant Ra - { { 0x09a8, 0x09cd, 0x09b0, 0x0 }, - { 0x00f8, 0x0 } }, - // Na Halant ZWNJ Ra - { { 0x09a8, 0x09cd, 0x200c, 0x09b0, 0x0 }, - { 0xcc, 0x8d, 0x0 } }, - // Na Halant ZWJ Ra - { { 0x9a8, 0x9cd, 0x200d, 0x9b0, 0x0 }, - { 0x247, 0x8d, 0x0 } }, - // Na Halant Ba - { { 0x09a8, 0x09cd, 0x09ac, 0x0 }, - { 0x0139, 0x0 } }, - // Na Halant ZWNJ Ba - { { 0x9a8, 0x9cd, 0x200c, 0x9ac, 0x0 }, - { 0xcc, 0x89, 0x0 } }, - // Na Halant ZWJ Ba - { { 0x9a8, 0x9cd, 0x200d, 0x9ac, 0x0 }, - { 0x247, 0x89, 0x0 } }, - // Na Halant Dha - { { 0x09a8, 0x09cd, 0x09a7, 0x0 }, - { 0x0145, 0x0 } }, - // Na Halant ZWNJ Dha - { { 0x09a8, 0x09cd, 0x200c, 0x09a7, 0x0 }, - { 0xcc, 0x85, 0x0 } }, - // Na Halant ZWJ Dha - { { 0x09a8, 0x09cd, 0x200d, 0x09a7, 0x0 }, - { 0x247, 0x85, 0x0 } }, - // Ra Halant Ka MatraAU - { { 0x9b0, 0x9cd, 0x995, 0x9cc, 0x0 }, - { 0x232, 0x73, 0xe1, 0xa0, 0x0 } }, - // Ra Halant Ba Halant Ba - { { 0x09b0, 0x09cd, 0x09ac, 0x09cd, 0x09ac, 0x0 }, - { 0x013b, 0x00e1, 0x0 } }, - - { {0}, {0} } - }; - - - const ShapeTable *s = shape_table; - while (s->unicode[0]) { - QVERIFY( shaping(face, s, HB_Script_Bengali) ); - ++s; - } - - FT_Done_Face(face); - } else { - QSKIP("couln't find MuktiNarrow.ttf", SkipAll); - } - } - { - FT_Face face = loadFace("LikhanNormal.ttf"); - if (face) { - const ShapeTable shape_table [] = { - { { 0x09a8, 0x09cd, 0x09af, 0x0 }, - { 0x0192, 0x0 } }, - { { 0x09b8, 0x09cd, 0x09af, 0x0 }, - { 0x01d6, 0x0 } }, - { { 0x09b6, 0x09cd, 0x09af, 0x0 }, - { 0x01bc, 0x0 } }, - { { 0x09b7, 0x09cd, 0x09af, 0x0 }, - { 0x01c6, 0x0 } }, - { { 0x09b0, 0x09cd, 0x09a8, 0x09cd, 0x200d, 0x0 }, - { 0xd3, 0x12f, 0x0 } }, - - { {0}, {0} } - }; - - - const ShapeTable *s = shape_table; - while (s->unicode[0]) { - QVERIFY( shaping(face, s, HB_Script_Bengali) ); - ++s; - } - - FT_Done_Face(face); - } else { - QSKIP("couln't find LikhanNormal.ttf", SkipAll); - } - } -} - -void tst_QScriptEngine::gurmukhi() -{ - { - FT_Face face = loadFace("lohit.punjabi.1.1.ttf"); - if (face) { - const ShapeTable shape_table [] = { - { { 0xA15, 0xA4D, 0xa39, 0x0 }, - { 0x3b, 0x8b, 0x0 } }, - { {0}, {0} } - }; - - - const ShapeTable *s = shape_table; - while (s->unicode[0]) { - QVERIFY( shaping(face, s, HB_Script_Gurmukhi) ); - ++s; - } - - FT_Done_Face(face); - } else { - QSKIP("couln't find lohit.punjabi.1.1.ttf", SkipAll); - } - } -} - -void tst_QScriptEngine::oriya() -{ - { - FT_Face face = loadFace("utkalm.ttf"); - if (face) { - const ShapeTable shape_table [] = { - { { 0xb15, 0xb4d, 0xb24, 0xb4d, 0xb30, 0x0 }, - { 0x150, 0x125, 0x0 } }, - { { 0xb24, 0xb4d, 0xb24, 0xb4d, 0xb2c, 0x0 }, - { 0x151, 0x120, 0x0 } }, - { { 0xb28, 0xb4d, 0xb24, 0xb4d, 0xb2c, 0x0 }, - { 0x152, 0x120, 0x0 } }, - { { 0xb28, 0xb4d, 0xb24, 0xb4d, 0xb2c, 0x0 }, - { 0x152, 0x120, 0x0 } }, - { { 0xb28, 0xb4d, 0xb24, 0xb4d, 0xb30, 0x0 }, - { 0x176, 0x0 } }, - { { 0xb38, 0xb4d, 0xb24, 0xb4d, 0xb30, 0x0 }, - { 0x177, 0x0 } }, - { { 0xb28, 0xb4d, 0xb24, 0xb4d, 0xb30, 0xb4d, 0xb2f, 0x0 }, - { 0x176, 0x124, 0x0 } }, - { {0}, {0} } - - }; - - const ShapeTable *s = shape_table; - while (s->unicode[0]) { - QVERIFY( shaping(face, s, HB_Script_Oriya) ); - ++s; - } - - FT_Done_Face(face); - } else { - QSKIP("couln't find utkalm.ttf", SkipAll); - } - } -} - - -void tst_QScriptEngine::tamil() -{ - { - FT_Face face = loadFace("akruti1.ttf"); - if (face) { - const ShapeTable shape_table [] = { - { { 0x0b95, 0x0bc2, 0x0 }, - { 0x004e, 0x0 } }, - { { 0x0bae, 0x0bc2, 0x0 }, - { 0x009e, 0x0 } }, - { { 0x0b9a, 0x0bc2, 0x0 }, - { 0x0058, 0x0 } }, - { { 0x0b99, 0x0bc2, 0x0 }, - { 0x0053, 0x0 } }, - { { 0x0bb0, 0x0bc2, 0x0 }, - { 0x00a8, 0x0 } }, - { { 0x0ba4, 0x0bc2, 0x0 }, - { 0x008e, 0x0 } }, - { { 0x0b9f, 0x0bc2, 0x0 }, - { 0x0062, 0x0 } }, - { { 0x0b95, 0x0bc6, 0x0 }, - { 0x000a, 0x0031, 0x0 } }, - { { 0x0b95, 0x0bca, 0x0 }, - { 0x000a, 0x0031, 0x0007, 0x0 } }, - { { 0x0b95, 0x0bc6, 0x0bbe, 0x0 }, - { 0x000a, 0x0031, 0x007, 0x0 } }, - { { 0x0b95, 0x0bcd, 0x0bb7, 0x0 }, - { 0x0049, 0x0 } }, - { { 0x0b95, 0x0bcd, 0x0bb7, 0x0bca, 0x0 }, - { 0x000a, 0x0049, 0x007, 0x0 } }, - { { 0x0b95, 0x0bcd, 0x0bb7, 0x0bc6, 0x0bbe, 0x0 }, - { 0x000a, 0x0049, 0x007, 0x0 } }, - { { 0x0b9f, 0x0bbf, 0x0 }, - { 0x005f, 0x0 } }, - { { 0x0b9f, 0x0bc0, 0x0 }, - { 0x0060, 0x0 } }, - { { 0x0bb2, 0x0bc0, 0x0 }, - { 0x00ab, 0x0 } }, - { { 0x0bb2, 0x0bbf, 0x0 }, - { 0x00aa, 0x0 } }, - { { 0x0bb0, 0x0bcd, 0x0 }, - { 0x00a4, 0x0 } }, - { { 0x0bb0, 0x0bbf, 0x0 }, - { 0x00a5, 0x0 } }, - { { 0x0bb0, 0x0bc0, 0x0 }, - { 0x00a6, 0x0 } }, - { { 0x0b83, 0x0 }, - { 0x0025, 0x0 } }, - { { 0x0b83, 0x0b95, 0x0 }, - { 0x0025, 0x0031, 0x0 } }, - - { {0}, {0} } - }; - - - const ShapeTable *s = shape_table; - while (s->unicode[0]) { - QVERIFY( shaping(face, s, HB_Script_Tamil) ); - ++s; - } - - FT_Done_Face(face); - } else { - QSKIP("couln't find akruti1.ttf", SkipAll); - } - } -} - - -void tst_QScriptEngine::telugu() -{ - { - FT_Face face = loadFace("Pothana2000.ttf"); - if (face) { - const ShapeTable shape_table [] = { - { { 0xc15, 0xc4d, 0x0 }, - { 0xbb, 0x0 } }, - { { 0xc15, 0xc4d, 0xc37, 0x0 }, - { 0x4b, 0x0 } }, - { { 0xc15, 0xc4d, 0xc37, 0xc4d, 0x0 }, - { 0xe0, 0x0 } }, - { { 0xc15, 0xc4d, 0xc37, 0xc4d, 0xc23, 0x0 }, - { 0x4b, 0x91, 0x0 } }, - { { 0xc15, 0xc4d, 0xc30, 0x0 }, - { 0x5a, 0xb2, 0x0 } }, - { { 0xc15, 0xc4d, 0xc30, 0xc4d, 0x0 }, - { 0xbb, 0xb2, 0x0 } }, - { { 0xc15, 0xc4d, 0xc30, 0xc4d, 0xc15, 0x0 }, - { 0x5a, 0xb2, 0x83, 0x0 } }, - { { 0xc15, 0xc4d, 0xc30, 0xc3f, 0x0 }, - { 0xe2, 0xb2, 0x0 } }, - { { 0xc15, 0xc4d, 0xc15, 0xc48, 0x0 }, - { 0xe6, 0xb3, 0x83, 0x0 } }, - { { 0xc15, 0xc4d, 0xc30, 0xc48, 0x0 }, - { 0xe6, 0xb3, 0x9f, 0x0 } }, - { {0}, {0} } - - }; - - const ShapeTable *s = shape_table; - while (s->unicode[0]) { - QVERIFY( shaping(face, s, HB_Script_Telugu) ); - ++s; - } - - FT_Done_Face(face); - } else { - QSKIP("couln't find Pothana2000.ttf", SkipAll); - } - } -} - - -void tst_QScriptEngine::kannada() -{ - { - FT_Face face = loadFace("Sampige.ttf"); - if (face) { - const ShapeTable shape_table [] = { - { { 0x0ca8, 0x0ccd, 0x0ca8, 0x0 }, - { 0x0049, 0x00ba, 0x0 } }, - { { 0x0ca8, 0x0ccd, 0x0ca1, 0x0 }, - { 0x0049, 0x00b3, 0x0 } }, - { { 0x0caf, 0x0cc2, 0x0 }, - { 0x004f, 0x005d, 0x0 } }, - { { 0x0ce0, 0x0 }, - { 0x006a, 0x0 } }, - { { 0x0ce6, 0x0ce7, 0x0ce8, 0x0 }, - { 0x006b, 0x006c, 0x006d, 0x0 } }, - { { 0x0cb5, 0x0ccb, 0x0 }, - { 0x015f, 0x0067, 0x0 } }, - { { 0x0cb0, 0x0ccd, 0x0cae, 0x0 }, - { 0x004e, 0x0082, 0x0 } }, - { { 0x0cb0, 0x0ccd, 0x0c95, 0x0 }, - { 0x0036, 0x0082, 0x0 } }, - { { 0x0c95, 0x0ccd, 0x0cb0, 0x0 }, - { 0x0036, 0x00c1, 0x0 } }, - { { 0x0cb0, 0x0ccd, 0x200d, 0x0c95, 0x0 }, - { 0x0050, 0x00a7, 0x0 } }, - - { {0}, {0} } - }; - - - const ShapeTable *s = shape_table; - while (s->unicode[0]) { - QVERIFY( shaping(face, s, HB_Script_Kannada) ); - ++s; - } - - FT_Done_Face(face); - } else { - QSKIP("couln't find Sampige.ttf", SkipAll); - } - } - { - FT_Face face = loadFace("tunga.ttf"); - if (face) { - const ShapeTable shape_table [] = { - { { 0x0cb7, 0x0cc6, 0x0 }, - { 0x00b0, 0x006c, 0x0 } }, - { { 0x0cb7, 0x0ccd, 0x0 }, - { 0x0163, 0x0 } }, - - { {0}, {0} } - }; - - - const ShapeTable *s = shape_table; - while (s->unicode[0]) { - QVERIFY( shaping(face, s, HB_Script_Kannada) ); - ++s; - } - - FT_Done_Face(face); - } else { - QSKIP("couln't find tunga.ttf", SkipAll); - } - } -} - - - -void tst_QScriptEngine::malayalam() -{ - { - FT_Face face = loadFace("AkrutiMal2Normal.ttf"); - if (face) { - const ShapeTable shape_table [] = { - { { 0x0d15, 0x0d46, 0x0 }, - { 0x005e, 0x0034, 0x0 } }, - { { 0x0d15, 0x0d47, 0x0 }, - { 0x005f, 0x0034, 0x0 } }, - { { 0x0d15, 0x0d4b, 0x0 }, - { 0x005f, 0x0034, 0x0058, 0x0 } }, - { { 0x0d15, 0x0d48, 0x0 }, - { 0x0060, 0x0034, 0x0 } }, - { { 0x0d15, 0x0d4a, 0x0 }, - { 0x005e, 0x0034, 0x0058, 0x0 } }, - { { 0x0d30, 0x0d4d, 0x0d15, 0x0 }, - { 0x009e, 0x0034, 0x0 } }, - { { 0x0d15, 0x0d4d, 0x0d35, 0x0 }, - { 0x0034, 0x007a, 0x0 } }, - { { 0x0d15, 0x0d4d, 0x0d2f, 0x0 }, - { 0x0034, 0x00a2, 0x0 } }, - { { 0x0d1f, 0x0d4d, 0x0d1f, 0x0 }, - { 0x0069, 0x0 } }, - { { 0x0d26, 0x0d4d, 0x0d26, 0x0 }, - { 0x0074, 0x0 } }, - { { 0x0d30, 0x0d4d, 0x0 }, - { 0x009e, 0x0 } }, - { { 0x0d30, 0x0d4d, 0x200c, 0x0 }, - { 0x009e, 0x0 } }, - { { 0x0d30, 0x0d4d, 0x200d, 0x0 }, - { 0x009e, 0x0 } }, - - - { {0}, {0} } - }; - - - const ShapeTable *s = shape_table; - while (s->unicode[0]) { - QVERIFY( shaping(face, s, HB_Script_Malayalam) ); - ++s; - } - - FT_Done_Face(face); - } else { - QSKIP("couln't find AkrutiMal2Normal.ttf", SkipAll); - } - } -} - - - -void tst_QScriptEngine::khmer() -{ - { - FT_Face face = loadFace("KhmerOS.ttf"); - if (face) { - const ShapeTable shape_table [] = { - { { 0x179a, 0x17cd, 0x0 }, - { 0x24c, 0x27f, 0x0 } }, - { { 0x179f, 0x17c5, 0x0 }, - { 0x273, 0x203, 0x0 } }, - { { 0x1790, 0x17d2, 0x1784, 0x17c3, 0x0 }, - { 0x275, 0x242, 0x182, 0x0 } }, - { { 0x179a, 0x0 }, - { 0x24c, 0x0 } }, - { { 0x1781, 0x17d2, 0x1798, 0x17c2, 0x0 }, - { 0x274, 0x233, 0x197, 0x0 } }, - { { 0x1798, 0x17b6, 0x0 }, - { 0x1cb, 0x0 } }, - { { 0x179a, 0x17b8, 0x0 }, - { 0x24c, 0x26a, 0x0 } }, - { { 0x1787, 0x17b6, 0x0 }, - { 0x1ba, 0x0 } }, - { { 0x1798, 0x17d2, 0x1796, 0x17bb, 0x0 }, - { 0x24a, 0x195, 0x26d, 0x0 } }, - { {0}, {0} } - }; - - - const ShapeTable *s = shape_table; - while (s->unicode[0]) { - QVERIFY( shaping(face, s, HB_Script_Khmer) ); - ++s; - } - - FT_Done_Face(face); - } else { - QSKIP("couln't find KhmerOS.ttf", SkipAll); - } - } -} - -void tst_QScriptEngine::linearB() -{ - { - FT_Face face = loadFace("PENUTURE.TTF"); - if (face) { - const ShapeTable shape_table [] = { - { { 0xd800, 0xdc01, 0xd800, 0xdc02, 0xd800, 0xdc03, 0 }, - { 0x5, 0x6, 0x7, 0 } }, - { {0}, {0} } - }; - - - const ShapeTable *s = shape_table; - while (s->unicode[0]) { - QVERIFY( shaping(face, s, HB_Script_Common) ); - ++s; - } - - FT_Done_Face(face); - } else { - QSKIP("couln't find PENUTURE.TTF", SkipAll); - } - } -} - - -QTEST_MAIN(tst_QScriptEngine) -#include "main.moc" -- cgit v1.2.3