texlive[58898] Build/source/libs: harfbuzz 2.8.0

commits+kakuto at tug.org commits+kakuto at tug.org
Sun Apr 18 00:31:16 CEST 2021


Revision: 58898
          http://tug.org/svn/texlive?view=revision&revision=58898
Author:   kakuto
Date:     2021-04-18 00:31:16 +0200 (Sun, 18 Apr 2021)
Log Message:
-----------
harfbuzz 2.8.0

Modified Paths:
--------------
    trunk/Build/source/libs/README
    trunk/Build/source/libs/harfbuzz/ChangeLog
    trunk/Build/source/libs/harfbuzz/Makefile.am
    trunk/Build/source/libs/harfbuzz/Makefile.in
    trunk/Build/source/libs/harfbuzz/TLpatches/ChangeLog
    trunk/Build/source/libs/harfbuzz/TLpatches/TL-Changes
    trunk/Build/source/libs/harfbuzz/configure
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/CMakeLists.txt
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/CONFIG.md
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/ChangeLog
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/Makefile.am
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/NEWS
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/config.h.in
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/configure.ac
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/meson.build
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/meson_options.txt
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/Makefile.am
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/Makefile.sources
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/gen-indic-table.py
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/gen-tag-table.py
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/gen-use-table.py
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/gen-vowel-constraints.py
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/harfbuzz.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-common.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-morx-table.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout.h
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-algs.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-array.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-atomic.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-blob.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-blob.h
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer-serialize.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer.h
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-common.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-common.h
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-coretext.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-deprecated.h
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-directwrite.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-dispatch.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-draw.h
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-face.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-face.h
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-face.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-font.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-font.h
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ft.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-gdi.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-gobject-enums.h.tmpl
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-gobject-structs.h
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-graphite2.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-iter.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-machinery.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-map.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-map.h
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-map.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-meta.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-mutex.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-object.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-open-file.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-open-type.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-cff-common.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-cff1-table.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-cff2-table.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-cmap-table.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-color-cbdt-table.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-color-colr-table.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-color.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-color.h
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-deprecated.h
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-font.h
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-glyf-table.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-head-table.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-common.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-gpos-table.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-gsub-table.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-gsubgpos.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout.h
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-math.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-math.h
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-meta.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-meta.h
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-metrics.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-metrics.h
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-name.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-name.h
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-os2-table.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-post-table.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-arabic-win1256.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-arabic.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-hangul.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-indic-machine.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-indic-machine.rl
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-indic-table.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-indic.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-indic.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-khmer-machine.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-khmer-machine.rl
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-khmer.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-khmer.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-myanmar-machine.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-myanmar-machine.rl
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-myanmar.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-myanmar.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-thai.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-use-machine.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-use-machine.rl
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-use.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-vowel-constraints.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-normalize.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape.h
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-tag-table.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-tag.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-var-gvar-table.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-var.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-var.h
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-sanitize.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-serialize.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-set.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-set.h
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-set.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-shape-plan.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-shape-plan.h
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-shape.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-shape.h
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-style.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-style.h
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-plan.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-plan.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-unicode.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-unicode.h
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-vector.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-version.h.in
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/meson.build
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/test-buffer-serialize.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/test-gpos-size-params.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/test-gsub-would-substitute.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/test-ot-glyphname.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/test-ot-meta.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/test-ot-name.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/test.cc
    trunk/Build/source/libs/harfbuzz/version.ac

Added Paths:
-----------
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/mingw-configure.sh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-syllabic.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-syllabic.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-use-table.hh

Removed Paths:
-------------
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/dump-indic-data.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/dump-khmer-data.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/dump-myanmar-data.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/dump-use-data.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-machine-index.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-use-table.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-use.hh

Modified: trunk/Build/source/libs/README
===================================================================
--- trunk/Build/source/libs/README	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/README	2021-04-17 22:31:16 UTC (rev 58898)
@@ -25,8 +25,8 @@
   http://sourceforge.net/projects/silgraphite/files/graphite2/
   (requires C++11)
 
-harfbuzz 2.7.4 - checked 27dec20
-  https://github.com/harfbuzz/harfbuzz/releases/download/2.7.4/
+harfbuzz 2.8.0 - checked 18apr21
+  https://github.com/harfbuzz/harfbuzz/releases/download/2.8.0/
 
 icu 68.2 - checked 13feb21
   http://download.icu-project.org/files/icu4c/

Modified: trunk/Build/source/libs/harfbuzz/ChangeLog
===================================================================
--- trunk/Build/source/libs/harfbuzz/ChangeLog	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/ChangeLog	2021-04-17 22:31:16 UTC (rev 58898)
@@ -1,3 +1,8 @@
+2021-04-18  Akira Kakuto  <kakuto at w32tex.org>
+
+	Import harfbuzz-2.8.0.
+	* Makefile.am, version.ac: Adjusted.
+
 2020-12-27  Akira Kakuto  <kakuto at w32tex.org>
 
 	Import harfbuzz-2.7.4.

Modified: trunk/Build/source/libs/harfbuzz/Makefile.am
===================================================================
--- trunk/Build/source/libs/harfbuzz/Makefile.am	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/Makefile.am	2021-04-17 22:31:16 UTC (rev 58898)
@@ -193,16 +193,16 @@
 	@HARFBUZZ_TREE@/src/hb-ot-shape-complex-indic-table.cc \
 	@HARFBUZZ_TREE@/src/hb-ot-shape-complex-khmer.hh \
 	@HARFBUZZ_TREE@/src/hb-ot-shape-complex-khmer.cc \
-	@HARFBUZZ_TREE@/src/hb-ot-shape-complex-machine-index.hh \
 	@HARFBUZZ_TREE@/src/hb-ot-shape-complex-myanmar.hh \
 	@HARFBUZZ_TREE@/src/hb-ot-shape-complex-myanmar.cc \
+	@HARFBUZZ_TREE@/src/hb-ot-shape-complex-syllabic.cc \
+	@HARFBUZZ_TREE@/src/hb-ot-shape-complex-syllabic.hh \
 	@HARFBUZZ_TREE@/src/hb-ot-shape-complex-thai.cc \
 	@HARFBUZZ_TREE@/src/hb-ot-shape-complex-use.cc \
+	@HARFBUZZ_TREE@/src/hb-ot-shape-complex-use-table.hh \
 	@HARFBUZZ_TREE@/src/hb-ot-shape-complex-vowel-constraints.cc \
 	@HARFBUZZ_TREE@/src/hb-ot-shape-complex-vowel-constraints.hh \
 	@HARFBUZZ_TREE@/src/hb-ot-shape-complex.hh \
-	@HARFBUZZ_TREE@/src/hb-ot-shape-complex-use-table.cc \
-	@HARFBUZZ_TREE@/src/hb-ot-shape-complex-use.hh \
 	@HARFBUZZ_TREE@/src/hb-ot-shape-normalize.hh \
 	@HARFBUZZ_TREE@/src/hb-ot-shape-normalize.cc \
 	@HARFBUZZ_TREE@/src/hb-ot-shape-fallback.hh \

Modified: trunk/Build/source/libs/harfbuzz/Makefile.in
===================================================================
--- trunk/Build/source/libs/harfbuzz/Makefile.in	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/Makefile.in	2021-04-17 22:31:16 UTC (rev 58898)
@@ -163,10 +163,10 @@
 	@HARFBUZZ_TREE@/src/hb-ot-shape-complex-indic-table.$(OBJEXT) \
 	@HARFBUZZ_TREE@/src/hb-ot-shape-complex-khmer.$(OBJEXT) \
 	@HARFBUZZ_TREE@/src/hb-ot-shape-complex-myanmar.$(OBJEXT) \
+	@HARFBUZZ_TREE@/src/hb-ot-shape-complex-syllabic.$(OBJEXT) \
 	@HARFBUZZ_TREE@/src/hb-ot-shape-complex-thai.$(OBJEXT) \
 	@HARFBUZZ_TREE@/src/hb-ot-shape-complex-use.$(OBJEXT) \
 	@HARFBUZZ_TREE@/src/hb-ot-shape-complex-vowel-constraints.$(OBJEXT) \
-	@HARFBUZZ_TREE@/src/hb-ot-shape-complex-use-table.$(OBJEXT) \
 	@HARFBUZZ_TREE@/src/hb-ot-shape-normalize.$(OBJEXT) \
 	@HARFBUZZ_TREE@/src/hb-ot-shape-fallback.$(OBJEXT) \
 	@HARFBUZZ_TREE@/src/hb-ot-var.$(OBJEXT) \
@@ -227,8 +227,8 @@
 	@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-shape-complex-indic.Po \
 	@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-shape-complex-khmer.Po \
 	@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-shape-complex-myanmar.Po \
+	@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-shape-complex-syllabic.Po \
 	@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-shape-complex-thai.Po \
-	@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-shape-complex-use-table.Po \
 	@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-shape-complex-use.Po \
 	@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-shape-complex-vowel-constraints.Po \
 	@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-shape-fallback.Po \
@@ -862,16 +862,16 @@
 	@HARFBUZZ_TREE@/src/hb-ot-shape-complex-indic-table.cc \
 	@HARFBUZZ_TREE@/src/hb-ot-shape-complex-khmer.hh \
 	@HARFBUZZ_TREE@/src/hb-ot-shape-complex-khmer.cc \
-	@HARFBUZZ_TREE@/src/hb-ot-shape-complex-machine-index.hh \
 	@HARFBUZZ_TREE@/src/hb-ot-shape-complex-myanmar.hh \
 	@HARFBUZZ_TREE@/src/hb-ot-shape-complex-myanmar.cc \
+	@HARFBUZZ_TREE@/src/hb-ot-shape-complex-syllabic.cc \
+	@HARFBUZZ_TREE@/src/hb-ot-shape-complex-syllabic.hh \
 	@HARFBUZZ_TREE@/src/hb-ot-shape-complex-thai.cc \
 	@HARFBUZZ_TREE@/src/hb-ot-shape-complex-use.cc \
+	@HARFBUZZ_TREE@/src/hb-ot-shape-complex-use-table.hh \
 	@HARFBUZZ_TREE@/src/hb-ot-shape-complex-vowel-constraints.cc \
 	@HARFBUZZ_TREE@/src/hb-ot-shape-complex-vowel-constraints.hh \
 	@HARFBUZZ_TREE@/src/hb-ot-shape-complex.hh \
-	@HARFBUZZ_TREE@/src/hb-ot-shape-complex-use-table.cc \
-	@HARFBUZZ_TREE@/src/hb-ot-shape-complex-use.hh \
 	@HARFBUZZ_TREE@/src/hb-ot-shape-normalize.hh \
 	@HARFBUZZ_TREE@/src/hb-ot-shape-normalize.cc \
 	@HARFBUZZ_TREE@/src/hb-ot-shape-fallback.hh \
@@ -1106,6 +1106,9 @@
 @HARFBUZZ_TREE@/src/hb-ot-shape-complex-myanmar.$(OBJEXT):  \
 	@HARFBUZZ_TREE@/src/$(am__dirstamp) \
 	@HARFBUZZ_TREE@/src/$(DEPDIR)/$(am__dirstamp)
+ at HARFBUZZ_TREE@/src/hb-ot-shape-complex-syllabic.$(OBJEXT):  \
+	@HARFBUZZ_TREE@/src/$(am__dirstamp) \
+	@HARFBUZZ_TREE@/src/$(DEPDIR)/$(am__dirstamp)
 @HARFBUZZ_TREE@/src/hb-ot-shape-complex-thai.$(OBJEXT):  \
 	@HARFBUZZ_TREE@/src/$(am__dirstamp) \
 	@HARFBUZZ_TREE@/src/$(DEPDIR)/$(am__dirstamp)
@@ -1115,9 +1118,6 @@
 @HARFBUZZ_TREE@/src/hb-ot-shape-complex-vowel-constraints.$(OBJEXT):  \
 	@HARFBUZZ_TREE@/src/$(am__dirstamp) \
 	@HARFBUZZ_TREE@/src/$(DEPDIR)/$(am__dirstamp)
- at HARFBUZZ_TREE@/src/hb-ot-shape-complex-use-table.$(OBJEXT):  \
-	@HARFBUZZ_TREE@/src/$(am__dirstamp) \
-	@HARFBUZZ_TREE@/src/$(DEPDIR)/$(am__dirstamp)
 @HARFBUZZ_TREE@/src/hb-ot-shape-normalize.$(OBJEXT):  \
 	@HARFBUZZ_TREE@/src/$(am__dirstamp) \
 	@HARFBUZZ_TREE@/src/$(DEPDIR)/$(am__dirstamp)
@@ -1181,8 +1181,8 @@
 @AMDEP_TRUE@@am__include@ @am__quote@@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-shape-complex-indic.Po at am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-shape-complex-khmer.Po at am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-shape-complex-myanmar.Po at am__quote@ # am--include-marker
+ at AMDEP_TRUE@@am__include@ @am__quote@@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-shape-complex-syllabic.Po at am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-shape-complex-thai.Po at am__quote@ # am--include-marker
- at AMDEP_TRUE@@am__include@ @am__quote@@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-shape-complex-use-table.Po at am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-shape-complex-use.Po at am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-shape-complex-vowel-constraints.Po at am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-shape-fallback.Po at am__quote@ # am--include-marker
@@ -1832,8 +1832,8 @@
 	-rm -f @HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-shape-complex-indic.Po
 	-rm -f @HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-shape-complex-khmer.Po
 	-rm -f @HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-shape-complex-myanmar.Po
+	-rm -f @HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-shape-complex-syllabic.Po
 	-rm -f @HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-shape-complex-thai.Po
-	-rm -f @HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-shape-complex-use-table.Po
 	-rm -f @HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-shape-complex-use.Po
 	-rm -f @HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-shape-complex-vowel-constraints.Po
 	-rm -f @HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-shape-fallback.Po
@@ -1933,8 +1933,8 @@
 	-rm -f @HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-shape-complex-indic.Po
 	-rm -f @HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-shape-complex-khmer.Po
 	-rm -f @HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-shape-complex-myanmar.Po
+	-rm -f @HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-shape-complex-syllabic.Po
 	-rm -f @HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-shape-complex-thai.Po
-	-rm -f @HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-shape-complex-use-table.Po
 	-rm -f @HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-shape-complex-use.Po
 	-rm -f @HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-shape-complex-vowel-constraints.Po
 	-rm -f @HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-shape-fallback.Po

Modified: trunk/Build/source/libs/harfbuzz/TLpatches/ChangeLog
===================================================================
--- trunk/Build/source/libs/harfbuzz/TLpatches/ChangeLog	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/TLpatches/ChangeLog	2021-04-17 22:31:16 UTC (rev 58898)
@@ -1,3 +1,8 @@
+2021-04-18  Akira Kakuto  <kakuto at w32tex.org>
+
+	Imported harfbuzz-2.8.0 source tree from:
+	https://github.com/harfbuzz/harfbuzz/releases/download/2.8.0/
+
 2020-12-27  Akira Kakuto  <kakuto at w32tex.org>
 
 	Imported harfbuzz-2.7.4 source tree from:

Modified: trunk/Build/source/libs/harfbuzz/TLpatches/TL-Changes
===================================================================
--- trunk/Build/source/libs/harfbuzz/TLpatches/TL-Changes	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/TLpatches/TL-Changes	2021-04-17 22:31:16 UTC (rev 58898)
@@ -1,5 +1,5 @@
-Changes applied to the harfbuzz-2.7.4/ tree as obtained from:
-	https://github.com/harfbuzz/harfbuzz/releases/download/2.7.4/
+Changes applied to the harfbuzz-2.8.0/ tree as obtained from:
+	https://github.com/harfbuzz/harfbuzz/releases/download/2.8.0/
 
 Removed:
 	COPYING

Modified: trunk/Build/source/libs/harfbuzz/configure
===================================================================
--- trunk/Build/source/libs/harfbuzz/configure	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/configure	2021-04-17 22:31:16 UTC (rev 58898)
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69 for harfbuzz (TeX Live) 2.7.4.
+# Generated by GNU Autoconf 2.69 for harfbuzz (TeX Live) 2.8.0.
 #
 # Report bugs to <tex-k at tug.org>.
 #
@@ -580,8 +580,8 @@
 # Identity of this package.
 PACKAGE_NAME='harfbuzz (TeX Live)'
 PACKAGE_TARNAME='harfbuzz--tex-live-'
-PACKAGE_VERSION='2.7.4'
-PACKAGE_STRING='harfbuzz (TeX Live) 2.7.4'
+PACKAGE_VERSION='2.8.0'
+PACKAGE_STRING='harfbuzz (TeX Live) 2.8.0'
 PACKAGE_BUGREPORT='tex-k at tug.org'
 PACKAGE_URL=''
 
@@ -1311,7 +1311,7 @@
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures harfbuzz (TeX Live) 2.7.4 to adapt to many kinds of systems.
+\`configure' configures harfbuzz (TeX Live) 2.8.0 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1382,7 +1382,7 @@
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of harfbuzz (TeX Live) 2.7.4:";;
+     short | recursive ) echo "Configuration of harfbuzz (TeX Live) 2.8.0:";;
    esac
   cat <<\_ACEOF
 
@@ -1487,7 +1487,7 @@
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-harfbuzz (TeX Live) configure 2.7.4
+harfbuzz (TeX Live) configure 2.8.0
 generated by GNU Autoconf 2.69
 
 Copyright (C) 2012 Free Software Foundation, Inc.
@@ -2123,7 +2123,7 @@
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by harfbuzz (TeX Live) $as_me 2.7.4, which was
+It was created by harfbuzz (TeX Live) $as_me 2.8.0, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   $ $0 $@
@@ -4042,7 +4042,7 @@
 
 # Define the identity of the package.
  PACKAGE='harfbuzz--tex-live-'
- VERSION='2.7.4'
+ VERSION='2.8.0'
 
 
 # Some tools Automake needs.
@@ -4235,9 +4235,9 @@
 
 
 HB_VERSION_MAJOR=2
-HB_VERSION_MINOR=7
-HB_VERSION_MICRO=4
-HB_VERSION=2.7.4
+HB_VERSION_MINOR=8
+HB_VERSION_MICRO=0
+HB_VERSION=2.8.0
 
 ac_ext=c
 ac_cpp='$CPP $CPPFLAGS'
@@ -7914,7 +7914,7 @@
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by harfbuzz (TeX Live) $as_me 2.7.4, which was
+This file was extended by harfbuzz (TeX Live) $as_me 2.8.0, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -7980,7 +7980,7 @@
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
 ac_cs_version="\\
-harfbuzz (TeX Live) config.status 2.7.4
+harfbuzz (TeX Live) config.status 2.8.0
 configured by $0, generated by GNU Autoconf 2.69,
   with options \\"\$ac_cs_config\\"
 

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/CMakeLists.txt
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/CMakeLists.txt	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/CMakeLists.txt	2021-04-17 22:31:16 UTC (rev 58898)
@@ -102,6 +102,10 @@
   add_definitions(-DHAVE_STDBOOL_H)
 endif ()
 
+# https://github.com/harfbuzz/harfbuzz/pull/2874#issuecomment-782859099
+if (NOT WIN32)
+  add_definitions("-DHAVE_PTHREAD")
+endif ()
 
 if (MSVC)
   add_definitions(-wd4244 -wd4267 -D_CRT_SECURE_NO_WARNINGS -D_CRT_NONSTDC_NO_WARNINGS)
@@ -406,38 +410,7 @@
   )
 endif ()
 
-## Atomic ops availability detection
-file(WRITE "${PROJECT_BINARY_DIR}/try_compile_intel_atomic_primitives.c"
-"		void memory_barrier (void) { __sync_synchronize (); }
-		int atomic_add (int *i) { return __sync_fetch_and_add (i, 1); }
-		int mutex_trylock (int *m) { return __sync_lock_test_and_set (m, 1); }
-		void mutex_unlock (int *m) { __sync_lock_release (m); }
-		int main () { return 0; }
-")
-try_compile(HB_HAVE_INTEL_ATOMIC_PRIMITIVES
-  ${PROJECT_BINARY_DIR}/try_compile_intel_atomic_primitives
-  ${PROJECT_BINARY_DIR}/try_compile_intel_atomic_primitives.c)
-if (HB_HAVE_INTEL_ATOMIC_PRIMITIVES)
-  add_definitions(-DHAVE_INTEL_ATOMIC_PRIMITIVES)
-endif ()
 
-file(WRITE "${PROJECT_BINARY_DIR}/try_compile_solaris_atomic_ops.c"
-"		#include <atomic.h>
-		/* This requires Solaris Studio 12.2 or newer: */
-		#include <mbarrier.h>
-		void memory_barrier (void) { __machine_rw_barrier (); }
-		int atomic_add (volatile unsigned *i) { return atomic_add_int_nv (i, 1); }
-		void *atomic_ptr_cmpxchg (volatile void **target, void *cmp, void *newval) { return atomic_cas_ptr (target, cmp, newval); }
-		int main () { return 0; }
-")
-try_compile(HB_HAVE_SOLARIS_ATOMIC_OPS
-  ${PROJECT_BINARY_DIR}/try_compile_solaris_atomic_ops
-  ${PROJECT_BINARY_DIR}/try_compile_solaris_atomic_ops.c)
-if (HB_HAVE_SOLARIS_ATOMIC_OPS)
-  add_definitions(-DHAVE_SOLARIS_ATOMIC_OPS)
-endif ()
-
-
 ## Define harfbuzz library
 add_library(harfbuzz ${project_sources} ${project_extra_sources} ${project_headers})
 target_link_libraries(harfbuzz ${THIRD_PARTY_LIBS})

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/CONFIG.md
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/CONFIG.md	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/CONFIG.md	2021-04-17 22:31:16 UTC (rev 58898)
@@ -108,7 +108,7 @@
 By default HarfBuzz builds as a thread-safe library.  The exception is that
 the `HB_TINY` predefined configuring (more below) disables thread-safety.
 
-If you do /not/ need thread-safety in the library (eg. you always call into
+If you do *not* need thread-safety in the library (eg. you always call into
 HarfBuzz from the same thread), you can disable thread-safety by defining
 `HB_NO_MT`.  As noted already, this is enabled by `HB_TINY`.
 
@@ -144,7 +144,7 @@
 ## Notes
 
 Note that the config option `HB_NO_CFF`, which is enabled by `HB_LEAN` and
-`HB_TINY` does /not/ mean that the resulting library won't work with CFF fonts.
+`HB_TINY` does *not* mean that the resulting library won't work with CFF fonts.
 The library can shape valid CFF fonts just fine, with or without this option.
-This option disables (among other things) the code to calculate glyph exntents
+This option disables (among other things) the code to calculate glyph extents
 for CFF fonts.

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/ChangeLog
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/ChangeLog	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/ChangeLog	2021-04-17 22:31:16 UTC (rev 58898)
@@ -1,3 +1,2791 @@
+commit 03538e872a0610a65fad692b33d3646f387cf578
+Author: Khaled Hosny <khaled at aliftype.com>
+Date:   Tue Mar 16 19:28:35 2021 +0200
+
+    2.8.0
+
+ NEWS             | 15 +++++++++++++++
+ configure.ac     |  2 +-
+ meson.build      |  2 +-
+ src/hb-version.h |  6 +++---
+ 4 files changed, 20 insertions(+), 5 deletions(-)
+
+commit 4c34478b28497acfce02b8a544fed4ae20526336
+Merge: daeb27734 f2d08578e
+Author: Khaled Hosny <khaled at aliftype.com>
+Date:   Tue Mar 16 10:37:49 2021 +0200
+
+    Merge pull request #2899 from harfbuzz/ci-fix
+    
+    [ci] Don’t install meson from its master branch
+
+commit daeb27734693183232a4571bae76a88ba869224f
+Merge: a5b8e7db4 f5356bcb6
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Mar 15 18:50:02 2021 -0700
+
+    Merge pull request #2900 from harfbuzz/nodiscard-buffer
+    
+    Mark buffer modification methods that can fail with nodiscard
+
+commit f2d08578e7a6c6febeff498dbba91ea1f747e14f
+Author: Khaled Hosny <khaled at aliftype.com>
+Date:   Tue Mar 16 00:19:40 2021 +0200
+
+    [tests] Increase shape-fuzzer timeout
+
+ test/fuzzing/meson.build | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit cad753e20f7f48d4910ce99c55bf8cc379a4aae7
+Author: Khaled Hosny <khaled at aliftype.com>
+Date:   Tue Mar 16 01:04:16 2021 +0200
+
+    [ci] Use known working Ubuntu version
+    
+    GitHub Actions seems to be moving ubuntu-latest from ubuntu-18.04 to
+    ubuntu-20.04, but gcovr is broken for us in the new version.
+
+ .github/workflows/linux-ci.yml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit ff86c72e09f8d7c623fafec671d44d62ef940e50
+Author: Khaled Hosny <khaled at aliftype.com>
+Date:   Tue Mar 16 00:20:05 2021 +0200
+
+    [ci] Avoid duplicate builds on pull requests
+    
+    Don’t run GitHub Actions on pushing to branches other than master. This
+    was already the case for the linux-ci workflow.
+
+ .github/workflows/msvc-ci.yml  | 2 ++
+ .github/workflows/msys2-ci.yml | 2 ++
+ 2 files changed, 4 insertions(+)
+
+commit f5356bcb6186d21158275e69fce75f015eac5478
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Mar 15 16:52:39 2021 -0600
+
+    [ci] Switch back to c++2a
+    
+    Okay I guess we can be bothered to fix things up for next version of C++.
+    
+    Reverts meat of c0b3b9b2584c6dcb5fc37e3b49e26fba718d0e6c
+
+ .circleci/config.yml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 9e397ff2fb1beb08a226f12d68a406a13023f03d
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Mar 15 16:50:54 2021 -0600
+
+    [buffer] Fix order of HB_INTERNAL HB_DISCARD
+    
+    Sucks that has to be specified in this order. But that is what it is for now.
+    
+    Was only exhibiting problem on C++>=17 since that's when the [[nodiscard]]
+    was introduced.
+
+ src/hb-buffer.hh | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit 9582640eedbf73fa95e6877a83e9b70970d9d115
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Mar 15 16:47:27 2021 -0600
+
+    [ci] Remove more cruft
+    
+    All were commented out already.
+
+ .circleci/config.yml | 6 +-----
+ 1 file changed, 1 insertion(+), 5 deletions(-)
+
+commit c0b3b9b2584c6dcb5fc37e3b49e26fba718d0e6c
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Mar 15 16:46:13 2021 -0600
+
+    [ci] Don't test C++2a build
+    
+    One of the bots is unhappy when HB_NODISCARD comes after HB_INTERNAL.
+    No idea why. But, again, we're testing HarfBuzz, not C++, not clang. Ugh.
+    
+    In file included from src/harfbuzz.cc:1:
+    In file included from src/hb-aat-layout.cc:30:
+    In file included from src/hb-aat-layout.hh:32:
+    In file included from src/hb-ot-shape.hh:32:
+    In file included from src/hb-ot-map.hh:32:
+    src/hb-buffer.hh:335:15: error: an attribute list cannot appear here
+      HB_INTERNAL HB_NODISCARD bool move_to (unsigned int i); /* i is output-buffer index. */
+                  ^~~~~~~~~~~~
+    https://app.circleci.com/pipelines/github/harfbuzz/harfbuzz/1693/workflows/77459205-a189-45d3-bc58-52a8fd952c3f/jobs/155912/parallel-runs/0/steps/0-110?invite=true
+
+ .circleci/config.yml | 4 +---
+ 1 file changed, 1 insertion(+), 3 deletions(-)
+
+commit 15f3ef01366c8dc1d6fa18f6c9e072b18f92afd7
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Mar 15 15:36:47 2021 -0600
+
+    [test] Fix output format
+
+ test/shaping/run-tests.py | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 8450f43ae1d1a5825bdfc1ec665cb81b05f35cc2
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Mar 15 15:18:06 2021 -0600
+
+    [buffer] HB_NODISCARD next_glyph()
+
+ src/gen-vowel-constraints.py                 |  6 ++---
+ src/hb-aat-layout-common.hh                  |  2 +-
+ src/hb-buffer.hh                             |  2 +-
+ src/hb-ot-layout-gsubgpos.hh                 |  2 +-
+ src/hb-ot-layout.cc                          |  2 +-
+ src/hb-ot-shape-complex-hangul.cc            | 18 +++++++--------
+ src/hb-ot-shape-complex-syllabic.cc          |  4 ++--
+ src/hb-ot-shape-complex-thai.cc              |  9 ++++----
+ src/hb-ot-shape-complex-vowel-constraints.cc | 34 ++++++++++++++--------------
+ src/hb-ot-shape-normalize.cc                 | 33 +++++++++++++++------------
+ 10 files changed, 57 insertions(+), 55 deletions(-)
+
+commit f4bc7673db762db8dbb83caaeeb32b2c04dbcf9a
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Mar 15 14:54:45 2021 -0600
+
+    [buffer] Implement copy_glyph() in terms of output_info()
+
+ src/hb-buffer.hh | 10 ++++------
+ 1 file changed, 4 insertions(+), 6 deletions(-)
+
+commit f73982a6992445141ea7ca402d1f4fea80f151c4
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Mar 15 14:52:19 2021 -0600
+
+    [buffer] Implement replace_glyph() in terms of replace_glyphs(1,1)
+    
+    I get exact same binary size with this, suggesting that compiler is
+    optimizing these as needed.
+
+ src/hb-buffer.hh | 12 +-----------
+ 1 file changed, 1 insertion(+), 11 deletions(-)
+
+commit 862f913489a868154a3733a93e1ea0407e68cc05
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Mar 15 14:48:50 2021 -0600
+
+    [buffer] Implement output_glyph() in terms of replace_glyphs(0,1)
+    
+    To my surprise, saves ~20kb in my build (non-size-optimized) build.
+    The output_glyph() method is never used in the fast paths, so doesn't
+    matter if is not fully optimized for the special case it is.
+
+ src/hb-buffer.hh | 9 +--------
+ 1 file changed, 1 insertion(+), 8 deletions(-)
+
+commit 34a1204f10eb1dedbd49c63eb7d89b86315ca093
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Mar 15 14:39:06 2021 -0600
+
+    [buffer] HB_NODISCARD output_glyph()
+    
+    Also, generalize and use replace_glyphs() in morx where output_glyph() was used
+    in a loop.
+
+ src/gen-vowel-constraints.py                 |  4 +--
+ src/hb-aat-layout-morx-table.hh              |  6 ++---
+ src/hb-buffer.cc                             | 27 -------------------
+ src/hb-buffer.hh                             | 40 ++++++++++++++++++++--------
+ src/hb-ot-layout-gsubgpos.hh                 |  2 +-
+ src/hb-ot-shape-complex-thai.cc              |  7 +++--
+ src/hb-ot-shape-complex-vowel-constraints.cc |  4 +--
+ src/hb-ot-shape-normalize.cc                 |  3 ++-
+ 8 files changed, 41 insertions(+), 52 deletions(-)
+
+commit 07315d9c83b9f7b15244c9922f97f4c71f89ae7d
+Author: Khaled Hosny <khaled at aliftype.com>
+Date:   Mon Mar 15 22:37:02 2021 +0200
+
+    [ci] Don’t install meson from its master branch
+    
+    We are testing Harfbuzz not meson!
+
+ .github/workflows/linux-ci.yml | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit e6be9eb4fbb9a5d1e028015cf1f92601da2984ac
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Mar 15 14:12:10 2021 -0600
+
+    [buffer] HB_NODISCARD output_info()
+
+ src/hb-buffer.hh                    | 2 +-
+ src/hb-ot-shape-complex-syllabic.cc | 2 +-
+ src/hb-ot-shape.cc                  | 2 +-
+ 3 files changed, 3 insertions(+), 3 deletions(-)
+
+commit 2a0dbb3ee59a83d1db568b002a17d617f4c45b63
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Mar 15 14:10:39 2021 -0600
+
+    [buffer] HB_NODISCARD copy_glyph()
+
+ src/hb-aat-layout-morx-table.hh | 4 ++--
+ src/hb-buffer.hh                | 2 +-
+ 2 files changed, 3 insertions(+), 3 deletions(-)
+
+commit b05e5d9a7998529ffd0e34f3b8d3ae5bf4c200eb
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Mar 15 14:08:08 2021 -0600
+
+    [buffer] HB_NODISCARD next_glyphs()
+
+ src/hb-buffer.cc             | 2 +-
+ src/hb-buffer.hh             | 2 +-
+ src/hb-ot-shape-normalize.cc | 2 +-
+ 3 files changed, 3 insertions(+), 3 deletions(-)
+
+commit 4ae8aab83b83bc088719a993a359625b9ff1b6ab
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Mar 15 14:01:52 2021 -0600
+
+    [buffer] HB_NODISCARD has_separate_output()
+
+ src/hb-buffer.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 8d3701f507cfda835855a64f598bed468a4b31e3
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Mar 15 14:01:32 2021 -0600
+
+    [buffer] HB_NODISCARD in_error()
+
+ src/hb-buffer.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 41e05479b6f1cc024576aca1f52b2185bdd93cef
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Mar 15 14:00:00 2021 -0600
+
+    [buffer] HB_NODISCARD shift_forward()
+
+ src/hb-buffer.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 83b3784d1d984ed3a94b696252b03eab514e3ffa
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Mar 15 13:59:14 2021 -0600
+
+    [buffer] HB_NODISCARD make_room_for()
+
+ src/hb-buffer.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit c355508a8907584e41c4317fb56eac49f9627969
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Mar 15 13:58:30 2021 -0600
+
+    [buffer] HB_NODISCARD ensure_glyphs() / ensure_unicode()
+
+ src/hb-buffer.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit bc22305b6ab626719e8b0c0d6fa518bf7b7267f6
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Mar 15 13:57:18 2021 -0600
+
+    [buffer] HB_NODISCARD ensure_inplace()
+
+ src/hb-buffer.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit cac6c86d2f8013a6f803f95e5760d7be6d27bbe0
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Mar 15 13:46:54 2021 -0600
+
+    [buffer] HB_NODISCARD move_to()
+
+ src/hb-aat-layout-morx-table.hh | 14 +++++++-------
+ src/hb-buffer.hh                |  2 +-
+ src/hb-ot-layout-gsubgpos.hh    |  2 +-
+ 3 files changed, 9 insertions(+), 9 deletions(-)
+
+commit 05d2d37f9a6753c2c3e0a2404e171f0b0a26c4ac
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Mar 15 13:43:29 2021 -0600
+
+    [buffer] HB_NODISCARD ensure()
+
+ src/hb-buffer.cc    | 7 +++++--
+ src/hb-buffer.hh    | 2 +-
+ src/hb-graphite2.cc | 2 +-
+ 3 files changed, 7 insertions(+), 4 deletions(-)
+
+commit d8028a076208d95fa66050d158f2c4b8c50040ad
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Mar 15 13:34:36 2021 -0600
+
+    [buffer] HB_NODISCARD enlarge()
+
+ src/hb-buffer.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 3f1998a065075284e7fe57788411bcc086259349
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Mar 15 13:33:44 2021 -0600
+
+    [buffer] HB_NODISCARD replace_glyph()
+
+ src/hb-aat-layout-morx-table.hh | 4 ++--
+ src/hb-buffer.hh                | 2 +-
+ src/hb-ot-layout-gsubgpos.hh    | 4 ++--
+ src/hb-ot-shape-complex-thai.cc | 5 ++---
+ 4 files changed, 7 insertions(+), 8 deletions(-)
+
+commit 607979d12f85eb8260b7d7b786a7866e60c3c49b
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Mar 15 13:23:48 2021 -0600
+
+    [buffer] HB_NODISCARD replace_glyphs()
+
+ src/hb-buffer.hh                  |  7 ++++---
+ src/hb-ot-shape-complex-hangul.cc | 10 ++++------
+ src/hb-ot-shape-normalize.cc      |  2 +-
+ 3 files changed, 9 insertions(+), 10 deletions(-)
+
+commit 906c9928bb49a1694f6e32d80bb2a1ed637674f8
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Mar 15 13:13:45 2021 -0600
+
+    [buffer] Return success status from buffer ops that can fail
+    
+    Previous error-handling philosophy was that user doesn't need to
+    immediately know whether operation failed. But as can be seen after
+    we added malloc-failing fuzzing, there's just so many places in the
+    code that a failure of these operations needs to be mitigated before
+    further operations. So I'm moving towards returning success here,
+    and possibly making it nodiscard.
+
+ src/hb-buffer.cc |  6 ++++--
+ src/hb-buffer.hh | 33 ++++++++++++++++++---------------
+ 2 files changed, 22 insertions(+), 17 deletions(-)
+
+commit a5b8e7db4d4a9aca46169e2be27be5bba1cdd4bd
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Mar 15 12:46:58 2021 -0600
+
+    [hangul] Improve error handling
+    
+    I did a review; changed some "return"s to "break"s, which should be identical.
+    Removed one check just before "continue" because not necessary.
+    The added error check is the actual fix.
+    
+    Should fix https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=31755
+
+ src/hb-ot-shape-complex-hangul.cc | 9 ++++-----
+ 1 file changed, 4 insertions(+), 5 deletions(-)
+
+commit 99767f938689d308765ba96feb9ea67534b0c0d9
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Mar 15 12:36:59 2021 -0600
+
+    [hangul] Whitespace
+
+ src/hb-ot-shape-complex-hangul.cc | 10 ++++++----
+ 1 file changed, 6 insertions(+), 4 deletions(-)
+
+commit 3622120fab4e7d324a1b5e8465e7a6cfeb246e8d
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Wed Mar 10 12:21:43 2021 -0700
+
+    [subset] Make ClassDef format2 .intersects() return false if range value 0
+    
+    We treat Class0 as "doesn't intersect".  That's the only meaningful
+    interpretation. If one allos Class0 to mean "intersects", then the
+    intersects() result should be true iff glyphset is non-empty.
+    
+    Related to https://github.com/harfbuzz/harfbuzz/issues/2703
+
+ src/hb-ot-layout-common.hh | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+commit e19de65eaeca135b2c735439185e35bfe1c0aeb7
+Author: David Corbett <corbett.dav at northeastern.edu>
+Date:   Mon Mar 8 13:12:47 2021 -0500
+
+    Update hb-ot-tag-table.hh (#2890)
+
+ src/gen-tag-table.py   |  1 +
+ src/hb-ot-tag-table.hh | 15 ++++++++++++---
+ 2 files changed, 13 insertions(+), 3 deletions(-)
+
+commit 7686ff854bbb9698bb1469dcfe6d288c695a76b7
+Author: Khaled Hosny <khaled at aliftype.com>
+Date:   Thu Mar 4 23:09:32 2021 +0200
+
+    [ot] Keep substituted Default_Ignorables (#2886)
+    
+    Don’t replace Default_Ignorables with zero-width space if they are
+    substituted or multiplied, not just when ligated.
+    
+    After this change, HarfBuzz output matches that of Uniscribe and
+    CoreText for the new tests.
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/2883
+
+ src/hb-ot-layout.hh                                      |   3 ++-
+ .../fonts/08b4b136f418add748dc641eb4a83033476f1170.ttf   | Bin 0 -> 2396 bytes
+ .../fonts/6677074106f94a2644da6aaaacd5bbd48cbdc7de.ttf   | Bin 0 -> 2388 bytes
+ .../fonts/fcea341ba6489536390384d8403ce5287ba71a4a.ttf   | Bin 0 -> 1824 bytes
+ .../shaping/data/in-house/tests/default-ignorables.tests |   3 +++
+ .../in-house/tests/mongolian-variation-selector.tests    |   2 +-
+ 6 files changed, 6 insertions(+), 2 deletions(-)
+
+commit 5efa04c8909cf61ad1491c0c1f41a6bb3f87e4e4
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Mar 2 16:26:41 2021 -0700
+
+    [Makefile] Rebuild .def files if config changed
+    
+    I was getting check-symbols failure because my previous build was
+    without CoreText, and after reconfiguring with CoreText, the old
+    harfbuzz.defs file was not being regenerated.
+
+ src/Makefile.am | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit d351bbf0fb7a20554bf4504fa568f85d4d68f266
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Mar 2 16:24:54 2021 -0700
+
+    [Makefile] Remove unused variable HBNODISTHEADERS
+    
+    Not sure what it was used for before.
+
+ src/Makefile.am | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit fd489433a8a223068d904e04d4ce8bafa82900c7
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Mar 2 16:21:17 2021 -0700
+
+    [indic] Fix cluster-merging logic with cluster-level=1
+    
+    Was producing non-monotonic cluster numbers because our faulty logic
+    was not merging clusters if something from before base and after base
+    had switched positions.
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/2272
+
+ src/hb-ot-shape-complex-indic.cc                   |  28 ++++++++++++++++++---
+ .../6f36d056bad6d478fc0bf7397bd52dc3bd197d5f.ttf   | Bin 0 -> 2920 bytes
+ test/shaping/data/in-house/tests/cluster.tests     |   1 +
+ 3 files changed, 26 insertions(+), 3 deletions(-)
+
+commit 2902529b9276cd15319fa308a9b9e963fa21cc94
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Mar 2 15:05:22 2021 -0700
+
+    [subset] Fix HB_TINY build
+    
+    Fixes https://github.com/harfbuzz/harfbuzzjs/issues/34#issuecomment-789247723
+
+ src/hb-ot-layout-gsubgpos.hh | 9 ++++++---
+ 1 file changed, 6 insertions(+), 3 deletions(-)
+
+commit 7cb22ba7ebf6ef053790a3201cb7014bacd51e46
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Mar 1 12:44:06 2021 -0700
+
+    Include C headers with their C++ names (#2882)
+    
+    Remove unnecessary includes.
+    
+    Fixes build with some known broken SDKs (Nintendo Switch?)
+    
+    https://en.cppreference.com/w/cpp/header
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/pull/2881
+
+ src/hb-blob.cc                    |  3 ---
+ src/hb-coretext.cc                |  1 -
+ src/hb-ot-color.cc                |  3 ---
+ src/hb.hh                         | 20 ++++++++++----------
+ src/test-buffer-serialize.cc      |  2 --
+ src/test-gpos-size-params.cc      |  2 --
+ src/test-gsub-would-substitute.cc |  2 --
+ src/test-ot-glyphname.cc          |  3 ---
+ src/test-ot-meta.cc               |  3 ---
+ src/test-ot-name.cc               |  3 ---
+ src/test.cc                       |  4 ----
+ 11 files changed, 10 insertions(+), 36 deletions(-)
+
+commit dbcf2f417fc545a5fb3a0ee4fb413409a15a0805
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Mar 1 12:43:32 2021 -0700
+
+    [cmake] Fix syntax
+
+ CMakeLists.txt | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit 93745f9f49ec6004dfc477a01bdb6fd06b6484d0
+Merge: 8b2f9adf2 486da35cc
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Feb 23 14:54:45 2021 -0700
+
+    Merge pull request #2875 from harfbuzz/constexpr-inttype
+    
+    [constexpr] Add constructors to IntType
+
+commit 486da35cc0954505db57b2e0f5b5b0b45a7c4007
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Feb 23 13:58:14 2021 -0700
+
+    m Add comments to IntType cast out operator
+    
+    Okay, bots seem to be happy. Merging.
+
+ src/hb-open-type.hh | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 83b66bfb665bb82fd03ae97c6f0e3eba01c0cba4
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Feb 23 13:04:25 2021 -0700
+
+    Another try to fix narrowing error
+    
+    ../src/hb-ot-layout-gsubgpos.hh: In instantiation of ‘void OT::ChainRule::serialize_array(hb_serialize_context_t*, OT::HBUINT16, Iterator) const [with Iterator = hb_map_iter_t<hb_array_t<const OT::IntType<short unsigned int> >, const hb_map_t*&, (hb_function_sortedness_t)0, 0>; typename hb_enable_if<hb_is_iterator_of<Lhs, typename Lhs::item_t>::value>::type* <anonymous> = 0; OT::HBUINT16 = OT::IntType<short unsigned int>]’:
+    ../src/hb-ot-layout-gsubgpos.hh:2341:30:   required from here
+    ../src/hb-ot-layout-gsubgpos.hh:2326:15: error: narrowing conversion of ‘(unsigned int)g’ from ‘unsigned int’ to ‘short unsigned int’ inside { } [-Werror=narrowing]
+           c->copy (HBUINT16 {g});
+           ~~~~~~~~^~~~~~~~~~~~~~
+    
+    https://github.com/harfbuzz/harfbuzz/pull/2875
+
+ src/hb-ot-layout-gsubgpos.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 6c4bb60829d6e00647cb7ee74d816d648905cc3f
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Feb 22 22:45:32 2021 -0700
+
+    Fix narrowing errors with recent changes
+
+ src/hb-ot-layout-common.hh | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit d6bd00a488ace632d51748b028a0378a2bdaad2c
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Feb 22 22:42:50 2021 -0700
+
+    Revert back IntType out cast to signed/unsigned
+    
+    Previous commit didn't fix the bots. Putting it back now that I
+    understand why I initially did the "Wide" casts.  But only doing
+    it for out-cast this time.  This causes "narrowing" warnings
+    whenever we are converting signed/unsigned to smaller HBUINT16
+    etc.  But those are valuable warnings.  We should address those
+    separately instead of ignoring.
+    
+    Maybe we should start using uint16_t more liberally in the
+    internal subsetter function signatures then.
+
+ src/hb-open-type.hh | 7 +------
+ 1 file changed, 1 insertion(+), 6 deletions(-)
+
+commit 09836013995cab2b9f07577a179ad7b024130467
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Feb 22 22:33:17 2021 -0700
+
+    Add back wider cast to IntType
+    
+    My local clang12 is fine, but many bots are not:
+    
+    ../src/hb-ot-cff1-table.hh: In instantiation of ‘bool CFF::Charset1_2<TYPE>::sanitize(hb_sanitize_context_t*, unsigned int) const [with TYPE = OT::IntType<unsigned char>]’:
+    ../src/hb-ot-cff1-table.hh:554:13:   required from here
+    ../src/hb-ot-cff1-table.hh:377:60: error: comparison between signed and unsigned integer expressions [-Werror=sign-compare]
+           if (unlikely (!ranges[i].sanitize (c) || (num_glyphs < ranges[i].nLeft + 1)))
+                                                    ~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
+    
+    Enabling the extra cast operator mentioned in previous commit to see if
+    that fixes this case.
+    
+    Again, I'd be happy to say "use 1u instead of 1" if this was universally
+    erred on.  But since some compilers happily compile this while others
+    err, it would be a huge headache. Let's see...
+    
+    https://github.com/harfbuzz/harfbuzz/pull/2875
+
+ src/hb-open-type.hh | 5 +++++
+ 1 file changed, 5 insertions(+)
+
+commit 567cedcc5f99aae2db9c7f124b7f3a6f4b5ec57d
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Feb 22 22:09:15 2021 -0700
+
+    Narrow down cast operators on IntType
+    
+    Say for USHORT, we were implementing casts from and to unsigned.
+    With this change, we cast from and to uint16_t only.  This allows
+    compiler more opportunities to catch possible narrowing issues in
+    the code.
+    
+    It needed a couple of fixes in the codebase though, because
+    previously, if a USHORT was participating in arithmetic with signed
+    numbers, eg. "u + 1", the result would have been unsigned.  With
+    this change, it would be signed.  The correct fix is to update the
+    code to read "u + 1u".
+    
+    That said, I think about conditionally adding back the cast
+    out to signed/unsigned, to facilitate better type deduction.
+    But I couldn't think of a real situation where that would help
+    with anything.  So I didn't add.  Here's what it was:
+    
+      template <typename Type2 = hb_conditional<hb_is_signed (Type), signed, unsigned>,
+               hb_enable_if (sizeof (Type) < sizeof (Type2))>
+      operator hb_type_identity_t<Type2> () const { return v; }
+    
+    https://github.com/harfbuzz/harfbuzz/pull/2875
+
+ src/hb-aat-layout-common.hh     | 4 ++--
+ src/hb-aat-layout-morx-table.hh | 4 ++--
+ src/hb-open-type.hh             | 9 ++++-----
+ 3 files changed, 8 insertions(+), 9 deletions(-)
+
+commit f4f35a4d5fd595bc6887b9951f1c92ce4d100fe8
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Feb 22 22:28:32 2021 -0700
+
+    [constexpr] Use initializer instead of assignment
+
+ src/hb-ot-layout-common.hh   | 6 ++----
+ src/hb-ot-layout-gsubgpos.hh | 7 +------
+ 2 files changed, 3 insertions(+), 10 deletions(-)
+
+commit cc16b26ef4b9e7217ad819a31b9df55855a6f780
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Feb 22 17:55:47 2021 -0700
+
+    [constexpr] IntType
+    
+    See https://github.com/harfbuzz/harfbuzz/pull/2875
+
+ src/hb-algs.hh      | 13 ++++++++-----
+ src/hb-open-type.hh | 12 ++++++++----
+ 2 files changed, 16 insertions(+), 9 deletions(-)
+
+commit 8b2f9adf2938513a183af58246e4b02b6173c359
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Feb 22 17:42:24 2021 -0700
+
+    m Simplify Tag operator char*
+
+ src/hb-open-type.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 021a1725ed6b8b9f7b9b2987cbb89bed03a36477
+Merge: 1c693e8c2 11c28cb5f
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Feb 22 17:40:22 2021 -0700
+
+    Merge pull request #2874 from harfbuzz/constexpr2
+    
+    Some more cleanup towards using constexpr to simplify our internal datastrcutures.
+    
+    https://github.com/harfbuzz/harfbuzz/pull/2874
+
+commit 11c28cb5fa101a47b179e702e15ebf39d6483b32
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Feb 22 17:38:53 2021 -0700
+
+    [cmake] Define HAVE_PTHREAD if not on win32
+    
+    Yeah...
+
+ CMakeLists.txt | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit b368a0736be279fe1ae78caa818351d88dc7131a
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Feb 22 17:23:53 2021 -0700
+
+    [atomic] Remove IBM/AIX implementation
+    
+    The C++11 implementation shall be enough for everyone.
+
+ src/hb-atomic.hh | 28 +---------------------------
+ 1 file changed, 1 insertion(+), 27 deletions(-)
+
+commit 52f91269607a45e4ae94ecca52df2299d6596de4
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Feb 22 17:22:09 2021 -0700
+
+    [atomic] Remove Windows implementation
+    
+    Since we require C++11 now, there's no point to do a macro version check.
+    Which means we don't hit the MSVC issue defining __cplusplus wrongly.
+
+ src/hb-atomic.hh | 28 ++--------------------------
+ 1 file changed, 2 insertions(+), 26 deletions(-)
+
+commit a666fe64a92206cc51d961be0848455d4fbd2bdd
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Jun 29 10:43:49 2020 -0700
+
+    [atomic] Comment
+
+ src/hb-atomic.hh | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit 3528a21e8d135e65d748895b469bf83c0ebec5ae
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Jun 29 10:40:21 2020 -0700
+
+    [atomic] Remove Apple implementation
+    
+    Continuation of https://github.com/harfbuzz/harfbuzz/pull/676
+
+ src/hb-atomic.hh | 24 ------------------------
+ 1 file changed, 24 deletions(-)
+
+commit 140797d4a2841d4109ad667a38226bfd59de5829
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Jun 29 03:51:09 2020 -0700
+
+    [constexpr] hb_atomic_int_t
+
+ src/hb-atomic.hh | 13 ++++++++-----
+ src/hb-face.cc   |  4 ++--
+ src/hb-object.hh | 11 +++--------
+ 3 files changed, 13 insertions(+), 15 deletions(-)
+
+commit 2ec802b42a0766c3fc159fd47a2596a5eaf27742
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Jun 29 03:48:38 2020 -0700
+
+    [object] Simplify reference_count_t
+
+ src/hb-object.hh | 8 +++-----
+ 1 file changed, 3 insertions(+), 5 deletions(-)
+
+commit 4d116ed0f02920f9ba4634d87f6201343930b657
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Feb 22 17:14:45 2021 -0700
+
+    [ci] Remove cmake
+    
+    Apparently(?) our cmake build never bothered setting up pthreads.
+    So when I removed the busy-loop mutex impl it now doesn't build.
+    
+    711c241f6c7e18c5403602375a733af74df76f83
+    
+    https://github.com/harfbuzz/harfbuzz/pull/2874#issuecomment-782778263
+
+ .circleci/config.yml | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit 1c693e8c28478655e115ad6c25ff775222b7ac00
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sat Feb 20 18:53:20 2021 -0700
+
+    [test] Fix unused-var warning
+
+ test/api/test-buffer.c | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit 12a283d5132a3fe03c91e75ef1f7baf65d6b5855
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Feb 22 12:50:41 2021 -0700
+
+    m[ft] No need to use atomic ops for cached_x_scale
+    
+    We have added a mutex since, so no need for atomicity.
+
+ src/hb-ft.cc | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit b39c1f7829bb6c7a69eb783e579246fdb627cd94
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sat Feb 20 15:46:17 2021 -0700
+
+    a[build] Fix distcheck
+
+ Makefile.am | 2 --
+ 1 file changed, 2 deletions(-)
+
+commit a3c35aee30879cd86351413fc395d3128fe6817a
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Jun 29 02:07:20 2020 -0700
+
+    m Move HB_SCRIPT_MYANMAR_ZAWGYI
+
+ src/hb-ot-shape-complex.hh | 3 ++-
+ src/hb.hh                  | 8 --------
+ 2 files changed, 2 insertions(+), 9 deletions(-)
+
+commit c55bf55154887ae485501bf8843e26abb5cdedaa
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Jun 29 02:04:16 2020 -0700
+
+    Remove HB_CONST_FUNC and HB_PURE_FUNC
+    
+    They are not necessary for inline functions.
+
+ src/hb-algs.hh | 6 +++---
+ src/hb-face.hh | 2 +-
+ src/hb.hh      | 4 ----
+ 3 files changed, 4 insertions(+), 8 deletions(-)
+
+commit cba9893ac5470e5d70888ec240453b581a657252
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Jun 29 01:55:57 2020 -0700
+
+    m[algs] Move roundf() here
+
+ src/hb-algs.hh | 7 +++++++
+ src/hb.hh      | 5 -----
+ 2 files changed, 7 insertions(+), 5 deletions(-)
+
+commit f0947717ff43c37a6273e9de7c83d082ffec22eb
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Jun 29 01:53:21 2020 -0700
+
+    m[machinery] Move HB_VAR_ARRAY here
+
+ src/hb-machinery.hh | 5 +++++
+ src/hb.hh           | 5 -----
+ 2 files changed, 5 insertions(+), 5 deletions(-)
+
+commit 69464e9da04b9e9b7f5ac33688d3832b84a8318d
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sat Feb 20 15:42:44 2021 -0700
+
+    [algs] Another try at fixing BEInt constexpr
+    
+    ../src/hb-algs.hh:120:3: error: body of constexpr function ‘constexpr BEInt<Type, 2>::operator Type() const [with Type = short unsigned int]’ not a return-statement
+
+ src/hb-algs.hh | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit ff7bf88192b0ceed3e9489c82f6b902ced37e1b4
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sat Feb 20 15:39:29 2021 -0700
+
+    m[algs] Fix BEInt -Wnarrowing errors
+
+ src/hb-algs.hh | 20 ++++++++++----------
+ 1 file changed, 10 insertions(+), 10 deletions(-)
+
+commit a89d9f25b4baa538293c397920e5a4489859878c
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sat Feb 20 15:35:28 2021 -0700
+
+    m Err on -Wnarrowing instead of -Wc++11-narrowing
+    
+    On clang, -Wnarrowing is synonym for -Wc++11-narrowing.
+    On gcc it isn't. So, use the widely-available one
+
+ src/hb.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit e208f80449caccea19f68e395ad4c38353849da6
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sat Feb 20 15:31:27 2021 -0700
+
+    Make constexpr BEInt<Type, 2>::operator Type() C++11-compatible
+    
+    Multiple return values not permitted until C++14
+
+ src/hb-algs.hh | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit c2fc2aa44cc8018ac689dde36efa34a635544197
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Jun 29 01:49:28 2020 -0700
+
+    [atomic] Remove Solaris intrinsics
+
+ CMakeLists.txt                             | 17 -----------------
+ configure.ac                               | 18 ------------------
+ meson-cc-tests/solaris-atomic-operations.c |  8 --------
+ meson.build                                |  4 ----
+ src/hb-atomic.hh                           | 29 -----------------------------
+ 5 files changed, 76 deletions(-)
+
+commit 7099a6dca18c12a3bb062adba4d429abc46d76a9
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Jun 29 01:47:37 2020 -0700
+
+    [atomic] Remove old Intel primitives implementation
+
+ .github/workflows/coverity-scan.yml           |  6 +++---
+ CMakeLists.txt                                | 14 --------------
+ configure.ac                                  | 16 ----------------
+ meson-cc-tests/intel-atomic-primitives-test.c |  6 ------
+ meson.build                                   |  4 ----
+ src/hb-atomic.hh                              |  9 ---------
+ 6 files changed, 3 insertions(+), 52 deletions(-)
+
+commit 711c241f6c7e18c5403602375a733af74df76f83
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Jun 29 01:40:30 2020 -0700
+
+    m[mutex] Remove busyloop mutex implemenation
+    
+    Don't know why I ever added this. :)
+
+ configure.ac    |  5 -----
+ meson.build     |  3 ---
+ src/hb-mutex.hh | 18 ------------------
+ 3 files changed, 26 deletions(-)
+
+commit 47f01c0726388102b82c1e04a5f134abb74b1831
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Jun 29 01:25:35 2020 -0700
+
+    m[algs] Move BEInt here
+
+ src/hb-algs.hh | 81 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
+ src/hb.hh      | 76 ------------------------------------------------------
+ 2 files changed, 80 insertions(+), 77 deletions(-)
+
+commit e5b7bc424dd08c206f8c5baf5ac1b67d1dfd116e
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Jun 29 01:24:02 2020 -0700
+
+    m Add default value to BEInt<> Size template parameter
+
+ src/hb-open-type.hh | 14 +++++++-------
+ src/hb-serialize.hh |  2 +-
+ src/hb.hh           |  4 ++--
+ 3 files changed, 10 insertions(+), 10 deletions(-)
+
+commit 2caae4a59aadf889b410c4e2f42c0285013c22e6
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Jun 29 01:18:28 2020 -0700
+
+    m Move class traits
+
+ src/hb-meta.hh | 11 +++++++++++
+ src/hb.hh      |  8 --------
+ 2 files changed, 11 insertions(+), 8 deletions(-)
+
+commit c2dbd6cc0f9f30b2faed1fa0f40cfff742baae86
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Jun 29 01:15:36 2020 -0700
+
+    Remove static_assert of sizeof basic sized int types
+
+ src/hb.hh | 8 --------
+ 1 file changed, 8 deletions(-)
+
+commit e1706ffecdc0469063b90bbef6178c092dd7f32b
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Jun 29 00:59:06 2020 -0700
+
+    m [algs] Move flags here
+
+ src/hb-algs.hh | 36 ++++++++++++++++++++++++++++++++++++
+ src/hb.hh      | 36 ------------------------------------
+ 2 files changed, 36 insertions(+), 36 deletions(-)
+
+commit 017f6b0d2441dc7602d9cb4b6783aaf5a0424f96
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Jun 29 00:44:41 2020 -0700
+
+    m Move static_assert_expr<>
+
+ src/hb-meta.hh | 4 ++++
+ src/hb.hh      | 5 -----
+ 2 files changed, 4 insertions(+), 5 deletions(-)
+
+commit 61f8d0e57dd9eee7e174f091f4e43646251dbb06
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Jun 29 00:38:56 2020 -0700
+
+    m Rename ASSERT_STATIC_EXPR_ZERO to static_assert_expr
+
+ src/hb-ot-shape-complex-arabic-win1256.hh | 4 ++--
+ src/hb-ot-shape-complex-indic.hh          | 2 +-
+ src/hb.hh                                 | 8 ++++----
+ 3 files changed, 7 insertions(+), 7 deletions(-)
+
+commit 59cfffb1af82c706e181db64e81794f43af05cf4
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Jun 29 00:34:07 2020 -0700
+
+    m Change ASSERT_STATIC_EXPR_ZERO template arg type to bool
+
+ src/hb.hh | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 1981d83d7fefbc22d28d69714bfdac7aa5064d15
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Jun 29 00:28:31 2020 -0700
+
+    [constexpr] HB_MARK_AS_FLAG_T
+
+ src/hb.hh | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit a4a99de0eb17b1de1be99534b5184fd1f1c53c37
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Jun 29 00:22:02 2020 -0700
+
+    [constexpr] bswap
+
+ src/hb.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit f8ebe1dacd71d93dc2b401d0afbac86f5e14311d
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Jun 29 00:20:45 2020 -0700
+
+    [constexpr] BEInt
+
+ src/hb.hh | 64 +++++++++++++++++++++++----------------------------------------
+ 1 file changed, 23 insertions(+), 41 deletions(-)
+
+commit 2fbd34f89a80fb25aa0f8edd1dbb692c66211842
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sun Jun 28 22:41:09 2020 -0700
+
+    m[set/map] Add operator bool()
+    
+    Probably should use in places..
+
+ src/hb-map.hh | 1 +
+ src/hb-set.hh | 1 +
+ 2 files changed, 2 insertions(+)
+
+commit bf75a0a03ac910879ee91cd29a4581c304edc644
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Feb 19 18:18:38 2021 -0700
+
+    m[dispatch] Use inline class member initialization
+    
+    Let's see how bots like this...
+
+ src/hb-dispatch.hh | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit 82928d9cf65e275362188e9d855690d2ae71f005
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sun Jun 28 22:03:57 2020 -0700
+
+    m[blob] Move immutable check to C API boundary
+    
+    Similarly to 08ed9e3f779253e3b5f01c38d44d0e5db2d5e7aa
+
+ src/hb-blob.cc | 10 +++-------
+ 1 file changed, 3 insertions(+), 7 deletions(-)
+
+commit 4020c6b286a5a2bacf8ca97a402b39bbf29f18c6
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sun Jun 28 21:59:46 2020 -0700
+
+    m[blob] An empty blob can always be made writable
+
+ src/hb-blob.cc | 10 ++++++----
+ 1 file changed, 6 insertions(+), 4 deletions(-)
+
+commit 2d39031f7b03543d8e9638354afad1af68872f06
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sun Jun 28 20:48:48 2020 -0700
+
+    [buffer/set/map] Move immutable check only to C API boundary
+    
+    The immutable objects are a concept only enforced by the C API.
+    So move checks only to that region.
+    
+    This does assume that the rest of the code is careful not getting
+    into these internal methods on immutable objects, which something
+    we do, but have no way of enforcing (currently).
+    
+    .
+
+ src/hb-buffer.cc | 21 ++++++---------------
+ src/hb-map.cc    |  3 +++
+ src/hb-map.hh    |  4 ----
+ src/hb-set.cc    |  3 +++
+ src/hb-set.hh    |  5 -----
+ 5 files changed, 12 insertions(+), 24 deletions(-)
+
+commit 6d83d44052d85f1a67ad14101b1a0a89cca642c9
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sun Jun 28 21:02:51 2020 -0700
+
+    m[set] Recover set from error in .reset()
+
+ src/hb-set.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 445efe8d04b76e14148e7a53c891adb96e199dad
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sun Jun 28 20:59:01 2020 -0700
+
+    m[vector] Recover vector from error in .reset()
+
+ src/hb-vector.hh | 11 ++++++++---
+ 1 file changed, 8 insertions(+), 3 deletions(-)
+
+commit 21433fa563028b1dda5f044bdeef9221511806f3
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sun Jun 28 20:46:02 2020 -0700
+
+    m[buffer] In hb_buffer_append() don't change until allocation success
+
+ src/hb-buffer.cc | 10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
+
+commit 0f61a6213acd3f8ad5dd93f11c526bacceff699c
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sun Jun 28 20:40:25 2020 -0700
+
+    m[vowels] Simplify
+    
+    If we didn't "process" anything, swap_buffers() becomes a no-op.
+
+ src/gen-vowel-constraints.py                 |  5 +----
+ src/hb-ot-shape-complex-vowel-constraints.cc | 19 +------------------
+ 2 files changed, 2 insertions(+), 22 deletions(-)
+
+commit 3b91e0b5920a4a1c16dc349c4c93b4a4daf006bc
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sun Jun 28 20:33:54 2020 -0700
+
+    m[buffer] Rename internal variable
+
+ src/hb-buffer.cc | 7 ++++---
+ 1 file changed, 4 insertions(+), 3 deletions(-)
+
+commit 9fcba109bf62aaff3dd8469ecb387e7451031a76
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sun Jun 28 20:30:39 2020 -0700
+
+    [buffer] Make swap_buffers() copy rest
+
+ src/gen-vowel-constraints.py                 | 4 ----
+ src/hb-aat-layout-common.hh                  | 4 ----
+ src/hb-buffer.cc                             | 3 +++
+ src/hb-ot-shape-complex-vowel-constraints.cc | 4 ----
+ src/hb-ot-shape.cc                           | 2 --
+ 5 files changed, 3 insertions(+), 14 deletions(-)
+
+commit 86993c09a1f1d72b972592693ccfb18a5ab28af4
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Feb 19 17:09:33 2021 -0700
+
+    Ignore -Wrange-loop-analysis
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/2834
+
+ src/hb.hh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 6d94194497b49ee4cd05c9f590f6cd871a5708e9
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Feb 19 17:08:10 2021 -0700
+
+    Use auto in range-for-loop more
+
+ src/hb-ot-cff-common.hh      | 2 +-
+ src/hb-ot-cmap-table.hh      | 8 ++++----
+ src/hb-ot-layout-gsubgpos.hh | 6 ++++--
+ 3 files changed, 9 insertions(+), 7 deletions(-)
+
+commit 1551f3d51862ab8f6428c9c35c7f424b00af72ee
+Author: justvanrossum <justvanrossum at gmail.com>
+Date:   Thu Feb 18 11:57:37 2021 +0100
+
+    fixing more expected test results
+
+ test/api/test-draw.c | 20 ++++++++++----------
+ 1 file changed, 10 insertions(+), 10 deletions(-)
+
+commit 79e4f436e7fc4634ed285d548cad48069c6390eb
+Author: justvanrossum <justvanrossum at gmail.com>
+Date:   Wed Feb 17 10:21:58 2021 +0100
+
+    Apply rounding correctly when calculating glyph extents for CFF and CFF2; adjust expected test results
+
+ src/hb-ot-cff1-table.cc        | 4 ++--
+ src/hb-ot-cff2-table.cc        | 4 ++--
+ test/api/test-ot-extents-cff.c | 6 +++---
+ 3 files changed, 7 insertions(+), 7 deletions(-)
+
+commit d01ebeae21b8f17a7eff92b091340fdf804b4de2
+Author: justvanrossum <justvanrossum at gmail.com>
+Date:   Wed Feb 17 10:13:54 2021 +0100
+
+    calculate extents based on scaled then rounded values; undo two of the earlier test result adjustments
+
+ src/hb-ot-glyf-table.hh           | 4 ++--
+ test/api/test-ot-metrics-tt-var.c | 4 ++--
+ 2 files changed, 4 insertions(+), 4 deletions(-)
+
+commit 1d02e9c63bde6f5d064671401a292ffc440a9e99
+Author: justvanrossum <justvanrossum at gmail.com>
+Date:   Tue Feb 16 21:39:43 2021 +0100
+
+    two more adjusted expected extents results (still not convinced this is the right thing, though)
+
+ test/api/test-ot-metrics-tt-var.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit cd0babe6a66ad8286fd8e60d7a87d7691b249482
+Author: justvanrossum <justvanrossum at gmail.com>
+Date:   Tue Feb 16 21:05:30 2021 +0100
+
+    adjust expected test result
+
+ test/api/test-ot-metrics-tt-var.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 1d8a89504bc2fc37372f10ea699453992ae8fc0b
+Author: justvanrossum <justvanrossum at gmail.com>
+Date:   Tue Feb 16 20:55:16 2021 +0100
+
+    do not round added deltas; fixes #2866
+
+ src/hb-ot-var-gvar-table.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 103ed7da83758e6327a0b0b3e8f521dd41f2232b
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Feb 19 16:48:30 2021 -0700
+
+    [subset] Use dagger
+    
+    Better fix for https://github.com/harfbuzz/harfbuzz/pull/2858
+
+ src/hb-ot-layout-gpos-table.hh | 12 +++---------
+ 1 file changed, 3 insertions(+), 9 deletions(-)
+
+commit d8ea552d1095b92f44657ca8a90e4fc9fcdbd37a
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Feb 18 12:07:46 2021 -0700
+
+    [aat] Improve unsafe-to-break logic
+    
+    Reduces false-positives.  See comments for new logic.
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/2860
+    
+    Adjusts run-tests.sh to allow unhashed absolute filenames.
+
+ src/hb-aat-layout-common.hh                  | 91 +++++++++++++++++++++-------
+ test/shaping/data/in-house/tests/macos.tests |  3 +
+ test/shaping/run-tests.py                    | 17 +++---
+ 3 files changed, 81 insertions(+), 30 deletions(-)
+
+commit cf203936d7ba74dfb567a92378476c3125010023
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Feb 18 12:03:26 2021 -0700
+
+    [aat] Unbreak builds
+    
+    Some compilers don't like this:
+    
+    ../src/hb-aat-layout-common.hh:732:9: error: declaration of 'using StateTable = struct AAT::StateTable<Types, EntryData>' changes meaning of 'StateTable' [-fpermissive]
+    732 |   using StateTable = StateTable<Types, EntryData>;
+
+ src/hb-aat-layout-common.hh | 14 +++++++-------
+ 1 file changed, 7 insertions(+), 7 deletions(-)
+
+commit b6fdaa6948a31beffa5a0715aca9718493bb9644
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Feb 18 11:16:37 2021 -0700
+
+    [minor:aat] Use injected class name
+
+ src/hb-aat-layout-common.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit e27420bb189bff7b15f8830e834eaf486de63505
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Feb 18 11:15:25 2021 -0700
+
+    [minor:aat] Simplify template reference
+
+ src/hb-aat-layout-common.hh | 14 ++++++++------
+ 1 file changed, 8 insertions(+), 6 deletions(-)
+
+commit 7b8a8adb7d3d273e16ad5933b1a958f4d13a6572
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Feb 18 09:47:24 2021 -0700
+
+    [aat] Fix unsafe-to-break marking when end-of-text action kicks in
+    
+    The state we are dealing with here is the previous state; so it should
+    cause unsafe_to_break before current glyph.
+    
+    I'm surprised this wasn't caught by any tests. Guess we don't have any
+    fonts with fancy end-of-text forms.
+
+ src/hb-aat-layout-common.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit aa80c7c8b4242d61e771b28775638bf2a2c5100f
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Feb 18 09:31:46 2021 -0700
+
+    [aat] Add buffer->successful check before buffer->next_glyph()
+
+ src/hb-aat-layout-common.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit bcd10bf2741266e16d514269cc1c8902105187db
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Wed Feb 17 13:58:56 2021 -0700
+
+    [normalize] Add buffer success check before ->next_glyph()
+    
+    Speculative fix for:
+    https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=27843
+
+ src/hb-ot-shape-normalize.cc | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 505b3fc6cfbed95a4101c9a9c75a76645eb6fb6b
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Wed Feb 17 11:34:47 2021 -0700
+
+    [harfbuzz.cc] Fix OffsetTable name clash with Mac headers
+    
+    There's no easy way to undo a "using namespace" in our sources, so by the time
+    we get to include hb-coretext.cc from harfbuzz.cc, we already have "using namespace OT"
+    active, which clashes with Mac headers.
+    
+    Error was:
+    $ gcc -O3 -Wall -arch i386 -DHAVE_CORETEXT=1 -c harfbuzz.cc -o harfbuzz.o -std=c++11
+    /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/CoreServices.framework/Frameworks/CarbonCore.framework/Headers/TextUtils.h:288:3: error:
+          reference to 'OffsetTable' is ambiguous
+      OffsetTable     offsets,
+      ^
+    /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/CoreServices.framework/Frameworks/CarbonCore.framework/Headers/IntlResources.h:115:41: note:
+          candidate found by name lookup is 'OffsetTable'
+    typedef OffPair                         OffsetTable[3];
+                                            ^
+    ./hb-open-file.hh:81:16: note: candidate found by name lookup is 'OT::OffsetTable'
+    typedef struct OffsetTable
+                   ^
+    1 error generated.
+
+ src/hb-open-file.hh     | 6 +++---
+ src/hb-ot-head-table.hh | 2 +-
+ 2 files changed, 4 insertions(+), 4 deletions(-)
+
+commit 6a9f576fd438aef23242e72bd04285d0ea1279ad
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Wed Feb 17 11:31:32 2021 -0700
+
+    [coretext] Silence CoreText deprecation warning
+    
+    As suggested by Ned, just ignoring it.
+    
+    warning: 'CTGetCoreTextVersion' is deprecated: first deprecated in macOS 11.0 - Use
+          -[NSProcessInfo operatingSystemVersion] [-Wdeprecated-declarations]
+
+ src/hb-coretext.cc | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 8e53c7c125ad93c1e83224da378d53caee00ca1e
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Wed Feb 17 11:12:56 2021 -0700
+
+    [coretext] Fix more CGFloat double-promotion warnings
+    
+    The warning is:
+    warning: implicit conversion increases floating-point precision: 'CGFloat' (aka 'float') to
+          'double' [-Wdouble-promotion]
+
+ src/hb-coretext.cc | 12 ++++++------
+ 1 file changed, 6 insertions(+), 6 deletions(-)
+
+commit cd08c2528c69cc91d06efc3947ab21007269b00d
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Feb 16 18:51:43 2021 -0700
+
+    Fix typo
+
+ CONFIG.md | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 9c8032cb4b436e093c16dd8476284d8fdcc1c93e
+Author: Khaled Hosny <khaled at aliftype.com>
+Date:   Tue Feb 16 22:00:20 2021 +0200
+
+    [meson] Don’t build FontConfig subproject from master
+    
+    Pin it to a known working tag instead.
+
+ subprojects/fontconfig.wrap | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 5ca353a2d026f655af61ae159adcaeace1fdb09c
+Author: Garret Rieger <grieger at google.com>
+Date:   Fri Feb 12 15:16:59 2021 -0800
+
+    [subset] fix heap buffer overflow found by fuzzer.
+
+ src/hb-ot-layout-gpos-table.hh                            |   3 +++
+ ...z-testcase-minimized-hb-subset-fuzzer-4901143794810880 | Bin 0 -> 565 bytes
+ ...z-testcase-minimized-hb-subset-fuzzer-6372147008241664 | Bin 0 -> 775 bytes
+ 3 files changed, 3 insertions(+)
+
+commit ae860db893f74a7025b7656697a10c017e38e261
+Merge: 7a60f4e3a 751ed68fe
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Feb 16 12:39:47 2021 -0700
+
+    Merge pull request #2859 from harfbuzz/override-0b55
+    
+    [indic] Fix shaping of U+0B55 ORIYA SIGN OVERLINE
+
+commit 751ed68fee1d32f8a2c13b4fdc4bfaa9856608e8
+Author: David Corbett <corbett.dav at northeastern.edu>
+Date:   Sun Feb 14 12:47:34 2021 -0500
+
+    [indic] Fix shaping of U+0B55 ORIYA SIGN OVERLINE
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/2849
+
+ src/hb-ot-shape-complex-indic.hh                          |   1 +
+ .../fonts/b3075ca42b27dde7341c2d0ae16703c5b6640df0.ttf    | Bin 0 -> 920 bytes
+ test/shaping/data/in-house/tests/indic-syllable.tests     |   2 ++
+ 3 files changed, 3 insertions(+)
+
+commit 7a60f4e3a407cdadedc3b723eb2f1d716e99cd72
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Feb 12 14:14:17 2021 -0700
+
+    [subset] Remove debug burden
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/2360
+
+ src/hb-subset-plan.hh | 15 +++++++++------
+ 1 file changed, 9 insertions(+), 6 deletions(-)
+
+commit 00d9276343f4c3d5fe6919308e0ba229c2f9ff10
+Author: Garret Rieger <grieger at google.com>
+Date:   Wed Oct 14 14:48:11 2020 -0700
+
+    Add gpos9 expected files to Makefile.am
+
+ test/subset/data/Makefile.am | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 08a4997fdec4f8df388d73dab7274b67ace8dc67
+Author: Garret Rieger <grieger at google.com>
+Date:   Tue Oct 6 13:02:12 2020 -0700
+
+    [subset] Add subset support for Extension lookups (GPOS 9, GSUB 7).
+
+ src/hb-ot-layout-gsubgpos.hh                       |  30 +++++++++++++++++++++
+ test/subset/data/Makefile.sources                  |   1 +
+ .../gpos9_font2.keep-layout-retain-gids.41,42.otf  | Bin 0 -> 1976 bytes
+ .../gpos9_font2.keep-layout-retain-gids.41.otf     | Bin 0 -> 1936 bytes
+ .../gpos9_font2.keep-layout-retain-gids.42.otf     | Bin 0 -> 1808 bytes
+ .../layout.gpos9/gpos9_font2.keep-layout.41,42.otf | Bin 0 -> 1272 bytes
+ .../layout.gpos9/gpos9_font2.keep-layout.41.otf    | Bin 0 -> 1236 bytes
+ .../layout.gpos9/gpos9_font2.keep-layout.42.otf    | Bin 0 -> 1096 bytes
+ test/subset/data/fonts/gpos9_font2.otf             | Bin 0 -> 4588 bytes
+ test/subset/data/tests/layout.gpos9.tests          |  11 ++++++++
+ test/subset/meson.build                            |   1 +
+ 11 files changed, 43 insertions(+)
+
+commit bbbea3dbd86ece2ba0f6a0f7f70ea240fbc5a40f
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Feb 11 12:23:33 2021 -0700
+
+    [minor] Rewrite set operation in OS/2 subsetting
+    
+    This patch could be nicer:
+    https://github.com/harfbuzz/harfbuzz/pull/2572/files
+    
+    Just tiny touchup now.
+
+ src/hb-ot-os2-table.hh | 9 ++++-----
+ 1 file changed, 4 insertions(+), 5 deletions(-)
+
+commit cdb9197b4137ccac7d775b0e10adf0e9ef485f0c
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Feb 11 11:32:49 2021 -0700
+
+    [khmer] Remove more unused code
+    
+    Prodded by https://github.com/harfbuzz/harfbuzz/pull/2583
+    
+    These are leftovers from when we forked Khmer shaper from the Indic shaper.
+
+ src/hb-ot-shape-complex-khmer.cc | 23 -----------------------
+ 1 file changed, 23 deletions(-)
+
+commit dfa9d7acdc320005749bb21b4c4711224a87d511
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Feb 11 11:08:52 2021 -0700
+
+    [minor] Use serializer->propagate_error() to simplify code
+
+ src/hb-ot-color-cbdt-table.hh |  8 ++++----
+ src/hb-ot-layout-gsubgpos.hh  | 18 ++++++++----------
+ src/hb-serialize.hh           |  9 +++++----
+ 3 files changed, 17 insertions(+), 18 deletions(-)
+
+commit 5faae8260ac9f81dbc022317edd63643c83bc8e4
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Feb 11 10:58:02 2021 -0700
+
+    [post] Remove unneeded error check
+
+ src/hb-ot-post-table.hh | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit d7e2a51de2fb6c18c05bbc4c270efb01e9d744e1
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Feb 11 10:55:03 2021 -0700
+
+    [minor] Add unlikely() when checking for error
+
+ src/hb-face.cc               | 2 +-
+ src/hb-ot-glyf-table.hh      | 2 +-
+ src/hb-ot-layout-gsubgpos.hh | 8 ++++----
+ 3 files changed, 6 insertions(+), 6 deletions(-)
+
+commit eb069f3948ee6e79b9ac5396a4fd1aa37e4e9136
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Wed Feb 10 19:13:51 2021 -0700
+
+    [tests] Update expected output of recently-merged gpos5
+    
+    The merged PR was from before landing this:
+    
+    commit 7a72b20aa2b604053696e731185a17286de73b08
+    Author: Garret Rieger <grieger at google.com>
+    Date:   Thu Sep 24 15:58:48 2020 -0700
+    
+        [subset] Subset GDEF during layout subsetting tests.
+
+ ...1.keep-layout-retain-gids.retain-all-codepoint.otf | Bin 3840 -> 3884 bytes
+ .../gpos5_font1.keep-layout.retain-all-codepoint.otf  | Bin 3840 -> 3884 bytes
+ 2 files changed, 0 insertions(+), 0 deletions(-)
+
+commit c7d232ce4e8eccdeaf8fc4bb4b73818b581d3fb9
+Merge: 68d576224 be33704c0
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Wed Feb 10 18:13:38 2021 -0700
+
+    Merge pull request #2701 from googlefonts/Mark-To-Ligature_grieger
+    
+    [subset] GPOS 5 MarkToLigature subsetting support
+
+commit 68d576224fcd6fd649a20c77b4573203a781f9c4
+Merge: 094406b67 7b9e23f28
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Wed Feb 10 14:56:29 2021 -0700
+
+    Merge pull request #2853 from harfbuzz/fix-g-ir-scanner
+    
+    [introspection] Fix g-ir-scanner syntax errors
+
+commit 7b9e23f28b2bf0540a2c49914f5d9c89079c96ba
+Author: Khaled Hosny <khaled at aliftype.com>
+Date:   Wed Feb 10 23:37:43 2021 +0200
+
+    [introspection] Fix g-ir-scanner syntax errors
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/2851
+
+ src/Makefile.am             |  9 +--------
+ src/hb-aat-layout.h         |  2 +-
+ src/hb-blob.h               |  2 +-
+ src/hb-buffer.h             |  2 +-
+ src/hb-common.h             |  2 +-
+ src/hb-deprecated.h         |  2 +-
+ src/hb-draw.h               |  2 +-
+ src/hb-face.h               |  2 +-
+ src/hb-font.h               |  2 +-
+ src/hb-gobject-enums.h.tmpl |  2 +-
+ src/hb-gobject-structs.h    |  2 +-
+ src/hb-map.h                |  2 +-
+ src/hb-ot-color.h           |  2 +-
+ src/hb-ot-deprecated.h      |  2 +-
+ src/hb-ot-font.h            |  2 +-
+ src/hb-ot-layout.h          |  2 +-
+ src/hb-ot-math.h            |  2 +-
+ src/hb-ot-meta.h            |  2 +-
+ src/hb-ot-metrics.h         |  2 +-
+ src/hb-ot-name.h            |  2 +-
+ src/hb-ot-shape.h           |  2 +-
+ src/hb-ot-var.h             |  2 +-
+ src/hb-set.h                |  2 +-
+ src/hb-shape-plan.h         |  2 +-
+ src/hb-shape.h              |  2 +-
+ src/hb-style.h              |  2 +-
+ src/hb-unicode.h            |  2 +-
+ src/hb-version.h            |  2 +-
+ src/hb-version.h.in         |  2 +-
+ src/meson.build             | 10 ++--------
+ 30 files changed, 31 insertions(+), 44 deletions(-)
+
+commit 094406b67b074c460d8c44e31c847f9c1bec3d05
+Author: Khaled Hosny <khaled at aliftype.com>
+Date:   Wed Feb 10 22:49:27 2021 +0200
+
+    [ci] Disable failing Arch Linux job
+    
+    Some g-ir-scanner failure that does not seem to be related to us. The
+    job does not seem to be testing anything interesting anyway.
+
+ .circleci/config.yml | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit 554aaa0c5deb4c4f315184be8540eebe9077fe27
+Author: Khaled Hosny <khaled at aliftype.com>
+Date:   Wed Feb 10 22:25:16 2021 +0200
+
+    [build] Fix make distcheck
+    
+    A regression from 7b77ce0507e18fb981a9b865f3eaac0c2ae06044.
+    It was caught by the CI build in the PR, but apparently we are now used
+    to CI failures that they are effectively ignored.
+    
+    Also, yay for multiple build systems.
+
+ test/subset/data/Makefile.am | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 1da75afbe8804ede5b2843759a9c185e015918b0
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Wed Feb 10 00:03:30 2021 -0700
+
+    [minor] Add unlikely()
+
+ src/hb-ot-layout-gsubgpos.hh | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit 6e1afac64bbf3222d3e7f484749bbd2d17fc1a25
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Feb 9 18:48:46 2021 -0700
+
+    [minor] Rename internal variable
+    
+    To address review comment:
+    https://github.com/harfbuzz/harfbuzz/pull/2699#discussion_r573370781
+
+ src/hb-ot-layout-gsubgpos.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 836814a571a18bca344c0b35d136b2122122f82e
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Feb 5 13:41:19 2021 -0500
+
+    [array] Swap order of args to hb_equal()
+    
+    Prioritizes Key::cmp() over table's cmp.
+
+ src/hb-array.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 98374cebe1001e726b40a588b9fdc13208c8a9b1
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Feb 5 13:40:10 2021 -0500
+
+    Conditionalize IntType::cmp() so it never fails to compile
+    
+    Useful with lfind() since that calls hb_equal() which SFINAEs which
+    cmp() to use.
+
+ src/hb-open-type.hh | 17 ++++++++++++-----
+ 1 file changed, 12 insertions(+), 5 deletions(-)
+
+commit ed04174a64c77e6ba7a68294d0672391740d2d75
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Feb 5 13:36:46 2021 -0500
+
+    Whitespace
+
+ src/hb-algs.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 6a3fd94f3b8fa8f4aa1d4e4c9cfe74d0c3b88270
+Merge: 8f47dd577 aace09a3a
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Feb 9 20:49:04 2021 -0500
+
+    Merge pull request #2699 from googlefonts/gpos_8
+    
+    [subset] Add a more complex layout subsetting test case and fix the issues it exposed.
+
+commit 8f47dd5779f7f78b5c11f307a74128892ec1d26c
+Author: Garret Rieger <grieger at google.com>
+Date:   Wed Nov 4 11:05:22 2020 -0800
+
+    [subset] don't set lookup visited in closure_lookups_context_t::recurse.
+    - Lookup::closure_lookups also checks if the lookups visited and sets the lookup to visited. If we set visited in 'recurse' then Lookup::closure_lookups will fail to recurse into the children of the lookup.
+    - Also when copying ChainRule's skip LookupRecord's that point to lookups which aren't retained. This matches FontTool's behaviour.
+
+ src/hb-ot-layout-gsubgpos.hh | 16 +++++++++++-----
+ 1 file changed, 11 insertions(+), 5 deletions(-)
+
+commit feeff5928b7764934cec376d047a5c808e9412a6
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Feb 9 14:59:40 2021 -0700
+
+    [docs] Add destroy() call to sample
+
+ docs/usermanual-fonts-and-faces.xml | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 319e5b3200a2896acb2b01cc047f1144305acc14
+Author: Khaled Hosny <khaled at aliftype.com>
+Date:   Fri Jan 1 01:31:19 2021 +0200
+
+    [manual] Fix font functions section
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/2731
+
+ docs/usermanual-fonts-and-faces.xml | 27 ++++++++++++++++++++-------
+ 1 file changed, 20 insertions(+), 7 deletions(-)
+
+commit 3583fce86d7c4a75b89d19107c9e0de45e169507
+Author: Khaled Hosny <khaled at aliftype.com>
+Date:   Thu Dec 31 19:45:11 2020 +0200
+
+    [manual] Give all chapters & sections pretty links
+
+ docs/harfbuzz-docs.xml               | 12 ++++++------
+ docs/usermanual-getting-started.xml  |  6 +++---
+ docs/usermanual-what-is-harfbuzz.xml |  2 +-
+ 3 files changed, 10 insertions(+), 10 deletions(-)
+
+commit 84d4d9fc4d3b6811cefac097537136ef11ab78ee
+Author: Khaled Hosny <khaled at aliftype.com>
+Date:   Thu Dec 31 18:27:10 2020 +0200
+
+    [manual] We don’t use ucdn library anymore
+
+ docs/usermanual-utilities.xml | 28 +---------------------------
+ 1 file changed, 1 insertion(+), 27 deletions(-)
+
+commit 68d2e1b221ca90a76f9a5179b05868e350ed0bd3
+Author: Khaled Hosny <khaled at aliftype.com>
+Date:   Thu Jan 21 14:39:19 2021 +0200
+
+    [meson] Disable benchmark feature by default
+    
+    It downloads a dependency from the internet, and in the same time not
+    used anywhere (one needs to explicitly call ninja benchmark), not even
+    on the CI (not sure if it that would make much sense since it does not
+    seem to ever fail).
+
+ meson.build       | 12 ++----------
+ meson_options.txt |  2 +-
+ 2 files changed, 3 insertions(+), 11 deletions(-)
+
+commit b6f47af555e17dbc3b5cacc061bd22c54e0c80f9
+Author: Khaled Hosny <khaled at aliftype.com>
+Date:   Thu Jan 21 14:34:01 2021 +0200
+
+    [meson] Report more options in the summary
+
+ meson.build | 5 +++++
+ 1 file changed, 5 insertions(+)
+
+commit 33a0f0b6860e0a48f92bc855c179a0fc5864112f
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Feb 9 12:55:45 2021 -0700
+
+    [test] Remove fuzzed test font that triggers virus alert
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/2750
+
+ ...testcase-minimized-hb-subset-fuzzer-5741295280848896 | Bin 98822 -> 0 bytes
+ 1 file changed, 0 insertions(+), 0 deletions(-)
+
+commit 99184fbe2b22b2662fdf1b29edd9aabc1abc040b
+Author: Khaled Hosny <khaled at aliftype.com>
+Date:   Wed Feb 3 13:40:39 2021 +0200
+
+    [ci] Add top level directory to win32 zip file
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/2840
+
+ .ci/build-win32.sh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit d9e0244cdfa522d5dfdd523197078968d83dc038
+Author: josephshen <joseph.smeng at gmail.com>
+Date:   Tue Feb 2 16:04:44 2021 +0800
+
+    remove duplicate file names
+
+ src/Makefile.sources | 2 --
+ src/meson.build      | 2 --
+ 2 files changed, 4 deletions(-)
+
+commit dad41c07e4076ff247042116a0815f33e41aa0d6
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Feb 1 13:54:12 2021 -0500
+
+    [use] Typo
+
+ src/hb-ot-shape-complex-use-machine.rl | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 63a716c540657d2e0c71d3443a87ac97530cf265
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Jan 29 20:36:42 2021 -0700
+
+    [indic] Use lfind()
+
+ src/hb-ot-shape-complex-indic.hh | 5 +----
+ 1 file changed, 1 insertion(+), 4 deletions(-)
+
+commit 921b4e46b0096873cee8c182cade0dafa8b35b43
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Jan 29 20:35:05 2021 -0700
+
+    [algs] Add hb_equal()
+    
+    Use in hb_array_t::lfind()
+
+ src/hb-algs.hh  | 42 ++++++++++++++++++++++++++++++++++++++++--
+ src/hb-array.hh |  2 +-
+ 2 files changed, 41 insertions(+), 3 deletions(-)
+
+commit f4ed3bf20bb8522189a8d5d12242089121617896
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Jan 29 20:05:38 2021 -0700
+
+    [indic] Remove categorization of Khmer Ra
+    
+    Khmer goes through its own shaper these days.
+
+ src/hb-ot-shape-complex-indic.hh | 2 --
+ 1 file changed, 2 deletions(-)
+
+commit 676d1e6adf9572f79544182491af1abb229d2ccf
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Jan 29 19:53:39 2021 -0700
+
+    [indic] Spell out INDIC_TABLE_ELEMENT_TYPE
+
+ src/gen-indic-table.py                   |    4 +-
+ src/hb-ot-shape-complex-indic-table.cc   |    4 +-
+ src/hb-ot-shape-complex-indic.hh         |    4 +-
+ src/hb-ot-shape-complex-khmer-machine.hh |  665 ++++++++++---------
+ src/hb-ot-shape-complex-use-machine.hh   | 1034 +++++++++++++++++-------------
+ 5 files changed, 953 insertions(+), 758 deletions(-)
+
+commit 769c2b19a3c3e87923928b9c9de4ded7307b3ed8
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Jan 29 11:40:59 2021 -0700
+
+    [indic/khmer/myanmar/use] Minor shuffling of found_syllable() macros
+
+ src/hb-ot-shape-complex-indic-machine.hh   | 32 +++++++++++++++---------------
+ src/hb-ot-shape-complex-indic-machine.rl   | 14 ++++++-------
+ src/hb-ot-shape-complex-khmer-machine.hh   | 18 ++++++++---------
+ src/hb-ot-shape-complex-khmer-machine.rl   |  8 ++++----
+ src/hb-ot-shape-complex-myanmar-machine.hh | 18 ++++++++---------
+ src/hb-ot-shape-complex-myanmar-machine.rl | 12 +++++------
+ src/hb-ot-shape-complex-use-machine.hh     | 30 ++++++++++++++--------------
+ src/hb-ot-shape-complex-use-machine.rl     | 22 ++++++++++----------
+ 8 files changed, 77 insertions(+), 77 deletions(-)
+
+commit 59721c2f372918555f3d238b449a61907d1fc94c
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Jan 29 11:34:59 2021 -0700
+
+    [use] Move data table into same compilation unit
+
+ src/Makefile.sources                               |  2 +-
+ src/gen-use-table.py                               | 11 +++--
+ src/harfbuzz.cc                                    |  1 -
+ src/hb-ot-shape-complex-use-machine.hh             | 55 ++++++++++------------
+ src/hb-ot-shape-complex-use-machine.rl             |  5 --
+ ...e-table.cc => hb-ot-shape-complex-use-table.hh} | 11 +++--
+ src/hb-ot-shape-complex-use.cc                     |  1 +
+ src/meson.build                                    |  2 +-
+ src/update-unicode-tables.make                     |  4 +-
+ 9 files changed, 42 insertions(+), 50 deletions(-)
+
+commit d9b167da3d261737ed7f5874f308eed3ad37fd0f
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Jan 28 20:40:42 2021 -0700
+
+    [use] Remove hb-ot-shape-complex-use.hh
+    
+    Inline into ragel machine.
+
+ src/Makefile.sources                   |   1 -
+ src/gen-use-table.py                   |   1 -
+ src/hb-ot-shape-complex-use-machine.hh | 100 ++++++++++++++++++++++++---------
+ src/hb-ot-shape-complex-use-machine.rl |  50 ++++++++++++++++-
+ src/hb-ot-shape-complex-use-table.cc   |   1 -
+ src/hb-ot-shape-complex-use.cc         |   1 -
+ src/hb-ot-shape-complex-use.hh         |  83 ---------------------------
+ src/meson.build                        |   1 -
+ 8 files changed, 123 insertions(+), 115 deletions(-)
+
+commit 3bb2653a5e843338ab42cc929a874923cc14bafa
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Jan 28 20:36:51 2021 -0700
+
+    [use] Reuse category numbers exported from ragel machine
+    
+    Part of https://github.com/harfbuzz/harfbuzz/pull/2726
+
+ src/gen-use-table.py                   |  7 +--
+ src/hb-ot-shape-complex-use-machine.hh | 57 ++++++++++++------------
+ src/hb-ot-shape-complex-use-machine.rl | 11 +++--
+ src/hb-ot-shape-complex-use-table.cc   | 81 +++++++++++++++++-----------------
+ src/hb-ot-shape-complex-use.cc         | 48 ++++++++++----------
+ src/hb-ot-shape-complex-use.hh         | 53 +---------------------
+ 6 files changed, 107 insertions(+), 150 deletions(-)
+
+commit c417e0d2f91f673dfb55c6d04e9d1fcda985abe7
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Jan 28 20:27:59 2021 -0700
+
+    [indic/khmer/myanmar/use] Move enum category around
+    
+    Such that the generated -machine.hh headers are independent.
+
+ src/hb-ot-shape-complex-indic-machine.hh   | 61 +++++++++++++++------------
+ src/hb-ot-shape-complex-indic-machine.rl   |  9 ++++
+ src/hb-ot-shape-complex-indic.cc           | 14 +------
+ src/hb-ot-shape-complex-khmer-machine.hh   | 44 +++++++++++---------
+ src/hb-ot-shape-complex-khmer-machine.rl   |  6 +++
+ src/hb-ot-shape-complex-khmer.cc           | 10 +----
+ src/hb-ot-shape-complex-myanmar-machine.hh | 45 +++++++++++---------
+ src/hb-ot-shape-complex-myanmar-machine.rl |  7 ++++
+ src/hb-ot-shape-complex-myanmar.cc         | 12 +-----
+ src/hb-ot-shape-complex-use-machine.hh     | 66 +++++++++++++++++++-----------
+ src/hb-ot-shape-complex-use-machine.rl     | 16 ++++++++
+ src/hb-ot-shape-complex-use.cc             | 20 +--------
+ 12 files changed, 169 insertions(+), 141 deletions(-)
+
+commit 675b6c29947befe1c893b1c7ec33741386ca2bad
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Jan 28 20:17:33 2021 -0700
+
+    [indic/khmer/myanmar/use] Remove unused dump-*-data programs
+    
+    In prep for streamlining tables.
+
+ src/Makefile.am          | 19 -------------------
+ src/dump-indic-data.cc   | 43 -------------------------------------------
+ src/dump-khmer-data.cc   | 41 -----------------------------------------
+ src/dump-myanmar-data.cc | 43 -------------------------------------------
+ src/dump-use-data.cc     | 38 --------------------------------------
+ src/meson.build          | 15 ---------------
+ 6 files changed, 199 deletions(-)
+
+commit 0a5c6311409547c7a24efbbd595ed5a50f754107
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Jan 28 19:53:20 2021 -0700
+
+    [use] Rename internal enum joinint_form_t members
+    
+    To ease upcoming change.
+
+ src/hb-ot-shape-complex-use.cc | 22 +++++++++++-----------
+ 1 file changed, 11 insertions(+), 11 deletions(-)
+
+commit 880fdb7460caa88a0a08a535555e54cf5037eed3
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Jan 28 19:47:53 2021 -0700
+
+    [indic/khmer/myanmar/use] Export categories from Ragel source
+    
+    Not hooked up yet.
+    
+    Part of alternative approach to
+    https://github.com/harfbuzz/harfbuzz/pull/2726
+
+ src/hb-ot-shape-complex-indic-machine.hh   | 32 +++++++++--
+ src/hb-ot-shape-complex-indic-machine.rl   | 36 ++++++------
+ src/hb-ot-shape-complex-khmer-machine.hh   | 30 ++++++++--
+ src/hb-ot-shape-complex-khmer-machine.rl   | 32 +++++------
+ src/hb-ot-shape-complex-myanmar-machine.hh | 40 ++++++++++++--
+ src/hb-ot-shape-complex-myanmar-machine.rl | 52 +++++++++---------
+ src/hb-ot-shape-complex-use-machine.hh     | 88 ++++++++++++++++++++++--------
+ src/hb-ot-shape-complex-use-machine.rl     | 87 +++++++++++++++--------------
+ 8 files changed, 252 insertions(+), 145 deletions(-)
+
+commit f94bf9f06ff46d6fc33d04fbb4e92e5d25fcaa42
+Author: Garret Rieger <grieger at google.com>
+Date:   Mon Jan 25 15:57:42 2021 -0800
+
+    [set fuzzer] limit the total number of set members in a fuzzing input.
+    Currently the fuzzer can create arbitarily long inputs which once big enough will trigger a timeout.
+
+ test/fuzzing/hb-set-fuzzer.cc | 9 +++++++++
+ 1 file changed, 9 insertions(+)
+
+commit b198d944890f107d8be09fded0ad402332230229
+Author: ckitagawa <ckitagawa at chromium.org>
+Date:   Mon Jan 25 16:34:11 2021 -0500
+
+    use {} rather than {0}
+
+ src/hb-ot-color-colr-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 2e50b517e1f5346d87349c965ef0469ed61892da
+Author: ckitagawa <ckitagawa at chromium.org>
+Date:   Mon Jan 25 16:19:07 2021 -0500
+
+    Nicer more idiomatic fix
+
+ src/hb-ot-color-colr-table.hh | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit 8f6559a373363e8992cb964ecae2ce2a115e2d7d
+Author: ckitagawa <ckitagawa at chromium.org>
+Date:   Mon Jan 25 10:37:59 2021 -0500
+
+    [subet/COLR] Default initialize firstLayerIdx
+
+ src/hb-ot-color-colr-table.hh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit a650243d3994e5098a8528cce262d4ffb258b11d
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sun Jan 24 13:30:06 2021 -0700
+
+    [sanitize] Fix typo
+
+ src/hb-sanitize.hh | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit e05e56061c75588dbc31a4ced73e13207e537fd9
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sun Jan 24 12:28:04 2021 -0700
+
+    [mingw] Reinstate win32 cross-compiling with autotools instructions
+    
+    Was removed in favor of meson in 6058ede3ae983c53d1d6f5352d4235bafce3499a.
+    However, those fail to build for me.
+
+ Makefile.am        |  1 +
+ README.mingw.md    | 32 ++++++++++++++++++++++++--------
+ mingw-configure.sh | 28 ++++++++++++++++++++++++++++
+ 3 files changed, 53 insertions(+), 8 deletions(-)
+
+commit 881ad720fe78b27421945824e3c30f7536a8e6bf
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Jan 21 14:27:45 2021 -0700
+
+    [algs] Remove passthru declaration
+    
+    Let compiler figure it out.
+
+ src/hb-algs.hh |  8 --------
+ src/hb-set.hh  | 25 ++++++++++++++-----------
+ 2 files changed, 14 insertions(+), 19 deletions(-)
+
+commit ca0b7afee9422338886cfb163f0a68e2f1868f24
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Jan 21 12:18:48 2021 -0700
+
+    [set] Use hb_fill()
+
+ src/hb-ot-layout-common.hh | 8 ++++----
+ src/hb-set.hh              | 5 ++---
+ 2 files changed, 6 insertions(+), 7 deletions(-)
+
+commit 5fce8898e0be354a890c629516ecae76a3383a64
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Jan 21 12:14:20 2021 -0700
+
+    [iter] Allow passing rvalue iters to hb_fill()
+
+ src/hb-iter.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 6463ee02d6127fa2bfc4ada5e65468a4f8815531
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Jan 21 12:01:13 2021 -0700
+
+    Speed up ClassDef/Coverage intersect methods
+    
+    Just avoiding overhead as measured by Garret.
+    Should rewrite as dagger in the future and confirm that it has the
+    same benefits. Later on, rewrite as lfind() maybe.
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/2826
+
+ src/hb-ot-layout-common.hh | 34 ++++++++++++++++++++++++----------
+ 1 file changed, 24 insertions(+), 10 deletions(-)
+
+commit 33368a12b7f7b394cc2b36048a04f76aa1f7009e
+Author: Garret Rieger <grieger at google.com>
+Date:   Thu Jan 21 11:06:58 2021 -0800
+
+    uint32_t to unsigned in hb-set.hh
+
+ src/hb-set.hh | 16 ++++++++--------
+ 1 file changed, 8 insertions(+), 8 deletions(-)
+
+commit 2a0d0b901f687915eab4b270c48e658e52b95676
+Author: Garret Rieger <grieger at google.com>
+Date:   Thu Jan 21 10:45:09 2021 -0800
+
+    Make set  clear work even when set is in failed state.
+
+ src/hb-set.hh | 28 ++++++++++++++--------------
+ 1 file changed, 14 insertions(+), 14 deletions(-)
+
+commit 0ba73e980c210ea5b3542327aa889177f9e44a2e
+Author: Garret Rieger <grieger at google.com>
+Date:   Wed Sep 16 13:56:33 2020 -0700
+
+    [ENOMEM] handle allocation failures during page compaction.
+
+ src/hb-set.hh | 50 +++++++++++++++++++++++++++++++++++++++-----------
+ 1 file changed, 39 insertions(+), 11 deletions(-)
+
+commit a4c3732f59188046322e599a1a67279680385cbd
+Author: Garret Rieger <grieger at google.com>
+Date:   Wed Sep 16 12:35:09 2020 -0700
+
+    [ENOMEM] fix set clear() causing corruption if the set is in_error().
+
+ src/hb-set.hh                                            |  11 ++++++++---
+ ...-testcase-minimized-hb-subset-fuzzer-5345734743031808 | Bin 0 -> 1240 bytes
+ 2 files changed, 8 insertions(+), 3 deletions(-)
+
+commit 9b8be9643cba165abf9256df1b8b8413b0574ab0
+Author: Khaled Hosny <khaled at aliftype.com>
+Date:   Wed Jan 20 23:49:24 2021 +0200
+
+    [docs] Ignore hb-gobject headers
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/2797
+
+ docs/Makefile.am           |  3 --
+ docs/harfbuzz-docs.xml     |  1 -
+ docs/harfbuzz-sections.txt | 72 ----------------------------------------------
+ docs/meson.build           | 17 +++++------
+ src/hb-gobject-structs.h   | 30 -------------------
+ 5 files changed, 7 insertions(+), 116 deletions(-)
+
+commit 2a6a49c90b1255d687e52121ba7b3b3c272c4a70
+Author: Khaled Hosny <khaled at aliftype.com>
+Date:   Thu Jan 21 00:06:03 2021 +0200
+
+    [meson] Don’t scan files outside src for docs
+    
+    Similar to what we do in Makefile.am.
+
+ docs/meson.build | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 051a3c7b9a9b9064cf0a9fc8a2a32e6114f103ec
+Author: Khaled Hosny <khaled at aliftype.com>
+Date:   Wed Jan 20 22:35:34 2021 +0200
+
+    [docs] Fix typo
+
+ src/hb-font.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit a44dd339f9ebf789b2642b5a7eef2785fca6d809
+Author: Khaled Hosny <khaled at aliftype.com>
+Date:   Fri Jan 1 01:36:57 2021 +0200
+
+    [docs] Missing param docs
+
+ src/hb-font.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 478d169c0fdbecbf859352ae2f03d5261cb49b11
+Author: Khaled Hosny <khaled at aliftype.com>
+Date:   Thu Dec 31 18:17:33 2020 +0200
+
+    [docs] Document more deprecated symbols
+
+ src/hb-deprecated.h    | 13 ++++++++++++-
+ src/hb-graphite2.cc    |  5 +++++
+ src/hb-ot-deprecated.h |  2 ++
+ 3 files changed, 19 insertions(+), 1 deletion(-)
+
+commit ca0a7a838447947ea2530bb51487c775f02d48b4
+Author: Khaled Hosny <khaled at aliftype.com>
+Date:   Thu Dec 31 17:29:03 2020 +0200
+
+    [docs] Document hb_ot_math_constant_t somehow
+
+ src/hb-ot-math.h | 61 ++++++++++++++++++++++++++++++++++++++++++++++++++++++--
+ 1 file changed, 59 insertions(+), 2 deletions(-)
+
+commit 3ba1e7e783d2beab39fce656d98f5ce79fdf2843
+Author: Khaled Hosny <khaled at aliftype.com>
+Date:   Thu Dec 31 17:11:35 2020 +0200
+
+    [docs] Document HB_OT_TAG_DEFAULT_LANGUAGE/SCRIPT
+
+ src/hb-ot-layout.h | 12 ++++++++++++
+ 1 file changed, 12 insertions(+)
+
+commit 4bfa0b3c0214a35a2c7c0400aef9797a82bc5cac
+Author: Khaled Hosny <khaled at aliftype.com>
+Date:   Thu Dec 31 16:30:05 2020 +0200
+
+    [docs] Fix hb_color_get_* docs
+
+ src/hb-common.cc | 16 ++++++++++++----
+ 1 file changed, 12 insertions(+), 4 deletions(-)
+
+commit 2cdc92c0c27ecdd07735e1a7d3768651991ea0e1
+Author: David Corbett <corbett.dav at northeastern.edu>
+Date:   Sat Aug 29 19:41:40 2020 -0400
+
+    [use] Move most joining scripts to USE
+
+ src/hb-ot-shape-complex.hh | 37 +++++++++----------------------------
+ 1 file changed, 9 insertions(+), 28 deletions(-)
+
+commit 5c73c9082b32a5dd955c1c0f0a4e08e85304c2e2
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Jan 18 12:47:25 2021 -0700
+
+    [syllabic] Fix signed/unsigned comparision errors
+
+ src/hb-ot-shape-complex-syllabic.cc | 6 +++---
+ src/hb-ot-shape-complex-syllabic.hh | 4 ++--
+ 2 files changed, 5 insertions(+), 5 deletions(-)
+
+commit e3d4c2972759f0fd578213d450da7e4d8b5c83e8
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Jan 15 19:23:33 2021 -0700
+
+    [indic/khmer/myanmar] Minor: Fix mask
+    
+    Seems like a typo. No behavior change.
+
+ src/hb-ot-shape-complex-indic.hh   | 2 +-
+ src/hb-ot-shape-complex-khmer.hh   | 2 +-
+ src/hb-ot-shape-complex-myanmar.hh | 2 +-
+ 3 files changed, 3 insertions(+), 3 deletions(-)
+
+commit 0ddade44cf02455bf78ebb782841c76f3c4cea9a
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Jan 15 19:13:47 2021 -0700
+
+    [syllabic] Merge various insert_dotted_circles implementations
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1810
+
+ src/hb-ot-shape-complex-indic.cc    | 70 ++++--------------------------------
+ src/hb-ot-shape-complex-khmer.cc    | 71 ++++--------------------------------
+ src/hb-ot-shape-complex-myanmar.cc  | 64 +++------------------------------
+ src/hb-ot-shape-complex-syllabic.cc | 67 ++++++++++++++++++++++++++++++++++
+ src/hb-ot-shape-complex-syllabic.hh |  8 +++++
+ src/hb-ot-shape-complex-use.cc      | 72 +++++--------------------------------
+ 6 files changed, 101 insertions(+), 251 deletions(-)
+
+commit e8e9fd9556816e7d43f3c5c0a678789cd6b2cf24
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Jan 15 18:52:57 2021 -0700
+
+    [syllabic] Add hb-ot-shape-complex-syllabic.cc/hh
+    
+    Empty for now.
+    
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1810
+
+ src/Makefile.sources                |  2 ++
+ src/harfbuzz.cc                     |  1 +
+ src/hb-ot-shape-complex-indic.hh    |  2 +-
+ src/hb-ot-shape-complex-syllabic.cc | 33 +++++++++++++++++++++++++++++++++
+ src/hb-ot-shape-complex-syllabic.hh | 33 +++++++++++++++++++++++++++++++++
+ src/hb-ot-shape-complex-use.hh      |  3 +--
+ src/meson.build                     |  2 ++
+ 7 files changed, 73 insertions(+), 3 deletions(-)
+
+commit 8af85c4e86ae88c02921b048c5100a57f27857c6
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Jan 15 18:48:12 2021 -0700
+
+    Remove hb-ot-shape-complex-machine-index.hh file
+    
+    Inline code into USE header.
+
+ src/Makefile.sources                     |  1 -
+ src/hb-ot-shape-complex-machine-index.hh | 69 --------------------------------
+ src/hb-ot-shape-complex-use-machine.hh   | 49 +++++++++++------------
+ src/hb-ot-shape-complex-use-machine.rl   |  1 -
+ src/hb-ot-shape-complex-use.hh           | 39 ++++++++++++++++++
+ 5 files changed, 63 insertions(+), 96 deletions(-)
+
+commit 9dd61c5b78dfc229e36f5ffe23fd448fc9bf82f5
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Jan 15 18:42:30 2021 -0700
+
+    Rename internal buffer var use
+    
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1810
+
+ src/hb-ot-shape-complex-arabic.cc | 2 +-
+ src/hb-ot-shape-complex-hangul.cc | 2 +-
+ src/hb-ot-shape-complex-indic.hh  | 4 ++--
+ src/hb-ot-shape-complex-use.cc    | 2 +-
+ src/hb-ot-shape-complex.hh        | 4 ++--
+ 5 files changed, 7 insertions(+), 7 deletions(-)
+
+commit 6a140ef570bc29aafc1078d16d5399fceadd476f
+Author: Khaled Hosny <khaled at aliftype.com>
+Date:   Sun Jan 17 22:48:50 2021 +0200
+
+    [meson] Pin Cairo subproject 1.17.4
+    
+    There is now a release with meson build support.
+
+ subprojects/cairo.wrap | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit fb1b29cee4bdea6805f14a530cb2984185f0d3ac
+Author: Khaled Hosny <khaled at aliftype.com>
+Date:   Sun Jan 17 22:55:12 2021 +0200
+
+    [ci] Fix msys2 breakage
+    
+    What package manger randomly changes package names without fallback!
+
+ .github/workflows/msys2-ci.yml | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 3c5b7886ebeee112ba7d2f2f7d7e581981ab61b0
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Jan 15 19:26:04 2021 -0700
+
+    Revert "Avoid category duplication between C++ and Ragel"
+    
+    This reverts commit 67ea8133d3fa82b3365cd917fb266ba752f16169.
+    
+    Merged accidentally on https://github.com/harfbuzz/harfbuzz/pull/2726
+
+ src/Makefile.sources                       |  2 -
+ src/gen-ragel-artifacts.py                 |  2 +-
+ src/hb-ot-shape-complex-indic-category.hh  | 89 ------------------------------
+ src/hb-ot-shape-complex-indic-machine.hh   | 36 ++++++------
+ src/hb-ot-shape-complex-indic-machine.rl   | 19 ++++++-
+ src/hb-ot-shape-complex-indic.hh           | 36 +++++++++++-
+ src/hb-ot-shape-complex-khmer-machine.hh   | 22 ++++----
+ src/hb-ot-shape-complex-khmer-machine.rl   | 17 +++++-
+ src/hb-ot-shape-complex-khmer.hh           | 29 +++++++---
+ src/hb-ot-shape-complex-myanmar-machine.hh | 22 ++++----
+ src/hb-ot-shape-complex-myanmar-machine.rl | 31 ++++++++++-
+ src/hb-ot-shape-complex-myanmar.hh         | 32 +++++++++--
+ src/hb-ot-shape-complex-use-category.hh    | 87 -----------------------------
+ src/hb-ot-shape-complex-use-machine.hh     | 34 ++++++------
+ src/hb-ot-shape-complex-use-machine.rl     | 45 ++++++++++++++-
+ src/hb-ot-shape-complex-use.hh             | 53 +++++++++++++++++-
+ src/meson.build                            |  2 -
+ 17 files changed, 299 insertions(+), 259 deletions(-)
+
+commit 67ea8133d3fa82b3365cd917fb266ba752f16169
+Author: David Corbett <corbett.dav at northeastern.edu>
+Date:   Sat Oct 17 14:37:22 2020 -0400
+
+    Avoid category duplication between C++ and Ragel
+
+ src/Makefile.sources                       |  2 +
+ src/gen-ragel-artifacts.py                 |  2 +-
+ src/hb-ot-shape-complex-indic-category.hh  | 89 ++++++++++++++++++++++++++++++
+ src/hb-ot-shape-complex-indic-machine.hh   | 36 ++++++------
+ src/hb-ot-shape-complex-indic-machine.rl   | 19 +------
+ src/hb-ot-shape-complex-indic.hh           | 36 +-----------
+ src/hb-ot-shape-complex-khmer-machine.hh   | 22 ++++----
+ src/hb-ot-shape-complex-khmer-machine.rl   | 17 +-----
+ src/hb-ot-shape-complex-khmer.hh           | 29 +++-------
+ src/hb-ot-shape-complex-myanmar-machine.hh | 22 ++++----
+ src/hb-ot-shape-complex-myanmar-machine.rl | 31 +----------
+ src/hb-ot-shape-complex-myanmar.hh         | 32 ++---------
+ src/hb-ot-shape-complex-use-category.hh    | 87 +++++++++++++++++++++++++++++
+ src/hb-ot-shape-complex-use-machine.hh     | 34 ++++++------
+ src/hb-ot-shape-complex-use-machine.rl     | 45 +--------------
+ src/hb-ot-shape-complex-use.hh             | 53 +-----------------
+ src/meson.build                            |  2 +
+ 17 files changed, 259 insertions(+), 299 deletions(-)
+
+commit c8c5e52aba904cfede1c7e8e1043a392053938e6
+Author: David Corbett <corbett.dav at northeastern.edu>
+Date:   Mon Jan 4 20:31:12 2021 -0500
+
+    [use] Update overrides to 2021-01-04
+    
+    This uses the data files from
+    <https://github.com/microsoft/font-tools/tree/ed7b825ddbbd072d8bc731b7f12c54cb375e2f89/USE>.
+
+ src/hb-ot-shape-complex-use-table.cc            | 2 +-
+ src/ms-use/IndicSyllabicCategory-Additional.txt | 1 -
+ 2 files changed, 1 insertion(+), 2 deletions(-)
+
+commit 1fb7f3bda6de03279e2971086b6935a0970f4b98
+Author: Khaled Hosny <khaled at aliftype.com>
+Date:   Thu Dec 31 03:03:48 2020 +0200
+
+    [docs] Document various HB_SCRIPT_*
+    
+    Need to have something for all of them to keep GTK-Doc happy.
+
+ src/hb-common.h | 500 ++++++++++++++++++++++++++++++++++++--------------------
+ 1 file changed, 326 insertions(+), 174 deletions(-)
+
+commit ea0907abf938f787ebfc0c41f439d1e2b2ef98ba
+Author: Khaled Hosny <khaled at aliftype.com>
+Date:   Thu Dec 31 02:34:45 2020 +0200
+
+    [docs] Document version macros
+
+ src/hb-version.h    | 29 +++++++++++++++++++++++++++++
+ src/hb-version.h.in | 29 +++++++++++++++++++++++++++++
+ 2 files changed, 58 insertions(+)
+
+commit 5e9f05ff3f7dad07ba593f4a38989e0d90311b36
+Author: Khaled Hosny <khaled at aliftype.com>
+Date:   Thu Dec 31 02:23:55 2020 +0200
+
+    [docs] Expand memory modes docs
+    
+    Per Behdad suggestions.
+
+ src/hb-blob.h | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+commit 5151c2b668e76eac73a044c478319887e3fa9acb
+Author: Khaled Hosny <khaled at aliftype.com>
+Date:   Thu Dec 31 00:28:27 2020 +0200
+
+    [introspection] Replace deprecated allow-none
+    
+    Use optional or nullable as appropriate.
+
+ src/hb-aat-layout.cc       |  2 +-
+ src/hb-buffer-serialize.cc | 16 ++++++++--------
+ src/hb-ot-layout.cc        | 32 ++++++++++++++++----------------
+ src/hb-ot-name.cc          |  8 ++++----
+ src/hb-ot-tag.cc           | 14 +++++++-------
+ src/hb-ot-var.cc           |  6 +++---
+ src/hb-shape.cc            |  6 +++---
+ 7 files changed, 42 insertions(+), 42 deletions(-)
+
+commit a64d56a3e5c7ecc0f0ecc491987487b9481dbdbc
+Author: Khaled Hosny <khaled at aliftype.com>
+Date:   Thu Dec 31 00:27:49 2020 +0200
+
+    [introspection] nullable is for pointers
+
+ src/hb-font.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 9936490c04e9333f4c3360312c4431a3e14468b8
+Author: Khaled Hosny <khaled at aliftype.com>
+Date:   Thu Dec 31 00:19:29 2020 +0200
+
+    [docs] Invalid use of "optional" annotation
+    
+    It is valid only for out and inout parameters.
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1787
+
+ src/hb-blob.cc       |  4 ++--
+ src/hb-buffer.cc     |  4 ++--
+ src/hb-deprecated.h  |  6 +++---
+ src/hb-face.cc       |  4 ++--
+ src/hb-font.cc       | 12 ++++++------
+ src/hb-font.h        | 32 ++++++++++++++++----------------
+ src/hb-ft.cc         |  4 ++--
+ src/hb-map.cc        |  2 +-
+ src/hb-set.cc        |  2 +-
+ src/hb-shape-plan.cc |  2 +-
+ src/hb-unicode.cc    |  2 +-
+ src/hb-unicode.h     | 12 ++++++------
+ 12 files changed, 43 insertions(+), 43 deletions(-)
+
+commit bf5b4b71c589e8cbe1a528b1091229825c6fec77
+Author: Khaled Hosny <khaled at aliftype.com>
+Date:   Thu Dec 31 00:38:47 2020 +0200
+
+    [docs] Duplicated documentation
+
+ src/hb-unicode.h | 28 ----------------------------
+ 1 file changed, 28 deletions(-)
+
+commit 3d7a3616485e7d0ad8389547ab607234eb6ec11d
+Author: Khaled Hosny <khaled at aliftype.com>
+Date:   Wed Dec 30 23:58:37 2020 +0200
+
+    [docs] Miscellaneous missing docs
+
+ docs/harfbuzz-sections.txt |  3 +--
+ src/hb-blob.h              |  8 ++++----
+ src/hb-coretext.cc         |  2 +-
+ src/hb-directwrite.cc      |  4 ++++
+ src/hb-face.cc             |  2 +-
+ src/hb-face.h              | 13 +++++++++++++
+ src/hb-gdi.cc              |  2 ++
+ src/hb-map.h               |  6 +++++-
+ src/hb-ot-deprecated.h     |  7 +++++++
+ src/hb-ot-meta.cc          |  4 +++-
+ src/hb-ot-var.h            | 26 ++++++++++++++++----------
+ src/hb-set.h               |  6 +++++-
+ 12 files changed, 62 insertions(+), 21 deletions(-)
+
+commit a31a51cdec8cab763e7b29c42d161381c652d32d
+Author: Khaled Hosny <khaled at aliftype.com>
+Date:   Wed Dec 30 23:48:25 2020 +0200
+
+    [docs] Complete hb-ft docs a bit
+
+ src/hb-ft.cc | 18 +++++++++---------
+ 1 file changed, 9 insertions(+), 9 deletions(-)
+
+commit 8c492d5c321ceee19102986e3eb2733bb5e6c5d7
+Author: Khaled Hosny <khaled at aliftype.com>
+Date:   Wed Dec 30 23:47:33 2020 +0200
+
+    [docs] Complete hb-ot-math docs a bit
+
+ src/hb-ot-deprecated.h |  7 +++++++
+ src/hb-ot-math.h       | 22 +++++++++++++++++++++-
+ 2 files changed, 28 insertions(+), 1 deletion(-)
+
+commit 3f7ffd1b3d0bff1c641e5adf47de9be1925aa897
+Author: Khaled Hosny <khaled at aliftype.com>
+Date:   Wed Dec 30 23:46:13 2020 +0200
+
+    [docs] Complete hb-unicode docs a bit
+
+ src/hb-deprecated.h | 33 ++++++++++++++++++++++-----------
+ src/hb-unicode.cc   |  2 +-
+ src/hb-unicode.h    |  4 +++-
+ 3 files changed, 26 insertions(+), 13 deletions(-)
+
+commit 2fdab788ad20ae6256542afe0d856b63b5cfc0e2
+Author: Khaled Hosny <khaled at aliftype.com>
+Date:   Wed Dec 30 23:44:30 2020 +0200
+
+    [docs] Complete hb-buffer docs a bit
+
+ src/hb-buffer-serialize.cc | 32 +++++++++++++++-----------
+ src/hb-buffer.cc           | 32 +++++++++++++-------------
+ src/hb-buffer.h            | 57 ++++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-deprecated.h        | 10 ++++++++
+ 4 files changed, 102 insertions(+), 29 deletions(-)
+
+commit 492a5a9096cc36f6d1860f576ccf09b6117e86b5
+Author: Khaled Hosny <khaled at aliftype.com>
+Date:   Wed Dec 30 23:42:49 2020 +0200
+
+    [docs] Complete hb-aat docs a bit
+
+ src/hb-aat-layout.cc | 14 ++++-----
+ src/hb-aat-layout.h  | 88 ++++++++++++++++++++++++++++------------------------
+ 2 files changed, 55 insertions(+), 47 deletions(-)
+
+commit 3a012cc469d22b9889907a79717524e983ac95b7
+Author: Khaled Hosny <khaled at aliftype.com>
+Date:   Wed Dec 30 23:40:25 2020 +0200
+
+    [docs] Complete hb-metrics docs a bit
+
+ src/hb-ot-metrics.cc | 31 ++++++++++++++++++++-----------
+ src/hb-ot-metrics.h  |  3 ++-
+ 2 files changed, 22 insertions(+), 12 deletions(-)
+
+commit 5a55b31a383deadc3d479f83a6122cca821765eb
+Author: Khaled Hosny <khaled at aliftype.com>
+Date:   Wed Dec 30 23:39:08 2020 +0200
+
+    [docs] Complete hb-shape-plan docs a bit
+
+ src/hb-shape-plan.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 8e8c3e5878028f4fba783bb92e25e03db662c664
+Author: Khaled Hosny <khaled at aliftype.com>
+Date:   Wed Dec 30 23:37:49 2020 +0200
+
+    [docs] Complete hb-ot-layout docs a bit
+
+ docs/harfbuzz-sections.txt |  2 ++
+ src/hb-ot-layout.cc        | 59 ++++++++++++++++++++++++++++------------------
+ src/hb-ot-layout.h         | 51 ++++++++++++++++++++++++++++++++++++++-
+ src/hb-ot-tag.cc           | 15 ++++++++++--
+ 4 files changed, 101 insertions(+), 26 deletions(-)
+
+commit 5b7b730d4b94b33a9915e5fa0908e84e343aae41
+Author: Khaled Hosny <khaled at aliftype.com>
+Date:   Mon Dec 28 05:23:26 2020 +0200
+
+    [docs] Complete hb-color docs a bit
+
+ src/hb-ot-color.h | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit aa107e657b7940506548d003d5fda1510e8dfefa
+Author: Khaled Hosny <khaled at aliftype.com>
+Date:   Wed Dec 30 23:34:17 2020 +0200
+
+    [docs] Complete hb-font docs a bit
+
+ docs/harfbuzz-sections.txt |   4 +-
+ src/hb-deprecated.h        |  37 +++++++++++--
+ src/hb-font.cc             |  28 +++++++---
+ src/hb-font.h              | 135 +++++++++++++++++++++++++++++++++++++++++----
+ 4 files changed, 179 insertions(+), 25 deletions(-)
+
+commit 9b602e8e22d399d494f4e0a0eb22b2b4ea0d4a6a
+Author: Khaled Hosny <khaled at aliftype.com>
+Date:   Wed Dec 30 23:28:54 2020 +0200
+
+    [docs] Complete hb-common docs a bit
+
+ docs/harfbuzz-docs.xml |   3 +
+ src/hb-common.cc       |  30 ++++++-
+ src/hb-common.h        | 239 ++++++++++++++++---------------------------------
+ 3 files changed, 107 insertions(+), 165 deletions(-)
+
+commit 53ed5597b2a0615299aa52e36e75a93437f9844a
+Author: Khaled Hosny <khaled at aliftype.com>
+Date:   Wed Dec 30 23:11:33 2020 +0200
+
+    [docs] Add missing API indices
+
+ docs/harfbuzz-docs.xml | 5 +++++
+ 1 file changed, 5 insertions(+)
+
+commit c9c3b3c94c4dc8e8bd1af723de287b49c8acbf42
+Author: Khaled Hosny <khaled at aliftype.com>
+Date:   Wed Dec 30 23:09:59 2020 +0200
+
+    [docs] Use correct syntax
+
+ src/hb-blob.cc |  2 +-
+ src/hb-set.cc  | 12 ++++++------
+ 2 files changed, 7 insertions(+), 7 deletions(-)
+
+commit a8e72ee7842bb0f7cff9d3b703d335215cfbc1af
+Author: Khaled Hosny <khaled at aliftype.com>
+Date:   Wed Dec 30 23:08:40 2020 +0200
+
+    [docs] Use %true and %false consistently
+
+ src/hb-aat-layout.cc |  6 +++---
+ src/hb-blob.cc       |  2 +-
+ src/hb-common.cc     |  4 ++--
+ src/hb-face.cc       |  2 +-
+ src/hb-font.cc       | 32 ++++++++++++++++----------------
+ src/hb-map.cc        |  4 ++--
+ src/hb-ot-color.cc   |  8 ++++----
+ src/hb-ot-layout.cc  | 32 ++++++++++++++++----------------
+ src/hb-ot-math.cc    |  4 ++--
+ src/hb-ot-var.cc     |  4 ++--
+ src/hb-sanitize.hh   |  2 +-
+ src/hb-set.cc        | 16 ++++++++--------
+ src/hb-unicode.cc    |  6 +++---
+ src/hb-unicode.h     |  8 ++++----
+ 14 files changed, 65 insertions(+), 65 deletions(-)
+
+commit a3fe43a41024f197936a12a62515c43a03a7c810
+Author: Khaled Hosny <khaled at aliftype.com>
+Date:   Wed Dec 30 21:58:43 2020 +0200
+
+    [docs] Hide private enum values
+    
+    "/*< skip >*/" does not seem to hide them.
+
+ src/hb-ot-layout.h  | 1 +
+ src/hb-ot-meta.h    | 1 +
+ src/hb-ot-metrics.h | 1 +
+ src/hb-ot-var.h     | 1 +
+ src/hb-style.cc     | 1 +
+ 5 files changed, 5 insertions(+)
+
+commit b8e6f17eed5eec3715e9d16f7f3db4c352f6d312
+Author: Khaled Hosny <khaled at aliftype.com>
+Date:   Sun Dec 27 15:03:57 2020 +0200
+
+    [docs] Move note about harfbuzz-old to proper place
+    
+    Commit 443f87213272be5ae0579dce4749b2036dfe3815 seems to have moved it
+    to the API part by mistake.
+
+ docs/harfbuzz-docs.xml | 60 ++++++++++++++++++++++++--------------------------
+ 1 file changed, 29 insertions(+), 31 deletions(-)
+
+commit e93de6362b2388a3f11fa5cfa4f699d805c61c5d
+Author: Khaled Hosny <khaled at aliftype.com>
+Date:   Sun Dec 27 00:57:29 2020 +0200
+
+    [docs] Document unused language in get_baseline
+    
+    Document that language_tag in hb_ot_layout_get_baseline() is currently
+    unused.
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/2662
+
+ src/hb-ot-layout.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit c7b2e64c6d9e2f9b130c8fd581f0e5a67021b76d
+Author: Khaled Hosny <khaled at aliftype.com>
+Date:   Sun Dec 27 00:53:23 2020 +0200
+
+    [docs] make it clear that FT_Face must have size
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/2590
+
+ src/hb-ft.cc | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit 4136ecf74149c533f9a31e039d67e9a234e1f9ce
+Author: Khaled Hosny <khaled at aliftype.com>
+Date:   Sun Dec 27 00:22:31 2020 +0200
+
+    [docs] Don’t use FreeType in the simple example
+    
+    Also make the code actually compile.
+    
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/2106
+
+ docs/usermanual-getting-started.xml | 31 ++++++++++++++++++-------------
+ 1 file changed, 18 insertions(+), 13 deletions(-)
+
+commit bfe4bbfc05319400572dd4547b093f7bcae7eba2
+Author: Khaled Hosny <khaled at aliftype.com>
+Date:   Sun Dec 27 18:38:54 2020 +0200
+
+    [docs] Older GTK-Doc does not support HB_DEPRECATED_FOR() at all
+    
+    Fixes CI build failure.
+
+ docs/Makefile.am | 2 +-
+ docs/meson.build | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit 4161146e62f7fae28afc42c297e824d298741bb3
+Author: Khaled Hosny <khaled at aliftype.com>
+Date:   Sun Dec 27 18:27:19 2020 +0200
+
+    [docs] Fix generated docs for deprecated symbols
+    
+    Without ignoring HB_DEPRECATED, most deprecated symbols get missing from
+    documentation. Ignoring HB_DEPRECATED_FOR does not work, but this seems
+    to be a GTK-Doc bug.
+
+ docs/Makefile.am | 2 +-
+ docs/meson.build | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
 commit 7236c7e29cef1c2d76c7a284c5081ff4d3aa1127
 Author: Khaled Hosny <khaled at aliftype.com>
 Date:   Sun Dec 27 01:59:00 2020 +0200
@@ -11,7 +2799,7 @@
  4 files changed, 11 insertions(+), 4 deletions(-)
 
 commit 6808b1fb3075990c389e3a2e80cee8c4874a8f6f
-Merge: 010bd540 e8c15b7a
+Merge: 010bd5404 e8c15b7a1
 Author: Khaled Hosny <khaled at aliftype.com>
 Date:   Sun Dec 27 01:55:15 2020 +0200
 
@@ -33,7 +2821,7 @@
  1 file changed, 1 insertion(+), 1 deletion(-)
 
 commit 010bd5404008e45bb23ff63613551a03e3b60f58
-Merge: 462b71ea fdf3e448
+Merge: 462b71eaf fdf3e448f
 Author: Khaled Hosny <khaled at aliftype.com>
 Date:   Sat Dec 26 01:17:27 2020 +0200
 
@@ -42,7 +2830,7 @@
     [docs] Improve hb-unicode docs a bit
 
 commit 462b71eaf3aff628cc50554f2ebcb78e27262e39
-Merge: 95416714 22468c8a
+Merge: 954167143 22468c8a9
 Author: Khaled Hosny <khaled at aliftype.com>
 Date:   Sat Dec 26 01:16:32 2020 +0200
 
@@ -229,7 +3017,7 @@
  1 file changed, 84 insertions(+), 84 deletions(-)
 
 commit 954167143befde8366150dcb885f50a9e64346a3
-Merge: 8560c3e3 71a3b54f
+Merge: 8560c3e35 71a3b54f3
 Author: Khaled Hosny <dr.khaled.hosny at gmail.com>
 Date:   Wed Dec 23 23:04:17 2020 +0200
 
@@ -251,7 +3039,7 @@
  5 files changed, 28 insertions(+), 5 deletions(-)
 
 commit 8560c3e355dbfd199fbd9e7052151c40a9039b29
-Merge: 769a21aa 296e9d7f
+Merge: 769a21aab 296e9d7f3
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Wed Dec 23 00:25:10 2020 -0800
 
@@ -388,7 +3176,7 @@
  1 file changed, 2 deletions(-)
 
 commit 07e304b2a488261a89e74f396902399cb28f5608
-Merge: 7c241651 5f32fdff
+Merge: 7c241651a 5f32fdff1
 Author: Khaled Hosny <dr.khaled.hosny at gmail.com>
 Date:   Tue Dec 1 22:32:19 2020 +0200
 
@@ -528,7 +3316,7 @@
  3 files changed, 704 insertions(+), 218 deletions(-)
 
 commit 385d9c08d8906002690a7fbff86c1592f5b627b9
-Merge: c4ade4fd 9722b4b2
+Merge: c4ade4fdd 9722b4b26
 Author: Khaled Hosny <dr.khaled.hosny at gmail.com>
 Date:   Tue Nov 17 19:43:22 2020 +0200
 
@@ -582,7 +3370,7 @@
  2 files changed, 19 insertions(+), 22 deletions(-)
 
 commit c4ade4fdd681b59c0694b7422d7a123fd1e9e6b8
-Merge: e6c21d7b fd8f4ffc
+Merge: e6c21d7b5 fd8f4ffcc
 Author: Khaled Hosny <dr.khaled.hosny at gmail.com>
 Date:   Tue Nov 17 14:32:04 2020 +0200
 
@@ -673,7 +3461,7 @@
  4 files changed, 27 insertions(+), 12 deletions(-)
 
 commit e6c21d7b58224f483395a6c9355fe89d88aedd54
-Merge: 3bd43bd0 0c3dcfae
+Merge: 3bd43bd02 0c3dcfae1
 Author: Khaled Hosny <dr.khaled.hosny at gmail.com>
 Date:   Tue Nov 17 08:53:32 2020 +0200
 
@@ -682,7 +3470,7 @@
     src/meson.build: allow introspection when cross-compiling
 
 commit 0c3dcfae193efd8d5333c44075ba01932edc1059
-Merge: 2604201a 3bd43bd0
+Merge: 2604201ae 3bd43bd02
 Author: Fabrice Fontaine <fontaine.fabrice at gmail.com>
 Date:   Tue Nov 17 07:31:07 2020 +0100
 
@@ -712,7 +3500,7 @@
  2 files changed, 73 insertions(+), 71 deletions(-)
 
 commit 5091ea7e247b118009c719076650a93b3e2dde6d
-Merge: 69cc214c 07961dae
+Merge: 69cc214c9 07961daed
 Author: Khaled Hosny <dr.khaled.hosny at gmail.com>
 Date:   Sat Oct 24 22:37:52 2020 +0200
 
@@ -734,7 +3522,7 @@
  1 file changed, 5 insertions(+), 3 deletions(-)
 
 commit 69cc214c9a47ec9f19bfe477149c6c68cff6a483
-Merge: 49ebb9eb 5adc1344
+Merge: 49ebb9ebd 5adc1344a
 Author: Khaled Hosny <dr.khaled.hosny at gmail.com>
 Date:   Sat Oct 24 10:41:33 2020 +0200
 
@@ -1280,6 +4068,15 @@
  src/hb-buffer.h            |  20 +++++
  2 files changed, 201 insertions(+)
 
+commit be33704c003732a7a45b8136736b42ca54be98b3
+Author: Garret Rieger <grieger at google.com>
+Date:   Fri Oct 9 16:46:46 2020 -0700
+
+    Add gpos 5 tests to meson build file.
+
+ test/subset/meson.build | 1 +
+ 1 file changed, 1 insertion(+)
+
 commit c39ab82c90479341dcf28eaa8174af6f08c0d7ae
 Author: David Corbett <corbett.dav at northeastern.edu>
 Date:   Tue Oct 6 16:51:40 2020 -0400
@@ -1289,6 +4086,100 @@
  src/gen-use-table.py | 2 +-
  1 file changed, 1 insertion(+), 1 deletion(-)
 
+commit aace09a3ad4249ee5b11c07a7ba343f763545d01
+Author: Garret Rieger <grieger at google.com>
+Date:   Tue Oct 6 10:26:17 2020 -0700
+
+    [subset] Use glyphset gsub for layout variation indices collection.
+
+ src/hb-subset-plan.cc | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+commit 1d9801e01290a62cfb802971061b2cc9f7c43bc1
+Author: Garret Rieger <grieger at google.com>
+Date:   Mon Oct 5 14:41:55 2020 -0700
+
+    [subset] In AnchorMatrix::subset eliminate the use of dynamically allocated vector.
+
+ src/hb-ot-layout-gpos-table.hh | 17 +++++------------
+ 1 file changed, 5 insertions(+), 12 deletions(-)
+
+commit 093909b2ffb1d938206b4a543652ae02c99491b2
+Author: Garret Rieger <grieger at google.com>
+Date:   Mon Oct 5 13:14:53 2020 -0700
+
+    [subset] Fix wrong offset base for subsetting LigatureArray.
+    Offsets from LigatureArray must be relative to the beginning of the LigatureArray table. For the serialization mechanism to use the correct beginning point the LigatureArray must be created using the push()/pop() mechanism. So convert LigatureArray subsetting to use serialize_subset() instead of a manually called serialize and subset.
+
+ src/hb-ot-layout-gpos-table.hh | 78 +++++++++++++++++++-----------------------
+ 1 file changed, 36 insertions(+), 42 deletions(-)
+
+commit 147e93b910010b581f1abf8f835aa2f7eecc483d
+Author: Garret Rieger <grieger at google.com>
+Date:   Thu Oct 1 16:44:16 2020 -0700
+
+    [subset] Fixes to get GPOS 5 subsetting code compiling.
+
+ src/hb-ot-layout-gpos-table.hh | 37 ++++++++++++++++++++++++++++---------
+ 1 file changed, 28 insertions(+), 9 deletions(-)
+
+commit 3a0b05faf18afc5f1cfc436c55d0776d26b80e53
+Author: Qunxin Liu <qxliu at google.com>
+Date:   Thu Feb 6 15:08:26 2020 -0800
+
+    [subset] GPOS 5 MarkToLigature subsetting support
+
+ src/hb-ot-layout-gpos-table.hh                     | 109 +++++++++++++++++++--
+ test/subset/data/Makefile.am                       |   1 +
+ test/subset/data/Makefile.sources                  |   1 +
+ ...5_font1.keep-layout-retain-gids.41,42,43,44.otf | Bin 0 -> 2372 bytes
+ ...5_font1.keep-layout-retain-gids.41,42,43,45.otf | Bin 0 -> 2380 bytes
+ ...pos5_font1.keep-layout-retain-gids.41,42,43.otf | Bin 0 -> 2132 bytes
+ ...pos5_font1.keep-layout-retain-gids.41,42,44.otf | Bin 0 -> 2304 bytes
+ ...pos5_font1.keep-layout-retain-gids.41,42,45.otf | Bin 0 -> 2284 bytes
+ .../gpos5_font1.keep-layout-retain-gids.41,42.otf  | Bin 0 -> 2032 bytes
+ .../gpos5_font1.keep-layout-retain-gids.41,43.otf  | Bin 0 -> 2048 bytes
+ .../gpos5_font1.keep-layout-retain-gids.41.otf     | Bin 0 -> 1916 bytes
+ .../gpos5_font1.keep-layout-retain-gids.42.otf     | Bin 0 -> 1788 bytes
+ ...eep-layout-retain-gids.retain-all-codepoint.otf | Bin 0 -> 3840 bytes
+ .../gpos5_font1.keep-layout.41,42,43,44.otf        | Bin 0 -> 1668 bytes
+ .../gpos5_font1.keep-layout.41,42,43,45.otf        | Bin 0 -> 1660 bytes
+ .../gpos5_font1.keep-layout.41,42,43.otf           | Bin 0 -> 1432 bytes
+ .../gpos5_font1.keep-layout.41,42,44.otf           | Bin 0 -> 1588 bytes
+ .../gpos5_font1.keep-layout.41,42,45.otf           | Bin 0 -> 1560 bytes
+ .../layout.gpos5/gpos5_font1.keep-layout.41,42.otf | Bin 0 -> 1328 bytes
+ .../layout.gpos5/gpos5_font1.keep-layout.41,43.otf | Bin 0 -> 1332 bytes
+ .../layout.gpos5/gpos5_font1.keep-layout.41.otf    | Bin 0 -> 1216 bytes
+ .../layout.gpos5/gpos5_font1.keep-layout.42.otf    | Bin 0 -> 1076 bytes
+ ...pos5_font1.keep-layout.retain-all-codepoint.otf | Bin 0 -> 3840 bytes
+ test/subset/data/fonts/gpos5_font1.otf             | Bin 0 -> 4780 bytes
+ test/subset/data/tests/layout.gpos5.tests          |  18 ++++
+ 25 files changed, 121 insertions(+), 8 deletions(-)
+
+commit 718bf5aab397290ab5214c6a6bff3e248c4ab094
+Author: Garret Rieger <grieger at google.com>
+Date:   Tue Sep 29 13:16:01 2020 -0700
+
+    [subset] only keep features reachable from script in the final subset.
+    Matches fontTools behaviour.
+
+ src/hb-ot-layout-gsubgpos.hh | 31 +++++++++++++++++++++----------
+ src/hb-subset-plan.cc        | 21 +++++++++++++++++----
+ 2 files changed, 38 insertions(+), 14 deletions(-)
+
+commit e583505334a5b0990b545fde6ed7e9d874b8db4d
+Author: Garret Rieger <grieger at google.com>
+Date:   Tue Sep 29 11:05:08 2020 -0700
+
+    [subset] Use plan->glyphset_gsub instead of plan->glyphset for GSUB/GPOS
+    This matches fontTools behaviour. glyphset_gsub does not contain gids added from closing over composite glyphs in glyf, since these cannot particpate in GSUB/GPOS processing.
+
+ src/hb-ot-layout-common.hh     |  8 ++++----
+ src/hb-ot-layout-gpos-table.hh | 16 ++++++++--------
+ src/hb-ot-layout-gsub-table.hh | 12 ++++++------
+ src/hb-ot-layout-gsubgpos.hh   |  6 +++---
+ 4 files changed, 21 insertions(+), 21 deletions(-)
+
 commit a99e8721bfdb3f346d169e0d3ff0a52e13fbd1d7
 Author: David Corbett <corbett.dav at northeastern.edu>
 Date:   Mon Sep 28 21:12:46 2020 -0400
@@ -1299,6 +4190,73 @@
  src/hb-ot-shape-complex-use-machine.rl |  3 ++-
  2 files changed, 11 insertions(+), 9 deletions(-)
 
+commit 010accb3d5343b32c0ab8b98a0d48626df975cb8
+Author: Garret Rieger <grieger at google.com>
+Date:   Mon Sep 28 17:39:09 2020 -0700
+
+    [subset] Add additional test cases for the Amiri tests.
+
+ ...ayout-retain-gids.627,644,623,62D,644,627,645,2E.ttf | Bin 0 -> 48640 bytes
+ ...-Regular.keep-layout-retain-gids.627,644,62D,628.ttf | Bin 0 -> 42884 bytes
+ ...ep-layout-retain-gids.633,645,627,621,20,644,627.ttf | Bin 0 -> 46724 bytes
+ ...miri-Regular.keep-layout-retain-gids.63A,64A,631.ttf | Bin 0 -> 42896 bytes
+ ...gular.keep-layout.627,644,623,62D,644,627,645,2E.ttf | Bin 0 -> 13332 bytes
+ .../Amiri-Regular.keep-layout.627,644,62D,628.ttf       | Bin 0 -> 10232 bytes
+ ...i-Regular.keep-layout.633,645,627,621,20,644,627.ttf | Bin 0 -> 10372 bytes
+ .../Amiri-Regular.keep-layout.63A,64A,631.ttf           | Bin 0 -> 7824 bytes
+ test/subset/data/tests/layout.gpos8.amiri.tests         |   4 ++++
+ 9 files changed, 4 insertions(+)
+
+commit 940e1c6f9838b245839f742cca0e71cf37a9c87a
+Author: Garret Rieger <grieger at google.com>
+Date:   Mon Sep 28 17:22:01 2020 -0700
+
+    [subset] ChainContextFormat3 - don't subset glyph sequences.
+    The backtrack, input, and lookahead sequence must be matched in their entirety so these sequences should not be subset. If any of the coverage tables in a sequence subsets to empty then the whole subtable should be dropped since it's not possible for this lookup to be activated.
+
+ src/hb-ot-layout-gsubgpos.hh | 18 +++++++++---------
+ 1 file changed, 9 insertions(+), 9 deletions(-)
+
+commit e31c2690f80c312d13dd4691e6e51da1cab94813
+Author: Garret Rieger <grieger at google.com>
+Date:   Mon Sep 28 16:51:25 2020 -0700
+
+    [subset] remove unnecessary returns.
+
+ src/hb-ot-layout-gsubgpos.hh | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit 3271a7cdaadcab3756261db42177500436e1c37e
+Author: Garret Rieger <grieger at google.com>
+Date:   Mon Sep 28 16:46:15 2020 -0700
+
+    [subset] Remove redundant langys from Amiri test font.
+    FontTools removes these when subsetting but harfbuzz does not yet support redundant langsys removal. So this gets the Amiri tests passing for now.
+
+ ...iri-Regular.keep-layout-retain-gids.627,644.ttf | Bin 36892 -> 36940 bytes
+ .../Amiri-Regular.keep-layout.627,644.ttf          | Bin 4364 -> 4412 bytes
+ test/subset/data/fonts/Amiri-Regular.ttf           | Bin 562980 -> 562684 bytes
+ 3 files changed, 0 insertions(+), 0 deletions(-)
+
+commit ad241f991726b38cbda566fe00ac4eab55b14679
+Author: Garret Rieger <grieger at google.com>
+Date:   Mon Sep 28 15:26:13 2020 -0700
+
+    [subset] check that sub rules in ChainContextFormat 1 and 2 intersect the glyphs set before recursing during closure lookups.
+
+ src/hb-ot-layout-gsubgpos.hh | 42 +++++++++++++++++++++++++++++++++++-------
+ 1 file changed, 35 insertions(+), 7 deletions(-)
+
+commit 9fad540245bcfa0a5c07380ea075d8c264b3abcf
+Author: Garret Rieger <grieger at google.com>
+Date:   Mon Sep 28 13:24:25 2020 -0700
+
+    [subset] check that sub rules in ContextFormat 1 and 2 intersect the glyphs set before recursing during closure lookups.
+
+ src/hb-ot-layout-gsubgpos.hh | 40 +++++++++++++++++++++++++++++++---------
+ test/subset/meson.build      |  1 +
+ 2 files changed, 32 insertions(+), 9 deletions(-)
+
 commit 7e6070a47f2127c90ad233ab3794097357a3f4ed
 Author: Koji Ishii <kojii at chromium.org>
 Date:   Mon Aug 31 17:21:21 2020 +0900
@@ -1330,7 +4288,7 @@
  1 file changed, 1 insertion(+), 2 deletions(-)
 
 commit 5539d158b75470dcf41bb86e2e8b9a7a986447c0
-Merge: 1a15bf1c cc7b3a1a
+Merge: 1a15bf1c5 cc7b3a1ab
 Author: Khaled Hosny <dr.khaled.hosny at gmail.com>
 Date:   Sat Sep 26 10:41:38 2020 +0200
 
@@ -1339,7 +4297,7 @@
     [Docs] Add GTK-Doc comments for external APIs
 
 commit 1a15bf1c535236c4117dcf5eb9afa4e462fbe364
-Merge: 8c5d1332 fb0195ba
+Merge: 8c5d1332f fb0195ba8
 Author: Khaled Hosny <dr.khaled.hosny at gmail.com>
 Date:   Sat Sep 26 10:41:04 2020 +0200
 
@@ -1447,6 +4405,36 @@
  docs/usermanual-install-harfbuzz.xml | 52 +++++++++---------------------------
  1 file changed, 13 insertions(+), 39 deletions(-)
 
+commit a5c0ec7516e8f44ced7a5531c3565e74e34d8092
+Author: Garret Rieger <grieger at google.com>
+Date:   Fri Sep 25 14:57:20 2020 -0700
+
+    [subset] For [Chain]ContextFormat3 make sure the sub table intersects the retained glyphset before recursing to its lookups.
+    Otherwise the lookup closure will potentially pull in lookups which cannot be accessed via the retained glyph set.
+
+ src/hb-ot-layout-gsubgpos.hh | 5 +++++
+ 1 file changed, 5 insertions(+)
+
+commit dc375559fd8aec33b28ea5775f2288250fd7ede7
+Author: Garret Rieger <grieger at google.com>
+Date:   Fri Sep 25 13:08:46 2020 -0700
+
+    [subset] shrink the serialize buffer when pruning empty offsets in ChainContextFormat2.
+    Currently the code reduces the array length, but does not trim back the space allocated in the serializer for those empty offsets.
+
+ src/hb-ot-layout-gsubgpos.hh | 16 +++++++++-------
+ 1 file changed, 9 insertions(+), 7 deletions(-)
+
+commit 90eb1a40eb4498b8bcfd73e67cbc69a0eaab1423
+Author: Garret Rieger <grieger at google.com>
+Date:   Fri Sep 25 12:36:32 2020 -0700
+
+    [subset] In ChainContextFormat3 don't skip subsetting if backtrack or lookahead are empty.
+    It's valid to have a ChainContextFormat3 with either an empty backtrack or lookahead. Only drop the lookup if the input sequence is empty.
+
+ src/hb-ot-layout-gsubgpos.hh | 11 +++++++----
+ 1 file changed, 7 insertions(+), 4 deletions(-)
+
 commit 2604201ae0f4f4e5b659d7af00684cb38d79c502
 Author: Fabrice Fontaine <fontaine.fabrice at gmail.com>
 Date:   Thu Sep 24 21:00:34 2020 +0200
@@ -1463,8 +4451,66 @@
  src/meson.build | 7 +------
  1 file changed, 1 insertion(+), 6 deletions(-)
 
+commit 7b77ce0507e18fb981a9b865f3eaac0c2ae06044
+Author: Garret Rieger <grieger at google.com>
+Date:   Thu Sep 24 16:35:59 2020 -0700
+
+    [subset] Add subsetting integration test using Amiri.
+    Demonstrates a failure in subsetting GPOS 8/GSUB 6.
+
+ test/subset/data/Makefile.sources                      |   1 +
+ .../Amiri-Regular.keep-layout-retain-gids.627,644.ttf  | Bin 0 -> 36892 bytes
+ .../Amiri-Regular.keep-layout.627,644.ttf              | Bin 0 -> 4364 bytes
+ test/subset/data/fonts/Amiri-Regular.ttf               | Bin 0 -> 562980 bytes
+ test/subset/data/tests/layout.gpos8.amiri.tests        |   9 +++++++++
+ 5 files changed, 10 insertions(+)
+
+commit 7a72b20aa2b604053696e731185a17286de73b08
+Author: Garret Rieger <grieger at google.com>
+Date:   Thu Sep 24 15:58:48 2020 -0700
+
+    [subset] Subset GDEF during layout subsetting tests.
+
+ ...1.keep-layout-retain-gids.retain-all-codepoint.otf | Bin 3756 -> 3812 bytes
+ ...e_subrules_f1.keep-layout.retain-all-codepoint.otf | Bin 3756 -> 3812 bytes
+ ...1.keep-layout-retain-gids.retain-all-codepoint.otf | Bin 3772 -> 3828 bytes
+ ...e_subrules_f1.keep-layout.retain-all-codepoint.otf | Bin 3772 -> 3828 bytes
+ ...1.keep-layout-retain-gids.retain-all-codepoint.otf | Bin 3736 -> 3792 bytes
+ ...xt3_simple_f1.keep-layout.retain-all-codepoint.otf | Bin 3736 -> 3792 bytes
+ ...3.keep-layout-retain-gids.retain-all-codepoint.otf | Bin 3692 -> 3728 bytes
+ .../gpos3_font3.keep-layout.retain-all-codepoint.otf  | Bin 3692 -> 3728 bytes
+ ...1.keep-layout-retain-gids.retain-all-codepoint.otf | Bin 3772 -> 3816 bytes
+ ...ple_anchors_1.keep-layout.retain-all-codepoint.otf | Bin 3772 -> 3816 bytes
+ ...1.keep-layout-retain-gids.retain-all-codepoint.otf | Bin 3748 -> 3792 bytes
+ .../gpos6_font1.keep-layout.retain-all-codepoint.otf  | Bin 3748 -> 3792 bytes
+ ...1.keep-layout-retain-gids.retain-all-codepoint.otf | Bin 3776 -> 3832 bytes
+ ...e_subrules_f1.keep-layout.retain-all-codepoint.otf | Bin 3776 -> 3832 bytes
+ ...1.keep-layout-retain-gids.retain-all-codepoint.otf | Bin 3808 -> 3864 bytes
+ ...e_subrules_f1.keep-layout.retain-all-codepoint.otf | Bin 3808 -> 3864 bytes
+ ...1.keep-layout-retain-gids.retain-all-codepoint.otf | Bin 3744 -> 3800 bytes
+ ...ng3_simple_f1.keep-layout.retain-all-codepoint.otf | Bin 3744 -> 3800 bytes
+ ...1.keep-layout-retain-gids.retain-all-codepoint.otf | Bin 3748 -> 3804 bytes
+ ...e_subrules_f1.keep-layout.retain-all-codepoint.otf | Bin 3748 -> 3804 bytes
+ ...1.keep-layout-retain-gids.retain-all-codepoint.otf | Bin 3780 -> 3836 bytes
+ ...e_subrules_f1.keep-layout.retain-all-codepoint.otf | Bin 3780 -> 3836 bytes
+ ...2.keep-layout-retain-gids.retain-all-codepoint.otf | Bin 3716 -> 3772 bytes
+ ...ng3_simple_f2.keep-layout.retain-all-codepoint.otf | Bin 3716 -> 3772 bytes
+ ...lar.smallcaps.keep-layout-retain-gids.41,42,43.ttf | Bin 6780 -> 6844 bytes
+ ...egular.smallcaps.keep-layout-retain-gids.41,43.ttf | Bin 6396 -> 6472 bytes
+ ...o-Regular.smallcaps.keep-layout-retain-gids.41.ttf | Bin 6032 -> 6096 bytes
+ ...o-Regular.smallcaps.keep-layout-retain-gids.43.ttf | Bin 6088 -> 6152 bytes
+ ...egular.smallcaps.keep-layout-retain-gids.CA,CB.ttf | Bin 7932 -> 7996 bytes
+ .../Roboto-Regular.smallcaps.keep-layout.41,42,43.ttf | Bin 2972 -> 3028 bytes
+ .../Roboto-Regular.smallcaps.keep-layout.41,43.ttf    | Bin 2572 -> 2628 bytes
+ .../Roboto-Regular.smallcaps.keep-layout.41.ttf       | Bin 2196 -> 2252 bytes
+ .../Roboto-Regular.smallcaps.keep-layout.43.ttf       | Bin 2268 -> 2324 bytes
+ .../Roboto-Regular.smallcaps.keep-layout.CA,CB.ttf    | Bin 2612 -> 2668 bytes
+ test/subset/data/profiles/keep-layout-retain-gids.txt |   2 +-
+ test/subset/data/profiles/keep-layout.txt             |   2 +-
+ 36 files changed, 2 insertions(+), 2 deletions(-)
+
 commit 8c5d1332f152383563c2ef4b3377b9d54b151def
-Merge: 82fe1318 df00f45e
+Merge: 82fe13182 df00f45e2
 Author: Khaled Hosny <dr.khaled.hosny at gmail.com>
 Date:   Thu Sep 24 13:09:38 2020 +0200
 
@@ -1512,7 +4558,7 @@
  2 files changed, 150 insertions(+), 6 deletions(-)
 
 commit 82fe13182d928e5d0e7f2c93528bddc0848e163b
-Merge: a1f4d285 9a1be3fe
+Merge: a1f4d285e 9a1be3fed
 Author: Khaled Hosny <dr.khaled.hosny at gmail.com>
 Date:   Tue Sep 22 17:40:38 2020 +0200
 
@@ -1573,7 +4619,7 @@
  1 file changed, 6 insertions(+)
 
 commit 18b8046c6aa2e311f0b47bfa66613c764d13283e
-Merge: 1f8b1e7f e43b9a29
+Merge: 1f8b1e7f1 e43b9a29a
 Author: Caleb Maclennan <caleb at chiefworks.com>
 Date:   Mon Sep 21 17:32:34 2020 +0300
 
@@ -1597,7 +4643,7 @@
  2 files changed, 2 insertions(+), 2 deletions(-)
 
 commit a0ebea5280abddb9eb22dcc8fd97c521c38da597
-Merge: e40c0d82 f9f473a4
+Merge: e40c0d82e f9f473a4c
 Author: Khaled Hosny <dr.khaled.hosny at gmail.com>
 Date:   Fri Sep 18 17:04:38 2020 +0200
 
@@ -1657,7 +4703,7 @@
  2 files changed, 1 insertion(+)
 
 commit 584d3a43b269032322b00a19e240e3222425f2a9
-Merge: 8c3d4de7 7d64b097
+Merge: 8c3d4de79 7d64b0976
 Author: Simon Cozens <simon at simon-cozens.org>
 Date:   Wed Sep 16 15:08:50 2020 +0100
 
@@ -1777,7 +4823,7 @@
  2 files changed, 2 insertions(+), 14 deletions(-)
 
 commit ee12c078ed775cda64f177055a1d1640675fb2d2
-Merge: 695d85ca 5aff8310
+Merge: 695d85ca3 5aff83104
 Author: Khaled Hosny <dr.khaled.hosny at gmail.com>
 Date:   Tue Sep 8 15:37:30 2020 +0200
 
@@ -1786,7 +4832,7 @@
     meson: add hb-version.h to dependencies correctly
 
 commit 695d85ca327cf6aaafcde36870a21f70d46fa863
-Merge: 91fe20f0 e876886d
+Merge: 91fe20f0f e876886d1
 Author: Khaled Hosny <dr.khaled.hosny at gmail.com>
 Date:   Tue Sep 8 15:37:00 2020 +0200
 
@@ -1934,7 +4980,7 @@
  2 files changed, 4 insertions(+), 1 deletion(-)
 
 commit 45de128930a902004baa875831e38ef62780ae2e
-Merge: 9c98b2b9 fe6381d9
+Merge: 9c98b2b9a fe6381d9f
 Author: Khaled Hosny <dr.khaled.hosny at gmail.com>
 Date:   Tue Sep 1 04:58:50 2020 +0300
 
@@ -1973,7 +5019,7 @@
  4 files changed, 12 insertions(+), 5 deletions(-)
 
 commit c0a76cb5192f6c334c6713444ac5a02d59faaf74
-Merge: fcddf3b9 a495a542
+Merge: fcddf3b9b a495a5423
 Author: Khaled Hosny <dr.khaled.hosny at gmail.com>
 Date:   Sat Aug 29 00:14:01 2020 +0300
 
@@ -3248,7 +6294,7 @@
  1 file changed, 1 insertion(+)
 
 commit ab1079b04621311b9e5b776adf77ab6038fefa66
-Merge: 05ed1ee0 93aea76a
+Merge: 05ed1ee0c 93aea76a2
 Author: Ebrahim Byagowi <ebrahim at gnu.org>
 Date:   Sat Jul 18 23:05:50 2020 +0430
 
@@ -4784,7 +7830,7 @@
  1 file changed, 4 insertions(+), 9 deletions(-)
 
 commit dce4353f86fe9c5e1b62194b89c844ba5da86143
-Merge: 89a2c46e d38eb49f
+Merge: 89a2c46e6 d38eb49f4
 Author: Ebrahim Byagowi <ebrahim at gnu.org>
 Date:   Sat Jun 20 01:24:41 2020 +0430
 
@@ -4911,7 +7957,7 @@
  2 files changed, 14 insertions(+), 14 deletions(-)
 
 commit a512ca8eae70710974e845062305d73bf4012466
-Merge: 03bd3efa 70d6696c
+Merge: 03bd3efaa 70d6696cc
 Author: Ebrahim Byagowi <ebrahim at gnu.org>
 Date:   Fri Jun 19 10:46:12 2020 +0430
 
@@ -5205,7 +8251,7 @@
  1 file changed, 3 insertions(+), 1 deletion(-)
 
 commit e7c79e16b8cb0983ee9cfed478d721c75949e757
-Merge: f31e3d42 fe926970
+Merge: f31e3d426 fe926970b
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Wed Jun 17 15:32:40 2020 -0700
 
@@ -6508,7 +9554,7 @@
  39 files changed, 176 insertions(+), 10 deletions(-)
 
 commit 00aba82a6d4b00b2d512e13ea1ee7aefea5d7441
-Merge: ca2705f1 461cd5a1
+Merge: ca2705f1f 461cd5a15
 Author: Ebrahim Byagowi <ebrahim at gnu.org>
 Date:   Thu May 21 00:10:33 2020 +0430
 
@@ -6623,7 +9669,7 @@
  1 file changed, 1 insertion(+), 2 deletions(-)
 
 commit c15146448b534479de08b6aa8e6b1795221a2e1e
-Merge: 069c5de9 7a961692
+Merge: 069c5de9f 7a961692e
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Thu May 14 19:12:41 2020 -0700
 
@@ -7218,7 +10264,7 @@
  1 file changed, 1 insertion(+), 1 deletion(-)
 
 commit cc1ed76f381531c800833cb0f5b41fc524ed20a3
-Merge: 5a0936f5 a11db0b9
+Merge: 5a0936f53 a11db0b9d
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Fri Apr 24 08:15:32 2020 -0700
 
@@ -7236,7 +10282,7 @@
  1 file changed, 1 insertion(+), 1 deletion(-)
 
 commit a11db0b9d4d3e7cc22a4a53374d4f8a049ce067e
-Merge: 1ed30515 19346524
+Merge: 1ed30515c 19346524c
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Thu Apr 23 15:32:43 2020 -0700
 
@@ -10489,7 +13535,7 @@
  3 files changed, 93 insertions(+), 104 deletions(-)
 
 commit c400cb8863abb5f894e021da5d524c1e28b1e980
-Merge: c21eb86b 4081439d
+Merge: c21eb86bf 4081439d2
 Author: Michiharu Ariza <ariza at adobe.com>
 Date:   Tue Feb 25 16:06:03 2020 -0800
 
@@ -10504,7 +13550,7 @@
     * coding & comment tweaks
 
 commit c21eb86bfd671b04aca54395988cbfe6c9fd2e27
-Merge: 152000d9 4aa354be
+Merge: 152000d9c 4aa354beb
 Author: Ebrahim Byagowi <ebrahim at gnu.org>
 Date:   Wed Feb 26 02:54:38 2020 +0330
 
@@ -11562,7 +14608,7 @@
  1 file changed, 1 insertion(+), 2 deletions(-)
 
 commit 43253e404d25da31d8b8a57f1fc3ef5c2bb1d1fd
-Merge: 71a20186 774725b4
+Merge: 71a201860 774725b43
 Author: Ebrahim Byagowi <ebrahim at gnu.org>
 Date:   Wed Feb 5 17:45:19 2020 +0330
 
@@ -11592,7 +14638,7 @@
  4 files changed, 43 insertions(+), 90 deletions(-)
 
 commit a7f694d4b0d5e95a6202da926ba3c29df6fbb6f0
-Merge: 43016715 b114b26a
+Merge: 43016715e b114b26a5
 Author: Ebrahim Byagowi <ebrahim at gnu.org>
 Date:   Wed Feb 5 16:31:21 2020 +0330
 
@@ -12058,7 +15104,7 @@
  30 files changed, 30 insertions(+), 3 deletions(-)
 
 commit 777ba47b50f6379b9f9abf1d72559316b7116b9e
-Merge: 5b069c36 92f43a99
+Merge: 5b069c361 92f43a99c
 Author: Ebrahim Byagowi <ebrahim at gnu.org>
 Date:   Thu Jan 30 22:38:43 2020 +0330
 
@@ -12958,7 +16004,7 @@
  2 files changed, 4 insertions(+), 6 deletions(-)
 
 commit 7633b7695e5b6188d6180fc5592c0678f03327ed
-Merge: 3747b329 02f324c9
+Merge: 3747b329b 02f324c94
 Author: Ebrahim Byagowi <ebrahim at gnu.org>
 Date:   Thu Jan 23 18:51:40 2020 +0330
 
@@ -13310,7 +16356,7 @@
  1 file changed, 2 insertions(+), 1 deletion(-)
 
 commit d7454cf07eeb87600d8fcf23ada3617b6bda0f35
-Merge: 9cd76813 0b39c480
+Merge: 9cd76813a 0b39c4806
 Author: Ebrahim Byagowi <ebrahim at gnu.org>
 Date:   Sat Jan 11 01:24:39 2020 +0330
 
@@ -13706,7 +16752,7 @@
  23 files changed, 114 insertions(+), 113 deletions(-)
 
 commit 33c3d63a0a9734a9cca9411a666d6ba9793d642f
-Merge: 68c1798a ea8fdfa0
+Merge: 68c1798a6 ea8fdfa07
 Author: Ebrahim Byagowi <ebrahim at gnu.org>
 Date:   Tue Dec 31 13:52:50 2019 +0330
 
@@ -14500,7 +17546,7 @@
  3 files changed, 144 insertions(+), 55 deletions(-)
 
 commit ea8fdfa07939b97db6636327c8d55cd3b5a62b4c
-Merge: 453050ad d5338ba1
+Merge: 453050ad3 d5338ba18
 Author: blueshade7 <ariza at typekit.com>
 Date:   Fri Nov 22 15:59:09 2019 -0800
 
@@ -14824,7 +17870,7 @@
  1 file changed, 26 insertions(+), 21 deletions(-)
 
 commit 773ee8041e8905bfb06c1a71d2b4fc99110b3dc6
-Merge: 47b4074d 0efbda7a
+Merge: 47b4074d5 0efbda7a4
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Tue Oct 29 10:58:56 2019 -0700
 
@@ -14842,7 +17888,7 @@
  1 file changed, 13 insertions(+), 14 deletions(-)
 
 commit 47b4074d5f98d71d2983470602eff9b93f102af4
-Merge: dd8a8460 dd288840
+Merge: dd8a84603 dd288840d
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Tue Oct 29 03:16:34 2019 -0700
 
@@ -14942,7 +17988,7 @@
  1 file changed, 1 insertion(+), 7 deletions(-)
 
 commit 2714dc31b8d0ffe3c043935dd7619be0dd7b7635
-Merge: aca63902 14ad96ff
+Merge: aca639028 14ad96ffb
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Mon Oct 28 13:01:34 2019 -0700
 
@@ -15199,7 +18245,7 @@
  1 file changed, 1 insertion(+), 1 deletion(-)
 
 commit 453050ad3083ed344bc2ab3b1651babbed34934d
-Merge: d7df7db1 b0b8551a
+Merge: d7df7db16 b0b8551af
 Author: Ebrahim Byagowi <ebrahim at gnu.org>
 Date:   Sun Oct 13 08:38:56 2019 +0330
 
@@ -15278,7 +18324,7 @@
  2 files changed, 18 insertions(+), 1 deletion(-)
 
 commit e637a4b3de2fb8bdbc1b82e822f4a6cc579e794b
-Merge: 670fec23 e4464f44
+Merge: 670fec231 e4464f448
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Fri Oct 11 10:28:58 2019 +0700
 
@@ -15485,7 +18531,7 @@
  10 files changed, 66 insertions(+), 75 deletions(-)
 
 commit d7df7db160992e92c31afb6c79c7ccdad510fec1
-Merge: 74a2dbbc f2339964
+Merge: 74a2dbbce f2339964b
 Author: Ebrahim Byagowi <ebrahim at gnu.org>
 Date:   Sun Oct 6 17:18:59 2019 +0330
 
@@ -15552,7 +18598,7 @@
  2 files changed, 85 insertions(+), 126 deletions(-)
 
 commit 100dbccaa50b2f965f3877f2156d388453f0948a
-Merge: c54ee485 b7684fa9
+Merge: c54ee4853 b7684fa9f
 Author: Ebrahim Byagowi <ebrahim at gnu.org>
 Date:   Sun Oct 6 09:18:22 2019 +0330
 
@@ -15559,7 +18605,7 @@
     Merge remote-tracking branch 'upstream/master' into var-subset
 
 commit b7684fa9f42dffa6bd81acfade163123b30800b8
-Merge: 79ec65ae 21c80d95
+Merge: 79ec65ae1 21c80d955
 Author: Ebrahim Byagowi <ebrahim at gnu.org>
 Date:   Sun Oct 6 09:00:48 2019 +0330
 
@@ -15663,7 +18709,7 @@
  13 files changed, 1588 insertions(+), 109 deletions(-)
 
 commit c54ee4853092b8a7f9a47da36407455992f55d93
-Merge: 19d45dca 79ec65ae
+Merge: 19d45dcab 79ec65ae1
 Author: Ebrahim Byagowi <ebrahim at gnu.org>
 Date:   Thu Oct 3 14:28:37 2019 +0330
 
@@ -15679,7 +18725,7 @@
  1 file changed, 1 insertion(+), 1 deletion(-)
 
 commit 19d45dcab732f3a836e17d31be9ca92f01c818b0
-Merge: 8106ba7f 3fd555be
+Merge: 8106ba7f8 3fd555be5
 Author: Ebrahim Byagowi <ebrahim at gnu.org>
 Date:   Thu Oct 3 13:39:17 2019 +0330
 
@@ -15769,7 +18815,7 @@
  1 file changed, 2 insertions(+), 2 deletions(-)
 
 commit faace9437ea09d89ef5f5f9c9fc3ce0dbc672142
-Merge: e48ef080 f0dd724c
+Merge: e48ef0804 f0dd724c1
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Mon Sep 30 13:34:05 2019 -0700
 
@@ -17066,7 +20112,7 @@
  1 file changed, 90 insertions(+), 72 deletions(-)
 
 commit 9ff32b79b37e686bab0b4baa924c97b841bd8413
-Merge: 6b3e0939 49902964
+Merge: 6b3e09391 499029644
 Author: Ebrahim Byagowi <ebrahim at gnu.org>
 Date:   Thu Aug 29 19:53:18 2019 +0430
 
@@ -17590,7 +20636,7 @@
  1 file changed, 1 insertion(+), 1 deletion(-)
 
 commit 20b1a27c8a319d43a582c3efa8233b9f2c3cc73e
-Merge: 5ee1e451 37de38ad
+Merge: 5ee1e451c 37de38ade
 Author: Ebrahim Byagowi <ebrahim at gnu.org>
 Date:   Tue Aug 20 13:04:51 2019 +0430
 
@@ -17599,7 +20645,7 @@
     Remove assumption about Core Text working in 96 DPI
 
 commit 37de38adeae48e1855c2431a39639db873a74554
-Merge: f401f85a 5ee1e451
+Merge: f401f85a5 5ee1e451c
 Author: Ebrahim Byagowi <ebrahim at gnu.org>
 Date:   Tue Aug 20 12:59:33 2019 +0430
 
@@ -17949,7 +20995,7 @@
  1 file changed, 7 insertions(+), 1 deletion(-)
 
 commit 6b3e093911aaf834c0adf5b2a114d357914322ee
-Merge: 07f27acc 521c7013
+Merge: 07f27accb 521c7013a
 Author: Michiharu Ariza <ariza at adobe.com>
 Date:   Wed Jul 31 16:04:48 2019 -0700
 
@@ -17956,7 +21002,7 @@
     Merge branch 'master' into var-subset
 
 commit 07f27accb9c3823cef5d652150701f24af89fca2
-Merge: a87fbb87 6e3bfecf
+Merge: a87fbb872 6e3bfecf3
 Author: Michiharu Ariza <ariza at adobe.com>
 Date:   Wed Jul 31 14:58:53 2019 -0700
 
@@ -18078,7 +21124,7 @@
  1 file changed, 10 insertions(+), 6 deletions(-)
 
 commit f0dd724c1e091f42f289efbebd2c50e830e59c6e
-Merge: 68ac767e 4e1da6bb
+Merge: 68ac767e4 4e1da6bb6
 Author: blueshade7 <ariza at typekit.com>
 Date:   Mon Jul 29 14:21:05 2019 -0700
 
@@ -18085,7 +21131,7 @@
     Merge branch 'master' into subset-varstore
 
 commit 6e3bfecf358a1785995a64c18eb4c1d7cf926ca5
-Merge: 5988ab8a 4e1da6bb
+Merge: 5988ab8a4 4e1da6bb6
 Author: blueshade7 <ariza at typekit.com>
 Date:   Mon Jul 29 12:25:43 2019 -0700
 
@@ -18217,7 +21263,7 @@
  1 file changed, 1 insertion(+), 1 deletion(-)
 
 commit 60d0fe2eda9c0eb67f50d61e905b584b8edc3e95
-Merge: 6d53cda1 658424b2
+Merge: 6d53cda1b 658424b29
 Author: Ebrahim Byagowi <ebrahim at gnu.org>
 Date:   Sat Jul 27 01:20:55 2019 +0430
 
@@ -18415,7 +21461,7 @@
  2 files changed, 3 insertions(+), 3 deletions(-)
 
 commit 5988ab8a4e0d2b6d174f2ff0f18addc3f41b7a94
-Merge: 4cba7bda 636ae422
+Merge: 4cba7bdae 636ae4223
 Author: blueshade7 <ariza at typekit.com>
 Date:   Mon Jul 22 14:36:16 2019 -0700
 
@@ -18431,7 +21477,7 @@
  1 file changed, 1 insertion(+), 1 deletion(-)
 
 commit 04c11a19b75663af35d16c827e295aa2e555d110
-Merge: 41ab56e0 c9796d15
+Merge: 41ab56e09 c9796d15e
 Author: Khaled Hosny <khaledhosny at eglug.org>
 Date:   Mon Jul 22 16:44:47 2019 +0200
 
@@ -18641,7 +21687,7 @@
  1 file changed, 6 insertions(+), 5 deletions(-)
 
 commit ac8b6e330a443a66c3e0fb83af9794310688d848
-Merge: ec8dde81 08b48e89
+Merge: ec8dde814 08b48e89d
 Author: Ebrahim Byagowi <ebrahim at gnu.org>
 Date:   Sat Jul 20 13:16:16 2019 +0430
 
@@ -18772,7 +21818,7 @@
  1 file changed, 3 deletions(-)
 
 commit a76d8b0d5531a6a8d682ea9d5150ee7893932269
-Merge: 386a4a64 504bb172
+Merge: 386a4a64f 504bb1728
 Author: blueshade7 <ariza at typekit.com>
 Date:   Wed Jul 17 14:12:06 2019 -0700
 
@@ -19054,7 +22100,7 @@
  28 files changed, 85 insertions(+), 46 deletions(-)
 
 commit a87fbb872b31c7a292ed8b414be728aa951e2833
-Merge: 49252c42 6e35668b
+Merge: 49252c42b 6e35668b4
 Author: Michiharu Ariza <ariza at adobe.com>
 Date:   Tue Jul 9 10:25:54 2019 -0700
 
@@ -19071,7 +22117,7 @@
  2 files changed, 2 insertions(+), 1 deletion(-)
 
 commit 8bf989ea70804dad66fb1c2d0c625ef5e562a309
-Merge: 5763a927 2e7021da
+Merge: 5763a9274 2e7021da7
 Author: blueshade7 <ariza at typekit.com>
 Date:   Mon Jul 8 17:13:29 2019 -0700
 
@@ -19428,7 +22474,7 @@
  1 file changed, 163 insertions(+), 2 deletions(-)
 
 commit 5763a92749386e134f2b4073531c10e9586d1d19
-Merge: 6f35cf7a 6bcbe495
+Merge: 6f35cf7a6 6bcbe495b
 Author: Michiharu Ariza <ariza at typekit.com>
 Date:   Mon Jul 1 15:17:19 2019 -0700
 
@@ -19446,7 +22492,7 @@
  3 files changed, 85 insertions(+), 1 deletion(-)
 
 commit 9c93f5cc2de5c60d5464a65890fc7d8c25aa9702
-Merge: ad341d5f 4ab2d1d6
+Merge: ad341d5f1 4ab2d1d67
 Author: Ebrahim Byagowi <ebrahim at gnu.org>
 Date:   Mon Jul 1 20:08:22 2019 +0430
 
@@ -19585,7 +22631,7 @@
  1 file changed, 138 insertions(+), 4 deletions(-)
 
 commit 7185bd6ffb4dd8c0efebdab5b930e62c5695e3ab
-Merge: cd65305b 8341c0b3
+Merge: cd65305b0 8341c0b30
 Author: Ebrahim Byagowi <ebrahim at gnu.org>
 Date:   Thu Jun 27 22:09:28 2019 +0430
 
@@ -19965,7 +23011,7 @@
  2 files changed, 39 insertions(+), 91 deletions(-)
 
 commit 8062979990d348671b465c877e4dd672e1337665
-Merge: ad97ec95 c2d7dfc6
+Merge: ad97ec950 c2d7dfc68
 Author: Ebrahim Byagowi <ebrahim at gnu.org>
 Date:   Sun Jun 23 11:19:48 2019 +0430
 
@@ -21272,7 +24318,7 @@
  2 files changed, 7 insertions(+), 4 deletions(-)
 
 commit 4ddab6facc0c7ffe7623bf6449ab9b27166924a6
-Merge: 157a414b 4b1b0bf2
+Merge: 157a414bd 4b1b0bf2f
 Author: Michiharu Ariza <ariza at adobe.com>
 Date:   Wed Jun 5 11:21:27 2019 -0700
 
@@ -21279,7 +24325,7 @@
     Merge branch 'master' into var-subset
 
 commit 4b1b0bf2f51f806d3285a7e7dec378b9eab9333e
-Merge: 659eeddb 815f002b
+Merge: 659eeddb2 815f002bb
 Author: Ebrahim Byagowi <ebrahim at gnu.org>
 Date:   Wed Jun 5 12:57:28 2019 +0430
 
@@ -21338,7 +24384,7 @@
  2 files changed, 59 insertions(+), 62 deletions(-)
 
 commit 89a7a880a1d5cd5e585d43fdde6d44c6dba559cf
-Merge: 760eb1bf 12febd68
+Merge: 760eb1bf9 12febd68d
 Author: Ebrahim Byagowi <ebrahim at gnu.org>
 Date:   Tue Jun 4 10:52:16 2019 +0430
 
@@ -21897,7 +24943,7 @@
  2 files changed, 10 insertions(+), 8 deletions(-)
 
 commit e7ed85de95d3ccdb674ec5a30ae66d53cea74b3a
-Merge: f93a5e6a 97ba206b
+Merge: f93a5e6a7 97ba206be
 Author: n8willis <n8willis at users.noreply.github.com>
 Date:   Sat May 25 16:05:07 2019 +0100
 
@@ -22029,7 +25075,7 @@
  1 file changed, 45 insertions(+), 2 deletions(-)
 
 commit 96de94768b08287325be8947255917502368c337
-Merge: c96c6b28 1197bef2
+Merge: c96c6b287 1197bef26
 Author: rsheeter <rsheeter at google.com>
 Date:   Fri May 24 11:22:41 2019 -0700
 
@@ -22183,7 +25229,7 @@
  1 file changed, 27 insertions(+), 3 deletions(-)
 
 commit 15a9e32b566fbf6f4a2c6fd488d8cc3865234b17
-Merge: 993d81b9 ff7fc6d4
+Merge: 993d81b9c ff7fc6d48
 Author: Ebrahim Byagowi <ebrahim at gnu.org>
 Date:   Thu May 23 11:02:15 2019 +0430
 
@@ -22416,7 +25462,7 @@
  1 file changed, 19 insertions(+), 16 deletions(-)
 
 commit d1b12a546561a78ae3c3e9d6bffa057caf82dbee
-Merge: 3a43603e f49a5bec
+Merge: 3a43603ec f49a5bec9
 Author: Rod Sheeter <rsheeter at google.com>
 Date:   Mon May 20 21:29:54 2019 -0700
 
@@ -22452,7 +25498,7 @@
  2 files changed, 86 insertions(+), 35 deletions(-)
 
 commit 82bbec306376d61b6700461c4038c6789e60a998
-Merge: 9d09ac13 b7be5931
+Merge: 9d09ac13a b7be59311
 Author: Rod Sheeter <rsheeter at google.com>
 Date:   Thu May 16 15:14:01 2019 -0700
 
@@ -22507,7 +25553,7 @@
  1 file changed, 59 insertions(+), 29 deletions(-)
 
 commit f8de063b48c243d551c8892bdd2a799606fda3f4
-Merge: 0d7fef2d 8f174870
+Merge: 0d7fef2d5 8f174870e
 Author: Rod Sheeter <rsheeter at google.com>
 Date:   Thu May 9 20:02:38 2019 -0700
 
@@ -22556,7 +25602,7 @@
  1 file changed, 58 insertions(+), 39 deletions(-)
 
 commit 723d054dcb6ad44e9eab4dc8cc55f8d480d2ff16
-Merge: ed727d4b e2a51ff7
+Merge: ed727d4bb e2a51ff72
 Author: rsheeter <rsheeter at google.com>
 Date:   Wed May 8 16:45:35 2019 -0700
 
@@ -22563,7 +25609,7 @@
     Merge branch 'master' of https://github.com/harfbuzz/harfbuzz into glyf
 
 commit ed727d4bb74860c126675e94f87f65ff7874dbb6
-Merge: fb9bff95 e8b45c19
+Merge: fb9bff955 e8b45c193
 Author: rsheeter <rsheeter at google.com>
 Date:   Wed May 8 16:39:45 2019 -0700
 
@@ -23736,7 +26782,7 @@
  2 files changed, 14 insertions(+), 1 deletion(-)
 
 commit 3d9be2ad5036aaf02b69095faaf9c18705c2c5bc
-Merge: a20db496 1a850abd
+Merge: a20db496f 1a850abd6
 Author: n8willis <n8willis at users.noreply.github.com>
 Date:   Sun May 12 20:03:29 2019 +0100
 
@@ -23830,7 +26876,7 @@
  1 file changed, 7 insertions(+), 3 deletions(-)
 
 commit 1a850abd66999707b6f4795050e748fc879b92ef
-Merge: 8a544171 a6048e4c
+Merge: 8a544171d a6048e4cd
 Author: n8willis <n8willis at users.noreply.github.com>
 Date:   Sat May 11 20:16:57 2019 +0100
 
@@ -25013,7 +28059,7 @@
  1 file changed, 11 insertions(+), 11 deletions(-)
 
 commit 6bc82579100992e3f04c11f36b9c2f0014d880f2
-Merge: 34764454 6d9a86ae
+Merge: 347644542 6d9a86ae7
 Author: n8willis <n8willis at users.noreply.github.com>
 Date:   Thu May 9 14:39:05 2019 +0100
 
@@ -26417,7 +29463,7 @@
  1 file changed, 22 insertions(+), 13 deletions(-)
 
 commit 1223a352b7c8d1cc362693b850f348af4d4d03fb
-Merge: aa3ac592 9542bdd0
+Merge: aa3ac5924 9542bdd0e
 Author: Michiharu Ariza <ariza at adobe.com>
 Date:   Mon Apr 29 16:43:48 2019 -0700
 
@@ -27167,7 +30213,7 @@
  1 file changed, 1 insertion(+), 1 deletion(-)
 
 commit c87488b46d1f302e1ad313c365e2cd440e60141a
-Merge: 49fe81fd c67a0d58
+Merge: 49fe81fde c67a0d581
 Author: Michiharu Ariza <ariza at adobe.com>
 Date:   Wed Apr 17 12:07:15 2019 -0700
 
@@ -27323,7 +30369,7 @@
  9 files changed, 19 insertions(+), 18 deletions(-)
 
 commit 6cde814a360eaeab6755685cf7980887af3225d1
-Merge: 007bb3e0 1ce11b44
+Merge: 007bb3e0d 1ce11b443
 Author: Michiharu Ariza <ariza at adobe.com>
 Date:   Tue Apr 16 11:35:07 2019 -0700
 
@@ -27549,7 +30595,7 @@
  1 file changed, 2 insertions(+), 2 deletions(-)
 
 commit ad126036643e44a98c4c42d2a2a4a3b4a3649937
-Merge: 341b70a3 47e538a3
+Merge: 341b70a3b 47e538a35
 Author: Nathan Willis <nwillis at glyphography.com>
 Date:   Sun Apr 14 15:42:42 2019 +0100
 
@@ -27798,7 +30844,7 @@
  1 file changed, 3 insertions(+)
 
 commit a90e4916df74f6f84ce78eb2a73b6f325e7e8617
-Merge: 94573702 3db22726
+Merge: 945737026 3db227265
 Author: Michiharu Ariza <ariza at adobe.com>
 Date:   Thu Apr 11 15:57:32 2019 -0700
 
@@ -27927,7 +30973,7 @@
  4 files changed, 13 insertions(+), 13 deletions(-)
 
 commit 9e79285ef3b4d7490b4bbad0eef16dd73fd8fb62
-Merge: 6d79a25b c5509be9
+Merge: 6d79a25be c5509be93
 Author: Michiharu Ariza <ariza at adobe.com>
 Date:   Wed Apr 10 17:24:29 2019 -0700
 
@@ -27934,7 +30980,7 @@
     Merge branch 'master' into var-subset
 
 commit 6d79a25bed110b2d8842bd102ffdb5606023b8a1
-Merge: ab9d3096 196481cc
+Merge: ab9d30965 196481ccb
 Author: Michiharu Ariza <ariza at adobe.com>
 Date:   Wed Apr 10 17:23:00 2019 -0700
 
@@ -28224,7 +31270,7 @@
  1 file changed, 6 insertions(+), 3 deletions(-)
 
 commit b999ce9bf06fc90c4cb3c531357967835d7e706d
-Merge: c2d727a4 6215fb8e
+Merge: c2d727a47 6215fb8e6
 Author: Michiharu Ariza <ariza at adobe.com>
 Date:   Wed Apr 3 10:34:09 2019 -0700
 
@@ -28695,7 +31741,7 @@
  1 file changed, 1 insertion(+), 1 deletion(-)
 
 commit f7700fc479c25599e89b9d59edaad66e103a742d
-Merge: 43725d36 d6005b49
+Merge: 43725d363 d6005b49b
 Author: Michiharu Ariza <ariza at adobe.com>
 Date:   Sat Mar 30 20:49:34 2019 -0700
 
@@ -28792,7 +31838,7 @@
  1 file changed, 7 insertions(+), 15 deletions(-)
 
 commit 43725d36322b7277d515b958b5e894e1c892cede
-Merge: 294d520f a7c63cd8
+Merge: 294d520f6 a7c63cd8f
 Author: Michiharu Ariza <ariza at adobe.com>
 Date:   Sat Mar 30 18:51:15 2019 -0700
 
@@ -29074,7 +32120,7 @@
  3 files changed, 22 insertions(+), 23 deletions(-)
 
 commit 8a8965be39d909198d6c91d5a45aede6802ebd71
-Merge: cc94a9ed 3236623e
+Merge: cc94a9ed3 3236623e1
 Author: Michiharu Ariza <ariza at adobe.com>
 Date:   Fri Mar 29 23:38:16 2019 -0700
 
@@ -29081,7 +32127,7 @@
     Merge branch 'var-subset' of https://github.com/harfbuzz/harfbuzz into var-subset
 
 commit cc94a9ed3b63cf74aa64c83a203137f16c6e152c
-Merge: 435bc7f3 ce6093a9
+Merge: 435bc7f3e ce6093a96
 Author: Michiharu Ariza <ariza at adobe.com>
 Date:   Fri Mar 29 18:41:38 2019 -0700
 
@@ -29100,7 +32146,7 @@
  3 files changed, 9 insertions(+), 9 deletions(-)
 
 commit ce6093a96ba4c68b4eb4f1cd4b695eb41f1fa334
-Merge: ddb84dce a1177fec
+Merge: ddb84dcec a1177fec8
 Author: Michiharu Ariza <ariza at adobe.com>
 Date:   Fri Mar 29 10:32:45 2019 -0700
 
@@ -29107,7 +32153,7 @@
     Merge branch 'var-subset' of https://github.com/harfbuzz/harfbuzz into var-subset
 
 commit a1177fec8f43a65bca6696378995d6d39d8f6330
-Merge: 58c8c7a4 f505b5d5
+Merge: 58c8c7a49 f505b5d5c
 Author: Michiharu Ariza <ariza at adobe.com>
 Date:   Fri Mar 29 08:43:47 2019 -0700
 
@@ -29364,7 +32410,7 @@
  1 file changed, 14 insertions(+), 10 deletions(-)
 
 commit 3236623e1f4a11c23f8f2fb41d886d1255c2bc63
-Merge: 435bc7f3 d30e5e74
+Merge: 435bc7f3e d30e5e748
 Author: Michiharu Ariza <ariza at adobe.com>
 Date:   Fri Mar 29 18:41:38 2019 -0700
 
@@ -30487,7 +33533,7 @@
  1 file changed, 81 deletions(-)
 
 commit 8e7887ca5f8a2822345bdcbdc873c73a31c81177
-Merge: 7929b0f0 90aebc6c
+Merge: 7929b0f07 90aebc6cf
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Fri Mar 29 14:37:04 2019 -0700
 
@@ -30560,7 +33606,7 @@
  2 files changed, 10 deletions(-)
 
 commit d30e5e74814c6db23fdedbe75fd9b89c0dfb4dce
-Merge: ddb84dce a252392b
+Merge: ddb84dcec a252392bc
 Author: Michiharu Ariza <ariza at adobe.com>
 Date:   Fri Mar 29 10:32:45 2019 -0700
 
@@ -30577,7 +33623,7 @@
  2 files changed, 8 insertions(+), 1 deletion(-)
 
 commit a252392bc05e8e9e4127e0002b10fe514323730f
-Merge: 58c8c7a4 d6fc1d49
+Merge: 58c8c7a49 d6fc1d49a
 Author: Michiharu Ariza <ariza at adobe.com>
 Date:   Fri Mar 29 08:43:47 2019 -0700
 
@@ -30616,7 +33662,7 @@
  2 files changed, 10 insertions(+)
 
 commit a030ce4ff83e0948e4f865accc5670e8b5e78dde
-Merge: 11456b2d d6fc1d49
+Merge: 11456b2d9 d6fc1d49a
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Thu Mar 28 21:26:50 2019 -0700
 
@@ -30688,7 +33734,7 @@
  1 file changed, 3 insertions(+), 3 deletions(-)
 
 commit 58c8c7a495fcc353d09158fc23a45f35b2dab2dc
-Merge: 485fe06f a548d1da
+Merge: 485fe06f7 a548d1da7
 Author: Michiharu Ariza <ariza at adobe.com>
 Date:   Thu Mar 28 16:17:41 2019 -0700
 
@@ -30714,7 +33760,7 @@
  2 files changed, 3 insertions(+), 20 deletions(-)
 
 commit 5f36771c2ab612b403e55504b7901b0390b1b76d
-Merge: 99f0c107 061bd0a9
+Merge: 99f0c107f 061bd0a99
 Author: Michiharu Ariza <ariza at adobe.com>
 Date:   Thu Mar 28 15:07:53 2019 -0700
 
@@ -30771,7 +33817,7 @@
  1 file changed, 1 insertion(+), 1 deletion(-)
 
 commit 061bd0a99b0724953fcbdaaef4ea91a54cd7d3ce
-Merge: d8e3e360 67175987
+Merge: d8e3e3607 67175987b
 Author: Michiharu Ariza <ariza at adobe.com>
 Date:   Wed Mar 27 08:53:50 2019 -0700
 
@@ -30778,7 +33824,7 @@
     Merge branch 'var-subset' of https://github.com/harfbuzz/harfbuzz into var-subset
 
 commit d8e3e3607e6435b994a3e2f4285c5b4d17c5dfa4
-Merge: bcd689bb 717181c5
+Merge: bcd689bb1 717181c59
 Author: Michiharu Ariza <ariza at adobe.com>
 Date:   Wed Mar 27 08:53:48 2019 -0700
 
@@ -30823,7 +33869,7 @@
  1 file changed, 14 insertions(+), 10 deletions(-)
 
 commit bcd689bb1090a1bf5113e67edfce583832bb2187
-Merge: 49f93596 ec2a5dc8
+Merge: 49f935963 ec2a5dc85
 Author: Michiharu Ariza <ariza at adobe.com>
 Date:   Tue Mar 26 17:13:31 2019 -0700
 
@@ -30957,7 +34003,7 @@
  6 files changed, 108 insertions(+), 4 deletions(-)
 
 commit 8ec279072e039c7a75ea90e2284d46bd9faee8ee
-Merge: 0593a95e 5390e393
+Merge: 0593a95e2 5390e3934
 Author: Michiharu Ariza <ariza at adobe.com>
 Date:   Thu Mar 21 10:38:12 2019 -0700
 
@@ -30973,7 +34019,7 @@
  1 file changed, 1 insertion(+), 1 deletion(-)
 
 commit 5390e39342e78566095b580603bd1f76cdafc010
-Merge: 084be9a0 5f15fca6
+Merge: 084be9a0f 5f15fca66
 Author: Michiharu Ariza <ariza at adobe.com>
 Date:   Thu Mar 21 10:21:50 2019 -0700
 
@@ -30980,7 +34026,7 @@
     Merge branch 'var-subset' of https://github.com/harfbuzz/harfbuzz into var-subset
 
 commit 084be9a0f466134998da79e9a81191836f847ab8
-Merge: 3faaa52a bcb4e505
+Merge: 3faaa52aa bcb4e505d
 Author: Michiharu Ariza <ariza at adobe.com>
 Date:   Thu Mar 21 10:21:31 2019 -0700
 
@@ -31248,7 +34294,7 @@
  4 files changed, 1 insertion(+)
 
 commit a5118c1db51d6d3b24622a52e50246e00b07fa74
-Merge: 90ea140a 079c386c
+Merge: 90ea140ac 079c386ca
 Author: Michiharu Ariza <ariza at adobe.com>
 Date:   Fri Mar 15 10:33:03 2019 -0700
 
@@ -31255,7 +34301,7 @@
     Merge branch 'var-subset' of https://github.com/harfbuzz/harfbuzz into var-subset
 
 commit 079c386ca89b6d2833786db3ba54b7137d045188
-Merge: 99502b32 8aaab78e
+Merge: 99502b324 8aaab78ef
 Author: Michiharu Ariza <ariza at adobe.com>
 Date:   Fri Mar 15 10:12:19 2019 -0700
 
@@ -31262,7 +34308,7 @@
     Merge branch 'master' into var-subset
 
 commit 90ea140aca18d073401fc971681ce48403fbf399
-Merge: d23c201f 99502b32
+Merge: d23c201f5 99502b324
 Author: Michiharu Ariza <ariza at adobe.com>
 Date:   Thu Mar 14 16:58:19 2019 -0700
 
@@ -31515,7 +34561,7 @@
  4 files changed, 175 insertions(+), 14 deletions(-)
 
 commit 23e2d5ac86968c7548df0d212c1a321d09328ffa
-Merge: f5a46638 e52ec3fc
+Merge: f5a466389 e52ec3fc2
 Author: Michiharu Ariza <ariza at adobe.com>
 Date:   Tue Mar 12 10:53:15 2019 -0700
 
@@ -31701,7 +34747,7 @@
  2 files changed, 7 insertions(+), 8 deletions(-)
 
 commit 3f3da718632e9beef9a1d9cf8b5775025ffe3fd6
-Merge: 21aaf300 f448195a
+Merge: 21aaf3005 f448195a4
 Author: Michiharu Ariza <ariza at adobe.com>
 Date:   Fri Mar 1 18:12:35 2019 -0800
 
@@ -31728,7 +34774,7 @@
  1 file changed, 2 insertions(+), 5 deletions(-)
 
 commit f448195a4b041db83b0e515c829b99d2349bf73f
-Merge: fa2b3d30 4f37ab63
+Merge: fa2b3d30f 4f37ab63d
 Author: Michiharu Ariza <ariza at adobe.com>
 Date:   Fri Mar 1 15:22:17 2019 -0800
 
@@ -32015,7 +35061,7 @@
  1 file changed, 7 insertions(+), 4 deletions(-)
 
 commit c1e5ba81fe4888143c1cf4a3deb3597875580c6d
-Merge: b8b3b3e3 3da79dd5
+Merge: b8b3b3e38 3da79dd5b
 Author: Behdad Esfahbod <behdad at fb.com>
 Date:   Fri Feb 15 16:06:03 2019 -0800
 
@@ -32032,7 +35078,7 @@
  2 files changed, 49 insertions(+), 22 deletions(-)
 
 commit 3da79dd5b92b89fbf062cbe591e6b1ba83083aec
-Merge: 50005501 d8a68728
+Merge: 500055018 d8a68728a
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Fri Feb 15 15:54:51 2019 -0800
 
@@ -32041,7 +35087,7 @@
     CFF more arrayof fixes
 
 commit 5000550183022db8c9cfef63a9ed90eb9f37764d
-Merge: 5c2bb1de 90c8bbf9
+Merge: 5c2bb1de8 90c8bbf98
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Fri Feb 15 15:54:13 2019 -0800
 
@@ -32050,7 +35096,7 @@
     [subset] Implement --retain-gids with CFF/CFF2
 
 commit d8a68728a077a8c5fc8ceae19f2866cdc8b70baf
-Merge: 1cb1d5d7 5c2bb1de
+Merge: 1cb1d5d7f 5c2bb1de8
 Author: Michiharu Ariza <ariza at adobe.com>
 Date:   Fri Feb 15 14:48:10 2019 -0800
 
@@ -32057,7 +35103,7 @@
     Merge branch 'master' into cff-more-arrayof-fixes
 
 commit 90c8bbf98747eb29687471da892b4a34a9236242
-Merge: 6f1dfd08 5c2bb1de
+Merge: 6f1dfd082 5c2bb1de8
 Author: Michiharu Ariza <ariza at adobe.com>
 Date:   Fri Feb 15 14:47:38 2019 -0800
 
@@ -32190,7 +35236,7 @@
  2 files changed, 33 insertions(+)
 
 commit 5b725784e53a96ba4d983184a2670aba2aa0fd9c
-Merge: 00db9409 28f77361
+Merge: 00db94095 28f773613
 Author: Behdad Esfahbod <behdad at fb.com>
 Date:   Thu Feb 14 11:34:55 2019 -0800
 
@@ -32300,7 +35346,7 @@
  1 file changed, 25 insertions(+)
 
 commit 1cb1d5d7fb74e9f42dc8361dcdf669ed479d595d
-Merge: 8a568a88 d5287e1b
+Merge: 8a568a885 d5287e1ba
 Author: Michiharu Ariza <ariza at adobe.com>
 Date:   Thu Feb 14 10:09:19 2019 -0800
 
@@ -32307,7 +35353,7 @@
     Merge branch 'master' into cff-more-arrayof-fixes
 
 commit 6f1dfd082cf79488ae6773e7d99172f13575668c
-Merge: b1dbc77f d5287e1b
+Merge: b1dbc77fa d5287e1ba
 Author: Michiharu Ariza <ariza at adobe.com>
 Date:   Thu Feb 14 10:08:16 2019 -0800
 
@@ -32330,7 +35376,7 @@
  1 file changed, 1 insertion(+), 1 deletion(-)
 
 commit 4103252323b15a821f0a912b580c2107211b918f
-Merge: f1b89344 d5287e1b
+Merge: f1b893440 d5287e1ba
 Author: Behdad Esfahbod <behdad at fb.com>
 Date:   Wed Feb 13 23:46:43 2019 -0800
 
@@ -32373,7 +35419,7 @@
  1 file changed, 13 deletions(-)
 
 commit 7d2376de336c7fc14d69e01add02115335f92db8
-Merge: 2d940946 890d0ee7
+Merge: 2d940946d 890d0ee77
 Author: Behdad Esfahbod <behdad at fb.com>
 Date:   Wed Feb 13 22:08:54 2019 -0800
 
@@ -32389,7 +35435,7 @@
  1 file changed, 3 insertions(+), 3 deletions(-)
 
 commit 8a568a8858b44a81ca43a82761a70bf8d53e7c26
-Merge: c83412e4 1e1d0e63
+Merge: c83412e4c 1e1d0e63d
 Author: Michiharu Ariza <ariza at adobe.com>
 Date:   Wed Feb 13 11:25:00 2019 -0800
 
@@ -32396,7 +35442,7 @@
     Merge branch 'master' into cff-more-arrayof-fixes
 
 commit b1dbc77fa62a99047df539663cfd1e8778d2c907
-Merge: c3a3536c 1e1d0e63
+Merge: c3a3536c9 1e1d0e63d
 Author: Michiharu Ariza <ariza at adobe.com>
 Date:   Wed Feb 13 11:24:38 2019 -0800
 
@@ -32418,7 +35464,7 @@
  2 files changed, 5 insertions(+), 5 deletions(-)
 
 commit c3a3536c9a00a989ebd83d52e67d06525ed669bc
-Merge: bc33c617 85a6d312
+Merge: bc33c617b 85a6d3121
 Author: Michiharu Ariza <ariza at adobe.com>
 Date:   Tue Feb 12 15:10:59 2019 -0800
 
@@ -32425,7 +35471,7 @@
     Merge branch 'cff-retain-gids' of https://github.com/harfbuzz/harfbuzz into cff-retain-gids
 
 commit bc33c617b85988f4d81312e62a75f92601852c76
-Merge: c6af8461 fdfa3d29
+Merge: c6af84617 fdfa3d29b
 Author: Michiharu Ariza <ariza at adobe.com>
 Date:   Tue Feb 12 15:10:50 2019 -0800
 
@@ -32441,7 +35487,7 @@
  1 file changed, 24 insertions(+), 2 deletions(-)
 
 commit 85a6d3121a26c9bcbec60d37b64643ff8dc97a0a
-Merge: d9ded069 fdfa3d29
+Merge: d9ded0699 fdfa3d29b
 Author: Michiharu Ariza <ariza at adobe.com>
 Date:   Mon Feb 11 14:25:21 2019 -0800
 
@@ -32448,7 +35494,7 @@
     Merge branch 'master' into cff-retain-gids
 
 commit c83412e4cec10f6f6f6ac38f202b3ce373da5daf
-Merge: 1239b6b2 fdfa3d29
+Merge: 1239b6b2b fdfa3d29b
 Author: Michiharu Ariza <ariza at adobe.com>
 Date:   Mon Feb 11 14:16:25 2019 -0800
 
@@ -32494,7 +35540,7 @@
  1 file changed, 2 insertions(+), 2 deletions(-)
 
 commit d9ded069926bf46a5d8e5edbf5201c98044db78e
-Merge: a5e933eb 84694af7
+Merge: a5e933eba 84694af72
 Author: Michiharu Ariza <ariza at adobe.com>
 Date:   Fri Feb 8 14:44:20 2019 -0800
 
@@ -32587,7 +35633,7 @@
  2 files changed, 4 insertions(+), 8 deletions(-)
 
 commit 1239b6b2b4430658aea78216a1dcc885724a7ab4
-Merge: 9f80eb01 126abca9
+Merge: 9f80eb017 126abca98
 Author: Michiharu Ariza <ariza at adobe.com>
 Date:   Thu Feb 7 10:29:40 2019 -0800
 
@@ -32594,7 +35640,7 @@
     Merge branch 'master' into cff-more-arrayof-fixes
 
 commit a5fa76977b5bdf3bd40ede3cdd0da9c5546557a6
-Merge: 214d0b02 126abca9
+Merge: 214d0b024 126abca98
 Author: Michiharu Ariza <ariza at adobe.com>
 Date:   Thu Feb 7 10:28:13 2019 -0800
 
@@ -32610,7 +35656,7 @@
  1 file changed, 2 insertions(+), 2 deletions(-)
 
 commit 126abca98a954f7ec3374d0593fee25f78dc10f3
-Merge: 1e062821 7859decd
+Merge: 1e0628210 7859decdd
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Wed Feb 6 13:36:52 2019 -0800
 
@@ -32729,7 +35775,7 @@
  6 files changed, 0 insertions(+), 0 deletions(-)
 
 commit 30b781f20a8e386732f8e2858a22665d7af98061
-Merge: c1286265 1e062821
+Merge: c12862657 1e0628210
 Author: Michiharu Ariza <ariza at adobe.com>
 Date:   Fri Feb 1 14:50:34 2019 -0800
 
@@ -32839,7 +35885,7 @@
  1 file changed, 5 deletions(-)
 
 commit 9f80eb0177e527253818ad9171fc75fb565318cb
-Merge: b3799007 d14d2c20
+Merge: b37990075 d14d2c20b
 Author: Michiharu Ariza <ariza at adobe.com>
 Date:   Thu Jan 31 12:54:36 2019 -0800
 
@@ -32869,7 +35915,7 @@
  2 files changed, 6 insertions(+), 2 deletions(-)
 
 commit d14d2c20b05c5acf0a6f9c6dc36a7b8d8966153e
-Merge: acf5f0a3 dc04261a
+Merge: acf5f0a3a dc04261a5
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Wed Jan 30 18:36:57 2019 -0500
 
@@ -32888,7 +35934,7 @@
  1 file changed, 19 insertions(+), 13 deletions(-)
 
 commit 2e675d49f2f705a5b5d95574a5336d5e670a0fba
-Merge: ede117dc acf5f0a3
+Merge: ede117dc4 acf5f0a3a
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Wed Jan 30 15:10:43 2019 -0800
 
@@ -32913,7 +35959,7 @@
  1 file changed, 5 insertions(+), 6 deletions(-)
 
 commit cbe2118c588622070612ba7ac7eae7496a092e3c
-Merge: 8b46c2d9 6b834c1c
+Merge: 8b46c2d93 6b834c1c7
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Wed Jan 30 15:07:09 2019 -0800
 
@@ -32975,7 +36021,7 @@
  1 file changed, 1 insertion(+), 1 deletion(-)
 
 commit d983c529b66b530715e9c813c69e699b1d8029d3
-Merge: 55d1d7c8 e6ffcc59
+Merge: 55d1d7c8b e6ffcc590
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Wed Jan 30 17:17:59 2019 -0500
 
@@ -33258,7 +36304,7 @@
  5 files changed, 74 insertions(+), 13 deletions(-)
 
 commit b3799007554f2909170df941b07c72f7dc02dfcd
-Merge: c6856443 fe532923
+Merge: c68564438 fe5329231
 Author: Michiharu Ariza <ariza at adobe.com>
 Date:   Tue Jan 29 12:19:57 2019 -0800
 
@@ -33277,7 +36323,7 @@
  4 files changed, 14 insertions(+), 15 deletions(-)
 
 commit 6cf25c2971aa9a7471b1cc00176ef36e9acacad4
-Merge: 71157a45 fe532923
+Merge: 71157a452 fe5329231
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Mon Jan 28 21:23:28 2019 -0500
 
@@ -33379,7 +36425,7 @@
  1 file changed, 2 insertions(+), 2 deletions(-)
 
 commit 073fa4ac5aff4ee72bbb38676bd351b5aa1ec167
-Merge: d592bd16 9a1df82e
+Merge: d592bd16c 9a1df82e3
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Mon Jan 28 14:35:41 2019 -0500
 
@@ -33564,7 +36610,7 @@
  2 files changed, 4 insertions(+), 4 deletions(-)
 
 commit ac90f17c552e5264ad0a9d17c50fac9008d6ebe7
-Merge: 090fe56d 60022ecc
+Merge: 090fe56dc 60022ecce
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Sat Jan 26 14:05:39 2019 +0100
 
@@ -33600,7 +36646,7 @@
  2 files changed, 12 insertions(+), 12 deletions(-)
 
 commit 090fe56dc6ef5f7afa297f2cb200418a520a2026
-Merge: 21c0713a 06358ae9
+Merge: 21c0713a1 06358ae97
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Fri Jan 25 15:34:03 2019 +0100
 
@@ -33616,7 +36662,7 @@
  1 file changed, 2 insertions(+)
 
 commit c685644386d1c88d6df6e024e56d61c792d94418
-Merge: 0bd0a331 e970de48
+Merge: 0bd0a3311 e970de48b
 Author: Michiharu Ariza <ariza at adobe.com>
 Date:   Thu Jan 24 13:19:18 2019 -0800
 
@@ -33670,7 +36716,7 @@
  3 files changed, 21 insertions(+), 37 deletions(-)
 
 commit 0bd0a3311cfded5ffa4d9d488d404558cf65e8ed
-Merge: 12cd3171 f60282c5
+Merge: 12cd3171b f60282c5b
 Author: Michiharu Ariza <ariza at adobe.com>
 Date:   Thu Jan 24 08:53:28 2019 -0800
 
@@ -33794,7 +36840,7 @@
  6 files changed, 30 insertions(+), 15 deletions(-)
 
 commit 12cd3171ba3b84eff9f359778fabcab8f66ce36e
-Merge: 261a7421 36fb2b4d
+Merge: 261a74218 36fb2b4da
 Author: Michiharu Ariza <ariza at adobe.com>
 Date:   Wed Jan 23 14:05:42 2019 -0800
 
@@ -37972,7 +41018,7 @@
  18 files changed, 211 insertions(+), 262 deletions(-)
 
 commit a33f238f8888cc969e1e393deda0518fb8dd6b13
-Merge: 7146718b 1e09add2
+Merge: 7146718be 1e09add23
 Author: Ebrahim Byagowi <ebrahim at gnu.org>
 Date:   Wed Dec 12 12:44:06 2018 +0330
 
@@ -38247,7 +41293,7 @@
  2 files changed, 7 insertions(+), 8 deletions(-)
 
 commit 6ad3fcddaf2ba8ebc9ad49ff9e7b33b60fcad16a
-Merge: f95324a3 ae087d10
+Merge: f95324a33 ae087d10c
 Author: Ebrahim Byagowi <ebrahim at gnu.org>
 Date:   Thu Dec 6 10:21:00 2018 +0330
 
@@ -38265,7 +41311,7 @@
  1 file changed, 0 insertions(+), 0 deletions(-)
 
 commit 1ccbdcf73bbc967f5f94c0bc7f7e869bd87d9fa0
-Merge: 14d29a10 f95324a3
+Merge: 14d29a104 f95324a33
 Author: Michiharu Ariza <ariza at adobe.com>
 Date:   Wed Dec 5 21:37:38 2018 -0800
 
@@ -38281,7 +41327,7 @@
  1 file changed, 5 insertions(+)
 
 commit f95324a3351c1f699214ad84d073268218ea83a3
-Merge: 6727c4b6 9d8f3b0d
+Merge: 6727c4b6f 9d8f3b0df
 Author: Ebrahim Byagowi <ebrahim at gnu.org>
 Date:   Thu Dec 6 08:33:44 2018 +0330
 
@@ -38290,7 +41336,7 @@
     [CFF] oss-fuzz issue 11713 (CFF2VariationStore::serialize)
 
 commit 6727c4b6f0356b08803b4d5cde608ec004e3533f
-Merge: d9dabc00 34e3ef8f
+Merge: d9dabc00e 34e3ef8ff
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Wed Dec 5 17:37:21 2018 -0800
 
@@ -38317,7 +41363,7 @@
  1 file changed, 1 insertion(+), 1 deletion(-)
 
 commit 34e3ef8ff394f281b8d7e2c08f346a9495692edc
-Merge: 72d8f763 d9dabc00
+Merge: 72d8f7636 d9dabc00e
 Author: Michiharu Ariza <ariza at adobe.com>
 Date:   Wed Dec 5 15:50:05 2018 -0800
 
@@ -38333,7 +41379,7 @@
  1 file changed, 0 insertions(+), 0 deletions(-)
 
 commit d9dabc00e9278a346e85538212c126da7e610d55
-Merge: 81cfd3c7 010e2ddb
+Merge: 81cfd3c77 010e2ddb3
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Wed Dec 5 15:39:34 2018 -0800
 
@@ -38342,7 +41388,7 @@
     [CFF] fix oss-fuzz issue 11674: parse_bcd
 
 commit 81cfd3c775dbc470f57d7fe2775cc068ffa367b6
-Merge: 8394a6cb 6708c559
+Merge: 8394a6cb2 6708c5595
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Wed Dec 5 15:37:15 2018 -0800
 
@@ -38382,7 +41428,7 @@
  1 file changed, 0 insertions(+), 0 deletions(-)
 
 commit 2cb9d4c183afc838ecf2ba0d47814e9eaa6f09c6
-Merge: a5fa843c 8394a6cb
+Merge: a5fa843c7 8394a6cb2
 Author: Michiharu Ariza <ariza at adobe.com>
 Date:   Wed Dec 5 11:25:29 2018 -0800
 
@@ -38437,7 +41483,7 @@
  3 files changed, 88 insertions(+), 2 deletions(-)
 
 commit 79e7e3445efef2dc57f8a10c7e355e802af08868
-Merge: cf4b7db6 78f639b8
+Merge: cf4b7db6b 78f639b8b
 Author: Ebrahim Byagowi <ebrahim at gnu.org>
 Date:   Wed Dec 5 13:25:18 2018 +0330
 
@@ -38446,7 +41492,7 @@
     [CFF] fix for oss-fuzz 11657: Charset overrun
 
 commit cf4b7db6b1e01c11d7a8a26d95cf947935a234a7
-Merge: 32cc46c7 803d2f92
+Merge: 32cc46c75 803d2f92d
 Author: Ebrahim Byagowi <ebrahim at gnu.org>
 Date:   Wed Dec 5 13:23:23 2018 +0330
 
@@ -38573,7 +41619,7 @@
  1 file changed, 2 insertions(+), 14 deletions(-)
 
 commit 803d2f92dca329a84d92c224a73e13906e8b8d56
-Merge: 6ce8d10b c775adc1
+Merge: 6ce8d10b4 c775adc13
 Author: Michiharu Ariza <ariza at adobe.com>
 Date:   Tue Dec 4 11:01:26 2018 -0800
 
@@ -38609,7 +41655,7 @@
  2 files changed, 3 insertions(+), 2 deletions(-)
 
 commit c775adc1383f72f02b1329628b3eba1dc377a0f7
-Merge: c968869f 04f2ca94
+Merge: c968869f2 04f2ca942
 Author: Ebrahim Byagowi <ebrahim at gnu.org>
 Date:   Tue Dec 4 21:30:07 2018 +0330
 
@@ -38636,7 +41682,7 @@
  1 file changed, 1 insertion(+), 2 deletions(-)
 
 commit c968869f212dbfcb86d42fb36049328521cbf00c
-Merge: 8c05b955 c48f53d3
+Merge: 8c05b955e c48f53d30
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Tue Dec 4 04:14:13 2018 -0500
 
@@ -38696,7 +41742,7 @@
  1 file changed, 13 insertions(+), 71 deletions(-)
 
 commit 8c05b955eb4aa088b2b5df9b6415863486eaf59c
-Merge: d19b1680 01f628cf
+Merge: d19b1680b 01f628cf5
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Mon Dec 3 14:30:51 2018 -0500
 
@@ -38918,7 +41964,7 @@
  6 files changed, 9372 deletions(-)
 
 commit 5e64e0f53259dbc0a3ea8e220ded15e85bbc1782
-Merge: 09096aa8 d8c69137
+Merge: 09096aa89 d8c691376
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Fri Nov 30 22:40:54 2018 -0500
 
@@ -38954,7 +42000,7 @@
  5 files changed, 8 insertions(+), 8 deletions(-)
 
 commit 2c859b3880868b30823eb00bed90dc0de873628b
-Merge: 9483da14 bb72de66
+Merge: 9483da145 bb72de66d
 Author: Michiharu Ariza <ariza at adobe.com>
 Date:   Fri Nov 30 18:47:34 2018 -0800
 
@@ -38961,7 +42007,7 @@
     Merge branch 'master' into cff-subset
 
 commit bb72de66ddf3ae9ae53cf68642cb228e88aa64f5
-Merge: fedd8e6c fb059082
+Merge: fedd8e6c1 fb0590821
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Fri Nov 30 21:36:35 2018 -0500
 
@@ -39060,7 +42106,7 @@
  1 file changed, 2 insertions(+), 2 deletions(-)
 
 commit 9ae954f43ad1eb703d54db98ce46157370b71a9c
-Merge: 471db3aa fedd8e6c
+Merge: 471db3aa6 fedd8e6c1
 Author: Michiharu Ariza <ariza at adobe.com>
 Date:   Fri Nov 30 15:00:52 2018 -0800
 
@@ -39152,7 +42198,7 @@
  1 file changed, 2 insertions(+), 2 deletions(-)
 
 commit 67fd94da98f950b5feb719ac805f2a45379fc935
-Merge: abd81ed4 ae79fdaa
+Merge: abd81ed4f ae79fdaa7
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Fri Nov 30 11:53:30 2018 -0500
 
@@ -39486,7 +42532,7 @@
  1 file changed, 2 insertions(+), 2 deletions(-)
 
 commit 0bcb1de1265368a27e53c6d935c965cbcb4130a0
-Merge: e0307de8 a85886fc
+Merge: e0307de81 a85886fc7
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Thu Nov 29 10:39:18 2018 -0500
 
@@ -39513,7 +42559,7 @@
  1 file changed, 9 insertions(+)
 
 commit 32d291ae899eb095500052bed2a22e5255a34838
-Merge: 1ecbf4d3 949655aa
+Merge: 1ecbf4d3e 949655aa7
 Author: Michiharu Ariza <ariza at adobe.com>
 Date:   Wed Nov 28 16:27:45 2018 -0800
 
@@ -39520,7 +42566,7 @@
     Merge branch 'master' into cff-subset
 
 commit 949655aa7853a4513af6b5247b9822be38f5d322
-Merge: 7b78d223 d3d0f15f
+Merge: 7b78d2233 d3d0f15f7
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Wed Nov 28 17:21:57 2018 -0500
 
@@ -39573,7 +42619,7 @@
  2 files changed, 15 insertions(+), 1 deletion(-)
 
 commit 9e4f03b6ed80a81f8aee5ba93564f5eabab4299c
-Merge: 19863c80 a3267cf8
+Merge: 19863c805 a3267cf80
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Wed Nov 28 15:08:01 2018 -0500
 
@@ -39620,7 +42666,7 @@
  2 files changed, 33 insertions(+), 36 deletions(-)
 
 commit 987f4187722a05e3f360b85c66309a351fc5d6ad
-Merge: 1042d9fb 4e2a03b6
+Merge: 1042d9fbc 4e2a03b6b
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Tue Nov 27 17:40:32 2018 -0500
 
@@ -41097,7 +44143,7 @@
  1 file changed, 17 insertions(+), 2 deletions(-)
 
 commit 992b7128656e72f935089dc2e12c2d2a25511886
-Merge: c9cc96c0 018ba46e
+Merge: c9cc96c0c 018ba46e4
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Fri Nov 23 13:49:34 2018 -0500
 
@@ -41184,7 +44230,7 @@
  1 file changed, 4 insertions(+), 4 deletions(-)
 
 commit 8280459e74cff2dec3de012abd309cda9578b759
-Merge: e4a4555d 3c7792ca
+Merge: e4a4555d1 3c7792ca3
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Thu Nov 22 22:39:12 2018 -0500
 
@@ -41576,7 +44622,7 @@
  1 file changed, 2 insertions(+), 2 deletions(-)
 
 commit f961c1eb88af0d178e5d3431b9d57bdf79669488
-Merge: ecdceea8 264439c6
+Merge: ecdceea86 264439c6c
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Wed Nov 21 17:27:27 2018 -0500
 
@@ -41595,7 +44641,7 @@
  2 files changed, 1 insertion(+)
 
 commit ecdceea861952be003e1d435aa3282a4e3e200a9
-Merge: b89c7fd3 b3d5b0a5
+Merge: b89c7fd3d b3d5b0a5d
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Wed Nov 21 16:12:32 2018 -0500
 
@@ -41690,7 +44736,7 @@
  1 file changed, 14 insertions(+), 13 deletions(-)
 
 commit 1ecbf4d3e3de7edc86651c6f805788747d6d89af
-Merge: 515f1a16 064f703c
+Merge: 515f1a161 064f703c7
 Author: Michiharu Ariza <ariza at adobe.com>
 Date:   Tue Nov 20 17:19:05 2018 -0800
 
@@ -41697,7 +44743,7 @@
     Merge branch 'master' into cff-subset
 
 commit 064f703c7ac5a28803a8221720e922ea6dbd2505
-Merge: be1828da 82951182
+Merge: be1828daa 829511827
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Tue Nov 20 16:29:30 2018 -0500
 
@@ -41882,7 +44928,7 @@
  1 file changed, 1 insertion(+), 1 deletion(-)
 
 commit 515f1a16140f78c9ec379854851f77a1b44af145
-Merge: a6da9b94 e3a1a835
+Merge: a6da9b941 e3a1a8350
 Author: Michiharu Ariza <ariza at adobe.com>
 Date:   Fri Nov 16 17:38:47 2018 -0800
 
@@ -42037,7 +45083,7 @@
  2 files changed, 12 insertions(+), 3 deletions(-)
 
 commit b403be8ad98ffd2dbe95dad73e96c7ed1295d9fc
-Merge: b67a7c73 50d1a41c
+Merge: b67a7c731 50d1a41c0
 Author: Michiharu Ariza <ariza at adobe.com>
 Date:   Fri Nov 16 12:29:18 2018 -0800
 
@@ -42263,7 +45309,7 @@
  2 files changed, 10 insertions(+), 5 deletions(-)
 
 commit c37aecd41c5b55e5ef496f3c4cc255a1e2ce7f9f
-Merge: ecdb77f0 cabe433f
+Merge: ecdb77f0a cabe433fb
 Author: Michiharu Ariza <ariza at adobe.com>
 Date:   Thu Nov 15 11:03:46 2018 -0800
 
@@ -42317,7 +45363,7 @@
  7 files changed, 43 insertions(+), 29 deletions(-)
 
 commit 892ab37e7c9580e35b35a4d82a99e2ea73ac7b0b
-Merge: 3787c078 7867c2ba
+Merge: 3787c0785 7867c2bad
 Author: Michiharu Ariza <ariza at adobe.com>
 Date:   Wed Nov 14 13:54:07 2018 -0800
 
@@ -42376,7 +45422,7 @@
  1 file changed, 1 insertion(+), 1 deletion(-)
 
 commit a9c27d576ffe4452d1a3dae73964a8f4d6dcc088
-Merge: 3c3eb5ea e543e1a0
+Merge: 3c3eb5ea9 e543e1a08
 Author: Ebrahim Byagowi <ebrahim at gnu.org>
 Date:   Wed Nov 14 08:29:17 2018 +0330
 
@@ -42418,7 +45464,7 @@
  1 file changed, 10 insertions(+), 4 deletions(-)
 
 commit 086235f59310ed77542d4916d31a4285c68630ff
-Merge: 2092f595 c565fc3f
+Merge: 2092f595c c565fc3fb
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Tue Nov 13 19:50:25 2018 -0500
 
@@ -42427,7 +45473,7 @@
     Change USE Category for Grantha Virama
 
 commit 2092f595c7a4c591cace41cb99d31620fa6d5fa4
-Merge: 475be9d5 eee5b5ed
+Merge: 475be9d5c eee5b5ed0
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Tue Nov 13 19:49:06 2018 -0500
 
@@ -42721,7 +45767,7 @@
  2 files changed, 1 insertion(+), 1 deletion(-)
 
 commit 41a8bc7fd9399def8f580b02627a77f3972cc0e9
-Merge: 0dfa584c 77bd0a64
+Merge: 0dfa584cb 77bd0a645
 Author: Michiharu Ariza <ariza at adobe.com>
 Date:   Mon Nov 12 08:49:00 2018 -0800
 
@@ -43115,7 +46161,7 @@
  5 files changed, 20 insertions(+), 13 deletions(-)
 
 commit fb2a037f54f3cd323a447925f6534eccd1c709c1
-Merge: 87984165 b4c61130
+Merge: 879841658 b4c611303
 Author: Michiharu Ariza <ariza at adobe.com>
 Date:   Sat Nov 10 16:23:11 2018 -0800
 
@@ -43185,7 +46231,7 @@
  1 file changed, 5 insertions(+), 3 deletions(-)
 
 commit 5547bfa9f2815df727fa524b0ea0f136a6f955b7
-Merge: 3a9fa8c0 1d82b476
+Merge: 3a9fa8c02 1d82b4761
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Sat Nov 10 15:35:12 2018 -0500
 
@@ -43278,7 +46324,7 @@
  2 files changed, 5 insertions(+), 2 deletions(-)
 
 commit f51bb6ee7bd4ebca9b432851adc527ec086360fe
-Merge: 2d987110 b986fead
+Merge: 2d987110c b986fead0
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Thu Nov 8 14:42:40 2018 -0500
 
@@ -43333,7 +46379,7 @@
  2 files changed, 12 insertions(+), 11 deletions(-)
 
 commit 26c291aaa023d31c793b6f505c76e0dd7acbff9b
-Merge: 417963dd f9042384
+Merge: 417963dd9 f90423847
 Author: Michiharu Ariza <ariza at adobe.com>
 Date:   Thu Nov 8 09:06:49 2018 -0800
 
@@ -43414,7 +46460,7 @@
  1 file changed, 13 insertions(+), 11 deletions(-)
 
 commit 517a1bac97b6273e03562deefcca129648698c31
-Merge: 9d502769 b18a56a2
+Merge: 9d5027696 b18a56a29
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Wed Nov 7 18:40:48 2018 -0500
 
@@ -43432,7 +46478,7 @@
  1 file changed, 4 insertions(+)
 
 commit 4d740206943ecb72e4be7cc4815e0a3aa3edaa9d
-Merge: e0c30b96 9d502769
+Merge: e0c30b961 9d5027696
 Author: Michiharu Ariza <ariza at adobe.com>
 Date:   Wed Nov 7 15:09:30 2018 -0800
 
@@ -43439,7 +46485,7 @@
     Merge branch 'master' into cff-subset
 
 commit e0c30b961de87d38bff8dd49e86785a5b74fcad3
-Merge: 0996c0ff ae8fd0db
+Merge: 0996c0ff6 ae8fd0dbf
 Author: Michiharu Ariza <ariza at adobe.com>
 Date:   Wed Nov 7 15:08:55 2018 -0800
 
@@ -44245,7 +47291,7 @@
  1 file changed, 2 insertions(+), 2 deletions(-)
 
 commit 43ee0e4d006ce7b4ade4483f2c8ec3d39723fc94
-Merge: ec6817c1 bfafe208
+Merge: ec6817c1b bfafe208d
 Author: Michiharu Ariza <ariza at adobe.com>
 Date:   Tue Nov 6 09:57:17 2018 -0800
 
@@ -44694,7 +47740,7 @@
  1 file changed, 2 insertions(+)
 
 commit 1682d1bbecaeeddc8a1678a01c57c0e0023bf7c4
-Merge: d8fadec0 b605db2f
+Merge: d8fadec09 b605db2f6
 Author: Michiharu Ariza <ariza at adobe.com>
 Date:   Sun Nov 4 13:25:41 2018 -0800
 
@@ -45062,7 +48108,7 @@
  3 files changed, 4 insertions(+), 4 deletions(-)
 
 commit 481fdfdc23f557400ad3aceeceeab07add78f005
-Merge: 1bc710a8 2840a104
+Merge: 1bc710a8c 2840a104c
 Author: Michiharu Ariza <ariza at adobe.com>
 Date:   Fri Nov 2 15:28:09 2018 -0700
 
@@ -45324,7 +48370,7 @@
  7 files changed, 22 insertions(+), 26 deletions(-)
 
 commit e600e5440b3b77294df47fae947758137ea02501
-Merge: 82248b92 de96e5c8
+Merge: 82248b928 de96e5c81
 Author: Michiharu Ariza <ariza at adobe.com>
 Date:   Thu Nov 1 16:13:56 2018 -0700
 
@@ -46466,7 +49512,7 @@
  3 files changed, 8 insertions(+), 9 deletions(-)
 
 commit 1dfe964378e97e45eedf9db9b9a7f675fe38c0bf
-Merge: f10252b4 9c692e5b
+Merge: f10252b4b 9c692e5b8
 Author: Ebrahim Byagowi <ebrahim at gnu.org>
 Date:   Mon Oct 29 12:34:33 2018 +0330
 
@@ -47161,7 +50207,7 @@
  2 files changed, 4 insertions(+), 4 deletions(-)
 
 commit 524e854c15f9d6c50c5456ae0e188f039dcf153c
-Merge: 4ee3c827 8180c37d
+Merge: 4ee3c8272 8180c37df
 Author: Ebrahim Byagowi <ebrahim at gnu.org>
 Date:   Sat Oct 27 15:04:43 2018 +0330
 
@@ -48194,7 +51240,7 @@
  5 files changed, 6 insertions(+), 6 deletions(-)
 
 commit 2ebf36010206cebdbe58bab6edf4e3bc011b6479
-Merge: 36c2c374 94e421ab
+Merge: 36c2c374b 94e421abb
 Author: Michiharu Ariza <ariza at adobe.com>
 Date:   Thu Oct 25 13:05:06 2018 -0700
 
@@ -48421,7 +51467,7 @@
  2 files changed, 13 insertions(+), 14 deletions(-)
 
 commit e1241636d60a63cbfd741288716b55797a4dc8ee
-Merge: 960267fc cf92d657
+Merge: 960267fc4 cf92d6579
 Author: Michiharu Ariza <ariza at adobe.com>
 Date:   Tue Oct 23 11:25:51 2018 -0700
 
@@ -48901,7 +51947,7 @@
  5 files changed, 85 insertions(+), 60 deletions(-)
 
 commit 570b77f7d2b41262ccb20fadbee2c6b455cd06c6
-Merge: 857c5827 d440c8d3
+Merge: 857c58279 d440c8d3f
 Author: Michiharu Ariza <ariza at adobe.com>
 Date:   Mon Oct 22 13:06:47 2018 -0700
 
@@ -48956,7 +52002,7 @@
  9 files changed, 55 insertions(+), 4 deletions(-)
 
 commit 857c58279e82897ed69e8ade2f736073fa12883b
-Merge: 51fba41c b92b9d7e
+Merge: 51fba41cc b92b9d7e5
 Author: Michiharu Ariza <ariza at adobe.com>
 Date:   Mon Oct 22 09:57:20 2018 -0700
 
@@ -49187,7 +52233,7 @@
  1 file changed, 0 insertions(+), 0 deletions(-)
 
 commit 4fa94a3e39c21bc1dcdbbd5bda99bff1e1490b0e
-Merge: 217a3728 c110878c
+Merge: 217a3728b c110878cb
 Author: Ebrahim Byagowi <ebrahim at gnu.org>
 Date:   Sun Oct 21 11:36:41 2018 +0330
 
@@ -49346,7 +52392,7 @@
  2 files changed, 0 insertions(+), 0 deletions(-)
 
 commit 1e55e21dea78aaaddc0715e7df96fd198ec8f78a
-Merge: 964ae32a d084719f
+Merge: 964ae32aa d084719ff
 Author: Ebrahim Byagowi <ebrahim at gnu.org>
 Date:   Sat Oct 20 07:45:46 2018 +0330
 
@@ -49678,7 +52724,7 @@
  13 files changed, 0 insertions(+), 0 deletions(-)
 
 commit 51fba41cc958ded3afc6c1e738895b0a81993e18
-Merge: e555ed96 3d9a0306
+Merge: e555ed961 3d9a0306e
 Author: Michiharu Ariza <ariza at adobe.com>
 Date:   Thu Oct 18 13:08:42 2018 -0700
 
@@ -49965,7 +53011,7 @@
  18 files changed, 7 insertions(+), 7 deletions(-)
 
 commit 1f34388e8b40a77157f61c8e1a2fc7c4846c192e
-Merge: 9ade3e7b 2e7c7165
+Merge: 9ade3e7bb 2e7c71651
 Author: Michiharu Ariza <ariza at adobe.com>
 Date:   Wed Oct 17 09:34:48 2018 -0700
 
@@ -50428,7 +53474,7 @@
  1 file changed, 4 insertions(+), 3 deletions(-)
 
 commit 9ade3e7bb81be43b3c0811614b9b9533127894b0
-Merge: 6420ffe0 0f85edb7
+Merge: 6420ffe00 0f85edb77
 Author: Michiharu Ariza <ariza at adobe.com>
 Date:   Mon Oct 15 14:03:23 2018 -0700
 
@@ -50627,7 +53673,7 @@
  1 file changed, 3 insertions(+), 2 deletions(-)
 
 commit db0d83ddc73ecf50ec4489fc10eddf3fa5835ae2
-Merge: 9228db06 56b8dd17
+Merge: 9228db06f 56b8dd17f
 Author: Michiharu Ariza <ariza at adobe.com>
 Date:   Sat Oct 13 17:25:38 2018 -0700
 
@@ -50891,7 +53937,7 @@
  1 file changed, 4 deletions(-)
 
 commit fc0153a1d4903a57b21974cc8d0b0a82d7bc43dc
-Merge: 7d99a6ce c5510000
+Merge: 7d99a6cef c55100000
 Author: Michiharu Ariza <ariza at adobe.com>
 Date:   Fri Oct 12 12:16:50 2018 -0700
 
@@ -51421,7 +54467,7 @@
  2 files changed, 4 insertions(+), 4 deletions(-)
 
 commit ce6639cd27f79856466a5e8abf58f544f069e25d
-Merge: a6b6faf2 0b9d60e1
+Merge: a6b6faf2b 0b9d60e1a
 Author: Michiharu Ariza <ariza at adobe.com>
 Date:   Thu Oct 11 10:53:48 2018 -0700
 
@@ -51675,7 +54721,7 @@
  1 file changed, 10 insertions(+), 5 deletions(-)
 
 commit b5aa5dbb1158a5dfba29f7b119df9b4b319e8489
-Merge: af61c3b1 ab1f30bd
+Merge: af61c3b10 ab1f30bd0
 Author: Michiharu Ariza <ariza at adobe.com>
 Date:   Wed Oct 10 18:36:35 2018 -0700
 
@@ -52054,7 +55100,7 @@
  2 files changed, 100 insertions(+), 52 deletions(-)
 
 commit c06a5dff0b0f8d1c5aba53bcfd7fb0b680f1ca92
-Merge: 83c5298f 0537a401
+Merge: 83c5298f3 0537a4019
 Author: Michiharu Ariza <ariza at adobe.com>
 Date:   Tue Oct 9 22:00:10 2018 -0700
 
@@ -52427,7 +55473,7 @@
  1 file changed, 4 insertions(+), 10 deletions(-)
 
 commit f5f505b5120c316f06306318c6c2f0db4496ba04
-Merge: 8b349040 4035158d
+Merge: 8b349040e 4035158de
 Author: Michiharu Ariza <ariza at adobe.com>
 Date:   Tue Oct 9 10:10:35 2018 -0700
 
@@ -52583,7 +55629,7 @@
  3 files changed, 18 insertions(+), 27 deletions(-)
 
 commit 8b349040e92b8894a7f8a609fac8070bcb110f96
-Merge: df964a09 fc509165
+Merge: df964a093 fc5091658
 Author: Michiharu Ariza <ariza at adobe.com>
 Date:   Mon Oct 8 21:46:23 2018 -0700
 
@@ -52756,7 +55802,7 @@
  2 files changed, 4 insertions(+), 5 deletions(-)
 
 commit a90fd8b9feeee3b02d139f2e7db774766d7855cb
-Merge: b51418f5 e42cd58c
+Merge: b51418f59 e42cd58c9
 Author: Michiharu Ariza <ariza at adobe.com>
 Date:   Mon Oct 8 15:07:58 2018 -0700
 
@@ -53421,7 +56467,7 @@
  2 files changed, 2 insertions(+), 2 deletions(-)
 
 commit 8be5a9186be3ca4c50c73f372be4dbad08ac1863
-Merge: d7b384ad 5de2d9cd
+Merge: d7b384ad0 5de2d9cdb
 Author: Michiharu Ariza <ariza at adobe.com>
 Date:   Wed Oct 3 17:06:18 2018 -0700
 
@@ -53885,7 +56931,7 @@
  1 file changed, 174 insertions(+), 174 deletions(-)
 
 commit 9cdd70b344b9dc34a29aeca79028cbb5d949ca1d
-Merge: 3dd43f02 6353cc1f
+Merge: 3dd43f023 6353cc1f8
 Author: Michiharu Ariza <ariza at adobe.com>
 Date:   Tue Oct 2 13:43:21 2018 -0700
 
@@ -54268,7 +57314,7 @@
  5 files changed, 270 insertions(+), 177 deletions(-)
 
 commit 3dd43f0234febd434d89927adf2ee19f0489c5a7
-Merge: ab16b24c eb1e6028
+Merge: ab16b24cc eb1e60287
 Author: Michiharu Ariza <ariza at adobe.com>
 Date:   Mon Oct 1 10:22:06 2018 -0700
 
@@ -54961,7 +58007,7 @@
  1 file changed, 4 insertions(+), 1 deletion(-)
 
 commit 341b70a3b47ef3ceeb81e715937d6b2305258060
-Merge: bbf2a095 9e9a36ee
+Merge: bbf2a0954 9e9a36ee6
 Author: n8willis <n8willis at users.noreply.github.com>
 Date:   Thu Sep 27 11:15:22 2018 -0500
 
@@ -55297,7 +58343,7 @@
  1 file changed, 2 insertions(+), 2 deletions(-)
 
 commit 0604bf2b3846b200c56447ffe542bf69c0529a06
-Merge: 76e54d2b 45f5aa97
+Merge: 76e54d2bd 45f5aa979
 Author: Michiharu Ariza <ariza at adobe.com>
 Date:   Mon Sep 24 10:09:25 2018 -0700
 
@@ -55719,7 +58765,7 @@
  1 file changed, 1 insertion(+), 1 deletion(-)
 
 commit d050ab8d3e73debfb414fc8c9426180459150b61
-Merge: f0a4e0c2 388ab916
+Merge: f0a4e0c2c 388ab9164
 Author: Michiharu Ariza <ariza at adobe.com>
 Date:   Mon Sep 17 13:07:29 2018 -0700
 
@@ -56044,7 +59090,7 @@
  1 file changed, 1 insertion(+), 2 deletions(-)
 
 commit f2c4720ae696096d90493db218ef1283681561e7
-Merge: 1234a813 ca746f26
+Merge: 1234a8136 ca746f261
 Author: Michiharu Ariza <ariza at adobe.com>
 Date:   Thu Sep 13 12:44:00 2018 -0700
 
@@ -56339,7 +59385,7 @@
  2 files changed, 44 insertions(+), 15 deletions(-)
 
 commit 45e564a51917475ef6481825a6efb5b99bf1912e
-Merge: c6f75c30 d5c50927
+Merge: c6f75c304 d5c509272
 Author: Michiharu Ariza <ariza at adobe.com>
 Date:   Tue Sep 11 09:46:37 2018 -0700
 
@@ -56938,7 +59984,7 @@
  8 files changed, 18 insertions(+), 18 deletions(-)
 
 commit 1e88b1755c37eaa171c08f7bedb93f110238c80f
-Merge: 22b88632 ebe67137
+Merge: 22b88632d ebe67137a
 Author: Michiharu Ariza <ariza at adobe.com>
 Date:   Fri Sep 7 10:50:55 2018 -0700
 
@@ -56963,7 +60009,7 @@
  1 file changed, 3 insertions(+)
 
 commit 22b88632d5bd3676642b0a1d93f27e47438c140b
-Merge: 2a74536a 21bf1470
+Merge: 2a74536aa 21bf14705
 Author: Michiharu Ariza <ariza at adobe.com>
 Date:   Thu Sep 6 22:27:44 2018 -0700
 
@@ -57466,7 +60512,7 @@
  5 files changed, 15 insertions(+), 15 deletions(-)
 
 commit 8af9690ac7ce41fb1db878d556df5c4ee624eaa0
-Merge: 0ad081ec fee0f41c
+Merge: 0ad081ec3 fee0f41c6
 Author: Michiharu Ariza <ariza at adobe.com>
 Date:   Wed Aug 29 13:26:17 2018 -0700
 
@@ -58364,7 +61410,7 @@
  1 file changed, 2 insertions(+), 2 deletions(-)
 
 commit 25b8310b2a3e074c9d1d723ab6d10a29f8d189be
-Merge: 7aa23f35 22defe09
+Merge: 7aa23f359 22defe096
 Author: Michiharu Ariza <ariza at adobe.com>
 Date:   Wed Aug 15 15:00:55 2018 -0700
 
@@ -58756,7 +61802,7 @@
  1 file changed, 1 insertion(+), 1 deletion(-)
 
 commit a3a8c85b027779365bb33e2063221b4650fbac3b
-Merge: 145f371d 652cd45c
+Merge: 145f371d7 652cd45c6
 Author: Michiharu Ariza <ariza at adobe.com>
 Date:   Fri Aug 10 13:41:42 2018 -0700
 
@@ -59063,7 +62109,7 @@
  1 file changed, 1 insertion(+), 1 deletion(-)
 
 commit 161ece4c3097096f355dc5ea514320a8dc678bea
-Merge: e8d695eb 79e21984
+Merge: e8d695eba 79e21984b
 Author: Michiharu Ariza <ariza at adobe.com>
 Date:   Mon Aug 6 11:23:50 2018 -0700
 
@@ -59478,7 +62524,7 @@
  1 file changed, 14 insertions(+), 15 deletions(-)
 
 commit e2fd49e4779663e3138bd1990736a9cf850303bf
-Merge: 693ae804 d4d1bf81
+Merge: 693ae8047 d4d1bf817
 Author: Michiharu Ariza <ariza at adobe.com>
 Date:   Thu Aug 2 11:39:22 2018 -0700
 
@@ -60368,7 +63414,7 @@
  3 files changed, 72 insertions(+), 23 deletions(-)
 
 commit 161b642ec5babc7e4b81d41f725d81ad2caa9330
-Merge: 3a61c3e9 5edf454a
+Merge: 3a61c3e93 5edf454aa
 Author: Michiharu Ariza <ariza at adobe.com>
 Date:   Mon Jul 30 12:22:09 2018 -0700
 
@@ -60885,7 +63931,7 @@
  3 files changed, 26 insertions(+), 5 deletions(-)
 
 commit 524411224054b23bab4adad7343314df45c9c183
-Merge: 2aae617a 269eb456
+Merge: 2aae617a8 269eb4565
 Author: Cosimo Lupo <cosimo at anthrotype.com>
 Date:   Mon Jul 16 14:42:43 2018 +0200
 
@@ -61202,7 +64248,7 @@
  1 file changed, 1 insertion(+)
 
 commit bf9e9676dda686f5b76826b4e3148f4a0b512e3c
-Merge: 46d8f0d5 53f73409
+Merge: 46d8f0d55 53f73409a
 Author: Cosimo Lupo <cosimo at anthrotype.com>
 Date:   Mon Jul 9 20:24:22 2018 +0200
 
@@ -61581,7 +64627,7 @@
  1 file changed, 0 insertions(+), 0 deletions(-)
 
 commit bbf2a09549a88bd52ac3db89a0ae93f3b71b3e37
-Merge: 8db058d2 35ce8f31
+Merge: 8db058d20 35ce8f31d
 Author: Nathan Willis <nwillis at glyphography.com>
 Date:   Mon Jun 25 13:02:11 2018 -0500
 
@@ -62993,7 +66039,7 @@
  1 file changed, 5 insertions(+), 5 deletions(-)
 
 commit 0644d92ef32b09e32d473c758d2a968f2d125628
-Merge: 2a2e28e7 3be050f0
+Merge: 2a2e28e70 3be050f07
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Tue May 8 15:21:09 2018 -0700
 
@@ -63902,7 +66948,7 @@
  3 files changed, 5 insertions(+), 5 deletions(-)
 
 commit 3737c652a5e0b6d73b6090dc6c3863008c9dc8fd
-Merge: 632713ba 8f4c1230
+Merge: 632713bab 8f4c12308
 Author: Ebrahim Byagowi <ebrahim at gnu.org>
 Date:   Fri Apr 13 23:19:19 2018 +0430
 
@@ -64973,7 +68019,7 @@
  1 file changed, 13 deletions(-)
 
 commit 791d80a1d42ce0bd7c5f0a3d3d10c562a6161a82
-Merge: d4907e83 22de9bf5
+Merge: d4907e83e 22de9bf56
 Author: Ebrahim Byagowi <ebrahim at gnu.org>
 Date:   Thu Mar 15 11:40:52 2018 +0330
 
@@ -65023,7 +68069,7 @@
  1 file changed, 12 insertions(+), 8 deletions(-)
 
 commit a12dd6f75d85cf29ed78182ac97a12ebbcf77375
-Merge: 28f25f32 7c43adab
+Merge: 28f25f32f 7c43adab6
 Author: Ebrahim Byagowi <ebrahim at gnu.org>
 Date:   Wed Mar 14 02:54:07 2018 +0330
 
@@ -65177,7 +68223,7 @@
  1 file changed, 1 insertion(+), 1 deletion(-)
 
 commit 743ef317619a57ebf5a75935db0eecccade5d5b7
-Merge: 9206762b 39b2f69f
+Merge: 9206762bb 39b2f69fa
 Author: Garret Rieger <grieger at google.com>
 Date:   Fri Mar 9 12:06:52 2018 -0700
 
@@ -65217,7 +68263,7 @@
  1 file changed, 34 insertions(+), 15 deletions(-)
 
 commit dbe552770fa7cec91bba750e0e81aaeae96b3caf
-Merge: 2ebf4c69 8548fa15
+Merge: 2ebf4c69b 8548fa152
 Author: Garret Rieger <grieger at google.com>
 Date:   Thu Mar 8 15:50:25 2018 -0700
 
@@ -65284,7 +68330,7 @@
  14 files changed, 18 insertions(+)
 
 commit 2ebf4c69b18452caa0c871aebec9785e80348166
-Merge: 1ab51480 869ccac5
+Merge: 1ab514805 869ccac5a
 Author: Garret Rieger <grieger at google.com>
 Date:   Thu Mar 8 14:41:59 2018 -0700
 
@@ -65323,7 +68369,7 @@
  2 files changed, 32 insertions(+)
 
 commit 1ab514805ced190efdabc2103e4800d40b248300
-Merge: 70ad69f2 362f2824
+Merge: 70ad69f24 362f28240
 Author: Garret Rieger <grieger at google.com>
 Date:   Wed Mar 7 12:36:00 2018 -0700
 
@@ -65722,7 +68768,7 @@
  1 file changed, 23 insertions(+), 2 deletions(-)
 
 commit 588a4e0f9b2d71362503a274de7200f3eb4367f7
-Merge: 55a4dfa3 b3f1a045
+Merge: 55a4dfa37 b3f1a045a
 Author: rsheeter <rsheeter at google.com>
 Date:   Wed Feb 28 13:52:29 2018 -0800
 
@@ -65760,7 +68806,7 @@
  1 file changed, 2 insertions(+), 2 deletions(-)
 
 commit 3821978bcd92cbdb607111452796e051c456f391
-Merge: 77227462 f671f7f0
+Merge: 772274625 f671f7f0a
 Author: Ebrahim Byagowi <ebrahim at gnu.org>
 Date:   Wed Feb 28 13:30:17 2018 +0330
 
@@ -65784,7 +68830,7 @@
  7 files changed, 122 insertions(+), 18 deletions(-)
 
 commit 772274625e9f17d726f2a1da8192ec3ec24793a3
-Merge: 0eec3315 5b9c2340
+Merge: 0eec33154 5b9c23404
 Author: Ebrahim Byagowi <ebrahim at gnu.org>
 Date:   Wed Feb 28 12:05:49 2018 +0330
 
@@ -65842,7 +68888,7 @@
  3 files changed, 3 insertions(+), 4 deletions(-)
 
 commit c8b230e4377bc8e80d37835a229511ce0e30cc47
-Merge: b3790a65 904dd7be
+Merge: b3790a65a 904dd7bee
 Author: Rod Sheeter <rsheeter at google.com>
 Date:   Tue Feb 27 17:25:32 2018 -0800
 
@@ -65932,7 +68978,7 @@
  2 files changed, 29 insertions(+), 6 deletions(-)
 
 commit 4c6023f861a4b87782c17ac626ffee7e93f15fc8
-Merge: d7633d0a 921b65cb
+Merge: d7633d0a4 921b65cbc
 Author: Garret Rieger <grieger at google.com>
 Date:   Tue Feb 27 17:06:27 2018 -0700
 
@@ -65997,7 +69043,7 @@
  2 files changed, 125 insertions(+), 139 deletions(-)
 
 commit 101850f9e6b9e0932fe1dd4169f88d6764c669c1
-Merge: 5967eaba f110c0c8
+Merge: 5967eaba7 f110c0c88
 Author: Ebrahim Byagowi <ebrahim at gnu.org>
 Date:   Tue Feb 27 20:15:54 2018 +0330
 
@@ -66004,7 +69050,7 @@
     Merge with master
 
 commit f110c0c8866c853c0d5a930564a2b69231a33322
-Merge: 4a1d51ef 0ad8c663
+Merge: 4a1d51ef1 0ad8c663e
 Author: Ebrahim Byagowi <ebrahim at gnu.org>
 Date:   Tue Feb 27 11:41:12 2018 +0330
 
@@ -66024,7 +69070,7 @@
  3 files changed, 35 insertions(+), 37 deletions(-)
 
 commit 4a1d51ef15a423706406f784a146078073147885
-Merge: d0caf7e5 903771b6
+Merge: d0caf7e5e 903771b6c
 Author: rsheeter <rsheeter at google.com>
 Date:   Mon Feb 26 20:23:41 2018 -0800
 
@@ -66043,7 +69089,7 @@
  2 files changed, 13 insertions(+), 12 deletions(-)
 
 commit d0caf7e5e3294c25230ed0e5580c647fa0f1a2c8
-Merge: 6c844ae8 44dc36dd
+Merge: 6c844ae8e 44dc36dd8
 Author: Garret Rieger <grieger at google.com>
 Date:   Mon Feb 26 19:24:18 2018 -0700
 
@@ -66350,7 +69396,7 @@
  5 files changed, 105 insertions(+), 92 deletions(-)
 
 commit 05699fd996ed9c0e5dde8918388ac188e58df1a7
-Merge: 83af6c23 3ebcd5a3
+Merge: 83af6c237 3ebcd5a38
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Sat Feb 24 12:01:54 2018 -0800
 
@@ -66435,7 +69481,7 @@
  2 files changed, 10 insertions(+), 4 deletions(-)
 
 commit d78393b5547135b8db0356b0ec14d5ed0d334768
-Merge: 1454d82a 83af6c23
+Merge: 1454d82a9 83af6c237
 Author: Rod Sheeter <rsheeter at google.com>
 Date:   Fri Feb 23 17:53:26 2018 -0800
 
@@ -66463,7 +69509,7 @@
  3 files changed, 21 insertions(+), 8 deletions(-)
 
 commit 83af6c237f2bfd66af76a8647a62b3d1ab996744
-Merge: 7e5e1feb dc5c7927
+Merge: 7e5e1feb6 dc5c7927e
 Author: Garret Rieger <grieger at google.com>
 Date:   Fri Feb 23 18:33:25 2018 -0700
 
@@ -66486,7 +69532,7 @@
  3 files changed, 43 insertions(+), 12 deletions(-)
 
 commit 7e5e1feb666d6a861b5cd64bf29a16e3854fb812
-Merge: ec2538c8 99967e21
+Merge: ec2538c88 99967e21c
 Author: Garret Rieger <grieger at google.com>
 Date:   Fri Feb 23 17:59:08 2018 -0700
 
@@ -66606,7 +69652,7 @@
  7 files changed, 117 insertions(+), 24 deletions(-)
 
 commit b1ec82105189053d648a798cf5b3ab2887046298
-Merge: e15e41ef c2e4713b
+Merge: e15e41ef1 c2e4713b5
 Author: Garret Rieger <grieger at google.com>
 Date:   Fri Feb 23 12:32:18 2018 -0700
 
@@ -66952,7 +69998,7 @@
  1 file changed, 41 insertions(+), 14 deletions(-)
 
 commit 73e20ec6e9ad86bea023fc8b6fc10287889ed048
-Merge: 6ae4013f 69e443b2
+Merge: 6ae4013f2 69e443b25
 Author: Garret Rieger <grieger at google.com>
 Date:   Tue Feb 20 17:34:59 2018 -0700
 
@@ -67223,7 +70269,7 @@
  4 files changed, 381 insertions(+)
 
 commit 279c70a5b36446f444e5d2f4ac1db7614c8a3db8
-Merge: e9164478 89b82814
+Merge: e91644786 89b82814b
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Sun Feb 18 14:04:33 2018 -0800
 
@@ -67272,7 +70318,7 @@
  1 file changed, 2 insertions(+), 3 deletions(-)
 
 commit 79d0d791b9ee920e1f687a93de5adf5d113cc829
-Merge: 21646cc4 97a71102
+Merge: 21646cc4a 97a711021
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Sun Feb 18 11:35:51 2018 -0800
 
@@ -67292,7 +70338,7 @@
  1 file changed, 2 insertions(+), 2 deletions(-)
 
 commit fe8f40a4180e7b02831a264c0b3c66763156abb6
-Merge: cd11107b 21646cc4
+Merge: cd11107bb 21646cc4a
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Sun Feb 18 10:45:33 2018 -0800
 
@@ -67551,7 +70597,7 @@
  1 file changed, 1 insertion(+)
 
 commit 926db874552519734fab6c04258887ea634f5324
-Merge: 882a3bf4 c7a633f9
+Merge: 882a3bf4a c7a633f95
 Author: rsheeter <rsheeter at google.com>
 Date:   Fri Feb 16 15:27:29 2018 -0800
 
@@ -67640,7 +70686,7 @@
  1 file changed, 1 insertion(+), 1 deletion(-)
 
 commit be0a01a67613f45db7f7e9be84cb883f0344c817
-Merge: 7acaa3b7 139c9928
+Merge: 7acaa3b78 139c9928f
 Author: Rod Sheeter <rsheeter at google.com>
 Date:   Fri Feb 16 06:01:41 2018 -0800
 
@@ -67805,7 +70851,7 @@
  1 file changed, 1 insertion(+)
 
 commit 5ae6526ef4aa9b3c943cad984dc2fff09cdf597b
-Merge: 2903b2f3 04c1ec2b
+Merge: 2903b2f35 04c1ec2b7
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Wed Feb 14 18:42:32 2018 -0800
 
@@ -68066,7 +71112,7 @@
  1 file changed, 4 insertions(+), 10 deletions(-)
 
 commit d008b62887afe631f50009f40e605c8456ddd011
-Merge: b0eefacf 109314cb
+Merge: b0eefacf4 109314cb5
 Author: Garret Rieger <grieger at google.com>
 Date:   Wed Feb 14 10:38:52 2018 -0800
 
@@ -69039,7 +72085,7 @@
  1 file changed, 6 insertions(+), 9 deletions(-)
 
 commit 570d523761b23a3c668d9071712d5f10944d21fc
-Merge: 71130a20 d18decd2
+Merge: 71130a20f d18decd20
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Sat Feb 10 13:24:22 2018 -0600
 
@@ -70002,7 +73048,7 @@
  1 file changed, 1 insertion(+), 6 deletions(-)
 
 commit fc1e82a5aef410138381bc8f5476dcff5679b464
-Merge: ae39fc81 2ea22893
+Merge: ae39fc817 2ea228935
 Author: Garret Rieger <grieger at google.com>
 Date:   Mon Feb 5 15:35:13 2018 -0800
 
@@ -70079,7 +73125,7 @@
  3 files changed, 7 insertions(+), 7 deletions(-)
 
 commit 257022b1789f928975b04b5d214bbe9192e11997
-Merge: 3615f344 edcd3b80
+Merge: 3615f344e edcd3b80e
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Sun Feb 4 20:01:35 2018 -0500
 
@@ -73168,7 +76214,7 @@
  1 file changed, 0 insertions(+), 0 deletions(-)
 
 commit 127bcc6ece4da64e807f652dd84a17c6a8c5e300
-Merge: 72bec1cd 8c0d1916
+Merge: 72bec1cd0 8c0d1916a
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Fri Jan 5 12:50:22 2018 +0000
 
@@ -75037,7 +78083,7 @@
  1 file changed, 3 insertions(+), 3 deletions(-)
 
 commit 0f78d78aae604cb8e61bd21785adb915da74626e
-Merge: b7982c9e 0feff4ba
+Merge: b7982c9e6 0feff4ba7
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Tue Oct 31 14:13:31 2017 -0600
 
@@ -75572,7 +78618,7 @@
  5 files changed, 143 insertions(+), 5 deletions(-)
 
 commit bf133497e53e8b1dcd22df62080d33e7f3d85b68
-Merge: fd786c76 49a41dc7
+Merge: fd786c768 49a41dc75
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Wed Oct 25 17:23:20 2017 -0600
 
@@ -75740,7 +78786,7 @@
  1 file changed, 6 insertions(+), 6 deletions(-)
 
 commit 57cf978fa314bd87405a2b133e58fcb116e574a6
-Merge: ce979454 6cc49762
+Merge: ce9794544 6cc49762c
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Sun Oct 22 18:24:59 2017 -0400
 
@@ -75756,7 +78802,7 @@
  1 file changed, 2 insertions(+), 2 deletions(-)
 
 commit 6cc49762c4fdfd0e2770a84d1b1f055acf42376f
-Merge: 8b9d9b71 19923279
+Merge: 8b9d9b71b 19923279a
 Author: ebraminio <ebrahim at gnu.org>
 Date:   Mon Oct 23 01:48:22 2017 +0330
 
@@ -75796,7 +78842,7 @@
  2 files changed, 14 insertions(+), 1 deletion(-)
 
 commit d59d5dc7d339deb45cc84cffd084b52752765a08
-Merge: ced86da7 3ee15a60
+Merge: ced86da7d 3ee15a603
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Sun Oct 22 17:08:29 2017 -0400
 
@@ -75812,7 +78858,7 @@
  1 file changed, 3 insertions(+), 3 deletions(-)
 
 commit bc1183aa6ba45a527084d391d6e7f801d6196060
-Merge: d45a2138 bfe0faf1
+Merge: d45a2138d bfe0faf1a
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Sun Oct 22 17:06:00 2017 -0400
 
@@ -75837,7 +78883,7 @@
  1 file changed, 1 insertion(+), 1 deletion(-)
 
 commit d45a2138d9d54eab158046d6503f1bb104efce25
-Merge: d8adaa97 41b18251
+Merge: d8adaa97f 41b182519
 Author: ebraminio <ebrahim at gnu.org>
 Date:   Sat Oct 21 10:19:55 2017 +0330
 
@@ -76392,7 +79438,7 @@
  1 file changed, 11 insertions(+), 7 deletions(-)
 
 commit 4f9a83ec2109b754a75c962e88117d063e6fed43
-Merge: fa48ccbe 40b05d7b
+Merge: fa48ccbe1 40b05d7b7
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Thu Oct 12 14:08:58 2017 +0200
 
@@ -76636,7 +79682,7 @@
  1 file changed, 1 insertion(+), 1 deletion(-)
 
 commit 7b23c286a71883ac3e5777a2dee262af48c76854
-Merge: 8d450dd1 a5ebe1d4
+Merge: 8d450dd18 a5ebe1d4a
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Wed Oct 11 13:35:32 2017 +0200
 
@@ -77032,7 +80078,7 @@
  4 files changed, 5 insertions(+), 1 deletion(-)
 
 commit ea772932d2430ebc7ea712a8c46ec2500966225d
-Merge: 771970ef c44657a0
+Merge: 771970efa c44657a05
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Tue Oct 3 13:25:44 2017 +0200
 
@@ -79020,7 +82066,7 @@
  1 file changed, 3 insertions(+)
 
 commit c8dfed8e1ee4ab64b6936f5c8561db0666e37647
-Merge: 7c47474f b435c7c4
+Merge: 7c47474f2 b435c7c46
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Wed Feb 8 14:36:18 2017 -0800
 
@@ -80945,7 +83991,7 @@
  1 file changed, 3 insertions(+)
 
 commit 8c854dc023b1f9e081a3bbd16416b88a4671c267
-Merge: bb9805f5 c3fa5d0e
+Merge: bb9805f54 c3fa5d0e0
 Author: Khaled Hosny <khaledhosny at eglug.org>
 Date:   Tue Oct 25 00:31:36 2016 +0300
 
@@ -80963,7 +84009,7 @@
  1 file changed, 1 deletion(-)
 
 commit bb9805f5419f18c7f5cab32d660fd4109c30f7cc
-Merge: 702d9f52 755a0c20
+Merge: 702d9f522 755a0c207
 Author: Ebrahim Byagowi <ebrahim at gnu.org>
 Date:   Sat Oct 22 12:23:05 2016 +0330
 
@@ -80991,7 +84037,7 @@
  2 files changed, 10 insertions(+)
 
 commit 702d9f522d1ac4797700f0ea056f69169b8d1a78
-Merge: 331c46c7 d8e2eb9e
+Merge: 331c46c79 d8e2eb9ee
 Author: Ebrahim Byagowi <ebrahim at gnu.org>
 Date:   Fri Oct 14 13:54:55 2016 +0330
 
@@ -81031,7 +84077,7 @@
  1 file changed, 2 insertions(+), 1 deletion(-)
 
 commit f6e194e77a2c34cd118b47c0d73a22afde85dfda
-Merge: 7201fdd0 bef240b3
+Merge: 7201fdd0a bef240b36
 Author: Ebrahim Byagowi <ebrahim at gnu.org>
 Date:   Tue Oct 11 17:23:41 2016 +0330
 
@@ -81101,7 +84147,7 @@
  1 file changed, 1 insertion(+), 1 deletion(-)
 
 commit 6d3e6abf0c6ad55dabae96c76b4da9ab14bf16ef
-Merge: f73a87d9 c3e21a66
+Merge: f73a87d9a c3e21a662
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Tue Sep 27 17:15:59 2016 +0200
 
@@ -81588,7 +84634,7 @@
  1 file changed, 3 insertions(+), 2 deletions(-)
 
 commit 547ddb0721365dca985aef5b759d08718f7c5f82
-Merge: bd1aac9c e7ecbba2
+Merge: bd1aac9c0 e7ecbba2c
 Author: Sascha Brawer <sascha at brawer.ch>
 Date:   Thu Aug 18 22:33:14 2016 +0200
 
@@ -81613,7 +84659,7 @@
  2 files changed, 18 insertions(+), 2 deletions(-)
 
 commit bd1aac9c0021a936058637424a478abf792533dd
-Merge: 18c19dd3 a0f1b44b
+Merge: 18c19dd34 a0f1b44b6
 Author: Sascha Brawer <sascha at brawer.ch>
 Date:   Thu Aug 18 13:59:38 2016 +0200
 
@@ -81868,7 +84914,7 @@
  1 file changed, 1 insertion(+), 1 deletion(-)
 
 commit 2f522fd485c2e946c9bce9e3828b6ff6247c59e4
-Merge: d3e2a06b e4d451ee
+Merge: d3e2a06b0 e4d451ee5
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Fri Jul 1 17:09:28 2016 -0700
 
@@ -81906,7 +84952,7 @@
  1 file changed, 9 insertions(+), 9 deletions(-)
 
 commit 46809dee30232d493539519b1bb527fa816c37db
-Merge: 70e72e5f 1bea49eb
+Merge: 70e72e5f6 1bea49eb4
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Thu Jun 30 09:41:03 2016 -0700
 
@@ -81915,7 +84961,7 @@
     Discard reconfigured CTFont if URL changes
 
 commit 1bea49eb4b7a94ab6222f9c3c40320cbdb247b2d
-Merge: 7aa3631d 70e72e5f
+Merge: 7aa3631dd 70e72e5f6
 Author: Dominik Röttsches <d-r at roettsches.de>
 Date:   Wed Jun 29 12:10:41 2016 +0200
 
@@ -81936,7 +84982,7 @@
  4 files changed, 13 insertions(+), 18 deletions(-)
 
 commit d8273aac19771033c5064a2f079c29d09a86e7c0
-Merge: abae93fa ae9054c7
+Merge: abae93fae ae9054c74
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Tue Jun 28 21:15:28 2016 -0700
 
@@ -81954,7 +85000,7 @@
  1 file changed, 1 insertion(+), 2 deletions(-)
 
 commit 7aa3631dd06af74a1fa9f0bfaa5f721876be817f
-Merge: f7da0486 abae93fa
+Merge: f7da0486e abae93fae
 Author: Dominik Röttsches <d-r at roettsches.de>
 Date:   Tue Jun 28 09:52:18 2016 +0200
 
@@ -81961,7 +85007,7 @@
     Merge branch 'master' into conflictingFontFix
 
 commit abae93faef32562f34a72981d252c848cc4f7565
-Merge: 07461d06 8179ff5d
+Merge: 07461d06d 8179ff5d7
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Mon Jun 27 14:33:27 2016 -0400
 
@@ -82044,7 +85090,7 @@
  2 files changed, 135 insertions(+), 217 deletions(-)
 
 commit f7da0486ed8884481d477ce08fcf928c4da9a0a3
-Merge: a0223274 07461d06
+Merge: a0223274b 07461d06d
 Author: Dominik Röttsches <d-r at roettsches.de>
 Date:   Mon Jun 20 10:25:43 2016 +0300
 
@@ -82082,7 +85128,7 @@
  1 file changed, 2 insertions(+), 1 deletion(-)
 
 commit fca0c61d67aa309fc824fb18f247493c2b7701ef
-Merge: 4b8de1ea 98835058
+Merge: 4b8de1ea8 988350586
 Author: Khaled Hosny <khaledhosny at eglug.org>
 Date:   Sun Jun 19 00:08:51 2016 +0300
 
@@ -82407,7 +85453,7 @@
  4 files changed, 132 insertions(+), 1 deletion(-)
 
 commit 9abaaac409b8e3a0a9182b67dc384133013f7878
-Merge: 2f560ee4 264b7a72
+Merge: 2f560ee44 264b7a728
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Wed Apr 27 03:38:24 2016 -0700
 
@@ -82440,7 +85486,7 @@
  1 file changed, 612 insertions(+)
 
 commit 264b7a728a41becfbf23ce258fc2a3af19d0cbbe
-Merge: 7e2da035 adafdcdd
+Merge: 7e2da035f adafdcddc
 Author: Khaled Hosny <khaledhosny at eglug.org>
 Date:   Wed Apr 27 03:48:23 2016 +0300
 
@@ -82521,7 +85567,7 @@
  1 file changed, 12 insertions(+), 6 deletions(-)
 
 commit 14bb4a56971fd45063cd6c1288d911627088abb2
-Merge: 1c625dff 5069062d
+Merge: 1c625dff2 5069062d0
 Author: Sascha Brawer <sascha at brawer.ch>
 Date:   Tue Apr 26 11:38:16 2016 +0200
 
@@ -82579,7 +85625,7 @@
  1 file changed, 2 insertions(+)
 
 commit ef476be80d773332e0c768a3465d99381d76edd9
-Merge: a0331b55 d3134a66
+Merge: a0331b55f d3134a66a
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Fri Apr 8 13:16:33 2016 -0700
 
@@ -82778,7 +85824,7 @@
  2 files changed, 20 insertions(+), 31 deletions(-)
 
 commit fef5dd9a72f326c160a7194f558749d24bac7283
-Merge: 01ea9eaa 5f995db1
+Merge: 01ea9eaac 5f995db10
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Sat Mar 12 19:15:15 2016 -0800
 
@@ -82823,7 +85869,7 @@
  2 files changed, 5 deletions(-)
 
 commit ce8ae9970102f83b67bb1e8e8b2bf894a0e26c07
-Merge: 731a430c 71248a84
+Merge: 731a430cd 71248a843
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Fri Mar 4 17:20:35 2016 -0800
 
@@ -83856,7 +86902,7 @@
  1 file changed, 1 insertion(+), 1 deletion(-)
 
 commit bdaa784bb610ec65626d63cc068a0958ff5005fc
-Merge: a168db47 f6ffba63
+Merge: a168db473 f6ffba634
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Wed Feb 10 11:11:36 2016 +0700
 
@@ -84000,7 +87046,7 @@
  3 files changed, 3 insertions(+), 3 deletions(-)
 
 commit b693992ea160b66541f678dc9be29b513c77a30b
-Merge: 9a6a33cc 498574e6
+Merge: 9a6a33ccb 498574e6c
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Tue Feb 2 12:33:32 2016 +0800
 
@@ -84028,7 +87074,7 @@
  2 files changed, 305 insertions(+)
 
 commit 9a6a33ccbea8a2e23e779bd955958fa41974c1c7
-Merge: d05b7833 146fe252
+Merge: d05b78332 146fe252c
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Mon Jan 18 12:47:18 2016 +0100
 
@@ -84226,7 +87272,7 @@
  1 file changed, 3 insertions(+), 1 deletion(-)
 
 commit 3a48c776701a919e11b067129586e40372d90d54
-Merge: 9230911f 4b4948d3
+Merge: 9230911fa 4b4948d36
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Sat Jan 2 00:59:14 2016 +0000
 
@@ -84260,7 +87306,7 @@
  1 file changed, 1 insertion(+), 1 deletion(-)
 
 commit 6f66f05757d3d5738571b3d4ee40afffb8f26ff9
-Merge: bfdf684f 9ab9f974
+Merge: bfdf684f7 9ab9f974d
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Fri Jan 1 16:44:01 2016 +0000
 
@@ -84282,7 +87328,7 @@
  5 files changed, 187 insertions(+), 81 deletions(-)
 
 commit bfdf684f7957645dd016fbf76700c5911c4bee2d
-Merge: d7ed6f50 85c2443b
+Merge: d7ed6f50b 85c2443b7
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Wed Dec 30 22:20:14 2015 +0100
 
@@ -84291,7 +87337,7 @@
     More docs
 
 commit d7ed6f50b4ff13a94701131913d931f13a4d1266
-Merge: b758e5ea a7f0e25d
+Merge: b758e5ea2 a7f0e25da
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Wed Dec 30 22:20:00 2015 +0100
 
@@ -84333,7 +87379,7 @@
  1 file changed, 1 insertion(+), 1 deletion(-)
 
 commit b758e5ea223eced0fde9a3e62d0fdf04c04914a1
-Merge: 266bfa37 8b1224f0
+Merge: 266bfa377 8b1224f0e
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Wed Dec 30 16:44:19 2015 +0100
 
@@ -84390,7 +87436,7 @@
  1 file changed, 27 insertions(+), 19 deletions(-)
 
 commit 8f31d0a94b27bb658aabe600472fc10bc47885f6
-Merge: 9d280cf4 fb192c26
+Merge: 9d280cf49 fb192c263
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Wed Dec 30 15:13:37 2015 +0100
 
@@ -84504,7 +87550,7 @@
  2 files changed, 1 insertion(+), 2 deletions(-)
 
 commit e75c1ffdf548185ce1f1df7937f0d028e5e40efe
-Merge: 6173c2a6 d25317f6
+Merge: 6173c2a6f d25317f67
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Fri Dec 25 18:21:08 2015 +0100
 
@@ -84847,7 +87893,7 @@
  1 file changed, 3 insertions(+), 3 deletions(-)
 
 commit 15f2c055c17c54b0a6ae6eef50dcda13c58cda75
-Merge: 49e72634 a13b023d
+Merge: 49e72634a a13b023db
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Mon Dec 14 14:19:03 2015 +0100
 
@@ -84886,7 +87932,7 @@
  1 file changed, 1 insertion(+), 1 deletion(-)
 
 commit e1d4d0f1dbd8518b5672245c05d73f22a9ed03ea
-Merge: 70b33eda 808d3fc0
+Merge: 70b33edae 808d3fc0e
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Thu Dec 10 16:56:07 2015 +0100
 
@@ -84957,7 +88003,7 @@
  1 file changed, 1 insertion(+), 1 deletion(-)
 
 commit dee0fbf9e2eac8b61730efc4978bc10c552b5227
-Merge: 255df680 a7ffe353
+Merge: 255df6801 a7ffe3535
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Mon Dec 7 10:44:08 2015 +0100
 
@@ -85002,7 +88048,7 @@
  2 files changed, 31 insertions(+), 1 deletion(-)
 
 commit 8c37556f730d7e961394075cd863f624af4c53c4
-Merge: 8e5f9026 f35b3e93
+Merge: 8e5f90265 f35b3e931
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Mon Dec 7 09:34:58 2015 +0100
 
@@ -85154,7 +88200,7 @@
  1 file changed, 1 insertion(+), 1 deletion(-)
 
 commit 766963adba6770dcd45de4417481ed8eda60a716
-Merge: b344af80 f798b8e2
+Merge: b344af80c f798b8e2d
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Tue Nov 24 15:38:43 2015 -0600
 
@@ -85163,7 +88209,7 @@
     Fix all VC++ warnings and errors
 
 commit b344af80ca95b9eddfd6017aa6ae103388d6b5f8
-Merge: 662acd26 835bbdc7
+Merge: 662acd26d 835bbdc7c
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Tue Nov 24 15:30:27 2015 -0600
 
@@ -85172,7 +88218,7 @@
     Enable use of compiler directives to export symbols
 
 commit 662acd26d10c38e96a9afcdaab2cb2979794966f
-Merge: b24e93e3 1979f6fe
+Merge: b24e93e3a 1979f6fed
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Tue Nov 24 15:29:44 2015 -0600
 
@@ -85191,7 +88237,7 @@
  2 files changed, 8 insertions(+), 1 deletion(-)
 
 commit 233944ac91bb81250c0e63150eecfedfaf09f590
-Merge: 5a24b1d2 d5382019
+Merge: 5a24b1d25 d53820191
 Author: Khaled Hosny <khaledhosny at eglug.org>
 Date:   Tue Nov 24 18:37:35 2015 +0400
 
@@ -85276,7 +88322,7 @@
  1 file changed, 1 insertion(+), 1 deletion(-)
 
 commit a6991813659376a6a11c00a9f67d85b4f7ba9b5d
-Merge: 1dc32ea4 f19c6db1
+Merge: 1dc32ea4d f19c6db18
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Fri Nov 20 13:28:42 2015 -0800
 
@@ -85494,7 +88540,7 @@
  1 file changed, 11 insertions(+), 11 deletions(-)
 
 commit dde8cc87bd880bd35baf764820f4c85bd0a58696
-Merge: e97835ad 167c3271
+Merge: e97835ad4 167c32717
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Tue Nov 17 18:40:10 2015 -0800
 
@@ -85589,7 +88635,7 @@
  1 file changed, 3 insertions(+)
 
 commit d5f0d7c9fb14255388ab616f56e178cb7ca10ec2
-Merge: 04ff23e7 529a9331
+Merge: 04ff23e73 529a93312
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Sat Nov 7 07:50:58 2015 -0800
 
@@ -86521,7 +89567,7 @@
  1 file changed, 1 insertion(+)
 
 commit 5d7a30fde09320c2c62c7c73570ce3f2e298eba6
-Merge: 904b0dc3 2fb95a0c
+Merge: 904b0dc38 2fb95a0c9
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Tue Oct 20 15:19:41 2015 -0200
 
@@ -86530,7 +89576,7 @@
     Add BUILD.md based on harfbuzz.org docs
 
 commit 904b0dc3811464cf61dc9457664de95ee4f61a86
-Merge: 86cadc2c ba096bcc
+Merge: 86cadc2cd ba096bcc2
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Mon Oct 19 16:59:43 2015 -0200
 
@@ -87184,7 +90230,7 @@
  8 files changed, 14 insertions(+), 7 deletions(-)
 
 commit 3899795fa3c3e058e3885ec7a6638f0597a752cc
-Merge: d2059652 01e16e88
+Merge: d20596528 01e16e88f
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Mon Aug 31 10:46:01 2015 +0100
 
@@ -87233,7 +90279,7 @@
  1 file changed, 1 insertion(+), 1 deletion(-)
 
 commit c424b41705b50055c7f92b268cf78a2680af73af
-Merge: 31594b98 5470e744
+Merge: 31594b98a 5470e744d
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Mon Aug 31 09:53:16 2015 +0100
 
@@ -87538,7 +90584,7 @@
  1 file changed, 1 insertion(+), 1 deletion(-)
 
 commit 5c99cf93d6242803bddcac2ca8300fdec7e0f8a7
-Merge: 8ad89f05 539a610e
+Merge: 8ad89f057 539a610e2
 Author: ThePhD <phdofthehouse at gmail.com>
 Date:   Fri Aug 14 01:02:00 2015 -0400
 
@@ -87609,7 +90655,7 @@
  1 file changed, 1 insertion(+), 1 deletion(-)
 
 commit 02d6439f420d959183dd446abd0b0118ee1ee061
-Merge: 9002c27b 160f6355
+Merge: 9002c27b2 160f63552
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Mon Aug 3 22:47:18 2015 +0300
 
@@ -87666,7 +90712,7 @@
  3 files changed, 13 insertions(+), 3 deletions(-)
 
 commit df6cb84449a473d540821e41fb5007b59644780f
-Merge: 2ed6be66 786ba458
+Merge: 2ed6be667 786ba4584
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Sun Jul 26 19:40:55 2015 +0200
 
@@ -88617,7 +91663,7 @@
  1 file changed, 4 insertions(+)
 
 commit 37c8daf724add4a41a06385e571277d137dc2a2f
-Merge: f1b44303 01c3a885
+Merge: f1b44303d 01c3a8854
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Mon Jun 1 13:27:37 2015 -0700
 
@@ -88721,7 +91767,7 @@
  1 file changed, 13 insertions(+), 13 deletions(-)
 
 commit fbecde3d5c5c6d5af315140e4966dc850388ad63
-Merge: 58015215 74139f98
+Merge: 580152153 74139f983
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Thu May 7 10:46:42 2015 -0700
 
@@ -88760,7 +91806,7 @@
  1 file changed, 1 insertion(+), 1 deletion(-)
 
 commit 42b00118eae46a5183e885e89e0856f41361f57e
-Merge: c60f3c8e cfeb0562
+Merge: c60f3c8e1 cfeb0562e
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Tue May 5 14:49:47 2015 -0700
 
@@ -88922,7 +91968,7 @@
  1 file changed, 11 insertions(+), 7 deletions(-)
 
 commit 76d57331117be8e0c2d4a2aee8341969b62b6888
-Merge: 89cbd4d9 9ee176ee
+Merge: 89cbd4d95 9ee176ee9
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Mon Apr 13 23:40:35 2015 -0700
 
@@ -88943,7 +91989,7 @@
  1 file changed, 1 insertion(+)
 
 commit 713f99ff6138b4149d9fd382f9af3ace01ee0da5
-Merge: 1086f21e 22524a51
+Merge: 1086f21e5 22524a514
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Fri Apr 10 14:34:05 2015 -0700
 
@@ -88963,7 +92009,7 @@
  1 file changed, 1 insertion(+), 1 deletion(-)
 
 commit 1086f21e546e2435d9da6024fd6afa7a36ba3707
-Merge: 125cb083 fe97b65a
+Merge: 125cb0834 fe97b65a5
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Fri Apr 10 12:21:04 2015 -0700
 
@@ -88970,7 +92016,7 @@
     Merge branch 'hb-fc'
 
 commit 125cb08345a7f27e565329d37093b1a60a41a403
-Merge: e8fd8393 855a5d7c
+Merge: e8fd83932 855a5d7cb
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Fri Apr 10 12:19:57 2015 -0700
 
@@ -89208,7 +92254,7 @@
  11 files changed, 11 insertions(+), 11 deletions(-)
 
 commit bfcddd32a674dd19fca1bf521e95466a0eec5179
-Merge: ce01ad7c 363ceec3
+Merge: ce01ad7c2 363ceec3f
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Mon Apr 6 14:41:32 2015 -0700
 
@@ -89262,7 +92308,7 @@
  1 file changed, 2 insertions(+), 2 deletions(-)
 
 commit 8886ab430ca68539cb318e175647e9f6973718b0
-Merge: e3671b8f a394bb66
+Merge: e3671b8f8 a394bb667
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Sun Mar 22 16:18:57 2015 -0400
 
@@ -89853,7 +92899,7 @@
  1 file changed, 4 insertions(+)
 
 commit faaae64bf28abdcdd15185374bc09a3809794118
-Merge: 7888a6b0 9768e651
+Merge: 7888a6b07 9768e651b
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Wed Feb 25 15:34:34 2015 -0800
 
@@ -90025,7 +93071,7 @@
  1 file changed, 1 insertion(+), 1 deletion(-)
 
 commit 70c25ee215635db23eb0757641bd372940c0d85d
-Merge: 28f5e0b2 f3537b62
+Merge: 28f5e0b2f f3537b620
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Sun Jan 25 13:06:03 2015 -0800
 
@@ -90203,7 +93249,7 @@
  1 file changed, 2 insertions(+)
 
 commit 3704628d1f124234324b5f2bdd5fdd61c14c7801
-Merge: 1aaa7d67 5eb939dd
+Merge: 1aaa7d679 5eb939ddf
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Mon Jan 19 16:15:00 2015 -0800
 
@@ -90318,7 +93364,7 @@
  1 file changed, 1 insertion(+), 2 deletions(-)
 
 commit 8cb41cb9508eb1bb6319e92f900cfe5e8a131be3
-Merge: 365c03fc fb85d618
+Merge: 365c03fc2 fb85d618f
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Sun Jan 4 20:32:18 2015 -0800
 
@@ -90339,7 +93385,7 @@
  4 files changed, 10 insertions(+), 4 deletions(-)
 
 commit 365c03fc2bcdb4098314a0e123c46018fb882586
-Merge: c36c4a99 d1897a98
+Merge: c36c4a992 d1897a98d
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Sat Jan 3 21:55:30 2015 -0800
 
@@ -91733,7 +94779,7 @@
  2 files changed, 20 insertions(+), 21 deletions(-)
 
 commit 0a5ae9336231c4d189e1682e4fd9c9c4552b8bbf
-Merge: ac53443f 6ab6be32
+Merge: ac53443f1 6ab6be32c
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Sat Aug 2 15:00:34 2014 -0400
 
@@ -94895,7 +97941,7 @@
  1 file changed, 2 insertions(+), 1 deletion(-)
 
 commit 0596343bfeb80ad6b19d459654edf7dfded6affe
-Merge: 62cb28df 83d7e791
+Merge: 62cb28dfc 83d7e7915
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Wed Jan 22 04:43:51 2014 -0800
 
@@ -96779,7 +99825,7 @@
  1 file changed, 17 insertions(+), 41 deletions(-)
 
 commit 622bc3d829cab84c3a4148b88f2c91fee491ef39
-Merge: 3d2c4f0c d583df1e
+Merge: 3d2c4f0c2 d583df1e7
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Sun Sep 29 13:31:58 2013 -0700
 
@@ -97975,7 +101021,7 @@
  1 file changed, 2 insertions(+), 8 deletions(-)
 
 commit f5da11e0fa5adf8f782883dc5c30d8faaafc9c27
-Merge: 79d1007a 89312b74
+Merge: 79d1007a5 89312b741
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Sat Jun 22 08:04:05 2013 -0700
 
@@ -98409,7 +101455,7 @@
  1 file changed, 6 insertions(+), 4 deletions(-)
 
 commit fb502a22787f4110472771ef771619342e64577a
-Merge: b9408d24 9d9e72e9
+Merge: b9408d24f 9d9e72e94
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Thu May 23 15:54:52 2013 -0400
 
@@ -123360,7 +126406,7 @@
  11 files changed, 119 insertions(+), 160 deletions(-)
 
 commit 80af2812fb3b231ddcb4608ec13c6038a681c818
-Merge: c442672e 3109a86a
+Merge: c442672ec 3109a86ad
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Mon May 24 18:14:24 2010 +0100
 
@@ -123445,7 +126491,7 @@
  3 files changed, 88 insertions(+), 26 deletions(-)
 
 commit 72631c9d06b131d82080f212908e7d0b0266b841
-Merge: 1432ab15 1094a294
+Merge: 1432ab15c 1094a294f
 Author: Martin Hosken <martin_hosken at sil.org>
 Date:   Sat May 22 09:38:02 2010 +0100
 
@@ -125176,7 +128222,7 @@
  1 file changed, 2 insertions(+), 2 deletions(-)
 
 commit 6b84198f9d471defb6f55d44d4f5423df70b2a10
-Merge: 631d10b7 eaf29edb
+Merge: 631d10b72 eaf29edb8
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Mon May 3 22:46:52 2010 -0400
 
@@ -130857,7 +133903,7 @@
  14 files changed, 151 insertions(+), 56 deletions(-)
 
 commit ce48f03946bef895912019046bdbe62bb1301d0b
-Merge: 0e13beeb 2d15e72c
+Merge: 0e13beeb9 2d15e72c7
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Mon Nov 2 14:35:51 2009 -0500
 

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/Makefile.am
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/Makefile.am	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/Makefile.am	2021-04-17 22:31:16 UTC (rev 58898)
@@ -40,8 +40,7 @@
 	perf/texts/en-words.txt \
 	perf/texts/fa-monologue.txt \
 	perf/texts/fa-thelittleprince.txt \
-	meson-cc-tests/intel-atomic-primitives-test.c \
-	meson-cc-tests/solaris-atomic-operations.c \
+	mingw-configure.sh \
 	$(NULL)
 
 MAINTAINERCLEANFILES = \

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/NEWS
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/NEWS	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/NEWS	2021-04-17 22:31:16 UTC (rev 58898)
@@ -1,3 +1,18 @@
+Overview of changes leading to 2.8.0
+Tuesday, March 16, 2021
+====================================
+- Shape joining scripts other than Arabic/Syriac using the Universal Shaping Engine.
+  Previously these were shaped using the generalized Arabic shaper. (David Corbett)
+- Fix regression in shaping of U+0B55 ORIYA SIGN OVERLINE. (David Corbett)
+- Update language tags. (David Corbett)
+- Variations: reduce error: do not round each interpolated delta. (Just van Rossum) 
+- Documentation improvements. (Khaled Hosny, Nathan Willis)
+- Subsetter improvements: subsets most, if not all, lookup types now. (Garret Rieger, Qunxin Liu)
+- Fuzzer-found fixes and other improvements when memory failures happen. (Behdad)
+- Removed most atomic implementations now that we have C++11 atomic impl. (Behdad)
+- General codebase upkeep; using more C++11 features: constexpr constructors, etc. (Behdad)
+
+
 Overview of changes leading to 2.7.4
 Sunday, December 27, 2020
 ====================================

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/config.h.in
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/config.h.in	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/config.h.in	2021-04-17 22:31:16 UTC (rev 58898)
@@ -63,9 +63,6 @@
 /* Use hb-icu Unicode callbacks */
 #undef HAVE_ICU_BUILTIN
 
-/* Have Intel __sync_* atomic primitives */
-#undef HAVE_INTEL_ATOMIC_PRIMITIVES
-
 /* Define to 1 if you have the <inttypes.h> header file. */
 #undef HAVE_INTTYPES_H
 
@@ -87,15 +84,6 @@
 /* Have PTHREAD_PRIO_INHERIT. */
 #undef HAVE_PTHREAD_PRIO_INHERIT
 
-/* Define to 1 if you have the <sched.h> header file. */
-#undef HAVE_SCHED_H
-
-/* Have sched_yield */
-#undef HAVE_SCHED_YIELD
-
-/* Have Solaris __machine_*_barrier and atomic_* operations */
-#undef HAVE_SOLARIS_ATOMIC_OPS
-
 /* Define to 1 if you have the <stdbool.h> header file. */
 #undef HAVE_STDBOOL_H
 

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/configure.ac
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/configure.ac	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/configure.ac	2021-04-17 22:31:16 UTC (rev 58898)
@@ -1,6 +1,6 @@
 AC_PREREQ([2.64])
 AC_INIT([HarfBuzz],
-        [2.7.4],
+        [2.8.0],
         [https://github.com/harfbuzz/harfbuzz/issues/new],
         [harfbuzz],
         [http://harfbuzz.org/])
@@ -417,45 +417,6 @@
 
 dnl ===========================================================================
 
-AC_CACHE_CHECK([for Intel atomic primitives], hb_cv_have_intel_atomic_primitives, [
-	hb_cv_have_intel_atomic_primitives=false
-	AC_TRY_LINK([
-		void memory_barrier (void) { __sync_synchronize (); }
-		int atomic_add (int *i) { return __sync_fetch_and_add (i, 1); }
-		int mutex_trylock (int *m) { return __sync_lock_test_and_set (m, 1); }
-		void mutex_unlock (int *m) { __sync_lock_release (m); }
-		], [], hb_cv_have_intel_atomic_primitives=true
-	)
-])
-if $hb_cv_have_intel_atomic_primitives; then
-	AC_DEFINE(HAVE_INTEL_ATOMIC_PRIMITIVES, 1, [Have Intel __sync_* atomic primitives])
-fi
-
-dnl ===========================================================================
-
-AC_CACHE_CHECK([for Solaris atomic operations], hb_cv_have_solaris_atomic_ops, [
-	hb_cv_have_solaris_atomic_ops=false
-	AC_TRY_LINK([
-		#include <atomic.h>
-		/* This requires Solaris Studio 12.2 or newer: */
-		#include <mbarrier.h>
-		void memory_barrier (void) { __machine_rw_barrier (); }
-		int atomic_add (volatile unsigned *i) { return atomic_add_int_nv (i, 1); }
-		void *atomic_ptr_cmpxchg (volatile void **target, void *cmp, void *newval) { return atomic_cas_ptr (target, cmp, newval); }
-		], [], hb_cv_have_solaris_atomic_ops=true
-	)
-])
-if $hb_cv_have_solaris_atomic_ops; then
-	AC_DEFINE(HAVE_SOLARIS_ATOMIC_OPS, 1, [Have Solaris __machine_*_barrier and atomic_* operations])
-fi
-
-if test "$os_win32" = no && ! $have_pthread; then
-	AC_CHECK_HEADERS(sched.h)
-	AC_SEARCH_LIBS(sched_yield,rt,AC_DEFINE(HAVE_SCHED_YIELD, 1, [Have sched_yield]))
-fi
-
-dnl ===========================================================================
-
 AC_CONFIG_FILES([
 Makefile
 src/Makefile

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/meson.build
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/meson.build	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/meson.build	2021-04-17 22:31:16 UTC (rev 58898)
@@ -1,6 +1,6 @@
 project('harfbuzz', 'c', 'cpp',
   meson_version: '>= 0.47.0',
-  version: '2.7.4',
+  version: '2.8.0',
   default_options: [
     'cpp_eh=none',          # Just to support msvc, we are passing -fno-rtti also anyway
     'cpp_rtti=false',       # Just to support msvc, we are passing -fno-exceptions also anyway
@@ -285,9 +285,6 @@
 
   if thread_dep.found()
     conf.set('HAVE_PTHREAD', 1)
-  else
-    check_headers += ['sched.h']
-    check_funcs += ['sched_yield', {'link_with': 'rt'}]
   endif
 endif
 
@@ -337,14 +334,6 @@
   endif
 endforeach
 
-if cpp.links(files('meson-cc-tests/intel-atomic-primitives-test.c'), name: 'Intel atomics')
-  conf.set('HAVE_INTEL_ATOMIC_PRIMITIVES', 1)
-endif
-
-if cpp.links(files('meson-cc-tests/solaris-atomic-operations.c'), name: 'Solaris atomic ops')
-  conf.set('HAVE_SOLARIS_ATOMIC_OPS', 1)
-endif
-
 subdir('src')
 subdir('util')
 
@@ -352,16 +341,8 @@
   subdir('test')
 endif
 
-# get_option('wrap_mode') isn't available in <0.49 and this
-# is just an internal tool
-if meson.version().version_compare('>=0.49')
-  if (not get_option('benchmark').disabled() and
-      get_option('wrap_mode') != 'nodownload' and
-      host_machine.system() != 'windows' and
-      not meson.is_subproject() and
-      not meson.is_cross_build())
-    subdir('perf')
-  endif
+if not get_option('benchmark').disabled()
+  subdir('perf')
 endif
 
 if not get_option('docs').disabled()
@@ -402,7 +383,12 @@
     {'Documentation': conf.get('HAVE_GTK_DOC', 0) == 1,
      'GObject bindings': conf.get('HAVE_GOBJECT', 0) == 1,
      'Introspection': conf.get('HAVE_INTROSPECTION', 0) == 1,
+     'Experimental APIs': conf.get('HB_EXPERIMENTAL_API', 0) == 1,
     },
+  'Testing':
+    {'Tests': get_option('tests').enabled(),
+     'Benchmark': get_option('benchmark').enabled(),
+    },
 }
 if meson.version().version_compare('>=0.53')
   foreach section_title, section : build_summary

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/meson_options.txt
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/meson_options.txt	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/meson_options.txt	2021-04-17 22:31:16 UTC (rev 58898)
@@ -28,7 +28,7 @@
 option('docs', type: 'feature', value: 'auto', yield: true,
   description: 'Generate documentation with gtk-doc')
 
-option('benchmark', type: 'feature', value: 'auto',
+option('benchmark', type: 'feature', value: 'disabled',
   description: 'Enable benchmark tests')
 option('icu_builtin', type: 'boolean', value: false,
   description: 'Don\'t separate ICU support as harfbuzz-icu module')

Added: trunk/Build/source/libs/harfbuzz/harfbuzz-src/mingw-configure.sh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/mingw-configure.sh	                        (rev 0)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/mingw-configure.sh	2021-04-17 22:31:16 UTC (rev 58898)
@@ -0,0 +1,28 @@
+#!/bin/sh
+
+case $1 in
+	i686 | x86_64) ;;
+	*) echo "Usage: $0 i686|x86_64" >&2; exit 1 ;;
+esac
+
+target=$1-w64-mingw32
+shift
+
+exec "$(dirname "$0")"/configure \
+	--build=`../config.guess` \
+	--host=$target \
+	--prefix=$HOME/.local/$target \
+	CC= \
+	CXX= \
+	CPP= \
+	LD= \
+	CFLAGS="-static-libgcc" \
+	CXXFLAGS="-static-libgcc -static-libstdc++" \
+	CPPFLAGS="-I$HOME/.local/$target/include" \
+	LDFLAGS=-L$HOME/.local/$target/lib \
+	PKG_CONFIG_LIBDIR=$HOME/.local/$target/lib/pkgconfig:/usr/$target/sys-root/mingw/lib/pkgconfig/ \
+	PKG_CONFIG_PATH=$HOME/.local/$target/share/pkgconfig:/usr/$target/sys-root/mingw/share/pkgconfig/ \
+	PATH=$HOME/.local/$target/bin:/usr/$target/sys-root/mingw/bin:/usr/$target/bin:$PATH \
+	--without-icu \
+	--with-uniscribe \
+	"$@"

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/Makefile.am
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/Makefile.am	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/Makefile.am	2021-04-17 22:31:16 UTC (rev 58898)
@@ -235,7 +235,8 @@
 endif
 check: $(DEF_FILES) # For check-symbols.sh
 CLEANFILES += $(DEF_FILES)
-harfbuzz.def: $(HBHEADERS) $(HBNODISTHEADERS)
+harfbuzz.def: $(top_builddir)/config.status
+harfbuzz.def: $(HBHEADERS)
 	$(AM_V_GEN) $(srcdir)/gen-def.py "$@" $^
 harfbuzz-subset.def: $(HB_SUBSET_headers)
 	$(AM_V_GEN) $(srcdir)/gen-def.py "$@" $^
@@ -341,25 +342,6 @@
 test_gsub_would_substitute_CPPFLAGS = $(HBCFLAGS) $(FREETYPE_CFLAGS)
 test_gsub_would_substitute_LDADD = libharfbuzz.la $(HBLIBS) $(FREETYPE_LIBS)
 
-check_PROGRAMS += \
-	dump-indic-data \
-	dump-khmer-data \
-	dump-myanmar-data \
-	dump-use-data \
-	$(NULL)
-dump_indic_data_SOURCES = dump-indic-data.cc hb-ot-shape-complex-indic-table.cc
-dump_indic_data_CPPFLAGS = $(HBCFLAGS)
-dump_indic_data_LDADD = libharfbuzz.la $(HBLIBS)
-dump_khmer_data_SOURCES = dump-khmer-data.cc hb-ot-shape-complex-indic-table.cc
-dump_khmer_data_CPPFLAGS = $(HBCFLAGS)
-dump_khmer_data_LDADD = libharfbuzz.la $(HBLIBS)
-dump_myanmar_data_SOURCES = dump-myanmar-data.cc hb-ot-shape-complex-indic-table.cc
-dump_myanmar_data_CPPFLAGS = $(HBCFLAGS)
-dump_myanmar_data_LDADD = libharfbuzz.la $(HBLIBS)
-dump_use_data_SOURCES = dump-use-data.cc hb-ot-shape-complex-use-table.cc
-dump_use_data_CPPFLAGS = $(HBCFLAGS)
-dump_use_data_LDADD = libharfbuzz.la $(HBLIBS)
-
 COMPILED_TESTS = test-algs test-array test-iter test-meta test-number test-ot-tag test-unicode-ranges test-bimap
 COMPILED_TESTS_CPPFLAGS = $(HBCFLAGS) -DMAIN -UNDEBUG
 COMPILED_TESTS_LDADD = libharfbuzz.la $(HBLIBS)
@@ -444,14 +426,7 @@
 HarfBuzz_0_0_gir_CFLAGS = \
 	$(INCLUDES) \
 	$(HBCFLAGS) \
-	-DHB_H \
-	-DHB_H_IN \
-	-DHB_OT_H \
-	-DHB_OT_H_IN \
-	-DHB_AAT_H \
-	-DHB_AAT_H_IN \
-	-DHB_GOBJECT_H \
-	-DHB_GOBJECT_H_IN \
+	-DHB_NO_SINGLE_HEADER_ERROR \
 	-DHAVE_GOBJECT \
 	-DHB_EXTERN= \
 	$(NULL)

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/Makefile.sources
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/Makefile.sources	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/Makefile.sources	2021-04-17 22:31:16 UTC (rev 58898)
@@ -118,13 +118,13 @@
 	hb-ot-shape-complex-indic.hh \
 	hb-ot-shape-complex-khmer.cc \
 	hb-ot-shape-complex-khmer.hh \
-	hb-ot-shape-complex-machine-index.hh \
 	hb-ot-shape-complex-myanmar.cc \
 	hb-ot-shape-complex-myanmar.hh \
+	hb-ot-shape-complex-syllabic.cc \
+	hb-ot-shape-complex-syllabic.hh \
 	hb-ot-shape-complex-thai.cc \
-	hb-ot-shape-complex-use-table.cc \
+	hb-ot-shape-complex-use-table.hh \
 	hb-ot-shape-complex-use.cc \
-	hb-ot-shape-complex-use.hh \
 	hb-ot-shape-complex-vowel-constraints.cc \
 	hb-ot-shape-complex-vowel-constraints.hh \
 	hb-ot-shape-complex.hh \
@@ -266,10 +266,8 @@
 	hb-subset-input.hh \
 	hb-subset-plan.cc \
 	hb-subset-plan.hh \
-	hb-subset-plan.hh \
 	hb-subset.cc \
 	hb-subset.hh \
-	hb-subset.hh \
 	$(NULL)
 
 HB_SUBSET_headers = \

Deleted: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/dump-indic-data.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/dump-indic-data.cc	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/dump-indic-data.cc	2021-04-17 22:31:16 UTC (rev 58898)
@@ -1,43 +0,0 @@
-/*
- * Copyright © 2018  Google, Inc.
- *
- *  This is part of HarfBuzz, a text shaping library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- *
- * Google Author(s): Behdad Esfahbod
- */
-
-#include "hb-ot-shape-complex-indic.hh"
-
-int
-main ()
-{
-  for (hb_codepoint_t u = 0; u <= 0x10FFFF; u++)
-  {
-    hb_glyph_info_t info;
-    info.codepoint = u;
-    set_indic_properties (info);
-    if (info.indic_category() != INDIC_SYLLABIC_CATEGORY_OTHER ||
-	info.indic_position() != INDIC_MATRA_CATEGORY_NOT_APPLICABLE)
-      printf("U+%04X	%u	%u\n", u,
-	     info.indic_category(),
-	     info.indic_position());
-  }
-}

Deleted: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/dump-khmer-data.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/dump-khmer-data.cc	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/dump-khmer-data.cc	2021-04-17 22:31:16 UTC (rev 58898)
@@ -1,41 +0,0 @@
-/*
- * Copyright © 2018  Google, Inc.
- *
- *  This is part of HarfBuzz, a text shaping library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- *
- * Google Author(s): Behdad Esfahbod
- */
-
-#include "hb-ot-shape-complex-khmer.hh"
-
-int
-main ()
-{
-  for (hb_codepoint_t u = 0; u <= 0x10FFFF; u++)
-  {
-    hb_glyph_info_t info;
-    info.codepoint = u;
-    set_khmer_properties (info);
-    if (info.khmer_category() != INDIC_SYLLABIC_CATEGORY_OTHER)
-      printf("U+%04X	%u\n", u,
-	     info.khmer_category());
-  }
-}

Deleted: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/dump-myanmar-data.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/dump-myanmar-data.cc	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/dump-myanmar-data.cc	2021-04-17 22:31:16 UTC (rev 58898)
@@ -1,43 +0,0 @@
-/*
- * Copyright © 2018  Google, Inc.
- *
- *  This is part of HarfBuzz, a text shaping library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- *
- * Google Author(s): Behdad Esfahbod
- */
-
-#include "hb-ot-shape-complex-myanmar.hh"
-
-int
-main ()
-{
-  for (hb_codepoint_t u = 0; u <= 0x10FFFF; u++)
-  {
-    hb_glyph_info_t info;
-    info.codepoint = u;
-    set_myanmar_properties (info);
-    if (info.myanmar_category() != INDIC_SYLLABIC_CATEGORY_OTHER ||
-	info.myanmar_position() != INDIC_MATRA_CATEGORY_NOT_APPLICABLE)
-      printf("U+%04X	%u	%u\n", u,
-	     info.myanmar_category(),
-	     info.myanmar_position());
-  }
-}

Deleted: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/dump-use-data.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/dump-use-data.cc	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/dump-use-data.cc	2021-04-17 22:31:16 UTC (rev 58898)
@@ -1,38 +0,0 @@
-/*
- * Copyright © 2018  Google, Inc.
- *
- *  This is part of HarfBuzz, a text shaping library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- *
- * Google Author(s): Behdad Esfahbod
- */
-
-#include "hb-ot-shape-complex-use.hh"
-
-int
-main ()
-{
-  for (hb_codepoint_t u = 0; u <= 0x10FFFF; u++)
-  {
-    unsigned int category = hb_use_get_category (u);
-    if (category != USE_O)
-      printf("U+%04X	%u\n", u, category);
-  }
-}

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/gen-indic-table.py
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/gen-indic-table.py	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/gen-indic-table.py	2021-04-17 22:31:16 UTC (rev 58898)
@@ -200,7 +200,7 @@
 offset = 0
 starts = []
 ends = []
-print ("static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {")
+print ("static const uint16_t indic_table[] = {")
 for u in uu:
 	if u <= last:
 		continue
@@ -234,7 +234,7 @@
 page_bits = 12
 print ("}; /* Table items: %d; occupancy: %d%% */" % (offset, occupancy))
 print ()
-print ("INDIC_TABLE_ELEMENT_TYPE")
+print ("uint16_t")
 print ("hb_indic_get_categories (hb_codepoint_t u)")
 print ("{")
 print ("  switch (u >> %d)" % page_bits)

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/gen-tag-table.py
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/gen-tag-table.py	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/gen-tag-table.py	2021-04-17 22:31:16 UTC (rev 58898)
@@ -829,6 +829,7 @@
 	'QWH': 'qwh',
 	'SIG': 'stv',
 	'SRB': 'sr',
+	'SXT': 'xnj',
 	'ZHH': 'zh-HK',
 	'ZHS': 'zh-Hans',
 	'ZHT': 'zh-Hant',

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/gen-use-table.py
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/gen-use-table.py	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/gen-use-table.py	2021-04-17 22:31:16 UTC (rev 58898)
@@ -457,12 +457,13 @@
 		print (" * %s" % (l.strip()))
 print (" */")
 print ()
+print ("#ifndef HB_OT_SHAPE_COMPLEX_USE_TABLE_HH")
+print ("#define HB_OT_SHAPE_COMPLEX_USE_TABLE_HH")
+print ()
 print ('#include "hb.hh"')
 print ()
-print ('#ifndef HB_NO_OT_SHAPE')
+print ('#include "hb-ot-shape-complex-use-machine.hh"')
 print ()
-print ('#include "hb-ot-shape-complex-use.hh"')
-print ()
 
 total = 0
 used = 0
@@ -503,15 +504,15 @@
 print ('#pragma GCC diagnostic ignored "-Wunused-macros"')
 for k,v in sorted(use_mapping.items()):
 	if k in use_positions and use_positions[k]: continue
-	print ("#define %s	USE_%s	/* %s */" % (k, k, v.__name__[3:]))
+	print ("#define %s	USE(%s)	/* %s */" % (k, k, v.__name__[3:]))
 for k,v in sorted(use_positions.items()):
 	if not v: continue
 	for suf in v.keys():
 		tag = k + suf
-		print ("#define %s	USE_%s" % (tag, tag))
+		print ("#define %s	USE(%s)" % (tag, tag))
 print ('#pragma GCC diagnostic pop')
 print ("")
-print ("static const USE_TABLE_ELEMENT_TYPE use_table[] = {")
+print ("static const uint8_t use_table[] = {")
 for u in uu:
 	if u <= last:
 		continue
@@ -547,7 +548,7 @@
 page_bits = 12
 print ("}; /* Table items: %d; occupancy: %d%% */" % (offset, occupancy))
 print ()
-print ("USE_TABLE_ELEMENT_TYPE")
+print ("static inline uint8_t")
 print ("hb_use_get_category (hb_codepoint_t u)")
 print ("{")
 print ("  switch (u >> %d)" % page_bits)
@@ -564,7 +565,7 @@
 print ("    default:")
 print ("      break;")
 print ("  }")
-print ("  return USE_O;")
+print ("  return USE(O);")
 print ("}")
 print ()
 for k in sorted(use_mapping.keys()):
@@ -577,7 +578,7 @@
 		print ("#undef %s" % tag)
 print ()
 print ()
-print ('#endif')
+print ("#endif /* HB_OT_SHAPE_COMPLEX_USE_TABLE_HH */")
 print ("/* == End of generated table == */")
 
 # Maintain at least 50% occupancy in the table */

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/gen-vowel-constraints.py
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/gen-vowel-constraints.py	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/gen-vowel-constraints.py	2021-04-17 22:31:16 UTC (rev 58898)
@@ -101,7 +101,7 @@
 						self._indent (depth + 2), cp, index + i, ')' if i == len (self._c) - 1 else ' &&'))
 				s.append ('{}{{\n'.format (indent))
 				for i in range (index):
-					s.append ('{}buffer->next_glyph ();\n'.format (self._indent (depth + 1)))
+					s.append ('{}(void) buffer->next_glyph ();\n'.format (self._indent (depth + 1)))
 				s.append ('{}matched = true;\n'.format (self._indent (depth + 1)))
 				s.append ('{}}}\n'.format (indent))
 		else:
@@ -171,8 +171,8 @@
 print ('static void')
 print ('_output_dotted_circle (hb_buffer_t *buffer)')
 print ('{')
-print ('  hb_glyph_info_t &dottedcircle = buffer->output_glyph (0x25CCu);')
-print ('  _hb_glyph_info_reset_continuation (&dottedcircle);')
+print ('  (void) buffer->output_glyph (0x25CCu);')
+print ('  _hb_glyph_info_reset_continuation (&buffer->prev());')
 print ('}')
 print ()
 print ('static void')
@@ -179,7 +179,7 @@
 print ('_output_with_dotted_circle (hb_buffer_t *buffer)')
 print ('{')
 print ('  _output_dotted_circle (buffer);')
-print ('  buffer->next_glyph ();')
+print ('  (void) buffer->next_glyph ();')
 print ('}')
 print ()
 
@@ -200,7 +200,6 @@
 print ('   *')
 print ('   * https://github.com/harfbuzz/harfbuzz/issues/1019')
 print ('   */')
-print ('  bool processed = false;')
 print ('  buffer->clear_output ();')
 print ('  unsigned int count = buffer->len;')
 print ('  switch ((unsigned) buffer->props.script)')
@@ -212,10 +211,9 @@
 	print ('      {')
 	print ('\tbool matched = false;')
 	write (str (constraints))
-	print ('\tbuffer->next_glyph ();')
+	print ('\t(void) buffer->next_glyph ();')
 	print ('\tif (matched) _output_with_dotted_circle (buffer);')
 	print ('      }')
-	print ('      processed = true;')
 	print ('      break;')
 	print ()
 
@@ -222,12 +220,7 @@
 print ('    default:')
 print ('      break;')
 print ('  }')
-print ('  if (processed)')
-print ('  {')
-print ('    if (buffer->idx < count)')
-print ('      buffer->next_glyph ();')
-print ('    buffer->swap_buffers ();')
-print ('  }')
+print ('  buffer->swap_buffers ();')
 print ('}')
 
 print ()

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/harfbuzz.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/harfbuzz.cc	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/harfbuzz.cc	2021-04-17 22:31:16 UTC (rev 58898)
@@ -29,8 +29,8 @@
 #include "hb-ot-shape-complex-indic.cc"
 #include "hb-ot-shape-complex-khmer.cc"
 #include "hb-ot-shape-complex-myanmar.cc"
+#include "hb-ot-shape-complex-syllabic.cc"
 #include "hb-ot-shape-complex-thai.cc"
-#include "hb-ot-shape-complex-use-table.cc"
 #include "hb-ot-shape-complex-use.cc"
 #include "hb-ot-shape-complex-vowel-constraints.cc"
 #include "hb-ot-shape-fallback.cc"

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-common.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-common.hh	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-common.hh	2021-04-17 22:31:16 UTC (rev 58898)
@@ -510,7 +510,7 @@
   const Entry<Extra> &get_entry (int state, unsigned int klass) const
   {
     if (unlikely (klass >= nClasses))
-      klass = StateTable<Types, Entry<Extra>>::CLASS_OUT_OF_BOUNDS;
+      klass = StateTable::CLASS_OUT_OF_BOUNDS;
 
     const HBUSHORT *states = (this+stateArrayTable).arrayZ;
     const Entry<Extra> *entries = (this+entryTable).arrayZ;
@@ -576,7 +576,7 @@
 	  if (unlikely (stop > states))
 	    return_trace (false);
 	  for (const HBUSHORT *p = states; stop < p; p--)
-	    num_entries = hb_max (num_entries, *(p - 1) + 1);
+	    num_entries = hb_max (num_entries, *(p - 1) + 1u);
 	  state_neg = min_state;
 	}
       }
@@ -597,7 +597,7 @@
 	  if (unlikely (stop < states))
 	    return_trace (false);
 	  for (const HBUSHORT *p = &states[state_pos * num_classes]; p < stop; p++)
-	    num_entries = hb_max (num_entries, *p + 1);
+	    num_entries = hb_max (num_entries, *p + 1u);
 	  state_pos = max_state + 1;
 	}
       }
@@ -729,7 +729,10 @@
 template <typename Types, typename EntryData>
 struct StateTableDriver
 {
-  StateTableDriver (const StateTable<Types, EntryData> &machine_,
+  using StateTableT = StateTable<Types, EntryData>;
+  using EntryT = Entry<EntryData>;
+
+  StateTableDriver (const StateTableT &machine_,
 		    hb_buffer_t *buffer_,
 		    hb_face_t *face_) :
 	      machine (machine_),
@@ -742,59 +745,101 @@
     if (!c->in_place)
       buffer->clear_output ();
 
-    int state = StateTable<Types, EntryData>::STATE_START_OF_TEXT;
+    int state = StateTableT::STATE_START_OF_TEXT;
     for (buffer->idx = 0; buffer->successful;)
     {
       unsigned int klass = buffer->idx < buffer->len ?
 			   machine.get_class (buffer->info[buffer->idx].codepoint, num_glyphs) :
-			   (unsigned) StateTable<Types, EntryData>::CLASS_END_OF_TEXT;
+			   (unsigned) StateTableT::CLASS_END_OF_TEXT;
       DEBUG_MSG (APPLY, nullptr, "c%u at %u", klass, buffer->idx);
-      const Entry<EntryData> &entry = machine.get_entry (state, klass);
+      const EntryT &entry = machine.get_entry (state, klass);
+      const int next_state = machine.new_state (entry.newState);
 
-      /* Unsafe-to-break before this if not in state 0, as things might
-       * go differently if we start from state 0 here.
+      /* Conditions under which it's guaranteed safe-to-break before current glyph:
        *
-       * Ugh.  The indexing here is ugly... */
-      if (state && buffer->backtrack_len () && buffer->idx < buffer->len)
-      {
-	/* If there's no action and we're just epsilon-transitioning to state 0,
-	 * safe to break. */
-	if (c->is_actionable (this, entry) ||
-	    !(entry.newState == StateTable<Types, EntryData>::STATE_START_OF_TEXT &&
-	      entry.flags == context_t::DontAdvance))
-	  buffer->unsafe_to_break_from_outbuffer (buffer->backtrack_len () - 1, buffer->idx + 1);
-      }
+       * 1. There was no action in this transition; and
+       *
+       * 2. If we break before current glyph, the results will be the same. That
+       *    is guaranteed if:
+       *
+       *    2a. We were already in start-of-text state; or
+       *
+       *    2b. We are epsilon-transitioning to start-of-text state; or
+       *
+       *    2c. Starting from start-of-text state seeing current glyph:
+       *
+       *        2c'. There won't be any actions; and
+       *
+       *        2c". We would end up in the same state that we were going to end up
+       *             in now, including whether epsilon-transitioning.
+       *
+       *    and
+       *
+       * 3. If we break before current glyph, there won't be any end-of-text action
+       *    after previous glyph.
+       *
+       * This triples the transitions we need to look up, but is worth returning
+       * granular unsafe-to-break results. See eg.:
+       *
+       *   https://github.com/harfbuzz/harfbuzz/issues/2860
+       */
+      const EntryT *wouldbe_entry;
+      bool safe_to_break =
+	/* 1. */
+	!c->is_actionable (this, entry)
+      &&
+	/* 2. */
+	(
+	  /* 2a. */
+	  state == StateTableT::STATE_START_OF_TEXT
+	||
+	  /* 2b. */
+	  (
+	    (entry.flags & context_t::DontAdvance) &&
+	    next_state == StateTableT::STATE_START_OF_TEXT
+	  )
+	||
+	  /* 2c. */
+	  (
+	    wouldbe_entry = &machine.get_entry (StateTableT::STATE_START_OF_TEXT, klass)
+	  ,
+	    /* 2c'. */
+	    !c->is_actionable (this, *wouldbe_entry)
+	  &&
+	    /* 2c". */
+	    (
+	      next_state == machine.new_state (wouldbe_entry->newState)
+	    &&
+	      (entry.flags & context_t::DontAdvance) == (wouldbe_entry->flags & context_t::DontAdvance)
+	    )
+	  )
+	)
+      &&
+	/* 3. */
+	!c->is_actionable (this, machine.get_entry (state, StateTableT::CLASS_END_OF_TEXT))
+      ;
 
-      /* Unsafe-to-break if end-of-text would kick in here. */
-      if (buffer->idx + 2 <= buffer->len)
-      {
-	const Entry<EntryData> &end_entry = machine.get_entry (state, StateTable<Types, EntryData>::CLASS_END_OF_TEXT);
-	if (c->is_actionable (this, end_entry))
-	  buffer->unsafe_to_break (buffer->idx, buffer->idx + 2);
-      }
+      if (!safe_to_break && buffer->backtrack_len () && buffer->idx < buffer->len)
+	buffer->unsafe_to_break_from_outbuffer (buffer->backtrack_len () - 1, buffer->idx + 1);
 
       c->transition (this, entry);
 
-      state = machine.new_state (entry.newState);
+      state = next_state;
       DEBUG_MSG (APPLY, nullptr, "s%d", state);
 
-      if (buffer->idx == buffer->len)
+      if (buffer->idx == buffer->len || unlikely (!buffer->successful))
 	break;
 
       if (!(entry.flags & context_t::DontAdvance) || buffer->max_ops-- <= 0)
-	buffer->next_glyph ();
+	(void) buffer->next_glyph ();
     }
 
     if (!c->in_place)
-    {
-      for (; buffer->successful && buffer->idx < buffer->len;)
-	buffer->next_glyph ();
       buffer->swap_buffers ();
-    }
   }
 
   public:
-  const StateTable<Types, EntryData> &machine;
+  const StateTableT &machine;
   hb_buffer_t *buffer;
   unsigned int num_glyphs;
 };

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-morx-table.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-morx-table.hh	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-morx-table.hh	2021-04-17 22:31:16 UTC (rev 58898)
@@ -337,9 +337,9 @@
       const EntryData &data = entries[i].data;
 
       if (data.markIndex != 0xFFFF)
-	num_lookups = hb_max (num_lookups, 1 + data.markIndex);
+	num_lookups = hb_max (num_lookups, 1u + data.markIndex);
       if (data.currentIndex != 0xFFFF)
-	num_lookups = hb_max (num_lookups, 1 + data.currentIndex);
+	num_lookups = hb_max (num_lookups, 1u + data.currentIndex);
     }
 
     return_trace (substitutionTables.sanitize (c, this, num_lookups));
@@ -499,7 +499,7 @@
 	  }
 
 	  DEBUG_MSG (APPLY, nullptr, "Moving to stack position %u", cursor - 1);
-	  buffer->move_to (match_positions[--cursor % ARRAY_LENGTH (match_positions)]);
+	  if (unlikely (!buffer->move_to (match_positions[--cursor % ARRAY_LENGTH (match_positions)]))) return;
 
 	  if (unlikely (!actionData->sanitize (&c->sanitizer))) break;
 	  action = *actionData;
@@ -525,7 +525,7 @@
 	    hb_codepoint_t lig = ligatureData;
 
 	    DEBUG_MSG (APPLY, nullptr, "Produced ligature %u", lig);
-	    buffer->replace_glyph (lig);
+	    if (unlikely (!buffer->replace_glyph (lig))) return;
 
 	    unsigned int lig_end = match_positions[(match_length - 1u) % ARRAY_LENGTH (match_positions)] + 1u;
 	    /* Now go and delete all subsequent components. */
@@ -532,11 +532,11 @@
 	    while (match_length - 1u > cursor)
 	    {
 	      DEBUG_MSG (APPLY, nullptr, "Skipping ligature component");
-	      buffer->move_to (match_positions[--match_length % ARRAY_LENGTH (match_positions)]);
-	      buffer->replace_glyph (DELETED_GLYPH);
+	      if (unlikely (!buffer->move_to (match_positions[--match_length % ARRAY_LENGTH (match_positions)]))) return;
+	      if (unlikely (!buffer->replace_glyph (DELETED_GLYPH))) return;
 	    }
 
-	    buffer->move_to (lig_end);
+	    if (unlikely (!buffer->move_to (lig_end))) return;
 	    buffer->merge_out_clusters (match_positions[cursor % ARRAY_LENGTH (match_positions)], buffer->out_len);
 	  }
 
@@ -543,7 +543,7 @@
 	  actionData++;
 	}
 	while (!(action & LigActionLast));
-	buffer->move_to (end);
+	if (unlikely (!buffer->move_to (end))) return;
       }
     }
 
@@ -733,17 +733,16 @@
 	bool before = flags & MarkedInsertBefore;
 
 	unsigned int end = buffer->out_len;
-	buffer->move_to (mark);
+	if (unlikely (!buffer->move_to (mark))) return;
 
 	if (buffer->idx < buffer->len && !before)
-	  buffer->copy_glyph ();
+	  if (unlikely (!buffer->copy_glyph ())) return;
 	/* TODO We ignore KashidaLike setting. */
-	for (unsigned int i = 0; i < count; i++)
-	  buffer->output_glyph (glyphs[i]);
+	if (unlikely (!buffer->replace_glyphs (0, count, glyphs))) return;
 	if (buffer->idx < buffer->len && !before)
 	  buffer->skip_glyph ();
 
-	buffer->move_to (end + count);
+	if (unlikely (!buffer->move_to (end + count))) return;
 
 	buffer->unsafe_to_break_from_outbuffer (mark, hb_min (buffer->idx + 1, buffer->len));
       }
@@ -764,10 +763,9 @@
 	unsigned int end = buffer->out_len;
 
 	if (buffer->idx < buffer->len && !before)
-	  buffer->copy_glyph ();
+	  if (unlikely (!buffer->copy_glyph ())) return;
 	/* TODO We ignore KashidaLike setting. */
-	for (unsigned int i = 0; i < count; i++)
-	  buffer->output_glyph (glyphs[i]);
+	if (unlikely (!buffer->replace_glyphs (0, count, glyphs))) return;
 	if (buffer->idx < buffer->len && !before)
 	  buffer->skip_glyph ();
 
@@ -786,7 +784,7 @@
 	 *
 	 * https://github.com/harfbuzz/harfbuzz/issues/1224#issuecomment-427691417
 	 */
-	buffer->move_to ((flags & DontAdvance) ? end : end + count);
+	if (unlikely (!buffer->move_to ((flags & DontAdvance) ? end : end + count))) return;
       }
     }
 

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout.cc	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout.cc	2021-04-17 22:31:16 UTC (rev 58898)
@@ -227,7 +227,7 @@
  *
  * <note>Note: does not examine the `GSUB` table.</note>
  *
- * Return value: true if data found, false otherwise
+ * Return value: %true if data found, %false otherwise
  *
  * Since: 2.3.0
  */
@@ -294,7 +294,7 @@
  *
  * <note>Note: does not examine the `GPOS` table.</note>
  *
- * Return value: true if data found, false otherwise
+ * Return value: %true if data found, %false otherwise
  *
  * Since: 2.3.0
  */
@@ -325,7 +325,7 @@
  * Tests whether the specified face includes any tracking information
  * in the `trak` table.
  *
- * Return value: true if data found, false otherwise
+ * Return value: %true if data found, %false otherwise
  *
  * Since: 2.3.0
  */
@@ -350,7 +350,7 @@
  * hb_aat_layout_get_feature_types:
  * @face: #hb_face_t to work upon
  * @start_offset: offset of the first feature type to retrieve
- * @feature_count: (inout) (allow-none): Input = the maximum number of feature types to return;
+ * @feature_count: (inout) (optional): Input = the maximum number of feature types to return;
  *                 Output = the actual number of feature types returned (may be zero)
  * @features: (out caller-allocates) (array length=feature_count): Array of feature types found
  *
@@ -374,9 +374,9 @@
  * @face: #hb_face_t to work upon
  * @feature_type: The #hb_aat_layout_feature_type_t of the requested feature type
  *
- * Fetches the name ID of the specified feature type in the face's `name` table.
+ * Fetches the name identifier of the specified feature type in the face's `name` table.
  *
- * Return value: Name ID of the requested feature type
+ * Return value: Name identifier of the requested feature type
  *
  * Since: 2.2.0
  */
@@ -388,15 +388,15 @@
 }
 
 /**
- * hb_aat_layout_feature_type_get_selectors:
+ * hb_aat_layout_feature_type_get_selector_infos:
  * @face: #hb_face_t to work upon
  * @feature_type: The #hb_aat_layout_feature_type_t of the requested feature type
  * @start_offset: offset of the first feature type to retrieve
- * @selector_count: (inout) (allow-none): Input = the maximum number of selectors to return;
+ * @selector_count: (inout) (optional): Input = the maximum number of selectors to return;
  *                  Output = the actual number of selectors returned (may be zero)
- * @selectors: (out caller-allocates) (array length=selector_count): A buffer pointer.
- *             The selectors available for the feature type queries.
- * @default_index: (out) (allow-none): The index of the feature's default selector, if any
+ * @selectors: (out caller-allocates) (array length=selector_count) (optional):
+ *             A buffer pointer. The selectors available for the feature type queries.
+ * @default_index: (out) (optional): The index of the feature's default selector, if any
  *
  * Fetches a list of the selectors available for the specified feature in the given face.
  *

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout.h
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout.h	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout.h	2021-04-17 22:31:16 UTC (rev 58898)
@@ -22,7 +22,7 @@
  * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
  */
 
-#ifndef HB_AAT_H_IN
+#if !defined(HB_AAT_H_IN) && !defined(HB_NO_SINGLE_HEADER_ERROR)
 #error "Include <hb-aat.h> instead."
 #endif
 
@@ -38,47 +38,47 @@
 /**
  * hb_aat_layout_feature_type_t:
  * @HB_AAT_LAYOUT_FEATURE_TYPE_INVALID: Initial, unset feature type
- * @HB_AAT_LAYOUT_FEATURE_TYPE_ALL_TYPOGRAPHIC:
- * @HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES:
- * @HB_AAT_LAYOUT_FEATURE_TYPE_CURISVE_CONNECTION:
- * @HB_AAT_LAYOUT_FEATURE_TYPE_LETTER_CASE:
- * @HB_AAT_LAYOUT_FEATURE_TYPE_VERTICAL_SUBSTITUTION:
- * @HB_AAT_LAYOUT_FEATURE_TYPE_LINGUISTIC_REARRANGEMENT:
- * @HB_AAT_LAYOUT_FEATURE_TYPE_NUMBER_SPACING:
- * @HB_AAT_LAYOUT_FEATURE_TYPE_SMART_SWASH_TYPE:
- * @HB_AAT_LAYOUT_FEATURE_TYPE_DIACRITICS_TYPE:
- * @HB_AAT_LAYOUT_FEATURE_TYPE_VERTICAL_POSITION:
- * @HB_AAT_LAYOUT_FEATURE_TYPE_FRACTIONS:
- * @HB_AAT_LAYOUT_FEATURE_TYPE_OVERLAPPING_CHARACTERS_TYPE:
- * @HB_AAT_LAYOUT_FEATURE_TYPE_TYPOGRAPHIC_EXTRAS:
- * @HB_AAT_LAYOUT_FEATURE_TYPE_MATHEMATICAL_EXTRAS:
- * @HB_AAT_LAYOUT_FEATURE_TYPE_ORNAMENT_SETS_TYPE:
- * @HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_ALTERNATIVES:
- * @HB_AAT_LAYOUT_FEATURE_TYPE_DESIGN_COMPLEXITY_TYPE:
- * @HB_AAT_LAYOUT_FEATURE_TYPE_STYLE_OPTIONS:
- * @HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE:
- * @HB_AAT_LAYOUT_FEATURE_TYPE_NUMBER_CASE:
- * @HB_AAT_LAYOUT_FEATURE_TYPE_TEXT_SPACING:
- * @HB_AAT_LAYOUT_FEATURE_TYPE_TRANSLITERATION:
- * @HB_AAT_LAYOUT_FEATURE_TYPE_ANNOTATION_TYPE:
- * @HB_AAT_LAYOUT_FEATURE_TYPE_KANA_SPACING_TYPE:
- * @HB_AAT_LAYOUT_FEATURE_TYPE_IDEOGRAPHIC_SPACING_TYPE:
- * @HB_AAT_LAYOUT_FEATURE_TYPE_UNICODE_DECOMPOSITION_TYPE:
- * @HB_AAT_LAYOUT_FEATURE_TYPE_RUBY_KANA:
- * @HB_AAT_LAYOUT_FEATURE_TYPE_CJK_SYMBOL_ALTERNATIVES_TYPE:
- * @HB_AAT_LAYOUT_FEATURE_TYPE_IDEOGRAPHIC_ALTERNATIVES_TYPE:
- * @HB_AAT_LAYOUT_FEATURE_TYPE_CJK_VERTICAL_ROMAN_PLACEMENT_TYPE:
- * @HB_AAT_LAYOUT_FEATURE_TYPE_ITALIC_CJK_ROMAN:
- * @HB_AAT_LAYOUT_FEATURE_TYPE_CASE_SENSITIVE_LAYOUT:
- * @HB_AAT_LAYOUT_FEATURE_TYPE_ALTERNATE_KANA:
- * @HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES:
- * @HB_AAT_LAYOUT_FEATURE_TYPE_CONTEXTUAL_ALTERNATIVES:
- * @HB_AAT_LAYOUT_FEATURE_TYPE_LOWER_CASE:
- * @HB_AAT_LAYOUT_FEATURE_TYPE_UPPER_CASE:
- * @HB_AAT_LAYOUT_FEATURE_TYPE_LANGUAGE_TAG_TYPE:
- * @HB_AAT_LAYOUT_FEATURE_TYPE_CJK_ROMAN_SPACING_TYPE:
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_ALL_TYPOGRAPHIC: [All Typographic Features](https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type0)
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES: [Ligatures](https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type1)
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_CURISVE_CONNECTION: [Cursive Connection](https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type2)
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_LETTER_CASE: [Letter Case](https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type3)
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_VERTICAL_SUBSTITUTION: [Vertical Substitution](https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type4)
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_LINGUISTIC_REARRANGEMENT: [Linguistic Rearrangement](https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type5)
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_NUMBER_SPACING: [Number Spacing](https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type6)
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_SMART_SWASH_TYPE: [Smart Swash](https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type8)
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_DIACRITICS_TYPE: [Diacritics](https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type9)
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_VERTICAL_POSITION: [Vertical Position](https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type10)
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_FRACTIONS: [Fractions](https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type11)
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_OVERLAPPING_CHARACTERS_TYPE: [Overlapping Characters](https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type13)
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_TYPOGRAPHIC_EXTRAS: [Typographic Extras](https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type14)
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_MATHEMATICAL_EXTRAS: [Mathematical Extras](https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type15)
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_ORNAMENT_SETS_TYPE: [Ornament Sets](https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type16)
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_ALTERNATIVES: [Character Alternatives](https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type17)
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_DESIGN_COMPLEXITY_TYPE: [Design Complexity](https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type18)
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_STYLE_OPTIONS: [Style Options](https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type19)
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE: [Character Shape](https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type20)
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_NUMBER_CASE: [Number Case](https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type21)
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_TEXT_SPACING: [Text Spacing](https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type22)
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_TRANSLITERATION: [Transliteration](https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type23)
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_ANNOTATION_TYPE: [Annotation](https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type24)
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_KANA_SPACING_TYPE: [Kana Spacing](https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type25)
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_IDEOGRAPHIC_SPACING_TYPE: [Ideographic Spacing](https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type26)
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_UNICODE_DECOMPOSITION_TYPE: [Unicode Decomposition](https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type27)
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_RUBY_KANA: [Ruby Kana](https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type28)
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_CJK_SYMBOL_ALTERNATIVES_TYPE: [CJK Symbol Alternatives](https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type29)
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_IDEOGRAPHIC_ALTERNATIVES_TYPE: [Ideographic Alternatives](https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type30)
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_CJK_VERTICAL_ROMAN_PLACEMENT_TYPE: [CJK Vertical Roman Placement](https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type31)
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_ITALIC_CJK_ROMAN: [Italic CJK Roman](https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type32)
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_CASE_SENSITIVE_LAYOUT: [Case Sensitive Layout](https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type33)
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_ALTERNATE_KANA: [Alternate Kana](https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type34)
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES: [Stylistic Alternatives](https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type35)
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_CONTEXTUAL_ALTERNATIVES: [Contextual Alternatives](https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type36)
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_LOWER_CASE: [Lower Case](https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type37)
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_UPPER_CASE: [Upper Case](https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type38)
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_LANGUAGE_TAG_TYPE: [Language Tag](https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type39)
+ * @HB_AAT_LAYOUT_FEATURE_TYPE_CJK_ROMAN_SPACING_TYPE: [CJK Roman Spacing](https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html#Type103)
  *
- * The possible feature types defined for AAT shaping.
+ * The possible feature types defined for AAT shaping, from Apple [Font Feature Registry](https://developer.apple.com/fonts/TrueType-Reference-Manual/RM09/AppendixF.html).
  *
  * Since: 2.2.0
  */
@@ -732,6 +732,14 @@
 hb_aat_layout_feature_type_get_name_id (hb_face_t                    *face,
 					hb_aat_layout_feature_type_t  feature_type);
 
+/**
+ * hb_aat_layout_feature_selector_info_t:
+ * @name_id: The selector's name identifier
+ * @enable: The value to turn the selector on
+ * @disable: The value to turn the selector off
+ *
+ * Structure representing a setting for an #hb_aat_layout_feature_type_t.
+ */
 typedef struct hb_aat_layout_feature_selector_info_t {
   hb_ot_name_id_t			name_id;
   hb_aat_layout_feature_selector_t	enable;

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-algs.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-algs.hh	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-algs.hh	2021-04-17 22:31:16 UTC (rev 58898)
@@ -35,6 +35,132 @@
 #include "hb-number.hh"
 
 
+/*
+ * Flags
+ */
+
+/* Enable bitwise ops on enums marked as flags_t */
+/* To my surprise, looks like the function resolver is happy to silently cast
+ * one enum to another...  So this doesn't provide the type-checking that I
+ * originally had in mind... :(.
+ *
+ * For MSVC warnings, see: https://github.com/harfbuzz/harfbuzz/pull/163
+ */
+#ifdef _MSC_VER
+# pragma warning(disable:4200)
+# pragma warning(disable:4800)
+#endif
+#define HB_MARK_AS_FLAG_T(T) \
+	extern "C++" { \
+	  static inline constexpr T operator | (T l, T r) { return T ((unsigned) l | (unsigned) r); } \
+	  static inline constexpr T operator & (T l, T r) { return T ((unsigned) l & (unsigned) r); } \
+	  static inline constexpr T operator ^ (T l, T r) { return T ((unsigned) l ^ (unsigned) r); } \
+	  static inline constexpr T operator ~ (T r) { return T (~(unsigned int) r); } \
+	  static inline T& operator |= (T &l, T r) { l = l | r; return l; } \
+	  static inline T& operator &= (T& l, T r) { l = l & r; return l; } \
+	  static inline T& operator ^= (T& l, T r) { l = l ^ r; return l; } \
+	} \
+	static_assert (true, "")
+
+/* Useful for set-operations on small enums.
+ * For example, for testing "x ∈ {x1, x2, x3}" use:
+ * (FLAG_UNSAFE(x) & (FLAG(x1) | FLAG(x2) | FLAG(x3)))
+ */
+#define FLAG(x) (static_assert_expr ((unsigned)(x) < 32) + (((uint32_t) 1U) << (unsigned)(x)))
+#define FLAG_UNSAFE(x) ((unsigned)(x) < 32 ? (((uint32_t) 1U) << (unsigned)(x)) : 0)
+#define FLAG_RANGE(x,y) (static_assert_expr ((x) < (y)) + FLAG(y+1) - FLAG(x))
+#define FLAG64(x) (static_assert_expr ((unsigned)(x) < 64) + (((uint64_t) 1ULL) << (unsigned)(x)))
+#define FLAG64_UNSAFE(x) ((unsigned)(x) < 64 ? (((uint64_t) 1ULL) << (unsigned)(x)) : 0)
+
+
+/*
+ * Big-endian integers.
+ */
+
+/* Endian swap, used in Windows related backends */
+static inline constexpr uint16_t hb_uint16_swap (uint16_t v)
+{ return (v >> 8) | (v << 8); }
+static inline constexpr uint32_t hb_uint32_swap (uint32_t v)
+{ return (hb_uint16_swap (v) << 16) | hb_uint16_swap (v >> 16); }
+
+template <typename Type, int Bytes = sizeof (Type)>
+struct BEInt;
+template <typename Type>
+struct BEInt<Type, 1>
+{
+  public:
+  BEInt () = default;
+  constexpr BEInt (Type V) : v {uint8_t (V)} {}
+  constexpr operator Type () const { return v; }
+  private: uint8_t v;
+};
+template <typename Type>
+struct BEInt<Type, 2>
+{
+  public:
+  BEInt () = default;
+  constexpr BEInt (Type V) : v {uint8_t ((V >>  8) & 0xFF),
+			        uint8_t ((V      ) & 0xFF)} {}
+
+  struct __attribute__((packed)) packed_uint16_t { uint16_t v; };
+  constexpr operator Type () const
+  {
+#if ((defined(__GNUC__) && __GNUC__ >= 5) || defined(__clang__)) && \
+    defined(__BYTE_ORDER) && \
+    (__BYTE_ORDER == __LITTLE_ENDIAN || __BYTE_ORDER == __BIG_ENDIAN)
+    /* Spoon-feed the compiler a big-endian integer with alignment 1.
+     * https://github.com/harfbuzz/harfbuzz/pull/1398 */
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+    return __builtin_bswap16 (((packed_uint16_t *) this)->v);
+#else /* __BYTE_ORDER == __BIG_ENDIAN */
+    return ((packed_uint16_t *) this)->v;
+#endif
+#else
+    return (v[0] <<  8)
+	 + (v[1]      );
+#endif
+  }
+  private: uint8_t v[2];
+};
+template <typename Type>
+struct BEInt<Type, 3>
+{
+  static_assert (!hb_is_signed (Type), "");
+  public:
+  BEInt () = default;
+  constexpr BEInt (Type V) : v {uint8_t ((V >> 16) & 0xFF),
+				uint8_t ((V >>  8) & 0xFF),
+				uint8_t ((V      ) & 0xFF)} {}
+
+  constexpr operator Type () const { return (v[0] << 16)
+					  + (v[1] <<  8)
+					  + (v[2]      ); }
+  private: uint8_t v[3];
+};
+template <typename Type>
+struct BEInt<Type, 4>
+{
+  public:
+  BEInt () = default;
+  constexpr BEInt (Type V) : v {uint8_t ((V >> 24) & 0xFF),
+			        uint8_t ((V >> 16) & 0xFF),
+			        uint8_t ((V >>  8) & 0xFF),
+			        uint8_t ((V      ) & 0xFF)} {}
+  constexpr operator Type () const { return (v[0] << 24)
+					  + (v[1] << 16)
+					  + (v[2] <<  8)
+					  + (v[3]      ); }
+  private: uint8_t v[4];
+};
+
+/* Floats. */
+
+/* We want our rounding towards +infinity. */
+static inline float
+_hb_roundf (float x) { return floorf (x + .5f); }
+#define roundf(x) _hb_roundf(x)
+
+
 /* Encodes three unsigned integers in one 64-bit number.  If the inputs have more than 21 bits,
  * values will be truncated / overlap, and might not decode exactly. */
 #define HB_CODEPOINT_ENCODE3(x,y,z) (((uint64_t) (x) << 42) | ((uint64_t) (y) << 21) | (uint64_t) (z))
@@ -48,6 +174,7 @@
 #define HB_CODEPOINT_DECODE3_11_7_14_2(v) ((hb_codepoint_t) (((v) >> 14) & 0x007Fu) | 0x0300)
 #define HB_CODEPOINT_DECODE3_11_7_14_3(v) ((hb_codepoint_t) (v) & 0x3FFFu)
 
+
 struct
 {
   /* Note.  This is dangerous in that if it's passed an rvalue, it returns rvalue-reference. */
@@ -215,7 +342,9 @@
 
   template <typename Pred, typename Val> auto
   impl (Pred&& p, Val &&v, hb_priority<1>) const HB_AUTO_RETURN
-  (hb_deref (hb_forward<Pred> (p)).has (hb_forward<Val> (v)))
+  (
+    hb_deref (hb_forward<Pred> (p)).has (hb_forward<Val> (v))
+  )
 
   template <typename Pred, typename Val> auto
   impl (Pred&& p, Val &&v, hb_priority<0>) const HB_AUTO_RETURN
@@ -269,7 +398,9 @@
 
   template <typename Proj, typename Val> auto
   impl (Proj&& f, Val &&v, hb_priority<2>) const HB_AUTO_RETURN
-  (hb_deref (hb_forward<Proj> (f)).get (hb_forward<Val> (v)))
+  (
+    hb_deref (hb_forward<Proj> (f)).get (hb_forward<Val> (v))
+  )
 
   template <typename Proj, typename Val> auto
   impl (Proj&& f, Val &&v, hb_priority<1>) const HB_AUTO_RETURN
@@ -296,7 +427,41 @@
 }
 HB_FUNCOBJ (hb_get);
 
+struct
+{
+  private:
 
+  template <typename T1, typename T2> auto
+  impl (T1&& v1, T2 &&v2, hb_priority<2>) const HB_AUTO_RETURN
+  (
+    hb_forward<T2> (v2).cmp (hb_forward<T1> (v1)) == 0
+  )
+
+  template <typename T1, typename T2> auto
+  impl (T1&& v1, T2 &&v2, hb_priority<1>) const HB_AUTO_RETURN
+  (
+    hb_forward<T1> (v1).cmp (hb_forward<T2> (v2)) == 0
+  )
+
+  template <typename T1, typename T2> auto
+  impl (T1&& v1, T2 &&v2, hb_priority<0>) const HB_AUTO_RETURN
+  (
+    hb_forward<T1> (v1) == hb_forward<T2> (v2)
+  )
+
+  public:
+
+  template <typename T1, typename T2> auto
+  operator () (T1&& v1, T2 &&v2) const HB_AUTO_RETURN
+  (
+    impl (hb_forward<T1> (v1),
+	  hb_forward<T2> (v2),
+	  hb_prioritize)
+  )
+}
+HB_FUNCOBJ (hb_equal);
+
+
 template <typename T1, typename T2>
 struct hb_pair_t
 {
@@ -375,7 +540,7 @@
 
 /* Return the number of 1 bits in v. */
 template <typename T>
-static inline HB_CONST_FUNC unsigned int
+static inline unsigned int
 hb_popcount (T v)
 {
 #if (defined(__GNUC__) && (__GNUC__ >= 4)) || defined(__clang__)
@@ -416,7 +581,7 @@
 
 /* Returns the number of bits needed to store number */
 template <typename T>
-static inline HB_CONST_FUNC unsigned int
+static inline unsigned int
 hb_bit_storage (T v)
 {
   if (unlikely (!v)) return 0;
@@ -490,7 +655,7 @@
 
 /* Returns the number of zero bits in the least significant side of v */
 template <typename T>
-static inline HB_CONST_FUNC unsigned int
+static inline unsigned int
 hb_ctz (T v)
 {
   if (unlikely (!v)) return 8 * sizeof (T);
@@ -988,8 +1153,6 @@
 
 struct hb_bitwise_and
 { HB_PARTIALIZE(2);
-  static constexpr bool passthru_left = false;
-  static constexpr bool passthru_right = false;
   template <typename T> constexpr auto
   operator () (const T &a, const T &b) const HB_AUTO_RETURN (a & b)
 }
@@ -996,8 +1159,6 @@
 HB_FUNCOBJ (hb_bitwise_and);
 struct hb_bitwise_or
 { HB_PARTIALIZE(2);
-  static constexpr bool passthru_left = true;
-  static constexpr bool passthru_right = true;
   template <typename T> constexpr auto
   operator () (const T &a, const T &b) const HB_AUTO_RETURN (a | b)
 }
@@ -1004,8 +1165,6 @@
 HB_FUNCOBJ (hb_bitwise_or);
 struct hb_bitwise_xor
 { HB_PARTIALIZE(2);
-  static constexpr bool passthru_left = true;
-  static constexpr bool passthru_right = true;
   template <typename T> constexpr auto
   operator () (const T &a, const T &b) const HB_AUTO_RETURN (a ^ b)
 }
@@ -1012,8 +1171,6 @@
 HB_FUNCOBJ (hb_bitwise_xor);
 struct hb_bitwise_sub
 { HB_PARTIALIZE(2);
-  static constexpr bool passthru_left = true;
-  static constexpr bool passthru_right = false;
   template <typename T> constexpr auto
   operator () (const T &a, const T &b) const HB_AUTO_RETURN (a & ~b)
 }

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-array.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-array.hh	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-array.hh	2021-04-17 22:31:16 UTC (rev 58898)
@@ -142,7 +142,7 @@
   bool lfind (const T &x, unsigned *pos = nullptr) const
   {
     for (unsigned i = 0; i < length; ++i)
-      if (!this->arrayZ[i].cmp (x))
+      if (hb_equal (x, this->arrayZ[i]))
       {
 	if (pos)
 	  *pos = i;

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-atomic.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-atomic.hh	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-atomic.hh	2021-04-17 22:31:16 UTC (rev 58898)
@@ -52,7 +52,7 @@
 
 #elif !defined(HB_NO_MT) && defined(__ATOMIC_ACQUIRE)
 
-/* C++11-style GCC primitives. */
+/* C++11-style GCC primitives. We prefer these as they don't require linking to libstdc++ / libc++. */
 
 #define _hb_memory_barrier()			__sync_synchronize ()
 
@@ -73,8 +73,9 @@
 }
 #define hb_atomic_ptr_impl_cmpexch(P,O,N)	_hb_atomic_ptr_impl_cmplexch ((const void **) (P), (O), (N))
 
-#elif !defined(HB_NO_MT) && __cplusplus >= 201103L
 
+#elif !defined(HB_NO_MT)
+
 /* C++11 atomics. */
 
 #include <atomic>
@@ -101,117 +102,6 @@
 #define hb_atomic_ptr_impl_cmpexch(P,O,N)	_hb_atomic_ptr_impl_cmplexch ((const void **) (P), (O), (N))
 
 
-#elif !defined(HB_NO_MT) && defined(_WIN32)
-
-#include <windows.h>
-
-static inline void _hb_memory_barrier ()
-{
-#if !defined(MemoryBarrier) && !defined(__MINGW32_VERSION)
-  /* MinGW has a convoluted history of supporting MemoryBarrier. */
-  LONG dummy = 0;
-  InterlockedExchange (&dummy, 1);
-#else
-  MemoryBarrier ();
-#endif
-}
-#define _hb_memory_barrier()			_hb_memory_barrier ()
-
-#define hb_atomic_int_impl_add(AI, V)		InterlockedExchangeAdd ((LONG *) (AI), (V))
-static_assert ((sizeof (LONG) == sizeof (int)), "");
-
-#define hb_atomic_ptr_impl_cmpexch(P,O,N)	(InterlockedCompareExchangePointer ((P), (N), (O)) == (O))
-
-
-#elif !defined(HB_NO_MT) && defined(HAVE_INTEL_ATOMIC_PRIMITIVES)
-
-#define _hb_memory_barrier()			__sync_synchronize ()
-
-#define hb_atomic_int_impl_add(AI, V)		__sync_fetch_and_add ((AI), (V))
-
-#define hb_atomic_ptr_impl_cmpexch(P,O,N)	__sync_bool_compare_and_swap ((P), (O), (N))
-
-
-#elif !defined(HB_NO_MT) && defined(HAVE_SOLARIS_ATOMIC_OPS)
-
-#include <atomic.h>
-#include <mbarrier.h>
-
-#define _hb_memory_r_barrier()			__machine_r_barrier ()
-#define _hb_memory_w_barrier()			__machine_w_barrier ()
-#define _hb_memory_barrier()			__machine_rw_barrier ()
-
-static inline int _hb_fetch_and_add (int *AI, int V)
-{
-  _hb_memory_w_barrier ();
-  int result = atomic_add_int_nv ((uint_t *) AI, V) - V;
-  _hb_memory_r_barrier ();
-  return result;
-}
-static inline bool _hb_compare_and_swap_ptr (void **P, void *O, void *N)
-{
-  _hb_memory_w_barrier ();
-  bool result = atomic_cas_ptr (P, O, N) == O;
-  _hb_memory_r_barrier ();
-  return result;
-}
-
-#define hb_atomic_int_impl_add(AI, V)           _hb_fetch_and_add ((AI), (V))
-
-#define hb_atomic_ptr_impl_cmpexch(P,O,N)       _hb_compare_and_swap_ptr ((P), (O), (N))
-
-
-#elif !defined(HB_NO_MT) && defined(__APPLE__)
-
-#include <libkern/OSAtomic.h>
-#ifdef __MAC_OS_X_MIN_REQUIRED
-#include <AvailabilityMacros.h>
-#elif defined(__IPHONE_OS_MIN_REQUIRED)
-#include <Availability.h>
-#endif
-
-#define _hb_memory_barrier()			OSMemoryBarrier ()
-
-#define hb_atomic_int_impl_add(AI, V)		(OSAtomicAdd32Barrier ((V), (AI)) - (V))
-
-#if (MAC_OS_X_VERSION_MIN_REQUIRED > MAC_OS_X_VERSION_10_4 || __IPHONE_VERSION_MIN_REQUIRED >= 20100)
-#define hb_atomic_ptr_impl_cmpexch(P,O,N)	OSAtomicCompareAndSwapPtrBarrier ((O), (N), (P))
-#else
-#if __ppc64__ || __x86_64__ || __aarch64__
-#define hb_atomic_ptr_impl_cmpexch(P,O,N)	OSAtomicCompareAndSwap64Barrier ((int64_t) (O), (int64_t) (N), (int64_t*) (P))
-#else
-#define hb_atomic_ptr_impl_cmpexch(P,O,N)	OSAtomicCompareAndSwap32Barrier ((int32_t) (O), (int32_t) (N), (int32_t*) (P))
-#endif
-#endif
-
-
-#elif !defined(HB_NO_MT) && defined(_AIX) && (defined(__IBMCPP__) || defined(__ibmxl__))
-
-#include <builtins.h>
-
-#define _hb_memory_barrier()			__lwsync ()
-
-static inline int _hb_fetch_and_add (int *AI, int V)
-{
-  _hb_memory_barrier ();
-  int result = __fetch_and_add (AI, V);
-  _hb_memory_barrier ();
-  return result;
-}
-static inline bool _hb_compare_and_swaplp (long *P, long O, long N)
-{
-  _hb_memory_barrier ();
-  bool result = __compare_and_swaplp (P, &O, N);
-  _hb_memory_barrier ();
-  return result;
-}
-
-#define hb_atomic_int_impl_add(AI, V)           _hb_fetch_and_add ((AI), (V))
-
-#define hb_atomic_ptr_impl_cmpexch(P,O,N)       _hb_compare_and_swaplp ((long *) (P), (long) (O), (long) (N))
-static_assert ((sizeof (long) == sizeof (void *)), "");
-
-
 #elif defined(HB_NO_MT)
 
 #define hb_atomic_int_impl_add(AI, V)		((*(AI) += (V)) - (V))
@@ -259,9 +149,11 @@
 #endif
 
 
-#define HB_ATOMIC_INT_INIT(V)          {V}
 struct hb_atomic_int_t
 {
+  hb_atomic_int_t () = default;
+  constexpr hb_atomic_int_t (int v) : v (v) {}
+
   void set_relaxed (int v_) { hb_atomic_int_impl_set_relaxed (&v, v_); }
   void set (int v_) { hb_atomic_int_impl_set (&v, v_); }
   int get_relaxed () const { return hb_atomic_int_impl_get_relaxed (&v); }
@@ -269,16 +161,17 @@
   int inc () { return hb_atomic_int_impl_add (&v,  1); }
   int dec () { return hb_atomic_int_impl_add (&v, -1); }
 
-  int v;
+  int v = 0;
 };
 
-
-#define HB_ATOMIC_PTR_INIT(V)          {V}
 template <typename P>
 struct hb_atomic_ptr_t
 {
   typedef hb_remove_pointer<P> T;
 
+  hb_atomic_ptr_t () = default;
+  constexpr hb_atomic_ptr_t (T* v) : v (v) {}
+
   void init (T* v_ = nullptr) { set_relaxed (v_); }
   void set_relaxed (T* v_) { hb_atomic_ptr_impl_set_relaxed (&v, v_); }
   T *get_relaxed () const { return (T *) hb_atomic_ptr_impl_get_relaxed (&v); }
@@ -288,7 +181,7 @@
   T * operator -> () const                    { return get (); }
   template <typename C> operator C * () const { return get (); }
 
-  T *v;
+  T *v = nullptr;
 };
 
 

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-blob.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-blob.cc	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-blob.cc	2021-04-17 22:31:16 UTC (rev 58898)
@@ -35,10 +35,7 @@
 #include <sys/mman.h>
 #endif /* HAVE_SYS_MMAN_H */
 
-#include <stdio.h>
-#include <stdlib.h>
 
-
 /**
  * SECTION: hb-blob
  * @title: hb-blob
@@ -58,7 +55,7 @@
  * @length: Length of @data in bytes.
  * @mode: Memory mode for @data.
  * @user_data: Data parameter to pass to @destroy.
- * @destroy: (optional): Callback to call when @data is not needed anymore.
+ * @destroy: (nullable): Callback to call when @data is not needed anymore.
  *
  * Creates a new "blob" object wrapping @data.  The @mode parameter is used
  * to negotiate ownership and lifecycle of @data.
@@ -116,7 +113,7 @@
  * @length: Length of sub-blob.
  *
  * Returns a blob that represents a range of bytes in @parent.  The new
- * blob is always created with %HB_MEMORY_MODE_READONLY, meaning that it
+ * blob is always created with #HB_MEMORY_MODE_READONLY, meaning that it
  * will never modify data in the parent blob.  The parent data is not
  * expected to be modified, and will result in undefined behavior if it
  * is.
@@ -237,7 +234,7 @@
  * @blob: An #hb_blob_t
  * @key: The user-data key to set
  * @data: A pointer to the user data to set
- * @destroy: (optional): A callback to call when @data is not needed anymore
+ * @destroy: (nullable): A callback to call when @data is not needed anymore
  * @replace: Whether to replace an existing data with the same key
  *
  * Attaches a user-data key/data pair to the specified blob.
@@ -299,7 +296,7 @@
  *
  * Tests whether a blob is immutable.
  *
- * Return value: %true if @blob is immutable, false otherwise
+ * Return value: %true if @blob is immutable, %false otherwise
  *
  * Since: 0.9.2
  **/
@@ -365,16 +362,14 @@
 char *
 hb_blob_get_data_writable (hb_blob_t *blob, unsigned int *length)
 {
-  if (!blob->try_make_writable ()) {
-    if (length)
-      *length = 0;
-
+  if (hb_object_is_immutable (blob) ||
+     !blob->try_make_writable ())
+  {
+    if (length) *length = 0;
     return nullptr;
   }
 
-  if (length)
-    *length = blob->length;
-
+  if (length) *length = blob->length;
   return const_cast<char *> (blob->data);
 }
 
@@ -440,8 +435,8 @@
 bool
 hb_blob_t::try_make_writable ()
 {
-  if (hb_object_is_immutable (this))
-    return false;
+  if (unlikely (!length))
+    mode = HB_MEMORY_MODE_WRITABLE;
 
   if (this->mode == HB_MEMORY_MODE_WRITABLE)
     return true;

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-blob.h
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-blob.h	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-blob.h	2021-04-17 22:31:16 UTC (rev 58898)
@@ -24,7 +24,7 @@
  * Red Hat Author(s): Behdad Esfahbod
  */
 
-#ifndef HB_H_IN
+#if !defined(HB_H_IN) && !defined(HB_NO_SINGLE_HEADER_ERROR)
 #error "Include <hb.h> instead."
 #endif
 
@@ -38,10 +38,12 @@
 
 /**
  * hb_memory_mode_t:
- * @HB_MEMORY_MODE_DUPLICATE
- * @HB_MEMORY_MODE_READONLY
- * @HB_MEMORY_MODE_WRITABLE
- * @HB_MEMORY_MODE_READONLY_MAY_MAKE_WRITABLE
+ * @HB_MEMORY_MODE_DUPLICATE: HarfBuzz immediately makes a copy of the data.
+ * @HB_MEMORY_MODE_READONLY: HarfBuzz client will never modify the data,
+ *     and HarfBuzz will never modify the data.
+ * @HB_MEMORY_MODE_WRITABLE: HarfBuzz client made a copy of the data solely
+ *     for HarfBuzz, so HarfBuzz may modify the data.
+ * @HB_MEMORY_MODE_READONLY_MAY_MAKE_WRITABLE: See above
  *
  * Data type holding the memory modes available to
  * client programs.

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer-serialize.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer-serialize.cc	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer-serialize.cc	2021-04-17 22:31:16 UTC (rev 58898)
@@ -400,8 +400,8 @@
  * @buf: (out) (array length=buf_size) (element-type uint8_t): output string to
  *       write serialized buffer into.
  * @buf_size: the size of @buf.
- * @buf_consumed: (out) (allow-none): if not %NULL, will be set to the number of byes written into @buf.
- * @font: (allow-none): the #hb_font_t used to shape this buffer, needed to
+ * @buf_consumed: (out) (optional): if not %NULL, will be set to the number of byes written into @buf.
+ * @font: (nullable): the #hb_font_t used to shape this buffer, needed to
  *        read glyph names and extents. If %NULL, and empty font will be used.
  * @format: the #hb_buffer_serialize_format_t to use for formatting the output.
  * @flags: the #hb_buffer_serialize_flags_t that control what glyph properties
@@ -514,8 +514,10 @@
  * @buf: (out) (array length=buf_size) (element-type uint8_t): output string to
  *       write serialized buffer into.
  * @buf_size: the size of @buf.
- * @buf_consumed: (out) (allow-none): if not %NULL, will be set to the number of byes written into @buf.
+ * @buf_consumed: (out) (optional): if not %NULL, will be set to the number of byes written into @buf.
  * @format: the #hb_buffer_serialize_format_t to use for formatting the output.
+ * @flags: the #hb_buffer_serialize_flags_t that control what glyph properties
+ *         to serialize.
  *
  * Serializes @buffer into a textual representation of its content,
  * when the buffer contains Unicode codepoints (i.e., before shaping). This is
@@ -635,8 +637,8 @@
  * @buf: (out) (array length=buf_size) (element-type uint8_t): output string to
  *       write serialized buffer into.
  * @buf_size: the size of @buf.
- * @buf_consumed: (out) (allow-none): if not %NULL, will be set to the number of byes written into @buf.
- * @font: (allow-none): the #hb_font_t used to shape this buffer, needed to
+ * @buf_consumed: (out) (optional): if not %NULL, will be set to the number of byes written into @buf.
+ * @font: (nullable): the #hb_font_t used to shape this buffer, needed to
  *        read glyph names and extents. If %NULL, and empty font will be used.
  * @format: the #hb_buffer_serialize_format_t to use for formatting the output.
  * @flags: the #hb_buffer_serialize_flags_t that control what glyph properties
@@ -724,16 +726,18 @@
 /**
  * hb_buffer_deserialize_glyphs:
  * @buffer: an #hb_buffer_t buffer.
- * @buf: (array length=buf_len):
- * @buf_len:
- * @end_ptr: (out):
- * @font:
- * @format:
+ * @buf: (array length=buf_len): string to deserialize
+ * @buf_len: the size of @buf, or -1 if it is %NULL-terminated
+ * @end_ptr: (out) (optional): output pointer to the character after last
+ *                               consumed one.
+ * @font: (nullable): font for getting glyph IDs
+ * @format: the #hb_buffer_serialize_format_t of the input @buf
  *
+ * Deserializes glyphs @buffer from textual representation in the format
+ * produced by hb_buffer_serialize_glyphs().
  *
+ * Return value: %true if @buf is not fully consumed, %false otherwise.
  *
- * Return value:
- *
  * Since: 0.9.7
  **/
 hb_bool_t
@@ -795,15 +799,17 @@
 /**
  * hb_buffer_deserialize_unicode:
  * @buffer: an #hb_buffer_t buffer.
- * @buf: (array length=buf_len):
- * @buf_len:
- * @end_ptr: (out):
- * @format:
+ * @buf: (array length=buf_len): string to deserialize
+ * @buf_len: the size of @buf, or -1 if it is %NULL-terminated
+ * @end_ptr: (out) (optional): output pointer to the character after last
+ *                               consumed one.
+ * @format: the #hb_buffer_serialize_format_t of the input @buf
  *
+ * Deserializes Unicode @buffer from textual representation in the format
+ * produced by hb_buffer_serialize_unicode().
  *
+ * Return value: %true if @buf is not fully consumed, %false otherwise.
  *
- * Return value:
- *
  * Since: 2.7.3
  **/
 hb_bool_t

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer.cc	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer.cc	2021-04-17 22:31:16 UTC (rev 58898)
@@ -218,9 +218,6 @@
 void
 hb_buffer_t::reset ()
 {
-  if (unlikely (hb_object_is_immutable (this)))
-    return;
-
   hb_unicode_funcs_destroy (unicode);
   unicode = hb_unicode_funcs_reference (hb_unicode_funcs_get_default ());
   flags = HB_BUFFER_FLAG_DEFAULT;
@@ -233,9 +230,6 @@
 void
 hb_buffer_t::clear ()
 {
-  if (unlikely (hb_object_is_immutable (this)))
-    return;
-
   hb_segment_properties_t default_props = HB_SEGMENT_PROPERTIES_DEFAULT;
   props = default_props;
   scratch_flags = HB_BUFFER_SCRATCH_FLAG_DEFAULT;
@@ -290,9 +284,6 @@
 void
 hb_buffer_t::remove_output ()
 {
-  if (unlikely (hb_object_is_immutable (this)))
-    return;
-
   have_output = false;
   have_positions = false;
 
@@ -303,9 +294,6 @@
 void
 hb_buffer_t::clear_output ()
 {
-  if (unlikely (hb_object_is_immutable (this)))
-    return;
-
   have_output = true;
   have_positions = false;
 
@@ -316,9 +304,6 @@
 void
 hb_buffer_t::clear_positions ()
 {
-  if (unlikely (hb_object_is_immutable (this)))
-    return;
-
   have_output = false;
   have_positions = true;
 
@@ -333,15 +318,19 @@
 {
   if (unlikely (!successful)) return;
 
+  assert (idx <= len);
+  if (unlikely (!next_glyphs (len - idx))) return;
+
   assert (have_output);
   have_output = false;
 
   if (out_info != info)
   {
-    hb_glyph_info_t *tmp_string;
-    tmp_string = info;
+    hb_glyph_info_t *tmp;
+    tmp = info;
     info = out_info;
-    out_info = tmp_string;
+    out_info = tmp;
+
     pos = (hb_glyph_position_t *) out_info;
   }
 
@@ -353,31 +342,6 @@
   idx = 0;
 }
 
-
-void
-hb_buffer_t::replace_glyphs (unsigned int num_in,
-			     unsigned int num_out,
-			     const uint32_t *glyph_data)
-{
-  if (unlikely (!make_room_for (num_in, num_out))) return;
-
-  assert (idx + num_in <= len);
-
-  merge_clusters (idx, idx + num_in);
-
-  hb_glyph_info_t orig_info = info[idx];
-  hb_glyph_info_t *pinfo = &out_info[out_len];
-  for (unsigned int i = 0; i < num_out; i++)
-  {
-    *pinfo = orig_info;
-    pinfo->codepoint = glyph_data[i];
-    pinfo++;
-  }
-
-  idx  += num_in;
-  out_len += num_out;
-}
-
 bool
 hb_buffer_t::move_to (unsigned int i)
 {
@@ -768,7 +732,7 @@
  * @buffer: An #hb_buffer_t
  * @key: The user-data key
  * @data: A pointer to the user data
- * @destroy: (optional): A callback to call when @data is not needed anymore
+ * @destroy: (nullable): A callback to call when @data is not needed anymore
  * @replace: Whether to replace an existing data with the same key
  *
  * Attaches a user-data key/data pair to the specified buffer. 
@@ -795,7 +759,7 @@
  * Fetches the user data associated with the specified key,
  * attached to the specified buffer.
  *
- * Return value: (transfer-none): A pointer to the user data
+ * Return value: (transfer none): A pointer to the user data
  *
  * Since: 0.9.2
  **/
@@ -1137,7 +1101,7 @@
  * Sets the #hb_codepoint_t that replaces invalid entries for a given encoding
  * when adding text to @buffer.
  *
- * Default is %HB_BUFFER_REPLACEMENT_CODEPOINT_DEFAULT.
+ * Default is #HB_BUFFER_REPLACEMENT_CODEPOINT_DEFAULT.
  *
  * Since: 0.9.31
  **/
@@ -1222,6 +1186,9 @@
 void
 hb_buffer_reset (hb_buffer_t *buffer)
 {
+  if (unlikely (hb_object_is_immutable (buffer)))
+    return;
+
   buffer->reset ();
 }
 
@@ -1237,6 +1204,9 @@
 void
 hb_buffer_clear_contents (hb_buffer_t *buffer)
 {
+  if (unlikely (hb_object_is_immutable (buffer)))
+    return;
+
   buffer->clear ();
 }
 
@@ -1321,7 +1291,7 @@
   if (unlikely (hb_object_is_immutable (buffer)))
     return length == 0;
 
-  if (!buffer->ensure (length))
+  if (unlikely (!buffer->ensure (length)))
     return false;
 
   /* Wipe the new space */
@@ -1501,20 +1471,20 @@
  *
  * Sets unset buffer segment properties based on buffer Unicode
  * contents.  If buffer is not empty, it must have content type
- * %HB_BUFFER_CONTENT_TYPE_UNICODE.
+ * #HB_BUFFER_CONTENT_TYPE_UNICODE.
  *
- * If buffer script is not set (ie. is %HB_SCRIPT_INVALID), it
+ * If buffer script is not set (ie. is #HB_SCRIPT_INVALID), it
  * will be set to the Unicode script of the first character in
- * the buffer that has a script other than %HB_SCRIPT_COMMON,
- * %HB_SCRIPT_INHERITED, and %HB_SCRIPT_UNKNOWN.
+ * the buffer that has a script other than #HB_SCRIPT_COMMON,
+ * #HB_SCRIPT_INHERITED, and #HB_SCRIPT_UNKNOWN.
  *
- * Next, if buffer direction is not set (ie. is %HB_DIRECTION_INVALID),
+ * Next, if buffer direction is not set (ie. is #HB_DIRECTION_INVALID),
  * it will be set to the natural horizontal direction of the
  * buffer script as returned by hb_script_get_horizontal_direction().
- * If hb_script_get_horizontal_direction() returns %HB_DIRECTION_INVALID,
- * then %HB_DIRECTION_LTR is used.
+ * If hb_script_get_horizontal_direction() returns #HB_DIRECTION_INVALID,
+ * then #HB_DIRECTION_LTR is used.
  *
- * Finally, if buffer language is not set (ie. is %HB_LANGUAGE_INVALID),
+ * Finally, if buffer language is not set (ie. is #HB_LANGUAGE_INVALID),
  * it will be set to the process's default language as returned by
  * hb_language_get_default().  This may change in the future by
  * taking buffer script into consideration when choosing a language.
@@ -1551,7 +1521,10 @@
   if (item_length == -1)
     item_length = text_length - item_offset;
 
-  buffer->ensure (buffer->len + item_length * sizeof (T) / 4);
+  if (unlikely (item_length < 0 ||
+		item_length > INT_MAX / 8 ||
+		!buffer->ensure (buffer->len + item_length * sizeof (T) / 4)))
+    return;
 
   /* If buffer is empty and pre-context provided, install it.
    * This check is written this way, to make sure people can
@@ -1768,11 +1741,6 @@
   if (start == end)
     return;
 
-  if (!buffer->len)
-    buffer->content_type = source->content_type;
-  if (!buffer->have_positions && source->have_positions)
-    buffer->clear_positions ();
-
   if (buffer->len + (end - start) < buffer->len) /* Overflows. */
   {
     buffer->successful = false;
@@ -1784,6 +1752,11 @@
   if (unlikely (!buffer->successful))
     return;
 
+  if (!orig_len)
+    buffer->content_type = source->content_type;
+  if (!buffer->have_positions && source->have_positions)
+    buffer->clear_positions ();
+
   memcpy (buffer->info + orig_len, source->info + start, (end - start) * sizeof (buffer->info[0]));
   if (buffer->have_positions)
     memcpy (buffer->pos + orig_len, source->pos + start, (end - start) * sizeof (buffer->pos[0]));
@@ -1902,8 +1875,8 @@
  * @dottedcircle_glyph: glyph id of U+25CC DOTTED CIRCLE, or (hb_codepont_t) -1.
  * @position_fuzz: allowed absolute difference in position values.
  *
- * If dottedcircle_glyph is (hb_codepoint_t) -1 then %HB_BUFFER_DIFF_FLAG_DOTTED_CIRCLE_PRESENT
- * and %HB_BUFFER_DIFF_FLAG_NOTDEF_PRESENT are never returned.  This should be used by most
+ * If dottedcircle_glyph is (hb_codepoint_t) -1 then #HB_BUFFER_DIFF_FLAG_DOTTED_CIRCLE_PRESENT
+ * and #HB_BUFFER_DIFF_FLAG_NOTDEF_PRESENT are never returned.  This should be used by most
  * callers if just comparing two buffers is needed.
  *
  * Since: 1.5.0
@@ -1994,12 +1967,12 @@
 /**
  * hb_buffer_set_message_func:
  * @buffer: An #hb_buffer_t
- * @func: (closure user_data) (destroy destroy) (scope notified):
- * @user_data:
- * @destroy:
+ * @func: (closure user_data) (destroy destroy) (scope notified): Callback function
+ * @user_data: (nullable): Data to pass to @func
+ * @destroy: (nullable): The function to call when @user_data is not needed anymore
  *
+ * Sets the implementation function for #hb_buffer_message_func_t.
  *
- *
  * Since: 1.1.3
  **/
 void

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer.h
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer.h	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer.h	2021-04-17 22:31:16 UTC (rev 58898)
@@ -27,7 +27,7 @@
  * Google Author(s): Behdad Esfahbod
  */
 
-#ifndef HB_H_IN
+#if !defined(HB_H_IN) && !defined(HB_NO_SINGLE_HEADER_ERROR)
 #error "Include <hb.h> instead."
 #endif
 
@@ -90,6 +90,8 @@
  * 				   breaking point only.
  * @HB_GLYPH_FLAG_DEFINED: All the currently defined flags.
  *
+ * Flags for #hb_glyph_info_t.
+ *
  * Since: 1.5.0
  */
 typedef enum { /*< flags >*/
@@ -150,6 +152,11 @@
   void           *reserved2;
 } hb_segment_properties_t;
 
+/**
+ * HB_SEGMENT_PROPERTIES_DEFAULT:
+ *
+ * The default #hb_segment_properties_t of of freshly created #hb_buffer_t.
+ */
 #define HB_SEGMENT_PROPERTIES_DEFAULT {HB_DIRECTION_INVALID, \
 				       HB_SCRIPT_INVALID, \
 				       HB_LANGUAGE_INVALID, \
@@ -203,6 +210,8 @@
  * @HB_BUFFER_CONTENT_TYPE_INVALID: Initial value for new buffer.
  * @HB_BUFFER_CONTENT_TYPE_UNICODE: The buffer contains input characters (before shaping).
  * @HB_BUFFER_CONTENT_TYPE_GLYPHS: The buffer contains output glyphs (after shaping).
+ *
+ * The type of #hb_buffer_t contents.
  */
 typedef enum {
   HB_BUFFER_CONTENT_TYPE_INVALID = 0,
@@ -288,6 +297,8 @@
  *                      not be inserted in the rendering of incorrect
  *                      character sequences (such at <0905 093E>). Since: 2.4
  *
+ * Flags for #hb_buffer_t.
+ *
  * Since: 0.9.20
  */
 typedef enum { /*< flags >*/
@@ -579,6 +590,35 @@
  * Compare buffers
  */
 
+/**
+ * hb_buffer_diff_flags_t:
+ * @HB_BUFFER_DIFF_FLAG_EQUAL: equal buffers.
+ * @HB_BUFFER_DIFF_FLAG_CONTENT_TYPE_MISMATCH: buffers with different
+ *     #hb_buffer_content_type_t.
+ * @HB_BUFFER_DIFF_FLAG_LENGTH_MISMATCH: buffers with differing length.
+ * @HB_BUFFER_DIFF_FLAG_NOTDEF_PRESENT: `.notdef` glyph is present in the
+ *     reference buffer.
+ * @HB_BUFFER_DIFF_FLAG_DOTTED_CIRCLE_PRESENT: dotted circle glyph is present
+ *     in the reference buffer.
+ * @HB_BUFFER_DIFF_FLAG_CODEPOINT_MISMATCH: difference in #hb_glyph_info_t.codepoint
+ * @HB_BUFFER_DIFF_FLAG_CLUSTER_MISMATCH: difference in #hb_glyph_info_t.cluster
+ * @HB_BUFFER_DIFF_FLAG_GLYPH_FLAGS_MISMATCH: difference in #hb_glyph_flags_t.
+ * @HB_BUFFER_DIFF_FLAG_POSITION_MISMATCH: difference in #hb_glyph_position_t.
+ *
+ * Flags from comparing two #hb_buffer_t's.
+ *
+ * Buffer with different #hb_buffer_content_type_t cannot be meaningfully
+ * compared in any further detail.
+ *
+ * For buffers with differing length, the per-glyph comparison is not
+ * attempted, though we do still scan reference buffer for dotted circle and
+ * `.notdef` glyphs.
+ *
+ * If the buffers have the same length, we compare them glyph-by-glyph and
+ * report which aspect(s) of the glyph info/position are different.
+ *
+ * Since: 1.5.0
+ */
 typedef enum { /*< flags >*/
   HB_BUFFER_DIFF_FLAG_EQUAL			= 0x0000,
 
@@ -618,6 +658,23 @@
  * Debugging.
  */
 
+/**
+ * hb_buffer_message_func_t:
+ * @buffer: An #hb_buffer_t to work upon
+ * @font: The #hb_font_t the @buffer is shaped with
+ * @message: %NULL-terminated message passed to the function
+ * @user_data: User data pointer passed by the caller
+ *
+ * A callback method for #hb_buffer_t. The method gets called with the
+ * #hb_buffer_t it was set on, the #hb_font_t the buffer is shaped with and a
+ * message describing what step of the shaping process will be performed.
+ * Returning %false from this method will skip this shaping step and move to
+ * the next one.
+ *
+ * Return value: %true to perform the shaping step, %false to skip it.
+ *
+ * Since: 1.1.3
+ */
 typedef hb_bool_t	(*hb_buffer_message_func_t)	(hb_buffer_t *buffer,
 							 hb_font_t   *font,
 							 const char  *message,

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer.hh	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer.hh	2021-04-17 22:31:16 UTC (rev 58898)
@@ -139,7 +139,7 @@
 
   /* Methods */
 
-  bool in_error () const { return !successful; }
+  HB_NODISCARD bool in_error () const { return !successful; }
 
   void allocate_var (unsigned int start, unsigned int count)
   {
@@ -186,7 +186,7 @@
   hb_glyph_info_t &prev ()      { return out_info[out_len ? out_len - 1 : 0]; }
   hb_glyph_info_t prev () const { return out_info[out_len ? out_len - 1 : 0]; }
 
-  bool has_separate_output () const { return info != out_info; }
+  HB_NODISCARD bool has_separate_output () const { return info != out_info; }
 
 
   HB_INTERNAL void reset ();
@@ -210,63 +210,65 @@
   HB_INTERNAL void clear_output ();
   HB_INTERNAL void clear_positions ();
 
-  HB_INTERNAL void replace_glyphs (unsigned int num_in,
-				   unsigned int num_out,
-				   const hb_codepoint_t *glyph_data);
+  template <typename T>
+  HB_NODISCARD bool replace_glyphs (unsigned int num_in,
+				    unsigned int num_out,
+				    const T *glyph_data)
+  {
+    if (unlikely (!make_room_for (num_in, num_out))) return false;
 
-  void replace_glyph (hb_codepoint_t glyph_index)
-  {
-    if (unlikely (out_info != info || out_len != idx)) {
-      if (unlikely (!make_room_for (1, 1))) return;
-      out_info[out_len] = info[idx];
+    assert (idx + num_in <= len);
+
+    merge_clusters (idx, idx + num_in);
+
+    hb_glyph_info_t &orig_info = idx < len ? cur() : prev();
+
+    hb_glyph_info_t *pinfo = &out_info[out_len];
+    for (unsigned int i = 0; i < num_out; i++)
+    {
+      *pinfo = orig_info;
+      pinfo->codepoint = glyph_data[i];
+      pinfo++;
     }
-    out_info[out_len].codepoint = glyph_index;
 
-    idx++;
-    out_len++;
+    idx  += num_in;
+    out_len += num_out;
+    return true;
   }
-  /* Makes a copy of the glyph at idx to output and replace glyph_index */
-  hb_glyph_info_t & output_glyph (hb_codepoint_t glyph_index)
-  {
-    if (unlikely (!make_room_for (0, 1))) return Crap (hb_glyph_info_t);
 
-    if (unlikely (idx == len && !out_len))
-      return Crap (hb_glyph_info_t);
+  HB_NODISCARD bool replace_glyph (hb_codepoint_t glyph_index)
+  { return replace_glyphs (1, 1, &glyph_index); }
 
-    out_info[out_len] = idx < len ? info[idx] : out_info[out_len - 1];
-    out_info[out_len].codepoint = glyph_index;
+  /* Makes a copy of the glyph at idx to output and replace glyph_index */
+  HB_NODISCARD bool output_glyph (hb_codepoint_t glyph_index)
+  { return replace_glyphs (0, 1, &glyph_index); }
 
-    out_len++;
-
-    return out_info[out_len - 1];
-  }
-  void output_info (const hb_glyph_info_t &glyph_info)
+  HB_NODISCARD bool output_info (const hb_glyph_info_t &glyph_info)
   {
-    if (unlikely (!make_room_for (0, 1))) return;
+    if (unlikely (!make_room_for (0, 1))) return false;
 
     out_info[out_len] = glyph_info;
 
     out_len++;
+    return true;
   }
   /* Copies glyph at idx to output but doesn't advance idx */
-  void copy_glyph ()
+  HB_NODISCARD bool copy_glyph ()
   {
-    if (unlikely (!make_room_for (0, 1))) return;
+    /* Extra copy because cur()'s return can be freed within
+     * output_info() call if buffer reallocates. */
+    return output_info (hb_glyph_info_t (cur()));
+  }
 
-    out_info[out_len] = info[idx];
-
-    out_len++;
-  }
   /* Copies glyph at idx to output and advance idx.
    * If there's no output, just advance idx. */
-  void
-  next_glyph ()
+  HB_NODISCARD bool next_glyph ()
   {
     if (have_output)
     {
       if (out_info != info || out_len != idx)
       {
-	if (unlikely (!make_room_for (1, 1))) return;
+	if (unlikely (!make_room_for (1, 1))) return false;
 	out_info[out_len] = info[idx];
       }
       out_len++;
@@ -273,17 +275,17 @@
     }
 
     idx++;
+    return true;
   }
   /* Copies n glyphs at idx to output and advance idx.
    * If there's no output, just advance idx. */
-  void
-  next_glyphs (unsigned int n)
+  HB_NODISCARD bool next_glyphs (unsigned int n)
   {
     if (have_output)
     {
       if (out_info != info || out_len != idx)
       {
-	if (unlikely (!make_room_for (n, n))) return;
+	if (unlikely (!make_room_for (n, n))) return false;
 	memmove (out_info + out_len, info + idx, n * sizeof (out_info[0]));
       }
       out_len += n;
@@ -290,6 +292,7 @@
     }
 
     idx += n;
+    return true;
   }
   /* Advance idx without copying to output. */
   void skip_glyph () { idx++; }
@@ -329,14 +332,14 @@
 
 
   /* Internal methods */
-  HB_INTERNAL bool move_to (unsigned int i); /* i is output-buffer index. */
+  HB_NODISCARD HB_INTERNAL bool move_to (unsigned int i); /* i is output-buffer index. */
 
-  HB_INTERNAL bool enlarge (unsigned int size);
+  HB_NODISCARD HB_INTERNAL bool enlarge (unsigned int size);
 
-  bool ensure (unsigned int size)
+  HB_NODISCARD bool ensure (unsigned int size)
   { return likely (!size || size < allocated) ? true : enlarge (size); }
 
-  bool ensure_inplace (unsigned int size)
+  HB_NODISCARD bool ensure_inplace (unsigned int size)
   { return likely (!size || size < allocated); }
 
   void assert_glyphs ()
@@ -349,7 +352,7 @@
     assert ((content_type == HB_BUFFER_CONTENT_TYPE_UNICODE) ||
 	    (!len && (content_type == HB_BUFFER_CONTENT_TYPE_INVALID)));
   }
-  bool ensure_glyphs ()
+  HB_NODISCARD bool ensure_glyphs ()
   {
     if (unlikely (content_type != HB_BUFFER_CONTENT_TYPE_GLYPHS))
     {
@@ -360,7 +363,7 @@
     }
     return true;
   }
-  bool ensure_unicode ()
+  HB_NODISCARD bool ensure_unicode ()
   {
     if (unlikely (content_type != HB_BUFFER_CONTENT_TYPE_UNICODE))
     {
@@ -372,8 +375,8 @@
     return true;
   }
 
-  HB_INTERNAL bool make_room_for (unsigned int num_in, unsigned int num_out);
-  HB_INTERNAL bool shift_forward (unsigned int count);
+  HB_NODISCARD HB_INTERNAL bool make_room_for (unsigned int num_in, unsigned int num_out);
+  HB_NODISCARD HB_INTERNAL bool shift_forward (unsigned int count);
 
   typedef long scratch_buffer_t;
   HB_INTERNAL scratch_buffer_t *get_scratch_buffer (unsigned int *size);

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-common.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-common.cc	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-common.cc	2021-04-17 22:31:16 UTC (rev 58898)
@@ -675,8 +675,8 @@
  * Tests the library version against a minimum value,
  * as three integer components.
  *
- * Return value: True if the library is equal to or greater than
- * the test value, false otherwise
+ * Return value: %true if the library is equal to or greater than
+ * the test value, %false otherwise
  *
  * Since: 0.9.30
  **/
@@ -1003,7 +1003,22 @@
 
 /**
  * hb_variation_from_string:
+ * @str: (array length=len) (element-type uint8_t): a string to parse
+ * @len: length of @str, or -1 if string is %NULL terminated
+ * @variation: (out): the #hb_variation_t to initialize with the parsed values
  *
+ * Parses a string into a #hb_variation_t.
+ *
+ * The format for specifying variation settings follows. All valid CSS
+ * font-variation-settings values other than 'normal' and 'inherited' are also
+ * accepted, though, not documented below.
+ *
+ * The format is a tag, optionally followed by an equals sign, followed by a
+ * number. For example `wght=500`, or `slnt=-7.5`.
+ *
+ * Return value:
+ * %true if @str is successfully parsed, %false otherwise
+ *
  * Since: 1.4.2
  */
 hb_bool_t
@@ -1029,7 +1044,14 @@
 
 /**
  * hb_variation_to_string:
+ * @variation: an #hb_variation_t to convert
+ * @buf: (array length=size) (out): output string
+ * @size: the allocated size of @buf
  *
+ * Converts an #hb_variation_t into a %NULL-terminated string in the format
+ * understood by hb_variation_from_string(). The client in responsible for
+ * allocating big enough size for @buf, 128 bytes is more than enough.
+ *
  * Since: 1.4.2
  */
 void
@@ -1055,10 +1077,12 @@
 
 /**
  * hb_color_get_alpha:
- * color: a #hb_color_t we are interested in its channels.
+ * @color: an #hb_color_t we are interested in its channels.
  *
- * Return value: Alpha channel value of the given color
+ * Fetches the alpha channel of the given @color.
  *
+ * Return value: Alpha channel value
+ *
  * Since: 2.1.0
  */
 uint8_t
@@ -1069,10 +1093,12 @@
 
 /**
  * hb_color_get_red:
- * color: a #hb_color_t we are interested in its channels.
+ * @color: an #hb_color_t we are interested in its channels.
  *
- * Return value: Red channel value of the given color
+ * Fetches the red channel of the given @color.
  *
+ * Return value: Red channel value
+ *
  * Since: 2.1.0
  */
 uint8_t
@@ -1083,10 +1109,12 @@
 
 /**
  * hb_color_get_green:
- * color: a #hb_color_t we are interested in its channels.
+ * @color: an #hb_color_t we are interested in its channels.
  *
- * Return value: Green channel value of the given color
+ * Fetches the green channel of the given @color.
  *
+ * Return value: Green channel value
+ *
  * Since: 2.1.0
  */
 uint8_t
@@ -1097,10 +1125,12 @@
 
 /**
  * hb_color_get_blue:
- * color: a #hb_color_t we are interested in its channels.
+ * @color: an #hb_color_t we are interested in its channels.
  *
- * Return value: Blue channel value of the given color
+ * Fetches the blue channel of the given @color.
  *
+ * Return value: Blue channel value
+ *
  * Since: 2.1.0
  */
 uint8_t

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-common.h
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-common.h	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-common.h	2021-04-17 22:31:16 UTC (rev 58898)
@@ -26,7 +26,7 @@
  * Google Author(s): Behdad Esfahbod
  */
 
-#ifndef HB_H_IN
+#if !defined(HB_H_IN) && !defined(HB_NO_SINGLE_HEADER_ERROR)
 #error "Include <hb.h> instead."
 #endif
 
@@ -135,7 +135,7 @@
 
 /**
  * hb_tag_t:
- * 
+ *
  * Data type for tag identifiers. Tags are four
  * byte integers, each byte representing a character.
  *
@@ -148,8 +148,12 @@
 
 /**
  * HB_TAG:
+ * @c1: 1st character of the tag
+ * @c2: 2nd character of the tag
+ * @c3: 3rd character of the tag
+ * @c4: 4th character of the tag
  *
- * Constructs an #hb_tag_t from four characters.
+ * Constructs an #hb_tag_t from four character literals.
  *
  **/
 #define HB_TAG(c1,c2,c3,c4) ((hb_tag_t)((((uint32_t)(c1)&0xFF)<<24)|(((uint32_t)(c2)&0xFF)<<16)|(((uint32_t)(c3)&0xFF)<<8)|((uint32_t)(c4)&0xFF)))
@@ -156,14 +160,36 @@
 
 /**
  * HB_UNTAG:
+ * @tag: an #hb_tag_t
  *
- * Extracts the characters from an #hb_tag_t.
+ * Extracts four character literals from an #hb_tag_t.
  *
+ * Since: 0.6.0
+ *
  **/
 #define HB_UNTAG(tag)   (uint8_t)(((tag)>>24)&0xFF), (uint8_t)(((tag)>>16)&0xFF), (uint8_t)(((tag)>>8)&0xFF), (uint8_t)((tag)&0xFF)
 
+/**
+ * HB_TAG_NONE:
+ *
+ * Unset #hb_tag_t.
+ */
 #define HB_TAG_NONE HB_TAG(0,0,0,0)
+/**
+ * HB_TAG_MAX:
+ *
+ * Maximum possible unsigned #hb_tag_t.
+ *
+ * Since: 0.9.26
+ */
 #define HB_TAG_MAX HB_TAG(0xff,0xff,0xff,0xff)
+/**
+ * HB_TAG_MAX_SIGNED:
+ *
+ * Maximum possible signed #hb_tag_t.
+ *
+ * Since: 0.9.33
+ */
 #define HB_TAG_MAX_SIGNED HB_TAG(0x7f,0xff,0xff,0xff)
 
 /* len=-1 means str is NUL-terminated. */
@@ -263,6 +289,13 @@
 
 /* hb_language_t */
 
+/**
+ * hb_language_t:
+ *
+ * Data type for languages. Each #hb_language_t corresponds to a BCP 47
+ * language tag.
+ *
+ */
 typedef const struct hb_language_impl_t *hb_language_t;
 
 HB_EXTERN hb_language_t
@@ -271,6 +304,13 @@
 HB_EXTERN const char *
 hb_language_to_string (hb_language_t language);
 
+/**
+ * HB_LANGUAGE_INVALID:
+ *
+ * An unset #hb_language_t.
+ *
+ * Since: 0.6.0
+ */
 #define HB_LANGUAGE_INVALID ((hb_language_t) 0)
 
 HB_EXTERN hb_language_t
@@ -279,160 +319,164 @@
 
 /**
  * hb_script_t:
- * @HB_SCRIPT_COMMON: HB_TAG ('Z','y','y','y')
- * @HB_SCRIPT_INHERITED: HB_TAG ('Z','i','n','h')
- * @HB_SCRIPT_UNKNOWN: HB_TAG ('Z','z','z','z')
- * @HB_SCRIPT_ARABIC
- * @HB_SCRIPT_ARMENIAN
- * @HB_SCRIPT_BENGALI
- * @HB_SCRIPT_CYRILLIC
- * @HB_SCRIPT_DEVANAGARI
- * @HB_SCRIPT_GEORGIAN
- * @HB_SCRIPT_GREEK
- * @HB_SCRIPT_GUJARATI
- * @HB_SCRIPT_GURMUKHI
- * @HB_SCRIPT_HANGUL
- * @HB_SCRIPT_HAN
- * @HB_SCRIPT_HEBREW
- * @HB_SCRIPT_HIRAGANA
- * @HB_SCRIPT_KANNADA
- * @HB_SCRIPT_KATAKANA
- * @HB_SCRIPT_LAO
- * @HB_SCRIPT_LATIN
- * @HB_SCRIPT_MALAYALAM
- * @HB_SCRIPT_ORIYA
- * @HB_SCRIPT_TAMIL
- * @HB_SCRIPT_TELUGU
- * @HB_SCRIPT_THAI
- * @HB_SCRIPT_TIBETAN
- * @HB_SCRIPT_BOPOMOFO
- * @HB_SCRIPT_BRAILLE
- * @HB_SCRIPT_CANADIAN_SYLLABICS
- * @HB_SCRIPT_CHEROKEE
- * @HB_SCRIPT_ETHIOPIC
- * @HB_SCRIPT_KHMER
- * @HB_SCRIPT_MONGOLIAN
- * @HB_SCRIPT_MYANMAR
- * @HB_SCRIPT_OGHAM
- * @HB_SCRIPT_RUNIC
- * @HB_SCRIPT_SINHALA
- * @HB_SCRIPT_SYRIAC
- * @HB_SCRIPT_THAANA
- * @HB_SCRIPT_YI
- * @HB_SCRIPT_DESERET
- * @HB_SCRIPT_GOTHIC
- * @HB_SCRIPT_OLD_ITALIC
- * @HB_SCRIPT_BUHID
- * @HB_SCRIPT_HANUNOO
- * @HB_SCRIPT_TAGALOG
- * @HB_SCRIPT_TAGBANWA
- * @HB_SCRIPT_CYPRIOT
- * @HB_SCRIPT_LIMBU
- * @HB_SCRIPT_LINEAR_B
- * @HB_SCRIPT_OSMANYA
- * @HB_SCRIPT_SHAVIAN
- * @HB_SCRIPT_TAI_LE
- * @HB_SCRIPT_UGARITIC
- * @HB_SCRIPT_BUGINESE
- * @HB_SCRIPT_COPTIC
- * @HB_SCRIPT_GLAGOLITIC
- * @HB_SCRIPT_KHAROSHTHI
- * @HB_SCRIPT_NEW_TAI_LUE
- * @HB_SCRIPT_OLD_PERSIAN
- * @HB_SCRIPT_SYLOTI_NAGRI
- * @HB_SCRIPT_TIFINAGH
- * @HB_SCRIPT_BALINESE
- * @HB_SCRIPT_CUNEIFORM
- * @HB_SCRIPT_NKO
- * @HB_SCRIPT_PHAGS_PA
- * @HB_SCRIPT_PHOENICIAN
- * @HB_SCRIPT_CARIAN
- * @HB_SCRIPT_CHAM
- * @HB_SCRIPT_KAYAH_LI
- * @HB_SCRIPT_LEPCHA
- * @HB_SCRIPT_LYCIAN
- * @HB_SCRIPT_LYDIAN
- * @HB_SCRIPT_OL_CHIKI
- * @HB_SCRIPT_REJANG
- * @HB_SCRIPT_SAURASHTRA
- * @HB_SCRIPT_SUNDANESE
- * @HB_SCRIPT_VAI
- * @HB_SCRIPT_AVESTAN
- * @HB_SCRIPT_BAMUM
- * @HB_SCRIPT_EGYPTIAN_HIEROGLYPHS
- * @HB_SCRIPT_IMPERIAL_ARAMAIC
- * @HB_SCRIPT_INSCRIPTIONAL_PAHLAVI
- * @HB_SCRIPT_INSCRIPTIONAL_PARTHIAN
- * @HB_SCRIPT_JAVANESE
- * @HB_SCRIPT_KAITHI
- * @HB_SCRIPT_LISU
- * @HB_SCRIPT_MEETEI_MAYEK
- * @HB_SCRIPT_OLD_SOUTH_ARABIAN
- * @HB_SCRIPT_OLD_TURKIC
- * @HB_SCRIPT_SAMARITAN
- * @HB_SCRIPT_TAI_THAM
- * @HB_SCRIPT_TAI_VIET
- * @HB_SCRIPT_BATAK
- * @HB_SCRIPT_BRAHMI
- * @HB_SCRIPT_MANDAIC
- * @HB_SCRIPT_CHAKMA
- * @HB_SCRIPT_MEROITIC_CURSIVE
- * @HB_SCRIPT_MEROITIC_HIEROGLYPHS
- * @HB_SCRIPT_MIAO
- * @HB_SCRIPT_SHARADA
- * @HB_SCRIPT_SORA_SOMPENG
- * @HB_SCRIPT_TAKRI
- * @HB_SCRIPT_BASSA_VAH
- * @HB_SCRIPT_CAUCASIAN_ALBANIAN
- * @HB_SCRIPT_DUPLOYAN
- * @HB_SCRIPT_ELBASAN
- * @HB_SCRIPT_GRANTHA
- * @HB_SCRIPT_KHOJKI
- * @HB_SCRIPT_KHUDAWADI
- * @HB_SCRIPT_LINEAR_A
- * @HB_SCRIPT_MAHAJANI
- * @HB_SCRIPT_MANICHAEAN
- * @HB_SCRIPT_MENDE_KIKAKUI
- * @HB_SCRIPT_MODI
- * @HB_SCRIPT_MRO
- * @HB_SCRIPT_NABATAEAN
- * @HB_SCRIPT_OLD_NORTH_ARABIAN
- * @HB_SCRIPT_OLD_PERMIC
- * @HB_SCRIPT_PAHAWH_HMONG
- * @HB_SCRIPT_PALMYRENE
- * @HB_SCRIPT_PAU_CIN_HAU
- * @HB_SCRIPT_PSALTER_PAHLAVI
- * @HB_SCRIPT_SIDDHAM
- * @HB_SCRIPT_TIRHUTA
- * @HB_SCRIPT_WARANG_CITI
- * @HB_SCRIPT_AHOM
- * @HB_SCRIPT_ANATOLIAN_HIEROGLYPHS
- * @HB_SCRIPT_HATRAN
- * @HB_SCRIPT_MULTANI
- * @HB_SCRIPT_OLD_HUNGARIAN
- * @HB_SCRIPT_SIGNWRITING
- * @HB_SCRIPT_ADLAM
- * @HB_SCRIPT_BHAIKSUKI
- * @HB_SCRIPT_MARCHEN
- * @HB_SCRIPT_OSAGE
- * @HB_SCRIPT_TANGUT
- * @HB_SCRIPT_NEWA
- * @HB_SCRIPT_MASARAM_GONDI
- * @HB_SCRIPT_NUSHU
- * @HB_SCRIPT_SOYOMBO
- * @HB_SCRIPT_ZANABAZAR_SQUARE
- * @HB_SCRIPT_DOGRA
- * @HB_SCRIPT_GUNJALA_GONDI
- * @HB_SCRIPT_HANIFI_ROHINGYA
- * @HB_SCRIPT_MAKASAR
- * @HB_SCRIPT_MEDEFAIDRIN
- * @HB_SCRIPT_OLD_SOGDIAN
- * @HB_SCRIPT_SOGDIAN
- * @HB_SCRIPT_ELYMAIC
- * @HB_SCRIPT_NANDINAGARI
- * @HB_SCRIPT_NYIAKENG_PUACHUE_HMONG
- * @HB_SCRIPT_WANCHO
- * @HB_SCRIPT_INVALID: #HB_TAG_NONE
+ * @HB_SCRIPT_COMMON: `Zyyy`
+ * @HB_SCRIPT_INHERITED: `Zinh`
+ * @HB_SCRIPT_UNKNOWN: `Zzzz`
+ * @HB_SCRIPT_ARABIC: `Arab`
+ * @HB_SCRIPT_ARMENIAN: `Armn`
+ * @HB_SCRIPT_BENGALI: `Beng`
+ * @HB_SCRIPT_CYRILLIC: `Cyrl`
+ * @HB_SCRIPT_DEVANAGARI: `Deva`
+ * @HB_SCRIPT_GEORGIAN: `Geor`
+ * @HB_SCRIPT_GREEK: `Grek`
+ * @HB_SCRIPT_GUJARATI: `Gujr`
+ * @HB_SCRIPT_GURMUKHI: `Guru`
+ * @HB_SCRIPT_HANGUL: `Hang`
+ * @HB_SCRIPT_HAN: `Hani`
+ * @HB_SCRIPT_HEBREW: `Hebr`
+ * @HB_SCRIPT_HIRAGANA: `Hira`
+ * @HB_SCRIPT_KANNADA: `Knda`
+ * @HB_SCRIPT_KATAKANA: `Kana`
+ * @HB_SCRIPT_LAO: `Laoo`
+ * @HB_SCRIPT_LATIN: `Latn`
+ * @HB_SCRIPT_MALAYALAM: `Mlym`
+ * @HB_SCRIPT_ORIYA: `Orya`
+ * @HB_SCRIPT_TAMIL: `Taml`
+ * @HB_SCRIPT_TELUGU: `Telu`
+ * @HB_SCRIPT_THAI: `Thai`
+ * @HB_SCRIPT_TIBETAN: `Tibt`
+ * @HB_SCRIPT_BOPOMOFO: `Bopo`
+ * @HB_SCRIPT_BRAILLE: `Brai`
+ * @HB_SCRIPT_CANADIAN_SYLLABICS: `Cans`
+ * @HB_SCRIPT_CHEROKEE: `Cher`
+ * @HB_SCRIPT_ETHIOPIC: `Ethi`
+ * @HB_SCRIPT_KHMER: `Khmr`
+ * @HB_SCRIPT_MONGOLIAN: `Mong`
+ * @HB_SCRIPT_MYANMAR: `Mymr`
+ * @HB_SCRIPT_OGHAM: `Ogam`
+ * @HB_SCRIPT_RUNIC: `Runr`
+ * @HB_SCRIPT_SINHALA: `Sinh`
+ * @HB_SCRIPT_SYRIAC: `Syrc`
+ * @HB_SCRIPT_THAANA: `Thaa`
+ * @HB_SCRIPT_YI: `Yiii`
+ * @HB_SCRIPT_DESERET: `Dsrt`
+ * @HB_SCRIPT_GOTHIC: `Goth`
+ * @HB_SCRIPT_OLD_ITALIC: `Ital`
+ * @HB_SCRIPT_BUHID: `Buhd`
+ * @HB_SCRIPT_HANUNOO: `Hano`
+ * @HB_SCRIPT_TAGALOG: `Tglg`
+ * @HB_SCRIPT_TAGBANWA: `Tagb`
+ * @HB_SCRIPT_CYPRIOT: `Cprt`
+ * @HB_SCRIPT_LIMBU: `Limb`
+ * @HB_SCRIPT_LINEAR_B: `Linb`
+ * @HB_SCRIPT_OSMANYA: `Osma`
+ * @HB_SCRIPT_SHAVIAN: `Shaw`
+ * @HB_SCRIPT_TAI_LE: `Tale`
+ * @HB_SCRIPT_UGARITIC: `Ugar`
+ * @HB_SCRIPT_BUGINESE: `Bugi`
+ * @HB_SCRIPT_COPTIC: `Copt`
+ * @HB_SCRIPT_GLAGOLITIC: `Glag`
+ * @HB_SCRIPT_KHAROSHTHI: `Khar`
+ * @HB_SCRIPT_NEW_TAI_LUE: `Talu`
+ * @HB_SCRIPT_OLD_PERSIAN: `Xpeo`
+ * @HB_SCRIPT_SYLOTI_NAGRI: `Sylo`
+ * @HB_SCRIPT_TIFINAGH: `Tfng`
+ * @HB_SCRIPT_BALINESE: `Bali`
+ * @HB_SCRIPT_CUNEIFORM: `Xsux`
+ * @HB_SCRIPT_NKO: `Nkoo`
+ * @HB_SCRIPT_PHAGS_PA: `Phag`
+ * @HB_SCRIPT_PHOENICIAN: `Phnx`
+ * @HB_SCRIPT_CARIAN: `Cari`
+ * @HB_SCRIPT_CHAM: `Cham`
+ * @HB_SCRIPT_KAYAH_LI: `Kali`
+ * @HB_SCRIPT_LEPCHA: `Lepc`
+ * @HB_SCRIPT_LYCIAN: `Lyci`
+ * @HB_SCRIPT_LYDIAN: `Lydi`
+ * @HB_SCRIPT_OL_CHIKI: `Olck`
+ * @HB_SCRIPT_REJANG: `Rjng`
+ * @HB_SCRIPT_SAURASHTRA: `Saur`
+ * @HB_SCRIPT_SUNDANESE: `Sund`
+ * @HB_SCRIPT_VAI: `Vaii`
+ * @HB_SCRIPT_AVESTAN: `Avst`
+ * @HB_SCRIPT_BAMUM: `Bamu`
+ * @HB_SCRIPT_EGYPTIAN_HIEROGLYPHS: `Egyp`
+ * @HB_SCRIPT_IMPERIAL_ARAMAIC: `Armi`
+ * @HB_SCRIPT_INSCRIPTIONAL_PAHLAVI: `Phli`
+ * @HB_SCRIPT_INSCRIPTIONAL_PARTHIAN: `Prti`
+ * @HB_SCRIPT_JAVANESE: `Java`
+ * @HB_SCRIPT_KAITHI: `Kthi`
+ * @HB_SCRIPT_LISU: `Lisu`
+ * @HB_SCRIPT_MEETEI_MAYEK: `Mtei`
+ * @HB_SCRIPT_OLD_SOUTH_ARABIAN: `Sarb`
+ * @HB_SCRIPT_OLD_TURKIC: `Orkh`
+ * @HB_SCRIPT_SAMARITAN: `Samr`
+ * @HB_SCRIPT_TAI_THAM: `Lana`
+ * @HB_SCRIPT_TAI_VIET: `Tavt`
+ * @HB_SCRIPT_BATAK: `Batk`
+ * @HB_SCRIPT_BRAHMI: `Brah`
+ * @HB_SCRIPT_MANDAIC: `Mand`
+ * @HB_SCRIPT_CHAKMA: `Cakm`
+ * @HB_SCRIPT_MEROITIC_CURSIVE: `Merc`
+ * @HB_SCRIPT_MEROITIC_HIEROGLYPHS: `Mero`
+ * @HB_SCRIPT_MIAO: `Plrd`
+ * @HB_SCRIPT_SHARADA: `Shrd`
+ * @HB_SCRIPT_SORA_SOMPENG: `Sora`
+ * @HB_SCRIPT_TAKRI: `Takr`
+ * @HB_SCRIPT_BASSA_VAH: `Bass`, Since: 0.9.30
+ * @HB_SCRIPT_CAUCASIAN_ALBANIAN: `Aghb`, Since: 0.9.30
+ * @HB_SCRIPT_DUPLOYAN: `Dupl`, Since: 0.9.30
+ * @HB_SCRIPT_ELBASAN: `Elba`, Since: 0.9.30
+ * @HB_SCRIPT_GRANTHA: `Gran`, Since: 0.9.30
+ * @HB_SCRIPT_KHOJKI: `Khoj`, Since: 0.9.30
+ * @HB_SCRIPT_KHUDAWADI: `Sind`, Since: 0.9.30
+ * @HB_SCRIPT_LINEAR_A: `Lina`, Since: 0.9.30
+ * @HB_SCRIPT_MAHAJANI: `Mahj`, Since: 0.9.30
+ * @HB_SCRIPT_MANICHAEAN: `Mani`, Since: 0.9.30
+ * @HB_SCRIPT_MENDE_KIKAKUI: `Mend`, Since: 0.9.30
+ * @HB_SCRIPT_MODI: `Modi`, Since: 0.9.30
+ * @HB_SCRIPT_MRO: `Mroo`, Since: 0.9.30
+ * @HB_SCRIPT_NABATAEAN: `Nbat`, Since: 0.9.30
+ * @HB_SCRIPT_OLD_NORTH_ARABIAN: `Narb`, Since: 0.9.30
+ * @HB_SCRIPT_OLD_PERMIC: `Perm`, Since: 0.9.30
+ * @HB_SCRIPT_PAHAWH_HMONG: `Hmng`, Since: 0.9.30
+ * @HB_SCRIPT_PALMYRENE: `Palm`, Since: 0.9.30
+ * @HB_SCRIPT_PAU_CIN_HAU: `Pauc`, Since: 0.9.30
+ * @HB_SCRIPT_PSALTER_PAHLAVI: `Phlp`, Since: 0.9.30
+ * @HB_SCRIPT_SIDDHAM: `Sidd`, Since: 0.9.30
+ * @HB_SCRIPT_TIRHUTA: `Tirh`, Since: 0.9.30
+ * @HB_SCRIPT_WARANG_CITI: `Wara`, Since: 0.9.30
+ * @HB_SCRIPT_AHOM: `Ahom`, Since: 0.9.30
+ * @HB_SCRIPT_ANATOLIAN_HIEROGLYPHS: `Hluw`, Since: 0.9.30
+ * @HB_SCRIPT_HATRAN: `Hatr`, Since: 0.9.30
+ * @HB_SCRIPT_MULTANI: `Mult`, Since: 0.9.30
+ * @HB_SCRIPT_OLD_HUNGARIAN: `Hung`, Since: 0.9.30
+ * @HB_SCRIPT_SIGNWRITING: `Sgnw`, Since: 0.9.30
+ * @HB_SCRIPT_ADLAM: `Adlm`, Since: 1.3.0
+ * @HB_SCRIPT_BHAIKSUKI: `Bhks`, Since: 1.3.0
+ * @HB_SCRIPT_MARCHEN: `Marc`, Since: 1.3.0
+ * @HB_SCRIPT_OSAGE: `Osge`, Since: 1.3.0
+ * @HB_SCRIPT_TANGUT: `Tang`, Since: 1.3.0
+ * @HB_SCRIPT_NEWA: `Newa`, Since: 1.3.0
+ * @HB_SCRIPT_MASARAM_GONDI: `Gonm`, Since: 1.6.0
+ * @HB_SCRIPT_NUSHU: `Nshu`, Since: 1.6.0
+ * @HB_SCRIPT_SOYOMBO: `Soyo`, Since: 1.6.0
+ * @HB_SCRIPT_ZANABAZAR_SQUARE: `Zanb`, Since: 1.6.0
+ * @HB_SCRIPT_DOGRA: `Dogr`, Since: 1.8.0
+ * @HB_SCRIPT_GUNJALA_GONDI: `Gong`, Since: 1.8.0
+ * @HB_SCRIPT_HANIFI_ROHINGYA: `Rohg`, Since: 1.8.0
+ * @HB_SCRIPT_MAKASAR: `Maka`, Since: 1.8.0
+ * @HB_SCRIPT_MEDEFAIDRIN: `Medf`, Since: 1.8.0
+ * @HB_SCRIPT_OLD_SOGDIAN: `Sogo`, Since: 1.8.0
+ * @HB_SCRIPT_SOGDIAN: `Sogd`, Since: 1.8.0
+ * @HB_SCRIPT_ELYMAIC: `Elym`, Since: 2.4.0
+ * @HB_SCRIPT_NANDINAGARI: `Nand`, Since: 2.4.0
+ * @HB_SCRIPT_NYIAKENG_PUACHUE_HMONG: `Hmnp`, Since: 2.4.0
+ * @HB_SCRIPT_WANCHO: `Wcho`, Since: 2.4.0
+ * @HB_SCRIPT_CHORASMIAN: `Chrs`, Since: 2.6.7
+ * @HB_SCRIPT_DIVES_AKURU: `Diak`, Since: 2.6.7
+ * @HB_SCRIPT_KHITAN_SMALL_SCRIPT: `Kits`, Since: 2.6.7
+ * @HB_SCRIPT_YEZIDI: `Yezi`, Since: 2.6.7
+ * @HB_SCRIPT_INVALID: No script set
  *
  * Data type for scripts. Each #hb_script_t's value is an #hb_tag_t corresponding
  * to the four-letter values defined by [ISO 15924](https://unicode.org/iso15924/).
@@ -441,209 +485,209 @@
  *
  **/
 
-/* https://unicode.org/iso15924/ */
 /* https://docs.google.com/spreadsheets/d/1Y90M0Ie3MUJ6UVCRDOypOtijlMDLNNyyLk36T6iMu0o */
-/* Unicode Character Database property: Script (sc) */
 typedef enum
 {
-  /*1.1*/ HB_SCRIPT_COMMON			= HB_TAG ('Z','y','y','y'),
-  /*1.1*/ HB_SCRIPT_INHERITED			= HB_TAG ('Z','i','n','h'),
-  /*5.0*/ HB_SCRIPT_UNKNOWN			= HB_TAG ('Z','z','z','z'),
+  HB_SCRIPT_COMMON			= HB_TAG ('Z','y','y','y'), /*1.1*/
+  HB_SCRIPT_INHERITED			= HB_TAG ('Z','i','n','h'), /*1.1*/
+  HB_SCRIPT_UNKNOWN			= HB_TAG ('Z','z','z','z'), /*5.0*/
 
-  /*1.1*/ HB_SCRIPT_ARABIC			= HB_TAG ('A','r','a','b'),
-  /*1.1*/ HB_SCRIPT_ARMENIAN			= HB_TAG ('A','r','m','n'),
-  /*1.1*/ HB_SCRIPT_BENGALI			= HB_TAG ('B','e','n','g'),
-  /*1.1*/ HB_SCRIPT_CYRILLIC			= HB_TAG ('C','y','r','l'),
-  /*1.1*/ HB_SCRIPT_DEVANAGARI			= HB_TAG ('D','e','v','a'),
-  /*1.1*/ HB_SCRIPT_GEORGIAN			= HB_TAG ('G','e','o','r'),
-  /*1.1*/ HB_SCRIPT_GREEK			= HB_TAG ('G','r','e','k'),
-  /*1.1*/ HB_SCRIPT_GUJARATI			= HB_TAG ('G','u','j','r'),
-  /*1.1*/ HB_SCRIPT_GURMUKHI			= HB_TAG ('G','u','r','u'),
-  /*1.1*/ HB_SCRIPT_HANGUL			= HB_TAG ('H','a','n','g'),
-  /*1.1*/ HB_SCRIPT_HAN				= HB_TAG ('H','a','n','i'),
-  /*1.1*/ HB_SCRIPT_HEBREW			= HB_TAG ('H','e','b','r'),
-  /*1.1*/ HB_SCRIPT_HIRAGANA			= HB_TAG ('H','i','r','a'),
-  /*1.1*/ HB_SCRIPT_KANNADA			= HB_TAG ('K','n','d','a'),
-  /*1.1*/ HB_SCRIPT_KATAKANA			= HB_TAG ('K','a','n','a'),
-  /*1.1*/ HB_SCRIPT_LAO				= HB_TAG ('L','a','o','o'),
-  /*1.1*/ HB_SCRIPT_LATIN			= HB_TAG ('L','a','t','n'),
-  /*1.1*/ HB_SCRIPT_MALAYALAM			= HB_TAG ('M','l','y','m'),
-  /*1.1*/ HB_SCRIPT_ORIYA			= HB_TAG ('O','r','y','a'),
-  /*1.1*/ HB_SCRIPT_TAMIL			= HB_TAG ('T','a','m','l'),
-  /*1.1*/ HB_SCRIPT_TELUGU			= HB_TAG ('T','e','l','u'),
-  /*1.1*/ HB_SCRIPT_THAI			= HB_TAG ('T','h','a','i'),
+  HB_SCRIPT_ARABIC			= HB_TAG ('A','r','a','b'), /*1.1*/
+  HB_SCRIPT_ARMENIAN			= HB_TAG ('A','r','m','n'), /*1.1*/
+  HB_SCRIPT_BENGALI			= HB_TAG ('B','e','n','g'), /*1.1*/
+  HB_SCRIPT_CYRILLIC			= HB_TAG ('C','y','r','l'), /*1.1*/
+  HB_SCRIPT_DEVANAGARI			= HB_TAG ('D','e','v','a'), /*1.1*/
+  HB_SCRIPT_GEORGIAN			= HB_TAG ('G','e','o','r'), /*1.1*/
+  HB_SCRIPT_GREEK			= HB_TAG ('G','r','e','k'), /*1.1*/
+  HB_SCRIPT_GUJARATI			= HB_TAG ('G','u','j','r'), /*1.1*/
+  HB_SCRIPT_GURMUKHI			= HB_TAG ('G','u','r','u'), /*1.1*/
+  HB_SCRIPT_HANGUL			= HB_TAG ('H','a','n','g'), /*1.1*/
+  HB_SCRIPT_HAN				= HB_TAG ('H','a','n','i'), /*1.1*/
+  HB_SCRIPT_HEBREW			= HB_TAG ('H','e','b','r'), /*1.1*/
+  HB_SCRIPT_HIRAGANA			= HB_TAG ('H','i','r','a'), /*1.1*/
+  HB_SCRIPT_KANNADA			= HB_TAG ('K','n','d','a'), /*1.1*/
+  HB_SCRIPT_KATAKANA			= HB_TAG ('K','a','n','a'), /*1.1*/
+  HB_SCRIPT_LAO				= HB_TAG ('L','a','o','o'), /*1.1*/
+  HB_SCRIPT_LATIN			= HB_TAG ('L','a','t','n'), /*1.1*/
+  HB_SCRIPT_MALAYALAM			= HB_TAG ('M','l','y','m'), /*1.1*/
+  HB_SCRIPT_ORIYA			= HB_TAG ('O','r','y','a'), /*1.1*/
+  HB_SCRIPT_TAMIL			= HB_TAG ('T','a','m','l'), /*1.1*/
+  HB_SCRIPT_TELUGU			= HB_TAG ('T','e','l','u'), /*1.1*/
+  HB_SCRIPT_THAI			= HB_TAG ('T','h','a','i'), /*1.1*/
 
-  /*2.0*/ HB_SCRIPT_TIBETAN			= HB_TAG ('T','i','b','t'),
+  HB_SCRIPT_TIBETAN			= HB_TAG ('T','i','b','t'), /*2.0*/
 
-  /*3.0*/ HB_SCRIPT_BOPOMOFO			= HB_TAG ('B','o','p','o'),
-  /*3.0*/ HB_SCRIPT_BRAILLE			= HB_TAG ('B','r','a','i'),
-  /*3.0*/ HB_SCRIPT_CANADIAN_SYLLABICS		= HB_TAG ('C','a','n','s'),
-  /*3.0*/ HB_SCRIPT_CHEROKEE			= HB_TAG ('C','h','e','r'),
-  /*3.0*/ HB_SCRIPT_ETHIOPIC			= HB_TAG ('E','t','h','i'),
-  /*3.0*/ HB_SCRIPT_KHMER			= HB_TAG ('K','h','m','r'),
-  /*3.0*/ HB_SCRIPT_MONGOLIAN			= HB_TAG ('M','o','n','g'),
-  /*3.0*/ HB_SCRIPT_MYANMAR			= HB_TAG ('M','y','m','r'),
-  /*3.0*/ HB_SCRIPT_OGHAM			= HB_TAG ('O','g','a','m'),
-  /*3.0*/ HB_SCRIPT_RUNIC			= HB_TAG ('R','u','n','r'),
-  /*3.0*/ HB_SCRIPT_SINHALA			= HB_TAG ('S','i','n','h'),
-  /*3.0*/ HB_SCRIPT_SYRIAC			= HB_TAG ('S','y','r','c'),
-  /*3.0*/ HB_SCRIPT_THAANA			= HB_TAG ('T','h','a','a'),
-  /*3.0*/ HB_SCRIPT_YI				= HB_TAG ('Y','i','i','i'),
+  HB_SCRIPT_BOPOMOFO			= HB_TAG ('B','o','p','o'), /*3.0*/
+  HB_SCRIPT_BRAILLE			= HB_TAG ('B','r','a','i'), /*3.0*/
+  HB_SCRIPT_CANADIAN_SYLLABICS		= HB_TAG ('C','a','n','s'), /*3.0*/
+  HB_SCRIPT_CHEROKEE			= HB_TAG ('C','h','e','r'), /*3.0*/
+  HB_SCRIPT_ETHIOPIC			= HB_TAG ('E','t','h','i'), /*3.0*/
+  HB_SCRIPT_KHMER			= HB_TAG ('K','h','m','r'), /*3.0*/
+  HB_SCRIPT_MONGOLIAN			= HB_TAG ('M','o','n','g'), /*3.0*/
+  HB_SCRIPT_MYANMAR			= HB_TAG ('M','y','m','r'), /*3.0*/
+  HB_SCRIPT_OGHAM			= HB_TAG ('O','g','a','m'), /*3.0*/
+  HB_SCRIPT_RUNIC			= HB_TAG ('R','u','n','r'), /*3.0*/
+  HB_SCRIPT_SINHALA			= HB_TAG ('S','i','n','h'), /*3.0*/
+  HB_SCRIPT_SYRIAC			= HB_TAG ('S','y','r','c'), /*3.0*/
+  HB_SCRIPT_THAANA			= HB_TAG ('T','h','a','a'), /*3.0*/
+  HB_SCRIPT_YI				= HB_TAG ('Y','i','i','i'), /*3.0*/
 
-  /*3.1*/ HB_SCRIPT_DESERET			= HB_TAG ('D','s','r','t'),
-  /*3.1*/ HB_SCRIPT_GOTHIC			= HB_TAG ('G','o','t','h'),
-  /*3.1*/ HB_SCRIPT_OLD_ITALIC			= HB_TAG ('I','t','a','l'),
+  HB_SCRIPT_DESERET			= HB_TAG ('D','s','r','t'), /*3.1*/
+  HB_SCRIPT_GOTHIC			= HB_TAG ('G','o','t','h'), /*3.1*/
+  HB_SCRIPT_OLD_ITALIC			= HB_TAG ('I','t','a','l'), /*3.1*/
 
-  /*3.2*/ HB_SCRIPT_BUHID			= HB_TAG ('B','u','h','d'),
-  /*3.2*/ HB_SCRIPT_HANUNOO			= HB_TAG ('H','a','n','o'),
-  /*3.2*/ HB_SCRIPT_TAGALOG			= HB_TAG ('T','g','l','g'),
-  /*3.2*/ HB_SCRIPT_TAGBANWA			= HB_TAG ('T','a','g','b'),
+  HB_SCRIPT_BUHID			= HB_TAG ('B','u','h','d'), /*3.2*/
+  HB_SCRIPT_HANUNOO			= HB_TAG ('H','a','n','o'), /*3.2*/
+  HB_SCRIPT_TAGALOG			= HB_TAG ('T','g','l','g'), /*3.2*/
+  HB_SCRIPT_TAGBANWA			= HB_TAG ('T','a','g','b'), /*3.2*/
 
-  /*4.0*/ HB_SCRIPT_CYPRIOT			= HB_TAG ('C','p','r','t'),
-  /*4.0*/ HB_SCRIPT_LIMBU			= HB_TAG ('L','i','m','b'),
-  /*4.0*/ HB_SCRIPT_LINEAR_B			= HB_TAG ('L','i','n','b'),
-  /*4.0*/ HB_SCRIPT_OSMANYA			= HB_TAG ('O','s','m','a'),
-  /*4.0*/ HB_SCRIPT_SHAVIAN			= HB_TAG ('S','h','a','w'),
-  /*4.0*/ HB_SCRIPT_TAI_LE			= HB_TAG ('T','a','l','e'),
-  /*4.0*/ HB_SCRIPT_UGARITIC			= HB_TAG ('U','g','a','r'),
+  HB_SCRIPT_CYPRIOT			= HB_TAG ('C','p','r','t'), /*4.0*/
+  HB_SCRIPT_LIMBU			= HB_TAG ('L','i','m','b'), /*4.0*/
+  HB_SCRIPT_LINEAR_B			= HB_TAG ('L','i','n','b'), /*4.0*/
+  HB_SCRIPT_OSMANYA			= HB_TAG ('O','s','m','a'), /*4.0*/
+  HB_SCRIPT_SHAVIAN			= HB_TAG ('S','h','a','w'), /*4.0*/
+  HB_SCRIPT_TAI_LE			= HB_TAG ('T','a','l','e'), /*4.0*/
+  HB_SCRIPT_UGARITIC			= HB_TAG ('U','g','a','r'), /*4.0*/
 
-  /*4.1*/ HB_SCRIPT_BUGINESE			= HB_TAG ('B','u','g','i'),
-  /*4.1*/ HB_SCRIPT_COPTIC			= HB_TAG ('C','o','p','t'),
-  /*4.1*/ HB_SCRIPT_GLAGOLITIC			= HB_TAG ('G','l','a','g'),
-  /*4.1*/ HB_SCRIPT_KHAROSHTHI			= HB_TAG ('K','h','a','r'),
-  /*4.1*/ HB_SCRIPT_NEW_TAI_LUE			= HB_TAG ('T','a','l','u'),
-  /*4.1*/ HB_SCRIPT_OLD_PERSIAN			= HB_TAG ('X','p','e','o'),
-  /*4.1*/ HB_SCRIPT_SYLOTI_NAGRI		= HB_TAG ('S','y','l','o'),
-  /*4.1*/ HB_SCRIPT_TIFINAGH			= HB_TAG ('T','f','n','g'),
+  HB_SCRIPT_BUGINESE			= HB_TAG ('B','u','g','i'), /*4.1*/
+  HB_SCRIPT_COPTIC			= HB_TAG ('C','o','p','t'), /*4.1*/
+  HB_SCRIPT_GLAGOLITIC			= HB_TAG ('G','l','a','g'), /*4.1*/
+  HB_SCRIPT_KHAROSHTHI			= HB_TAG ('K','h','a','r'), /*4.1*/
+  HB_SCRIPT_NEW_TAI_LUE			= HB_TAG ('T','a','l','u'), /*4.1*/
+  HB_SCRIPT_OLD_PERSIAN			= HB_TAG ('X','p','e','o'), /*4.1*/
+  HB_SCRIPT_SYLOTI_NAGRI		= HB_TAG ('S','y','l','o'), /*4.1*/
+  HB_SCRIPT_TIFINAGH			= HB_TAG ('T','f','n','g'), /*4.1*/
 
-  /*5.0*/ HB_SCRIPT_BALINESE			= HB_TAG ('B','a','l','i'),
-  /*5.0*/ HB_SCRIPT_CUNEIFORM			= HB_TAG ('X','s','u','x'),
-  /*5.0*/ HB_SCRIPT_NKO				= HB_TAG ('N','k','o','o'),
-  /*5.0*/ HB_SCRIPT_PHAGS_PA			= HB_TAG ('P','h','a','g'),
-  /*5.0*/ HB_SCRIPT_PHOENICIAN			= HB_TAG ('P','h','n','x'),
+  HB_SCRIPT_BALINESE			= HB_TAG ('B','a','l','i'), /*5.0*/
+  HB_SCRIPT_CUNEIFORM			= HB_TAG ('X','s','u','x'), /*5.0*/
+  HB_SCRIPT_NKO				= HB_TAG ('N','k','o','o'), /*5.0*/
+  HB_SCRIPT_PHAGS_PA			= HB_TAG ('P','h','a','g'), /*5.0*/
+  HB_SCRIPT_PHOENICIAN			= HB_TAG ('P','h','n','x'), /*5.0*/
 
-  /*5.1*/ HB_SCRIPT_CARIAN			= HB_TAG ('C','a','r','i'),
-  /*5.1*/ HB_SCRIPT_CHAM			= HB_TAG ('C','h','a','m'),
-  /*5.1*/ HB_SCRIPT_KAYAH_LI			= HB_TAG ('K','a','l','i'),
-  /*5.1*/ HB_SCRIPT_LEPCHA			= HB_TAG ('L','e','p','c'),
-  /*5.1*/ HB_SCRIPT_LYCIAN			= HB_TAG ('L','y','c','i'),
-  /*5.1*/ HB_SCRIPT_LYDIAN			= HB_TAG ('L','y','d','i'),
-  /*5.1*/ HB_SCRIPT_OL_CHIKI			= HB_TAG ('O','l','c','k'),
-  /*5.1*/ HB_SCRIPT_REJANG			= HB_TAG ('R','j','n','g'),
-  /*5.1*/ HB_SCRIPT_SAURASHTRA			= HB_TAG ('S','a','u','r'),
-  /*5.1*/ HB_SCRIPT_SUNDANESE			= HB_TAG ('S','u','n','d'),
-  /*5.1*/ HB_SCRIPT_VAI				= HB_TAG ('V','a','i','i'),
+  HB_SCRIPT_CARIAN			= HB_TAG ('C','a','r','i'), /*5.1*/
+  HB_SCRIPT_CHAM			= HB_TAG ('C','h','a','m'), /*5.1*/
+  HB_SCRIPT_KAYAH_LI			= HB_TAG ('K','a','l','i'), /*5.1*/
+  HB_SCRIPT_LEPCHA			= HB_TAG ('L','e','p','c'), /*5.1*/
+  HB_SCRIPT_LYCIAN			= HB_TAG ('L','y','c','i'), /*5.1*/
+  HB_SCRIPT_LYDIAN			= HB_TAG ('L','y','d','i'), /*5.1*/
+  HB_SCRIPT_OL_CHIKI			= HB_TAG ('O','l','c','k'), /*5.1*/
+  HB_SCRIPT_REJANG			= HB_TAG ('R','j','n','g'), /*5.1*/
+  HB_SCRIPT_SAURASHTRA			= HB_TAG ('S','a','u','r'), /*5.1*/
+  HB_SCRIPT_SUNDANESE			= HB_TAG ('S','u','n','d'), /*5.1*/
+  HB_SCRIPT_VAI				= HB_TAG ('V','a','i','i'), /*5.1*/
 
-  /*5.2*/ HB_SCRIPT_AVESTAN			= HB_TAG ('A','v','s','t'),
-  /*5.2*/ HB_SCRIPT_BAMUM			= HB_TAG ('B','a','m','u'),
-  /*5.2*/ HB_SCRIPT_EGYPTIAN_HIEROGLYPHS	= HB_TAG ('E','g','y','p'),
-  /*5.2*/ HB_SCRIPT_IMPERIAL_ARAMAIC		= HB_TAG ('A','r','m','i'),
-  /*5.2*/ HB_SCRIPT_INSCRIPTIONAL_PAHLAVI	= HB_TAG ('P','h','l','i'),
-  /*5.2*/ HB_SCRIPT_INSCRIPTIONAL_PARTHIAN	= HB_TAG ('P','r','t','i'),
-  /*5.2*/ HB_SCRIPT_JAVANESE			= HB_TAG ('J','a','v','a'),
-  /*5.2*/ HB_SCRIPT_KAITHI			= HB_TAG ('K','t','h','i'),
-  /*5.2*/ HB_SCRIPT_LISU			= HB_TAG ('L','i','s','u'),
-  /*5.2*/ HB_SCRIPT_MEETEI_MAYEK		= HB_TAG ('M','t','e','i'),
-  /*5.2*/ HB_SCRIPT_OLD_SOUTH_ARABIAN		= HB_TAG ('S','a','r','b'),
-  /*5.2*/ HB_SCRIPT_OLD_TURKIC			= HB_TAG ('O','r','k','h'),
-  /*5.2*/ HB_SCRIPT_SAMARITAN			= HB_TAG ('S','a','m','r'),
-  /*5.2*/ HB_SCRIPT_TAI_THAM			= HB_TAG ('L','a','n','a'),
-  /*5.2*/ HB_SCRIPT_TAI_VIET			= HB_TAG ('T','a','v','t'),
+  HB_SCRIPT_AVESTAN			= HB_TAG ('A','v','s','t'), /*5.2*/
+  HB_SCRIPT_BAMUM			= HB_TAG ('B','a','m','u'), /*5.2*/
+  HB_SCRIPT_EGYPTIAN_HIEROGLYPHS	= HB_TAG ('E','g','y','p'), /*5.2*/
+  HB_SCRIPT_IMPERIAL_ARAMAIC		= HB_TAG ('A','r','m','i'), /*5.2*/
+  HB_SCRIPT_INSCRIPTIONAL_PAHLAVI	= HB_TAG ('P','h','l','i'), /*5.2*/
+  HB_SCRIPT_INSCRIPTIONAL_PARTHIAN	= HB_TAG ('P','r','t','i'), /*5.2*/
+  HB_SCRIPT_JAVANESE			= HB_TAG ('J','a','v','a'), /*5.2*/
+  HB_SCRIPT_KAITHI			= HB_TAG ('K','t','h','i'), /*5.2*/
+  HB_SCRIPT_LISU			= HB_TAG ('L','i','s','u'), /*5.2*/
+  HB_SCRIPT_MEETEI_MAYEK		= HB_TAG ('M','t','e','i'), /*5.2*/
+  HB_SCRIPT_OLD_SOUTH_ARABIAN		= HB_TAG ('S','a','r','b'), /*5.2*/
+  HB_SCRIPT_OLD_TURKIC			= HB_TAG ('O','r','k','h'), /*5.2*/
+  HB_SCRIPT_SAMARITAN			= HB_TAG ('S','a','m','r'), /*5.2*/
+  HB_SCRIPT_TAI_THAM			= HB_TAG ('L','a','n','a'), /*5.2*/
+  HB_SCRIPT_TAI_VIET			= HB_TAG ('T','a','v','t'), /*5.2*/
 
-  /*6.0*/ HB_SCRIPT_BATAK			= HB_TAG ('B','a','t','k'),
-  /*6.0*/ HB_SCRIPT_BRAHMI			= HB_TAG ('B','r','a','h'),
-  /*6.0*/ HB_SCRIPT_MANDAIC			= HB_TAG ('M','a','n','d'),
+  HB_SCRIPT_BATAK			= HB_TAG ('B','a','t','k'), /*6.0*/
+  HB_SCRIPT_BRAHMI			= HB_TAG ('B','r','a','h'), /*6.0*/
+  HB_SCRIPT_MANDAIC			= HB_TAG ('M','a','n','d'), /*6.0*/
 
-  /*6.1*/ HB_SCRIPT_CHAKMA			= HB_TAG ('C','a','k','m'),
-  /*6.1*/ HB_SCRIPT_MEROITIC_CURSIVE		= HB_TAG ('M','e','r','c'),
-  /*6.1*/ HB_SCRIPT_MEROITIC_HIEROGLYPHS	= HB_TAG ('M','e','r','o'),
-  /*6.1*/ HB_SCRIPT_MIAO			= HB_TAG ('P','l','r','d'),
-  /*6.1*/ HB_SCRIPT_SHARADA			= HB_TAG ('S','h','r','d'),
-  /*6.1*/ HB_SCRIPT_SORA_SOMPENG		= HB_TAG ('S','o','r','a'),
-  /*6.1*/ HB_SCRIPT_TAKRI			= HB_TAG ('T','a','k','r'),
+  HB_SCRIPT_CHAKMA			= HB_TAG ('C','a','k','m'), /*6.1*/
+  HB_SCRIPT_MEROITIC_CURSIVE		= HB_TAG ('M','e','r','c'), /*6.1*/
+  HB_SCRIPT_MEROITIC_HIEROGLYPHS	= HB_TAG ('M','e','r','o'), /*6.1*/
+  HB_SCRIPT_MIAO			= HB_TAG ('P','l','r','d'), /*6.1*/
+  HB_SCRIPT_SHARADA			= HB_TAG ('S','h','r','d'), /*6.1*/
+  HB_SCRIPT_SORA_SOMPENG		= HB_TAG ('S','o','r','a'), /*6.1*/
+  HB_SCRIPT_TAKRI			= HB_TAG ('T','a','k','r'), /*6.1*/
 
   /*
    * Since: 0.9.30
    */
-  /*7.0*/ HB_SCRIPT_BASSA_VAH			= HB_TAG ('B','a','s','s'),
-  /*7.0*/ HB_SCRIPT_CAUCASIAN_ALBANIAN		= HB_TAG ('A','g','h','b'),
-  /*7.0*/ HB_SCRIPT_DUPLOYAN			= HB_TAG ('D','u','p','l'),
-  /*7.0*/ HB_SCRIPT_ELBASAN			= HB_TAG ('E','l','b','a'),
-  /*7.0*/ HB_SCRIPT_GRANTHA			= HB_TAG ('G','r','a','n'),
-  /*7.0*/ HB_SCRIPT_KHOJKI			= HB_TAG ('K','h','o','j'),
-  /*7.0*/ HB_SCRIPT_KHUDAWADI			= HB_TAG ('S','i','n','d'),
-  /*7.0*/ HB_SCRIPT_LINEAR_A			= HB_TAG ('L','i','n','a'),
-  /*7.0*/ HB_SCRIPT_MAHAJANI			= HB_TAG ('M','a','h','j'),
-  /*7.0*/ HB_SCRIPT_MANICHAEAN			= HB_TAG ('M','a','n','i'),
-  /*7.0*/ HB_SCRIPT_MENDE_KIKAKUI		= HB_TAG ('M','e','n','d'),
-  /*7.0*/ HB_SCRIPT_MODI			= HB_TAG ('M','o','d','i'),
-  /*7.0*/ HB_SCRIPT_MRO				= HB_TAG ('M','r','o','o'),
-  /*7.0*/ HB_SCRIPT_NABATAEAN			= HB_TAG ('N','b','a','t'),
-  /*7.0*/ HB_SCRIPT_OLD_NORTH_ARABIAN		= HB_TAG ('N','a','r','b'),
-  /*7.0*/ HB_SCRIPT_OLD_PERMIC			= HB_TAG ('P','e','r','m'),
-  /*7.0*/ HB_SCRIPT_PAHAWH_HMONG		= HB_TAG ('H','m','n','g'),
-  /*7.0*/ HB_SCRIPT_PALMYRENE			= HB_TAG ('P','a','l','m'),
-  /*7.0*/ HB_SCRIPT_PAU_CIN_HAU			= HB_TAG ('P','a','u','c'),
-  /*7.0*/ HB_SCRIPT_PSALTER_PAHLAVI		= HB_TAG ('P','h','l','p'),
-  /*7.0*/ HB_SCRIPT_SIDDHAM			= HB_TAG ('S','i','d','d'),
-  /*7.0*/ HB_SCRIPT_TIRHUTA			= HB_TAG ('T','i','r','h'),
-  /*7.0*/ HB_SCRIPT_WARANG_CITI			= HB_TAG ('W','a','r','a'),
+  HB_SCRIPT_BASSA_VAH			= HB_TAG ('B','a','s','s'), /*7.0*/
+  HB_SCRIPT_CAUCASIAN_ALBANIAN		= HB_TAG ('A','g','h','b'), /*7.0*/
+  HB_SCRIPT_DUPLOYAN			= HB_TAG ('D','u','p','l'), /*7.0*/
+  HB_SCRIPT_ELBASAN			= HB_TAG ('E','l','b','a'), /*7.0*/
+  HB_SCRIPT_GRANTHA			= HB_TAG ('G','r','a','n'), /*7.0*/
+  HB_SCRIPT_KHOJKI			= HB_TAG ('K','h','o','j'), /*7.0*/
+  HB_SCRIPT_KHUDAWADI			= HB_TAG ('S','i','n','d'), /*7.0*/
+  HB_SCRIPT_LINEAR_A			= HB_TAG ('L','i','n','a'), /*7.0*/
+  HB_SCRIPT_MAHAJANI			= HB_TAG ('M','a','h','j'), /*7.0*/
+  HB_SCRIPT_MANICHAEAN			= HB_TAG ('M','a','n','i'), /*7.0*/
+  HB_SCRIPT_MENDE_KIKAKUI		= HB_TAG ('M','e','n','d'), /*7.0*/
+  HB_SCRIPT_MODI			= HB_TAG ('M','o','d','i'), /*7.0*/
+  HB_SCRIPT_MRO				= HB_TAG ('M','r','o','o'), /*7.0*/
+  HB_SCRIPT_NABATAEAN			= HB_TAG ('N','b','a','t'), /*7.0*/
+  HB_SCRIPT_OLD_NORTH_ARABIAN		= HB_TAG ('N','a','r','b'), /*7.0*/
+  HB_SCRIPT_OLD_PERMIC			= HB_TAG ('P','e','r','m'), /*7.0*/
+  HB_SCRIPT_PAHAWH_HMONG		= HB_TAG ('H','m','n','g'), /*7.0*/
+  HB_SCRIPT_PALMYRENE			= HB_TAG ('P','a','l','m'), /*7.0*/
+  HB_SCRIPT_PAU_CIN_HAU			= HB_TAG ('P','a','u','c'), /*7.0*/
+  HB_SCRIPT_PSALTER_PAHLAVI		= HB_TAG ('P','h','l','p'), /*7.0*/
+  HB_SCRIPT_SIDDHAM			= HB_TAG ('S','i','d','d'), /*7.0*/
+  HB_SCRIPT_TIRHUTA			= HB_TAG ('T','i','r','h'), /*7.0*/
+  HB_SCRIPT_WARANG_CITI			= HB_TAG ('W','a','r','a'), /*7.0*/
 
-  /*8.0*/ HB_SCRIPT_AHOM			= HB_TAG ('A','h','o','m'),
-  /*8.0*/ HB_SCRIPT_ANATOLIAN_HIEROGLYPHS	= HB_TAG ('H','l','u','w'),
-  /*8.0*/ HB_SCRIPT_HATRAN			= HB_TAG ('H','a','t','r'),
-  /*8.0*/ HB_SCRIPT_MULTANI			= HB_TAG ('M','u','l','t'),
-  /*8.0*/ HB_SCRIPT_OLD_HUNGARIAN		= HB_TAG ('H','u','n','g'),
-  /*8.0*/ HB_SCRIPT_SIGNWRITING			= HB_TAG ('S','g','n','w'),
+  HB_SCRIPT_AHOM			= HB_TAG ('A','h','o','m'), /*8.0*/
+  HB_SCRIPT_ANATOLIAN_HIEROGLYPHS	= HB_TAG ('H','l','u','w'), /*8.0*/
+  HB_SCRIPT_HATRAN			= HB_TAG ('H','a','t','r'), /*8.0*/
+  HB_SCRIPT_MULTANI			= HB_TAG ('M','u','l','t'), /*8.0*/
+  HB_SCRIPT_OLD_HUNGARIAN		= HB_TAG ('H','u','n','g'), /*8.0*/
+  HB_SCRIPT_SIGNWRITING			= HB_TAG ('S','g','n','w'), /*8.0*/
 
   /*
    * Since 1.3.0
    */
-  /*9.0*/ HB_SCRIPT_ADLAM			= HB_TAG ('A','d','l','m'),
-  /*9.0*/ HB_SCRIPT_BHAIKSUKI			= HB_TAG ('B','h','k','s'),
-  /*9.0*/ HB_SCRIPT_MARCHEN			= HB_TAG ('M','a','r','c'),
-  /*9.0*/ HB_SCRIPT_OSAGE			= HB_TAG ('O','s','g','e'),
-  /*9.0*/ HB_SCRIPT_TANGUT			= HB_TAG ('T','a','n','g'),
-  /*9.0*/ HB_SCRIPT_NEWA			= HB_TAG ('N','e','w','a'),
+  HB_SCRIPT_ADLAM			= HB_TAG ('A','d','l','m'), /*9.0*/
+  HB_SCRIPT_BHAIKSUKI			= HB_TAG ('B','h','k','s'), /*9.0*/
+  HB_SCRIPT_MARCHEN			= HB_TAG ('M','a','r','c'), /*9.0*/
+  HB_SCRIPT_OSAGE			= HB_TAG ('O','s','g','e'), /*9.0*/
+  HB_SCRIPT_TANGUT			= HB_TAG ('T','a','n','g'), /*9.0*/
+  HB_SCRIPT_NEWA			= HB_TAG ('N','e','w','a'), /*9.0*/
 
   /*
    * 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'),
+  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'), /*10.0*/
 
   /*
    * Since 1.8.0
    */
-  /*11.0*/HB_SCRIPT_DOGRA			= HB_TAG ('D','o','g','r'),
-  /*11.0*/HB_SCRIPT_GUNJALA_GONDI		= HB_TAG ('G','o','n','g'),
-  /*11.0*/HB_SCRIPT_HANIFI_ROHINGYA		= HB_TAG ('R','o','h','g'),
-  /*11.0*/HB_SCRIPT_MAKASAR			= HB_TAG ('M','a','k','a'),
-  /*11.0*/HB_SCRIPT_MEDEFAIDRIN			= HB_TAG ('M','e','d','f'),
-  /*11.0*/HB_SCRIPT_OLD_SOGDIAN			= HB_TAG ('S','o','g','o'),
-  /*11.0*/HB_SCRIPT_SOGDIAN			= HB_TAG ('S','o','g','d'),
+  HB_SCRIPT_DOGRA			= HB_TAG ('D','o','g','r'), /*11.0*/
+  HB_SCRIPT_GUNJALA_GONDI		= HB_TAG ('G','o','n','g'), /*11.0*/
+  HB_SCRIPT_HANIFI_ROHINGYA		= HB_TAG ('R','o','h','g'), /*11.0*/
+  HB_SCRIPT_MAKASAR			= HB_TAG ('M','a','k','a'), /*11.0*/
+  HB_SCRIPT_MEDEFAIDRIN			= HB_TAG ('M','e','d','f'), /*11.0*/
+  HB_SCRIPT_OLD_SOGDIAN			= HB_TAG ('S','o','g','o'), /*11.0*/
+  HB_SCRIPT_SOGDIAN			= HB_TAG ('S','o','g','d'), /*11.0*/
 
   /*
    * Since 2.4.0
    */
-  /*12.0*/HB_SCRIPT_ELYMAIC			= HB_TAG ('E','l','y','m'),
-  /*12.0*/HB_SCRIPT_NANDINAGARI			= HB_TAG ('N','a','n','d'),
-  /*12.0*/HB_SCRIPT_NYIAKENG_PUACHUE_HMONG	= HB_TAG ('H','m','n','p'),
-  /*12.0*/HB_SCRIPT_WANCHO			= HB_TAG ('W','c','h','o'),
+  HB_SCRIPT_ELYMAIC			= HB_TAG ('E','l','y','m'), /*12.0*/
+  HB_SCRIPT_NANDINAGARI			= HB_TAG ('N','a','n','d'), /*12.0*/
+  HB_SCRIPT_NYIAKENG_PUACHUE_HMONG	= HB_TAG ('H','m','n','p'), /*12.0*/
+  HB_SCRIPT_WANCHO			= HB_TAG ('W','c','h','o'), /*12.0*/
 
   /*
    * Since 2.6.7
    */
-  /*13.0*/HB_SCRIPT_CHORASMIAN			= HB_TAG ('C','h','r','s'),
-  /*13.0*/HB_SCRIPT_DIVES_AKURU			= HB_TAG ('D','i','a','k'),
-  /*13.0*/HB_SCRIPT_KHITAN_SMALL_SCRIPT		= HB_TAG ('K','i','t','s'),
-  /*13.0*/HB_SCRIPT_YEZIDI			= HB_TAG ('Y','e','z','i'),
+  HB_SCRIPT_CHORASMIAN			= HB_TAG ('C','h','r','s'), /*13.0*/
+  HB_SCRIPT_DIVES_AKURU			= HB_TAG ('D','i','a','k'), /*13.0*/
+  HB_SCRIPT_KHITAN_SMALL_SCRIPT		= HB_TAG ('K','i','t','s'), /*13.0*/
+  HB_SCRIPT_YEZIDI			= HB_TAG ('Y','e','z','i'), /*13.0*/
 
   /* No script set. */
-  HB_SCRIPT_INVALID				= HB_TAG_NONE,
+  HB_SCRIPT_INVALID			= HB_TAG_NONE,
 
+  /*< private >*/
+
   /* Dummy values to ensure any hb_tag_t value can be passed/stored as hb_script_t
    * without risking undefined behavior.  We have two, for historical reasons.
    * HB_TAG_MAX used to be unsigned, but that was invalid Ansi C, so was changed
@@ -687,6 +731,13 @@
   char unused;
 } hb_user_data_key_t;
 
+/**
+ * hb_destroy_func_t:
+ * @user_data: the data to be destroyed
+ *
+ * A virtual method for destroy user-data callbacks.
+ *
+ */
 typedef void (*hb_destroy_func_t) (void *user_data);
 
 
@@ -693,14 +744,21 @@
 /* Font features and variations. */
 
 /**
- * HB_FEATURE_GLOBAL_START
+ * HB_FEATURE_GLOBAL_START:
  *
+ * Special setting for #hb_feature_t.start to apply the feature from the start
+ * of the buffer.
+ *
  * Since: 2.0.0
  */
 #define HB_FEATURE_GLOBAL_START	0
+
 /**
- * HB_FEATURE_GLOBAL_END
+ * HB_FEATURE_GLOBAL_END:
  *
+ * Special setting for #hb_feature_t.end to apply the feature from to the end
+ * of the buffer.
+ *
  * Since: 2.0.0
  */
 #define HB_FEATURE_GLOBAL_END	((unsigned int) -1)
@@ -717,7 +775,7 @@
  * The #hb_feature_t is the structure that holds information about requested
  * feature application. The feature will be applied with the given value to all
  * glyphs which are in clusters between @start (inclusive) and @end (exclusive).
- * Setting start to @HB_FEATURE_GLOBAL_START and end to @HB_FEATURE_GLOBAL_END
+ * Setting start to #HB_FEATURE_GLOBAL_START and end to #HB_FEATURE_GLOBAL_END
  * specifies that the feature always applies to the entire buffer.
  */
 typedef struct hb_feature_t {
@@ -741,8 +799,8 @@
  * @value: The value of the variation axis
  *
  * Data type for holding variation data. Registered OpenType
- * variation-axis tags are listed at
- * https://docs.microsoft.com/en-us/typography/opentype/spec/dvaraxisreg
+ * variation-axis tags are listed in
+ * [OpenType Axis Tag Registry](https://docs.microsoft.com/en-us/typography/opentype/spec/dvaraxisreg).
  * 
  * Since: 1.4.2
  */
@@ -769,6 +827,17 @@
  */
 typedef uint32_t hb_color_t;
 
+/**
+ * HB_COLOR:
+ * @b: blue channel value
+ * @g: green channel value
+ * @r: red channel value
+ * @a: alpha channel value
+ *
+ * Constructs an #hb_color_t from four integers.
+ *
+ * Since: 2.1.0
+ */
 #define HB_COLOR(b,g,r,a) ((hb_color_t) HB_TAG ((b),(g),(r),(a)))
 
 HB_EXTERN uint8_t

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-coretext.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-coretext.cc	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-coretext.cc	2021-04-17 22:31:16 UTC (rev 58898)
@@ -34,7 +34,6 @@
 
 #include "hb-coretext.h"
 #include "hb-aat-layout.hh"
-#include <math.h>
 
 
 /**
@@ -190,7 +189,10 @@
    * reconfiguring the cascade list causes CoreText crashes. For details, see
    * crbug.com/549610 */
   // 0x00070000 stands for "kCTVersionNumber10_10", see CoreText.h
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
   if (&CTGetCoreTextVersion != nullptr && CTGetCoreTextVersion() < 0x00070000) {
+#pragma GCC diagnostic pop
     CFStringRef fontName = CTFontCopyPostScriptName (ct_font);
     bool isEmojiFont = CFStringCompare (fontName, CFSTR("AppleColorEmoji"), 0) == kCFCompareEqualTo;
     CFRelease (fontName);
@@ -346,7 +348,7 @@
   const hb_coretext_font_data_t *data = font->data.coretext;
   if (unlikely (!data)) return nullptr;
 
-  if (fabs (CTFontGetSize ((CTFontRef) data) - (CGFloat) font->ptem) > .5)
+  if (fabs (CTFontGetSize ((CTFontRef) data) - (CGFloat) font->ptem) > (CGFloat) .5)
   {
     /* XXX-MT-bug
      * Note that evaluating condition above can be dangerous if another thread
@@ -402,7 +404,7 @@
 }
 
 /**
- * hb_coretext_face_get_ct_font:
+ * hb_coretext_font_get_ct_font:
  * @font: #hb_font_t to work upon
  *
  * Fetches the CTFontRef associated with the specified
@@ -858,7 +860,7 @@
 
     buffer->len = 0;
     uint32_t status_and = ~0, status_or = 0;
-    double advances_so_far = 0;
+    CGFloat advances_so_far = 0;
     /* For right-to-left runs, CoreText returns the glyphs positioned such that
      * any trailing whitespace is to the left of (0,0).  Adjust coordinate system
      * to fix for that.  Test with any RTL string with trailing spaces.
@@ -880,10 +882,10 @@
       status_or  |= run_status;
       status_and &= run_status;
       DEBUG_MSG (CORETEXT, run, "CTRunStatus: %x", run_status);
-      double run_advance = CTRunGetTypographicBounds (run, range_all, nullptr, nullptr, nullptr);
+      CGFloat run_advance = CTRunGetTypographicBounds (run, range_all, nullptr, nullptr, nullptr);
       if (HB_DIRECTION_IS_VERTICAL (buffer->props.direction))
 	  run_advance = -run_advance;
-      DEBUG_MSG (CORETEXT, run, "Run advance: %g", run_advance);
+      DEBUG_MSG (CORETEXT, run, "Run advance: %g", (double) run_advance);
 
       /* CoreText does automatic font fallback (AKA "cascading") for  characters
        * not supported by the requested font, and provides no way to turn it off,
@@ -1062,7 +1064,7 @@
 	  hb_position_t x_offset = (positions[0].x - advances_so_far) * x_mult;
 	  for (unsigned int j = 0; j < num_glyphs; j++)
 	  {
-	    double advance;
+	    CGFloat advance;
 	    if (likely (j + 1 < num_glyphs))
 	      advance = positions[j + 1].x - positions[j].x;
 	    else /* last glyph */
@@ -1078,7 +1080,7 @@
 	  hb_position_t y_offset = (positions[0].y - advances_so_far) * y_mult;
 	  for (unsigned int j = 0; j < num_glyphs; j++)
 	  {
-	    double advance;
+	    CGFloat advance;
 	    if (likely (j + 1 < num_glyphs))
 	      advance = positions[j + 1].y - positions[j].y;
 	    else /* last glyph */

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-deprecated.h
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-deprecated.h	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-deprecated.h	2021-04-17 22:31:16 UTC (rev 58898)
@@ -24,7 +24,7 @@
  * Google Author(s): Behdad Esfahbod
  */
 
-#ifndef HB_H_IN
+#if !defined(HB_H_IN) && !defined(HB_NO_SINGLE_HEADER_ERROR)
 #error "Include <hb.h> instead."
 #endif
 
@@ -53,11 +53,50 @@
 #ifndef HB_DISABLE_DEPRECATED
 
 
+/**
+ * HB_SCRIPT_CANADIAN_ABORIGINAL:
+ *
+ * Use #HB_SCRIPT_CANADIAN_SYLLABICS instead:
+ *
+ * Deprecated: 0.9.20
+ */
 #define HB_SCRIPT_CANADIAN_ABORIGINAL		HB_SCRIPT_CANADIAN_SYLLABICS
 
+/**
+ * HB_BUFFER_FLAGS_DEFAULT:
+ *
+ * Use #HB_BUFFER_FLAG_DEFAULT instead.
+ *
+ * Deprecated: 0.9.20
+ */
 #define HB_BUFFER_FLAGS_DEFAULT			HB_BUFFER_FLAG_DEFAULT
+/**
+ * HB_BUFFER_SERIALIZE_FLAGS_DEFAULT:
+ *
+ * Use #HB_BUFFER_SERIALIZE_FLAG_DEFAULT instead.
+ *
+ * Deprecated: 0.9.20
+ */
 #define HB_BUFFER_SERIALIZE_FLAGS_DEFAULT	HB_BUFFER_SERIALIZE_FLAG_DEFAULT
 
+/**
+ * hb_font_get_glyph_func_t:
+ * @font: #hb_font_t to work upon
+ * @font_data: @font user data pointer
+ * @unicode: The Unicode code point to query
+ * @variation_selector: The  variation-selector code point to query
+ * @glyph: (out): The glyph ID retrieved
+ * @user_data: User data pointer passed by the caller
+ *
+ * A virtual method for the #hb_font_funcs_t of an #hb_font_t object.
+ *
+ * This method should retrieve the glyph ID for a specified Unicode code point
+ * font, with an optional variation selector.
+ *
+ * Return value: %true if data found, %false otherwise
+ * Deprecated: 1.2.3
+ *
+ **/
 typedef hb_bool_t (*hb_font_get_glyph_func_t) (hb_font_t *font, void *font_data,
 					       hb_codepoint_t unicode, hb_codepoint_t variation_selector,
 					       hb_codepoint_t *glyph,
@@ -73,7 +112,12 @@
 
 /**
  * hb_unicode_eastasian_width_func_t:
+ * @ufuncs: A Unicode-functions structure
+ * @unicode: The code point to query
+ * @user_data: User data pointer passed by the caller
  *
+ * A virtual method for the #hb_unicode_funcs_t structure.
+ *
  * Deprecated: 2.0.0
  */
 typedef unsigned int			(*hb_unicode_eastasian_width_func_t)	(hb_unicode_funcs_t *ufuncs,
@@ -82,12 +126,12 @@
 
 /**
  * hb_unicode_funcs_set_eastasian_width_func:
- * @ufuncs: a Unicode function structure
- * @func: (closure user_data) (destroy destroy) (scope notified):
- * @user_data:
- * @destroy:
+ * @ufuncs: a Unicode-function structure
+ * @func: (closure user_data) (destroy destroy) (scope notified): The callback function to assign
+ * @user_data: Data to pass to @func
+ * @destroy: (nullable): The function to call when @user_data is not needed anymore
  *
- * 
+ * Sets the implementation function for #hb_unicode_eastasian_width_func_t.
  *
  * Since: 0.9.2
  * Deprecated: 2.0.0
@@ -99,7 +143,11 @@
 
 /**
  * hb_unicode_eastasian_width:
+ * @ufuncs: a Unicode-function structure
+ * @unicode: The code point to query
  *
+ * Don't use. Not used by HarfBuzz.
+ *
  * Since: 0.9.2
  * Deprecated: 2.0.0
  **/
@@ -112,7 +160,7 @@
  * hb_unicode_decompose_compatibility_func_t:
  * @ufuncs: a Unicode function structure
  * @u: codepoint to decompose
- * @decomposed: address of codepoint array (of length %HB_UNICODE_MAX_DECOMPOSITION_LEN) to write decomposition into
+ * @decomposed: address of codepoint array (of length #HB_UNICODE_MAX_DECOMPOSITION_LEN) to write decomposition into
  * @user_data: user data pointer as passed to hb_unicode_funcs_set_decompose_compatibility_func()
  *
  * Fully decompose @u to its Unicode compatibility decomposition. The codepoints of the decomposition will be written to @decomposed.
@@ -120,7 +168,7 @@
  *
  * If @u has no compatibility decomposition, zero should be returned.
  *
- * The Unicode standard guarantees that a buffer of length %HB_UNICODE_MAX_DECOMPOSITION_LEN codepoints will always be sufficient for any
+ * The Unicode standard guarantees that a buffer of length #HB_UNICODE_MAX_DECOMPOSITION_LEN codepoints will always be sufficient for any
  * compatibility decomposition plus an terminating value of 0.  Consequently, @decompose must be allocated by the caller to be at least this length.  Implementations
  * of this function type must ensure that they do not write past the provided array.
  *
@@ -144,11 +192,13 @@
 
 /**
  * hb_unicode_funcs_set_decompose_compatibility_func:
- * @ufuncs: a Unicode function structure
- * @func: (closure user_data) (destroy destroy) (scope notified):
- * @user_data:
- * @destroy:
+ * @ufuncs: A Unicode-functions structure
+ * @func: (closure user_data) (destroy destroy) (scope notified): The callback function to assign
+ * @user_data: Data to pass to @func
+ * @destroy: (nullable): The function to call when @user_data is not needed anymore
  *
+ * Sets the implementation function for #hb_unicode_decompose_compatibility_func_t.
+ *
  * 
  *
  * Since: 0.9.2
@@ -165,16 +215,25 @@
 				    hb_codepoint_t     *decomposed);
 
 
+/**
+ * hb_font_get_glyph_v_kerning_func_t:
+ *
+ * A virtual method for the #hb_font_funcs_t of an #hb_font_t object.
+ *
+ * This method should retrieve the kerning-adjustment value for a glyph-pair in
+ * the specified font, for vertical text segments.
+ *
+ **/
 typedef hb_font_get_glyph_kerning_func_t hb_font_get_glyph_v_kerning_func_t;
 
 /**
  * hb_font_funcs_set_glyph_v_kerning_func:
- * @ffuncs: font functions.
- * @func: (closure user_data) (destroy destroy) (scope notified):
- * @user_data:
- * @destroy:
+ * @ffuncs: A font-function structure
+ * @func: (closure user_data) (destroy destroy) (scope notified): The callback function to assign
+ * @user_data: Data to pass to @func
+ * @destroy: (nullable): The function to call when @user_data is not needed anymore
  *
- * 
+ * Sets the implementation function for #hb_font_get_glyph_v_kerning_func_t.
  *
  * Since: 0.9.2
  * Deprecated: 2.0.0

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-directwrite.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-directwrite.cc	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-directwrite.cc	2021-04-17 22:31:16 UTC (rev 58898)
@@ -957,6 +957,8 @@
  * hb_directwrite_face_create:
  * @font_face: a DirectWrite IDWriteFontFace object.
  *
+ * Constructs a new face object from the specified DirectWrite IDWriteFontFace.
+ *
  * Return value: #hb_face_t object corresponding to the given input
  *
  * Since: 2.4.0
@@ -974,6 +976,8 @@
 * hb_directwrite_face_get_font_face:
 * @face: a #hb_face_t object
 *
+* Gets the DirectWrite IDWriteFontFace associated with @face.
+*
 * Return value: DirectWrite IDWriteFontFace object corresponding to the given input
 *
 * Since: 2.5.0

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-dispatch.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-dispatch.hh	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-dispatch.hh	2021-04-17 22:31:16 UTC (rev 58898)
@@ -38,7 +38,6 @@
 template <typename Context, typename Return=hb_empty_t, unsigned int MaxDebugDepth=0>
 struct hb_dispatch_context_t
 {
-  hb_dispatch_context_t () : debug_depth (0) {}
   private:
   /* https://en.wikipedia.org/wiki/Curiously_recurring_template_pattern */
   const Context* thiz () const { return static_cast<const Context *> (this); }
@@ -54,7 +53,7 @@
   { return obj.dispatch (thiz (), hb_forward<Ts> (ds)...); }
   static return_t no_dispatch_return_value () { return Context::default_return_value (); }
   static bool stop_sublookup_iteration (const return_t r HB_UNUSED) { return false; }
-  unsigned debug_depth;
+  unsigned debug_depth = 0;
 };
 
 

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-draw.h
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-draw.h	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-draw.h	2021-04-17 22:31:16 UTC (rev 58898)
@@ -22,7 +22,7 @@
  * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
  */
 
-#ifndef HB_H_IN
+#if !defined(HB_H_IN) && !defined(HB_NO_SINGLE_HEADER_ERROR)
 #error "Include <hb.h> instead."
 #endif
 

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-face.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-face.cc	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-face.cc	2021-04-17 22:31:16 UTC (rev 58898)
@@ -89,8 +89,8 @@
   nullptr, /* destroy */
 
   0,    /* index */
-  HB_ATOMIC_INT_INIT (1000), /* upem */
-  HB_ATOMIC_INT_INIT (0),    /* num_glyphs */
+  1000, /* upem */
+  0,    /* num_glyphs */
 
   /* Zero for the rest is fine. */
 };
@@ -100,7 +100,7 @@
  * hb_face_create_for_tables:
  * @reference_table_func: (closure user_data) (destroy destroy) (scope notified): Table-referencing function
  * @user_data: A pointer to the user data
- * @destroy: (optional): A callback to call when @data is not needed anymore
+ * @destroy: (nullable): A callback to call when @data is not needed anymore
  *
  * Variant of hb_face_create(), built for those cases where it is more
  * convenient to provide data for individual tables instead of the whole font
@@ -235,7 +235,7 @@
  *
  * Fetches the singleton empty face object.
  *
- * Return value: (transfer full) The empty face object
+ * Return value: (transfer full): The empty face object
  *
  * Since: 0.9.2
  **/
@@ -299,7 +299,7 @@
  * @face: A face object
  * @key: The user-data key to set
  * @data: A pointer to the user data
- * @destroy: (optional): A callback to call when @data is not needed anymore
+ * @destroy: (nullable): A callback to call when @data is not needed anymore
  * @replace: Whether to replace an existing data with the same key
  *
  * Attaches a user-data key/data pair to the given face object. 
@@ -360,7 +360,7 @@
  *
  * Tests whether the given face object is immutable.
  *
- * Return value: True is @face is immutable, false otherwise
+ * Return value: %true is @face is immutable, %false otherwise
  *
  * Since: 0.9.2
  **/
@@ -756,7 +756,7 @@
   hb_face_builder_data_t *data = (hb_face_builder_data_t *) face->user_data;
 
   hb_face_builder_data_t::table_entry_t *entry = data->tables.push ();
-  if (data->tables.in_error())
+  if (unlikely (data->tables.in_error()))
     return false;
 
   entry->tag = tag;

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-face.h
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-face.h	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-face.h	2021-04-17 22:31:16 UTC (rev 58898)
@@ -24,7 +24,7 @@
  * Red Hat Author(s): Behdad Esfahbod
  */
 
-#ifndef HB_H_IN
+#if !defined(HB_H_IN) && !defined(HB_NO_SINGLE_HEADER_ERROR)
 #error "Include <hb.h> instead."
 #endif
 
@@ -58,6 +58,19 @@
 hb_face_create (hb_blob_t    *blob,
 		unsigned int  index);
 
+/**
+ * hb_reference_table_func_t:
+ * @face: an #hb_face_t to reference table for
+ * @tag: the tag of the table to reference
+ * @user_data: User data pointer passed by the caller
+ *
+ * Callback function for hb_face_create_for_tables().
+ *
+ * Return value: (transfer full): A pointer to the @tag table within @face
+ *
+ * Since: 0.9.2
+ */
+
 typedef hb_blob_t * (*hb_reference_table_func_t)  (hb_face_t *face, hb_tag_t tag, void *user_data);
 
 /* calls destroy() when not needing user_data anymore */

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-face.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-face.hh	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-face.hh	2021-04-17 22:31:16 UTC (rev 58898)
@@ -81,7 +81,7 @@
     return blob;
   }
 
-  HB_PURE_FUNC unsigned int get_upem () const
+  unsigned int get_upem () const
   {
     unsigned int ret = upem.get_relaxed ();
     if (unlikely (!ret))

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-font.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-font.cc	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-font.cc	2021-04-17 22:31:16 UTC (rev 58898)
@@ -628,7 +628,7 @@
  * @ffuncs: The font-functions structure
  * @key: The user-data key to set
  * @data: A pointer to the user data set
- * @destroy: (optional): A callback to call when @data is not needed anymore
+ * @destroy: (nullable): A callback to call when @data is not needed anymore
  * @replace: Whether to replace an existing data with the same key
  *
  * Attaches a user-data key/data pair to the specified font-functions structure. 
@@ -690,7 +690,7 @@
  *
  * Tests whether a font-functions structure is immutable.
  *
- * Return value: %true if @ffuncs is immutable, false otherwise
+ * Return value: %true if @ffuncs is immutable, %false otherwise
  *
  * Since: 0.9.2
  **/
@@ -753,10 +753,10 @@
  * @font: #hb_font_t to work upon
  * @extents: (out): The font extents retrieved
  *
- * Fetches the extents for a specified font, in horizontal
+ * Fetches the extents for a specified font, for horizontal
  * text segments.
  *
- * Return value: %true if data found, false otherwise
+ * Return value: %true if data found, %false otherwise
  *
  * Since: 1.1.3
  **/
@@ -772,10 +772,10 @@
  * @font: #hb_font_t to work upon
  * @extents: (out): The font extents retrieved
  *
- * Fetches the extents for a specified font, in vertical
+ * Fetches the extents for a specified font, for vertical
  * text segments.
  *
- * Return value: %true if data found, false otherwise
+ * Return value: %true if data found, %false otherwise
  *
  * Since: 1.1.3
  **/
@@ -790,7 +790,7 @@
  * hb_font_get_glyph:
  * @font: #hb_font_t to work upon
  * @unicode: The Unicode code point to query
- * @variation_selector: (optional): A variation-selector code point
+ * @variation_selector: A variation-selector code point
  * @glyph: (out): The glyph ID retrieved
  *
  * Fetches the glyph ID for a Unicode code point in the specified
@@ -799,7 +799,7 @@
  * If @variation_selector is 0, calls hb_font_get_nominal_glyph();
  * otherwise calls hb_font_get_variation_glyph().
  *
- * Return value: %true if data found, false otherwise
+ * Return value: %true if data found, %false otherwise
  *
  * Since: 0.9.2
  **/
@@ -827,7 +827,7 @@
  * for code points modified by variation selectors. For variation-selector
  * support, user hb_font_get_variation_glyph() or use hb_font_get_glyph().
  *
- * Return value: %true if data found, false otherwise
+ * Return value: %true if data found, %false otherwise
  *
  * Since: 1.2.3
  **/
@@ -841,12 +841,18 @@
 
 /**
  * hb_font_get_nominal_glyphs:
- * @font: a font.
+ * @font: #hb_font_t to work upon
+ * @count: number of code points to query
+ * @first_unicode: The first Unicode code point to query
+ * @unicode_stride: The stride between successive code points
+ * @first_glyph: (out): The first glyph ID retrieved
+ * @glyph_stride: The stride between successive glyph IDs
  *
+ * Fetches the nominal glyph IDs for a sequence of Unicode code points. Glyph
+ * IDs must be returned in a #hb_codepoint_t output parameter.
  *
+ * Return value: the number of code points processed
  *
- * Return value:
- *
  * Since: 2.6.3
  **/
 unsigned int
@@ -873,7 +879,7 @@
  * by the specified variation-selector code point, in the specified
  * font.
  *
- * Return value: %true if data found, false otherwise
+ * Return value: %true if data found, %false otherwise
  *
  * Since: 1.2.3
  **/
@@ -931,7 +937,7 @@
  * @first_glyph: The first glyph ID to query
  * @glyph_stride: The stride between successive glyph IDs
  * @first_advance: (out): The first advance retrieved
- * @advance_stride: (out): The stride between successive advances
+ * @advance_stride: The stride between successive advances
  *
  * Fetches the advances for a sequence of glyph IDs in the specified
  * font, for horizontal text segments. 
@@ -983,7 +989,7 @@
  * Fetches the (X,Y) coordinates of the origin for a glyph ID
  * in the specified font, for horizontal text segments.
  *
- * Return value: %true if data found, false otherwise
+ * Return value: %true if data found, %false otherwise
  *
  * Since: 0.9.2
  **/
@@ -1006,7 +1012,7 @@
  * Fetches the (X,Y) coordinates of the origin for a glyph ID
  * in the specified font, for vertical text segments.
  *
- * Return value: %true if data found, false otherwise
+ * Return value: %true if data found, %false otherwise
  *
  * Since: 0.9.2
  **/
@@ -1026,7 +1032,7 @@
  * @right_glyph: The glyph ID of the right glyph in the glyph pair
  *
  * Fetches the kerning-adjustment value for a glyph-pair in
- * the specified font, in horizontal text segments.
+ * the specified font, for horizontal text segments.
  *
  * <note>It handles legacy kerning only (as returned by the corresponding
  * #hb_font_funcs_t function).</note>
@@ -1051,7 +1057,7 @@
  * @bottom_glyph: The glyph ID of the bottom glyph in the glyph pair
  *
  * Fetches the kerning-adjustment value for a glyph-pair in
- * the specified font, in vertical text segments.
+ * the specified font, for vertical text segments.
  *
  * <note>It handles legacy kerning only (as returned by the corresponding
  * #hb_font_funcs_t function).</note>
@@ -1079,7 +1085,7 @@
  * Fetches the #hb_glyph_extents_t data for a glyph ID
  * in the specified font.
  *
- * Return value: %true if data found, false otherwise
+ * Return value: %true if data found, %false otherwise
  *
  * Since: 0.9.2
  **/
@@ -1102,7 +1108,7 @@
  * Fetches the (x,y) coordinates of a specified contour-point index
  * in the specified glyph, within the specified font.
  *
- * Return value: %true if data found, false otherwise
+ * Return value: %true if data found, %false otherwise
  *
  * Since: 0.9.2
  **/
@@ -1125,7 +1131,7 @@
  *
  * Fetches the glyph-name string for a glyph ID in the specified @font.
  *
- * Return value: %true if data found, zero otherwise
+ * Return value: %true if data found, %false otherwise
  *
  * Since: 0.9.2
  **/
@@ -1149,7 +1155,7 @@
  *
  * <note>Note: @len == -1 means the name string is null-terminated.</note>
  *
- * Return value: %true if data found, false otherwise
+ * Return value: %true if data found, %false otherwise
  *
  * Since: 0.9.2
  **/
@@ -1169,7 +1175,7 @@
  * hb_font_get_extents_for_direction:
  * @font: #hb_font_t to work upon
  * @direction: The direction of the text segment
- * @extents: (out): The #hb_glyph_extents_t retrieved
+ * @extents: (out): The #hb_font_extents_t retrieved
  *
  * Fetches the extents for a font in a text segment of the
  * specified direction.
@@ -1364,7 +1370,7 @@
  * Calls the appropriate direction-specific variant (horizontal
  * or vertical) depending on the value of @direction.
  *
- * Return value: %true if data found, false otherwise
+ * Return value: %true if data found, %false otherwise
  *
  * Since: 0.9.2
  **/
@@ -1393,7 +1399,7 @@
  * Calls the appropriate direction-specific variant (horizontal
  * or vertical) depending on the value of @direction.
  *
- * Return value: %true if data found, false otherwise
+ * Return value: %true if data found, %false otherwise
  *
  * Since: 0.9.2
  **/
@@ -1444,7 +1450,7 @@
  *
  * <note>Note: @len == -1 means the string is null-terminated.</note>
  *
- * Return value: %true if data found, false otherwise
+ * Return value: %true if data found, %false otherwise
  *
  * Since: 0.9.2
  **/
@@ -1664,12 +1670,12 @@
  * @font: #hb_font_t to work upon
  * @key: The user-data key 
  * @data: A pointer to the user data
- * @destroy: (optional): A callback to call when @data is not needed anymore
+ * @destroy: (nullable): A callback to call when @data is not needed anymore
  * @replace: Whether to replace an existing data with the same key
  *
  * Attaches a user-data key/data pair to the specified font object. 
  *
- * Return value:
+ * Return value: %true if success, %false otherwise
  *
  * Since: 0.9.2
  **/
@@ -1728,7 +1734,7 @@
  *
  * Tests whether a font object is immutable.
  *
- * Return value: %true if @font is immutable, false otherwise
+ * Return value: %true if @font is immutable, %false otherwise
  *
  * Since: 0.9.2
  **/
@@ -1828,9 +1834,9 @@
 /**
  * hb_font_set_funcs:
  * @font: #hb_font_t to work upon
- * @klass: (closure font_data) (destroy destroy) (scope notified):
+ * @klass: (closure font_data) (destroy destroy) (scope notified): The font-functions structure.
  * @font_data: Data to attach to @font
- * @destroy: (optional): The function to call when @font_data is not needed anymore
+ * @destroy: (nullable): The function to call when @font_data is not needed anymore
  *
  * Replaces the font-functions structure attached to a font, updating
  * the font's user-data with @font-data and the @destroy callback.
@@ -1867,7 +1873,7 @@
  * hb_font_set_funcs_data:
  * @font: #hb_font_t to work upon
  * @font_data: (destroy destroy) (scope notified): Data to attach to @font
- * @destroy: (optional): The function to call when @font_data is not needed anymore
+ * @destroy: (nullable): The function to call when @font_data is not needed anymore
  *
  * Replaces the user data attached to a font, updating the font's 
  * @destroy callback.
@@ -2212,10 +2218,14 @@
 #ifdef HB_EXPERIMENTAL_API
 /**
  * hb_font_get_var_coords_design:
+ * @font: #hb_font_t to work upon
+ * @length: (out): number of coordinates
  *
  * Return value is valid as long as variation coordinates of the font
  * are not modified.
  *
+ * Return value: coordinates array
+ *
  * Since: EXPERIMENTAL
  */
 const float *
@@ -2319,7 +2329,7 @@
  * @ffuncs: The font-functions structure
  * @func: (closure user_data) (destroy destroy) (scope notified): callback function
  * @user_data: data to pass to @func
- * @destroy: (optional): function to call when @user_data is not needed anymore
+ * @destroy: (nullable): function to call when @user_data is not needed anymore
  *
  * Deprecated.  Use hb_font_funcs_set_nominal_glyph_func() and
  * hb_font_funcs_set_variation_glyph_func() instead.

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-font.h
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-font.h	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-font.h	2021-04-17 22:31:16 UTC (rev 58898)
@@ -24,7 +24,7 @@
  * Red Hat Author(s): Behdad Esfahbod
  */
 
-#ifndef HB_H_IN
+#if !defined(HB_H_IN) && !defined(HB_NO_SINGLE_HEADER_ERROR)
 #error "Include <hb.h> instead."
 #endif
 
@@ -37,7 +37,12 @@
 
 HB_BEGIN_DECLS
 
-
+/**
+ * hb_font_t:
+ *
+ * Data type for holding fonts.
+ *
+ */
 typedef struct hb_font_t hb_font_t;
 
 
@@ -141,6 +146,16 @@
 
 /* func types */
 
+/**
+ * hb_font_get_font_extents_func_t:
+ * @font: #hb_font_t to work upon
+ * @font_data: @font user data pointer
+ * @extents: (out): The font extents retrieved
+ * @user_data: User data pointer passed by the caller
+ *
+ * This method should retrieve the extents for a font.
+ *
+ **/
 typedef hb_bool_t (*hb_font_get_font_extents_func_t) (hb_font_t *font, void *font_data,
 						       hb_font_extents_t *extents,
 						       void *user_data);
@@ -150,7 +165,7 @@
  *
  * A virtual method for the #hb_font_funcs_t of an #hb_font_t object.
  *
- * This method should retrieve the extents for a font, in horizontal-direction
+ * This method should retrieve the extents for a font, for horizontal-direction
  * text segments. Extents must be returned in an #hb_glyph_extents output
  * parameter.
  * 
@@ -162,7 +177,7 @@
  *
  * A virtual method for the #hb_font_funcs_t of an #hb_font_t object.
  *
- * This method should retrieve the extents for a font, in vertical-direction
+ * This method should retrieve the extents for a font, for vertical-direction
  * text segments. Extents must be returned in an #hb_glyph_extents output
  * parameter.
  * 
@@ -172,6 +187,11 @@
 
 /**
  * hb_font_get_nominal_glyph_func_t:
+ * @font: #hb_font_t to work upon
+ * @font_data: @font user data pointer
+ * @unicode: The Unicode code point to query
+ * @glyph: (out): The glyph ID retrieved
+ * @user_data: User data pointer passed by the caller
  *
  * A virtual method for the #hb_font_funcs_t of an #hb_font_t object.
  *
@@ -178,6 +198,8 @@
  * This method should retrieve the nominal glyph ID for a specified Unicode code
  * point. Glyph IDs must be returned in a #hb_codepoint_t output parameter.
  * 
+ * Return value: %true if data found, %false otherwise
+ *
  **/
 typedef hb_bool_t (*hb_font_get_nominal_glyph_func_t) (hb_font_t *font, void *font_data,
 						       hb_codepoint_t unicode,
@@ -186,6 +208,12 @@
 
 /**
  * hb_font_get_variation_glyph_func_t:
+ * @font: #hb_font_t to work upon
+ * @font_data: @font user data pointer
+ * @unicode: The Unicode code point to query
+ * @variation_selector: The  variation-selector code point to query
+ * @glyph: (out): The glyph ID retrieved
+ * @user_data: User data pointer passed by the caller
  *
  * A virtual method for the #hb_font_funcs_t of an #hb_font_t object.
  *
@@ -193,6 +221,8 @@
  * followed by a specified Variation Selector code point. Glyph IDs must be
  * returned in a #hb_codepoint_t output parameter.
  * 
+ * Return value: %true if data found, %false otherwise
+ *
  **/
 typedef hb_bool_t (*hb_font_get_variation_glyph_func_t) (hb_font_t *font, void *font_data,
 							 hb_codepoint_t unicode, hb_codepoint_t variation_selector,
@@ -202,6 +232,14 @@
 
 /**
  * hb_font_get_nominal_glyphs_func_t:
+ * @font: #hb_font_t to work upon
+ * @font_data: @font user data pointer
+ * @count: number of code points to query
+ * @first_unicode: The first Unicode code point to query
+ * @unicode_stride: The stride between successive code points
+ * @first_glyph: (out): The first glyph ID retrieved
+ * @glyph_stride: The stride between successive glyph IDs
+ * @user_data: User data pointer passed by the caller
  *
  * A virtual method for the #hb_font_funcs_t of an #hb_font_t object.
  *
@@ -208,6 +246,8 @@
  * This method should retrieve the nominal glyph IDs for a sequence of
  * Unicode code points. Glyph IDs must be returned in a #hb_codepoint_t
  * output parameter.
+ *
+ * Return value: the number of code points processed
  * 
  **/
 typedef unsigned int (*hb_font_get_nominal_glyphs_func_t) (hb_font_t *font, void *font_data,
@@ -220,6 +260,10 @@
 
 /**
  * hb_font_get_glyph_advance_func_t:
+ * @font: #hb_font_t to work upon
+ * @font_data: @font user data pointer
+ * @glyph: The glyph ID to query
+ * @user_data: User data pointer passed by the caller
  *
  * A virtual method for the #hb_font_funcs_t of an #hb_font_t object.
  *
@@ -226,6 +270,8 @@
  * This method should retrieve the advance for a specified glyph. The
  * method must return an #hb_position_t.
  * 
+ * Return value: The advance of @glyph within @font
+ *
  **/
 typedef hb_position_t (*hb_font_get_glyph_advance_func_t) (hb_font_t *font, void *font_data,
 							   hb_codepoint_t glyph,
@@ -257,6 +303,14 @@
 
 /**
  * hb_font_get_glyph_advances_func_t:
+ * @font: #hb_font_t to work upon
+ * @font_data: @font user data pointer
+ * @count: The number of glyph IDs in the sequence queried
+ * @first_glyph: The first glyph ID to query
+ * @glyph_stride: The stride between successive glyph IDs
+ * @first_advance: (out): The first advance retrieved
+ * @advance_stride: The stride between successive advances
+ * @user_data: User data pointer passed by the caller
  *
  * A virtual method for the #hb_font_funcs_t of an #hb_font_t object.
  *
@@ -295,6 +349,12 @@
 
 /**
  * hb_font_get_glyph_origin_func_t:
+ * @font: #hb_font_t to work upon
+ * @font_data: @font user data pointer
+ * @glyph: The glyph ID to query
+ * @x: (out): The X coordinate of the origin
+ * @y: (out): The Y coordinate of the origin
+ * @user_data: User data pointer passed by the caller
  *
  * A virtual method for the #hb_font_funcs_t of an #hb_font_t object.
  *
@@ -301,6 +361,8 @@
  * This method should retrieve the (X,Y) coordinates (in font units) of the
  * origin for a glyph. Each coordinate must be returned in an #hb_position_t
  * output parameter.
+ *
+ * Return value: %true if data found, %false otherwise
  * 
  **/
 typedef hb_bool_t (*hb_font_get_glyph_origin_func_t) (hb_font_t *font, void *font_data,
@@ -314,7 +376,7 @@
  * A virtual method for the #hb_font_funcs_t of an #hb_font_t object.
  *
  * This method should retrieve the (X,Y) coordinates (in font units) of the
- * origin for a glyph, in horizontal-direction text segments. Each
+ * origin for a glyph, for horizontal-direction text segments. Each
  * coordinate must be returned in an #hb_position_t output parameter.
  * 
  **/
@@ -326,25 +388,53 @@
  * A virtual method for the #hb_font_funcs_t of an #hb_font_t object.
  *
  * This method should retrieve the (X,Y) coordinates (in font units) of the
- * origin for a glyph, in vertical-direction text segments. Each coordinate
+ * origin for a glyph, for vertical-direction text segments. Each coordinate
  * must be returned in an #hb_position_t output parameter.
  * 
  **/
 typedef hb_font_get_glyph_origin_func_t hb_font_get_glyph_v_origin_func_t;
 
+/**
+ * hb_font_get_glyph_kerning_func_t:
+ * @font: #hb_font_t to work upon
+ * @font_data: @font user data pointer
+ * @first_glyph: The glyph ID of the first glyph in the glyph pair
+ * @second_glyph: The glyph ID of the second glyph in the glyph pair
+ * @user_data: User data pointer passed by the caller
+ *
+ * This method should retrieve the kerning-adjustment value for a glyph-pair in
+ * the specified font, for horizontal text segments.
+ *
+ **/
 typedef hb_position_t (*hb_font_get_glyph_kerning_func_t) (hb_font_t *font, void *font_data,
 							   hb_codepoint_t first_glyph, hb_codepoint_t second_glyph,
 							   void *user_data);
+/**
+ * hb_font_get_glyph_h_kerning_func_t:
+ *
+ * A virtual method for the #hb_font_funcs_t of an #hb_font_t object.
+ *
+ * This method should retrieve the kerning-adjustment value for a glyph-pair in
+ * the specified font, for horizontal text segments.
+ *
+ **/
 typedef hb_font_get_glyph_kerning_func_t hb_font_get_glyph_h_kerning_func_t;
 
 
 /**
  * hb_font_get_glyph_extents_func_t:
+ * @font: #hb_font_t to work upon
+ * @font_data: @font user data pointer
+ * @glyph: The glyph ID to query
+ * @extents: (out): The #hb_glyph_extents_t retrieved
+ * @user_data: User data pointer passed by the caller
  *
  * A virtual method for the #hb_font_funcs_t of an #hb_font_t object.
  *
  * This method should retrieve the extents for a specified glyph. Extents must be 
  * returned in an #hb_glyph_extents output parameter.
+ *
+ * Return value: %true if data found, %false otherwise
  * 
  **/
 typedef hb_bool_t (*hb_font_get_glyph_extents_func_t) (hb_font_t *font, void *font_data,
@@ -354,6 +444,13 @@
 
 /**
  * hb_font_get_glyph_contour_point_func_t:
+ * @font: #hb_font_t to work upon
+ * @font_data: @font user data pointer
+ * @glyph: The glyph ID to query
+ * @point_index: The contour-point index to query
+ * @x: (out): The X value retrieved for the contour point
+ * @y: (out): The Y value retrieved for the contour point
+ * @user_data: User data pointer passed by the caller
  *
  * A virtual method for the #hb_font_funcs_t of an #hb_font_t object.
  *
@@ -361,6 +458,8 @@
  * specified contour point in a glyph. Each coordinate must be returned as
  * an #hb_position_t output parameter.
  * 
+ * Return value: %true if data found, %false otherwise
+ *
  **/
 typedef hb_bool_t (*hb_font_get_glyph_contour_point_func_t) (hb_font_t *font, void *font_data,
 							     hb_codepoint_t glyph, unsigned int point_index,
@@ -370,6 +469,12 @@
 
 /**
  * hb_font_get_glyph_name_func_t:
+ * @font: #hb_font_t to work upon
+ * @font_data: @font user data pointer
+ * @glyph: The glyph ID to query
+ * @name: (out) (array length=size): Name string retrieved for the glyph ID
+ * @size: Length of the glyph-name string retrieved
+ * @user_data: User data pointer passed by the caller
  *
  * A virtual method for the #hb_font_funcs_t of an #hb_font_t object.
  *
@@ -376,6 +481,8 @@
  * This method should retrieve the glyph name that corresponds to a
  * glyph ID. The name should be returned in a string output parameter.
  * 
+ * Return value: %true if data found, %false otherwise
+ *
  **/
 typedef hb_bool_t (*hb_font_get_glyph_name_func_t) (hb_font_t *font, void *font_data,
 						    hb_codepoint_t glyph,
@@ -384,6 +491,12 @@
 
 /**
  * hb_font_get_glyph_from_name_func_t:
+ * @font: #hb_font_t to work upon
+ * @font_data: @font user data pointer
+ * @name: (array length=len): The name string to query
+ * @len: The length of the name queried
+ * @glyph: (out): The glyph ID retrieved
+ * @user_data: User data pointer passed by the caller
  *
  * A virtual method for the #hb_font_funcs_t of an #hb_font_t object.
  *
@@ -390,6 +503,8 @@
  * This method should retrieve the glyph ID that corresponds to a glyph-name
  * string. 
  * 
+ * Return value: %true if data found, %false otherwise
+ *
  **/
 typedef hb_bool_t (*hb_font_get_glyph_from_name_func_t) (hb_font_t *font, void *font_data,
 							 const char *name, int len, /* -1 means nul-terminated */
@@ -404,7 +519,7 @@
  * @ffuncs: A font-function structure
  * @func: (closure user_data) (destroy destroy) (scope notified): The callback function to assign
  * @user_data: Data to pass to @func
- * @destroy: (optional): The function to call when @user_data is not needed anymore
+ * @destroy: (nullable): The function to call when @user_data is not needed anymore
  *
  * Sets the implementation function for #hb_font_get_font_h_extents_func_t.
  *
@@ -420,7 +535,7 @@
  * @ffuncs: A font-function structure
  * @func: (closure user_data) (destroy destroy) (scope notified): The callback function to assign
  * @user_data: Data to pass to @func
- * @destroy: (optional): The function to call when @user_data is not needed anymore
+ * @destroy: (nullable): The function to call when @user_data is not needed anymore
  *
  * Sets the implementation function for #hb_font_get_font_v_extents_func_t.
  *
@@ -436,7 +551,7 @@
  * @ffuncs: A font-function structure
  * @func: (closure user_data) (destroy destroy) (scope notified): The callback function to assign
  * @user_data: Data to pass to @func
- * @destroy: (optional): The function to call when @user_data is not needed anymore
+ * @destroy: (nullable): The function to call when @user_data is not needed anymore
  *
  * Sets the implementation function for #hb_font_get_nominal_glyph_func_t.
  *
@@ -452,7 +567,7 @@
  * @ffuncs: A font-function structure
  * @func: (closure user_data) (destroy destroy) (scope notified): The callback function to assign
  * @user_data: Data to pass to @func
- * @destroy: (optional): The function to call when @user_data is not needed anymore
+ * @destroy: (nullable): The function to call when @user_data is not needed anymore
  *
  * Sets the implementation function for #hb_font_get_nominal_glyphs_func_t.
  *
@@ -468,7 +583,7 @@
  * @ffuncs: A font-function structure
  * @func: (closure user_data) (destroy destroy) (scope notified): The callback function to assign
  * @user_data: Data to pass to @func
- * @destroy: (optional): The function to call when @user_data is not needed anymore
+ * @destroy: (nullable): The function to call when @user_data is not needed anymore
  *
  * Sets the implementation function for #hb_font_get_variation_glyph_func_t.
  *
@@ -484,7 +599,7 @@
  * @ffuncs: A font-function structure
  * @func: (closure user_data) (destroy destroy) (scope notified): The callback function to assign
  * @user_data: Data to pass to @func
- * @destroy: (optional): The function to call when @user_data is not needed anymore
+ * @destroy: (nullable): The function to call when @user_data is not needed anymore
  *
  * Sets the implementation function for #hb_font_get_glyph_h_advance_func_t.
  *
@@ -500,7 +615,7 @@
  * @ffuncs: A font-function structure
  * @func: (closure user_data) (destroy destroy) (scope notified): The callback function to assign
  * @user_data: Data to pass to @func
- * @destroy: (optional): The function to call when @user_data is not needed anymore
+ * @destroy: (nullable): The function to call when @user_data is not needed anymore
  *
  * Sets the implementation function for #hb_font_get_glyph_v_advance_func_t.
  *
@@ -516,7 +631,7 @@
  * @ffuncs: A font-function structure
  * @func: (closure user_data) (destroy destroy) (scope notified): The callback function to assign
  * @user_data: Data to pass to @func
- * @destroy: (optional): The function to call when @user_data is not needed anymore
+ * @destroy: (nullable): The function to call when @user_data is not needed anymore
  *
  * Sets the implementation function for #hb_font_get_glyph_h_advances_func_t.
  *
@@ -532,7 +647,7 @@
  * @ffuncs: A font-function structure
  * @func: (closure user_data) (destroy destroy) (scope notified): The callback function to assign
  * @user_data: Data to pass to @func
- * @destroy: (optional): The function to call when @user_data is not needed anymore
+ * @destroy: (nullable): The function to call when @user_data is not needed anymore
  *
  * Sets the implementation function for #hb_font_get_glyph_v_advances_func_t.
  *
@@ -548,7 +663,7 @@
  * @ffuncs: A font-function structure
  * @func: (closure user_data) (destroy destroy) (scope notified): The callback function to assign
  * @user_data: Data to pass to @func
- * @destroy: (optional): The function to call when @user_data is not needed anymore
+ * @destroy: (nullable): The function to call when @user_data is not needed anymore
  *
  * Sets the implementation function for #hb_font_get_glyph_h_origin_func_t.
  *
@@ -564,7 +679,7 @@
  * @ffuncs: A font-function structure
  * @func: (closure user_data) (destroy destroy) (scope notified): The callback function to assign
  * @user_data: Data to pass to @func
- * @destroy: (optional): The function to call when @user_data is not needed anymore
+ * @destroy: (nullable): The function to call when @user_data is not needed anymore
  *
  * Sets the implementation function for #hb_font_get_glyph_v_origin_func_t.
  *
@@ -577,13 +692,13 @@
 
 /**
  * hb_font_funcs_set_glyph_h_kerning_func:
- * @ffuncs: font functions.
- * @func: (closure user_data) (destroy destroy) (scope notified):
- * @user_data:
- * @destroy:
+ * @ffuncs: A font-function structure
+ * @func: (closure user_data) (destroy destroy) (scope notified): The callback function to assign
+ * @user_data: Data to pass to @func
+ * @destroy: (nullable): The function to call when @user_data is not needed anymore
  *
+ * Sets the implementation function for #hb_font_get_glyph_h_kerning_func_t.
  *
- *
  * Since: 0.9.2
  **/
 HB_EXTERN void
@@ -596,7 +711,7 @@
  * @ffuncs: A font-function structure
  * @func: (closure user_data) (destroy destroy) (scope notified): The callback function to assign
  * @user_data: Data to pass to @func
- * @destroy: (optional): The function to call when @user_data is not needed anymore
+ * @destroy: (nullable): The function to call when @user_data is not needed anymore
  *
  * Sets the implementation function for #hb_font_get_glyph_extents_func_t.
  *
@@ -612,7 +727,7 @@
  * @ffuncs: A font-function structure
  * @func: (closure user_data) (destroy destroy) (scope notified): The callback function to assign
  * @user_data: Data to pass to @func
- * @destroy: (optional): The function to call when @user_data is not needed anymore
+ * @destroy: (nullable): The function to call when @user_data is not needed anymore
  *
  * Sets the implementation function for #hb_font_get_glyph_contour_point_func_t.
  *
@@ -628,7 +743,7 @@
  * @ffuncs: A font-function structure
  * @func: (closure user_data) (destroy destroy) (scope notified): The callback function to assign
  * @user_data: Data to pass to @func
- * @destroy: (optional): The function to call when @user_data is not needed anymore
+ * @destroy: (nullable): The function to call when @user_data is not needed anymore
  *
  * Sets the implementation function for #hb_font_get_glyph_name_func_t.
  *
@@ -644,7 +759,7 @@
  * @ffuncs: A font-function structure
  * @func: (closure user_data) (destroy destroy) (scope notified): The callback function to assign
  * @user_data: Data to pass to @func
- * @destroy: (optional): The function to call when @user_data is not needed anymore
+ * @destroy: (nullable): The function to call when @user_data is not needed anymore
  *
  * Sets the implementation function for #hb_font_get_glyph_from_name_func_t.
  *

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ft.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ft.cc	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ft.cc	2021-04-17 22:31:16 UTC (rev 58898)
@@ -84,7 +84,7 @@
   bool symbol; /* Whether selected cmap is symbol cmap. */
   bool unref; /* Whether to destroy ft_face when done. */
 
-  mutable hb_atomic_int_t cached_x_scale;
+  mutable int cached_x_scale;
   mutable hb_advance_cache_t advance_cache;
 };
 
@@ -101,7 +101,7 @@
 
   ft_font->load_flags = FT_LOAD_DEFAULT | FT_LOAD_NO_HINTING;
 
-  ft_font->cached_x_scale.set_relaxed (0);
+  ft_font->cached_x_scale = 0;
   ft_font->advance_cache.init ();
 
   return ft_font;
@@ -179,13 +179,13 @@
 }
 
 /**
- * hb_ft_get_face:
+ * hb_ft_font_get_face:
  * @font: #hb_font_t to work upon
  *
  * Fetches the FT_Face associated with the specified #hb_font_t
  * font object.
  *
- * Return value: the FT_Face found
+ * Return value: (nullable): the FT_Face found or %NULL
  *
  * Since: 0.9.2
  **/
@@ -202,11 +202,12 @@
 
 /**
  * hb_ft_font_lock_face:
- * @font:
+ * @font: #hb_font_t to work upon
  *
+ * Gets the FT_Face associated with @font, This face will be kept around until
+ * you call hb_ft_font_unlock_face().
  *
- *
- * Return value:
+ * Return value: (nullable): the FT_Face associated with @font or %NULL
  * Since: 2.6.5
  **/
 FT_Face
@@ -224,11 +225,10 @@
 
 /**
  * hb_ft_font_unlock_face:
- * @font:
+ * @font: #hb_font_t to work upon
  *
+ * Releases an FT_Face previously obtained with hb_ft_font_lock_face().
  *
- *
- * Return value:
  * Since: 2.6.5
  **/
 void
@@ -335,10 +335,10 @@
   int load_flags = ft_font->load_flags;
   int mult = font->x_scale < 0 ? -1 : +1;
 
-  if (font->x_scale != ft_font->cached_x_scale.get ())
+  if (font->x_scale != ft_font->cached_x_scale)
   {
     ft_font->advance_cache.clear ();
-    ft_font->cached_x_scale.set (font->x_scale);
+    ft_font->cached_x_scale = font->x_scale;
   }
 
   for (unsigned int i = 0; i < count; i++)
@@ -661,7 +661,7 @@
 /**
  * hb_ft_face_create:
  * @ft_face: (destroy destroy) (scope notified): FT_Face to work upon
- * @destroy: (optional): A callback to call when the face object is not needed anymore
+ * @destroy: (nullable): A callback to call when the face object is not needed anymore
  *
  * Creates an #hb_face_t face object from the specified FT_Face.
  *
@@ -771,13 +771,13 @@
 /**
  * hb_ft_font_create:
  * @ft_face: (destroy destroy) (scope notified): FT_Face to work upon
- * @destroy: (optional): A callback to call when the font object is not needed anymore
+ * @destroy: (nullable): A callback to call when the font object is not needed anymore
  *
  * Creates an #hb_font_t font object from the specified FT_Face.
  *
  * <note>Note: You must set the face size on @ft_face before calling
- * hb_ft_font_create() on it. Otherwise, HarfBuzz will not pick up
- * the face size.</note>
+ * hb_ft_font_create() on it. HarfBuzz assumes size is always set and will
+ * access `size` member of FT_Face unconditionally.</note>
  *
  * This variant of the function does not provide any life-cycle management.
  *
@@ -814,7 +814,7 @@
 }
 
 /**
- * hb_ft_font_has_changed:
+ * hb_ft_font_changed:
  * @font: #hb_font_t to work upon
  *
  * Refreshes the state of @font when the underlying FT_Face has changed.
@@ -884,8 +884,8 @@
  * Creates an #hb_font_t font object from the specified FT_Face.
  *
  * <note>Note: You must set the face size on @ft_face before calling
- * hb_ft_font_create_references() on it. Otherwise, HarfBuzz will not pick up
- * the face size.</note>
+ * hb_ft_font_create_referenced() on it. HarfBuzz assumes size is always set
+ * and will access `size` member of FT_Face unconditionally.</note>
  *
  * This is the preferred variant of the hb_ft_font_create*
  * function family, because it calls FT_Reference_Face() on @ft_face,

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-gdi.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-gdi.cc	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-gdi.cc	2021-04-17 22:31:16 UTC (rev 58898)
@@ -70,6 +70,8 @@
  * hb_gdi_face_create:
  * @hfont: a HFONT object.
  *
+ * Constructs a new face object from the specified GDI HFONT.
+ *
  * Return value: #hb_face_t object corresponding to the given input
  *
  * Since: 2.6.0

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-gobject-enums.h.tmpl
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-gobject-enums.h.tmpl	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-gobject-enums.h.tmpl	2021-04-17 22:31:16 UTC (rev 58898)
@@ -25,7 +25,7 @@
  * Google Author(s): Behdad Esfahbod
  */
 
-#ifndef HB_GOBJECT_H_IN
+#if !defined(HB_GOBJECT_H_IN) && !defined(HB_NO_SINGLE_HEADER_ERROR)
 #error "Include <hb-gobject.h> instead."
 #endif
 

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-gobject-structs.h
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-gobject-structs.h	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-gobject-structs.h	2021-04-17 22:31:16 UTC (rev 58898)
@@ -24,7 +24,7 @@
  * Google Author(s): Behdad Esfahbod
  */
 
-#ifndef HB_GOBJECT_H_IN
+#if !defined(HB_GOBJECT_H_IN) && !defined(HB_NO_SINGLE_HEADER_ERROR)
 #error "Include <hb-gobject.h> instead."
 #endif
 
@@ -40,47 +40,22 @@
 
 /* Object types */
 
-/**
- * hb_gobject_blob_get_type:
- *
- * Since: 0.9.2
- **/
 HB_EXTERN GType
 hb_gobject_blob_get_type (void);
 #define HB_GOBJECT_TYPE_BLOB (hb_gobject_blob_get_type ())
 
-/**
- * hb_gobject_buffer_get_type:
- *
- * Since: 0.9.2
- **/
 HB_EXTERN GType
 hb_gobject_buffer_get_type (void);
 #define HB_GOBJECT_TYPE_BUFFER (hb_gobject_buffer_get_type ())
 
-/**
- * hb_gobject_face_get_type:
- *
- * Since: 0.9.2
- **/
 HB_EXTERN GType
 hb_gobject_face_get_type (void);
 #define HB_GOBJECT_TYPE_FACE (hb_gobject_face_get_type ())
 
-/**
- * hb_gobject_font_get_type:
- *
- * Since: 0.9.2
- **/
 HB_EXTERN GType
 hb_gobject_font_get_type (void);
 #define HB_GOBJECT_TYPE_FONT (hb_gobject_font_get_type ())
 
-/**
- * hb_gobject_font_funcs_get_type:
- *
- * Since: 0.9.2
- **/
 HB_EXTERN GType
 hb_gobject_font_funcs_get_type (void);
 #define HB_GOBJECT_TYPE_FONT_FUNCS (hb_gobject_font_funcs_get_type ())
@@ -97,11 +72,6 @@
 hb_gobject_shape_plan_get_type (void);
 #define HB_GOBJECT_TYPE_SHAPE_PLAN (hb_gobject_shape_plan_get_type ())
 
-/**
- * hb_gobject_unicode_funcs_get_type:
- *
- * Since: 0.9.2
- **/
 HB_EXTERN GType
 hb_gobject_unicode_funcs_get_type (void);
 #define HB_GOBJECT_TYPE_UNICODE_FUNCS (hb_gobject_unicode_funcs_get_type ())

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-graphite2.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-graphite2.cc	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-graphite2.cc	2021-04-17 22:31:16 UTC (rev 58898)
@@ -195,7 +195,12 @@
 #ifndef HB_DISABLE_DEPRECATED
 /**
  * hb_graphite2_font_get_gr_font:
+ * @font: An #hb_font_t
  *
+ * Always returns %NULL. Use hb_graphite2_face_get_gr_face() instead.
+ *
+ * Return value: (nullable): Graphite2 font associated with @font.
+ *
  * Since: 0.9.10
  * Deprecated: 1.4.2
  */
@@ -284,7 +289,7 @@
     return true;
   }
 
-  buffer->ensure (glyph_count);
+  (void) buffer->ensure (glyph_count);
   scratch = buffer->get_scratch_buffer (&scratch_size);
   while ((DIV_CEIL (sizeof (hb_graphite2_cluster_t) * buffer->len, sizeof (*scratch)) +
 	  DIV_CEIL (sizeof (hb_codepoint_t) * glyph_count, sizeof (*scratch))) > scratch_size)

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-iter.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-iter.hh	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-iter.hh	2021-04-17 22:31:16 UTC (rev 58898)
@@ -922,7 +922,7 @@
 template <typename C, typename V,
 	  hb_requires (hb_is_iterable (C))>
 inline void
-hb_fill (C& c, const V &v)
+hb_fill (C&& c, const V &v)
 {
   for (auto i = hb_iter (c); i; i++)
     *i = v;

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-machinery.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-machinery.hh	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-machinery.hh	2021-04-17 22:31:16 UTC (rev 58898)
@@ -80,6 +80,11 @@
  * Size checking
  */
 
+/* Size signifying variable-sized array */
+#ifndef HB_VAR_ARRAY
+#define HB_VAR_ARRAY 1
+#endif
+
 /* Check _assertion in a method environment */
 #define _DEFINE_INSTANCE_ASSERTION1(_line, _assertion) \
   void _instance_assertion_on_line_##_line () const \

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-map.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-map.cc	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-map.cc	2021-04-17 22:31:16 UTC (rev 58898)
@@ -117,7 +117,7 @@
  * @map: A map
  * @key: The user-data key to set
  * @data: A pointer to the user data to set
- * @destroy: (optional): A callback to call when @data is not needed anymore
+ * @destroy: (nullable): A callback to call when @data is not needed anymore
  * @replace: Whether to replace an existing data with the same key
  *
  * Attaches a user-data key/data pair to the specified map.
@@ -162,7 +162,7 @@
  *
  * Tests whether memory allocation for a set was successful.
  *
- * Return value: %true if allocation succeeded, false otherwise
+ * Return value: %true if allocation succeeded, %false otherwise
  *
  * Since: 1.7.7
  **/
@@ -230,7 +230,7 @@
  *
  * Tests whether @key is an element of @map.
  *
- * Return value: %true if @key is found in @map, false otherwise
+ * Return value: %true if @key is found in @map, %false otherwise
  *
  * Since: 1.7.7
  **/
@@ -253,6 +253,9 @@
 void
 hb_map_clear (hb_map_t *map)
 {
+  if (unlikely (hb_object_is_immutable (map)))
+    return;
+
   return map->clear ();
 }
 

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-map.h
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-map.h	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-map.h	2021-04-17 22:31:16 UTC (rev 58898)
@@ -24,7 +24,7 @@
  * Google Author(s): Behdad Esfahbod
  */
 
-#ifndef HB_H_IN
+#if !defined(HB_H_IN) && !defined(HB_NO_SINGLE_HEADER_ERROR)
 #error "Include <hb.h> instead."
 #endif
 
@@ -36,7 +36,11 @@
 HB_BEGIN_DECLS
 
 
-/*
+/**
+ * HB_MAP_VALUE_INVALID:
+ *
+ * Unset #hb_map_t value.
+ *
  * Since: 1.7.7
  */
 #define HB_MAP_VALUE_INVALID ((hb_codepoint_t) -1)

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-map.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-map.hh	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-map.hh	2021-04-17 22:31:16 UTC (rev 58898)
@@ -97,8 +97,6 @@
 
   void reset ()
   {
-    if (unlikely (hb_object_is_immutable (this)))
-      return;
     successful = true;
     clear ();
   }
@@ -171,8 +169,6 @@
 
   void clear ()
   {
-    if (unlikely (hb_object_is_immutable (this)))
-      return;
     if (items)
       for (auto &_ : hb_iter (items, mask + 1))
 	_.clear ();
@@ -181,6 +177,7 @@
   }
 
   bool is_empty () const { return population == 0; }
+  explicit operator bool () const { return !is_empty (); }
 
   unsigned int get_population () const { return population; }
 

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-meta.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-meta.hh	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-meta.hh	2021-04-17 22:31:16 UTC (rev 58898)
@@ -49,6 +49,10 @@
 using hb_true_type = hb_bool_constant<true>;
 using hb_false_type = hb_bool_constant<false>;
 
+/* Static-assert as expression. */
+template <bool cond> struct static_assert_expr;
+template <> struct static_assert_expr<true> : hb_false_type {};
+#define static_assert_expr(C) static_assert_expr<C>::value
 
 /* Basic type SFINAE. */
 
@@ -220,6 +224,8 @@
 };
 
 
+/* Type traits */
+
 template <typename T>
 using hb_is_integral = hb_bool_constant<
   hb_is_same (hb_decay<T>, char) ||
@@ -292,7 +298,16 @@
 #define hb_int_max(T) hb_int_max<T>::value
 
 
+/* Class traits. */
 
+#define HB_DELETE_COPY_ASSIGN(TypeName) \
+  TypeName(const TypeName&) = delete; \
+  void operator=(const TypeName&) = delete
+#define HB_DELETE_CREATE_COPY_ASSIGN(TypeName) \
+  TypeName() = delete; \
+  TypeName(const TypeName&) = delete; \
+  void operator=(const TypeName&) = delete
+
 template <typename T, typename>
 struct _hb_is_destructible : hb_false_type {};
 template <typename T>

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-mutex.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-mutex.hh	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-mutex.hh	2021-04-17 22:31:16 UTC (rev 58898)
@@ -73,24 +73,6 @@
 #define hb_mutex_impl_finish(M)	DeleteCriticalSection (M)
 
 
-#elif !defined(HB_NO_MT) && defined(HAVE_INTEL_ATOMIC_PRIMITIVES)
-
-#if defined(HAVE_SCHED_H) && defined(HAVE_SCHED_YIELD)
-# include <sched.h>
-# define HB_SCHED_YIELD() sched_yield ()
-#else
-# define HB_SCHED_YIELD() HB_STMT_START {} HB_STMT_END
-#endif
-
-/* This actually is not a totally awful implementation. */
-typedef volatile int hb_mutex_impl_t;
-#define HB_MUTEX_IMPL_INIT	0
-#define hb_mutex_impl_init(M)	*(M) = 0
-#define hb_mutex_impl_lock(M)	HB_STMT_START { while (__sync_lock_test_and_set((M), 1)) HB_SCHED_YIELD (); } HB_STMT_END
-#define hb_mutex_impl_unlock(M)	__sync_lock_release (M)
-#define hb_mutex_impl_finish(M)	HB_STMT_START {} HB_STMT_END
-
-
 #elif defined(HB_NO_MT)
 
 typedef int hb_mutex_impl_t;

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-object.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-object.hh	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-object.hh	2021-04-17 22:31:16 UTC (rev 58898)
@@ -140,9 +140,7 @@
  * Reference-count.
  */
 
-#define HB_REFERENCE_COUNT_INERT_VALUE 0
-#define HB_REFERENCE_COUNT_POISON_VALUE -0x0000DEAD
-#define HB_REFERENCE_COUNT_INIT {HB_ATOMIC_INT_INIT (HB_REFERENCE_COUNT_INERT_VALUE)}
+#define HB_REFERENCE_COUNT_INIT {0}
 
 struct hb_reference_count_t
 {
@@ -152,9 +150,9 @@
   int get_relaxed () const { return ref_count.get_relaxed (); }
   int inc () const { return ref_count.inc (); }
   int dec () const { return ref_count.dec (); }
-  void fini () { ref_count.set_relaxed (HB_REFERENCE_COUNT_POISON_VALUE); }
+  void fini () { ref_count.set_relaxed (-0x0000DEAD); }
 
-  bool is_inert () const { return ref_count.get_relaxed () == HB_REFERENCE_COUNT_INERT_VALUE; }
+  bool is_inert () const { return !ref_count.get_relaxed (); }
   bool is_valid () const { return ref_count.get_relaxed () > 0; }
 };
 
@@ -197,15 +195,10 @@
 struct hb_object_header_t
 {
   hb_reference_count_t ref_count;
-  mutable hb_atomic_int_t writable;
+  mutable hb_atomic_int_t writable = 0;
   hb_atomic_ptr_t<hb_user_data_array_t> user_data;
 };
-#define HB_OBJECT_HEADER_STATIC \
-	{ \
-	  HB_REFERENCE_COUNT_INIT, \
-	  HB_ATOMIC_INT_INIT (false), \
-	  HB_ATOMIC_PTR_INIT (nullptr) \
-	}
+#define HB_OBJECT_HEADER_STATIC {}
 
 
 /*

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-open-file.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-open-file.hh	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-open-file.hh	2021-04-17 22:31:16 UTC (rev 58898)
@@ -48,7 +48,7 @@
  */
 
 struct OpenTypeFontFile;
-struct OffsetTable;
+struct OpenTypeOffsetTable;
 struct TTCHeader;
 
 
@@ -78,7 +78,7 @@
   DEFINE_SIZE_STATIC (16);
 } OpenTypeTable;
 
-typedef struct OffsetTable
+typedef struct OpenTypeOffsetTable
 {
   friend struct OpenTypeFontFile;
 
@@ -218,7 +218,7 @@
   Tag		ttcTag;		/* TrueType Collection ID string: 'ttcf' */
   FixedVersion<>version;	/* Version of the TTC Header (1.0),
 				 * 0x00010000u */
-  LArrayOf<LOffsetTo<OffsetTable>>
+  LArrayOf<LOffsetTo<OpenTypeOffsetTable>>
 		table;		/* Array of offsets to the OffsetTable for each font
 				 * from the beginning of the file */
   public:

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-open-type.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-open-type.hh	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-open-type.hh	2021-04-17 22:31:16 UTC (rev 58898)
@@ -53,14 +53,19 @@
  */
 
 /* Integer types in big-endian order and no alignment requirement */
-template <typename Type, unsigned int Size>
+template <typename Type,
+	  unsigned int Size = sizeof (Type)>
 struct IntType
 {
   typedef Type type;
-  typedef hb_conditional<hb_is_signed (Type), signed, unsigned> wide_type;
 
-  IntType& operator = (wide_type i) { v = i; return *this; }
-  operator wide_type () const { return v; }
+  IntType () = default;
+  explicit constexpr IntType (Type V) : v {V} {}
+  IntType& operator = (Type i) { v = i; return *this; }
+  /* For reason we define cast out operator for signed/unsigned, instead of Type, see:
+   * https://github.com/harfbuzz/harfbuzz/pull/2875/commits/09836013995cab2b9f07577a179ad7b024130467 */
+  operator hb_conditional<hb_is_signed (Type), signed, unsigned> () const { return v; }
+
   bool operator == (const IntType &o) const { return (Type) v == (Type) o.v; }
   bool operator != (const IntType &o) const { return !(*this == o); }
 
@@ -80,15 +85,22 @@
 
     return pb->cmp (*pa);
   }
-  template <typename Type2>
+  template <typename Type2,
+	    hb_enable_if (hb_is_integral (Type2) &&
+			  sizeof (Type2) < sizeof (int) &&
+			  sizeof (Type) < sizeof (int))>
   int cmp (Type2 a) const
   {
     Type b = v;
-    if (sizeof (Type) < sizeof (int) && sizeof (Type2) < sizeof (int))
-      return (int) a - (int) b;
-    else
-      return a < b ? -1 : a == b ? 0 : +1;
+    return (int) a - (int) b;
   }
+  template <typename Type2,
+	    hb_enable_if (hb_is_convertible (Type2, Type))>
+  int cmp (Type2 a) const
+  {
+    Type b = v;
+    return a < b ? -1 : a == b ? 0 : +1;
+  }
   bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
@@ -100,12 +112,12 @@
   DEFINE_SIZE_STATIC (Size);
 };
 
-typedef IntType<uint8_t,  1> HBUINT8;	/* 8-bit unsigned integer. */
-typedef IntType<int8_t,   1> HBINT8;	/* 8-bit signed integer. */
-typedef IntType<uint16_t, 2> HBUINT16;	/* 16-bit unsigned integer. */
-typedef IntType<int16_t,  2> HBINT16;	/* 16-bit signed integer. */
-typedef IntType<uint32_t, 4> HBUINT32;	/* 32-bit unsigned integer. */
-typedef IntType<int32_t,  4> HBINT32;	/* 32-bit signed integer. */
+typedef IntType<uint8_t>  HBUINT8;	/* 8-bit unsigned integer. */
+typedef IntType<int8_t>   HBINT8;	/* 8-bit signed integer. */
+typedef IntType<uint16_t> HBUINT16;	/* 16-bit unsigned integer. */
+typedef IntType<int16_t>  HBINT16;	/* 16-bit signed integer. */
+typedef IntType<uint32_t> HBUINT32;	/* 32-bit unsigned integer. */
+typedef IntType<int32_t>  HBINT32;	/* 32-bit signed integer. */
 /* Note: we cannot defined a signed HBINT24 because there's no corresponding C type.
  * Works for unsigned, but not signed, since we rely on compiler for sign-extension. */
 typedef IntType<uint32_t, 3> HBUINT24;	/* 24-bit unsigned integer. */
@@ -163,8 +175,8 @@
 {
   Tag& operator = (hb_tag_t i) { HBUINT32::operator= (i); return *this; }
   /* What the char* converters return is NOT nul-terminated.  Print using "%.4s" */
-  operator const char* () const { return reinterpret_cast<const char *> (&this->v); }
-  operator char* ()             { return reinterpret_cast<char *> (&this->v); }
+  operator const char* () const { return reinterpret_cast<const char *> (this); }
+  operator char* ()             { return reinterpret_cast<char *> (this); }
   public:
   DEFINE_SIZE_STATIC (4);
 };

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-cff-common.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-cff-common.hh	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-cff-common.hh	2021-04-17 22:31:16 UTC (rev 58898)
@@ -183,7 +183,7 @@
     else
     {
       serialize_header(c, + it | hb_map ([] (const byte_str_t &_) { return _.length; }));
-      for (const byte_str_t &_ : +it)
+      for (const auto &_ : +it)
 	_.copy (c);
     }
     return_trace (true);

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-cff1-table.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-cff1-table.cc	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-cff1-table.cc	2021-04-17 22:31:16 UTC (rev 58898)
@@ -426,7 +426,7 @@
   else
   {
     extents->x_bearing = font->em_scalef_x (bounds.min.x.to_real ());
-    extents->width = font->em_scalef_x (bounds.max.x.to_real () - bounds.min.x.to_real ());
+    extents->width = font->em_scalef_x (bounds.max.x.to_real ()) - extents->x_bearing;
   }
   if (bounds.min.y >= bounds.max.y)
   {
@@ -436,7 +436,7 @@
   else
   {
     extents->y_bearing = font->em_scalef_y (bounds.max.y.to_real ());
-    extents->height = font->em_scalef_y (bounds.min.y.to_real () - bounds.max.y.to_real ());
+    extents->height = font->em_scalef_y (bounds.min.y.to_real ()) - extents->y_bearing;
   }
 
   return true;

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-cff2-table.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-cff2-table.cc	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-cff2-table.cc	2021-04-17 22:31:16 UTC (rev 58898)
@@ -127,7 +127,7 @@
   else
   {
     extents->x_bearing = font->em_scalef_x (param.min_x.to_real ());
-    extents->width = font->em_scalef_x (param.max_x.to_real () - param.min_x.to_real ());
+    extents->width = font->em_scalef_x (param.max_x.to_real ()) - extents->x_bearing;
   }
   if (param.min_y >= param.max_y)
   {
@@ -137,7 +137,7 @@
   else
   {
     extents->y_bearing = font->em_scalef_y (param.max_y.to_real ());
-    extents->height = font->em_scalef_y (param.min_y.to_real () - param.max_y.to_real ());
+    extents->height = font->em_scalef_y (param.min_y.to_real ()) - extents->y_bearing;
   }
 
   return true;

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-cmap-table.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-cmap-table.hh	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-cmap-table.hh	2021-04-17 22:31:16 UTC (rev 58898)
@@ -95,7 +95,7 @@
     HBUINT16 *endCode = c->start_embed<HBUINT16> ();
     hb_codepoint_t prev_endcp = 0xFFFF;
 
-    for (const hb_item_type<Iterator> _ : +it)
+    for (const auto& _ : +it)
     {
       if (prev_endcp != 0xFFFF && prev_endcp + 1u != _.first)
       {
@@ -131,7 +131,7 @@
     HBUINT16 *startCode = c->start_embed<HBUINT16> ();
     hb_codepoint_t prev_cp = 0xFFFF;
 
-    for (const hb_item_type<Iterator> _ : +it)
+    for (const auto& _ : +it)
     {
       if (prev_cp == 0xFFFF || prev_cp + 1u != _.first)
       {
@@ -170,7 +170,7 @@
     if ((char *)idDelta - (char *)startCode != (int) segcount * (int) HBINT16::static_size)
       return nullptr;
 
-    for (const hb_item_type<Iterator> _ : +it)
+    for (const auto& _ : +it)
     {
       if (_.first == startCode[i])
       {
@@ -696,7 +696,7 @@
     hb_codepoint_t startCharCode = 0xFFFF, endCharCode = 0xFFFF;
     hb_codepoint_t glyphID = 0;
 
-    for (const hb_item_type<Iterator> _ : +it)
+    for (const auto& _ : +it)
     {
       if (startCharCode == 0xFFFF)
       {

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-color-cbdt-table.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-color-cbdt-table.hh	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-color-cbdt-table.hh	2021-04-17 22:31:16 UTC (rev 58898)
@@ -455,8 +455,8 @@
     unsigned int old_cbdt_prime_length = bitmap_size_context->cbdt_prime->length;
 
     // Set to invalid state to indicate filling glyphs is not yet started.
-    if (unlikely (!records->resize (records->length + 1)))
-      return_trace (c->serializer->check_success (false));
+    if (unlikely (!c->serializer->check_success (records->resize (records->length + 1))))
+      return_trace (false);
 
     (*records)[records->length - 1].firstGlyphIndex = 1;
     (*records)[records->length - 1].lastGlyphIndex = 0;
@@ -567,8 +567,8 @@
 
     hb_vector_t<hb_pair_t<hb_codepoint_t, const IndexSubtableRecord*>> lookup;
     build_lookup (c, bitmap_size_context, &lookup);
-    if (unlikely (lookup.in_error ()))
-      return c->serializer->check_success (false);
+    if (unlikely (!c->serializer->propagate_error (lookup)))
+      return false;
 
     bitmap_size_context->size = 0;
     bitmap_size_context->num_tables = 0;

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-color-colr-table.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-color-colr-table.hh	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-color-colr-table.hh	2021-04-17 22:31:16 UTC (rev 58898)
@@ -214,7 +214,7 @@
 				if (unlikely (!old_record))
 				  return hb_pair_t<bool, BaseGlyphRecord> (false, Null (BaseGlyphRecord));
 
-				BaseGlyphRecord new_record;
+				BaseGlyphRecord new_record = {};
 				new_record.glyphId = new_gid;
 				new_record.numLayers = old_record->numLayers;
 				return hb_pair_t<bool, BaseGlyphRecord> (true, new_record);

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-color.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-color.cc	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-color.cc	2021-04-17 22:31:16 UTC (rev 58898)
@@ -37,10 +37,7 @@
 #include "hb-ot-color-sbix-table.hh"
 #include "hb-ot-color-svg-table.hh"
 
-#include <stdlib.h>
-#include <string.h>
 
-
 /**
  * SECTION:hb-ot-color
  * @title: hb-ot-color
@@ -64,7 +61,7 @@
  *
  * Tests whether a face includes a `CPAL` color-palette table.
  *
- * Return value: true if data found, false otherwise
+ * Return value: %true if data found, %false otherwise
  *
  * Since: 2.1.0
  */
@@ -195,7 +192,7 @@
  *
  * Tests whether a face includes any `COLR` color layers.
  *
- * Return value: true if data found, false otherwise
+ * Return value: %true if data found, %false otherwise
  *
  * Since: 2.1.0
  */
@@ -242,7 +239,7 @@
  *
  * Tests whether a face includes any `SVG` glyph images.
  *
- * Return value: true if data found, false otherwise.
+ * Return value: %true if data found, %false otherwise.
  *
  * Since: 2.1.0
  */
@@ -280,7 +277,7 @@
  *
  * Tests whether a face has PNG glyph images (either in `CBDT` or `sbix` tables).
  *
- * Return value: true if data found, false otherwise
+ * Return value: %true if data found, %false otherwise
  *
  * Since: 2.1.0
  */

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-color.h
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-color.h	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-color.h	2021-04-17 22:31:16 UTC (rev 58898)
@@ -26,7 +26,7 @@
  * Google Author(s): Sascha Brawer, Behdad Esfahbod
  */
 
-#ifndef HB_OT_H_IN
+#if !defined(HB_OT_H_IN) && !defined(HB_NO_SINGLE_HEADER_ERROR)
 #error "Include <hb-ot.h> instead."
 #endif
 
@@ -66,6 +66,8 @@
  * @HB_OT_COLOR_PALETTE_FLAG_USABLE_WITH_DARK_BACKGROUND: Flag indicating that the color
  *   palette is appropriate to use when displaying the font on a dark background such as black.
  *
+ * Flags that describe the properties of color palette.
+ *
  * Since: 2.1.0
  */
 typedef enum { /*< flags >*/
@@ -95,6 +97,8 @@
 
 /**
  * hb_ot_color_layer_t:
+ * @glyph: the glyph ID of the layer
+ * @color_index: the palette color index of the layer
  *
  * Pairs of glyph and color index.
  *

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-deprecated.h
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-deprecated.h	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-deprecated.h	2021-04-17 22:31:16 UTC (rev 58898)
@@ -24,7 +24,7 @@
  * Google Author(s): Behdad Esfahbod
  */
 
-#ifndef HB_OT_H_IN
+#if !defined(HB_OT_H_IN) && !defined(HB_NO_SINGLE_HEADER_ERROR)
 #error "Include <hb-ot.h> instead."
 #endif
 
@@ -41,6 +41,13 @@
 
 
 /* https://github.com/harfbuzz/harfbuzz/issues/1734 */
+/**
+ * HB_MATH_GLYPH_PART_FLAG_EXTENDER:
+ *
+ * Use #HB_OT_MATH_GLYPH_PART_FLAG_EXTENDER instead.
+ *
+ * Deprecated: 2.5.1
+ */
 #define HB_MATH_GLYPH_PART_FLAG_EXTENDER HB_OT_MATH_GLYPH_PART_FLAG_EXTENDER
 
 
@@ -71,6 +78,8 @@
 /**
  * HB_OT_VAR_NO_AXIS_INDEX:
  *
+ * Do not use.
+ *
  * Since: 1.4.2
  * Deprecated: 2.2.0
  */
@@ -78,7 +87,14 @@
 
 /**
  * hb_ot_var_axis_t:
+ * @tag: axis tag
+ * @name_id: axis name identifier
+ * @min_value: minimum value of the axis
+ * @default_value: default value of the axis
+ * @max_value: maximum value of the axis
  *
+ * Use #hb_ot_var_axis_info_t instead.
+ *
  * Since: 1.4.2
  * Deprecated: 2.2.0
  */

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-font.h
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-font.h	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-font.h	2021-04-17 22:31:16 UTC (rev 58898)
@@ -24,7 +24,7 @@
  * Google Author(s): Behdad Esfahbod, Roozbeh Pournader
  */
 
-#ifndef HB_OT_H_IN
+#if !defined(HB_OT_H_IN) && !defined(HB_NO_SINGLE_HEADER_ERROR)
 #error "Include <hb-ot.h> instead."
 #endif
 

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-glyf-table.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-glyf-table.hh	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-glyf-table.hh	2021-04-17 22:31:16 UTC (rev 58898)
@@ -186,7 +186,7 @@
     | hb_map (&SubsetGlyph::padded_size)
     ;
 
-    if (c->serializer->in_error ()) return_trace (false);
+    if (unlikely (c->serializer->in_error ())) return_trace (false);
     return_trace (c->serializer->check_success (_add_loca_and_head (c->plan,
 								    padded_offsets)));
   }
@@ -944,9 +944,9 @@
 	    return;
 	  }
 	  extents->x_bearing = font->em_scalef_x (min_x);
-	  extents->width = font->em_scalef_x (max_x - min_x);
+	  extents->width = font->em_scalef_x (max_x) - extents->x_bearing;
 	  extents->y_bearing = font->em_scalef_y (max_y);
-	  extents->height = font->em_scalef_y (min_y - max_y);
+	  extents->height = font->em_scalef_y (min_y) - extents->y_bearing;
 	}
 
 	protected:

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-head-table.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-head-table.hh	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-head-table.hh	2021-04-17 22:31:16 UTC (rev 58898)
@@ -43,7 +43,7 @@
 
 struct head
 {
-  friend struct OffsetTable;
+  friend struct OpenTypeOffsetTable;
 
   static constexpr hb_tag_t tableTag = HB_OT_TAG_head;
 

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-common.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-common.hh	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-common.hh	2021-04-17 22:31:16 UTC (rev 58898)
@@ -1128,7 +1128,7 @@
     out->lookupType = lookupType;
     out->lookupFlag = lookupFlag;
 
-    const hb_set_t *glyphset = c->plan->glyphset ();
+    const hb_set_t *glyphset = c->plan->glyphset_gsub ();
     unsigned int lookup_type = get_type ();
     + hb_iter (get_subtables <TSubTable> ())
     | hb_filter ([this, glyphset, lookup_type] (const OffsetTo<TSubTable> &_) { return (this+_).intersects (glyphset, lookup_type); })
@@ -1251,8 +1251,9 @@
   {
     /* TODO Speed up, using hb_set_next() and bsearch()? */
     unsigned int count = glyphArray.len;
+    const HBGlyphID *arr = glyphArray.arrayZ;
     for (unsigned int i = 0; i < count; i++)
-      if (glyphs->has (glyphArray[i]))
+      if (glyphs->has (arr[i]))
 	return true;
     return false;
   }
@@ -1356,18 +1357,21 @@
   bool intersects (const hb_set_t *glyphs) const
   {
     /* TODO Speed up, using hb_set_next() and bsearch()? */
-    unsigned int count = rangeRecord.len;
-    for (unsigned int i = 0; i < count; i++)
-      if (rangeRecord[i].intersects (glyphs))
+    /* TODO(iter) Rewrite as dagger. */
+    unsigned count = rangeRecord.len;
+    const RangeRecord *arr = rangeRecord.arrayZ;
+    for (unsigned i = 0; i < count; i++)
+      if (arr[i].intersects (glyphs))
 	return true;
     return false;
   }
   bool intersects_coverage (const hb_set_t *glyphs, unsigned int index) const
   {
-    unsigned int i;
-    unsigned int count = rangeRecord.len;
-    for (i = 0; i < count; i++) {
-      const RangeRecord &range = rangeRecord[i];
+    /* TODO(iter) Rewrite as dagger. */
+    unsigned count = rangeRecord.len;
+    const RangeRecord *arr = rangeRecord.arrayZ;
+    for (unsigned i = 0; i < count; i++) {
+      const RangeRecord &range = arr[i];
       if (range.value <= index &&
 	  index < (unsigned int) range.value + (range.last - range.first) &&
 	  range.intersects (glyphs))
@@ -1502,7 +1506,7 @@
   bool subset (hb_subset_context_t *c) const
   {
     TRACE_SUBSET (this);
-    const hb_set_t &glyphset = *c->plan->glyphset ();
+    const hb_set_t &glyphset = *c->plan->glyphset_gsub ();
     const hb_map_t &glyph_map = *c->plan->glyph_map;
 
     auto it =
@@ -1729,7 +1733,7 @@
 	       hb_map_t *klass_map = nullptr /*OUT*/) const
   {
     TRACE_SUBSET (this);
-    const hb_set_t &glyphset = *c->plan->_glyphset_gsub;
+    const hb_set_t &glyphset = *c->plan->glyphset_gsub ();
     const hb_map_t &glyph_map = *c->plan->glyph_map;
 
     hb_sorted_vector_t<HBGlyphID> glyphs;
@@ -1784,7 +1788,7 @@
   }
 
   template <typename set_t>
-  bool collect_class (set_t *glyphs, unsigned int klass) const
+  bool collect_class (set_t *glyphs, unsigned klass) const
   {
     unsigned int count = classValue.len;
     for (unsigned int i = 0; i < count; i++)
@@ -1802,7 +1806,7 @@
       if (classValue[iter - start]) return true;
     return false;
   }
-  bool intersects_class (const hb_set_t *glyphs, unsigned int klass) const
+  bool intersects_class (const hb_set_t *glyphs, uint16_t klass) const
   {
     unsigned int count = classValue.len;
     if (klass == 0)
@@ -1815,8 +1819,12 @@
       if (hb_set_next (glyphs, &g)) return true;
       /* Fall through. */
     }
+    /* TODO Speed up, using set overlap first? */
+    /* TODO(iter) Rewrite as dagger. */
+    HBUINT16 k {klass};
+    const HBUINT16 *arr = classValue.arrayZ;
     for (unsigned int i = 0; i < count; i++)
-      if (classValue[i] == klass && glyphs->has (startGlyph + i))
+      if (arr[i] == k && glyphs->has (startGlyph + i))
 	return true;
     return false;
   }
@@ -1898,7 +1906,7 @@
 	       hb_map_t *klass_map = nullptr /*OUT*/) const
   {
     TRACE_SUBSET (this);
-    const hb_set_t &glyphset = *c->plan->_glyphset_gsub;
+    const hb_set_t &glyphset = *c->plan->glyphset_gsub ();
     const hb_map_t &glyph_map = *c->plan->glyph_map;
 
     hb_sorted_vector_t<HBGlyphID> glyphs;
@@ -1961,11 +1969,14 @@
     /* TODO Speed up, using hb_set_next() and bsearch()? */
     unsigned int count = rangeRecord.len;
     for (unsigned int i = 0; i < count; i++)
-      if (rangeRecord[i].intersects (glyphs))
+    {
+      const auto& range = rangeRecord[i];
+      if (range.intersects (glyphs) && range.value)
 	return true;
+    }
     return false;
   }
-  bool intersects_class (const hb_set_t *glyphs, unsigned int klass) const
+  bool intersects_class (const hb_set_t *glyphs, uint16_t klass) const
   {
     unsigned int count = rangeRecord.len;
     if (klass == 0)
@@ -1984,8 +1995,12 @@
 	return true;
       /* Fall through. */
     }
+    /* TODO Speed up, using set overlap first? */
+    /* TODO(iter) Rewrite as dagger. */
+    HBUINT16 k {klass};
+    const RangeRecord *arr = rangeRecord.arrayZ;
     for (unsigned int i = 0; i < count; i++)
-      if (rangeRecord[i].value == klass && rangeRecord[i].intersects (glyphs))
+      if (arr[i].value == k && arr[i].intersects (glyphs))
 	return true;
     return false;
   }

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-gpos-table.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-gpos-table.hh	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-gpos-table.hh	2021-04-17 22:31:16 UTC (rev 58898)
@@ -566,6 +566,26 @@
     return_trace (true);
   }
 
+  bool subset (hb_subset_context_t *c,
+	       unsigned cols,
+	       const hb_map_t *klass_mapping) const
+  {
+    TRACE_SUBSET (this);
+    auto *out = c->serializer->start_embed (*this);
+
+    auto indexes =
+    + hb_range (rows * cols)
+    | hb_filter ([=] (unsigned index) { return klass_mapping->has (index % cols); })
+    ;
+
+    out->serialize (c->serializer,
+                    (unsigned) rows,
+                    this,
+                    c->plan->layout_variation_idx_map,
+                    indexes);
+    return_trace (true);
+  }
+
   bool sanitize (hb_sanitize_context_t *c, unsigned int cols) const
   {
     TRACE_SANITIZE (this);
@@ -755,7 +775,7 @@
   bool subset (hb_subset_context_t *c) const
   {
     TRACE_SUBSET (this);
-    const hb_set_t &glyphset = *c->plan->glyphset ();
+    const hb_set_t &glyphset = *c->plan->glyphset_gsub ();
     const hb_map_t &glyph_map = *c->plan->glyph_map;
 
     auto it =
@@ -870,7 +890,7 @@
   bool subset (hb_subset_context_t *c) const
   {
     TRACE_SUBSET (this);
-    const hb_set_t &glyphset = *c->plan->glyphset ();
+    const hb_set_t &glyphset = *c->plan->glyphset_gsub ();
     const hb_map_t &glyph_map = *c->plan->glyph_map;
 
     unsigned sub_length = valueFormat.get_len ();
@@ -1129,7 +1149,7 @@
     if (unlikely (!c->serializer->extend_min (out))) return_trace (false);
     out->len = 0;
 
-    const hb_set_t &glyphset = *c->plan->glyphset ();
+    const hb_set_t &glyphset = *c->plan->glyphset_gsub ();
     const hb_map_t &glyph_map = *c->plan->glyph_map;
 
     unsigned len1 = valueFormats[0].get_len ();
@@ -1250,7 +1270,7 @@
   {
     TRACE_SUBSET (this);
 
-    const hb_set_t &glyphset = *c->plan->glyphset ();
+    const hb_set_t &glyphset = *c->plan->glyphset_gsub ();
     const hb_map_t &glyph_map = *c->plan->glyph_map;
 
     auto *out = c->serializer->start_embed (*this);
@@ -1441,7 +1461,7 @@
 		})
     ;
 
-    const hb_set_t &glyphset = *c->plan->_glyphset_gsub;
+    const hb_set_t &glyphset = *c->plan->glyphset_gsub ();
     const hb_map_t &glyph_map = *c->plan->glyph_map;
 
     auto it =
@@ -1728,7 +1748,7 @@
   bool subset (hb_subset_context_t *c) const
   {
     TRACE_SUBSET (this);
-    const hb_set_t &glyphset = *c->plan->glyphset ();
+    const hb_set_t &glyphset = *c->plan->glyphset_gsub ();
     const hb_map_t &glyph_map = *c->plan->glyph_map;
 
     auto *out = c->serializer->start_embed (*this);
@@ -1904,7 +1924,7 @@
   bool subset (hb_subset_context_t *c) const
   {
     TRACE_SUBSET (this);
-    const hb_set_t &glyphset = *c->plan->glyphset ();
+    const hb_set_t &glyphset = *c->plan->glyphset_gsub ();
     const hb_map_t &glyph_map = *c->plan->glyph_map;
 
     auto *out = c->serializer->start_embed (*this);
@@ -2025,11 +2045,38 @@
 					 * mark-minor--
 					 * ordered by class--zero-based. */
 
-typedef OffsetListOf<LigatureAttach> LigatureArray;
-					/* Array of LigatureAttach
-					 * tables ordered by
-					 * LigatureCoverage Index */
+/* Array of LigatureAttach tables ordered by LigatureCoverage Index */
+struct LigatureArray : OffsetListOf<LigatureAttach>
+{
+  template <typename Iterator,
+	    hb_requires (hb_is_iterator (Iterator))>
+  bool subset (hb_subset_context_t *c,
+	       Iterator		    coverage,
+	       unsigned		    class_count,
+	       const hb_map_t	   *klass_mapping) const
+  {
+    TRACE_SUBSET (this);
+    const hb_set_t &glyphset = *c->plan->glyphset_gsub ();
 
+    auto *out = c->serializer->start_embed (this);
+    if (unlikely (!c->serializer->extend_min (out)))  return_trace (false);
+
+    for (const auto _ : + hb_zip (coverage, *this)
+		  | hb_filter (glyphset, hb_first))
+    {
+      auto *matrix = out->serialize_append (c->serializer);
+      if (unlikely (!matrix)) return_trace (false);
+
+      matrix->serialize_subset (c,
+				_.second,
+				this,
+				class_count,
+				klass_mapping);
+    }
+    return_trace (this->len);
+  }
+};
+
 struct MarkLigPosFormat1
 {
   bool intersects (const hb_set_t *glyphs) const
@@ -2130,8 +2177,56 @@
   bool subset (hb_subset_context_t *c) const
   {
     TRACE_SUBSET (this);
-    // TODO(subset)
-    return_trace (false);
+    const hb_set_t &glyphset = *c->plan->glyphset_gsub ();
+    const hb_map_t &glyph_map = *c->plan->glyph_map;
+
+    auto *out = c->serializer->start_embed (*this);
+    if (unlikely (!c->serializer->extend_min (out))) return_trace (false);
+    out->format = format;
+
+    hb_map_t klass_mapping;
+    Markclass_closure_and_remap_indexes (this+markCoverage, this+markArray, glyphset, &klass_mapping);
+
+    if (!klass_mapping.get_population ()) return_trace (false);
+    out->classCount = klass_mapping.get_population ();
+
+    auto mark_iter =
+    + hb_zip (this+markCoverage, this+markArray)
+    | hb_filter (glyphset, hb_first)
+    ;
+
+    auto new_mark_coverage =
+    + mark_iter
+    | hb_map_retains_sorting (hb_first)
+    | hb_map_retains_sorting (glyph_map)
+    ;
+
+    if (!out->markCoverage.serialize (c->serializer, out)
+			  .serialize (c->serializer, new_mark_coverage))
+      return_trace (false);
+
+    out->markArray.serialize (c->serializer, out)
+		  .serialize (c->serializer,
+                              &klass_mapping,
+                              c->plan->layout_variation_idx_map,
+                              &(this+markArray),
+                              + mark_iter
+                              | hb_map (hb_second));
+
+    auto new_ligature_coverage =
+    + hb_iter (this + ligatureCoverage)
+    | hb_filter (glyphset)
+    | hb_map_retains_sorting (glyph_map)
+    ;
+
+    if (!out->ligatureCoverage.serialize (c->serializer, out)
+			      .serialize (c->serializer, new_ligature_coverage))
+      return_trace (false);
+
+    out->ligatureArray.serialize_subset (c, ligatureArray, this,
+                                         hb_iter (this+ligatureCoverage), classCount, &klass_mapping);
+
+    return_trace (true);
   }
 
   bool sanitize (hb_sanitize_context_t *c) const
@@ -2164,6 +2259,7 @@
   DEFINE_SIZE_STATIC (12);
 };
 
+
 struct MarkLigPos
 {
   template <typename context_t, typename ...Ts>
@@ -2288,7 +2384,7 @@
   bool subset (hb_subset_context_t *c) const
   {
     TRACE_SUBSET (this);
-    const hb_set_t &glyphset = *c->plan->glyphset ();
+    const hb_set_t &glyphset = *c->plan->glyphset_gsub ();
     const hb_map_t &glyph_map = *c->plan->glyph_map;
 
     auto *out = c->serializer->start_embed (*this);

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-gsub-table.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-gsub-table.hh	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-gsub-table.hh	2021-04-17 22:31:16 UTC (rev 58898)
@@ -356,7 +356,7 @@
   bool subset (hb_subset_context_t *c) const
   {
     TRACE_SUBSET (this);
-    const hb_set_t &glyphset = *c->plan->glyphset ();
+    const hb_set_t &glyphset = *c->plan->glyphset_gsub ();
     const hb_map_t &glyph_map = *c->plan->glyph_map;
 
     if (!intersects (&glyphset)) return_trace (false);
@@ -447,7 +447,7 @@
   bool subset (hb_subset_context_t *c) const
   {
     TRACE_SUBSET (this);
-    const hb_set_t &glyphset = *c->plan->glyphset ();
+    const hb_set_t &glyphset = *c->plan->glyphset_gsub ();
     const hb_map_t &glyph_map = *c->plan->glyph_map;
 
     auto *out = c->serializer->start_embed (*this);
@@ -582,7 +582,7 @@
   bool subset (hb_subset_context_t *c) const
   {
     TRACE_SUBSET (this);
-    const hb_set_t &glyphset = *c->plan->glyphset ();
+    const hb_set_t &glyphset = *c->plan->glyphset_gsub ();
     const hb_map_t &glyph_map = *c->plan->glyph_map;
 
     auto it =
@@ -682,7 +682,7 @@
   bool subset (hb_subset_context_t *c) const
   {
     TRACE_SUBSET (this);
-    const hb_set_t &glyphset = *c->plan->glyphset ();
+    const hb_set_t &glyphset = *c->plan->glyphset_gsub ();
     const hb_map_t &glyph_map = *c->plan->glyph_map;
 
     auto *out = c->serializer->start_embed (*this);
@@ -840,7 +840,7 @@
   bool subset (hb_subset_context_t *c) const
   {
     TRACE_SUBSET (this);
-    const hb_set_t &glyphset = *c->plan->glyphset ();
+    const hb_set_t &glyphset = *c->plan->glyphset_gsub ();
     const hb_map_t &glyph_map = *c->plan->glyph_map;
 
     if (!intersects (&glyphset) || !glyphset.has (ligGlyph)) return_trace (false);
@@ -1058,7 +1058,7 @@
   bool subset (hb_subset_context_t *c) const
   {
     TRACE_SUBSET (this);
-    const hb_set_t &glyphset = *c->plan->glyphset ();
+    const hb_set_t &glyphset = *c->plan->glyphset_gsub ();
     const hb_map_t &glyph_map = *c->plan->glyph_map;
 
     auto *out = c->serializer->start_embed (*this);

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-gsubgpos.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-gsubgpos.hh	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-gsubgpos.hh	2021-04-17 22:31:16 UTC (rev 58898)
@@ -89,7 +89,7 @@
 
   bool is_lookup_done (unsigned int lookup_index)
   {
-    if (done_lookups->in_error ())
+    if (unlikely (done_lookups->in_error ()))
       return true;
 
     /* Have we visited this lookup with the current set of glyphs? */
@@ -146,7 +146,6 @@
     if (is_lookup_visited (lookup_index))
       return;
 
-    set_lookup_visited (lookup_index);
     nesting_level_left--;
     recurse_func (this, lookup_index);
     nesting_level_left++;
@@ -163,10 +162,10 @@
 
   bool is_lookup_visited (unsigned lookup_index)
   {
-    if (lookup_count++ > HB_MAX_LOOKUP_INDICES)
+    if (unlikely (lookup_count++ > HB_MAX_LOOKUP_INDICES))
       return true;
 
-    if (visited_lookups->in_error ())
+    if (unlikely (visited_lookups->in_error ()))
       return true;
 
     return visited_lookups->has (lookup_index);
@@ -660,7 +659,7 @@
   void replace_glyph (hb_codepoint_t glyph_index) const
   {
     _set_glyph_props (glyph_index);
-    buffer->replace_glyph (glyph_index);
+    (void) buffer->replace_glyph (glyph_index);
   }
   void replace_glyph_inplace (hb_codepoint_t glyph_index) const
   {
@@ -671,13 +670,13 @@
 				    unsigned int class_guess) const
   {
     _set_glyph_props (glyph_index, class_guess, true);
-    buffer->replace_glyph (glyph_index);
+    (void) buffer->replace_glyph (glyph_index);
   }
   void output_glyph_for_component (hb_codepoint_t glyph_index,
 				   unsigned int class_guess) const
   {
     _set_glyph_props (glyph_index, class_guess, false, true);
-    buffer->output_glyph (glyph_index);
+    (void) buffer->output_glyph (glyph_index);
   }
 };
 
@@ -1044,7 +1043,7 @@
 				    hb_min (this_comp, last_num_components);
 	  _hb_glyph_info_set_lig_props_for_mark (&buffer->cur(), lig_id, new_lig_comp);
       }
-      buffer->next_glyph ();
+      (void) buffer->next_glyph ();
     }
 
     last_lig_id = _hb_glyph_info_get_lig_id (&buffer->cur());
@@ -1188,7 +1187,7 @@
 
     /* Don't recurse to ourself at same position.
      * Note that this test is too naive, it doesn't catch longer loops. */
-    if (idx == 0 && lookupRecord[i].lookupListIndex == c->lookup_index)
+    if (unlikely (idx == 0 && lookupRecord[i].lookupListIndex == c->lookup_index))
       continue;
 
     if (unlikely (!buffer->move_to (match_positions[idx])))
@@ -1226,7 +1225,8 @@
      *     mean that n match positions where removed, as there might
      *     have been marks and default-ignorables in the sequence.  We
      *     should instead drop match positions between current-position
-     *     and current-position + n instead.
+     *     and current-position + n instead. Though, am not sure which
+     *     one is better. Both cases have valid uses. Sigh.
      *
      * It should be possible to construct tests for both of these cases.
      */
@@ -1272,7 +1272,7 @@
       match_positions[next] += delta;
   }
 
-  buffer->move_to (end);
+  (void) buffer->move_to (end);
 
   return_trace (true);
 }
@@ -1389,9 +1389,11 @@
 			    lookup_context);
   }
 
-  void closure_lookups (hb_closure_lookups_context_t *c) const
+  void closure_lookups (hb_closure_lookups_context_t *c,
+                        ContextClosureLookupContext &lookup_context) const
   {
     if (unlikely (c->lookup_limit_exceeded ())) return;
+    if (!intersects (c->glyphs, lookup_context)) return;
 
     const UnsizedArrayOf<LookupRecord> &lookupRecord = StructAfter<UnsizedArrayOf<LookupRecord>>
 						       (inputZ.as_array (inputCount ? inputCount - 1 : 0));
@@ -1521,14 +1523,13 @@
     ;
   }
 
-  void closure_lookups (hb_closure_lookups_context_t *c) const
+  void closure_lookups (hb_closure_lookups_context_t *c,
+                        ContextClosureLookupContext &lookup_context) const
   {
     if (unlikely (c->lookup_limit_exceeded ())) return;
-
-    return
     + hb_iter (rule)
     | hb_map (hb_add (this))
-    | hb_apply ([&] (const Rule &_) { _.closure_lookups (c); })
+    | hb_apply ([&] (const Rule &_) { _.closure_lookups (c, lookup_context); })
     ;
   }
 
@@ -1647,9 +1648,16 @@
 
   void closure_lookups (hb_closure_lookups_context_t *c) const
   {
-    + hb_iter (ruleSet)
+    struct ContextClosureLookupContext lookup_context = {
+      {intersects_glyph},
+      nullptr
+    };
+
+    + hb_zip (this+coverage, ruleSet)
+    | hb_filter (*c->glyphs, hb_first)
+    | hb_map (hb_second)
     | hb_map (hb_add (this))
-    | hb_apply ([&] (const RuleSet &_) { _.closure_lookups (c); })
+    | hb_apply ([&] (const RuleSet &_) { _.closure_lookups (c, lookup_context); })
     ;
   }
 
@@ -1700,7 +1708,7 @@
   bool subset (hb_subset_context_t *c) const
   {
     TRACE_SUBSET (this);
-    const hb_set_t &glyphset = *c->plan->glyphset ();
+    const hb_set_t &glyphset = *c->plan->glyphset_gsub ();
     const hb_map_t &glyph_map = *c->plan->glyph_map;
 
     auto *out = c->serializer->start_embed (*this);
@@ -1791,10 +1799,24 @@
 
   void closure_lookups (hb_closure_lookups_context_t *c) const
   {
+    if (!(this+coverage).intersects (c->glyphs))
+      return;
+
+    const ClassDef &class_def = this+classDef;
+
+    struct ContextClosureLookupContext lookup_context = {
+      {intersects_class},
+      &class_def
+    };
+
     + hb_iter (ruleSet)
     | hb_map (hb_add (this))
-    | hb_apply ([&] (const RuleSet &_) { _.closure_lookups (c); })
-    ;
+    | hb_enumerate
+    | hb_filter ([&] (const hb_pair_t<unsigned, const RuleSet &> p)
+    { return class_def.intersects_class (c->glyphs, p.first); })
+    | hb_map (hb_second)
+    | hb_apply ([&] (const RuleSet & _)
+    { _.closure_lookups (c, lookup_context); });
   }
 
   void collect_variation_indices (hb_collect_variation_indices_context_t *c) const {}
@@ -1860,8 +1882,8 @@
     const hb_map_t *lookup_map = c->table_tag == HB_OT_TAG_GSUB ? c->plan->gsub_lookups : c->plan->gpos_lookups;
     bool ret = true;
     int non_zero_index = 0, index = 0;
-    for (const hb_pair_t<unsigned, const OffsetTo<RuleSet>&> _ : + hb_enumerate (ruleSet)
-								 | hb_filter (klass_map, hb_first))
+    for (const auto& _ : + hb_enumerate (ruleSet)
+			 | hb_filter (klass_map, hb_first))
     {
       auto *o = out->ruleSet.serialize_append (c->serializer);
       if (unlikely (!o))
@@ -1945,6 +1967,8 @@
 
   void closure_lookups (hb_closure_lookups_context_t *c) const
   {
+    if (!intersects (c->glyphs))
+      return;
     const LookupRecord *lookupRecord = &StructAfter<LookupRecord> (coverageZ.as_array (glyphCount));
     recurse_lookups (c, lookupCount, lookupRecord);
   }
@@ -2010,6 +2034,7 @@
 
     for (const OffsetTo<Coverage>& offset : coverages)
     {
+      /* TODO(subset) This looks like should not be necessary to write this way. */
       auto *o = c->serializer->allocate_size<OffsetTo<Coverage>> (OffsetTo<Coverage>::static_size);
       if (unlikely (!o)) return_trace (false);
       if (!o->serialize_subset (c, offset, this)) return_trace (false);
@@ -2238,9 +2263,11 @@
 				  lookup_context);
   }
 
-  void closure_lookups (hb_closure_lookups_context_t *c) const
+  void closure_lookups (hb_closure_lookups_context_t *c,
+                        ChainContextClosureLookupContext &lookup_context) const
   {
     if (unlikely (c->lookup_limit_exceeded ())) return;
+    if (!intersects (c->glyphs, lookup_context)) return;
 
     const HeadlessArrayOf<HBUINT16> &input = StructAfter<HeadlessArrayOf<HBUINT16>> (backtrack);
     const ArrayOf<HBUINT16> &lookahead = StructAfter<ArrayOf<HBUINT16>> (input);
@@ -2296,11 +2323,7 @@
   {
     c->copy (len);
     for (const auto g : it)
-    {
-      HBUINT16 gid;
-      gid = g;
-      c->copy (gid);
-    }
+      c->copy ((HBUINT16) g);
   }
 
   ChainRule* copy (hb_serialize_context_t *c,
@@ -2328,12 +2351,19 @@
 				       | hb_map (mapping));
 
     const ArrayOf<LookupRecord> &lookupRecord = StructAfter<ArrayOf<LookupRecord>> (lookahead);
-    HBUINT16 lookupCount;
-    lookupCount = lookupRecord.len;
-    if (!c->copy (lookupCount)) return_trace (nullptr);
 
-    for (unsigned i = 0; i < (unsigned) lookupCount; i++)
+    HBUINT16* lookupCount = c->embed (&(lookupRecord.len));
+    if (!lookupCount) return_trace (nullptr);
+
+    for (unsigned i = 0; i < lookupRecord.len; i++)
+    {
+      if (!lookup_map->has (lookupRecord[i].lookupListIndex))
+      {
+        (*lookupCount)--;
+        continue;
+      }
       if (!c->copy (lookupRecord[i], lookup_map)) return_trace (nullptr);
+    }
 
     return_trace (out);
   }
@@ -2351,7 +2381,7 @@
 
     if (!backtrack_map)
     {
-      const hb_set_t &glyphset = *c->plan->glyphset ();
+      const hb_set_t &glyphset = *c->plan->glyphset_gsub ();
       if (!hb_all (backtrack, glyphset) ||
 	  !hb_all (input, glyphset) ||
 	  !hb_all (lookahead, glyphset))
@@ -2424,14 +2454,14 @@
     ;
   }
 
-  void closure_lookups (hb_closure_lookups_context_t *c) const
+  void closure_lookups (hb_closure_lookups_context_t *c,
+                        ChainContextClosureLookupContext &lookup_context) const
   {
     if (unlikely (c->lookup_limit_exceeded ())) return;
 
-    return
     + hb_iter (rule)
     | hb_map (hb_add (this))
-    | hb_apply ([&] (const ChainRule &_) { _.closure_lookups (c); })
+    | hb_apply ([&] (const ChainRule &_) { _.closure_lookups (c, lookup_context); })
     ;
   }
 
@@ -2552,9 +2582,16 @@
 
   void closure_lookups (hb_closure_lookups_context_t *c) const
   {
-    + hb_iter (ruleSet)
+    struct ChainContextClosureLookupContext lookup_context = {
+      {intersects_glyph},
+      {nullptr, nullptr, nullptr}
+    };
+
+    + hb_zip (this+coverage, ruleSet)
+    | hb_filter (*c->glyphs, hb_first)
+    | hb_map (hb_second)
     | hb_map (hb_add (this))
-    | hb_apply ([&] (const ChainRuleSet &_) { _.closure_lookups (c); })
+    | hb_apply ([&] (const ChainRuleSet &_) { _.closure_lookups (c, lookup_context); })
     ;
   }
 
@@ -2604,7 +2641,7 @@
   bool subset (hb_subset_context_t *c) const
   {
     TRACE_SUBSET (this);
-    const hb_set_t &glyphset = *c->plan->glyphset ();
+    const hb_set_t &glyphset = *c->plan->glyphset_gsub ();
     const hb_map_t &glyph_map = *c->plan->glyph_map;
 
     auto *out = c->serializer->start_embed (*this);
@@ -2701,9 +2738,28 @@
 
   void closure_lookups (hb_closure_lookups_context_t *c) const
   {
+    if (!(this+coverage).intersects (c->glyphs))
+      return;
+
+    const ClassDef &backtrack_class_def = this+backtrackClassDef;
+    const ClassDef &input_class_def = this+inputClassDef;
+    const ClassDef &lookahead_class_def = this+lookaheadClassDef;
+
+    struct ChainContextClosureLookupContext lookup_context = {
+      {intersects_class},
+      {&backtrack_class_def,
+       &input_class_def,
+       &lookahead_class_def}
+    };
+
     + hb_iter (ruleSet)
     | hb_map (hb_add (this))
-    | hb_apply ([&] (const ChainRuleSet &_) { _.closure_lookups (c); })
+    | hb_enumerate
+    | hb_filter([&] (unsigned klass)
+    { return input_class_def.intersects_class (c->glyphs, klass); }, hb_first)
+    | hb_map (hb_second)
+    | hb_apply ([&] (const ChainRuleSet &_)
+    { _.closure_lookups (c, lookup_context); })
     ;
   }
 
@@ -2779,24 +2835,23 @@
     out->coverage.serialize_subset (c, coverage, this);
 
     hb_map_t backtrack_klass_map;
+    hb_map_t input_klass_map;
+    hb_map_t lookahead_klass_map;
+
     out->backtrackClassDef.serialize_subset (c, backtrackClassDef, this, &backtrack_klass_map);
-    if (unlikely (!c->serializer->check_success (!backtrack_klass_map.in_error ())))
-      return_trace (false);
-
-    // subset inputClassDef based on glyphs survived in Coverage subsetting
-    hb_map_t input_klass_map;
+    // TODO: subset inputClassDef based on glyphs survived in Coverage subsetting
     out->inputClassDef.serialize_subset (c, inputClassDef, this, &input_klass_map);
-    if (unlikely (!c->serializer->check_success (!input_klass_map.in_error ())))
-      return_trace (false);
+    out->lookaheadClassDef.serialize_subset (c, lookaheadClassDef, this, &lookahead_klass_map);
 
-    hb_map_t lookahead_klass_map;
-    out->lookaheadClassDef.serialize_subset (c, lookaheadClassDef, this, &lookahead_klass_map);
-    if (unlikely (!c->serializer->check_success (!lookahead_klass_map.in_error ())))
+    if (unlikely (!c->serializer->propagate_error (backtrack_klass_map,
+						   input_klass_map,
+						   lookahead_klass_map)))
       return_trace (false);
 
-    unsigned non_zero_index = 0, index = 0;
+    int non_zero_index = -1, index = 0;
     bool ret = true;
     const hb_map_t *lookup_map = c->table_tag == HB_OT_TAG_GSUB ? c->plan->gsub_lookups : c->plan->gpos_lookups;
+    auto last_non_zero = c->serializer->snapshot ();
     for (const OffsetTo<ChainRuleSet>& _ : + hb_enumerate (ruleSet)
 					   | hb_filter (input_klass_map, hb_first)
 					   | hb_map (hb_second))
@@ -2812,7 +2867,10 @@
 			       &backtrack_klass_map,
 			       &input_klass_map,
 			       &lookahead_klass_map))
+      {
+        last_non_zero = c->serializer->snapshot ();
 	non_zero_index = index;
+      }
 
       index++;
     }
@@ -2819,12 +2877,10 @@
 
     if (!ret) return_trace (ret);
 
-    //prune empty trailing ruleSets
-    --index;
-    while (index > non_zero_index)
-    {
-      out->ruleSet.pop ();
-      index--;
+    // prune empty trailing ruleSets
+    if (index > non_zero_index) {
+      c->serializer->revert (last_non_zero);
+      out->ruleSet.len = non_zero_index + 1;
     }
 
     return_trace (bool (out->ruleSet));
@@ -2908,6 +2964,9 @@
 
   void closure_lookups (hb_closure_lookups_context_t *c) const
   {
+    if (!intersects (c->glyphs))
+      return;
+
     const OffsetArrayOf<Coverage> &input = StructAfter<OffsetArrayOf<Coverage>> (backtrack);
     const OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverage>> (input);
     const ArrayOf<LookupRecord> &lookup = StructAfter<ArrayOf<LookupRecord>> (lookahead);
@@ -2986,13 +3045,16 @@
     TRACE_SERIALIZE (this);
     auto *out = c->serializer->start_embed<OffsetArrayOf<Coverage>> ();
 
-    if (unlikely (!c->serializer->allocate_size<HBUINT16> (HBUINT16::static_size))) return_trace (false);
+    if (unlikely (!c->serializer->allocate_size<HBUINT16> (HBUINT16::static_size)))
+      return_trace (false);
 
-    + it
-    | hb_apply (subset_offset_array (c, *out, base))
-    ;
+    for (auto& offset : it) {
+      auto *o = out->serialize_append (c->serializer);
+      if (unlikely (!o) || !o->serialize_subset (c, offset, base))
+        return_trace (false);
+    }
 
-    return_trace (out->len);
+    return_trace (true);
   }
 
   bool subset (hb_subset_context_t *c) const
@@ -3113,6 +3175,24 @@
 		  extensionLookupType != T::SubTable::Extension);
   }
 
+  bool subset (hb_subset_context_t *c) const
+  {
+    TRACE_SUBSET (this);
+
+    auto *out = c->serializer->start_embed (this);
+    if (unlikely (!out || !c->serializer->extend_min (out))) return_trace (false);
+
+    out->format = format;
+    out->extensionLookupType = extensionLookupType;
+
+    const auto& src_offset =
+        reinterpret_cast<const LOffsetTo<typename T::SubTable> &> (extensionOffset);
+    auto& dest_offset =
+        reinterpret_cast<LOffsetTo<typename T::SubTable> &> (out->extensionOffset);
+
+    return_trace (dest_offset.serialize_subset (c, src_offset, this, get_type ()));
+  }
+
   protected:
   HBUINT16	format;			/* Format identifier. Set to 1. */
   HBUINT16	extensionLookupType;	/* Lookup type of subtable referenced
@@ -3143,6 +3223,18 @@
     }
   }
 
+  // Specialization of dispatch for subset. dispatch() normally just
+  // dispatches to the sub table this points too, but for subset
+  // we need to run subset on this subtable too.
+  template <typename ...Ts>
+  typename hb_subset_context_t::return_t dispatch (hb_subset_context_t *c, Ts&&... ds) const
+  {
+    switch (u.format) {
+    case 1: return u.format1.subset (c);
+    default: return c->default_return_value ();
+    }
+  }
+
   template <typename context_t, typename ...Ts>
   typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const
   {
@@ -3320,20 +3412,34 @@
     return_trace (true);
   }
 
-  void closure_features (const hb_map_t *lookup_indexes, /* IN */
-			 hb_set_t       *feature_indexes /* OUT */) const
+  void prune_features (const hb_map_t *lookup_indices, /* IN */
+                       hb_set_t       *feature_indices /* IN/OUT */) const
   {
-    unsigned int feature_count = hb_min (get_feature_count (), (unsigned) HB_MAX_FEATURES);
-    for (unsigned i = 0; i < feature_count; i++)
+#ifndef HB_NO_VAR
+    // This is the set of feature indices which have alternate versions defined
+    // if the FeatureVariation's table and the alternate version(s) intersect the
+    // set of lookup indices.
+    hb_set_t alternate_feature_indices;
+    if (version.to_int () >= 0x00010001u)
+      (this+featureVars).closure_features (lookup_indices, &alternate_feature_indices);
+    if (unlikely (alternate_feature_indices.in_error())) {
+      feature_indices->successful = false;
+      return;
+    }
+#endif
+
+    for (unsigned i : feature_indices->iter())
     {
       const Feature& f = get_feature (i);
-      if ((!f.featureParams.is_null ()) || f.intersects_lookup_indexes (lookup_indexes))
-	feature_indexes->add (i);
-    }
+
+      if (f.featureParams.is_null ()
+	  && !f.intersects_lookup_indexes (lookup_indices)
 #ifndef HB_NO_VAR
-    if (version.to_int () >= 0x00010001u)
-      (this+featureVars).closure_features (lookup_indexes, feature_indexes);
+          && !alternate_feature_indices.has (i)
 #endif
+	  )
+	feature_indices->del (i);
+    }
   }
 
   unsigned int get_size () const

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout.cc	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout.cc	2021-04-17 22:31:16 UTC (rev 58898)
@@ -76,7 +76,7 @@
  * Tests whether a face includes any kerning data in the 'kern' table.
  * Does NOT test for kerning lookups in the GPOS table.
  *
- * Return value: %true if data found, false otherwise
+ * Return value: %true if data found, %false otherwise
  *
  **/
 bool
@@ -92,7 +92,7 @@
  * Tests whether a face includes any state-machine kerning in the 'kern' table.
  * Does NOT examine the GPOS table.
  *
- * Return value: %true if data found, false otherwise
+ * Return value: %true if data found, %false otherwise
  *
  **/
 bool
@@ -112,7 +112,7 @@
  *
  * Does NOT examine the GPOS table.
  *
- * Return value: %true is data found, false otherwise
+ * Return value: %true is data found, %false otherwise
  *
  **/
 bool
@@ -268,7 +268,7 @@
  *
  * Tests whether a face has any glyph classes defined in its GDEF table.
  *
- * Return value: %true if data found, false otherwise
+ * Return value: %true if data found, %false otherwise
  *
  **/
 hb_bool_t
@@ -322,7 +322,7 @@
  * @face: The #hb_face_t to work on
  * @glyph: The #hb_codepoint_t code point to query
  * @start_offset: offset of the first attachment point to retrieve
- * @point_count: (inout) (allow-none): Input = the maximum number of attachment points to return;
+ * @point_count: (inout) (optional): Input = the maximum number of attachment points to return;
  *               Output = the actual number of attachment points returned (may be zero)
  * @point_array: (out) (array length=point_count): The array of attachment points found for the query
  *
@@ -350,7 +350,7 @@
  * @direction: The #hb_direction_t text direction to use
  * @glyph: The #hb_codepoint_t code point to query
  * @start_offset: offset of the first caret position to retrieve
- * @caret_count: (inout) (allow-none): Input = the maximum number of caret positions to return;
+ * @caret_count: (inout) (optional): Input = the maximum number of caret positions to return;
  *               Output = the actual number of caret positions returned (may be zero)
  * @caret_array: (out) (array length=caret_count): The array of caret positions found for the query
  *
@@ -410,9 +410,9 @@
 /**
  * hb_ot_layout_table_get_script_tags:
  * @face: #hb_face_t to work upon
- * @table_tag: HB_OT_TAG_GSUB or HB_OT_TAG_GPOS
+ * @table_tag: #HB_OT_TAG_GSUB or #HB_OT_TAG_GPOS
  * @start_offset: offset of the first script tag to retrieve
- * @script_count: (inout) (allow-none): Input = the maximum number of script tags to return;
+ * @script_count: (inout) (optional): Input = the maximum number of script tags to return;
  *                Output = the actual number of script tags returned (may be zero)
  * @script_tags: (out) (array length=script_count): The array of #hb_tag_t script tags found for the query
  *
@@ -437,7 +437,7 @@
 /**
  * hb_ot_layout_table_find_script:
  * @face: #hb_face_t to work upon
- * @table_tag: HB_OT_TAG_GSUB or HB_OT_TAG_GPOS
+ * @table_tag: #HB_OT_TAG_GSUB or #HB_OT_TAG_GPOS
  * @script_tag: #hb_tag_t of the script tag requested
  * @script_index: (out): The index of the requested script tag
  *
@@ -444,7 +444,7 @@
  * Fetches the index if a given script tag in the specified face's GSUB table
  * or GPOS table.
  *
- * Return value: %true if the script is found, false otherwise
+ * Return value: %true if the script is found, %false otherwise
  *
  **/
 hb_bool_t
@@ -481,7 +481,7 @@
 /**
  * hb_ot_layout_table_choose_script:
  * @face: #hb_face_t to work upon
- * @table_tag: HB_OT_TAG_GSUB or HB_OT_TAG_GPOS
+ * @table_tag: #HB_OT_TAG_GSUB or #HB_OT_TAG_GPOS
  * @script_tags: Array of #hb_tag_t script tags
  * @script_index: (out): The index of the requested script tag
  * @chosen_script: (out): #hb_tag_t of the script tag requested
@@ -504,12 +504,23 @@
 /**
  * hb_ot_layout_table_select_script:
  * @face: #hb_face_t to work upon
- * @table_tag: HB_OT_TAG_GSUB or HB_OT_TAG_GPOS
+ * @table_tag: #HB_OT_TAG_GSUB or #HB_OT_TAG_GPOS
  * @script_count: Number of script tags in the array
  * @script_tags: Array of #hb_tag_t script tags
- * @script_index: (out): The index of the requested script
- * @chosen_script: (out): #hb_tag_t of the requested script
+ * @script_index: (out) (optional): The index of the requested script
+ * @chosen_script: (out) (optional): #hb_tag_t of the requested script
  *
+ * Selects an OpenType script for @table_tag from the @script_tags array.
+ *
+ * If the table does not have any of the requested scripts, then `DFLT`,
+ * `dflt`, and `latn` tags are tried in that order. If the table still does not
+ * have any of these scripts, @script_index and @chosen_script are set to
+ * #HB_OT_LAYOUT_NO_SCRIPT_INDEX.
+ *
+ * Return value:
+ * %true if one of the requested scripts is selected, %false if a fallback
+ * script is selected or if no scripts are selected.
+ *
  * Since: 2.0.0
  **/
 hb_bool_t
@@ -566,9 +577,9 @@
 /**
  * hb_ot_layout_table_get_feature_tags:
  * @face: #hb_face_t to work upon
- * @table_tag: HB_OT_TAG_GSUB or HB_OT_TAG_GPOS
+ * @table_tag: #HB_OT_TAG_GSUB or #HB_OT_TAG_GPOS
  * @start_offset: offset of the first feature tag to retrieve
- * @feature_count: (inout) (allow-none): Input = the maximum number of feature tags to return;
+ * @feature_count: (inout) (optional): Input = the maximum number of feature tags to return;
  *                 Output = the actual number of feature tags returned (may be zero)
  * @feature_tags: (out) (array length=feature_count): Array of feature tags found in the table
  *
@@ -591,7 +602,7 @@
 /**
  * hb_ot_layout_table_find_feature:
  * @face: #hb_face_t to work upon
- * @table_tag: HB_OT_TAG_GSUB or HB_OT_TAG_GPOS
+ * @table_tag: #HB_OT_TAG_GSUB or #HB_OT_TAG_GPOS
  * @feature_tag: The #hb_tag_t og the requested feature tag
  * @feature_index: (out): The index of the requested feature
  *
@@ -598,7 +609,7 @@
  * Fetches the index for a given feature tag in the specified face's GSUB table
  * or GPOS table.
  *
- * Return value: %true if the feature is found, false otherwise
+ * Return value: %true if the feature is found, %false otherwise
  **/
 bool
 hb_ot_layout_table_find_feature (hb_face_t    *face,
@@ -626,10 +637,10 @@
 /**
  * hb_ot_layout_script_get_language_tags:
  * @face: #hb_face_t to work upon
- * @table_tag: HB_OT_TAG_GSUB or HB_OT_TAG_GPOS
+ * @table_tag: #HB_OT_TAG_GSUB or #HB_OT_TAG_GPOS
  * @script_index: The index of the requested script tag
  * @start_offset: offset of the first language tag to retrieve
- * @language_count: (inout) (allow-none): Input = the maximum number of language tags to return;
+ * @language_count: (inout) (optional): Input = the maximum number of language tags to return;
  *                  Output = the actual number of language tags returned (may be zero)
  * @language_tags: (out) (array length=language_count): Array of language tags found in the table
  *
@@ -655,7 +666,7 @@
 /**
  * hb_ot_layout_script_find_language:
  * @face: #hb_face_t to work upon
- * @table_tag: HB_OT_TAG_GSUB or HB_OT_TAG_GPOS
+ * @table_tag: #HB_OT_TAG_GSUB or #HB_OT_TAG_GPOS
  * @script_index: The index of the requested script tag
  * @language_tag: The #hb_tag_t of the requested language
  * @language_index: The index of the requested language
@@ -663,7 +674,7 @@
  * Fetches the index of a given language tag in the specified face's GSUB table
  * or GPOS table, underneath the specified script tag.
  *
- * Return value: %true if the language tag is found, false otherwise
+ * Return value: %true if the language tag is found, %false otherwise
  *
  * Since: ??
  * Deprecated: ??
@@ -688,7 +699,7 @@
 /**
  * hb_ot_layout_script_select_language:
  * @face: #hb_face_t to work upon
- * @table_tag: HB_OT_TAG_GSUB or HB_OT_TAG_GPOS
+ * @table_tag: #HB_OT_TAG_GSUB or #HB_OT_TAG_GPOS
  * @script_index: The index of the requested script tag
  * @language_count: The number of languages in the specified script
  * @language_tags: The array of language tags
@@ -697,7 +708,7 @@
  * Fetches the index of a given language tag in the specified face's GSUB table
  * or GPOS table, underneath the specified script index.
  *
- * Return value: %true if the language tag is found, false otherwise
+ * Return value: %true if the language tag is found, %false otherwise
  *
  * Since: 2.0.0
  **/
@@ -731,7 +742,7 @@
 /**
  * hb_ot_layout_language_get_required_feature_index:
  * @face: #hb_face_t to work upon
- * @table_tag: HB_OT_TAG_GSUB or HB_OT_TAG_GPOS
+ * @table_tag: #HB_OT_TAG_GSUB or #HB_OT_TAG_GPOS
  * @script_index: The index of the requested script tag
  * @language_index: The index of the requested language tag
  * @feature_index: (out): The index of the requested feature
@@ -739,7 +750,7 @@
  * Fetches the index of a requested feature in the given face's GSUB or GPOS table,
  * underneath the specified script and language.
  *
- * Return value: %true if the feature is found, false otherwise
+ * Return value: %true if the feature is found, %false otherwise
  *
  **/
 hb_bool_t
@@ -761,7 +772,7 @@
 /**
  * hb_ot_layout_language_get_required_feature:
  * @face: #hb_face_t to work upon
- * @table_tag: HB_OT_TAG_GSUB or HB_OT_TAG_GPOS
+ * @table_tag: #HB_OT_TAG_GSUB or #HB_OT_TAG_GPOS
  * @script_index: The index of the requested script tag
  * @language_index: The index of the requested language tag
  * @feature_index: (out): The index of the requested feature
@@ -770,7 +781,7 @@
  * Fetches the tag of a requested feature index in the given face's GSUB or GPOS table,
  * underneath the specified script and language.
  *
- * Return value: %true if the feature is found, false otherwise
+ * Return value: %true if the feature is found, %false otherwise
  *
  * Since: 0.9.30
  **/
@@ -796,11 +807,11 @@
 /**
  * hb_ot_layout_language_get_feature_indexes:
  * @face: #hb_face_t to work upon
- * @table_tag: HB_OT_TAG_GSUB or HB_OT_TAG_GPOS
+ * @table_tag: #HB_OT_TAG_GSUB or #HB_OT_TAG_GPOS
  * @script_index: The index of the requested script tag
  * @language_index: The index of the requested language tag
  * @start_offset: offset of the first feature tag to retrieve
- * @feature_count: (inout) (allow-none): Input = the maximum number of feature tags to return;
+ * @feature_count: (inout) (optional): Input = the maximum number of feature tags to return;
  *                 Output: the actual number of feature tags returned (may be zero)
  * @feature_indexes: (out) (array length=feature_count): The array of feature indexes found for the query
  *
@@ -827,11 +838,11 @@
 /**
  * hb_ot_layout_language_get_feature_tags:
  * @face: #hb_face_t to work upon
- * @table_tag: HB_OT_TAG_GSUB or HB_OT_TAG_GPOS
+ * @table_tag: #HB_OT_TAG_GSUB or #HB_OT_TAG_GPOS
  * @script_index: The index of the requested script tag
  * @language_index: The index of the requested language tag
  * @start_offset: offset of the first feature tag to retrieve
- * @feature_count: (inout) (allow-none): Input = the maximum number of feature tags to return;
+ * @feature_count: (inout) (optional): Input = the maximum number of feature tags to return;
  *                 Output = the actual number of feature tags returned (may be zero)
  * @feature_tags: (out) (array length=feature_count): The array of #hb_tag_t feature tags found for the query
  *
@@ -868,7 +879,7 @@
 /**
  * hb_ot_layout_language_find_feature:
  * @face: #hb_face_t to work upon
- * @table_tag: HB_OT_TAG_GSUB or HB_OT_TAG_GPOS
+ * @table_tag: #HB_OT_TAG_GSUB or #HB_OT_TAG_GPOS
  * @script_index: The index of the requested script tag
  * @language_index: The index of the requested language tag
  * @feature_tag: #hb_tag_t of the feature tag requested
@@ -877,7 +888,7 @@
  * Fetches the index of a given feature tag in the specified face's GSUB table
  * or GPOS table, underneath the specified script and language.
  *
- * Return value: %true if the feature is found, false otherwise
+ * Return value: %true if the feature is found, %false otherwise
  *
  **/
 hb_bool_t
@@ -910,10 +921,10 @@
 /**
  * hb_ot_layout_feature_get_lookups:
  * @face: #hb_face_t to work upon
- * @table_tag: HB_OT_TAG_GSUB or HB_OT_TAG_GPOS
+ * @table_tag: #HB_OT_TAG_GSUB or #HB_OT_TAG_GPOS
  * @feature_index: The index of the requested feature
  * @start_offset: offset of the first lookup to retrieve
- * @lookup_count: (inout) (allow-none): Input = the maximum number of lookups to return;
+ * @lookup_count: (inout) (optional): Input = the maximum number of lookups to return;
  *                Output = the actual number of lookups returned (may be zero)
  * @lookup_indexes: (out) (array length=lookup_count): The array of lookup indexes found for the query
  *
@@ -944,7 +955,7 @@
 /**
  * hb_ot_layout_table_get_lookup_count:
  * @face: #hb_face_t to work upon
- * @table_tag: HB_OT_TAG_GSUB or HB_OT_TAG_GPOS
+ * @table_tag: #HB_OT_TAG_GSUB or #HB_OT_TAG_GPOS
  *
  * Fetches the total number of lookups enumerated in the specified
  * face's GSUB table or GPOS table.
@@ -1101,7 +1112,7 @@
 /**
  * hb_ot_layout_collect_features:
  * @face: #hb_face_t to work upon
- * @table_tag: HB_OT_TAG_GSUB or HB_OT_TAG_GPOS
+ * @table_tag: #HB_OT_TAG_GSUB or #HB_OT_TAG_GPOS
  * @scripts: The array of scripts to collect features for
  * @languages: The array of languages to collect features for
  * @features: The array of features to collect
@@ -1152,7 +1163,7 @@
 /**
  * hb_ot_layout_collect_lookups:
  * @face: #hb_face_t to work upon
- * @table_tag: HB_OT_TAG_GSUB or HB_OT_TAG_GPOS
+ * @table_tag: #HB_OT_TAG_GSUB or #HB_OT_TAG_GPOS
  * @scripts: The array of scripts to collect lookups for
  * @languages: The array of languages to collect lookups for
  * @features: The array of features to collect lookups for
@@ -1191,7 +1202,7 @@
 /**
  * hb_ot_layout_lookup_collect_glyphs:
  * @face: #hb_face_t to work upon
- * @table_tag: HB_OT_TAG_GSUB or HB_OT_TAG_GPOS
+ * @table_tag: #HB_OT_TAG_GSUB or #HB_OT_TAG_GPOS
  * @lookup_index: The index of the feature lookup to query
  * @glyphs_before: (out): Array of glyphs preceding the substitution range
  * @glyphs_input: (out): Array of input glyphs that would be substituted by the lookup
@@ -1243,7 +1254,7 @@
 /**
  * hb_ot_layout_table_find_feature_variations:
  * @face: #hb_face_t to work upon
- * @table_tag: HB_OT_TAG_GSUB or HB_OT_TAG_GPOS
+ * @table_tag: #HB_OT_TAG_GSUB or #HB_OT_TAG_GPOS
  * @coords: The variation coordinates to query
  * @num_coords: The number of variation coordinates
  * @variations_index: (out): The array of feature variations found for the query
@@ -1268,11 +1279,11 @@
 /**
  * hb_ot_layout_feature_with_variations_get_lookups:
  * @face: #hb_face_t to work upon
- * @table_tag: HB_OT_TAG_GSUB or HB_OT_TAG_GPOS
+ * @table_tag: #HB_OT_TAG_GSUB or #HB_OT_TAG_GPOS
  * @feature_index: The index of the feature to query
  * @variations_index: The index of the feature variation to query
  * @start_offset: offset of the first lookup to retrieve
- * @lookup_count: (inout) (allow-none): Input = the maximum number of lookups to return;
+ * @lookup_count: (inout) (optional): Input = the maximum number of lookups to return;
  *                Output = the actual number of lookups returned (may be zero)
  * @lookup_indexes: (out) (array length=lookup_count): The array of lookups found for the query
  *
@@ -1310,7 +1321,7 @@
  *
  * Tests whether the specified face includes any GSUB substitutions.
  *
- * Return value: %true if data found, false otherwise
+ * Return value: %true if data found, %false otherwise
  *
  **/
 hb_bool_t
@@ -1331,7 +1342,7 @@
  * Tests whether a specified lookup in the specified face would
  * trigger a substitution on the given glyph sequence.
  *
- * Return value: %true if a substitution would be triggered, false otherwise
+ * Return value: %true if a substitution would be triggered, %false otherwise
  *
  * Since: 0.9.7
  **/
@@ -1488,8 +1499,10 @@
  * hb_ot_layout_has_positioning:
  * @face: #hb_face_t to work upon
  *
- * Return value: %true if the face has GPOS data, false otherwise
+ * Tests whether the specified face includes any GPOS positioning.
  *
+ * Return value: %true if the face has GPOS data, %false otherwise
+ *
  **/
 hb_bool_t
 hb_ot_layout_has_positioning (hb_face_t *face)
@@ -1561,7 +1574,7 @@
  * For more information on this distinction, see the [`size` feature documentation](
  * https://docs.microsoft.com/en-us/typography/opentype/spec/features_pt#tag-size).
  *
- * Return value: %true if data found, false otherwise
+ * Return value: %true if data found, %false otherwise
  *
  * Since: 0.9.10
  **/
@@ -1610,15 +1623,15 @@
  * @face: #hb_face_t to work upon
  * @table_tag: table tag to query, "GSUB" or "GPOS".
  * @feature_index: index of feature to query.
- * @label_id: (out) (allow-none): The ‘name’ table name ID that specifies a string
+ * @label_id: (out) (optional): The ‘name’ table name ID that specifies a string
  *            for a user-interface label for this feature. (May be NULL.)
- * @tooltip_id: (out) (allow-none): The ‘name’ table name ID that specifies a string
+ * @tooltip_id: (out) (optional): The ‘name’ table name ID that specifies a string
  *              that an application can use for tooltip text for this
  *              feature. (May be NULL.)
- * @sample_id: (out) (allow-none): The ‘name’ table name ID that specifies sample text
+ * @sample_id: (out) (optional): The ‘name’ table name ID that specifies sample text
  *             that illustrates the effect of this feature. (May be NULL.)
- * @num_named_parameters: (out) (allow-none):  Number of named parameters. (May be zero.)
- * @first_param_id: (out) (allow-none): The first ‘name’ table name ID used to specify
+ * @num_named_parameters: (out) (optional):  Number of named parameters. (May be zero.)
+ * @first_param_id: (out) (optional): The first ‘name’ table name ID used to specify
  *                  strings for user-interface labels for the feature
  *                  parameters. (Must be zero if numParameters is zero.)
  *
@@ -1625,7 +1638,7 @@
  * Fetches name indices from feature parameters for "Stylistic Set" ('ssXX') or
  * "Character Variant" ('cvXX') features.
  *
- * Return value: %true if data found, false otherwise
+ * Return value: %true if data found, %false otherwise
  *
  * Since: 2.0.0
  **/
@@ -1685,7 +1698,7 @@
  * @table_tag: table tag to query, "GSUB" or "GPOS".
  * @feature_index: index of feature to query.
  * @start_offset: offset of the first character to retrieve
- * @char_count: (inout) (allow-none): Input = the maximum number of characters to return;
+ * @char_count: (inout) (optional): Input = the maximum number of characters to return;
  *              Output = the actual number of characters returned (may be zero)
  * @characters: (out caller-allocates) (array length=char_count): A buffer pointer.
  *              The Unicode codepoints of the characters for which this feature provides
@@ -1769,7 +1782,7 @@
     if (applied)
       ret = true;
     else
-      buffer->next_glyph ();
+      (void) buffer->next_glyph ();
   }
   return ret;
 }
@@ -1907,7 +1920,7 @@
  * @baseline_tag: a baseline tag
  * @direction: text direction.
  * @script_tag:  script tag.
- * @language_tag: language tag.
+ * @language_tag: language tag, currently unused.
  * @coord: (out): baseline value if found.
  *
  * Fetches a baseline value from the face.
@@ -1964,7 +1977,7 @@
  * @lookup_index: index of the feature lookup to query.
  * @glyph: a glyph id.
  * @start_offset: starting offset.
- * @alternate_count: (inout) (allow-none): Input = the maximum number of alternate glyphs to return;
+ * @alternate_count: (inout) (optional): Input = the maximum number of alternate glyphs to return;
  *                   Output = the actual number of alternate glyphs returned (may be zero).
  * @alternate_glyphs: (out caller-allocates) (array length=alternate_count): A glyphs buffer.
  *                    Alternate glyphs associated with the glyph id.

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout.h
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout.h	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout.h	2021-04-17 22:31:16 UTC (rev 58898)
@@ -24,7 +24,7 @@
  * Red Hat Author(s): Behdad Esfahbod
  */
 
-#ifndef HB_OT_H_IN
+#if !defined(HB_OT_H_IN) && !defined(HB_NO_SINGLE_HEADER_ERROR)
 #error "Include <hb-ot.h> instead."
 #endif
 
@@ -38,10 +38,35 @@
 HB_BEGIN_DECLS
 
 
+/**
+ * HB_OT_TAG_BASE:
+ *
+ * OpenType [Baseline Table](https://docs.microsoft.com/en-us/typography/opentype/spec/base).
+ */
 #define HB_OT_TAG_BASE HB_TAG('B','A','S','E')
+/**
+ * HB_OT_TAG_GDEF:
+ *
+ * OpenType [Glyph Definition Table](https://docs.microsoft.com/en-us/typography/opentype/spec/gdef).
+ */
 #define HB_OT_TAG_GDEF HB_TAG('G','D','E','F')
+/**
+ * HB_OT_TAG_GSUB:
+ *
+ * OpenType [Glyph Substitution Table](https://docs.microsoft.com/en-us/typography/opentype/spec/gsub).
+ */
 #define HB_OT_TAG_GSUB HB_TAG('G','S','U','B')
+/**
+ * HB_OT_TAG_GPOS:
+ *
+ * OpenType [Glyph Positioning Table](https://docs.microsoft.com/en-us/typography/opentype/spec/gpos).
+ */
 #define HB_OT_TAG_GPOS HB_TAG('G','P','O','S')
+/**
+ * HB_OT_TAG_JSTF:
+ *
+ * OpenType [Justification Table](https://docs.microsoft.com/en-us/typography/opentype/spec/jstf).
+ */
 #define HB_OT_TAG_JSTF HB_TAG('J','S','T','F')
 
 
@@ -49,12 +74,26 @@
  * Script & Language tags.
  */
 
+/**
+ * HB_OT_TAG_DEFAULT_SCRIPT:
+ *
+ * OpenType script tag, `DFLT`, for features that are not script-specific.
+ *
+ */
 #define HB_OT_TAG_DEFAULT_SCRIPT	HB_TAG ('D', 'F', 'L', 'T')
+/**
+ * HB_OT_TAG_DEFAULT_LANGUAGE:
+ *
+ * OpenType language tag, `dflt`. Not a valid language tag, but some fonts
+ * mistakenly use it.
+ */
 #define HB_OT_TAG_DEFAULT_LANGUAGE	HB_TAG ('d', 'f', 'l', 't')
 
 /**
  * HB_OT_MAX_TAGS_PER_SCRIPT:
  *
+ * Maximum number of OpenType tags that can correspond to a give #hb_script_t.
+ *
  * Since: 2.0.0
  **/
 #define HB_OT_MAX_TAGS_PER_SCRIPT	3u
@@ -61,6 +100,8 @@
 /**
  * HB_OT_MAX_TAGS_PER_LANGUAGE:
  *
+ * Maximum number of OpenType tags that can correspond to a give #hb_language_t.
+ *
  * Since: 2.0.0
  **/
 #define HB_OT_MAX_TAGS_PER_LANGUAGE	3u
@@ -144,9 +185,29 @@
  * GSUB/GPOS feature query and enumeration interface
  */
 
+/**
+ * HB_OT_LAYOUT_NO_SCRIPT_INDEX:
+ *
+ * Special value for script index indicating unsupported script.
+ */
 #define HB_OT_LAYOUT_NO_SCRIPT_INDEX		0xFFFFu
+/**
+ * HB_OT_LAYOUT_NO_FEATURE_INDEX:
+ *
+ * Special value for feature index indicating unsupported feature.
+ */
 #define HB_OT_LAYOUT_NO_FEATURE_INDEX		0xFFFFu
+/**
+ * HB_OT_LAYOUT_DEFAULT_LANGUAGE_INDEX:
+ *
+ * Special value for language index indicating default or unsupported language.
+ */
 #define HB_OT_LAYOUT_DEFAULT_LANGUAGE_INDEX	0xFFFFu
+/**
+ * HB_OT_LAYOUT_NO_VARIATIONS_INDEX:
+ *
+ * Special value for variations index indicating unsupported variation.
+ */
 #define HB_OT_LAYOUT_NO_VARIATIONS_INDEX	0xFFFFFFFFu
 
 HB_EXTERN unsigned int
@@ -433,7 +494,7 @@
  * @HB_OT_LAYOUT_BASELINE_TAG_MATH: The baseline about which mathematical characters are centered.
  * In vertical writing mode when mathematical characters rotated 90 degrees clockwise, are centered.
  *
- * Baseline tags from https://docs.microsoft.com/en-us/typography/opentype/spec/baselinetags
+ * Baseline tags from [Baseline Tags](https://docs.microsoft.com/en-us/typography/opentype/spec/baselinetags) registry.
  *
  * Since: 2.6.0
  */
@@ -446,6 +507,7 @@
   HB_OT_LAYOUT_BASELINE_TAG_IDEO_EMBOX_TOP_OR_RIGHT	= HB_TAG ('i','d','t','p'),
   HB_OT_LAYOUT_BASELINE_TAG_MATH			= HB_TAG ('m','a','t','h'),
 
+  /*< private >*/
   _HB_OT_LAYOUT_BASELINE_TAG_MAX_VALUE = HB_TAG_MAX_SIGNED /*< skip >*/
 } hb_ot_layout_baseline_tag_t;
 

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout.hh	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout.hh	2021-04-17 22:31:16 UTC (rev 58898)
@@ -315,12 +315,13 @@
 }
 
 static inline bool _hb_glyph_info_ligated (const hb_glyph_info_t *info);
+static inline bool _hb_glyph_info_substituted (const hb_glyph_info_t *info);
 
 static inline bool
 _hb_glyph_info_is_default_ignorable (const hb_glyph_info_t *info)
 {
   return (info->unicode_props() & UPROPS_MASK_IGNORABLE) &&
-	 !_hb_glyph_info_ligated (info);
+	 !_hb_glyph_info_substituted (info);
 }
 static inline bool
 _hb_glyph_info_is_default_ignorable_and_not_hidden (const hb_glyph_info_t *info)

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-math.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-math.cc	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-math.cc	2021-04-17 22:31:16 UTC (rev 58898)
@@ -56,7 +56,7 @@
  *
  * Tests whether a face has a `MATH` table.
  *
- * Return value: true if the table is found, false otherwise
+ * Return value: %true if the table is found, %false otherwise
  *
  * Since: 1.3.3
  **/
@@ -142,7 +142,7 @@
  *
  * Tests whether the given glyph index is an extended shape in the face.
  *
- * Return value: true if the glyph is an extended shape, false otherwise
+ * Return value: %true if the glyph is an extended shape, %false otherwise
  *
  * Since: 1.3.3
  **/

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-math.h
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-math.h	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-math.h	2021-04-17 22:31:16 UTC (rev 58898)
@@ -24,7 +24,7 @@
  * Igalia Author(s): Frédéric Wang
  */
 
-#ifndef HB_OT_H_IN
+#if !defined(HB_OT_H_IN) && !defined(HB_NO_SINGLE_HEADER_ERROR)
 #error "Include <hb-ot.h> instead."
 #endif
 
@@ -40,9 +40,23 @@
  * MATH
  */
 
+/**
+ * HB_OT_TAG_MATH:
+ *
+ * OpenType [Mathematical Typesetting Table](https://docs.microsoft.com/en-us/typography/opentype/spec/math).
+ *
+ * Since: 1.3.3
+ */
 #define HB_OT_TAG_MATH HB_TAG('M','A','T','H')
 
-/* Use with hb_buffer_set_script() for math shaping. */
+/**
+ * HB_OT_MATH_SCRIPT:
+ *
+ * OpenType script tag for math shaping, for use with
+ * Use with hb_buffer_set_script().
+ *
+ * Since: 1.3.3
+ */
 #define HB_OT_MATH_SCRIPT HB_TAG('m','a','t','h')
 
 /* Types */
@@ -49,9 +63,66 @@
 
 /**
  * hb_ot_math_constant_t:
+ * @HB_OT_MATH_CONSTANT_SCRIPT_PERCENT_SCALE_DOWN: scriptPercentScaleDown
+ * @HB_OT_MATH_CONSTANT_SCRIPT_SCRIPT_PERCENT_SCALE_DOWN: scriptScriptPercentScaleDown
+ * @HB_OT_MATH_CONSTANT_DELIMITED_SUB_FORMULA_MIN_HEIGHT: delimitedSubFormulaMinHeight
+ * @HB_OT_MATH_CONSTANT_DISPLAY_OPERATOR_MIN_HEIGHT: displayOperatorMinHeight
+ * @HB_OT_MATH_CONSTANT_MATH_LEADING: mathLeading
+ * @HB_OT_MATH_CONSTANT_AXIS_HEIGHT: axisHeight
+ * @HB_OT_MATH_CONSTANT_ACCENT_BASE_HEIGHT: accentBaseHeight
+ * @HB_OT_MATH_CONSTANT_FLATTENED_ACCENT_BASE_HEIGHT: flattenedAccentBaseHeight
+ * @HB_OT_MATH_CONSTANT_SUBSCRIPT_SHIFT_DOWN: subscriptShiftDown
+ * @HB_OT_MATH_CONSTANT_SUBSCRIPT_TOP_MAX: subscriptTopMax
+ * @HB_OT_MATH_CONSTANT_SUBSCRIPT_BASELINE_DROP_MIN: subscriptBaselineDropMin
+ * @HB_OT_MATH_CONSTANT_SUPERSCRIPT_SHIFT_UP: superscriptShiftUp
+ * @HB_OT_MATH_CONSTANT_SUPERSCRIPT_SHIFT_UP_CRAMPED: superscriptShiftUpCramped
+ * @HB_OT_MATH_CONSTANT_SUPERSCRIPT_BOTTOM_MIN: superscriptBottomMin
+ * @HB_OT_MATH_CONSTANT_SUPERSCRIPT_BASELINE_DROP_MAX: superscriptBaselineDropMax
+ * @HB_OT_MATH_CONSTANT_SUB_SUPERSCRIPT_GAP_MIN: subSuperscriptGapMin
+ * @HB_OT_MATH_CONSTANT_SUPERSCRIPT_BOTTOM_MAX_WITH_SUBSCRIPT: superscriptBottomMaxWithSubscript
+ * @HB_OT_MATH_CONSTANT_SPACE_AFTER_SCRIPT: spaceAfterScript
+ * @HB_OT_MATH_CONSTANT_UPPER_LIMIT_GAP_MIN: upperLimitGapMin
+ * @HB_OT_MATH_CONSTANT_UPPER_LIMIT_BASELINE_RISE_MIN: upperLimitBaselineRiseMin
+ * @HB_OT_MATH_CONSTANT_LOWER_LIMIT_GAP_MIN: lowerLimitGapMin
+ * @HB_OT_MATH_CONSTANT_LOWER_LIMIT_BASELINE_DROP_MIN: lowerLimitBaselineDropMin
+ * @HB_OT_MATH_CONSTANT_STACK_TOP_SHIFT_UP: stackTopShiftUp
+ * @HB_OT_MATH_CONSTANT_STACK_TOP_DISPLAY_STYLE_SHIFT_UP: stackTopDisplayStyleShiftUp
+ * @HB_OT_MATH_CONSTANT_STACK_BOTTOM_SHIFT_DOWN: stackBottomShiftDown
+ * @HB_OT_MATH_CONSTANT_STACK_BOTTOM_DISPLAY_STYLE_SHIFT_DOWN: stackBottomDisplayStyleShiftDown
+ * @HB_OT_MATH_CONSTANT_STACK_GAP_MIN: stackGapMin
+ * @HB_OT_MATH_CONSTANT_STACK_DISPLAY_STYLE_GAP_MIN: stackDisplayStyleGapMin
+ * @HB_OT_MATH_CONSTANT_STRETCH_STACK_TOP_SHIFT_UP: stretchStackTopShiftUp
+ * @HB_OT_MATH_CONSTANT_STRETCH_STACK_BOTTOM_SHIFT_DOWN: stretchStackBottomShiftDown
+ * @HB_OT_MATH_CONSTANT_STRETCH_STACK_GAP_ABOVE_MIN: stretchStackGapAboveMin
+ * @HB_OT_MATH_CONSTANT_STRETCH_STACK_GAP_BELOW_MIN: stretchStackGapBelowMin
+ * @HB_OT_MATH_CONSTANT_FRACTION_NUMERATOR_SHIFT_UP: fractionNumeratorShiftUp
+ * @HB_OT_MATH_CONSTANT_FRACTION_NUMERATOR_DISPLAY_STYLE_SHIFT_UP: fractionNumeratorDisplayStyleShiftUp
+ * @HB_OT_MATH_CONSTANT_FRACTION_DENOMINATOR_SHIFT_DOWN: fractionDenominatorShiftDown
+ * @HB_OT_MATH_CONSTANT_FRACTION_DENOMINATOR_DISPLAY_STYLE_SHIFT_DOWN: fractionDenominatorDisplayStyleShiftDown
+ * @HB_OT_MATH_CONSTANT_FRACTION_NUMERATOR_GAP_MIN: fractionNumeratorGapMin
+ * @HB_OT_MATH_CONSTANT_FRACTION_NUM_DISPLAY_STYLE_GAP_MIN: fractionNumDisplayStyleGapMin
+ * @HB_OT_MATH_CONSTANT_FRACTION_RULE_THICKNESS: fractionRuleThickness
+ * @HB_OT_MATH_CONSTANT_FRACTION_DENOMINATOR_GAP_MIN: fractionDenominatorGapMin
+ * @HB_OT_MATH_CONSTANT_FRACTION_DENOM_DISPLAY_STYLE_GAP_MIN: fractionDenomDisplayStyleGapMin
+ * @HB_OT_MATH_CONSTANT_SKEWED_FRACTION_HORIZONTAL_GAP: skewedFractionHorizontalGap
+ * @HB_OT_MATH_CONSTANT_SKEWED_FRACTION_VERTICAL_GAP: skewedFractionVerticalGap
+ * @HB_OT_MATH_CONSTANT_OVERBAR_VERTICAL_GAP: overbarVerticalGap
+ * @HB_OT_MATH_CONSTANT_OVERBAR_RULE_THICKNESS: overbarRuleThickness
+ * @HB_OT_MATH_CONSTANT_OVERBAR_EXTRA_ASCENDER: overbarExtraAscender
+ * @HB_OT_MATH_CONSTANT_UNDERBAR_VERTICAL_GAP: underbarVerticalGap
+ * @HB_OT_MATH_CONSTANT_UNDERBAR_RULE_THICKNESS: underbarRuleThickness
+ * @HB_OT_MATH_CONSTANT_UNDERBAR_EXTRA_DESCENDER: underbarExtraDescender
+ * @HB_OT_MATH_CONSTANT_RADICAL_VERTICAL_GAP: radicalVerticalGap
+ * @HB_OT_MATH_CONSTANT_RADICAL_DISPLAY_STYLE_VERTICAL_GAP: radicalDisplayStyleVerticalGap
+ * @HB_OT_MATH_CONSTANT_RADICAL_RULE_THICKNESS: radicalRuleThickness
+ * @HB_OT_MATH_CONSTANT_RADICAL_EXTRA_ASCENDER: radicalExtraAscender
+ * @HB_OT_MATH_CONSTANT_RADICAL_KERN_BEFORE_DEGREE: radicalKernBeforeDegree
+ * @HB_OT_MATH_CONSTANT_RADICAL_KERN_AFTER_DEGREE: radicalKernAfterDegree
+ * @HB_OT_MATH_CONSTANT_RADICAL_DEGREE_BOTTOM_RAISE_PERCENT: radicalDegreeBottomRaisePercent
  *
- * The 'MATH' table constants specified at
- * https://docs.microsoft.com/en-us/typography/opentype/spec/math
+ * The 'MATH' table constants, refer to
+ * [OpenType documentation](https://docs.microsoft.com/en-us/typography/opentype/spec/math#mathconstants-table)
+ * For more explanations.
  *
  * Since: 1.3.3
  */
@@ -116,6 +187,10 @@
 
 /**
  * hb_ot_math_kern_t:
+ * @HB_OT_MATH_KERN_TOP_RIGHT: The top right corner of the glyph.
+ * @HB_OT_MATH_KERN_TOP_LEFT: The top left corner of the glyph.
+ * @HB_OT_MATH_KERN_BOTTOM_RIGHT: The bottom right corner of the glyph.
+ * @HB_OT_MATH_KERN_BOTTOM_LEFT: The bottom left corner of the glyph.
  *
  * The math kerning-table types defined for the four corners
  * of a glyph.
@@ -145,6 +220,8 @@
 
 /**
  * hb_ot_math_glyph_part_flags_t:
+ * @HB_OT_MATH_GLYPH_PART_FLAG_EXTENDER: This is an extender glyph part that
+ * can be repeated to reach the desired length.
  *
  * Flags for math glyph parts.
  *

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-meta.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-meta.cc	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-meta.cc	2021-04-17 22:31:16 UTC (rev 58898)
@@ -41,9 +41,11 @@
  * hb_ot_meta_get_entry_tags:
  * @face: a face object
  * @start_offset: iteration's start offset
- * @entries_count:(inout) (allow-none): buffer size as input, filled size as output
+ * @entries_count:(inout) (optional): buffer size as input, filled size as output
  * @entries: (out caller-allocates) (array length=entries_count): entries tags buffer
  *
+ * Fetches all available feature types.
+ *
  * Return value: Number of all available feature types.
  *
  * Since: 2.6.0

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-meta.h
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-meta.h	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-meta.h	2021-04-17 22:31:16 UTC (rev 58898)
@@ -22,7 +22,7 @@
  * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
  */
 
-#ifndef HB_OT_H_IN
+#if !defined(HB_OT_H_IN) && !defined(HB_NO_SINGLE_HEADER_ERROR)
 #error "Include <hb-ot.h> instead."
 #endif
 
@@ -54,6 +54,7 @@
   HB_OT_META_TAG_DESIGN_LANGUAGES	= HB_TAG ('d','l','n','g'),
   HB_OT_META_TAG_SUPPORTED_LANGUAGES	= HB_TAG ('s','l','n','g'),
 
+  /*< private >*/
   _HB_OT_META_TAG_MAX_VALUE = HB_TAG_MAX_SIGNED /*< skip >*/
 } hb_ot_meta_tag_t;
 

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-metrics.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-metrics.cc	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-metrics.cc	2021-04-17 22:31:16 UTC (rev 58898)
@@ -119,11 +119,11 @@
 
 /**
  * hb_ot_metrics_get_position:
- * @font: a #hb_font_t object.
+ * @font: an #hb_font_t object.
  * @metrics_tag: tag of metrics value you like to fetch.
  * @position: (out) (optional): result of metrics value from the font.
  *
- * It fetches metrics value corresponding to a given tag from a font.
+ * Fetches metrics value corresponding to @metrics_tag from @font.
  *
  * Returns: Whether found the requested metrics in the font.
  * Since: 2.6.0
@@ -193,11 +193,14 @@
 #ifndef HB_NO_VAR
 /**
  * hb_ot_metrics_get_variation:
- * @font:
- * @metrics_tag:
+ * @font: an #hb_font_t object.
+ * @metrics_tag: tag of metrics value you like to fetch.
  *
- * Returns:
+ * Fetches metrics value corresponding to @metrics_tag from @font with the
+ * current font variation settings applied.
  *
+ * Returns: The requested metric value.
+ *
  * Since: 2.6.0
  **/
 float
@@ -208,11 +211,14 @@
 
 /**
  * hb_ot_metrics_get_x_variation:
- * @font:
- * @metrics_tag:
+ * @font: an #hb_font_t object.
+ * @metrics_tag: tag of metrics value you like to fetch.
  *
- * Returns:
+ * Fetches horizontal metrics value corresponding to @metrics_tag from @font
+ * with the current font variation settings applied.
  *
+ * Returns: The requested metric value.
+ *
  * Since: 2.6.0
  **/
 hb_position_t
@@ -223,11 +229,14 @@
 
 /**
  * hb_ot_metrics_get_y_variation:
- * @font:
- * @metrics_tag:
+ * @font: an #hb_font_t object.
+ * @metrics_tag: tag of metrics value you like to fetch.
  *
- * Returns:
+ * Fetches vertical metrics value corresponding to @metrics_tag from @font with
+ * the current font variation settings applied.
  *
+ * Returns: The requested metric value.
+ *
  * Since: 2.6.0
  **/
 hb_position_t

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-metrics.h
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-metrics.h	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-metrics.h	2021-04-17 22:31:16 UTC (rev 58898)
@@ -22,7 +22,7 @@
  * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
  */
 
-#ifndef HB_OT_H_IN
+#if !defined(HB_OT_H_IN) && !defined(HB_NO_SINGLE_HEADER_ERROR)
 #error "Include <hb-ot.h> instead."
 #endif
 
@@ -66,7 +66,8 @@
  * @HB_OT_METRICS_TAG_UNDERLINE_SIZE: underline size.
  * @HB_OT_METRICS_TAG_UNDERLINE_OFFSET: underline offset.
  *
- * From https://docs.microsoft.com/en-us/typography/opentype/spec/mvar#value-tags
+ * Metric tags corresponding to [MVAR Value
+ * Tags](https://docs.microsoft.com/en-us/typography/opentype/spec/mvar#value-tags)
  *
  * Since: 2.6.0
  **/
@@ -100,6 +101,7 @@
   HB_OT_METRICS_TAG_UNDERLINE_SIZE		= HB_TAG ('u','n','d','s'),
   HB_OT_METRICS_TAG_UNDERLINE_OFFSET		= HB_TAG ('u','n','d','o'),
 
+  /*< private >*/
   _HB_OT_METRICS_TAG_MAX_VALUE = HB_TAG_MAX_SIGNED /*< skip >*/
 } hb_ot_metrics_tag_t;
 

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-name.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-name.cc	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-name.cc	2021-04-17 22:31:16 UTC (rev 58898)
@@ -46,7 +46,7 @@
 /**
  * hb_ot_name_list_names:
  * @face: font face.
- * @num_entries: (out) (allow-none): number of returned entries.
+ * @num_entries: (out) (optional): number of returned entries.
  *
  * Enumerates all available name IDs and language combinations. Returned
  * array is owned by the @face and should not be modified.  It can be
@@ -150,7 +150,7 @@
  * @face: font face.
  * @name_id: OpenType name identifier to fetch.
  * @language: language to fetch the name for.
- * @text_size: (inout) (allow-none): input size of @text buffer, and output size of
+ * @text_size: (inout) (optional): input size of @text buffer, and output size of
  *                                   text written to buffer.
  * @text: (out caller-allocates) (array length=text_size): buffer to write fetched name into.
  *
@@ -177,7 +177,7 @@
  * @face: font face.
  * @name_id: OpenType name identifier to fetch.
  * @language: language to fetch the name for.
- * @text_size: (inout) (allow-none): input size of @text buffer, and output size of
+ * @text_size: (inout) (optional): input size of @text buffer, and output size of
  *                                   text written to buffer.
  * @text: (out caller-allocates) (array length=text_size): buffer to write fetched name into.
  *
@@ -203,7 +203,7 @@
  * @face: font face.
  * @name_id: OpenType name identifier to fetch.
  * @language: language to fetch the name for.
- * @text_size: (inout) (allow-none): input size of @text buffer, and output size of
+ * @text_size: (inout) (optional): input size of @text buffer, and output size of
  *                                   text written to buffer.
  * @text: (out caller-allocates) (array length=text_size): buffer to write fetched name into.
  *

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-name.h
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-name.h	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-name.h	2021-04-17 22:31:16 UTC (rev 58898)
@@ -22,7 +22,7 @@
  * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
  */
 
-#ifndef HB_OT_H_IN
+#if !defined(HB_OT_H_IN) && !defined(HB_NO_SINGLE_HEADER_ERROR)
 #error "Include <hb-ot.h> instead."
 #endif
 

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-os2-table.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-os2-table.hh	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-os2-table.hh	2021-04-17 22:31:16 UTC (rev 58898)
@@ -177,15 +177,14 @@
     if (!c->plan->glyphs_requested->is_empty ())
     {
       hb_map_t unicode_glyphid_map;
-      
+
       OT::cmap::accelerator_t cmap;
       cmap.init (c->plan->source);
       cmap.collect_mapping (&unicodes, &unicode_glyphid_map);
       cmap.fini ();
-      
-      if (c->plan->unicodes->is_empty ()) unicodes.clear ();
-      else hb_set_set (&unicodes, c->plan->unicodes);
-  
+
+      hb_set_set (&unicodes, c->plan->unicodes);
+
       + unicode_glyphid_map.iter ()
       | hb_filter (c->plan->glyphs_requested, hb_second)
       | hb_map (hb_first)

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-post-table.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-post-table.hh	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-post-table.hh	2021-04-17 22:31:16 UTC (rev 58898)
@@ -87,7 +87,6 @@
     if (unlikely (!post_prime)) return_trace (false);
 
     serialize (c->serializer);
-    if (c->serializer->in_error () || c->serializer->ran_out_of_room) return_trace (false);
 
     return_trace (true);
   }

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-arabic-win1256.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-arabic-win1256.hh	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-arabic-win1256.hh	2021-04-17 22:31:16 UTC (rev 58898)
@@ -142,7 +142,7 @@
 		OT_UARRAY(Name##Substitute, OT_LIST(ToGlyphs)) \
 	) \
 	OT_COVERAGE1(Name##Coverage, OT_LIST(FromGlyphs)) \
-	/* ASSERT_STATIC_EXPR_ZERO (len(FromGlyphs) == len(ToGlyphs)) */
+	/* static_assert_expr (len(FromGlyphs) == len(ToGlyphs)) */
 
 #define OT_SUBLOOKUP_LIGATURE_SUBST_FORMAT1(Name, FirstGlyphs, LigatureSetOffsets) \
 	OT_SUBLOOKUP(Name, 1, \
@@ -151,7 +151,7 @@
 		OT_UARRAY(Name##LigatureSetOffsetsArray, OT_LIST(LigatureSetOffsets)) \
 	) \
 	OT_COVERAGE1(Name##Coverage, OT_LIST(FirstGlyphs)) \
-	/* ASSERT_STATIC_EXPR_ZERO (len(FirstGlyphs) == len(LigatureSetOffsets)) */
+	/* static_assert_expr (len(FirstGlyphs) == len(LigatureSetOffsets)) */
 
 #define OT_LIGATURE_SET(Name, LigatureSetOffsets) \
 	OT_UARRAY(Name, OT_LIST(LigatureSetOffsets))

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-arabic.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-arabic.cc	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-arabic.cc	2021-04-17 22:31:16 UTC (rev 58898)
@@ -33,7 +33,7 @@
 
 
 /* buffer var allocations */
-#define arabic_shaping_action() complex_var_u8_0() /* arabic shaping action */
+#define arabic_shaping_action() complex_var_u8_auxiliary() /* arabic shaping action */
 
 #define HB_BUFFER_SCRATCH_FLAG_ARABIC_HAS_STCH HB_BUFFER_SCRATCH_FLAG_COMPLEX0
 

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-hangul.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-hangul.cc	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-hangul.cc	2021-04-17 22:31:16 UTC (rev 58898)
@@ -119,7 +119,7 @@
 #define isHangulTone(u) (hb_in_range<hb_codepoint_t> ((u), 0x302Eu, 0x302Fu))
 
 /* buffer var allocations */
-#define hangul_shaping_feature() complex_var_u8_0() /* hangul jamo shaping feature */
+#define hangul_shaping_feature() complex_var_u8_auxiliary() /* hangul jamo shaping feature */
 
 static bool
 is_zero_width_char (hb_font_t *font,
@@ -205,7 +205,7 @@
       {
 	/* Tone mark follows a valid syllable; move it in front, unless it's zero width. */
 	buffer->unsafe_to_break_from_outbuffer (start, buffer->idx);
-	buffer->next_glyph ();
+	if (unlikely (!buffer->next_glyph ())) break;
 	if (!is_zero_width_char (font, u))
 	{
 	  buffer->merge_out_clusters (start, end + 1);
@@ -218,23 +218,25 @@
       else
       {
 	/* No valid syllable as base for tone mark; try to insert dotted circle. */
-      if (!(buffer->flags & HB_BUFFER_FLAG_DO_NOT_INSERT_DOTTED_CIRCLE) &&
-	  font->has_glyph (0x25CCu))
+	if (!(buffer->flags & HB_BUFFER_FLAG_DO_NOT_INSERT_DOTTED_CIRCLE) &&
+	    font->has_glyph (0x25CCu))
 	{
 	  hb_codepoint_t chars[2];
-	  if (!is_zero_width_char (font, u)) {
+	  if (!is_zero_width_char (font, u))
+	  {
 	    chars[0] = u;
 	    chars[1] = 0x25CCu;
-	  } else {
+	  } else
+	  {
 	    chars[0] = 0x25CCu;
 	    chars[1] = u;
 	  }
-	  buffer->replace_glyphs (1, 2, chars);
+	  (void) buffer->replace_glyphs (1, 2, chars);
 	}
 	else
 	{
 	  /* No dotted circle available in the font; just leave tone mark untouched. */
-	  buffer->next_glyph ();
+	  (void) buffer->next_glyph ();
 	}
       }
       start = end = buffer->out_len;
@@ -271,9 +273,7 @@
 	  hb_codepoint_t s = SBase + (l - LBase) * NCount + (v - VBase) * TCount + tindex;
 	  if (font->has_glyph (s))
 	  {
-	    buffer->replace_glyphs (t ? 3 : 2, 1, &s);
-	    if (unlikely (!buffer->successful))
-	      return;
+	    (void) buffer->replace_glyphs (t ? 3 : 2, 1, &s);
 	    end = start + 1;
 	    continue;
 	  }
@@ -285,17 +285,19 @@
 	 * Set jamo features on the individual glyphs, and advance past them.
 	 */
 	buffer->cur().hangul_shaping_feature() = LJMO;
-	buffer->next_glyph ();
+	(void) buffer->next_glyph ();
 	buffer->cur().hangul_shaping_feature() = VJMO;
-	buffer->next_glyph ();
+	(void) buffer->next_glyph ();
 	if (t)
 	{
 	  buffer->cur().hangul_shaping_feature() = TJMO;
-	  buffer->next_glyph ();
+	  (void) buffer->next_glyph ();
 	  end = start + 3;
 	}
 	else
 	  end = start + 2;
+	if (unlikely (!buffer->successful))
+	  break;
 	if (buffer->cluster_level == HB_BUFFER_CLUSTER_LEVEL_MONOTONE_GRAPHEMES)
 	  buffer->merge_out_clusters (start, end);
 	continue;
@@ -321,9 +323,7 @@
 	hb_codepoint_t new_s = s + new_tindex;
 	if (font->has_glyph (new_s))
 	{
-	  buffer->replace_glyphs (2, 1, &new_s);
-	  if (unlikely (!buffer->successful))
-	    return;
+	  (void) buffer->replace_glyphs (2, 1, &new_s);
 	  end = start + 1;
 	  continue;
 	}
@@ -347,7 +347,7 @@
 	    (!tindex || font->has_glyph (decomposed[2])))
 	{
 	  unsigned int s_len = tindex ? 3 : 2;
-	  buffer->replace_glyphs (1, s_len, decomposed);
+	  (void) buffer->replace_glyphs (1, s_len, decomposed);
 
 	  /* If we decomposed an LV because of a non-combining T following,
 	   * we want to include this T in the syllable.
@@ -354,12 +354,11 @@
 	   */
 	  if (has_glyph && !tindex)
 	  {
-	    buffer->next_glyph ();
+	    (void) buffer->next_glyph ();
 	    s_len++;
 	  }
-
 	  if (unlikely (!buffer->successful))
-	    return;
+	    break;
 
 	  /* We decomposed S: apply jamo features to the individual glyphs
 	   * that are now in buffer->out_info.
@@ -383,10 +382,8 @@
 
       if (has_glyph)
       {
-	/* We didn't decompose the S, so just advance past it. */
+	/* We didn't decompose the S, so just advance past it and fall through. */
 	end = start + 1;
-	buffer->next_glyph ();
-	continue;
       }
     }
 
@@ -393,7 +390,7 @@
     /* Didn't find a recognizable syllable, so we leave end <= start;
      * this will prevent tone-mark reordering happening.
      */
-    buffer->next_glyph ();
+    (void) buffer->next_glyph ();
   }
   buffer->swap_buffers ();
 }

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-indic-machine.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-indic-machine.hh	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-indic-machine.hh	2021-04-17 22:31:16 UTC (rev 58898)
@@ -31,8 +31,37 @@
 
 #include "hb.hh"
 
+enum indic_syllable_type_t {
+  indic_consonant_syllable,
+  indic_vowel_syllable,
+  indic_standalone_cluster,
+  indic_symbol_cluster,
+  indic_broken_cluster,
+  indic_non_indic_cluster,
+};
 
-#line 36 "hb-ot-shape-complex-indic-machine.hh"
+
+#line 45 "hb-ot-shape-complex-indic-machine.hh"
+#define indic_syllable_machine_ex_A 10u
+#define indic_syllable_machine_ex_C 1u
+#define indic_syllable_machine_ex_CM 17u
+#define indic_syllable_machine_ex_CS 19u
+#define indic_syllable_machine_ex_DOTTEDCIRCLE 12u
+#define indic_syllable_machine_ex_H 4u
+#define indic_syllable_machine_ex_M 7u
+#define indic_syllable_machine_ex_N 3u
+#define indic_syllable_machine_ex_PLACEHOLDER 11u
+#define indic_syllable_machine_ex_RS 13u
+#define indic_syllable_machine_ex_Ra 16u
+#define indic_syllable_machine_ex_Repha 15u
+#define indic_syllable_machine_ex_SM 8u
+#define indic_syllable_machine_ex_Symbol 18u
+#define indic_syllable_machine_ex_V 2u
+#define indic_syllable_machine_ex_ZWJ 6u
+#define indic_syllable_machine_ex_ZWNJ 5u
+
+
+#line 65 "hb-ot-shape-complex-indic-machine.hh"
 static const unsigned char _indic_syllable_machine_trans_keys[] = {
 	8u, 8u, 4u, 8u, 5u, 7u, 5u, 8u, 4u, 8u, 6u, 6u, 16u, 16u, 4u, 8u, 
 	4u, 13u, 4u, 8u, 8u, 8u, 5u, 7u, 5u, 8u, 4u, 8u, 6u, 6u, 16u, 16u, 
@@ -384,11 +413,11 @@
 static const int indic_syllable_machine_en_main = 39;
 
 
-#line 36 "hb-ot-shape-complex-indic-machine.rl"
+#line 46 "hb-ot-shape-complex-indic-machine.rl"
 
 
 
-#line 93 "hb-ot-shape-complex-indic-machine.rl"
+#line 102 "hb-ot-shape-complex-indic-machine.rl"
 
 
 #define found_syllable(syllable_type) \
@@ -395,7 +424,7 @@
   HB_STMT_START { \
     if (0) fprintf (stderr, "syllable %d..%d %s\n", ts, te, #syllable_type); \
     for (unsigned int i = ts; i < te; i++) \
-      info[i].syllable() = (syllable_serial << 4) | indic_##syllable_type; \
+      info[i].syllable() = (syllable_serial << 4) | syllable_type; \
     syllable_serial++; \
     if (unlikely (syllable_serial == 16)) syllable_serial = 1; \
   } HB_STMT_END
@@ -407,7 +436,7 @@
   int cs;
   hb_glyph_info_t *info = buffer->info;
   
-#line 411 "hb-ot-shape-complex-indic-machine.hh"
+#line 440 "hb-ot-shape-complex-indic-machine.hh"
 	{
 	cs = indic_syllable_machine_start;
 	ts = 0;
@@ -415,7 +444,7 @@
 	act = 0;
 	}
 
-#line 113 "hb-ot-shape-complex-indic-machine.rl"
+#line 122 "hb-ot-shape-complex-indic-machine.rl"
 
 
   p = 0;
@@ -423,7 +452,7 @@
 
   unsigned int syllable_serial = 1;
   
-#line 427 "hb-ot-shape-complex-indic-machine.hh"
+#line 456 "hb-ot-shape-complex-indic-machine.hh"
 	{
 	int _slen;
 	int _trans;
@@ -437,7 +466,7 @@
 #line 1 "NONE"
 	{ts = p;}
 	break;
-#line 441 "hb-ot-shape-complex-indic-machine.hh"
+#line 470 "hb-ot-shape-complex-indic-machine.hh"
 	}
 
 	_keys = _indic_syllable_machine_trans_keys + (cs<<1);
@@ -460,64 +489,64 @@
 	{te = p+1;}
 	break;
 	case 11:
-#line 89 "hb-ot-shape-complex-indic-machine.rl"
-	{te = p+1;{ found_syllable (non_indic_cluster); }}
+#line 98 "hb-ot-shape-complex-indic-machine.rl"
+	{te = p+1;{ found_syllable (indic_non_indic_cluster); }}
 	break;
 	case 13:
-#line 84 "hb-ot-shape-complex-indic-machine.rl"
-	{te = p;p--;{ found_syllable (consonant_syllable); }}
+#line 93 "hb-ot-shape-complex-indic-machine.rl"
+	{te = p;p--;{ found_syllable (indic_consonant_syllable); }}
 	break;
 	case 14:
-#line 85 "hb-ot-shape-complex-indic-machine.rl"
-	{te = p;p--;{ found_syllable (vowel_syllable); }}
+#line 94 "hb-ot-shape-complex-indic-machine.rl"
+	{te = p;p--;{ found_syllable (indic_vowel_syllable); }}
 	break;
 	case 17:
-#line 86 "hb-ot-shape-complex-indic-machine.rl"
-	{te = p;p--;{ found_syllable (standalone_cluster); }}
+#line 95 "hb-ot-shape-complex-indic-machine.rl"
+	{te = p;p--;{ found_syllable (indic_standalone_cluster); }}
 	break;
 	case 19:
-#line 87 "hb-ot-shape-complex-indic-machine.rl"
-	{te = p;p--;{ found_syllable (symbol_cluster); }}
+#line 96 "hb-ot-shape-complex-indic-machine.rl"
+	{te = p;p--;{ found_syllable (indic_symbol_cluster); }}
 	break;
 	case 15:
-#line 88 "hb-ot-shape-complex-indic-machine.rl"
-	{te = p;p--;{ found_syllable (broken_cluster); }}
+#line 97 "hb-ot-shape-complex-indic-machine.rl"
+	{te = p;p--;{ found_syllable (indic_broken_cluster); }}
 	break;
 	case 16:
-#line 89 "hb-ot-shape-complex-indic-machine.rl"
-	{te = p;p--;{ found_syllable (non_indic_cluster); }}
+#line 98 "hb-ot-shape-complex-indic-machine.rl"
+	{te = p;p--;{ found_syllable (indic_non_indic_cluster); }}
 	break;
 	case 1:
-#line 84 "hb-ot-shape-complex-indic-machine.rl"
-	{{p = ((te))-1;}{ found_syllable (consonant_syllable); }}
+#line 93 "hb-ot-shape-complex-indic-machine.rl"
+	{{p = ((te))-1;}{ found_syllable (indic_consonant_syllable); }}
 	break;
 	case 3:
-#line 85 "hb-ot-shape-complex-indic-machine.rl"
-	{{p = ((te))-1;}{ found_syllable (vowel_syllable); }}
+#line 94 "hb-ot-shape-complex-indic-machine.rl"
+	{{p = ((te))-1;}{ found_syllable (indic_vowel_syllable); }}
 	break;
 	case 7:
-#line 86 "hb-ot-shape-complex-indic-machine.rl"
-	{{p = ((te))-1;}{ found_syllable (standalone_cluster); }}
+#line 95 "hb-ot-shape-complex-indic-machine.rl"
+	{{p = ((te))-1;}{ found_syllable (indic_standalone_cluster); }}
 	break;
 	case 8:
-#line 87 "hb-ot-shape-complex-indic-machine.rl"
-	{{p = ((te))-1;}{ found_syllable (symbol_cluster); }}
+#line 96 "hb-ot-shape-complex-indic-machine.rl"
+	{{p = ((te))-1;}{ found_syllable (indic_symbol_cluster); }}
 	break;
 	case 4:
-#line 88 "hb-ot-shape-complex-indic-machine.rl"
-	{{p = ((te))-1;}{ found_syllable (broken_cluster); }}
+#line 97 "hb-ot-shape-complex-indic-machine.rl"
+	{{p = ((te))-1;}{ found_syllable (indic_broken_cluster); }}
 	break;
 	case 6:
 #line 1 "NONE"
 	{	switch( act ) {
 	case 1:
-	{{p = ((te))-1;} found_syllable (consonant_syllable); }
+	{{p = ((te))-1;} found_syllable (indic_consonant_syllable); }
 	break;
 	case 5:
-	{{p = ((te))-1;} found_syllable (broken_cluster); }
+	{{p = ((te))-1;} found_syllable (indic_broken_cluster); }
 	break;
 	case 6:
-	{{p = ((te))-1;} found_syllable (non_indic_cluster); }
+	{{p = ((te))-1;} found_syllable (indic_non_indic_cluster); }
 	break;
 	}
 	}
@@ -525,22 +554,22 @@
 	case 18:
 #line 1 "NONE"
 	{te = p+1;}
-#line 84 "hb-ot-shape-complex-indic-machine.rl"
+#line 93 "hb-ot-shape-complex-indic-machine.rl"
 	{act = 1;}
 	break;
 	case 5:
 #line 1 "NONE"
 	{te = p+1;}
-#line 88 "hb-ot-shape-complex-indic-machine.rl"
+#line 97 "hb-ot-shape-complex-indic-machine.rl"
 	{act = 5;}
 	break;
 	case 12:
 #line 1 "NONE"
 	{te = p+1;}
-#line 89 "hb-ot-shape-complex-indic-machine.rl"
+#line 98 "hb-ot-shape-complex-indic-machine.rl"
 	{act = 6;}
 	break;
-#line 544 "hb-ot-shape-complex-indic-machine.hh"
+#line 573 "hb-ot-shape-complex-indic-machine.hh"
 	}
 
 _again:
@@ -549,7 +578,7 @@
 #line 1 "NONE"
 	{ts = 0;}
 	break;
-#line 553 "hb-ot-shape-complex-indic-machine.hh"
+#line 582 "hb-ot-shape-complex-indic-machine.hh"
 	}
 
 	if ( ++p != pe )
@@ -565,7 +594,7 @@
 
 	}
 
-#line 121 "hb-ot-shape-complex-indic-machine.rl"
+#line 130 "hb-ot-shape-complex-indic-machine.rl"
 
 }
 

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-indic-machine.rl
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-indic-machine.rl	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-indic-machine.rl	2021-04-17 22:31:16 UTC (rev 58898)
@@ -29,32 +29,41 @@
 
 #include "hb.hh"
 
+enum indic_syllable_type_t {
+  indic_consonant_syllable,
+  indic_vowel_syllable,
+  indic_standalone_cluster,
+  indic_symbol_cluster,
+  indic_broken_cluster,
+  indic_non_indic_cluster,
+};
+
 %%{
   machine indic_syllable_machine;
   alphtype unsigned char;
+  write exports;
   write data;
 }%%
 
 %%{
 
-# Same order as enum indic_category_t.  Not sure how to avoid duplication.
-C    = 1;
-V    = 2;
-N    = 3;
-H    = 4;
-ZWNJ = 5;
-ZWJ  = 6;
-M    = 7;
-SM   = 8;
-A    = 10;
-PLACEHOLDER = 11;
-DOTTEDCIRCLE = 12;
-RS    = 13;
-Repha = 15;
-Ra    = 16;
-CM    = 17;
-Symbol= 18;
-CS    = 19;
+export C    = 1;
+export V    = 2;
+export N    = 3;
+export H    = 4;
+export ZWNJ = 5;
+export ZWJ  = 6;
+export M    = 7;
+export SM   = 8;
+export A    = 10;
+export PLACEHOLDER = 11;
+export DOTTEDCIRCLE = 12;
+export RS    = 13;
+export Repha = 15;
+export Ra    = 16;
+export CM    = 17;
+export Symbol= 18;
+export CS    = 19;
 
 c = (C | Ra);			# is_consonant
 n = ((ZWNJ?.RS)? (N.N?)?);	# is_consonant_modifier
@@ -81,12 +90,12 @@
 other =			any;
 
 main := |*
-	consonant_syllable	=> { found_syllable (consonant_syllable); };
-	vowel_syllable		=> { found_syllable (vowel_syllable); };
-	standalone_cluster	=> { found_syllable (standalone_cluster); };
-	symbol_cluster		=> { found_syllable (symbol_cluster); };
-	broken_cluster		=> { found_syllable (broken_cluster); };
-	other			=> { found_syllable (non_indic_cluster); };
+	consonant_syllable	=> { found_syllable (indic_consonant_syllable); };
+	vowel_syllable		=> { found_syllable (indic_vowel_syllable); };
+	standalone_cluster	=> { found_syllable (indic_standalone_cluster); };
+	symbol_cluster		=> { found_syllable (indic_symbol_cluster); };
+	broken_cluster		=> { found_syllable (indic_broken_cluster); };
+	other			=> { found_syllable (indic_non_indic_cluster); };
 *|;
 
 
@@ -96,7 +105,7 @@
   HB_STMT_START { \
     if (0) fprintf (stderr, "syllable %d..%d %s\n", ts, te, #syllable_type); \
     for (unsigned int i = ts; i < te; i++) \
-      info[i].syllable() = (syllable_serial << 4) | indic_##syllable_type; \
+      info[i].syllable() = (syllable_serial << 4) | syllable_type; \
     syllable_serial++; \
     if (unlikely (syllable_serial == 16)) syllable_serial = 1; \
   } HB_STMT_END

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-indic-table.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-indic-table.cc	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-indic-table.cc	2021-04-17 22:31:16 UTC (rev 58898)
@@ -82,7 +82,7 @@
 #define _(S,M) INDIC_COMBINE_CATEGORIES (ISC_##S, IMC_##M)
 
 
-static const INDIC_TABLE_ELEMENT_TYPE indic_table[] = {
+static const uint16_t indic_table[] = {
 
 
 #define indic_offset_0x0028u 0
@@ -404,7 +404,7 @@
 
 }; /* Table items: 1792; occupancy: 70% */
 
-INDIC_TABLE_ELEMENT_TYPE
+uint16_t
 hb_indic_get_categories (hb_codepoint_t u)
 {
   switch (u >> 12)

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-indic.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-indic.cc	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-indic.cc	2021-04-17 22:31:16 UTC (rev 58898)
@@ -29,6 +29,7 @@
 #ifndef HB_NO_OT_SHAPE
 
 #include "hb-ot-shape-complex-indic.hh"
+#include "hb-ot-shape-complex-indic-machine.hh"
 #include "hb-ot-shape-complex-vowel-constraints.hh"
 #include "hb-ot-layout.hh"
 
@@ -337,19 +338,6 @@
   return POS_BASE_C;
 }
 
-
-enum indic_syllable_type_t {
-  indic_consonant_syllable,
-  indic_vowel_syllable,
-  indic_standalone_cluster,
-  indic_symbol_cluster,
-  indic_broken_cluster,
-  indic_non_indic_cluster,
-};
-
-#include "hb-ot-shape-complex-indic-machine.hh"
-
-
 static void
 setup_masks_indic (const hb_ot_shape_plan_t *plan HB_UNUSED,
 		   hb_buffer_t              *buffer,
@@ -764,7 +752,28 @@
      * We could use buffer->sort() for this, if there was no special
      * reordering of pre-base stuff happening later...
      * We don't want to merge_clusters all of that, which buffer->sort()
-     * would.
+     * would.  Here's a concrete example:
+     *
+     * Assume there's a pre-base consonant and explicit Halant before base,
+     * followed by a prebase-reordering (left) Matra:
+     *
+     *   C,H,ZWNJ,B,M
+     *
+     * At this point in reordering we would have:
+     *
+     *   M,C,H,ZWNJ,B
+     *
+     * whereas in final reordering we will bring the Matra closer to Base:
+     *
+     *   C,H,ZWNJ,M,B
+     *
+     * That's why we don't want to merge-clusters anything before the Base
+     * at this point.  But if something moved from after Base to before it,
+     * we should merge clusters from base to them.  In final-reordering, we
+     * only move things around before base, and merge-clusters up to base.
+     * These two merge-clusters from the two sides of base will interlock
+     * to merge things correctly.  See:
+     * https://github.com/harfbuzz/harfbuzz/issues/2272
      */
     if (indic_plan->is_old_spec || end - start > 127)
       buffer->merge_clusters (base, end);
@@ -774,17 +783,18 @@
       for (unsigned int i = base; i < end; i++)
 	if (info[i].syllable() != 255)
 	{
+	  unsigned int min = i;
 	  unsigned int max = i;
 	  unsigned int j = start + info[i].syllable();
 	  while (j != i)
 	  {
+	    min = hb_min (min, j);
 	    max = hb_max (max, j);
 	    unsigned int next = start + info[j].syllable();
 	    info[j].syllable() = 255; /* So we don't process j later again. */
 	    j = next;
 	  }
-	  if (i != max)
-	    buffer->merge_clusters (i, max + 1);
+	  buffer->merge_clusters (hb_max (base, min), max + 1);
 	}
     }
 
@@ -938,69 +948,6 @@
   }
 }
 
-static inline void
-insert_dotted_circles_indic (const hb_ot_shape_plan_t *plan HB_UNUSED,
-			     hb_font_t *font,
-			     hb_buffer_t *buffer)
-{
-  if (unlikely (buffer->flags & HB_BUFFER_FLAG_DO_NOT_INSERT_DOTTED_CIRCLE))
-    return;
-
-  /* Note: This loop is extra overhead, but should not be measurable.
-   * TODO Use a buffer scratch flag to remove the loop. */
-  bool has_broken_syllables = false;
-  unsigned int count = buffer->len;
-  hb_glyph_info_t *info = buffer->info;
-  for (unsigned int i = 0; i < count; i++)
-    if ((info[i].syllable() & 0x0F) == indic_broken_cluster)
-    {
-      has_broken_syllables = true;
-      break;
-    }
-  if (likely (!has_broken_syllables))
-    return;
-
-
-  hb_codepoint_t dottedcircle_glyph;
-  if (!font->get_nominal_glyph (0x25CCu, &dottedcircle_glyph))
-    return;
-
-  hb_glyph_info_t dottedcircle = {0};
-  dottedcircle.codepoint = 0x25CCu;
-  set_indic_properties (dottedcircle);
-  dottedcircle.codepoint = dottedcircle_glyph;
-
-  buffer->clear_output ();
-
-  buffer->idx = 0;
-  unsigned int last_syllable = 0;
-  while (buffer->idx < buffer->len && buffer->successful)
-  {
-    unsigned int syllable = buffer->cur().syllable();
-    indic_syllable_type_t syllable_type = (indic_syllable_type_t) (syllable & 0x0F);
-    if (unlikely (last_syllable != syllable && syllable_type == indic_broken_cluster))
-    {
-      last_syllable = syllable;
-
-      hb_glyph_info_t ginfo = dottedcircle;
-      ginfo.cluster = buffer->cur().cluster;
-      ginfo.mask = buffer->cur().mask;
-      ginfo.syllable() = buffer->cur().syllable();
-
-      /* Insert dottedcircle after possible Repha. */
-      while (buffer->idx < buffer->len && buffer->successful &&
-	     last_syllable == buffer->cur().syllable() &&
-	     buffer->cur().indic_category() == OT_Repha)
-	buffer->next_glyph ();
-
-      buffer->output_info (ginfo);
-    }
-    else
-      buffer->next_glyph ();
-  }
-  buffer->swap_buffers ();
-}
-
 static void
 initial_reordering_indic (const hb_ot_shape_plan_t *plan,
 			  hb_font_t *font,
@@ -1008,11 +955,16 @@
 {
   if (!buffer->message (font, "start reordering indic initial"))
     return;
+
   update_consonant_positions_indic (plan, font, buffer);
-  insert_dotted_circles_indic (plan, font, buffer);
+  hb_syllabic_insert_dotted_circles (font, buffer,
+				     indic_broken_cluster,
+				     OT_DOTTEDCIRCLE,
+				     OT_Repha);
 
   foreach_syllable (buffer, start, end)
     initial_reordering_syllable_indic (plan, font->face, buffer, start, end);
+
   (void) buffer->message (font, "end reordering indic initial");
 }
 

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-indic.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-indic.hh	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-indic.hh	2021-04-17 22:31:16 UTC (rev 58898)
@@ -29,16 +29,14 @@
 
 #include "hb.hh"
 
-#include "hb-ot-shape-complex.hh"
+#include "hb-ot-shape-complex-syllabic.hh"
 
 
 /* buffer var allocations */
-#define indic_category() complex_var_u8_0() /* indic_category_t */
-#define indic_position() complex_var_u8_1() /* indic_position_t */
+#define indic_category() complex_var_u8_category() /* indic_category_t */
+#define indic_position() complex_var_u8_auxiliary() /* indic_position_t */
 
 
-#define INDIC_TABLE_ELEMENT_TYPE uint16_t
-
 /* Cateories used in the OpenType spec:
  * https://docs.microsoft.com/en-us/typography/script-development/devanagari
  */
@@ -177,7 +175,7 @@
 
 #define INDIC_COMBINE_CATEGORIES(S,M) \
   ( \
-    ASSERT_STATIC_EXPR_ZERO (S < 255 && M < 255) + \
+    static_assert_expr (S < 255 && M < 255) + \
     ( S | \
      ( \
       ( \
@@ -194,7 +192,7 @@
     ) \
    )
 
-HB_INTERNAL INDIC_TABLE_ELEMENT_TYPE
+HB_INTERNAL uint16_t
 hb_indic_get_categories (hb_codepoint_t u);
 
 
@@ -307,17 +305,12 @@
   0x0D30u, /* Malayalam */	/* No Reph, Logical Repha */
 
   0x0DBBu, /* Sinhala */	/* Reph formed only with ZWJ */
-
-  0x179Au, /* Khmer */
 };
 
 static inline bool
 is_ra (hb_codepoint_t u)
 {
-  for (unsigned int i = 0; i < ARRAY_LENGTH (ra_chars); i++)
-    if (u == ra_chars[i])
-      return true;
-  return false;
+  return hb_array (ra_chars).lfind (u);
 }
 
 static inline void
@@ -325,7 +318,7 @@
 {
   hb_codepoint_t u = info.codepoint;
   unsigned int type = hb_indic_get_categories (u);
-  indic_category_t cat = (indic_category_t) (type & 0x7Fu);
+  indic_category_t cat = (indic_category_t) (type & 0xFFu);
   indic_position_t pos = (indic_position_t) (type >> 8);
 
 
@@ -370,6 +363,7 @@
   else if (unlikely (u == 0x1133Bu || u == 0x1133Cu)) cat = OT_N;
 
   else if (unlikely (u == 0x0AFBu)) cat = OT_N; /* https://github.com/harfbuzz/harfbuzz/issues/552 */
+  else if (unlikely (u == 0x0B55u)) cat = OT_N; /* https://github.com/harfbuzz/harfbuzz/issues/2849 */
 
   else if (unlikely (u == 0x0980u)) cat = OT_PLACEHOLDER; /* https://github.com/harfbuzz/harfbuzz/issues/538 */
   else if (unlikely (u == 0x09FCu)) cat = OT_PLACEHOLDER; /* https://github.com/harfbuzz/harfbuzz/pull/1613 */

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-khmer-machine.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-khmer-machine.hh	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-khmer-machine.hh	2021-04-17 22:31:16 UTC (rev 58898)
@@ -1,30 +1,29 @@
-
 #line 1 "hb-ot-shape-complex-khmer-machine.rl"
 /*
- * Copyright © 2011,2012  Google, Inc.
- *
- *  This is part of HarfBuzz, a text shaping library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- *
- * Google Author(s): Behdad Esfahbod
- */
+* Copyright © 2011,2012  Google, Inc.
+*
+*  This is part of HarfBuzz, a text shaping library.
+*
+* Permission is hereby granted, without written agreement and without
+* license or royalty fees, to use, copy, modify, and distribute this
+* software and its documentation for any purpose, provided that the
+* above copyright notice and the following two paragraphs appear in
+* all copies of this software.
+*
+* IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+* DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+* ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+* IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+* DAMAGE.
+*
+* THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+* BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+* FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
+* ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+* PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+*
+* Google Author(s): Behdad Esfahbod
+*/
 
 #ifndef HB_OT_SHAPE_COMPLEX_KHMER_MACHINE_HH
 #define HB_OT_SHAPE_COMPLEX_KHMER_MACHINE_HH
@@ -31,183 +30,152 @@
 
 #include "hb.hh"
 
+enum khmer_syllable_type_t {
+	khmer_consonant_syllable,
+	khmer_broken_cluster,
+	khmer_non_khmer_cluster,
+};
 
-#line 36 "hb-ot-shape-complex-khmer-machine.hh"
+
+#line 41 "hb-ot-shape-complex-khmer-machine.hh"
+#define khmer_syllable_machine_ex_C 1u
+#define khmer_syllable_machine_ex_Coeng 14u
+#define khmer_syllable_machine_ex_DOTTEDCIRCLE 12u
+#define khmer_syllable_machine_ex_PLACEHOLDER 11u
+#define khmer_syllable_machine_ex_Ra 16u
+#define khmer_syllable_machine_ex_Robatic 20u
+#define khmer_syllable_machine_ex_V 2u
+#define khmer_syllable_machine_ex_VAbv 26u
+#define khmer_syllable_machine_ex_VBlw 27u
+#define khmer_syllable_machine_ex_VPre 28u
+#define khmer_syllable_machine_ex_VPst 29u
+#define khmer_syllable_machine_ex_Xgroup 21u
+#define khmer_syllable_machine_ex_Ygroup 22u
+#define khmer_syllable_machine_ex_ZWJ 6u
+#define khmer_syllable_machine_ex_ZWNJ 5u
+
+
+#line 59 "hb-ot-shape-complex-khmer-machine.hh"
 static const unsigned char _khmer_syllable_machine_trans_keys[] = {
-	5u, 26u, 5u, 21u, 5u, 26u, 5u, 21u, 1u, 16u, 5u, 21u, 5u, 26u, 5u, 21u, 
-	5u, 26u, 5u, 21u, 5u, 21u, 5u, 26u, 5u, 21u, 1u, 16u, 5u, 21u, 5u, 26u, 
-	5u, 21u, 5u, 26u, 5u, 21u, 5u, 26u, 1u, 29u, 5u, 29u, 5u, 29u, 5u, 29u, 
-	22u, 22u, 5u, 22u, 5u, 29u, 5u, 29u, 5u, 29u, 1u, 16u, 5u, 26u, 5u, 29u, 
-	5u, 29u, 22u, 22u, 5u, 22u, 5u, 29u, 5u, 29u, 1u, 16u, 5u, 29u, 5u, 29u, 
-	0
+	2u, 8u, 2u, 6u, 2u, 8u, 2u, 6u,
+	0u, 0u, 2u, 6u, 2u, 8u, 2u, 6u,
+	2u, 8u, 2u, 6u, 2u, 6u, 2u, 8u,
+	2u, 6u, 0u, 0u, 2u, 6u, 2u, 8u,
+	2u, 6u, 2u, 8u, 2u, 6u, 2u, 8u,
+	0u, 11u, 2u, 11u, 2u, 11u, 2u, 11u,
+	7u, 7u, 2u, 7u, 2u, 11u, 2u, 11u,
+	2u, 11u, 0u, 0u, 2u, 8u, 2u, 11u,
+	2u, 11u, 7u, 7u, 2u, 7u, 2u, 11u,
+	2u, 11u, 0u, 0u, 2u, 11u, 2u, 11u,
+	0u
 };
 
-static const char _khmer_syllable_machine_key_spans[] = {
-	22, 17, 22, 17, 16, 17, 22, 17, 
-	22, 17, 17, 22, 17, 16, 17, 22, 
-	17, 22, 17, 22, 29, 25, 25, 25, 
-	1, 18, 25, 25, 25, 16, 22, 25, 
-	25, 1, 18, 25, 25, 16, 25, 25
+static const signed char _khmer_syllable_machine_char_class[] = {
+	0, 0, 1, 1, 2, 2, 1, 1,
+	1, 1, 3, 3, 1, 4, 1, 0,
+	1, 1, 1, 5, 6, 7, 1, 1,
+	1, 8, 9, 10, 11, 0
 };
 
 static const short _khmer_syllable_machine_index_offsets[] = {
-	0, 23, 41, 64, 82, 99, 117, 140, 
-	158, 181, 199, 217, 240, 258, 275, 293, 
-	316, 334, 357, 375, 398, 428, 454, 480, 
-	506, 508, 527, 553, 579, 605, 622, 645, 
-	671, 697, 699, 718, 744, 770, 787, 813
+	0, 7, 12, 19, 24, 25, 30, 37,
+	42, 49, 54, 59, 66, 71, 72, 77,
+	84, 89, 96, 101, 108, 120, 130, 140,
+	150, 151, 157, 167, 177, 187, 188, 195,
+	205, 215, 216, 222, 232, 242, 243, 253,
+	0
 };
 
-static const char _khmer_syllable_machine_indicies[] = {
-	1, 1, 0, 0, 0, 0, 0, 0, 
-	0, 0, 0, 0, 0, 0, 0, 2, 
-	3, 0, 0, 0, 0, 4, 0, 1, 
-	1, 0, 0, 0, 0, 0, 0, 0, 
-	0, 0, 0, 0, 0, 0, 0, 3, 
-	0, 1, 1, 0, 0, 0, 0, 0, 
-	0, 0, 0, 0, 0, 0, 0, 0, 
-	0, 3, 0, 0, 0, 0, 4, 0, 
-	5, 5, 0, 0, 0, 0, 0, 0, 
-	0, 0, 0, 0, 0, 0, 0, 0, 
-	4, 0, 6, 6, 0, 0, 0, 0, 
-	0, 0, 0, 0, 0, 0, 0, 0, 
-	0, 6, 0, 7, 7, 0, 0, 0, 
-	0, 0, 0, 0, 0, 0, 0, 0, 
-	0, 0, 0, 8, 0, 9, 9, 0, 
-	0, 0, 0, 0, 0, 0, 0, 0, 
-	0, 0, 0, 0, 0, 10, 0, 0, 
-	0, 0, 4, 0, 9, 9, 0, 0, 
-	0, 0, 0, 0, 0, 0, 0, 0, 
-	0, 0, 0, 0, 10, 0, 11, 11, 
-	0, 0, 0, 0, 0, 0, 0, 0, 
-	0, 0, 0, 0, 0, 0, 12, 0, 
-	0, 0, 0, 4, 0, 11, 11, 0, 
-	0, 0, 0, 0, 0, 0, 0, 0, 
-	0, 0, 0, 0, 0, 12, 0, 14, 
-	14, 13, 13, 13, 13, 13, 13, 13, 
-	13, 13, 13, 13, 13, 13, 13, 15, 
-	13, 14, 14, 16, 16, 16, 16, 16, 
-	16, 16, 16, 16, 16, 16, 16, 16, 
-	16, 15, 16, 16, 16, 16, 17, 16, 
-	18, 18, 16, 16, 16, 16, 16, 16, 
-	16, 16, 16, 16, 16, 16, 16, 16, 
-	17, 16, 19, 19, 16, 16, 16, 16, 
-	16, 16, 16, 16, 16, 16, 16, 16, 
-	16, 19, 16, 20, 20, 16, 16, 16, 
-	16, 16, 16, 16, 16, 16, 16, 16, 
-	16, 16, 16, 21, 16, 22, 22, 16, 
-	16, 16, 16, 16, 16, 16, 16, 16, 
-	16, 16, 16, 16, 16, 23, 16, 16, 
-	16, 16, 17, 16, 22, 22, 16, 16, 
-	16, 16, 16, 16, 16, 16, 16, 16, 
-	16, 16, 16, 16, 23, 16, 24, 24, 
-	16, 16, 16, 16, 16, 16, 16, 16, 
-	16, 16, 16, 16, 16, 16, 25, 16, 
-	16, 16, 16, 17, 16, 24, 24, 16, 
-	16, 16, 16, 16, 16, 16, 16, 16, 
-	16, 16, 16, 16, 16, 25, 16, 14, 
-	14, 16, 16, 16, 16, 16, 16, 16, 
-	16, 16, 16, 16, 16, 16, 26, 15, 
-	16, 16, 16, 16, 17, 16, 28, 28, 
-	27, 27, 29, 29, 27, 27, 27, 27, 
-	2, 2, 27, 30, 27, 28, 27, 27, 
-	27, 27, 15, 19, 27, 27, 27, 17, 
-	23, 25, 21, 27, 32, 32, 31, 31, 
-	31, 31, 31, 31, 31, 33, 31, 31, 
-	31, 31, 31, 2, 3, 6, 31, 31, 
-	31, 4, 10, 12, 8, 31, 34, 34, 
-	31, 31, 31, 31, 31, 31, 31, 35, 
-	31, 31, 31, 31, 31, 31, 3, 6, 
-	31, 31, 31, 4, 10, 12, 8, 31, 
-	5, 5, 31, 31, 31, 31, 31, 31, 
-	31, 35, 31, 31, 31, 31, 31, 31, 
-	4, 6, 31, 31, 31, 31, 31, 31, 
-	8, 31, 6, 31, 7, 7, 31, 31, 
-	31, 31, 31, 31, 31, 35, 31, 31, 
-	31, 31, 31, 31, 8, 6, 31, 36, 
-	36, 31, 31, 31, 31, 31, 31, 31, 
-	35, 31, 31, 31, 31, 31, 31, 10, 
-	6, 31, 31, 31, 4, 31, 31, 8, 
-	31, 37, 37, 31, 31, 31, 31, 31, 
-	31, 31, 35, 31, 31, 31, 31, 31, 
-	31, 12, 6, 31, 31, 31, 4, 10, 
-	31, 8, 31, 34, 34, 31, 31, 31, 
-	31, 31, 31, 31, 33, 31, 31, 31, 
-	31, 31, 31, 3, 6, 31, 31, 31, 
-	4, 10, 12, 8, 31, 28, 28, 31, 
-	31, 31, 31, 31, 31, 31, 31, 31, 
-	31, 31, 31, 31, 28, 31, 14, 14, 
-	38, 38, 38, 38, 38, 38, 38, 38, 
-	38, 38, 38, 38, 38, 38, 15, 38, 
-	38, 38, 38, 17, 38, 40, 40, 39, 
-	39, 39, 39, 39, 39, 39, 41, 39, 
-	39, 39, 39, 39, 39, 15, 19, 39, 
-	39, 39, 17, 23, 25, 21, 39, 18, 
-	18, 39, 39, 39, 39, 39, 39, 39, 
-	41, 39, 39, 39, 39, 39, 39, 17, 
-	19, 39, 39, 39, 39, 39, 39, 21, 
-	39, 19, 39, 20, 20, 39, 39, 39, 
-	39, 39, 39, 39, 41, 39, 39, 39, 
-	39, 39, 39, 21, 19, 39, 42, 42, 
-	39, 39, 39, 39, 39, 39, 39, 41, 
-	39, 39, 39, 39, 39, 39, 23, 19, 
-	39, 39, 39, 17, 39, 39, 21, 39, 
-	43, 43, 39, 39, 39, 39, 39, 39, 
-	39, 41, 39, 39, 39, 39, 39, 39, 
-	25, 19, 39, 39, 39, 17, 23, 39, 
-	21, 39, 44, 44, 39, 39, 39, 39, 
-	39, 39, 39, 39, 39, 39, 39, 39, 
-	39, 44, 39, 45, 45, 39, 39, 39, 
-	39, 39, 39, 39, 30, 39, 39, 39, 
-	39, 39, 26, 15, 19, 39, 39, 39, 
-	17, 23, 25, 21, 39, 40, 40, 39, 
-	39, 39, 39, 39, 39, 39, 30, 39, 
-	39, 39, 39, 39, 39, 15, 19, 39, 
-	39, 39, 17, 23, 25, 21, 39, 0
+static const signed char _khmer_syllable_machine_indicies[] = {
+	1, 0, 0, 2, 3, 0, 4, 1,
+	0, 0, 0, 3, 1, 0, 0, 0,
+	3, 0, 4, 5, 0, 0, 0, 4,
+	6, 7, 0, 0, 0, 8, 9, 0,
+	0, 0, 10, 0, 4, 9, 0, 0,
+	0, 10, 11, 0, 0, 0, 12, 0,
+	4, 11, 0, 0, 0, 12, 14, 13,
+	13, 13, 15, 14, 16, 16, 16, 15,
+	16, 17, 18, 16, 16, 16, 17, 19,
+	20, 16, 16, 16, 21, 22, 16, 16,
+	16, 23, 16, 17, 22, 16, 16, 16,
+	23, 24, 16, 16, 16, 25, 16, 17,
+	24, 16, 16, 16, 25, 14, 16, 16,
+	26, 15, 16, 17, 29, 28, 30, 2,
+	31, 28, 15, 19, 17, 23, 25, 21,
+	33, 32, 34, 2, 3, 6, 4, 10,
+	12, 8, 35, 32, 36, 32, 3, 6,
+	4, 10, 12, 8, 5, 32, 36, 32,
+	4, 6, 32, 32, 32, 8, 6, 7,
+	32, 36, 32, 8, 6, 37, 32, 36,
+	32, 10, 6, 4, 32, 32, 8, 38,
+	32, 36, 32, 12, 6, 4, 10, 32,
+	8, 35, 32, 34, 32, 3, 6, 4,
+	10, 12, 8, 29, 14, 39, 39, 39,
+	15, 39, 17, 41, 40, 42, 40, 15,
+	19, 17, 23, 25, 21, 18, 40, 42,
+	40, 17, 19, 40, 40, 40, 21, 19,
+	20, 40, 42, 40, 21, 19, 43, 40,
+	42, 40, 23, 19, 17, 40, 40, 21,
+	44, 40, 42, 40, 25, 19, 17, 23,
+	40, 21, 45, 46, 40, 31, 26, 15,
+	19, 17, 23, 25, 21, 41, 40, 31,
+	40, 15, 19, 17, 23, 25, 21, 0
 };
 
-static const char _khmer_syllable_machine_trans_targs[] = {
-	20, 1, 28, 22, 23, 3, 24, 5, 
-	25, 7, 26, 9, 27, 20, 10, 31, 
-	20, 32, 12, 33, 14, 34, 16, 35, 
-	18, 36, 39, 20, 21, 30, 37, 20, 
-	0, 29, 2, 4, 6, 8, 20, 20, 
-	11, 13, 15, 17, 38, 19
+static const signed char _khmer_syllable_machine_index_defaults[] = {
+	0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 13, 16, 16, 16, 16, 16,
+	16, 16, 16, 16, 28, 32, 32, 32,
+	32, 32, 32, 32, 32, 32, 39, 40,
+	40, 40, 40, 40, 40, 40, 40, 40,
+	0
 };
 
-static const char _khmer_syllable_machine_trans_actions[] = {
-	1, 0, 2, 2, 2, 0, 0, 0, 
-	2, 0, 2, 0, 2, 3, 0, 4, 
-	5, 2, 0, 0, 0, 2, 0, 2, 
-	0, 2, 4, 8, 2, 9, 0, 10, 
-	0, 0, 0, 0, 0, 0, 11, 12, 
-	0, 0, 0, 0, 4, 0
+static const signed char _khmer_syllable_machine_cond_targs[] = {
+	20, 1, 28, 22, 23, 3, 24, 5,
+	25, 7, 26, 9, 27, 20, 10, 31,
+	20, 32, 12, 33, 14, 34, 16, 35,
+	18, 36, 39, 20, 20, 21, 30, 37,
+	20, 0, 29, 2, 4, 6, 8, 20,
+	20, 11, 13, 15, 17, 38, 19, 0
 };
 
-static const char _khmer_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, 6, 0, 0, 0, 
-	0, 0, 0, 0, 0, 0, 0, 0, 
-	0, 0, 0, 0, 0, 0, 0, 0
+static const signed char _khmer_syllable_machine_cond_actions[] = {
+	1, 0, 2, 2, 2, 0, 0, 0,
+	2, 0, 2, 0, 2, 3, 0, 4,
+	5, 2, 0, 0, 0, 2, 0, 2,
+	0, 2, 4, 0, 8, 2, 9, 0,
+	10, 0, 0, 0, 0, 0, 0, 11,
+	12, 0, 0, 0, 0, 4, 0, 0
 };
 
-static const char _khmer_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, 7, 0, 0, 0, 
-	0, 0, 0, 0, 0, 0, 0, 0, 
-	0, 0, 0, 0, 0, 0, 0, 0
+static const signed char _khmer_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, 6, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0,
+	0
 };
 
-static const unsigned char _khmer_syllable_machine_eof_trans[] = {
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 14, 17, 17, 17, 17, 17, 
-	17, 17, 17, 17, 0, 32, 32, 32, 
-	32, 32, 32, 32, 32, 32, 39, 40, 
-	40, 40, 40, 40, 40, 40, 40, 40
+static const signed char _khmer_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, 7, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0,
+	0
 };
 
+static const signed char _khmer_syllable_machine_eof_trans[] = {
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 14, 17, 17, 17, 17, 17,
+	17, 17, 17, 17, 28, 33, 33, 33,
+	33, 33, 33, 33, 33, 33, 40, 41,
+	41, 41, 41, 41, 41, 41, 41, 41,
+	0
+};
+
 static const int khmer_syllable_machine_start = 20;
 static const int khmer_syllable_machine_first_final = 20;
 static const int khmer_syllable_machine_error = -1;
@@ -215,156 +183,271 @@
 static const int khmer_syllable_machine_en_main = 20;
 
 
-#line 36 "hb-ot-shape-complex-khmer-machine.rl"
+#line 43 "hb-ot-shape-complex-khmer-machine.rl"
 
 
 
-#line 80 "hb-ot-shape-complex-khmer-machine.rl"
+#line 86 "hb-ot-shape-complex-khmer-machine.rl"
 
 
 #define found_syllable(syllable_type) \
-  HB_STMT_START { \
-    if (0) fprintf (stderr, "syllable %d..%d %s\n", ts, te, #syllable_type); \
-    for (unsigned int i = ts; i < te; i++) \
-      info[i].syllable() = (syllable_serial << 4) | khmer_##syllable_type; \
-    syllable_serial++; \
-    if (unlikely (syllable_serial == 16)) syllable_serial = 1; \
-  } HB_STMT_END
+HB_STMT_START { \
+	if (0) fprintf (stderr, "syllable %d..%d %s\n", ts, te, #syllable_type); \
+		for (unsigned int i = ts; i < te; i++) \
+	info[i].syllable() = (syllable_serial << 4) | syllable_type; \
+	syllable_serial++; \
+	if (unlikely (syllable_serial == 16)) syllable_serial = 1; \
+	} HB_STMT_END
 
 static void
 find_syllables_khmer (hb_buffer_t *buffer)
 {
-  unsigned int p, pe, eof, ts, te, act HB_UNUSED;
-  int cs;
-  hb_glyph_info_t *info = buffer->info;
-  
-#line 242 "hb-ot-shape-complex-khmer-machine.hh"
+	unsigned int p, pe, eof, ts, te, act HB_UNUSED;
+	int cs;
+	hb_glyph_info_t *info = buffer->info;
+	
+#line 210 "hb-ot-shape-complex-khmer-machine.hh"
 	{
-	cs = khmer_syllable_machine_start;
-	ts = 0;
-	te = 0;
-	act = 0;
+		cs = (int)khmer_syllable_machine_start;
+		ts = 0;
+		te = 0;
+		act = 0;
 	}
-
-#line 100 "hb-ot-shape-complex-khmer-machine.rl"
-
-
-  p = 0;
-  pe = eof = buffer->len;
-
-  unsigned int syllable_serial = 1;
-  
-#line 258 "hb-ot-shape-complex-khmer-machine.hh"
+	
+#line 106 "hb-ot-shape-complex-khmer-machine.rl"
+	
+	
+	p = 0;
+	pe = eof = buffer->len;
+	
+	unsigned int syllable_serial = 1;
+	
+#line 226 "hb-ot-shape-complex-khmer-machine.hh"
 	{
-	int _slen;
-	int _trans;
-	const unsigned char *_keys;
-	const char *_inds;
-	if ( p == pe )
-		goto _test_eof;
-_resume:
-	switch ( _khmer_syllable_machine_from_state_actions[cs] ) {
-	case 7:
+		unsigned int _trans = 0;
+		const unsigned char * _keys;
+		const signed char * _inds;
+		int _ic;
+		_resume: {}
+		if ( p == pe && p != eof )
+			goto _out;
+		switch ( _khmer_syllable_machine_from_state_actions[cs] ) {
+			case 7:  {
+				{
 #line 1 "NONE"
-	{ts = p;}
-	break;
-#line 272 "hb-ot-shape-complex-khmer-machine.hh"
-	}
-
-	_keys = _khmer_syllable_machine_trans_keys + (cs<<1);
-	_inds = _khmer_syllable_machine_indicies + _khmer_syllable_machine_index_offsets[cs];
-
-	_slen = _khmer_syllable_machine_key_spans[cs];
-	_trans = _inds[ _slen > 0 && _keys[0] <=( info[p].khmer_category()) &&
-		( info[p].khmer_category()) <= _keys[1] ?
-		( info[p].khmer_category()) - _keys[0] : _slen ];
-
-_eof_trans:
-	cs = _khmer_syllable_machine_trans_targs[_trans];
-
-	if ( _khmer_syllable_machine_trans_actions[_trans] == 0 )
-		goto _again;
-
-	switch ( _khmer_syllable_machine_trans_actions[_trans] ) {
-	case 2:
+					{ts = p;}}
+				
+#line 241 "hb-ot-shape-complex-khmer-machine.hh"
+				
+				
+				break; 
+			}
+		}
+		
+		if ( p == eof ) {
+			if ( _khmer_syllable_machine_eof_trans[cs] > 0 ) {
+				_trans = (unsigned int)_khmer_syllable_machine_eof_trans[cs] - 1;
+			}
+		}
+		else {
+			_keys = ( _khmer_syllable_machine_trans_keys + ((cs<<1)));
+			_inds = ( _khmer_syllable_machine_indicies + (_khmer_syllable_machine_index_offsets[cs]));
+			
+			if ( (info[p].khmer_category()) <= 29 && (info[p].khmer_category()) >= 1 ) {
+				_ic = (int)_khmer_syllable_machine_char_class[(int)(info[p].khmer_category()) - 1];
+				if ( _ic <= (int)(*( _keys+1)) && _ic >= (int)(*( _keys)) )
+					_trans = (unsigned int)(*( _inds + (int)( _ic - (int)(*( _keys)) ) )); 
+				else
+					_trans = (unsigned int)_khmer_syllable_machine_index_defaults[cs];
+			}
+			else {
+				_trans = (unsigned int)_khmer_syllable_machine_index_defaults[cs];
+			}
+			
+		}
+		cs = (int)_khmer_syllable_machine_cond_targs[_trans];
+		
+		if ( _khmer_syllable_machine_cond_actions[_trans] != 0 ) {
+			
+			switch ( _khmer_syllable_machine_cond_actions[_trans] ) {
+				case 2:  {
+					{
 #line 1 "NONE"
-	{te = p+1;}
-	break;
-	case 8:
-#line 76 "hb-ot-shape-complex-khmer-machine.rl"
-	{te = p+1;{ found_syllable (non_khmer_cluster); }}
-	break;
-	case 10:
-#line 74 "hb-ot-shape-complex-khmer-machine.rl"
-	{te = p;p--;{ found_syllable (consonant_syllable); }}
-	break;
-	case 12:
-#line 75 "hb-ot-shape-complex-khmer-machine.rl"
-	{te = p;p--;{ found_syllable (broken_cluster); }}
-	break;
-	case 11:
-#line 76 "hb-ot-shape-complex-khmer-machine.rl"
-	{te = p;p--;{ found_syllable (non_khmer_cluster); }}
-	break;
-	case 1:
-#line 74 "hb-ot-shape-complex-khmer-machine.rl"
-	{{p = ((te))-1;}{ found_syllable (consonant_syllable); }}
-	break;
-	case 5:
-#line 75 "hb-ot-shape-complex-khmer-machine.rl"
-	{{p = ((te))-1;}{ found_syllable (broken_cluster); }}
-	break;
-	case 3:
+						{te = p+1;}}
+					
+#line 279 "hb-ot-shape-complex-khmer-machine.hh"
+					
+					
+					break; 
+				}
+				case 8:  {
+					{
+#line 82 "hb-ot-shape-complex-khmer-machine.rl"
+						{te = p+1;{
+#line 82 "hb-ot-shape-complex-khmer-machine.rl"
+								found_syllable (khmer_non_khmer_cluster); }
+						}}
+					
+#line 292 "hb-ot-shape-complex-khmer-machine.hh"
+					
+					
+					break; 
+				}
+				case 10:  {
+					{
+#line 80 "hb-ot-shape-complex-khmer-machine.rl"
+						{te = p;p = p - 1;{
+#line 80 "hb-ot-shape-complex-khmer-machine.rl"
+								found_syllable (khmer_consonant_syllable); }
+						}}
+					
+#line 305 "hb-ot-shape-complex-khmer-machine.hh"
+					
+					
+					break; 
+				}
+				case 12:  {
+					{
+#line 81 "hb-ot-shape-complex-khmer-machine.rl"
+						{te = p;p = p - 1;{
+#line 81 "hb-ot-shape-complex-khmer-machine.rl"
+								found_syllable (khmer_broken_cluster); }
+						}}
+					
+#line 318 "hb-ot-shape-complex-khmer-machine.hh"
+					
+					
+					break; 
+				}
+				case 11:  {
+					{
+#line 82 "hb-ot-shape-complex-khmer-machine.rl"
+						{te = p;p = p - 1;{
+#line 82 "hb-ot-shape-complex-khmer-machine.rl"
+								found_syllable (khmer_non_khmer_cluster); }
+						}}
+					
+#line 331 "hb-ot-shape-complex-khmer-machine.hh"
+					
+					
+					break; 
+				}
+				case 1:  {
+					{
+#line 80 "hb-ot-shape-complex-khmer-machine.rl"
+						{p = ((te))-1;
+							{
+#line 80 "hb-ot-shape-complex-khmer-machine.rl"
+								found_syllable (khmer_consonant_syllable); }
+						}}
+					
+#line 345 "hb-ot-shape-complex-khmer-machine.hh"
+					
+					
+					break; 
+				}
+				case 5:  {
+					{
+#line 81 "hb-ot-shape-complex-khmer-machine.rl"
+						{p = ((te))-1;
+							{
+#line 81 "hb-ot-shape-complex-khmer-machine.rl"
+								found_syllable (khmer_broken_cluster); }
+						}}
+					
+#line 359 "hb-ot-shape-complex-khmer-machine.hh"
+					
+					
+					break; 
+				}
+				case 3:  {
+					{
 #line 1 "NONE"
-	{	switch( act ) {
-	case 2:
-	{{p = ((te))-1;} found_syllable (broken_cluster); }
-	break;
-	case 3:
-	{{p = ((te))-1;} found_syllable (non_khmer_cluster); }
-	break;
-	}
-	}
-	break;
-	case 4:
+						{switch( act ) {
+								case 2:  {
+									p = ((te))-1;
+									{
+#line 81 "hb-ot-shape-complex-khmer-machine.rl"
+										found_syllable (khmer_broken_cluster); }
+									break; 
+								}
+								case 3:  {
+									p = ((te))-1;
+									{
+#line 82 "hb-ot-shape-complex-khmer-machine.rl"
+										found_syllable (khmer_non_khmer_cluster); }
+									break; 
+								}
+							}}
+					}
+					
+#line 385 "hb-ot-shape-complex-khmer-machine.hh"
+					
+					
+					break; 
+				}
+				case 4:  {
+					{
 #line 1 "NONE"
-	{te = p+1;}
-#line 75 "hb-ot-shape-complex-khmer-machine.rl"
-	{act = 2;}
-	break;
-	case 9:
+						{te = p+1;}}
+					
+#line 395 "hb-ot-shape-complex-khmer-machine.hh"
+					
+					{
+#line 81 "hb-ot-shape-complex-khmer-machine.rl"
+						{act = 2;}}
+					
+#line 401 "hb-ot-shape-complex-khmer-machine.hh"
+					
+					
+					break; 
+				}
+				case 9:  {
+					{
 #line 1 "NONE"
-	{te = p+1;}
-#line 76 "hb-ot-shape-complex-khmer-machine.rl"
-	{act = 3;}
-	break;
-#line 342 "hb-ot-shape-complex-khmer-machine.hh"
-	}
-
-_again:
-	switch ( _khmer_syllable_machine_to_state_actions[cs] ) {
-	case 6:
+						{te = p+1;}}
+					
+#line 411 "hb-ot-shape-complex-khmer-machine.hh"
+					
+					{
+#line 82 "hb-ot-shape-complex-khmer-machine.rl"
+						{act = 3;}}
+					
+#line 417 "hb-ot-shape-complex-khmer-machine.hh"
+					
+					
+					break; 
+				}
+			}
+			
+		}
+		
+		if ( p == eof ) {
+			if ( cs >= 20 )
+				goto _out;
+		}
+		else {
+			switch ( _khmer_syllable_machine_to_state_actions[cs] ) {
+				case 6:  {
+					{
 #line 1 "NONE"
-	{ts = 0;}
-	break;
-#line 351 "hb-ot-shape-complex-khmer-machine.hh"
+						{ts = 0;}}
+					
+#line 437 "hb-ot-shape-complex-khmer-machine.hh"
+					
+					
+					break; 
+				}
+			}
+			
+			p += 1;
+			goto _resume;
+		}
+		_out: {}
 	}
-
-	if ( ++p != pe )
-		goto _resume;
-	_test_eof: {}
-	if ( p == eof )
-	{
-	if ( _khmer_syllable_machine_eof_trans[cs] > 0 ) {
-		_trans = _khmer_syllable_machine_eof_trans[cs] - 1;
-		goto _eof_trans;
-	}
-	}
-
-	}
-
-#line 108 "hb-ot-shape-complex-khmer-machine.rl"
-
+	
+#line 114 "hb-ot-shape-complex-khmer-machine.rl"
+	
 }
 
 #undef found_syllable

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-khmer-machine.rl
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-khmer-machine.rl	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-khmer-machine.rl	2021-04-17 22:31:16 UTC (rev 58898)
@@ -29,30 +29,36 @@
 
 #include "hb.hh"
 
+enum khmer_syllable_type_t {
+  khmer_consonant_syllable,
+  khmer_broken_cluster,
+  khmer_non_khmer_cluster,
+};
+
 %%{
   machine khmer_syllable_machine;
   alphtype unsigned char;
+  write exports;
   write data;
 }%%
 
 %%{
 
-# Same order as enum khmer_category_t.  Not sure how to avoid duplication.
-C    = 1;
-V    = 2;
-ZWNJ = 5;
-ZWJ  = 6;
-PLACEHOLDER = 11;
-DOTTEDCIRCLE = 12;
-Coeng= 14;
-Ra   = 16;
-Robatic = 20;
-Xgroup  = 21;
-Ygroup  = 22;
-VAbv = 26;
-VBlw = 27;
-VPre = 28;
-VPst = 29;
+export C    = 1;
+export V    = 2;
+export ZWNJ = 5;
+export ZWJ  = 6;
+export PLACEHOLDER = 11;
+export DOTTEDCIRCLE = 12;
+export Coeng= 14;
+export Ra   = 16;
+export Robatic = 20;
+export Xgroup  = 21;
+export Ygroup  = 22;
+export VAbv = 26;
+export VBlw = 27;
+export VPre = 28;
+export VPst = 29;
 
 c = (C | Ra | V);
 cn = c.((ZWJ|ZWNJ)?.Robatic)?;
@@ -71,9 +77,9 @@
 other =			any;
 
 main := |*
-	consonant_syllable	=> { found_syllable (consonant_syllable); };
-	broken_cluster		=> { found_syllable (broken_cluster); };
-	other			=> { found_syllable (non_khmer_cluster); };
+	consonant_syllable	=> { found_syllable (khmer_consonant_syllable); };
+	broken_cluster		=> { found_syllable (khmer_broken_cluster); };
+	other			=> { found_syllable (khmer_non_khmer_cluster); };
 *|;
 
 
@@ -83,7 +89,7 @@
   HB_STMT_START { \
     if (0) fprintf (stderr, "syllable %d..%d %s\n", ts, te, #syllable_type); \
     for (unsigned int i = ts; i < te; i++) \
-      info[i].syllable() = (syllable_serial << 4) | khmer_##syllable_type; \
+      info[i].syllable() = (syllable_serial << 4) | syllable_type; \
     syllable_serial++; \
     if (unlikely (syllable_serial == 16)) syllable_serial = 1; \
   } HB_STMT_END

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-khmer.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-khmer.cc	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-khmer.cc	2021-04-17 22:31:16 UTC (rev 58898)
@@ -29,6 +29,7 @@
 #ifndef HB_NO_OT_SHAPE
 
 #include "hb-ot-shape-complex-khmer.hh"
+#include "hb-ot-shape-complex-khmer-machine.hh"
 #include "hb-ot-layout.hh"
 
 
@@ -140,27 +141,6 @@
 
 struct khmer_shape_plan_t
 {
-  bool get_virama_glyph (hb_font_t *font, hb_codepoint_t *pglyph) const
-  {
-    hb_codepoint_t glyph = virama_glyph;
-    if (unlikely (virama_glyph == (hb_codepoint_t) -1))
-    {
-      if (!font->get_nominal_glyph (0x17D2u, &glyph))
-	glyph = 0;
-      /* Technically speaking, the spec says we should apply 'locl' to virama too.
-       * Maybe one day... */
-
-      /* Our get_nominal_glyph() function needs a font, so we can't get the virama glyph
-       * during shape planning...  Instead, overwrite it here.  It's safe.  Don't worry! */
-      virama_glyph = glyph;
-    }
-
-    *pglyph = glyph;
-    return glyph != 0;
-  }
-
-  mutable hb_codepoint_t virama_glyph;
-
   hb_mask_t mask_array[KHMER_NUM_FEATURES];
 };
 
@@ -171,8 +151,6 @@
   if (unlikely (!khmer_plan))
     return nullptr;
 
-  khmer_plan->virama_glyph = (hb_codepoint_t) -1;
-
   for (unsigned int i = 0; i < ARRAY_LENGTH (khmer_plan->mask_array); i++)
     khmer_plan->mask_array[i] = (khmer_features[i].flags & F_GLOBAL) ?
 				 0 : plan->map.get_1_mask (khmer_features[i].tag);
@@ -186,15 +164,6 @@
   free (data);
 }
 
-
-enum khmer_syllable_type_t {
-  khmer_consonant_syllable,
-  khmer_broken_cluster,
-  khmer_non_khmer_cluster,
-};
-
-#include "hb-ot-shape-complex-khmer-machine.hh"
-
 static void
 setup_masks_khmer (const hb_ot_shape_plan_t *plan HB_UNUSED,
 		   hb_buffer_t              *buffer,
@@ -321,76 +290,17 @@
   }
 }
 
-static inline void
-insert_dotted_circles_khmer (const hb_ot_shape_plan_t *plan HB_UNUSED,
-			     hb_font_t *font,
-			     hb_buffer_t *buffer)
-{
-  if (unlikely (buffer->flags & HB_BUFFER_FLAG_DO_NOT_INSERT_DOTTED_CIRCLE))
-    return;
-
-  /* Note: This loop is extra overhead, but should not be measurable.
-   * TODO Use a buffer scratch flag to remove the loop. */
-  bool has_broken_syllables = false;
-  unsigned int count = buffer->len;
-  hb_glyph_info_t *info = buffer->info;
-  for (unsigned int i = 0; i < count; i++)
-    if ((info[i].syllable() & 0x0F) == khmer_broken_cluster)
-    {
-      has_broken_syllables = true;
-      break;
-    }
-  if (likely (!has_broken_syllables))
-    return;
-
-
-  hb_codepoint_t dottedcircle_glyph;
-  if (!font->get_nominal_glyph (0x25CCu, &dottedcircle_glyph))
-    return;
-
-  hb_glyph_info_t dottedcircle = {0};
-  dottedcircle.codepoint = 0x25CCu;
-  set_khmer_properties (dottedcircle);
-  dottedcircle.codepoint = dottedcircle_glyph;
-
-  buffer->clear_output ();
-
-  buffer->idx = 0;
-  unsigned int last_syllable = 0;
-  while (buffer->idx < buffer->len && buffer->successful)
-  {
-    unsigned int syllable = buffer->cur().syllable();
-    khmer_syllable_type_t syllable_type = (khmer_syllable_type_t) (syllable & 0x0F);
-    if (unlikely (last_syllable != syllable && syllable_type == khmer_broken_cluster))
-    {
-      last_syllable = syllable;
-
-      hb_glyph_info_t ginfo = dottedcircle;
-      ginfo.cluster = buffer->cur().cluster;
-      ginfo.mask = buffer->cur().mask;
-      ginfo.syllable() = buffer->cur().syllable();
-
-      /* Insert dottedcircle after possible Repha. */
-      while (buffer->idx < buffer->len && buffer->successful &&
-	     last_syllable == buffer->cur().syllable() &&
-	     buffer->cur().khmer_category() == OT_Repha)
-	buffer->next_glyph ();
-
-      buffer->output_info (ginfo);
-    }
-    else
-      buffer->next_glyph ();
-  }
-  buffer->swap_buffers ();
-}
-
 static void
 reorder_khmer (const hb_ot_shape_plan_t *plan,
 	       hb_font_t *font,
 	       hb_buffer_t *buffer)
 {
-  if (buffer->message (font, "start reordering khmer")) {
-    insert_dotted_circles_khmer (plan, font, buffer);
+  if (buffer->message (font, "start reordering khmer"))
+  {
+    hb_syllabic_insert_dotted_circles (font, buffer,
+				       khmer_broken_cluster,
+				       OT_DOTTEDCIRCLE,
+				       OT_Repha);
 
     foreach_syllable (buffer, start, end)
       reorder_syllable_khmer (plan, font->face, buffer, start, end);

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-khmer.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-khmer.hh	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-khmer.hh	2021-04-17 22:31:16 UTC (rev 58898)
@@ -54,7 +54,7 @@
 {
   hb_codepoint_t u = info.codepoint;
   unsigned int type = hb_indic_get_categories (u);
-  khmer_category_t cat = (khmer_category_t) (type & 0x7Fu);
+  khmer_category_t cat = (khmer_category_t) (type & 0xFFu);
   indic_position_t pos = (indic_position_t) (type >> 8);
 
 

Deleted: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-machine-index.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-machine-index.hh	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-machine-index.hh	2021-04-17 22:31:16 UTC (rev 58898)
@@ -1,69 +0,0 @@
-/*
- * Copyright © 2019,2020  David Corbett
- *
- *  This is part of HarfBuzz, a text shaping library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- */
-
-#ifndef HB_OT_SHAPE_COMPLEX_MACHINE_INDEX_HH
-#define HB_OT_SHAPE_COMPLEX_MACHINE_INDEX_HH
-
-#include "hb.hh"
-
-
-template <typename Iter>
-struct machine_index_t :
-  hb_iter_with_fallback_t<machine_index_t<Iter>,
-			  typename Iter::item_t>
-{
-  machine_index_t (const Iter& it) : it (it) {}
-  machine_index_t (const machine_index_t& o) : it (o.it) {}
-
-  static constexpr bool is_random_access_iterator = Iter::is_random_access_iterator;
-  static constexpr bool is_sorted_iterator = Iter::is_sorted_iterator;
-
-  typename Iter::item_t __item__ () const { return *it; }
-  typename Iter::item_t __item_at__ (unsigned i) const { return it[i]; }
-  unsigned __len__ () const { return it.len (); }
-  void __next__ () { ++it; }
-  void __forward__ (unsigned n) { it += n; }
-  void __prev__ () { --it; }
-  void __rewind__ (unsigned n) { it -= n; }
-  void operator = (unsigned n)
-  { unsigned index = (*it).first; if (index < n) it += n - index; else if (index > n) it -= index - n; }
-  void operator = (const machine_index_t& o) { *this = (*o.it).first; }
-  bool operator == (const machine_index_t& o) const { return (*it).first == (*o.it).first; }
-  bool operator != (const machine_index_t& o) const { return !(*this == o); }
-
-  private:
-  Iter it;
-};
-struct
-{
-  template <typename Iter,
-	    hb_requires (hb_is_iterable (Iter))>
-  machine_index_t<hb_iter_type<Iter>>
-  operator () (Iter&& it) const
-  { return machine_index_t<hb_iter_type<Iter>> (hb_iter (it)); }
-}
-HB_FUNCOBJ (machine_index);
-
-
-#endif /* HB_OT_SHAPE_COMPLEX_MACHINE_INDEX_HH */

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-myanmar-machine.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-myanmar-machine.hh	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-myanmar-machine.hh	2021-04-17 22:31:16 UTC (rev 58898)
@@ -31,8 +31,43 @@
 
 #include "hb.hh"
 
+enum myanmar_syllable_type_t {
+  myanmar_consonant_syllable,
+  myanmar_punctuation_cluster,
+  myanmar_broken_cluster,
+  myanmar_non_myanmar_cluster,
+};
 
-#line 36 "hb-ot-shape-complex-myanmar-machine.hh"
+
+#line 43 "hb-ot-shape-complex-myanmar-machine.hh"
+#define myanmar_syllable_machine_ex_A 10u
+#define myanmar_syllable_machine_ex_As 18u
+#define myanmar_syllable_machine_ex_C 1u
+#define myanmar_syllable_machine_ex_CS 19u
+#define myanmar_syllable_machine_ex_D 32u
+#define myanmar_syllable_machine_ex_D0 20u
+#define myanmar_syllable_machine_ex_DB 3u
+#define myanmar_syllable_machine_ex_GB 11u
+#define myanmar_syllable_machine_ex_H 4u
+#define myanmar_syllable_machine_ex_IV 2u
+#define myanmar_syllable_machine_ex_MH 21u
+#define myanmar_syllable_machine_ex_MR 22u
+#define myanmar_syllable_machine_ex_MW 23u
+#define myanmar_syllable_machine_ex_MY 24u
+#define myanmar_syllable_machine_ex_P 31u
+#define myanmar_syllable_machine_ex_PT 25u
+#define myanmar_syllable_machine_ex_Ra 16u
+#define myanmar_syllable_machine_ex_V 8u
+#define myanmar_syllable_machine_ex_VAbv 26u
+#define myanmar_syllable_machine_ex_VBlw 27u
+#define myanmar_syllable_machine_ex_VPre 28u
+#define myanmar_syllable_machine_ex_VPst 29u
+#define myanmar_syllable_machine_ex_VS 30u
+#define myanmar_syllable_machine_ex_ZWJ 6u
+#define myanmar_syllable_machine_ex_ZWNJ 5u
+
+
+#line 71 "hb-ot-shape-complex-myanmar-machine.hh"
 static const unsigned char _myanmar_syllable_machine_trans_keys[] = {
 	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, 
@@ -293,11 +328,11 @@
 static const int myanmar_syllable_machine_en_main = 0;
 
 
-#line 36 "hb-ot-shape-complex-myanmar-machine.rl"
+#line 44 "hb-ot-shape-complex-myanmar-machine.rl"
 
 
 
-#line 94 "hb-ot-shape-complex-myanmar-machine.rl"
+#line 101 "hb-ot-shape-complex-myanmar-machine.rl"
 
 
 #define found_syllable(syllable_type) \
@@ -304,7 +339,7 @@
   HB_STMT_START { \
     if (0) fprintf (stderr, "syllable %d..%d %s\n", ts, te, #syllable_type); \
     for (unsigned int i = ts; i < te; i++) \
-      info[i].syllable() = (syllable_serial << 4) | myanmar_##syllable_type; \
+      info[i].syllable() = (syllable_serial << 4) | syllable_type; \
     syllable_serial++; \
     if (unlikely (syllable_serial == 16)) syllable_serial = 1; \
   } HB_STMT_END
@@ -316,7 +351,7 @@
   int cs;
   hb_glyph_info_t *info = buffer->info;
   
-#line 320 "hb-ot-shape-complex-myanmar-machine.hh"
+#line 355 "hb-ot-shape-complex-myanmar-machine.hh"
 	{
 	cs = myanmar_syllable_machine_start;
 	ts = 0;
@@ -324,7 +359,7 @@
 	act = 0;
 	}
 
-#line 114 "hb-ot-shape-complex-myanmar-machine.rl"
+#line 121 "hb-ot-shape-complex-myanmar-machine.rl"
 
 
   p = 0;
@@ -332,7 +367,7 @@
 
   unsigned int syllable_serial = 1;
   
-#line 336 "hb-ot-shape-complex-myanmar-machine.hh"
+#line 371 "hb-ot-shape-complex-myanmar-machine.hh"
 	{
 	int _slen;
 	int _trans;
@@ -346,7 +381,7 @@
 #line 1 "NONE"
 	{ts = p;}
 	break;
-#line 350 "hb-ot-shape-complex-myanmar-machine.hh"
+#line 385 "hb-ot-shape-complex-myanmar-machine.hh"
 	}
 
 	_keys = _myanmar_syllable_machine_trans_keys + (cs<<1);
@@ -365,38 +400,38 @@
 
 	switch ( _myanmar_syllable_machine_trans_actions[_trans] ) {
 	case 6:
-#line 86 "hb-ot-shape-complex-myanmar-machine.rl"
-	{te = p+1;{ found_syllable (consonant_syllable); }}
+#line 93 "hb-ot-shape-complex-myanmar-machine.rl"
+	{te = p+1;{ found_syllable (myanmar_consonant_syllable); }}
 	break;
 	case 4:
-#line 87 "hb-ot-shape-complex-myanmar-machine.rl"
-	{te = p+1;{ found_syllable (non_myanmar_cluster); }}
+#line 94 "hb-ot-shape-complex-myanmar-machine.rl"
+	{te = p+1;{ found_syllable (myanmar_non_myanmar_cluster); }}
 	break;
 	case 10:
-#line 88 "hb-ot-shape-complex-myanmar-machine.rl"
-	{te = p+1;{ found_syllable (punctuation_cluster); }}
+#line 95 "hb-ot-shape-complex-myanmar-machine.rl"
+	{te = p+1;{ found_syllable (myanmar_punctuation_cluster); }}
 	break;
 	case 8:
-#line 89 "hb-ot-shape-complex-myanmar-machine.rl"
-	{te = p+1;{ found_syllable (broken_cluster); }}
+#line 96 "hb-ot-shape-complex-myanmar-machine.rl"
+	{te = p+1;{ found_syllable (myanmar_broken_cluster); }}
 	break;
 	case 3:
-#line 90 "hb-ot-shape-complex-myanmar-machine.rl"
-	{te = p+1;{ found_syllable (non_myanmar_cluster); }}
+#line 97 "hb-ot-shape-complex-myanmar-machine.rl"
+	{te = p+1;{ found_syllable (myanmar_non_myanmar_cluster); }}
 	break;
 	case 5:
-#line 86 "hb-ot-shape-complex-myanmar-machine.rl"
-	{te = p;p--;{ found_syllable (consonant_syllable); }}
+#line 93 "hb-ot-shape-complex-myanmar-machine.rl"
+	{te = p;p--;{ found_syllable (myanmar_consonant_syllable); }}
 	break;
 	case 7:
-#line 89 "hb-ot-shape-complex-myanmar-machine.rl"
-	{te = p;p--;{ found_syllable (broken_cluster); }}
+#line 96 "hb-ot-shape-complex-myanmar-machine.rl"
+	{te = p;p--;{ found_syllable (myanmar_broken_cluster); }}
 	break;
 	case 9:
-#line 90 "hb-ot-shape-complex-myanmar-machine.rl"
-	{te = p;p--;{ found_syllable (non_myanmar_cluster); }}
+#line 97 "hb-ot-shape-complex-myanmar-machine.rl"
+	{te = p;p--;{ found_syllable (myanmar_non_myanmar_cluster); }}
 	break;
-#line 400 "hb-ot-shape-complex-myanmar-machine.hh"
+#line 435 "hb-ot-shape-complex-myanmar-machine.hh"
 	}
 
 _again:
@@ -405,7 +440,7 @@
 #line 1 "NONE"
 	{ts = 0;}
 	break;
-#line 409 "hb-ot-shape-complex-myanmar-machine.hh"
+#line 444 "hb-ot-shape-complex-myanmar-machine.hh"
 	}
 
 	if ( ++p != pe )
@@ -421,7 +456,7 @@
 
 	}
 
-#line 122 "hb-ot-shape-complex-myanmar-machine.rl"
+#line 129 "hb-ot-shape-complex-myanmar-machine.rl"
 
 }
 

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-myanmar-machine.rl
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-myanmar-machine.rl	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-myanmar-machine.rl	2021-04-17 22:31:16 UTC (rev 58898)
@@ -29,40 +29,47 @@
 
 #include "hb.hh"
 
+enum myanmar_syllable_type_t {
+  myanmar_consonant_syllable,
+  myanmar_punctuation_cluster,
+  myanmar_broken_cluster,
+  myanmar_non_myanmar_cluster,
+};
+
 %%{
   machine myanmar_syllable_machine;
   alphtype unsigned char;
+  write exports;
   write data;
 }%%
 
 %%{
 
-# Same order as enum myanmar_category_t.  Not sure how to avoid duplication.
-A    = 10;
-As   = 18;
-C    = 1;
-D    = 32;
-D0   = 20;
-DB   = 3;
-GB   = 11;
-H    = 4;
-IV   = 2;
-MH   = 21;
-MR   = 22;
-MW   = 23;
-MY   = 24;
-PT   = 25;
-V    = 8;
-VAbv = 26;
-VBlw = 27;
-VPre = 28;
-VPst = 29;
-VS   = 30;
-ZWJ  = 6;
-ZWNJ = 5;
-Ra   = 16;
-P    = 31;
-CS   = 19;
+export A    = 10;
+export As   = 18;
+export C    = 1;
+export D    = 32;
+export D0   = 20;
+export DB   = 3;
+export GB   = 11;
+export H    = 4;
+export IV   = 2;
+export MH   = 21;
+export MR   = 22;
+export MW   = 23;
+export MY   = 24;
+export PT   = 25;
+export V    = 8;
+export VAbv = 26;
+export VBlw = 27;
+export VPre = 28;
+export VPst = 29;
+export VS   = 30;
+export ZWJ  = 6;
+export ZWNJ = 5;
+export Ra   = 16;
+export P    = 31;
+export CS   = 19;
 
 j = ZWJ|ZWNJ;			# Joiners
 k = (Ra As H);			# Kinzi
@@ -83,11 +90,11 @@
 other =			any;
 
 main := |*
-	consonant_syllable	=> { found_syllable (consonant_syllable); };
-	j			=> { found_syllable (non_myanmar_cluster); };
-	punctuation_cluster	=> { found_syllable (punctuation_cluster); };
-	broken_cluster		=> { found_syllable (broken_cluster); };
-	other			=> { found_syllable (non_myanmar_cluster); };
+	consonant_syllable	=> { found_syllable (myanmar_consonant_syllable); };
+	j			=> { found_syllable (myanmar_non_myanmar_cluster); };
+	punctuation_cluster	=> { found_syllable (myanmar_punctuation_cluster); };
+	broken_cluster		=> { found_syllable (myanmar_broken_cluster); };
+	other			=> { found_syllable (myanmar_non_myanmar_cluster); };
 *|;
 
 
@@ -97,7 +104,7 @@
   HB_STMT_START { \
     if (0) fprintf (stderr, "syllable %d..%d %s\n", ts, te, #syllable_type); \
     for (unsigned int i = ts; i < te; i++) \
-      info[i].syllable() = (syllable_serial << 4) | myanmar_##syllable_type; \
+      info[i].syllable() = (syllable_serial << 4) | syllable_type; \
     syllable_serial++; \
     if (unlikely (syllable_serial == 16)) syllable_serial = 1; \
   } HB_STMT_END

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-myanmar.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-myanmar.cc	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-myanmar.cc	2021-04-17 22:31:16 UTC (rev 58898)
@@ -29,6 +29,7 @@
 #ifndef HB_NO_OT_SHAPE
 
 #include "hb-ot-shape-complex-myanmar.hh"
+#include "hb-ot-shape-complex-myanmar-machine.hh"
 
 
 /*
@@ -97,17 +98,6 @@
     map->enable_feature (myanmar_other_features[i], F_MANUAL_ZWJ);
 }
 
-
-enum myanmar_syllable_type_t {
-  myanmar_consonant_syllable,
-  myanmar_punctuation_cluster,
-  myanmar_broken_cluster,
-  myanmar_non_myanmar_cluster,
-};
-
-#include "hb-ot-shape-complex-myanmar-machine.hh"
-
-
 static void
 setup_masks_myanmar (const hb_ot_shape_plan_t *plan HB_UNUSED,
 		     hb_buffer_t              *buffer,
@@ -265,70 +255,16 @@
   }
 }
 
-static inline void
-insert_dotted_circles_myanmar (const hb_ot_shape_plan_t *plan HB_UNUSED,
-			       hb_font_t *font,
-			       hb_buffer_t *buffer)
-{
-  if (unlikely (buffer->flags & HB_BUFFER_FLAG_DO_NOT_INSERT_DOTTED_CIRCLE))
-    return;
-
-  /* Note: This loop is extra overhead, but should not be measurable.
-   * TODO Use a buffer scratch flag to remove the loop. */
-  bool has_broken_syllables = false;
-  unsigned int count = buffer->len;
-  hb_glyph_info_t *info = buffer->info;
-  for (unsigned int i = 0; i < count; i++)
-    if ((info[i].syllable() & 0x0F) == myanmar_broken_cluster)
-    {
-      has_broken_syllables = true;
-      break;
-    }
-  if (likely (!has_broken_syllables))
-    return;
-
-
-  hb_codepoint_t dottedcircle_glyph;
-  if (!font->get_nominal_glyph (0x25CCu, &dottedcircle_glyph))
-    return;
-
-  hb_glyph_info_t dottedcircle = {0};
-  dottedcircle.codepoint = 0x25CCu;
-  set_myanmar_properties (dottedcircle);
-  dottedcircle.codepoint = dottedcircle_glyph;
-
-  buffer->clear_output ();
-
-  buffer->idx = 0;
-  unsigned int last_syllable = 0;
-  while (buffer->idx < buffer->len && buffer->successful)
-  {
-    unsigned int syllable = buffer->cur().syllable();
-    myanmar_syllable_type_t syllable_type = (myanmar_syllable_type_t) (syllable & 0x0F);
-    if (unlikely (last_syllable != syllable && syllable_type == myanmar_broken_cluster))
-    {
-      last_syllable = syllable;
-
-      hb_glyph_info_t ginfo = dottedcircle;
-      ginfo.cluster = buffer->cur().cluster;
-      ginfo.mask = buffer->cur().mask;
-      ginfo.syllable() = buffer->cur().syllable();
-
-      buffer->output_info (ginfo);
-    }
-    else
-      buffer->next_glyph ();
-  }
-  buffer->swap_buffers ();
-}
-
 static void
 reorder_myanmar (const hb_ot_shape_plan_t *plan,
 		 hb_font_t *font,
 		 hb_buffer_t *buffer)
 {
-  if (buffer->message (font, "start reordering myanmar")) {
-    insert_dotted_circles_myanmar (plan, font, buffer);
+  if (buffer->message (font, "start reordering myanmar"))
+  {
+    hb_syllabic_insert_dotted_circles (font, buffer,
+				       myanmar_broken_cluster,
+				       OT_GB);
 
     foreach_syllable (buffer, start, end)
       reorder_syllable_myanmar (plan, font->face, buffer, start, end);

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-myanmar.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-myanmar.hh	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-myanmar.hh	2021-04-17 22:31:16 UTC (rev 58898)
@@ -64,7 +64,7 @@
 {
   hb_codepoint_t u = info.codepoint;
   unsigned int type = hb_indic_get_categories (u);
-  unsigned int cat = type & 0x7Fu;
+  unsigned int cat = type & 0xFFu;
   indic_position_t pos = (indic_position_t) (type >> 8);
 
   /* Myanmar

Added: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-syllabic.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-syllabic.cc	                        (rev 0)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-syllabic.cc	2021-04-17 22:31:16 UTC (rev 58898)
@@ -0,0 +1,100 @@
+/*
+ * Copyright © 2021  Behdad Esfahbod.
+ *
+ *  This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ */
+
+#include "hb.hh"
+
+#ifndef HB_NO_OT_SHAPE
+
+#include "hb-ot-shape-complex-syllabic.hh"
+
+
+void
+hb_syllabic_insert_dotted_circles (hb_font_t *font,
+				   hb_buffer_t *buffer,
+				   unsigned int broken_syllable_type,
+				   unsigned int dottedcircle_category,
+				   int repha_category)
+{
+  if (unlikely (buffer->flags & HB_BUFFER_FLAG_DO_NOT_INSERT_DOTTED_CIRCLE))
+    return;
+
+  /* Note: This loop is extra overhead, but should not be measurable.
+   * TODO Use a buffer scratch flag to remove the loop. */
+  bool has_broken_syllables = false;
+  unsigned int count = buffer->len;
+  hb_glyph_info_t *info = buffer->info;
+  for (unsigned int i = 0; i < count; i++)
+    if ((info[i].syllable() & 0x0F) == broken_syllable_type)
+    {
+      has_broken_syllables = true;
+      break;
+    }
+  if (likely (!has_broken_syllables))
+    return;
+
+
+  hb_codepoint_t dottedcircle_glyph;
+  if (!font->get_nominal_glyph (0x25CCu, &dottedcircle_glyph))
+    return;
+
+  hb_glyph_info_t dottedcircle = {0};
+  dottedcircle.codepoint = 0x25CCu;
+  dottedcircle.complex_var_u8_category() = dottedcircle_category;
+  dottedcircle.codepoint = dottedcircle_glyph;
+
+  buffer->clear_output ();
+
+  buffer->idx = 0;
+  unsigned int last_syllable = 0;
+  while (buffer->idx < buffer->len && buffer->successful)
+  {
+    unsigned int syllable = buffer->cur().syllable();
+    if (unlikely (last_syllable != syllable && (syllable & 0x0F) == broken_syllable_type))
+    {
+      last_syllable = syllable;
+
+      hb_glyph_info_t ginfo = dottedcircle;
+      ginfo.cluster = buffer->cur().cluster;
+      ginfo.mask = buffer->cur().mask;
+      ginfo.syllable() = buffer->cur().syllable();
+
+      /* Insert dottedcircle after possible Repha. */
+      if (repha_category != -1)
+      {
+	while (buffer->idx < buffer->len && buffer->successful &&
+	       last_syllable == buffer->cur().syllable() &&
+	       buffer->cur().complex_var_u8_category() == (unsigned) repha_category)
+	  (void) buffer->next_glyph ();
+      }
+
+      (void) buffer->output_info (ginfo);
+    }
+    else
+      (void) buffer->next_glyph ();
+  }
+  buffer->swap_buffers ();
+}
+
+
+#endif

Added: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-syllabic.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-syllabic.hh	                        (rev 0)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-syllabic.hh	2021-04-17 22:31:16 UTC (rev 58898)
@@ -0,0 +1,41 @@
+/*
+ * Copyright © 2021  Behdad Esfahbod.
+ *
+ *  This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ */
+
+#ifndef HB_OT_SHAPE_COMPLEX_SYLLABIC_HH
+#define HB_OT_SHAPE_COMPLEX_SYLLABIC_HH
+
+#include "hb.hh"
+
+#include "hb-ot-shape-complex.hh"
+
+
+HB_INTERNAL void
+hb_syllabic_insert_dotted_circles (hb_font_t *font,
+				   hb_buffer_t *buffer,
+				   unsigned int broken_syllable_type,
+				   unsigned int dottedcircle_category,
+				   int repha_category = -1);
+
+
+#endif /* HB_OT_SHAPE_COMPLEX_SYLLABIC_HH */

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-thai.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-thai.cc	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-thai.cc	2021-04-17 22:31:16 UTC (rev 58898)
@@ -323,20 +323,19 @@
 
   buffer->clear_output ();
   unsigned int count = buffer->len;
-  for (buffer->idx = 0; buffer->idx < count && buffer->successful;)
+  for (buffer->idx = 0; buffer->idx < count /* No need for: && buffer->successful */;)
   {
     hb_codepoint_t u = buffer->cur().codepoint;
-    if (likely (!IS_SARA_AM (u))) {
-      buffer->next_glyph ();
+    if (likely (!IS_SARA_AM (u)))
+    {
+      if (unlikely (!buffer->next_glyph ())) break;
       continue;
     }
 
     /* Is SARA AM. Decompose and reorder. */
-    hb_glyph_info_t &nikhahit = buffer->output_glyph (NIKHAHIT_FROM_SARA_AM (u));
-    _hb_glyph_info_set_continuation (&nikhahit);
-    buffer->replace_glyph (SARA_AA_FROM_SARA_AM (u));
-    if (unlikely (!buffer->successful))
-      return;
+    (void) buffer->output_glyph (NIKHAHIT_FROM_SARA_AM (u));
+    _hb_glyph_info_set_continuation (&buffer->prev());
+    if (unlikely (!buffer->replace_glyph (SARA_AA_FROM_SARA_AM (u)))) break;
 
     /* Make Nikhahit be recognized as a ccc=0 mark when zeroing widths. */
     unsigned int end = buffer->out_len;

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-use-machine.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-use-machine.hh	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-use-machine.hh	2021-04-17 22:31:16 UTC (rev 58898)
@@ -1,302 +1,350 @@
-
 #line 1 "hb-ot-shape-complex-use-machine.rl"
 /*
- * Copyright © 2015  Mozilla Foundation.
- * Copyright © 2015  Google, Inc.
- *
- *  This is part of HarfBuzz, a text shaping library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- *
- * Mozilla Author(s): Jonathan Kew
- * Google Author(s): Behdad Esfahbod
- */
+* Copyright © 2015  Mozilla Foundation.
+* Copyright © 2015  Google, Inc.
+*
+*  This is part of HarfBuzz, a text shaping library.
+*
+* Permission is hereby granted, without written agreement and without
+* license or royalty fees, to use, copy, modify, and distribute this
+* software and its documentation for any purpose, provided that the
+* above copyright notice and the following two paragraphs appear in
+* all copies of this software.
+*
+* IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+* DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+* ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+* IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+* DAMAGE.
+*
+* THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+* BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+* FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
+* ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+* PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+*
+* Mozilla Author(s): Jonathan Kew
+* Google Author(s): Behdad Esfahbod
+*/
 
 #ifndef HB_OT_SHAPE_COMPLEX_USE_MACHINE_HH
 #define HB_OT_SHAPE_COMPLEX_USE_MACHINE_HH
 
 #include "hb.hh"
-#include "hb-ot-shape-complex-machine-index.hh"
 
+#include "hb-ot-shape-complex-syllabic.hh"
 
-#line 39 "hb-ot-shape-complex-use-machine.hh"
+/* buffer var allocations */
+#define use_category() complex_var_u8_category()
+
+#define USE(Cat) use_syllable_machine_ex_##Cat
+
+enum use_syllable_type_t {
+	use_independent_cluster,
+	use_virama_terminated_cluster,
+	use_sakot_terminated_cluster,
+	use_standard_cluster,
+	use_number_joiner_terminated_cluster,
+	use_numeral_cluster,
+	use_symbol_cluster,
+	use_hieroglyph_cluster,
+	use_broken_cluster,
+	use_non_cluster,
+};
+
+
+#line 57 "hb-ot-shape-complex-use-machine.hh"
+#define use_syllable_machine_ex_B 1u
+#define use_syllable_machine_ex_CMAbv 31u
+#define use_syllable_machine_ex_CMBlw 32u
+#define use_syllable_machine_ex_CS 43u
+#define use_syllable_machine_ex_FAbv 24u
+#define use_syllable_machine_ex_FBlw 25u
+#define use_syllable_machine_ex_FMAbv 45u
+#define use_syllable_machine_ex_FMBlw 46u
+#define use_syllable_machine_ex_FMPst 47u
+#define use_syllable_machine_ex_FPst 26u
+#define use_syllable_machine_ex_G 49u
+#define use_syllable_machine_ex_GB 5u
+#define use_syllable_machine_ex_H 12u
+#define use_syllable_machine_ex_HN 13u
+#define use_syllable_machine_ex_HVM 44u
+#define use_syllable_machine_ex_J 50u
+#define use_syllable_machine_ex_MAbv 27u
+#define use_syllable_machine_ex_MBlw 28u
+#define use_syllable_machine_ex_MPre 30u
+#define use_syllable_machine_ex_MPst 29u
+#define use_syllable_machine_ex_N 4u
+#define use_syllable_machine_ex_O 0u
+#define use_syllable_machine_ex_R 18u
+#define use_syllable_machine_ex_S 19u
+#define use_syllable_machine_ex_SB 51u
+#define use_syllable_machine_ex_SE 52u
+#define use_syllable_machine_ex_SMAbv 41u
+#define use_syllable_machine_ex_SMBlw 42u
+#define use_syllable_machine_ex_SUB 11u
+#define use_syllable_machine_ex_Sk 48u
+#define use_syllable_machine_ex_VAbv 33u
+#define use_syllable_machine_ex_VBlw 34u
+#define use_syllable_machine_ex_VMAbv 37u
+#define use_syllable_machine_ex_VMBlw 38u
+#define use_syllable_machine_ex_VMPre 23u
+#define use_syllable_machine_ex_VMPst 39u
+#define use_syllable_machine_ex_VPre 22u
+#define use_syllable_machine_ex_VPst 35u
+#define use_syllable_machine_ex_ZWNJ 14u
+
+
+#line 99 "hb-ot-shape-complex-use-machine.hh"
 static const unsigned char _use_syllable_machine_trans_keys[] = {
-	1u, 1u, 1u, 1u, 0u, 51u, 11u, 48u, 11u, 48u, 1u, 1u, 22u, 48u, 23u, 48u, 
-	24u, 47u, 25u, 47u, 26u, 47u, 45u, 46u, 46u, 46u, 24u, 48u, 24u, 48u, 24u, 48u, 
-	1u, 1u, 24u, 48u, 23u, 48u, 23u, 48u, 23u, 48u, 22u, 48u, 22u, 48u, 22u, 48u, 
-	11u, 48u, 1u, 48u, 13u, 13u, 4u, 4u, 11u, 48u, 41u, 42u, 42u, 42u, 11u, 48u, 
-	22u, 48u, 23u, 48u, 24u, 47u, 25u, 47u, 26u, 47u, 45u, 46u, 46u, 46u, 24u, 48u, 
-	24u, 48u, 24u, 48u, 24u, 48u, 23u, 48u, 23u, 48u, 23u, 48u, 22u, 48u, 22u, 48u, 
-	22u, 48u, 11u, 48u, 1u, 48u, 1u, 1u, 4u, 4u, 13u, 13u, 1u, 48u, 11u, 48u, 
-	41u, 42u, 42u, 42u, 1u, 5u, 50u, 52u, 49u, 52u, 49u, 51u, 0
+	1u, 1u, 1u, 1u, 0u, 37u, 5u, 34u,
+	5u, 34u, 1u, 1u, 10u, 34u, 11u, 34u,
+	12u, 33u, 13u, 33u, 14u, 33u, 31u, 32u,
+	32u, 32u, 12u, 34u, 12u, 34u, 12u, 34u,
+	1u, 1u, 12u, 34u, 11u, 34u, 11u, 34u,
+	11u, 34u, 10u, 34u, 10u, 34u, 10u, 34u,
+	5u, 34u, 1u, 34u, 7u, 7u, 3u, 3u,
+	5u, 34u, 27u, 28u, 28u, 28u, 5u, 34u,
+	10u, 34u, 11u, 34u, 12u, 33u, 13u, 33u,
+	14u, 33u, 31u, 32u, 32u, 32u, 12u, 34u,
+	12u, 34u, 12u, 34u, 12u, 34u, 11u, 34u,
+	11u, 34u, 11u, 34u, 10u, 34u, 10u, 34u,
+	10u, 34u, 5u, 34u, 1u, 34u, 1u, 1u,
+	3u, 3u, 7u, 7u, 1u, 34u, 5u, 34u,
+	27u, 28u, 28u, 28u, 1u, 4u, 36u, 38u,
+	35u, 38u, 35u, 37u, 0u
 };
 
-static const char _use_syllable_machine_key_spans[] = {
-	1, 1, 52, 38, 38, 1, 27, 26, 
-	24, 23, 22, 2, 1, 25, 25, 25, 
-	1, 25, 26, 26, 26, 27, 27, 27, 
-	38, 48, 1, 1, 38, 2, 1, 38, 
-	27, 26, 24, 23, 22, 2, 1, 25, 
-	25, 25, 25, 26, 26, 26, 27, 27, 
-	27, 38, 48, 1, 1, 1, 48, 38, 
-	2, 1, 5, 3, 4, 3
+static const signed char _use_syllable_machine_char_class[] = {
+	0, 1, 2, 2, 3, 4, 2, 2,
+	2, 2, 2, 5, 6, 7, 2, 2,
+	2, 2, 8, 9, 2, 2, 10, 11,
+	12, 13, 14, 15, 16, 17, 18, 19,
+	20, 21, 22, 23, 2, 24, 25, 26,
+	2, 27, 28, 29, 30, 31, 32, 33,
+	34, 35, 36, 37, 38, 0
 };
 
 static const short _use_syllable_machine_index_offsets[] = {
-	0, 2, 4, 57, 96, 135, 137, 165, 
-	192, 217, 241, 264, 267, 269, 295, 321, 
-	347, 349, 375, 402, 429, 456, 484, 512, 
-	540, 579, 628, 630, 632, 671, 674, 676, 
-	715, 743, 770, 795, 819, 842, 845, 847, 
-	873, 899, 925, 951, 978, 1005, 1032, 1060, 
-	1088, 1116, 1155, 1204, 1206, 1208, 1210, 1259, 
-	1298, 1301, 1303, 1309, 1313, 1318
+	0, 1, 2, 40, 70, 100, 101, 126,
+	150, 172, 193, 213, 215, 216, 239, 262,
+	285, 286, 309, 333, 357, 381, 406, 431,
+	456, 486, 520, 521, 522, 552, 554, 555,
+	585, 610, 634, 656, 677, 697, 699, 700,
+	723, 746, 769, 792, 816, 840, 864, 889,
+	914, 939, 969, 1003, 1004, 1005, 1006, 1040,
+	1070, 1072, 1073, 1077, 1080, 1084, 0
 };
 
-static const char _use_syllable_machine_indicies[] = {
-	1, 0, 2, 0, 3, 4, 5, 5, 
-	6, 7, 5, 5, 5, 5, 5, 1, 
-	8, 9, 5, 5, 5, 5, 10, 11, 
-	5, 5, 12, 13, 14, 15, 16, 17, 
-	18, 12, 19, 20, 21, 22, 23, 24, 
-	5, 25, 26, 27, 5, 28, 29, 30, 
-	31, 32, 33, 34, 8, 35, 5, 36, 
-	5, 38, 39, 37, 37, 37, 37, 37, 
-	37, 37, 37, 37, 40, 41, 42, 43, 
-	44, 45, 46, 40, 47, 4, 48, 49, 
-	50, 51, 37, 52, 53, 54, 37, 37, 
-	37, 37, 55, 56, 57, 58, 39, 37, 
-	38, 39, 37, 37, 37, 37, 37, 37, 
-	37, 37, 37, 40, 41, 42, 43, 44, 
-	45, 46, 40, 47, 48, 48, 49, 50, 
-	51, 37, 52, 53, 54, 37, 37, 37, 
-	37, 55, 56, 57, 58, 39, 37, 38, 
-	59, 40, 41, 42, 43, 44, 37, 37, 
-	37, 37, 37, 37, 49, 50, 51, 37, 
-	52, 53, 54, 37, 37, 37, 37, 41, 
-	56, 57, 58, 60, 37, 41, 42, 43, 
-	44, 37, 37, 37, 37, 37, 37, 37, 
-	37, 37, 37, 52, 53, 54, 37, 37, 
-	37, 37, 37, 56, 57, 58, 60, 37, 
-	42, 43, 44, 37, 37, 37, 37, 37, 
-	37, 37, 37, 37, 37, 37, 37, 37, 
-	37, 37, 37, 37, 37, 56, 57, 58, 
-	37, 43, 44, 37, 37, 37, 37, 37, 
-	37, 37, 37, 37, 37, 37, 37, 37, 
-	37, 37, 37, 37, 37, 56, 57, 58, 
-	37, 44, 37, 37, 37, 37, 37, 37, 
-	37, 37, 37, 37, 37, 37, 37, 37, 
-	37, 37, 37, 37, 56, 57, 58, 37, 
-	56, 57, 37, 57, 37, 42, 43, 44, 
-	37, 37, 37, 37, 37, 37, 37, 37, 
-	37, 37, 52, 53, 54, 37, 37, 37, 
-	37, 37, 56, 57, 58, 60, 37, 42, 
-	43, 44, 37, 37, 37, 37, 37, 37, 
-	37, 37, 37, 37, 37, 53, 54, 37, 
-	37, 37, 37, 37, 56, 57, 58, 60, 
-	37, 42, 43, 44, 37, 37, 37, 37, 
-	37, 37, 37, 37, 37, 37, 37, 37, 
-	54, 37, 37, 37, 37, 37, 56, 57, 
-	58, 60, 37, 62, 61, 42, 43, 44, 
-	37, 37, 37, 37, 37, 37, 37, 37, 
-	37, 37, 37, 37, 37, 37, 37, 37, 
-	37, 37, 56, 57, 58, 60, 37, 41, 
-	42, 43, 44, 37, 37, 37, 37, 37, 
-	37, 49, 50, 51, 37, 52, 53, 54, 
-	37, 37, 37, 37, 41, 56, 57, 58, 
-	60, 37, 41, 42, 43, 44, 37, 37, 
-	37, 37, 37, 37, 37, 50, 51, 37, 
-	52, 53, 54, 37, 37, 37, 37, 41, 
-	56, 57, 58, 60, 37, 41, 42, 43, 
-	44, 37, 37, 37, 37, 37, 37, 37, 
-	37, 51, 37, 52, 53, 54, 37, 37, 
-	37, 37, 41, 56, 57, 58, 60, 37, 
-	40, 41, 42, 43, 44, 37, 46, 40, 
-	37, 37, 37, 49, 50, 51, 37, 52, 
-	53, 54, 37, 37, 37, 37, 41, 56, 
-	57, 58, 60, 37, 40, 41, 42, 43, 
-	44, 37, 37, 40, 37, 37, 37, 49, 
-	50, 51, 37, 52, 53, 54, 37, 37, 
-	37, 37, 41, 56, 57, 58, 60, 37, 
-	40, 41, 42, 43, 44, 45, 46, 40, 
-	37, 37, 37, 49, 50, 51, 37, 52, 
-	53, 54, 37, 37, 37, 37, 41, 56, 
-	57, 58, 60, 37, 38, 39, 37, 37, 
-	37, 37, 37, 37, 37, 37, 37, 40, 
-	41, 42, 43, 44, 45, 46, 40, 47, 
-	37, 48, 49, 50, 51, 37, 52, 53, 
-	54, 37, 37, 37, 37, 55, 56, 57, 
-	58, 39, 37, 38, 59, 59, 59, 59, 
-	59, 59, 59, 59, 59, 59, 59, 59, 
-	59, 59, 59, 59, 59, 59, 59, 59, 
-	59, 41, 42, 43, 44, 59, 59, 59, 
-	59, 59, 59, 59, 59, 59, 59, 52, 
-	53, 54, 59, 59, 59, 59, 59, 56, 
-	57, 58, 60, 59, 64, 63, 6, 65, 
-	38, 39, 37, 37, 37, 37, 37, 37, 
-	37, 37, 37, 40, 41, 42, 43, 44, 
-	45, 46, 40, 47, 4, 48, 49, 50, 
-	51, 37, 52, 53, 54, 37, 11, 66, 
-	37, 55, 56, 57, 58, 39, 37, 11, 
-	66, 67, 66, 67, 1, 69, 68, 68, 
-	68, 68, 68, 68, 68, 68, 68, 12, 
-	13, 14, 15, 16, 17, 18, 12, 19, 
-	21, 21, 22, 23, 24, 68, 25, 26, 
-	27, 68, 68, 68, 68, 31, 32, 33, 
-	34, 69, 68, 12, 13, 14, 15, 16, 
-	68, 68, 68, 68, 68, 68, 22, 23, 
-	24, 68, 25, 26, 27, 68, 68, 68, 
-	68, 13, 32, 33, 34, 70, 68, 13, 
-	14, 15, 16, 68, 68, 68, 68, 68, 
-	68, 68, 68, 68, 68, 25, 26, 27, 
-	68, 68, 68, 68, 68, 32, 33, 34, 
-	70, 68, 14, 15, 16, 68, 68, 68, 
-	68, 68, 68, 68, 68, 68, 68, 68, 
-	68, 68, 68, 68, 68, 68, 68, 32, 
-	33, 34, 68, 15, 16, 68, 68, 68, 
-	68, 68, 68, 68, 68, 68, 68, 68, 
-	68, 68, 68, 68, 68, 68, 68, 32, 
-	33, 34, 68, 16, 68, 68, 68, 68, 
-	68, 68, 68, 68, 68, 68, 68, 68, 
-	68, 68, 68, 68, 68, 68, 32, 33, 
-	34, 68, 32, 33, 68, 33, 68, 14, 
-	15, 16, 68, 68, 68, 68, 68, 68, 
-	68, 68, 68, 68, 25, 26, 27, 68, 
-	68, 68, 68, 68, 32, 33, 34, 70, 
-	68, 14, 15, 16, 68, 68, 68, 68, 
-	68, 68, 68, 68, 68, 68, 68, 26, 
-	27, 68, 68, 68, 68, 68, 32, 33, 
-	34, 70, 68, 14, 15, 16, 68, 68, 
-	68, 68, 68, 68, 68, 68, 68, 68, 
-	68, 68, 27, 68, 68, 68, 68, 68, 
-	32, 33, 34, 70, 68, 14, 15, 16, 
-	68, 68, 68, 68, 68, 68, 68, 68, 
-	68, 68, 68, 68, 68, 68, 68, 68, 
-	68, 68, 32, 33, 34, 70, 68, 13, 
-	14, 15, 16, 68, 68, 68, 68, 68, 
-	68, 22, 23, 24, 68, 25, 26, 27, 
-	68, 68, 68, 68, 13, 32, 33, 34, 
-	70, 68, 13, 14, 15, 16, 68, 68, 
-	68, 68, 68, 68, 68, 23, 24, 68, 
-	25, 26, 27, 68, 68, 68, 68, 13, 
-	32, 33, 34, 70, 68, 13, 14, 15, 
-	16, 68, 68, 68, 68, 68, 68, 68, 
-	68, 24, 68, 25, 26, 27, 68, 68, 
-	68, 68, 13, 32, 33, 34, 70, 68, 
-	12, 13, 14, 15, 16, 68, 18, 12, 
-	68, 68, 68, 22, 23, 24, 68, 25, 
-	26, 27, 68, 68, 68, 68, 13, 32, 
-	33, 34, 70, 68, 12, 13, 14, 15, 
-	16, 68, 68, 12, 68, 68, 68, 22, 
-	23, 24, 68, 25, 26, 27, 68, 68, 
-	68, 68, 13, 32, 33, 34, 70, 68, 
-	12, 13, 14, 15, 16, 17, 18, 12, 
-	68, 68, 68, 22, 23, 24, 68, 25, 
-	26, 27, 68, 68, 68, 68, 13, 32, 
-	33, 34, 70, 68, 1, 69, 68, 68, 
-	68, 68, 68, 68, 68, 68, 68, 12, 
-	13, 14, 15, 16, 17, 18, 12, 19, 
-	68, 21, 22, 23, 24, 68, 25, 26, 
-	27, 68, 68, 68, 68, 31, 32, 33, 
-	34, 69, 68, 1, 68, 68, 68, 68, 
-	68, 68, 68, 68, 68, 68, 68, 68, 
-	68, 68, 68, 68, 68, 68, 68, 68, 
-	68, 13, 14, 15, 16, 68, 68, 68, 
-	68, 68, 68, 68, 68, 68, 68, 25, 
-	26, 27, 68, 68, 68, 68, 68, 32, 
-	33, 34, 70, 68, 1, 71, 72, 68, 
-	9, 68, 4, 68, 68, 68, 4, 68, 
-	68, 68, 68, 68, 1, 69, 9, 68, 
-	68, 68, 68, 68, 68, 68, 68, 12, 
-	13, 14, 15, 16, 17, 18, 12, 19, 
-	20, 21, 22, 23, 24, 68, 25, 26, 
-	27, 68, 28, 29, 68, 31, 32, 33, 
-	34, 69, 68, 1, 69, 68, 68, 68, 
-	68, 68, 68, 68, 68, 68, 12, 13, 
-	14, 15, 16, 17, 18, 12, 19, 20, 
-	21, 22, 23, 24, 68, 25, 26, 27, 
-	68, 68, 68, 68, 31, 32, 33, 34, 
-	69, 68, 28, 29, 68, 29, 68, 4, 
-	71, 71, 71, 4, 71, 74, 73, 35, 
-	73, 35, 74, 73, 74, 73, 35, 73, 
-	36, 73, 0
+static const signed char _use_syllable_machine_indicies[] = {
+	1, 2, 4, 5, 6, 7, 8, 1,
+	9, 10, 11, 12, 13, 14, 15, 16,
+	17, 18, 19, 13, 20, 21, 22, 23,
+	24, 25, 26, 27, 28, 29, 30, 31,
+	32, 33, 34, 35, 9, 36, 6, 37,
+	39, 40, 38, 38, 38, 41, 42, 43,
+	44, 45, 46, 47, 41, 48, 5, 49,
+	50, 51, 52, 53, 54, 55, 38, 38,
+	38, 56, 57, 58, 59, 40, 39, 40,
+	38, 38, 38, 41, 42, 43, 44, 45,
+	46, 47, 41, 48, 49, 49, 50, 51,
+	52, 53, 54, 55, 38, 38, 38, 56,
+	57, 58, 59, 40, 39, 41, 42, 43,
+	44, 45, 38, 38, 38, 38, 38, 38,
+	50, 51, 52, 53, 54, 55, 38, 38,
+	38, 42, 57, 58, 59, 61, 42, 43,
+	44, 45, 38, 38, 38, 38, 38, 38,
+	38, 38, 38, 53, 54, 55, 38, 38,
+	38, 38, 57, 58, 59, 61, 43, 44,
+	45, 38, 38, 38, 38, 38, 38, 38,
+	38, 38, 38, 38, 38, 38, 38, 38,
+	38, 57, 58, 59, 44, 45, 38, 38,
+	38, 38, 38, 38, 38, 38, 38, 38,
+	38, 38, 38, 38, 38, 38, 57, 58,
+	59, 45, 38, 38, 38, 38, 38, 38,
+	38, 38, 38, 38, 38, 38, 38, 38,
+	38, 38, 57, 58, 59, 57, 58, 58,
+	43, 44, 45, 38, 38, 38, 38, 38,
+	38, 38, 38, 38, 53, 54, 55, 38,
+	38, 38, 38, 57, 58, 59, 61, 43,
+	44, 45, 38, 38, 38, 38, 38, 38,
+	38, 38, 38, 38, 54, 55, 38, 38,
+	38, 38, 57, 58, 59, 61, 43, 44,
+	45, 38, 38, 38, 38, 38, 38, 38,
+	38, 38, 38, 38, 55, 38, 38, 38,
+	38, 57, 58, 59, 61, 63, 43, 44,
+	45, 38, 38, 38, 38, 38, 38, 38,
+	38, 38, 38, 38, 38, 38, 38, 38,
+	38, 57, 58, 59, 61, 42, 43, 44,
+	45, 38, 38, 38, 38, 38, 38, 50,
+	51, 52, 53, 54, 55, 38, 38, 38,
+	42, 57, 58, 59, 61, 42, 43, 44,
+	45, 38, 38, 38, 38, 38, 38, 38,
+	51, 52, 53, 54, 55, 38, 38, 38,
+	42, 57, 58, 59, 61, 42, 43, 44,
+	45, 38, 38, 38, 38, 38, 38, 38,
+	38, 52, 53, 54, 55, 38, 38, 38,
+	42, 57, 58, 59, 61, 41, 42, 43,
+	44, 45, 38, 47, 41, 38, 38, 38,
+	50, 51, 52, 53, 54, 55, 38, 38,
+	38, 42, 57, 58, 59, 61, 41, 42,
+	43, 44, 45, 38, 38, 41, 38, 38,
+	38, 50, 51, 52, 53, 54, 55, 38,
+	38, 38, 42, 57, 58, 59, 61, 41,
+	42, 43, 44, 45, 46, 47, 41, 38,
+	38, 38, 50, 51, 52, 53, 54, 55,
+	38, 38, 38, 42, 57, 58, 59, 61,
+	39, 40, 38, 38, 38, 41, 42, 43,
+	44, 45, 46, 47, 41, 48, 38, 49,
+	50, 51, 52, 53, 54, 55, 38, 38,
+	38, 56, 57, 58, 59, 40, 39, 60,
+	60, 60, 60, 60, 60, 60, 60, 60,
+	42, 43, 44, 45, 60, 60, 60, 60,
+	60, 60, 60, 60, 60, 53, 54, 55,
+	60, 60, 60, 60, 57, 58, 59, 61,
+	65, 7, 39, 40, 38, 38, 38, 41,
+	42, 43, 44, 45, 46, 47, 41, 48,
+	5, 49, 50, 51, 52, 53, 54, 55,
+	12, 67, 38, 56, 57, 58, 59, 40,
+	12, 67, 67, 1, 70, 69, 69, 69,
+	13, 14, 15, 16, 17, 18, 19, 13,
+	20, 22, 22, 23, 24, 25, 26, 27,
+	28, 69, 69, 69, 32, 33, 34, 35,
+	70, 13, 14, 15, 16, 17, 69, 69,
+	69, 69, 69, 69, 23, 24, 25, 26,
+	27, 28, 69, 69, 69, 14, 33, 34,
+	35, 71, 14, 15, 16, 17, 69, 69,
+	69, 69, 69, 69, 69, 69, 69, 26,
+	27, 28, 69, 69, 69, 69, 33, 34,
+	35, 71, 15, 16, 17, 69, 69, 69,
+	69, 69, 69, 69, 69, 69, 69, 69,
+	69, 69, 69, 69, 69, 33, 34, 35,
+	16, 17, 69, 69, 69, 69, 69, 69,
+	69, 69, 69, 69, 69, 69, 69, 69,
+	69, 69, 33, 34, 35, 17, 69, 69,
+	69, 69, 69, 69, 69, 69, 69, 69,
+	69, 69, 69, 69, 69, 69, 33, 34,
+	35, 33, 34, 34, 15, 16, 17, 69,
+	69, 69, 69, 69, 69, 69, 69, 69,
+	26, 27, 28, 69, 69, 69, 69, 33,
+	34, 35, 71, 15, 16, 17, 69, 69,
+	69, 69, 69, 69, 69, 69, 69, 69,
+	27, 28, 69, 69, 69, 69, 33, 34,
+	35, 71, 15, 16, 17, 69, 69, 69,
+	69, 69, 69, 69, 69, 69, 69, 69,
+	28, 69, 69, 69, 69, 33, 34, 35,
+	71, 15, 16, 17, 69, 69, 69, 69,
+	69, 69, 69, 69, 69, 69, 69, 69,
+	69, 69, 69, 69, 33, 34, 35, 71,
+	14, 15, 16, 17, 69, 69, 69, 69,
+	69, 69, 23, 24, 25, 26, 27, 28,
+	69, 69, 69, 14, 33, 34, 35, 71,
+	14, 15, 16, 17, 69, 69, 69, 69,
+	69, 69, 69, 24, 25, 26, 27, 28,
+	69, 69, 69, 14, 33, 34, 35, 71,
+	14, 15, 16, 17, 69, 69, 69, 69,
+	69, 69, 69, 69, 25, 26, 27, 28,
+	69, 69, 69, 14, 33, 34, 35, 71,
+	13, 14, 15, 16, 17, 69, 19, 13,
+	69, 69, 69, 23, 24, 25, 26, 27,
+	28, 69, 69, 69, 14, 33, 34, 35,
+	71, 13, 14, 15, 16, 17, 69, 69,
+	13, 69, 69, 69, 23, 24, 25, 26,
+	27, 28, 69, 69, 69, 14, 33, 34,
+	35, 71, 13, 14, 15, 16, 17, 18,
+	19, 13, 69, 69, 69, 23, 24, 25,
+	26, 27, 28, 69, 69, 69, 14, 33,
+	34, 35, 71, 1, 70, 69, 69, 69,
+	13, 14, 15, 16, 17, 18, 19, 13,
+	20, 69, 22, 23, 24, 25, 26, 27,
+	28, 69, 69, 69, 32, 33, 34, 35,
+	70, 1, 69, 69, 69, 69, 69, 69,
+	69, 69, 69, 14, 15, 16, 17, 69,
+	69, 69, 69, 69, 69, 69, 69, 69,
+	26, 27, 28, 69, 69, 69, 69, 33,
+	34, 35, 71, 1, 73, 10, 5, 69,
+	69, 5, 1, 70, 10, 69, 69, 13,
+	14, 15, 16, 17, 18, 19, 13, 20,
+	21, 22, 23, 24, 25, 26, 27, 28,
+	29, 30, 69, 32, 33, 34, 35, 70,
+	1, 70, 69, 69, 69, 13, 14, 15,
+	16, 17, 18, 19, 13, 20, 21, 22,
+	23, 24, 25, 26, 27, 28, 69, 69,
+	69, 32, 33, 34, 35, 70, 29, 30,
+	30, 5, 72, 72, 5, 75, 74, 36,
+	36, 75, 74, 75, 36, 74, 37, 0
 };
 
-static const char _use_syllable_machine_trans_targs[] = {
-	2, 31, 42, 2, 3, 2, 26, 28, 
-	51, 52, 54, 29, 32, 33, 34, 35, 
-	36, 46, 47, 48, 55, 49, 43, 44, 
-	45, 39, 40, 41, 56, 57, 58, 50, 
-	37, 38, 2, 59, 61, 2, 4, 5, 
-	6, 7, 8, 9, 10, 21, 22, 23, 
-	24, 18, 19, 20, 13, 14, 15, 25, 
-	11, 12, 2, 2, 16, 2, 17, 2, 
-	27, 2, 30, 2, 2, 0, 1, 2, 
-	53, 2, 60
+static const signed char _use_syllable_machine_index_defaults[] = {
+	0, 0, 6, 38, 38, 60, 38, 38,
+	38, 38, 38, 38, 38, 38, 38, 38,
+	62, 38, 38, 38, 38, 38, 38, 38,
+	38, 60, 64, 66, 38, 68, 68, 69,
+	69, 69, 69, 69, 69, 69, 69, 69,
+	69, 69, 69, 69, 69, 69, 69, 69,
+	69, 69, 69, 72, 69, 69, 69, 69,
+	69, 69, 72, 74, 74, 74, 0
 };
 
-static const char _use_syllable_machine_trans_actions[] = {
-	1, 2, 2, 5, 0, 6, 0, 0, 
-	0, 0, 2, 0, 2, 2, 0, 0, 
-	0, 2, 2, 2, 2, 2, 2, 2, 
-	2, 2, 2, 2, 0, 0, 0, 2, 
-	0, 0, 7, 0, 0, 8, 0, 0, 
-	0, 0, 0, 0, 0, 0, 0, 0, 
-	0, 0, 0, 0, 0, 0, 0, 0, 
-	0, 0, 9, 10, 0, 11, 0, 12, 
-	0, 13, 0, 14, 15, 0, 0, 16, 
-	0, 17, 0
+static const signed char _use_syllable_machine_cond_targs[] = {
+	2, 31, 42, 2, 2, 3, 2, 26,
+	28, 51, 52, 54, 29, 32, 33, 34,
+	35, 36, 46, 47, 48, 55, 49, 43,
+	44, 45, 39, 40, 41, 56, 57, 58,
+	50, 37, 38, 2, 59, 61, 2, 4,
+	5, 6, 7, 8, 9, 10, 21, 22,
+	23, 24, 18, 19, 20, 13, 14, 15,
+	25, 11, 12, 2, 2, 16, 2, 17,
+	2, 27, 2, 30, 2, 2, 0, 1,
+	2, 53, 2, 60, 0
 };
 
-static const char _use_syllable_machine_to_state_actions[] = {
-	0, 0, 3, 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, 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 signed char _use_syllable_machine_cond_actions[] = {
+	1, 2, 2, 0, 5, 0, 6, 0,
+	0, 0, 0, 2, 0, 2, 2, 0,
+	0, 0, 2, 2, 2, 2, 2, 2,
+	2, 2, 2, 2, 2, 0, 0, 0,
+	2, 0, 0, 7, 0, 0, 8, 0,
+	0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 9, 10, 0, 11, 0,
+	12, 0, 13, 0, 14, 15, 0, 0,
+	16, 0, 17, 0, 0
 };
 
-static const char _use_syllable_machine_from_state_actions[] = {
-	0, 0, 4, 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, 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 signed char _use_syllable_machine_to_state_actions[] = {
+	0, 0, 3, 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, 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, 1, 0, 38, 38, 60, 38, 38, 
-	38, 38, 38, 38, 38, 38, 38, 38, 
-	62, 38, 38, 38, 38, 38, 38, 38, 
-	38, 60, 64, 66, 38, 68, 68, 69, 
-	69, 69, 69, 69, 69, 69, 69, 69, 
-	69, 69, 69, 69, 69, 69, 69, 69, 
-	69, 69, 69, 72, 69, 69, 69, 69, 
-	69, 69, 72, 74, 74, 74
+static const signed char _use_syllable_machine_from_state_actions[] = {
+	0, 0, 4, 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, 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 signed char _use_syllable_machine_eof_trans[] = {
+	1, 1, 4, 39, 39, 61, 39, 39,
+	39, 39, 39, 39, 39, 39, 39, 39,
+	63, 39, 39, 39, 39, 39, 39, 39,
+	39, 61, 65, 67, 39, 69, 69, 70,
+	70, 70, 70, 70, 70, 70, 70, 70,
+	70, 70, 70, 70, 70, 70, 70, 70,
+	70, 70, 70, 73, 70, 70, 70, 70,
+	70, 70, 73, 75, 75, 75, 0
+};
+
 static const int use_syllable_machine_start = 2;
 static const int use_syllable_machine_first_final = 2;
 static const int use_syllable_machine_error = -1;
@@ -304,185 +352,376 @@
 static const int use_syllable_machine_en_main = 2;
 
 
-#line 39 "hb-ot-shape-complex-use-machine.rl"
+#line 59 "hb-ot-shape-complex-use-machine.rl"
 
 
 
-#line 154 "hb-ot-shape-complex-use-machine.rl"
+#line 176 "hb-ot-shape-complex-use-machine.rl"
 
 
 #define found_syllable(syllable_type) \
-  HB_STMT_START { \
-    if (0) fprintf (stderr, "syllable %d..%d %s\n", (*ts).second.first, (*te).second.first, #syllable_type); \
-    for (unsigned i = (*ts).second.first; i < (*te).second.first; ++i) \
-      info[i].syllable() = (syllable_serial << 4) | use_##syllable_type; \
-    syllable_serial++; \
-    if (unlikely (syllable_serial == 16)) syllable_serial = 1; \
-  } HB_STMT_END
+HB_STMT_START { \
+	if (0) fprintf (stderr, "syllable %d..%d %s\n", (*ts).second.first, (*te).second.first, #syllable_type); \
+		for (unsigned i = (*ts).second.first; i < (*te).second.first; ++i) \
+	info[i].syllable() = (syllable_serial << 4) | syllable_type; \
+	syllable_serial++; \
+	if (unlikely (syllable_serial == 16)) syllable_serial = 1; \
+	} HB_STMT_END
 
+
+template <typename Iter>
+struct machine_index_t :
+hb_iter_with_fallback_t<machine_index_t<Iter>,
+typename Iter::item_t>
+{
+	machine_index_t (const Iter& it) : it (it) {}
+	machine_index_t (const machine_index_t& o) : it (o.it) {}
+	
+	static constexpr bool is_random_access_iterator = Iter::is_random_access_iterator;
+	static constexpr bool is_sorted_iterator = Iter::is_sorted_iterator;
+	
+	typename Iter::item_t __item__ () const { return *it; }
+	typename Iter::item_t __item_at__ (unsigned i) const { return it[i]; }
+	unsigned __len__ () const { return it.len (); }
+	void __next__ () { ++it; }
+	void __forward__ (unsigned n) { it += n; }
+	void __prev__ () { --it; }
+	void __rewind__ (unsigned n) { it -= n; }
+	void operator = (unsigned n)
+	{ unsigned index = (*it).first; if (index < n) it += n - index; else if (index > n) it -= index - n; }
+	void operator = (const machine_index_t& o) { *this = (*o.it).first; }
+	bool operator == (const machine_index_t& o) const { return (*it).first == (*o.it).first; }
+	bool operator != (const machine_index_t& o) const { return !(*this == o); }
+	
+	private:
+	Iter it;
+};
+struct
+{
+	template <typename Iter,
+	hb_requires (hb_is_iterable (Iter))>
+	machine_index_t<hb_iter_type<Iter>>
+	operator () (Iter&& it) const
+	{ return machine_index_t<hb_iter_type<Iter>> (hb_iter (it)); }
+}
+HB_FUNCOBJ (machine_index);
+
+
+
 static bool
 not_standard_default_ignorable (const hb_glyph_info_t &i)
-{ return !(i.use_category() == USE_O && _hb_glyph_info_is_default_ignorable (&i)); }
+{ return !(i.use_category() == USE(O) && _hb_glyph_info_is_default_ignorable (&i)); }
 
-static void
+static inline void
 find_syllables_use (hb_buffer_t *buffer)
 {
-  hb_glyph_info_t *info = buffer->info;
-  auto p =
-    + hb_iter (info, buffer->len)
-    | hb_enumerate
-    | hb_filter ([] (const hb_glyph_info_t &i) { return not_standard_default_ignorable (i); },
-		 hb_second)
-    | hb_filter ([&] (const hb_pair_t<unsigned, const hb_glyph_info_t &> p)
-		 {
-		   if (p.second.use_category() == USE_ZWNJ)
-		     for (unsigned i = p.first + 1; i < buffer->len; ++i)
-		       if (not_standard_default_ignorable (info[i]))
-			 return !_hb_glyph_info_is_unicode_mark (&info[i]);
-		   return true;
-		 })
-    | hb_enumerate
-    | machine_index
-    ;
-  auto pe = p + p.len ();
-  auto eof = +pe;
-  auto ts = +p;
-  auto te = +p;
-  unsigned int act HB_UNUSED;
-  int cs;
-  
-#line 355 "hb-ot-shape-complex-use-machine.hh"
+	hb_glyph_info_t *info = buffer->info;
+	auto p =
+	+ hb_iter (info, buffer->len)
+	| hb_enumerate
+	| hb_filter ([] (const hb_glyph_info_t &i) { return not_standard_default_ignorable (i); },
+	hb_second)
+	| hb_filter ([&] (const hb_pair_t<unsigned, const hb_glyph_info_t &> p)
 	{
-	cs = use_syllable_machine_start;
-	ts = 0;
-	te = 0;
-	act = 0;
+		if (p.second.use_category() == USE(ZWNJ))
+			for (unsigned i = p.first + 1; i < buffer->len; ++i)
+		if (not_standard_default_ignorable (info[i]))
+			return !_hb_glyph_info_is_unicode_mark (&info[i]);
+		return true;
+	})
+	| hb_enumerate
+	| machine_index
+	;
+	auto pe = p + p.len ();
+	auto eof = +pe;
+	auto ts = +p;
+	auto te = +p;
+	unsigned int act HB_UNUSED;
+	int cs;
+	
+#line 443 "hb-ot-shape-complex-use-machine.hh"
+	{
+		cs = (int)use_syllable_machine_start;
+		ts = 0;
+		te = 0;
 	}
-
-#line 198 "hb-ot-shape-complex-use-machine.rl"
-
-
-  unsigned int syllable_serial = 1;
-  
-#line 368 "hb-ot-shape-complex-use-machine.hh"
+	
+#line 260 "hb-ot-shape-complex-use-machine.rl"
+	
+	
+	unsigned int syllable_serial = 1;
+	
+#line 455 "hb-ot-shape-complex-use-machine.hh"
 	{
-	int _slen;
-	int _trans;
-	const unsigned char *_keys;
-	const char *_inds;
-	if ( p == pe )
-		goto _test_eof;
-_resume:
-	switch ( _use_syllable_machine_from_state_actions[cs] ) {
-	case 4:
+		unsigned int _trans = 0;
+		const unsigned char * _keys;
+		const signed char * _inds;
+		int _ic;
+		_resume: {}
+		if ( p == pe && p != eof )
+			goto _out;
+		switch ( _use_syllable_machine_from_state_actions[cs] ) {
+			case 4:  {
+				{
 #line 1 "NONE"
-	{ts = p;}
-	break;
-#line 382 "hb-ot-shape-complex-use-machine.hh"
-	}
-
-	_keys = _use_syllable_machine_trans_keys + (cs<<1);
-	_inds = _use_syllable_machine_indicies + _use_syllable_machine_index_offsets[cs];
-
-	_slen = _use_syllable_machine_key_spans[cs];
-	_trans = _inds[ _slen > 0 && _keys[0] <=( (*p).second.second.use_category()) &&
-		( (*p).second.second.use_category()) <= _keys[1] ?
-		( (*p).second.second.use_category()) - _keys[0] : _slen ];
-
-_eof_trans:
-	cs = _use_syllable_machine_trans_targs[_trans];
-
-	if ( _use_syllable_machine_trans_actions[_trans] == 0 )
-		goto _again;
-
-	switch ( _use_syllable_machine_trans_actions[_trans] ) {
-	case 2:
+					{ts = p;}}
+				
+#line 470 "hb-ot-shape-complex-use-machine.hh"
+				
+				
+				break; 
+			}
+		}
+		
+		if ( p == eof ) {
+			if ( _use_syllable_machine_eof_trans[cs] > 0 ) {
+				_trans = (unsigned int)_use_syllable_machine_eof_trans[cs] - 1;
+			}
+		}
+		else {
+			_keys = ( _use_syllable_machine_trans_keys + ((cs<<1)));
+			_inds = ( _use_syllable_machine_indicies + (_use_syllable_machine_index_offsets[cs]));
+			
+			if ( ((*p).second.second.use_category()) <= 52 ) {
+				_ic = (int)_use_syllable_machine_char_class[(int)((*p).second.second.use_category()) - 0];
+				if ( _ic <= (int)(*( _keys+1)) && _ic >= (int)(*( _keys)) )
+					_trans = (unsigned int)(*( _inds + (int)( _ic - (int)(*( _keys)) ) )); 
+				else
+					_trans = (unsigned int)_use_syllable_machine_index_defaults[cs];
+			}
+			else {
+				_trans = (unsigned int)_use_syllable_machine_index_defaults[cs];
+			}
+			
+		}
+		cs = (int)_use_syllable_machine_cond_targs[_trans];
+		
+		if ( _use_syllable_machine_cond_actions[_trans] != 0 ) {
+			
+			switch ( _use_syllable_machine_cond_actions[_trans] ) {
+				case 2:  {
+					{
 #line 1 "NONE"
-	{te = p+1;}
-	break;
-	case 5:
-#line 141 "hb-ot-shape-complex-use-machine.rl"
-	{te = p+1;{ found_syllable (independent_cluster); }}
-	break;
-	case 9:
-#line 144 "hb-ot-shape-complex-use-machine.rl"
-	{te = p+1;{ found_syllable (standard_cluster); }}
-	break;
-	case 7:
-#line 149 "hb-ot-shape-complex-use-machine.rl"
-	{te = p+1;{ found_syllable (broken_cluster); }}
-	break;
-	case 6:
-#line 150 "hb-ot-shape-complex-use-machine.rl"
-	{te = p+1;{ found_syllable (non_cluster); }}
-	break;
-	case 10:
-#line 142 "hb-ot-shape-complex-use-machine.rl"
-	{te = p;p--;{ found_syllable (virama_terminated_cluster); }}
-	break;
-	case 11:
-#line 143 "hb-ot-shape-complex-use-machine.rl"
-	{te = p;p--;{ found_syllable (sakot_terminated_cluster); }}
-	break;
-	case 8:
-#line 144 "hb-ot-shape-complex-use-machine.rl"
-	{te = p;p--;{ found_syllable (standard_cluster); }}
-	break;
-	case 13:
-#line 145 "hb-ot-shape-complex-use-machine.rl"
-	{te = p;p--;{ found_syllable (number_joiner_terminated_cluster); }}
-	break;
-	case 12:
-#line 146 "hb-ot-shape-complex-use-machine.rl"
-	{te = p;p--;{ found_syllable (numeral_cluster); }}
-	break;
-	case 14:
-#line 147 "hb-ot-shape-complex-use-machine.rl"
-	{te = p;p--;{ found_syllable (symbol_cluster); }}
-	break;
-	case 17:
-#line 148 "hb-ot-shape-complex-use-machine.rl"
-	{te = p;p--;{ found_syllable (hieroglyph_cluster); }}
-	break;
-	case 15:
-#line 149 "hb-ot-shape-complex-use-machine.rl"
-	{te = p;p--;{ found_syllable (broken_cluster); }}
-	break;
-	case 16:
-#line 150 "hb-ot-shape-complex-use-machine.rl"
-	{te = p;p--;{ found_syllable (non_cluster); }}
-	break;
-	case 1:
-#line 149 "hb-ot-shape-complex-use-machine.rl"
-	{{p = ((te))-1;}{ found_syllable (broken_cluster); }}
-	break;
-#line 460 "hb-ot-shape-complex-use-machine.hh"
-	}
-
-_again:
-	switch ( _use_syllable_machine_to_state_actions[cs] ) {
-	case 3:
+						{te = p+1;}}
+					
+#line 508 "hb-ot-shape-complex-use-machine.hh"
+					
+					
+					break; 
+				}
+				case 5:  {
+					{
+#line 163 "hb-ot-shape-complex-use-machine.rl"
+						{te = p+1;{
+#line 163 "hb-ot-shape-complex-use-machine.rl"
+								found_syllable (use_independent_cluster); }
+						}}
+					
+#line 521 "hb-ot-shape-complex-use-machine.hh"
+					
+					
+					break; 
+				}
+				case 9:  {
+					{
+#line 166 "hb-ot-shape-complex-use-machine.rl"
+						{te = p+1;{
+#line 166 "hb-ot-shape-complex-use-machine.rl"
+								found_syllable (use_standard_cluster); }
+						}}
+					
+#line 534 "hb-ot-shape-complex-use-machine.hh"
+					
+					
+					break; 
+				}
+				case 7:  {
+					{
+#line 171 "hb-ot-shape-complex-use-machine.rl"
+						{te = p+1;{
+#line 171 "hb-ot-shape-complex-use-machine.rl"
+								found_syllable (use_broken_cluster); }
+						}}
+					
+#line 547 "hb-ot-shape-complex-use-machine.hh"
+					
+					
+					break; 
+				}
+				case 6:  {
+					{
+#line 172 "hb-ot-shape-complex-use-machine.rl"
+						{te = p+1;{
+#line 172 "hb-ot-shape-complex-use-machine.rl"
+								found_syllable (use_non_cluster); }
+						}}
+					
+#line 560 "hb-ot-shape-complex-use-machine.hh"
+					
+					
+					break; 
+				}
+				case 10:  {
+					{
+#line 164 "hb-ot-shape-complex-use-machine.rl"
+						{te = p;p = p - 1;{
+#line 164 "hb-ot-shape-complex-use-machine.rl"
+								found_syllable (use_virama_terminated_cluster); }
+						}}
+					
+#line 573 "hb-ot-shape-complex-use-machine.hh"
+					
+					
+					break; 
+				}
+				case 11:  {
+					{
+#line 165 "hb-ot-shape-complex-use-machine.rl"
+						{te = p;p = p - 1;{
+#line 165 "hb-ot-shape-complex-use-machine.rl"
+								found_syllable (use_sakot_terminated_cluster); }
+						}}
+					
+#line 586 "hb-ot-shape-complex-use-machine.hh"
+					
+					
+					break; 
+				}
+				case 8:  {
+					{
+#line 166 "hb-ot-shape-complex-use-machine.rl"
+						{te = p;p = p - 1;{
+#line 166 "hb-ot-shape-complex-use-machine.rl"
+								found_syllable (use_standard_cluster); }
+						}}
+					
+#line 599 "hb-ot-shape-complex-use-machine.hh"
+					
+					
+					break; 
+				}
+				case 13:  {
+					{
+#line 167 "hb-ot-shape-complex-use-machine.rl"
+						{te = p;p = p - 1;{
+#line 167 "hb-ot-shape-complex-use-machine.rl"
+								found_syllable (use_number_joiner_terminated_cluster); }
+						}}
+					
+#line 612 "hb-ot-shape-complex-use-machine.hh"
+					
+					
+					break; 
+				}
+				case 12:  {
+					{
+#line 168 "hb-ot-shape-complex-use-machine.rl"
+						{te = p;p = p - 1;{
+#line 168 "hb-ot-shape-complex-use-machine.rl"
+								found_syllable (use_numeral_cluster); }
+						}}
+					
+#line 625 "hb-ot-shape-complex-use-machine.hh"
+					
+					
+					break; 
+				}
+				case 14:  {
+					{
+#line 169 "hb-ot-shape-complex-use-machine.rl"
+						{te = p;p = p - 1;{
+#line 169 "hb-ot-shape-complex-use-machine.rl"
+								found_syllable (use_symbol_cluster); }
+						}}
+					
+#line 638 "hb-ot-shape-complex-use-machine.hh"
+					
+					
+					break; 
+				}
+				case 17:  {
+					{
+#line 170 "hb-ot-shape-complex-use-machine.rl"
+						{te = p;p = p - 1;{
+#line 170 "hb-ot-shape-complex-use-machine.rl"
+								found_syllable (use_hieroglyph_cluster); }
+						}}
+					
+#line 651 "hb-ot-shape-complex-use-machine.hh"
+					
+					
+					break; 
+				}
+				case 15:  {
+					{
+#line 171 "hb-ot-shape-complex-use-machine.rl"
+						{te = p;p = p - 1;{
+#line 171 "hb-ot-shape-complex-use-machine.rl"
+								found_syllable (use_broken_cluster); }
+						}}
+					
+#line 664 "hb-ot-shape-complex-use-machine.hh"
+					
+					
+					break; 
+				}
+				case 16:  {
+					{
+#line 172 "hb-ot-shape-complex-use-machine.rl"
+						{te = p;p = p - 1;{
+#line 172 "hb-ot-shape-complex-use-machine.rl"
+								found_syllable (use_non_cluster); }
+						}}
+					
+#line 677 "hb-ot-shape-complex-use-machine.hh"
+					
+					
+					break; 
+				}
+				case 1:  {
+					{
+#line 171 "hb-ot-shape-complex-use-machine.rl"
+						{p = ((te))-1;
+							{
+#line 171 "hb-ot-shape-complex-use-machine.rl"
+								found_syllable (use_broken_cluster); }
+						}}
+					
+#line 691 "hb-ot-shape-complex-use-machine.hh"
+					
+					
+					break; 
+				}
+			}
+			
+		}
+		
+		if ( p == eof ) {
+			if ( cs >= 2 )
+				goto _out;
+		}
+		else {
+			switch ( _use_syllable_machine_to_state_actions[cs] ) {
+				case 3:  {
+					{
 #line 1 "NONE"
-	{ts = 0;}
-	break;
-#line 469 "hb-ot-shape-complex-use-machine.hh"
+						{ts = 0;}}
+					
+#line 711 "hb-ot-shape-complex-use-machine.hh"
+					
+					
+					break; 
+				}
+			}
+			
+			p += 1;
+			goto _resume;
+		}
+		_out: {}
 	}
-
-	if ( ++p != pe )
-		goto _resume;
-	_test_eof: {}
-	if ( p == eof )
-	{
-	if ( _use_syllable_machine_eof_trans[cs] > 0 ) {
-		_trans = _use_syllable_machine_eof_trans[cs] - 1;
-		goto _eof_trans;
-	}
-	}
-
-	}
-
-#line 203 "hb-ot-shape-complex-use-machine.rl"
-
+	
+#line 265 "hb-ot-shape-complex-use-machine.rl"
+	
 }
 
 #undef found_syllable

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-use-machine.rl
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-use-machine.rl	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-use-machine.rl	2021-04-17 22:31:16 UTC (rev 58898)
@@ -30,61 +30,83 @@
 #define HB_OT_SHAPE_COMPLEX_USE_MACHINE_HH
 
 #include "hb.hh"
-#include "hb-ot-shape-complex-machine-index.hh"
 
+#include "hb-ot-shape-complex-syllabic.hh"
+
+/* buffer var allocations */
+#define use_category() complex_var_u8_category()
+
+#define USE(Cat) use_syllable_machine_ex_##Cat
+
+enum use_syllable_type_t {
+  use_independent_cluster,
+  use_virama_terminated_cluster,
+  use_sakot_terminated_cluster,
+  use_standard_cluster,
+  use_number_joiner_terminated_cluster,
+  use_numeral_cluster,
+  use_symbol_cluster,
+  use_hieroglyph_cluster,
+  use_broken_cluster,
+  use_non_cluster,
+};
+
 %%{
   machine use_syllable_machine;
   alphtype unsigned char;
+  write exports;
   write data;
 }%%
 
 %%{
 
-# Same order as enum use_category_t.  Not sure how to avoid duplication.
+# Categories used in the Universal Shaping Engine spec:
+# https://docs.microsoft.com/en-us/typography/script-development/use
 
-O	= 0; # OTHER
+export O	= 0; # OTHER
 
-B	= 1; # BASE
-N	= 4; # BASE_NUM
-GB	= 5; # BASE_OTHER
-SUB	= 11; # CONS_SUB
-H	= 12; # HALANT
+export B	= 1; # BASE
+export N	= 4; # BASE_NUM
+export GB	= 5; # BASE_OTHER
+export SUB	= 11; # CONS_SUB
+export H	= 12; # HALANT
 
-HN	= 13; # HALANT_NUM
-ZWNJ	= 14; # Zero width non-joiner
-R	= 18; # REPHA
-S	= 19; # SYM
-CS	= 43; # CONS_WITH_STACKER
-HVM	= 44; # HALANT_OR_VOWEL_MODIFIER
-Sk	= 48; # SAKOT
-G	= 49; # HIEROGLYPH
-J	= 50; # HIEROGLYPH_JOINER
-SB	= 51; # HIEROGLYPH_SEGMENT_BEGIN
-SE	= 52; # HIEROGLYPH_SEGMENT_END
+export HN	= 13; # HALANT_NUM
+export ZWNJ	= 14; # Zero width non-joiner
+export R	= 18; # REPHA
+export S	= 19; # SYM
+export CS	= 43; # CONS_WITH_STACKER
+export HVM	= 44; # HALANT_OR_VOWEL_MODIFIER
+export Sk	= 48; # SAKOT
+export G	= 49; # HIEROGLYPH
+export J	= 50; # HIEROGLYPH_JOINER
+export SB	= 51; # HIEROGLYPH_SEGMENT_BEGIN
+export SE	= 52; # HIEROGLYPH_SEGMENT_END
 
-FAbv	= 24; # CONS_FINAL_ABOVE
-FBlw	= 25; # CONS_FINAL_BELOW
-FPst	= 26; # CONS_FINAL_POST
-MAbv	= 27; # CONS_MED_ABOVE
-MBlw	= 28; # CONS_MED_BELOW
-MPst	= 29; # CONS_MED_POST
-MPre	= 30; # CONS_MED_PRE
-CMAbv	= 31; # CONS_MOD_ABOVE
-CMBlw	= 32; # CONS_MOD_BELOW
-VAbv	= 33; # VOWEL_ABOVE / VOWEL_ABOVE_BELOW / VOWEL_ABOVE_BELOW_POST / VOWEL_ABOVE_POST
-VBlw	= 34; # VOWEL_BELOW / VOWEL_BELOW_POST
-VPst	= 35; # VOWEL_POST	UIPC = Right
-VPre	= 22; # VOWEL_PRE / VOWEL_PRE_ABOVE / VOWEL_PRE_ABOVE_POST / VOWEL_PRE_POST
-VMAbv	= 37; # VOWEL_MOD_ABOVE
-VMBlw	= 38; # VOWEL_MOD_BELOW
-VMPst	= 39; # VOWEL_MOD_POST
-VMPre	= 23; # VOWEL_MOD_PRE
-SMAbv	= 41; # SYM_MOD_ABOVE
-SMBlw	= 42; # SYM_MOD_BELOW
-FMAbv	= 45; # CONS_FINAL_MOD	UIPC = Top
-FMBlw	= 46; # CONS_FINAL_MOD	UIPC = Bottom
-FMPst	= 47; # CONS_FINAL_MOD	UIPC = Not_Applicable
+export FAbv	= 24; # CONS_FINAL_ABOVE
+export FBlw	= 25; # CONS_FINAL_BELOW
+export FPst	= 26; # CONS_FINAL_POST
+export MAbv	= 27; # CONS_MED_ABOVE
+export MBlw	= 28; # CONS_MED_BELOW
+export MPst	= 29; # CONS_MED_POST
+export MPre	= 30; # CONS_MED_PRE
+export CMAbv	= 31; # CONS_MOD_ABOVE
+export CMBlw	= 32; # CONS_MOD_BELOW
+export VAbv	= 33; # VOWEL_ABOVE / VOWEL_ABOVE_BELOW / VOWEL_ABOVE_BELOW_POST / VOWEL_ABOVE_POST
+export VBlw	= 34; # VOWEL_BELOW / VOWEL_BELOW_POST
+export VPst	= 35; # VOWEL_POST	UIPC = Right
+export VPre	= 22; # VOWEL_PRE / VOWEL_PRE_ABOVE / VOWEL_PRE_ABOVE_POST / VOWEL_PRE_POST
+export VMAbv	= 37; # VOWEL_MOD_ABOVE
+export VMBlw	= 38; # VOWEL_MOD_BELOW
+export VMPst	= 39; # VOWEL_MOD_POST
+export VMPre	= 23; # VOWEL_MOD_PRE
+export SMAbv	= 41; # SYM_MOD_ABOVE
+export SMBlw	= 42; # SYM_MOD_BELOW
+export FMAbv	= 45; # CONS_FINAL_MOD	UIPC = Top
+export FMBlw	= 46; # CONS_FINAL_MOD	UIPC = Bottom
+export FMPst	= 47; # CONS_FINAL_MOD	UIPC = Not_Applicable
 
+
 h = H | HVM | Sk;
 
 consonant_modifiers = CMAbv* CMBlw* ((h B | SUB) CMAbv? CMBlw*)*;
@@ -138,16 +160,16 @@
 other = any;
 
 main := |*
-	independent_cluster			=> { found_syllable (independent_cluster); };
-	virama_terminated_cluster		=> { found_syllable (virama_terminated_cluster); };
-	sakot_terminated_cluster		=> { found_syllable (sakot_terminated_cluster); };
-	standard_cluster			=> { found_syllable (standard_cluster); };
-	number_joiner_terminated_cluster	=> { found_syllable (number_joiner_terminated_cluster); };
-	numeral_cluster				=> { found_syllable (numeral_cluster); };
-	symbol_cluster				=> { found_syllable (symbol_cluster); };
-	hieroglyph_cluster			=> { found_syllable (hieroglyph_cluster); };
-	broken_cluster				=> { found_syllable (broken_cluster); };
-	other					=> { found_syllable (non_cluster); };
+	independent_cluster			=> { found_syllable (use_independent_cluster); };
+	virama_terminated_cluster		=> { found_syllable (use_virama_terminated_cluster); };
+	sakot_terminated_cluster		=> { found_syllable (use_sakot_terminated_cluster); };
+	standard_cluster			=> { found_syllable (use_standard_cluster); };
+	number_joiner_terminated_cluster	=> { found_syllable (use_number_joiner_terminated_cluster); };
+	numeral_cluster				=> { found_syllable (use_numeral_cluster); };
+	symbol_cluster				=> { found_syllable (use_symbol_cluster); };
+	hieroglyph_cluster			=> { found_syllable (use_hieroglyph_cluster); };
+	broken_cluster				=> { found_syllable (use_broken_cluster); };
+	other					=> { found_syllable (use_non_cluster); };
 *|;
 
 
@@ -157,16 +179,56 @@
   HB_STMT_START { \
     if (0) fprintf (stderr, "syllable %d..%d %s\n", (*ts).second.first, (*te).second.first, #syllable_type); \
     for (unsigned i = (*ts).second.first; i < (*te).second.first; ++i) \
-      info[i].syllable() = (syllable_serial << 4) | use_##syllable_type; \
+      info[i].syllable() = (syllable_serial << 4) | syllable_type; \
     syllable_serial++; \
     if (unlikely (syllable_serial == 16)) syllable_serial = 1; \
   } HB_STMT_END
 
+
+template <typename Iter>
+struct machine_index_t :
+  hb_iter_with_fallback_t<machine_index_t<Iter>,
+			  typename Iter::item_t>
+{
+  machine_index_t (const Iter& it) : it (it) {}
+  machine_index_t (const machine_index_t& o) : it (o.it) {}
+
+  static constexpr bool is_random_access_iterator = Iter::is_random_access_iterator;
+  static constexpr bool is_sorted_iterator = Iter::is_sorted_iterator;
+
+  typename Iter::item_t __item__ () const { return *it; }
+  typename Iter::item_t __item_at__ (unsigned i) const { return it[i]; }
+  unsigned __len__ () const { return it.len (); }
+  void __next__ () { ++it; }
+  void __forward__ (unsigned n) { it += n; }
+  void __prev__ () { --it; }
+  void __rewind__ (unsigned n) { it -= n; }
+  void operator = (unsigned n)
+  { unsigned index = (*it).first; if (index < n) it += n - index; else if (index > n) it -= index - n; }
+  void operator = (const machine_index_t& o) { *this = (*o.it).first; }
+  bool operator == (const machine_index_t& o) const { return (*it).first == (*o.it).first; }
+  bool operator != (const machine_index_t& o) const { return !(*this == o); }
+
+  private:
+  Iter it;
+};
+struct
+{
+  template <typename Iter,
+	    hb_requires (hb_is_iterable (Iter))>
+  machine_index_t<hb_iter_type<Iter>>
+  operator () (Iter&& it) const
+  { return machine_index_t<hb_iter_type<Iter>> (hb_iter (it)); }
+}
+HB_FUNCOBJ (machine_index);
+
+
+
 static bool
 not_standard_default_ignorable (const hb_glyph_info_t &i)
-{ return !(i.use_category() == USE_O && _hb_glyph_info_is_default_ignorable (&i)); }
+{ return !(i.use_category() == USE(O) && _hb_glyph_info_is_default_ignorable (&i)); }
 
-static void
+static inline void
 find_syllables_use (hb_buffer_t *buffer)
 {
   hb_glyph_info_t *info = buffer->info;
@@ -177,7 +239,7 @@
 		 hb_second)
     | hb_filter ([&] (const hb_pair_t<unsigned, const hb_glyph_info_t &> p)
 		 {
-		   if (p.second.use_category() == USE_ZWNJ)
+		   if (p.second.use_category() == USE(ZWNJ))
 		     for (unsigned i = p.first + 1; i < buffer->len; ++i)
 		       if (not_standard_default_ignorable (info[i]))
 			 return !_hb_glyph_info_is_unicode_mark (&info[i]);

Deleted: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-use-table.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-use-table.cc	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-use-table.cc	2021-04-17 22:31:16 UTC (rev 58898)
@@ -1,1202 +0,0 @@
-/* == Start of generated table == */
-/*
- * The following table is generated by running:
- *
- *   ./gen-use-table.py IndicSyllabicCategory.txt IndicPositionalCategory.txt UnicodeData.txt ArabicShaping.txt Blocks.txt IndicSyllabicCategory-Additional.txt IndicPositionalCategory-Additional.txt
- *
- * on files with these headers:
- *
- * # IndicSyllabicCategory-13.0.0.txt
- * # Date: 2019-07-22, 19:55:00 GMT [KW, RP]
- * # IndicPositionalCategory-13.0.0.txt
- * # Date: 2019-07-23, 00:01:00 GMT [KW, RP]
- * # ArabicShaping-13.0.0.txt
- * # Date: 2020-01-31, 23:55:00 GMT [KW, RP]
- * # Blocks-13.0.0.txt
- * # Date: 2019-07-10, 19:06:00 GMT [KW]
- * # Override values For Indic_Syllabic_Category
- * # Not derivable
- * # Initial version based on Unicode 7.0 by Andrew Glass 2014-03-17
- * # Updated  for Unicode 10.0 by Andrew Glass 2017-07-25
- * # Updated  for Unicode 12.1 by Andrew Glass 2019-05-24
- * # Updated  for Unicode 13.0 by Andrew Glass 2020-07-28
- * # Override values For Indic_Positional_Category
- * # Not derivable
- * # Initial version based on Unicode 7.0 by Andrew Glass 2014-03-17
- * # Updated  for Unicode 10.0 by Andrew Glass 2017-07-25
- * # Ammended for Unicode 10.0 by Andrew Glass 2018-09-21
- * # Updated  for L2/19-083    by Andrew Glass 2019-05-06
- * # Updated  for Unicode 12.1 by Andrew Glass 2019-05-30
- * # Updated  for Unicode 13.0 by Andrew Glass 2020-07-28
- * UnicodeData.txt does not have a header.
- */
-
-#include "hb.hh"
-
-#ifndef HB_NO_OT_SHAPE
-
-#include "hb-ot-shape-complex-use.hh"
-
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wunused-macros"
-#define B	USE_B	/* BASE */
-#define CS	USE_CS	/* CONS_WITH_STACKER */
-#define G	USE_G	/* HIEROGLYPH */
-#define GB	USE_GB	/* BASE_OTHER */
-#define H	USE_H	/* HALANT */
-#define HN	USE_HN	/* HALANT_NUM */
-#define HVM	USE_HVM	/* HALANT_OR_VOWEL_MODIFIER */
-#define J	USE_J	/* HIEROGLYPH_JOINER */
-#define N	USE_N	/* BASE_NUM */
-#define O	USE_O	/* OTHER */
-#define R	USE_R	/* REPHA */
-#define S	USE_S	/* SYM */
-#define SB	USE_SB	/* HIEROGLYPH_SEGMENT_BEGIN */
-#define SE	USE_SE	/* HIEROGLYPH_SEGMENT_END */
-#define SUB	USE_SUB	/* CONS_SUB */
-#define Sk	USE_Sk	/* SAKOT */
-#define ZWNJ	USE_ZWNJ	/* ZWNJ */
-#define CMAbv	USE_CMAbv
-#define CMBlw	USE_CMBlw
-#define FAbv	USE_FAbv
-#define FBlw	USE_FBlw
-#define FPst	USE_FPst
-#define FMAbv	USE_FMAbv
-#define FMBlw	USE_FMBlw
-#define FMPst	USE_FMPst
-#define MAbv	USE_MAbv
-#define MBlw	USE_MBlw
-#define MPst	USE_MPst
-#define MPre	USE_MPre
-#define SMAbv	USE_SMAbv
-#define SMBlw	USE_SMBlw
-#define VAbv	USE_VAbv
-#define VBlw	USE_VBlw
-#define VPst	USE_VPst
-#define VPre	USE_VPre
-#define VMAbv	USE_VMAbv
-#define VMBlw	USE_VMBlw
-#define VMPst	USE_VMPst
-#define VMPre	USE_VMPre
-#pragma GCC diagnostic pop
-
-static const USE_TABLE_ELEMENT_TYPE use_table[] = {
-
-
-#define use_offset_0x0028u 0
-
-
-  /* Basic Latin */
-                                                                         O,     O,     O,     O,     O,    GB,     O,     O,
-  /* 0030 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
-
-#define use_offset_0x00a0u 24
-
-
-  /* Latin-1 Supplement */
-
-  /* 00A0 */    GB,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
-  /* 00B0 */     O,     O, FMPst, FMPst,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
-  /* 00C0 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
-  /* 00D0 */     O,     O,     O,     O,     O,     O,     O,    GB,
-
-#define use_offset_0x0640u 80
-
-
-  /* Arabic */
-
-  /* 0640 */     B,     O,     O,     O,     O,     O,     O,     O,
-
-#define use_offset_0x07c8u 88
-
-
-  /* NKo */
-                                                                         O,     O,     B,     B,     B,     B,     B,     B,
-  /* 07D0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 07E0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv,
-  /* 07F0 */ VMAbv, VMAbv, VMAbv, VMAbv,     O,     O,     O,     O,     O,     O,     B,     O,     O, VMAbv,     O,     O,
-
-#define use_offset_0x0840u 144
-
-
-  /* Mandaic */
-
-  /* 0840 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 0850 */     B,     B,     B,     B,     B,     B,     B,     B,     B, CMBlw, CMBlw, CMBlw,     O,     O,     O,     O,
-
-#define use_offset_0x0900u 176
-
-
-  /* Devanagari */
-
-  /* 0900 */ VMAbv, VMAbv, VMAbv, VMPst,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 0910 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 0920 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 0930 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,  VAbv,  VPst, CMBlw,     B,  VPst,  VPre,
-  /* 0940 */  VPst,  VBlw,  VBlw,  VBlw,  VBlw,  VAbv,  VAbv,  VAbv,  VAbv,  VPst,  VPst,  VPst,  VPst,     H,  VPre,  VPst,
-  /* 0950 */     O, VMAbv, VMBlw,     O,     O,  VAbv,  VBlw,  VBlw,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 0960 */     B,     B,  VBlw,  VBlw,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 0970 */     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-
-  /* Bengali */
-
-  /* 0980 */    GB, VMAbv, VMPst, VMPst,     O,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     B,
-  /* 0990 */     B,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 09A0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,     B,     B,     B,     B,     B,
-  /* 09B0 */     B,     O,     B,     O,     O,     O,     B,     B,     B,     B,     O,     O, CMBlw,     B,  VPst,  VPre,
-  /* 09C0 */  VPst,  VBlw,  VBlw,  VBlw,  VBlw,     O,     O,  VPre,  VPre,     O,     O,  VPre,  VPre,     H,     O,     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,     B,     O, FMAbv,     O,
-
-  /* Gurmukhi */
-
-  /* 0A00 */     O, VMAbv, VMAbv, VMPst,     O,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     B,
-  /* 0A10 */     B,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 0A20 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,     B,     B,     B,     B,     B,
-  /* 0A30 */     B,     O,     B,     B,     O,     B,     B,     O,     B,     B,     O,     O, CMBlw,     O,  VPst,  VPre,
-  /* 0A40 */  VPst,  VBlw,  VBlw,     O,     O,     O,     O,  VAbv,  VAbv,     O,     O,  VAbv,  VAbv,     H,     O,     O,
-  /* 0A50 */     O, VMBlw,     O,     O,     O,     O,     O,     O,     O,     B,     B,     B,     B,     O,     B,     O,
-  /* 0A60 */     O,     O,     O,     O,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 0A70 */ VMAbv, CMAbv,    GB,    GB,     O,  MBlw,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
-
-  /* Gujarati */
-
-  /* 0A80 */     O, VMAbv, VMAbv, VMPst,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,
-  /* 0A90 */     B,     B,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 0AA0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,     B,     B,     B,     B,     B,
-  /* 0AB0 */     B,     O,     B,     B,     O,     B,     B,     B,     B,     B,     O,     O, CMBlw,     B,  VPst,  VPre,
-  /* 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, VMAbv, VMAbv, VMAbv, CMAbv, CMAbv, CMAbv,
-
-  /* Oriya */
-
-  /* 0B00 */     O, VMAbv, VMPst, VMPst,     O,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     B,
-  /* 0B10 */     B,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 0B20 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,     B,     B,     B,     B,     B,
-  /* 0B30 */     B,     O,     B,     B,     O,     B,     B,     B,     B,     B,     O,     O, CMBlw,     B,  VPst,  VAbv,
-  /* 0B40 */  VPst,  VBlw,  VBlw,  VBlw,  VBlw,     O,     O,  VPre,  VPre,     O,     O,  VPre,  VPre,     H,     O,     O,
-  /* 0B50 */     O,     O,     O,     O,     O,  VAbv,  VAbv,  VAbv,     O,     O,     O,     O,     B,     B,     O,     B,
-  /* 0B60 */     B,     B,  VBlw,  VBlw,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 0B70 */     O,     B,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
-
-  /* Tamil */
-
-  /* 0B80 */     O,     O, VMAbv,     O,     O,     B,     B,     B,     B,     B,     B,     O,     O,     O,     B,     B,
-  /* 0B90 */     B,     O,     B,     B,     B,     B,     O,     O,     O,     B,     B,     O,     B,     O,     B,     B,
-  /* 0BA0 */     O,     O,     O,     B,     B,     O,     O,     O,     B,     B,     B,     O,     O,     O,     B,     B,
-  /* 0BB0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,  VPst,  VPst,
-  /* 0BC0 */  VAbv,  VPst,  VPst,     O,     O,     O,  VPre,  VPre,  VPre,     O,  VPre,  VPre,  VPre,     H,     O,     O,
-  /* 0BD0 */     O,     O,     O,     O,     O,     O,     O,  VPst,     O,     O,     O,     O,     O,     O,     O,     O,
-  /* 0BE0 */     O,     O,     O,     O,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 0BF0 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
-
-  /* Telugu */
-
-  /* 0C00 */ VMAbv, VMPst, VMPst, VMPst, VMAbv,     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,     B,
-  /* 0C10 */     B,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 0C20 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,     B,     B,     B,     B,     B,
-  /* 0C30 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     B,  VAbv,  VAbv,
-  /* 0C40 */  VAbv,  VPst,  VPst,  VPst,  VPst,     O,  VAbv,  VAbv,  VAbv,     O,  VAbv,  VAbv,  VAbv,     H,     O,     O,
-  /* 0C50 */     O,     O,     O,     O,     O,  VAbv,  VBlw,     O,     B,     B,     B,     O,     O,     O,     O,     O,
-  /* 0C60 */     B,     B,  VBlw,  VBlw,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 0C70 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
-
-  /* Kannada */
-
-  /* 0C80 */     B, VMAbv, VMPst, VMPst,     O,     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,     B,
-  /* 0C90 */     B,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 0CA0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,     B,     B,     B,     B,     B,
-  /* 0CB0 */     B,     B,     B,     B,     O,     B,     B,     B,     B,     B,     O,     O, CMBlw,     B,  VPst,  VAbv,
-  /* 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,    CS,    CS,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
-
-  /* Malayalam */
-
-  /* 0D00 */ VMAbv, VMAbv, VMPst, VMPst,     B,     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,  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,     O,     O,     O,  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,
-  /* 0D70 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
-
-  /* Sinhala */
-
-  /* 0D80 */     O, VMAbv, VMPst, VMPst,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 0D90 */     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     B,     B,     B,     B,     B,     B,
-  /* 0DA0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 0DB0 */     B,     B,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,     O,     O,
-  /* 0DC0 */     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     H,     O,     O,     O,     O,  VPst,
-  /* 0DD0 */  VPst,  VPst,  VAbv,  VAbv,  VBlw,     O,  VBlw,     O,  VPst,  VPre,  VPre,  VPre,  VPre,  VPre,  VPre,  VPst,
-  /* 0DE0 */     O,     O,     O,     O,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 0DF0 */     O,     O,  VPst,  VPst,     O,     O,     O,     O,
-
-#define use_offset_0x0f00u 1448
-
-
-  /* Tibetan */
-
-  /* 0F00 */     B,     B,     O,     O,     B,     B,     B,     O,     O,     O,     O,     O,     O,     O,     O,     O,
-  /* 0F10 */     O,     O,     O,     O,     O,     O,     O,     O,  VBlw,  VBlw,     O,     O,     O,     O,     O,     O,
-  /* 0F20 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 0F30 */     B,     B,     B,     B,     O,  FBlw,     O,  FBlw,     O, CMAbv,     O,     O,     O,     O,  VPst,  VPre,
-  /* 0F40 */     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,     B,     B,     B,     B,     B,     B,
-  /* 0F50 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 0F60 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,
-  /* 0F70 */     O, CMBlw,  VBlw,  VAbv,  VAbv,  VBlw,  VAbv,  VAbv,  VAbv,  VAbv,  VBlw,  VBlw,  VBlw,  VBlw, VMAbv,     O,
-  /* 0F80 */  VBlw,  VAbv, VMAbv, VMAbv,  VBlw,     O, VMAbv, VMAbv,     B,     B,     B,     B,     B,   SUB,   SUB,   SUB,
-  /* 0F90 */   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,     O,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,
-  /* 0FA0 */   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,
-  /* 0FB0 */   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,     O,     O,     O,
-  /* 0FC0 */     O,     O,     O,     O,     O,     O,  FBlw,     O,
-
-#define use_offset_0x1000u 1648
-
-
-  /* Myanmar */
-
-  /* 1000 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 1010 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 1020 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,  VPst,  VPst,  VAbv,  VAbv,  VBlw,
-  /* 1030 */  VBlw,  VPre,  VAbv,  VAbv,  VAbv,  VAbv, VMAbv, VMBlw, VMPst,     H,  VAbv,  MPst,  MPre,  MBlw,  MBlw,     B,
-  /* 1040 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,    GB,     O,     O,    GB,     O,
-  /* 1050 */     B,     B,     B,     B,     B,     B,  VPst,  VPst,  VBlw,  VBlw,     B,     B,     B,     B,  MBlw,  MBlw,
-  /* 1060 */  MBlw,     B,  VPst, VMPst, VMPst,     B,     B,  VPst,  VPst, VMPst, VMPst, VMPst, VMPst, VMPst,     B,     B,
-  /* 1070 */     B,  VAbv,  VAbv,  VAbv,  VAbv,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 1080 */     B,     B,  MBlw,  VPst,  VPre,  VAbv,  VAbv, VMPst, VMPst, VMPst, VMPst, VMPst, VMPst, VMBlw,     B, VMPst,
-  /* 1090 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B, VMPst, VMPst,  VPst,  VAbv,     O,     O,
-
-#define use_offset_0x1700u 1808
-
-
-  /* Tagalog */
-
-  /* 1700 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,     B,
-  /* 1710 */     B,     B,  VAbv,  VBlw,  VBlw,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
-
-  /* Hanunoo */
-
-  /* 1720 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 1730 */     B,     B,  VAbv,  VBlw,  VBlw,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
-
-  /* Buhid */
-
-  /* 1740 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 1750 */     B,     B,  VAbv,  VBlw,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
-
-  /* Tagbanwa */
-
-  /* 1760 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,     B,
-  /* 1770 */     B,     O,  VAbv,  VBlw,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
-
-  /* Khmer */
-
-  /* 1780 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 1790 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 17A0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 17B0 */     B,     B,     B,     B,     O,     O,  VPst,  VAbv,  VAbv,  VAbv,  VAbv,  VBlw,  VBlw,  VBlw,  VPre,  VPre,
-  /* 17C0 */  VPre,  VPre,  VPre,  VPre,  VPre,  VPre, VMAbv, VMPst,  VPst, VMAbv, VMAbv, FMAbv,  FAbv, CMAbv, FMAbv, VMAbv,
-  /* 17D0 */ FMAbv,  VAbv,     H, FMAbv,     O,     O,     O,     O,     O,     O,     O,     O,     B, FMAbv,     O,     O,
-  /* 17E0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
-  /* 17F0 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
-
-  /* Mongolian */
-
-  /* 1800 */     B,     O,     O,     O,     O,     O,     O,     B,     O,     O,     B,     O,     O,     O,     O,     O,
-  /* 1810 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
-  /* 1820 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 1830 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 1840 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 1850 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 1860 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 1870 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,     O,
-  /* 1880 */    GB,    GB,    GB,    GB,    GB, CMAbv, CMAbv,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 1890 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 18A0 */     B,     B,     B,     B,     B,     B,     B,     B,     B, CMBlw,     B,     O,     O,     O,     O,     O,
-
-#define use_offset_0x1900u 2240
-
-
-  /* Limbu */
-
-  /* 1900 */    GB,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 1910 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,
-  /* 1920 */  VAbv,  VAbv,  VBlw,  VPst,  VPst,  VAbv,  VAbv,  VAbv,  VAbv,   SUB,   SUB,   SUB,     O,     O,     O,     O,
-  /* 1930 */  FPst,  FPst, VMBlw,  FPst,  FPst,  FPst,  FPst,  FPst,  FPst,  FBlw, VMAbv, FMBlw,     O,     O,     O,     O,
-  /* 1940 */     O,     O,     O,     O,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-
-  /* Tai Le */
-
-  /* 1950 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 1960 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,
-  /* 1970 */     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
-
-  /* New Tai Lue */
-
-  /* 1980 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 1990 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 19A0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,
-  /* 19B0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 19C0 */     B,     B,     B,     B,     B,     B,     B,     B, VMPst, VMPst,     O,     O,     O,     O,     O,     O,
-  /* 19D0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,
-  /* 19E0 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
-  /* 19F0 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
-
-  /* Buginese */
-
-  /* 1A00 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 1A10 */     B,     B,     B,     B,     B,     B,     B,  VAbv,  VAbv,  VPre,  VPst,  VAbv,     O,     O,     O,     O,
-
-  /* Tai Tham */
-
-  /* 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,   SUB,  FAbv,  FAbv,  MAbv,   SUB,   SUB,   SUB,   SUB,     O,
-  /* 1A60 */    Sk,  VPst,  VAbv,  VPst,  VPst,  VAbv,  VAbv,  VAbv,  VAbv,  VBlw,  VBlw,  VAbv,  VBlw,  VPst,  VPre,  VPre,
-  /* 1A70 */  VPre,  VPre,  VPre,  VAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv,  VAbv, VMAbv, VMAbv,     O,     O, VMBlw,
-  /* 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,
-
-#define use_offset_0x1b00u 2656
-
-
-  /* Balinese */
-
-  /* 1B00 */ VMAbv, VMAbv, VMAbv,  FAbv, VMPst,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 1B10 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 1B20 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 1B30 */     B,     B,     B,     B, CMAbv,  VPst,  VAbv,  VAbv,  VBlw,  VBlw,  VBlw,  VBlw,  VAbv,  VAbv,  VPre,  VPre,
-  /* 1B40 */  VPre,  VPre,  VAbv,  VAbv,     H,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,
-  /* 1B50 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,    GB,    GB,     O,     O,    GB,
-  /* 1B60 */     O,     S,    GB,     S,     S,     S,     S,     S,    GB,     S,     S, SMAbv, SMBlw, SMAbv, SMAbv, SMAbv,
-  /* 1B70 */ SMAbv, SMAbv, SMAbv, SMAbv,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
-
-  /* Sundanese */
-
-  /* 1B80 */ VMAbv,  FAbv, VMPst,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 1B90 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 1BA0 */     B,   SUB,   SUB,   SUB,  VAbv,  VBlw,  VPre,  VPst,  VAbv,  VAbv,  VPst,     H,   SUB,   SUB,     B,     B,
-  /* 1BB0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-
-  /* Batak */
-
-  /* 1BC0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 1BD0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 1BE0 */     B,     B,     B,     B,     B,     B, CMAbv,  VPst,  VAbv,  VAbv,  VPst,  VPst,  VPst,  VAbv,  VPst,  VAbv,
-  /* 1BF0 */  FAbv,  FAbv, CMBlw, CMBlw,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
-
-  /* Lepcha */
-
-  /* 1C00 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 1C10 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 1C20 */     B,     B,     B,     B,   SUB,   SUB,  VPst,  VPre,  VPre,  VPre,  VPst,  VPst,  VBlw,  FAbv,  FAbv,  FAbv,
-  /* 1C30 */  FAbv,  FAbv,  FAbv,  FAbv, VMPre, VMPre, FMAbv, CMBlw,     O,     O,     O,     O,     O,     O,     O,     O,
-  /* 1C40 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     B,     B,     B,
-
-#define use_offset_0x1cd0u 2992
-
-
-  /* Vedic Extensions */
-
-  /* 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,     O,     O, VMAbv,    CS,    CS, VMPst, VMAbv, VMAbv,    GB,     O,     O,     O,     O,     O,
-
-#define use_offset_0x1df8u 3040
-
-
-  /* Combining Diacritical Marks Supplement */
-                                                                         O,     O,     O, FMAbv,     O,     O,     O,     O,
-
-#define use_offset_0x2008u 3048
-
-
-  /* General Punctuation */
-                                                                         O,     O,     O,     O,  ZWNJ,     O,     O,     O,
-  /* 2010 */    GB,    GB,    GB,    GB,    GB,     O,     O,     O,
-
-#define use_offset_0x2070u 3064
-
-
-  /* Superscripts and Subscripts */
-
-  /* 2070 */     O,     O,     O,     O, FMPst,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
-  /* 2080 */     O,     O, FMPst, FMPst, FMPst,     O,     O,     O,
-
-#define use_offset_0x20f0u 3088
-
-
-  /* Combining Diacritical Marks for Symbols */
-
-  /* 20F0 */ VMAbv,     O,     O,     O,     O,     O,     O,     O,
-
-#define use_offset_0x25c8u 3096
-
-
-  /* Geometric Shapes */
-                                                                         O,     O,     O,     O,     B,     O,     O,     O,
-
-#define use_offset_0x2d30u 3104
-
-
-  /* Tifinagh */
-
-  /* 2D30 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 2D40 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 2D50 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 2D60 */     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,     O,     B,
-  /* 2D70 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     H,
-
-#define use_offset_0xa800u 3184
-
-
-  /* Syloti Nagri */
-
-  /* A800 */     B,     B,  VAbv,     B,     B,     B,     H,     B,     B,     B,     B, VMAbv,     B,     B,     B,     B,
-  /* A810 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* A820 */     B,     B,     B,  VPst,  VPst,  VBlw,  VAbv,  VPst,     O,     O,     O,     O,  VBlw,     O,     O,     O,
-  /* A830 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
-
-  /* Phags-pa */
-
-  /* A840 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* A850 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* A860 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* A870 */     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
-
-  /* Saurashtra */
-
-  /* A880 */ VMPst, VMPst,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* A890 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* A8A0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* A8B0 */     B,     B,     B,     B,  MPst,  VPst,  VPst,  VPst,  VPst,  VPst,  VPst,  VPst,  VPst,  VPst,  VPst,  VPst,
-  /* A8C0 */  VPst,  VPst,  VPst,  VPst,     H, VMAbv,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
-  /* A8D0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
-
-  /* Devanagari Extended */
-
-  /* A8E0 */ VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv,
-  /* A8F0 */ VMAbv, VMAbv,     B,     B,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     B,  VAbv,
-
-  /* Kayah Li */
-
-  /* A900 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* A910 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* A920 */     B,     B,     B,     B,     B,     B,  VAbv,  VAbv,  VAbv,  VAbv,  VAbv, VMBlw, VMBlw, VMBlw,     O,     O,
-
-  /* Rejang */
-
-  /* A930 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* A940 */     B,     B,     B,     B,     B,     B,     B,  VBlw,  VBlw,  VBlw,  VAbv,  VBlw,  VBlw,  VBlw,  VBlw,  FAbv,
-  /* A950 */  FAbv,  FAbv,  FPst,  VPst,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
-  /* A960 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
-  /* A970 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
-
-  /* Javanese */
-
-  /* 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,  MBlw,  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,
-
-  /* Myanmar Extended-B */
-
-  /* A9E0 */     B,     B,     B,     B,     B,  VAbv,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* A9F0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,
-
-  /* Cham */
-
-  /* AA00 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* AA10 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* AA20 */     B,     B,     B,     B,     B,     B,     B,     B,     B, VMAbv,  VAbv,  VAbv,  VAbv,  VBlw,  VAbv,  VPre,
-  /* AA30 */  VPre,  VAbv,  VBlw,  MPst,  MPre,  MAbv,  MBlw,     O,     O,     O,     O,     O,     O,     O,     O,     O,
-  /* AA40 */     B,     B,     B,  FAbv,     B,     B,     B,     B,     B,     B,     B,     B,  FAbv,  FPst,     O,     O,
-  /* AA50 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
-
-  /* Myanmar Extended-A */
-
-  /* AA60 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* AA70 */     O,     B,     B,     B,    GB,    GB,    GB,     O,     O,     O,     B, VMPst, VMAbv, VMPst,     B,     B,
-
-  /* Tai Viet */
-
-  /* AA80 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* AA90 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* AAA0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* AAB0 */  VAbv,     B,  VAbv,  VAbv,  VBlw,     B,     B,  VAbv,  VAbv,     B,     B,     B,     B,     B,  VAbv, VMAbv,
-  /* AAC0 */     B, VMAbv,     B,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
-  /* AAD0 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
-
-  /* Meetei Mayek Extensions */
-
-  /* AAE0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,  VPre,  VBlw,  VAbv,  VPre,  VPst,
-  /* AAF0 */     O,     O,     O,     O,     O, VMPst,     H,     O,
-
-#define use_offset_0xabc0u 3944
-
-
-  /* Meetei Mayek */
-
-  /* ABC0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* ABD0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* ABE0 */     B,     B,     B,  VPst,  VPst,  VAbv,  VPst,  VPst,  VBlw,  VPst,  VPst,     O, VMPst,  VBlw,     O,     O,
-  /* ABF0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
-
-#define use_offset_0x10a00u 4008
-
-
-  /* Kharoshthi */
-
-  /* 10A00 */     B,  VBlw,  VBlw,  VBlw,     O,  VAbv,  VBlw,     O,     O,     O,     O,     O,  VPst, VMBlw, VMBlw, VMAbv,
-  /* 10A10 */     B,     B,     B,     B,     O,     B,     B,     B,     O,     B,     B,     B,     B,     B,     B,     B,
-  /* 10A20 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 10A30 */     B,     B,     B,     B,     B,     B,     O,     O, CMAbv, CMBlw, CMBlw,     O,     O,     O,     O,     H,
-  /* 10A40 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,     O,
-
-#define use_offset_0x10ac0u 4088
-
-
-  /* Manichaean */
-
-  /* 10AC0 */     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,     B,     B,     B,     B,     B,     B,
-  /* 10AD0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 10AE0 */     B,     B,     B,     B,     B, CMBlw, CMBlw,     O,
-
-#define use_offset_0x10b80u 4128
-
-
-  /* Psalter Pahlavi */
-
-  /* 10B80 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 10B90 */     B,     B,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
-  /* 10BA0 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     B,     B,     B,     B,     B,     B,     O,
-
-#define use_offset_0x10d00u 4176
-
-
-  /* Hanifi Rohingya */
-
-  /* 10D00 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 10D10 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 10D20 */     B,     B,     B,     B, VMAbv, VMAbv, VMAbv, CMAbv,     O,     O,     O,     O,     O,     O,     O,     O,
-  /* 10D30 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
-
-#define use_offset_0x10e80u 4240
-
-
-  /* Yezidi */
-
-  /* 10E80 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 10E90 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 10EA0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,  VAbv,  VAbv,     O,     O,     O,
-  /* 10EB0 */     B,     B,     O,     O,     O,     O,     O,     O,
-
-#define use_offset_0x10f30u 4296
-
-
-  /* Sogdian */
-
-  /* 10F30 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 10F40 */     B,     B,     B,     B,     B,     B, VMBlw, VMBlw, VMBlw, VMBlw, VMBlw, VMBlw, VMBlw, VMBlw, VMBlw, VMBlw,
-  /* 10F50 */ VMBlw,     B,     B,     B,     B,     O,     O,     O,
-
-#define use_offset_0x10fb0u 4336
-
-
-  /* Chorasmian */
-
-  /* 10FB0 */     B,     O,     B,     B,     B,     B,     B,     O,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 10FC0 */     O,     B,     B,     B,     B,     O,     O,     O,     O,     B,     B,     B,     O,     O,     O,     O,
-  /* 10FD0 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
-  /* 10FE0 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
-  /* 10FF0 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
-
-  /* Brahmi */
-
-  /* 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,
-  /* 11040 */  VBlw,  VBlw,  VAbv,  VAbv,  VAbv,  VAbv,   HVM,     O,     O,     O,     O,     O,     O,     O,     O,     O,
-  /* 11050 */     O,     O,     N,     N,     N,     N,     N,     N,     N,     N,     N,     N,     N,     N,     N,     N,
-  /* 11060 */     N,     N,     N,     N,     N,     N,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 11070 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,    HN,
-
-  /* Kaithi */
-
-  /* 11080 */ VMAbv, VMAbv, VMPst,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 11090 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 110A0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 110B0 */  VPst,  VPre,  VPst,  VBlw,  VBlw,  VAbv,  VAbv,  VPst,  VPst,     H, CMBlw,     O,     O,     O,     O,     O,
-
-#define use_offset_0x11100u 4608
-
-
-  /* Chakma */
-
-  /* 11100 */ VMAbv, VMAbv, VMAbv,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 11110 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 11120 */     B,     B,     B,     B,     B,     B,     B,  VBlw,  VBlw,  VBlw,  VAbv,  VAbv,  VPre,  VBlw,  VAbv,  VAbv,
-  /* 11130 */  VBlw,  VAbv,  VAbv,     H, CMAbv,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 11140 */     O,     O,     O,     O,     B,  VPst,  VPst,     B,     O,     O,     O,     O,     O,     O,     O,     O,
-
-  /* Mahajani */
-
-  /* 11150 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 11160 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 11170 */     B,     B,     B, CMBlw,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
-
-  /* Sharada */
-
-  /* 11180 */ VMAbv, VMAbv, VMPst,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 11190 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 111A0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 111B0 */     B,     B,     B,  VPst,  VPre,  VPst,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VAbv,  VAbv,  VAbv,  VAbv,
-  /* 111C0 */     H,     B,     R,     R,     O,     O,     O,     O,    GB, FMBlw, CMBlw,  VAbv,  VBlw,     O,  VPre, VMAbv,
-  /* 111D0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,
-
-  /* Sinhala Archaic Numbers */
-
-  /* 111E0 */     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 111F0 */     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
-
-  /* Khojki */
-
-  /* 11200 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 11210 */     B,     B,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 11220 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,  VPst,  VPst,  VPst,  VBlw,
-  /* 11230 */  VAbv,  VAbv,  VAbv,  VAbv, VMAbv,     H, CMAbv, CMAbv,     O,     O,     O,     O,     O,     O, VMAbv,     O,
-
-#define use_offset_0x11280u 4928
-
-
-  /* Multani */
-
-  /* 11280 */     B,     B,     B,     B,     B,     B,     B,     O,     B,     O,     B,     B,     B,     B,     O,     B,
-  /* 11290 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,
-  /* 112A0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,     O,
-
-  /* Khudawadi */
-
-  /* 112B0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 112C0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 112D0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B, VMAbv,
-  /* 112E0 */  VPst,  VPre,  VPst,  VBlw,  VBlw,  VAbv,  VAbv,  VAbv,  VAbv, CMBlw,  VBlw,     O,     O,     O,     O,     O,
-  /* 112F0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
-
-  /* Grantha */
-
-  /* 11300 */ VMAbv, VMAbv, VMAbv, VMAbv,     O,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     B,
-  /* 11310 */     B,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 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, CMBlw, CMBlw,     B,  VPst,  VPst,
-  /* 11340 */  VAbv,  VPst,  VPst,  VPst,  VPst,     O,     O,  VPre,  VPre,     O,     O,  VPre,  VPre,   HVM,     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,
-
-#define use_offset_0x11400u 5176
-
-
-  /* Newa */
-
-  /* 11400 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 11410 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 11420 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 11430 */     B,     B,     B,     B,     B,  VPst,  VPre,  VPst,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VAbv,  VAbv,
-  /* 11440 */  VPst,  VPst,     H, VMAbv, VMAbv, VMPst, CMBlw,     B,     O,     O,     O,     O,     O,     O,     O,     O,
-  /* 11450 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O, FMAbv,     B,
-  /* 11460 */    CS,    CS,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
-  /* 11470 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
-
-  /* Tirhuta */
-
-  /* 11480 */     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 11490 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 114A0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 114B0 */  VPst,  VPre,  VPst,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VPre,  VAbv,  VPre,  VPre,  VPst,  VPre, VMAbv,
-  /* 114C0 */ VMAbv, VMAbv,     H, CMBlw,     B,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
-  /* 114D0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
-
-#define use_offset_0x11580u 5400
-
-
-  /* Siddham */
-
-  /* 11580 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 11590 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 115A0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,  VPst,
-  /* 115B0 */  VPre,  VPst,  VBlw,  VBlw,  VBlw,  VBlw,     O,     O,  VPre,  VPre,  VPre,  VPre, VMAbv, VMAbv, VMPst,     H,
-  /* 115C0 */ CMBlw,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
-  /* 115D0 */     O,     O,     O,     O,     O,     O,     O,     O,     B,     B,     B,     B,  VBlw,  VBlw,     O,     O,
-  /* 115E0 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
-  /* 115F0 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
-
-  /* Modi */
-
-  /* 11600 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 11610 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 11620 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 11630 */  VPst,  VPst,  VPst,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VAbv,  VAbv,  VPst,  VPst, VMAbv, VMPst,     H,
-  /* 11640 */  VAbv,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
-  /* 11650 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
-  /* 11660 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
-  /* 11670 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
-
-  /* Takri */
-
-  /* 11680 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 11690 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 116A0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B, VMAbv, VMPst,  VAbv,  VPre,  VPst,
-  /* 116B0 */  VBlw,  VBlw,  VAbv,  VAbv,  VAbv,  VAbv,     H, CMBlw,     B,     O,     O,     O,     O,     O,     O,     O,
-  /* 116C0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
-  /* 116D0 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
-  /* 116E0 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
-  /* 116F0 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
-
-  /* Ahom */
-
-  /* 11700 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 11710 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,  MBlw,  MPre,  MAbv,
-  /* 11720 */  VPst,  VPst,  VAbv,  VAbv,  VBlw,  VBlw,  VPre,  VAbv,  VBlw,  VAbv,  VAbv, VMAbv,     O,     O,     O,     O,
-  /* 11730 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,
-
-#define use_offset_0x11800u 5848
-
-
-  /* Dogra */
-
-  /* 11800 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 11810 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 11820 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,  VPst,  VPre,  VPst,  VBlw,
-  /* 11830 */  VBlw,  VBlw,  VBlw,  VAbv,  VAbv,  VAbv,  VAbv, VMAbv, VMPst,     H, CMBlw,     O,     O,     O,     O,     O,
-
-#define use_offset_0x11900u 5912
-
-
-  /* Dives Akuru */
-
-  /* 11900 */     B,     B,     B,     B,     B,     B,     B,     O,     O,     B,     O,     O,     B,     B,     B,     B,
-  /* 11910 */     B,     B,     B,     B,     O,     B,     B,     O,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 11920 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 11930 */  VPst,  VPst,  VPst,  VPst,  VPst,  VPre,     O,  VPre,  VPre,     O,     O, VMAbv, VMAbv,  VPst,     H,     R,
-  /* 11940 */  MPst,     R,  MPst, CMBlw,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
-  /* 11950 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
-
-#define use_offset_0x119a0u 6008
-
-
-  /* Nandinagari */
-
-  /* 119A0 */     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     B,     B,     B,     B,     B,     B,
-  /* 119B0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 119C0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 119D0 */     B,  VPst,  VPre,  VPst,  VBlw,  VBlw,  VBlw,  VBlw,     O,     O,  VAbv,  VAbv,  VPst,  VPst, VMPst, VMPst,
-  /* 119E0 */     H,     B,     O,     O,  VPre,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
-  /* 119F0 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
-
-  /* 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, FMBlw,  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,     R,     R,     R,     R,     R,     R,  FBlw,  FBlw,  FBlw,  FBlw,  FBlw,  FBlw,
-  /* 11A90 */  FBlw,  FBlw,  FBlw,  FBlw,  FBlw,  FBlw, VMAbv, VMPst, CMAbv,     H,     O,     O,     O,     B,     O,     O,
-
-#define use_offset_0x11c00u 6264
-
-
-  /* Bhaiksuki */
-
-  /* 11C00 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,     B,     B,     B,     B,     B,
-  /* 11C10 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 11C20 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,  VPst,
-  /* 11C30 */  VAbv,  VAbv,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,     O,  VAbv,  VAbv,  VAbv,  VAbv, VMAbv, VMAbv, VMPst,     H,
-  /* 11C40 */     B,     O,     O,     O,    GB,    GB,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
-  /* 11C50 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 11C60 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,
-
-  /* Marchen */
-
-  /* 11C70 */     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 11C80 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 11C90 */     O,     O,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,
-  /* 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,
-
-#define use_offset_0x11d00u 6448
-
-
-  /* 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,
-
-  /* Gunjala Gondi */
-
-  /* 11D60 */     B,     B,     B,     B,     B,     B,     O,     B,     B,     O,     B,     B,     B,     B,     B,     B,
-  /* 11D70 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 11D80 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,  VPst,  VPst,  VPst,  VPst,  VPst,     O,
-  /* 11D90 */  VAbv,  VAbv,     O,  VPst,  VPst, VMAbv, VMPst,     H,     O,     O,     O,     O,     O,     O,     O,     O,
-  /* 11DA0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
-
-#define use_offset_0x11ee0u 6624
-
-
-  /* Makasar */
-
-  /* 11EE0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 11EF0 */     B,     B,    GB,  VAbv,  VBlw,  VPre,  VPst,     O,
-
-#define use_offset_0x13000u 6648
-
-
-  /* Egyptian Hieroglyphs */
-
-  /* 13000 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
-  /* 13010 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
-  /* 13020 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
-  /* 13030 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
-  /* 13040 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
-  /* 13050 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
-  /* 13060 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
-  /* 13070 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
-  /* 13080 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
-  /* 13090 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
-  /* 130A0 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
-  /* 130B0 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
-  /* 130C0 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
-  /* 130D0 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
-  /* 130E0 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
-  /* 130F0 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
-  /* 13100 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
-  /* 13110 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
-  /* 13120 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
-  /* 13130 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
-  /* 13140 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
-  /* 13150 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
-  /* 13160 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
-  /* 13170 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
-  /* 13180 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
-  /* 13190 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
-  /* 131A0 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
-  /* 131B0 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
-  /* 131C0 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
-  /* 131D0 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
-  /* 131E0 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
-  /* 131F0 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
-  /* 13200 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
-  /* 13210 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
-  /* 13220 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
-  /* 13230 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
-  /* 13240 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
-  /* 13250 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
-  /* 13260 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
-  /* 13270 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
-  /* 13280 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
-  /* 13290 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
-  /* 132A0 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
-  /* 132B0 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
-  /* 132C0 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
-  /* 132D0 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
-  /* 132E0 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
-  /* 132F0 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
-  /* 13300 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
-  /* 13310 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
-  /* 13320 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
-  /* 13330 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
-  /* 13340 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
-  /* 13350 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
-  /* 13360 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
-  /* 13370 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
-  /* 13380 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
-  /* 13390 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
-  /* 133A0 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
-  /* 133B0 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
-  /* 133C0 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
-  /* 133D0 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
-  /* 133E0 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
-  /* 133F0 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
-  /* 13400 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
-  /* 13410 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
-  /* 13420 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     O,
-
-  /* Egyptian Hieroglyph Format Controls */
-
-  /* 13430 */     J,     J,     J,     J,     J,     J,     J,    SB,    SE,     O,     O,     O,     O,     O,     O,     O,
-
-#define use_offset_0x16b00u 7736
-
-
-  /* Pahawh Hmong */
-
-  /* 16B00 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 16B10 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 16B20 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 16B30 */ VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv,     O,
-
-#define use_offset_0x16f00u 7792
-
-
-  /* Miao */
-
-  /* 16F00 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 16F10 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 16F20 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 16F30 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 16F40 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O, CMBlw,
-  /* 16F50 */     O,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,
-  /* 16F60 */  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,
-  /* 16F70 */  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,
-  /* 16F80 */  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,     O,     O,     O,     O,     O,     O,     O, VMBlw,
-  /* 16F90 */ VMBlw, VMBlw, VMBlw,     O,     O,     O,     O,     O,
-
-#define use_offset_0x16fe0u 7944
-
-
-  /* Ideographic Symbols and Punctuation */
-
-  /* 16FE0 */     O,     O,     O,     O,     B,     O,     O,     O,
-
-#define use_offset_0x18b00u 7952
-
-
-  /* Khitan Small Script */
-
-  /* 18B00 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 18B10 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 18B20 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 18B30 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 18B40 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 18B50 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 18B60 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 18B70 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 18B80 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 18B90 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 18BA0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 18BB0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 18BC0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 18BD0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 18BE0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 18BF0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 18C00 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 18C10 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 18C20 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 18C30 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 18C40 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 18C50 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 18C60 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 18C70 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 18C80 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 18C90 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 18CA0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 18CB0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 18CC0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 18CD0 */     B,     B,     B,     B,     B,     B,     O,     O,
-
-#define use_offset_0x1bc00u 8424
-
-
-  /* Duployan */
-
-  /* 1BC00 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 1BC10 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 1BC20 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 1BC30 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 1BC40 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 1BC50 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 1BC60 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,
-  /* 1BC70 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,
-  /* 1BC80 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,     O,
-  /* 1BC90 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O, CMBlw, CMBlw,     O,
-
-#define use_offset_0x1e100u 8584
-
-
-  /* Nyiakeng Puachue Hmong */
-
-  /* 1E100 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 1E110 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 1E120 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,
-  /* 1E130 */ VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv,     B,     B,     B,     B,     B,     B,     B,     O,     O,
-  /* 1E140 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     B,     B,
-
-#define use_offset_0x1e2c0u 8664
-
-
-  /* Wancho */
-
-  /* 1E2C0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 1E2D0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 1E2E0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B, VMAbv, VMAbv, VMAbv, VMAbv,
-  /* 1E2F0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
-
-#define use_offset_0x1e900u 8728
-
-
-  /* Adlam */
-
-  /* 1E900 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 1E910 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 1E920 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 1E930 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
-  /* 1E940 */     B,     B,     B,     B, CMAbv, CMAbv, CMAbv, CMAbv, CMAbv, CMAbv, CMAbv,     B,     O,     O,     O,     O,
-  /* 1E950 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
-
-}; /* Table items: 8824; occupancy: 79% */
-
-USE_TABLE_ELEMENT_TYPE
-hb_use_get_category (hb_codepoint_t u)
-{
-  switch (u >> 12)
-  {
-    case 0x0u:
-      if (hb_in_range<hb_codepoint_t> (u, 0x0028u, 0x003Fu)) return use_table[u - 0x0028u + use_offset_0x0028u];
-      if (hb_in_range<hb_codepoint_t> (u, 0x00A0u, 0x00D7u)) return use_table[u - 0x00A0u + use_offset_0x00a0u];
-      if (hb_in_range<hb_codepoint_t> (u, 0x0640u, 0x0647u)) return use_table[u - 0x0640u + use_offset_0x0640u];
-      if (hb_in_range<hb_codepoint_t> (u, 0x07C8u, 0x07FFu)) return use_table[u - 0x07C8u + use_offset_0x07c8u];
-      if (hb_in_range<hb_codepoint_t> (u, 0x0840u, 0x085Fu)) return use_table[u - 0x0840u + use_offset_0x0840u];
-      if (hb_in_range<hb_codepoint_t> (u, 0x0900u, 0x0DF7u)) return use_table[u - 0x0900u + use_offset_0x0900u];
-      if (hb_in_range<hb_codepoint_t> (u, 0x0F00u, 0x0FC7u)) return use_table[u - 0x0F00u + use_offset_0x0f00u];
-      break;
-
-    case 0x1u:
-      if (hb_in_range<hb_codepoint_t> (u, 0x1000u, 0x109Fu)) return use_table[u - 0x1000u + use_offset_0x1000u];
-      if (hb_in_range<hb_codepoint_t> (u, 0x1700u, 0x18AFu)) return use_table[u - 0x1700u + use_offset_0x1700u];
-      if (hb_in_range<hb_codepoint_t> (u, 0x1900u, 0x1A9Fu)) return use_table[u - 0x1900u + use_offset_0x1900u];
-      if (hb_in_range<hb_codepoint_t> (u, 0x1B00u, 0x1C4Fu)) return use_table[u - 0x1B00u + use_offset_0x1b00u];
-      if (hb_in_range<hb_codepoint_t> (u, 0x1CD0u, 0x1CFFu)) return use_table[u - 0x1CD0u + use_offset_0x1cd0u];
-      if (hb_in_range<hb_codepoint_t> (u, 0x1DF8u, 0x1DFFu)) return use_table[u - 0x1DF8u + use_offset_0x1df8u];
-      break;
-
-    case 0x2u:
-      if (hb_in_range<hb_codepoint_t> (u, 0x2008u, 0x2017u)) return use_table[u - 0x2008u + use_offset_0x2008u];
-      if (hb_in_range<hb_codepoint_t> (u, 0x2070u, 0x2087u)) return use_table[u - 0x2070u + use_offset_0x2070u];
-      if (hb_in_range<hb_codepoint_t> (u, 0x20F0u, 0x20F7u)) return use_table[u - 0x20F0u + use_offset_0x20f0u];
-      if (hb_in_range<hb_codepoint_t> (u, 0x25C8u, 0x25CFu)) return use_table[u - 0x25C8u + use_offset_0x25c8u];
-      if (hb_in_range<hb_codepoint_t> (u, 0x2D30u, 0x2D7Fu)) return use_table[u - 0x2D30u + use_offset_0x2d30u];
-      break;
-
-    case 0xAu:
-      if (hb_in_range<hb_codepoint_t> (u, 0xA800u, 0xAAF7u)) return use_table[u - 0xA800u + use_offset_0xa800u];
-      if (hb_in_range<hb_codepoint_t> (u, 0xABC0u, 0xABFFu)) return use_table[u - 0xABC0u + use_offset_0xabc0u];
-      break;
-
-    case 0x10u:
-      if (hb_in_range<hb_codepoint_t> (u, 0x10A00u, 0x10A4Fu)) return use_table[u - 0x10A00u + use_offset_0x10a00u];
-      if (hb_in_range<hb_codepoint_t> (u, 0x10AC0u, 0x10AE7u)) return use_table[u - 0x10AC0u + use_offset_0x10ac0u];
-      if (hb_in_range<hb_codepoint_t> (u, 0x10B80u, 0x10BAFu)) return use_table[u - 0x10B80u + use_offset_0x10b80u];
-      if (hb_in_range<hb_codepoint_t> (u, 0x10D00u, 0x10D3Fu)) return use_table[u - 0x10D00u + use_offset_0x10d00u];
-      if (hb_in_range<hb_codepoint_t> (u, 0x10E80u, 0x10EB7u)) return use_table[u - 0x10E80u + use_offset_0x10e80u];
-      if (hb_in_range<hb_codepoint_t> (u, 0x10F30u, 0x10F57u)) return use_table[u - 0x10F30u + use_offset_0x10f30u];
-      if (hb_in_range<hb_codepoint_t> (u, 0x10FB0u, 0x110BFu)) return use_table[u - 0x10FB0u + use_offset_0x10fb0u];
-      break;
-
-    case 0x11u:
-      if (hb_in_range<hb_codepoint_t> (u, 0x10FB0u, 0x110BFu)) return use_table[u - 0x10FB0u + use_offset_0x10fb0u];
-      if (hb_in_range<hb_codepoint_t> (u, 0x11100u, 0x1123Fu)) return use_table[u - 0x11100u + use_offset_0x11100u];
-      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, 0x11800u, 0x1183Fu)) return use_table[u - 0x11800u + use_offset_0x11800u];
-      if (hb_in_range<hb_codepoint_t> (u, 0x11900u, 0x1195Fu)) return use_table[u - 0x11900u + use_offset_0x11900u];
-      if (hb_in_range<hb_codepoint_t> (u, 0x119A0u, 0x11A9Fu)) return use_table[u - 0x119A0u + use_offset_0x119a0u];
-      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, 0x11DAFu)) return use_table[u - 0x11D00u + use_offset_0x11d00u];
-      if (hb_in_range<hb_codepoint_t> (u, 0x11EE0u, 0x11EF7u)) return use_table[u - 0x11EE0u + use_offset_0x11ee0u];
-      break;
-
-    case 0x13u:
-      if (hb_in_range<hb_codepoint_t> (u, 0x13000u, 0x1343Fu)) return use_table[u - 0x13000u + use_offset_0x13000u];
-      break;
-
-    case 0x16u:
-      if (hb_in_range<hb_codepoint_t> (u, 0x16B00u, 0x16B37u)) return use_table[u - 0x16B00u + use_offset_0x16b00u];
-      if (hb_in_range<hb_codepoint_t> (u, 0x16F00u, 0x16F97u)) return use_table[u - 0x16F00u + use_offset_0x16f00u];
-      if (hb_in_range<hb_codepoint_t> (u, 0x16FE0u, 0x16FE7u)) return use_table[u - 0x16FE0u + use_offset_0x16fe0u];
-      break;
-
-    case 0x18u:
-      if (hb_in_range<hb_codepoint_t> (u, 0x18B00u, 0x18CD7u)) return use_table[u - 0x18B00u + use_offset_0x18b00u];
-      break;
-
-    case 0x1Bu:
-      if (hb_in_range<hb_codepoint_t> (u, 0x1BC00u, 0x1BC9Fu)) return use_table[u - 0x1BC00u + use_offset_0x1bc00u];
-      break;
-
-    case 0x1Eu:
-      if (hb_in_range<hb_codepoint_t> (u, 0x1E100u, 0x1E14Fu)) return use_table[u - 0x1E100u + use_offset_0x1e100u];
-      if (hb_in_range<hb_codepoint_t> (u, 0x1E2C0u, 0x1E2FFu)) return use_table[u - 0x1E2C0u + use_offset_0x1e2c0u];
-      if (hb_in_range<hb_codepoint_t> (u, 0x1E900u, 0x1E95Fu)) return use_table[u - 0x1E900u + use_offset_0x1e900u];
-      break;
-
-    default:
-      break;
-  }
-  return USE_O;
-}
-
-#undef B
-#undef CS
-#undef G
-#undef GB
-#undef H
-#undef HN
-#undef HVM
-#undef J
-#undef N
-#undef O
-#undef R
-#undef S
-#undef SB
-#undef SE
-#undef SUB
-#undef Sk
-#undef ZWNJ
-#undef CMAbv
-#undef CMBlw
-#undef FAbv
-#undef FBlw
-#undef FPst
-#undef FMAbv
-#undef FMBlw
-#undef FMPst
-#undef MAbv
-#undef MBlw
-#undef MPst
-#undef MPre
-#undef SMAbv
-#undef SMBlw
-#undef VAbv
-#undef VBlw
-#undef VPst
-#undef VPre
-#undef VMAbv
-#undef VMBlw
-#undef VMPst
-#undef VMPre
-
-
-#endif
-/* == End of generated table == */

Added: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-use-table.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-use-table.hh	                        (rev 0)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-use-table.hh	2021-04-17 22:31:16 UTC (rev 58898)
@@ -0,0 +1,1203 @@
+/* == Start of generated table == */
+/*
+ * The following table is generated by running:
+ *
+ *   ./gen-use-table.py IndicSyllabicCategory.txt IndicPositionalCategory.txt UnicodeData.txt ArabicShaping.txt Blocks.txt IndicSyllabicCategory-Additional.txt IndicPositionalCategory-Additional.txt
+ *
+ * on files with these headers:
+ *
+ * # IndicSyllabicCategory-13.0.0.txt
+ * # Date: 2019-07-22, 19:55:00 GMT [KW, RP]
+ * # IndicPositionalCategory-13.0.0.txt
+ * # Date: 2019-07-23, 00:01:00 GMT [KW, RP]
+ * # ArabicShaping-13.0.0.txt
+ * # Date: 2020-01-31, 23:55:00 GMT [KW, RP]
+ * # Blocks-13.0.0.txt
+ * # Date: 2019-07-10, 19:06:00 GMT [KW]
+ * # Override values For Indic_Syllabic_Category
+ * # Not derivable
+ * # Initial version based on Unicode 7.0 by Andrew Glass 2014-03-17
+ * # Updated  for Unicode 10.0 by Andrew Glass 2017-07-25
+ * # Updated  for Unicode 12.1 by Andrew Glass 2019-05-24
+ * # Updated  for Unicode 13.0 by Andrew Glass 2020-07-28
+ * # Override values For Indic_Positional_Category
+ * # Not derivable
+ * # Initial version based on Unicode 7.0 by Andrew Glass 2014-03-17
+ * # Updated  for Unicode 10.0 by Andrew Glass 2017-07-25
+ * # Ammended for Unicode 10.0 by Andrew Glass 2018-09-21
+ * # Updated  for L2/19-083    by Andrew Glass 2019-05-06
+ * # Updated  for Unicode 12.1 by Andrew Glass 2019-05-30
+ * # Updated  for Unicode 13.0 by Andrew Glass 2020-07-28
+ * UnicodeData.txt does not have a header.
+ */
+
+#ifndef HB_OT_SHAPE_COMPLEX_USE_TABLE_HH
+#define HB_OT_SHAPE_COMPLEX_USE_TABLE_HH
+
+#include "hb.hh"
+
+#include "hb-ot-shape-complex-use-machine.hh"
+
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wunused-macros"
+#define B	USE(B)	/* BASE */
+#define CS	USE(CS)	/* CONS_WITH_STACKER */
+#define G	USE(G)	/* HIEROGLYPH */
+#define GB	USE(GB)	/* BASE_OTHER */
+#define H	USE(H)	/* HALANT */
+#define HN	USE(HN)	/* HALANT_NUM */
+#define HVM	USE(HVM)	/* HALANT_OR_VOWEL_MODIFIER */
+#define J	USE(J)	/* HIEROGLYPH_JOINER */
+#define N	USE(N)	/* BASE_NUM */
+#define O	USE(O)	/* OTHER */
+#define R	USE(R)	/* REPHA */
+#define S	USE(S)	/* SYM */
+#define SB	USE(SB)	/* HIEROGLYPH_SEGMENT_BEGIN */
+#define SE	USE(SE)	/* HIEROGLYPH_SEGMENT_END */
+#define SUB	USE(SUB)	/* CONS_SUB */
+#define Sk	USE(Sk)	/* SAKOT */
+#define ZWNJ	USE(ZWNJ)	/* ZWNJ */
+#define CMAbv	USE(CMAbv)
+#define CMBlw	USE(CMBlw)
+#define FAbv	USE(FAbv)
+#define FBlw	USE(FBlw)
+#define FPst	USE(FPst)
+#define FMAbv	USE(FMAbv)
+#define FMBlw	USE(FMBlw)
+#define FMPst	USE(FMPst)
+#define MAbv	USE(MAbv)
+#define MBlw	USE(MBlw)
+#define MPst	USE(MPst)
+#define MPre	USE(MPre)
+#define SMAbv	USE(SMAbv)
+#define SMBlw	USE(SMBlw)
+#define VAbv	USE(VAbv)
+#define VBlw	USE(VBlw)
+#define VPst	USE(VPst)
+#define VPre	USE(VPre)
+#define VMAbv	USE(VMAbv)
+#define VMBlw	USE(VMBlw)
+#define VMPst	USE(VMPst)
+#define VMPre	USE(VMPre)
+#pragma GCC diagnostic pop
+
+static const uint8_t use_table[] = {
+
+
+#define use_offset_0x0028u 0
+
+
+  /* Basic Latin */
+                                                                         O,     O,     O,     O,     O,    GB,     O,     O,
+  /* 0030 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
+
+#define use_offset_0x00a0u 24
+
+
+  /* Latin-1 Supplement */
+
+  /* 00A0 */    GB,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+  /* 00B0 */     O,     O, FMPst, FMPst,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+  /* 00C0 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+  /* 00D0 */     O,     O,     O,     O,     O,     O,     O,    GB,
+
+#define use_offset_0x0640u 80
+
+
+  /* Arabic */
+
+  /* 0640 */     B,     O,     O,     O,     O,     O,     O,     O,
+
+#define use_offset_0x07c8u 88
+
+
+  /* NKo */
+                                                                         O,     O,     B,     B,     B,     B,     B,     B,
+  /* 07D0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 07E0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv,
+  /* 07F0 */ VMAbv, VMAbv, VMAbv, VMAbv,     O,     O,     O,     O,     O,     O,     B,     O,     O, VMAbv,     O,     O,
+
+#define use_offset_0x0840u 144
+
+
+  /* Mandaic */
+
+  /* 0840 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 0850 */     B,     B,     B,     B,     B,     B,     B,     B,     B, CMBlw, CMBlw, CMBlw,     O,     O,     O,     O,
+
+#define use_offset_0x0900u 176
+
+
+  /* Devanagari */
+
+  /* 0900 */ VMAbv, VMAbv, VMAbv, VMPst,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 0910 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 0920 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 0930 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,  VAbv,  VPst, CMBlw,     B,  VPst,  VPre,
+  /* 0940 */  VPst,  VBlw,  VBlw,  VBlw,  VBlw,  VAbv,  VAbv,  VAbv,  VAbv,  VPst,  VPst,  VPst,  VPst,     H,  VPre,  VPst,
+  /* 0950 */     O, VMAbv, VMBlw,     O,     O,  VAbv,  VBlw,  VBlw,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 0960 */     B,     B,  VBlw,  VBlw,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 0970 */     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+
+  /* Bengali */
+
+  /* 0980 */    GB, VMAbv, VMPst, VMPst,     O,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     B,
+  /* 0990 */     B,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 09A0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,     B,     B,     B,     B,     B,
+  /* 09B0 */     B,     O,     B,     O,     O,     O,     B,     B,     B,     B,     O,     O, CMBlw,     B,  VPst,  VPre,
+  /* 09C0 */  VPst,  VBlw,  VBlw,  VBlw,  VBlw,     O,     O,  VPre,  VPre,     O,     O,  VPre,  VPre,     H,     O,     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,     B,     O, FMAbv,     O,
+
+  /* Gurmukhi */
+
+  /* 0A00 */     O, VMAbv, VMAbv, VMPst,     O,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     B,
+  /* 0A10 */     B,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 0A20 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,     B,     B,     B,     B,     B,
+  /* 0A30 */     B,     O,     B,     B,     O,     B,     B,     O,     B,     B,     O,     O, CMBlw,     O,  VPst,  VPre,
+  /* 0A40 */  VPst,  VBlw,  VBlw,     O,     O,     O,     O,  VAbv,  VAbv,     O,     O,  VAbv,  VAbv,     H,     O,     O,
+  /* 0A50 */     O, VMBlw,     O,     O,     O,     O,     O,     O,     O,     B,     B,     B,     B,     O,     B,     O,
+  /* 0A60 */     O,     O,     O,     O,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 0A70 */ VMAbv, CMAbv,    GB,    GB,     O,  MBlw,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+
+  /* Gujarati */
+
+  /* 0A80 */     O, VMAbv, VMAbv, VMPst,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,
+  /* 0A90 */     B,     B,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 0AA0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,     B,     B,     B,     B,     B,
+  /* 0AB0 */     B,     O,     B,     B,     O,     B,     B,     B,     B,     B,     O,     O, CMBlw,     B,  VPst,  VPre,
+  /* 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, VMAbv, VMAbv, VMAbv, CMAbv, CMAbv, CMAbv,
+
+  /* Oriya */
+
+  /* 0B00 */     O, VMAbv, VMPst, VMPst,     O,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     B,
+  /* 0B10 */     B,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 0B20 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,     B,     B,     B,     B,     B,
+  /* 0B30 */     B,     O,     B,     B,     O,     B,     B,     B,     B,     B,     O,     O, CMBlw,     B,  VPst,  VAbv,
+  /* 0B40 */  VPst,  VBlw,  VBlw,  VBlw,  VBlw,     O,     O,  VPre,  VPre,     O,     O,  VPre,  VPre,     H,     O,     O,
+  /* 0B50 */     O,     O,     O,     O,     O,  VAbv,  VAbv,  VAbv,     O,     O,     O,     O,     B,     B,     O,     B,
+  /* 0B60 */     B,     B,  VBlw,  VBlw,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 0B70 */     O,     B,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+
+  /* Tamil */
+
+  /* 0B80 */     O,     O, VMAbv,     O,     O,     B,     B,     B,     B,     B,     B,     O,     O,     O,     B,     B,
+  /* 0B90 */     B,     O,     B,     B,     B,     B,     O,     O,     O,     B,     B,     O,     B,     O,     B,     B,
+  /* 0BA0 */     O,     O,     O,     B,     B,     O,     O,     O,     B,     B,     B,     O,     O,     O,     B,     B,
+  /* 0BB0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,  VPst,  VPst,
+  /* 0BC0 */  VAbv,  VPst,  VPst,     O,     O,     O,  VPre,  VPre,  VPre,     O,  VPre,  VPre,  VPre,     H,     O,     O,
+  /* 0BD0 */     O,     O,     O,     O,     O,     O,     O,  VPst,     O,     O,     O,     O,     O,     O,     O,     O,
+  /* 0BE0 */     O,     O,     O,     O,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 0BF0 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+
+  /* Telugu */
+
+  /* 0C00 */ VMAbv, VMPst, VMPst, VMPst, VMAbv,     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,     B,
+  /* 0C10 */     B,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 0C20 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,     B,     B,     B,     B,     B,
+  /* 0C30 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     B,  VAbv,  VAbv,
+  /* 0C40 */  VAbv,  VPst,  VPst,  VPst,  VPst,     O,  VAbv,  VAbv,  VAbv,     O,  VAbv,  VAbv,  VAbv,     H,     O,     O,
+  /* 0C50 */     O,     O,     O,     O,     O,  VAbv,  VBlw,     O,     B,     B,     B,     O,     O,     O,     O,     O,
+  /* 0C60 */     B,     B,  VBlw,  VBlw,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 0C70 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+
+  /* Kannada */
+
+  /* 0C80 */     B, VMAbv, VMPst, VMPst,     O,     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,     B,
+  /* 0C90 */     B,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 0CA0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,     B,     B,     B,     B,     B,
+  /* 0CB0 */     B,     B,     B,     B,     O,     B,     B,     B,     B,     B,     O,     O, CMBlw,     B,  VPst,  VAbv,
+  /* 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,    CS,    CS,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+
+  /* Malayalam */
+
+  /* 0D00 */ VMAbv, VMAbv, VMPst, VMPst,     B,     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,  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,     O,     O,     O,  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,
+  /* 0D70 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+
+  /* Sinhala */
+
+  /* 0D80 */     O, VMAbv, VMPst, VMPst,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 0D90 */     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     B,     B,     B,     B,     B,     B,
+  /* 0DA0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 0DB0 */     B,     B,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,     O,     O,
+  /* 0DC0 */     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     H,     O,     O,     O,     O,  VPst,
+  /* 0DD0 */  VPst,  VPst,  VAbv,  VAbv,  VBlw,     O,  VBlw,     O,  VPst,  VPre,  VPre,  VPre,  VPre,  VPre,  VPre,  VPst,
+  /* 0DE0 */     O,     O,     O,     O,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 0DF0 */     O,     O,  VPst,  VPst,     O,     O,     O,     O,
+
+#define use_offset_0x0f00u 1448
+
+
+  /* Tibetan */
+
+  /* 0F00 */     B,     B,     O,     O,     B,     B,     B,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+  /* 0F10 */     O,     O,     O,     O,     O,     O,     O,     O,  VBlw,  VBlw,     O,     O,     O,     O,     O,     O,
+  /* 0F20 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 0F30 */     B,     B,     B,     B,     O,  FBlw,     O,  FBlw,     O, CMAbv,     O,     O,     O,     O,  VPst,  VPre,
+  /* 0F40 */     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,     B,     B,     B,     B,     B,     B,
+  /* 0F50 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 0F60 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,
+  /* 0F70 */     O, CMBlw,  VBlw,  VAbv,  VAbv,  VBlw,  VAbv,  VAbv,  VAbv,  VAbv,  VBlw,  VBlw,  VBlw,  VBlw, VMAbv,     O,
+  /* 0F80 */  VBlw,  VAbv, VMAbv, VMAbv,  VBlw,     O, VMAbv, VMAbv,     B,     B,     B,     B,     B,   SUB,   SUB,   SUB,
+  /* 0F90 */   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,     O,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,
+  /* 0FA0 */   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,
+  /* 0FB0 */   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,     O,     O,     O,
+  /* 0FC0 */     O,     O,     O,     O,     O,     O,  FBlw,     O,
+
+#define use_offset_0x1000u 1648
+
+
+  /* Myanmar */
+
+  /* 1000 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1010 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1020 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,  VPst,  VPst,  VAbv,  VAbv,  VBlw,
+  /* 1030 */  VBlw,  VPre,  VAbv,  VAbv,  VAbv,  VAbv, VMAbv, VMBlw, VMPst,     H,  VAbv,  MPst,  MPre,  MBlw,  MBlw,     B,
+  /* 1040 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,    GB,     O,     O,    GB,     O,
+  /* 1050 */     B,     B,     B,     B,     B,     B,  VPst,  VPst,  VBlw,  VBlw,     B,     B,     B,     B,  MBlw,  MBlw,
+  /* 1060 */  MBlw,     B,  VPst, VMPst, VMPst,     B,     B,  VPst,  VPst, VMPst, VMPst, VMPst, VMPst, VMPst,     B,     B,
+  /* 1070 */     B,  VAbv,  VAbv,  VAbv,  VAbv,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1080 */     B,     B,  MBlw,  VPst,  VPre,  VAbv,  VAbv, VMPst, VMPst, VMPst, VMPst, VMPst, VMPst, VMBlw,     B, VMPst,
+  /* 1090 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B, VMPst, VMPst,  VPst,  VAbv,     O,     O,
+
+#define use_offset_0x1700u 1808
+
+
+  /* Tagalog */
+
+  /* 1700 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,     B,
+  /* 1710 */     B,     B,  VAbv,  VBlw,  VBlw,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+
+  /* Hanunoo */
+
+  /* 1720 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1730 */     B,     B,  VAbv,  VBlw,  VBlw,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+
+  /* Buhid */
+
+  /* 1740 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1750 */     B,     B,  VAbv,  VBlw,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+
+  /* Tagbanwa */
+
+  /* 1760 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,     B,
+  /* 1770 */     B,     O,  VAbv,  VBlw,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+
+  /* Khmer */
+
+  /* 1780 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1790 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 17A0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 17B0 */     B,     B,     B,     B,     O,     O,  VPst,  VAbv,  VAbv,  VAbv,  VAbv,  VBlw,  VBlw,  VBlw,  VPre,  VPre,
+  /* 17C0 */  VPre,  VPre,  VPre,  VPre,  VPre,  VPre, VMAbv, VMPst,  VPst, VMAbv, VMAbv, FMAbv,  FAbv, CMAbv, FMAbv, VMAbv,
+  /* 17D0 */ FMAbv,  VAbv,     H, FMAbv,     O,     O,     O,     O,     O,     O,     O,     O,     B, FMAbv,     O,     O,
+  /* 17E0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
+  /* 17F0 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+
+  /* Mongolian */
+
+  /* 1800 */     B,     O,     O,     O,     O,     O,     O,     B,     O,     O,     B,     O,     O,     O,     O,     O,
+  /* 1810 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+  /* 1820 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1830 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1840 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1850 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1860 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1870 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,     O,
+  /* 1880 */    GB,    GB,    GB,    GB,    GB, CMAbv, CMAbv,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1890 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 18A0 */     B,     B,     B,     B,     B,     B,     B,     B,     B, CMBlw,     B,     O,     O,     O,     O,     O,
+
+#define use_offset_0x1900u 2240
+
+
+  /* Limbu */
+
+  /* 1900 */    GB,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1910 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,
+  /* 1920 */  VAbv,  VAbv,  VBlw,  VPst,  VPst,  VAbv,  VAbv,  VAbv,  VAbv,   SUB,   SUB,   SUB,     O,     O,     O,     O,
+  /* 1930 */  FPst,  FPst, VMBlw,  FPst,  FPst,  FPst,  FPst,  FPst,  FPst,  FBlw, VMAbv, FMBlw,     O,     O,     O,     O,
+  /* 1940 */     O,     O,     O,     O,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+
+  /* Tai Le */
+
+  /* 1950 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1960 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,
+  /* 1970 */     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+
+  /* New Tai Lue */
+
+  /* 1980 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1990 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 19A0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,
+  /* 19B0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 19C0 */     B,     B,     B,     B,     B,     B,     B,     B, VMPst, VMPst,     O,     O,     O,     O,     O,     O,
+  /* 19D0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,
+  /* 19E0 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+  /* 19F0 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+
+  /* Buginese */
+
+  /* 1A00 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1A10 */     B,     B,     B,     B,     B,     B,     B,  VAbv,  VAbv,  VPre,  VPst,  VAbv,     O,     O,     O,     O,
+
+  /* Tai Tham */
+
+  /* 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,   SUB,  FAbv,  FAbv,  MAbv,   SUB,   SUB,   SUB,   SUB,     O,
+  /* 1A60 */    Sk,  VPst,  VAbv,  VPst,  VPst,  VAbv,  VAbv,  VAbv,  VAbv,  VBlw,  VBlw,  VAbv,  VBlw,  VPst,  VPre,  VPre,
+  /* 1A70 */  VPre,  VPre,  VPre,  VAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv,  VAbv, VMAbv, VMAbv,     O,     O, VMBlw,
+  /* 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,
+
+#define use_offset_0x1b00u 2656
+
+
+  /* Balinese */
+
+  /* 1B00 */ VMAbv, VMAbv, VMAbv,  FAbv, VMPst,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1B10 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1B20 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1B30 */     B,     B,     B,     B, CMAbv,  VPst,  VAbv,  VAbv,  VBlw,  VBlw,  VBlw,  VBlw,  VAbv,  VAbv,  VPre,  VPre,
+  /* 1B40 */  VPre,  VPre,  VAbv,  VAbv,     H,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,
+  /* 1B50 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,    GB,    GB,     O,     O,    GB,
+  /* 1B60 */     O,     S,    GB,     S,     S,     S,     S,     S,    GB,     S,     S, SMAbv, SMBlw, SMAbv, SMAbv, SMAbv,
+  /* 1B70 */ SMAbv, SMAbv, SMAbv, SMAbv,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+
+  /* Sundanese */
+
+  /* 1B80 */ VMAbv,  FAbv, VMPst,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1B90 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1BA0 */     B,   SUB,   SUB,   SUB,  VAbv,  VBlw,  VPre,  VPst,  VAbv,  VAbv,  VPst,     H,   SUB,   SUB,     B,     B,
+  /* 1BB0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+
+  /* Batak */
+
+  /* 1BC0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1BD0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1BE0 */     B,     B,     B,     B,     B,     B, CMAbv,  VPst,  VAbv,  VAbv,  VPst,  VPst,  VPst,  VAbv,  VPst,  VAbv,
+  /* 1BF0 */  FAbv,  FAbv, CMBlw, CMBlw,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+
+  /* Lepcha */
+
+  /* 1C00 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1C10 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1C20 */     B,     B,     B,     B,   SUB,   SUB,  VPst,  VPre,  VPre,  VPre,  VPst,  VPst,  VBlw,  FAbv,  FAbv,  FAbv,
+  /* 1C30 */  FAbv,  FAbv,  FAbv,  FAbv, VMPre, VMPre, FMAbv, CMBlw,     O,     O,     O,     O,     O,     O,     O,     O,
+  /* 1C40 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     B,     B,     B,
+
+#define use_offset_0x1cd0u 2992
+
+
+  /* Vedic Extensions */
+
+  /* 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,     O,     O, VMAbv,    CS,    CS, VMPst, VMAbv, VMAbv,    GB,     O,     O,     O,     O,     O,
+
+#define use_offset_0x1df8u 3040
+
+
+  /* Combining Diacritical Marks Supplement */
+                                                                         O,     O,     O, FMAbv,     O,     O,     O,     O,
+
+#define use_offset_0x2008u 3048
+
+
+  /* General Punctuation */
+                                                                         O,     O,     O,     O,  ZWNJ,     O,     O,     O,
+  /* 2010 */    GB,    GB,    GB,    GB,    GB,     O,     O,     O,
+
+#define use_offset_0x2070u 3064
+
+
+  /* Superscripts and Subscripts */
+
+  /* 2070 */     O,     O,     O,     O, FMPst,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+  /* 2080 */     O,     O, FMPst, FMPst, FMPst,     O,     O,     O,
+
+#define use_offset_0x20f0u 3088
+
+
+  /* Combining Diacritical Marks for Symbols */
+
+  /* 20F0 */ VMAbv,     O,     O,     O,     O,     O,     O,     O,
+
+#define use_offset_0x25c8u 3096
+
+
+  /* Geometric Shapes */
+                                                                         O,     O,     O,     O,     B,     O,     O,     O,
+
+#define use_offset_0x2d30u 3104
+
+
+  /* Tifinagh */
+
+  /* 2D30 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 2D40 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 2D50 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 2D60 */     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,     O,     B,
+  /* 2D70 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     H,
+
+#define use_offset_0xa800u 3184
+
+
+  /* Syloti Nagri */
+
+  /* A800 */     B,     B,  VAbv,     B,     B,     B,     H,     B,     B,     B,     B, VMAbv,     B,     B,     B,     B,
+  /* A810 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* A820 */     B,     B,     B,  VPst,  VPst,  VBlw,  VAbv,  VPst,     O,     O,     O,     O,  VBlw,     O,     O,     O,
+  /* A830 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+
+  /* Phags-pa */
+
+  /* A840 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* A850 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* A860 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* A870 */     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+
+  /* Saurashtra */
+
+  /* A880 */ VMPst, VMPst,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* A890 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* A8A0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* A8B0 */     B,     B,     B,     B,  MPst,  VPst,  VPst,  VPst,  VPst,  VPst,  VPst,  VPst,  VPst,  VPst,  VPst,  VPst,
+  /* A8C0 */  VPst,  VPst,  VPst,  VPst,     H, VMAbv,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+  /* A8D0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
+
+  /* Devanagari Extended */
+
+  /* A8E0 */ VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv,
+  /* A8F0 */ VMAbv, VMAbv,     B,     B,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     B,  VAbv,
+
+  /* Kayah Li */
+
+  /* A900 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* A910 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* A920 */     B,     B,     B,     B,     B,     B,  VAbv,  VAbv,  VAbv,  VAbv,  VAbv, VMBlw, VMBlw, VMBlw,     O,     O,
+
+  /* Rejang */
+
+  /* A930 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* A940 */     B,     B,     B,     B,     B,     B,     B,  VBlw,  VBlw,  VBlw,  VAbv,  VBlw,  VBlw,  VBlw,  VBlw,  FAbv,
+  /* A950 */  FAbv,  FAbv,  FPst,  VPst,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+  /* A960 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+  /* A970 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+
+  /* Javanese */
+
+  /* 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,  MBlw,  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,
+
+  /* Myanmar Extended-B */
+
+  /* A9E0 */     B,     B,     B,     B,     B,  VAbv,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* A9F0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,
+
+  /* Cham */
+
+  /* AA00 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* AA10 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* AA20 */     B,     B,     B,     B,     B,     B,     B,     B,     B, VMAbv,  VAbv,  VAbv,  VAbv,  VBlw,  VAbv,  VPre,
+  /* AA30 */  VPre,  VAbv,  VBlw,  MPst,  MPre,  MAbv,  MBlw,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+  /* AA40 */     B,     B,     B,  FAbv,     B,     B,     B,     B,     B,     B,     B,     B,  FAbv,  FPst,     O,     O,
+  /* AA50 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
+
+  /* Myanmar Extended-A */
+
+  /* AA60 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* AA70 */     O,     B,     B,     B,    GB,    GB,    GB,     O,     O,     O,     B, VMPst, VMAbv, VMPst,     B,     B,
+
+  /* Tai Viet */
+
+  /* AA80 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* AA90 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* AAA0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* AAB0 */  VAbv,     B,  VAbv,  VAbv,  VBlw,     B,     B,  VAbv,  VAbv,     B,     B,     B,     B,     B,  VAbv, VMAbv,
+  /* AAC0 */     B, VMAbv,     B,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+  /* AAD0 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+
+  /* Meetei Mayek Extensions */
+
+  /* AAE0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,  VPre,  VBlw,  VAbv,  VPre,  VPst,
+  /* AAF0 */     O,     O,     O,     O,     O, VMPst,     H,     O,
+
+#define use_offset_0xabc0u 3944
+
+
+  /* Meetei Mayek */
+
+  /* ABC0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* ABD0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* ABE0 */     B,     B,     B,  VPst,  VPst,  VAbv,  VPst,  VPst,  VBlw,  VPst,  VPst,     O, VMPst,  VBlw,     O,     O,
+  /* ABF0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
+
+#define use_offset_0x10a00u 4008
+
+
+  /* Kharoshthi */
+
+  /* 10A00 */     B,  VBlw,  VBlw,  VBlw,     O,  VAbv,  VBlw,     O,     O,     O,     O,     O,  VPst, VMBlw, VMBlw, VMAbv,
+  /* 10A10 */     B,     B,     B,     B,     O,     B,     B,     B,     O,     B,     B,     B,     B,     B,     B,     B,
+  /* 10A20 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 10A30 */     B,     B,     B,     B,     B,     B,     O,     O, CMAbv, CMBlw, CMBlw,     O,     O,     O,     O,     H,
+  /* 10A40 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,     O,
+
+#define use_offset_0x10ac0u 4088
+
+
+  /* Manichaean */
+
+  /* 10AC0 */     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,     B,     B,     B,     B,     B,     B,
+  /* 10AD0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 10AE0 */     B,     B,     B,     B,     B, CMBlw, CMBlw,     O,
+
+#define use_offset_0x10b80u 4128
+
+
+  /* Psalter Pahlavi */
+
+  /* 10B80 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 10B90 */     B,     B,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+  /* 10BA0 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     B,     B,     B,     B,     B,     B,     O,
+
+#define use_offset_0x10d00u 4176
+
+
+  /* Hanifi Rohingya */
+
+  /* 10D00 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 10D10 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 10D20 */     B,     B,     B,     B, VMAbv, VMAbv, VMAbv, CMAbv,     O,     O,     O,     O,     O,     O,     O,     O,
+  /* 10D30 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
+
+#define use_offset_0x10e80u 4240
+
+
+  /* Yezidi */
+
+  /* 10E80 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 10E90 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 10EA0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,  VAbv,  VAbv,     O,     O,     O,
+  /* 10EB0 */     B,     B,     O,     O,     O,     O,     O,     O,
+
+#define use_offset_0x10f30u 4296
+
+
+  /* Sogdian */
+
+  /* 10F30 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 10F40 */     B,     B,     B,     B,     B,     B, VMBlw, VMBlw, VMBlw, VMBlw, VMBlw, VMBlw, VMBlw, VMBlw, VMBlw, VMBlw,
+  /* 10F50 */ VMBlw,     B,     B,     B,     B,     O,     O,     O,
+
+#define use_offset_0x10fb0u 4336
+
+
+  /* Chorasmian */
+
+  /* 10FB0 */     B,     O,     B,     B,     B,     B,     B,     O,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 10FC0 */     O,     B,     B,     B,     B,     O,     O,     O,     O,     B,     B,     B,     O,     O,     O,     O,
+  /* 10FD0 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+  /* 10FE0 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+  /* 10FF0 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+
+  /* Brahmi */
+
+  /* 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,
+  /* 11040 */  VBlw,  VBlw,  VAbv,  VAbv,  VAbv,  VAbv,   HVM,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+  /* 11050 */     O,     O,     N,     N,     N,     N,     N,     N,     N,     N,     N,     N,     N,     N,     N,     N,
+  /* 11060 */     N,     N,     N,     N,     N,     N,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11070 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,    HN,
+
+  /* Kaithi */
+
+  /* 11080 */ VMAbv, VMAbv, VMPst,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11090 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 110A0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 110B0 */  VPst,  VPre,  VPst,  VBlw,  VBlw,  VAbv,  VAbv,  VPst,  VPst,     H, CMBlw,     O,     O,     O,     O,     O,
+
+#define use_offset_0x11100u 4608
+
+
+  /* Chakma */
+
+  /* 11100 */ VMAbv, VMAbv, VMAbv,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11110 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11120 */     B,     B,     B,     B,     B,     B,     B,  VBlw,  VBlw,  VBlw,  VAbv,  VAbv,  VPre,  VBlw,  VAbv,  VAbv,
+  /* 11130 */  VBlw,  VAbv,  VAbv,     H, CMAbv,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11140 */     O,     O,     O,     O,     B,  VPst,  VPst,     B,     O,     O,     O,     O,     O,     O,     O,     O,
+
+  /* Mahajani */
+
+  /* 11150 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11160 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11170 */     B,     B,     B, CMBlw,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+
+  /* Sharada */
+
+  /* 11180 */ VMAbv, VMAbv, VMPst,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11190 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 111A0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 111B0 */     B,     B,     B,  VPst,  VPre,  VPst,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VAbv,  VAbv,  VAbv,  VAbv,
+  /* 111C0 */     H,     B,     R,     R,     O,     O,     O,     O,    GB, FMBlw, CMBlw,  VAbv,  VBlw,     O,  VPre, VMAbv,
+  /* 111D0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,
+
+  /* Sinhala Archaic Numbers */
+
+  /* 111E0 */     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 111F0 */     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+
+  /* Khojki */
+
+  /* 11200 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11210 */     B,     B,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11220 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,  VPst,  VPst,  VPst,  VBlw,
+  /* 11230 */  VAbv,  VAbv,  VAbv,  VAbv, VMAbv,     H, CMAbv, CMAbv,     O,     O,     O,     O,     O,     O, VMAbv,     O,
+
+#define use_offset_0x11280u 4928
+
+
+  /* Multani */
+
+  /* 11280 */     B,     B,     B,     B,     B,     B,     B,     O,     B,     O,     B,     B,     B,     B,     O,     B,
+  /* 11290 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,
+  /* 112A0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,     O,
+
+  /* Khudawadi */
+
+  /* 112B0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 112C0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 112D0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B, VMAbv,
+  /* 112E0 */  VPst,  VPre,  VPst,  VBlw,  VBlw,  VAbv,  VAbv,  VAbv,  VAbv, CMBlw,  VBlw,     O,     O,     O,     O,     O,
+  /* 112F0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
+
+  /* Grantha */
+
+  /* 11300 */ VMAbv, VMAbv, VMAbv, VMAbv,     O,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     B,
+  /* 11310 */     B,     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 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, CMBlw, CMBlw,     B,  VPst,  VPst,
+  /* 11340 */  VAbv,  VPst,  VPst,  VPst,  VPst,     O,     O,  VPre,  VPre,     O,     O,  VPre,  VPre,   HVM,     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,
+
+#define use_offset_0x11400u 5176
+
+
+  /* Newa */
+
+  /* 11400 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11410 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11420 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11430 */     B,     B,     B,     B,     B,  VPst,  VPre,  VPst,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VAbv,  VAbv,
+  /* 11440 */  VPst,  VPst,     H, VMAbv, VMAbv, VMPst, CMBlw,     B,     O,     O,     O,     O,     O,     O,     O,     O,
+  /* 11450 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O, FMAbv,     B,
+  /* 11460 */    CS,    CS,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+  /* 11470 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+
+  /* Tirhuta */
+
+  /* 11480 */     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11490 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 114A0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 114B0 */  VPst,  VPre,  VPst,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VPre,  VAbv,  VPre,  VPre,  VPst,  VPre, VMAbv,
+  /* 114C0 */ VMAbv, VMAbv,     H, CMBlw,     B,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+  /* 114D0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
+
+#define use_offset_0x11580u 5400
+
+
+  /* Siddham */
+
+  /* 11580 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11590 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 115A0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,  VPst,
+  /* 115B0 */  VPre,  VPst,  VBlw,  VBlw,  VBlw,  VBlw,     O,     O,  VPre,  VPre,  VPre,  VPre, VMAbv, VMAbv, VMPst,     H,
+  /* 115C0 */ CMBlw,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+  /* 115D0 */     O,     O,     O,     O,     O,     O,     O,     O,     B,     B,     B,     B,  VBlw,  VBlw,     O,     O,
+  /* 115E0 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+  /* 115F0 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+
+  /* Modi */
+
+  /* 11600 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11610 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11620 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11630 */  VPst,  VPst,  VPst,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VAbv,  VAbv,  VPst,  VPst, VMAbv, VMPst,     H,
+  /* 11640 */  VAbv,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+  /* 11650 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
+  /* 11660 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+  /* 11670 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+
+  /* Takri */
+
+  /* 11680 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11690 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 116A0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B, VMAbv, VMPst,  VAbv,  VPre,  VPst,
+  /* 116B0 */  VBlw,  VBlw,  VAbv,  VAbv,  VAbv,  VAbv,     H, CMBlw,     B,     O,     O,     O,     O,     O,     O,     O,
+  /* 116C0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
+  /* 116D0 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+  /* 116E0 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+  /* 116F0 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+
+  /* Ahom */
+
+  /* 11700 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11710 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,  MBlw,  MPre,  MAbv,
+  /* 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_0x11800u 5848
+
+
+  /* Dogra */
+
+  /* 11800 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11810 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11820 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,  VPst,  VPre,  VPst,  VBlw,
+  /* 11830 */  VBlw,  VBlw,  VBlw,  VAbv,  VAbv,  VAbv,  VAbv, VMAbv, VMPst,     H, CMBlw,     O,     O,     O,     O,     O,
+
+#define use_offset_0x11900u 5912
+
+
+  /* Dives Akuru */
+
+  /* 11900 */     B,     B,     B,     B,     B,     B,     B,     O,     O,     B,     O,     O,     B,     B,     B,     B,
+  /* 11910 */     B,     B,     B,     B,     O,     B,     B,     O,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11920 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11930 */  VPst,  VPst,  VPst,  VPst,  VPst,  VPre,     O,  VPre,  VPre,     O,     O, VMAbv, VMAbv,  VPst,     H,     R,
+  /* 11940 */  MPst,     R,  MPst, CMBlw,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+  /* 11950 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
+
+#define use_offset_0x119a0u 6008
+
+
+  /* Nandinagari */
+
+  /* 119A0 */     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     B,     B,     B,     B,     B,     B,
+  /* 119B0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 119C0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 119D0 */     B,  VPst,  VPre,  VPst,  VBlw,  VBlw,  VBlw,  VBlw,     O,     O,  VAbv,  VAbv,  VPst,  VPst, VMPst, VMPst,
+  /* 119E0 */     H,     B,     O,     O,  VPre,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+  /* 119F0 */     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+
+  /* 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, FMBlw,  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,     R,     R,     R,     R,     R,     R,  FBlw,  FBlw,  FBlw,  FBlw,  FBlw,  FBlw,
+  /* 11A90 */  FBlw,  FBlw,  FBlw,  FBlw,  FBlw,  FBlw, VMAbv, VMPst, CMAbv,     H,     O,     O,     O,     B,     O,     O,
+
+#define use_offset_0x11c00u 6264
+
+
+  /* Bhaiksuki */
+
+  /* 11C00 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     B,     B,     B,     B,     B,     B,
+  /* 11C10 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11C20 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,  VPst,
+  /* 11C30 */  VAbv,  VAbv,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,     O,  VAbv,  VAbv,  VAbv,  VAbv, VMAbv, VMAbv, VMPst,     H,
+  /* 11C40 */     B,     O,     O,     O,    GB,    GB,     O,     O,     O,     O,     O,     O,     O,     O,     O,     O,
+  /* 11C50 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11C60 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,
+
+  /* Marchen */
+
+  /* 11C70 */     O,     O,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11C80 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11C90 */     O,     O,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,   SUB,
+  /* 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,
+
+#define use_offset_0x11d00u 6448
+
+
+  /* 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,
+
+  /* Gunjala Gondi */
+
+  /* 11D60 */     B,     B,     B,     B,     B,     B,     O,     B,     B,     O,     B,     B,     B,     B,     B,     B,
+  /* 11D70 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11D80 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,  VPst,  VPst,  VPst,  VPst,  VPst,     O,
+  /* 11D90 */  VAbv,  VAbv,     O,  VPst,  VPst, VMAbv, VMPst,     H,     O,     O,     O,     O,     O,     O,     O,     O,
+  /* 11DA0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
+
+#define use_offset_0x11ee0u 6624
+
+
+  /* Makasar */
+
+  /* 11EE0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 11EF0 */     B,     B,    GB,  VAbv,  VBlw,  VPre,  VPst,     O,
+
+#define use_offset_0x13000u 6648
+
+
+  /* Egyptian Hieroglyphs */
+
+  /* 13000 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 13010 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 13020 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 13030 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 13040 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 13050 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 13060 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 13070 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 13080 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 13090 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 130A0 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 130B0 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 130C0 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 130D0 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 130E0 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 130F0 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 13100 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 13110 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 13120 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 13130 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 13140 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 13150 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 13160 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 13170 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 13180 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 13190 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 131A0 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 131B0 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 131C0 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 131D0 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 131E0 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 131F0 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 13200 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 13210 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 13220 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 13230 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 13240 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 13250 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 13260 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 13270 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 13280 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 13290 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 132A0 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 132B0 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 132C0 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 132D0 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 132E0 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 132F0 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 13300 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 13310 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 13320 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 13330 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 13340 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 13350 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 13360 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 13370 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 13380 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 13390 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 133A0 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 133B0 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 133C0 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 133D0 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 133E0 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 133F0 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 13400 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 13410 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,
+  /* 13420 */     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     G,     O,
+
+  /* Egyptian Hieroglyph Format Controls */
+
+  /* 13430 */     J,     J,     J,     J,     J,     J,     J,    SB,    SE,     O,     O,     O,     O,     O,     O,     O,
+
+#define use_offset_0x16b00u 7736
+
+
+  /* Pahawh Hmong */
+
+  /* 16B00 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 16B10 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 16B20 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 16B30 */ VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv,     O,
+
+#define use_offset_0x16f00u 7792
+
+
+  /* Miao */
+
+  /* 16F00 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 16F10 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 16F20 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 16F30 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 16F40 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O, CMBlw,
+  /* 16F50 */     O,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,
+  /* 16F60 */  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,
+  /* 16F70 */  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,
+  /* 16F80 */  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,     O,     O,     O,     O,     O,     O,     O, VMBlw,
+  /* 16F90 */ VMBlw, VMBlw, VMBlw,     O,     O,     O,     O,     O,
+
+#define use_offset_0x16fe0u 7944
+
+
+  /* Ideographic Symbols and Punctuation */
+
+  /* 16FE0 */     O,     O,     O,     O,     B,     O,     O,     O,
+
+#define use_offset_0x18b00u 7952
+
+
+  /* Khitan Small Script */
+
+  /* 18B00 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 18B10 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 18B20 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 18B30 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 18B40 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 18B50 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 18B60 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 18B70 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 18B80 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 18B90 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 18BA0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 18BB0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 18BC0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 18BD0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 18BE0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 18BF0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 18C00 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 18C10 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 18C20 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 18C30 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 18C40 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 18C50 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 18C60 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 18C70 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 18C80 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 18C90 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 18CA0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 18CB0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 18CC0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 18CD0 */     B,     B,     B,     B,     B,     B,     O,     O,
+
+#define use_offset_0x1bc00u 8424
+
+
+  /* Duployan */
+
+  /* 1BC00 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1BC10 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1BC20 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1BC30 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1BC40 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1BC50 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1BC60 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,
+  /* 1BC70 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,
+  /* 1BC80 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,     O,
+  /* 1BC90 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O, CMBlw, CMBlw,     O,
+
+#define use_offset_0x1e100u 8584
+
+
+  /* Nyiakeng Puachue Hmong */
+
+  /* 1E100 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1E110 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1E120 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,
+  /* 1E130 */ VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv,     B,     B,     B,     B,     B,     B,     B,     O,     O,
+  /* 1E140 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     B,     B,
+
+#define use_offset_0x1e2c0u 8664
+
+
+  /* Wancho */
+
+  /* 1E2C0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1E2D0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1E2E0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B, VMAbv, VMAbv, VMAbv, VMAbv,
+  /* 1E2F0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
+
+#define use_offset_0x1e900u 8728
+
+
+  /* Adlam */
+
+  /* 1E900 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1E910 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1E920 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1E930 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
+  /* 1E940 */     B,     B,     B,     B, CMAbv, CMAbv, CMAbv, CMAbv, CMAbv, CMAbv, CMAbv,     B,     O,     O,     O,     O,
+  /* 1E950 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
+
+}; /* Table items: 8824; occupancy: 79% */
+
+static inline uint8_t
+hb_use_get_category (hb_codepoint_t u)
+{
+  switch (u >> 12)
+  {
+    case 0x0u:
+      if (hb_in_range<hb_codepoint_t> (u, 0x0028u, 0x003Fu)) return use_table[u - 0x0028u + use_offset_0x0028u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x00A0u, 0x00D7u)) return use_table[u - 0x00A0u + use_offset_0x00a0u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x0640u, 0x0647u)) return use_table[u - 0x0640u + use_offset_0x0640u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x07C8u, 0x07FFu)) return use_table[u - 0x07C8u + use_offset_0x07c8u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x0840u, 0x085Fu)) return use_table[u - 0x0840u + use_offset_0x0840u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x0900u, 0x0DF7u)) return use_table[u - 0x0900u + use_offset_0x0900u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x0F00u, 0x0FC7u)) return use_table[u - 0x0F00u + use_offset_0x0f00u];
+      break;
+
+    case 0x1u:
+      if (hb_in_range<hb_codepoint_t> (u, 0x1000u, 0x109Fu)) return use_table[u - 0x1000u + use_offset_0x1000u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x1700u, 0x18AFu)) return use_table[u - 0x1700u + use_offset_0x1700u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x1900u, 0x1A9Fu)) return use_table[u - 0x1900u + use_offset_0x1900u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x1B00u, 0x1C4Fu)) return use_table[u - 0x1B00u + use_offset_0x1b00u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x1CD0u, 0x1CFFu)) return use_table[u - 0x1CD0u + use_offset_0x1cd0u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x1DF8u, 0x1DFFu)) return use_table[u - 0x1DF8u + use_offset_0x1df8u];
+      break;
+
+    case 0x2u:
+      if (hb_in_range<hb_codepoint_t> (u, 0x2008u, 0x2017u)) return use_table[u - 0x2008u + use_offset_0x2008u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x2070u, 0x2087u)) return use_table[u - 0x2070u + use_offset_0x2070u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x20F0u, 0x20F7u)) return use_table[u - 0x20F0u + use_offset_0x20f0u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x25C8u, 0x25CFu)) return use_table[u - 0x25C8u + use_offset_0x25c8u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x2D30u, 0x2D7Fu)) return use_table[u - 0x2D30u + use_offset_0x2d30u];
+      break;
+
+    case 0xAu:
+      if (hb_in_range<hb_codepoint_t> (u, 0xA800u, 0xAAF7u)) return use_table[u - 0xA800u + use_offset_0xa800u];
+      if (hb_in_range<hb_codepoint_t> (u, 0xABC0u, 0xABFFu)) return use_table[u - 0xABC0u + use_offset_0xabc0u];
+      break;
+
+    case 0x10u:
+      if (hb_in_range<hb_codepoint_t> (u, 0x10A00u, 0x10A4Fu)) return use_table[u - 0x10A00u + use_offset_0x10a00u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x10AC0u, 0x10AE7u)) return use_table[u - 0x10AC0u + use_offset_0x10ac0u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x10B80u, 0x10BAFu)) return use_table[u - 0x10B80u + use_offset_0x10b80u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x10D00u, 0x10D3Fu)) return use_table[u - 0x10D00u + use_offset_0x10d00u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x10E80u, 0x10EB7u)) return use_table[u - 0x10E80u + use_offset_0x10e80u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x10F30u, 0x10F57u)) return use_table[u - 0x10F30u + use_offset_0x10f30u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x10FB0u, 0x110BFu)) return use_table[u - 0x10FB0u + use_offset_0x10fb0u];
+      break;
+
+    case 0x11u:
+      if (hb_in_range<hb_codepoint_t> (u, 0x10FB0u, 0x110BFu)) return use_table[u - 0x10FB0u + use_offset_0x10fb0u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x11100u, 0x1123Fu)) return use_table[u - 0x11100u + use_offset_0x11100u];
+      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, 0x11800u, 0x1183Fu)) return use_table[u - 0x11800u + use_offset_0x11800u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x11900u, 0x1195Fu)) return use_table[u - 0x11900u + use_offset_0x11900u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x119A0u, 0x11A9Fu)) return use_table[u - 0x119A0u + use_offset_0x119a0u];
+      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, 0x11DAFu)) return use_table[u - 0x11D00u + use_offset_0x11d00u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x11EE0u, 0x11EF7u)) return use_table[u - 0x11EE0u + use_offset_0x11ee0u];
+      break;
+
+    case 0x13u:
+      if (hb_in_range<hb_codepoint_t> (u, 0x13000u, 0x1343Fu)) return use_table[u - 0x13000u + use_offset_0x13000u];
+      break;
+
+    case 0x16u:
+      if (hb_in_range<hb_codepoint_t> (u, 0x16B00u, 0x16B37u)) return use_table[u - 0x16B00u + use_offset_0x16b00u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x16F00u, 0x16F97u)) return use_table[u - 0x16F00u + use_offset_0x16f00u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x16FE0u, 0x16FE7u)) return use_table[u - 0x16FE0u + use_offset_0x16fe0u];
+      break;
+
+    case 0x18u:
+      if (hb_in_range<hb_codepoint_t> (u, 0x18B00u, 0x18CD7u)) return use_table[u - 0x18B00u + use_offset_0x18b00u];
+      break;
+
+    case 0x1Bu:
+      if (hb_in_range<hb_codepoint_t> (u, 0x1BC00u, 0x1BC9Fu)) return use_table[u - 0x1BC00u + use_offset_0x1bc00u];
+      break;
+
+    case 0x1Eu:
+      if (hb_in_range<hb_codepoint_t> (u, 0x1E100u, 0x1E14Fu)) return use_table[u - 0x1E100u + use_offset_0x1e100u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x1E2C0u, 0x1E2FFu)) return use_table[u - 0x1E2C0u + use_offset_0x1e2c0u];
+      if (hb_in_range<hb_codepoint_t> (u, 0x1E900u, 0x1E95Fu)) return use_table[u - 0x1E900u + use_offset_0x1e900u];
+      break;
+
+    default:
+      break;
+  }
+  return USE(O);
+}
+
+#undef B
+#undef CS
+#undef G
+#undef GB
+#undef H
+#undef HN
+#undef HVM
+#undef J
+#undef N
+#undef O
+#undef R
+#undef S
+#undef SB
+#undef SE
+#undef SUB
+#undef Sk
+#undef ZWNJ
+#undef CMAbv
+#undef CMBlw
+#undef FAbv
+#undef FBlw
+#undef FPst
+#undef FMAbv
+#undef FMBlw
+#undef FMPst
+#undef MAbv
+#undef MBlw
+#undef MPst
+#undef MPre
+#undef SMAbv
+#undef SMBlw
+#undef VAbv
+#undef VBlw
+#undef VPst
+#undef VPre
+#undef VMAbv
+#undef VMBlw
+#undef VMPst
+#undef VMPre
+
+
+#endif /* HB_OT_SHAPE_COMPLEX_USE_TABLE_HH */
+/* == End of generated table == */

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-use.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-use.cc	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-use.cc	2021-04-17 22:31:16 UTC (rev 58898)
@@ -30,15 +30,13 @@
 
 #ifndef HB_NO_OT_SHAPE
 
-#include "hb-ot-shape-complex-use.hh"
+#include "hb-ot-shape-complex-use-machine.hh"
+#include "hb-ot-shape-complex-use-table.hh"
 #include "hb-ot-shape-complex-arabic.hh"
 #include "hb-ot-shape-complex-arabic-joining-list.hh"
 #include "hb-ot-shape-complex-vowel-constraints.hh"
 
-/* buffer var allocations */
-#define use_category() complex_var_u8_1()
 
-
 /*
  * Universal Shaping Engine.
  * https://docs.microsoft.com/en-us/typography/script-development/use
@@ -69,11 +67,11 @@
 };
 /* Same order as use_topographical_features. */
 enum joining_form_t {
-  USE_ISOL,
-  USE_INIT,
-  USE_MEDI,
-  USE_FINA,
-  _USE_NONE
+  JOINING_FORM_ISOL,
+  JOINING_FORM_INIT,
+  JOINING_FORM_MEDI,
+  JOINING_FORM_FINA,
+  _JOINING_FORM_NONE
 };
 static const hb_tag_t
 use_other_features[] =
@@ -186,22 +184,6 @@
   free (data);
 }
 
-enum use_syllable_type_t {
-  use_independent_cluster,
-  use_virama_terminated_cluster,
-  use_sakot_terminated_cluster,
-  use_standard_cluster,
-  use_number_joiner_terminated_cluster,
-  use_numeral_cluster,
-  use_symbol_cluster,
-  use_hieroglyph_cluster,
-  use_broken_cluster,
-  use_non_cluster,
-};
-
-#include "hb-ot-shape-complex-use-machine.hh"
-
-
 static void
 setup_masks_use (const hb_ot_shape_plan_t *plan,
 		 hb_buffer_t              *buffer,
@@ -239,7 +221,7 @@
 
   foreach_syllable (buffer, start, end)
   {
-    unsigned int limit = info[start].use_category() == USE_R ? 1 : hb_min (3u, end - start);
+    unsigned int limit = info[start].use_category() == USE(R) ? 1 : hb_min (3u, end - start);
     for (unsigned int i = start; i < start + limit; i++)
       info[i].mask |= mask;
   }
@@ -253,7 +235,7 @@
   if (use_plan->arabic_plan)
     return;
 
-  static_assert ((USE_INIT < 4 && USE_ISOL < 4 && USE_MEDI < 4 && USE_FINA < 4), "");
+  static_assert ((JOINING_FORM_INIT < 4 && JOINING_FORM_ISOL < 4 && JOINING_FORM_MEDI < 4 && JOINING_FORM_FINA < 4), "");
   hb_mask_t masks[4], all_masks = 0;
   for (unsigned int i = 0; i < 4; i++)
   {
@@ -267,7 +249,7 @@
   hb_mask_t other_masks = ~all_masks;
 
   unsigned int last_start = 0;
-  joining_form_t last_form = _USE_NONE;
+  joining_form_t last_form = _JOINING_FORM_NONE;
   hb_glyph_info_t *info = buffer->info;
   foreach_syllable (buffer, start, end)
   {
@@ -279,7 +261,7 @@
       case use_hieroglyph_cluster:
       case use_non_cluster:
 	/* These don't join.  Nothing to do. */
-	last_form = _USE_NONE;
+	last_form = _JOINING_FORM_NONE;
 	break;
 
       case use_virama_terminated_cluster:
@@ -289,18 +271,18 @@
       case use_numeral_cluster:
       case use_broken_cluster:
 
-	bool join = last_form == USE_FINA || last_form == USE_ISOL;
+	bool join = last_form == JOINING_FORM_FINA || last_form == JOINING_FORM_ISOL;
 
 	if (join)
 	{
 	  /* Fixup previous syllable's form. */
-	  last_form = last_form == USE_FINA ? USE_MEDI : USE_INIT;
+	  last_form = last_form == JOINING_FORM_FINA ? JOINING_FORM_MEDI : JOINING_FORM_INIT;
 	  for (unsigned int i = last_start; i < start; i++)
 	    info[i].mask = (info[i].mask & other_masks) | masks[last_form];
 	}
 
 	/* Form for this syllable. */
-	last_form = join ? USE_FINA : USE_ISOL;
+	last_form = join ? JOINING_FORM_FINA : JOINING_FORM_ISOL;
 	for (unsigned int i = start; i < end; i++)
 	  info[i].mask = (info[i].mask & other_masks) | masks[last_form];
 
@@ -336,11 +318,11 @@
 
   foreach_syllable (buffer, start, end)
   {
-    /* Mark a substituted repha as USE_R. */
+    /* Mark a substituted repha as USE(R). */
     for (unsigned int i = start; i < end && (info[i].mask & mask); i++)
       if (_hb_glyph_info_substituted (&info[i]))
       {
-	info[i].use_category() = USE_R;
+	info[i].use_category() = USE(R);
 	break;
       }
   }
@@ -359,7 +341,7 @@
     for (unsigned int i = start; i < end; i++)
       if (_hb_glyph_info_substituted (&info[i]))
       {
-	info[i].use_category() = USE_VPre;
+	info[i].use_category() = USE(VPre);
 	break;
       }
   }
@@ -368,7 +350,7 @@
 static inline bool
 is_halant_use (const hb_glyph_info_t &info)
 {
-  return (info.use_category() == USE_H || info.use_category() == USE_HVM) &&
+  return (info.use_category() == USE(H) || info.use_category() == USE(HVM)) &&
 	 !_hb_glyph_info_ligated (&info);
 }
 
@@ -387,24 +369,24 @@
 
   hb_glyph_info_t *info = buffer->info;
 
-#define POST_BASE_FLAGS64 (FLAG64 (USE_FAbv) | \
-			   FLAG64 (USE_FBlw) | \
-			   FLAG64 (USE_FPst) | \
-			   FLAG64 (USE_MAbv) | \
-			   FLAG64 (USE_MBlw) | \
-			   FLAG64 (USE_MPst) | \
-			   FLAG64 (USE_MPre) | \
-			   FLAG64 (USE_VAbv) | \
-			   FLAG64 (USE_VBlw) | \
-			   FLAG64 (USE_VPst) | \
-			   FLAG64 (USE_VPre) | \
-			   FLAG64 (USE_VMAbv) | \
-			   FLAG64 (USE_VMBlw) | \
-			   FLAG64 (USE_VMPst) | \
-			   FLAG64 (USE_VMPre))
+#define POST_BASE_FLAGS64 (FLAG64 (USE(FAbv)) | \
+			   FLAG64 (USE(FBlw)) | \
+			   FLAG64 (USE(FPst)) | \
+			   FLAG64 (USE(MAbv)) | \
+			   FLAG64 (USE(MBlw)) | \
+			   FLAG64 (USE(MPst)) | \
+			   FLAG64 (USE(MPre)) | \
+			   FLAG64 (USE(VAbv)) | \
+			   FLAG64 (USE(VBlw)) | \
+			   FLAG64 (USE(VPst)) | \
+			   FLAG64 (USE(VPre)) | \
+			   FLAG64 (USE(VMAbv)) | \
+			   FLAG64 (USE(VMBlw)) | \
+			   FLAG64 (USE(VMPst)) | \
+			   FLAG64 (USE(VMPre)))
 
   /* Move things forward. */
-  if (info[start].use_category() == USE_R && end - start > 1)
+  if (info[start].use_category() == USE(R) && end - start > 1)
   {
     /* Got a repha.  Reorder it towards the end, but before the first post-base
      * glyph. */
@@ -441,7 +423,7 @@
        * shift things in between forward. */
       j = i + 1;
     }
-    else if (((flag) & (FLAG (USE_VPre) | FLAG (USE_VMPre))) &&
+    else if (((flag) & (FLAG (USE(VPre)) | FLAG (USE(VMPre)))) &&
 	     /* Only move the first component of a MultipleSubst. */
 	     0 == _hb_glyph_info_get_lig_comp (&info[i]) &&
 	     j < i)
@@ -454,76 +436,22 @@
   }
 }
 
-static inline void
-insert_dotted_circles_use (const hb_ot_shape_plan_t *plan HB_UNUSED,
-			   hb_font_t *font,
-			   hb_buffer_t *buffer)
-{
-  if (unlikely (buffer->flags & HB_BUFFER_FLAG_DO_NOT_INSERT_DOTTED_CIRCLE))
-    return;
-
-  /* Note: This loop is extra overhead, but should not be measurable.
-   * TODO Use a buffer scratch flag to remove the loop. */
-  bool has_broken_syllables = false;
-  unsigned int count = buffer->len;
-  hb_glyph_info_t *info = buffer->info;
-  for (unsigned int i = 0; i < count; i++)
-    if ((info[i].syllable() & 0x0F) == use_broken_cluster)
-    {
-      has_broken_syllables = true;
-      break;
-    }
-  if (likely (!has_broken_syllables))
-    return;
-
-  hb_glyph_info_t dottedcircle = {0};
-  if (!font->get_nominal_glyph (0x25CCu, &dottedcircle.codepoint))
-    return;
-  dottedcircle.use_category() = hb_use_get_category (0x25CC);
-
-  buffer->clear_output ();
-
-  buffer->idx = 0;
-  unsigned int last_syllable = 0;
-  while (buffer->idx < buffer->len && buffer->successful)
-  {
-    unsigned int syllable = buffer->cur().syllable();
-    use_syllable_type_t syllable_type = (use_syllable_type_t) (syllable & 0x0F);
-    if (unlikely (last_syllable != syllable && syllable_type == use_broken_cluster))
-    {
-      last_syllable = syllable;
-
-      hb_glyph_info_t ginfo = dottedcircle;
-      ginfo.cluster = buffer->cur().cluster;
-      ginfo.mask = buffer->cur().mask;
-      ginfo.syllable() = buffer->cur().syllable();
-
-      /* Insert dottedcircle after possible Repha. */
-      while (buffer->idx < buffer->len && buffer->successful &&
-	     last_syllable == buffer->cur().syllable() &&
-	     buffer->cur().use_category() == USE_R)
-	buffer->next_glyph ();
-
-      buffer->output_info (ginfo);
-    }
-    else
-      buffer->next_glyph ();
-  }
-  buffer->swap_buffers ();
-}
-
 static void
 reorder_use (const hb_ot_shape_plan_t *plan,
 	     hb_font_t *font,
 	     hb_buffer_t *buffer)
 {
-	if (buffer->message (font, "start reordering USE")) {
-	  insert_dotted_circles_use (plan, font, buffer);
+  if (buffer->message (font, "start reordering USE"))
+  {
+    hb_syllabic_insert_dotted_circles (font, buffer,
+				       use_broken_cluster,
+				       USE(B),
+				       USE(R));
 
-	  foreach_syllable (buffer, start, end)
-	    reorder_syllable_use (buffer, start, end);
+    foreach_syllable (buffer, start, end)
+      reorder_syllable_use (buffer, start, end);
 
-	  (void) buffer->message (font, "end reordering USE");
+    (void) buffer->message (font, "end reordering USE");
   }
 
   HB_BUFFER_DEALLOCATE_VAR (buffer, use_category);

Deleted: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-use.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-use.hh	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-use.hh	2021-04-17 22:31:16 UTC (rev 58898)
@@ -1,96 +0,0 @@
-/*
- * Copyright © 2015  Mozilla Foundation.
- * Copyright © 2015  Google, Inc.
- *
- *  This is part of HarfBuzz, a text shaping library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- *
- * Mozilla Author(s): Jonathan Kew
- * Google Author(s): Behdad Esfahbod
- */
-
-#ifndef HB_OT_SHAPE_COMPLEX_USE_HH
-#define HB_OT_SHAPE_COMPLEX_USE_HH
-
-#include "hb.hh"
-
-
-#include "hb-ot-shape-complex.hh"
-
-
-#define USE_TABLE_ELEMENT_TYPE uint8_t
-
-/* Cateories used in the Universal Shaping Engine spec:
- * https://docs.microsoft.com/en-us/typography/script-development/use
- */
-/* Note: This enum is duplicated in the -machine.rl source file.
- * Not sure how to avoid duplication. */
-enum use_category_t {
-  USE_O		= 0,	/* OTHER */
-
-  USE_B		= 1,	/* BASE */
-  USE_N		= 4,	/* BASE_NUM */
-  USE_GB	= 5,	/* BASE_OTHER */
-  USE_SUB	= 11,	/* CONS_SUB */
-  USE_H		= 12,	/* HALANT */
-
-  USE_HN	= 13,	/* HALANT_NUM */
-  USE_ZWNJ	= 14,	/* Zero width non-joiner */
-  USE_R		= 18,	/* REPHA */
-  USE_S		= 19,	/* SYM */
-  USE_CS	= 43,	/* CONS_WITH_STACKER */
-
-  /* https://github.com/harfbuzz/harfbuzz/issues/1102 */
-  USE_HVM	= 44,	/* HALANT_OR_VOWEL_MODIFIER */
-
-  USE_Sk	= 48,	/* SAKOT */
-  USE_G		= 49,	/* HIEROGLYPH */
-  USE_J		= 50,	/* HIEROGLYPH_JOINER */
-  USE_SB	= 51,	/* HIEROGLYPH_SEGMENT_BEGIN */
-  USE_SE	= 52,	/* HIEROGLYPH_SEGMENT_END */
-
-  USE_FAbv	= 24,	/* CONS_FINAL_ABOVE */
-  USE_FBlw	= 25,	/* CONS_FINAL_BELOW */
-  USE_FPst	= 26,	/* CONS_FINAL_POST */
-  USE_MAbv	= 27,	/* CONS_MED_ABOVE */
-  USE_MBlw	= 28,	/* CONS_MED_BELOW */
-  USE_MPst	= 29,	/* CONS_MED_POST */
-  USE_MPre	= 30,	/* CONS_MED_PRE */
-  USE_CMAbv	= 31,	/* CONS_MOD_ABOVE */
-  USE_CMBlw	= 32,	/* CONS_MOD_BELOW */
-  USE_VAbv	= 33,	/* VOWEL_ABOVE / VOWEL_ABOVE_BELOW / VOWEL_ABOVE_BELOW_POST / VOWEL_ABOVE_POST */
-  USE_VBlw	= 34,	/* VOWEL_BELOW / VOWEL_BELOW_POST */
-  USE_VPst	= 35,	/* VOWEL_POST	UIPC = Right */
-  USE_VPre	= 22,	/* VOWEL_PRE / VOWEL_PRE_ABOVE / VOWEL_PRE_ABOVE_POST / VOWEL_PRE_POST */
-  USE_VMAbv	= 37,	/* VOWEL_MOD_ABOVE */
-  USE_VMBlw	= 38,	/* VOWEL_MOD_BELOW */
-  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_FMAbv	= 45,	/* CONS_FINAL_MOD	UIPC = Top */
-  USE_FMBlw	= 46,	/* CONS_FINAL_MOD	UIPC = Bottom */
-  USE_FMPst	= 47,	/* CONS_FINAL_MOD	UIPC = Not_Applicable */
-};
-
-HB_INTERNAL USE_TABLE_ELEMENT_TYPE
-hb_use_get_category (hb_codepoint_t u);
-
-#endif /* HB_OT_SHAPE_COMPLEX_USE_HH */

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-vowel-constraints.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-vowel-constraints.cc	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-vowel-constraints.cc	2021-04-17 22:31:16 UTC (rev 58898)
@@ -23,8 +23,8 @@
 static void
 _output_dotted_circle (hb_buffer_t *buffer)
 {
-  hb_glyph_info_t &dottedcircle = buffer->output_glyph (0x25CCu);
-  _hb_glyph_info_reset_continuation (&dottedcircle);
+  (void) buffer->output_glyph (0x25CCu);
+  _hb_glyph_info_reset_continuation (&buffer->prev());
 }
 
 static void
@@ -31,7 +31,7 @@
 _output_with_dotted_circle (hb_buffer_t *buffer)
 {
   _output_dotted_circle (buffer);
-  buffer->next_glyph ();
+  (void) buffer->next_glyph ();
 }
 
 void
@@ -51,7 +51,6 @@
    *
    * https://github.com/harfbuzz/harfbuzz/issues/1019
    */
-  bool processed = false;
   buffer->clear_output ();
   unsigned int count = buffer->len;
   switch ((unsigned) buffer->props.script)
@@ -97,15 +96,14 @@
 		buffer->idx + 2 < count &&
 		0x0907u == buffer->cur (2).codepoint)
 	    {
-	      buffer->next_glyph ();
+	      (void) buffer->next_glyph ();
 	      matched = true;
 	    }
 	    break;
 	}
-	buffer->next_glyph ();
+	(void) buffer->next_glyph ();
 	if (matched) _output_with_dotted_circle (buffer);
       }
-      processed = true;
       break;
 
     case HB_SCRIPT_BENGALI:
@@ -124,10 +122,9 @@
 	    matched = 0x09E2u == buffer->cur (1).codepoint;
 	    break;
 	}
-	buffer->next_glyph ();
+	(void) buffer->next_glyph ();
 	if (matched) _output_with_dotted_circle (buffer);
       }
-      processed = true;
       break;
 
     case HB_SCRIPT_GURMUKHI:
@@ -161,10 +158,9 @@
 	    }
 	    break;
 	}
-	buffer->next_glyph ();
+	(void) buffer->next_glyph ();
 	if (matched) _output_with_dotted_circle (buffer);
       }
-      processed = true;
       break;
 
     case HB_SCRIPT_GUJARATI:
@@ -186,10 +182,9 @@
 	    matched = 0x0ABEu == buffer->cur (1).codepoint;
 	    break;
 	}
-	buffer->next_glyph ();
+	(void) buffer->next_glyph ();
 	if (matched) _output_with_dotted_circle (buffer);
       }
-      processed = true;
       break;
 
     case HB_SCRIPT_ORIYA:
@@ -205,10 +200,9 @@
 	    matched = 0x0B57u == buffer->cur (1).codepoint;
 	    break;
 	}
-	buffer->next_glyph ();
+	(void) buffer->next_glyph ();
 	if (matched) _output_with_dotted_circle (buffer);
       }
-      processed = true;
       break;
 
     case HB_SCRIPT_TAMIL:
@@ -220,10 +214,9 @@
 	{
 	  matched = true;
 	}
-	buffer->next_glyph ();
+	(void) buffer->next_glyph ();
 	if (matched) _output_with_dotted_circle (buffer);
       }
-      processed = true;
       break;
 
     case HB_SCRIPT_TELUGU:
@@ -244,10 +237,9 @@
 	    matched = 0x0C55u == buffer->cur (1).codepoint;
 	    break;
 	}
-	buffer->next_glyph ();
+	(void) buffer->next_glyph ();
 	if (matched) _output_with_dotted_circle (buffer);
       }
-      processed = true;
       break;
 
     case HB_SCRIPT_KANNADA:
@@ -263,10 +255,9 @@
 	    matched = 0x0CCCu == buffer->cur (1).codepoint;
 	    break;
 	}
-	buffer->next_glyph ();
+	(void) buffer->next_glyph ();
 	if (matched) _output_with_dotted_circle (buffer);
       }
-      processed = true;
       break;
 
     case HB_SCRIPT_MALAYALAM:
@@ -290,10 +281,9 @@
 	    }
 	    break;
 	}
-	buffer->next_glyph ();
+	(void) buffer->next_glyph ();
 	if (matched) _output_with_dotted_circle (buffer);
       }
-      processed = true;
       break;
 
     case HB_SCRIPT_SINHALA:
@@ -326,10 +316,9 @@
 	    }
 	    break;
 	}
-	buffer->next_glyph ();
+	(void) buffer->next_glyph ();
 	if (matched) _output_with_dotted_circle (buffer);
       }
-      processed = true;
       break;
 
     case HB_SCRIPT_BRAHMI:
@@ -348,10 +337,9 @@
 	    matched = 0x11042u == buffer->cur (1).codepoint;
 	    break;
 	}
-	buffer->next_glyph ();
+	(void) buffer->next_glyph ();
 	if (matched) _output_with_dotted_circle (buffer);
       }
-      processed = true;
       break;
 
     case HB_SCRIPT_KHUDAWADI:
@@ -370,10 +358,9 @@
 	    }
 	    break;
 	}
-	buffer->next_glyph ();
+	(void) buffer->next_glyph ();
 	if (matched) _output_with_dotted_circle (buffer);
       }
-      processed = true;
       break;
 
     case HB_SCRIPT_TIRHUTA:
@@ -397,10 +384,9 @@
 	    }
 	    break;
 	}
-	buffer->next_glyph ();
+	(void) buffer->next_glyph ();
 	if (matched) _output_with_dotted_circle (buffer);
       }
-      processed = true;
       break;
 
     case HB_SCRIPT_MODI:
@@ -418,10 +404,9 @@
 	    }
 	    break;
 	}
-	buffer->next_glyph ();
+	(void) buffer->next_glyph ();
 	if (matched) _output_with_dotted_circle (buffer);
       }
-      processed = true;
       break;
 
     case HB_SCRIPT_TAKRI:
@@ -442,21 +427,15 @@
 	    matched = 0x116B2u == buffer->cur (1).codepoint;
 	    break;
 	}
-	buffer->next_glyph ();
+	(void) buffer->next_glyph ();
 	if (matched) _output_with_dotted_circle (buffer);
       }
-      processed = true;
       break;
 
     default:
       break;
   }
-  if (processed)
-  {
-    if (buffer->idx < count)
-      buffer->next_glyph ();
-    buffer->swap_buffers ();
-  }
+  buffer->swap_buffers ();
 }
 
 

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex.hh	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex.hh	2021-04-17 22:31:16 UTC (rev 58898)
@@ -35,8 +35,8 @@
 
 
 /* buffer var allocations, used by complex shapers */
-#define complex_var_u8_0()	var2.u8[2]
-#define complex_var_u8_1()	var2.u8[3]
+#define complex_var_u8_category()	var2.u8[2]
+#define complex_var_u8_auxiliary()	var2.u8[3]
 
 
 #define HB_OT_SHAPE_COMPLEX_MAX_COMBINING_MARKS 32
@@ -186,27 +186,8 @@
     case HB_SCRIPT_ARABIC:
 
     /* Unicode-3.0 additions */
-    case HB_SCRIPT_MONGOLIAN:
     case HB_SCRIPT_SYRIAC:
 
-    /* Unicode-5.0 additions */
-    case HB_SCRIPT_NKO:
-    case HB_SCRIPT_PHAGS_PA:
-
-    /* Unicode-6.0 additions */
-    case HB_SCRIPT_MANDAIC:
-
-    /* Unicode-7.0 additions */
-    case HB_SCRIPT_MANICHAEAN:
-    case HB_SCRIPT_PSALTER_PAHLAVI:
-
-    /* Unicode-9.0 additions */
-    case HB_SCRIPT_ADLAM:
-
-    /* Unicode-11.0 additions */
-    case HB_SCRIPT_HANIFI_ROHINGYA:
-    case HB_SCRIPT_SOGDIAN:
-
       /* For Arabic script, use the Arabic shaper even if no OT script tag was found.
        * This is because we do fallback shaping for Arabic script (and not others).
        * But note that Arabic shaping is applicable only to horizontal layout; for
@@ -284,8 +265,9 @@
 	return &_hb_ot_complex_shaper_myanmar;
 
 
+#define HB_SCRIPT_MYANMAR_ZAWGYI	((hb_script_t) HB_TAG ('Q','a','a','g'))
+    case HB_SCRIPT_MYANMAR_ZAWGYI:
     /* https://github.com/harfbuzz/harfbuzz/issues/1162 */
-    case HB_SCRIPT_MYANMAR_ZAWGYI:
 
       return &_hb_ot_complex_shaper_myanmar_zawgyi;
 
@@ -294,7 +276,7 @@
     case HB_SCRIPT_TIBETAN:
 
     /* Unicode-3.0 additions */
-    //case HB_SCRIPT_MONGOLIAN:
+    case HB_SCRIPT_MONGOLIAN:
     //case HB_SCRIPT_SINHALA:
 
     /* Unicode-3.2 additions */
@@ -315,8 +297,8 @@
 
     /* Unicode-5.0 additions */
     case HB_SCRIPT_BALINESE:
-    //case HB_SCRIPT_NKO:
-    //case HB_SCRIPT_PHAGS_PA:
+    case HB_SCRIPT_NKO:
+    case HB_SCRIPT_PHAGS_PA:
 
     /* Unicode-5.1 additions */
     case HB_SCRIPT_CHAM:
@@ -337,7 +319,7 @@
     /* Unicode-6.0 additions */
     case HB_SCRIPT_BATAK:
     case HB_SCRIPT_BRAHMI:
-    //case HB_SCRIPT_MANDAIC:
+    case HB_SCRIPT_MANDAIC:
 
     /* Unicode-6.1 additions */
     case HB_SCRIPT_CHAKMA:
@@ -351,10 +333,10 @@
     case HB_SCRIPT_KHOJKI:
     case HB_SCRIPT_KHUDAWADI:
     case HB_SCRIPT_MAHAJANI:
-    //case HB_SCRIPT_MANICHAEAN:
+    case HB_SCRIPT_MANICHAEAN:
     case HB_SCRIPT_MODI:
     case HB_SCRIPT_PAHAWH_HMONG:
-    //case HB_SCRIPT_PSALTER_PAHLAVI:
+    case HB_SCRIPT_PSALTER_PAHLAVI:
     case HB_SCRIPT_SIDDHAM:
     case HB_SCRIPT_TIRHUTA:
 
@@ -363,7 +345,7 @@
     case HB_SCRIPT_MULTANI:
 
     /* Unicode-9.0 additions */
-    //case HB_SCRIPT_ADLAM:
+    case HB_SCRIPT_ADLAM:
     case HB_SCRIPT_BHAIKSUKI:
     case HB_SCRIPT_MARCHEN:
     case HB_SCRIPT_NEWA:
@@ -376,11 +358,11 @@
     /* Unicode-11.0 additions */
     case HB_SCRIPT_DOGRA:
     case HB_SCRIPT_GUNJALA_GONDI:
-    //case HB_SCRIPT_HANIFI_ROHINGYA:
+    case HB_SCRIPT_HANIFI_ROHINGYA:
     case HB_SCRIPT_MAKASAR:
     case HB_SCRIPT_MEDEFAIDRIN:
     case HB_SCRIPT_OLD_SOGDIAN:
-    //case HB_SCRIPT_SOGDIAN:
+    case HB_SCRIPT_SOGDIAN:
 
     /* Unicode-12.0 additions */
     case HB_SCRIPT_ELYMAIC:

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-normalize.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-normalize.cc	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-normalize.cc	2021-04-17 22:31:16 UTC (rev 58898)
@@ -101,8 +101,9 @@
 static inline void
 output_char (hb_buffer_t *buffer, hb_codepoint_t unichar, hb_codepoint_t glyph)
 {
+  /* This is very confusing indeed. */
   buffer->cur().glyph_index() = glyph;
-  buffer->output_glyph (unichar); /* This is very confusing indeed. */
+  (void) buffer->output_glyph (unichar);
   _hb_glyph_info_set_unicode_props (&buffer->prev(), buffer);
 }
 
@@ -110,7 +111,7 @@
 next_char (hb_buffer_t *buffer, hb_codepoint_t glyph)
 {
   buffer->cur().glyph_index() = glyph;
-  buffer->next_glyph ();
+  (void) buffer->next_glyph ();
 }
 
 static inline void
@@ -229,30 +230,35 @@
       if (font->get_variation_glyph (buffer->cur().codepoint, buffer->cur(+1).codepoint, &buffer->cur().glyph_index()))
       {
 	hb_codepoint_t unicode = buffer->cur().codepoint;
-	buffer->replace_glyphs (2, 1, &unicode);
+	(void) buffer->replace_glyphs (2, 1, &unicode);
       }
       else
       {
 	/* Just pass on the two characters separately, let GSUB do its magic. */
 	set_glyph (buffer->cur(), font);
-	buffer->next_glyph ();
+	(void) buffer->next_glyph ();
 	set_glyph (buffer->cur(), font);
-	buffer->next_glyph ();
+	(void) buffer->next_glyph ();
       }
       /* Skip any further variation selectors. */
-      while (buffer->idx < end && unlikely (buffer->unicode->is_variation_selector (buffer->cur().codepoint)))
+      while (buffer->idx < end &&
+	     buffer->successful &&
+	     unlikely (buffer->unicode->is_variation_selector (buffer->cur().codepoint)))
       {
 	set_glyph (buffer->cur(), font);
-	buffer->next_glyph ();
+	(void) buffer->next_glyph ();
       }
-    } else {
+    }
+    else
+    {
       set_glyph (buffer->cur(), font);
-      buffer->next_glyph ();
+      (void) buffer->next_glyph ();
     }
   }
-  if (likely (buffer->idx < end)) {
+  if (likely (buffer->idx < end))
+  {
     set_glyph (buffer->cur(), font);
-    buffer->next_glyph ();
+    (void) buffer->next_glyph ();
   }
 }
 
@@ -348,7 +354,7 @@
 						      sizeof (buffer->info[0]),
 						      &buffer->cur().glyph_index(),
 						      sizeof (buffer->info[0]));
-	buffer->next_glyphs (done);
+	if (unlikely (!buffer->next_glyphs (done))) break;
       }
       while (buffer->idx < end && buffer->successful)
 	decompose_current_character (&c, might_short_circuit);
@@ -419,6 +425,7 @@
   /* Third round, recompose */
 
   if (!all_simple &&
+      buffer->successful &&
       (mode == HB_OT_SHAPE_NORMALIZATION_MODE_COMPOSED_DIACRITICS ||
        mode == HB_OT_SHAPE_NORMALIZATION_MODE_COMPOSED_DIACRITICS_NO_SHORT_CIRCUIT))
   {
@@ -428,8 +435,8 @@
     buffer->clear_output ();
     count = buffer->len;
     unsigned int starter = 0;
-    buffer->next_glyph ();
-    while (buffer->idx < count && buffer->successful)
+    (void) buffer->next_glyph ();
+    while (buffer->idx < count /* No need for: && buffer->successful */)
     {
       hb_codepoint_t composed, glyph;
       if (/* We don't try to compose a non-mark character with it's preceding starter.
@@ -451,9 +458,7 @@
 	    font->get_nominal_glyph (composed, &glyph))
 	{
 	  /* Composes. */
-	  buffer->next_glyph (); /* Copy to out-buffer. */
-	  if (unlikely (!buffer->successful))
-	    return;
+	  if (unlikely (!buffer->next_glyph ())) break; /* Copy to out-buffer. */
 	  buffer->merge_out_clusters (starter, buffer->out_len);
 	  buffer->out_len--; /* Remove the second composable. */
 	  /* Modify starter and carry on. */
@@ -466,7 +471,7 @@
       }
 
       /* Blocked, or doesn't compose. */
-      buffer->next_glyph ();
+      if (unlikely (!buffer->next_glyph ())) break;
 
       if (info_cc (buffer->prev()) == 0)
 	starter = buffer->out_len - 1;

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape.cc	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape.cc	2021-04-17 22:31:16 UTC (rev 58898)
@@ -534,9 +534,7 @@
   hb_glyph_info_t info = dottedcircle;
   info.cluster = buffer->cur().cluster;
   info.mask = buffer->cur().mask;
-  buffer->output_info (info);
-  while (buffer->idx < buffer->len && buffer->successful)
-    buffer->next_glyph ();
+  (void) buffer->output_info (info);
   buffer->swap_buffers ();
 }
 

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape.h
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape.h	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape.h	2021-04-17 22:31:16 UTC (rev 58898)
@@ -24,7 +24,7 @@
  * Red Hat Author(s): Behdad Esfahbod
  */
 
-#ifndef HB_OT_H_IN
+#if !defined(HB_OT_H_IN) && !defined(HB_NO_SINGLE_HEADER_ERROR)
 #error "Include <hb-ot.h> instead."
 #endif
 

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-tag-table.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-tag-table.hh	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-tag-table.hh	2021-04-17 22:31:16 UTC (rev 58898)
@@ -6,8 +6,8 @@
  *
  * on files with these headers:
  *
- * <meta name="updated_at" content="2020-11-17 08:21 AM" />
- * File-Date: 2020-09-29
+ * <meta name="updated_at" content="2021-02-12 04:08 PM" />
+ * File-Date: 2021-03-05
  */
 
 #ifndef HB_OT_TAG_TABLE_HH
@@ -169,6 +169,7 @@
   {"bko",	HB_TAG('B','M','L',' ')},	/* Kwa' -> Bamileke */
   {"bla",	HB_TAG('B','K','F',' ')},	/* Siksika -> Blackfoot */
   {"ble",	HB_TAG('B','L','N',' ')},	/* Balanta-Kentohe -> Balante */
+  {"blg",	HB_TAG('I','B','A',' ')},	/* Balau (retired code) -> Iban */
   {"bli",	HB_TAG_NONE	       },	/* Bolia != Baluchi */
   {"blk",	HB_TAG('B','L','K',' ')},	/* Pa’o Karen */
   {"blk",	HB_TAG('K','R','N',' ')},	/* Pa'o Karen -> Karen */
@@ -358,6 +359,7 @@
   {"czo",	HB_TAG('Z','H','S',' ')},	/* Min Zhong Chinese -> Chinese, Simplified */
   {"czt",	HB_TAG('Q','I','N',' ')},	/* Zotung Chin -> Chin */
   {"da",	HB_TAG('D','A','N',' ')},	/* Danish */
+/*{"dag",	HB_TAG('D','A','G',' ')},*/	/* Dagbani */
   {"dao",	HB_TAG('Q','I','N',' ')},	/* Daai Chin -> Chin */
   {"dap",	HB_TAG('N','I','S',' ')},	/* Nisi (India) (retired code) */
 /*{"dar",	HB_TAG('D','A','R',' ')},*/	/* Dargwa */
@@ -834,6 +836,7 @@
   {"lri",	HB_TAG('L','U','H',' ')},	/* Marachi -> Luyia */
   {"lrm",	HB_TAG('L','U','H',' ')},	/* Marama -> Luyia */
   {"lrt",	HB_TAG('C','P','P',' ')},	/* Larantuka Malay -> Creoles */
+  {"lsb",	HB_TAG_NONE	       },	/* Burundian Sign Language != Lower Sorbian */
   {"lsm",	HB_TAG('L','U','H',' ')},	/* Saamia -> Luyia */
   {"lt",	HB_TAG('L','T','H',' ')},	/* Lithuanian */
   {"ltg",	HB_TAG('L','V','I',' ')},	/* Latgalian -> Latvian */
@@ -990,7 +993,7 @@
 /*{"nga",	HB_TAG('N','G','A',' ')},*/	/* Ngbaka */
   {"ngl",	HB_TAG('L','M','W',' ')},	/* Lomwe */
   {"ngm",	HB_TAG('C','P','P',' ')},	/* Ngatik Men's Creole -> Creoles */
-  {"ngo",	HB_TAG('S','X','T',' ')},	/* Ngoni -> Sutu */
+  {"ngo",	HB_TAG('S','X','T',' ')},	/* Ngoni (retired code) -> Sutu */
   {"ngr",	HB_TAG_NONE	       },	/* Engdewu != Nagari */
   {"ngu",	HB_TAG('N','A','H',' ')},	/* Guerrero Nahuatl -> Nahuatl */
   {"nhc",	HB_TAG('N','A','H',' ')},	/* Tabasco Nahuatl -> Nahuatl */
@@ -1520,6 +1523,8 @@
   {"xmm",	HB_TAG('C','P','P',' ')},	/* Manado Malay -> Creoles */
   {"xmv",	HB_TAG('M','L','G',' ')},	/* Antankarana Malagasy -> Malagasy */
   {"xmw",	HB_TAG('M','L','G',' ')},	/* Tsimihety Malagasy -> Malagasy */
+  {"xnj",	HB_TAG('S','X','T',' ')},	/* Ngoni (Tanzania) -> Sutu */
+  {"xnq",	HB_TAG('S','X','T',' ')},	/* Ngoni (Mozambique) -> Sutu */
   {"xnr",	HB_TAG('D','G','R',' ')},	/* Kangri -> Dogri (macrolanguage) */
 /*{"xog",	HB_TAG('X','O','G',' ')},*/	/* Soga */
   {"xpe",	HB_TAG('X','P','E',' ')},	/* Liberia Kpelle -> Kpelle (Liberia) */
@@ -2808,6 +2813,8 @@
     return hb_language_from_string ("hnd", -1);  /* Southern Hindko */
   case HB_TAG('H','Y','E',' '):  /* Armenian */
     return hb_language_from_string ("hyw", -1);  /* Western Armenian */
+  case HB_TAG('I','B','A',' '):  /* Iban */
+    return hb_language_from_string ("iba", -1);  /* Iban */
   case HB_TAG('I','J','O',' '):  /* Ijo */
     return hb_language_from_string ("ijo", -1);  /* Ijo [family] */
   case HB_TAG('I','N','U',' '):  /* Inuktitut */
@@ -2892,6 +2899,8 @@
     return hb_language_from_string ("sq", -1);  /* Albanian [macrolanguage] */
   case HB_TAG('S','R','B',' '):  /* Serbian */
     return hb_language_from_string ("sr", -1);  /* Serbian */
+  case HB_TAG('S','X','T',' '):  /* Sutu */
+    return hb_language_from_string ("xnj", -1);  /* Ngoni (Tanzania) */
   case HB_TAG('S','Y','R',' '):  /* Syriac */
     return hb_language_from_string ("syr", -1);  /* Syriac [macrolanguage] */
   case HB_TAG('S','Y','R','E'):  /* Syriac, Estrangela script-variant (equivalent to ISO 15924 'Syre') */

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-tag.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-tag.cc	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-tag.cc	2021-04-17 22:31:16 UTC (rev 58898)
@@ -164,6 +164,15 @@
   *count = i;
 }
 
+/**
+ * hb_ot_tag_to_script:
+ * @tag: a script tag
+ *
+ * Converts a script tag to an #hb_script_t.
+ *
+ * Return value: The #hb_script_t corresponding to @tag.
+ *
+ **/
 hb_script_t
 hb_ot_tag_to_script (hb_tag_t tag)
 {
@@ -351,13 +360,13 @@
  * hb_ot_tags_from_script_and_language:
  * @script: an #hb_script_t to convert.
  * @language: an #hb_language_t to convert.
- * @script_count: (allow-none): maximum number of script tags to retrieve (IN)
+ * @script_count: (inout) (optional): maximum number of script tags to retrieve (IN)
  * and actual number of script tags retrieved (OUT)
- * @script_tags: (out) (allow-none): array of size at least @script_count to store the
+ * @script_tags: (out) (optional): array of size at least @script_count to store the
  * script tag results
- * @language_count: (allow-none): maximum number of language tags to retrieve
+ * @language_count: (inout) (optional): maximum number of language tags to retrieve
  * (IN) and actual number of language tags retrieved (OUT)
- * @language_tags: (out) (allow-none): array of size at least @language_count to store
+ * @language_tags: (out) (optional): array of size at least @language_count to store
  * the language tag results
  *
  * Converts an #hb_script_t and an #hb_language_t to script and language tags.
@@ -424,11 +433,13 @@
 
 /**
  * hb_ot_tag_to_language:
+ * @tag: an language tag
  *
+ * Converts a language tag to an #hb_language_t.
  *
+ * Return value: (transfer none) (nullable):
+ * The #hb_language_t corresponding to @tag.
  *
- * Return value: (transfer none):
- *
  * Since: 0.9.2
  **/
 hb_language_t
@@ -478,9 +489,9 @@
  * hb_ot_tags_to_script_and_language:
  * @script_tag: a script tag
  * @language_tag: a language tag
- * @script: (allow-none): the #hb_script_t corresponding to @script_tag (OUT).
- * @language: (allow-none): the #hb_language_t corresponding to @script_tag and
- * @language_tag (OUT).
+ * @script: (out) (optional): the #hb_script_t corresponding to @script_tag.
+ * @language: (out) (optional): the #hb_language_t corresponding to @script_tag and
+ * @language_tag.
  *
  * Converts a script tag and a language tag to an #hb_script_t and an
  * #hb_language_t.

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-var-gvar-table.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-var-gvar-table.hh	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-var-gvar-table.hh	2021-04-17 22:31:16 UTC (rev 58898)
@@ -652,8 +652,8 @@
 	/* apply specified / inferred deltas to points */
 	for (unsigned int i = 0; i < points.length; i++)
 	{
-	  points[i].x += roundf (deltas[i].x);
-	  points[i].y += roundf (deltas[i].y);
+	  points[i].x += deltas[i].x;
+	  points[i].y += deltas[i].y;
 	}
       } while (iterator.move_to_next ());
 

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-var.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-var.cc	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-var.cc	2021-04-17 22:31:16 UTC (rev 58898)
@@ -56,7 +56,7 @@
  *
  * Tests whether a face includes any OpenType variation data in the `fvar` table.
  *
- * Return value: true if data found, false otherwise
+ * Return value: %true if data found, %false otherwise
  *
  * Since: 1.4.2
  **/
@@ -87,7 +87,7 @@
  * hb_ot_var_get_axes:
  * @face: #hb_face_t to work upon
  * @start_offset: offset of the first lookup to retrieve
- * @axes_count: (inout) (allow-none): Input = the maximum number of variation axes to return;
+ * @axes_count: (inout) (optional): Input = the maximum number of variation axes to return;
  *                Output = the actual number of variation axes returned (may be zero)
  * @axes_array: (out caller-allocates) (array length=axes_count): The array of variation axes found
  *
@@ -133,7 +133,7 @@
  * hb_ot_var_get_axis_infos:
  * @face: #hb_face_t to work upon
  * @start_offset: offset of the first lookup to retrieve
- * @axes_count: (inout) (allow-none): Input = the maximum number of variation axes to return;
+ * @axes_count: (inout) (optional): Input = the maximum number of variation axes to return;
  *                Output = the actual number of variation axes returned (may be zero)
  * @axes_array: (out caller-allocates) (array length=axes_count): The array of variation axes found
  *
@@ -162,7 +162,7 @@
  * Fetches the variation-axis information corresponding to the specified axis tag
  * in the specified face.
  *
- * Return value: true if data found, false otherwise
+ * Return value: %true if data found, %false otherwise
  *
  * Since: 2.2.0
  **/
@@ -237,7 +237,7 @@
  * hb_ot_var_named_instance_get_design_coords:
  * @face: The #hb_face_t to work on
  * @instance_index: The index of the named instance to query
- * @coords_length: (inout) (allow-none): Input = the maximum number of coordinates to return;
+ * @coords_length: (inout) (optional): Input = the maximum number of coordinates to return;
  *                 Output = the actual number of coordinates returned (may be zero)
  * @coords: (out) (array length=coords_length): The array of coordinates found for the query
  *

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-var.h
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-var.h	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-var.h	2021-04-17 22:31:16 UTC (rev 58898)
@@ -24,7 +24,7 @@
  * Red Hat Author(s): Behdad Esfahbod
  */
 
-#ifndef HB_OT_H_IN
+#if !defined(HB_OT_H_IN) && !defined(HB_NO_SINGLE_HEADER_ERROR)
 #error "Include <hb-ot.h> instead."
 #endif
 
@@ -36,34 +36,38 @@
 HB_BEGIN_DECLS
 
 /**
- * hb_tag_t:
- * @HB_OT_TAG_VAR_AXIS_ITALIC: Registered tag for the roman/italic axis
+ * HB_OT_TAG_VAR_AXIS_ITALIC:
+ *
+ * Registered tag for the roman/italic axis.
  */
 #define HB_OT_TAG_VAR_AXIS_ITALIC	HB_TAG('i','t','a','l')
 
 /**
- * hb_tag_t:
- * @HB_OT_TAG_VAR_AXIS_OPTICAL_SIZE: Registered tag for the optical-size axis
+ * HB_OT_TAG_VAR_AXIS_OPTICAL_SIZE:
  *
+ * Registered tag for the optical-size axis.
  * <note>Note: The optical-size axis supersedes the OpenType `size` feature.</note>
  */
 #define HB_OT_TAG_VAR_AXIS_OPTICAL_SIZE	HB_TAG('o','p','s','z')
 
 /**
- * hb_tag_t:
- * @HB_OT_TAG_VAR_AXIS_SLANT: Registered tag for the slant axis
+ * HB_OT_TAG_VAR_AXIS_SLANT:
+ *
+ * Registered tag for the slant axis
  */
 #define HB_OT_TAG_VAR_AXIS_SLANT	HB_TAG('s','l','n','t')
 
 /**
- * hb_tag_t:
- * @HB_OT_TAG_VAR_AXIS_WIDTH: Registered tag for the width axis
+ * HB_OT_TAG_VAR_AXIS_WIDTH:
+ *
+ * Registered tag for the width axis.
  */
 #define HB_OT_TAG_VAR_AXIS_WIDTH	HB_TAG('w','d','t','h')
 
 /**
- * hb_tag_t:
- * @HB_OT_TAG_VAR_AXIS_WEIGHT: Registered tag for the weight axis
+ * HB_OT_TAG_VAR_AXIS_WEIGHT:
+ *
+ * Registered tag for the weight axis.
  */
 #define HB_OT_TAG_VAR_AXIS_WEIGHT	HB_TAG('w','g','h','t')
 
@@ -88,11 +92,14 @@
  * hb_ot_var_axis_flags_t:
  * @HB_OT_VAR_AXIS_FLAG_HIDDEN: The axis should not be exposed directly in user interfaces.
  *
+ * Flags for #hb_ot_var_axis_info_t.
+ *
  * Since: 2.2.0
  */
 typedef enum { /*< flags >*/
   HB_OT_VAR_AXIS_FLAG_HIDDEN	= 0x00000001u,
 
+  /*< private >*/
   _HB_OT_VAR_AXIS_FLAG_MAX_VALUE= HB_TAG_MAX_SIGNED /*< skip >*/
 } hb_ot_var_axis_flags_t;
 

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-sanitize.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-sanitize.hh	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-sanitize.hh	2021-04-17 22:31:16 UTC (rev 58898)
@@ -73,7 +73,7 @@
  * === The sanitize() contract ===
  *
  * The sanitize() method of each object type shall return true if it's safe to
- * call other methods of the object, and false otherwise.
+ * call other methods of the object, and %false otherwise.
  *
  * Note that what sanitize() checks for might align with what the specification
  * describes as valid table data, but does not have to be.  In particular, we
@@ -113,8 +113,8 @@
 #ifndef HB_SANITIZE_MAX_OPS_MAX
 #define HB_SANITIZE_MAX_OPS_MAX 0x3FFFFFFF
 #endif
-#ifndef HB_SANITIZE_MAX_SUTABLES
-#define HB_SANITIZE_MAX_SUTABLES 0x4000
+#ifndef HB_SANITIZE_MAX_SUBTABLES
+#define HB_SANITIZE_MAX_SUBTABLES 0x4000
 #endif
 
 struct hb_sanitize_context_t :
@@ -139,7 +139,7 @@
   bool visit_subtables (unsigned count)
   {
     max_subtables += count;
-    return max_subtables < HB_SANITIZE_MAX_SUTABLES;
+    return max_subtables < HB_SANITIZE_MAX_SUBTABLES;
   }
 
   private:

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-serialize.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-serialize.hh	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-serialize.hh	2021-04-17 22:31:16 UTC (rev 58898)
@@ -256,10 +256,11 @@
 
     packed.push (obj);
 
-    if (unlikely (packed.in_error ())) {
-      // obj wasn't successfully added to packed, so clean it up otherwise it's
-      // links will be leaked.
-      propagate_error (packed);
+    if (unlikely (!propagate_error (packed)))
+    {
+      /* Obj wasn't successfully added to packed, so clean it up otherwise its
+       * links will be leaked. When we use constructor/destructors properly, we
+       * can remove these. */
       obj->fini ();
       return 0;
     }
@@ -523,7 +524,7 @@
   template <typename T>
   void assign_offset (const object_t* parent, const object_t::link_t &link, unsigned offset)
   {
-    auto &off = * ((BEInt<T, sizeof (T)> *) (parent->head + link.position));
+    auto &off = * ((BEInt<T> *) (parent->head + link.position));
     assert (0 == off);
     check_assign (off, offset);
   }

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-set.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-set.cc	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-set.cc	2021-04-17 22:31:16 UTC (rev 58898)
@@ -117,7 +117,7 @@
  * @set: A set
  * @key: The user-data key to set
  * @data: A pointer to the user data to set
- * @destroy: (optional): A callback to call when @data is not needed anymore
+ * @destroy: (nullable): A callback to call when @data is not needed anymore
  * @replace: Whether to replace an existing data with the same key
  *
  * Attaches a user-data key/data pair to the specified set.
@@ -162,7 +162,7 @@
  *
  * Tests whether memory allocation for a set was successful.
  *
- * Return value: %true if allocation succeeded, false otherwise
+ * Return value: %true if allocation succeeded, %false otherwise
  *
  * Since: 0.9.2
  **/
@@ -183,6 +183,9 @@
 void
 hb_set_clear (hb_set_t *set)
 {
+  if (unlikely (hb_object_is_immutable (set)))
+    return;
+
   set->clear ();
 }
 
@@ -209,7 +212,7 @@
  *
  * Tests whether @codepoint belongs to @set.
  *
- * Return value: %true if @codepoint is in @set, false otherwise
+ * Return value: %true if @codepoint is in @set, %false otherwise
  *
  * Since: 0.9.2
  **/
@@ -298,7 +301,7 @@
  * Tests whether @set and @other are equal (contain the same
  * elements).
  *
- * Return value: %TRUE if the two sets are equal, %FALSE otherwise.
+ * Return value: %true if the two sets are equal, %false otherwise.
  *
  * Since: 0.9.7
  **/
@@ -316,7 +319,7 @@
  *
  * Tests whether @set is a subset of @larger_set.
  *
- * Return value: %TRUE if the @set is a subset of (or equal to) @larger_set, %FALSE otherwise.
+ * Return value: %true if the @set is a subset of (or equal to) @larger_set, %false otherwise.
  *
  * Since: 1.8.1
  **/
@@ -447,7 +450,7 @@
  *
  * Finds the smallest element in the set.
  *
- * Return value: minimum of @set, or %HB_SET_VALUE_INVALID if @set is empty.
+ * Return value: minimum of @set, or #HB_SET_VALUE_INVALID if @set is empty.
  *
  * Since: 0.9.7
  **/
@@ -463,7 +466,7 @@
  *
  * Finds the largest element in the set.
  *
- * Return value: maximum of @set, or %HB_SET_VALUE_INVALID if @set is empty.
+ * Return value: maximum of @set, or #HB_SET_VALUE_INVALID if @set is empty.
  *
  * Since: 0.9.7
  **/
@@ -481,9 +484,9 @@
  *
  * Fetches the next element in @set that is greater than current value of @codepoint.
  *
- * Set @codepoint to %HB_SET_VALUE_INVALID to get started.
+ * Set @codepoint to #HB_SET_VALUE_INVALID to get started.
  *
- * Return value: %true if there was a next value, false otherwise
+ * Return value: %true if there was a next value, %false otherwise
  *
  * Since: 0.9.2
  **/
@@ -502,9 +505,9 @@
  *
  * Fetches the previous element in @set that is lower than current value of @codepoint.
  *
- * Set @codepoint to %HB_SET_VALUE_INVALID to get started.
+ * Set @codepoint to #HB_SET_VALUE_INVALID to get started.
  *
- * Return value: %true if there was a previous value, false otherwise
+ * Return value: %true if there was a previous value, %false otherwise
  *
  * Since: 1.8.0
  **/
@@ -525,9 +528,9 @@
  * Fetches the next consecutive range of elements in @set that
  * are greater than current value of @last.
  *
- * Set @last to %HB_SET_VALUE_INVALID to get started.
+ * Set @last to #HB_SET_VALUE_INVALID to get started.
  *
- * Return value: %true if there was a next range, false otherwise
+ * Return value: %true if there was a next range, %false otherwise
  *
  * Since: 0.9.7
  **/
@@ -549,9 +552,9 @@
  * Fetches the previous consecutive range of elements in @set that
  * are greater than current value of @last.
  *
- * Set @first to %HB_SET_VALUE_INVALID to get started.
+ * Set @first to #HB_SET_VALUE_INVALID to get started.
  *
- * Return value: %true if there was a previous range, false otherwise
+ * Return value: %true if there was a previous range, %false otherwise
  *
  * Since: 1.8.0
  **/

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-set.h
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-set.h	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-set.h	2021-04-17 22:31:16 UTC (rev 58898)
@@ -24,7 +24,7 @@
  * Google Author(s): Behdad Esfahbod
  */
 
-#ifndef HB_H_IN
+#if !defined(HB_H_IN) && !defined(HB_NO_SINGLE_HEADER_ERROR)
 #error "Include <hb.h> instead."
 #endif
 
@@ -36,7 +36,11 @@
 HB_BEGIN_DECLS
 
 
-/*
+/**
+ * HB_SET_VALUE_INVALID:
+ *
+ * Unset #hb_set_t value.
+ *
  * Since: 0.9.21
  */
 #define HB_SET_VALUE_INVALID ((hb_codepoint_t) -1)

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-set.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-set.hh	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-set.hh	2021-04-17 22:31:16 UTC (rev 58898)
@@ -244,7 +244,7 @@
 
   bool resize (unsigned int count)
   {
-    if (unlikely (!successful)) return false;
+    if (unlikely (count > pages.length && !successful)) return false;
     if (!pages.resize (count) || !page_map.resize (count))
     {
       pages.resize (page_map.length);
@@ -256,19 +256,14 @@
 
   void reset ()
   {
-    if (unlikely (hb_object_is_immutable (this)))
-      return;
+    successful = true;
     clear ();
-    successful = true;
   }
 
   void clear ()
   {
-    if (unlikely (hb_object_is_immutable (this)))
-      return;
-    population = 0;
-    page_map.resize (0);
-    pages.resize (0);
+    if (resize (0))
+      population = 0;
   }
   bool is_empty () const
   {
@@ -278,6 +273,7 @@
 	return false;
     return true;
   }
+  explicit operator bool () const { return !is_empty (); }
 
   void dirty () { population = UINT_MAX; }
 
@@ -389,6 +385,11 @@
   {
     if (ds <= de)
     {
+      // Pre-allocate the workspace that compact() will need so we can bail on allocation failure
+      // before attempting to rewrite the page map.
+      hb_vector_t<unsigned> compact_workspace;
+      if (unlikely (!allocate_compact_workspace (compact_workspace))) return;
+
       unsigned int write_index = 0;
       for (unsigned int i = 0; i < page_map.length; i++)
       {
@@ -396,11 +397,12 @@
 	if (m < ds || de < m)
 	  page_map[write_index++] = page_map[i];
       }
-      compact (write_index);
+      compact (compact_workspace, write_index);
       resize (write_index);
     }
   }
 
+
   public:
   void del_range (hb_codepoint_t a, hb_codepoint_t b)
   {
@@ -512,20 +514,37 @@
     return true;
   }
 
-  void compact (unsigned int length)
+  bool allocate_compact_workspace(hb_vector_t<unsigned>& workspace)
   {
-    hb_vector_t<uint32_t> old_index_to_page_map_index;
-    old_index_to_page_map_index.resize(pages.length);
-    for (uint32_t i = 0; i < old_index_to_page_map_index.length; i++)
-      old_index_to_page_map_index[i] = 0xFFFFFFFF;
+    if (unlikely(!workspace.resize (pages.length)))
+    {
+      successful = false;
+      return false;
+    }
 
-    for (uint32_t i = 0; i < length; i++)
+    return true;
+  }
+
+
+  /*
+   * workspace should be a pre-sized vector allocated to hold at exactly pages.length
+   * elements.
+   */
+  void compact (hb_vector_t<unsigned>& workspace,
+                unsigned int length)
+  {
+    assert(workspace.length == pages.length);
+    hb_vector_t<unsigned>& old_index_to_page_map_index = workspace;
+
+    hb_fill (old_index_to_page_map_index.writer(), 0xFFFFFFFF);
+    /* TODO(iter) Rewrite as dagger? */
+    for (unsigned i = 0; i < length; i++)
       old_index_to_page_map_index[page_map[i].index] =  i;
 
     compact_pages (old_index_to_page_map_index);
   }
 
-  void compact_pages (const hb_vector_t<uint32_t>& old_index_to_page_map_index)
+  void compact_pages (const hb_vector_t<unsigned>& old_index_to_page_map_index)
   {
     unsigned int write_index = 0;
     for (unsigned int i = 0; i < pages.length; i++)
@@ -543,6 +562,9 @@
   template <typename Op>
   void process (const Op& op, const hb_set_t *other)
   {
+    const bool passthru_left = op (1, 0);
+    const bool passthru_right = op (0, 1);
+
     if (unlikely (!successful)) return;
 
     dirty ();
@@ -554,11 +576,17 @@
     unsigned int count = 0, newCount = 0;
     unsigned int a = 0, b = 0;
     unsigned int write_index = 0;
+
+    // Pre-allocate the workspace that compact() will need so we can bail on allocation failure
+    // before attempting to rewrite the page map.
+    hb_vector_t<unsigned> compact_workspace;
+    if (!passthru_left && unlikely (!allocate_compact_workspace (compact_workspace))) return;
+
     for (; a < na && b < nb; )
     {
       if (page_map[a].major == other->page_map[b].major)
       {
-	if (!Op::passthru_left)
+	if (!passthru_left)
 	{
 	  // Move page_map entries that we're keeping from the left side set
 	  // to the front of the page_map vector. This isn't necessary if
@@ -575,27 +603,27 @@
       }
       else if (page_map[a].major < other->page_map[b].major)
       {
-	if (Op::passthru_left)
+	if (passthru_left)
 	  count++;
 	a++;
       }
       else
       {
-	if (Op::passthru_right)
+	if (passthru_right)
 	  count++;
 	b++;
       }
     }
-    if (Op::passthru_left)
+    if (passthru_left)
       count += na - a;
-    if (Op::passthru_right)
+    if (passthru_right)
       count += nb - b;
 
-    if (!Op::passthru_left)
+    if (!passthru_left)
     {
       na  = write_index;
       next_page = write_index;
-      compact (write_index);
+      compact (compact_workspace, write_index);
     }
 
     if (!resize (count))
@@ -619,7 +647,7 @@
       else if (page_map[a - 1].major > other->page_map[b - 1].major)
       {
 	a--;
-	if (Op::passthru_left)
+	if (passthru_left)
 	{
 	  count--;
 	  page_map[count] = page_map[a];
@@ -628,7 +656,7 @@
       else
       {
 	b--;
-	if (Op::passthru_right)
+	if (passthru_right)
 	{
 	  count--;
 	  page_map[count].major = other->page_map[b].major;
@@ -637,7 +665,7 @@
 	}
       }
     }
-    if (Op::passthru_left)
+    if (passthru_left)
       while (a)
       {
 	a--;
@@ -644,7 +672,7 @@
 	count--;
 	page_map[count] = page_map [a];
       }
-    if (Op::passthru_right)
+    if (passthru_right)
       while (b)
       {
 	b--;
@@ -655,6 +683,9 @@
       }
     assert (!count);
     if (pages.length > newCount)
+      // This resize() doesn't need to be checked because we can't get here
+      // if the set is currently in_error() and this only resizes downwards
+      // which will always succeed if the set is not in_error().
       resize (newCount);
   }
 

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-shape-plan.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-shape-plan.cc	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-shape-plan.cc	2021-04-17 22:31:16 UTC (rev 58898)
@@ -329,12 +329,12 @@
  * @shape_plan: A shaping plan
  * @key: The user-data key to set
  * @data: A pointer to the user data
- * @destroy: (optional): A callback to call when @data is not needed anymore
+ * @destroy: (nullable): A callback to call when @data is not needed anymore
  * @replace: Whether to replace an existing data with the same key
  *
  * Attaches a user-data key/data pair to the given shaping plan. 
  *
- * Return value:
+ * Return value: %true if success, %false otherwise.
  *
  * Since: 0.9.7
  **/
@@ -439,7 +439,7 @@
  * Executes the given shaping plan on the specified buffer, using
  * the given @font and @features.
  *
- * Return value: 
+ * Return value: %true if success, %false otherwise.
  *
  * Since: 0.9.7
  **/

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-shape-plan.h
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-shape-plan.h	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-shape-plan.h	2021-04-17 22:31:16 UTC (rev 58898)
@@ -24,7 +24,7 @@
  * Google Author(s): Behdad Esfahbod
  */
 
-#ifndef HB_H_IN
+#if !defined(HB_H_IN) && !defined(HB_NO_SINGLE_HEADER_ERROR)
 #error "Include <hb.h> instead."
 #endif
 

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-shape.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-shape.cc	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-shape.cc	2021-04-17 22:31:16 UTC (rev 58898)
@@ -111,10 +111,10 @@
  * hb_shape_full:
  * @font: an #hb_font_t to use for shaping
  * @buffer: an #hb_buffer_t to shape
- * @features: (array length=num_features) (allow-none): an array of user
+ * @features: (array length=num_features) (nullable): an array of user
  *    specified #hb_feature_t or %NULL
  * @num_features: the length of @features array
- * @shaper_list: (array zero-terminated=1) (allow-none): a %NULL-terminated
+ * @shaper_list: (array zero-terminated=1) (nullable): a %NULL-terminated
  *    array of shapers to use or %NULL
  *
  * See hb_shape() for details. If @shaper_list is not %NULL, the specified
@@ -146,7 +146,7 @@
  * hb_shape:
  * @font: an #hb_font_t to use for shaping
  * @buffer: an #hb_buffer_t to shape
- * @features: (array length=num_features) (allow-none): an array of user
+ * @features: (array length=num_features) (nullable): an array of user
  *    specified #hb_feature_t or %NULL
  * @num_features: the length of @features array
  *

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-shape.h
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-shape.h	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-shape.h	2021-04-17 22:31:16 UTC (rev 58898)
@@ -26,7 +26,7 @@
  * Google Author(s): Behdad Esfahbod
  */
 
-#ifndef HB_H_IN
+#if !defined(HB_H_IN) && !defined(HB_NO_SINGLE_HEADER_ERROR)
 #error "Include <hb.h> instead."
 #endif
 

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-style.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-style.cc	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-style.cc	2021-04-17 22:31:16 UTC (rev 58898)
@@ -65,6 +65,7 @@
   HB_STYLE_TAG_WIDTH		= HB_TAG ('w','d','t','h'),
   HB_STYLE_TAG_WEIGHT		= HB_TAG ('w','g','h','t'),
 
+  /*< private >*/
   _HB_STYLE_TAG_MAX_VALUE	= HB_TAG_MAX_SIGNED /*< skip >*/
 } hb_style_tag_t;
 

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-style.h
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-style.h	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-style.h	2021-04-17 22:31:16 UTC (rev 58898)
@@ -22,7 +22,7 @@
  * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
  */
 
-#ifndef HB_H_IN
+#if !defined(HB_H_IN) && !defined(HB_NO_SINGLE_HEADER_ERROR)
 #error "Include <hb.h> instead."
 #endif
 

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-plan.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-plan.cc	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-plan.cc	2021-04-17 22:31:16 UTC (rev 58898)
@@ -88,10 +88,17 @@
 			 &lookup_indices);
   _remap_indexes (&lookup_indices, gsub_lookups);
 
-  //closure features
+  // Collect and prune features
   hb_set_t feature_indices;
-  gsub->closure_features (gsub_lookups, &feature_indices);
+  hb_ot_layout_collect_features (face,
+                                 HB_OT_TAG_GSUB,
+                                 nullptr,
+                                 nullptr,
+                                 nullptr,
+                                 &feature_indices);
+  gsub->prune_features (gsub_lookups, &feature_indices);
   _remap_indexes (&feature_indices, gsub_features);
+
   gsub.destroy ();
 }
 
@@ -114,9 +121,15 @@
 			 &lookup_indices);
   _remap_indexes (&lookup_indices, gpos_lookups);
 
-  //closure features
+  // Collect and prune features
   hb_set_t feature_indices;
-  gpos->closure_features (gpos_lookups, &feature_indices);
+  hb_ot_layout_collect_features (face,
+                                 HB_OT_TAG_GPOS,
+                                 nullptr,
+                                 nullptr,
+                                 nullptr,
+                                 &feature_indices);
+  gpos->prune_features (gpos_lookups, &feature_indices);
   _remap_indexes (&feature_indices, gpos_features);
   gpos.destroy ();
 }
@@ -243,7 +256,11 @@
 
 #ifndef HB_NO_VAR
   if (close_over_gdef)
-    _collect_layout_variation_indices (plan->source, plan->_glyphset, plan->gpos_lookups, plan->layout_variation_indices, plan->layout_variation_idx_map);
+    _collect_layout_variation_indices (plan->source,
+                                       plan->_glyphset_gsub,
+                                       plan->gpos_lookups,
+                                       plan->layout_variation_indices,
+                                       plan->layout_variation_idx_map);
 #endif
 
 #ifndef HB_NO_SUBSET_CFF

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-plan.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-plan.hh	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-plan.hh	2021-04-17 22:31:16 UTC (rev 58898)
@@ -172,12 +172,15 @@
   add_table (hb_tag_t tag,
 	     hb_blob_t *contents)
   {
-    hb_blob_t *source_blob = source->reference_table (tag);
-    DEBUG_MSG(SUBSET, nullptr, "add table %c%c%c%c, dest %d bytes, source %d bytes",
-	      HB_UNTAG(tag),
-	      hb_blob_get_length (contents),
-	      hb_blob_get_length (source_blob));
-    hb_blob_destroy (source_blob);
+    if (HB_DEBUG_SUBSET)
+    {
+      hb_blob_t *source_blob = source->reference_table (tag);
+      DEBUG_MSG(SUBSET, nullptr, "add table %c%c%c%c, dest %d bytes, source %d bytes",
+		HB_UNTAG(tag),
+		hb_blob_get_length (contents),
+		hb_blob_get_length (source_blob));
+      hb_blob_destroy (source_blob);
+    }
     return hb_face_builder_add_table (dest, tag, contents);
   }
 };

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-unicode.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-unicode.cc	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-unicode.cc	2021-04-17 22:31:16 UTC (rev 58898)
@@ -276,7 +276,7 @@
  * @ufuncs: The Unicode-functions structure
  * @key: The user-data key
  * @data: A pointer to the user data
- * @destroy: (optional): A callback to call when @data is not needed anymore
+ * @destroy: (nullable): A callback to call when @data is not needed anymore
  * @replace: Whether to replace an existing data with the same key
  *
  * Attaches a user-data key/data pair to the specified Unicode-functions structure. 
@@ -340,7 +340,7 @@
  * Tests whether the specified Unicode-functions structure
  * is immutable.
  *
- * Return value: %true if @ufuncs is immutable, false otherwise
+ * Return value: %true if @ufuncs is immutable, %false otherwise
  *
  * Since: 0.9.2
  **/
@@ -421,7 +421,7 @@
  * Calls the composition function of the specified
  * Unicode-functions structure @ufuncs.
  *
- * Return value: %true if @a and @b composed, false otherwise
+ * Return value: %true if @a and @b composed, %false otherwise
  *
  * Since: 0.9.2
  **/
@@ -446,7 +446,7 @@
  * Calls the decomposition function of the specified
  * Unicode-functions structure @ufuncs.
  *
- * Return value: %true if @ab was decomposed, false otherwise
+ * Return value: %true if @ab was decomposed, %false otherwise
  *
  * Since: 0.9.2
  **/
@@ -469,7 +469,7 @@
  * Fetches the compatibility decomposition of a Unicode
  * code point. Deprecated.
  *
- * Return value:
+ * Return value: length of @decomposed.
  *
  * Since: 0.9.2
  * Deprecated: 2.0.0

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-unicode.h
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-unicode.h	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-unicode.h	2021-04-17 22:31:16 UTC (rev 58898)
@@ -28,7 +28,7 @@
  * Google Author(s): Behdad Esfahbod
  */
 
-#ifndef HB_H_IN
+#if !defined(HB_H_IN) && !defined(HB_NO_SINGLE_HEADER_ERROR)
 #error "Include <hb.h> instead."
 #endif
 
@@ -41,8 +41,10 @@
 
 
 /**
- * HB_UNICODE_MAX
+ * HB_UNICODE_MAX:
  *
+ * Maximum valid Unicode code point.
+ *
  * Since: 1.9.0
  **/
 #define HB_UNICODE_MAX 0x10FFFFu
@@ -427,7 +429,7 @@
  * The method must return an #hb_bool_t indicating the success
  * of the composition.
  * 
- * Return value: True is @a, at b composed, false otherwise
+ * Return value: %true is @a, at b composed, %false otherwise
  *
  **/
 typedef hb_bool_t			(*hb_unicode_compose_func_t)		(hb_unicode_funcs_t *ufuncs,
@@ -451,7 +453,7 @@
  * output parameters (if successful). The method must return an
  * #hb_bool_t indicating the success of the composition.
  * 
- * Return value: True if @ab decomposed, false otherwise
+ * Return value: %true if @ab decomposed, %false otherwise
  *
  **/
 typedef hb_bool_t			(*hb_unicode_decompose_func_t)		(hb_unicode_funcs_t *ufuncs,
@@ -467,7 +469,7 @@
  * @ufuncs: A Unicode-functions structure
  * @func: (closure user_data) (destroy destroy) (scope notified): The callback function to assign
  * @user_data: Data to pass to @func
- * @destroy: (optional): The function to call when @user_data is not needed anymore
+ * @destroy: (nullable): The function to call when @user_data is not needed anymore
  *
  * Sets the implementation function for #hb_unicode_combining_class_func_t.
  *
@@ -483,7 +485,7 @@
  * @ufuncs: A Unicode-functions structure
  * @func: (closure user_data) (destroy destroy) (scope notified): The callback function to assign
  * @user_data: Data to pass to @func
- * @destroy: (optional): The function to call when @user_data is not needed anymore
+ * @destroy: (nullable): The function to call when @user_data is not needed anymore
  *
  * Sets the implementation function for #hb_unicode_general_category_func_t.
  *
@@ -499,7 +501,7 @@
  * @ufuncs: A Unicode-functions structure
  * @func: (closure user_data) (destroy destroy) (scope notified): The callback function to assign
  * @user_data: Data to pass to @func
- * @destroy: (optional): The function to call when @user_data is not needed anymore
+ * @destroy: (nullable): The function to call when @user_data is not needed anymore
  *
  * Sets the implementation function for #hb_unicode_mirroring_func_t.
  *
@@ -515,7 +517,7 @@
  * @ufuncs: A Unicode-functions structure
  * @func: (closure user_data) (destroy destroy) (scope notified): The callback function to assign
  * @user_data: Data to pass to @func
- * @destroy: (optional): The function to call when @user_data is not needed anymore
+ * @destroy: (nullable): The function to call when @user_data is not needed anymore
  *
  * Sets the implementation function for #hb_unicode_script_func_t.
  *
@@ -531,7 +533,7 @@
  * @ufuncs: A Unicode-functions structure
  * @func: (closure user_data) (destroy destroy) (scope notified): The callback function to assign
  * @user_data: Data to pass to @func
- * @destroy: (optional): The function to call when @user_data is not needed anymore
+ * @destroy: (nullable): The function to call when @user_data is not needed anymore
  *
  * Sets the implementation function for #hb_unicode_compose_func_t.
  *
@@ -547,7 +549,7 @@
  * @ufuncs: A Unicode-functions structure
  * @func: (closure user_data) (destroy destroy) (scope notified): The callback function to assign
  * @user_data: Data to pass to @func
- * @destroy: (optional): The function to call when @user_data is not needed anymore
+ * @destroy: (nullable): The function to call when @user_data is not needed anymore
  *
  * Sets the implementation function for #hb_unicode_decompose_func_t.
  *
@@ -624,20 +626,6 @@
 hb_unicode_script (hb_unicode_funcs_t *ufuncs,
 		   hb_codepoint_t unicode);
 
-/**
- * hb_unicode_compose:
- * @ufuncs: The Unicode-functions structure
- * @a: The first code point to compose
- * @b: The second code point to compose
- * @ab: (out): The composed code point
- *
- * Composes the code point sequence @a, at b by canonical equivalence into
- * code point @ab.
- *
- * Return value: True is @a, at b composed, false otherwise
- *
- * Since: 0.9.2
- **/
 HB_EXTERN hb_bool_t
 hb_unicode_compose (hb_unicode_funcs_t *ufuncs,
 		    hb_codepoint_t      a,
@@ -644,20 +632,6 @@
 		    hb_codepoint_t      b,
 		    hb_codepoint_t     *ab);
 
-/**
- * hb_unicode_decompose:
- * @ufuncs: The Unicode-functions structure
- * @ab: The code point to decompose
- * @a: (out): The first decomposed code point
- * @b: (out): The second decomposed code point
- *
- * Decomposes code point @ab by canonical equivalence, into code points
- * @a and @b.
- *
- * Return value: True if @ab decomposed, false otherwise
- *
- * Since: 0.9.2
- **/
 HB_EXTERN hb_bool_t
 hb_unicode_decompose (hb_unicode_funcs_t *ufuncs,
 		      hb_codepoint_t      ab,

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-vector.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-vector.hh	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-vector.hh	2021-04-17 22:31:16 UTC (rev 58898)
@@ -80,7 +80,12 @@
     fini ();
   }
 
-  void reset () { resize (0); }
+  void reset ()
+  {
+    if (unlikely (in_error ()))
+      allocated = length; // Big hack!
+    resize (0);
+  }
 
   hb_vector_t& operator = (const hb_vector_t &o)
   {
@@ -181,7 +186,7 @@
   /* Allocate for size but don't adjust length. */
   bool alloc (unsigned int size)
   {
-    if (unlikely (allocated < 0))
+    if (unlikely (in_error ()))
       return false;
 
     if (likely (size <= (unsigned) allocated))
@@ -195,7 +200,7 @@
 
     Type *new_array = nullptr;
     bool overflows =
-      (int) new_allocated < 0 ||
+      (int) in_error () ||
       (new_allocated < (unsigned) allocated) ||
       hb_unsigned_mul_overflows (new_allocated, sizeof (Type));
     if (likely (!overflows))

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-version.h.in
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-version.h.in	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-version.h.in	2021-04-17 22:31:16 UTC (rev 58898)
@@ -24,7 +24,7 @@
  * Google Author(s): Behdad Esfahbod
  */
 
-#ifndef HB_H_IN
+#if !defined(HB_H_IN) && !defined(HB_NO_SINGLE_HEADER_ERROR)
 #error "Include <hb.h> instead."
 #endif
 
@@ -36,12 +36,41 @@
 HB_BEGIN_DECLS
 
 
+/**
+ * HB_VERSION_MAJOR:
+ *
+ * The major component of the library version available at compile-time.
+ */
 #define HB_VERSION_MAJOR @HB_VERSION_MAJOR@
+/**
+ * HB_VERSION_MINOR:
+ *
+ * The minor component of the library version available at compile-time.
+ */
 #define HB_VERSION_MINOR @HB_VERSION_MINOR@
+/**
+ * HB_VERSION_MICRO:
+ *
+ * The micro component of the library version available at compile-time.
+ */
 #define HB_VERSION_MICRO @HB_VERSION_MICRO@
 
+/**
+ * HB_VERSION_STRING:
+ *
+ * A string literal containing the library version available at compile-time.
+ */
 #define HB_VERSION_STRING "@HB_VERSION@"
 
+/**
+ * HB_VERSION_ATLEAST:
+ * @major: the major component of the version number
+ * @minor: the minor component of the version number
+ * @micro: the micro component of the version number
+ *
+ * Tests the library version at compile-time against a minimum value,
+ * as three integer components.
+ */
 #define HB_VERSION_ATLEAST(major,minor,micro) \
 	((major)*10000+(minor)*100+(micro) <= \
 	 HB_VERSION_MAJOR*10000+HB_VERSION_MINOR*100+HB_VERSION_MICRO)

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb.hh	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb.hh	2021-04-17 22:31:16 UTC (rev 58898)
@@ -62,7 +62,6 @@
 
 /* Error.  Should never happen. */
 #ifndef HB_NO_PRAGMA_GCC_DIAGNOSTIC_ERROR
-#pragma GCC diagnostic error   "-Wc++11-narrowing"
 #pragma GCC diagnostic error   "-Wcast-align"
 #pragma GCC diagnostic error   "-Wcast-function-type"
 #pragma GCC diagnostic error   "-Wdelete-non-virtual-dtor"
@@ -75,6 +74,7 @@
 #pragma GCC diagnostic error   "-Wmissing-braces"
 #pragma GCC diagnostic error   "-Wmissing-declarations"
 #pragma GCC diagnostic error   "-Wmissing-prototypes"
+#pragma GCC diagnostic error   "-Wnarrowing"
 #pragma GCC diagnostic error   "-Wnested-externs"
 #pragma GCC diagnostic error   "-Wold-style-definition"
 #pragma GCC diagnostic error   "-Wpointer-arith"
@@ -126,6 +126,7 @@
 #pragma GCC diagnostic ignored "-Wformat-zero-length"
 #pragma GCC diagnostic ignored "-Wmissing-field-initializers"
 #pragma GCC diagnostic ignored "-Wpacked" // Erratic impl in clang
+#pragma GCC diagnostic ignored "-Wrange-loop-analysis" // https://github.com/harfbuzz/harfbuzz/issues/2834
 #pragma GCC diagnostic ignored "-Wstrict-aliasing"
 #pragma GCC diagnostic ignored "-Wtype-limits"
 #pragma GCC diagnostic ignored "-Wc++11-compat" // only gcc raises it
@@ -175,15 +176,15 @@
 #include "hb-aat.h"
 #define HB_AAT_H_IN
 
-#include <limits.h>
-#include <math.h>
-#include <float.h>
-#include <stdlib.h>
-#include <stddef.h>
-#include <string.h>
-#include <assert.h>
-#include <stdio.h>
-#include <stdarg.h>
+#include <cassert>
+#include <cfloat>
+#include <climits>
+#include <cmath>
+#include <cstdarg>
+#include <cstddef>
+#include <cstdio>
+#include <cstdlib>
+#include <cstring>
 
 #if (defined(_MSC_VER) && _MSC_VER >= 1500) || defined(__MINGW32__)
 #ifdef __MINGW32_VERSION
@@ -244,12 +245,8 @@
 #endif
 
 #if defined(__GNUC__) && (__GNUC__ >= 3)
-#define HB_PURE_FUNC	__attribute__((pure))
-#define HB_CONST_FUNC	__attribute__((const))
 #define HB_PRINTF_FUNC(format_idx, arg_idx) __attribute__((__format__ (__printf__, format_idx, arg_idx)))
 #else
-#define HB_PURE_FUNC
-#define HB_CONST_FUNC
 #define HB_PRINTF_FUNC(format_idx, arg_idx)
 #endif
 #if defined(__GNUC__) && (__GNUC__ >= 4) || (__clang__)
@@ -394,7 +391,7 @@
 #endif
 
 #ifndef HB_NO_ERRNO
-#  include <errno.h>
+#  include <cerrno>
 #else
 static int HB_UNUSED _hb_errno = 0;
 #  undef errno
@@ -440,182 +437,13 @@
 #define HB_STMT_START do
 #define HB_STMT_END   while (0)
 
-/* Static-assert as expression. */
-template <unsigned int cond> class hb_assert_constant_t;
-template <> class hb_assert_constant_t<1> {};
-#define ASSERT_STATIC_EXPR_ZERO(_cond) (0 * (unsigned int) sizeof (hb_assert_constant_t<_cond>))
-
 /* Lets assert int types.  Saves trouble down the road. */
-static_assert ((sizeof (int8_t) == 1), "");
-static_assert ((sizeof (uint8_t) == 1), "");
-static_assert ((sizeof (int16_t) == 2), "");
-static_assert ((sizeof (uint16_t) == 2), "");
-static_assert ((sizeof (int32_t) == 4), "");
-static_assert ((sizeof (uint32_t) == 4), "");
-static_assert ((sizeof (int64_t) == 8), "");
-static_assert ((sizeof (uint64_t) == 8), "");
 static_assert ((sizeof (hb_codepoint_t) == 4), "");
 static_assert ((sizeof (hb_position_t) == 4), "");
 static_assert ((sizeof (hb_mask_t) == 4), "");
 static_assert ((sizeof (hb_var_int_t) == 4), "");
 
-#define HB_DELETE_COPY_ASSIGN(TypeName) \
-  TypeName(const TypeName&) = delete; \
-  void operator=(const TypeName&) = delete
-#define HB_DELETE_CREATE_COPY_ASSIGN(TypeName) \
-  TypeName() = delete; \
-  TypeName(const TypeName&) = delete; \
-  void operator=(const TypeName&) = delete
 
-
-/* Flags */
-
-/* Enable bitwise ops on enums marked as flags_t */
-/* To my surprise, looks like the function resolver is happy to silently cast
- * one enum to another...  So this doesn't provide the type-checking that I
- * originally had in mind... :(.
- *
- * For MSVC warnings, see: https://github.com/harfbuzz/harfbuzz/pull/163
- */
-#ifdef _MSC_VER
-# pragma warning(disable:4200)
-# pragma warning(disable:4800)
-#endif
-#define HB_MARK_AS_FLAG_T(T) \
-	extern "C++" { \
-	  static inline T operator | (T l, T r) { return T ((unsigned) l | (unsigned) r); } \
-	  static inline T operator & (T l, T r) { return T ((unsigned) l & (unsigned) r); } \
-	  static inline T operator ^ (T l, T r) { return T ((unsigned) l ^ (unsigned) r); } \
-	  static inline T operator ~ (T r) { return T (~(unsigned int) r); } \
-	  static inline T& operator |= (T &l, T r) { l = l | r; return l; } \
-	  static inline T& operator &= (T& l, T r) { l = l & r; return l; } \
-	  static inline T& operator ^= (T& l, T r) { l = l ^ r; return l; } \
-	} \
-	static_assert (true, "")
-
-/* Useful for set-operations on small enums.
- * For example, for testing "x ∈ {x1, x2, x3}" use:
- * (FLAG_UNSAFE(x) & (FLAG(x1) | FLAG(x2) | FLAG(x3)))
- */
-#define FLAG(x) (ASSERT_STATIC_EXPR_ZERO ((unsigned)(x) < 32) + (((uint32_t) 1U) << (unsigned)(x)))
-#define FLAG_UNSAFE(x) ((unsigned)(x) < 32 ? (((uint32_t) 1U) << (unsigned)(x)) : 0)
-#define FLAG_RANGE(x,y) (ASSERT_STATIC_EXPR_ZERO ((x) < (y)) + FLAG(y+1) - FLAG(x))
-#define FLAG64(x) (ASSERT_STATIC_EXPR_ZERO ((unsigned)(x) < 64) + (((uint64_t) 1ULL) << (unsigned)(x)))
-#define FLAG64_UNSAFE(x) ((unsigned)(x) < 64 ? (((uint64_t) 1ULL) << (unsigned)(x)) : 0)
-
-
-/* Size signifying variable-sized array */
-#ifndef HB_VAR_ARRAY
-#define HB_VAR_ARRAY 1
-#endif
-
-static inline float
-_hb_roundf (float x) { return floorf (x + .5f); }
-#define roundf(x) _hb_roundf(x)
-
-/* Endian swap, used in Windows related backends */
-static inline uint16_t hb_uint16_swap (const uint16_t v)
-{ return (v >> 8) | (v << 8); }
-static inline uint32_t hb_uint32_swap (const uint32_t v)
-{ return (hb_uint16_swap (v) << 16) | hb_uint16_swap (v >> 16); }
-
-/*
- * Big-endian integers.  Here because fundamental.
- */
-
-template <typename Type, int Bytes> struct BEInt;
-
-template <typename Type>
-struct BEInt<Type, 1>
-{
-  public:
-  BEInt<Type, 1>& operator = (Type V)
-  {
-    v = V;
-    return *this;
-  }
-  operator Type () const { return v; }
-  private: uint8_t v;
-};
-template <typename Type>
-struct BEInt<Type, 2>
-{
-  public:
-  BEInt<Type, 2>& operator = (Type V)
-  {
-    v[0] = (V >>  8) & 0xFF;
-    v[1] = (V      ) & 0xFF;
-    return *this;
-  }
-  operator Type () const
-  {
-#if ((defined(__GNUC__) && __GNUC__ >= 5) || defined(__clang__)) && \
-    defined(__BYTE_ORDER) && \
-    (__BYTE_ORDER == __LITTLE_ENDIAN || __BYTE_ORDER == __BIG_ENDIAN)
-    /* Spoon-feed the compiler a big-endian integer with alignment 1.
-     * https://github.com/harfbuzz/harfbuzz/pull/1398 */
-    struct __attribute__((packed)) packed_uint16_t { uint16_t v; };
-#if __BYTE_ORDER == __LITTLE_ENDIAN
-    return __builtin_bswap16 (((packed_uint16_t *) this)->v);
-#else /* __BYTE_ORDER == __BIG_ENDIAN */
-    return ((packed_uint16_t *) this)->v;
-#endif
-#endif
-    return (v[0] <<  8)
-	 + (v[1]      );
-  }
-  private: uint8_t v[2];
-};
-template <typename Type>
-struct BEInt<Type, 3>
-{
-  public:
-  BEInt<Type, 3>& operator = (Type V)
-  {
-    v[0] = (V >> 16) & 0xFF;
-    v[1] = (V >>  8) & 0xFF;
-    v[2] = (V      ) & 0xFF;
-    return *this;
-  }
-  operator Type () const
-  {
-    return (v[0] << 16)
-	 + (v[1] <<  8)
-	 + (v[2]      );
-  }
-  private: uint8_t v[3];
-};
-template <typename Type>
-struct BEInt<Type, 4>
-{
-  public:
-  BEInt<Type, 4>& operator = (Type V)
-  {
-    v[0] = (V >> 24) & 0xFF;
-    v[1] = (V >> 16) & 0xFF;
-    v[2] = (V >>  8) & 0xFF;
-    v[3] = (V      ) & 0xFF;
-    return *this;
-  }
-  operator Type () const
-  {
-    return (v[0] << 24)
-	 + (v[1] << 16)
-	 + (v[2] <<  8)
-	 + (v[3]      );
-  }
-  private: uint8_t v[4];
-};
-
-
-/*
- * For lack of a better place, put Zawgyi script hack here.
- * https://github.com/harfbuzz/harfbuzz/issues/1162
- */
-
-#define HB_SCRIPT_MYANMAR_ZAWGYI	((hb_script_t) HB_TAG ('Q','a','a','g'))
-
-
 /* Headers we include for everyone.  Keep topologically sorted by dependency.
  * They express dependency amongst themselves, but no other file should include
  * them directly.*/

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/meson.build
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/meson.build	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/meson.build	2021-04-17 22:31:16 UTC (rev 58898)
@@ -126,10 +126,11 @@
   'hb-ot-shape-complex-khmer.hh',
   'hb-ot-shape-complex-myanmar.cc',
   'hb-ot-shape-complex-myanmar.hh',
+  'hb-ot-shape-complex-syllabic.cc',
+  'hb-ot-shape-complex-syllabic.hh',
   'hb-ot-shape-complex-thai.cc',
-  'hb-ot-shape-complex-use-table.cc',
+  'hb-ot-shape-complex-use-table.hh',
   'hb-ot-shape-complex-use.cc',
-  'hb-ot-shape-complex-use.hh',
   'hb-ot-shape-complex-vowel-constraints.cc',
   'hb-ot-shape-complex-vowel-constraints.hh',
   'hb-ot-shape-complex.hh',
@@ -271,10 +272,8 @@
   'hb-subset-input.hh',
   'hb-subset-plan.cc',
   'hb-subset-plan.hh',
-  'hb-subset-plan.hh',
   'hb-subset.cc',
   'hb-subset.hh',
-  'hb-subset.hh',
 )
 
 hb_subset_headers = files('hb-subset.h')
@@ -475,21 +474,6 @@
     endforeach
   endif
 
-  check_programs = {
-    'dump-indic-data': ['dump-indic-data.cc', 'hb-ot-shape-complex-indic-table.cc'],
-    'dump-khmer-data': ['dump-khmer-data.cc', 'hb-ot-shape-complex-indic-table.cc'],
-    'dump-myanmar-data': ['dump-myanmar-data.cc', 'hb-ot-shape-complex-indic-table.cc'],
-    'dump-use-data': ['dump-use-data.cc', 'hb-ot-shape-complex-use-table.cc'],
-  }
-  foreach name, source : check_programs
-    executable(name, source,
-      include_directories: incconfig,
-      cpp_args: cpp_args,
-      dependencies: libharfbuzz_dep,
-      install: false,
-    )
-  endforeach
-
   compiled_tests = {
     'test-algs': ['test-algs.cc', 'hb-static.cc'],
     'test-array': ['test-array.cc'],
@@ -656,14 +640,8 @@
       header: 'hb-gobject.h',
       install: true,
       extra_args:  ['--cflags-begin',
-                    '-DHB_H',
-                    '-DHB_H_IN',
-                    '-DHB_OT_H',
-                    '-DHB_OT_H_IN',
-                    '-DHB_AAT_H',
-                    '-DHB_AAT_H_IN',
-                    '-DHB_GOBJECT_H',
-                    '-DHB_GOBJECT_H_IN',
+                    '-DHB_NO_SINGLE_HEADER_ERROR',
+                    '-DHAVE_GOBJECT',
                     '-DHB_EXTERN=',
                     '--cflags-end'])
   endif

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/test-buffer-serialize.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/test-buffer-serialize.cc	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/test-buffer-serialize.cc	2021-04-17 22:31:16 UTC (rev 58898)
@@ -32,8 +32,6 @@
 #include "hb-ft.h"
 #endif
 
-#include <stdio.h>
-
 #ifdef HB_NO_OPEN
 #define hb_blob_create_from_file(x)  hb_blob_get_empty ()
 #endif

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/test-gpos-size-params.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/test-gpos-size-params.cc	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/test-gpos-size-params.cc	2021-04-17 22:31:16 UTC (rev 58898)
@@ -29,8 +29,6 @@
 #include "hb.h"
 #include "hb-ot.h"
 
-#include <stdio.h>
-
 #ifdef HB_NO_OPEN
 #define hb_blob_create_from_file(x)  hb_blob_get_empty ()
 #endif

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/test-gsub-would-substitute.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/test-gsub-would-substitute.cc	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/test-gsub-would-substitute.cc	2021-04-17 22:31:16 UTC (rev 58898)
@@ -29,8 +29,6 @@
 #include "hb.h"
 #include "hb-ot.h"
 
-#include <stdio.h>
-
 #ifdef HAVE_FREETYPE
 #include "hb-ft.h"
 #endif

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/test-ot-glyphname.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/test-ot-glyphname.cc	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/test-ot-glyphname.cc	2021-04-17 22:31:16 UTC (rev 58898)
@@ -27,9 +27,6 @@
 #include "hb.hh"
 #include "hb-ot.h"
 
-#include <stdlib.h>
-#include <stdio.h>
-
 #ifdef HB_NO_OPEN
 #define hb_blob_create_from_file(x)  hb_blob_get_empty ()
 #endif

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/test-ot-meta.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/test-ot-meta.cc	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/test-ot-meta.cc	2021-04-17 22:31:16 UTC (rev 58898)
@@ -25,9 +25,6 @@
 #include "hb.hh"
 #include "hb-ot.h"
 
-#include <stdlib.h>
-#include <stdio.h>
-
 #ifdef HB_NO_OPEN
 #define hb_blob_create_from_file(x)  hb_blob_get_empty ()
 #endif

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/test-ot-name.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/test-ot-name.cc	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/test-ot-name.cc	2021-04-17 22:31:16 UTC (rev 58898)
@@ -27,9 +27,6 @@
 #include "hb.hh"
 #include "hb-ot.h"
 
-#include <stdlib.h>
-#include <stdio.h>
-
 #ifdef HB_NO_OPEN
 #define hb_blob_create_from_file(x)  hb_blob_get_empty ()
 #endif

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/test.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/test.cc	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/test.cc	2021-04-17 22:31:16 UTC (rev 58898)
@@ -26,10 +26,6 @@
 
 #include "hb.hh"
 
-#include "hb.h"
-
-#include <stdio.h>
-
 #ifdef HAVE_FREETYPE
 #include "hb-ft.h"
 #endif

Modified: trunk/Build/source/libs/harfbuzz/version.ac
===================================================================
--- trunk/Build/source/libs/harfbuzz/version.ac	2021-04-17 21:02:42 UTC (rev 58897)
+++ trunk/Build/source/libs/harfbuzz/version.ac	2021-04-17 22:31:16 UTC (rev 58898)
@@ -8,4 +8,4 @@
 dnl --------------------------------------------------------
 dnl
 dnl  m4-include this file to define the current harfbuzz version
-m4_define([harfbuzz_version], [2.7.4])
+m4_define([harfbuzz_version], [2.8.0])



More information about the tex-live-commits mailing list.