diff options
author | Akira Kakuto <kakuto@fuk.kindai.ac.jp> | 2017-10-13 22:53:19 +0000 |
---|---|---|
committer | Akira Kakuto <kakuto@fuk.kindai.ac.jp> | 2017-10-13 22:53:19 +0000 |
commit | 1031c01a2674825fe7037630e3f37f05fd1e739c (patch) | |
tree | ebfef9c9c109565c30c9b2bc8b601a703aafa487 /Build/source/libs/harfbuzz/harfbuzz-src/src | |
parent | eb1d91e185ce0b605a76da41e16cf0eb736edc06 (diff) |
harfbuzz-1.6.0
git-svn-id: svn://tug.org/texlive/trunk@45535 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Build/source/libs/harfbuzz/harfbuzz-src/src')
53 files changed, 2015 insertions, 1568 deletions
diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/Makefile.am b/Build/source/libs/harfbuzz/harfbuzz-src/src/Makefile.am index 0c077d99013..df99afee731 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/Makefile.am +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/Makefile.am @@ -122,7 +122,7 @@ endif libharfbuzz_la_SOURCES = $(HBSOURCES) $(HBHEADERS) $(HBNODISTHEADERS) libharfbuzz_la_CPPFLAGS = $(HBCFLAGS) -libharfbuzz_la_LDFLAGS = $(AM_LDFLAGS) -version-info $(HB_LIBTOOL_VERSION_INFO) $(export_symbols) -no-undefined +libharfbuzz_la_LDFLAGS = $(AM_LDFLAGS) -lm -version-info $(HB_LIBTOOL_VERSION_INFO) $(export_symbols) -no-undefined libharfbuzz_la_LIBADD = $(HBLIBS) EXTRA_libharfbuzz_la_DEPENDENCIES = $(harfbuzz_def_dependency) pkginclude_HEADERS = $(HBHEADERS) @@ -300,6 +300,7 @@ check: harfbuzz.def # For check-defs.sh dist_check_SCRIPTS = \ check-c-linkage-decls.sh \ check-defs.sh \ + check-externs.sh \ check-header-guards.sh \ check-includes.sh \ check-libstdc++.sh \ diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/check-externs.sh b/Build/source/libs/harfbuzz/harfbuzz-src/src/check-externs.sh new file mode 100755 index 00000000000..63cc7d5bb02 --- /dev/null +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/check-externs.sh @@ -0,0 +1,21 @@ +#!/bin/sh + +LC_ALL=C +export LC_ALL + +test -z "$srcdir" && srcdir=. +stat=0 + +test "x$HBHEADERS" = x && HBHEADERS=`cd "$srcdir"; find . -maxdepth 1 -name 'hb*.h'` +test "x$EGREP" = x && EGREP='grep -E' + + +echo 'Checking that all public symbols are exported with HB_EXTERN' + +for x in $HBHEADERS; do + test -f "$srcdir/$x" && x="$srcdir/$x" + $EGREP -B1 '^hb_' "$x" | $EGREP -E -v '^(--|hb_|HB_EXTERN )' -A1 +done | +grep . >&2 && stat=1 + +exit $stat diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/gen-use-table.py b/Build/source/libs/harfbuzz/harfbuzz-src/src/gen-use-table.py index fcb66a58022..09cc64fa694 100755 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/gen-use-table.py +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/gen-use-table.py @@ -117,6 +117,7 @@ property_names = [ 'Top_And_Right', 'Top_And_Left', 'Top_And_Left_And_Right', + 'Bottom_And_Left', 'Bottom_And_Right', 'Top_And_Bottom_And_Right', 'Overstruck', @@ -153,7 +154,7 @@ def is_BASE(U, UISC, UGC): def is_BASE_IND(U, UISC, UGC): #SPEC-DRAFT return (UISC in [Consonant_Dead, Modifying_Letter] or UGC == Po) return (UISC in [Consonant_Dead, Modifying_Letter] or - (UGC == Po and not U in [0x104E, 0x2022]) or + (UGC == Po and not U in [0x104E, 0x2022, 0x11A3F, 0x11A45]) or False # SPEC-DRAFT-OUTDATED! U == 0x002D ) def is_BASE_NUM(U, UISC, UGC): @@ -177,6 +178,8 @@ def is_CONS_MOD(U, UISC, UGC): def is_CONS_SUB(U, UISC, UGC): #SPEC-DRAFT return UISC == Consonant_Subjoined return UISC == Consonant_Subjoined and UGC != Lo +def is_CONS_WITH_STACKER(U, UISC, UGC): + return UISC == Consonant_With_Stacker def is_HALANT(U, UISC, UGC): return UISC in [Virama, Invisible_Stacker] def is_HALANT_NUM(U, UISC, UGC): @@ -198,9 +201,7 @@ def is_OTHER(U, UISC, UGC): def is_Reserved(U, UISC, UGC): return UGC == 'Cn' def is_REPHA(U, UISC, UGC): - #return UISC == Consonant_Preceding_Repha - #SPEC-OUTDATED hack to categorize Consonant_With_Stacker and Consonant_Prefixed - return UISC in [Consonant_Preceding_Repha, Consonant_With_Stacker, Consonant_Prefixed] + return UISC in [Consonant_Preceding_Repha, Consonant_Prefixed] def is_SYM(U, UISC, UGC): if U == 0x25CC: return False #SPEC-DRAFT #SPEC-DRAFT return UGC in [So, Sc] or UISC == Symbol_Letter @@ -229,6 +230,7 @@ use_mapping = { 'M': is_CONS_MED, 'CM': is_CONS_MOD, 'SUB': is_CONS_SUB, + 'CS': is_CONS_WITH_STACKER, 'H': is_HALANT, 'HN': is_HALANT_NUM, 'ZWNJ': is_ZWNJ, @@ -252,7 +254,7 @@ use_positions = { }, 'M': { 'Abv': [Top], - 'Blw': [Bottom], + 'Blw': [Bottom, Bottom_And_Left], 'Pst': [Right], 'Pre': [Left], }, @@ -298,8 +300,10 @@ def map_to_use(data): # the nasalization marks, maybe only for U+1CE9..U+1CF1. if U == 0x1CED: UISC = Tone_Mark - evals = [(k, v(U,UISC,UGC)) for k,v in items] - values = [k for k,v in evals if v] + # TODO: https://github.com/behdad/harfbuzz/issues/525 + if U == 0x1A7F: UISC = Consonant_Final; UIPC = Bottom + + values = [k for k,v in items if v(U,UISC,UGC)] assert len(values) == 1, "%s %s %s %s" % (hex(U), UISC, UGC, values) USE = values[0] diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/harfbuzz.pc.in b/Build/source/libs/harfbuzz/harfbuzz-src/src/harfbuzz.pc.in index b3e124aa8c3..661251c2d41 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/harfbuzz.pc.in +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/harfbuzz.pc.in @@ -8,6 +8,6 @@ Description: HarfBuzz text shaping library Version: %VERSION% Libs: -L${libdir} -lharfbuzz -Libs.private: %libs_private% +Libs.private: -lm %libs_private% Requires.private: %requires_private% Cflags: -I${includedir}/harfbuzz diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-blob.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-blob.cc index fb48f03cabe..41e99da0dda 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-blob.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-blob.cc @@ -128,6 +128,12 @@ hb_blob_create (const char *data, return blob; } +static void +_hb_blob_destroy (void *data) +{ + hb_blob_destroy ((hb_blob_t *) data); +} + /** * hb_blob_create_sub_blob: * @parent: Parent blob. @@ -164,7 +170,7 @@ hb_blob_create_sub_blob (hb_blob_t *parent, MIN (length, parent->length - offset), HB_MEMORY_MODE_READONLY, hb_blob_reference (parent), - (hb_destroy_func_t) hb_blob_destroy); + _hb_blob_destroy); return blob; } diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer.h b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer.h index 1d633f7dcdd..42564bb19be 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer.h +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer.h @@ -504,7 +504,7 @@ typedef enum { /*< flags >*/ } hb_buffer_diff_flags_t; /* Compare the contents of two buffers, report types of differences. */ -hb_buffer_diff_flags_t +HB_EXTERN hb_buffer_diff_flags_t hb_buffer_diff (hb_buffer_t *buffer, hb_buffer_t *reference, hb_codepoint_t dottedcircle_glyph, diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-common.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-common.cc index 0483816d37b..8e8e5565331 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-common.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-common.cc @@ -32,6 +32,9 @@ #include "hb-object-private.hh" #include <locale.h> +#ifdef HAVE_XLOCALE_H +#include <xlocale.h> +#endif /* hb_options_t */ @@ -246,8 +249,8 @@ struct hb_language_item_t { static hb_language_item_t *langs; #ifdef HB_USE_ATEXIT -static -void free_langs (void) +static void +free_langs (void) { while (langs) { hb_language_item_t *next = langs->next; @@ -694,6 +697,48 @@ parse_uint32 (const char **pp, const char *end, uint32_t *pv) return true; } +#if defined (HAVE_NEWLOCALE) && defined (HAVE_STRTOD_L) +#define USE_XLOCALE 1 +#endif + +#ifdef USE_XLOCALE + +static locale_t C_locale; + +#ifdef HB_USE_ATEXIT +static void +free_C_locale (void) +{ + if (C_locale) + freelocale (C_locale); +} +#endif + +static locale_t +get_C_locale (void) +{ +retry: + locale_t C = (locale_t) hb_atomic_ptr_get (&C_locale); + + if (unlikely (!C)) + { + C = newlocale (LC_ALL_MASK, "C", NULL); + + if (!hb_atomic_ptr_cmpexch (&C_locale, NULL, C)) + { + freelocale (C_locale); + goto retry; + } + +#ifdef HB_USE_ATEXIT + atexit (free_C_locale); /* First person registers atexit() callback. */ +#endif + } + + return C; +} +#endif + static bool parse_float (const char **pp, const char *end, float *pv) { @@ -707,7 +752,11 @@ parse_float (const char **pp, const char *end, float *pv) float v; errno = 0; +#ifdef USE_XLOCALE + v = strtod_l (p, &pend, get_C_locale ()); +#else v = strtod (p, &pend); +#endif if (errno || p == pend) return false; diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-common.h b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-common.h index 634cb96a68d..614a63aa60b 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-common.h +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-common.h @@ -43,30 +43,16 @@ # endif /* !__cplusplus */ #endif -#if !defined (HB_DONT_DEFINE_STDINT) - #if defined (_SVR4) || defined (SVR4) || defined (__OpenBSD__) || \ defined (_sgi) || defined (__sun) || defined (sun) || \ defined (__digital__) || defined (__HP_cc) # include <inttypes.h> #elif defined (_AIX) # include <sys/inttypes.h> -/* VS 2010 (_MSC_VER 1600) has stdint.h */ -#elif defined (_MSC_VER) && _MSC_VER < 1600 -typedef __int8 int8_t; -typedef unsigned __int8 uint8_t; -typedef __int16 int16_t; -typedef unsigned __int16 uint16_t; -typedef __int32 int32_t; -typedef unsigned __int32 uint32_t; -typedef __int64 int64_t; -typedef unsigned __int64 uint64_t; #else # include <stdint.h> #endif -#endif - HB_BEGIN_DECLS @@ -321,6 +307,14 @@ typedef enum /*9.0*/ HB_SCRIPT_TANGUT = HB_TAG ('T','a','n','g'), /*9.0*/ HB_SCRIPT_NEWA = HB_TAG ('N','e','w','a'), + /* + * Since 1.6.0 + */ + /*10.0*/HB_SCRIPT_MASARAM_GONDI = HB_TAG ('G','o','n','m'), + /*10.0*/HB_SCRIPT_NUSHU = HB_TAG ('N','s','h','u'), + /*10.0*/HB_SCRIPT_SOYOMBO = HB_TAG ('S','o','y','o'), + /*10.0*/HB_SCRIPT_ZANABAZAR_SQUARE = HB_TAG ('Z','a','n','b'), + /* No script set. */ HB_SCRIPT_INVALID = HB_TAG_NONE, diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-coretext.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-coretext.cc index ba96d3994ee..22661407dea 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-coretext.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-coretext.cc @@ -30,12 +30,27 @@ #include "hb-shaper-impl-private.hh" #include "hb-coretext.h" +#include <math.h> #ifndef HB_DEBUG_CORETEXT #define HB_DEBUG_CORETEXT (HB_DEBUG+0) #endif +/* https://developer.apple.com/documentation/coretext/1508745-ctfontcreatewithgraphicsfont */ +#define HB_CORETEXT_DEFAULT_FONT_SIZE 12.f + +static CGFloat +coretext_font_size (float ptem) +{ + /* CoreText points are CSS pixels (96 per inch), + * NOT typographic points (72 per inch). + * + * https://developer.apple.com/library/content/documentation/GraphicsAnimation/Conceptual/HighResolutionOSX/Explained/Explained.html + */ + ptem *= 96.f / 72.f; + return ptem <= 0.f ? HB_CORETEXT_DEFAULT_FONT_SIZE : ptem; +} static void release_table_data (void *user_data) @@ -62,16 +77,22 @@ reference_table (hb_face_t *face HB_UNUSED, hb_tag_t tag, void *user_data) release_table_data); } +static void +_hb_cg_font_release (void *data) +{ + CGFontRelease ((CGFontRef) data); +} + hb_face_t * hb_coretext_face_create (CGFontRef cg_font) { - return hb_face_create_for_tables (reference_table, CGFontRetain (cg_font), (hb_destroy_func_t) CGFontRelease); + return hb_face_create_for_tables (reference_table, CGFontRetain (cg_font), _hb_cg_font_release); } - HB_SHAPER_DATA_ENSURE_DEFINE(coretext, face) -HB_SHAPER_DATA_ENSURE_DEFINE(coretext, font) - +HB_SHAPER_DATA_ENSURE_DEFINE_WITH_CONDITION(coretext, font, + fabs (CTFontGetSize((CTFontRef) data) - coretext_font_size (font->ptem)) <= .5 +) /* * shaper face data @@ -113,7 +134,7 @@ static CGFontRef create_cg_font (hb_face_t *face) { CGFontRef cg_font = NULL; - if (face->destroy == (hb_destroy_func_t) CGFontRelease) + if (face->destroy == _hb_cg_font_release) { cg_font = CGFontRetain ((CGFontRef) face->user_data); } @@ -140,7 +161,33 @@ create_cg_font (hb_face_t *face) static CTFontRef create_ct_font (CGFontRef cg_font, CGFloat font_size) { - CTFontRef ct_font = CTFontCreateWithGraphicsFont (cg_font, font_size, NULL, NULL); + CTFontRef ct_font = NULL; + + /* CoreText does not enable trak table usage / tracking when creating a CTFont + * using CTFontCreateWithGraphicsFont. The only way of enabling tracking seems + * to be through the CTFontCreateUIFontForLanguage call. */ + CFStringRef cg_postscript_name = CGFontCopyPostScriptName (cg_font); + if (CFStringHasPrefix (cg_postscript_name, CFSTR (".SFNSText")) || + CFStringHasPrefix (cg_postscript_name, CFSTR (".SFNSDisplay"))) + { + CTFontUIFontType font_type = kCTFontUIFontSystem; + if (CFStringHasSuffix (cg_postscript_name, CFSTR ("-Bold"))) + font_type = kCTFontUIFontEmphasizedSystem; + + ct_font = CTFontCreateUIFontForLanguage (font_type, font_size, NULL); + CFStringRef ct_result_name = CTFontCopyPostScriptName(ct_font); + if (CFStringCompare (ct_result_name, cg_postscript_name, 0) != kCFCompareEqualTo) + { + CFRelease(ct_font); + ct_font = NULL; + } + CFRelease (ct_result_name); + } + CFRelease (cg_postscript_name); + + if (!ct_font) + ct_font = CTFontCreateWithGraphicsFont (cg_font, font_size, NULL, NULL); + if (unlikely (!ct_font)) { DEBUG_MSG (CORETEXT, cg_font, "Font CTFontCreateWithGraphicsFont() failed"); return NULL; @@ -202,51 +249,24 @@ create_ct_font (CGFontRef cg_font, CGFloat font_size) return ct_font; } -struct hb_coretext_shaper_face_data_t { - CGFontRef cg_font; - CTFontRef ct_font; -}; - hb_coretext_shaper_face_data_t * _hb_coretext_shaper_face_data_create (hb_face_t *face) { - hb_coretext_shaper_face_data_t *data = (hb_coretext_shaper_face_data_t *) calloc (1, sizeof (hb_coretext_shaper_face_data_t)); - if (unlikely (!data)) - return NULL; + CGFontRef cg_font = create_cg_font (face); - data->cg_font = create_cg_font (face); - if (unlikely (!data->cg_font)) + if (unlikely (!cg_font)) { DEBUG_MSG (CORETEXT, face, "CGFont creation failed.."); - free (data); - return NULL; - } - - /* We use 36pt size instead of UPEM, because CoreText implements the 'trak' table, - * which can make the font too tight at large sizes. 36pt should be a good semi-neutral - * size. - * - * Since we always create CTFont at a fixed size, our CTFont lives in face_data - * instead of font_data. Which is good, because when people change scale on - * hb_font_t, we won't need to update our CTFont. */ - data->ct_font = create_ct_font (data->cg_font, 36.); - if (unlikely (!data->ct_font)) - { - DEBUG_MSG (CORETEXT, face, "CTFont creation failed."); - CFRelease (data->cg_font); - free (data); return NULL; } - return data; + return (hb_coretext_shaper_face_data_t *) cg_font; } void _hb_coretext_shaper_face_data_destroy (hb_coretext_shaper_face_data_t *data) { - CFRelease (data->ct_font); - CFRelease (data->cg_font); - free (data); + CFRelease ((CGFontRef) data); } /* @@ -256,8 +276,7 @@ CGFontRef hb_coretext_face_get_cg_font (hb_face_t *face) { if (unlikely (!hb_coretext_shaper_face_data_ensure (face))) return NULL; - hb_coretext_shaper_face_data_t *face_data = HB_SHAPER_DATA_GET (face); - return face_data->cg_font; + return (CGFontRef) HB_SHAPER_DATA_GET (face); } @@ -265,17 +284,28 @@ hb_coretext_face_get_cg_font (hb_face_t *face) * shaper font data */ -struct hb_coretext_shaper_font_data_t {}; - hb_coretext_shaper_font_data_t * -_hb_coretext_shaper_font_data_create (hb_font_t *font HB_UNUSED) +_hb_coretext_shaper_font_data_create (hb_font_t *font) { - return (hb_coretext_shaper_font_data_t *) HB_SHAPER_DATA_SUCCEEDED; + hb_face_t *face = font->face; + if (unlikely (!hb_coretext_shaper_face_data_ensure (face))) return NULL; + CGFontRef cg_font = (CGFontRef) HB_SHAPER_DATA_GET (face); + + CTFontRef ct_font = create_ct_font (cg_font, coretext_font_size (font->ptem)); + + if (unlikely (!ct_font)) + { + DEBUG_MSG (CORETEXT, font, "CGFont creation failed.."); + return NULL; + } + + return (hb_coretext_shaper_font_data_t *) ct_font; } void _hb_coretext_shaper_font_data_destroy (hb_coretext_shaper_font_data_t *data) { + CFRelease ((CTFontRef) data); } @@ -303,10 +333,8 @@ _hb_coretext_shaper_shape_plan_data_destroy (hb_coretext_shaper_shape_plan_data_ CTFontRef hb_coretext_font_get_ct_font (hb_font_t *font) { - hb_face_t *face = font->face; - if (unlikely (!hb_coretext_shaper_face_data_ensure (face))) return NULL; - hb_coretext_shaper_face_data_t *face_data = HB_SHAPER_DATA_GET (face); - return face_data->ct_font; + if (unlikely (!hb_coretext_shaper_font_data_ensure (font))) return NULL; + return (CTFontRef)HB_SHAPER_DATA_GET (font); } @@ -538,9 +566,10 @@ _hb_coretext_shape (hb_shape_plan_t *shape_plan, unsigned int num_features) { hb_face_t *face = font->face; - hb_coretext_shaper_face_data_t *face_data = HB_SHAPER_DATA_GET (face); + CGFontRef cg_font = (CGFontRef) HB_SHAPER_DATA_GET (face); + CTFontRef ct_font = (CTFontRef) HB_SHAPER_DATA_GET (font); - CGFloat ct_font_size = CTFontGetSize (face_data->ct_font); + CGFloat ct_font_size = CTFontGetSize (ct_font); CGFloat x_mult = (CGFloat) font->x_scale / ct_font_size; CGFloat y_mult = (CGFloat) font->y_scale / ct_font_size; @@ -675,7 +704,7 @@ _hb_coretext_shape (hb_shape_plan_t *shape_plan, CTFontDescriptorRef font_desc = CTFontDescriptorCreateWithAttributes (attributes); CFRelease (attributes); - range->font = CTFontCreateCopyWithAttributes (face_data->ct_font, 0.0, NULL, font_desc); + range->font = CTFontCreateCopyWithAttributes (ct_font, 0.0, NULL, font_desc); CFRelease (font_desc); } else @@ -829,7 +858,7 @@ resize_and_retry: CFRelease (lang); } CFAttributedStringSetAttribute (attr_string, CFRangeMake (0, chars_len), - kCTFontAttributeName, face_data->ct_font); + kCTFontAttributeName, ct_font); if (num_features && range_records.len) { @@ -947,7 +976,7 @@ resize_and_retry: */ CFDictionaryRef attributes = CTRunGetAttributes (run); CTFontRef run_ct_font = static_cast<CTFontRef>(CFDictionaryGetValue (attributes, kCTFontAttributeName)); - if (!CFEqual (run_ct_font, face_data->ct_font)) + if (!CFEqual (run_ct_font, ct_font)) { /* The run doesn't use our main font instance. We have to figure out * whether font fallback happened, or this is just CoreText giving us @@ -985,13 +1014,13 @@ resize_and_retry: CGFontRef run_cg_font = CTFontCopyGraphicsFont (run_ct_font, 0); if (run_cg_font) { - matched = CFEqual (run_cg_font, face_data->cg_font); + matched = CFEqual (run_cg_font, cg_font); CFRelease (run_cg_font); } } if (!matched) { - CFStringRef font_ps_name = CTFontCopyName (face_data->ct_font, kCTFontPostScriptNameKey); + CFStringRef font_ps_name = CTFontCopyName (ct_font, kCTFontPostScriptNameKey); CFStringRef run_ps_name = CTFontCopyName (run_ct_font, kCTFontPostScriptNameKey); CFComparisonResult result = CFStringCompare (run_ps_name, font_ps_name, 0); CFRelease (run_ps_name); @@ -1263,22 +1292,20 @@ struct hb_coretext_aat_shaper_face_data_t {}; hb_coretext_aat_shaper_face_data_t * _hb_coretext_aat_shaper_face_data_create (hb_face_t *face) { - hb_blob_t *mort_blob = face->reference_table (HB_CORETEXT_TAG_MORT); - /* Umm, we just reference the table to check whether it exists. - * Maybe add better API for this? */ - if (!hb_blob_get_length (mort_blob)) + static const hb_tag_t tags[] = {HB_CORETEXT_TAG_MORX, HB_CORETEXT_TAG_MORT, HB_CORETEXT_TAG_KERX}; + + for (unsigned int i = 0; i < ARRAY_LENGTH (tags); i++) { - hb_blob_destroy (mort_blob); - mort_blob = face->reference_table (HB_CORETEXT_TAG_MORX); - if (!hb_blob_get_length (mort_blob)) + hb_blob_t *blob = face->reference_table (tags[i]); + if (hb_blob_get_length (blob)) { - hb_blob_destroy (mort_blob); - return NULL; + hb_blob_destroy (blob); + return hb_coretext_shaper_face_data_ensure (face) ? (hb_coretext_aat_shaper_face_data_t *) HB_SHAPER_DATA_SUCCEEDED : NULL; } + hb_blob_destroy (blob); } - hb_blob_destroy (mort_blob); - return hb_coretext_shaper_face_data_ensure (face) ? (hb_coretext_aat_shaper_face_data_t *) HB_SHAPER_DATA_SUCCEEDED : NULL; + return NULL; } void diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-coretext.h b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-coretext.h index 82066e4e0dc..c9136ff4c30 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-coretext.h +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-coretext.h @@ -42,6 +42,7 @@ HB_BEGIN_DECLS #define HB_CORETEXT_TAG_MORT HB_TAG('m','o','r','t') #define HB_CORETEXT_TAG_MORX HB_TAG('m','o','r','x') +#define HB_CORETEXT_TAG_KERX HB_TAG('k','e','r','x') HB_EXTERN hb_face_t * diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-face-private.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-face-private.hh index 72f08a599ad..43e7b1cb3ff 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-face-private.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-face-private.hh @@ -54,13 +54,6 @@ struct hb_face_t { mutable unsigned int upem; /* Units-per-EM. */ mutable unsigned int num_glyphs; /* Number of glyphs. */ - enum dirty_t { - DIRTY_NOTHING = 0x0000, - DIRTY_INDEX = 0x0001, - DIRTY_UPEM = 0x0002, - DIRTY_NUM_GLYPHS = 0x0004, - } dirty; - struct hb_shaper_data_t shaper_data; /* Various shaper data. */ /* Various non-shaping data. */ @@ -106,8 +99,6 @@ struct hb_face_t { HB_INTERNAL void load_num_glyphs (void) const; }; -HB_MARK_AS_FLAG_T (hb_face_t::dirty_t); - extern HB_INTERNAL const hb_face_t _hb_face_nil; #define HB_SHAPER_DATA_CREATE_FUNC_EXTRA_ARGS diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-face.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-face.cc index 22998f00586..e96c8acd386 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-face.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-face.cc @@ -51,8 +51,6 @@ const hb_face_t _hb_face_nil = { 1000, /* upem */ 0, /* num_glyphs */ - hb_face_t::DIRTY_NOTHING, /* dirty */ - { #define HB_SHAPER_IMPLEMENT(shaper) HB_SHAPER_DATA_INVALID, #include "hb-shaper-list.hh" @@ -120,8 +118,10 @@ _hb_face_for_data_closure_create (hb_blob_t *blob, unsigned int index) } static void -_hb_face_for_data_closure_destroy (hb_face_for_data_closure_t *closure) +_hb_face_for_data_closure_destroy (void *data) { + hb_face_for_data_closure_t *closure = (hb_face_for_data_closure_t *) data; + hb_blob_destroy (closure->blob); free (closure); } @@ -171,7 +171,7 @@ hb_face_create (hb_blob_t *blob, face = hb_face_create_for_tables (_hb_face_for_data_reference_table, closure, - (hb_destroy_func_t) _hb_face_for_data_closure_destroy); + _hb_face_for_data_closure_destroy); face->index = index; @@ -367,11 +367,6 @@ hb_face_set_index (hb_face_t *face, if (face->immutable) return; - if (face->index == index) - return; - - face->dirty |= face->DIRTY_INDEX; - face->index = index; } @@ -407,11 +402,6 @@ hb_face_set_upem (hb_face_t *face, if (face->immutable) return; - if (face->upem == upem) - return; - - face->dirty |= face->DIRTY_UPEM; - face->upem = upem; } @@ -456,11 +446,6 @@ hb_face_set_glyph_count (hb_face_t *face, if (face->immutable) return; - if (face->num_glyphs == glyph_count) - return; - - face->dirty |= face->DIRTY_NUM_GLYPHS; - face->num_glyphs = glyph_count; } @@ -489,4 +474,33 @@ hb_face_t::load_num_glyphs (void) const hb_blob_destroy (maxp_blob); } +/** + * hb_face_get_table_tags: + * @face: a face. + * + * Retrieves table tags for a face, if possible. + * + * Return value: total number of tables, or 0 if not possible to list. + * + * Since: 1.6.0 + **/ +unsigned int +hb_face_get_table_tags (hb_face_t *face, + unsigned int start_offset, + unsigned int *table_count, /* IN/OUT */ + hb_tag_t *table_tags /* OUT */) +{ + if (face->destroy != _hb_face_for_data_closure_destroy) + { + if (table_count) + *table_count = 0; + return 0; + } + + hb_face_for_data_closure_t *data = (hb_face_for_data_closure_t *) face->user_data; + + const OT::OpenTypeFontFile &ot_file = *OT::Sanitizer<OT::OpenTypeFontFile>::lock_instance (data->blob); + const OT::OpenTypeFontFace &ot_face = ot_file.get_face (data->index); + return ot_face.get_table_tags (start_offset, table_count, table_tags); +} diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-face.h b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-face.h index 91237b70850..9842d52b650 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-face.h +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-face.h @@ -111,6 +111,11 @@ hb_face_set_glyph_count (hb_face_t *face, HB_EXTERN unsigned int hb_face_get_glyph_count (hb_face_t *face); +HB_EXTERN unsigned int +hb_face_get_table_tags (hb_face_t *face, + unsigned int start_offset, + unsigned int *table_count, /* IN/OUT */ + hb_tag_t *table_tags /* OUT */); HB_END_DECLS diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-font-private.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-font-private.hh index ed9f2c54adc..d2801fb86ec 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-font-private.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-font-private.hh @@ -108,6 +108,8 @@ struct hb_font_t { unsigned int x_ppem; unsigned int y_ppem; + float ptem; + /* Font variation coordinates. */ unsigned int num_coords; int *coords; @@ -116,16 +118,6 @@ struct hb_font_t { void *user_data; hb_destroy_func_t destroy; - enum dirty_t { - DIRTY_NOTHING = 0x0000, - DIRTY_FACE = 0x0001, - DIRTY_PARENT = 0x0002, - DIRTY_FUNCS = 0x0004, - DIRTY_SCALE = 0x0008, - DIRTY_PPEM = 0x0010, - DIRTY_VARIATIONS = 0x0020, - } dirty; - struct hb_shaper_data_t shaper_data; @@ -553,8 +545,6 @@ struct hb_font_t { } }; -HB_MARK_AS_FLAG_T (hb_font_t::dirty_t); - #define HB_SHAPER_DATA_CREATE_FUNC_EXTRA_ARGS #define HB_SHAPER_IMPLEMENT(shaper) HB_SHAPER_DATA_PROTOTYPE(shaper, font); #include "hb-shaper-list.hh" diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-font.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-font.cc index a684c234d0a..5673e66e3d0 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-font.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-font.cc @@ -1157,8 +1157,20 @@ hb_font_create_sub_font (hb_font_t *parent) font->y_scale = parent->y_scale; font->x_ppem = parent->x_ppem; font->y_ppem = parent->y_ppem; + font->ptem = parent->ptem; - /* TODO: copy variation coordinates. */ + font->num_coords = parent->num_coords; + if (!font->num_coords) + font->coords = NULL; + else + { + unsigned int size = parent->num_coords * sizeof (parent->coords[0]); + font->coords = (int *) malloc (size); + if (unlikely (!font->coords)) + font->num_coords = 0; + else + memcpy (font->coords, parent->coords, size); + } return font; } @@ -1188,6 +1200,7 @@ hb_font_get_empty (void) 0, /* x_ppem */ 0, /* y_ppem */ + 0, /* ptem */ 0, /* num_coords */ NULL, /* coords */ @@ -1196,8 +1209,6 @@ hb_font_get_empty (void) NULL, /* user_data */ NULL, /* destroy */ - hb_font_t::DIRTY_NOTHING, /* dirty */ - { #define HB_SHAPER_IMPLEMENT(shaper) HB_SHAPER_DATA_INVALID, #include "hb-shaper-list.hh" @@ -1350,11 +1361,6 @@ hb_font_set_parent (hb_font_t *font, if (!parent) parent = hb_font_get_empty (); - if (parent == font->parent) - return; - - font->dirty |= font->DIRTY_PARENT; - hb_font_t *old = font->parent; font->parent = hb_font_reference (parent); @@ -1397,11 +1403,6 @@ hb_font_set_face (hb_font_t *font, if (unlikely (!face)) face = hb_face_get_empty (); - if (font->face == face) - return; - - font->dirty |= font->DIRTY_FACE; - hb_face_t *old = font->face; font->face = hb_face_reference (face); @@ -1455,8 +1456,6 @@ hb_font_set_funcs (hb_font_t *font, if (!klass) klass = hb_font_funcs_get_empty (); - font->dirty |= font->DIRTY_FUNCS; - hb_font_funcs_reference (klass); hb_font_funcs_destroy (font->klass); font->klass = klass; @@ -1512,11 +1511,6 @@ hb_font_set_scale (hb_font_t *font, if (font->immutable) return; - if (font->x_scale == x_scale && font->y_scale == y_scale) - return; - - font->dirty |= font->DIRTY_SCALE; - font->x_scale = x_scale; font->y_scale = y_scale; } @@ -1558,11 +1552,6 @@ hb_font_set_ppem (hb_font_t *font, if (font->immutable) return; - if (font->x_ppem == x_ppem && font->y_ppem == y_ppem) - return; - - font->dirty |= font->DIRTY_PPEM; - font->x_ppem = x_ppem; font->y_ppem = y_ppem; } @@ -1586,6 +1575,40 @@ hb_font_get_ppem (hb_font_t *font, if (y_ppem) *y_ppem = font->y_ppem; } +/** + * hb_font_set_ptem: + * @font: a font. + * @ptem: + * + * Sets "point size" of the font. + * + * Since: 1.6.0 + **/ +void +hb_font_set_ptem (hb_font_t *font, float ptem) +{ + if (font->immutable) + return; + + font->ptem = ptem; +} + +/** + * hb_font_get_ptem: + * @font: a font. + * + * Gets the "point size" of the font. A value of 0 means unset. + * + * Return value: Point size. + * + * Since: 0.9.2 + **/ +float +hb_font_get_ptem (hb_font_t *font) +{ + return font->ptem; +} + /* * Variations */ @@ -1595,16 +1618,6 @@ _hb_font_adopt_var_coords_normalized (hb_font_t *font, int *coords, /* 2.14 normalized */ unsigned int coords_length) { - if (font->num_coords == coords_length && - (coords_length == 0 || - 0 == memcmp (font->coords, coords, coords_length * sizeof (coords[0])))) - { - free (coords); - return; - } - - font->dirty |= font->DIRTY_VARIATIONS; - free (font->coords); font->coords = coords; diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-font.h b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-font.h index 85fb56d5b6d..540cdcab953 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-font.h +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-font.h @@ -607,6 +607,16 @@ hb_font_get_ppem (hb_font_t *font, unsigned int *x_ppem, unsigned int *y_ppem); +/* + * Point size per EM. Used for optical-sizing in CoreText. + * A value of zero means "not set". + */ +HB_EXTERN void +hb_font_set_ptem (hb_font_t *font, float ptem); + +HB_EXTERN float +hb_font_get_ptem (hb_font_t *font); + HB_EXTERN void hb_font_set_variations (hb_font_t *font, const hb_variation_t *variations, diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ft.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ft.cc index 492992ee425..83af9942ec5 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ft.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ft.cc @@ -95,14 +95,16 @@ _hb_ft_font_create (FT_Face ft_face, bool symbol, bool unref) } static void -_hb_ft_face_destroy (FT_Face ft_face) +_hb_ft_face_destroy (void *data) { - FT_Done_Face (ft_face); + FT_Done_Face ((FT_Face) data); } static void -_hb_ft_font_destroy (hb_ft_font_t *ft_font) +_hb_ft_font_destroy (void *data) { + hb_ft_font_t *ft_font = (hb_ft_font_t *) data; + if (ft_font->unref) _hb_ft_face_destroy (ft_font->ft_face); @@ -124,7 +126,7 @@ hb_ft_font_set_load_flags (hb_font_t *font, int load_flags) if (font->immutable) return; - if (font->destroy != (hb_destroy_func_t) _hb_ft_font_destroy) + if (font->destroy != _hb_ft_font_destroy) return; hb_ft_font_t *ft_font = (hb_ft_font_t *) font->user_data; @@ -144,7 +146,7 @@ hb_ft_font_set_load_flags (hb_font_t *font, int load_flags) int hb_ft_font_get_load_flags (hb_font_t *font) { - if (font->destroy != (hb_destroy_func_t) _hb_ft_font_destroy) + if (font->destroy != _hb_ft_font_destroy) return 0; const hb_ft_font_t *ft_font = (const hb_ft_font_t *) font->user_data; @@ -155,7 +157,7 @@ hb_ft_font_get_load_flags (hb_font_t *font) FT_Face hb_ft_font_get_face (hb_font_t *font) { - if (font->destroy != (hb_destroy_func_t) _hb_ft_font_destroy) + if (font->destroy != _hb_ft_font_destroy) return NULL; const hb_ft_font_t *ft_font = (const hb_ft_font_t *) font->user_data; @@ -474,7 +476,7 @@ retry: hb_font_set_funcs (font, funcs, _hb_ft_font_create (ft_face, symbol, unref), - (hb_destroy_func_t) _hb_ft_font_destroy); + _hb_ft_font_destroy); } @@ -553,7 +555,7 @@ hb_face_t * hb_ft_face_create_referenced (FT_Face ft_face) { FT_Reference_Face (ft_face); - return hb_ft_face_create (ft_face, (hb_destroy_func_t) _hb_ft_face_destroy); + return hb_ft_face_create (ft_face, _hb_ft_face_destroy); } static void @@ -608,6 +610,19 @@ hb_ft_font_create (FT_Face ft_face, font = hb_font_create (face); hb_face_destroy (face); _hb_ft_font_set_funcs (font, ft_face, false); + hb_ft_font_changed (font); + return font; +} + +void +hb_ft_font_changed (hb_font_t *font) +{ + if (font->destroy != _hb_ft_font_destroy) + return; + + hb_ft_font_t *ft_font = (hb_ft_font_t *) font->user_data; + FT_Face ft_face = ft_font->ft_face; + hb_font_set_scale (font, (int) (((uint64_t) ft_face->size->metrics.x_scale * (uint64_t) ft_face->units_per_EM + (1u<<15)) >> 16), (int) (((uint64_t) ft_face->size->metrics.y_scale * (uint64_t) ft_face->units_per_EM + (1u<<15)) >> 16)); @@ -638,8 +653,6 @@ hb_ft_font_create (FT_Face ft_face, free (mm_var); } #endif - - return font; } /** @@ -655,7 +668,7 @@ hb_font_t * hb_ft_font_create_referenced (FT_Face ft_face) { FT_Reference_Face (ft_face); - return hb_ft_font_create (ft_face, (hb_destroy_func_t) _hb_ft_face_destroy); + return hb_ft_font_create (ft_face, _hb_ft_face_destroy); } diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ft.h b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ft.h index dc8ef855848..94013eeb915 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ft.h +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ft.h @@ -116,7 +116,13 @@ hb_ft_font_set_load_flags (hb_font_t *font, int load_flags); HB_EXTERN int hb_ft_font_get_load_flags (hb_font_t *font); -/* Makes an hb_font_t use FreeType internally to implement font functions. */ +/* Call when size or variations settings on underlying FT_Face change. */ +HB_EXTERN void +hb_ft_font_changed (hb_font_t *font); + +/* Makes an hb_font_t use FreeType internally to implement font functions. + * Note: this internally creates an FT_Face. Use it when you create your + * hb_face_t using hb_face_create(). */ HB_EXTERN void hb_ft_font_set_funcs (hb_font_t *font); diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-glib.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-glib.cc index 2b91b5b6511..8b499558b1b 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-glib.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-glib.cc @@ -383,6 +383,13 @@ hb_glib_get_unicode_funcs (void) } #if GLIB_CHECK_VERSION(2,31,10) + +static void +_hb_g_bytes_unref (void *data) +{ + g_bytes_unref ((GBytes *) data); +} + /** * hb_glib_blob_create: * @@ -397,6 +404,6 @@ hb_glib_blob_create (GBytes *gbytes) size, HB_MEMORY_MODE_READONLY, g_bytes_ref (gbytes), - (hb_destroy_func_t) g_bytes_unref); + _hb_g_bytes_unref); } #endif diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-graphite2.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-graphite2.cc index 9e0761e63d1..bc247c60cbc 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-graphite2.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-graphite2.cc @@ -389,7 +389,7 @@ _hb_graphite2_shape (hb_shape_plan_t *shape_plan, } else { - curradvx = gr_seg_advance_X(seg); + curradvx = gr_seg_advance_X(seg) * xscale; for (is = gr_seg_first_slot (seg); is; pPos++, info++, is = gr_slot_next_in_segment (is)) { if (info->cluster != currclus) diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-open-file-private.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-open-file-private.hh index f208419aac5..dcfdfd6cab4 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-open-file-private.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-open-file-private.hh @@ -79,6 +79,24 @@ typedef struct OffsetTable if (unlikely (i >= numTables)) return Null(TableRecord); return tables[i]; } + inline unsigned int get_table_tags (unsigned int start_offset, + unsigned int *table_count, /* IN/OUT */ + hb_tag_t *table_tags /* OUT */) const + { + if (table_count) + { + if (start_offset >= numTables) + *table_count = 0; + else + *table_count = MIN (*table_count, numTables - start_offset); + + const TableRecord *sub_tables = tables + start_offset; + unsigned int count = *table_count; + for (unsigned int i = 0; i < count; i++) + table_tags[i] = sub_tables[i].tag; + } + return numTables; + } inline bool find_table_index (hb_tag_t tag, unsigned int *table_index) const { Tag t; diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-font.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-font.cc index d3251caf724..a56f4c07f70 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-font.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-font.cc @@ -458,8 +458,10 @@ _hb_ot_font_create (hb_face_t *face) } static void -_hb_ot_font_destroy (hb_ot_font_t *ot_font) +_hb_ot_font_destroy (void *data) { + hb_ot_font_t *ot_font = (hb_ot_font_t *) data; + ot_font->cmap.fini (); ot_font->h_metrics.fini (); ot_font->v_metrics.fini (); @@ -627,5 +629,5 @@ hb_ot_font_set_funcs (hb_font_t *font) hb_font_set_funcs (font, _hb_ot_get_font_funcs (), ot_font, - (hb_destroy_func_t) _hb_ot_font_destroy); + _hb_ot_font_destroy); } diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-gpos-table.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-gpos-table.hh index 738ca8c444e..e45ce2721c8 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-gpos-table.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-gpos-table.hh @@ -1087,7 +1087,9 @@ struct MarkBasePosFormat1 do { if (!skippy_iter.prev ()) return_trace (false); /* We only want to attach to the first of a MultipleSubst sequence. Reject others. */ - if (0 == _hb_glyph_info_get_lig_comp (&buffer->info[skippy_iter.idx])) break; + if (!_hb_glyph_info_multiplied (&buffer->info[skippy_iter.idx]) || + 0 == _hb_glyph_info_get_lig_comp (&buffer->info[skippy_iter.idx])) + break; skippy_iter.reject (); } while (1); diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-gsubgpos-private.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-gsubgpos-private.hh index 472628a3937..cedf96e3fb9 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-gsubgpos-private.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-gsubgpos-private.hh @@ -374,6 +374,13 @@ struct hb_apply_context_t : inline void reject (void) { num_items++; match_glyph_data--; } + inline matcher_t::may_skip_t + may_skip (const hb_apply_context_t *c, + const hb_glyph_info_t &info) const + { + return matcher.may_skip (c, info); + } + inline bool next (void) { assert (num_items > 0); @@ -736,11 +743,17 @@ static inline bool match_input (hb_apply_context_t *c, * - Ligatures cannot be formed across glyphs attached to different components * of previous ligatures. Eg. the sequence is LAM,SHADDA,LAM,FATHA,HEH, and * LAM,LAM,HEH form a ligature, leaving SHADDA,FATHA next to eachother. - * However, it would be wrong to ligate that SHADDA,FATHA sequence.o - * There is an exception to this: If a ligature tries ligating with marks that - * belong to it itself, go ahead, assuming that the font designer knows what - * they are doing (otherwise it can break Indic stuff when a matra wants to - * ligate with a conjunct...) + * However, it would be wrong to ligate that SHADDA,FATHA sequence. + * There are a couple of exceptions to this: + * + * o If a ligature tries ligating with marks that belong to it itself, go ahead, + * assuming that the font designer knows what they are doing (otherwise it can + * break Indic stuff when a matra wants to ligate with a conjunct, + * + * o If two marks want to ligate and they belong to different components of the + * same ligature glyph, and said ligature glyph is to be ignored according to + * mark-filtering rules, then allow. + * https://github.com/behdad/harfbuzz/issues/545 */ bool is_mark_ligature = _hb_glyph_info_is_mark (&buffer->cur()); @@ -751,6 +764,12 @@ static inline bool match_input (hb_apply_context_t *c, unsigned int first_lig_id = _hb_glyph_info_get_lig_id (&buffer->cur()); unsigned int first_lig_comp = _hb_glyph_info_get_lig_comp (&buffer->cur()); + enum { + LIGBASE_NOT_CHECKED, + LIGBASE_MAY_NOT_SKIP, + LIGBASE_MAY_SKIP + } ligbase = LIGBASE_NOT_CHECKED; + match_positions[0] = buffer->idx; for (unsigned int i = 1; i < count; i++) { @@ -761,13 +780,43 @@ static inline bool match_input (hb_apply_context_t *c, unsigned int this_lig_id = _hb_glyph_info_get_lig_id (&buffer->info[skippy_iter.idx]); unsigned int this_lig_comp = _hb_glyph_info_get_lig_comp (&buffer->info[skippy_iter.idx]); - if (first_lig_id && first_lig_comp) { + if (first_lig_id && first_lig_comp) + { /* If first component was attached to a previous ligature component, * all subsequent components should be attached to the same ligature - * component, otherwise we shouldn't ligate them. */ + * component, otherwise we shouldn't ligate them... */ if (first_lig_id != this_lig_id || first_lig_comp != this_lig_comp) - return_trace (false); - } else { + { + /* ...unless, we are attached to a base ligature and that base + * ligature is ignorable. */ + if (ligbase == LIGBASE_NOT_CHECKED) + { + bool found = false; + const hb_glyph_info_t *out = buffer->out_info; + unsigned int j = buffer->out_len; + while (j && _hb_glyph_info_get_lig_id (&out[j - 1]) == first_lig_id) + { + if (_hb_glyph_info_get_lig_comp (&out[j - 1]) == 0) + { + j--; + found = true; + break; + } + j--; + } + + if (found && skippy_iter.may_skip (c, out[j]) == hb_apply_context_t::matcher_t::SKIP_YES) + ligbase = LIGBASE_MAY_SKIP; + else + ligbase = LIGBASE_MAY_NOT_SKIP; + } + + if (ligbase == LIGBASE_MAY_NOT_SKIP) + return_trace (false); + } + } + else + { /* If first component was NOT attached to a previous ligature component, * all subsequent components should also NOT be attached to any ligature * component, unless they are attached to the first component itself! */ diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-private.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-private.hh index d4ac60b06fe..6717adeb930 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-private.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-private.hh @@ -347,6 +347,8 @@ _hb_glyph_info_get_modified_combining_class (const hb_glyph_info_t *info) return _hb_glyph_info_is_unicode_mark (info) ? info->unicode_props()>>8 : 0; } +#define info_cc(info) (_hb_glyph_info_get_modified_combining_class (&(info))) + static inline bool _hb_glyph_info_is_unicode_space (const hb_glyph_info_t *info) { diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-arabic-table.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-arabic-table.hh index 228f3665901..cd6e4058b56 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-arabic-table.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-arabic-table.hh @@ -6,10 +6,10 @@ * * on files with these headers: * - * # ArabicShaping-9.0.0.txt - * # Date: 2016-02-24, 22:25:00 GMT [RP] - * # Blocks-9.0.0.txt - * # Date: 2016-02-05, 23:48:00 GMT [KW] + * # ArabicShaping-10.0.0.txt + * # Date: 2017-02-16, 00:00:00 GMT [RP, KW] + * # Blocks-10.0.0.txt + * # Date: 2017-04-12, 17:30:00 GMT [KW] * UnicodeData.txt does not have a header. */ @@ -72,7 +72,10 @@ static const uint8_t joining_table[] = /* Mandaic */ /* 0840 */ R,D,D,D,D,D,R,R,D,R,D,D,D,D,D,D,D,D,D,D,R,D,U,U,U,X,X,X,X,X,X,X, - /* 0860 */ X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X, + + /* Syriac Supplement */ + + /* 0860 */ D,U,D,D,D,D,U,R,D,R,R,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X, /* 0880 */ X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X, /* Arabic Extended-A */ @@ -130,7 +133,7 @@ static const uint8_t joining_table[] = /* 1E920 */ D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D, /* 1E940 */ D,D,D,D, -}; /* Table items: 1214; occupancy: 54% */ +}; /* Table items: 1214; occupancy: 55% */ static unsigned int diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-arabic.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-arabic.cc index ed7b3f2dd9b..f7419611203 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-arabic.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-arabic.cc @@ -613,6 +613,80 @@ postprocess_glyphs_arabic (const hb_ot_shape_plan_t *plan, HB_BUFFER_DEALLOCATE_VAR (buffer, arabic_shaping_action); } +/* http://www.unicode.org/reports/tr53/tr53-1.pdf */ + +static hb_codepoint_t +modifier_combining_marks[] = +{ + 0x0654u, /* ARABIC HAMZA ABOVE */ + 0x0655u, /* ARABIC HAMZA BELOW */ + 0x0658u, /* ARABIC MARK NOON GHUNNA */ + 0x06DCu, /* ARABIC SMALL HIGH SEEN */ + 0x06E3u, /* ARABIC SMALL LOW SEEN */ + 0x06E7u, /* ARABIC SMALL HIGH YEH */ + 0x06E8u, /* ARABIC SMALL HIGH NOON */ + 0x08F3u, /* ARABIC SMALL HIGH WAW */ +}; + +static inline bool +info_is_mcm (const hb_glyph_info_t &info) +{ + hb_codepoint_t u = info.codepoint; + for (unsigned int i = 0; i < ARRAY_LENGTH (modifier_combining_marks); i++) + if (u == modifier_combining_marks[i]) + return true; + return false; +} + +static void +reorder_marks_arabic (const hb_ot_shape_plan_t *plan, + hb_buffer_t *buffer, + unsigned int start, + unsigned int end) +{ + hb_glyph_info_t *info = buffer->info; + + unsigned int i = start; + for (unsigned int cc = 220; cc <= 230; cc += 10) + { + DEBUG_MSG (ARABIC, buffer, "Looking for %d's starting at %d\n", cc, i); + while (i < end && info_cc(info[i]) < cc) + i++; + DEBUG_MSG (ARABIC, buffer, "Looking for %d's stopped at %d\n", cc, i); + + if (i == end) + break; + + if (info_cc(info[i]) > cc) + continue; + + /* Technically we should also check "info_cc(info[j]) == cc" + * in the following loop. But not doing it is safe; we might + * end up moving all the 220 MCMs and 230 MCMs together in one + * move and be done. */ + unsigned int j = i; + while (j < end && info_is_mcm (info[j])) + j++; + DEBUG_MSG (ARABIC, buffer, "Found %d's from %d to %d\n", cc, i, j); + + if (i == j) + continue; + + /* Shift it! */ + DEBUG_MSG (ARABIC, buffer, "Shifting %d's: %d %d\n", cc, i, j); + hb_glyph_info_t temp[HB_OT_SHAPE_COMPLEX_MAX_COMBINING_MARKS]; + assert (j - i <= ARRAY_LENGTH (temp)); + buffer->merge_clusters (start, j); + memmove (temp, &info[i], (j - i) * sizeof (hb_glyph_info_t)); + memmove (&info[start + j - i], &info[start], (i - start) * sizeof (hb_glyph_info_t)); + memmove (&info[start], temp, (j - i) * sizeof (hb_glyph_info_t)); + + start += j - i; + + i = j; + } +} + const hb_ot_complex_shaper_t _hb_ot_complex_shaper_arabic = { "arabic", @@ -627,6 +701,7 @@ const hb_ot_complex_shaper_t _hb_ot_complex_shaper_arabic = NULL, /* compose */ setup_masks_arabic, NULL, /* disable_otl */ + reorder_marks_arabic, HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_LATE, true, /* fallback_position */ }; diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-default.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-default.cc index 42830ab6185..857980cfcbe 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-default.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-default.cc @@ -41,6 +41,7 @@ const hb_ot_complex_shaper_t _hb_ot_complex_shaper_default = NULL, /* compose */ NULL, /* setup_masks */ NULL, /* disable_otl */ + NULL, /* reorder_marks */ HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_LATE, true, /* fallback_position */ }; diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-hangul.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-hangul.cc index 0e74802ee52..63850d36ac8 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-hangul.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-hangul.cc @@ -426,6 +426,7 @@ const hb_ot_complex_shaper_t _hb_ot_complex_shaper_hangul = NULL, /* compose */ setup_masks_hangul, NULL, /* disable_otl */ + NULL, /* reorder_marks */ HB_OT_SHAPE_ZERO_WIDTH_MARKS_NONE, false, /* fallback_position */ }; diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-hebrew.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-hebrew.cc index 96f24946165..b8ddadc1e29 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-hebrew.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-hebrew.cc @@ -181,6 +181,7 @@ const hb_ot_complex_shaper_t _hb_ot_complex_shaper_hebrew = compose_hebrew, NULL, /* setup_masks */ disable_otl_hebrew, + NULL, /* reorder_marks */ HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_LATE, true, /* fallback_position */ }; diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-indic-machine.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-indic-machine.hh index 5a7a265c871..7eaba4e4e7b 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-indic-machine.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-indic-machine.hh @@ -56,7 +56,7 @@ static const unsigned char _indic_syllable_machine_trans_keys[] = { 5u, 7u, 5u, 8u, 5u, 7u, 7u, 7u, 5u, 8u, 5u, 7u, 7u, 7u, 5u, 8u, 5u, 7u, 7u, 7u, 8u, 8u, 1u, 16u, 8u, 13u, 4u, 8u, 6u, 6u, 16u, 16u, 4u, 8u, 6u, 6u, 16u, 16u, 4u, 8u, 6u, 6u, 16u, 16u, 4u, 8u, 6u, 6u, - 16u, 16u, 8u, 8u, 1u, 18u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, + 16u, 16u, 8u, 8u, 1u, 19u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 5u, 14u, 5u, 14u, 5u, 10u, 9u, 10u, 9u, 9u, 9u, 10u, 9u, 10u, 9u, 9u, 5u, 10u, 3u, 13u, @@ -101,7 +101,7 @@ static const unsigned char _indic_syllable_machine_trans_keys[] = { 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 13u, 3u, 10u, 5u, 10u, 3u, 10u, 3u, 13u, 1u, 16u, 3u, 10u, 5u, 10u, 5u, 10u, 9u, 10u, 9u, 9u, 9u, 10u, - 9u, 10u, 9u, 9u, 5u, 10u, 0 + 9u, 10u, 9u, 9u, 5u, 10u, 1u, 16u, 0 }; static const char _indic_syllable_machine_key_spans[] = { @@ -127,7 +127,7 @@ static const char _indic_syllable_machine_key_spans[] = { 3, 4, 3, 1, 4, 3, 1, 4, 3, 1, 1, 16, 6, 5, 1, 1, 5, 1, 1, 5, 1, 1, 5, 1, - 1, 1, 18, 15, 15, 14, 16, 15, + 1, 1, 19, 15, 15, 14, 16, 15, 15, 14, 16, 15, 15, 14, 16, 15, 15, 14, 16, 15, 15, 14, 10, 10, 6, 2, 1, 2, 2, 1, 6, 11, @@ -172,7 +172,7 @@ static const char _indic_syllable_machine_key_spans[] = { 12, 11, 10, 12, 11, 10, 12, 11, 10, 12, 11, 10, 11, 8, 6, 8, 11, 16, 8, 6, 6, 2, 1, 2, - 2, 1, 6 + 2, 1, 6, 16 }; static const short _indic_syllable_machine_index_offsets[] = { @@ -198,52 +198,52 @@ static const short _indic_syllable_machine_index_offsets[] = { 954, 958, 963, 967, 969, 974, 978, 980, 985, 989, 991, 993, 1010, 1017, 1023, 1025, 1027, 1033, 1035, 1037, 1043, 1045, 1047, 1053, - 1055, 1057, 1059, 1078, 1094, 1110, 1125, 1142, - 1158, 1174, 1189, 1206, 1222, 1238, 1253, 1270, - 1286, 1302, 1317, 1334, 1350, 1366, 1381, 1392, - 1403, 1410, 1413, 1415, 1418, 1421, 1423, 1430, - 1442, 1451, 1458, 1467, 1479, 1492, 1505, 1517, - 1528, 1541, 1553, 1564, 1577, 1589, 1600, 1613, - 1625, 1636, 1649, 1666, 1678, 1694, 1710, 1727, - 1744, 1761, 1778, 1795, 1811, 1827, 1844, 1861, - 1878, 1895, 1912, 1928, 1944, 1961, 1978, 1995, - 2012, 2029, 2045, 2061, 2078, 2095, 2112, 2129, - 2146, 2162, 2178, 2194, 2210, 2225, 2242, 2258, - 2274, 2289, 2306, 2322, 2338, 2353, 2370, 2386, - 2402, 2417, 2434, 2450, 2466, 2481, 2492, 2503, - 2510, 2513, 2515, 2518, 2521, 2523, 2530, 2542, - 2551, 2558, 2567, 2579, 2592, 2605, 2617, 2628, - 2641, 2653, 2664, 2677, 2689, 2700, 2713, 2725, - 2736, 2749, 2766, 2778, 2794, 2810, 2827, 2844, - 2861, 2878, 2895, 2911, 2927, 2944, 2961, 2978, - 2995, 3012, 3028, 3044, 3061, 3078, 3095, 3112, - 3129, 3145, 3161, 3178, 3195, 3212, 3229, 3241, - 3258, 3274, 3290, 3305, 3322, 3338, 3354, 3369, - 3386, 3402, 3418, 3433, 3450, 3466, 3482, 3497, - 3514, 3530, 3546, 3561, 3572, 3583, 3590, 3593, - 3595, 3598, 3601, 3603, 3610, 3622, 3631, 3638, - 3647, 3659, 3672, 3685, 3697, 3708, 3721, 3733, - 3744, 3757, 3769, 3780, 3793, 3805, 3816, 3829, - 3846, 3858, 3874, 3890, 3907, 3924, 3941, 3958, - 3975, 3991, 4007, 4024, 4041, 4058, 4075, 4092, - 4108, 4124, 4141, 4158, 4175, 4192, 4209, 4225, - 4241, 4258, 4275, 4292, 4309, 4326, 4338, 4354, - 4366, 4382, 4398, 4413, 4430, 4446, 4462, 4477, - 4494, 4510, 4526, 4541, 4558, 4574, 4590, 4605, - 4622, 4638, 4654, 4669, 4680, 4691, 4698, 4701, - 4703, 4706, 4709, 4711, 4718, 4730, 4739, 4746, - 4755, 4767, 4780, 4793, 4805, 4816, 4829, 4841, - 4852, 4865, 4877, 4888, 4901, 4913, 4924, 4937, - 4954, 4966, 4982, 4998, 5015, 5032, 5049, 5066, - 5083, 5099, 5115, 5132, 5149, 5166, 5183, 5200, - 5216, 5232, 5249, 5266, 5283, 5300, 5317, 5333, - 5349, 5366, 5383, 5400, 5417, 5434, 5450, 5468, - 5484, 5502, 5514, 5521, 5524, 5526, 5529, 5532, - 5534, 5541, 5558, 5574, 5590, 5605, 5621, 5637, - 5654, 5667, 5679, 5690, 5703, 5715, 5726, 5739, - 5751, 5762, 5775, 5787, 5798, 5810, 5819, 5826, - 5835, 5847, 5864, 5873, 5880, 5887, 5890, 5892, - 5895, 5898, 5900 + 1055, 1057, 1059, 1079, 1095, 1111, 1126, 1143, + 1159, 1175, 1190, 1207, 1223, 1239, 1254, 1271, + 1287, 1303, 1318, 1335, 1351, 1367, 1382, 1393, + 1404, 1411, 1414, 1416, 1419, 1422, 1424, 1431, + 1443, 1452, 1459, 1468, 1480, 1493, 1506, 1518, + 1529, 1542, 1554, 1565, 1578, 1590, 1601, 1614, + 1626, 1637, 1650, 1667, 1679, 1695, 1711, 1728, + 1745, 1762, 1779, 1796, 1812, 1828, 1845, 1862, + 1879, 1896, 1913, 1929, 1945, 1962, 1979, 1996, + 2013, 2030, 2046, 2062, 2079, 2096, 2113, 2130, + 2147, 2163, 2179, 2195, 2211, 2226, 2243, 2259, + 2275, 2290, 2307, 2323, 2339, 2354, 2371, 2387, + 2403, 2418, 2435, 2451, 2467, 2482, 2493, 2504, + 2511, 2514, 2516, 2519, 2522, 2524, 2531, 2543, + 2552, 2559, 2568, 2580, 2593, 2606, 2618, 2629, + 2642, 2654, 2665, 2678, 2690, 2701, 2714, 2726, + 2737, 2750, 2767, 2779, 2795, 2811, 2828, 2845, + 2862, 2879, 2896, 2912, 2928, 2945, 2962, 2979, + 2996, 3013, 3029, 3045, 3062, 3079, 3096, 3113, + 3130, 3146, 3162, 3179, 3196, 3213, 3230, 3242, + 3259, 3275, 3291, 3306, 3323, 3339, 3355, 3370, + 3387, 3403, 3419, 3434, 3451, 3467, 3483, 3498, + 3515, 3531, 3547, 3562, 3573, 3584, 3591, 3594, + 3596, 3599, 3602, 3604, 3611, 3623, 3632, 3639, + 3648, 3660, 3673, 3686, 3698, 3709, 3722, 3734, + 3745, 3758, 3770, 3781, 3794, 3806, 3817, 3830, + 3847, 3859, 3875, 3891, 3908, 3925, 3942, 3959, + 3976, 3992, 4008, 4025, 4042, 4059, 4076, 4093, + 4109, 4125, 4142, 4159, 4176, 4193, 4210, 4226, + 4242, 4259, 4276, 4293, 4310, 4327, 4339, 4355, + 4367, 4383, 4399, 4414, 4431, 4447, 4463, 4478, + 4495, 4511, 4527, 4542, 4559, 4575, 4591, 4606, + 4623, 4639, 4655, 4670, 4681, 4692, 4699, 4702, + 4704, 4707, 4710, 4712, 4719, 4731, 4740, 4747, + 4756, 4768, 4781, 4794, 4806, 4817, 4830, 4842, + 4853, 4866, 4878, 4889, 4902, 4914, 4925, 4938, + 4955, 4967, 4983, 4999, 5016, 5033, 5050, 5067, + 5084, 5100, 5116, 5133, 5150, 5167, 5184, 5201, + 5217, 5233, 5250, 5267, 5284, 5301, 5318, 5334, + 5350, 5367, 5384, 5401, 5418, 5435, 5451, 5469, + 5485, 5503, 5515, 5522, 5525, 5527, 5530, 5533, + 5535, 5542, 5559, 5575, 5591, 5606, 5622, 5638, + 5655, 5668, 5680, 5691, 5704, 5716, 5727, 5740, + 5752, 5763, 5776, 5788, 5799, 5811, 5820, 5827, + 5836, 5848, 5865, 5874, 5881, 5888, 5891, 5893, + 5896, 5899, 5901, 5908 }; static const short _indic_syllable_machine_indicies[] = { @@ -381,611 +381,613 @@ static const short _indic_syllable_machine_indicies[] = { 161, 161, 162, 157, 0, 183, 0, 184, 0, 186, 185, 188, 189, 190, 191, 192, 193, 84, 79, 194, 195, 196, 196, 156, - 197, 198, 199, 200, 201, 187, 203, 204, - 205, 206, 6, 1, 207, 208, 202, 202, - 38, 209, 202, 202, 210, 202, 211, 204, - 212, 212, 6, 1, 207, 208, 202, 202, - 202, 209, 202, 202, 210, 202, 204, 212, - 212, 6, 1, 207, 208, 202, 202, 202, - 209, 202, 202, 210, 202, 213, 202, 202, - 202, 19, 214, 202, 1, 207, 208, 202, - 202, 202, 215, 202, 213, 202, 216, 217, - 218, 219, 6, 1, 207, 208, 202, 202, - 36, 220, 202, 202, 210, 202, 221, 217, - 222, 222, 6, 1, 207, 208, 202, 202, - 202, 220, 202, 202, 210, 202, 217, 222, - 222, 6, 1, 207, 208, 202, 202, 202, - 220, 202, 202, 210, 202, 223, 202, 202, - 202, 19, 224, 202, 1, 207, 208, 202, - 202, 202, 215, 202, 223, 202, 225, 226, - 227, 228, 6, 1, 207, 208, 202, 202, - 34, 229, 202, 202, 210, 202, 230, 226, - 231, 231, 6, 1, 207, 208, 202, 202, - 202, 229, 202, 202, 210, 202, 226, 231, - 231, 6, 1, 207, 208, 202, 202, 202, - 229, 202, 202, 210, 202, 232, 202, 202, - 202, 19, 233, 202, 1, 207, 208, 202, - 202, 202, 215, 202, 232, 202, 234, 235, - 236, 237, 6, 1, 207, 208, 202, 202, - 32, 238, 202, 202, 210, 202, 239, 235, - 240, 240, 6, 1, 207, 208, 202, 202, - 202, 238, 202, 202, 210, 202, 235, 240, - 240, 6, 1, 207, 208, 202, 202, 202, - 238, 202, 202, 210, 202, 241, 202, 202, - 202, 19, 242, 202, 1, 207, 208, 202, - 202, 202, 215, 202, 241, 202, 243, 244, - 245, 246, 6, 1, 207, 208, 202, 202, - 30, 247, 202, 202, 210, 202, 248, 244, - 249, 249, 6, 1, 207, 208, 202, 202, - 202, 247, 202, 202, 210, 202, 244, 249, - 249, 6, 1, 207, 208, 202, 202, 202, - 247, 202, 202, 210, 202, 19, 250, 202, - 1, 207, 208, 202, 202, 202, 215, 202, - 251, 251, 202, 1, 207, 208, 202, 202, - 202, 215, 202, 252, 202, 202, 253, 207, - 208, 202, 207, 208, 202, 254, 202, 207, - 255, 202, 207, 256, 202, 207, 202, 252, - 202, 202, 202, 207, 208, 202, 257, 202, - 258, 259, 202, 1, 207, 208, 202, 202, - 4, 202, 3, 202, 251, 251, 202, 1, - 207, 208, 202, 251, 251, 202, 1, 207, - 208, 202, 257, 202, 251, 251, 202, 1, - 207, 208, 202, 257, 202, 258, 251, 202, - 1, 207, 208, 202, 202, 4, 202, 19, - 202, 260, 260, 6, 1, 207, 208, 202, - 202, 202, 215, 202, 261, 28, 262, 263, - 9, 1, 207, 208, 202, 202, 202, 215, - 202, 28, 262, 263, 9, 1, 207, 208, - 202, 202, 202, 215, 202, 262, 262, 9, - 1, 207, 208, 202, 202, 202, 215, 202, - 264, 25, 265, 266, 12, 1, 207, 208, - 202, 202, 202, 215, 202, 25, 265, 266, - 12, 1, 207, 208, 202, 202, 202, 215, - 202, 265, 265, 12, 1, 207, 208, 202, - 202, 202, 215, 202, 267, 22, 268, 269, - 15, 1, 207, 208, 202, 202, 202, 215, - 202, 22, 268, 269, 15, 1, 207, 208, - 202, 202, 202, 215, 202, 268, 268, 15, - 1, 207, 208, 202, 202, 202, 215, 202, - 270, 19, 251, 271, 202, 1, 207, 208, - 202, 202, 202, 215, 202, 19, 251, 271, - 202, 1, 207, 208, 202, 202, 202, 215, - 202, 251, 272, 202, 1, 207, 208, 202, - 202, 202, 215, 202, 19, 202, 251, 251, - 202, 1, 207, 208, 202, 202, 202, 215, - 202, 2, 3, 202, 202, 19, 250, 202, - 1, 207, 208, 202, 202, 202, 215, 202, - 2, 202, 244, 249, 249, 6, 1, 207, - 208, 202, 202, 202, 247, 202, 243, 244, - 249, 249, 6, 1, 207, 208, 202, 202, - 202, 247, 202, 202, 210, 202, 243, 244, - 245, 249, 6, 1, 207, 208, 202, 202, - 30, 247, 202, 202, 210, 202, 241, 202, - 273, 202, 260, 260, 6, 1, 207, 208, - 202, 202, 202, 215, 202, 241, 202, 241, - 202, 202, 202, 251, 251, 202, 1, 207, - 208, 202, 202, 202, 215, 202, 241, 202, - 241, 202, 202, 202, 251, 274, 202, 1, - 207, 208, 202, 202, 202, 215, 202, 241, - 202, 241, 202, 273, 202, 251, 251, 202, - 1, 207, 208, 202, 202, 202, 215, 202, - 241, 202, 241, 3, 202, 202, 19, 242, - 202, 1, 207, 208, 202, 202, 202, 215, - 202, 241, 202, 234, 235, 240, 240, 6, - 1, 207, 208, 202, 202, 202, 238, 202, - 202, 210, 202, 234, 235, 236, 240, 6, - 1, 207, 208, 202, 202, 32, 238, 202, - 202, 210, 202, 232, 202, 275, 202, 260, - 260, 6, 1, 207, 208, 202, 202, 202, - 215, 202, 232, 202, 232, 202, 202, 202, - 251, 251, 202, 1, 207, 208, 202, 202, - 202, 215, 202, 232, 202, 232, 202, 202, - 202, 251, 276, 202, 1, 207, 208, 202, - 202, 202, 215, 202, 232, 202, 232, 202, - 275, 202, 251, 251, 202, 1, 207, 208, - 202, 202, 202, 215, 202, 232, 202, 232, - 3, 202, 202, 19, 233, 202, 1, 207, - 208, 202, 202, 202, 215, 202, 232, 202, - 225, 226, 231, 231, 6, 1, 207, 208, - 202, 202, 202, 229, 202, 202, 210, 202, - 225, 226, 227, 231, 6, 1, 207, 208, - 202, 202, 34, 229, 202, 202, 210, 202, - 223, 202, 277, 202, 260, 260, 6, 1, - 207, 208, 202, 202, 202, 215, 202, 223, - 202, 223, 202, 202, 202, 251, 251, 202, - 1, 207, 208, 202, 202, 202, 215, 202, - 223, 202, 223, 202, 202, 202, 251, 278, - 202, 1, 207, 208, 202, 202, 202, 215, - 202, 223, 202, 223, 202, 277, 202, 251, - 251, 202, 1, 207, 208, 202, 202, 202, - 215, 202, 223, 202, 223, 3, 202, 202, - 19, 224, 202, 1, 207, 208, 202, 202, - 202, 215, 202, 223, 202, 216, 217, 222, - 222, 6, 1, 207, 208, 202, 202, 202, - 220, 202, 202, 210, 202, 216, 217, 218, - 222, 6, 1, 207, 208, 202, 202, 36, - 220, 202, 202, 210, 202, 213, 202, 279, - 202, 260, 260, 6, 1, 207, 208, 202, - 202, 202, 215, 202, 213, 202, 213, 202, - 202, 202, 251, 251, 202, 1, 207, 208, - 202, 202, 202, 215, 202, 213, 202, 213, - 202, 202, 202, 251, 280, 202, 1, 207, - 208, 202, 202, 202, 215, 202, 213, 202, - 213, 202, 279, 202, 251, 251, 202, 1, - 207, 208, 202, 202, 202, 215, 202, 213, - 202, 213, 3, 202, 202, 19, 214, 202, - 1, 207, 208, 202, 202, 202, 215, 202, - 213, 202, 203, 204, 212, 212, 6, 1, - 207, 208, 202, 202, 202, 209, 202, 202, - 210, 202, 203, 204, 205, 212, 6, 1, - 207, 208, 202, 202, 38, 209, 202, 202, - 210, 202, 282, 283, 284, 285, 45, 40, - 286, 287, 281, 281, 77, 288, 281, 281, - 289, 281, 290, 283, 291, 285, 45, 40, - 286, 287, 281, 281, 281, 288, 281, 281, - 289, 281, 283, 291, 285, 45, 40, 286, - 287, 281, 281, 281, 288, 281, 281, 289, - 281, 292, 281, 281, 281, 58, 293, 281, - 40, 286, 287, 281, 281, 281, 294, 281, - 292, 281, 295, 296, 297, 298, 45, 40, - 286, 287, 281, 281, 75, 299, 281, 281, - 289, 281, 300, 296, 301, 301, 45, 40, - 286, 287, 281, 281, 281, 299, 281, 281, - 289, 281, 296, 301, 301, 45, 40, 286, - 287, 281, 281, 281, 299, 281, 281, 289, - 281, 302, 281, 281, 281, 58, 303, 281, - 40, 286, 287, 281, 281, 281, 294, 281, - 302, 281, 304, 305, 306, 307, 45, 40, - 286, 287, 281, 281, 73, 308, 281, 281, - 289, 281, 309, 305, 310, 310, 45, 40, - 286, 287, 281, 281, 281, 308, 281, 281, - 289, 281, 305, 310, 310, 45, 40, 286, - 287, 281, 281, 281, 308, 281, 281, 289, - 281, 311, 281, 281, 281, 58, 312, 281, - 40, 286, 287, 281, 281, 281, 294, 281, - 311, 281, 313, 314, 315, 316, 45, 40, - 286, 287, 281, 281, 71, 317, 281, 281, - 289, 281, 318, 314, 319, 319, 45, 40, - 286, 287, 281, 281, 281, 317, 281, 281, - 289, 281, 314, 319, 319, 45, 40, 286, - 287, 281, 281, 281, 317, 281, 281, 289, - 281, 320, 281, 281, 281, 58, 321, 281, - 40, 286, 287, 281, 281, 281, 294, 281, - 320, 281, 322, 323, 324, 325, 45, 40, - 286, 287, 281, 281, 69, 326, 281, 281, - 289, 281, 327, 323, 328, 328, 45, 40, - 286, 287, 281, 281, 281, 326, 281, 281, - 289, 281, 323, 328, 328, 45, 40, 286, - 287, 281, 281, 281, 326, 281, 281, 289, - 281, 58, 329, 281, 40, 286, 287, 281, - 281, 281, 294, 281, 330, 330, 281, 40, - 286, 287, 281, 281, 281, 294, 281, 331, - 281, 281, 332, 286, 287, 281, 286, 287, - 281, 333, 281, 286, 334, 281, 286, 335, - 281, 286, 281, 331, 281, 281, 281, 286, - 287, 281, 336, 281, 337, 338, 281, 40, - 286, 287, 281, 281, 43, 281, 42, 281, - 330, 330, 281, 40, 286, 287, 281, 330, - 330, 281, 40, 286, 287, 281, 336, 281, - 330, 330, 281, 40, 286, 287, 281, 336, - 281, 337, 330, 281, 40, 286, 287, 281, - 281, 43, 281, 58, 281, 339, 339, 45, - 40, 286, 287, 281, 281, 281, 294, 281, - 340, 67, 341, 342, 48, 40, 286, 287, - 281, 281, 281, 294, 281, 67, 341, 342, - 48, 40, 286, 287, 281, 281, 281, 294, - 281, 341, 341, 48, 40, 286, 287, 281, - 281, 281, 294, 281, 343, 64, 344, 345, - 51, 40, 286, 287, 281, 281, 281, 294, - 281, 64, 344, 345, 51, 40, 286, 287, - 281, 281, 281, 294, 281, 344, 344, 51, - 40, 286, 287, 281, 281, 281, 294, 281, - 346, 61, 347, 348, 54, 40, 286, 287, - 281, 281, 281, 294, 281, 61, 347, 348, - 54, 40, 286, 287, 281, 281, 281, 294, - 281, 347, 347, 54, 40, 286, 287, 281, - 281, 281, 294, 281, 349, 58, 330, 350, - 281, 40, 286, 287, 281, 281, 281, 294, - 281, 58, 330, 350, 281, 40, 286, 287, - 281, 281, 281, 294, 281, 330, 351, 281, - 40, 286, 287, 281, 281, 281, 294, 281, - 58, 281, 330, 330, 281, 40, 286, 287, - 281, 281, 281, 294, 281, 41, 42, 281, - 281, 58, 329, 281, 40, 286, 287, 281, - 281, 281, 294, 281, 41, 281, 323, 328, - 328, 45, 40, 286, 287, 281, 281, 281, - 326, 281, 322, 323, 328, 328, 45, 40, - 286, 287, 281, 281, 281, 326, 281, 281, - 289, 281, 322, 323, 324, 328, 45, 40, - 286, 287, 281, 281, 69, 326, 281, 281, - 289, 281, 320, 281, 352, 281, 339, 339, - 45, 40, 286, 287, 281, 281, 281, 294, - 281, 320, 281, 320, 281, 281, 281, 330, - 330, 281, 40, 286, 287, 281, 281, 281, - 294, 281, 320, 281, 320, 281, 281, 281, - 330, 353, 281, 40, 286, 287, 281, 281, - 281, 294, 281, 320, 281, 320, 281, 352, - 281, 330, 330, 281, 40, 286, 287, 281, - 281, 281, 294, 281, 320, 281, 320, 42, - 281, 281, 58, 321, 281, 40, 286, 287, - 281, 281, 281, 294, 281, 320, 281, 313, - 314, 319, 319, 45, 40, 286, 287, 281, - 281, 281, 317, 281, 281, 289, 281, 313, - 314, 315, 319, 45, 40, 286, 287, 281, - 281, 71, 317, 281, 281, 289, 281, 311, - 281, 354, 281, 339, 339, 45, 40, 286, - 287, 281, 281, 281, 294, 281, 311, 281, - 311, 281, 281, 281, 330, 330, 281, 40, - 286, 287, 281, 281, 281, 294, 281, 311, - 281, 311, 281, 281, 281, 330, 355, 281, - 40, 286, 287, 281, 281, 281, 294, 281, - 311, 281, 311, 281, 354, 281, 330, 330, - 281, 40, 286, 287, 281, 281, 281, 294, - 281, 311, 281, 311, 42, 281, 281, 58, - 312, 281, 40, 286, 287, 281, 281, 281, - 294, 281, 311, 281, 304, 305, 310, 310, - 45, 40, 286, 287, 281, 281, 281, 308, - 281, 281, 289, 281, 304, 305, 306, 310, - 45, 40, 286, 287, 281, 281, 73, 308, - 281, 281, 289, 281, 302, 281, 356, 281, - 339, 339, 45, 40, 286, 287, 281, 281, - 281, 294, 281, 302, 281, 302, 281, 281, - 281, 330, 330, 281, 40, 286, 287, 281, - 281, 281, 294, 281, 302, 281, 302, 281, - 281, 281, 330, 357, 281, 40, 286, 287, - 281, 281, 281, 294, 281, 302, 281, 302, - 281, 356, 281, 330, 330, 281, 40, 286, - 287, 281, 281, 281, 294, 281, 302, 281, - 302, 42, 281, 281, 58, 303, 281, 40, - 286, 287, 281, 281, 281, 294, 281, 302, - 281, 295, 296, 301, 301, 45, 40, 286, - 287, 281, 281, 281, 299, 281, 281, 289, - 281, 295, 296, 297, 301, 45, 40, 286, - 287, 281, 281, 75, 299, 281, 281, 289, - 281, 292, 281, 358, 281, 339, 339, 45, - 40, 286, 287, 281, 281, 281, 294, 281, - 292, 281, 292, 281, 281, 281, 330, 330, - 281, 40, 286, 287, 281, 281, 281, 294, - 281, 292, 281, 292, 281, 281, 281, 330, - 359, 281, 40, 286, 287, 281, 281, 281, - 294, 281, 292, 281, 292, 281, 358, 281, - 330, 330, 281, 40, 286, 287, 281, 281, - 281, 294, 281, 292, 281, 76, 44, 44, - 45, 40, 281, 281, 281, 281, 281, 76, - 281, 292, 42, 281, 281, 58, 293, 281, - 40, 286, 287, 281, 281, 281, 294, 281, - 292, 281, 282, 283, 291, 285, 45, 40, - 286, 287, 281, 281, 281, 288, 281, 281, - 289, 281, 361, 191, 362, 362, 84, 79, - 194, 195, 360, 360, 360, 197, 360, 360, - 200, 360, 191, 362, 362, 84, 79, 194, - 195, 360, 360, 360, 197, 360, 360, 200, - 360, 363, 360, 360, 360, 98, 364, 360, - 79, 194, 195, 360, 360, 360, 365, 360, - 363, 360, 366, 367, 368, 369, 84, 79, - 194, 195, 360, 360, 115, 370, 360, 360, - 200, 360, 371, 367, 372, 372, 84, 79, - 194, 195, 360, 360, 360, 370, 360, 360, - 200, 360, 367, 372, 372, 84, 79, 194, - 195, 360, 360, 360, 370, 360, 360, 200, - 360, 373, 360, 360, 360, 98, 374, 360, - 79, 194, 195, 360, 360, 360, 365, 360, - 373, 360, 375, 376, 377, 378, 84, 79, - 194, 195, 360, 360, 113, 379, 360, 360, - 200, 360, 380, 376, 381, 381, 84, 79, - 194, 195, 360, 360, 360, 379, 360, 360, - 200, 360, 376, 381, 381, 84, 79, 194, - 195, 360, 360, 360, 379, 360, 360, 200, - 360, 382, 360, 360, 360, 98, 383, 360, - 79, 194, 195, 360, 360, 360, 365, 360, - 382, 360, 384, 385, 386, 387, 84, 79, - 194, 195, 360, 360, 111, 388, 360, 360, - 200, 360, 389, 385, 390, 390, 84, 79, - 194, 195, 360, 360, 360, 388, 360, 360, - 200, 360, 385, 390, 390, 84, 79, 194, - 195, 360, 360, 360, 388, 360, 360, 200, - 360, 391, 360, 360, 360, 98, 392, 360, - 79, 194, 195, 360, 360, 360, 365, 360, - 391, 360, 393, 394, 395, 396, 84, 79, - 194, 195, 360, 360, 109, 397, 360, 360, - 200, 360, 398, 394, 399, 399, 84, 79, - 194, 195, 360, 360, 360, 397, 360, 360, - 200, 360, 394, 399, 399, 84, 79, 194, - 195, 360, 360, 360, 397, 360, 360, 200, - 360, 98, 400, 360, 79, 194, 195, 360, - 360, 360, 365, 360, 401, 401, 360, 79, - 194, 195, 360, 360, 360, 365, 360, 402, - 360, 360, 403, 194, 195, 360, 194, 195, - 360, 404, 360, 194, 405, 360, 194, 406, - 360, 194, 360, 402, 360, 360, 360, 194, - 195, 360, 407, 360, 408, 409, 360, 79, - 194, 195, 360, 360, 82, 360, 81, 360, - 401, 401, 360, 79, 194, 195, 360, 401, - 401, 360, 79, 194, 195, 360, 407, 360, - 401, 401, 360, 79, 194, 195, 360, 407, - 360, 408, 401, 360, 79, 194, 195, 360, - 360, 82, 360, 98, 360, 410, 410, 84, - 79, 194, 195, 360, 360, 360, 365, 360, - 411, 107, 412, 413, 88, 79, 194, 195, - 360, 360, 360, 365, 360, 107, 412, 413, - 88, 79, 194, 195, 360, 360, 360, 365, - 360, 412, 412, 88, 79, 194, 195, 360, - 360, 360, 365, 360, 414, 104, 415, 416, - 91, 79, 194, 195, 360, 360, 360, 365, - 360, 104, 415, 416, 91, 79, 194, 195, - 360, 360, 360, 365, 360, 415, 415, 91, - 79, 194, 195, 360, 360, 360, 365, 360, - 417, 101, 418, 419, 94, 79, 194, 195, - 360, 360, 360, 365, 360, 101, 418, 419, - 94, 79, 194, 195, 360, 360, 360, 365, - 360, 418, 418, 94, 79, 194, 195, 360, - 360, 360, 365, 360, 420, 98, 401, 421, - 360, 79, 194, 195, 360, 360, 360, 365, - 360, 98, 401, 421, 360, 79, 194, 195, - 360, 360, 360, 365, 360, 401, 422, 360, - 79, 194, 195, 360, 360, 360, 365, 360, - 98, 360, 401, 401, 360, 79, 194, 195, - 360, 360, 360, 365, 360, 80, 81, 360, - 360, 98, 400, 360, 79, 194, 195, 360, - 360, 360, 365, 360, 80, 360, 394, 399, - 399, 84, 79, 194, 195, 360, 360, 360, - 397, 360, 393, 394, 399, 399, 84, 79, - 194, 195, 360, 360, 360, 397, 360, 360, - 200, 360, 393, 394, 395, 399, 84, 79, - 194, 195, 360, 360, 109, 397, 360, 360, - 200, 360, 391, 360, 423, 360, 410, 410, - 84, 79, 194, 195, 360, 360, 360, 365, - 360, 391, 360, 391, 360, 360, 360, 401, - 401, 360, 79, 194, 195, 360, 360, 360, - 365, 360, 391, 360, 391, 360, 360, 360, - 401, 424, 360, 79, 194, 195, 360, 360, - 360, 365, 360, 391, 360, 391, 360, 423, - 360, 401, 401, 360, 79, 194, 195, 360, - 360, 360, 365, 360, 391, 360, 391, 81, - 360, 360, 98, 392, 360, 79, 194, 195, - 360, 360, 360, 365, 360, 391, 360, 384, - 385, 390, 390, 84, 79, 194, 195, 360, - 360, 360, 388, 360, 360, 200, 360, 384, - 385, 386, 390, 84, 79, 194, 195, 360, - 360, 111, 388, 360, 360, 200, 360, 382, - 360, 425, 360, 410, 410, 84, 79, 194, - 195, 360, 360, 360, 365, 360, 382, 360, - 382, 360, 360, 360, 401, 401, 360, 79, - 194, 195, 360, 360, 360, 365, 360, 382, - 360, 382, 360, 360, 360, 401, 426, 360, - 79, 194, 195, 360, 360, 360, 365, 360, - 382, 360, 382, 360, 425, 360, 401, 401, - 360, 79, 194, 195, 360, 360, 360, 365, - 360, 382, 360, 382, 81, 360, 360, 98, - 383, 360, 79, 194, 195, 360, 360, 360, - 365, 360, 382, 360, 375, 376, 381, 381, - 84, 79, 194, 195, 360, 360, 360, 379, - 360, 360, 200, 360, 375, 376, 377, 381, - 84, 79, 194, 195, 360, 360, 113, 379, - 360, 360, 200, 360, 373, 360, 427, 360, - 410, 410, 84, 79, 194, 195, 360, 360, - 360, 365, 360, 373, 360, 373, 360, 360, - 360, 401, 401, 360, 79, 194, 195, 360, - 360, 360, 365, 360, 373, 360, 373, 360, - 360, 360, 401, 428, 360, 79, 194, 195, - 360, 360, 360, 365, 360, 373, 360, 373, - 360, 427, 360, 401, 401, 360, 79, 194, - 195, 360, 360, 360, 365, 360, 373, 360, - 373, 81, 360, 360, 98, 374, 360, 79, - 194, 195, 360, 360, 360, 365, 360, 373, - 360, 366, 367, 372, 372, 84, 79, 194, - 195, 360, 360, 360, 370, 360, 360, 200, - 360, 366, 367, 368, 372, 84, 79, 194, - 195, 360, 360, 115, 370, 360, 360, 200, - 360, 363, 360, 429, 360, 410, 410, 84, - 79, 194, 195, 360, 360, 360, 365, 360, - 363, 360, 363, 360, 360, 360, 401, 401, - 360, 79, 194, 195, 360, 360, 360, 365, - 360, 363, 360, 363, 360, 360, 360, 401, - 430, 360, 79, 194, 195, 360, 360, 360, - 365, 360, 363, 360, 363, 360, 429, 360, - 401, 401, 360, 79, 194, 195, 360, 360, - 360, 365, 360, 363, 360, 363, 81, 360, - 360, 98, 364, 360, 79, 194, 195, 360, - 360, 360, 365, 360, 363, 360, 116, 83, - 83, 84, 79, 431, 431, 431, 431, 156, - 116, 431, 190, 191, 362, 362, 84, 79, - 194, 195, 360, 360, 360, 197, 360, 360, - 200, 360, 116, 83, 83, 84, 79, 431, - 431, 431, 431, 431, 116, 431, 433, 434, - 435, 436, 123, 118, 437, 438, 432, 432, - 155, 439, 432, 432, 440, 432, 441, 434, - 436, 436, 123, 118, 437, 438, 432, 432, - 432, 439, 432, 432, 440, 432, 434, 436, - 436, 123, 118, 437, 438, 432, 432, 432, - 439, 432, 432, 440, 432, 442, 432, 432, - 432, 136, 443, 432, 118, 437, 438, 432, - 432, 432, 444, 432, 442, 432, 445, 446, - 447, 448, 123, 118, 437, 438, 432, 432, - 153, 449, 432, 432, 440, 432, 450, 446, - 451, 451, 123, 118, 437, 438, 432, 432, - 432, 449, 432, 432, 440, 432, 446, 451, - 451, 123, 118, 437, 438, 432, 432, 432, - 449, 432, 432, 440, 432, 452, 432, 432, - 432, 136, 453, 432, 118, 437, 438, 432, - 432, 432, 444, 432, 452, 432, 454, 455, - 456, 457, 123, 118, 437, 438, 432, 432, - 151, 458, 432, 432, 440, 432, 459, 455, - 460, 460, 123, 118, 437, 438, 432, 432, - 432, 458, 432, 432, 440, 432, 455, 460, - 460, 123, 118, 437, 438, 432, 432, 432, - 458, 432, 432, 440, 432, 461, 432, 432, - 432, 136, 462, 432, 118, 437, 438, 432, - 432, 432, 444, 432, 461, 432, 463, 464, - 465, 466, 123, 118, 437, 438, 432, 432, - 149, 467, 432, 432, 440, 432, 468, 464, - 469, 469, 123, 118, 437, 438, 432, 432, - 432, 467, 432, 432, 440, 432, 464, 469, - 469, 123, 118, 437, 438, 432, 432, 432, - 467, 432, 432, 440, 432, 470, 432, 432, - 432, 136, 471, 432, 118, 437, 438, 432, - 432, 432, 444, 432, 470, 432, 472, 473, - 474, 475, 123, 118, 437, 438, 432, 432, - 147, 476, 432, 432, 440, 432, 477, 473, - 478, 478, 123, 118, 437, 438, 432, 432, - 432, 476, 432, 432, 440, 432, 473, 478, - 478, 123, 118, 437, 438, 432, 432, 432, - 476, 432, 432, 440, 432, 136, 479, 432, - 118, 437, 438, 432, 432, 432, 444, 432, - 480, 480, 432, 118, 437, 438, 432, 432, - 432, 444, 432, 481, 432, 432, 482, 437, - 438, 432, 437, 438, 432, 483, 432, 437, - 484, 432, 437, 485, 432, 437, 432, 481, - 432, 432, 432, 437, 438, 432, 486, 432, - 487, 488, 432, 118, 437, 438, 432, 432, - 121, 432, 120, 432, 480, 480, 432, 118, - 437, 438, 432, 480, 480, 432, 118, 437, - 438, 432, 486, 432, 480, 480, 432, 118, - 437, 438, 432, 486, 432, 487, 480, 432, - 118, 437, 438, 432, 432, 121, 432, 136, - 432, 489, 489, 123, 118, 437, 438, 432, - 432, 432, 444, 432, 490, 145, 491, 492, - 126, 118, 437, 438, 432, 432, 432, 444, - 432, 145, 491, 492, 126, 118, 437, 438, - 432, 432, 432, 444, 432, 491, 491, 126, - 118, 437, 438, 432, 432, 432, 444, 432, - 493, 142, 494, 495, 129, 118, 437, 438, - 432, 432, 432, 444, 432, 142, 494, 495, - 129, 118, 437, 438, 432, 432, 432, 444, - 432, 494, 494, 129, 118, 437, 438, 432, - 432, 432, 444, 432, 496, 139, 497, 498, - 132, 118, 437, 438, 432, 432, 432, 444, - 432, 139, 497, 498, 132, 118, 437, 438, - 432, 432, 432, 444, 432, 497, 497, 132, - 118, 437, 438, 432, 432, 432, 444, 432, - 499, 136, 480, 500, 432, 118, 437, 438, - 432, 432, 432, 444, 432, 136, 480, 500, - 432, 118, 437, 438, 432, 432, 432, 444, - 432, 480, 501, 432, 118, 437, 438, 432, - 432, 432, 444, 432, 136, 432, 480, 480, - 432, 118, 437, 438, 432, 432, 432, 444, - 432, 119, 120, 432, 432, 136, 479, 432, - 118, 437, 438, 432, 432, 432, 444, 432, - 119, 432, 473, 478, 478, 123, 118, 437, - 438, 432, 432, 432, 476, 432, 472, 473, - 478, 478, 123, 118, 437, 438, 432, 432, - 432, 476, 432, 432, 440, 432, 472, 473, - 474, 478, 123, 118, 437, 438, 432, 432, - 147, 476, 432, 432, 440, 432, 470, 432, - 502, 432, 489, 489, 123, 118, 437, 438, - 432, 432, 432, 444, 432, 470, 432, 470, - 432, 432, 432, 480, 480, 432, 118, 437, - 438, 432, 432, 432, 444, 432, 470, 432, - 470, 432, 432, 432, 480, 503, 432, 118, - 437, 438, 432, 432, 432, 444, 432, 470, - 432, 470, 432, 502, 432, 480, 480, 432, - 118, 437, 438, 432, 432, 432, 444, 432, - 470, 432, 470, 120, 432, 432, 136, 471, - 432, 118, 437, 438, 432, 432, 432, 444, - 432, 470, 432, 463, 464, 469, 469, 123, - 118, 437, 438, 432, 432, 432, 467, 432, - 432, 440, 432, 463, 464, 465, 469, 123, - 118, 437, 438, 432, 432, 149, 467, 432, - 432, 440, 432, 461, 432, 504, 432, 489, - 489, 123, 118, 437, 438, 432, 432, 432, - 444, 432, 461, 432, 461, 432, 432, 432, - 480, 480, 432, 118, 437, 438, 432, 432, - 432, 444, 432, 461, 432, 461, 432, 432, - 432, 480, 505, 432, 118, 437, 438, 432, - 432, 432, 444, 432, 461, 432, 461, 432, - 504, 432, 480, 480, 432, 118, 437, 438, - 432, 432, 432, 444, 432, 461, 432, 461, - 120, 432, 432, 136, 462, 432, 118, 437, - 438, 432, 432, 432, 444, 432, 461, 432, - 454, 455, 460, 460, 123, 118, 437, 438, - 432, 432, 432, 458, 432, 432, 440, 432, - 454, 455, 456, 460, 123, 118, 437, 438, - 432, 432, 151, 458, 432, 432, 440, 432, - 452, 432, 506, 432, 489, 489, 123, 118, - 437, 438, 432, 432, 432, 444, 432, 452, - 432, 452, 432, 432, 432, 480, 480, 432, - 118, 437, 438, 432, 432, 432, 444, 432, - 452, 432, 452, 432, 432, 432, 480, 507, - 432, 118, 437, 438, 432, 432, 432, 444, - 432, 452, 432, 452, 432, 506, 432, 480, - 480, 432, 118, 437, 438, 432, 432, 432, - 444, 432, 452, 432, 452, 120, 432, 432, - 136, 453, 432, 118, 437, 438, 432, 432, - 432, 444, 432, 452, 432, 445, 446, 451, - 451, 123, 118, 437, 438, 432, 432, 432, - 449, 432, 432, 440, 432, 445, 446, 447, - 451, 123, 118, 437, 438, 432, 432, 153, - 449, 432, 432, 440, 432, 442, 432, 508, - 432, 489, 489, 123, 118, 437, 438, 432, - 432, 432, 444, 432, 442, 432, 442, 432, - 432, 432, 480, 480, 432, 118, 437, 438, - 432, 432, 432, 444, 432, 442, 432, 442, - 432, 432, 432, 480, 509, 432, 118, 437, - 438, 432, 432, 432, 444, 432, 442, 432, - 442, 432, 508, 432, 480, 480, 432, 118, - 437, 438, 432, 432, 432, 444, 432, 442, - 432, 442, 120, 432, 432, 136, 443, 432, - 118, 437, 438, 432, 432, 432, 444, 432, - 442, 432, 433, 434, 436, 436, 123, 118, - 437, 438, 432, 432, 432, 439, 432, 432, - 440, 432, 188, 189, 190, 191, 510, 362, - 84, 79, 194, 195, 196, 196, 156, 197, - 360, 188, 200, 360, 203, 511, 205, 206, - 6, 1, 207, 208, 202, 202, 38, 209, - 202, 202, 210, 202, 213, 189, 190, 191, - 512, 513, 84, 157, 514, 515, 202, 196, - 156, 516, 202, 213, 200, 202, 116, 517, - 517, 84, 157, 207, 208, 202, 202, 156, - 518, 202, 519, 202, 202, 520, 514, 515, - 202, 514, 515, 202, 254, 202, 514, 521, - 202, 514, 522, 202, 514, 202, 519, 202, - 202, 202, 514, 515, 202, 523, 3, 360, - 360, 401, 430, 360, 79, 194, 195, 360, - 360, 360, 365, 360, 523, 360, 524, 367, - 525, 526, 84, 157, 514, 515, 202, 202, - 158, 370, 202, 202, 200, 202, 527, 367, - 528, 528, 84, 157, 514, 515, 202, 202, - 202, 370, 202, 202, 200, 202, 367, 528, - 528, 84, 157, 514, 515, 202, 202, 202, - 370, 202, 202, 200, 202, 524, 367, 528, - 528, 84, 157, 514, 515, 202, 202, 202, - 370, 202, 202, 200, 202, 524, 367, 525, - 528, 84, 157, 514, 515, 202, 202, 158, - 370, 202, 202, 200, 202, 213, 202, 279, - 116, 529, 529, 160, 157, 207, 208, 202, - 202, 202, 518, 202, 213, 202, 530, 184, - 531, 532, 162, 157, 514, 515, 202, 202, - 202, 533, 202, 184, 531, 532, 162, 157, - 514, 515, 202, 202, 202, 533, 202, 531, - 531, 162, 157, 514, 515, 202, 202, 202, - 533, 202, 534, 181, 535, 536, 165, 157, - 514, 515, 202, 202, 202, 533, 202, 181, - 535, 536, 165, 157, 514, 515, 202, 202, - 202, 533, 202, 535, 535, 165, 157, 514, - 515, 202, 202, 202, 533, 202, 537, 178, - 538, 539, 168, 157, 514, 515, 202, 202, - 202, 533, 202, 178, 538, 539, 168, 157, - 514, 515, 202, 202, 202, 533, 202, 538, - 538, 168, 157, 514, 515, 202, 202, 202, - 533, 202, 540, 175, 541, 542, 202, 157, - 514, 515, 202, 202, 202, 533, 202, 175, - 541, 542, 202, 157, 514, 515, 202, 202, - 202, 533, 202, 541, 541, 202, 157, 514, - 515, 202, 202, 202, 533, 202, 543, 202, - 544, 545, 202, 157, 514, 515, 202, 202, - 172, 202, 171, 202, 541, 541, 202, 157, - 514, 515, 202, 541, 541, 202, 157, 514, - 515, 202, 543, 202, 541, 541, 202, 157, - 514, 515, 202, 543, 202, 544, 541, 202, - 157, 514, 515, 202, 202, 172, 202, 523, - 171, 360, 360, 98, 364, 360, 79, 194, - 195, 360, 360, 360, 365, 360, 523, 360, - 547, 546, 548, 548, 546, 186, 549, 550, - 546, 548, 548, 546, 186, 549, 550, 546, - 551, 546, 546, 552, 549, 550, 546, 549, - 550, 546, 553, 546, 549, 554, 546, 549, - 555, 546, 549, 546, 551, 546, 546, 546, - 549, 550, 546, 0 + 197, 198, 199, 200, 201, 202, 187, 204, + 205, 206, 207, 6, 1, 208, 209, 203, + 203, 38, 210, 203, 203, 211, 203, 212, + 205, 213, 213, 6, 1, 208, 209, 203, + 203, 203, 210, 203, 203, 211, 203, 205, + 213, 213, 6, 1, 208, 209, 203, 203, + 203, 210, 203, 203, 211, 203, 214, 203, + 203, 203, 19, 215, 203, 1, 208, 209, + 203, 203, 203, 216, 203, 214, 203, 217, + 218, 219, 220, 6, 1, 208, 209, 203, + 203, 36, 221, 203, 203, 211, 203, 222, + 218, 223, 223, 6, 1, 208, 209, 203, + 203, 203, 221, 203, 203, 211, 203, 218, + 223, 223, 6, 1, 208, 209, 203, 203, + 203, 221, 203, 203, 211, 203, 224, 203, + 203, 203, 19, 225, 203, 1, 208, 209, + 203, 203, 203, 216, 203, 224, 203, 226, + 227, 228, 229, 6, 1, 208, 209, 203, + 203, 34, 230, 203, 203, 211, 203, 231, + 227, 232, 232, 6, 1, 208, 209, 203, + 203, 203, 230, 203, 203, 211, 203, 227, + 232, 232, 6, 1, 208, 209, 203, 203, + 203, 230, 203, 203, 211, 203, 233, 203, + 203, 203, 19, 234, 203, 1, 208, 209, + 203, 203, 203, 216, 203, 233, 203, 235, + 236, 237, 238, 6, 1, 208, 209, 203, + 203, 32, 239, 203, 203, 211, 203, 240, + 236, 241, 241, 6, 1, 208, 209, 203, + 203, 203, 239, 203, 203, 211, 203, 236, + 241, 241, 6, 1, 208, 209, 203, 203, + 203, 239, 203, 203, 211, 203, 242, 203, + 203, 203, 19, 243, 203, 1, 208, 209, + 203, 203, 203, 216, 203, 242, 203, 244, + 245, 246, 247, 6, 1, 208, 209, 203, + 203, 30, 248, 203, 203, 211, 203, 249, + 245, 250, 250, 6, 1, 208, 209, 203, + 203, 203, 248, 203, 203, 211, 203, 245, + 250, 250, 6, 1, 208, 209, 203, 203, + 203, 248, 203, 203, 211, 203, 19, 251, + 203, 1, 208, 209, 203, 203, 203, 216, + 203, 252, 252, 203, 1, 208, 209, 203, + 203, 203, 216, 203, 253, 203, 203, 254, + 208, 209, 203, 208, 209, 203, 255, 203, + 208, 256, 203, 208, 257, 203, 208, 203, + 253, 203, 203, 203, 208, 209, 203, 258, + 203, 259, 260, 203, 1, 208, 209, 203, + 203, 4, 203, 3, 203, 252, 252, 203, + 1, 208, 209, 203, 252, 252, 203, 1, + 208, 209, 203, 258, 203, 252, 252, 203, + 1, 208, 209, 203, 258, 203, 259, 252, + 203, 1, 208, 209, 203, 203, 4, 203, + 19, 203, 261, 261, 6, 1, 208, 209, + 203, 203, 203, 216, 203, 262, 28, 263, + 264, 9, 1, 208, 209, 203, 203, 203, + 216, 203, 28, 263, 264, 9, 1, 208, + 209, 203, 203, 203, 216, 203, 263, 263, + 9, 1, 208, 209, 203, 203, 203, 216, + 203, 265, 25, 266, 267, 12, 1, 208, + 209, 203, 203, 203, 216, 203, 25, 266, + 267, 12, 1, 208, 209, 203, 203, 203, + 216, 203, 266, 266, 12, 1, 208, 209, + 203, 203, 203, 216, 203, 268, 22, 269, + 270, 15, 1, 208, 209, 203, 203, 203, + 216, 203, 22, 269, 270, 15, 1, 208, + 209, 203, 203, 203, 216, 203, 269, 269, + 15, 1, 208, 209, 203, 203, 203, 216, + 203, 271, 19, 252, 272, 203, 1, 208, + 209, 203, 203, 203, 216, 203, 19, 252, + 272, 203, 1, 208, 209, 203, 203, 203, + 216, 203, 252, 273, 203, 1, 208, 209, + 203, 203, 203, 216, 203, 19, 203, 252, + 252, 203, 1, 208, 209, 203, 203, 203, + 216, 203, 2, 3, 203, 203, 19, 251, + 203, 1, 208, 209, 203, 203, 203, 216, + 203, 2, 203, 245, 250, 250, 6, 1, + 208, 209, 203, 203, 203, 248, 203, 244, + 245, 250, 250, 6, 1, 208, 209, 203, + 203, 203, 248, 203, 203, 211, 203, 244, + 245, 246, 250, 6, 1, 208, 209, 203, + 203, 30, 248, 203, 203, 211, 203, 242, + 203, 274, 203, 261, 261, 6, 1, 208, + 209, 203, 203, 203, 216, 203, 242, 203, + 242, 203, 203, 203, 252, 252, 203, 1, + 208, 209, 203, 203, 203, 216, 203, 242, + 203, 242, 203, 203, 203, 252, 275, 203, + 1, 208, 209, 203, 203, 203, 216, 203, + 242, 203, 242, 203, 274, 203, 252, 252, + 203, 1, 208, 209, 203, 203, 203, 216, + 203, 242, 203, 242, 3, 203, 203, 19, + 243, 203, 1, 208, 209, 203, 203, 203, + 216, 203, 242, 203, 235, 236, 241, 241, + 6, 1, 208, 209, 203, 203, 203, 239, + 203, 203, 211, 203, 235, 236, 237, 241, + 6, 1, 208, 209, 203, 203, 32, 239, + 203, 203, 211, 203, 233, 203, 276, 203, + 261, 261, 6, 1, 208, 209, 203, 203, + 203, 216, 203, 233, 203, 233, 203, 203, + 203, 252, 252, 203, 1, 208, 209, 203, + 203, 203, 216, 203, 233, 203, 233, 203, + 203, 203, 252, 277, 203, 1, 208, 209, + 203, 203, 203, 216, 203, 233, 203, 233, + 203, 276, 203, 252, 252, 203, 1, 208, + 209, 203, 203, 203, 216, 203, 233, 203, + 233, 3, 203, 203, 19, 234, 203, 1, + 208, 209, 203, 203, 203, 216, 203, 233, + 203, 226, 227, 232, 232, 6, 1, 208, + 209, 203, 203, 203, 230, 203, 203, 211, + 203, 226, 227, 228, 232, 6, 1, 208, + 209, 203, 203, 34, 230, 203, 203, 211, + 203, 224, 203, 278, 203, 261, 261, 6, + 1, 208, 209, 203, 203, 203, 216, 203, + 224, 203, 224, 203, 203, 203, 252, 252, + 203, 1, 208, 209, 203, 203, 203, 216, + 203, 224, 203, 224, 203, 203, 203, 252, + 279, 203, 1, 208, 209, 203, 203, 203, + 216, 203, 224, 203, 224, 203, 278, 203, + 252, 252, 203, 1, 208, 209, 203, 203, + 203, 216, 203, 224, 203, 224, 3, 203, + 203, 19, 225, 203, 1, 208, 209, 203, + 203, 203, 216, 203, 224, 203, 217, 218, + 223, 223, 6, 1, 208, 209, 203, 203, + 203, 221, 203, 203, 211, 203, 217, 218, + 219, 223, 6, 1, 208, 209, 203, 203, + 36, 221, 203, 203, 211, 203, 214, 203, + 280, 203, 261, 261, 6, 1, 208, 209, + 203, 203, 203, 216, 203, 214, 203, 214, + 203, 203, 203, 252, 252, 203, 1, 208, + 209, 203, 203, 203, 216, 203, 214, 203, + 214, 203, 203, 203, 252, 281, 203, 1, + 208, 209, 203, 203, 203, 216, 203, 214, + 203, 214, 203, 280, 203, 252, 252, 203, + 1, 208, 209, 203, 203, 203, 216, 203, + 214, 203, 214, 3, 203, 203, 19, 215, + 203, 1, 208, 209, 203, 203, 203, 216, + 203, 214, 203, 204, 205, 213, 213, 6, + 1, 208, 209, 203, 203, 203, 210, 203, + 203, 211, 203, 204, 205, 206, 213, 6, + 1, 208, 209, 203, 203, 38, 210, 203, + 203, 211, 203, 283, 284, 285, 286, 45, + 40, 287, 288, 282, 282, 77, 289, 282, + 282, 290, 282, 291, 284, 292, 286, 45, + 40, 287, 288, 282, 282, 282, 289, 282, + 282, 290, 282, 284, 292, 286, 45, 40, + 287, 288, 282, 282, 282, 289, 282, 282, + 290, 282, 293, 282, 282, 282, 58, 294, + 282, 40, 287, 288, 282, 282, 282, 295, + 282, 293, 282, 296, 297, 298, 299, 45, + 40, 287, 288, 282, 282, 75, 300, 282, + 282, 290, 282, 301, 297, 302, 302, 45, + 40, 287, 288, 282, 282, 282, 300, 282, + 282, 290, 282, 297, 302, 302, 45, 40, + 287, 288, 282, 282, 282, 300, 282, 282, + 290, 282, 303, 282, 282, 282, 58, 304, + 282, 40, 287, 288, 282, 282, 282, 295, + 282, 303, 282, 305, 306, 307, 308, 45, + 40, 287, 288, 282, 282, 73, 309, 282, + 282, 290, 282, 310, 306, 311, 311, 45, + 40, 287, 288, 282, 282, 282, 309, 282, + 282, 290, 282, 306, 311, 311, 45, 40, + 287, 288, 282, 282, 282, 309, 282, 282, + 290, 282, 312, 282, 282, 282, 58, 313, + 282, 40, 287, 288, 282, 282, 282, 295, + 282, 312, 282, 314, 315, 316, 317, 45, + 40, 287, 288, 282, 282, 71, 318, 282, + 282, 290, 282, 319, 315, 320, 320, 45, + 40, 287, 288, 282, 282, 282, 318, 282, + 282, 290, 282, 315, 320, 320, 45, 40, + 287, 288, 282, 282, 282, 318, 282, 282, + 290, 282, 321, 282, 282, 282, 58, 322, + 282, 40, 287, 288, 282, 282, 282, 295, + 282, 321, 282, 323, 324, 325, 326, 45, + 40, 287, 288, 282, 282, 69, 327, 282, + 282, 290, 282, 328, 324, 329, 329, 45, + 40, 287, 288, 282, 282, 282, 327, 282, + 282, 290, 282, 324, 329, 329, 45, 40, + 287, 288, 282, 282, 282, 327, 282, 282, + 290, 282, 58, 330, 282, 40, 287, 288, + 282, 282, 282, 295, 282, 331, 331, 282, + 40, 287, 288, 282, 282, 282, 295, 282, + 332, 282, 282, 333, 287, 288, 282, 287, + 288, 282, 334, 282, 287, 335, 282, 287, + 336, 282, 287, 282, 332, 282, 282, 282, + 287, 288, 282, 337, 282, 338, 339, 282, + 40, 287, 288, 282, 282, 43, 282, 42, + 282, 331, 331, 282, 40, 287, 288, 282, + 331, 331, 282, 40, 287, 288, 282, 337, + 282, 331, 331, 282, 40, 287, 288, 282, + 337, 282, 338, 331, 282, 40, 287, 288, + 282, 282, 43, 282, 58, 282, 340, 340, + 45, 40, 287, 288, 282, 282, 282, 295, + 282, 341, 67, 342, 343, 48, 40, 287, + 288, 282, 282, 282, 295, 282, 67, 342, + 343, 48, 40, 287, 288, 282, 282, 282, + 295, 282, 342, 342, 48, 40, 287, 288, + 282, 282, 282, 295, 282, 344, 64, 345, + 346, 51, 40, 287, 288, 282, 282, 282, + 295, 282, 64, 345, 346, 51, 40, 287, + 288, 282, 282, 282, 295, 282, 345, 345, + 51, 40, 287, 288, 282, 282, 282, 295, + 282, 347, 61, 348, 349, 54, 40, 287, + 288, 282, 282, 282, 295, 282, 61, 348, + 349, 54, 40, 287, 288, 282, 282, 282, + 295, 282, 348, 348, 54, 40, 287, 288, + 282, 282, 282, 295, 282, 350, 58, 331, + 351, 282, 40, 287, 288, 282, 282, 282, + 295, 282, 58, 331, 351, 282, 40, 287, + 288, 282, 282, 282, 295, 282, 331, 352, + 282, 40, 287, 288, 282, 282, 282, 295, + 282, 58, 282, 331, 331, 282, 40, 287, + 288, 282, 282, 282, 295, 282, 41, 42, + 282, 282, 58, 330, 282, 40, 287, 288, + 282, 282, 282, 295, 282, 41, 282, 324, + 329, 329, 45, 40, 287, 288, 282, 282, + 282, 327, 282, 323, 324, 329, 329, 45, + 40, 287, 288, 282, 282, 282, 327, 282, + 282, 290, 282, 323, 324, 325, 329, 45, + 40, 287, 288, 282, 282, 69, 327, 282, + 282, 290, 282, 321, 282, 353, 282, 340, + 340, 45, 40, 287, 288, 282, 282, 282, + 295, 282, 321, 282, 321, 282, 282, 282, + 331, 331, 282, 40, 287, 288, 282, 282, + 282, 295, 282, 321, 282, 321, 282, 282, + 282, 331, 354, 282, 40, 287, 288, 282, + 282, 282, 295, 282, 321, 282, 321, 282, + 353, 282, 331, 331, 282, 40, 287, 288, + 282, 282, 282, 295, 282, 321, 282, 321, + 42, 282, 282, 58, 322, 282, 40, 287, + 288, 282, 282, 282, 295, 282, 321, 282, + 314, 315, 320, 320, 45, 40, 287, 288, + 282, 282, 282, 318, 282, 282, 290, 282, + 314, 315, 316, 320, 45, 40, 287, 288, + 282, 282, 71, 318, 282, 282, 290, 282, + 312, 282, 355, 282, 340, 340, 45, 40, + 287, 288, 282, 282, 282, 295, 282, 312, + 282, 312, 282, 282, 282, 331, 331, 282, + 40, 287, 288, 282, 282, 282, 295, 282, + 312, 282, 312, 282, 282, 282, 331, 356, + 282, 40, 287, 288, 282, 282, 282, 295, + 282, 312, 282, 312, 282, 355, 282, 331, + 331, 282, 40, 287, 288, 282, 282, 282, + 295, 282, 312, 282, 312, 42, 282, 282, + 58, 313, 282, 40, 287, 288, 282, 282, + 282, 295, 282, 312, 282, 305, 306, 311, + 311, 45, 40, 287, 288, 282, 282, 282, + 309, 282, 282, 290, 282, 305, 306, 307, + 311, 45, 40, 287, 288, 282, 282, 73, + 309, 282, 282, 290, 282, 303, 282, 357, + 282, 340, 340, 45, 40, 287, 288, 282, + 282, 282, 295, 282, 303, 282, 303, 282, + 282, 282, 331, 331, 282, 40, 287, 288, + 282, 282, 282, 295, 282, 303, 282, 303, + 282, 282, 282, 331, 358, 282, 40, 287, + 288, 282, 282, 282, 295, 282, 303, 282, + 303, 282, 357, 282, 331, 331, 282, 40, + 287, 288, 282, 282, 282, 295, 282, 303, + 282, 303, 42, 282, 282, 58, 304, 282, + 40, 287, 288, 282, 282, 282, 295, 282, + 303, 282, 296, 297, 302, 302, 45, 40, + 287, 288, 282, 282, 282, 300, 282, 282, + 290, 282, 296, 297, 298, 302, 45, 40, + 287, 288, 282, 282, 75, 300, 282, 282, + 290, 282, 293, 282, 359, 282, 340, 340, + 45, 40, 287, 288, 282, 282, 282, 295, + 282, 293, 282, 293, 282, 282, 282, 331, + 331, 282, 40, 287, 288, 282, 282, 282, + 295, 282, 293, 282, 293, 282, 282, 282, + 331, 360, 282, 40, 287, 288, 282, 282, + 282, 295, 282, 293, 282, 293, 282, 359, + 282, 331, 331, 282, 40, 287, 288, 282, + 282, 282, 295, 282, 293, 282, 76, 44, + 44, 45, 40, 282, 282, 282, 282, 282, + 76, 282, 293, 42, 282, 282, 58, 294, + 282, 40, 287, 288, 282, 282, 282, 295, + 282, 293, 282, 283, 284, 292, 286, 45, + 40, 287, 288, 282, 282, 282, 289, 282, + 282, 290, 282, 362, 191, 363, 363, 84, + 79, 194, 195, 361, 361, 361, 197, 361, + 361, 200, 361, 191, 363, 363, 84, 79, + 194, 195, 361, 361, 361, 197, 361, 361, + 200, 361, 364, 361, 361, 361, 98, 365, + 361, 79, 194, 195, 361, 361, 361, 366, + 361, 364, 361, 367, 368, 369, 370, 84, + 79, 194, 195, 361, 361, 115, 371, 361, + 361, 200, 361, 372, 368, 373, 373, 84, + 79, 194, 195, 361, 361, 361, 371, 361, + 361, 200, 361, 368, 373, 373, 84, 79, + 194, 195, 361, 361, 361, 371, 361, 361, + 200, 361, 374, 361, 361, 361, 98, 375, + 361, 79, 194, 195, 361, 361, 361, 366, + 361, 374, 361, 376, 377, 378, 379, 84, + 79, 194, 195, 361, 361, 113, 380, 361, + 361, 200, 361, 381, 377, 382, 382, 84, + 79, 194, 195, 361, 361, 361, 380, 361, + 361, 200, 361, 377, 382, 382, 84, 79, + 194, 195, 361, 361, 361, 380, 361, 361, + 200, 361, 383, 361, 361, 361, 98, 384, + 361, 79, 194, 195, 361, 361, 361, 366, + 361, 383, 361, 385, 386, 387, 388, 84, + 79, 194, 195, 361, 361, 111, 389, 361, + 361, 200, 361, 390, 386, 391, 391, 84, + 79, 194, 195, 361, 361, 361, 389, 361, + 361, 200, 361, 386, 391, 391, 84, 79, + 194, 195, 361, 361, 361, 389, 361, 361, + 200, 361, 392, 361, 361, 361, 98, 393, + 361, 79, 194, 195, 361, 361, 361, 366, + 361, 392, 361, 394, 395, 396, 397, 84, + 79, 194, 195, 361, 361, 109, 398, 361, + 361, 200, 361, 399, 395, 400, 400, 84, + 79, 194, 195, 361, 361, 361, 398, 361, + 361, 200, 361, 395, 400, 400, 84, 79, + 194, 195, 361, 361, 361, 398, 361, 361, + 200, 361, 98, 401, 361, 79, 194, 195, + 361, 361, 361, 366, 361, 402, 402, 361, + 79, 194, 195, 361, 361, 361, 366, 361, + 403, 361, 361, 404, 194, 195, 361, 194, + 195, 361, 405, 361, 194, 406, 361, 194, + 407, 361, 194, 361, 403, 361, 361, 361, + 194, 195, 361, 408, 361, 409, 410, 361, + 79, 194, 195, 361, 361, 82, 361, 81, + 361, 402, 402, 361, 79, 194, 195, 361, + 402, 402, 361, 79, 194, 195, 361, 408, + 361, 402, 402, 361, 79, 194, 195, 361, + 408, 361, 409, 402, 361, 79, 194, 195, + 361, 361, 82, 361, 98, 361, 411, 411, + 84, 79, 194, 195, 361, 361, 361, 366, + 361, 412, 107, 413, 414, 88, 79, 194, + 195, 361, 361, 361, 366, 361, 107, 413, + 414, 88, 79, 194, 195, 361, 361, 361, + 366, 361, 413, 413, 88, 79, 194, 195, + 361, 361, 361, 366, 361, 415, 104, 416, + 417, 91, 79, 194, 195, 361, 361, 361, + 366, 361, 104, 416, 417, 91, 79, 194, + 195, 361, 361, 361, 366, 361, 416, 416, + 91, 79, 194, 195, 361, 361, 361, 366, + 361, 418, 101, 419, 420, 94, 79, 194, + 195, 361, 361, 361, 366, 361, 101, 419, + 420, 94, 79, 194, 195, 361, 361, 361, + 366, 361, 419, 419, 94, 79, 194, 195, + 361, 361, 361, 366, 361, 421, 98, 402, + 422, 361, 79, 194, 195, 361, 361, 361, + 366, 361, 98, 402, 422, 361, 79, 194, + 195, 361, 361, 361, 366, 361, 402, 423, + 361, 79, 194, 195, 361, 361, 361, 366, + 361, 98, 361, 402, 402, 361, 79, 194, + 195, 361, 361, 361, 366, 361, 80, 81, + 361, 361, 98, 401, 361, 79, 194, 195, + 361, 361, 361, 366, 361, 80, 361, 395, + 400, 400, 84, 79, 194, 195, 361, 361, + 361, 398, 361, 394, 395, 400, 400, 84, + 79, 194, 195, 361, 361, 361, 398, 361, + 361, 200, 361, 394, 395, 396, 400, 84, + 79, 194, 195, 361, 361, 109, 398, 361, + 361, 200, 361, 392, 361, 424, 361, 411, + 411, 84, 79, 194, 195, 361, 361, 361, + 366, 361, 392, 361, 392, 361, 361, 361, + 402, 402, 361, 79, 194, 195, 361, 361, + 361, 366, 361, 392, 361, 392, 361, 361, + 361, 402, 425, 361, 79, 194, 195, 361, + 361, 361, 366, 361, 392, 361, 392, 361, + 424, 361, 402, 402, 361, 79, 194, 195, + 361, 361, 361, 366, 361, 392, 361, 392, + 81, 361, 361, 98, 393, 361, 79, 194, + 195, 361, 361, 361, 366, 361, 392, 361, + 385, 386, 391, 391, 84, 79, 194, 195, + 361, 361, 361, 389, 361, 361, 200, 361, + 385, 386, 387, 391, 84, 79, 194, 195, + 361, 361, 111, 389, 361, 361, 200, 361, + 383, 361, 426, 361, 411, 411, 84, 79, + 194, 195, 361, 361, 361, 366, 361, 383, + 361, 383, 361, 361, 361, 402, 402, 361, + 79, 194, 195, 361, 361, 361, 366, 361, + 383, 361, 383, 361, 361, 361, 402, 427, + 361, 79, 194, 195, 361, 361, 361, 366, + 361, 383, 361, 383, 361, 426, 361, 402, + 402, 361, 79, 194, 195, 361, 361, 361, + 366, 361, 383, 361, 383, 81, 361, 361, + 98, 384, 361, 79, 194, 195, 361, 361, + 361, 366, 361, 383, 361, 376, 377, 382, + 382, 84, 79, 194, 195, 361, 361, 361, + 380, 361, 361, 200, 361, 376, 377, 378, + 382, 84, 79, 194, 195, 361, 361, 113, + 380, 361, 361, 200, 361, 374, 361, 428, + 361, 411, 411, 84, 79, 194, 195, 361, + 361, 361, 366, 361, 374, 361, 374, 361, + 361, 361, 402, 402, 361, 79, 194, 195, + 361, 361, 361, 366, 361, 374, 361, 374, + 361, 361, 361, 402, 429, 361, 79, 194, + 195, 361, 361, 361, 366, 361, 374, 361, + 374, 361, 428, 361, 402, 402, 361, 79, + 194, 195, 361, 361, 361, 366, 361, 374, + 361, 374, 81, 361, 361, 98, 375, 361, + 79, 194, 195, 361, 361, 361, 366, 361, + 374, 361, 367, 368, 373, 373, 84, 79, + 194, 195, 361, 361, 361, 371, 361, 361, + 200, 361, 367, 368, 369, 373, 84, 79, + 194, 195, 361, 361, 115, 371, 361, 361, + 200, 361, 364, 361, 430, 361, 411, 411, + 84, 79, 194, 195, 361, 361, 361, 366, + 361, 364, 361, 364, 361, 361, 361, 402, + 402, 361, 79, 194, 195, 361, 361, 361, + 366, 361, 364, 361, 364, 361, 361, 361, + 402, 431, 361, 79, 194, 195, 361, 361, + 361, 366, 361, 364, 361, 364, 361, 430, + 361, 402, 402, 361, 79, 194, 195, 361, + 361, 361, 366, 361, 364, 361, 364, 81, + 361, 361, 98, 365, 361, 79, 194, 195, + 361, 361, 361, 366, 361, 364, 361, 116, + 83, 83, 84, 79, 432, 432, 432, 432, + 156, 116, 432, 190, 191, 363, 363, 84, + 79, 194, 195, 361, 361, 361, 197, 361, + 361, 200, 361, 116, 83, 83, 84, 79, + 432, 432, 432, 432, 432, 116, 432, 434, + 435, 436, 437, 123, 118, 438, 439, 433, + 433, 155, 440, 433, 433, 441, 433, 442, + 435, 437, 437, 123, 118, 438, 439, 433, + 433, 433, 440, 433, 433, 441, 433, 435, + 437, 437, 123, 118, 438, 439, 433, 433, + 433, 440, 433, 433, 441, 433, 443, 433, + 433, 433, 136, 444, 433, 118, 438, 439, + 433, 433, 433, 445, 433, 443, 433, 446, + 447, 448, 449, 123, 118, 438, 439, 433, + 433, 153, 450, 433, 433, 441, 433, 451, + 447, 452, 452, 123, 118, 438, 439, 433, + 433, 433, 450, 433, 433, 441, 433, 447, + 452, 452, 123, 118, 438, 439, 433, 433, + 433, 450, 433, 433, 441, 433, 453, 433, + 433, 433, 136, 454, 433, 118, 438, 439, + 433, 433, 433, 445, 433, 453, 433, 455, + 456, 457, 458, 123, 118, 438, 439, 433, + 433, 151, 459, 433, 433, 441, 433, 460, + 456, 461, 461, 123, 118, 438, 439, 433, + 433, 433, 459, 433, 433, 441, 433, 456, + 461, 461, 123, 118, 438, 439, 433, 433, + 433, 459, 433, 433, 441, 433, 462, 433, + 433, 433, 136, 463, 433, 118, 438, 439, + 433, 433, 433, 445, 433, 462, 433, 464, + 465, 466, 467, 123, 118, 438, 439, 433, + 433, 149, 468, 433, 433, 441, 433, 469, + 465, 470, 470, 123, 118, 438, 439, 433, + 433, 433, 468, 433, 433, 441, 433, 465, + 470, 470, 123, 118, 438, 439, 433, 433, + 433, 468, 433, 433, 441, 433, 471, 433, + 433, 433, 136, 472, 433, 118, 438, 439, + 433, 433, 433, 445, 433, 471, 433, 473, + 474, 475, 476, 123, 118, 438, 439, 433, + 433, 147, 477, 433, 433, 441, 433, 478, + 474, 479, 479, 123, 118, 438, 439, 433, + 433, 433, 477, 433, 433, 441, 433, 474, + 479, 479, 123, 118, 438, 439, 433, 433, + 433, 477, 433, 433, 441, 433, 136, 480, + 433, 118, 438, 439, 433, 433, 433, 445, + 433, 481, 481, 433, 118, 438, 439, 433, + 433, 433, 445, 433, 482, 433, 433, 483, + 438, 439, 433, 438, 439, 433, 484, 433, + 438, 485, 433, 438, 486, 433, 438, 433, + 482, 433, 433, 433, 438, 439, 433, 487, + 433, 488, 489, 433, 118, 438, 439, 433, + 433, 121, 433, 120, 433, 481, 481, 433, + 118, 438, 439, 433, 481, 481, 433, 118, + 438, 439, 433, 487, 433, 481, 481, 433, + 118, 438, 439, 433, 487, 433, 488, 481, + 433, 118, 438, 439, 433, 433, 121, 433, + 136, 433, 490, 490, 123, 118, 438, 439, + 433, 433, 433, 445, 433, 491, 145, 492, + 493, 126, 118, 438, 439, 433, 433, 433, + 445, 433, 145, 492, 493, 126, 118, 438, + 439, 433, 433, 433, 445, 433, 492, 492, + 126, 118, 438, 439, 433, 433, 433, 445, + 433, 494, 142, 495, 496, 129, 118, 438, + 439, 433, 433, 433, 445, 433, 142, 495, + 496, 129, 118, 438, 439, 433, 433, 433, + 445, 433, 495, 495, 129, 118, 438, 439, + 433, 433, 433, 445, 433, 497, 139, 498, + 499, 132, 118, 438, 439, 433, 433, 433, + 445, 433, 139, 498, 499, 132, 118, 438, + 439, 433, 433, 433, 445, 433, 498, 498, + 132, 118, 438, 439, 433, 433, 433, 445, + 433, 500, 136, 481, 501, 433, 118, 438, + 439, 433, 433, 433, 445, 433, 136, 481, + 501, 433, 118, 438, 439, 433, 433, 433, + 445, 433, 481, 502, 433, 118, 438, 439, + 433, 433, 433, 445, 433, 136, 433, 481, + 481, 433, 118, 438, 439, 433, 433, 433, + 445, 433, 119, 120, 433, 433, 136, 480, + 433, 118, 438, 439, 433, 433, 433, 445, + 433, 119, 433, 474, 479, 479, 123, 118, + 438, 439, 433, 433, 433, 477, 433, 473, + 474, 479, 479, 123, 118, 438, 439, 433, + 433, 433, 477, 433, 433, 441, 433, 473, + 474, 475, 479, 123, 118, 438, 439, 433, + 433, 147, 477, 433, 433, 441, 433, 471, + 433, 503, 433, 490, 490, 123, 118, 438, + 439, 433, 433, 433, 445, 433, 471, 433, + 471, 433, 433, 433, 481, 481, 433, 118, + 438, 439, 433, 433, 433, 445, 433, 471, + 433, 471, 433, 433, 433, 481, 504, 433, + 118, 438, 439, 433, 433, 433, 445, 433, + 471, 433, 471, 433, 503, 433, 481, 481, + 433, 118, 438, 439, 433, 433, 433, 445, + 433, 471, 433, 471, 120, 433, 433, 136, + 472, 433, 118, 438, 439, 433, 433, 433, + 445, 433, 471, 433, 464, 465, 470, 470, + 123, 118, 438, 439, 433, 433, 433, 468, + 433, 433, 441, 433, 464, 465, 466, 470, + 123, 118, 438, 439, 433, 433, 149, 468, + 433, 433, 441, 433, 462, 433, 505, 433, + 490, 490, 123, 118, 438, 439, 433, 433, + 433, 445, 433, 462, 433, 462, 433, 433, + 433, 481, 481, 433, 118, 438, 439, 433, + 433, 433, 445, 433, 462, 433, 462, 433, + 433, 433, 481, 506, 433, 118, 438, 439, + 433, 433, 433, 445, 433, 462, 433, 462, + 433, 505, 433, 481, 481, 433, 118, 438, + 439, 433, 433, 433, 445, 433, 462, 433, + 462, 120, 433, 433, 136, 463, 433, 118, + 438, 439, 433, 433, 433, 445, 433, 462, + 433, 455, 456, 461, 461, 123, 118, 438, + 439, 433, 433, 433, 459, 433, 433, 441, + 433, 455, 456, 457, 461, 123, 118, 438, + 439, 433, 433, 151, 459, 433, 433, 441, + 433, 453, 433, 507, 433, 490, 490, 123, + 118, 438, 439, 433, 433, 433, 445, 433, + 453, 433, 453, 433, 433, 433, 481, 481, + 433, 118, 438, 439, 433, 433, 433, 445, + 433, 453, 433, 453, 433, 433, 433, 481, + 508, 433, 118, 438, 439, 433, 433, 433, + 445, 433, 453, 433, 453, 433, 507, 433, + 481, 481, 433, 118, 438, 439, 433, 433, + 433, 445, 433, 453, 433, 453, 120, 433, + 433, 136, 454, 433, 118, 438, 439, 433, + 433, 433, 445, 433, 453, 433, 446, 447, + 452, 452, 123, 118, 438, 439, 433, 433, + 433, 450, 433, 433, 441, 433, 446, 447, + 448, 452, 123, 118, 438, 439, 433, 433, + 153, 450, 433, 433, 441, 433, 443, 433, + 509, 433, 490, 490, 123, 118, 438, 439, + 433, 433, 433, 445, 433, 443, 433, 443, + 433, 433, 433, 481, 481, 433, 118, 438, + 439, 433, 433, 433, 445, 433, 443, 433, + 443, 433, 433, 433, 481, 510, 433, 118, + 438, 439, 433, 433, 433, 445, 433, 443, + 433, 443, 433, 509, 433, 481, 481, 433, + 118, 438, 439, 433, 433, 433, 445, 433, + 443, 433, 443, 120, 433, 433, 136, 444, + 433, 118, 438, 439, 433, 433, 433, 445, + 433, 443, 433, 434, 435, 437, 437, 123, + 118, 438, 439, 433, 433, 433, 440, 433, + 433, 441, 433, 188, 189, 190, 191, 511, + 363, 84, 79, 194, 195, 196, 196, 156, + 197, 361, 188, 200, 361, 204, 512, 206, + 207, 6, 1, 208, 209, 203, 203, 38, + 210, 203, 203, 211, 203, 214, 189, 190, + 191, 513, 514, 84, 157, 515, 516, 203, + 196, 156, 517, 203, 214, 200, 203, 116, + 518, 518, 84, 157, 208, 209, 203, 203, + 156, 519, 203, 520, 203, 203, 521, 515, + 516, 203, 515, 516, 203, 255, 203, 515, + 522, 203, 515, 523, 203, 515, 203, 520, + 203, 203, 203, 515, 516, 203, 524, 3, + 361, 361, 402, 431, 361, 79, 194, 195, + 361, 361, 361, 366, 361, 524, 361, 525, + 368, 526, 527, 84, 157, 515, 516, 203, + 203, 158, 371, 203, 203, 200, 203, 528, + 368, 529, 529, 84, 157, 515, 516, 203, + 203, 203, 371, 203, 203, 200, 203, 368, + 529, 529, 84, 157, 515, 516, 203, 203, + 203, 371, 203, 203, 200, 203, 525, 368, + 529, 529, 84, 157, 515, 516, 203, 203, + 203, 371, 203, 203, 200, 203, 525, 368, + 526, 529, 84, 157, 515, 516, 203, 203, + 158, 371, 203, 203, 200, 203, 214, 203, + 280, 116, 530, 530, 160, 157, 208, 209, + 203, 203, 203, 519, 203, 214, 203, 531, + 184, 532, 533, 162, 157, 515, 516, 203, + 203, 203, 534, 203, 184, 532, 533, 162, + 157, 515, 516, 203, 203, 203, 534, 203, + 532, 532, 162, 157, 515, 516, 203, 203, + 203, 534, 203, 535, 181, 536, 537, 165, + 157, 515, 516, 203, 203, 203, 534, 203, + 181, 536, 537, 165, 157, 515, 516, 203, + 203, 203, 534, 203, 536, 536, 165, 157, + 515, 516, 203, 203, 203, 534, 203, 538, + 178, 539, 540, 168, 157, 515, 516, 203, + 203, 203, 534, 203, 178, 539, 540, 168, + 157, 515, 516, 203, 203, 203, 534, 203, + 539, 539, 168, 157, 515, 516, 203, 203, + 203, 534, 203, 541, 175, 542, 543, 203, + 157, 515, 516, 203, 203, 203, 534, 203, + 175, 542, 543, 203, 157, 515, 516, 203, + 203, 203, 534, 203, 542, 542, 203, 157, + 515, 516, 203, 203, 203, 534, 203, 544, + 203, 545, 546, 203, 157, 515, 516, 203, + 203, 172, 203, 171, 203, 542, 542, 203, + 157, 515, 516, 203, 542, 542, 203, 157, + 515, 516, 203, 544, 203, 542, 542, 203, + 157, 515, 516, 203, 544, 203, 545, 542, + 203, 157, 515, 516, 203, 203, 172, 203, + 524, 171, 361, 361, 98, 365, 361, 79, + 194, 195, 361, 361, 361, 366, 361, 524, + 361, 548, 547, 549, 549, 547, 186, 550, + 551, 547, 549, 549, 547, 186, 550, 551, + 547, 552, 547, 547, 553, 550, 551, 547, + 550, 551, 547, 554, 547, 550, 555, 547, + 550, 556, 547, 550, 547, 552, 547, 547, + 547, 550, 551, 547, 188, 432, 432, 432, + 432, 432, 432, 432, 432, 432, 196, 432, + 432, 432, 432, 188, 432, 0 }; static const short _indic_syllable_machine_trans_targs[] = { @@ -1014,51 +1016,51 @@ static const short _indic_syllable_machine_trans_targs[] = { 169, 170, 520, 172, 173, 517, 175, 176, 514, 178, 532, 178, 179, 258, 337, 339, 413, 415, 359, 360, 416, 412, 494, 495, - 384, 530, 178, 180, 182, 36, 257, 202, - 203, 255, 227, 181, 35, 183, 251, 1, - 184, 186, 34, 250, 248, 185, 33, 187, - 244, 188, 190, 32, 243, 241, 189, 31, - 191, 237, 192, 194, 30, 236, 234, 193, - 29, 195, 230, 196, 198, 28, 229, 226, - 197, 27, 212, 0, 201, 206, 178, 204, - 205, 208, 2, 211, 3, 214, 6, 24, - 217, 9, 21, 220, 12, 18, 223, 15, - 225, 231, 233, 238, 240, 245, 247, 252, - 254, 178, 259, 261, 73, 334, 281, 282, - 335, 306, 260, 72, 262, 330, 38, 263, - 265, 71, 329, 327, 264, 70, 266, 323, - 267, 269, 69, 322, 320, 268, 68, 270, - 316, 271, 273, 67, 315, 313, 272, 66, - 274, 309, 275, 277, 65, 308, 305, 276, - 64, 291, 37, 280, 285, 178, 283, 284, - 287, 39, 290, 40, 293, 43, 61, 296, - 46, 58, 299, 49, 55, 302, 52, 304, - 310, 312, 317, 319, 324, 326, 331, 333, - 178, 338, 109, 340, 408, 75, 341, 343, - 108, 407, 405, 342, 107, 344, 401, 345, - 347, 106, 400, 398, 346, 105, 348, 394, - 349, 351, 104, 393, 391, 350, 103, 352, - 387, 353, 355, 102, 386, 383, 354, 101, - 369, 74, 358, 363, 178, 361, 362, 365, - 76, 368, 77, 371, 80, 98, 374, 83, - 95, 377, 86, 92, 380, 89, 382, 388, - 390, 395, 397, 402, 404, 409, 411, 178, - 178, 417, 419, 146, 145, 439, 440, 492, - 464, 418, 420, 488, 111, 421, 423, 144, - 487, 485, 422, 143, 424, 481, 425, 427, - 142, 480, 478, 426, 141, 428, 474, 429, - 431, 140, 473, 471, 430, 139, 432, 467, - 433, 435, 138, 466, 463, 434, 137, 449, - 110, 438, 443, 178, 441, 442, 445, 112, - 448, 113, 451, 116, 134, 454, 119, 131, - 457, 122, 128, 460, 125, 462, 468, 470, - 475, 477, 482, 484, 489, 491, 147, 496, - 497, 511, 500, 501, 529, 148, 505, 499, - 504, 502, 503, 506, 507, 150, 510, 508, - 149, 151, 513, 153, 174, 163, 516, 156, - 171, 519, 159, 168, 522, 162, 165, 525, - 164, 528, 178, 531, 177, 534, 535, 533, - 538, 178, 536, 537 + 384, 530, 539, 178, 180, 182, 36, 257, + 202, 203, 255, 227, 181, 35, 183, 251, + 1, 184, 186, 34, 250, 248, 185, 33, + 187, 244, 188, 190, 32, 243, 241, 189, + 31, 191, 237, 192, 194, 30, 236, 234, + 193, 29, 195, 230, 196, 198, 28, 229, + 226, 197, 27, 212, 0, 201, 206, 178, + 204, 205, 208, 2, 211, 3, 214, 6, + 24, 217, 9, 21, 220, 12, 18, 223, + 15, 225, 231, 233, 238, 240, 245, 247, + 252, 254, 178, 259, 261, 73, 334, 281, + 282, 335, 306, 260, 72, 262, 330, 38, + 263, 265, 71, 329, 327, 264, 70, 266, + 323, 267, 269, 69, 322, 320, 268, 68, + 270, 316, 271, 273, 67, 315, 313, 272, + 66, 274, 309, 275, 277, 65, 308, 305, + 276, 64, 291, 37, 280, 285, 178, 283, + 284, 287, 39, 290, 40, 293, 43, 61, + 296, 46, 58, 299, 49, 55, 302, 52, + 304, 310, 312, 317, 319, 324, 326, 331, + 333, 178, 338, 109, 340, 408, 75, 341, + 343, 108, 407, 405, 342, 107, 344, 401, + 345, 347, 106, 400, 398, 346, 105, 348, + 394, 349, 351, 104, 393, 391, 350, 103, + 352, 387, 353, 355, 102, 386, 383, 354, + 101, 369, 74, 358, 363, 178, 361, 362, + 365, 76, 368, 77, 371, 80, 98, 374, + 83, 95, 377, 86, 92, 380, 89, 382, + 388, 390, 395, 397, 402, 404, 409, 411, + 178, 178, 417, 419, 146, 145, 439, 440, + 492, 464, 418, 420, 488, 111, 421, 423, + 144, 487, 485, 422, 143, 424, 481, 425, + 427, 142, 480, 478, 426, 141, 428, 474, + 429, 431, 140, 473, 471, 430, 139, 432, + 467, 433, 435, 138, 466, 463, 434, 137, + 449, 110, 438, 443, 178, 441, 442, 445, + 112, 448, 113, 451, 116, 134, 454, 119, + 131, 457, 122, 128, 460, 125, 462, 468, + 470, 475, 477, 482, 484, 489, 491, 147, + 496, 497, 511, 500, 501, 529, 148, 505, + 499, 504, 502, 503, 506, 507, 150, 510, + 508, 149, 151, 513, 153, 174, 163, 516, + 156, 171, 519, 159, 168, 522, 162, 165, + 525, 164, 528, 178, 531, 177, 534, 535, + 533, 538, 178, 536, 537 }; static const char _indic_syllable_machine_trans_actions[] = { @@ -1087,51 +1089,51 @@ static const char _indic_syllable_machine_trans_actions[] = { 0, 0, 2, 0, 0, 2, 0, 0, 2, 9, 0, 12, 2, 2, 6, 2, 13, 13, 0, 0, 2, 2, 6, 2, - 6, 2, 14, 2, 2, 0, 2, 0, + 6, 2, 0, 14, 2, 2, 0, 2, + 0, 0, 2, 2, 2, 0, 2, 2, + 0, 2, 2, 0, 2, 2, 2, 0, + 2, 2, 2, 2, 0, 2, 2, 2, + 0, 2, 2, 2, 2, 0, 2, 2, + 2, 0, 2, 2, 2, 2, 0, 2, + 2, 2, 0, 2, 0, 0, 0, 15, + 0, 0, 2, 0, 2, 0, 2, 0, + 0, 2, 0, 0, 2, 0, 0, 2, + 0, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 16, 2, 2, 0, 2, 0, 0, 2, 2, 2, 0, 2, 2, 0, 2, 2, 0, 2, 2, 2, 0, 2, 2, 2, 2, 0, 2, 2, 2, 0, 2, 2, 2, 2, 0, 2, 2, 2, 0, 2, 2, 2, 2, 0, 2, 2, - 2, 0, 2, 0, 0, 0, 15, 0, + 2, 0, 2, 0, 0, 0, 17, 0, 0, 2, 0, 2, 0, 2, 0, 0, 2, 0, 0, 2, 0, 0, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 16, 2, 2, 0, 2, 0, 0, - 2, 2, 2, 0, 2, 2, 0, 2, - 2, 0, 2, 2, 2, 0, 2, 2, - 2, 2, 0, 2, 2, 2, 0, 2, - 2, 2, 2, 0, 2, 2, 2, 0, - 2, 2, 2, 2, 0, 2, 2, 2, - 0, 2, 0, 0, 0, 17, 0, 0, - 2, 0, 2, 0, 2, 0, 0, 2, - 0, 0, 2, 0, 0, 2, 0, 2, - 2, 2, 2, 2, 2, 2, 2, 2, - 18, 6, 0, 6, 6, 0, 6, 2, - 0, 6, 2, 6, 0, 6, 6, 6, + 2, 18, 6, 0, 6, 6, 0, 6, 2, 0, 6, 2, 6, 0, 6, 6, 6, 2, 0, 6, 2, 6, 0, 6, 6, 6, 2, 0, 6, 2, 6, 0, - 6, 0, 0, 0, 19, 0, 0, 2, - 0, 2, 0, 2, 0, 0, 2, 0, - 0, 2, 0, 0, 2, 0, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 20, - 21, 2, 2, 0, 0, 0, 0, 2, - 2, 2, 2, 2, 0, 2, 2, 0, - 2, 2, 2, 0, 2, 2, 2, 2, + 6, 6, 6, 2, 0, 6, 2, 6, + 0, 6, 0, 0, 0, 19, 0, 0, + 2, 0, 2, 0, 2, 0, 0, 2, + 0, 0, 2, 0, 0, 2, 0, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 20, 21, 2, 2, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 0, 2, 2, 0, 2, 2, 2, 0, 2, 2, 2, 2, 0, 2, 2, 2, 0, 2, 2, 2, 2, 0, 2, 2, 2, 0, 2, - 0, 0, 0, 22, 0, 0, 2, 0, - 2, 0, 2, 0, 0, 2, 0, 0, - 2, 0, 0, 2, 0, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 0, 0, - 8, 2, 0, 0, 2, 0, 2, 0, - 0, 0, 0, 8, 8, 0, 8, 8, - 0, 0, 2, 0, 0, 0, 2, 0, - 0, 2, 0, 0, 2, 0, 0, 2, - 0, 2, 23, 2, 0, 0, 0, 0, - 0, 24, 0, 0 + 2, 2, 2, 0, 2, 2, 2, 0, + 2, 0, 0, 0, 22, 0, 0, 2, + 0, 2, 0, 2, 0, 0, 2, 0, + 0, 2, 0, 0, 2, 0, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 0, + 0, 8, 2, 0, 0, 2, 0, 2, + 0, 0, 0, 0, 8, 8, 0, 8, + 8, 0, 0, 2, 0, 0, 0, 2, + 0, 0, 2, 0, 0, 2, 0, 0, + 2, 0, 2, 23, 2, 0, 0, 0, + 0, 0, 24, 0, 0 }; static const char _indic_syllable_machine_to_state_actions[] = { @@ -1202,7 +1204,7 @@ static const char _indic_syllable_machine_to_state_actions[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0 + 0, 0, 0, 0 }; static const char _indic_syllable_machine_from_state_actions[] = { @@ -1273,7 +1275,7 @@ static const char _indic_syllable_machine_from_state_actions[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0 + 0, 0, 0, 0 }; static const short _indic_syllable_machine_eof_trans[] = { @@ -1299,52 +1301,52 @@ static const short _indic_syllable_machine_eof_trans[] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 186, 0, 203, 203, 203, 203, 203, - 203, 203, 203, 203, 203, 203, 203, 203, - 203, 203, 203, 203, 203, 203, 203, 203, - 203, 203, 203, 203, 203, 203, 203, 203, - 203, 203, 203, 203, 203, 203, 203, 203, - 203, 203, 203, 203, 203, 203, 203, 203, - 203, 203, 203, 203, 203, 203, 203, 203, - 203, 203, 203, 203, 203, 203, 203, 203, - 203, 203, 203, 203, 203, 203, 203, 203, - 203, 203, 203, 203, 203, 203, 203, 203, - 203, 203, 282, 282, 282, 282, 282, 282, - 282, 282, 282, 282, 282, 282, 282, 282, - 282, 282, 282, 282, 282, 282, 282, 282, - 282, 282, 282, 282, 282, 282, 282, 282, - 282, 282, 282, 282, 282, 282, 282, 282, - 282, 282, 282, 282, 282, 282, 282, 282, - 282, 282, 282, 282, 282, 282, 282, 282, - 282, 282, 282, 282, 282, 282, 282, 282, - 282, 282, 282, 282, 282, 282, 282, 282, - 282, 282, 282, 282, 282, 282, 282, 282, - 282, 361, 361, 361, 361, 361, 361, 361, - 361, 361, 361, 361, 361, 361, 361, 361, - 361, 361, 361, 361, 361, 361, 361, 361, - 361, 361, 361, 361, 361, 361, 361, 361, - 361, 361, 361, 361, 361, 361, 361, 361, - 361, 361, 361, 361, 361, 361, 361, 361, - 361, 361, 361, 361, 361, 361, 361, 361, - 361, 361, 361, 361, 361, 361, 361, 361, - 361, 361, 361, 361, 361, 361, 361, 361, - 361, 361, 361, 361, 361, 432, 361, 432, - 433, 433, 433, 433, 433, 433, 433, 433, - 433, 433, 433, 433, 433, 433, 433, 433, - 433, 433, 433, 433, 433, 433, 433, 433, - 433, 433, 433, 433, 433, 433, 433, 433, - 433, 433, 433, 433, 433, 433, 433, 433, - 433, 433, 433, 433, 433, 433, 433, 433, - 433, 433, 433, 433, 433, 433, 433, 433, - 433, 433, 433, 433, 433, 433, 433, 433, - 433, 433, 433, 433, 433, 433, 433, 433, - 433, 433, 433, 433, 433, 433, 361, 203, - 203, 203, 203, 203, 203, 203, 203, 203, - 203, 361, 203, 203, 203, 203, 203, 203, - 203, 203, 203, 203, 203, 203, 203, 203, - 203, 203, 203, 203, 203, 203, 203, 203, - 203, 361, 547, 547, 547, 547, 547, 547, - 547, 547, 547 + 1, 186, 0, 204, 204, 204, 204, 204, + 204, 204, 204, 204, 204, 204, 204, 204, + 204, 204, 204, 204, 204, 204, 204, 204, + 204, 204, 204, 204, 204, 204, 204, 204, + 204, 204, 204, 204, 204, 204, 204, 204, + 204, 204, 204, 204, 204, 204, 204, 204, + 204, 204, 204, 204, 204, 204, 204, 204, + 204, 204, 204, 204, 204, 204, 204, 204, + 204, 204, 204, 204, 204, 204, 204, 204, + 204, 204, 204, 204, 204, 204, 204, 204, + 204, 204, 283, 283, 283, 283, 283, 283, + 283, 283, 283, 283, 283, 283, 283, 283, + 283, 283, 283, 283, 283, 283, 283, 283, + 283, 283, 283, 283, 283, 283, 283, 283, + 283, 283, 283, 283, 283, 283, 283, 283, + 283, 283, 283, 283, 283, 283, 283, 283, + 283, 283, 283, 283, 283, 283, 283, 283, + 283, 283, 283, 283, 283, 283, 283, 283, + 283, 283, 283, 283, 283, 283, 283, 283, + 283, 283, 283, 283, 283, 283, 283, 283, + 283, 362, 362, 362, 362, 362, 362, 362, + 362, 362, 362, 362, 362, 362, 362, 362, + 362, 362, 362, 362, 362, 362, 362, 362, + 362, 362, 362, 362, 362, 362, 362, 362, + 362, 362, 362, 362, 362, 362, 362, 362, + 362, 362, 362, 362, 362, 362, 362, 362, + 362, 362, 362, 362, 362, 362, 362, 362, + 362, 362, 362, 362, 362, 362, 362, 362, + 362, 362, 362, 362, 362, 362, 362, 362, + 362, 362, 362, 362, 362, 433, 362, 433, + 434, 434, 434, 434, 434, 434, 434, 434, + 434, 434, 434, 434, 434, 434, 434, 434, + 434, 434, 434, 434, 434, 434, 434, 434, + 434, 434, 434, 434, 434, 434, 434, 434, + 434, 434, 434, 434, 434, 434, 434, 434, + 434, 434, 434, 434, 434, 434, 434, 434, + 434, 434, 434, 434, 434, 434, 434, 434, + 434, 434, 434, 434, 434, 434, 434, 434, + 434, 434, 434, 434, 434, 434, 434, 434, + 434, 434, 434, 434, 434, 434, 362, 204, + 204, 204, 204, 204, 204, 204, 204, 204, + 204, 362, 204, 204, 204, 204, 204, 204, + 204, 204, 204, 204, 204, 204, 204, 204, + 204, 204, 204, 204, 204, 204, 204, 204, + 204, 362, 548, 548, 548, 548, 548, 548, + 548, 548, 548, 433 }; static const int indic_syllable_machine_start = 178; @@ -1358,7 +1360,7 @@ static const int indic_syllable_machine_en_main = 178; -#line 96 "hb-ot-shape-complex-indic-machine.rl" +#line 97 "hb-ot-shape-complex-indic-machine.rl" #define found_syllable(syllable_type) \ @@ -1378,7 +1380,7 @@ find_syllables (hb_buffer_t *buffer) int cs; hb_glyph_info_t *info = buffer->info; -#line 1382 "hb-ot-shape-complex-indic-machine.hh" +#line 1384 "hb-ot-shape-complex-indic-machine.hh" { cs = indic_syllable_machine_start; ts = 0; @@ -1386,7 +1388,7 @@ find_syllables (hb_buffer_t *buffer) act = 0; } -#line 117 "hb-ot-shape-complex-indic-machine.rl" +#line 118 "hb-ot-shape-complex-indic-machine.rl" p = 0; @@ -1395,7 +1397,7 @@ find_syllables (hb_buffer_t *buffer) unsigned int last = 0; unsigned int syllable_serial = 1; -#line 1399 "hb-ot-shape-complex-indic-machine.hh" +#line 1401 "hb-ot-shape-complex-indic-machine.hh" { int _slen; int _trans; @@ -1409,7 +1411,7 @@ _resume: #line 1 "NONE" {ts = p;} break; -#line 1413 "hb-ot-shape-complex-indic-machine.hh" +#line 1415 "hb-ot-shape-complex-indic-machine.hh" } _keys = _indic_syllable_machine_trans_keys + (cs<<1); @@ -1432,71 +1434,71 @@ _eof_trans: {te = p+1;} break; case 15: -#line 87 "hb-ot-shape-complex-indic-machine.rl" +#line 88 "hb-ot-shape-complex-indic-machine.rl" {te = p+1;{ found_syllable (consonant_syllable); }} break; case 17: -#line 88 "hb-ot-shape-complex-indic-machine.rl" +#line 89 "hb-ot-shape-complex-indic-machine.rl" {te = p+1;{ found_syllable (vowel_syllable); }} break; case 22: -#line 89 "hb-ot-shape-complex-indic-machine.rl" +#line 90 "hb-ot-shape-complex-indic-machine.rl" {te = p+1;{ found_syllable (standalone_cluster); }} break; case 24: -#line 90 "hb-ot-shape-complex-indic-machine.rl" +#line 91 "hb-ot-shape-complex-indic-machine.rl" {te = p+1;{ found_syllable (symbol_cluster); }} break; case 19: -#line 91 "hb-ot-shape-complex-indic-machine.rl" +#line 92 "hb-ot-shape-complex-indic-machine.rl" {te = p+1;{ found_syllable (broken_cluster); }} break; case 12: -#line 92 "hb-ot-shape-complex-indic-machine.rl" +#line 93 "hb-ot-shape-complex-indic-machine.rl" {te = p+1;{ found_syllable (non_indic_cluster); }} break; case 14: -#line 87 "hb-ot-shape-complex-indic-machine.rl" +#line 88 "hb-ot-shape-complex-indic-machine.rl" {te = p;p--;{ found_syllable (consonant_syllable); }} break; case 16: -#line 88 "hb-ot-shape-complex-indic-machine.rl" +#line 89 "hb-ot-shape-complex-indic-machine.rl" {te = p;p--;{ found_syllable (vowel_syllable); }} break; case 21: -#line 89 "hb-ot-shape-complex-indic-machine.rl" +#line 90 "hb-ot-shape-complex-indic-machine.rl" {te = p;p--;{ found_syllable (standalone_cluster); }} break; case 23: -#line 90 "hb-ot-shape-complex-indic-machine.rl" +#line 91 "hb-ot-shape-complex-indic-machine.rl" {te = p;p--;{ found_syllable (symbol_cluster); }} break; case 18: -#line 91 "hb-ot-shape-complex-indic-machine.rl" +#line 92 "hb-ot-shape-complex-indic-machine.rl" {te = p;p--;{ found_syllable (broken_cluster); }} break; case 20: -#line 92 "hb-ot-shape-complex-indic-machine.rl" +#line 93 "hb-ot-shape-complex-indic-machine.rl" {te = p;p--;{ found_syllable (non_indic_cluster); }} break; case 1: -#line 87 "hb-ot-shape-complex-indic-machine.rl" +#line 88 "hb-ot-shape-complex-indic-machine.rl" {{p = ((te))-1;}{ found_syllable (consonant_syllable); }} break; case 3: -#line 88 "hb-ot-shape-complex-indic-machine.rl" +#line 89 "hb-ot-shape-complex-indic-machine.rl" {{p = ((te))-1;}{ found_syllable (vowel_syllable); }} break; case 7: -#line 89 "hb-ot-shape-complex-indic-machine.rl" +#line 90 "hb-ot-shape-complex-indic-machine.rl" {{p = ((te))-1;}{ found_syllable (standalone_cluster); }} break; case 9: -#line 90 "hb-ot-shape-complex-indic-machine.rl" +#line 91 "hb-ot-shape-complex-indic-machine.rl" {{p = ((te))-1;}{ found_syllable (symbol_cluster); }} break; case 4: -#line 91 "hb-ot-shape-complex-indic-machine.rl" +#line 92 "hb-ot-shape-complex-indic-machine.rl" {{p = ((te))-1;}{ found_syllable (broken_cluster); }} break; case 5: @@ -1517,22 +1519,22 @@ _eof_trans: case 8: #line 1 "NONE" {te = p+1;} -#line 87 "hb-ot-shape-complex-indic-machine.rl" +#line 88 "hb-ot-shape-complex-indic-machine.rl" {act = 1;} break; case 6: #line 1 "NONE" {te = p+1;} -#line 91 "hb-ot-shape-complex-indic-machine.rl" +#line 92 "hb-ot-shape-complex-indic-machine.rl" {act = 5;} break; case 13: #line 1 "NONE" {te = p+1;} -#line 92 "hb-ot-shape-complex-indic-machine.rl" +#line 93 "hb-ot-shape-complex-indic-machine.rl" {act = 6;} break; -#line 1536 "hb-ot-shape-complex-indic-machine.hh" +#line 1538 "hb-ot-shape-complex-indic-machine.hh" } _again: @@ -1541,7 +1543,7 @@ _again: #line 1 "NONE" {ts = 0;} break; -#line 1545 "hb-ot-shape-complex-indic-machine.hh" +#line 1547 "hb-ot-shape-complex-indic-machine.hh" } if ( ++p != pe ) @@ -1557,7 +1559,7 @@ _again: } -#line 126 "hb-ot-shape-complex-indic-machine.rl" +#line 127 "hb-ot-shape-complex-indic-machine.rl" } diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-indic-machine.rl b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-indic-machine.rl index 86a7ceb22ac..58d35c0016c 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-indic-machine.rl +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-indic-machine.rl @@ -57,6 +57,7 @@ Repha = 15; Ra = 16; CM = 17; Symbol= 18; +CS = 19; c = (C | Ra); # is_consonant n = ((ZWNJ?.RS)? (N.N?)?); # is_consonant_modifier @@ -76,9 +77,9 @@ medial_group = CM?; halant_or_matra_group = (final_halant_group | (h.ZWJ)? matra_group{0,4}) (Coeng (cn|V))?; -consonant_syllable = Repha? (cn.halant_group){0,4} cn medial_group halant_or_matra_group syllable_tail; +consonant_syllable = (Repha|CS)? (cn.halant_group){0,4} cn medial_group halant_or_matra_group syllable_tail; vowel_syllable = reph? V.n? (ZWJ | (halant_group.cn){0,4} medial_group halant_or_matra_group syllable_tail); -standalone_cluster = (Repha? PLACEHOLDER | reph? DOTTEDCIRCLE).n? (halant_group.cn){0,4} medial_group halant_or_matra_group syllable_tail; +standalone_cluster = ((Repha|CS)? PLACEHOLDER | reph? DOTTEDCIRCLE).n? (halant_group.cn){0,4} medial_group halant_or_matra_group syllable_tail; symbol_cluster = symbol syllable_tail; broken_cluster = reph? n? (halant_group.cn){0,4} medial_group halant_or_matra_group syllable_tail; other = any; diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-indic-private.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-indic-private.hh index c880311ee4c..8fe2509ef21 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-indic-private.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-indic-private.hh @@ -60,7 +60,8 @@ enum indic_category_t { OT_Repha = 15, /* Atomically-encoded logical or visual repha. */ OT_Ra = 16, OT_CM = 17, /* Consonant-Medial. */ - OT_Symbol = 18 /* Avagraha, etc that take marks (SM,A,VD). */ + OT_Symbol = 18, /* Avagraha, etc that take marks (SM,A,VD). */ + OT_CS = 19 }; #define MEDIAL_FLAGS (FLAG (OT_CM)) @@ -70,7 +71,7 @@ enum indic_category_t { * We treat Vowels and placeholders as if they were consonants. This is safe because Vowels * cannot happen in a consonant syllable. The plus side however is, we can call the * consonant syllable logic from the vowel syllable function and get it all right! */ -#define CONSONANT_FLAGS (FLAG (OT_C) | FLAG (OT_Ra) | MEDIAL_FLAGS | FLAG (OT_V) | FLAG (OT_PLACEHOLDER) | FLAG (OT_DOTTEDCIRCLE)) +#define CONSONANT_FLAGS (FLAG (OT_C) | FLAG (OT_CS) | FLAG (OT_Ra) | MEDIAL_FLAGS | FLAG (OT_V) | FLAG (OT_PLACEHOLDER) | FLAG (OT_DOTTEDCIRCLE)) #define JOINER_FLAGS (FLAG (OT_ZWJ) | FLAG (OT_ZWNJ)) #define HALANT_OR_COENG_FLAGS (FLAG (OT_H) | FLAG (OT_Coeng)) @@ -121,8 +122,8 @@ enum indic_syllabic_category_t { INDIC_SYLLABIC_CATEGORY_CONSONANT_PREFIXED = OT_X, /* Don't care. */ INDIC_SYLLABIC_CATEGORY_CONSONANT_SUBJOINED = OT_CM, INDIC_SYLLABIC_CATEGORY_CONSONANT_SUCCEEDING_REPHA = OT_N, - INDIC_SYLLABIC_CATEGORY_CONSONANT_WITH_STACKER = OT_C, - INDIC_SYLLABIC_CATEGORY_GEMINATION_MARK = OT_SM, + INDIC_SYLLABIC_CATEGORY_CONSONANT_WITH_STACKER = OT_CS, + INDIC_SYLLABIC_CATEGORY_GEMINATION_MARK = OT_SM, /* https://github.com/behdad/harfbuzz/issues/552 */ INDIC_SYLLABIC_CATEGORY_INVISIBLE_STACKER = OT_Coeng, INDIC_SYLLABIC_CATEGORY_JOINER = OT_ZWJ, INDIC_SYLLABIC_CATEGORY_MODIFYING_LETTER = OT_X, diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-indic-table.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-indic-table.cc index 3bf5285e6bb..bfd1c6d3429 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-indic-table.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-indic-table.cc @@ -6,61 +6,62 @@ * * on files with these headers: * - * # IndicSyllabicCategory-9.0.0.txt - * # Date: 2016-05-21, 02:46:00 GMT [RP] - * # IndicPositionalCategory-9.0.0.txt - * # Date: 2016-02-25, 00:48:00 GMT [RP] - * # Blocks-9.0.0.txt - * # Date: 2016-02-05, 23:48:00 GMT [KW] + * # IndicSyllabicCategory-10.0.0.txt + * # Date: 2017-05-31, 01:07:00 GMT [KW, RP] + * # IndicPositionalCategory-10.0.0.txt + * # Date: 2017-05-31, 01:07:00 GMT [RP] + * # Blocks-10.0.0.txt + * # Date: 2017-04-12, 17:30:00 GMT [KW] */ #include "hb-ot-shape-complex-indic-private.hh" #define ISC_A INDIC_SYLLABIC_CATEGORY_AVAGRAHA /* 15 chars; Avagraha */ -#define ISC_Bi INDIC_SYLLABIC_CATEGORY_BINDU /* 67 chars; Bindu */ +#define ISC_Bi INDIC_SYLLABIC_CATEGORY_BINDU /* 80 chars; Bindu */ #define ISC_BJN INDIC_SYLLABIC_CATEGORY_BRAHMI_JOINING_NUMBER /* 20 chars; Brahmi_Joining_Number */ -#define ISC_Ca INDIC_SYLLABIC_CATEGORY_CANTILLATION_MARK /* 53 chars; Cantillation_Mark */ -#define ISC_C INDIC_SYLLABIC_CATEGORY_CONSONANT /* 1907 chars; Consonant */ +#define ISC_Ca INDIC_SYLLABIC_CATEGORY_CANTILLATION_MARK /* 57 chars; Cantillation_Mark */ +#define ISC_C INDIC_SYLLABIC_CATEGORY_CONSONANT /* 2024 chars; Consonant */ #define ISC_CD INDIC_SYLLABIC_CATEGORY_CONSONANT_DEAD /* 10 chars; Consonant_Dead */ -#define ISC_CF INDIC_SYLLABIC_CATEGORY_CONSONANT_FINAL /* 62 chars; Consonant_Final */ +#define ISC_CF INDIC_SYLLABIC_CATEGORY_CONSONANT_FINAL /* 68 chars; Consonant_Final */ #define ISC_CHL INDIC_SYLLABIC_CATEGORY_CONSONANT_HEAD_LETTER /* 5 chars; Consonant_Head_Letter */ #define ISC_CK INDIC_SYLLABIC_CATEGORY_CONSONANT_KILLER /* 2 chars; Consonant_Killer */ -#define ISC_CM INDIC_SYLLABIC_CATEGORY_CONSONANT_MEDIAL /* 22 chars; Consonant_Medial */ -#define ISC_CP INDIC_SYLLABIC_CATEGORY_CONSONANT_PLACEHOLDER /* 16 chars; Consonant_Placeholder */ -#define ISC_CPR INDIC_SYLLABIC_CATEGORY_CONSONANT_PRECEDING_REPHA /* 1 chars; Consonant_Preceding_Repha */ -#define ISC_CPrf INDIC_SYLLABIC_CATEGORY_CONSONANT_PREFIXED /* 2 chars; Consonant_Prefixed */ -#define ISC_CS INDIC_SYLLABIC_CATEGORY_CONSONANT_SUBJOINED /* 90 chars; Consonant_Subjoined */ -#define ISC_CSR INDIC_SYLLABIC_CATEGORY_CONSONANT_SUCCEEDING_REPHA /* 4 chars; Consonant_Succeeding_Repha */ +#define ISC_CM INDIC_SYLLABIC_CATEGORY_CONSONANT_MEDIAL /* 27 chars; Consonant_Medial */ +#define ISC_CP INDIC_SYLLABIC_CATEGORY_CONSONANT_PLACEHOLDER /* 18 chars; Consonant_Placeholder */ +#define ISC_CPR INDIC_SYLLABIC_CATEGORY_CONSONANT_PRECEDING_REPHA /* 2 chars; Consonant_Preceding_Repha */ +#define ISC_CPrf INDIC_SYLLABIC_CATEGORY_CONSONANT_PREFIXED /* 7 chars; Consonant_Prefixed */ +#define ISC_CS INDIC_SYLLABIC_CATEGORY_CONSONANT_SUBJOINED /* 95 chars; Consonant_Subjoined */ +#define ISC_CSR INDIC_SYLLABIC_CATEGORY_CONSONANT_SUCCEEDING_REPHA /* 5 chars; Consonant_Succeeding_Repha */ #define ISC_CWS INDIC_SYLLABIC_CATEGORY_CONSONANT_WITH_STACKER /* 4 chars; Consonant_With_Stacker */ -#define ISC_GM INDIC_SYLLABIC_CATEGORY_GEMINATION_MARK /* 2 chars; Gemination_Mark */ -#define ISC_IS INDIC_SYLLABIC_CATEGORY_INVISIBLE_STACKER /* 7 chars; Invisible_Stacker */ +#define ISC_GM INDIC_SYLLABIC_CATEGORY_GEMINATION_MARK /* 3 chars; Gemination_Mark */ +#define ISC_IS INDIC_SYLLABIC_CATEGORY_INVISIBLE_STACKER /* 10 chars; Invisible_Stacker */ #define ISC_ZWJ INDIC_SYLLABIC_CATEGORY_JOINER /* 1 chars; Joiner */ #define ISC_ML INDIC_SYLLABIC_CATEGORY_MODIFYING_LETTER /* 1 chars; Modifying_Letter */ #define ISC_ZWNJ INDIC_SYLLABIC_CATEGORY_NON_JOINER /* 1 chars; Non_Joiner */ -#define ISC_N INDIC_SYLLABIC_CATEGORY_NUKTA /* 24 chars; Nukta */ -#define ISC_Nd INDIC_SYLLABIC_CATEGORY_NUMBER /* 459 chars; Number */ +#define ISC_N INDIC_SYLLABIC_CATEGORY_NUKTA /* 28 chars; Nukta */ +#define ISC_Nd INDIC_SYLLABIC_CATEGORY_NUMBER /* 469 chars; Number */ #define ISC_NJ INDIC_SYLLABIC_CATEGORY_NUMBER_JOINER /* 1 chars; Number_Joiner */ #define ISC_x INDIC_SYLLABIC_CATEGORY_OTHER /* 1 chars; Other */ -#define ISC_PK INDIC_SYLLABIC_CATEGORY_PURE_KILLER /* 16 chars; Pure_Killer */ +#define ISC_PK INDIC_SYLLABIC_CATEGORY_PURE_KILLER /* 21 chars; Pure_Killer */ #define ISC_RS INDIC_SYLLABIC_CATEGORY_REGISTER_SHIFTER /* 2 chars; Register_Shifter */ #define ISC_SM INDIC_SYLLABIC_CATEGORY_SYLLABLE_MODIFIER /* 22 chars; Syllable_Modifier */ #define ISC_TL INDIC_SYLLABIC_CATEGORY_TONE_LETTER /* 7 chars; Tone_Letter */ #define ISC_TM INDIC_SYLLABIC_CATEGORY_TONE_MARK /* 42 chars; Tone_Mark */ #define ISC_V INDIC_SYLLABIC_CATEGORY_VIRAMA /* 24 chars; Virama */ -#define ISC_Vs INDIC_SYLLABIC_CATEGORY_VISARGA /* 31 chars; Visarga */ +#define ISC_Vs INDIC_SYLLABIC_CATEGORY_VISARGA /* 34 chars; Visarga */ #define ISC_Vo INDIC_SYLLABIC_CATEGORY_VOWEL /* 30 chars; Vowel */ -#define ISC_M INDIC_SYLLABIC_CATEGORY_VOWEL_DEPENDENT /* 602 chars; Vowel_Dependent */ -#define ISC_VI INDIC_SYLLABIC_CATEGORY_VOWEL_INDEPENDENT /* 431 chars; Vowel_Independent */ +#define ISC_M INDIC_SYLLABIC_CATEGORY_VOWEL_DEPENDENT /* 633 chars; Vowel_Dependent */ +#define ISC_VI INDIC_SYLLABIC_CATEGORY_VOWEL_INDEPENDENT /* 443 chars; Vowel_Independent */ -#define IMC_B INDIC_MATRA_CATEGORY_BOTTOM /* 300 chars; Bottom */ +#define IMC_B INDIC_MATRA_CATEGORY_BOTTOM /* 330 chars; Bottom */ +#define IMC_BL INDIC_MATRA_CATEGORY_BOTTOM_AND_LEFT /* 1 chars; Bottom_And_Left */ #define IMC_BR INDIC_MATRA_CATEGORY_BOTTOM_AND_RIGHT /* 2 chars; Bottom_And_Right */ #define IMC_L INDIC_MATRA_CATEGORY_LEFT /* 57 chars; Left */ #define IMC_LR INDIC_MATRA_CATEGORY_LEFT_AND_RIGHT /* 21 chars; Left_And_Right */ #define IMC_x INDIC_MATRA_CATEGORY_NOT_APPLICABLE /* 1 chars; Not_Applicable */ #define IMC_O INDIC_MATRA_CATEGORY_OVERSTRUCK /* 10 chars; Overstruck */ -#define IMC_R INDIC_MATRA_CATEGORY_RIGHT /* 258 chars; Right */ -#define IMC_T INDIC_MATRA_CATEGORY_TOP /* 342 chars; Top */ +#define IMC_R INDIC_MATRA_CATEGORY_RIGHT /* 262 chars; Right */ +#define IMC_T INDIC_MATRA_CATEGORY_TOP /* 380 chars; Top */ #define IMC_TB INDIC_MATRA_CATEGORY_TOP_AND_BOTTOM /* 10 chars; Top_And_Bottom */ #define IMC_TBR INDIC_MATRA_CATEGORY_TOP_AND_BOTTOM_AND_RIGHT /* 1 chars; Top_And_Bottom_And_Right */ #define IMC_TL INDIC_MATRA_CATEGORY_TOP_AND_LEFT /* 6 chars; Top_And_Left */ @@ -133,7 +134,7 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = { /* 09E0 */ _(VI,x), _(VI,x), _(M,B), _(M,B), _(x,x), _(x,x), _(Nd,x), _(Nd,x), /* 09E8 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), /* 09F0 */ _(C,x), _(C,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), - /* 09F8 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), + /* 09F8 */ _(x,x), _(x,x), _(x,x), _(x,x), _(Bi,x), _(x,x), _(x,x), _(x,x), /* Gurmukhi */ @@ -171,7 +172,7 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = { /* 0AE0 */ _(VI,x), _(VI,x), _(M,B), _(M,B), _(x,x), _(x,x), _(Nd,x), _(Nd,x), /* 0AE8 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), /* 0AF0 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), - /* 0AF8 */ _(x,x), _(C,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), + /* 0AF8 */ _(x,x), _(C,x), _(Ca,T), _(Ca,T), _(Ca,T), _(N,T), _(N,T), _(N,T), /* Oriya */ @@ -251,14 +252,14 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = { /* Malayalam */ - /* 0D00 */ _(x,x), _(Bi,T), _(Bi,R), _(Vs,R), _(x,x), _(VI,x), _(VI,x), _(VI,x), + /* 0D00 */ _(Bi,T), _(Bi,T), _(Bi,R), _(Vs,R), _(x,x), _(VI,x), _(VI,x), _(VI,x), /* 0D08 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(x,x), _(VI,x), _(VI,x), /* 0D10 */ _(VI,x), _(x,x), _(VI,x), _(VI,x), _(VI,x), _(C,x), _(C,x), _(C,x), /* 0D18 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), /* 0D20 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), /* 0D28 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), /* 0D30 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* 0D38 */ _(C,x), _(C,x), _(C,x), _(x,x), _(x,x), _(A,x), _(M,R), _(M,R), + /* 0D38 */ _(C,x), _(C,x), _(C,x), _(PK,T), _(PK,T), _(A,x), _(M,R), _(M,R), /* 0D40 */ _(M,R), _(M,R), _(M,R), _(M,B), _(M,B), _(x,x), _(M,L), _(M,L), /* 0D48 */ _(M,L), _(x,x), _(M,LR), _(M,LR), _(M,LR), _(V,T),_(CPR,x), _(x,x), /* 0D50 */ _(x,x), _(x,x), _(x,x), _(x,x), _(CD,x), _(CD,x), _(CD,x), _(M,R), @@ -341,7 +342,7 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = { /* 1CD8 */ _(Ca,B), _(Ca,B), _(Ca,T), _(Ca,T), _(Ca,B), _(Ca,B), _(Ca,B), _(Ca,B), /* 1CE0 */ _(Ca,T), _(Ca,R), _(x,O), _(x,O), _(x,O), _(x,O), _(x,O), _(x,O), /* 1CE8 */ _(x,O), _(x,x), _(x,x), _(x,x), _(x,x), _(x,B), _(x,x), _(x,x), - /* 1CF0 */ _(x,x), _(x,x), _(Vs,x), _(Vs,x), _(Ca,T), _(x,x), _(x,x), _(x,x), + /* 1CF0 */ _(x,x), _(x,x), _(Vs,x), _(Vs,x), _(Ca,T), _(x,x), _(x,x), _(Ca,R), /* 1CF8 */ _(Ca,x), _(Ca,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), #define indic_offset_0x2008u 1656 @@ -368,7 +369,7 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = { /* A8E0 */ _(Ca,T), _(Ca,T), _(Ca,T), _(Ca,T), _(Ca,T), _(Ca,T), _(Ca,T), _(Ca,T), /* A8E8 */ _(Ca,T), _(Ca,T), _(Ca,T), _(Ca,T), _(Ca,T), _(Ca,T), _(Ca,T), _(Ca,T), - /* A8F0 */ _(Ca,T), _(Ca,T), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), + /* A8F0 */ _(Ca,T), _(Ca,T), _(Bi,x), _(Bi,x), _(x,x), _(x,x), _(x,x), _(x,x), #define indic_offset_0xa9e0u 1720 @@ -390,7 +391,7 @@ static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = { /* AA70 */ _(x,x), _(C,x), _(C,x), _(C,x), _(CP,x), _(CP,x), _(CP,x), _(x,x), /* AA78 */ _(x,x), _(x,x), _(C,x), _(TM,R), _(TM,T), _(TM,R), _(C,x), _(C,x), -}; /* Table items: 1784; occupancy: 69% */ +}; /* Table items: 1784; occupancy: 70% */ INDIC_TABLE_ELEMENT_TYPE hb_indic_get_categories (hb_codepoint_t u) @@ -422,13 +423,6 @@ hb_indic_get_categories (hb_codepoint_t u) if (hb_in_range<hb_codepoint_t> (u, 0xAA60u, 0xAA7Fu)) return indic_table[u - 0xAA60u + indic_offset_0xaa60u]; break; - case 0x11u: - // According to ScriptExtensions.txt, these Grantha marks may also be used in Tamil, - // so the Indic shaper needs to know their categories. - if (unlikely (u == 0x11303)) return _(Vs,R); - if (unlikely (u == 0x1133c)) return _(N,B); - break; - default: break; } @@ -474,6 +468,7 @@ hb_indic_get_categories (hb_codepoint_t u) #undef ISC_VI #undef IMC_B +#undef IMC_BL #undef IMC_BR #undef IMC_L #undef IMC_LR diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-indic.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-indic.cc index 3cd8fd6c3d7..051db22fcbe 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-indic.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-indic.cc @@ -208,7 +208,21 @@ set_indic_properties (hb_glyph_info_t &info) cat = OT_M; pos = POS_ABOVE_C; } + else if (unlikely (u == 0x0A51u)) + { + /* https://github.com/behdad/harfbuzz/issues/524 */ + cat = OT_M; + pos = POS_BELOW_C; + } + + /* According to ScriptExtensions.txt, these Grantha marks may also be used in Tamil, + * so the Indic shaper needs to know their categories. */ + else if (unlikely (u == 0x11303u)) cat = OT_SM; + else if (unlikely (u == 0x1133cu)) cat = OT_N; + else if (unlikely (u == 0x0AFBu)) cat = OT_N; /* https://github.com/behdad/harfbuzz/issues/552 */ + + else if (unlikely (u == 0x0980u)) cat = OT_PLACEHOLDER; /* https://github.com/behdad/harfbuzz/issues/538 */ else if (unlikely (u == 0x17C6u)) cat = OT_N; /* Khmer Bindu doesn't like to be repositioned. */ else if (unlikely (hb_in_range<hb_codepoint_t> (u, 0x2010u, 0x2011u))) cat = OT_PLACEHOLDER; @@ -677,6 +691,21 @@ initial_reordering_consonant_syllable (const hb_ot_shape_plan_t *plan, const indic_shape_plan_t *indic_plan = (const indic_shape_plan_t *) plan->data; hb_glyph_info_t *info = buffer->info; + /* https://github.com/behdad/harfbuzz/issues/435#issuecomment-335560167 + * // For compatibility with legacy useage in Kannada, + * // Ra+h+ZWJ must behave like Ra+ZWJ+h... + */ + if (buffer->props.script == HB_SCRIPT_KANNADA && + start + 3 <= end && + is_one_of (info[start ], FLAG (OT_Ra)) && + is_one_of (info[start+1], FLAG (OT_H)) && + is_one_of (info[start+2], FLAG (OT_ZWJ))) + { + buffer->merge_clusters (start+1, start+3); + hb_glyph_info_t tmp = info[start+1]; + info[start+1] = info[start+2]; + info[start+2] = tmp; + } /* 1. Find base consonant: * @@ -842,8 +871,8 @@ initial_reordering_consonant_syllable (const hb_ot_shape_plan_t *plan, /* 2. Decompose and reorder Matras: * - * Each matra and any syllable modifier sign in the cluster are moved to the - * appropriate position relative to the consonant(s) in the cluster. The + * Each matra and any syllable modifier sign in the syllable are moved to the + * appropriate position relative to the consonant(s) in the syllable. The * shaping engine decomposes two- or three-part matras into their constituent * parts before any repositioning. Matra characters are classified by which * consonant in a conjunct they have affinity for and are reordered to the @@ -1269,7 +1298,7 @@ final_reordering_syllable (const hb_ot_shape_plan_t *plan, /* This function relies heavily on halant glyphs. Lots of ligation - * and possibly multiplication substitutions happened prior to this + * and possibly multiple substitutions happened prior to this * phase, and that might have messed up our properties. Recover * from a particular case of that where we're fairly sure that a * class of OT_H is desired but has been lost. */ @@ -1293,7 +1322,7 @@ final_reordering_syllable (const hb_ot_shape_plan_t *plan, * After the localized forms and basic shaping forms GSUB features have been * applied (see below), the shaping engine performs some final glyph * reordering before applying all the remaining font features to the entire - * cluster. + * syllable. */ bool try_pref = !!indic_plan->mask_array[PREF]; @@ -1676,8 +1705,8 @@ final_reordering_syllable (const hb_ot_shape_plan_t *plan, break; default: - /* Uniscribe merges the entire cluster... Except for Tamil & Sinhala. - * This means, half forms are submerged into the main consonants cluster. + /* Uniscribe merges the entire syllable into a single cluster... Except for Tamil & Sinhala. + * This means, half forms are submerged into the main consonant's cluster. * This is unnecessary, and makes cursor positioning harder, but that's what * Uniscribe does. */ buffer->merge_clusters (start, end); @@ -1826,6 +1855,7 @@ const hb_ot_complex_shaper_t _hb_ot_complex_shaper_indic = compose_indic, setup_masks_indic, NULL, /* disable_otl */ + NULL, /* reorder_marks */ HB_OT_SHAPE_ZERO_WIDTH_MARKS_NONE, false, /* fallback_position */ }; diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-myanmar-machine.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-myanmar-machine.hh index d2fe7422e69..ed87404305b 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-myanmar-machine.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-myanmar-machine.hh @@ -1,5 +1,5 @@ -#line 1 "../../src/hb-ot-shape-complex-myanmar-machine.rl" +#line 1 "hb-ot-shape-complex-myanmar-machine.rl" /* * Copyright © 2011,2012 Google, Inc. * @@ -32,199 +32,203 @@ #include "hb-private.hh" -#line 36 "../../src/hb-ot-shape-complex-myanmar-machine.hh.tmp" +#line 36 "hb-ot-shape-complex-myanmar-machine.hh" static const unsigned char _myanmar_syllable_machine_trans_keys[] = { - 1u, 31u, 3u, 30u, 5u, 29u, 5u, 8u, 5u, 29u, 3u, 25u, 5u, 25u, 5u, 25u, + 1u, 32u, 3u, 30u, 5u, 29u, 5u, 8u, 5u, 29u, 3u, 25u, 5u, 25u, 5u, 25u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, 1u, 16u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, 5u, 29u, 5u, 8u, 5u, 29u, 3u, 25u, 5u, 25u, 5u, 25u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, - 3u, 30u, 3u, 29u, 1u, 30u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, - 3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, 8u, 8u, 0 + 3u, 30u, 3u, 29u, 1u, 32u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, + 3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, 1u, 32u, 8u, 8u, 0 }; static const char _myanmar_syllable_machine_key_spans[] = { - 31, 28, 25, 4, 25, 23, 21, 21, + 32, 28, 25, 4, 25, 23, 21, 21, 27, 27, 27, 27, 16, 27, 27, 27, 27, 27, 27, 27, 27, 27, 25, 4, 25, 23, 21, 21, 27, 27, 27, 27, - 28, 27, 30, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 1 + 28, 27, 32, 27, 27, 27, 27, 27, + 27, 27, 27, 27, 32, 1 }; static const short _myanmar_syllable_machine_index_offsets[] = { - 0, 32, 61, 87, 92, 118, 142, 164, - 186, 214, 242, 270, 298, 315, 343, 371, - 399, 427, 455, 483, 511, 539, 567, 593, - 598, 624, 648, 670, 692, 720, 748, 776, - 804, 833, 861, 892, 920, 948, 976, 1004, - 1032, 1060, 1088, 1116, 1144 + 0, 33, 62, 88, 93, 119, 143, 165, + 187, 215, 243, 271, 299, 316, 344, 372, + 400, 428, 456, 484, 512, 540, 568, 594, + 599, 625, 649, 671, 693, 721, 749, 777, + 805, 834, 862, 895, 923, 951, 979, 1007, + 1035, 1063, 1091, 1119, 1147, 1180 }; static const char _myanmar_syllable_machine_indicies[] = { 1, 1, 2, 3, 4, 4, 0, 5, 0, 6, 1, 0, 0, 0, 0, 7, - 0, 8, 1, 0, 9, 10, 11, 12, - 13, 14, 15, 16, 17, 18, 19, 0, - 21, 22, 23, 23, 20, 24, 20, 25, - 20, 20, 20, 20, 20, 20, 20, 26, - 20, 20, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 20, 23, 23, 20, - 24, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 37, 20, 20, 20, 20, 20, - 20, 31, 20, 20, 20, 35, 20, 23, - 23, 20, 24, 20, 23, 23, 20, 24, - 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, - 31, 20, 20, 20, 35, 20, 38, 20, - 23, 23, 20, 24, 20, 31, 20, 20, - 20, 20, 20, 20, 20, 39, 20, 20, - 20, 20, 20, 20, 31, 20, 23, 23, - 20, 24, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 39, 20, 20, 20, 20, - 20, 20, 31, 20, 23, 23, 20, 24, - 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, - 31, 20, 21, 20, 23, 23, 20, 24, - 20, 25, 20, 20, 20, 20, 20, 20, - 20, 40, 20, 20, 40, 20, 20, 20, - 31, 41, 20, 20, 35, 20, 21, 20, - 23, 23, 20, 24, 20, 25, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 31, 20, 20, 20, - 35, 20, 21, 20, 23, 23, 20, 24, - 20, 25, 20, 20, 20, 20, 20, 20, - 20, 40, 20, 20, 20, 20, 20, 20, - 31, 41, 20, 20, 35, 20, 21, 20, - 23, 23, 20, 24, 20, 25, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 31, 41, 20, 20, - 35, 20, 1, 1, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, - 20, 1, 20, 21, 20, 23, 23, 20, - 24, 20, 25, 20, 20, 20, 20, 20, - 20, 20, 26, 20, 20, 27, 28, 29, - 30, 31, 32, 33, 34, 35, 20, 21, - 20, 23, 23, 20, 24, 20, 25, 20, - 20, 20, 20, 20, 20, 20, 34, 20, - 20, 20, 20, 20, 20, 31, 32, 33, - 34, 35, 20, 21, 20, 23, 23, 20, - 24, 20, 25, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, - 20, 31, 32, 33, 34, 35, 20, 21, - 20, 23, 23, 20, 24, 20, 25, 20, - 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 31, 32, 33, - 20, 35, 20, 21, 20, 23, 23, 20, - 24, 20, 25, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, - 20, 31, 20, 33, 20, 35, 20, 21, - 20, 23, 23, 20, 24, 20, 25, 20, - 20, 20, 20, 20, 20, 20, 34, 20, - 20, 27, 20, 29, 20, 31, 32, 33, - 34, 35, 20, 21, 20, 23, 23, 20, - 24, 20, 25, 20, 20, 20, 20, 20, - 20, 20, 34, 20, 20, 27, 20, 20, - 20, 31, 32, 33, 34, 35, 20, 21, - 20, 23, 23, 20, 24, 20, 25, 20, - 20, 20, 20, 20, 20, 20, 34, 20, - 20, 27, 28, 29, 20, 31, 32, 33, - 34, 35, 20, 21, 22, 23, 23, 20, - 24, 20, 25, 20, 20, 20, 20, 20, - 20, 20, 26, 20, 20, 27, 28, 29, - 30, 31, 32, 33, 34, 35, 20, 3, - 3, 42, 5, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 43, 42, 42, 42, - 42, 42, 42, 13, 42, 42, 42, 17, - 42, 3, 3, 42, 5, 42, 3, 3, - 42, 5, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 13, 42, 42, 42, 17, 42, - 44, 42, 3, 3, 42, 5, 42, 13, - 42, 42, 42, 42, 42, 42, 42, 45, - 42, 42, 42, 42, 42, 42, 13, 42, - 3, 3, 42, 5, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 45, 42, 42, - 42, 42, 42, 42, 13, 42, 3, 3, - 42, 5, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 13, 42, 2, 42, 3, 3, - 42, 5, 42, 6, 42, 42, 42, 42, - 42, 42, 42, 46, 42, 42, 46, 42, - 42, 42, 13, 47, 42, 42, 17, 42, - 2, 42, 3, 3, 42, 5, 42, 6, - 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 13, 42, - 42, 42, 17, 42, 2, 42, 3, 3, - 42, 5, 42, 6, 42, 42, 42, 42, - 42, 42, 42, 46, 42, 42, 42, 42, - 42, 42, 13, 47, 42, 42, 17, 42, - 2, 42, 3, 3, 42, 5, 42, 6, - 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 13, 47, - 42, 42, 17, 42, 21, 22, 23, 23, - 20, 24, 20, 25, 20, 20, 20, 20, - 20, 20, 20, 48, 20, 20, 27, 28, + 0, 8, 9, 0, 10, 11, 12, 13, + 14, 15, 16, 17, 18, 19, 20, 1, + 0, 22, 23, 24, 24, 21, 25, 21, + 26, 21, 21, 21, 21, 21, 21, 21, + 27, 21, 21, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 21, 24, 24, + 21, 25, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 38, 21, 21, 21, 21, + 21, 21, 32, 21, 21, 21, 36, 21, + 24, 24, 21, 25, 21, 24, 24, 21, + 25, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, + 21, 32, 21, 21, 21, 36, 21, 39, + 21, 24, 24, 21, 25, 21, 32, 21, + 21, 21, 21, 21, 21, 21, 40, 21, + 21, 21, 21, 21, 21, 32, 21, 24, + 24, 21, 25, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 40, 21, 21, 21, + 21, 21, 21, 32, 21, 24, 24, 21, + 25, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, + 21, 32, 21, 22, 21, 24, 24, 21, + 25, 21, 26, 21, 21, 21, 21, 21, + 21, 21, 41, 21, 21, 41, 21, 21, + 21, 32, 42, 21, 21, 36, 21, 22, + 21, 24, 24, 21, 25, 21, 26, 21, + 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 32, 21, 21, + 21, 36, 21, 22, 21, 24, 24, 21, + 25, 21, 26, 21, 21, 21, 21, 21, + 21, 21, 41, 21, 21, 21, 21, 21, + 21, 32, 42, 21, 21, 36, 21, 22, + 21, 24, 24, 21, 25, 21, 26, 21, + 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 32, 42, 21, + 21, 36, 21, 1, 1, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 1, 21, 22, 21, 24, 24, + 21, 25, 21, 26, 21, 21, 21, 21, + 21, 21, 21, 27, 21, 21, 28, 29, + 30, 31, 32, 33, 34, 35, 36, 21, + 22, 21, 24, 24, 21, 25, 21, 26, + 21, 21, 21, 21, 21, 21, 21, 35, + 21, 21, 21, 21, 21, 21, 32, 33, + 34, 35, 36, 21, 22, 21, 24, 24, + 21, 25, 21, 26, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 32, 33, 34, 35, 36, 21, + 22, 21, 24, 24, 21, 25, 21, 26, + 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 32, 33, + 34, 21, 36, 21, 22, 21, 24, 24, + 21, 25, 21, 26, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 32, 21, 34, 21, 36, 21, + 22, 21, 24, 24, 21, 25, 21, 26, + 21, 21, 21, 21, 21, 21, 21, 35, + 21, 21, 28, 21, 30, 21, 32, 33, + 34, 35, 36, 21, 22, 21, 24, 24, + 21, 25, 21, 26, 21, 21, 21, 21, + 21, 21, 21, 35, 21, 21, 28, 21, + 21, 21, 32, 33, 34, 35, 36, 21, + 22, 21, 24, 24, 21, 25, 21, 26, + 21, 21, 21, 21, 21, 21, 21, 35, + 21, 21, 28, 29, 30, 21, 32, 33, + 34, 35, 36, 21, 22, 23, 24, 24, + 21, 25, 21, 26, 21, 21, 21, 21, + 21, 21, 21, 27, 21, 21, 28, 29, + 30, 31, 32, 33, 34, 35, 36, 21, + 3, 3, 43, 5, 43, 43, 43, 43, + 43, 43, 43, 43, 43, 44, 43, 43, + 43, 43, 43, 43, 14, 43, 43, 43, + 18, 43, 3, 3, 43, 5, 43, 3, + 3, 43, 5, 43, 43, 43, 43, 43, + 43, 43, 43, 43, 43, 43, 43, 43, + 43, 43, 43, 14, 43, 43, 43, 18, + 43, 45, 43, 3, 3, 43, 5, 43, + 14, 43, 43, 43, 43, 43, 43, 43, + 46, 43, 43, 43, 43, 43, 43, 14, + 43, 3, 3, 43, 5, 43, 43, 43, + 43, 43, 43, 43, 43, 43, 46, 43, + 43, 43, 43, 43, 43, 14, 43, 3, + 3, 43, 5, 43, 43, 43, 43, 43, + 43, 43, 43, 43, 43, 43, 43, 43, + 43, 43, 43, 14, 43, 2, 43, 3, + 3, 43, 5, 43, 6, 43, 43, 43, + 43, 43, 43, 43, 47, 43, 43, 47, + 43, 43, 43, 14, 48, 43, 43, 18, + 43, 2, 43, 3, 3, 43, 5, 43, + 6, 43, 43, 43, 43, 43, 43, 43, + 43, 43, 43, 43, 43, 43, 43, 14, + 43, 43, 43, 18, 43, 2, 43, 3, + 3, 43, 5, 43, 6, 43, 43, 43, + 43, 43, 43, 43, 47, 43, 43, 43, + 43, 43, 43, 14, 48, 43, 43, 18, + 43, 2, 43, 3, 3, 43, 5, 43, + 6, 43, 43, 43, 43, 43, 43, 43, + 43, 43, 43, 43, 43, 43, 43, 14, + 48, 43, 43, 18, 43, 22, 23, 24, + 24, 21, 25, 21, 26, 21, 21, 21, + 21, 21, 21, 21, 49, 21, 21, 28, 29, 30, 31, 32, 33, 34, 35, 36, - 20, 21, 49, 23, 23, 20, 24, 20, - 25, 20, 20, 20, 20, 20, 20, 20, - 26, 20, 20, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 20, 1, 1, 2, - 3, 3, 3, 42, 5, 42, 6, 1, - 42, 42, 42, 42, 1, 42, 8, 1, - 42, 9, 10, 11, 12, 13, 14, 15, - 16, 17, 18, 42, 2, 42, 3, 3, - 42, 5, 42, 6, 42, 42, 42, 42, - 42, 42, 42, 8, 42, 42, 9, 10, - 11, 12, 13, 14, 15, 16, 17, 42, - 2, 42, 3, 3, 42, 5, 42, 6, - 42, 42, 42, 42, 42, 42, 42, 16, - 42, 42, 42, 42, 42, 42, 13, 14, - 15, 16, 17, 42, 2, 42, 3, 3, - 42, 5, 42, 6, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 13, 14, 15, 16, 17, 42, - 2, 42, 3, 3, 42, 5, 42, 6, - 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 13, 14, - 15, 42, 17, 42, 2, 42, 3, 3, - 42, 5, 42, 6, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 13, 42, 15, 42, 17, 42, - 2, 42, 3, 3, 42, 5, 42, 6, - 42, 42, 42, 42, 42, 42, 42, 16, - 42, 42, 9, 42, 11, 42, 13, 14, - 15, 16, 17, 42, 2, 42, 3, 3, - 42, 5, 42, 6, 42, 42, 42, 42, - 42, 42, 42, 16, 42, 42, 9, 42, - 42, 42, 13, 14, 15, 16, 17, 42, - 2, 42, 3, 3, 42, 5, 42, 6, - 42, 42, 42, 42, 42, 42, 42, 16, - 42, 42, 9, 10, 11, 42, 13, 14, - 15, 16, 17, 42, 2, 3, 3, 3, - 42, 5, 42, 6, 42, 42, 42, 42, - 42, 42, 42, 8, 42, 42, 9, 10, - 11, 12, 13, 14, 15, 16, 17, 42, - 51, 50, 0 + 37, 21, 22, 50, 24, 24, 21, 25, + 21, 26, 21, 21, 21, 21, 21, 21, + 21, 27, 21, 21, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 21, 1, 1, + 2, 3, 3, 3, 43, 5, 43, 6, + 1, 43, 43, 43, 43, 1, 43, 8, + 43, 43, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 43, 1, 43, 2, + 43, 3, 3, 43, 5, 43, 6, 43, + 43, 43, 43, 43, 43, 43, 8, 43, + 43, 10, 11, 12, 13, 14, 15, 16, + 17, 18, 43, 2, 43, 3, 3, 43, + 5, 43, 6, 43, 43, 43, 43, 43, + 43, 43, 17, 43, 43, 43, 43, 43, + 43, 14, 15, 16, 17, 18, 43, 2, + 43, 3, 3, 43, 5, 43, 6, 43, + 43, 43, 43, 43, 43, 43, 43, 43, + 43, 43, 43, 43, 43, 14, 15, 16, + 17, 18, 43, 2, 43, 3, 3, 43, + 5, 43, 6, 43, 43, 43, 43, 43, + 43, 43, 43, 43, 43, 43, 43, 43, + 43, 14, 15, 16, 43, 18, 43, 2, + 43, 3, 3, 43, 5, 43, 6, 43, + 43, 43, 43, 43, 43, 43, 43, 43, + 43, 43, 43, 43, 43, 14, 43, 16, + 43, 18, 43, 2, 43, 3, 3, 43, + 5, 43, 6, 43, 43, 43, 43, 43, + 43, 43, 17, 43, 43, 10, 43, 12, + 43, 14, 15, 16, 17, 18, 43, 2, + 43, 3, 3, 43, 5, 43, 6, 43, + 43, 43, 43, 43, 43, 43, 17, 43, + 43, 10, 43, 43, 43, 14, 15, 16, + 17, 18, 43, 2, 43, 3, 3, 43, + 5, 43, 6, 43, 43, 43, 43, 43, + 43, 43, 17, 43, 43, 10, 11, 12, + 43, 14, 15, 16, 17, 18, 43, 2, + 3, 3, 3, 43, 5, 43, 6, 43, + 43, 43, 43, 43, 43, 43, 8, 43, + 43, 10, 11, 12, 13, 14, 15, 16, + 17, 18, 43, 1, 1, 51, 51, 51, + 51, 51, 51, 51, 51, 1, 51, 51, + 51, 51, 1, 51, 51, 51, 51, 51, + 51, 51, 51, 51, 51, 51, 51, 51, + 51, 51, 1, 51, 52, 51, 0 }; static const char _myanmar_syllable_machine_trans_targs[] = { 0, 1, 22, 0, 0, 23, 29, 32, - 35, 36, 40, 41, 42, 25, 38, 39, - 37, 28, 43, 44, 0, 2, 12, 0, - 3, 9, 13, 14, 18, 19, 20, 5, - 16, 17, 15, 8, 21, 4, 6, 7, - 10, 11, 0, 24, 26, 27, 30, 31, - 33, 34, 0, 0 + 35, 44, 36, 40, 41, 42, 25, 38, + 39, 37, 28, 43, 45, 0, 2, 12, + 0, 3, 9, 13, 14, 18, 19, 20, + 5, 16, 17, 15, 8, 21, 4, 6, + 7, 10, 11, 0, 24, 26, 27, 30, + 31, 33, 34, 0, 0 }; static const char _myanmar_syllable_machine_trans_actions[] = { 3, 0, 0, 4, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 6, 0, 0, 7, - 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 6, 0, 0, + 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 8, 0, 0, 0, 0, 0, - 0, 0, 9, 10 + 0, 0, 0, 8, 0, 0, 0, 0, + 0, 0, 0, 9, 10 }; static const char _myanmar_syllable_machine_to_state_actions[] = { @@ -233,7 +237,7 @@ static const char _myanmar_syllable_machine_to_state_actions[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0 + 0, 0, 0, 0, 0, 0 }; static const char _myanmar_syllable_machine_from_state_actions[] = { @@ -242,16 +246,16 @@ static const char _myanmar_syllable_machine_from_state_actions[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0 + 0, 0, 0, 0, 0, 0 }; static const short _myanmar_syllable_machine_eof_trans[] = { - 0, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 43, 43, - 43, 43, 43, 43, 43, 43, 43, 43, - 21, 21, 43, 43, 43, 43, 43, 43, - 43, 43, 43, 43, 51 + 0, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 44, 44, + 44, 44, 44, 44, 44, 44, 44, 44, + 22, 22, 44, 44, 44, 44, 44, 44, + 44, 44, 44, 44, 52, 52 }; static const int myanmar_syllable_machine_start = 0; @@ -261,11 +265,11 @@ static const int myanmar_syllable_machine_error = -1; static const int myanmar_syllable_machine_en_main = 0; -#line 36 "../../src/hb-ot-shape-complex-myanmar-machine.rl" +#line 36 "hb-ot-shape-complex-myanmar-machine.rl" -#line 93 "../../src/hb-ot-shape-complex-myanmar-machine.rl" +#line 94 "hb-ot-shape-complex-myanmar-machine.rl" #define found_syllable(syllable_type) \ @@ -285,7 +289,7 @@ find_syllables (hb_buffer_t *buffer) int cs; hb_glyph_info_t *info = buffer->info; -#line 289 "../../src/hb-ot-shape-complex-myanmar-machine.hh.tmp" +#line 293 "hb-ot-shape-complex-myanmar-machine.hh" { cs = myanmar_syllable_machine_start; ts = 0; @@ -293,7 +297,7 @@ find_syllables (hb_buffer_t *buffer) act = 0; } -#line 114 "../../src/hb-ot-shape-complex-myanmar-machine.rl" +#line 115 "hb-ot-shape-complex-myanmar-machine.rl" p = 0; @@ -302,7 +306,7 @@ find_syllables (hb_buffer_t *buffer) unsigned int last = 0; unsigned int syllable_serial = 1; -#line 306 "../../src/hb-ot-shape-complex-myanmar-machine.hh.tmp" +#line 310 "hb-ot-shape-complex-myanmar-machine.hh" { int _slen; int _trans; @@ -316,7 +320,7 @@ _resume: #line 1 "NONE" {ts = p;} break; -#line 320 "../../src/hb-ot-shape-complex-myanmar-machine.hh.tmp" +#line 324 "hb-ot-shape-complex-myanmar-machine.hh" } _keys = _myanmar_syllable_machine_trans_keys + (cs<<1); @@ -335,38 +339,38 @@ _eof_trans: switch ( _myanmar_syllable_machine_trans_actions[_trans] ) { case 7: -#line 85 "../../src/hb-ot-shape-complex-myanmar-machine.rl" +#line 86 "hb-ot-shape-complex-myanmar-machine.rl" {te = p+1;{ found_syllable (consonant_syllable); }} break; case 5: -#line 86 "../../src/hb-ot-shape-complex-myanmar-machine.rl" +#line 87 "hb-ot-shape-complex-myanmar-machine.rl" {te = p+1;{ found_syllable (non_myanmar_cluster); }} break; case 10: -#line 87 "../../src/hb-ot-shape-complex-myanmar-machine.rl" +#line 88 "hb-ot-shape-complex-myanmar-machine.rl" {te = p+1;{ found_syllable (punctuation_cluster); }} break; case 4: -#line 88 "../../src/hb-ot-shape-complex-myanmar-machine.rl" +#line 89 "hb-ot-shape-complex-myanmar-machine.rl" {te = p+1;{ found_syllable (broken_cluster); }} break; case 3: -#line 89 "../../src/hb-ot-shape-complex-myanmar-machine.rl" +#line 90 "hb-ot-shape-complex-myanmar-machine.rl" {te = p+1;{ found_syllable (non_myanmar_cluster); }} break; case 6: -#line 85 "../../src/hb-ot-shape-complex-myanmar-machine.rl" +#line 86 "hb-ot-shape-complex-myanmar-machine.rl" {te = p;p--;{ found_syllable (consonant_syllable); }} break; case 8: -#line 88 "../../src/hb-ot-shape-complex-myanmar-machine.rl" +#line 89 "hb-ot-shape-complex-myanmar-machine.rl" {te = p;p--;{ found_syllable (broken_cluster); }} break; case 9: -#line 89 "../../src/hb-ot-shape-complex-myanmar-machine.rl" +#line 90 "hb-ot-shape-complex-myanmar-machine.rl" {te = p;p--;{ found_syllable (non_myanmar_cluster); }} break; -#line 370 "../../src/hb-ot-shape-complex-myanmar-machine.hh.tmp" +#line 374 "hb-ot-shape-complex-myanmar-machine.hh" } _again: @@ -375,7 +379,7 @@ _again: #line 1 "NONE" {ts = 0;} break; -#line 379 "../../src/hb-ot-shape-complex-myanmar-machine.hh.tmp" +#line 383 "hb-ot-shape-complex-myanmar-machine.hh" } if ( ++p != pe ) @@ -391,7 +395,7 @@ _again: } -#line 123 "../../src/hb-ot-shape-complex-myanmar-machine.rl" +#line 124 "hb-ot-shape-complex-myanmar-machine.rl" } diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-myanmar-machine.rl b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-myanmar-machine.rl index 9649a916f02..45733ac733e 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-myanmar-machine.rl +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-myanmar-machine.rl @@ -41,7 +41,7 @@ A = 10; As = 18; C = 1; -D = 19; +D = 32; D0 = 20; DB = 3; GB = 11; @@ -62,6 +62,7 @@ ZWJ = 6; ZWNJ = 5; Ra = 16; P = 31; +CS = 19; j = ZWJ|ZWNJ; # Joiners k = (Ra As H); # Kinzi @@ -76,7 +77,7 @@ pwo_tone_group = PT A* DB? As?; complex_syllable_tail = As* medial_group main_vowel_group post_vowel_group* pwo_tone_group* V* j?; syllable_tail = (H | complex_syllable_tail); -consonant_syllable = k? (c|IV|D|GB).VS? (H (c|IV).VS?)* syllable_tail; +consonant_syllable = (k|CS)? (c|IV|D|GB).VS? (H (c|IV).VS?)* syllable_tail; punctuation_cluster = P V; broken_cluster = k? VS? syllable_tail; other = any; diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-myanmar.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-myanmar.cc index ebd2b40966f..4081ed03de5 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-myanmar.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-myanmar.cc @@ -130,8 +130,7 @@ enum syllable_type_t { /* Note: This enum is duplicated in the -machine.rl source file. * Not sure how to avoid duplication. */ enum myanmar_category_t { - OT_As = 18, /* Asat */ - OT_D = 19, /* Digits except zero */ + OT_As = 18, /* Asat */ OT_D0 = 20, /* Digit zero */ OT_DB = OT_N, /* Dot below */ OT_GB = OT_PLACEHOLDER, @@ -145,7 +144,8 @@ enum myanmar_category_t { OT_VPre = 28, OT_VPst = 29, OT_VS = 30, /* Variation selectors */ - OT_P = 31 /* Punctuation */ + OT_P = 31, /* Punctuation */ + OT_D = 32, /* Digits except zero */ }; @@ -524,6 +524,7 @@ const hb_ot_complex_shaper_t _hb_ot_complex_shaper_myanmar_old = NULL, /* compose */ NULL, /* setup_masks */ NULL, /* disable_otl */ + NULL, /* reorder_marks */ HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_LATE, true, /* fallback_position */ }; @@ -542,6 +543,7 @@ const hb_ot_complex_shaper_t _hb_ot_complex_shaper_myanmar = NULL, /* compose */ setup_masks_myanmar, NULL, /* disable_otl */ + NULL, /* reorder_marks */ HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_EARLY, false, /* fallback_position */ }; diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-private.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-private.hh index 952441b6a59..9792067110b 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-private.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-private.hh @@ -39,6 +39,8 @@ #define complex_var_u8_1() var2.u8[3] +#define HB_OT_SHAPE_COMPLEX_MAX_COMBINING_MARKS 32 + enum hb_ot_shape_zero_width_marks_type_t { HB_OT_SHAPE_ZERO_WIDTH_MARKS_NONE, HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_EARLY, @@ -154,6 +156,16 @@ struct hb_ot_complex_shaper_t */ bool (*disable_otl) (const hb_ot_shape_plan_t *plan); + /* reorder_marks() + * Called during shape(). + * Shapers can use to modify ordering of combining marks. + * May be NULL. + */ + void (*reorder_marks) (const hb_ot_shape_plan_t *plan, + hb_buffer_t *buffer, + unsigned int start, + unsigned int end); + hb_ot_shape_zero_width_marks_type_t zero_width_marks; bool fallback_position; @@ -253,10 +265,12 @@ hb_ot_shape_complex_categorize (const hb_ot_shape_planner_t *planner) case HB_SCRIPT_SINHALA: /* If the designer designed the font for the 'DFLT' script, - * use the default shaper. Otherwise, use the specific shaper. + * (or we ended up arbitrarily pick 'latn'), use the default shaper. + * Otherwise, use the specific shaper. * Note that for some simple scripts, there may not be *any* * GSUB/GPOS needed, so there may be no scripts found! */ - if (planner->map.chosen_script[0] == HB_TAG ('D','F','L','T')) + if (planner->map.chosen_script[0] == HB_TAG ('D','F','L','T') || + planner->map.chosen_script[0] == HB_TAG ('l','a','t','n')) return &_hb_ot_complex_shaper_default; else return &_hb_ot_complex_shaper_indic; @@ -362,11 +376,18 @@ hb_ot_shape_complex_categorize (const hb_ot_shape_planner_t *planner) case HB_SCRIPT_MARCHEN: case HB_SCRIPT_NEWA: + /* Unicode-10.0 additions */ + case HB_SCRIPT_MASARAM_GONDI: + case HB_SCRIPT_SOYOMBO: + case HB_SCRIPT_ZANABAZAR_SQUARE: + /* If the designer designed the font for the 'DFLT' script, - * use the default shaper. Otherwise, use the specific shaper. + * (or we ended up arbitrarily pick 'latn'), use the default shaper. + * Otherwise, use the specific shaper. * Note that for some simple scripts, there may not be *any* * GSUB/GPOS needed, so there may be no scripts found! */ - if (planner->map.chosen_script[0] == HB_TAG ('D','F','L','T')) + if (planner->map.chosen_script[0] == HB_TAG ('D','F','L','T') || + planner->map.chosen_script[0] == HB_TAG ('l','a','t','n')) return &_hb_ot_complex_shaper_default; else return &_hb_ot_complex_shaper_use; diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-thai.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-thai.cc index 924247f1742..651c47f8f51 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-thai.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-thai.cc @@ -378,6 +378,7 @@ const hb_ot_complex_shaper_t _hb_ot_complex_shaper_thai = NULL, /* compose */ NULL, /* setup_masks */ NULL, /* disable_otl */ + NULL, /* reorder_marks */ HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_LATE, false,/* fallback_position */ }; diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-tibetan.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-tibetan.cc index aadf59f5add..a85ac0f4b86 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-tibetan.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-tibetan.cc @@ -58,6 +58,7 @@ const hb_ot_complex_shaper_t _hb_ot_complex_shaper_tibetan = NULL, /* compose */ NULL, /* setup_masks */ NULL, /* disable_otl */ + NULL, /* reorder_marks */ HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_LATE, true, /* fallback_position */ }; diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-use-machine.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-use-machine.hh index 1847c48afd9..4f6727186de 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-use-machine.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-use-machine.hh @@ -36,33 +36,33 @@ #line 38 "hb-ot-shape-complex-use-machine.hh" static const unsigned char _use_syllable_machine_trans_keys[] = { - 1u, 1u, 0u, 39u, 21u, 21u, 8u, 39u, 8u, 39u, 1u, 1u, 8u, 39u, 8u, 39u, + 1u, 1u, 0u, 43u, 21u, 21u, 8u, 39u, 8u, 39u, 1u, 1u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 26u, 8u, 26u, 8u, 26u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 13u, 21u, 4u, 4u, 13u, 13u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 26u, 8u, 26u, 8u, 26u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 1u, 1u, 1u, 39u, 8u, 39u, - 21u, 42u, 41u, 42u, 42u, 42u, 0 + 21u, 42u, 41u, 42u, 42u, 42u, 1u, 5u, 0 }; static const char _use_syllable_machine_key_spans[] = { - 1, 40, 1, 32, 32, 1, 32, 32, + 1, 44, 1, 32, 32, 1, 32, 32, 32, 19, 19, 19, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 9, 1, 1, 32, 32, 32, 32, 19, 19, 19, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 1, 39, 32, - 22, 2, 1 + 22, 2, 1, 5 }; static const short _use_syllable_machine_index_offsets[] = { - 0, 2, 43, 45, 78, 111, 113, 146, - 179, 212, 232, 252, 272, 305, 338, 371, - 404, 437, 470, 503, 536, 569, 602, 635, - 668, 678, 680, 682, 715, 748, 781, 814, - 834, 854, 874, 907, 940, 973, 1006, 1039, - 1072, 1105, 1138, 1171, 1204, 1237, 1239, 1279, - 1312, 1335, 1338 + 0, 2, 47, 49, 82, 115, 117, 150, + 183, 216, 236, 256, 276, 309, 342, 375, + 408, 441, 474, 507, 540, 573, 606, 639, + 672, 682, 684, 686, 719, 752, 785, 818, + 838, 858, 878, 911, 944, 977, 1010, 1043, + 1076, 1109, 1142, 1175, 1208, 1241, 1243, 1283, + 1316, 1339, 1342, 1344 }; static const char _use_syllable_machine_indicies[] = { @@ -71,191 +71,192 @@ static const char _use_syllable_machine_indicies[] = { 4, 4, 2, 2, 8, 9, 4, 4, 10, 11, 12, 13, 14, 15, 16, 10, 17, 18, 19, 20, 21, 22, 4, 23, - 24, 25, 4, 27, 26, 29, 28, 28, - 30, 31, 28, 28, 28, 28, 28, 28, - 28, 28, 32, 33, 34, 35, 36, 37, - 38, 39, 33, 40, 32, 41, 42, 43, - 44, 28, 45, 46, 47, 28, 29, 28, - 28, 30, 31, 28, 28, 28, 28, 28, - 28, 28, 28, 48, 33, 34, 35, 36, - 37, 38, 39, 33, 40, 41, 41, 42, - 43, 44, 28, 45, 46, 47, 28, 30, - 49, 29, 28, 28, 30, 31, 28, 28, - 28, 28, 28, 28, 28, 28, 28, 33, - 34, 35, 36, 37, 38, 39, 33, 40, - 41, 41, 42, 43, 44, 28, 45, 46, - 47, 28, 29, 28, 28, 28, 28, 28, - 28, 28, 28, 28, 28, 28, 28, 28, - 33, 34, 35, 36, 37, 28, 28, 28, - 28, 28, 28, 42, 43, 44, 28, 45, - 46, 47, 28, 29, 28, 28, 28, 28, - 28, 28, 28, 28, 28, 28, 28, 28, - 28, 28, 34, 35, 36, 37, 28, 28, - 28, 28, 28, 28, 28, 28, 28, 28, - 45, 46, 47, 28, 29, 28, 28, 28, - 28, 28, 28, 28, 28, 28, 28, 28, - 28, 28, 28, 28, 35, 36, 37, 28, - 29, 28, 28, 28, 28, 28, 28, 28, - 28, 28, 28, 28, 28, 28, 28, 28, - 28, 36, 37, 28, 29, 28, 28, 28, - 28, 28, 28, 28, 28, 28, 28, 28, - 28, 28, 28, 28, 28, 28, 37, 28, - 29, 28, 28, 28, 28, 28, 28, 28, - 28, 28, 28, 28, 28, 28, 28, 28, - 35, 36, 37, 28, 28, 28, 28, 28, - 28, 28, 28, 28, 28, 45, 46, 47, - 28, 29, 28, 28, 28, 28, 28, 28, - 28, 28, 28, 28, 28, 28, 28, 28, - 28, 35, 36, 37, 28, 28, 28, 28, - 28, 28, 28, 28, 28, 28, 28, 46, - 47, 28, 29, 28, 28, 28, 28, 28, - 28, 28, 28, 28, 28, 28, 28, 28, - 28, 28, 35, 36, 37, 28, 28, 28, - 28, 28, 28, 28, 28, 28, 28, 28, - 28, 47, 28, 29, 28, 28, 28, 28, - 28, 28, 28, 28, 28, 28, 28, 28, - 28, 28, 34, 35, 36, 37, 28, 28, - 28, 28, 28, 28, 42, 43, 44, 28, - 45, 46, 47, 28, 29, 28, 28, 28, - 28, 28, 28, 28, 28, 28, 28, 28, - 28, 28, 28, 34, 35, 36, 37, 28, - 28, 28, 28, 28, 28, 28, 43, 44, - 28, 45, 46, 47, 28, 29, 28, 28, - 28, 28, 28, 28, 28, 28, 28, 28, - 28, 28, 28, 28, 34, 35, 36, 37, - 28, 28, 28, 28, 28, 28, 28, 28, - 44, 28, 45, 46, 47, 28, 29, 28, - 28, 28, 28, 28, 28, 28, 28, 28, - 28, 28, 28, 28, 33, 34, 35, 36, - 37, 28, 39, 33, 28, 28, 28, 42, - 43, 44, 28, 45, 46, 47, 28, 29, - 28, 28, 28, 28, 28, 28, 28, 28, - 28, 28, 28, 28, 28, 33, 34, 35, - 36, 37, 28, 50, 33, 28, 28, 28, - 42, 43, 44, 28, 45, 46, 47, 28, - 29, 28, 28, 28, 28, 28, 28, 28, - 28, 28, 28, 28, 28, 28, 33, 34, - 35, 36, 37, 28, 28, 33, 28, 28, - 28, 42, 43, 44, 28, 45, 46, 47, - 28, 29, 28, 28, 28, 28, 28, 28, - 28, 28, 28, 28, 28, 28, 28, 33, - 34, 35, 36, 37, 38, 39, 33, 28, - 28, 28, 42, 43, 44, 28, 45, 46, - 47, 28, 29, 28, 28, 30, 31, 28, - 28, 28, 28, 28, 28, 28, 28, 28, - 33, 34, 35, 36, 37, 38, 39, 33, - 40, 28, 41, 42, 43, 44, 28, 45, - 46, 47, 28, 29, 28, 28, 30, 31, - 28, 28, 28, 28, 28, 28, 28, 28, - 28, 33, 34, 35, 36, 37, 38, 39, - 33, 40, 32, 41, 42, 43, 44, 28, - 45, 46, 47, 28, 52, 51, 51, 51, - 51, 51, 51, 51, 53, 51, 5, 54, - 52, 51, 6, 55, 55, 1, 56, 55, - 55, 55, 55, 55, 55, 55, 55, 57, + 24, 25, 4, 4, 4, 26, 4, 28, + 27, 30, 29, 29, 31, 32, 29, 29, + 29, 29, 29, 29, 29, 29, 33, 34, + 35, 36, 37, 38, 39, 40, 34, 41, + 33, 42, 43, 44, 45, 29, 46, 47, + 48, 29, 30, 29, 29, 31, 32, 29, + 29, 29, 29, 29, 29, 29, 29, 49, + 34, 35, 36, 37, 38, 39, 40, 34, + 41, 42, 42, 43, 44, 45, 29, 46, + 47, 48, 29, 31, 50, 30, 29, 29, + 31, 32, 29, 29, 29, 29, 29, 29, + 29, 29, 29, 34, 35, 36, 37, 38, + 39, 40, 34, 41, 42, 42, 43, 44, + 45, 29, 46, 47, 48, 29, 30, 29, + 29, 29, 29, 29, 29, 29, 29, 29, + 29, 29, 29, 29, 34, 35, 36, 37, + 38, 29, 29, 29, 29, 29, 29, 43, + 44, 45, 29, 46, 47, 48, 29, 30, + 29, 29, 29, 29, 29, 29, 29, 29, + 29, 29, 29, 29, 29, 29, 35, 36, + 37, 38, 29, 29, 29, 29, 29, 29, + 29, 29, 29, 29, 46, 47, 48, 29, + 30, 29, 29, 29, 29, 29, 29, 29, + 29, 29, 29, 29, 29, 29, 29, 29, + 36, 37, 38, 29, 30, 29, 29, 29, + 29, 29, 29, 29, 29, 29, 29, 29, + 29, 29, 29, 29, 29, 37, 38, 29, + 30, 29, 29, 29, 29, 29, 29, 29, + 29, 29, 29, 29, 29, 29, 29, 29, + 29, 29, 38, 29, 30, 29, 29, 29, + 29, 29, 29, 29, 29, 29, 29, 29, + 29, 29, 29, 29, 36, 37, 38, 29, + 29, 29, 29, 29, 29, 29, 29, 29, + 29, 46, 47, 48, 29, 30, 29, 29, + 29, 29, 29, 29, 29, 29, 29, 29, + 29, 29, 29, 29, 29, 36, 37, 38, + 29, 29, 29, 29, 29, 29, 29, 29, + 29, 29, 29, 47, 48, 29, 30, 29, + 29, 29, 29, 29, 29, 29, 29, 29, + 29, 29, 29, 29, 29, 29, 36, 37, + 38, 29, 29, 29, 29, 29, 29, 29, + 29, 29, 29, 29, 29, 48, 29, 30, + 29, 29, 29, 29, 29, 29, 29, 29, + 29, 29, 29, 29, 29, 29, 35, 36, + 37, 38, 29, 29, 29, 29, 29, 29, + 43, 44, 45, 29, 46, 47, 48, 29, + 30, 29, 29, 29, 29, 29, 29, 29, + 29, 29, 29, 29, 29, 29, 29, 35, + 36, 37, 38, 29, 29, 29, 29, 29, + 29, 29, 44, 45, 29, 46, 47, 48, + 29, 30, 29, 29, 29, 29, 29, 29, + 29, 29, 29, 29, 29, 29, 29, 29, + 35, 36, 37, 38, 29, 29, 29, 29, + 29, 29, 29, 29, 45, 29, 46, 47, + 48, 29, 30, 29, 29, 29, 29, 29, + 29, 29, 29, 29, 29, 29, 29, 29, + 34, 35, 36, 37, 38, 29, 40, 34, + 29, 29, 29, 43, 44, 45, 29, 46, + 47, 48, 29, 30, 29, 29, 29, 29, + 29, 29, 29, 29, 29, 29, 29, 29, + 29, 34, 35, 36, 37, 38, 29, 51, + 34, 29, 29, 29, 43, 44, 45, 29, + 46, 47, 48, 29, 30, 29, 29, 29, + 29, 29, 29, 29, 29, 29, 29, 29, + 29, 29, 34, 35, 36, 37, 38, 29, + 29, 34, 29, 29, 29, 43, 44, 45, + 29, 46, 47, 48, 29, 30, 29, 29, + 29, 29, 29, 29, 29, 29, 29, 29, + 29, 29, 29, 34, 35, 36, 37, 38, + 39, 40, 34, 29, 29, 29, 43, 44, + 45, 29, 46, 47, 48, 29, 30, 29, + 29, 31, 32, 29, 29, 29, 29, 29, + 29, 29, 29, 29, 34, 35, 36, 37, + 38, 39, 40, 34, 41, 29, 42, 43, + 44, 45, 29, 46, 47, 48, 29, 30, + 29, 29, 31, 32, 29, 29, 29, 29, + 29, 29, 29, 29, 29, 34, 35, 36, + 37, 38, 39, 40, 34, 41, 33, 42, + 43, 44, 45, 29, 46, 47, 48, 29, + 53, 52, 52, 52, 52, 52, 52, 52, + 54, 52, 5, 55, 53, 52, 6, 56, + 56, 1, 57, 56, 56, 56, 56, 56, + 56, 56, 56, 58, 10, 11, 12, 13, + 14, 15, 16, 10, 17, 19, 19, 20, + 21, 22, 56, 23, 24, 25, 56, 6, + 56, 56, 1, 57, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 10, 11, 12, + 13, 14, 15, 16, 10, 17, 19, 19, + 20, 21, 22, 56, 23, 24, 25, 56, + 6, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 10, 11, + 12, 13, 14, 56, 56, 56, 56, 56, + 56, 20, 21, 22, 56, 23, 24, 25, + 56, 6, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, + 11, 12, 13, 14, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 23, 24, + 25, 56, 6, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 12, 13, 14, 56, 6, 56, + 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 13, + 14, 56, 6, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 14, 56, 6, 56, + 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 12, 13, + 14, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 23, 24, 25, 56, 6, + 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 12, + 13, 14, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 24, 25, 56, + 6, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, + 12, 13, 14, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 25, + 56, 6, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, + 11, 12, 13, 14, 56, 56, 56, 56, + 56, 56, 20, 21, 22, 56, 23, 24, + 25, 56, 6, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, + 56, 11, 12, 13, 14, 56, 56, 56, + 56, 56, 56, 56, 21, 22, 56, 23, + 24, 25, 56, 6, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 11, 12, 13, 14, 56, 56, + 56, 56, 56, 56, 56, 56, 22, 56, + 23, 24, 25, 56, 6, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 10, 11, 12, 13, 14, 56, + 16, 10, 56, 56, 56, 20, 21, 22, + 56, 23, 24, 25, 56, 6, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 10, 11, 12, 13, 14, + 56, 59, 10, 56, 56, 56, 20, 21, + 22, 56, 23, 24, 25, 56, 6, 56, + 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 10, 11, 12, 13, + 14, 56, 56, 10, 56, 56, 56, 20, + 21, 22, 56, 23, 24, 25, 56, 6, + 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 10, 11, 12, + 13, 14, 15, 16, 10, 56, 56, 56, + 20, 21, 22, 56, 23, 24, 25, 56, + 6, 56, 56, 1, 57, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 10, 11, + 12, 13, 14, 15, 16, 10, 17, 56, + 19, 20, 21, 22, 56, 23, 24, 25, + 56, 1, 60, 3, 56, 56, 56, 3, + 56, 56, 6, 56, 56, 1, 57, 56, + 56, 56, 56, 56, 56, 56, 56, 56, 10, 11, 12, 13, 14, 15, 16, 10, - 17, 19, 19, 20, 21, 22, 55, 23, - 24, 25, 55, 6, 55, 55, 1, 56, - 55, 55, 55, 55, 55, 55, 55, 55, - 55, 10, 11, 12, 13, 14, 15, 16, - 10, 17, 19, 19, 20, 21, 22, 55, - 23, 24, 25, 55, 6, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 10, 11, 12, 13, 14, 55, - 55, 55, 55, 55, 55, 20, 21, 22, - 55, 23, 24, 25, 55, 6, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 11, 12, 13, 14, - 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 23, 24, 25, 55, 6, 55, - 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 12, 13, - 14, 55, 6, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 13, 14, 55, 6, 55, - 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, - 14, 55, 6, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 12, 13, 14, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 23, - 24, 25, 55, 6, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 12, 13, 14, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, - 55, 24, 25, 55, 6, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 12, 13, 14, 55, - 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 25, 55, 6, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 11, 12, 13, 14, - 55, 55, 55, 55, 55, 55, 20, 21, - 22, 55, 23, 24, 25, 55, 6, 55, - 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 11, 12, 13, - 14, 55, 55, 55, 55, 55, 55, 55, - 21, 22, 55, 23, 24, 25, 55, 6, - 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 11, 12, - 13, 14, 55, 55, 55, 55, 55, 55, - 55, 55, 22, 55, 23, 24, 25, 55, - 6, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 10, 11, - 12, 13, 14, 55, 16, 10, 55, 55, - 55, 20, 21, 22, 55, 23, 24, 25, - 55, 6, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 10, - 11, 12, 13, 14, 55, 58, 10, 55, - 55, 55, 20, 21, 22, 55, 23, 24, - 25, 55, 6, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, - 10, 11, 12, 13, 14, 55, 55, 10, - 55, 55, 55, 20, 21, 22, 55, 23, - 24, 25, 55, 6, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, - 55, 10, 11, 12, 13, 14, 15, 16, - 10, 55, 55, 55, 20, 21, 22, 55, - 23, 24, 25, 55, 6, 55, 55, 1, - 56, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 10, 11, 12, 13, 14, 15, - 16, 10, 17, 55, 19, 20, 21, 22, - 55, 23, 24, 25, 55, 1, 59, 3, - 55, 55, 55, 3, 55, 55, 6, 55, - 55, 1, 56, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 10, 11, 12, 13, - 14, 15, 16, 10, 17, 18, 19, 20, - 21, 22, 55, 23, 24, 25, 55, 6, - 55, 55, 1, 56, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 10, 11, 12, - 13, 14, 15, 16, 10, 17, 18, 19, - 20, 21, 22, 55, 23, 24, 25, 55, - 61, 60, 60, 60, 60, 60, 60, 60, - 60, 60, 60, 60, 60, 60, 60, 60, - 60, 60, 60, 60, 61, 62, 60, 61, - 62, 60, 62, 60, 0 + 17, 18, 19, 20, 21, 22, 56, 23, + 24, 25, 56, 6, 56, 56, 1, 57, + 56, 56, 56, 56, 56, 56, 56, 56, + 56, 10, 11, 12, 13, 14, 15, 16, + 10, 17, 18, 19, 20, 21, 22, 56, + 23, 24, 25, 56, 62, 61, 61, 61, + 61, 61, 61, 61, 61, 61, 61, 61, + 61, 61, 61, 61, 61, 61, 61, 61, + 62, 63, 61, 62, 63, 61, 63, 61, + 3, 60, 60, 60, 3, 60, 0 }; static const char _use_syllable_machine_trans_targs[] = { 1, 27, 2, 3, 1, 24, 1, 45, 46, 48, 29, 30, 31, 32, 33, 40, 41, 43, 47, 44, 37, 38, 39, 34, - 35, 36, 1, 1, 1, 1, 4, 5, - 23, 7, 8, 9, 10, 11, 18, 19, - 21, 22, 15, 16, 17, 12, 13, 14, - 6, 1, 20, 1, 25, 26, 1, 1, - 0, 28, 42, 1, 1, 49, 50 + 35, 36, 51, 1, 1, 1, 1, 4, + 5, 23, 7, 8, 9, 10, 11, 18, + 19, 21, 22, 15, 16, 17, 12, 13, + 14, 6, 1, 20, 1, 25, 26, 1, + 1, 0, 28, 42, 1, 1, 49, 50 }; static const char _use_syllable_machine_trans_actions[] = { 1, 2, 0, 0, 5, 0, 6, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, - 0, 0, 7, 8, 9, 10, 0, 0, + 0, 0, 0, 7, 8, 9, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 11, 0, 12, 0, 0, 13, 14, - 0, 2, 0, 15, 16, 0, 0 + 0, 0, 11, 0, 12, 0, 0, 13, + 14, 0, 2, 0, 15, 16, 0, 0 }; static const char _use_syllable_machine_to_state_actions[] = { @@ -265,7 +266,7 @@ static const char _use_syllable_machine_to_state_actions[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0 + 0, 0, 0, 0 }; static const char _use_syllable_machine_from_state_actions[] = { @@ -275,17 +276,17 @@ static const char _use_syllable_machine_from_state_actions[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0 + 0, 0, 0, 0 }; static const short _use_syllable_machine_eof_trans[] = { - 1, 0, 27, 29, 29, 50, 29, 29, - 29, 29, 29, 29, 29, 29, 29, 29, - 29, 29, 29, 29, 29, 29, 29, 29, - 52, 55, 52, 56, 56, 56, 56, 56, - 56, 56, 56, 56, 56, 56, 56, 56, - 56, 56, 56, 56, 56, 60, 56, 56, - 61, 61, 61 + 1, 0, 28, 30, 30, 51, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 30, 30, 30, 30, 30, + 53, 56, 53, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 61, 57, 57, + 62, 62, 62, 61 }; static const int use_syllable_machine_start = 1; @@ -299,7 +300,7 @@ static const int use_syllable_machine_en_main = 1; -#line 139 "hb-ot-shape-complex-use-machine.rl" +#line 140 "hb-ot-shape-complex-use-machine.rl" #define found_syllable(syllable_type) \ @@ -319,7 +320,7 @@ find_syllables (hb_buffer_t *buffer) int cs; hb_glyph_info_t *info = buffer->info; -#line 323 "hb-ot-shape-complex-use-machine.hh" +#line 324 "hb-ot-shape-complex-use-machine.hh" { cs = use_syllable_machine_start; ts = 0; @@ -327,7 +328,7 @@ find_syllables (hb_buffer_t *buffer) act = 0; } -#line 160 "hb-ot-shape-complex-use-machine.rl" +#line 161 "hb-ot-shape-complex-use-machine.rl" p = 0; @@ -336,7 +337,7 @@ find_syllables (hb_buffer_t *buffer) unsigned int last = 0; unsigned int syllable_serial = 1; -#line 340 "hb-ot-shape-complex-use-machine.hh" +#line 341 "hb-ot-shape-complex-use-machine.hh" { int _slen; int _trans; @@ -350,7 +351,7 @@ _resume: #line 1 "NONE" {ts = p;} break; -#line 354 "hb-ot-shape-complex-use-machine.hh" +#line 355 "hb-ot-shape-complex-use-machine.hh" } _keys = _use_syllable_machine_trans_keys + (cs<<1); @@ -373,58 +374,58 @@ _eof_trans: {te = p+1;} break; case 8: -#line 128 "hb-ot-shape-complex-use-machine.rl" +#line 129 "hb-ot-shape-complex-use-machine.rl" {te = p+1;{ found_syllable (independent_cluster); }} break; case 10: -#line 130 "hb-ot-shape-complex-use-machine.rl" +#line 131 "hb-ot-shape-complex-use-machine.rl" {te = p+1;{ found_syllable (standard_cluster); }} break; case 6: -#line 134 "hb-ot-shape-complex-use-machine.rl" +#line 135 "hb-ot-shape-complex-use-machine.rl" {te = p+1;{ found_syllable (broken_cluster); }} break; case 5: -#line 135 "hb-ot-shape-complex-use-machine.rl" +#line 136 "hb-ot-shape-complex-use-machine.rl" {te = p+1;{ found_syllable (non_cluster); }} break; case 7: -#line 128 "hb-ot-shape-complex-use-machine.rl" +#line 129 "hb-ot-shape-complex-use-machine.rl" {te = p;p--;{ found_syllable (independent_cluster); }} break; case 11: -#line 129 "hb-ot-shape-complex-use-machine.rl" +#line 130 "hb-ot-shape-complex-use-machine.rl" {te = p;p--;{ found_syllable (virama_terminated_cluster); }} break; case 9: -#line 130 "hb-ot-shape-complex-use-machine.rl" +#line 131 "hb-ot-shape-complex-use-machine.rl" {te = p;p--;{ found_syllable (standard_cluster); }} break; case 13: -#line 131 "hb-ot-shape-complex-use-machine.rl" +#line 132 "hb-ot-shape-complex-use-machine.rl" {te = p;p--;{ found_syllable (number_joiner_terminated_cluster); }} break; case 12: -#line 132 "hb-ot-shape-complex-use-machine.rl" +#line 133 "hb-ot-shape-complex-use-machine.rl" {te = p;p--;{ found_syllable (numeral_cluster); }} break; case 16: -#line 133 "hb-ot-shape-complex-use-machine.rl" +#line 134 "hb-ot-shape-complex-use-machine.rl" {te = p;p--;{ found_syllable (symbol_cluster); }} break; case 14: -#line 134 "hb-ot-shape-complex-use-machine.rl" +#line 135 "hb-ot-shape-complex-use-machine.rl" {te = p;p--;{ found_syllable (broken_cluster); }} break; case 15: -#line 135 "hb-ot-shape-complex-use-machine.rl" +#line 136 "hb-ot-shape-complex-use-machine.rl" {te = p;p--;{ found_syllable (non_cluster); }} break; case 1: -#line 134 "hb-ot-shape-complex-use-machine.rl" +#line 135 "hb-ot-shape-complex-use-machine.rl" {{p = ((te))-1;}{ found_syllable (broken_cluster); }} break; -#line 428 "hb-ot-shape-complex-use-machine.hh" +#line 429 "hb-ot-shape-complex-use-machine.hh" } _again: @@ -433,7 +434,7 @@ _again: #line 1 "NONE" {ts = 0;} break; -#line 437 "hb-ot-shape-complex-use-machine.hh" +#line 438 "hb-ot-shape-complex-use-machine.hh" } if ( ++p != pe ) @@ -449,7 +450,7 @@ _again: } -#line 169 "hb-ot-shape-complex-use-machine.rl" +#line 170 "hb-ot-shape-complex-use-machine.rl" } diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-use-machine.rl b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-use-machine.rl index 2a7f75115e1..7bd8fce15e4 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-use-machine.rl +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-use-machine.rl @@ -86,6 +86,7 @@ VMPst = 39; # VOWEL_MOD_POST VMPre = 23; # VOWEL_MOD_PRE SMAbv = 41; # SYM_MOD_ABOVE SMBlw = 42; # SYM_MOD_BELOW +CS = 43; # CONS_WITH_STACKER consonant_modifiers = CMAbv* CMBlw* ((H B | SUB) VS? CMAbv? CMBlw*)*; @@ -96,12 +97,12 @@ vowel_modifiers = VMPre* VMAbv* VMBlw* VMPst*; final_consonants = FAbv* FBlw* FPst* FM?; virama_terminated_cluster = - R? (B | GB) VS? + (R|CS)? (B | GB) VS? consonant_modifiers H ; standard_cluster = - R? (B | GB) VS? + (R|CS)? (B | GB) VS? consonant_modifiers medial_consonants dependent_vowels diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-use-private.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-use-private.hh index ae428cb5eb2..3e763ae3936 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-use-private.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-use-private.hh @@ -87,7 +87,8 @@ enum use_category_t { USE_VMPst = 39, /* VOWEL_MOD_POST */ USE_VMPre = 23, /* VOWEL_MOD_PRE */ USE_SMAbv = 41, /* SYM_MOD_ABOVE */ - USE_SMBlw = 42 /* SYM_MOD_BELOW */ + USE_SMBlw = 42, /* SYM_MOD_BELOW */ + USE_CS = 43 /* CONS_WITH_STACKER */ }; HB_INTERNAL USE_TABLE_ELEMENT_TYPE diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-use-table.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-use-table.cc index 941a003aaf5..1f90fc858b4 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-use-table.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-use-table.cc @@ -6,12 +6,12 @@ * * on files with these headers: * - * # IndicSyllabicCategory-9.0.0.txt - * # Date: 2016-05-21, 02:46:00 GMT [RP] - * # IndicPositionalCategory-9.0.0.txt - * # Date: 2016-06-09, 19:33:00 GMT [RP] - * # Blocks-9.0.0.txt - * # Date: 2016-02-05, 23:48:00 GMT [KW] + * # IndicSyllabicCategory-10.0.0.txt + * # Date: 2017-05-31, 01:07:00 GMT [KW, RP] + * # IndicPositionalCategory-10.0.0.txt + * # Date: 2017-05-31, 01:07:00 GMT [RP] + * # Blocks-10.0.0.txt + * # Date: 2017-04-12, 17:30:00 GMT [KW] * UnicodeData.txt does not have a header. */ @@ -19,6 +19,7 @@ #define B USE_B /* BASE */ #define CGJ USE_CGJ /* CGJ */ +#define CS USE_CS /* CONS_WITH_STACKER */ #define FM USE_FM /* CONS_FINAL_MOD */ #define GB USE_GB /* BASE_OTHER */ #define H USE_H /* HALANT */ @@ -97,7 +98,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = { /* 09C0 */ VPst, VBlw, VBlw, VBlw, VBlw, O, O, VPre, VPre, O, O, VPre, VPre, H, IND, O, /* 09D0 */ O, O, O, O, O, O, O, VPst, O, O, O, O, B, B, O, B, /* 09E0 */ B, B, VBlw, VBlw, O, O, B, B, B, B, B, B, B, B, B, B, - /* 09F0 */ B, B, O, O, O, O, O, O, O, O, O, O, O, O, O, O, + /* 09F0 */ B, B, O, O, O, O, O, O, O, O, O, O, B, O, O, O, /* Gurmukhi */ @@ -119,7 +120,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = { /* 0AC0 */ VPst, VBlw, VBlw, VBlw, VBlw, VAbv, O, VAbv, VAbv, VAbv, O, VPst, VPst, H, O, O, /* 0AD0 */ O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, /* 0AE0 */ B, B, VBlw, VBlw, O, O, B, B, B, B, B, B, B, B, B, B, - /* 0AF0 */ O, O, O, O, O, O, O, O, O, B, O, O, O, O, O, O, + /* 0AF0 */ O, O, O, O, O, O, O, O, O, B, VMAbv, VMAbv, VMAbv, CMAbv, CMAbv, CMAbv, /* Oriya */ @@ -163,14 +164,14 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = { /* 0CC0 */ VAbv, VPst, VPst, VPst, VPst, O, VAbv, VAbv, VAbv, O, VAbv, VAbv, VAbv, H, O, O, /* 0CD0 */ O, O, O, O, O, VPst, VPst, O, O, O, O, O, O, O, B, O, /* 0CE0 */ B, B, VBlw, VBlw, O, O, B, B, B, B, B, B, B, B, B, B, - /* 0CF0 */ O, R, R, O, O, O, O, O, O, O, O, O, O, O, O, O, + /* 0CF0 */ O, CS, CS, O, O, O, O, O, O, O, O, O, O, O, O, O, /* Malayalam */ - /* 0D00 */ O, VMAbv, VMPst, VMPst, O, B, B, B, B, B, B, B, B, O, B, B, + /* 0D00 */ VMAbv, VMAbv, VMPst, VMPst, O, B, B, B, B, B, B, B, B, O, B, B, /* 0D10 */ B, O, B, B, B, B, B, B, B, B, B, B, B, B, B, B, /* 0D20 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, - /* 0D30 */ B, B, B, B, B, B, B, B, B, B, B, O, O, B, VPst, VPst, + /* 0D30 */ B, B, B, B, B, B, B, B, B, B, B, VAbv, VAbv, B, VPst, VPst, /* 0D40 */ VPst, VPst, VPst, VBlw, VBlw, O, VPre, VPre, VPre, O, VPre, VPre, VPre, H, R, O, /* 0D50 */ O, O, O, O, IND, IND, IND, VPst, O, O, O, O, O, O, O, B, /* 0D60 */ B, B, VBlw, VBlw, O, O, B, B, B, B, B, B, B, B, B, B, @@ -274,9 +275,9 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = { /* 1A20 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, /* 1A30 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, /* 1A40 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, - /* 1A50 */ B, B, B, B, B, MPre, MBlw, FPst, FAbv, FAbv, FAbv, FBlw, FBlw, FBlw, FBlw, O, + /* 1A50 */ B, B, B, B, B, MPre, MBlw, SUB, FAbv, FAbv, FAbv, SUB, SUB, SUB, SUB, O, /* 1A60 */ H, VPst, VAbv, VPst, VPst, VAbv, VAbv, VAbv, VAbv, VBlw, VBlw, VAbv, VBlw, VPst, VPre, VPre, - /* 1A70 */ VPre, VPre, VPre, VAbv, VAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, FM, FM, FM, O, O, FM, + /* 1A70 */ VPre, VPre, VPre, VAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VAbv, FM, FM, O, O, FBlw, /* 1A80 */ B, B, B, B, B, B, B, B, B, B, O, O, O, O, O, O, /* 1A90 */ B, B, B, B, B, B, B, B, B, B, O, O, O, O, O, O, @@ -323,7 +324,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = { /* 1CD0 */ VMAbv, VMAbv, VMAbv, O, VMBlw, VMBlw, VMBlw, VMBlw, VMBlw, VMBlw, VMAbv, VMAbv, VMBlw, VMBlw, VMBlw, VMBlw, /* 1CE0 */ VMAbv, VMPst, VMBlw, VMBlw, VMBlw, VMBlw, VMBlw, VMBlw, VMBlw, O, O, O, O, VMBlw, O, O, - /* 1CF0 */ O, O, VMPst, VMPst, VMAbv, O, O, O, VMAbv, VMAbv, O, O, O, O, O, O, + /* 1CF0 */ O, O, VMPst, VMPst, VMAbv, O, O, VMPst, VMAbv, VMAbv, O, O, O, O, O, O, #define use_offset_0x1df8u 2552 @@ -376,7 +377,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = { /* Devanagari Extended */ /* A8E0 */ VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, - /* A8F0 */ VMAbv, VMAbv, O, O, O, O, O, O, O, O, O, O, O, O, O, O, + /* A8F0 */ VMAbv, VMAbv, B, B, O, O, O, O, O, O, O, O, O, O, O, O, /* Kayah Li */ @@ -397,7 +398,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = { /* A980 */ VMAbv, VMAbv, FAbv, VMPst, B, B, B, B, B, B, B, B, B, B, B, B, /* A990 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, /* A9A0 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, - /* A9B0 */ B, B, B, CMAbv, VPst, VPst, VAbv, VAbv, VBlw, VBlw, VPre, VPre, VAbv, SUB, MPst, MPst, + /* A9B0 */ B, B, B, CMAbv, VPst, VPst, VAbv, VAbv, VBlw, VBlw, VPre, VPre, VAbv, SUB, MPst, MBlw, /* A9C0 */ H, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, /* A9D0 */ B, B, B, B, B, B, B, B, B, B, O, O, O, O, O, O, @@ -467,7 +468,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = { /* Brahmi */ - /* 11000 */ VMPst, VMAbv, VMPst, R, R, B, B, B, B, B, B, B, B, B, B, B, + /* 11000 */ VMPst, VMAbv, VMPst, CS, CS, B, B, B, B, B, B, B, B, B, B, B, /* 11010 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, /* 11020 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, /* 11030 */ B, B, B, B, B, B, B, B, VAbv, VAbv, VAbv, VAbv, VBlw, VBlw, VBlw, VBlw, @@ -545,7 +546,7 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = { /* 11320 */ B, B, B, B, B, B, B, B, B, O, B, B, B, B, B, B, /* 11330 */ B, O, B, B, O, B, B, B, B, B, O, O, CMBlw, B, VPst, VPst, /* 11340 */ VAbv, VPst, VPst, VPst, VPst, O, O, VPre, VPre, O, O, VPre, VPre, H, O, O, - /* 11350 */ O, O, O, O, O, O, O, VPst, O, O, O, O, O, O, O, O, + /* 11350 */ O, O, O, O, O, O, O, VPst, O, O, O, O, O, O, B, B, /* 11360 */ B, B, VPst, VPst, O, O, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, O, O, O, /* 11370 */ VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, O, O, O, @@ -615,7 +616,26 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = { /* 11720 */ VPst, VPst, VAbv, VAbv, VBlw, VBlw, VPre, VAbv, VBlw, VAbv, VAbv, VAbv, O, O, O, O, /* 11730 */ B, B, B, B, B, B, B, B, B, B, B, B, O, O, O, O, -#define use_offset_0x11c00u 4960 +#define use_offset_0x11a00u 4960 + + + /* Zanabazar Square */ + + /* 11A00 */ B, VAbv, VBlw, VBlw, VAbv, VAbv, VAbv, VAbv, VAbv, VAbv, VBlw, B, B, B, B, B, + /* 11A10 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, + /* 11A20 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, + /* 11A30 */ B, B, B, FM, VBlw, VMAbv, VMAbv, VMAbv, VMAbv, VMPst, R, MBlw, MBlw, MBlw, MBlw, GB, + /* 11A40 */ O, O, O, O, O, GB, O, H, O, O, O, O, O, O, O, O, + + /* Soyombo */ + + /* 11A50 */ B, VAbv, VBlw, VBlw, VAbv, VAbv, VAbv, VPst, VPst, VBlw, VBlw, VBlw, B, B, B, B, + /* 11A60 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, + /* 11A70 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, + /* 11A80 */ B, B, B, B, O, O, R, R, R, R, FBlw, FBlw, FBlw, FBlw, FBlw, FBlw, + /* 11A90 */ FBlw, FBlw, FBlw, FBlw, FBlw, FBlw, VMAbv, VMPst, CMAbv, H, O, O, O, O, O, O, + +#define use_offset_0x11c00u 5120 /* Bhaiksuki */ @@ -636,7 +656,19 @@ static const USE_TABLE_ELEMENT_TYPE use_table[] = { /* 11CA0 */ SUB, SUB, SUB, SUB, SUB, SUB, SUB, SUB, O, SUB, SUB, SUB, SUB, SUB, SUB, SUB, /* 11CB0 */ VBlw, VPre, VBlw, VAbv, VPst, VMAbv, VMAbv, O, -}; /* Table items: 5144; occupancy: 72% */ +#define use_offset_0x11d00u 5304 + + + /* Masaram Gondi */ + + /* 11D00 */ B, B, B, B, B, B, B, O, B, B, O, B, B, B, B, B, + /* 11D10 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, + /* 11D20 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, + /* 11D30 */ B, VAbv, VAbv, VAbv, VAbv, VAbv, VBlw, O, O, O, VAbv, O, VAbv, VAbv, O, VAbv, + /* 11D40 */ VMAbv, VMAbv, CMBlw, VAbv, VBlw, H, R, MBlw, O, O, O, O, O, O, O, O, + /* 11D50 */ B, B, B, B, B, B, B, B, B, B, O, O, O, O, O, O, + +}; /* Table items: 5400; occupancy: 73% */ USE_TABLE_ELEMENT_TYPE hb_use_get_categories (hb_codepoint_t u) @@ -684,7 +716,9 @@ hb_use_get_categories (hb_codepoint_t u) if (hb_in_range<hb_codepoint_t> (u, 0x11280u, 0x11377u)) return use_table[u - 0x11280u + use_offset_0x11280u]; if (hb_in_range<hb_codepoint_t> (u, 0x11400u, 0x114DFu)) return use_table[u - 0x11400u + use_offset_0x11400u]; if (hb_in_range<hb_codepoint_t> (u, 0x11580u, 0x1173Fu)) return use_table[u - 0x11580u + use_offset_0x11580u]; + if (hb_in_range<hb_codepoint_t> (u, 0x11A00u, 0x11A9Fu)) return use_table[u - 0x11A00u + use_offset_0x11a00u]; if (hb_in_range<hb_codepoint_t> (u, 0x11C00u, 0x11CB7u)) return use_table[u - 0x11C00u + use_offset_0x11c00u]; + if (hb_in_range<hb_codepoint_t> (u, 0x11D00u, 0x11D5Fu)) return use_table[u - 0x11D00u + use_offset_0x11d00u]; if (unlikely (u == 0x1107Fu)) return HN; break; @@ -696,6 +730,7 @@ hb_use_get_categories (hb_codepoint_t u) #undef B #undef CGJ +#undef CS #undef FM #undef GB #undef H diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-use.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-use.cc index a5ab0ab2a2d..ac3a2486737 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-use.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-use.cc @@ -607,6 +607,7 @@ const hb_ot_complex_shaper_t _hb_ot_complex_shaper_use = compose_use, setup_masks_use, NULL, /* disable_otl */ + NULL, /* reorder_marks */ HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_EARLY, false, /* fallback_position */ }; diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-normalize.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-normalize.cc index 94a3d7d27aa..fd9e7c2a8df 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-normalize.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-normalize.cc @@ -345,14 +345,18 @@ _hb_ot_shape_normalize (const hb_ot_shape_plan_t *plan, if (_hb_glyph_info_get_modified_combining_class (&buffer->info[end]) == 0) break; - /* We are going to do a O(n^2). Only do this if the sequence is short. */ - if (end - i > 10) { + /* We are going to do a O(n^2). Only do this if the sequence is short, + * but not too short ;). */ + if (end - i < 2 || end - i > HB_OT_SHAPE_COMPLEX_MAX_COMBINING_MARKS) { i = end; continue; } buffer->sort (i, end, compare_combining_class); + if (plan->shaper->reorder_marks) + plan->shaper->reorder_marks (plan, buffer, i, end); + i = end; } @@ -369,46 +373,58 @@ _hb_ot_shape_normalize (const hb_ot_shape_plan_t *plan, buffer->clear_output (); count = buffer->len; unsigned int starter = 0; + bool combine = true; buffer->next_glyph (); while (buffer->idx < count && !buffer->in_error) { hb_codepoint_t composed, glyph; - if (/* We don't try to compose a non-mark character with it's preceding starter. + if (combine && + /* We don't try to compose a non-mark character with it's preceding starter. * This is both an optimization to avoid trying to compose every two neighboring * glyphs in most scripts AND a desired feature for Hangul. Apparently Hangul * fonts are not designed to mix-and-match pre-composed syllables and Jamo. */ - HB_UNICODE_GENERAL_CATEGORY_IS_MARK (_hb_glyph_info_get_general_category (&buffer->cur())) && - /* If there's anything between the starter and this char, they should have CCC - * smaller than this character's. */ - (starter == buffer->out_len - 1 || - _hb_glyph_info_get_modified_combining_class (&buffer->prev()) < _hb_glyph_info_get_modified_combining_class (&buffer->cur())) && - /* And compose. */ - c.compose (&c, - buffer->out_info[starter].codepoint, - buffer->cur().codepoint, - &composed) && - /* And the font has glyph for the composite. */ - font->get_nominal_glyph (composed, &glyph)) + HB_UNICODE_GENERAL_CATEGORY_IS_MARK (_hb_glyph_info_get_general_category (&buffer->cur()))) { - /* Composes. */ - buffer->next_glyph (); /* Copy to out-buffer. */ - if (unlikely (buffer->in_error)) - return; - buffer->merge_out_clusters (starter, buffer->out_len); - buffer->out_len--; /* Remove the second composable. */ - /* Modify starter and carry on. */ - buffer->out_info[starter].codepoint = composed; - buffer->out_info[starter].glyph_index() = glyph; - _hb_glyph_info_set_unicode_props (&buffer->out_info[starter], buffer); - - continue; + if (/* If there's anything between the starter and this char, they should have CCC + * smaller than this character's. */ + (starter == buffer->out_len - 1 || + info_cc (buffer->prev()) < info_cc (buffer->cur())) && + /* And compose. */ + c.compose (&c, + buffer->out_info[starter].codepoint, + buffer->cur().codepoint, + &composed) && + /* And the font has glyph for the composite. */ + font->get_nominal_glyph (composed, &glyph)) + { + /* Composes. */ + buffer->next_glyph (); /* Copy to out-buffer. */ + if (unlikely (buffer->in_error)) + return; + buffer->merge_out_clusters (starter, buffer->out_len); + buffer->out_len--; /* Remove the second composable. */ + /* Modify starter and carry on. */ + buffer->out_info[starter].codepoint = composed; + buffer->out_info[starter].glyph_index() = glyph; + _hb_glyph_info_set_unicode_props (&buffer->out_info[starter], buffer); + + continue; + } + else if (/* We sometimes custom-tailor the sorted order of marks. In that case, stop + * trying to combine as soon as combining-class drops. */ + starter < buffer->out_len - 1 && + info_cc (buffer->prev()) > info_cc (buffer->cur())) + combine = false; } /* Blocked, or doesn't compose. */ buffer->next_glyph (); - if (_hb_glyph_info_get_modified_combining_class (&buffer->prev()) == 0) + if (info_cc (buffer->prev()) == 0) + { starter = buffer->out_len - 1; + combine = true; + } } buffer->swap_buffers (); diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape.cc index 8cd8fcc17e0..8fc9d464f51 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape.cc @@ -693,9 +693,9 @@ hb_ot_position_default (hb_ot_shape_context_t *c) static inline void hb_ot_position_complex (hb_ot_shape_context_t *c) { - hb_ot_layout_position_start (c->font, c->buffer); - unsigned int count = c->buffer->len; + hb_glyph_info_t *info = c->buffer->info; + hb_glyph_position_t *pos = c->buffer->pos; /* If the font has no GPOS, AND, no fallback positioning will * happen, AND, direction is forward, then when zeroing mark @@ -710,6 +710,17 @@ hb_ot_position_complex (hb_ot_shape_context_t *c) !c->plan->shaper->fallback_position && HB_DIRECTION_IS_FORWARD (c->buffer->props.direction); + /* We change glyph origin to what GPOS expects (horizontal), apply GPOS, change it back. */ + + /* The nil glyph_h_origin() func returns 0, so no need to apply it. */ + if (c->font->has_glyph_h_origin_func ()) + for (unsigned int i = 0; i < count; i++) + c->font->add_glyph_h_origin (info[i].codepoint, + &pos[i].x_offset, + &pos[i].y_offset); + + hb_ot_layout_position_start (c->font, c->buffer); + switch (c->plan->shaper->zero_width_marks) { case HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_EARLY: @@ -723,30 +734,8 @@ hb_ot_position_complex (hb_ot_shape_context_t *c) } if (likely (!c->fallback_positioning)) - { - hb_glyph_info_t *info = c->buffer->info; - hb_glyph_position_t *pos = c->buffer->pos; - - /* Change glyph origin to what GPOS expects (horizontal), apply GPOS, change it back. */ - - /* The nil glyph_h_origin() func returns 0, so no need to apply it. */ - if (c->font->has_glyph_h_origin_func ()) - for (unsigned int i = 0; i < count; i++) - c->font->add_glyph_h_origin (info[i].codepoint, - &pos[i].x_offset, - &pos[i].y_offset); - c->plan->position (c->font, c->buffer); - /* The nil glyph_h_origin() func returns 0, so no need to apply it. */ - if (c->font->has_glyph_h_origin_func ()) - for (unsigned int i = 0; i < count; i++) - c->font->subtract_glyph_h_origin (info[i].codepoint, - &pos[i].x_offset, - &pos[i].y_offset); - - } - switch (c->plan->shaper->zero_width_marks) { case HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_LATE: @@ -763,6 +752,13 @@ hb_ot_position_complex (hb_ot_shape_context_t *c) hb_ot_layout_position_finish_advances (c->font, c->buffer); hb_ot_zero_width_default_ignorables (c); hb_ot_layout_position_finish_offsets (c->font, c->buffer); + + /* The nil glyph_h_origin() func returns 0, so no need to apply it. */ + if (c->font->has_glyph_h_origin_func ()) + for (unsigned int i = 0; i < count; i++) + c->font->subtract_glyph_h_origin (info[i].codepoint, + &pos[i].x_offset, + &pos[i].y_offset); } static inline void diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-tag.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-tag.cc index 9b0db507bb4..59b7d6a6df9 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-tag.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-tag.cc @@ -270,28 +270,36 @@ static const LangTag ot_languages[] = { {"cak", HB_TAG('C','A','K',' ')}, /* Kaqchikel */ {"cbk", HB_TAG('C','B','K',' ')}, /* Chavacano */ {"cbl", HB_TAG('Q','I','N',' ')}, /* Bualkhaw Chin */ + {"cco", HB_TAG('C','C','H','N')}, /* Chinantec */ {"ce", HB_TAG('C','H','E',' ')}, /* Chechen */ {"ceb", HB_TAG('C','E','B',' ')}, /* Cebuano */ {"cfm", HB_TAG('H','A','L',' ')}, /* Halam/Falam Chin */ {"cgg", HB_TAG('C','G','G',' ')}, /* Chiga */ {"ch", HB_TAG('C','H','A',' ')}, /* Chamorro */ + {"chj", HB_TAG('C','C','H','N')}, /* Chinantec */ {"chk", HB_TAG('C','H','K','0')}, /* Chuukese */ {"cho", HB_TAG('C','H','O',' ')}, /* Choctaw */ {"chp", HB_TAG('C','H','P',' ')}, /* Chipewyan */ + {"chq", HB_TAG('C','C','H','N')}, /* Chinantec */ {"chr", HB_TAG('C','H','R',' ')}, /* Cherokee */ {"chy", HB_TAG('C','H','Y',' ')}, /* Cheyenne */ + {"chz", HB_TAG('C','C','H','N')}, /* Chinantec */ {"cja", HB_TAG('C','J','A',' ')}, /* Western Cham */ {"cjm", HB_TAG('C','J','M',' ')}, /* Eastern Cham */ {"cka", HB_TAG('Q','I','N',' ')}, /* Khumi Awa Chin */ {"ckb", HB_TAG('K','U','R',' ')}, /* Central Kurdish (Sorani) */ {"ckt", HB_TAG('C','H','K',' ')}, /* Chukchi */ {"cld", HB_TAG('S','Y','R',' ')}, /* Chaldean Neo-Aramaic */ + {"cle", HB_TAG('C','C','H','N')}, /* Chinantec */ {"cmr", HB_TAG('Q','I','N',' ')}, /* Mro-Khimi Chin */ {"cnb", HB_TAG('Q','I','N',' ')}, /* Chinbon Chin */ {"cnh", HB_TAG('Q','I','N',' ')}, /* Hakha Chin */ {"cnk", HB_TAG('Q','I','N',' ')}, /* Khumi Chin */ + {"cnl", HB_TAG('C','C','H','N')}, /* Chinantec */ + {"cnt", HB_TAG('C','C','H','N')}, /* Chinantec */ {"cnw", HB_TAG('Q','I','N',' ')}, /* Ngawn Chin */ {"cop", HB_TAG('C','O','P',' ')}, /* Coptic */ + {"cpa", HB_TAG('C','C','H','N')}, /* Chinantec */ {"cpp", HB_TAG('C','P','P',' ')}, /* Creoles */ {"cr", HB_TAG('C','R','E',' ')}, /* Cree */ {"cre", HB_TAG('Y','C','R',' ')}, /* Y-Cree */ @@ -302,15 +310,21 @@ static const LangTag ot_languages[] = { {"crm", HB_TAG('M','C','R',' ')}, /* Moose Cree */ {"crx", HB_TAG('C','R','R',' ')}, /* Carrier */ {"cs", HB_TAG('C','S','Y',' ')}, /* Czech */ + {"csa", HB_TAG('C','C','H','N')}, /* Chinantec */ {"csb", HB_TAG('C','S','B',' ')}, /* Kashubian */ {"csh", HB_TAG('Q','I','N',' ')}, /* Asho Chin */ + {"cso", HB_TAG('C','C','H','N')}, /* Chinantec */ {"csy", HB_TAG('Q','I','N',' ')}, /* Siyin Chin */ {"ctd", HB_TAG('Q','I','N',' ')}, /* Tedim Chin */ + {"cte", HB_TAG('C','C','H','N')}, /* Chinantec */ {"ctg", HB_TAG('C','T','G',' ')}, /* Chittagonian */ + {"ctl", HB_TAG('C','C','H','N')}, /* Chinantec */ {"cts", HB_TAG('B','I','K',' ')}, /* Northern Catanduanes Bikol */ {"cu", HB_TAG('C','S','L',' ')}, /* Church Slavic */ + {"cuc", HB_TAG('C','C','H','N')}, /* Chinantec */ {"cuk", HB_TAG('C','U','K',' ')}, /* San Blas Kuna */ {"cv", HB_TAG('C','H','U',' ')}, /* Chuvash */ + {"cvn", HB_TAG('C','C','H','N')}, /* Chinantec */ {"cwd", HB_TAG('D','C','R',' ')}, /* Woods Cree */ {"cy", HB_TAG('W','E','L',' ')}, /* Welsh */ {"czt", HB_TAG('Q','I','N',' ')}, /* Zotung Chin */ @@ -380,7 +394,6 @@ static const LangTag ot_languages[] = { {"gkp", HB_TAG('G','K','P',' ')}, /* Kpelle (Guinea) */ {"gl", HB_TAG('G','A','L',' ')}, /* Galician */ {"gld", HB_TAG('N','A','N',' ')}, /* Nanai */ - {"gle", HB_TAG('I','R','T',' ')}, /* Irish Traditional */ {"glk", HB_TAG('G','L','K',' ')}, /* Gilaki */ {"gn", HB_TAG('G','U','A',' ')}, /* Guarani [macrolanguage] */ {"gnn", HB_TAG('G','N','N',' ')}, /* Gumatj */ @@ -538,7 +551,6 @@ static const LangTag ot_languages[] = { {"mag", HB_TAG('M','A','G',' ')}, /* Magahi */ {"mai", HB_TAG('M','T','H',' ')}, /* Maithili */ {"mak", HB_TAG('M','K','R',' ')}, /* Makasar */ - {"mal", HB_TAG('M','A','L',' ')}, /* Malayalam */ {"mam", HB_TAG('M','A','M',' ')}, /* Mam */ {"man", HB_TAG('M','N','K',' ')}, /* Manding/Mandingo [macrolanguage] */ {"mdc", HB_TAG('M','L','E',' ')}, /* Male (Papua New Guinea) */ diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-shape-plan.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-shape-plan.cc index 3abf555c5f0..5573cd22441 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-shape-plan.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-shape-plan.cc @@ -520,15 +520,17 @@ hb_shape_plan_create_cached2 (hb_face_t *face, retry: hb_face_t::plan_node_t *cached_plan_nodes = (hb_face_t::plan_node_t *) hb_atomic_ptr_get (&face->shape_plans); - for (hb_face_t::plan_node_t *node = cached_plan_nodes; node; node = node->next) - if (hb_shape_plan_matches (node->shape_plan, &proposal)) - { - DEBUG_MSG_FUNC (SHAPE_PLAN, node->shape_plan, "fulfilled from cache"); - return hb_shape_plan_reference (node->shape_plan); - } - /* Not found. */ + /* Don't look for plan in the cache if there were variation coordinates XXX Fix me. */ + if (!hb_coords_present (coords, num_coords)) + for (hb_face_t::plan_node_t *node = cached_plan_nodes; node; node = node->next) + if (hb_shape_plan_matches (node->shape_plan, &proposal)) + { + DEBUG_MSG_FUNC (SHAPE_PLAN, node->shape_plan, "fulfilled from cache"); + return hb_shape_plan_reference (node->shape_plan); + } + /* Not found. */ hb_shape_plan_t *shape_plan = hb_shape_plan_create2 (face, props, user_features, num_user_features, coords, num_coords, diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-shaper-private.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-shaper-private.hh index 381398a6171..2481ef8ac8f 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-shaper-private.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-shaper-private.hh @@ -88,11 +88,23 @@ struct hb_shaper_data_t { HB_SHAPER_DATA_DESTROY_FUNC (shaper, object) (data); #define HB_SHAPER_DATA_ENSURE_DEFINE(shaper, object) \ + HB_SHAPER_DATA_ENSURE_DEFINE_WITH_CONDITION(shaper, object, true) + +#define HB_SHAPER_DATA_ENSURE_DEFINE_WITH_CONDITION(shaper, object, condition) \ bool \ HB_SHAPER_DATA_ENSURE_FUNC(shaper, object) (hb_##object##_t *object) \ {\ retry: \ HB_SHAPER_DATA_TYPE (shaper, object) *data = (HB_SHAPER_DATA_TYPE (shaper, object) *) hb_atomic_ptr_get (&HB_SHAPER_DATA (shaper, object)); \ + if (likely (data) && !(condition)) { \ + /* Drop and recreate. */ \ + /* If someone dropped it in the mean time, throw it away and don't touch it. \ + * Otherwise, destruct it. */ \ + if (hb_atomic_ptr_cmpexch (&HB_SHAPER_DATA (shaper, object), data, NULL)) { \ + HB_SHAPER_DATA_DESTROY_FUNC (shaper, object) (data); \ + } \ + goto retry; \ + } \ if (unlikely (!data)) { \ data = HB_SHAPER_DATA_CREATE_FUNC (shaper, object) (object); \ if (unlikely (!data)) \ diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ucdn.cc b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ucdn.cc index a884e3ffd2c..d41cf5b9328 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ucdn.cc +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ucdn.cc @@ -160,17 +160,23 @@ static const hb_script_t ucdn_script_translate[] = HB_SCRIPT_NEWA, HB_SCRIPT_OSAGE, HB_SCRIPT_TANGUT, + HB_SCRIPT_MASARAM_GONDI, + HB_SCRIPT_NUSHU, + HB_SCRIPT_SOYOMBO, + HB_SCRIPT_ZANABAZAR_SQUARE, }; static hb_unicode_combining_class_t -hb_ucdn_combining_class(hb_unicode_funcs_t *ufuncs, hb_codepoint_t unicode, +hb_ucdn_combining_class(hb_unicode_funcs_t *ufuncs HB_UNUSED, + hb_codepoint_t unicode, void *user_data HB_UNUSED) { return (hb_unicode_combining_class_t) ucdn_get_combining_class(unicode); } static unsigned int -hb_ucdn_eastasian_width(hb_unicode_funcs_t *ufuncs, hb_codepoint_t unicode, +hb_ucdn_eastasian_width(hb_unicode_funcs_t *ufuncs HB_UNUSED, + hb_codepoint_t unicode, void *user_data HB_UNUSED) { int w = ucdn_get_east_asian_width(unicode); @@ -178,28 +184,31 @@ hb_ucdn_eastasian_width(hb_unicode_funcs_t *ufuncs, hb_codepoint_t unicode, } static hb_unicode_general_category_t -hb_ucdn_general_category(hb_unicode_funcs_t *ufuncs, hb_codepoint_t unicode, +hb_ucdn_general_category(hb_unicode_funcs_t *ufuncs HB_UNUSED, + hb_codepoint_t unicode, void *user_data HB_UNUSED) { return (hb_unicode_general_category_t)ucdn_get_general_category(unicode); } static hb_codepoint_t -hb_ucdn_mirroring(hb_unicode_funcs_t *ufuncs, hb_codepoint_t unicode, +hb_ucdn_mirroring(hb_unicode_funcs_t *ufuncs HB_UNUSED, + hb_codepoint_t unicode, void *user_data HB_UNUSED) { return ucdn_mirror(unicode); } static hb_script_t -hb_ucdn_script(hb_unicode_funcs_t *ufuncs, hb_codepoint_t unicode, +hb_ucdn_script(hb_unicode_funcs_t *ufuncs HB_UNUSED, + hb_codepoint_t unicode, void *user_data HB_UNUSED) { return ucdn_script_translate[ucdn_get_script(unicode)]; } static hb_bool_t -hb_ucdn_compose(hb_unicode_funcs_t *ufuncs, +hb_ucdn_compose(hb_unicode_funcs_t *ufuncs HB_UNUSED, hb_codepoint_t a, hb_codepoint_t b, hb_codepoint_t *ab, void *user_data HB_UNUSED) { @@ -207,7 +216,7 @@ hb_ucdn_compose(hb_unicode_funcs_t *ufuncs, } static hb_bool_t -hb_ucdn_decompose(hb_unicode_funcs_t *ufuncs, +hb_ucdn_decompose(hb_unicode_funcs_t *ufuncs HB_UNUSED, hb_codepoint_t ab, hb_codepoint_t *a, hb_codepoint_t *b, void *user_data HB_UNUSED) { @@ -215,7 +224,7 @@ hb_ucdn_decompose(hb_unicode_funcs_t *ufuncs, } static unsigned int -hb_ucdn_decompose_compatibility(hb_unicode_funcs_t *ufuncs, +hb_ucdn_decompose_compatibility(hb_unicode_funcs_t *ufuncs HB_UNUSED, hb_codepoint_t u, hb_codepoint_t *decomposed, void *user_data HB_UNUSED) { diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-unicode-private.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-unicode-private.hh index 34513e1324c..44a7471cf6e 100644 --- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-unicode-private.hh +++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-unicode-private.hh @@ -105,14 +105,10 @@ HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS_SIMPLE inline unsigned int modified_combining_class (hb_codepoint_t unicode) { - /* XXX This hack belongs to the Arabic shaper: - * Put HAMZA ABOVE in the same class as SHADDA. */ - if (unlikely (unicode == 0x0654u)) unicode = 0x0651u; - /* XXX This hack belongs to the Myanmar shaper. */ if (unlikely (unicode == 0x1037u)) unicode = 0x103Au; - /* XXX This hack belongs to the SEA shaper (for Tai Tham): + /* XXX This hack belongs to the USE shaper (for Tai Tham): * Reorder SAKOT to ensure it comes after any tone marks. */ if (unlikely (unicode == 0x1A60u)) return 254; @@ -141,6 +137,7 @@ HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS_SIMPLE * we do NOT want to hide them, as the way Uniscribe has implemented them * is with regular spacing glyphs, and that's the way fonts are made to work. * As such, we make exceptions for those four. + * Also ignoring U+1BCA0..1BCA3. https://github.com/behdad/harfbuzz/issues/503 * * Unicode 7.0: * $ grep '; Default_Ignorable_Code_Point ' DerivedCoreProperties.txt | sed 's/;.*#/#/' @@ -197,8 +194,7 @@ HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS_SIMPLE { /* Other planes */ switch (plane) { - case 0x01: return hb_in_ranges<hb_codepoint_t> (ch, 0x1BCA0u, 0x1BCA3u, - 0x1D173u, 0x1D17Au); + case 0x01: return hb_in_range<hb_codepoint_t> (ch, 0x1D173u, 0x1D17Au); case 0x0E: return hb_in_range<hb_codepoint_t> (ch, 0xE0000u, 0xE0FFFu); default: return false; } |