texlive[49031] Build/source/libs: harfbuzz 2.1.0

commits+kakuto at tug.org commits+kakuto at tug.org
Wed Oct 31 00:50:17 CET 2018


Revision: 49031
          http://tug.org/svn/texlive?view=revision&revision=49031
Author:   kakuto
Date:     2018-10-31 00:50:16 +0100 (Wed, 31 Oct 2018)
Log Message:
-----------
harfbuzz 2.1.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/ChangeLog
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/NEWS
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/RELEASING.md
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/configure.ac
    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-def.py
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-common.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-kerx-table.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-trak-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.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-ltag-table.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.hh
    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-debug.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-deprecated.h
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-dsalgs.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-face.cc
    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.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ft.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-glib.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-gobject-structs.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-graphite2.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-icu.cc
    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.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-null.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-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-cpal-table.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-color-sbix-table.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-color-svg-table.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-color.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-face.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-face.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-font.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-glyf-table.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-hmtx-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-map.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-map.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-math-table.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-math.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-maxp-table.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-name-table.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-name.h
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-os2-unicode-ranges.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-arabic-fallback.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.cc
    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-myanmar.cc
    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-fallback.cc
    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.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-tag.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-var.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot.h
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-set-digest.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-set.cc
    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.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-shape.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-input.hh
    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-subset.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-unicode.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-unicode.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-uniscribe.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-utf.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-vector.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb.h
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/test-size-params.cc
    trunk/Build/source/libs/harfbuzz/include/Makefile.am
    trunk/Build/source/libs/harfbuzz/include/Makefile.in
    trunk/Build/source/libs/harfbuzz/version.ac

Added Paths:
-----------
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/gen-vowel-constraints.py
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-map.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-map.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-color.h
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-name-language.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-name-language.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-name.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-vowel-constraints.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-vorg-table.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/test-name-table.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/test-ot-color.cc

Removed Paths:
-------------
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/dump-emoji.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-tag.h

Modified: trunk/Build/source/libs/README
===================================================================
--- trunk/Build/source/libs/README	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/README	2018-10-30 23:50:16 UTC (rev 49031)
@@ -25,7 +25,7 @@
   http://sourceforge.net/projects/silgraphite/files/graphite2/
   (requires C++11)
 
-harfbuzz 2.0.2 - checked 21oct18
+harfbuzz 2.1.0 - checked 31oct18
   http://www.freedesktop.org/software/harfbuzz/release/
 
 icu 61.1 - checked 29mar18

Modified: trunk/Build/source/libs/harfbuzz/ChangeLog
===================================================================
--- trunk/Build/source/libs/harfbuzz/ChangeLog	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/ChangeLog	2018-10-30 23:50:16 UTC (rev 49031)
@@ -1,3 +1,8 @@
+2018-10-31  Akira Kakuto  <kakuto at fuk.kindai.ac.jp>
+
+	Import harfbuzz-2.1.0.
+	* version.ac, Makefile.am, include/Makefile.am: Adjusted.
+
 2018-10-21  Akira Kakuto  <kakuto at fuk.kindai.ac.jp>
 
 	Import harfbuzz-2.0.2.

Modified: trunk/Build/source/libs/harfbuzz/Makefile.am
===================================================================
--- trunk/Build/source/libs/harfbuzz/Makefile.am	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/Makefile.am	2018-10-30 23:50:16 UTC (rev 49031)
@@ -66,6 +66,9 @@
 	@HARFBUZZ_TREE@/src/hb-ot-kern-table.hh \
 	@HARFBUZZ_TREE@/src/hb-ot-maxp-table.hh \
 	@HARFBUZZ_TREE@/src/hb-ot-name-table.hh \
+	@HARFBUZZ_TREE@/src/hb-ot-name-language.cc \
+	@HARFBUZZ_TREE@/src/hb-ot-name-language.hh \
+	@HARFBUZZ_TREE@/src/hb-ot-name.cc \
 	@HARFBUZZ_TREE@/src/hb-ot-os2-table.hh \
 	@HARFBUZZ_TREE@/src/hb-ot-os2-unicode-ranges.hh \
 	@HARFBUZZ_TREE@/src/hb-ot-post-macroman.hh \
@@ -109,6 +112,8 @@
 	@HARFBUZZ_TREE@/src/hb-aat-layout-trak-table.hh \
 	@HARFBUZZ_TREE@/src/hb-aat-layout.hh \
 	@HARFBUZZ_TREE@/src/hb-aat-ltag-table.hh \
+	@HARFBUZZ_TREE@/src/hb-aat-map.cc \
+	@HARFBUZZ_TREE@/src/hb-aat-map.hh \
 	@HARFBUZZ_TREE@/src/hb-ot-font.cc \
 	@HARFBUZZ_TREE@/src/hb-ot-layout.cc \
 	@HARFBUZZ_TREE@/src/hb-ot-layout-base-table.hh \
@@ -146,6 +151,8 @@
 	@HARFBUZZ_TREE@/src/hb-ot-shape-complex-myanmar.cc \
 	@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-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 \
@@ -159,6 +166,7 @@
 	@HARFBUZZ_TREE@/src/hb-ot-var-fvar-table.hh \
 	@HARFBUZZ_TREE@/src/hb-ot-var-hvar-table.hh \
 	@HARFBUZZ_TREE@/src/hb-ot-var-mvar-table.hh \
+	@HARFBUZZ_TREE@/src/hb-ot-vorg-table.hh \
 	@HARFBUZZ_TREE@/src/hb-ot-shape-complex-indic-machine.hh \
 	@HARFBUZZ_TREE@/src/hb-ot-shape-complex-khmer-machine.hh \
 	@HARFBUZZ_TREE@/src/hb-ot-shape-complex-myanmar-machine.hh \

Modified: trunk/Build/source/libs/harfbuzz/Makefile.in
===================================================================
--- trunk/Build/source/libs/harfbuzz/Makefile.in	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/Makefile.in	2018-10-30 23:50:16 UTC (rev 49031)
@@ -128,6 +128,8 @@
 	@HARFBUZZ_TREE@/src/hb-font.$(OBJEXT) \
 	@HARFBUZZ_TREE@/src/hb-map.$(OBJEXT) \
 	@HARFBUZZ_TREE@/src/hb-ot-face.$(OBJEXT) \
+	@HARFBUZZ_TREE@/src/hb-ot-name-language.$(OBJEXT) \
+	@HARFBUZZ_TREE@/src/hb-ot-name.$(OBJEXT) \
 	@HARFBUZZ_TREE@/src/hb-ot-tag.$(OBJEXT) \
 	@HARFBUZZ_TREE@/src/hb-set.$(OBJEXT) \
 	@HARFBUZZ_TREE@/src/hb-shape.$(OBJEXT) \
@@ -138,6 +140,7 @@
 	@HARFBUZZ_TREE@/src/hb-warning.$(OBJEXT) \
 	@HARFBUZZ_TREE@/src/hb-fallback-shape.$(OBJEXT) \
 	@HARFBUZZ_TREE@/src/hb-aat-layout.$(OBJEXT) \
+	@HARFBUZZ_TREE@/src/hb-aat-map.$(OBJEXT) \
 	@HARFBUZZ_TREE@/src/hb-ot-font.$(OBJEXT) \
 	@HARFBUZZ_TREE@/src/hb-ot-layout.$(OBJEXT) \
 	@HARFBUZZ_TREE@/src/hb-ot-color.$(OBJEXT) \
@@ -154,6 +157,7 @@
 	@HARFBUZZ_TREE@/src/hb-ot-shape-complex-myanmar.$(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) \
@@ -186,6 +190,7 @@
 am__depfiles_remade = ./$(DEPDIR)/hbtest-dummy.Po \
 	./$(DEPDIR)/hbtest-hbtest.Po \
 	@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-aat-layout.Po \
+	@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-aat-map.Po \
 	@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-blob.Po \
 	@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-buffer-serialize.Po \
 	@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-buffer.Po \
@@ -202,6 +207,8 @@
 	@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-layout.Po \
 	@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-map.Po \
 	@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-math.Po \
+	@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-name-language.Po \
+	@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-name.Po \
 	@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-shape-complex-arabic.Po \
 	@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-shape-complex-default.Po \
 	@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-shape-complex-hangul.Po \
@@ -213,6 +220,7 @@
 	@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 \
 	@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-shape-normalize.Po \
 	@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-shape.Po \
@@ -726,6 +734,9 @@
 	@HARFBUZZ_TREE@/src/hb-ot-kern-table.hh \
 	@HARFBUZZ_TREE@/src/hb-ot-maxp-table.hh \
 	@HARFBUZZ_TREE@/src/hb-ot-name-table.hh \
+	@HARFBUZZ_TREE@/src/hb-ot-name-language.cc \
+	@HARFBUZZ_TREE@/src/hb-ot-name-language.hh \
+	@HARFBUZZ_TREE@/src/hb-ot-name.cc \
 	@HARFBUZZ_TREE@/src/hb-ot-os2-table.hh \
 	@HARFBUZZ_TREE@/src/hb-ot-os2-unicode-ranges.hh \
 	@HARFBUZZ_TREE@/src/hb-ot-post-macroman.hh \
@@ -763,6 +774,8 @@
 	@HARFBUZZ_TREE@/src/hb-aat-layout-trak-table.hh \
 	@HARFBUZZ_TREE@/src/hb-aat-layout.hh \
 	@HARFBUZZ_TREE@/src/hb-aat-ltag-table.hh \
+	@HARFBUZZ_TREE@/src/hb-aat-map.cc \
+	@HARFBUZZ_TREE@/src/hb-aat-map.hh \
 	@HARFBUZZ_TREE@/src/hb-ot-font.cc \
 	@HARFBUZZ_TREE@/src/hb-ot-layout.cc \
 	@HARFBUZZ_TREE@/src/hb-ot-layout-base-table.hh \
@@ -800,6 +813,8 @@
 	@HARFBUZZ_TREE@/src/hb-ot-shape-complex-myanmar.cc \
 	@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-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 \
@@ -813,6 +828,7 @@
 	@HARFBUZZ_TREE@/src/hb-ot-var-fvar-table.hh \
 	@HARFBUZZ_TREE@/src/hb-ot-var-hvar-table.hh \
 	@HARFBUZZ_TREE@/src/hb-ot-var-mvar-table.hh \
+	@HARFBUZZ_TREE@/src/hb-ot-vorg-table.hh \
 	@HARFBUZZ_TREE@/src/hb-ot-shape-complex-indic-machine.hh \
 	@HARFBUZZ_TREE@/src/hb-ot-shape-complex-khmer-machine.hh \
 	@HARFBUZZ_TREE@/src/hb-ot-shape-complex-myanmar-machine.hh \
@@ -928,6 +944,12 @@
 @HARFBUZZ_TREE@/src/hb-ot-face.$(OBJEXT):  \
 	@HARFBUZZ_TREE@/src/$(am__dirstamp) \
 	@HARFBUZZ_TREE@/src/$(DEPDIR)/$(am__dirstamp)
+ at HARFBUZZ_TREE@/src/hb-ot-name-language.$(OBJEXT):  \
+	@HARFBUZZ_TREE@/src/$(am__dirstamp) \
+	@HARFBUZZ_TREE@/src/$(DEPDIR)/$(am__dirstamp)
+ at HARFBUZZ_TREE@/src/hb-ot-name.$(OBJEXT):  \
+	@HARFBUZZ_TREE@/src/$(am__dirstamp) \
+	@HARFBUZZ_TREE@/src/$(DEPDIR)/$(am__dirstamp)
 @HARFBUZZ_TREE@/src/hb-ot-tag.$(OBJEXT):  \
 	@HARFBUZZ_TREE@/src/$(am__dirstamp) \
 	@HARFBUZZ_TREE@/src/$(DEPDIR)/$(am__dirstamp)
@@ -958,6 +980,9 @@
 @HARFBUZZ_TREE@/src/hb-aat-layout.$(OBJEXT):  \
 	@HARFBUZZ_TREE@/src/$(am__dirstamp) \
 	@HARFBUZZ_TREE@/src/$(DEPDIR)/$(am__dirstamp)
+ at HARFBUZZ_TREE@/src/hb-aat-map.$(OBJEXT):  \
+	@HARFBUZZ_TREE@/src/$(am__dirstamp) \
+	@HARFBUZZ_TREE@/src/$(DEPDIR)/$(am__dirstamp)
 @HARFBUZZ_TREE@/src/hb-ot-font.$(OBJEXT):  \
 	@HARFBUZZ_TREE@/src/$(am__dirstamp) \
 	@HARFBUZZ_TREE@/src/$(DEPDIR)/$(am__dirstamp)
@@ -1006,6 +1031,9 @@
 @HARFBUZZ_TREE@/src/hb-ot-shape-complex-use.$(OBJEXT):  \
 	@HARFBUZZ_TREE@/src/$(am__dirstamp) \
 	@HARFBUZZ_TREE@/src/$(DEPDIR)/$(am__dirstamp)
+ at HARFBUZZ_TREE@/src/hb-ot-shape-complex-vowel-constraints.$(OBJEXT):  \
+	@HARFBUZZ_TREE@/src/$(am__dirstamp) \
+	@HARFBUZZ_TREE@/src/$(DEPDIR)/$(am__dirstamp)
 @HARFBUZZ_TREE@/src/hb-ot-shape-complex-use-table.$(OBJEXT):  \
 	@HARFBUZZ_TREE@/src/$(am__dirstamp) \
 	@HARFBUZZ_TREE@/src/$(DEPDIR)/$(am__dirstamp)
@@ -1044,6 +1072,7 @@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/hbtest-dummy.Po at am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/hbtest-hbtest.Po at am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-aat-layout.Po at am__quote@ # am--include-marker
+ at AMDEP_TRUE@@am__include@ @am__quote@@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-aat-map.Po at am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-blob.Po at am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-buffer-serialize.Po at am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-buffer.Po at am__quote@ # am--include-marker
@@ -1060,6 +1089,8 @@
 @AMDEP_TRUE@@am__include@ @am__quote@@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-layout.Po at am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-map.Po at am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-math.Po at am__quote@ # am--include-marker
+ at AMDEP_TRUE@@am__include@ @am__quote@@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-name-language.Po at am__quote@ # am--include-marker
+ at AMDEP_TRUE@@am__include@ @am__quote@@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-name.Po at am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-shape-complex-arabic.Po at am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-shape-complex-default.Po at am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-shape-complex-hangul.Po at am__quote@ # am--include-marker
@@ -1071,6 +1102,7 @@
 @AMDEP_TRUE@@am__include@ @am__quote@@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-shape-complex-thai.Po at am__quote@ # am--include-marker
 @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
+ at 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
 @AMDEP_TRUE@@am__include@ @am__quote@@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-shape-normalize.Po at am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-shape.Po at am__quote@ # am--include-marker
@@ -1677,6 +1709,7 @@
 		-rm -f ./$(DEPDIR)/hbtest-dummy.Po
 	-rm -f ./$(DEPDIR)/hbtest-hbtest.Po
 	-rm -f @HARFBUZZ_TREE@/src/$(DEPDIR)/hb-aat-layout.Po
+	-rm -f @HARFBUZZ_TREE@/src/$(DEPDIR)/hb-aat-map.Po
 	-rm -f @HARFBUZZ_TREE@/src/$(DEPDIR)/hb-blob.Po
 	-rm -f @HARFBUZZ_TREE@/src/$(DEPDIR)/hb-buffer-serialize.Po
 	-rm -f @HARFBUZZ_TREE@/src/$(DEPDIR)/hb-buffer.Po
@@ -1693,6 +1726,8 @@
 	-rm -f @HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-layout.Po
 	-rm -f @HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-map.Po
 	-rm -f @HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-math.Po
+	-rm -f @HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-name-language.Po
+	-rm -f @HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-name.Po
 	-rm -f @HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-shape-complex-arabic.Po
 	-rm -f @HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-shape-complex-default.Po
 	-rm -f @HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-shape-complex-hangul.Po
@@ -1704,6 +1739,7 @@
 	-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
 	-rm -f @HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-shape-normalize.Po
 	-rm -f @HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-shape.Po
@@ -1766,6 +1802,7 @@
 		-rm -f ./$(DEPDIR)/hbtest-dummy.Po
 	-rm -f ./$(DEPDIR)/hbtest-hbtest.Po
 	-rm -f @HARFBUZZ_TREE@/src/$(DEPDIR)/hb-aat-layout.Po
+	-rm -f @HARFBUZZ_TREE@/src/$(DEPDIR)/hb-aat-map.Po
 	-rm -f @HARFBUZZ_TREE@/src/$(DEPDIR)/hb-blob.Po
 	-rm -f @HARFBUZZ_TREE@/src/$(DEPDIR)/hb-buffer-serialize.Po
 	-rm -f @HARFBUZZ_TREE@/src/$(DEPDIR)/hb-buffer.Po
@@ -1782,6 +1819,8 @@
 	-rm -f @HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-layout.Po
 	-rm -f @HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-map.Po
 	-rm -f @HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-math.Po
+	-rm -f @HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-name-language.Po
+	-rm -f @HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-name.Po
 	-rm -f @HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-shape-complex-arabic.Po
 	-rm -f @HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-shape-complex-default.Po
 	-rm -f @HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-shape-complex-hangul.Po
@@ -1793,6 +1832,7 @@
 	-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
 	-rm -f @HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-shape-normalize.Po
 	-rm -f @HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-shape.Po

Modified: trunk/Build/source/libs/harfbuzz/TLpatches/ChangeLog
===================================================================
--- trunk/Build/source/libs/harfbuzz/TLpatches/ChangeLog	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/TLpatches/ChangeLog	2018-10-30 23:50:16 UTC (rev 49031)
@@ -1,3 +1,8 @@
+2018-10-31  Akira Kakuto  <kakuto at fuk.kindai.ac.jp>
+
+	Imported harfbuzz-2.1.0 source tree from:
+	  http://www.freedesktop.org/software/harfbuzz/release/
+
 2018-10-21  Akira Kakuto  <kakuto at fuk.kindai.ac.jp>
 
 	Imported harfbuzz-2.0.2 source tree from:

Modified: trunk/Build/source/libs/harfbuzz/TLpatches/TL-Changes
===================================================================
--- trunk/Build/source/libs/harfbuzz/TLpatches/TL-Changes	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/TLpatches/TL-Changes	2018-10-30 23:50:16 UTC (rev 49031)
@@ -1,4 +1,4 @@
-Changes applied to the harfbuzz-2.0.2/ tree as obtained from:
+Changes applied to the harfbuzz-2.1.0/ tree as obtained from:
 	http://www.freedesktop.org/software/harfbuzz/release/
 
 Removed:

Modified: trunk/Build/source/libs/harfbuzz/configure
===================================================================
--- trunk/Build/source/libs/harfbuzz/configure	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/configure	2018-10-30 23:50:16 UTC (rev 49031)
@@ -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.0.2.
+# Generated by GNU Autoconf 2.69 for harfbuzz (TeX Live) 2.1.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.0.2'
-PACKAGE_STRING='harfbuzz (TeX Live) 2.0.2'
+PACKAGE_VERSION='2.1.0'
+PACKAGE_STRING='harfbuzz (TeX Live) 2.1.0'
 PACKAGE_BUGREPORT='tex-k at tug.org'
 PACKAGE_URL=''
 
@@ -1317,7 +1317,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.0.2 to adapt to many kinds of systems.
+\`configure' configures harfbuzz (TeX Live) 2.1.0 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1388,7 +1388,7 @@
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of harfbuzz (TeX Live) 2.0.2:";;
+     short | recursive ) echo "Configuration of harfbuzz (TeX Live) 2.1.0:";;
    esac
   cat <<\_ACEOF
 
@@ -1495,7 +1495,7 @@
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-harfbuzz (TeX Live) configure 2.0.2
+harfbuzz (TeX Live) configure 2.1.0
 generated by GNU Autoconf 2.69
 
 Copyright (C) 2012 Free Software Foundation, Inc.
@@ -2131,7 +2131,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.0.2, which was
+It was created by harfbuzz (TeX Live) $as_me 2.1.0, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   $ $0 $@
@@ -4054,7 +4054,7 @@
 
 # Define the identity of the package.
  PACKAGE='harfbuzz--tex-live-'
- VERSION='2.0.2'
+ VERSION='2.1.0'
 
 
 # Some tools Automake needs.
@@ -4247,9 +4247,9 @@
 
 
 HB_VERSION_MAJOR=2
-HB_VERSION_MINOR=0
-HB_VERSION_MICRO=2
-HB_VERSION=2.0.2
+HB_VERSION_MINOR=1
+HB_VERSION_MICRO=0
+HB_VERSION=2.1.0
 
 ac_ext=c
 ac_cpp='$CPP $CPPFLAGS'
@@ -8143,7 +8143,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.0.2, which was
+This file was extended by harfbuzz (TeX Live) $as_me 2.1.0, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -8209,7 +8209,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.0.2
+harfbuzz (TeX Live) config.status 2.1.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	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/CMakeLists.txt	2018-10-30 23:50:16 UTC (rev 49031)
@@ -52,6 +52,9 @@
   set (HB_HAVE_FREETYPE ON)
 endif ()
 
+option(HB_BUILD_SUBSET "Build harfbuzz-subset" ON)
+option(HB_BUILD_TESTS "Build harfbuzz tests" ON)
+
 option(HB_HAVE_GOBJECT "Enable GObject Bindings" OFF)
 if (HB_HAVE_GOBJECT)
   set (HB_HAVE_GLIB ON)
@@ -82,16 +85,6 @@
   endif ()
 endif ()
 
-set (HB_DISABLE_SUBSET OFF)
-set (HB_DISABLE_TESTS OFF)
-option(HB_IOS "Apply iOS specific build flags" OFF)
-if (HB_IOS)
-  # We should fix their issue and enable them
-  set (HB_DISABLE_SUBSET ON)
-  set (HB_DISABLE_TESTS ON)
-  set (HB_HAVE_CORETEXT OFF)
-endif ()
-
 include_directories(AFTER
   ${PROJECT_SOURCE_DIR}/src
   ${PROJECT_BINARY_DIR}/src
@@ -556,7 +549,7 @@
 target_link_libraries(harfbuzz ${THIRD_PARTY_LIBS})
 
 ## Define harfbuzz-subset library
-if (NOT HB_DISABLE_SUBSET)
+if (HB_BUILD_SUBSET)
   add_library(harfbuzz-subset ${subset_project_sources} ${subset_project_headers})
   add_dependencies(harfbuzz-subset harfbuzz)
   target_link_libraries(harfbuzz-subset harfbuzz ${THIRD_PARTY_LIBS})
@@ -580,7 +573,7 @@
     set (CMAKE_CXX_IMPLICIT_LINK_LIBRARIES "m") # libm
     set (CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES "")
     set_target_properties(harfbuzz PROPERTIES LINKER_LANGUAGE C)
-    if (NOT HB_DISABLE_SUBSET)
+    if (HB_BUILD_SUBSET)
       set_target_properties(harfbuzz-subset PROPERTIES LINKER_LANGUAGE C)
     endif ()
 
@@ -861,7 +854,7 @@
 endif ()
 
 
-if (NOT HB_DISABLE_TESTS)
+if (HB_BUILD_TESTS)
   ## src/ executables
   foreach (prog main test test-would-substitute test-size-params test-buffer-serialize hb-ot-tag test-unicode-ranges)
     set (prog_name ${prog})

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/ChangeLog
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/ChangeLog	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/ChangeLog	2018-10-30 23:50:16 UTC (rev 49031)
@@ -1,3 +1,3520 @@
+commit bfd549daaa078e7edba5a65971b1d3e872664f2d
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Oct 30 14:47:27 2018 -0700
+
+    Fix everything-bot
+
+ src/hb-ot-layout.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 0e1ad5a075c6858ca60bad0e2da58b5256e15815
+Author: Garret Rieger <grieger at google.com>
+Date:   Tue Oct 30 11:29:58 2018 -0700
+
+    [subset] Limit the number of scripts and langsys' that should be
+    checked when collecting features.
+
+ src/hb-ot-layout-common.hh |  8 ++++++++
+ src/hb-ot-layout.cc        | 11 ++++++++++-
+ 2 files changed, 18 insertions(+), 1 deletion(-)
+
+commit a7aba99baab2d6e6105675ceedbe22222fa0f166
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Oct 30 14:04:09 2018 -0700
+
+    [name] Rename hb_name_id_t to hb_ot_name_id_t
+
+    https://github.com/harfbuzz/harfbuzz/pull/1254
+
+ docs/harfbuzz-sections.txt    |  3 +-
+ src/hb-ot-color-cpal-table.hh | 12 +++---
+ src/hb-ot-color.cc            |  6 +--
+ src/hb-ot-color.h             |  4 +-
+ src/hb-ot-layout.cc           | 44 +++++++++----------
+ src/hb-ot-layout.h            | 28 ++++++-------
+ src/hb-ot-name-table.hh       |  6 +--
+ src/hb-ot-name.cc             | 38 ++++++++---------
+ src/hb-ot-name.h              | 98
+ +++++++++++++++++++++----------------------
+ test/api/test-ot-color.c      | 30 ++++++-------
+ test/api/test-ot-name.c       |  8 ++--
+ 11 files changed, 139 insertions(+), 138 deletions(-)
+
+commit 881e1054bc66fd07489d661dd5c3f84a5d077edc
+Author: Simon Tooke <stooke at redhat.com>
+Date:   Tue Oct 30 14:16:23 2018 -0400
+
+    fix various GCC function pointer warnings
+
+ src/hb-debug.hh | 6 +++---
+ src/hb-set.hh   | 4 ++--
+ 2 files changed, 5 insertions(+), 5 deletions(-)
+
+commit dc9bd29feac6675c79343b88a06f03f356f9175b
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Oct 30 13:16:07 2018 -0700
+
+    [CBDT] Implement Format18 get_extens
+
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1327
+
+ src/hb-ot-color-cbdt-table.hh | 10 +++++++++-
+ 1 file changed, 9 insertions(+), 1 deletion(-)
+
+commit a2a7422aaf47dd43c2c55ad48dd15513f9d5b081
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Oct 30 13:14:56 2018 -0700
+
+    [CBDT] Bound checks in reference_png
+
+ src/hb-ot-color-cbdt-table.hh | 57
+ ++++++++++++++++++++++++++-----------------
+ 1 file changed, 34 insertions(+), 23 deletions(-)
+
+commit f236f790884d7b5c7afb73768724c360d4ea5212
+Author: Nathan Willis <nwillis at glyphography.com>
+Date:   Tue Oct 30 11:24:56 2018 -0500
+
+    Docs Makefile: sync SGML list to harfbuzz-docs.xml include
+    list. Hopefully fixes distcheck failure.
+
+ docs/Makefile.am | 11 ++++++-----
+ 1 file changed, 6 insertions(+), 5 deletions(-)
+
+commit 9f4b375e396fe65b30c792b9524a732da0b477d1
+Author: Nathan Willis <nwillis at glyphography.com>
+Date:   Mon Oct 29 17:10:53 2018 -0500
+
+    Usermanual: minor wording updates, build fixes.
+
+ ...rmanual-buffers-language-script-and-direction.xml |  8 +++++++-
+ docs/usermanual-clusters.xml                         |  6 ++++++
+ docs/usermanual-fonts-and-faces.xml                  |  8 +++++++-
+ docs/usermanual-getting-started.xml                  |  6 ++++++
+ docs/usermanual-glyph-information.xml                |  8 +++++++-
+ docs/usermanual-install-harfbuzz.xml                 | 20
+ +++++++++++++++++---
+ docs/usermanual-opentype-features.xml                |  8 +++++++-
+ docs/usermanual-shaping-concepts.xml                 |  6 ++++++
+ docs/usermanual-what-is-harfbuzz.xml                 | 12 +++++++-----
+ 9 files changed, 70 insertions(+), 12 deletions(-)
+
+commit e110032b914db9f417cc152b2beb51cda0a91dd7
+Author: Nathan Willis <nwillis at glyphography.com>
+Date:   Mon Oct 29 16:42:59 2018 -0500
+
+    Usermanual: update DTD in chapter XML to avoid HTML entity parsing
+    errors.
+
+ docs/usermanual-what-is-harfbuzz.xml | 10 ++++++++--
+ 1 file changed, 8 insertions(+), 2 deletions(-)
+
+commit 01400f7425f7aec852f39ebee17aa502a74025fb
+Author: Nathan Willis <nwillis at glyphography.com>
+Date:   Sat Oct 20 17:21:49 2018 +0100
+
+    Usermanual; minor wording changes.
+
+ docs/usermanual-getting-started.xml  | 14 +++++++-------
+ docs/usermanual-install-harfbuzz.xml | 10 +++++++++-
+ docs/usermanual-what-is-harfbuzz.xml | 31 ++++++++++---------------------
+ 3 files changed, 26 insertions(+), 29 deletions(-)
+
+commit e89f43dc0884cb4a73beff86e49b7bd8565a01f1
+Author: Khaled Hosny <khaledhosny at eglug.org>
+Date:   Sat Oct 20 16:12:45 2018 +0100
+
+    Minor; rewording unsafe-to-break note.
+
+    Co-Authored-By: n8willis <nwillis at glyphography.com>
+
+ docs/usermanual-getting-started.xml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit ccdfb634382596a6114380c72f2f344b1af23f94
+Author: Khaled Hosny <khaledhosny at eglug.org>
+Date:   Sat Oct 20 15:46:04 2018 +0100
+
+    Trivial; typo.
+
+    Co-Authored-By: n8willis <nwillis at glyphography.com>
+
+ docs/usermanual-what-is-harfbuzz.xml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 722099487be72346e7109872b6abf30696f3b7c3
+Author: Khaled Hosny <khaledhosny at eglug.org>
+Date:   Sat Oct 20 15:45:24 2018 +0100
+
+    Minor; simplify example code
+
+    Co-Authored-By: n8willis <nwillis at glyphography.com>
+
+ docs/usermanual-getting-started.xml | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit 6e4dd58a4af003eeec93cbe90d1258d91a38b53c
+Author: Khaled Hosny <khaledhosny at eglug.org>
+Date:   Sat Oct 20 15:44:51 2018 +0100
+
+    Minor: simplify example code
+
+    Co-Authored-By: n8willis <nwillis at glyphography.com>
+
+ docs/usermanual-getting-started.xml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit f9ee0deceebd8952a8d80f3fd7b264b33e70f703
+Author: Khaled Hosny <khaledhosny at eglug.org>
+Date:   Sat Oct 20 15:41:00 2018 +0100
+
+    Minor; drop 'OpenType' from sentence
+
+    Co-Authored-By: n8willis <nwillis at glyphography.com>
+
+ docs/usermanual-what-is-harfbuzz.xml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit f028da59d902c39e61021b48fc73f2821a9f3be2
+Author: Nathan Willis <nwillis at glyphography.com>
+Date:   Sat Oct 20 15:18:29 2018 +0100
+
+    Minor.
+
+ docs/harfbuzz-docs.xml | 12 +++++++-----
+ 1 file changed, 7 insertions(+), 5 deletions(-)
+
+commit ed5547f828fe7559cc3331f05780ae9f041b1e0f
+Author: Khaled Hosny <khaledhosny at eglug.org>
+Date:   Sat Oct 20 15:00:52 2018 +0100
+
+    Use 'glyphs' instead of 'text'
+
+    Co-Authored-By: n8willis <nwillis at glyphography.com>
+
+ docs/harfbuzz-docs.xml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 236285545b5da8513f2b61fc8066ba78308a555a
+Author: Nathan Willis <nwillis at glyphography.com>
+Date:   Wed Oct 17 10:10:48 2018 -0500
+
+    Docs: minor, update Makefile w new file name.
+
+ docs/Makefile.am | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 163ab81ab0f4000d968cc55b418402497e605e6c
+Author: Nathan Willis <nwillis at glyphography.com>
+Date:   Tue Oct 16 17:48:15 2018 -0500
+
+    Docs: rename Hello HarfBuzz to Getting Started.
+
+ docs/harfbuzz-docs.xml                                                 |
+ 2 +-
+ docs/{usermanual-hello-harfbuzz.xml => usermanual-getting-started.xml}
+ | 0
+ 2 files changed, 1 insertion(+), 1 deletion(-)
+
+commit 9e7efa3f47557a77852a15d89619787fd9933ed1
+Author: Nathan Willis <nwillis at glyphography.com>
+Date:   Tue Oct 16 17:46:03 2018 -0500
+
+    Docs: usermanual, add API Overview to Hello HarfBuzz chapter. Start
+    Terminology section.
+
+ docs/usermanual-hello-harfbuzz.xml | 309
+ +++++++++++++++++++++++++------------
+ 1 file changed, 212 insertions(+), 97 deletions(-)
+
+commit 3a27e8fb97f716c17b03e3a4a634a4900bcb6045
+Author: Nathan Willis <nwillis at glyphography.com>
+Date:   Fri Oct 12 18:23:26 2018 -0500
+
+    Docs: usermanual, add Shaping Concepts chapter.
+
+ docs/harfbuzz-docs.xml               |   5 +-
+ docs/usermanual-shaping-concepts.xml | 368
+ +++++++++++++++++++++++++++++++++++
+ 2 files changed, 371 insertions(+), 2 deletions(-)
+
+commit 9aa865dcc68ec207741e07ba3f7aacf4ac750c1c
+Author: Nathan Willis <nwillis at glyphography.com>
+Date:   Fri Oct 12 18:22:41 2018 -0500
+
+    Docs: usermanual, minor cleanup to What Is HarfBuzz chapter.
+
+ docs/usermanual-what-is-harfbuzz.xml | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 443f87213272be5ae0579dce4749b2036dfe3815
+Author: Nathan Willis <nwillis at glyphography.com>
+Date:   Thu Oct 11 15:40:08 2018 -0500
+
+    Docs: move harfbuzz-ng-vs-old discussion down below the TOC; put
+    in note.
+
+ docs/harfbuzz-docs.xml | 63
+ ++++++++++++++++++++++++++++++++++----------------
+ 1 file changed, 43 insertions(+), 20 deletions(-)
+
+commit 792af5d254fddcdc4292dffb76b81d65754e65a9
+Author: Nathan Willis <nwillis at glyphography.com>
+Date:   Thu Oct 11 14:05:59 2018 -0500
+
+    Docs: flesh out config options in Usermanual:Install chapter.
+
+ docs/usermanual-install-harfbuzz.xml | 108
+ +++++++++++++++++++++++++++--------
+ 1 file changed, 85 insertions(+), 23 deletions(-)
+
+commit 325e2745cfa55f9ef114ee8eeaf7bd8176743822
+Author: Nathan Willis <nwillis at glyphography.com>
+Date:   Wed Oct 10 17:01:21 2018 -0500
+
+    Docs: add basic config-options section to Usermanual Installation
+    chapter.
+
+ docs/usermanual-install-harfbuzz.xml | 132
+ ++++++++++++++++++++++++++++++++++-
+ 1 file changed, 131 insertions(+), 1 deletion(-)
+
+commit 97c1c46cd2241d77b531a582dd1a2432af976357
+Author: Nathan Willis <nwillis at glyphography.com>
+Date:   Wed Oct 10 16:38:22 2018 -0500
+
+    Docs: update and linearize build instructions; add installation
+    overview material.
+
+ docs/usermanual-install-harfbuzz.xml | 229
+ ++++++++++++++++++++++++++++-------
+ 1 file changed, 188 insertions(+), 41 deletions(-)
+
+commit 088755f9e654d2ec638dce0c68d523084b9eaf5a
+Author: Nathan Willis <nwillis at glyphography.com>
+Date:   Wed Oct 10 16:37:29 2018 -0500
+
+    Docs: update usermanual What Is HarfBuzz material.
+
+ docs/usermanual-what-is-harfbuzz.xml | 220
+ +++++++++++++++++++++++++++--------
+ 1 file changed, 172 insertions(+), 48 deletions(-)
+
+commit 0956ab41851d30f50c39c28730cf30ea0bbc5466
+Author: Nathan Willis <nwillis at glyphography.com>
+Date:   Fri Sep 28 17:15:59 2018 -0500
+
+    Docs: Move What-HarfBuzz-doesnt-do to Usermanual-what-is-HarfBuzz.
+
+ docs/usermanual-hello-harfbuzz.xml   |  98
+ +++------------------------------
+ docs/usermanual-what-is-harfbuzz.xml | 101
+ +++++++++++++++++++++++++++++++++--
+ 2 files changed, 104 insertions(+), 95 deletions(-)
+
+commit fd270beedb331c4685e918f5a3ef5789a23ffaeb
+Author: Nathan Willis <nwillis at glyphography.com>
+Date:   Fri Sep 28 16:36:38 2018 -0500
+
+    Docs: Usermanual- What is HarfBuzz; add intro to shaping concepts.
+
+ docs/usermanual-what-is-harfbuzz.xml | 51
+ ++++++++++++++++++++++++++++++++++++
+ 1 file changed, 51 insertions(+)
+
+commit d9fd92721002726c4aeaae9cc3a519a41f694e48
+Author: Nathan Willis <nwillis at glyphography.com>
+Date:   Fri Sep 28 16:07:37 2018 -0500
+
+    Docs: update Usermanual-What Is HarfBuzz.
+
+ docs/usermanual-what-is-harfbuzz.xml | 199
+ +++++++++++++++++++++++------------
+ 1 file changed, 130 insertions(+), 69 deletions(-)
+
+commit 0af3d176a64c0a57c7acb2a64ce8b9d08f449241
+Author: Khaled Hosny <khaledhosny at eglug.org>
+Date:   Tue Oct 30 17:05:28 2018 +0200
+
+    [sbix] Fix memory leak in early return
+
+    Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=11210
+
+ src/hb-ot-color-sbix-table.hh                             |   3 +++
+ ...zz-testcase-minimized-hb-shape-fuzzer-5768601332613120 | Bin 0 ->
+ 108 bytes
+ 2 files changed, 3 insertions(+)
+
+commit edaa768253cfeb97d614537253f90d47aa93ff6f
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Oct 30 01:35:58 2018 -0700
+
+    [util] Use fgets instead of getline such that windows passes
+
+ util/hb-shape.cc | 6 ++----
+ 1 file changed, 2 insertions(+), 4 deletions(-)
+
+commit 56738429d667f6c35e5c7af30b51604fc133c23c
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Oct 30 01:33:22 2018 -0700
+
+    [test] Fix warnings
+
+ test/api/test-ot-tag.c | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 138f9e0f25752bbf7f8e867f230ca91442f40028
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Oct 30 01:31:13 2018 -0700
+
+    Minor
+
+ src/hb-machinery.hh | 13 +++++++------
+ 1 file changed, 7 insertions(+), 6 deletions(-)
+
+commit 83a612739accf6b0f2e1cb1be15097402f7ecf33
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Oct 30 01:24:23 2018 -0700
+
+    [util] Minor
+
+ util/options.cc | 6 ------
+ util/options.hh | 8 ++------
+ 2 files changed, 2 insertions(+), 12 deletions(-)
+
+commit 64e41d2c89c533f554e49ffbd18e6653a70ab999
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Oct 30 01:08:34 2018 -0700
+
+    [test] Fix Python3
+
+ test/shaping/run-tests.py | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit f7a08cd41df1ff3e44aa838306218ae0565b7273
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Tue Oct 30 11:29:09 2018 +0330
+
+    Fix extra semicolon issues and test that on CI (#1330)
+
+ .circleci/config.yml         |  2 +-
+ src/hb-machinery.hh          | 16 ++++++++--------
+ src/hb-ot-layout-common.hh   |  6 +++---
+ src/hb-ot-layout-gsubgpos.hh |  2 +-
+ src/hb.hh                    |  2 +-
+ util/options.hh              |  2 +-
+ 6 files changed, 15 insertions(+), 15 deletions(-)
+
+commit 422debb830fe150c26e1628f77531f41f0871325
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Oct 30 00:51:43 2018 -0700
+
+    [test/shaping] Spawn one hb-shape per test file
+
+    Speeds up runnings in-house tests from over 20s to 2s.
+
+ test/shaping/run-tests.py | 32 ++++++++++++--------------------
+ 1 file changed, 12 insertions(+), 20 deletions(-)
+
+commit 58e20f53bf61244e3eef09be8ebed60aaf52fb11
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Oct 30 00:50:18 2018 -0700
+
+    [util] Add hb-shape --batch
+
+ util/hb-shape.cc | 30 ++++++++++++++++++++++++++++++
+ 1 file changed, 30 insertions(+)
+
+commit 6131fb6283cff87333db14b9b32e92be6139c3d6
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Oct 30 00:38:01 2018 -0700
+
+    [util] Don't close stdin/stdout
+
+ util/options.cc | 6 ++++++
+ util/options.hh | 8 ++++++--
+ 2 files changed, 12 insertions(+), 2 deletions(-)
+
+commit 7e998d193a1429b42bb69582f9e5738aa6fd1a72
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Oct 29 23:31:42 2018 -0700
+
+    Fix spurious warning re uninitialized use
+
+ src/hb-ot-layout-common.hh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 1b7bfb5e1864fc355715b536faac6693b5ce0218
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Tue Oct 30 10:19:40 2018 +0330
+
+    [cmake] Make build of tests and subset optional (#1329)
+
+ .circleci/config.yml |  2 +-
+ CMakeLists.txt       | 19 ++++++-------------
+ 2 files changed, 7 insertions(+), 14 deletions(-)
+
+commit b186274362725b7501211c2a782c1a0badd57107
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Oct 29 23:21:14 2018 -0700
+
+    [set/map] Fix uninitialized memory
+
+    I keep forgetting that primitive types are NOT initialized during
+    construction. :|
+
+ src/hb-map.hh    | 4 ++--
+ src/hb-object.hh | 1 +
+ src/hb-set.hh    | 4 ++--
+ 3 files changed, 5 insertions(+), 4 deletions(-)
+
+commit ad3cededdd5ee6a364161e9d27e4cf4d95a80177
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Oct 29 22:53:16 2018 -0700
+
+    [fuzzing] Make test runners less verbose
+
+ test/fuzzing/run-shape-fuzzer-tests.py  | 3 ++-
+ test/fuzzing/run-subset-fuzzer-tests.py | 1 -
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit 4ef671f25f38895e3f87cd69687670c3d8ea4600
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Oct 29 22:46:19 2018 -0700
+
+    [unicode] Fix a long-standing double-declaration warning
+
+ src/hb-unicode.cc | 31 +++++++------------------------
+ 1 file changed, 7 insertions(+), 24 deletions(-)
+
+commit 166ae8b0aa3b1e7298a1bbb872647cb352a0f924
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Oct 29 22:40:37 2018 -0700
+
+    Remove now unused hb_auto_t<>
+
+ src/hb-dsalgs.hh | 20 --------------------
+ 1 file changed, 20 deletions(-)
+
+commit 56e0fd345c4e68753123a05cd80291e933d71061
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Oct 29 22:35:44 2018 -0700
+
+    Remove last use of hb_auto_t<>
+
+ src/hb-ot-cmap-table.hh | 8 ++++++--
+ 1 file changed, 6 insertions(+), 2 deletions(-)
+
+commit ca5e5a4979fa4aca873ba986e60b3010aaf0b1de
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Oct 29 22:30:21 2018 -0700
+
+    Port Coverage::Iter off hb_auto_t<>
+
+ src/hb-ot-layout-common.hh     |  4 +---
+ src/hb-ot-layout-gpos-table.hh |  2 +-
+ src/hb-ot-layout-gsub-table.hh | 26 +++++++++++++-------------
+ src/hb-ot-layout-gsubgpos.hh   |  8 ++++----
+ 4 files changed, 19 insertions(+), 21 deletions(-)
+
+commit 3a4e5dd425a2a37ff4c37db953943386c0b6e5d8
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Oct 29 18:05:25 2018 -0700
+
+    Remove a few unnecessary hb_auto_t<>'s
+
+    See a85641446c30247c4e948263f0f8c1147ed4efb9
+
+ src/hb-coretext.cc             |  8 ++++----
+ src/hb-ot-cmap-table.hh        |  6 ++----
+ src/hb-ot-layout-gsub-table.hh |  8 ++++----
+ src/hb-ot-layout-gsubgpos.hh   |  2 +-
+ src/hb-ot-layout.cc            | 10 +++++-----
+ src/hb-subset-plan.cc          |  2 +-
+ src/hb-subset.cc               |  2 +-
+ src/hb-uniscribe.cc            | 12 ++++++------
+ 8 files changed, 24 insertions(+), 26 deletions(-)
+
+commit 67a22f377dee0dbd89f301f0a1fec6f787867b5e
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Oct 29 17:37:41 2018 -0700
+
+    [set/map/vector] Make constructable, but not copy or assignable
+
+    Disable copy/assign on them, as they shouldn't.
+
+    Make constructor / destructor call init_shallow/fini_shallow,
+    and make those idempotent.  So, these three can be constructed
+    on stack now and no init/fini call is needed.  As such,
+    hb_auto_t<> is not needed anymore.  I'll remove that separately.
+
+ src/hb-map.hh    |  6 ++++++
+ src/hb-set.hh    |  5 +++++
+ src/hb-vector.hh | 37 ++++++++++++++++++++-----------------
+ src/hb.hh        | 12 ++++++++++++
+ 4 files changed, 43 insertions(+), 17 deletions(-)
+
+commit ea0e51d1b161245aaf5ad0f844bb5316b1cbcd5e
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Oct 29 16:00:23 2018 -0700
+
+    Add HB_NO_CREATE_COPY_ASSIGN
+
+ src/hb-open-type.hh | 10 +++++-----
+ src/hb.hh           | 15 +++++++++------
+ 2 files changed, 14 insertions(+), 11 deletions(-)
+
+commit 5b563640b2df5b100130c9901b666713b2e1767e
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Oct 29 15:58:44 2018 -0700
+
+    Remove HB_DISALLOW_COPY_AND_ASSIGN from hb_ot_shape_planner_t
+
+    It was arbitrary that this struct had it and not dozens of others.
+
+ src/hb-ot-shape.hh | 3 ---
+ 1 file changed, 3 deletions(-)
+
+commit 14b353c1852be64db244f84bf5e95b4b7f3e65b6
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Oct 29 15:29:13 2018 -0700
+
+    One more iteration
+
+ src/hb.hh | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit c7c5df9ffd4f7bcc84a9a02a565ccc1807cca529
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Oct 29 15:16:52 2018 -0700
+
+    Try fixing older bots
+
+    Older C++ doesn't allow struct-with-constructor in union.
+
+ src/hb.hh | 13 ++++++++++++-
+ 1 file changed, 12 insertions(+), 1 deletion(-)
+
+commit be87959a67b8ccf2b21d3cfdb7d16202f18df670
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Oct 29 15:16:38 2018 -0700
+
+    [cmap] Minor
+
+ src/hb-ot-cmap-table.hh | 16 ++--------------
+ 1 file changed, 2 insertions(+), 14 deletions(-)
+
+commit 35d410f2bad62e98f3634c5ee156d0aea9031067
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Oct 29 14:45:44 2018 -0700
+
+    Remove ASSERT_POD
+
+    Newer compilers / language allows structs with constructor in union.
+    So, this was not actually testing anything.  Indeed, the recent
+    change in DISALLOW_COPY *is* making some of our types non-POD.
+    That broke some bots.
+
+    Just remove this since it wasn't doing much, and I'd rather have
+    DISALLOW_COPY.
+
+ src/hb-blob.hh                             |  1 -
+ src/hb-buffer.hh                           |  1 -
+ src/hb-face.hh                             |  1 -
+ src/hb-font.hh                             |  2 --
+ src/hb-machinery.hh                        |  5 +----
+ src/hb-object.hh                           |  6 +-----
+ src/hb-ot-shape-complex-arabic-fallback.hh |  2 --
+ src/hb-ot-shape-complex-arabic.cc          |  2 --
+ src/hb-ot-shape-complex-hangul.cc          |  2 --
+ src/hb-ot-shape-complex-indic.cc           |  2 --
+ src/hb-ot-shape-complex-khmer.cc           |  2 --
+ src/hb-ot-shape-complex-use.cc             |  2 --
+ src/hb-set-digest.hh                       |  4 ----
+ src/hb-shape-plan.hh                       |  1 -
+ src/hb-subset-input.hh                     |  1 -
+ src/hb-subset-plan.hh                      |  1 -
+ src/hb-unicode.hh                          |  1 -
+ src/hb.hh                                  | 26
+ --------------------------
+ 18 files changed, 2 insertions(+), 60 deletions(-)
+
+commit 6f0454e176efdb8b99c8aa59b5ad765ca455b8d6
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Oct 29 13:51:15 2018 -0700
+
+    Fix extra-semicolon warnings
+
+ src/hb-machinery.hh | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit a256a92b3fbb72487cf073a63e646eab952b42ed
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Oct 29 11:25:35 2018 -0700
+
+    Make Array types uncopyable-unassignable
+
+    Finally!  Catches hard-to-find errors like this:
+
+    -    const SortedArrayOf<SVGDocumentIndexEntry> docs =
+    this+svgDocEntries;
+    +    const SortedArrayOf<SVGDocumentIndexEntry> &docs =
+    this+svgDocEntries;
+
+    We implement this for our array types.  This, in turn, trickles down
+    into all types that embed the arrays.  So, as long as we define all
+    open-ended structs in terms of Array types (all can be done using
+    UnsizedArrayOf), this achieves the goal of making uncopyable all
+    structs that are variable-sized.  Yay!
+
+ src/hb-open-type.hh | 11 +++++++++++
+ src/hb.hh           |  6 ++++++
+ 2 files changed, 17 insertions(+)
+
+commit 31cc1f74b7028ef88fa0e93e7f12166c7e06de8e
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Oct 29 11:14:37 2018 -0700
+
+    [svg] Minor
+
+ src/hb-ot-color-svg-table.hh | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit 1366bb9760d0f171f8f655e5739e74dfd2537652
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Oct 29 11:01:25 2018 -0700
+
+    Fix g-i warnings
+
+ src/hb-ot-color.h | 4 +++-
+ src/hb-ot-name.cc | 4 ++--
+ 2 files changed, 5 insertions(+), 3 deletions(-)
+
+commit ae802c2c6e001492f8f639e4c24546f0e21d86c7
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Mon Oct 29 13:42:14 2018 +0330
+
+    [test-ot-color] Minor
+
+ src/test-ot-color.cc | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 7170e35096f0afd084be1350d080695c70c65d40
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Mon Oct 29 13:11:01 2018 +0330
+
+    Rename deprecated symbols list file name and clean it up (#1328)
+
+ src/Makefile.am      | 6 +++---
+ src/gen-def.py       | 9 ++++-----
+ test/api/Makefile.am | 2 +-
+ 3 files changed, 8 insertions(+), 9 deletions(-)
+
+commit 1dfe964378e97e45eedf9db9b9a7f675fe38c0bf
+Merge: f10252b4 9c692e5b
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Mon Oct 29 12:34:33 2018 +0330
+
+    Merge pull request #1326 from ebraminio/test-ot-color
+
+    Revive and rename dump-emoji to test-ot-color but use public APIs
+    instead
+
+commit 9c692e5b8d195d8e82538594d89865c609d708f3
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Mon Oct 29 11:36:11 2018 +0330
+
+    [test-ot-color] Use public APIs on the tool
+
+ src/Makefile.am      |   9 +++
+ src/test-ot-color.cc | 184
+ +++++++++++++++++++++++++++++----------------------
+ 2 files changed, 113 insertions(+), 80 deletions(-)
+
+commit fb525f8943b43fe241424c93461bee2b94af28e3
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Mon Oct 29 09:43:17 2018 +0330
+
+    Rename dump-emoji to test-ot-color
+
+ src/{dump-emoji.cc => test-ot-color.cc} | 0
+ 1 file changed, 0 insertions(+), 0 deletions(-)
+
+commit 81bcf47e9ea7eb447ff95ce48ecbc5c4439cb53f
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Mon Oct 29 09:40:39 2018 +0330
+
+    Revive dump-emoji
+
+ src/dump-emoji.cc | 322
+ ++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 322 insertions(+)
+
+commit f10252b4b637b4aa0b74bb75963ae1e1a41b5b9f
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Mon Oct 29 10:29:58 2018 +0330
+
+    [svg] Fix incorrect array referencing
+
+ src/hb-ot-color-svg-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 5eb251aab041d89b06b0d3f65906ff6712608263
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sun Oct 28 23:16:13 2018 -0700
+
+    [cbdt] Implement strike selection logic
+
+ src/hb-ot-color-cbdt-table.hh | 25 ++++++++++++++++++++-----
+ 1 file changed, 20 insertions(+), 5 deletions(-)
+
+commit 98bddbc8ef3330bc5635f6255e6b9c16593a1934
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sun Oct 28 23:14:15 2018 -0700
+
+    [sbix] Minor
+
+ src/hb-ot-color-sbix-table.hh | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit 8cffee0577284839a24d9fb863206886d2373974
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sun Oct 28 23:07:59 2018 -0700
+
+    [cbdt] Simplify more
+
+ src/hb-ot-color-cbdt-table.hh | 22 +++++++---------------
+ 1 file changed, 7 insertions(+), 15 deletions(-)
+
+commit 574579d3766b7b42e62495cb9a98f3ffd91079e8
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sun Oct 28 23:04:37 2018 -0700
+
+    [color] Rename get_strike() to choose_strike()
+
+ src/hb-ot-color-cbdt-table.hh |  8 ++++----
+ src/hb-ot-color-sbix-table.hh | 10 +++++-----
+ 2 files changed, 9 insertions(+), 9 deletions(-)
+
+commit 0aa90271fdbb2b85389cd5af029b6d4468fb8146
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sun Oct 28 23:03:20 2018 -0700
+
+    [tests] Fix for recent rounding change in CBDT
+
+ test/shaping/data/in-house/tests/color-fonts.tests | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit e2ba96da4c39ba5fe941bf2704c1e7cc5f98034f
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sun Oct 28 23:01:57 2018 -0700
+
+    [cbdt] Refactor get_strike()
+
+ src/hb-ot-color-cbdt-table.hh | 39
+ ++++++++++++++++-----------------------
+ src/hb-ot-color.cc            |  2 +-
+ 2 files changed, 17 insertions(+), 24 deletions(-)
+
+commit 6983cca9c865752fe0a9a065f9b0278b686c3abc
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sun Oct 28 22:46:18 2018 -0700
+
+    [cbdt] Minor
+
+ src/hb-ot-color-cbdt-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit e998fb9fbfbd79b476d758238af60f6a4ddff20c
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sun Oct 28 22:45:53 2018 -0700
+
+    [color] Round extents when scaling
+
+ src/hb-ot-color-cbdt-table.hh | 12 +++++++-----
+ src/hb-ot-color-sbix-table.hh | 12 ++++++------
+ 2 files changed, 13 insertions(+), 11 deletions(-)
+
+commit c929ccfcea18c5c35d6d41ae921845eeffba978a
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Mon Oct 29 08:41:13 2018 +0330
+
+    [ot-color/png] Consider strike ppem on scaling
+
+ src/hb-ot-color-cbdt-table.hh |  5 +++--
+ src/hb-ot-color-sbix-table.hh | 23 +++++++++++++++++++----
+ src/hb-ot-color.cc            |  2 +-
+ src/hb-ot-font.cc             |  2 +-
+ test/api/test-ot-color.c      |  4 ++--
+ 5 files changed, 26 insertions(+), 10 deletions(-)
+
+commit a8c9facf7a73cca39e3fed1f637db4858e64414a
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sun Oct 28 18:32:37 2018 -0700
+
+    [svg] Cosmetic
+
+ src/hb-ot-color-svg-table.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 9c1460e5685448ad4eac8faff9f05e456f87ed28
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sun Oct 28 18:29:14 2018 -0700
+
+    [svg] Use SortedArrayOf.bsearch
+
+ src/hb-ot-color-svg-table.hh | 18 +++---------------
+ 1 file changed, 3 insertions(+), 15 deletions(-)
+
+commit 18dd6363a5021cfd770b431a6320386f94447674
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sun Oct 28 18:26:49 2018 -0700
+
+    [svg] Minor
+
+ src/hb-ot-color-svg-table.hh | 23 +++++++++++------------
+ 1 file changed, 11 insertions(+), 12 deletions(-)
+
+commit 4876c938a20af356988d566ba95472d3bcbb133d
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sun Oct 28 18:01:25 2018 -0700
+
+    [sbix] Comment
+
+ src/hb-ot-color-sbix-table.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 519fca101466283ca5c993dec2ec2c6891d8add5
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sun Oct 28 16:32:20 2018 -0700
+
+    [color] Minor
+
+ src/hb-ot-color.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit e8ff27c2082ffcf3bd213e7a77d823dc1809857e
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sun Oct 28 16:29:09 2018 -0700
+
+    Minor
+
+ src/hb-open-type.hh        | 6 ++++--
+ src/hb-ot-layout-common.hh | 4 ++--
+ 2 files changed, 6 insertions(+), 4 deletions(-)
+
+commit 65621723815138150e8a6354413ed14d53cf35b5
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sun Oct 28 16:27:18 2018 -0700
+
+    [sbix] Use LOffsetLArrayOf<>
+
+ src/hb-open-type.hh           | 2 ++
+ src/hb-ot-color-sbix-table.hh | 2 +-
+ 2 files changed, 3 insertions(+), 1 deletion(-)
+
+commit a3ddd8067f266e49d9451c53a0fd40aff8551af7
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sun Oct 28 16:26:03 2018 -0700
+
+    [sbix] Add get_strike
+
+ src/hb-ot-color-sbix-table.hh | 8 +++++---
+ 1 file changed, 5 insertions(+), 3 deletions(-)
+
+commit 95524ed9bccdcd0d6a46c5dcc372e96a0c34b5f0
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sun Oct 28 15:58:48 2018 -0700
+
+    [sbix] Remove sbix_len
+
+ src/hb-ot-color-sbix-table.hh | 29 +++++++++++++++++++++--------
+ 1 file changed, 21 insertions(+), 8 deletions(-)
+
+commit 69e9846452f829f82f6866a683845167b3d3d6e5
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sun Oct 28 15:53:11 2018 -0700
+
+    [sbix] Fix get_glyph_blob() on Null object
+
+ src/hb-ot-color-sbix-table.hh | 7 +++----
+ 1 file changed, 3 insertions(+), 4 deletions(-)
+
+commit 4e0ee2af091634198c4b9b17036d9391a4e6b084
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sun Oct 28 15:44:40 2018 -0700
+
+    [sbix] Simplify ppem access
+
+    If struct members are simple and needed publicly, we make them public.
+
+ src/hb-ot-color-sbix-table.hh | 10 ++++------
+ 1 file changed, 4 insertions(+), 6 deletions(-)
+
+commit 6ac9a4eaa3a47c9b9f2c7aa123255e82ccc53551
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sun Oct 28 15:43:54 2018 -0700
+
+    [sbix] Simplify glyph_length calc
+
+ src/hb-ot-color-sbix-table.hh | 22 +++++-----------------
+ 1 file changed, 5 insertions(+), 17 deletions(-)
+
+commit 0730d623854dc17ce0c3f1f2755a90b656c8e52c
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sun Oct 28 15:38:42 2018 -0700
+
+    [sbix] Check glyph data end is in range
+
+ src/hb-ot-color-sbix-table.hh | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit b76dc03108d04975335dbf3580f8d02321cb5d25
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sun Oct 28 15:36:17 2018 -0700
+
+    [sbix] Reduce code
+
+ src/hb-ot-color-sbix-table.hh | 7 +++----
+ 1 file changed, 3 insertions(+), 4 deletions(-)
+
+commit 50fb02a219dbf168d300c4ccf9f29aee38a78e6c
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sun Oct 28 15:33:12 2018 -0700
+
+    [sbix] Check glyph id before looking into unsafe array
+
+    That 'Z' at end of imageOffsetsZ is a reminder that you should
+    check...
+
+ src/hb-ot-color-sbix-table.hh | 7 ++++---
+ 1 file changed, 4 insertions(+), 3 deletions(-)
+
+commit a8cb9c73da29afa89b0253b6475ff220613e100a
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sun Oct 28 15:30:57 2018 -0700
+
+    [sbix] Simplify 'dupe' handling logic
+
+ src/hb-ot-color-sbix-table.hh | 21 +++++++++++----------
+ 1 file changed, 11 insertions(+), 10 deletions(-)
+
+commit d7eb534e59064633732959c3771b6557cc97005e
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sun Oct 28 15:27:04 2018 -0700
+
+    [sbix] Check offsets before proceeding
+
+ src/hb-ot-color-sbix-table.hh | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit c8380bd3e4a2e51dfbe2e44e19738445be16ac75
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sun Oct 28 15:20:33 2018 -0700
+
+    [color] Remove more dump-emoji cruft
+
+ src/hb-ot-color-cbdt-table.hh | 53
+ -------------------------------------------
+ src/hb-ot-color-sbix-table.hh | 13 -----------
+ 2 files changed, 66 deletions(-)
+
+commit 68f2c832c894d71715073d4748ad321a9d271a0e
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sun Oct 28 15:18:55 2018 -0700
+
+    Remove dump-emoji
+
+ src/Makefile.am               |   9 --
+ src/dump-emoji.cc             | 322
+ ------------------------------------------
+ src/hb-ot-color-sbix-table.hh |   4 +-
+ 3 files changed, 3 insertions(+), 332 deletions(-)
+
+commit b46de42b3a4bdf110154f4f067656f153f5a7d1b
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sun Oct 28 15:13:45 2018 -0700
+
+    [sbix] Fix order of parameters
+
+ src/hb-ot-color-sbix-table.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit a91cda72abdfc5e401510474c59dd14026e8b6cb
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sun Oct 28 15:12:05 2018 -0700
+
+    [sbix] Remove redundant parameter
+
+ src/hb-ot-color-sbix-table.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit c712005f55b2a1e5c782302d8a548cf1231c01f0
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sun Oct 28 15:11:10 2018 -0700
+
+    [sbix] Add get_strike()
+
+ src/hb-ot-color-sbix-table.hh | 23 +++++++++++++----------
+ 1 file changed, 13 insertions(+), 10 deletions(-)
+
+commit 400bc3f030b4ffebe24aa3562d8eb5fcc1cf4bdd
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sun Oct 28 15:05:40 2018 -0700
+
+    [sbix] Remove a couple of extra checks
+
+ src/hb-ot-color-sbix-table.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 3770282c837aacbf49b16be1986c91a608faa7da
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sun Oct 28 15:02:53 2018 -0700
+
+    [sbix] Rename sbix_table to table in accelerator
+
+ src/hb-ot-color-sbix-table.hh | 26 +++++++++++++-------------
+ 1 file changed, 13 insertions(+), 13 deletions(-)
+
+commit 7346841807ad96fc65bfc6ee9e78c3f190488f2a
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sun Oct 28 15:00:13 2018 -0700
+
+    [cbdt] Rename reference_blob_for_glyph() to reference_png()
+
+ src/hb-ot-color-cbdt-table.hh | 8 ++++----
+ src/hb-ot-color.cc            | 2 +-
+ 2 files changed, 5 insertions(+), 5 deletions(-)
+
+commit 1f33b8525d578323d6c798c08fc23c56896f9de0
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sun Oct 28 14:56:55 2018 -0700
+
+    [sbix] Rename ugly reference_blob_for_glyph() to reference_png()
+
+ src/hb-ot-color-sbix-table.hh | 16 +++++++---------
+ src/hb-ot-color.cc            |  4 +---
+ 2 files changed, 8 insertions(+), 12 deletions(-)
+
+commit 946b5344193183133bfc9799e26d3d0436d86404
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sun Oct 28 14:52:25 2018 -0700
+
+    [sbix] Fix uninitialized variables
+
+ src/hb-ot-color-sbix-table.hh | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit 01c7d53fb739b547f3633972194893f68a4738bc
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sun Oct 28 14:51:18 2018 -0700
+
+    [sbix] Select best strike based on ppem
+
+ src/hb-ot-color-sbix-table.hh | 50
+ ++++++++++++++++++++++++-------------------
+ src/hb-ot-color.cc            |  3 +--
+ src/hb-ot-font.cc             |  2 +-
+ 3 files changed, 30 insertions(+), 25 deletions(-)
+
+commit f9f26bff4c79d65a92affd6b73e2b3de017f2d6d
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sun Oct 28 14:20:50 2018 -0700
+
+    [sbix] Move code around. Add get_extents()
+
+ src/hb-ot-color-sbix-table.hh | 15 +++++++++++++--
+ src/hb-ot-font.cc             |  2 +-
+ 2 files changed, 14 insertions(+), 3 deletions(-)
+
+commit 48bc3039cb46d2b8cf672d86b63b4235a86252e6
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sun Oct 28 14:16:52 2018 -0700
+
+    [sbix] Check blob length against PNG header leangth
+
+ src/hb-ot-color-sbix-table.hh | 37 +++++++++++++++++++++++--------------
+ 1 file changed, 23 insertions(+), 14 deletions(-)
+
+commit d3ec31a57cb99048fb33bca65041da9dc884d8cb
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Mon Oct 29 00:28:44 2018 +0330
+
+    [ot-color] More on PNGHeader fields
+
+ src/hb-ot-color-sbix-table.hh | 12 +++++++++---
+ 1 file changed, 9 insertions(+), 3 deletions(-)
+
+commit 35fa3d326096639a33635e19f204a9cb31f20826
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Mon Oct 29 00:07:26 2018 +0330
+
+    [ot-color] Apply Behdad comment
+
+ src/hb-ot-color-sbix-table.hh | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit 307d61867a2b70073eecd1e0cb9b7d912e1c3f06
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Mon Oct 29 00:03:01 2018 +0330
+
+    [ot-color] Make PNGHeader reading actually work
+
+ src/hb-ot-color-sbix-table.hh | 6 +++---
+ test/api/test-ot-color.c      | 4 ++--
+ 2 files changed, 5 insertions(+), 5 deletions(-)
+
+commit 632e9af862aba49ab31343c4fd07dffef6d2749f
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Sun Oct 28 23:43:50 2018 +0330
+
+    [ot-color] Implement PNGHeader and test it, it doesn't work however
+
+ src/hb-ot-color-sbix-table.hh | 20 +++++++++++++++-----
+ src/hb-ot-font.cc             |  4 +---
+ test/api/test-ot-color.c      | 16 ++++++++++++++++
+ 3 files changed, 32 insertions(+), 8 deletions(-)
+
+commit 38706a0746822865008f810f9f577740c32580fa
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Sun Oct 28 23:19:04 2018 +0330
+
+    [ot-color] Preparation for setting PNG width/height in extents
+
+ src/dump-emoji.cc             |  7 +++---
+ src/hb-ot-color-sbix-table.hh | 52
+ +++++++++++++++++++++++++++++++++++--------
+ src/hb-ot-color.cc            | 14 +++++-------
+ src/hb-ot-font.cc             |  7 +++++-
+ 4 files changed, 59 insertions(+), 21 deletions(-)
+
+commit d6d6f3bc225bab57c1ab29b41876c98ac4ec1e4d
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sun Oct 28 11:41:33 2018 -0700
+
+    [docs] Add comment
+
+ src/hb-ot-font.cc | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit 3d4c1f6a41022ec99adefa2bdd2489622e2f9a66
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Sun Oct 28 21:38:56 2018 +0330
+
+    [ot-color] Apply Behdad reviews
+
+ docs/harfbuzz-sections.txt    |  4 ++--
+ src/hb-ot-color-cbdt-table.hh | 15 ++++-----------
+ src/hb-ot-color-sbix-table.hh |  6 ++----
+ src/hb-ot-color.cc            |  8 ++++----
+ src/hb-ot-color.h             |  4 ++--
+ test/api/test-ot-color.c      | 14 +++++++-------
+ 6 files changed, 21 insertions(+), 30 deletions(-)
+
+commit 8ef0d2ef928ac47278d7c6db8c8040a47f076e85
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Sun Oct 28 20:09:40 2018 +0330
+
+    [ot-color] Apply Behdad comment
+
+ src/dump-emoji.cc             |  2 +-
+ src/hb-ot-color-cbdt-table.hh | 16 +++++++---------
+ src/hb-ot-color-sbix-table.hh | 14 ++++----------
+ src/hb-ot-color.cc            | 22 +++++++---------------
+ src/hb-ot-color.h             |  5 +----
+ test/api/test-ot-color.c      | 15 ++++-----------
+ 6 files changed, 24 insertions(+), 50 deletions(-)
+
+commit dbd419bedef06a07c844b6a748a5e2868016000c
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Sat Oct 27 15:15:24 2018 +0330
+
+    [ot-color] Add public API for CBDT/sbix/SVG color Emojis
+
+ docs/harfbuzz-sections.txt |  4 ++++
+ src/dump-emoji.cc          |  4 ++--
+ src/hb-ot-color.cc         | 39 ++++-----------------------------------
+ src/hb-ot-color.h          | 24 ++++++++++++++++++++++++
+ test/api/test-ot-color.c   |  8 ++------
+ 5 files changed, 36 insertions(+), 43 deletions(-)
+
+commit 6ce49a921a80f1238ddc537f77a1fceea5274a21
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sun Oct 28 08:26:30 2018 -0700
+
+    [name] Change hb_name_id_t back to unsigned int
+
+    https://github.com/harfbuzz/harfbuzz/commit/d941f66c75fe26f909b1ba248535cc372bbde851#commitcomment-31076011
+
+ docs/harfbuzz-sections.txt    |  2 --
+ src/hb-ot-color-cpal-table.hh |  4 ++--
+ src/hb-ot-layout.cc           | 12 ++++++------
+ src/hb-ot-name-table.hh       |  2 +-
+ src/hb-ot-name.h              |  6 +++---
+ src/test-size-params.cc       |  2 +-
+ 6 files changed, 13 insertions(+), 15 deletions(-)
+
+commit a4f4f5ba5f64174dea931e02367aa4067d034383
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sun Oct 28 08:23:36 2018 -0700
+
+    [docs] Fix titles here as well
+
+ src/hb-map.cc        | 2 +-
+ src/hb-set.cc        | 2 +-
+ src/hb-shape-plan.cc | 2 +-
+ 3 files changed, 3 insertions(+), 3 deletions(-)
+
+commit 213b6dd33564d0273b1db1c17a4e82548b727dfe
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sat Oct 27 18:36:24 2018 -0700
+
+    [name] Make sure hb_name_id_t is int-sized
+
+    https://github.com/harfbuzz/harfbuzz/commit/d941f66c75fe26f909b1ba248535cc372bbde851#commitcomment-31068905
+
+ src/hb-ot-name.h | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit 4740a3593d6bbb97758593b7d5cd1b86eccbed78
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sat Oct 27 05:07:54 2018 -0700
+
+    [docs] Divide reference API into three chapters
+
+ docs/harfbuzz-docs.xml | 213
+ +++++++++++++------------------------------------
+ 1 file changed, 56 insertions(+), 157 deletions(-)
+
+commit 1d40d72f291ed5e11850f8bd51a8562b57de1997
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sat Oct 27 05:00:42 2018 -0700
+
+    [docs] Hook up hb-var
+
+ docs/harfbuzz-docs.xml |  1 +
+ src/hb-ot-var.cc       | 11 +++++++++++
+ 2 files changed, 12 insertions(+)
+
+commit 80d9a427cf61f61512de13cd88bdc63d881019fe
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sat Oct 27 04:58:32 2018 -0700
+
+    [docs] Document remaining sections
+
+ src/hb-ot-color.cc  | 10 ++++++++++
+ src/hb-ot-font.cc   | 10 ++++++++++
+ src/hb-ot-layout.cc | 10 ++++++++++
+ src/hb-ot-math.cc   | 11 +++++++++++
+ src/hb-ot-name.cc   | 10 ++++++++++
+ src/hb-ot-shape.cc  | 10 ++++++++++
+ 6 files changed, 61 insertions(+)
+
+commit cf5fa57f00613d324b55732d9e21c779ba0d2de2
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sat Oct 27 04:50:38 2018 -0700
+
+    [docs] Change section titles again
+
+    I think I like the uniform "hb-*" more.
+
+ src/hb-blob.cc      |  2 +-
+ src/hb-buffer.cc    |  2 +-
+ src/hb-common.cc    |  4 ++--
+ src/hb-deprecated.h | 12 ++++++++++++
+ src/hb-face.cc      |  2 +-
+ src/hb-font.cc      |  2 +-
+ src/hb-shape.cc     |  2 +-
+ src/hb-unicode.cc   |  2 +-
+ 8 files changed, 20 insertions(+), 8 deletions(-)
+
+commit 04981ee05d83ed30c9f818106589a4de9c3e9b7f
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sat Oct 27 04:40:43 2018 -0700
+
+    [docs] More
+
+ src/hb-coretext.cc        | 10 ++++++++++
+ src/hb-ft.cc              | 11 +++++++++++
+ src/hb-glib.cc            | 10 ++++++++++
+ src/hb-gobject-structs.cc | 12 ++++++++++++
+ src/hb-graphite2.cc       | 10 ++++++++++
+ src/hb-icu.cc             | 10 ++++++++++
+ src/hb-uniscribe.cc       | 10 ++++++++++
+ 7 files changed, 73 insertions(+)
+
+commit 5dd86aa33b4e52a0de4fcd96b2ea7bafcae8dd34
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sat Oct 27 04:28:40 2018 -0700
+
+    [docs] Rename section titles to object names
+
+    More useful.
+
+ src/hb-blob.cc       | 2 +-
+ src/hb-buffer.cc     | 2 +-
+ src/hb-face.cc       | 4 ++--
+ src/hb-font.cc       | 4 ++--
+ src/hb-map.cc        | 2 +-
+ src/hb-set.cc        | 2 +-
+ src/hb-shape-plan.cc | 2 +-
+ src/hb-unicode.cc    | 2 +-
+ 8 files changed, 10 insertions(+), 10 deletions(-)
+
+commit 524fb70216d7fec17f5327237faa4d092ae15a00
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sat Oct 27 04:27:36 2018 -0700
+
+    [docs] More
+
+ src/hb-map.cc | 11 ++++++++++-
+ src/hb-set.cc | 11 ++++++++++-
+ 2 files changed, 20 insertions(+), 2 deletions(-)
+
+commit 46072b7cb55bfeb8c46a78cbdb335dfdcce48298
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sat Oct 27 04:21:20 2018 -0700
+
+    [ot] Fold hb-ot-tag.h into hb-ot-layout.h
+
+ docs/harfbuzz-docs.xml     |  1 -
+ docs/harfbuzz-sections.txt | 20 +++++-------
+ src/Makefile.sources       |  1 -
+ src/hb-graphite2.cc        |  2 +-
+ src/hb-ot-layout.h         | 42 ++++++++++++++++++++++++-
+ src/hb-ot-tag.h            | 78
+ ----------------------------------------------
+ src/hb-ot.h                |  1 -
+ src/hb-uniscribe.cc        |  2 +-
+ 8 files changed, 51 insertions(+), 96 deletions(-)
+
+commit 00cf4e5eb6dcb04406d5a519712da799277cec2e
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sat Oct 27 04:07:33 2018 -0700
+
+    [docs] Fill in some sections
+
+ docs/harfbuzz-docs.xml     | 20 ++++++--------
+ docs/harfbuzz-sections.txt | 65
+ +++++++++++++++++++---------------------------
+ src/hb-blob.cc             | 13 ++++++++++
+ src/hb-buffer.cc           |  3 ++-
+ src/hb-common.cc           | 23 ++++++++++++++++
+ src/hb-face.cc             | 13 ++++++++++
+ src/hb-font.cc             | 13 ++++++++++
+ src/hb-shape-plan.cc       | 13 ++++++++++
+ src/hb-shape.cc            |  4 ++-
+ src/hb-unicode.cc          | 14 ++++++++++
+ 10 files changed, 129 insertions(+), 52 deletions(-)
+
+commit 55a19d73b4d5e7ddd328263d241a442f16f005b2
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sat Oct 27 04:01:19 2018 -0700
+
+    Move HB_EXTERN
+
+ src/hb-common.h | 4 ++++
+ src/hb.h        | 4 ----
+ 2 files changed, 4 insertions(+), 4 deletions(-)
+
+commit 524e854c15f9d6c50c5456ae0e188f039dcf153c
+Merge: 4ee3c827 8180c37d
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Sat Oct 27 15:04:43 2018 +0330
+
+    Merge pull request #1318 from ebraminio/png
+
+    Add a non-hooked _png _svg get emoji blob
+
+commit 8180c37df0a856dbc3564c0aefd8b2acab8baf8a
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Sat Oct 27 14:45:00 2018 +0330
+
+    [ot-color] Remove _png and _svg public APIs
+
+ docs/harfbuzz-sections.txt |  4 ----
+ src/dump-emoji.cc          | 11 ++++++++---
+ src/hb-ot-color.cc         | 39 +++++++++++++++++++++++++++++++++++----
+ src/hb-ot-color.h          | 24 ------------------------
+ test/api/test-ot-color.c   |  8 ++++++--
+ 5 files changed, 49 insertions(+), 37 deletions(-)
+
+commit 9aa6279a2d64ab8057b0d7acbcc77044442c6d0e
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Sat Oct 27 14:24:58 2018 +0330
+
+    [ot-color/png] Try to get image blob from sbix first options.aat
+    is set
+
+ src/hb-ot-color.cc | 16 +++++++++++-----
+ 1 file changed, 11 insertions(+), 5 deletions(-)
+
+commit b42661ee91ea92309e827a970f370cacc62c73aa
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Sat Oct 27 14:15:38 2018 +0330
+
+    [ot-color] Add some documentation
+
+ src/hb-ot-color.cc | 37 +++++++++++++++++++------------------
+ src/hb-ot-color.h  |  2 +-
+ 2 files changed, 20 insertions(+), 19 deletions(-)
+
+commit 4ee3c8272c31736980218cba95f97fed53d24e14
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sat Oct 27 03:18:45 2018 -0700
+
+    [docs] Fix hb_name_id_t
+
+    Yep, was not recognized without this patch!
+
+ src/hb-ot-name.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 9435fb24daadf08add9a701816da01bd54c0cd78
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Sat Oct 27 13:32:14 2018 +0330
+
+    [ot-color/png] Implement CBDT part
+
+ src/hb-ot-color-cbdt-table.hh | 56
+ +++++++++++++++++++++++++++++++++++++++----
+ src/hb-ot-color.cc            | 19 ++-------------
+ src/hb-ot-color.h             |  4 ++++
+ test/api/test-ot-color.c      | 25 ++++++++++++++++---
+ 4 files changed, 79 insertions(+), 25 deletions(-)
+
+commit 9457cfd7bcc9c2fff38194f2bb82ab7be881bfeb
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sat Oct 27 03:15:34 2018 -0700
+
+    [docs] Hook up hb-map
+
+ docs/harfbuzz-docs.xml | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit d941f66c75fe26f909b1ba248535cc372bbde851
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sat Oct 27 02:55:52 2018 -0700
+
+    [name] Make hb_name_id_t be the enum
+
+    This is like hb_script_t.
+
+    We had this exposed as unsigned int since 2.0.0 release in two APIs,
+    as well as hb_ot_layout_get_size_params() from earlier.
+    But since no one uses those (right?!), let's just fix this now.
+
+ docs/harfbuzz-docs.xml        |  6 ++++--
+ docs/harfbuzz-sections.txt    |  4 +++-
+ src/hb-ot-color-cpal-table.hh | 12 ++++++------
+ src/hb-ot-layout.cc           | 16 ++++++++--------
+ src/hb-ot-name-table.hh       |  2 +-
+ src/hb-ot-name.h              | 15 ++++-----------
+ src/test-size-params.cc       |  2 +-
+ 7 files changed, 27 insertions(+), 30 deletions(-)
+
+commit 40496a54a03864c5e6a1224c18b4b93a1f578eed
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sat Oct 27 02:49:32 2018 -0700
+
+    [name] Move HB_NAME_ID_INVALID into the enum
+
+    Don't know how to document anonymous enum members.
+
+ src/hb-ot-name.h | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit a8a55b9f892a5e4f086b20bbe337dc29182210af
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sat Oct 27 02:45:57 2018 -0700
+
+    [name] Move around
+
+ src/hb-ot-name.h | 74
+ ++++++++++++++++++++++++++++----------------------------
+ 1 file changed, 37 insertions(+), 37 deletions(-)
+
+commit 3b7e5f131383956e19642d28c938f1bc0d16295f
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sat Oct 27 02:39:20 2018 -0700
+
+    [name] Rename hb_ot_name_get_names() to hb_ot_name_list_names()
+
+    And swap return value positions, so can be annotated for
+    gobject-introspectin.
+
+ docs/harfbuzz-sections.txt |  2 +-
+ src/hb-ot-name.cc          | 17 ++++++++---------
+ src/hb-ot-name.h           |  6 +++---
+ src/test-name-table.cc     |  4 ++--
+ 4 files changed, 14 insertions(+), 15 deletions(-)
+
+commit 4025ad804383dc8d5ace9654ae21d4d726d0dbc4
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sat Oct 27 02:35:06 2018 -0700
+
+    Document new API
+
+ src/hb-common.h     | 30 +++++++++++++++++++++++++-
+ src/hb-ot-color.cc  | 16 +++++++-------
+ src/hb-ot-layout.cc |  2 +-
+ src/hb-ot-name.cc   | 61
+ ++++++++++++++++++++++++++++++++++++++++++++++++++++-
+ src/hb-ot-name.h    | 15 +++++++++++++
+ 5 files changed, 113 insertions(+), 11 deletions(-)
+
+commit 5e2a52f71a8d081441fbc1c57a3550e3a9573e46
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Sat Oct 27 12:44:33 2018 +0330
+
+    [sbix] Remove dump method from sbix accelerator
+
+ src/dump-emoji.cc             | 36 ++++++++++++++++++++++++------------
+ src/hb-ot-color-sbix-table.hh | 26 ++++++++++----------------
+ 2 files changed, 34 insertions(+), 28 deletions(-)
+
+commit 0353ac6cde47df8f5386733f5c12cc60732a5bf4
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Sat Oct 27 12:24:53 2018 +0330
+
+    Fix test-name-table on older bots
+
+ src/test-name-table.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit dc11a38107ac1f0a2d3edacae33ff7f10f5e894c
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Sat Oct 27 12:15:25 2018 +0330
+
+    [sbix] Set num_glyphs on accelerator
+
+    dump-emoji was broken without it
+
+ src/hb-ot-color-sbix-table.hh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 6a38fd68a8f4e66d9248e0c943ae3a1cf45c521b
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Sat Oct 27 10:50:53 2018 +0330
+
+    [ot-color/png] sbix runtime memory check
+
+ src/hb-ot-color-cbdt-table.hh | 16 +++++++---------
+ src/hb-ot-color-sbix-table.hh | 18 ++++++++++++------
+ src/hb-ot-color-svg-table.hh  |  4 ++--
+ 3 files changed, 21 insertions(+), 17 deletions(-)
+
+commit ca645accb97841e01846e45cda32e6bd2ad15940
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sat Oct 27 00:39:31 2018 -0700
+
+    Comment
+
+ src/hb-ot-shape-complex-indic.cc | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 265ad408ca41e9d0b5a1056a751d834d4eadc911
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Fri Oct 26 23:55:11 2018 +0330
+
+    [ot-color/png] Implement sbix part
+
+ docs/harfbuzz-sections.txt    |  2 +
+ src/dump-emoji.cc             |  5 ++-
+ src/hb-ot-color-cbdt-table.hh | 27 ++++++++----
+ src/hb-ot-color-sbix-table.hh | 98
+ +++++++++++++++++++++++++++++++++++++------
+ src/hb-ot-color.cc            | 64 ++++++++++++++++++++++++++++
+ src/hb-ot-color.h             |  9 ++++
+ test/api/test-ot-color.c      | 32 ++++++++++++++
+ 7 files changed, 215 insertions(+), 22 deletions(-)
+
+commit 7f5941e162bf7806299656edafd452a47b5a55b9
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sat Oct 27 00:06:48 2018 -0700
+
+    Remove stale comment
+
+    Ugliness was fixed in 30eab97a0072fbc22d353082249e0e6e546cd86b
+    But yeah, my smell detector was working.  Ugliness was buggy.
+
+ src/hb-ot-shape-normalize.cc | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit e7400c0275cad4f584eeaf21ce6d5c6adca29bbb
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Oct 26 22:09:17 2018 -0700
+
+    [docs] Hook up new symbols
+
+ docs/harfbuzz-docs.xml     | 46
+ +++++++++++++++++++++++++++++++++++++++++-----
+ docs/harfbuzz-sections.txt | 21 +++++++++++++++++++++
+ src/hb-ot-color.cc         |  2 +-
+ 3 files changed, 63 insertions(+), 6 deletions(-)
+
+commit 6aa019c4af6b64bb732205e6051f3e73e1b70721
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Oct 26 22:02:17 2018 -0700
+
+    [morx] Fix merge_cluster to end at last ligature component
+
+    Don't assume current position was a component in the ligature.
+
+ src/hb-aat-layout-morx-table.hh | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 00ae4be6bf8b1d0800043167c5cf95187ac12515
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Oct 26 21:59:20 2018 -0700
+
+    [morx] Fix bailing out ligation at end-of-text
+
+    Check was after a move_to, which wouldn't work.
+
+    Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=11147
+
+ src/hb-aat-layout-morx-table.hh | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit 30eab97a0072fbc22d353082249e0e6e546cd86b
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Oct 26 21:54:07 2018 -0700
+
+    Fix invalid memory read
+
+    Buffer might be relocated inside replace_glyphs().
+
+    Fixes https://bugs.chromium.org/p/chromium/issues/detail?id=895117
+
+ src/hb-ot-shape-normalize.cc | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 79b2fa62ca7eb5a875778d3a2ecae63350083ba3
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Oct 26 21:21:18 2018 -0700
+
+    [indic] Fix infinite loop
+
+    Fixes https://bugs.chromium.org/p/chromium/issues/detail?id=863044
+
+ src/hb-ot-shape-complex-indic.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 39bd07aed5fe6ccddde53206bafceec32d56dcc1
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Oct 26 21:01:11 2018 -0700
+
+    Fix bunch of unused parameter warnings
+
+    Show up with gcc -O0.
+
+    There's a few more but those are functions that need to be filled in.
+
+    Maybe this is a lost battle...
+
+ src/gen-vowel-constraints.py                 |  4 ++--
+ src/hb-aat-layout-common.hh                  |  7 +++++--
+ src/hb-aat-layout-kerx-table.hh              |  4 ++--
+ src/hb-aat-layout-morx-table.hh              | 10 +++++-----
+ src/hb-face.cc                               |  2 +-
+ src/hb-font.cc                               | 29
+ ++++++++++++++--------------
+ src/hb-graphite2.cc                          |  9 ++++++---
+ src/hb-machinery.hh                          |  4 ++--
+ src/hb-ot-color-cbdt-table.hh                |  2 +-
+ src/hb-ot-glyf-table.hh                      |  4 ++--
+ src/hb-ot-hmtx-table.hh                      |  2 +-
+ src/hb-ot-layout-gpos-table.hh               |  2 +-
+ src/hb-ot-math-table.hh                      |  2 +-
+ src/hb-ot-maxp-table.hh                      |  2 +-
+ src/hb-ot-shape-complex-arabic-fallback.hh   |  6 +++---
+ src/hb-ot-shape-complex-arabic.cc            |  6 +++---
+ src/hb-ot-shape-complex-hangul.cc            |  2 +-
+ src/hb-ot-shape-complex-khmer.cc             |  2 +-
+ src/hb-ot-shape-complex-myanmar.cc           |  6 +++---
+ src/hb-ot-shape-complex-use.cc               |  8 ++++----
+ src/hb-ot-shape-complex-vowel-constraints.cc |  4 ++--
+ src/hb-ot-shape-fallback.cc                  |  4 ++--
+ src/hb-ot-shape-normalize.cc                 |  4 +++-
+ src/hb-ot-shape.cc                           |  2 +-
+ src/hb-ot-tag.cc                             |  3 +--
+ src/hb-ot-vorg-table.hh                      |  2 +-
+ src/hb-set.cc                                |  2 +-
+ src/hb-shape-plan.cc                         |  2 +-
+ src/hb-utf.hh                                |  2 +-
+ 29 files changed, 73 insertions(+), 65 deletions(-)
+
+commit b2e1ec374cbd2a6e4d79419bd5601a4e2ecb9864
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Oct 26 20:45:28 2018 -0700
+
+    [subset] Fix warning
+
+ src/hb-subset.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 337ea0b7175793305e9d8935aecf385b707a5bc4
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Oct 26 20:31:14 2018 -0700
+
+    [fuzzing] Remove HB_NDEBUG
+
+    Not sure why it ever was added.
+
+ src/Makefile.am | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit 12058e44d100c28816f42c91c63a0f960a662181
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Oct 26 16:23:50 2018 -0700
+
+    [fuzzing] Add more test
+
+ ...z-testcase-minimized-harfbuzz_fuzzer-5659690013556736 | Bin 0 ->
+ 2732 bytes
+ 1 file changed, 0 insertions(+), 0 deletions(-)
+
+commit c965eeadbc71943f2336a20dc16ac691c805b90e
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Oct 25 13:43:25 2018 -0700
+
+    [name] Default to "en" if language is not specified
+
+ src/hb-ot-name.cc | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 3fd6e5dbefe52a4a2e604c28a4edfbd40ed16027
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Wed Oct 24 13:42:38 2018 -0700
+
+    [name] Add pre-defined nameIDs
+
+ src/hb-ot-name.h | 29 +++++++++++++++++++++++++++++
+ 1 file changed, 29 insertions(+)
+
+commit 20d0171d20cf9f3f93bdd6878bbc1d7d8329e75f
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Wed Oct 24 13:20:19 2018 -0700
+
+    [name] Fill out most missing language codes
+
+ src/hb-ot-name-language.cc | 114
+ +++++++++++++++++++++++----------------------
+ 1 file changed, 58 insertions(+), 56 deletions(-)
+
+commit 622b014faf7bbe7a97f9aff959c434d1664c10d0
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Wed Oct 24 12:40:15 2018 -0700
+
+    [name] Skip enumerating names with unknown language
+
+ src/hb-ot-name-table.hh | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 2c39f359e4a7312e3b518f76815d79e42ee96a32
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Wed Oct 24 12:34:30 2018 -0700
+
+    [utf] Remove unused typedef
+
+ src/hb-utf.hh | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit ce81c7429810ad3902c37e50016ca54b9bae6f91
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Wed Oct 24 12:34:03 2018 -0700
+
+    [utf] Fix ASCII
+
+ src/hb-utf.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 327546e633b590d6dedfb901810ccf490a0bf922
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Oct 23 23:33:44 2018 -0700
+
+    [name] Hook up ltag table
+
+ src/hb-aat-layout.cc     | 15 ++++++++++++++-
+ src/hb-aat-layout.hh     |  5 +++++
+ src/hb-aat-ltag-table.hh | 17 +++++++++++++++--
+ src/hb-ot-face.hh        |  3 ++-
+ src/hb-ot-name-table.hh  |  9 +++++----
+ 5 files changed, 41 insertions(+), 8 deletions(-)
+
+commit dc9a5f88b401fcad598946fcf735010c563741ac
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Oct 23 23:16:06 2018 -0700
+
+    [name] Do record sanitization at run-time
+
+ src/hb-dsalgs.hh        | 62
+ +++++++++++++++++++++++++++----------------------
+ src/hb-ot-name-table.hh | 22 +++++++++++-------
+ src/hb-ot-name.cc       |  2 +-
+ 3 files changed, 49 insertions(+), 37 deletions(-)
+
+commit a53d301b1c9f72cb42cc0fc321e2ad4dbac8e064
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Oct 23 23:05:55 2018 -0700
+
+    [name] Minor
+
+ src/hb-ot-name-table.hh | 7 ++++---
+ 1 file changed, 4 insertions(+), 3 deletions(-)
+
+commit c442fd9a10b3e91ab18720188afff08325adf6dc
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Oct 23 22:45:45 2018 -0700
+
+    [name] Add src/test-name-table tool to show all font names
+
+ src/Makefile.am        | 17 ++++++++-----
+ src/test-name-table.cc | 67
+ ++++++++++++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 78 insertions(+), 6 deletions(-)
+
+commit 7007bd9dff9f8eef3263f1b39327552ff1ebae3f
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Oct 23 22:44:36 2018 -0700
+
+    [name] Rebuild language list, include missing entries
+
+ src/hb-ot-name-language.cc | 634
+ ++++++++++++++++++++++++++-------------------
+ 1 file changed, 370 insertions(+), 264 deletions(-)
+
+commit 68f172101c1228a7d669d71da1d0eeb96a10565e
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Oct 23 22:19:09 2018 -0700
+
+    [name] Fix cmp for invalid language
+
+ src/hb-ot-name-table.hh | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 888a65615c7b11222749ae85c124aaa9a36fe863
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Oct 23 22:16:32 2018 -0700
+
+    [name] Fix nul-termination bug
+
+ src/hb-ot-name.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 9b532e2ed432611005b19c40cac7e626afcccd08
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Oct 23 22:00:19 2018 -0700
+
+    [name] Add language mapping
+
+ src/Makefile.sources       |   2 +
+ src/hb-ot-name-language.cc | 349
+ +++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-ot-name-language.hh |  40 ++++++
+ src/hb-ot-name-table.hh    |  21 ++-
+ 4 files changed, 399 insertions(+), 13 deletions(-)
+
+commit e2f9b657758cda3708c0a9db971c467ca59d5c19
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Oct 23 21:19:56 2018 -0700
+
+    [name] Start adding language support
+
+ src/hb-ot-name-table.hh | 25 ++++++++++++++++++++++++-
+ 1 file changed, 24 insertions(+), 1 deletion(-)
+
+commit 6db6bbe64bd63554919647c5b527e03aedbaee4e
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Oct 23 21:12:58 2018 -0700
+
+    [name] Remove unused cmp function
+
+ src/hb-ot-name-table.hh | 16 ----------------
+ 1 file changed, 16 deletions(-)
+
+commit 4668a05006e6c4797df19651489b4589817e1e01
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Oct 23 20:51:53 2018 -0700
+
+    [name] Hook things up
+
+    Accept Mac Latin name entries as ASCII as well.
+
+ src/hb-ot-name-table.hh | 24 +++++++++++++++------
+ src/hb-ot-name.cc       |  8 +++++--
+ src/hb-utf.hh           | 55
+ +++++++++++++++++++++++++++++++++++++++++++++++++
+ 3 files changed, 79 insertions(+), 8 deletions(-)
+
+commit 69f5da0629f1e5a307fc49fe58490aa92d1bd0e2
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Oct 23 20:30:40 2018 -0700
+
+    [name] More
+
+    It assumes all names are encoded in UTF16-BE.  Other than that,
+    and not
+    listing languages correctly, it's *supposed* to work.
+
+ src/hb-dsalgs.hh                | 21 +++++++++++++++++++++
+ src/hb-ot-name-table.hh         | 37
+ ++++++++++++++++++++++++++++++-------
+ src/hb-ot-name.cc               | 12 ++++++++----
+ src/hb-ot-os2-unicode-ranges.hh | 10 +++++-----
+ src/hb-unicode.cc               |  8 ++++----
+ src/hb-unicode.hh               |  2 +-
+ 6 files changed, 69 insertions(+), 21 deletions(-)
+
+commit 64334aff8c2ea5aa066d77a95844bc6f84efe725
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Oct 23 20:15:53 2018 -0700
+
+    [name] Fix check
+
+ src/hb-ot-name.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 5531bd068e759a5acb3b8d301c0ff9c64844166e
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Oct 23 20:04:05 2018 -0700
+
+    [name] Flesh out UTF-X to UTF-X conversion routines
+
+ src/hb-ot-name.cc |  84 ++++++++++++++++++++++++++++++++++++------
+ src/hb-ot-name.h  |  10 ++---
+ src/hb-utf.hh     | 107
+ ++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 3 files changed, 182 insertions(+), 19 deletions(-)
+
+commit 84811a06a26508effe9f4a9eaf1be15297ecf0cb
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Oct 23 03:16:03 2018 -0700
+
+    [name] Fix for rebase changes to hb_array_t
+
+ src/hb-ot-name-table.hh | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 1046b1938b16ab6be861b0828b446fa13cf0377b
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Wed Oct 17 05:42:23 2018 -0700
+
+    [name] Some more
+
+ src/hb-ot-name.cc | 19 +++++++++++++------
+ 1 file changed, 13 insertions(+), 6 deletions(-)
+
+commit b4d4d1ea787c829dea023d99f974a38bdc3de0ae
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Oct 16 19:55:17 2018 -0700
+
+    [name] Return full string length from API
+
+ src/hb-ot-name.cc | 6 +++---
+ src/hb-ot-name.h  | 6 +++---
+ 2 files changed, 6 insertions(+), 6 deletions(-)
+
+commit 8d304ef7f9094a71fabc3efd87b37a030c437adf
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Oct 16 19:04:48 2018 -0700
+
+    [utf] Add UTF16-BE and UTF32-BE
+
+ src/hb-buffer.cc |  4 +--
+ src/hb-utf.hh    | 80
+ ++++++++++++++++++++++++++++++++------------------------
+ 2 files changed, 48 insertions(+), 36 deletions(-)
+
+commit a826a8730f21ae996ae8f4d12c44dc18b9e8e933
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Oct 16 13:06:56 2018 -0700
+
+    [name] Hide internal details from public API
+
+ src/hb-ot-name-table.hh | 23 +++++++++++++----------
+ src/hb-ot-name.h        |  3 +--
+ 2 files changed, 14 insertions(+), 12 deletions(-)
+
+commit e7c595a9f09ba1552b2de1f8d56cbdcf376b9cad
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Oct 15 23:34:54 2018 -0700
+
+    [name] More
+
+ src/hb-ot-name.cc | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit 75cd8c86bd9b0973864bb92e0244bf038980765e
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Oct 15 23:32:08 2018 -0700
+
+    [name] Add hb_ot_name_get_utf()
+
+ src/hb-ot-name.cc | 24 ++++++++++++++++++------
+ 1 file changed, 18 insertions(+), 6 deletions(-)
+
+commit c783d36324dd1e2031d3387064afab1ce5d90b6f
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Oct 15 23:28:49 2018 -0700
+
+    [name] Pre-allocate array
+
+ src/hb-ot-name-table.hh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit c2aa409537c3e8a7b8592ef90f8304bd6588561d
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Oct 15 23:09:28 2018 -0700
+
+    [name] Start implementing hb_ot_name_get_utf16()
+
+ src/hb-ot-name-table.hh |  6 ++++--
+ src/hb-ot-name.cc       | 22 ++++++++++++++++++++++
+ src/hb-ot-name.h        |  8 ++++++--
+ 3 files changed, 32 insertions(+), 4 deletions(-)
+
+commit 740cde8991283b8b4e1e77e022175251eb37d3d1
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Oct 15 23:00:27 2018 -0700
+
+    [name] Implement hb_bytes_t get_name()
+
+ src/hb-ot-name-table.hh | 24 +++++-------------------
+ 1 file changed, 5 insertions(+), 19 deletions(-)
+
+commit c3425f2401dffb1f3b5bd6fdbc0c3e9aad0f4306
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Oct 15 22:53:40 2018 -0700
+
+    [name] Add hb-ot-name.cc for realz
+
+ src/hb-ot-name.cc | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 50 insertions(+)
+
+commit 90420ed8cb297f1ceff75f5a75c8fa7b6ea6f65e
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Oct 15 22:48:48 2018 -0700
+
+    [name] Implement hb_ot_name_get_names()
+
+ src/Makefile.sources    | 1 +
+ src/hb-ot-name-table.hh | 3 +--
+ src/hb-ot-name.h        | 4 ++--
+ 3 files changed, 4 insertions(+), 4 deletions(-)
+
+commit 9a6c87c17d51fd57e4225c776a0fabbfd313f4f4
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Oct 15 22:42:04 2018 -0700
+
+    [name] Finish accelerator sorting
+
+ src/hb-ot-name-table.hh | 61
+ +++++++++++++++++++++++++++++++++++++++++--------
+ src/hb-ot-name.h        |  3 ++-
+ 2 files changed, 53 insertions(+), 11 deletions(-)
+
+commit 2157e56b34e7b932dd144ee3563f5bd682bbed30
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Oct 15 22:22:50 2018 -0700
+
+    [name] Start implementing public API infrastructure
+
+ src/hb-ot-face.cc       |  1 +
+ src/hb-ot-face.hh       |  7 +++---
+ src/hb-ot-name-table.hh | 60
+ +++++++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-ot-name.h        |  3 +++
+ 4 files changed, 68 insertions(+), 3 deletions(-)
+
+commit 0bf93ec0fb549d838b0a246de02a95559a9b2772
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Oct 15 21:34:10 2018 -0700
+
+    [name] Add public API declarations
+
+ src/hb-ot-name.h | 34 ++++++++++++++++++++++++++++++++++
+ 1 file changed, 34 insertions(+)
+
+commit 982c2f4a65d127e56e09e7ab583f84099b8136bb
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Oct 26 15:40:12 2018 -0700
+
+    [indic/khmer/myanmar/use] Clarify clear_syllable
+
+    No logic change.
+
+ src/hb-ot-shape-complex-indic.cc   |  3 ++-
+ src/hb-ot-shape-complex-khmer.cc   |  4 +---
+ src/hb-ot-shape-complex-myanmar.cc | 40
+ ++++++++++++++++++--------------------
+ src/hb-ot-shape-complex-use.cc     | 22 +++++++++++++++------
+ 4 files changed, 38 insertions(+), 31 deletions(-)
+
+commit 143ffe65aa7f20d6c53219905cbc2520d680b8dd
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Fri Oct 26 12:14:30 2018 +0330
+
+    [fuzz] Add a new testcase
+
+ ...z-testcase-minimized-hb-shape-fuzzer-5658272078495744 | Bin 0 ->
+ 2252 bytes
+ 1 file changed, 0 insertions(+), 0 deletions(-)
+
+commit 30f18039b3c0e5748101f8934ae82aebfc5a83f7
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Fri Oct 26 09:34:34 2018 +0330
+
+    [svg] Rename _svg_create_blob to _glyph_reference_blob_svg
+
+ docs/harfbuzz-sections.txt | 2 ++
+ src/dump-emoji.cc          | 2 +-
+ src/hb-ot-color.cc         | 4 ++--
+ src/hb-ot-color.h          | 2 +-
+ test/api/test-ot-color.c   | 6 +++---
+ 5 files changed, 9 insertions(+), 7 deletions(-)
+
+commit 5cb1ce868138a10c0663a18c3891bc717aa4bc64
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Thu Oct 25 22:39:58 2018 +0330
+
+    [svg] Collapse SVGDocumentIndex into SVG
+
+ src/hb-ot-color-svg-table.hh | 54
+ +++++++++++++++-----------------------------
+ src/hb-ot-color.cc           |  2 +-
+ test/api/test-ot-color.c     |  2 +-
+ 3 files changed, 20 insertions(+), 38 deletions(-)
+
+commit 4ceabb8c2126fe365303b8d69e667005276c0241
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Thu Oct 25 21:52:35 2018 +0330
+
+    [svg] Hide start_glyph and end_glyph from API
+
+ src/dump-emoji.cc            | 21 ++++++++-------------
+ src/hb-ot-color-svg-table.hh | 42
+ ++++++++++++------------------------------
+ src/hb-ot-color.cc           |  9 ++-------
+ src/hb-ot-color.h            |  5 +----
+ test/api/test-ot-color.c     | 11 ++---------
+ 5 files changed, 25 insertions(+), 63 deletions(-)
+
+commit c7a4e3dfb5c8dd4f8faf08e327bb1900c0096cf6
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Tue Oct 23 18:00:48 2018 +0330
+
+    [svg] Add public API
+
+    * hb_ot_color_has_svg
+    * hb_ot_color_glyph_svg_create_blob
+
+ src/dump-emoji.cc             | 51 +++++++++++++++----------
+ src/hb-open-type.hh           |  1 -
+ src/hb-ot-color-sbix-table.hh |  2 +
+ src/hb-ot-color-svg-table.hh  | 86
+ ++++++++++++++++++++++++++++++++-----------
+ src/hb-ot-color.cc            | 53 ++++++++++++++++++++++----
+ src/hb-ot-color.h             | 13 +++++++
+ src/hb-ot-face.cc             |  2 +
+ src/hb-ot-face.hh             |  4 +-
+ src/hb-ot-layout.cc           |  4 --
+ test/api/test-ot-color.c      | 43 +++++++++++++++++++---
+ 10 files changed, 199 insertions(+), 60 deletions(-)
+
+commit e98af6d1eda33346f72de8a45fbd317fc0e15935
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Oct 25 22:25:29 2018 -0700
+
+    [layout] Try to speed up collect_lookups some more
+
+    Barely made a dent :(.
+
+ src/hb-ot-layout-common.hh |  2 ++
+ src/hb-ot-layout.cc        | 23 ++++-------------------
+ 2 files changed, 6 insertions(+), 19 deletions(-)
+
+commit eb44bfc864f91c0c833c3156475d191ac1b79c72
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Oct 25 21:42:19 2018 -0700
+
+    [layout] Memoize collect_features
+
+    Fixes https://github.com/harfbuzz/harfbuzz/pull/1317
+    Fixes https://oss-fuzz.com/v2/testcase-detail/6543700493598720
+
+ src/hb-ot-layout.cc | 55
+ ++++++++++++++++++++++++++++++++++++++++++++++-------
+ 1 file changed, 48 insertions(+), 7 deletions(-)
+
+commit 84098b1639775aea5bf3f5d91fa6e657b612ce3a
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Oct 25 21:33:12 2018 -0700
+
+    [layout] Remove unintentionally added code
+
+ src/hb-ot-layout-common.hh | 2 --
+ 1 file changed, 2 deletions(-)
+
+commit 941600a9e06309f148d51403fa07dc56ce542572
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Oct 25 21:26:08 2018 -0700
+
+    [layout] Add hb_collect_features_context_t
+
+    Towards https://github.com/harfbuzz/harfbuzz/pull/1317
+
+ src/hb-ot-layout.cc | 66
+ +++++++++++++++++++++++++++++------------------------
+ 1 file changed, 36 insertions(+), 30 deletions(-)
+
+commit c237cdfcc74d33f77b2399b4d08228c2fcf50df5
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Oct 25 21:17:30 2018 -0700
+
+    [lookup] Fold another function inline
+
+ src/hb-ot-layout.cc | 48 +++++++++++++++++++++---------------------------
+ 1 file changed, 21 insertions(+), 27 deletions(-)
+
+commit fe5520ddea3941f7a72888d908fd2b895e2f388e
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Oct 25 20:58:34 2018 -0700
+
+    [layout] More prep work to memoize collect_features() work
+
+ src/hb-ot-layout.cc | 62
+ ++++++++++++++++++++---------------------------------
+ 1 file changed, 23 insertions(+), 39 deletions(-)
+
+commit e8e67503ff0a50eb10ad410d6a76a282ea494cf4
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Oct 25 20:48:20 2018 -0700
+
+    [lookup] More prep work for memoizing collect_features
+
+    https://github.com/harfbuzz/harfbuzz/pull/1317
+
+ src/hb-ot-layout-common.hh |  2 ++
+ src/hb-ot-layout.cc        | 83
+ +++++++++++++++++++++-------------------------
+ 2 files changed, 40 insertions(+), 45 deletions(-)
+
+commit 96828b97a8fc2c50721ce040bdde63c462908791
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Oct 25 20:34:29 2018 -0700
+
+    [layout] Minor
+
+    We were returning the accelerator's lookup count.  Returns table's.
+    They are the same except for OOM cases.  Just shorter code.
+
+ src/hb-ot-layout.cc | 14 +-------------
+ 1 file changed, 1 insertion(+), 13 deletions(-)
+
+commit 73449cd213c3a12468e99b9c3d840fc60a334902
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Oct 25 20:32:05 2018 -0700
+
+    [layout] Fold one function inline
+
+    Preparation for fixing https://github.com/harfbuzz/harfbuzz/pull/1317
+
+ src/hb-ot-layout.cc | 22 +++-------------------
+ 1 file changed, 3 insertions(+), 19 deletions(-)
+
+commit ba5ca6a762cb46a17f41673b14996a12e6cfe3d1
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Oct 25 17:41:26 2018 -0700
+
+    [morx] Use deleted-glyph, instead of actual deletion, in Ligation
+
+    Closer to what CoreText does.
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1302
+
+ src/hb-aat-layout-morx-table.hh | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit 5c272e3613667ca532f32764824784c63d797f57
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Oct 25 17:36:33 2018 -0700
+
+    [morx] Remove deleted-glyph at the end of processing
+
+ src/hb-aat-layout-morx-table.hh | 17 +++++++++++++++++
+ 1 file changed, 17 insertions(+)
+
+commit 1bb8ed86d6cfec0fc87c8e1930d9a86426b42001
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Oct 25 17:33:48 2018 -0700
+
+    [aat] Minor
+
+ src/hb-aat-layout-common.hh | 4 +---
+ 1 file changed, 1 insertion(+), 3 deletions(-)
+
+commit 102af615f15d04da20c17d80eb38f5948020f9ac
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Oct 25 17:29:32 2018 -0700
+
+    [aat] Start adding support for DELETED-GLYPH
+
+    https://github.com/harfbuzz/harfbuzz/issues/1302
+
+ src/hb-aat-layout-common.hh | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 955aa56b11e4fa14bc6d5b1b56cb810e28fab6cd
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Oct 25 16:50:38 2018 -0700
+
+    [vector] Make it act more like pointer
+
+    Add pointer cast operator and plus operator.
+
+ src/hb-coretext.cc      |  2 +-
+ src/hb-machinery.hh     |  2 +-
+ src/hb-ot-cmap-table.hh |  2 +-
+ src/hb-set.hh           |  8 ++++----
+ src/hb-subset.cc        |  2 +-
+ src/hb-uniscribe.cc     | 12 ++++++------
+ src/hb-vector.hh        |  6 ++++++
+ 7 files changed, 20 insertions(+), 14 deletions(-)
+
+commit 8d55e2adef9a376a5cf83c20aff2dba27dd64da8
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Oct 25 16:37:53 2018 -0700
+
+    [set] Minor
+
+ src/hb-set.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 64c32edfe18f5ef3b348e5c84077ee1f6faf4f48
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Oct 25 16:35:36 2018 -0700
+
+    [set] Make array access more explicit
+
+    Follow up on 94e421abbfc7ede9aaf3c8d86bb0ff9992ea3123
+
+ src/hb-set.hh | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit e3ceb2dde3525824de68914e12ad4e8a873ab90a
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Oct 25 14:30:24 2018 -0700
+
+    Fix again
+
+ test/shaping/data/in-house/fonts/DFONT.dfont | Bin 0 -> 3505 bytes
+ 1 file changed, 0 insertions(+), 0 deletions(-)
+
+commit eceeb85666814023f57ee3517bbb304830a60c55
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Fri Oct 26 00:23:45 2018 +0330
+
+    [docs] Add hb-ot-color section
+
+ docs/harfbuzz-sections.txt | 14 ++++++++++++++
+ 1 file changed, 14 insertions(+)
+
+commit 1cfe702872058ebc50d6cb5543daa38fb3a7ebfb
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Oct 25 13:37:08 2018 -0700
+
+    Fixup
+
+ test/shaping/data/in-house/fonts/{TRAK.tff => TRAK.ttf} | Bin
+ 1 file changed, 0 insertions(+), 0 deletions(-)
+
+commit 5739c876d0d080e7feaefd323245702c663f33be
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Oct 25 13:23:33 2018 -0700
+
+    [test] Rename some fonts
+
+    If we have duplicae font files in different directories, that would
+    break the oss-fuzz build currently.  So, rename some to avoid
+    name class with text-rendering-test.  Would be better to find
+    another solution.
+
+ ...TestMORXTwentyeight.ttf => MORXTwentyeight.ttf} | Bin
+ .../data/in-house/fonts/{TestTRAK.ttf => TRAK.tff} | Bin
+ .../data/in-house/fonts/{TestTTC.ttc => TTC.ttc}   | Bin
+ test/shaping/data/in-house/fonts/TestDFONT.dfont   | Bin 3505 -> 0 bytes
+ test/shaping/data/in-house/tests/aat-morx.tests    |   2 +-
+ test/shaping/data/in-house/tests/aat-trak.tests    |  22
+ ++++++++++-----------
+ test/shaping/data/in-house/tests/collections.tests |  12 +++++------
+ 7 files changed, 18 insertions(+), 18 deletions(-)
+
+commit 21ede867df28d1214ca677a24ac65ab0b7e95f42
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Oct 25 13:19:34 2018 -0700
+
+    Fix possible overflow in bsearch impls
+
+    From bungeman.
+
+    Fixes https://github.com/harfbuzz/harfbuzz/pull/1314
+
+ src/hb-dsalgs.hh               | 2 +-
+ src/hb-open-type.hh            | 4 ++--
+ src/hb-ot-cmap-table.hh        | 2 +-
+ src/hb-ot-layout-gpos-table.hh | 2 +-
+ src/hb-vector.hh               | 2 +-
+ 5 files changed, 6 insertions(+), 6 deletions(-)
+
+commit 94e421abbfc7ede9aaf3c8d86bb0ff9992ea3123
+Author: Ben Wagner <bungeman at chromium.org>
+Date:   Thu Oct 25 13:44:27 2018 -0400
+
+    Remove some use of Crap in hb-set.
+
+    When hb_set_t::page_for_insert needs to insert at the end of the
+    page_map
+    it ends up evaluating '&page_map[i + 1]' which has hb_vector return an
+    lvalue of a Crap so that nothing can be moved to its address. This
+    turns
+    into issues with ThreadSanitizer on Crap when two threads modify
+    different
+    hb_set_t instances. This can be avoided by using '&page_map[i] + 1'
+    instead.
+
+ src/hb-set.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 2798ac1c28edc4ba6f2283784d1027393f588f8c
+Author: azure-pipelines[bot]
+<azure-pipelines[bot]@users.noreply.github.com>
+Date:   Thu Oct 25 15:22:54 2018 +0000
+
+    Set up CI with Azure Pipelines
+
+ azure-pipelines.yml | 21 +++++++++++++++++++++
+ 1 file changed, 21 insertions(+)
+
+commit 9a830a17318446dab86e1439f7167d8a698eb856
+Author: Khaled Hosny <khaledhosny at eglug.org>
+Date:   Thu Oct 25 01:55:10 2018 +0200
+
+    [appveyor] Drop Cygwin builds again
+
+    They are so slow and we had only a couple of Cygwin build failure
+    reported in ~5 years.
+
+ appveyor.yml | 11 -----------
+ 1 file changed, 11 deletions(-)
+
+commit 00e51a10832965f4c1d65a6d71c9582782f02c2b
+Author: Khaled Hosny <khaledhosny at eglug.org>
+Date:   Wed Oct 24 22:58:22 2018 +0200
+
+    [appveyor] Limit make to three jobs
+
+    https://github.com/harfbuzz/harfbuzz/pull/1309#issuecomment-432778270
+
+ appveyor.yml | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit ae9e8f292b2ad79b01776ae5785a94afbfc4b3e4
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Wed Oct 24 16:46:07 2018 -0700
+
+    [vowel-constraints] Reset continuation on all dottedcircles
+
+    One of the was missed before.  Not intentional.
+
+ src/gen-vowel-constraints.py                 | 9 +++++++--
+ src/hb-ot-shape-complex-vowel-constraints.cc | 9 +++++++--
+ 2 files changed, 14 insertions(+), 4 deletions(-)
+
+commit d2b20ba18dfe3fe507ee7cb64fd73e3f1e1e5ae0
+Author: Khaled Hosny <khaledhosny at eglug.org>
+Date:   Wed Oct 24 11:37:09 2018 +0200
+
+    [appveyor] Build on Cygwin and msys2 in parallel
+
+ appveyor.yml | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 0d2fa7fd4c4df0dcf7800b1267d1126e5a4b1ab1
+Author: Khaled Hosny <khaledhosny at eglug.org>
+Date:   Wed Oct 24 11:23:21 2018 +0200
+
+    [appveyor] Do not update msys2
+
+    Looks like AppVeyor has new enough packages for our needs. Cuts
+    CI build
+    time by 5 minutes.
+
+ appveyor.yml | 5 ++---
+ 1 file changed, 2 insertions(+), 3 deletions(-)
+
+commit 6a3ad245609ce8496d08404b28217dca8d01c10b
+Author: Khaled Hosny <khaledhosny at eglug.org>
+Date:   Wed Oct 24 09:49:08 2018 +0200
+
+    [appveyor] Organize config file a bit
+
+ appveyor.yml | 12 ++++++------
+ 1 file changed, 6 insertions(+), 6 deletions(-)
+
+commit 0cd7d041d83ae28e8c7d8a156750464af76de291
+Author: Khaled Hosny <khaledhosny at eglug.org>
+Date:   Wed Oct 24 09:43:10 2018 +0200
+
+    [appveyor] Don’t build branches with open PR twice
+
+ appveyor.yml | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 401cdf07922f66c762dabfd8e3d45c35e33de7c0
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Oct 23 17:00:49 2018 -0700
+
+    [ot-font] Fix sign of ascent/descent
+
+    Some fonts, like msmincho, have positive number as descent
+    in vhea table.  That's wrong.  Just enforce sign on ascent/descent
+    when reading both horizontal and vertical metrics.
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1248
+
+ src/hb-ot-hmtx-table.hh | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit ba502dea1e81981f3893b5353400909bf60e354f
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Oct 23 16:46:10 2018 -0700
+
+    [morx] Fix cluster-merging when ligating
+
+    Only merge when actual ligature happened.
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1305
+
+ src/hb-aat-layout-morx-table.hh                          |   7 ++++---
+ test/shaping/data/in-house/Makefile.sources              |   1 +
+ test/shaping/data/in-house/fonts/TestMORXTwentyeight.ttf | Bin 0 ->
+ 2660 bytes
+ test/shaping/data/in-house/tests/aat-morx.tests          |   1 +
+ 4 files changed, 6 insertions(+), 3 deletions(-)
+
+commit aa5af8d041521507f8bc8ded8a365ee56098388c
+Author: Garret Rieger <grieger at google.com>
+Date:   Tue Oct 23 15:45:35 2018 -0700
+
+    Fix size calculation in DEFINE_SIZE_ARRAY_SIZED.
+
+ src/hb-machinery.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit f33ad6d69216a983624e832177895481549bdc07
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Oct 23 14:31:51 2018 -0700
+
+    [aat] Fix up previous commit and add files
+
+ src/hb-aat-map.cc  |  62 +++++++++++++++++++++++++++++++
+ src/hb-aat-map.hh  | 106
+ +++++++++++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-ot-map.cc   |   1 +
+ src/hb-ot-shape.cc |  15 ++++++--
+ 4 files changed, 181 insertions(+), 3 deletions(-)
+
+commit ffe347844803a6a9036d8357b744a982f5e5a6c9
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Oct 23 14:14:03 2018 -0700
+
+    [aat] Allow enabling/disabling features
+
+    Only works at entire-buffer range, not sub-ranges.
+
+    Test with:
+
+    $ hb-shape Zapfino.dfont Zapfino
+    [Z_a_p_f_i_n_o=0+2333]
+
+    $ hb-shape Zapfino.dfont Zapfino --features=-dlig
+    [Z=0+416|a=1 at -21,0+264|p_f=2+433|i=4+181|n=5+261|o=6+250]
+
+    $ hb-shape Zapfino.dfont Zapfino --features=+dlig
+    [Z_a_p_f_i_n_o=0+2333]
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1303
+
+ src/Makefile.sources            |  2 ++
+ src/hb-aat-layout-morx-table.hh | 29 +++++++++++++++++++++++++----
+ src/hb-aat-layout.cc            |  8 ++++++++
+ src/hb-aat-layout.hh            |  3 +++
+ src/hb-ot-shape.cc              |  4 ++++
+ src/hb-ot-shape.hh              |  5 +++++
+ 6 files changed, 47 insertions(+), 4 deletions(-)
+
+commit 8be0e5fd4540b18e26b28b414bd99af3bb1548b1
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Oct 23 13:39:50 2018 -0700
+
+    [ot-map] Minor
+
+ src/hb-ot-map.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit e8fccbc36b2cc5e1c9f218c83cad7f606c03e7a1
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Oct 23 13:25:03 2018 -0700
+
+    Minor
+
+ src/hb-ot-map.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 76324d95caa4b83cd4b515f516c2d3674455ea5e
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Oct 23 13:09:30 2018 -0700
+
+    Shift code around
+
+ src/hb-ot-shape.cc | 18 ++++++++++--------
+ src/hb-ot-shape.hh |  9 +++------
+ 2 files changed, 13 insertions(+), 14 deletions(-)
+
+commit cf92d6579e91d326598dcff93457fe85dfa962c2
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Oct 23 03:10:56 2018 -0700
+
+    [trak] Allow disabling tracking for ranges of text
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1303
+
+ src/hb-aat-layout-trak-table.hh                 |  4 ++++
+ src/hb-ot-shape.cc                              | 11 +++++++----
+ src/hb-ot-shape.hh                              |  5 ++++-
+ test/shaping/data/in-house/tests/aat-trak.tests |  1 +
+ 4 files changed, 16 insertions(+), 5 deletions(-)
+
+commit 8869436cb8a338b46c138305966a4b7b2c3ee374
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Oct 23 03:07:48 2018 -0700
+
+    When parsing feature ranges, accept ';' instead of ':'
+
+ src/hb-common.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 22ecefd88e1ea1841f363057b948aa792ac871a6
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Tue Oct 23 00:52:05 2018 +0330
+
+    Make tracking optout possible using 'trak' ot feature
+
+    So '--features=-trak' or 'font-feature-settings: 'trak' 0;'
+    can prevent
+    applying of tracking if used.
+
+ src/hb-ot-shape.cc                              | 10 +++++++---
+ test/shaping/data/in-house/tests/aat-trak.tests |  2 ++
+ 2 files changed, 9 insertions(+), 3 deletions(-)
+
+commit 6d40eb8372a2c74a6e1294b44a2b19c99d11e7da
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Oct 23 02:51:42 2018 -0700
+
+    Touch up on previous commit
+
+    https://github.com/harfbuzz/harfbuzz/pull/1273
+
+ src/HBIndicVowelConstraints.txt              |  97 ++++++
+ src/Makefile.am                              |   6 +-
+ src/Makefile.sources                         |   1 +
+ src/gen-vowel-constraints.py                 | 124 ++------
+ src/hb-ot-shape-complex-indic.cc             |  10 +-
+ src/hb-ot-shape-complex-use.cc               |  11 +-
+ src/hb-ot-shape-complex-vowel-constraints.cc | 433
+ ++++++++++++++++++++++++++
+ src/hb-ot-shape-complex-vowel-constraints.hh | 447
+ ++-------------------------
+ 8 files changed, 606 insertions(+), 523 deletions(-)
+
+commit 205737acdc268b1c90cf00bde2d2038519a8bf48
+Author: David Corbett <corbett.dav at husky.neu.edu>
+Date:   Fri Oct 12 16:54:54 2018 -0400
+
+    [use] Prohibit visually ambiguous vowel sequences
+
+ src/Makefile.am                                    |   7 +-
+ src/Makefile.sources                               |   1 +
+ src/gen-vowel-constraints.py                       | 286 ++++++++++++++
+ src/hb-ot-shape-complex-indic.cc                   | 272 +------------
+ src/hb-ot-shape-complex-use.cc                     |   3 +-
+ src/hb-ot-shape-complex-vowel-constraints.hh       | 434
+ +++++++++++++++++++++
+ test/shaping/README.md                             |   4 +-
+ .../46669c8860cbfea13562a6ca0d83130ee571137b.ttf   | Bin 0 -> 7184 bytes
+ .../in-house/tests/use-vowel-letter-spoofing.tests |  94 +++++
+ 9 files changed, 827 insertions(+), 274 deletions(-)
+
+commit 48ed598a356983f4623029dd5e87254fb59e3691
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Oct 23 02:19:32 2018 -0700
+
+    [VORG] Hook up to hb-ot-font's v_origin
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/544
+
+    Test added with NotoSansCJK, eg. with U+FF38.
+
+ src/hb-ot-face.cc                                        |   1 -
+ src/hb-ot-font.cc                                        |  11
+ +++++++++--
+ src/hb-ot-vorg-table.hh                                  |   6 ++++--
+ .../fonts/4cbbc461be066fccc611dcc634af6e8cb2705537.ttf   | Bin 0 ->
+ 2808 bytes
+ test/shaping/data/in-house/tests/vertical.tests          |   1 +
+ 5 files changed, 14 insertions(+), 5 deletions(-)
+
+commit 097ecfd4a991d4fa306bab7330d9952966e94d1f
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Oct 23 02:09:42 2018 -0700
+
+    [VORG] Add get_y_origin()
+
+    Unhooked.
+
+ src/hb-ot-vorg-table.hh | 16 ++++++++++++++--
+ 1 file changed, 14 insertions(+), 2 deletions(-)
+
+commit 6fb24d5e3e0cf61c0ed3574e5bcf4598a13d6b69
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Oct 23 01:58:59 2018 -0700
+
+    [VORG] Add VORG table
+
+    Cherry-picked from cff-subset branch.
+
+ src/Makefile.sources    |   1 +
+ src/hb-ot-face.cc       |   1 +
+ src/hb-ot-face.hh       |   1 +
+ src/hb-ot-vorg-table.hh | 168
+ ++++++++++++++++++++++++++++++++++++++++++++++++
+ 4 files changed, 171 insertions(+)
+
+commit 531f9822b2e8a60f03c43d6f86ef9ed32c951f0e
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Oct 23 01:32:08 2018 -0700
+
+    [morx] Add a few debug messages to Ligature chain
+
+ src/hb-aat-layout-morx-table.hh | 10 ++++++++++
+ 1 file changed, 10 insertions(+)
+
+commit 0e5bcdef7fb592f986ad5b4e07b80d2efb5e3344
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Oct 23 00:39:44 2018 -0700
+
+    [morx] Clear stack upon underflow when acting ligatures
+
+ src/hb-aat-layout-morx-table.hh | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit 1bfb96a9c8d7653f0dee5c5fab3c6e85cea900cd
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Oct 22 23:41:47 2018 -0700
+
+    [test/text-rendering-tests] Update from upstream
+
+ test/shaping/data/text-rendering-tests/Makefile.sources  |   2 +-
+ .../data/text-rendering-tests/fonts/TestTRAKOne.ttf      | Bin 0 ->
+ 1752 bytes
+ 2 files changed, 1 insertion(+), 1 deletion(-)
+
+commit 792071de4075cb9af0793f0d7c70da0780923bb6
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Oct 22 23:38:34 2018 -0700
+
+    [morx] Leave ligature on stack after ligating
+
+    Test with Apple Color Emoji.ttf of ~66MB and following sequence:
+
+    ./hb-shape Apple\ Color\ Emoji-old.ttf --font-funcs=ot -u
+    U+1F468,200d,U+1F469,200d,U+1F467,200d,1f466
+
+    Should form full family if matching works correctly.  It first makes
+    family of three, then makes family of four out of that and the last
+    two characters.
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1292
+
+ src/hb-aat-layout-morx-table.hh | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit e1b8e933f099efae3c3e1f5706be19120b44de20
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Tue Oct 23 09:23:48 2018 +0330
+
+    [ci] Disable llvm-gcc
+
+      #define Null(Type) Null<typename hb_remove_const<typename
+      hb_remove_reference<Type>::value>::value>()
+
+    raises:
+      hb-blob.cc: In function 'hb_blob_t* hb_blob_get_empty()':
+      hb-blob.cc:194: error: using 'typename' outside of template
+      hb-blob.cc:194: error: using 'typename' outside of template
+
+    Removing "typename"s fixes the issue but makes newer compiler fail
+    apparently.
+
+    Probably downstream can patch that locally till we get a solution.
+
+ .circleci/config.yml | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 8c78ced95b639730efd0edc521e4e81ad50af501
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Oct 22 21:49:42 2018 -0700
+
+    Unbreak builds
+
+ src/hb-dsalgs.hh    | 2 +-
+ src/hb-open-type.hh | 4 ++--
+ 2 files changed, 3 insertions(+), 3 deletions(-)
+
+commit 8d689f8a7bccda861bcb286d52f1a90fca52df0f
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Oct 22 21:33:18 2018 -0700
+
+    Add hb_array<>() specialization for UnsizedArrayOf
+
+    Related https://github.com/harfbuzz/harfbuzz/issues/1301
+
+ src/hb-aat-layout-trak-table.hh | 2 +-
+ src/hb-open-file.hh             | 2 +-
+ src/hb-open-type.hh             | 8 ++++++++
+ src/hb-ot-color-cpal-table.hh   | 6 +++---
+ 4 files changed, 13 insertions(+), 5 deletions(-)
+
+commit abfbba191141c3e3cf2a391f365b5323f9dc37c0
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Oct 22 21:27:45 2018 -0700
+
+    Add hb_array<>()
+
+    Simplifies transient object creation.
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1301
+
+ src/hb-aat-layout-trak-table.hh | 2 +-
+ src/hb-dsalgs.hh                | 2 ++
+ src/hb-open-file.hh             | 3 +--
+ src/hb-ot-color-cpal-table.hh   | 6 +++---
+ 4 files changed, 7 insertions(+), 6 deletions(-)
+
+commit 17ffbc070ff4190d8ebaf88f8db62f19e6fa370d
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Oct 22 21:22:25 2018 -0700
+
+    [color] Use Index for colorIdx
+
+    Doesn't matter, but matches the description.
+
+ src/hb-ot-color-colr-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 07386ea410af13e8fc844eb939a6c6e47c2adaf1
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Oct 22 21:18:27 2018 -0700
+
+    Remove const and references when binding Null()
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1299
+
+    Removes anomaly I was seeing in cpal table trying to use implicit
+    Null(NameID).
+
+ src/hb-atomic.hh              | 5 +----
+ src/hb-common.cc              | 2 +-
+ src/hb-ft.cc                  | 2 +-
+ src/hb-null.hh                | 4 ++--
+ src/hb-open-type.hh           | 6 ++----
+ src/hb-ot-color-cpal-table.hh | 8 ++------
+ src/hb-static.cc              | 1 -
+ src/hb.hh                     | 9 +++++++++
+ 8 files changed, 18 insertions(+), 19 deletions(-)
+
+commit b18acab7bce062fef397d3d8b0efc7826f473b50
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Oct 22 18:20:57 2018 -0700
+
+    [color] Add HB_COLOR
+
+    Normally I would have added to_string / from_string like other types
+    have.  But since we don't use hb_color_t much, I'm not going to
+    do that.
+    Although, if we did, we could use it in hb-view to parse colors...
+
+ src/hb-common.h | 14 +++++++++-----
+ 1 file changed, 9 insertions(+), 5 deletions(-)
+
+commit 228f96c9d09272c8f677935a640e75e173b817a3
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Oct 22 16:55:12 2018 -0700
+
+    [color] Finish reviewing / revamping CPAL
+
+    Now to hb_color_t.
+
+ src/hb-ot-color-cpal-table.hh | 52
+ ++++++++++++++++++++++---------------------
+ src/hb-ot-color.cc            | 33 +++++----------------------
+ src/hb-ot-color.h             | 10 ++++-----
+ 3 files changed, 38 insertions(+), 57 deletions(-)
+
+commit 683fad062792a199e2fe86fe161f41b9389d08c3
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Oct 22 16:35:03 2018 -0700
+
+    [color] Minor
+
+ src/hb-ot-color.cc | 6 ++----
+ 1 file changed, 2 insertions(+), 4 deletions(-)
+
+commit 14474d21040bf9b025b53bb9b0df599eaf260119
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Oct 22 16:30:30 2018 -0700
+
+    [color] Rely on CPALV1Tail Null object
+
+ src/hb-ot-color-cpal-table.hh | 39
+ ++++++++++++++-------------------------
+ 1 file changed, 14 insertions(+), 25 deletions(-)
+
+commit d7865107ea4664e04c03a1d79678cdcadc0d5ea5
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Oct 22 16:18:34 2018 -0700
+
+    Remove const from hb_array_t details
+
+    Will come in through <T> if desired.
+
+ src/hb-aat-layout-trak-table.hh | 6 +++---
+ src/hb-dsalgs.hh                | 6 +++---
+ src/hb-open-file.hh             | 4 ++--
+ 3 files changed, 8 insertions(+), 8 deletions(-)
+
+commit f3336580dd0c6959a1871f92b4a37f7c0a4b2160
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Oct 22 16:16:21 2018 -0700
+
+    [color] Use hb_array_t in CPAL
+
+    Doesn't work though, ouch :(.  Need to figure out if it's unreasonable
+    to expect Null(T) inside hb_array_t<T> to see the later specialization
+    of Null for NameID.
+
+ src/hb-open-type.hh           |  3 ++-
+ src/hb-ot-color-cpal-table.hh | 47
+ ++++++++++++++++++++++---------------------
+ src/hb-static.cc              |  1 +
+ 3 files changed, 27 insertions(+), 24 deletions(-)
+
+commit 5ae18855d115577ff796158d483db7b890d9956f
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Oct 22 14:54:55 2018 -0700
+
+    [color] Check for null CPAL arrays
+
+    We cannot use a nullable offset here though.
+
+ src/hb-ot-color-cpal-table.hh | 12 ++++++------
+ 1 file changed, 6 insertions(+), 6 deletions(-)
+
+commit 69ab72e4aa7cbf197873d38f7e623866b4e40502
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Oct 22 14:51:40 2018 -0700
+
+    [color] More CPAL rename
+
+ src/hb-ot-color-cpal-table.hh | 104
+ +++++++++++++++++++++---------------------
+ src/hb-ot-color.cc            |   6 +--
+ 2 files changed, 54 insertions(+), 56 deletions(-)
+
+commit 0befb06c468aa36f3337b5ef2235f6d69dda8397
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Oct 22 14:46:21 2018 -0700
+
+    [color] More CPAL rename
+
+ src/hb-ot-color-cpal-table.hh | 16 ++++++++--------
+ 1 file changed, 8 insertions(+), 8 deletions(-)
+
+commit 3600d206037ef23d6448c79a3f010c4f903a971c
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Oct 22 14:43:12 2018 -0700
+
+    [color] Rename vars in CPAL
+
+ src/hb-ot-color-cpal-table.hh | 32 ++++++++++++++++----------------
+ src/hb-ot-color.cc            |  1 +
+ 2 files changed, 17 insertions(+), 16 deletions(-)
+
+commit 0babf761c986855f9cdd1a2679380ee6a02390c8
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Tue Oct 23 01:33:45 2018 +0330
+
+    Adopt dump-emoji with latest unreleased APIs changes (#1297)
+
+ src/dump-emoji.cc | 24 +++++++++++-------------
+ 1 file changed, 11 insertions(+), 13 deletions(-)
+
+commit 7997144b5f08c81b2cce2c7c2a085fb7eeb506e3
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Oct 22 13:02:04 2018 -0700
+
+    [color] Revamp palette API
+
+ src/hb-ot-color.cc       |  81 ++++++++++++++---------------
+ src/hb-ot-color.h        |  26 +++++-----
+ test/api/test-ot-color.c | 130
+ +++++++++++++++++++++++------------------------
+ 3 files changed, 117 insertions(+), 120 deletions(-)
+
+commit 3bf91bd2690cda34a7687ed5465dc4bb0672f2b6
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Oct 22 12:40:38 2018 -0700
+
+    [color] Rewrite colr access
+
+    COLR table has one function: return layers for a glyph, and we
+    expose exactly
+    that, so should just wire it through.  Also use sub_array() for
+    verifiable
+    safety.
+
+    Also, BaseGlyphRecord's null object is enough.  We don't need to
+    special-case
+    the not-found.
+
+ src/hb-dsalgs.hh              | 11 +++++++++
+ src/hb-open-type.hh           |  2 +-
+ src/hb-ot-color-colr-table.hh | 53
+ +++++++++++++++++++++++--------------------
+ src/hb-ot-color.cc            | 19 +---------------
+ 4 files changed, 41 insertions(+), 44 deletions(-)
+
+commit 1de17bdb80b0668f4d4a4700e3f80c8caee3303d
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Oct 22 10:29:01 2018 -0700
+
+    [colr] Add hb_ot_color_layer_t
+
+    We never return parallel arrays from functions.  That's inconvenient
+    and hard to bind.
+
+ src/hb-ot-color.cc       | 18 ++++++++----------
+ src/hb-ot-color.h        | 22 ++++++++++++++++------
+ test/api/test-ot-color.c | 33 +++++++++++++++------------------
+ 3 files changed, 39 insertions(+), 34 deletions(-)
+
+commit 3b3668acc8b16afacb96d8c525eff603ef5f411f
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sun Oct 21 19:23:11 2018 -0700
+
+    [color] Rename / reorder a bit
+
+    Implement has_data() for realz.
+
+ src/hb-ot-color-colr-table.hh |  2 ++
+ src/hb-ot-color-cpal-table.hh |  2 ++
+ src/hb-ot-color.cc            | 78
+ ++++++++++++++++++++++++-------------------
+ src/hb-ot-color.h             | 33 ++++++++++++------
+ test/api/test-ot-color.c      | 30 ++++++++---------
+ 5 files changed, 85 insertions(+), 60 deletions(-)
+
+commit 9085a72deb041cf10edfa61d24b7c25f947f736b
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sun Oct 21 19:08:25 2018 -0700
+
+    [cpal] Touch up palette flags
+
+ src/hb-ot-color.h        | 16 ++++++++++------
+ test/api/test-ot-color.c |  4 ++--
+ 2 files changed, 12 insertions(+), 8 deletions(-)
+
+commit ee11fae9d0d2c16a3a4b4ecf5cf328ffe950bb03
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sun Oct 21 19:02:47 2018 -0700
+
+    [color] Rename "gid" to "glyph"
+
+    We don't expose "gid" in API.
+
+ src/hb-ot-color.cc | 12 ++++++------
+ src/hb-ot-color.h  |  8 ++++----
+ 2 files changed, 10 insertions(+), 10 deletions(-)
+
+commit 228fa71bf9186faedff48b3a259d696c7c07b5b5
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sun Oct 21 17:43:29 2018 -0700
+
+    [colr] Move sanitize
+
+ src/hb-ot-color-colr-table.hh | 17 ++++++++---------
+ 1 file changed, 8 insertions(+), 9 deletions(-)
+
+commit d440c8d3fbb907f17b1eb9287918009ced27a8c1
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Mon Oct 22 22:07:59 2018 +0330
+
+    Add chromacheck Emoji test fonts and minor preparations (#1294)
+
+ src/hb-ot-color.cc                  |  26 ++++++++++++++++++++++++++
+ src/hb-ot-face.hh                   |   8 +++++---
+ test/api/fonts/README               |   2 ++
+ test/api/fonts/chromacheck-cbdt.ttf | Bin 0 -> 792 bytes
+ test/api/fonts/chromacheck-colr.ttf | Bin 0 -> 652 bytes
+ test/api/fonts/chromacheck-sbix.ttf | Bin 0 -> 864 bytes
+ test/api/fonts/chromacheck-svg.ttf  | Bin 0 -> 792 bytes
+ test/api/hb-test.h                  |   2 +-
+ test/api/test-ot-color.c            |  21 +++++++++++++++++++++
+ 9 files changed, 55 insertions(+), 4 deletions(-)
+
+commit b92b9d7e5290eaa83e94fd40cddaee71628a3c2a
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sun Oct 21 17:42:51 2018 -0700
+
+    [colr] Move compare function into a static
+
+    Not sure if MSVC would be unhappy about this.
+
+ src/hb-ot-color-colr-table.hh | 16 ++++++++--------
+ 1 file changed, 8 insertions(+), 8 deletions(-)
+
+commit b6b171732a12b396a704984699bd0da906f5dc24
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sun Oct 21 17:41:49 2018 -0700
+
+    [colr] Minor
+
+ src/hb-ot-color-colr-table.hh | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit a6ade3471e730d7a8b56e4ed706a8eb126e957f6
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sun Oct 21 17:39:39 2018 -0700
+
+    [colr] Move sanitize() to right place
+
+    Sanitize always comes just before data member definitions, so
+    it's easy to cross-check.
+
+ src/hb-ot-color-colr-table.hh | 16 ++++++++--------
+ 1 file changed, 8 insertions(+), 8 deletions(-)
+
+commit 24adc1575745a711558dab79488760f1ceb24750
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sun Oct 21 17:39:00 2018 -0700
+
+    [colr] Touch up a bit
+
+    When a struct is plain old data with no references, etc, it's okay
+    to mark its members public.
+
+ src/hb-ot-color-colr-table.hh | 36 +++++++++++++++++++++++-------------
+ 1 file changed, 23 insertions(+), 13 deletions(-)
+
+commit cc6e77ca98e90fb531dd90a5c9c41d14d1dda9c4
+Author: Khaled Hosny <khaledhosny at eglug.org>
+Date:   Sun Oct 21 13:29:40 2018 +0200
+
+    [color] Fix documentation a bit
+
+ src/hb-ot-color.cc | 12 ++++++------
+ 1 file changed, 6 insertions(+), 6 deletions(-)
+
+commit 37ba2413c19f6a1d62868178fc80f870ee44e7ab
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Sun Oct 21 11:46:51 2018 +0330
+
+    Minor
+
+ src/hb-ot-color-cpal-table.hh | 10 +++++-----
+ src/hb-ot-color.cc            | 25 ++++++++++++++-----------
+ src/hb-ot-color.h             | 12 ++++++------
+ 3 files changed, 25 insertions(+), 22 deletions(-)
+
+commit 44f79b4bf8ac341c5968a27f6a2a13a8af48b34f
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Sun Oct 21 10:17:34 2018 +0330
+
+    Remove _palette_entry_count as can be done with _palette_colors
+
+ src/hb-ot-color.cc       | 18 ++----------------
+ src/hb-ot-color.h        |  3 ---
+ test/api/test-ot-color.c |  8 ++------
+ 3 files changed, 4 insertions(+), 25 deletions(-)
+
+commit 6795dcfc0884b87b72fce8d902654f28ffe1366c
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Sun Oct 21 09:51:15 2018 +0330
+
+    [test] Test hb_ot_color_has_{colr,cpal}_data
+
+ src/dump-emoji.cc        |  3 ++-
+ src/hb-ot-color.cc       |  7 ++++---
+ test/api/test-ot-color.c | 23 +++++++++++++++++++++++
+ 3 files changed, 29 insertions(+), 4 deletions(-)
+
+commit b8ee3a0ec89d63721618ac90c01ac6da228f5055
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Sun Oct 21 09:44:16 2018 +0330
+
+    [CPAL] Add palette entry and enable palette flag API
+
+ src/hb-ot-color-cpal-table.hh |  66 +++++++++++++++----------
+ src/hb-ot-color.cc            | 109
+ ++++++++++++++++++++++++------------------
+ src/hb-ot-color.h             |  23 +++++++++
+ test/api/test-ot-color.c      |  35 ++++++++++++--
+ 4 files changed, 158 insertions(+), 75 deletions(-)
+
+commit d4261b4bb6d20fac7deebacfbe120fb84a92e423
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Sun Oct 21 08:48:07 2018 +0330
+
+    Add API test for hb_ot_color_get_color_layers
+
+ src/dump-emoji.cc        |  3 ++-
+ src/hb-ot-color.cc       |  2 +-
+ src/hb-ot-color.h        |  2 ++
+ test/api/test-ot-color.c | 31 +++++++++++++++++++++++++++++--
+ 4 files changed, 34 insertions(+), 4 deletions(-)
+
+commit 456978d408cd41156e1123abfc3689800558e89b
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Sun Oct 21 08:26:40 2018 +0330
+
+    Address COLR/CPAL reviews and revive cpal_v1 tests
+
+ src/dump-emoji.cc             |  26 ++++----
+ src/hb-common.h               |  12 ++++
+ src/hb-ot-color-cpal-table.hh |  37 +++++-------
+ src/hb-ot-color.cc            | 136
+ +++++++++++++++++++++++++-----------------
+ src/hb-ot-color.h             |  38 +++---------
+ test/api/test-ot-color.c      | 101 +++++++++++++++----------------
+ 6 files changed, 179 insertions(+), 171 deletions(-)
+
+commit 687f679b80c071c69d0924f07a315f9d2691b7fc
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Sat Oct 20 17:50:39 2018 +0330
+
+    [color] Fix alpha channel value and adjust spaces
+
+ src/dump-emoji.cc          | 36 ++++++++++++++++++------------------
+ src/hb-buffer-serialize.cc | 14 +++++++-------
+ src/hb-ot-color.cc         | 10 +++++-----
+ 3 files changed, 30 insertions(+), 30 deletions(-)
+
+commit 00e94ce24efb1f5b3a9cd13c0b9f81f405ad8055
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Sat Oct 20 00:31:04 2018 +0330
+
+    [dump-emoji] Formatting
+
+ src/dump-emoji.cc | 26 ++++++++++++++++----------
+ 1 file changed, 16 insertions(+), 10 deletions(-)
+
+commit e9d798dc12d42e97ae8c19e7b73e25abc34d265a
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Fri Oct 19 18:30:01 2018 +0330
+
+    [test] Use hb_test_open_font_file
+
+ test/api/test-ot-color.c | 16 ++--------------
+ 1 file changed, 2 insertions(+), 14 deletions(-)
+
+commit e8a6f5b8039cce3f7ec568fd90fe73690e49a037
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Fri Oct 19 18:23:42 2018 +0330
+
+    Add three macros for separating color channels
+
+ src/dump-emoji.cc        |  8 ++++----
+ src/hb-ot-color.cc       |  1 -
+ src/hb-ot-color.h        | 15 ++++++++++-----
+ test/api/test-ot-color.c | 10 +++++-----
+ 4 files changed, 19 insertions(+), 15 deletions(-)
+
+commit 0e33467e52942e62e04cf825a6bd105fa311c864
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Fri Oct 19 17:44:06 2018 +0330
+
+    Make ot-color tests pass
+
+ test/api/test-ot-color.c | 52
+ ++++++++++++++++++++++++------------------------
+ 1 file changed, 26 insertions(+), 26 deletions(-)
+
+commit d4e928b1421c154adbda9b6e1f2cf804b21654cb
+Author: Khaled Hosny <khaledhosny at eglug.org>
+Date:   Tue May 1 17:16:46 2018 +0200
+
+    [color] Minimal API for COLR/CPAL
+
+ src/Makefile.sources                               |   1 +
+ src/dump-emoji.cc                                  | 114
+ +++++++++++----------
+ src/hb-ot-color-colr-table.hh                      |  12 +--
+ src/hb-ot-color-cpal-table.hh                      |  51 +++------
+ src/hb-ot-color.cc                                 |  87 +++++++++++-----
+ src/hb-ot-color.h                                  |  85 +++++++++++++++
+ src/hb-ot-face.hh                                  |   3 +
+ src/hb-ot.h                                        |   1 +
+ .../fonts/cpal-v0.ttf}                             | Bin
+ .../fonts/cpal-v1.ttf}                             | Bin
+ test/api/test-ot-color.c                           |  43 +++++---
+ 11 files changed, 257 insertions(+), 140 deletions(-)
+
+commit 0229eaea299443b4faa3bd086f23ec1496d6112c
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Mon Oct 22 10:51:37 2018 +0330
+
+    [fuzz] Add a found hb-subset testcase
+
+ ...z-testcase-minimized-hb-subset-fuzzer-5725847365877760 | Bin 0 ->
+ 880 bytes
+ 1 file changed, 0 insertions(+), 0 deletions(-)
+
+commit 0ecddad7c5948ecd7879bc7507f8a7a2d99eee86
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Mon Oct 22 00:44:28 2018 +0330
+
+    [ci] Disable flaky -windows-x64 and add a comment for iOS
+
+ .circleci/config.yml | 20 +++++++++++---------
+ 1 file changed, 11 insertions(+), 9 deletions(-)
+
+commit 9b3461574f6473c8ff7c995202858cf46012eed8
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Sun Oct 21 11:37:38 2018 +0330
+
+    [fuzz] Add more testcases
+
+    Fixed already but better to have anyway.
+
+    One didn't have minimized but it was only 164 B, so
+
+ ...uzz-testcase-minimized-hb-shape-fuzzer-5706010589659136 | Bin 0 ->
+ 52 bytes
+ 1 file changed, 0 insertions(+), 0 deletions(-)
+
+commit 4fa94a3e39c21bc1dcdbbd5bda99bff1e1490b0e
+Merge: 217a3728 c110878c
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Sun Oct 21 11:36:41 2018 +0330
+
+    Merge pull request #1290 from ebraminio/testopenfont
+
+    [test] Unify font file opening across the tests
+
+commit c110878cb61f5df99e9d97dda253f2987ddce58e
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Sun Oct 21 11:07:17 2018 +0330
+
+    [test] Unify font file opening across the tests
+
+ test/api/hb-subset-test.h        | 21 ---------------------
+ test/api/hb-test.h               | 21 +++++++++++++++++++++
+ test/api/test-collect-unicodes.c |  6 +++---
+ test/api/test-multithread.c      | 26 +++++---------------------
+ test/api/test-ot-name.c          | 27 ++++-----------------------
+ test/api/test-subset-cmap.c      |  8 ++++----
+ test/api/test-subset-glyf.c      | 28 ++++++++++++++--------------
+ test/api/test-subset-hdmx.c      | 14 +++++++-------
+ test/api/test-subset-hmtx.c      | 20 ++++++++++----------
+ test/api/test-subset-os2.c       |  4 ++--
+ test/api/test-subset-post.c      |  4 ++--
+ test/api/test-subset-vmtx.c      |  6 +++---
+ test/api/test-subset.c           |  6 +++---
+ 13 files changed, 78 insertions(+), 113 deletions(-)
+
+commit 217a3728b4991a855070678bc079cb400eee605a
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sat Oct 20 20:39:56 2018 -0700
+
+    [fuzzing] Add more font
+
+ .../clusterfuzz-testcase-hb-shape-fuzzer-5097734906839040 | Bin 0 ->
+ 164 bytes
+ 1 file changed, 0 insertions(+), 0 deletions(-)
+
+commit 1e39833ba8547c90a0a4ed7f265a6c4bc8eb8fe1
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sat Oct 20 16:56:06 2018 -0700
+
+    [docs] Minor
+
+ src/hb-buffer.h | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit a5ad8c658dac1fbe63d1034cdfe8df33f50462b6
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sat Oct 20 16:52:55 2018 -0700
+
+    [docs] More fixes
+
+ src/hb-ot-layout.cc | 10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
+
+commit 2d9198f205fafda557520d7206f9cfbf3373353f
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sat Oct 20 16:50:39 2018 -0700
+
+    [docs] Fix for hb-version.h being in src tree
+
+ docs/Makefile.am | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit 314b1af74f1fb71ea5cfcb5a58766773f0b2a5a1
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sat Oct 20 16:49:16 2018 -0700
+
+    [docs] Fix warning
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1260
+
+ src/hb-deprecated.h | 6 ------
+ src/hb-unicode.cc   | 1 +
+ 2 files changed, 1 insertion(+), 6 deletions(-)
+
+commit b713c1397718bf1f702a2ead2afb4dcee2c1505a
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sat Oct 20 14:56:28 2018 -0700
+
+    [kerx] Implement tuple-kerning in Format0
+
+ src/hb-aat-layout-kerx-table.hh | 44
+ ++++++++++++++++++++++++++++-------------
+ 1 file changed, 30 insertions(+), 14 deletions(-)
+
+commit 0a3b7a0fb0734a66926dfda5d95d3cacea8890ce
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sat Oct 20 13:14:07 2018 -0700
+
+    2.0.2
+
+ NEWS             | 6 ++++++
+ configure.ac     | 2 +-
+ src/hb-version.h | 4 ++--
+ 3 files changed, 9 insertions(+), 3 deletions(-)
+
 commit 8931bc4a6b41a2a41069b99cb5c551fa30216f0b
 Author: Ebrahim Byagowi <ebrahim at gnu.org>
 Date:   Sat Oct 20 23:23:32 2018 +0330

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/NEWS
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/NEWS	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/NEWS	2018-10-30 23:50:16 UTC (rev 49031)
@@ -1,3 +1,84 @@
+Overview of changes leading to 2.1.0
+Tuesday, October 30, 2018
+====================================
+- AAT shaping improvements:
+  o Allow user controlling AAT features, for whole buffer only currently.
+  o Several 'morx' fixes.
+  o Implement tuple-kerns in 'kerx'; Fixes kerning with Apple default
+    San Francisco fonts.
+- Support for color fonts:
+  o COLR/CPAL API to fetch color layers.
+  o SVG table to fetch SVG documents.
+  o CBDT/sbix API to fetch PNG images.
+- New 'name' table API.
+- hb-ot-font now uses 'VORG' table to correctly position CFF glyphs
+  in vertical layout.
+- Various fuzzer-found bug fixes.
+
+Changed API:
+
+A type and a macro added in 2.0.0 were renamed:
+
+hb_name_id_t -> hb_ot_name_id_t
+HB_NAME_ID_INVALID -> HB_OT_NAME_ID_INVALID
+
+New API:
+
++hb_color_t
++HB_COLOR
++hb_color_get_alpha()
++hb_color_get_red()
++hb_color_get_green()
++hb_color_get_blue()
++hb_ot_color_has_palettes()
++hb_ot_color_palette_get_count()
++hb_ot_color_palette_get_name_id()
++hb_ot_color_palette_color_get_name_id()
++hb_ot_color_palette_flags_t
++hb_ot_color_palette_get_flags()
++hb_ot_color_palette_get_colors()
++hb_ot_color_has_layers()
++hb_ot_color_layer_t
++hb_ot_color_glyph_get_layers()
++hb_ot_color_has_svg()
++hb_ot_color_glyph_reference_svg()
++hb_ot_color_has_png()
++hb_ot_color_glyph_reference_png()
+
++hb_ot_name_id_t
++HB_OT_NAME_ID_INVALID
++HB_OT_NAME_ID_COPYRIGHT
++HB_OT_NAME_ID_FONT_FAMILY
++HB_OT_NAME_ID_FONT_SUBFAMILY
++HB_OT_NAME_ID_UNIQUE_ID
++HB_OT_NAME_ID_FULL_NAME
++HB_OT_NAME_ID_VERSION_STRING
++HB_OT_NAME_ID_POSTSCRIPT_NAME
++HB_OT_NAME_ID_TRADEMARK
++HB_OT_NAME_ID_MANUFACTURER
++HB_OT_NAME_ID_DESIGNER
++HB_OT_NAME_ID_DESCRIPTION
++HB_OT_NAME_ID_VENDOR_URL
++HB_OT_NAME_ID_DESIGNER_URL
++HB_OT_NAME_ID_LICENSE
++HB_OT_NAME_ID_LICENSE_URL
++HB_OT_NAME_ID_TYPOGRAPHIC_FAMILY
++HB_OT_NAME_ID_TYPOGRAPHIC_SUBFAMILY
++HB_OT_NAME_ID_MAC_FULL_NAME
++HB_OT_NAME_ID_SAMPLE_TEXT
++HB_OT_NAME_ID_CID_FINDFONT_NAME
++HB_OT_NAME_ID_WWS_FAMILY
++HB_OT_NAME_ID_WWS_SUBFAMILY
++HB_OT_NAME_ID_LIGHT_BACKGROUND
++HB_OT_NAME_ID_DARK_BACKGROUND
++HB_OT_NAME_ID_VARIATIONS_PS_PREFIX
++hb_ot_name_entry_t
++hb_ot_name_list_names()
++hb_ot_name_get_utf8()
++hb_ot_name_get_utf16()
++hb_ot_name_get_utf32()
+
+
 Overview of changes leading to 2.0.2
 Saturday, October 20, 2018
 ====================================

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/RELEASING.md
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/RELEASING.md	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/RELEASING.md	2018-10-30 23:50:16 UTC (rev 49031)
@@ -8,7 +8,8 @@
      Document them in NEWS.  All API and API semantic changes should be clearly
      marked as API additions, API changes, or API deletions.  Document
      deprecations.  Ensure all new API / deprecations are in listed correctly in
-     docs/harfbuzz-sections.txt
+     docs/harfbuzz-sections.txt.  If release added new API, add entry for new
+     API index at the end of docs/harfbuzz-docs.xml.
 
      If there's a backward-incompatible API change (including deletions for API
      used anywhere), that's a release blocker.  Do NOT release.

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/configure.ac
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/configure.ac	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/configure.ac	2018-10-30 23:50:16 UTC (rev 49031)
@@ -1,6 +1,6 @@
 AC_PREREQ([2.64])
 AC_INIT([HarfBuzz],
-        [2.0.2],
+        [2.1.0],
         [https://github.com/harfbuzz/harfbuzz/issues/new],
         [harfbuzz],
         [http://harfbuzz.org/])

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/Makefile.am
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/Makefile.am	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/Makefile.am	2018-10-30 23:50:16 UTC (rev 49031)
@@ -170,7 +170,6 @@
 EXTRA_DIST += harfbuzz-subset.pc.in
 
 FUZZING_CPPFLAGS = \
-	-DHB_NDEBUG \
 	-DHB_MAX_NESTING_LEVEL=3 \
 	-DHB_SANITIZE_MAX_EDITS=3 \
 	-DHB_SANITIZE_MAX_OPS_FACTOR=3 \
@@ -269,7 +268,7 @@
 CLEANFILES += $(pkgconfig_DATA)
 
 
-DEF_FILES = harfbuzz.def harfbuzz-subset.def harfbuzz-icu.def harfbuzz-deprecated.def
+DEF_FILES = harfbuzz.def harfbuzz-subset.def harfbuzz-icu.def harfbuzz-deprecated-symbols.txt
 if HAVE_GOBJECT
 DEF_FILES += harfbuzz-gobject.def
 endif
@@ -283,8 +282,8 @@
 	$(AM_V_GEN) $(srcdir)/gen-def.py "$@" $^
 harfbuzz-gobject.def: $(HB_GOBJECT_headers)
 	$(AM_V_GEN) $(srcdir)/gen-def.py "$@" $^
-harfbuzz-deprecated.def: $(srcdir)/hb-deprecated.h
-	$(AM_V_GEN) $(srcdir)/gen-def.py "$@" $^
+harfbuzz-deprecated-symbols.txt: $(srcdir)/hb-deprecated.h
+	$(AM_V_GEN) PLAIN_LIST=1 $(srcdir)/gen-def.py "$@" $^
 
 
 GENERATORS = \
@@ -295,6 +294,7 @@
 	gen-os2-unicode-ranges.py \
 	gen-tag-table.py \
 	gen-use-table.py \
+	gen-vowel-constraints.py \
 	$(NULL)
 EXTRA_DIST += $(GENERATORS)
 
@@ -316,6 +316,10 @@
 	$(AM_V_GEN) $(builddir)/$^ > $(srcdir)/hb-ot-shape-complex-use-table.cc \
 	|| ($(RM) $(srcdir)/hb-ot-shape-complex-use-table.cc; false)
 
+vowel-constraints: gen-vowel-constraints.py HBIndicVowelConstraints.txt Scripts.txt
+	$(AM_V_GEN) $(builddir)/$^ > $(srcdir)/hb-ot-shape-complex-vowel-constraints.cc \
+	|| ($(RM) $(srcdir)/hb-ot-shape-complex-vowel-constraints.cc; false)
+
 emoji-table: gen-emoji-table.py emoji-data.txt
 	$(AM_V_GEN) $(builddir)/$^ > $(srcdir)/hb-unicode-emoji-table.hh \
 	|| ($(RM) $(srcdir)/hb-unicode-emoji-table.hh; false)
@@ -322,7 +326,7 @@
 
 built-sources: $(BUILT_SOURCES)
 
-.PHONY: unicode-tables arabic-table indic-table tag-table use-table emoji-table built-sources
+.PHONY: unicode-tables arabic-table indic-table tag-table use-table vowel-constraints emoji-table built-sources
 
 RAGEL_GENERATED = \
 	$(patsubst %,$(srcdir)/%,$(HB_BASE_RAGEL_GENERATED_sources)) \
@@ -343,6 +347,7 @@
 	main \
 	test \
 	test-buffer-serialize \
+	test-name-table \
 	test-size-params \
 	test-would-substitute \
 	$(NULL)
@@ -356,18 +361,31 @@
 test_CPPFLAGS = $(HBCFLAGS) $(FREETYPE_CFLAGS)
 test_LDADD = libharfbuzz.la $(HBLIBS) $(FREETYPE_LIBS)
 
-test_would_substitute_SOURCES = test-would-substitute.cc
-test_would_substitute_CPPFLAGS = $(HBCFLAGS) $(FREETYPE_CFLAGS)
-test_would_substitute_LDADD = libharfbuzz.la $(HBLIBS) $(FREETYPE_LIBS)
+test_buffer_serialize_SOURCES = test-buffer-serialize.cc
+test_buffer_serialize_CPPFLAGS = $(HBCFLAGS)
+test_buffer_serialize_LDADD = libharfbuzz.la $(HBLIBS)
 
+test_name_table_SOURCES = test-name-table.cc
+test_name_table_CPPFLAGS = $(HBCFLAGS)
+test_name_table_LDADD = libharfbuzz.la $(HBLIBS)
+
 test_size_params_SOURCES = test-size-params.cc
 test_size_params_CPPFLAGS = $(HBCFLAGS)
 test_size_params_LDADD = libharfbuzz.la $(HBLIBS)
 
-test_buffer_serialize_SOURCES = test-buffer-serialize.cc
-test_buffer_serialize_CPPFLAGS = $(HBCFLAGS)
-test_buffer_serialize_LDADD = libharfbuzz.la $(HBLIBS)
+test_would_substitute_SOURCES = test-would-substitute.cc
+test_would_substitute_CPPFLAGS = $(HBCFLAGS) $(FREETYPE_CFLAGS)
+test_would_substitute_LDADD = libharfbuzz.la $(HBLIBS) $(FREETYPE_LIBS)
 
+if HAVE_FREETYPE
+if HAVE_CAIRO_FT
+noinst_PROGRAMS += test-ot-color
+test_ot_color_SOURCES = test-ot-color.cc
+test_ot_color_CPPFLAGS = $(HBCFLAGS) $(FREETYPE_CFLAGS) $(CAIRO_FT_CFLAGS)
+test_ot_color_LDADD = libharfbuzz.la $(HBLIBS) $(FREETYPE_LIBS) $(CAIRO_LIBS) $(CAIRO_FT_LIBS)
+endif # HAVE_CAIRO_FT
+endif # HAVE_FREETYPE
+
 dist_check_SCRIPTS = \
 	check-c-linkage-decls.sh \
 	check-externs.sh \
@@ -403,15 +421,6 @@
 dump_use_data_CPPFLAGS = $(HBCFLAGS)
 dump_use_data_LDADD = libharfbuzz.la $(HBLIBS)
 
-if HAVE_FREETYPE
-if HAVE_CAIRO_FT
-check_PROGRAMS += dump-emoji
-dump_emoji_SOURCES = dump-emoji.cc
-dump_emoji_CPPFLAGS = $(HBCFLAGS) $(FREETYPE_CFLAGS) $(CAIRO_FT_CFLAGS)
-dump_emoji_LDADD = libharfbuzz.la $(HBLIBS) $(FREETYPE_LIBS) $(CAIRO_LIBS) $(CAIRO_FT_LIBS)
-endif # HAVE_CAIRO_FT
-endif # HAVE_FREETYPE
-
 check_PROGRAMS += test-ot-tag test-unicode-ranges
 TESTS += test-ot-tag test-unicode-ranges
 

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/Makefile.sources
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/Makefile.sources	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/Makefile.sources	2018-10-30 23:50:16 UTC (rev 49031)
@@ -33,7 +33,10 @@
 	hb-ot-hmtx-table.hh \
 	hb-ot-kern-table.hh \
 	hb-ot-maxp-table.hh \
+	hb-ot-name-language.cc \
+	hb-ot-name-language.hh \
 	hb-ot-name-table.hh \
+	hb-ot-name.cc \
 	hb-ot-os2-table.hh \
 	hb-ot-os2-unicode-ranges.hh \
 	hb-ot-post-macroman.hh \
@@ -101,6 +104,8 @@
 	hb-aat-layout-trak-table.hh \
 	hb-aat-layout.hh \
 	hb-aat-ltag-table.hh \
+	hb-aat-map.cc \
+	hb-aat-map.hh \
 	hb-ot-face.hh \
 	hb-ot-face.cc \
 	hb-ot-font.cc \
@@ -142,6 +147,8 @@
 	hb-ot-shape-complex-use.cc \
 	hb-ot-shape-complex-use.hh \
 	hb-ot-shape-complex-use-table.cc \
+	hb-ot-shape-complex-vowel-constraints.cc \
+	hb-ot-shape-complex-vowel-constraints.hh \
 	hb-ot-shape-complex.hh \
 	hb-ot-shape-normalize.hh \
 	hb-ot-shape-normalize.cc \
@@ -153,6 +160,7 @@
 	hb-ot-var-fvar-table.hh \
 	hb-ot-var-hvar-table.hh \
 	hb-ot-var-mvar-table.hh \
+	hb-ot-vorg-table.hh \
 	$(NULL)
 
 HB_OT_RAGEL_GENERATED_sources = \
@@ -170,12 +178,12 @@
 
 HB_OT_headers = \
 	hb-ot.h \
+	hb-ot-color.h \
 	hb-ot-font.h \
 	hb-ot-layout.h \
 	hb-ot-math.h \
 	hb-ot-name.h \
 	hb-ot-shape.h \
-	hb-ot-tag.h \
 	hb-ot-var.h \
 	$(NULL)
 

Deleted: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/dump-emoji.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/dump-emoji.cc	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/dump-emoji.cc	2018-10-30 23:50:16 UTC (rev 49031)
@@ -1,281 +0,0 @@
-/*
- * Copyright © 2018  Ebrahim Byagowi
- *
- *  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-static.cc"
-#include "hb-ot-color-cbdt-table.hh"
-#include "hb-ot-color-colr-table.hh"
-#include "hb-ot-color-cpal-table.hh"
-#include "hb-ot-color-sbix-table.hh"
-#include "hb-ot-color-svg-table.hh"
-
-#include "hb-ft.h"
-
-#include <ft2build.h>
-#include FT_FREETYPE_H
-#include FT_GLYPH_H
-
-#include <cairo.h>
-#include <cairo-ft.h>
-#include <cairo-svg.h>
-
-#ifdef HAVE_GLIB
-#include <glib.h>
-#endif
-#include <stdlib.h>
-#include <stdio.h>
-
-static void cbdt_callback (const uint8_t* data, unsigned int length,
-			   unsigned int group, unsigned int gid)
-{
-  char output_path[255];
-  sprintf (output_path, "out/cbdt-%d-%d.png", group, gid);
-  FILE *f = fopen (output_path, "wb");
-  fwrite (data, 1, length, f);
-  fclose (f);
-}
-
-static void sbix_callback (const uint8_t* data, unsigned int length,
-			   unsigned int group, unsigned int gid)
-{
-  char output_path[255];
-  sprintf (output_path, "out/sbix-%d-%d.png", group, gid);
-  FILE *f = fopen (output_path, "wb");
-  fwrite (data, 1, length, f);
-  fclose (f);
-}
-
-static void svg_callback (const uint8_t* data, unsigned int length,
-			  unsigned int start_glyph, unsigned int end_glyph)
-{
-  char output_path[255];
-  if (start_glyph == end_glyph)
-    sprintf (output_path, "out/svg-%d.svg", start_glyph);
-  else
-    sprintf (output_path, "out/svg-%d-%d.svg", start_glyph, end_glyph);
-
-  // append "z" if the content is gzipped
-  if ((data[0] == 0x1F) && (data[1] == 0x8B))
-    strcat (output_path, "z");
-
-  FILE *f = fopen (output_path, "wb");
-  fwrite (data, 1, length, f);
-  fclose (f);
-}
-
-static void colr_cpal_rendering (cairo_font_face_t *cairo_face, unsigned int upem, unsigned int num_glyphs,
-				 const OT::COLR *colr, const OT::CPAL *cpal)
-{
-  for (unsigned int i = 0; i < num_glyphs; ++i)
-  {
-    unsigned int first_layer_index, num_layers;
-    if (colr->get_base_glyph_record (i, &first_layer_index, &num_layers))
-    {
-      // Measure
-      cairo_text_extents_t extents;
-      {
-	cairo_surface_t *surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 1, 1);
-	cairo_t *cr = cairo_create (surface);
-	cairo_set_font_face (cr, cairo_face);
-	cairo_set_font_size (cr, upem);
-
-	cairo_glyph_t *glyphs = (cairo_glyph_t *) calloc (num_layers, sizeof (cairo_glyph_t));
-	for (unsigned int j = 0; j < num_layers; ++j)
-	{
-	  hb_codepoint_t glyph_id;
-	  unsigned int color_index;
-	  colr->get_layer_record (first_layer_index + j, &glyph_id, &color_index);
-	  glyphs[j].index = glyph_id;
-	}
-	cairo_glyph_extents (cr, glyphs, num_layers, &extents);
-	free (glyphs);
-	cairo_surface_destroy (surface);
-	cairo_destroy (cr);
-      }
-
-      // Add a slight margin
-      extents.width += extents.width / 10;
-      extents.height += extents.height / 10;
-      extents.x_bearing -= extents.width / 20;
-      extents.y_bearing -= extents.height / 20;
-
-      // Render
-      unsigned int pallet_count = cpal->get_palette_count ();
-      for (unsigned int pallet = 0; pallet < pallet_count; ++pallet) {
-	char output_path[255];
-
-	// If we have more than one pallet, use a better namin
-	if (pallet_count == 1)
-	  sprintf (output_path, "out/colr-%d.svg", i);
-	else
-	  sprintf (output_path, "out/colr-%d-%d.svg", i, pallet);
-
-	cairo_surface_t *surface = cairo_svg_surface_create (output_path, extents.width, extents.height);
-	cairo_t *cr = cairo_create (surface);
-	cairo_set_font_face (cr, cairo_face);
-	cairo_set_font_size (cr, upem);
-
-	for (unsigned int j = 0; j < num_layers; ++j)
-	{
-	  hb_codepoint_t glyph_id;
-	  unsigned int color_index;
-	  colr->get_layer_record (first_layer_index + j, &glyph_id, &color_index);
-
-	  uint32_t color = cpal->get_color_record_argb (color_index, pallet);
-	  int alpha = color & 0xFF;
-	  int r = (color >> 8) & 0xFF;
-	  int g = (color >> 16) & 0xFF;
-	  int b = (color >> 24) & 0xFF;
-	  cairo_set_source_rgba (cr, r / 255., g / 255., b / 255., alpha);
-
-	  cairo_glyph_t glyph;
-	  glyph.index = glyph_id;
-	  glyph.x = -extents.x_bearing;
-	  glyph.y = -extents.y_bearing;
-	  cairo_show_glyphs (cr, &glyph, 1);
-	}
-
-	cairo_surface_destroy (surface);
-	cairo_destroy (cr);
-      }
-    }
-  }
-}
-
-static void dump_glyphs (cairo_font_face_t *cairo_face, unsigned int upem,
-			 unsigned int num_glyphs)
-{
-  // Dump every glyph available on the font
-  return; // disabled for now
-  for (unsigned int i = 0; i < num_glyphs; ++i)
-  {
-    cairo_text_extents_t extents;
-    cairo_glyph_t glyph = {0};
-    glyph.index = i;
-
-    // Measure
-    {
-      cairo_surface_t *surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 1, 1);
-      cairo_t *cr = cairo_create (surface);
-      cairo_set_font_face (cr, cairo_face);
-      cairo_set_font_size (cr, upem);
-
-      cairo_glyph_extents (cr, &glyph, 1, &extents);
-      cairo_surface_destroy (surface);
-      cairo_destroy (cr);
-    }
-
-    // Add a slight margin
-    extents.width += extents.width / 10;
-    extents.height += extents.height / 10;
-    extents.x_bearing -= extents.width / 20;
-    extents.y_bearing -= extents.height / 20;
-
-    // Render
-    {
-      char output_path[255];
-      sprintf (output_path, "out/%d.svg", i);
-      cairo_surface_t *surface = cairo_svg_surface_create (output_path, extents.width, extents.height);
-      cairo_t *cr = cairo_create (surface);
-      cairo_set_font_face (cr, cairo_face);
-      cairo_set_font_size (cr, upem);
-      glyph.x = -extents.x_bearing;
-      glyph.y = -extents.y_bearing;
-      cairo_show_glyphs (cr, &glyph, 1);
-      cairo_surface_destroy (surface);
-      cairo_destroy (cr);
-    }
-  }
-}
-
-int main (int argc, char **argv)
-{
-  if (argc != 2) {
-    fprintf (stderr, "usage: %s font-file.ttf\n"
-		     "run it like `rm -rf out && mkdir out && %s font-file.ttf`\n",
-		     argv[0], argv[0]);
-    exit (1);
-  }
-
-
-  FILE *font_name_file = fopen ("out/_font_name_file.txt", "r");
-  if (font_name_file != nullptr)
-  {
-    fprintf (stderr, "Purge or move ./out folder in order to run a new dump\n");
-    exit (1);
-  }
-
-  font_name_file = fopen ("out/_font_name_file.txt", "w");
-  if (font_name_file == nullptr)
-  {
-    fprintf (stderr, "./out is not accessible, create it please\n");
-    exit (1);
-  }
-  fwrite (argv[1], 1, strlen (argv[1]), font_name_file);
-  fclose (font_name_file);
-
-  hb_blob_t *blob = hb_blob_create_from_file (argv[1]);
-  hb_face_t *face = hb_face_create (blob, 0);
-  hb_font_t *font = hb_font_create (face);
-
-  OT::CBDT::accelerator_t cbdt;
-  cbdt.init (face);
-  cbdt.dump (cbdt_callback);
-  cbdt.fini ();
-
-  OT::sbix::accelerator_t sbix;
-  sbix.init (face);
-  sbix.dump (sbix_callback);
-  sbix.fini ();
-
-  OT::SVG::accelerator_t svg;
-  svg.init (face);
-  svg.dump (svg_callback);
-  svg.fini ();
-
-  hb_blob_t* colr_blob = hb_sanitize_context_t ().reference_table<OT::COLR> (face);
-  const OT::COLR *colr = colr_blob->as<OT::COLR> ();
-
-  hb_blob_t* cpal_blob = hb_sanitize_context_t ().reference_table<OT::CPAL> (face);
-  const OT::CPAL *cpal = cpal_blob->as<OT::CPAL> ();
-
-  cairo_font_face_t *cairo_face;
-  {
-    FT_Library library;
-    FT_Init_FreeType (&library);
-    FT_Face ftface;
-    FT_New_Face (library, argv[1], 0, &ftface);
-    cairo_face = cairo_ft_font_face_create_for_ft_face (ftface, 0);
-  }
-  unsigned int num_glyphs = hb_face_get_glyph_count (face);
-  unsigned int upem = hb_face_get_upem (face);
-  colr_cpal_rendering (cairo_face, upem, num_glyphs, colr, cpal);
-  dump_glyphs (cairo_face, upem, num_glyphs);
-
-
-  hb_font_destroy (font);
-  hb_face_destroy (face);
-  hb_blob_destroy (blob);
-
-  return 0;
-}

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/gen-def.py
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/gen-def.py	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/gen-def.py	2018-10-30 23:50:16 UTC (rev 49031)
@@ -15,11 +15,10 @@
 	if h.endswith (".h"):
 		with io.open (h, encoding='utf-8') as f: headers_content.append (f.read ())
 
-result = """EXPORTS
+symbols = "\n".join (sorted (re.findall (r"^hb_\w+(?= \()", "\n".join (headers_content), re.M)))
+
+result = symbols if os.environ.get('PLAIN_LIST', '') else """EXPORTS
 %s
-LIBRARY lib%s-0.dll""" % (
-	"\n".join (sorted (re.findall (r"^hb_\w+(?= \()", "\n".join (headers_content), re.M))),
-	output_file.replace ('.def', '')
-)
+LIBRARY lib%s-0.dll""" % (symbols, output_file.replace ('.def', ''))
 
 with open (output_file, "w") as f: f.write (result)

Added: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/gen-vowel-constraints.py
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/gen-vowel-constraints.py	                        (rev 0)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/gen-vowel-constraints.py	2018-10-30 23:50:16 UTC (rev 49031)
@@ -0,0 +1,221 @@
+#!/usr/bin/python
+
+"""Generator of the function to prohibit certain vowel sequences.
+
+It creates ``_hb_preprocess_text_vowel_constraints``, which inserts dotted
+circles into sequences prohibited by the USE script development spec.
+This function should be used as the ``preprocess_text`` of an
+``hb_ot_complex_shaper_t``.
+"""
+
+from __future__ import absolute_import, division, print_function, unicode_literals
+
+import collections
+try:
+	from HTMLParser import HTMLParser
+	def write (s):
+		print (s.encode ('utf-8'), end='')
+except ImportError:
+	from html.parser import HTMLParser
+	def write (s):
+		sys.stdout.flush ()
+		sys.stdout.buffer.write (s.encode ('utf-8'))
+import itertools
+import io
+import sys
+
+if len (sys.argv) != 3:
+	print ('usage: ./gen-vowel-constraints.py HBIndicVowelConstraints.txt Scripts.txt', file=sys.stderr)
+	sys.exit (1)
+
+with io.open (sys.argv[2], encoding='utf-8') as f:
+	scripts_header = [f.readline () for i in range (2)]
+	scripts = {}
+	script_order = {}
+	for line in f:
+		j = line.find ('#')
+		if j >= 0:
+			line = line[:j]
+		fields = [x.strip () for x in line.split (';')]
+		if len (fields) == 1:
+			continue
+		uu = fields[0].split ('..')
+		start = int (uu[0], 16)
+		if len (uu) == 1:
+			end = start
+		else:
+			end = int (uu[1], 16)
+		script = fields[1]
+		for u in range (start, end + 1):
+			scripts[u] = script
+		if script not in script_order:
+			script_order[script] = start
+
+class ConstraintSet (object):
+	"""A set of prohibited code point sequences.
+
+	Args:
+		constraint (List[int]): A prohibited code point sequence.
+
+	"""
+	def __init__ (self, constraint):
+		# Either a list or a dictionary. As a list of code points, it
+		# represents a prohibited code point sequence. As a dictionary,
+		# it represents a set of prohibited sequences, where each item
+		# represents the set of prohibited sequences starting with the
+		# key (a code point) concatenated with any of the values
+		# (ConstraintSets).
+		self._c = constraint
+
+	def add (self, constraint):
+		"""Add a constraint to this set."""
+		if not constraint:
+			return
+		first = constraint[0]
+		rest = constraint[1:]
+		if isinstance (self._c, list):
+			if constraint == self._c[:len (constraint)]:
+				self._c = constraint
+			elif self._c != constraint[:len (self._c)]:
+				self._c = {self._c[0]: ConstraintSet (self._c[1:])}
+		if isinstance (self._c, dict):
+			if first in self._c:
+				self._c[first].add (rest)
+			else:
+				self._c[first] = ConstraintSet (rest)
+
+	def _indent (self, depth):
+		return ('  ' * depth).replace ('        ', '\t')
+
+	def __str__ (self, index=0, depth=4):
+		s = []
+		indent = self._indent (depth)
+		if isinstance (self._c, list):
+			if len (self._c) == 0:
+				s.append ('{}matched = true;\n'.format (indent))
+			elif len (self._c) == 1:
+				s.append ('{}matched = 0x{:04X}u == buffer->cur ({}).codepoint;\n'.format (indent, next (iter (self._c)), index or ''))
+			else:
+				s.append ('{}if (0x{:04X}u == buffer->cur ({}).codepoint &&\n'.format (indent, self._c[0], index))
+				s.append ('{}buffer->idx + {} < count &&\n'.format (self._indent (depth + 2), len (self._c)))
+				for i, cp in enumerate (self._c[1:], start=1):
+					s.append ('{}0x{:04X}u == buffer->cur ({}).codepoint{}\n'.format (
+						self._indent (depth + 2), cp, index + i, ')' if i == len (self._c) - 1 else ' &&'))
+				s.append ('{}{{\n'.format (indent))
+				for i in range (len (self._c)):
+					s.append ('{}buffer->next_glyph ();\n'.format (self._indent (depth + 1)))
+				s.append ('{}_output_dotted_circle (buffer);\n'.format (self._indent (depth + 1)))
+				s.append ('{}}}\n'.format (indent))
+		else:
+			s.append ('{}switch (buffer->cur ({}).codepoint)\n'.format(indent, index or ''))
+			s.append ('{}{{\n'.format (indent))
+			cases = collections.defaultdict (set)
+			for first, rest in sorted (self._c.items ()):
+				cases[rest.__str__ (index + 1, depth + 2)].add (first)
+			for body, labels in sorted (cases.items (), key=lambda b_ls: sorted (b_ls[1])[0]):
+				for i, cp in enumerate (sorted (labels)):
+					if i % 4 == 0:
+						s.append (self._indent (depth + 1))
+					else:
+						s.append (' ')
+					s.append ('case 0x{:04X}u:{}'.format (cp, '\n' if i % 4 == 3 else ''))
+				if len (labels) % 4 != 0:
+					s.append ('\n')
+				s.append (body)
+				s.append ('{}break;\n'.format (self._indent (depth + 2)))
+			s.append ('{}}}\n'.format (indent))
+		return ''.join (s)
+
+constraints = {}
+with io.open (sys.argv[1], encoding='utf-8') as f:
+	constraints_header = [f.readline ().strip () for i in range (2)]
+	for line in f:
+		j = line.find ('#')
+		if j >= 0:
+			line = line[:j]
+		constraint = [int (cp, 16) for cp in line.split (';')[0].split ()]
+		if not constraint: continue
+		assert 2 <= len (constraint), 'Prohibited sequence is too short: {}'.format (constraint)
+		script = scripts[constraint[0]]
+		if script in constraints:
+			constraints[script].add (constraint)
+		else:
+			constraints[script] = ConstraintSet (constraint)
+		assert constraints, 'No constraints found'
+
+print ('/* == Start of generated functions == */')
+print ('/*')
+print (' * The following functions are generated by running:')
+print (' *')
+print (' *   %s use Scripts.txt' % sys.argv[0])
+print (' *')
+print (' * on files with these headers:')
+print (' *')
+for line in constraints_header:
+	print (' * %s' % line.strip ())
+print (' *')
+for line in scripts_header:
+	print (' * %s' % line.strip ())
+print (' */')
+print ()
+print ('#include "hb-ot-shape-complex-vowel-constraints.hh"')
+print ()
+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 ('}')
+print ()
+print ('static void')
+print ('_output_with_dotted_circle (hb_buffer_t *buffer)')
+print ('{')
+print ('  _output_dotted_circle (buffer);')
+print ('  buffer->next_glyph ();')
+print ('}')
+print ()
+
+print ('void')
+print ('_hb_preprocess_text_vowel_constraints (const hb_ot_shape_plan_t *plan HB_UNUSED,')
+print ('\t\t\t\t       hb_buffer_t              *buffer,')
+print ('\t\t\t\t       hb_font_t                *font HB_UNUSED)')
+print ('{')
+print ('  /* UGLY UGLY UGLY business of adding dotted-circle in the middle of')
+print ('   * vowel-sequences that look like another vowel.  Data for each script')
+print ('   * collected from the USE script development spec.')
+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)')
+print ('  {')
+
+for script, constraints in sorted (constraints.items (), key=lambda s_c: script_order[s_c[0]]):
+	print ('    case HB_SCRIPT_{}:'.format (script.upper ()))
+	print ('      for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)')
+	print ('      {')
+	print ('\tbool matched = false;')
+	write (str (constraints))
+	print ('\tbuffer->next_glyph ();')
+	print ('\tif (matched) _output_with_dotted_circle (buffer);')
+	print ('      }')
+	print ('      processed = true;')
+	print ('      break;')
+	print ()
+
+print ('    default:')
+print ('      break;')
+print ('  }')
+print ('  if (processed)')
+print ('  {')
+print ('    if (buffer->idx < count)')
+print ('     buffer->next_glyph ();')
+print ('    if (likely (buffer->successful))')
+print ('      buffer->swap_buffers ();')
+print ('  }')
+print ('}')
+
+print ()
+print ('/* == End of generated functions == */')

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	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-common.hh	2018-10-30 23:50:16 UTC (rev 49031)
@@ -362,6 +362,7 @@
 }
 namespace AAT {
 
+enum { DELETED_GLYPH = 0xFFFF };
 
 /*
  * Extended State Table
@@ -376,7 +377,10 @@
     /* Note, we don't recurse-sanitize data because we don't access it.
      * That said, in our DEFINE_SIZE_STATIC we access T::static_size,
      * which ensures that data has a simple sanitize(). To be determined
-     * if I need to remove that as well. */
+     * if I need to remove that as well.
+     *
+     * XXX Because we are a template, our DEFINE_SIZE_STATIC assertion
+     * wouldn't be checked. */
     return_trace (c->check_struct (this));
   }
 
@@ -393,7 +397,7 @@
 template <>
 struct Entry<void>
 {
-  inline bool sanitize (hb_sanitize_context_t *c, unsigned int count) const
+  inline bool sanitize (hb_sanitize_context_t *c, unsigned int count /*XXX Unused?*/) const
   {
     TRACE_SANITIZE (this);
     return_trace (c->check_struct (this));
@@ -424,6 +428,7 @@
 
   inline unsigned int get_class (hb_codepoint_t glyph_id, unsigned int num_glyphs) const
   {
+    if (unlikely (glyph_id == DELETED_GLYPH)) return CLASS_DELETED_GLYPH;
     const HBUINT16 *v = (this+classTable).get_value (glyph_id, num_glyphs);
     return v ? (unsigned) *v : (unsigned) CLASS_OUT_OF_BOUNDS;
   }
@@ -530,7 +535,7 @@
 
     unsigned int state = StateTable<EntryData>::STATE_START_OF_TEXT;
     bool last_was_dont_advance = false;
-    for (buffer->idx = 0;;)
+    for (buffer->idx = 0; buffer->successful;)
     {
       unsigned int klass = buffer->idx < buffer->len ?
 			   machine.get_class (buffer->info[buffer->idx].codepoint, num_glyphs) :
@@ -564,8 +569,6 @@
       if (unlikely (!c->transition (this, entry)))
         break;
 
-      if (unlikely (!buffer->successful)) return;
-
       last_was_dont_advance = (entry->flags & context_t::DontAdvance) && buffer->max_ops-- > 0;
 
       state = entry->newState;

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-kerx-table.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-kerx-table.hh	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-kerx-table.hh	2018-10-30 23:50:16 UTC (rev 49031)
@@ -78,12 +78,14 @@
 
 struct KerxSubTableFormat0
 {
-  inline int get_kerning (hb_codepoint_t left, hb_codepoint_t right) const
+  inline int get_kerning (hb_codepoint_t left, hb_codepoint_t right,
+			  hb_aat_apply_context_t *c) const
   {
-    if (header.tupleCount) return 0; /* TODO kerxTupleKern */
     hb_glyph_pair_t pair = {left, right};
     int i = pairs.bsearch (pair);
-    return i == -1 ? 0 : pairs[i].get_kerning ();
+    if (i == -1) return 0;
+    int v = pairs[i].get_kerning ();
+    return kerxTupleKern (v, header.tupleCount, this, c);
   }
 
   inline bool apply (hb_aat_apply_context_t *c) const
@@ -93,13 +95,27 @@
     if (!c->plan->requested_kerning)
       return false;
 
-    hb_kern_machine_t<KerxSubTableFormat0> machine (*this);
-
+    accelerator_t accel (*this, c);
+    hb_kern_machine_t<accelerator_t> machine (accel);
     machine.kern (c->font, c->buffer, c->plan->kern_mask);
 
     return_trace (true);
   }
 
+  struct accelerator_t
+  {
+    const KerxSubTableFormat0 &table;
+    hb_aat_apply_context_t *c;
+
+    inline accelerator_t (const KerxSubTableFormat0 &table_,
+			  hb_aat_apply_context_t *c_) :
+			    table (table_), c (c_) {}
+
+    inline int get_kerning (hb_codepoint_t left, hb_codepoint_t right) const
+    { return table.get_kerning (left, right, c); }
+  };
+
+
   inline bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
@@ -147,7 +163,7 @@
 	kernAction (&table->machine + table->kernAction),
 	depth (0) {}
 
-    inline bool is_actionable (StateTableDriver<EntryData> *driver,
+    inline bool is_actionable (StateTableDriver<EntryData> *driver HB_UNUSED,
 			       const Entry<EntryData> *entry)
     {
       return entry->data.kernActionIndex != 0xFFFF;
@@ -273,15 +289,6 @@
     return_trace (true);
   }
 
-  inline bool sanitize (hb_sanitize_context_t *c) const
-  {
-    TRACE_SANITIZE (this);
-    return_trace (likely (c->check_struct (this) &&
-			  leftClassTable.sanitize (c, this) &&
-			  rightClassTable.sanitize (c, this) &&
-			  c->check_range (this, array)));
-  }
-
   struct accelerator_t
   {
     const KerxSubTableFormat2 &table;
@@ -295,6 +302,15 @@
     { return table.get_kerning (left, right, c); }
   };
 
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (likely (c->check_struct (this) &&
+			  leftClassTable.sanitize (c, this) &&
+			  rightClassTable.sanitize (c, this) &&
+			  c->check_range (this, array)));
+  }
+
   protected:
   KerxSubTableHeader	header;
   HBUINT32		rowWidth;	/* The width, in bytes, of a row in the table. */
@@ -349,7 +365,7 @@
 	mark_set (false),
 	mark (0) {}
 
-    inline bool is_actionable (StateTableDriver<EntryData> *driver,
+    inline bool is_actionable (StateTableDriver<EntryData> *driver HB_UNUSED,
 			       const Entry<EntryData> *entry)
     {
       return entry->data.ankrActionIndex != 0xFFFF;

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	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-morx-table.hh	2018-10-30 23:50:16 UTC (rev 49031)
@@ -30,6 +30,7 @@
 #include "hb-open-type.hh"
 #include "hb-aat-layout-common.hh"
 #include "hb-ot-layout-common.hh"
+#include "hb-aat-map.hh"
 
 /*
  * morx -- Extended Glyph Metamorphosis
@@ -64,11 +65,11 @@
       Verb		= 0x000F,	/* The type of rearrangement specified. */
     };
 
-    inline driver_context_t (const RearrangementSubtable *table) :
+    inline driver_context_t (const RearrangementSubtable *table HB_UNUSED) :
 	ret (false),
 	start (0), end (0) {}
 
-    inline bool is_actionable (StateTableDriver<EntryData> *driver,
+    inline bool is_actionable (StateTableDriver<EntryData> *driver HB_UNUSED,
 			       const Entry<EntryData> *entry)
     {
       return (entry->flags & Verb) && start < end;
@@ -362,7 +363,7 @@
 	ligature (table+table->ligature),
 	match_length (0) {}
 
-    inline bool is_actionable (StateTableDriver<EntryData> *driver,
+    inline bool is_actionable (StateTableDriver<EntryData> *driver HB_UNUSED,
 			       const Entry<EntryData> *entry)
     {
       return entry->flags & PerformAction;
@@ -373,6 +374,7 @@
       hb_buffer_t *buffer = driver->buffer;
       unsigned int flags = entry->flags;
 
+      DEBUG_MSG (APPLY, nullptr, "Ligature transition at %d", buffer->idx);
       if (flags & SetComponent)
       {
         if (unlikely (match_length >= ARRAY_LENGTH (match_positions)))
@@ -383,10 +385,12 @@
 	  match_length--;
 
 	match_positions[match_length++] = buffer->out_len;
+	DEBUG_MSG (APPLY, nullptr, "Set component at %d", buffer->out_len);
       }
 
       if (flags & PerformAction)
       {
+	DEBUG_MSG (APPLY, nullptr, "Perform action with %d", match_length);
 	unsigned int end = buffer->out_len;
 	unsigned int action_idx = entry->data.ligActionIndex;
 	unsigned int action;
@@ -395,15 +399,21 @@
 	if (unlikely (!match_length))
 	  return true;
 
-	/* TODO Only when ligation happens? */
-	buffer->merge_out_clusters (match_positions[0], buffer->out_len);
+	if (buffer->idx >= buffer->len)
+	  return false; // TODO Work on previous instead?
 
 	unsigned int cursor = match_length;
         do
 	{
 	  if (unlikely (!cursor))
+	  {
+	    /* Stack underflow.  Clear the stack. */
+	    DEBUG_MSG (APPLY, nullptr, "Stack underflow");
+	    match_length = 0;
 	    break;
+	  }
 
+	  DEBUG_MSG (APPLY, nullptr, "Moving to stack position %d", cursor - 1);
 	  buffer->move_to (match_positions[--cursor]);
 
 	  const HBUINT32 &actionData = ligAction[action_idx];
@@ -414,8 +424,6 @@
 	  if (uoffset & 0x20000000)
 	    uoffset |= 0xC0000000; /* Sign-extend. */
 	  int32_t offset = (int32_t) uoffset;
-	  if (buffer->idx >= buffer->len)
-	    return false; // TODO Work on previous instead?
 	  unsigned int component_idx = buffer->cur().codepoint + offset;
 
 	  const HBUINT16 &componentData = component[component_idx];
@@ -422,27 +430,35 @@
 	  if (unlikely (!componentData.sanitize (&c->sanitizer))) return false;
 	  ligature_idx += componentData;
 
+	  DEBUG_MSG (APPLY, nullptr, "Action store %d last %d",
+		     bool (action & LigActionStore),
+		     bool (action & LigActionLast));
 	  if (action & (LigActionStore | LigActionLast))
 	  {
+
 	    const GlyphID &ligatureData = ligature[ligature_idx];
 	    if (unlikely (!ligatureData.sanitize (&c->sanitizer))) return false;
 	    hb_codepoint_t lig = ligatureData;
 
+	    DEBUG_MSG (APPLY, nullptr, "Produced ligature %d", lig);
 	    buffer->replace_glyph (lig);
 
+	    unsigned int lig_end = match_positions[match_length - 1] + 1;
 	    /* Now go and delete all subsequent components. */
 	    while (match_length - 1 > cursor)
 	    {
+	      DEBUG_MSG (APPLY, nullptr, "Skipping ligature component");
 	      buffer->move_to (match_positions[--match_length]);
-	      buffer->skip_glyph ();
-	      end--;
+	      buffer->replace_glyph (DELETED_GLYPH);
 	    }
+
+	    buffer->move_to (lig_end);
+	    buffer->merge_out_clusters (match_positions[cursor], buffer->out_len);
 	  }
 
 	  action_idx++;
 	}
 	while (!(action & LigActionLast));
-	match_length = 0;
 	buffer->move_to (end);
       }
 
@@ -606,7 +622,7 @@
 	mark (0),
 	insertionAction (table+table->insertionAction) {}
 
-    inline bool is_actionable (StateTableDriver<EntryData> *driver,
+    inline bool is_actionable (StateTableDriver<EntryData> *driver HB_UNUSED,
 			       const Entry<EntryData> *entry)
     {
       return (entry->flags & (CurrentInsertCount | MarkedInsertCount)) &&
@@ -826,9 +842,9 @@
 
 struct Chain
 {
-  inline void apply (hb_aat_apply_context_t *c) const
+  inline hb_mask_t compile_flags (const hb_aat_map_builder_t *map) const
   {
-    uint32_t flags = defaultFlags;
+    hb_mask_t flags = defaultFlags;
     {
       /* Compute applicable flags.  TODO Should move this to planning
        * stage and take user-requested features into account. */
@@ -836,7 +852,10 @@
       for (unsigned i = 0; i < count; i++)
       {
         const Feature &feature = featureZ[i];
-	if (false) /* XXX Check if feature enabled... */
+        uint16_t type = feature.featureType;
+	uint16_t setting = feature.featureSetting;
+	const hb_aat_map_builder_t::feature_info_t *info = map->features.bsearch (type);
+	if (info && info->setting == setting)
 	{
 	  flags &= feature.disableFlags;
 	  flags |= feature.enableFlags;
@@ -843,7 +862,12 @@
 	}
       }
     }
+    return flags;
+  }
 
+  inline void apply (hb_aat_apply_context_t *c,
+		     hb_mask_t flags) const
+  {
     const ChainSubtable *subtable = &StructAtOffset<ChainSubtable> (&featureZ, featureZ[0].static_size * featureCount);
     unsigned int count = subtableCount;
     for (unsigned int i = 0; i < count; i++)
@@ -915,7 +939,7 @@
 
   inline unsigned int get_size (void) const { return length; }
 
-  inline bool sanitize (hb_sanitize_context_t *c, unsigned int version) const
+  inline bool sanitize (hb_sanitize_context_t *c, unsigned int version HB_UNUSED) const
   {
     TRACE_SANITIZE (this);
     if (!length.sanitize (c) ||
@@ -963,6 +987,34 @@
 
   inline bool has_data (void) const { return version != 0; }
 
+  inline void compile_flags (const hb_aat_map_builder_t *mapper,
+			     hb_aat_map_t *map) const
+  {
+    const Chain *chain = &firstChain;
+    unsigned int count = chainCount;
+    for (unsigned int i = 0; i < count; i++)
+    {
+      map->chain_flags.push (chain->compile_flags (mapper));
+      chain = &StructAfter<Chain> (*chain);
+    }
+  }
+
+  inline static void remove_deleted_glyphs (hb_buffer_t *buffer)
+  {
+    if (unlikely (!buffer->successful)) return;
+
+    buffer->clear_output ();
+    for (buffer->idx = 0; buffer->idx < buffer->len && buffer->successful;)
+    {
+      if (unlikely (buffer->cur().codepoint == DELETED_GLYPH))
+        buffer->skip_glyph ();
+      else
+        buffer->next_glyph ();
+    }
+    if (likely (buffer->successful))
+      buffer->swap_buffers ();
+  }
+
   inline void apply (hb_aat_apply_context_t *c) const
   {
     if (unlikely (!c->buffer->successful)) return;
@@ -971,10 +1023,11 @@
     unsigned int count = chainCount;
     for (unsigned int i = 0; i < count; i++)
     {
-      chain->apply (c);
+      chain->apply (c, c->plan->aat_map.chain_flags[i]);
       if (unlikely (!c->buffer->successful)) return;
       chain = &StructAfter<Chain> (*chain);
     }
+    remove_deleted_glyphs (c->buffer);
   }
 
   inline bool sanitize (hb_sanitize_context_t *c) const

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-trak-table.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-trak-table.hh	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-trak-table.hh	2018-10-30 23:50:16 UTC (rev 49031)
@@ -55,7 +55,7 @@
 			unsigned int index,
 			unsigned int nSizes) const
   {
-    return hb_array_t<FWORD> ((base+valuesZ).arrayZ, nSizes)[index];
+    return hb_array (base+valuesZ, nSizes)[index];
   }
 
   public:
@@ -88,7 +88,7 @@
 			       const void *base) const
   {
     unsigned int sizes = nSizes;
-    hb_array_t<Fixed> size_table ((base+sizeTable).arrayZ, sizes);
+    hb_array_t<const Fixed> size_table ((base+sizeTable).arrayZ, sizes);
 
     float s0 = size_table[idx].to_float ();
     float s1 = size_table[idx + 1].to_float ();
@@ -134,7 +134,7 @@
     if (sizes == 1) return trackTableEntry->get_value (base, 0, sizes);
 
     /* TODO bfind() */
-    hb_array_t<Fixed> size_table ((base+sizeTable).arrayZ, sizes);
+    hb_array_t<const Fixed> size_table ((base+sizeTable).arrayZ, sizes);
     unsigned int size_index;
     for (size_index = 0; size_index < sizes - 1; size_index++)
       if (size_table[size_index].to_float () >= csspx)
@@ -184,6 +184,8 @@
   {
     TRACE_APPLY (this);
 
+    hb_mask_t trak_mask = c->plan->trak_mask;
+
     const float ptem = c->font->ptem;
     if (unlikely (ptem <= 0.f))
       return_trace (false);
@@ -197,6 +199,7 @@
       hb_position_t advance_to_add = c->font->em_scalef_x (tracking);
       foreach_grapheme (buffer, start, end)
       {
+        if (!(buffer->info[start].mask & trak_mask)) continue;
 	buffer->pos[start].x_advance += advance_to_add;
 	buffer->pos[start].x_offset += offset_to_add;
       }
@@ -209,6 +212,7 @@
       hb_position_t advance_to_add = c->font->em_scalef_y (tracking);
       foreach_grapheme (buffer, start, end)
       {
+        if (!(buffer->info[start].mask & trak_mask)) continue;
 	buffer->pos[start].y_advance += advance_to_add;
 	buffer->pos[start].y_offset += offset_to_add;
       }

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	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout.cc	2018-10-30 23:50:16 UTC (rev 49031)
@@ -34,7 +34,7 @@
 #include "hb-aat-layout-kerx-table.hh"
 #include "hb-aat-layout-morx-table.hh"
 #include "hb-aat-layout-trak-table.hh"
-#include "hb-aat-ltag-table.hh" // Just so we compile it; unused otherwise.
+#include "hb-aat-ltag-table.hh"
 
 
 /* Table data courtesy of Apple.  Converted from mnemonics to integers
@@ -181,8 +181,22 @@
   if (unlikely (!hb_ot_shaper_face_data_ensure (face))) return Null(AAT::trak);
   return *(hb_ot_face_data (face)->trak.get ());
 }
+static inline const AAT::ltag&
+_get_ltag (hb_face_t *face)
+{
+  if (unlikely (!hb_ot_shaper_face_data_ensure (face))) return Null(AAT::ltag);
+  return *(hb_ot_face_data (face)->ltag.get ());
+}
 
 
+void
+hb_aat_layout_compile_map (const hb_aat_map_builder_t *mapper,
+			   hb_aat_map_t *map)
+{
+  _get_morx (mapper->face).compile_flags (mapper, map);
+}
+
+
 hb_bool_t
 hb_aat_layout_has_substitution (hb_face_t *face)
 {
@@ -240,3 +254,10 @@
   AAT::hb_aat_apply_context_t c (plan, font, buffer);
   trak.apply (&c);
 }
+
+hb_language_t
+_hb_aat_language_get (hb_face_t *face,
+		      unsigned int i)
+{
+  return _get_ltag (face).get_language (i);
+}

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout.hh	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout.hh	2018-10-30 23:50:16 UTC (rev 49031)
@@ -52,6 +52,9 @@
 HB_INTERNAL const hb_aat_feature_mapping_t *
 hb_aat_layout_find_feature_mapping (hb_tag_t tag);
 
+HB_INTERNAL void
+hb_aat_layout_compile_map (const hb_aat_map_builder_t *mapper,
+			   hb_aat_map_t *map);
 
 HB_INTERNAL hb_bool_t
 hb_aat_layout_has_substitution (hb_face_t *face);
@@ -77,4 +80,9 @@
 		     hb_font_t *font,
 		     hb_buffer_t *buffer);
 
+HB_INTERNAL hb_language_t
+_hb_aat_language_get (hb_face_t *face,
+		      unsigned int i);
+
+
 #endif /* HB_AAT_LAYOUT_HH */

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-ltag-table.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-ltag-table.hh	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-ltag-table.hh	2018-10-30 23:50:16 UTC (rev 49031)
@@ -25,7 +25,7 @@
 #ifndef HB_AAT_LTAG_TABLE_HH
 #define HB_AAT_LTAG_TABLE_HH
 
-#include "hb-aat-layout-common.hh"
+#include "hb-open-type.hh"
 
 /*
  * ltag -- Language Tag
@@ -36,9 +36,13 @@
 
 namespace AAT {
 
+using namespace OT;
 
+
 struct FTStringRange
 {
+  friend struct ltag;
+
   inline bool sanitize (hb_sanitize_context_t *c, const void *base) const
   {
     TRACE_SANITIZE (this);
@@ -58,10 +62,19 @@
 {
   static const hb_tag_t tableTag = HB_AAT_TAG_ltag;
 
+  inline hb_language_t get_language (unsigned int i) const
+  {
+    const FTStringRange &range = tagRanges[i];
+    return hb_language_from_string ((const char *) (this+range.tag).arrayZ,
+				    range.length);
+  }
+
   inline bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
-    return_trace (likely (c->check_struct (this) && tagRanges.sanitize (c, this)));
+    return_trace (likely (c->check_struct (this) &&
+			  version >= 1 &&
+			  tagRanges.sanitize (c, this)));
   }
 
   protected:

Added: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-map.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-map.cc	                        (rev 0)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-map.cc	2018-10-30 23:50:16 UTC (rev 49031)
@@ -0,0 +1,62 @@
+/*
+ * Copyright © 2009,2010  Red Hat, Inc.
+ * Copyright © 2010,2011,2013  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.
+ *
+ * Red Hat Author(s): Behdad Esfahbod
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#include "hb-aat-map.hh"
+
+#include "hb-aat-layout.hh"
+
+
+void hb_aat_map_builder_t::add_feature (hb_tag_t tag,
+					unsigned int value)
+{
+  const hb_aat_feature_mapping_t *mapping = hb_aat_layout_find_feature_mapping (tag);
+  if (!mapping) return;
+
+  feature_info_t *info = features.push();
+  info->type = mapping->aatFeatureType;
+  info->setting = value ? mapping->selectorToEnable : mapping->selectorToDisable;
+}
+
+void
+hb_aat_map_builder_t::compile (hb_aat_map_t  &m,
+			       const int    *coords HB_UNUSED,
+			       unsigned int  num_coords HB_UNUSED)
+{
+  /* Sort features and merge duplicates */
+  if (features.len)
+  {
+    features.qsort ();
+    unsigned int j = 0;
+    for (unsigned int i = 1; i < features.len; i++)
+      if (features[i].type != features[j].type)
+	features[++j] = features[i];
+    features.shrink (j + 1);
+  }
+
+  hb_aat_layout_compile_map (this, &m);
+}

Added: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-map.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-map.hh	                        (rev 0)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-map.hh	2018-10-30 23:50:16 UTC (rev 49031)
@@ -0,0 +1,106 @@
+/*
+ * 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
+ */
+
+#ifndef HB_AAT_MAP_HH
+#define HB_AAT_MAP_HH
+
+#include "hb.hh"
+
+
+struct hb_ot_shape_plan_t;
+
+struct hb_aat_map_t
+{
+  friend struct hb_aat_map_builder_t;
+
+  public:
+
+  inline void init (void)
+  {
+    memset (this, 0, sizeof (*this));
+    chain_flags.init ();
+  }
+  inline void fini (void)
+  {
+    chain_flags.fini ();
+  }
+
+  public:
+  hb_vector_t<hb_mask_t, 1> chain_flags;
+};
+
+struct hb_aat_map_builder_t
+{
+  public:
+
+  HB_INTERNAL hb_aat_map_builder_t (hb_face_t *face_,
+				    const hb_segment_properties_t *props_ HB_UNUSED) :
+				      face (face_)
+  {
+    features.init ();
+  }
+
+  ~hb_aat_map_builder_t (void)
+  {
+    features.fini ();
+  }
+
+  HB_INTERNAL void add_feature (hb_tag_t tag, unsigned int value=1);
+
+  HB_INTERNAL void compile (hb_aat_map_t  &m,
+			    const int    *coords,
+			    unsigned int  num_coords);
+
+  public:
+  struct feature_info_t
+  {
+    uint16_t  type;
+    uint16_t  setting;
+    unsigned  seq; /* For stable sorting only. */
+
+    static int cmp (const void *pa, const void *pb)
+    {
+      const feature_info_t *a = (const feature_info_t *) pa;
+      const feature_info_t *b = (const feature_info_t *) pb;
+      return (a->type != b->type) ? (a->type < b->type ? -1 : 1) :
+	     (a->seq < b->seq ? -1 : a->seq > b->seq ? 1 : 0);
+    }
+
+    int cmp (const short unsigned int *ty) const
+    {
+      return (type != *ty) ? (type < *ty ? -1 : 1) : 0;
+    }
+  };
+
+  public:
+  hb_face_t *face;
+
+  public:
+  hb_vector_t<feature_info_t, 32> features;
+};
+
+
+#endif /* HB_AAT_MAP_HH */

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-atomic.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-atomic.hh	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-atomic.hh	2018-10-30 23:50:16 UTC (rev 49031)
@@ -278,14 +278,11 @@
 };
 
 
-template <typename T> struct hb_remove_ptr_t { typedef T value; };
-template <typename T> struct hb_remove_ptr_t<T *> { typedef T value; };
-
 #define HB_ATOMIC_PTR_INIT(V)          {V}
 template <typename P>
 struct hb_atomic_ptr_t
 {
-  typedef typename hb_remove_ptr_t<P>::value T;
+  typedef typename hb_remove_pointer<P>::value T;
 
   inline void init (T* v_ = nullptr) { set_relaxed (v_); }
   inline void set_relaxed (T* v_) const { hb_atomic_ptr_impl_set_relaxed (&v, v_); }

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-blob.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-blob.cc	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-blob.cc	2018-10-30 23:50:16 UTC (rev 49031)
@@ -40,6 +40,19 @@
 #include <stdlib.h>
 
 
+/**
+ * SECTION: hb-blob
+ * @title: hb-blob
+ * @short_description: Binary data containers
+ * @include: hb.h
+ *
+ * Blobs wrap a chunk of binary data to handle lifecycle management of data
+ * while it is passed between client and HarfBuzz.  Blobs are primarily used
+ * to create font faces, but also to access font face tables, as well as
+ * pass around other binary data.
+ **/
+
+
 DEFINE_NULL_INSTANCE (hb_blob_t) =
 {
   HB_OBJECT_HEADER_STATIC,

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-blob.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-blob.hh	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-blob.hh	2018-10-30 23:50:16 UTC (rev 49031)
@@ -69,7 +69,6 @@
 
   public:
   hb_object_header_t header;
-  ASSERT_POD ();
 
   bool immutable;
 

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	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer-serialize.cc	2018-10-30 23:50:16 UTC (rev 49031)
@@ -58,7 +58,7 @@
  * @str is a valid buffer serialization format, use
  * hb_buffer_serialize_list_formats() to get the list of supported formats.
  *
- * Return value: 
+ * Return value:
  * The parsed #hb_buffer_serialize_format_t.
  *
  * Since: 0.9.7
@@ -319,7 +319,7 @@
  * ## json
  * TODO.
  *
- * Return value: 
+ * Return value:
  * The number of serialized items.
  *
  * Since: 0.9.7
@@ -425,15 +425,15 @@
  * hb_buffer_deserialize_glyphs:
  * @buffer: an #hb_buffer_t buffer.
  * @buf: (array length=buf_len):
- * @buf_len: 
+ * @buf_len:
  * @end_ptr: (out):
- * @font: 
- * @format: 
+ * @font:
+ * @format:
  *
- * 
  *
- * Return value: 
  *
+ * Return value:
+ *
  * Since: 0.9.7
  **/
 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	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer.cc	2018-10-30 23:50:16 UTC (rev 49031)
@@ -33,14 +33,15 @@
 
 /**
  * SECTION: hb-buffer
- * @title: Buffers
+ * @title: hb-buffer
  * @short_description: Input and output buffers
  * @include: hb.h
  *
  * Buffers serve dual role in HarfBuzz; they hold the input characters that are
- * passed hb_shape(), and after shaping they hold the output glyphs.
+ * passed to hb_shape(), and after shaping they hold the output glyphs.
  **/
 
+
 /**
  * hb_segment_properties_equal:
  * @a: first #hb_segment_properties_t to compare.
@@ -1665,7 +1666,7 @@
 		     unsigned int    item_offset,
 		     int             item_length)
 {
-  hb_buffer_add_utf<hb_utf32_t<> > (buffer, text, text_length, item_offset, item_length);
+  hb_buffer_add_utf<hb_utf32_t> (buffer, text, text_length, item_offset, item_length);
 }
 
 /**
@@ -1726,7 +1727,7 @@
 			  unsigned int          item_offset,
 			  int                   item_length)
 {
-  hb_buffer_add_utf<hb_utf32_t<false> > (buffer, text, text_length, item_offset, item_length);
+  hb_buffer_add_utf<hb_utf32_novalidate_t> (buffer, text, text_length, item_offset, item_length);
 }
 
 

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer.h
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer.h	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer.h	2018-10-30 23:50:16 UTC (rev 49031)
@@ -89,11 +89,12 @@
  * 				   of each line after line-breaking, or limiting
  * 				   the reshaping to a small piece around the
  * 				   breaking point only.
+ * @HB_GLYPH_FLAG_DEFINED: All the currently defined flags.
  */
 typedef enum { /*< flags >*/
   HB_GLYPH_FLAG_UNSAFE_TO_BREAK		= 0x00000001,
 
-  HB_GLYPH_FLAG_DEFINED			= 0x00000001 /*< skip >*/ /* OR of all defined flags */
+  HB_GLYPH_FLAG_DEFINED			= 0x00000001 /* OR of all defined flags */
 } hb_glyph_flags_t;
 
 HB_EXTERN hb_glyph_flags_t

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer.hh	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer.hh	2018-10-30 23:50:16 UTC (rev 49031)
@@ -86,7 +86,6 @@
 struct hb_buffer_t
 {
   hb_object_header_t header;
-  ASSERT_POD ();
 
   /* Information about how the text in the buffer should be treated */
   hb_unicode_funcs_t *unicode; /* Unicode functions */

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-common.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-common.cc	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-common.cc	2018-10-30 23:50:16 UTC (rev 49031)
@@ -36,6 +36,16 @@
 #endif
 
 
+/**
+ * SECTION:hb-common
+ * @title: hb-common
+ * @short_description: Common data types
+ * @include: hb.h
+ *
+ * Common data types used across HarfBuzz are defined here.
+ **/
+
+
 /* hb_options_t */
 
 hb_atomic_int_t _hb_options;
@@ -615,7 +625,20 @@
 
 /* hb_version */
 
+
 /**
+ * SECTION:hb-version
+ * @title: hb-version
+ * @short_description: Information about the version of HarfBuzz in use
+ * @include: hb.h
+ *
+ * These functions and macros allow accessing version of the HarfBuzz
+ * library used at compile- as well as run-time, and to direct code
+ * conditionally based on those versions, again, at compile- or run-time.
+ **/
+
+
+/**
  * hb_version:
  * @major: (out): Library major version component.
  * @minor: (out): Library minor version component.
@@ -761,7 +784,7 @@
 static void free_static_C_locale (void);
 #endif
 
-static struct hb_C_locale_lazy_loader_t : hb_lazy_loader_t<hb_remove_ptr_t<HB_LOCALE_T>::value,
+static struct hb_C_locale_lazy_loader_t : hb_lazy_loader_t<hb_remove_pointer<HB_LOCALE_T>::value,
 							  hb_C_locale_lazy_loader_t>
 {
   static inline HB_LOCALE_T create (void)
@@ -911,7 +934,7 @@
 
   has_start = parse_uint (pp, end, &feature->start);
 
-  if (parse_char (pp, end, ':')) {
+  if (parse_char (pp, end, ':') || parse_char (pp, end, ';')) {
     parse_uint (pp, end, &feature->end);
   } else {
     if (has_start)

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-common.h
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-common.h	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-common.h	2018-10-30 23:50:16 UTC (rev 49031)
@@ -33,6 +33,10 @@
 #ifndef HB_COMMON_H
 #define HB_COMMON_H
 
+#ifndef HB_EXTERN
+#define HB_EXTERN extern
+#endif
+
 #ifndef HB_BEGIN_DECLS
 # ifdef __cplusplus
 #  define HB_BEGIN_DECLS	extern "C" {
@@ -444,7 +448,51 @@
 hb_variation_to_string (hb_variation_t *variation,
 			char *buf, unsigned int size);
 
+/**
+ * hb_color_t:
+ *
+ * Data type for holding color values.
+ *
+ * Since: 2.1.0
+ */
+typedef uint32_t hb_color_t;
 
+#define HB_COLOR(b,g,r,a) ((hb_color_t) HB_TAG ((b),(g),(r),(a)))
+
+/**
+ * hb_color_get_alpha:
+ *
+ *
+ *
+ * Since: 2.1.0
+ */
+#define hb_color_get_alpha(color)	((color) & 0xFF)
+/**
+ * hb_color_get_red:
+ *
+ *
+ *
+ * Since: 2.1.0
+ */
+#define hb_color_get_red(color)		(((color) >> 8) & 0xFF)
+/**
+ * hb_color_get_green:
+ *
+ *
+ *
+ * Since: 2.1.0
+ */
+#define hb_color_get_green(color)	(((color) >> 16) & 0xFF)
+/**
+ * hb_color_get_blue:
+ *
+ *
+ *
+ * Since: 2.1.0
+ */
+#define hb_color_get_blue(color)	(((color) >> 24) & 0xFF)
+
+
 HB_END_DECLS
 
 #endif /* HB_COMMON_H */

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-coretext.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-coretext.cc	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-coretext.cc	2018-10-30 23:50:16 UTC (rev 49031)
@@ -35,6 +35,16 @@
 #include "hb-aat-layout.hh"
 #include <math.h>
 
+
+/**
+ * SECTION:hb-coretext
+ * @title: hb-coretext
+ * @short_description: CoreText integration
+ * @include: hb-coretext.h
+ *
+ * Functions for using HarfBuzz with the CoreText fonts.
+ **/
+
 /* https://developer.apple.com/documentation/coretext/1508745-ctfontcreatewithgraphicsfont */
 #define HB_CORETEXT_DEFAULT_FONT_SIZE 12.f
 
@@ -464,8 +474,8 @@
 	buffer->merge_clusters (i - 1, i + 1);
   }
 
-  hb_auto_t<hb_vector_t<feature_record_t> > feature_records;
-  hb_auto_t<hb_vector_t<range_record_t> > range_records;
+  hb_vector_t<feature_record_t> feature_records;
+  hb_vector_t<range_record_t> range_records;
 
   /*
    * Set up features.
@@ -474,7 +484,7 @@
   if (num_features)
   {
     /* Sort features by start/end events. */
-    hb_auto_t<hb_vector_t<feature_event_t> > feature_events;
+    hb_vector_t<feature_event_t> feature_events;
     for (unsigned int i = 0; i < num_features; i++)
     {
       const hb_aat_feature_mapping_t * mapping = hb_aat_layout_find_feature_mapping (features[i].tag);
@@ -513,7 +523,7 @@
     }
 
     /* Scan events and save features for each range. */
-    hb_auto_t<hb_vector_t<active_feature_t> > active_features;
+    hb_vector_t<active_feature_t> active_features;
     unsigned int last_index = 0;
     for (unsigned int i = 0; i < feature_events.len; i++)
     {
@@ -586,7 +596,7 @@
       } else {
         active_feature_t *feature = active_features.find (&event->feature);
 	if (feature)
-	  active_features.remove (feature - active_features.arrayZ());
+	  active_features.remove (feature - active_features);
       }
     }
   }

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-debug.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-debug.hh	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-debug.hh	2018-10-30 23:50:16 UTC (rev 49031)
@@ -173,7 +173,7 @@
 
   fprintf (stderr, "\n");
 }
-template <> inline void
+template <> inline void HB_PRINTF_FUNC(7, 0)
 _hb_debug_msg_va<0> (const char *what HB_UNUSED,
 		     const void *obj HB_UNUSED,
 		     const char *func HB_UNUSED,
@@ -192,7 +192,7 @@
 	       int level_dir,
 	       const char *message,
 	       ...) HB_PRINTF_FUNC(7, 8);
-template <int max_level> static inline void
+template <int max_level> static inline void HB_PRINTF_FUNC(7, 8)
 _hb_debug_msg (const char *what,
 	       const void *obj,
 	       const char *func,
@@ -216,7 +216,7 @@
 		  int level_dir HB_UNUSED,
 		  const char *message HB_UNUSED,
 		  ...) HB_PRINTF_FUNC(7, 8);
-template <> inline void
+template <> inline void HB_PRINTF_FUNC(7, 8)
 _hb_debug_msg<0> (const char *what HB_UNUSED,
 		  const void *obj HB_UNUSED,
 		  const char *func HB_UNUSED,

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-deprecated.h
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-deprecated.h	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-deprecated.h	2018-10-30 23:50:16 UTC (rev 49031)
@@ -36,6 +36,18 @@
 #include "hb-font.h"
 #include "hb-set.h"
 
+
+/**
+ * SECTION:hb-deprecated
+ * @title: hb-deprecated
+ * @short_description: Deprecated API
+ * @include: hb.h
+ *
+ * These API have been deprecated in favor of newer API, or because they
+ * were deemed unnecessary.
+ **/
+
+
 HB_BEGIN_DECLS
 
 #ifndef HB_DISABLE_DEPRECATED
@@ -146,12 +158,6 @@
 						   hb_unicode_decompose_compatibility_func_t func,
 						   void *user_data, hb_destroy_func_t destroy);
 
-/**
- * hb_unicode_decompose_compatibility:
- * 
- *
- * Deprecated: 2.0.0
- **/
 HB_EXTERN HB_DEPRECATED unsigned int
 hb_unicode_decompose_compatibility (hb_unicode_funcs_t *ufuncs,
 				    hb_codepoint_t      u,

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-dsalgs.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-dsalgs.hh	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-dsalgs.hh	2018-10-30 23:50:16 UTC (rev 49031)
@@ -313,6 +313,27 @@
  */
 
 static inline void *
+hb_bsearch (const void *key, const void *base,
+	    size_t nmemb, size_t size,
+	    int (*compar)(const void *_key, const void *_item))
+{
+  int min = 0, max = (int) nmemb - 1;
+  while (min <= max)
+  {
+    int mid = (min + max) / 2;
+    const void *p = (const void *) (((const char *) base) + (mid * size));
+    int c = compar (key, p);
+    if (c < 0)
+      max = mid - 1;
+    else if (c > 0)
+      min = mid + 1;
+    else
+      return (void *) p;
+  }
+  return nullptr;
+}
+
+static inline void *
 hb_bsearch_r (const void *key, const void *base,
 	      size_t nmemb, size_t size,
 	      int (*compar)(const void *_key, const void *_item, void *_arg),
@@ -321,7 +342,7 @@
   int min = 0, max = (int) nmemb - 1;
   while (min <= max)
   {
-    int mid = (min + max) / 2;
+    int mid = ((unsigned int) min + (unsigned int) max) / 2;
     const void *p = (const void *) (((const char *) base) + (mid * size));
     int c = compar (key, p, arg);
     if (c < 0)
@@ -490,43 +511,6 @@
 }
 
 
-template <typename Type>
-struct hb_auto_t : Type
-{
-  hb_auto_t (void) { Type::init (); }
-  /* Explicitly allow the following only for pointer and references,
-   * to avoid any accidental copies.
-   *
-   * Apparently if we template for all types, then gcc seems to
-   * capture a reference argument in the type, but clang doesn't,
-   * causing unwanted copies and bugs that come with it.  Ideally
-   * we should use C++11-style rvalue reference &&t1. */
-  template <typename T1> explicit hb_auto_t (T1 *t1) { Type::init (t1); }
-  template <typename T1> explicit hb_auto_t (T1 &t1) { Type::init (t1); }
-  ~hb_auto_t (void) { Type::fini (); }
-  private: /* Hide */
-  void init (void) {}
-  void fini (void) {}
-};
-
-template <typename T>
-struct hb_array_t
-{
-  inline hb_array_t (void) : arrayZ (nullptr), len (0) {}
-  inline hb_array_t (const T *array_, unsigned int len_) : arrayZ (array_), len (len_) {}
-
-  inline const T& operator [] (unsigned int i) const
-  {
-    if (unlikely (i >= len)) return Null(T);
-    return arrayZ[i];
-  }
-
-  inline void free (void) { ::free ((void *) arrayZ); arrayZ = nullptr; len = 0; }
-
-  const T *arrayZ;
-  unsigned int len;
-};
-
 struct hb_bytes_t
 {
   inline hb_bytes_t (void) : arrayZ (nullptr), len (0) {}
@@ -555,7 +539,43 @@
   unsigned int len;
 };
 
+template <typename T>
+struct hb_array_t
+{
+  inline hb_array_t (void) : arrayZ (nullptr), len (0) {}
+  inline hb_array_t (T *array_, unsigned int len_) : arrayZ (array_), len (len_) {}
 
+  inline T& operator [] (unsigned int i) const
+  {
+    if (unlikely (i >= len)) return Null(T);
+    return arrayZ[i];
+  }
+
+  inline hb_array_t<T> sub_array (unsigned int start_offset, unsigned int seg_count) const
+  {
+    unsigned int count = len;
+    if (unlikely (start_offset > count))
+      count = 0;
+    else
+      count -= start_offset;
+    count = MIN (count, seg_count);
+    return hb_array_t<T> (arrayZ + start_offset, count);
+  }
+
+  inline hb_bytes_t as_bytes (void) const
+  {
+    return hb_bytes_t (arrayZ, len * sizeof (T));
+  }
+
+  inline void free (void) { ::free ((void *) arrayZ); arrayZ = nullptr; len = 0; }
+
+  T *arrayZ;
+  unsigned int len;
+};
+template <typename T> static inline
+hb_array_t<T> hb_array (T *array, unsigned int len) { return hb_array_t<T> (array, len); }
+
+
 struct HbOpOr
 {
   static const bool passthru_left = true;

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-face.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-face.cc	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-face.cc	2018-10-30 23:50:16 UTC (rev 49031)
@@ -36,6 +36,19 @@
 
 
 /**
+ * SECTION:hb-face
+ * @title: hb-face
+ * @short_description: Font face objects
+ * @include: hb.h
+ *
+ * Font face is objects represent a single face in a font family.
+ * More exactly, a font face represents a single face in a binary font file.
+ * Font faces are typically built from a binary blob and a face index.
+ * Font faces are used to create fonts.
+ **/
+
+
+/**
  * hb_face_count:
  * @blob: a blob.
  *
@@ -666,7 +679,7 @@
 }
 
 static hb_blob_t *
-_hb_face_builder_reference_table (hb_face_t *face, hb_tag_t tag, void *user_data)
+_hb_face_builder_reference_table (hb_face_t *face HB_UNUSED, hb_tag_t tag, void *user_data)
 {
   hb_face_builder_data_t *data = (hb_face_builder_data_t *) user_data;
 

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-face.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-face.hh	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-face.hh	2018-10-30 23:50:16 UTC (rev 49031)
@@ -42,7 +42,6 @@
 struct hb_face_t
 {
   hb_object_header_t header;
-  ASSERT_POD ();
 
   hb_bool_t immutable;
 

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-font.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-font.cc	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-font.cc	2018-10-30 23:50:16 UTC (rev 49031)
@@ -34,6 +34,19 @@
 #include "hb-ot.h"
 
 
+/**
+ * SECTION:hb-font
+ * @title: hb-font
+ * @short_description: Font objects
+ * @include: hb.h
+ *
+ * Font objects represent a font face at a certain size and other
+ * parameters (pixels per EM, points per EM, variation settings.)
+ * Fonts are created from font faces, and are used as input to
+ * hb_shape() among other things.
+ **/
+
+
 /*
  * hb_font_funcs_t
  */
@@ -89,7 +102,7 @@
 static hb_bool_t
 hb_font_get_nominal_glyph_nil (hb_font_t *font HB_UNUSED,
 			       void *font_data HB_UNUSED,
-			       hb_codepoint_t unicode,
+			       hb_codepoint_t unicode HB_UNUSED,
 			       hb_codepoint_t *glyph,
 			       void *user_data HB_UNUSED)
 {
@@ -142,8 +155,8 @@
 static hb_bool_t
 hb_font_get_variation_glyph_nil (hb_font_t *font HB_UNUSED,
 				 void *font_data HB_UNUSED,
-				 hb_codepoint_t unicode,
-				 hb_codepoint_t variation_selector,
+				 hb_codepoint_t unicode HB_UNUSED,
+				 hb_codepoint_t variation_selector HB_UNUSED,
 				 hb_codepoint_t *glyph,
 				 void *user_data HB_UNUSED)
 {
@@ -276,7 +289,7 @@
 static hb_bool_t
 hb_font_get_glyph_h_origin_nil (hb_font_t *font HB_UNUSED,
 				void *font_data HB_UNUSED,
-				hb_codepoint_t glyph,
+				hb_codepoint_t glyph HB_UNUSED,
 				hb_position_t *x,
 				hb_position_t *y,
 				void *user_data HB_UNUSED)
@@ -301,7 +314,7 @@
 static hb_bool_t
 hb_font_get_glyph_v_origin_nil (hb_font_t *font HB_UNUSED,
 				void *font_data HB_UNUSED,
-				hb_codepoint_t glyph,
+				hb_codepoint_t glyph HB_UNUSED,
 				hb_position_t *x,
 				hb_position_t *y,
 				void *user_data HB_UNUSED)
@@ -326,8 +339,8 @@
 static hb_position_t
 hb_font_get_glyph_h_kerning_nil (hb_font_t *font HB_UNUSED,
 				 void *font_data HB_UNUSED,
-				 hb_codepoint_t left_glyph,
-				 hb_codepoint_t right_glyph,
+				 hb_codepoint_t left_glyph HB_UNUSED,
+				 hb_codepoint_t right_glyph HB_UNUSED,
 				 void *user_data HB_UNUSED)
 {
   return 0;
@@ -345,8 +358,8 @@
 static hb_position_t
 hb_font_get_glyph_v_kerning_nil (hb_font_t *font HB_UNUSED,
 				 void *font_data HB_UNUSED,
-				 hb_codepoint_t top_glyph,
-				 hb_codepoint_t bottom_glyph,
+				 hb_codepoint_t top_glyph HB_UNUSED,
+				 hb_codepoint_t bottom_glyph HB_UNUSED,
 				 void *user_data HB_UNUSED)
 {
   return 0;
@@ -364,7 +377,7 @@
 static hb_bool_t
 hb_font_get_glyph_extents_nil (hb_font_t *font HB_UNUSED,
 			       void *font_data HB_UNUSED,
-			       hb_codepoint_t glyph,
+			       hb_codepoint_t glyph HB_UNUSED,
 			       hb_glyph_extents_t *extents,
 			       void *user_data HB_UNUSED)
 {
@@ -389,8 +402,8 @@
 static hb_bool_t
 hb_font_get_glyph_contour_point_nil (hb_font_t *font HB_UNUSED,
 				     void *font_data HB_UNUSED,
-				     hb_codepoint_t glyph,
-				     unsigned int point_index,
+				     hb_codepoint_t glyph HB_UNUSED,
+				     unsigned int point_index HB_UNUSED,
 				     hb_position_t *x,
 				     hb_position_t *y,
 				     void *user_data HB_UNUSED)
@@ -416,7 +429,7 @@
 static hb_bool_t
 hb_font_get_glyph_name_nil (hb_font_t *font HB_UNUSED,
 			    void *font_data HB_UNUSED,
-			    hb_codepoint_t glyph,
+			    hb_codepoint_t glyph HB_UNUSED,
 			    char *name, unsigned int size,
 			    void *user_data HB_UNUSED)
 {
@@ -436,7 +449,8 @@
 static hb_bool_t
 hb_font_get_glyph_from_name_nil (hb_font_t *font HB_UNUSED,
 				 void *font_data HB_UNUSED,
-				 const char *name, int len, /* -1 means nul-terminated */
+				 const char *name HB_UNUSED,
+				 int len HB_UNUSED, /* -1 means nul-terminated */
 				 hb_codepoint_t *glyph,
 				 void *user_data HB_UNUSED)
 {

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-font.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-font.hh	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-font.hh	2018-10-30 23:50:16 UTC (rev 49031)
@@ -62,7 +62,6 @@
 struct hb_font_funcs_t
 {
   hb_object_header_t header;
-  ASSERT_POD ();
 
   hb_bool_t immutable;
 
@@ -102,7 +101,6 @@
 struct hb_font_t
 {
   hb_object_header_t header;
-  ASSERT_POD ();
 
   hb_bool_t immutable;
 

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ft.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ft.cc	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ft.cc	2018-10-30 23:50:16 UTC (rev 49031)
@@ -40,6 +40,17 @@
 #include FT_TRUETYPE_TABLES_H
 
 
+/**
+ * SECTION:hb-ft
+ * @title: hb-ft
+ * @short_description: FreeType integration
+ * @include: hb-ft.h
+ *
+ * Functions for using HarfBuzz with the FreeType library to provide face and
+ * font data.
+ **/
+
+
 /* TODO:
  *
  * In general, this file does a fine job of what it's supposed to do.
@@ -737,7 +748,7 @@
 static void free_static_ft_library (void);
 #endif
 
-static struct hb_ft_library_lazy_loader_t : hb_lazy_loader_t<hb_remove_ptr_t<FT_Library>::value,
+static struct hb_ft_library_lazy_loader_t : hb_lazy_loader_t<hb_remove_pointer<FT_Library>::value,
 							     hb_ft_library_lazy_loader_t>
 {
   static inline FT_Library create (void)

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-glib.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-glib.cc	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-glib.cc	2018-10-30 23:50:16 UTC (rev 49031)
@@ -33,6 +33,16 @@
 #include "hb-machinery.hh"
 
 
+/**
+ * SECTION:hb-glib
+ * @title: hb-glib
+ * @short_description: GLib integration
+ * @include: hb-glib.h
+ *
+ * Functions for using HarfBuzz with the GLib library to provide Unicode data.
+ **/
+
+
 #if !GLIB_CHECK_VERSION(2,29,14)
 static const hb_script_t
 glib_script_to_script[] =

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-gobject-structs.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-gobject-structs.cc	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-gobject-structs.cc	2018-10-30 23:50:16 UTC (rev 49031)
@@ -26,6 +26,18 @@
 
 #include "hb.hh"
 
+
+/**
+ * SECTION:hb-gobject
+ * @title: hb-gobject
+ * @short_description: GObject integration
+ * @include: hb-gobject.h
+ *
+ * Functions for using HarfBuzz with the GObject library to provide
+ * type data.
+ **/
+
+
 /* g++ didn't like older gtype.h gcc-only code path. */
 #include <glib.h>
 #if !GLIB_CHECK_VERSION(2,29,16)

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-graphite2.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-graphite2.cc	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-graphite2.cc	2018-10-30 23:50:16 UTC (rev 49031)
@@ -33,9 +33,19 @@
 
 #include <graphite2/Segment.h>
 
-#include "hb-ot-tag.h"
+#include "hb-ot-layout.h"
 
 
+/**
+ * SECTION:hb-graphite2
+ * @title: hb-graphite2
+ * @short_description: Graphite2 integration
+ * @include: hb-graphite2.h
+ *
+ * Functions for using HarfBuzz with the Graphite2 fonts.
+ **/
+
+
 HB_SHAPER_DATA_ENSURE_DEFINE(graphite2, face)
 HB_SHAPER_DATA_ENSURE_DEFINE(graphite2, font)
 
@@ -197,11 +207,14 @@
 {
 }
 
-/*
+/**
+ * hb_graphite2_font_get_gr_font:
+ *
  * Since: 0.9.10
+ * Deprecated: 1.4.2
  */
 gr_font *
-hb_graphite2_font_get_gr_font (hb_font_t *font)
+hb_graphite2_font_get_gr_font (hb_font_t *font HB_UNUSED)
 {
   return nullptr;
 }
@@ -243,7 +256,7 @@
 };
 
 hb_bool_t
-_hb_graphite2_shape (hb_shape_plan_t    *shape_plan,
+_hb_graphite2_shape (hb_shape_plan_t    *shape_plan HB_UNUSED,
 		     hb_font_t          *font,
 		     hb_buffer_t        *buffer,
 		     const hb_feature_t *features,

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-icu.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-icu.cc	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-icu.cc	2018-10-30 23:50:16 UTC (rev 49031)
@@ -40,6 +40,16 @@
 #include <unicode/uversion.h>
 
 
+/**
+ * SECTION:hb-icu
+ * @title: hb-icu
+ * @short_description: ICU integration
+ * @include: hb-icu.h
+ *
+ * Functions for using HarfBuzz with the ICU library to provide Unicode data.
+ **/
+
+
 hb_script_t
 hb_icu_script_to_script (UScriptCode script)
 {

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-machinery.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-machinery.hh	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-machinery.hh	2018-10-30 23:50:16 UTC (rev 49031)
@@ -82,10 +82,8 @@
 /* Check _assertion in a method environment */
 #define _DEFINE_INSTANCE_ASSERTION1(_line, _assertion) \
   inline void _instance_assertion_on_line_##_line (void) const \
-  { \
-    static_assert ((_assertion), ""); \
-    ASSERT_INSTANCE_POD (*this); /* Make sure it's POD. */ \
-  }
+  { static_assert ((_assertion), ""); } \
+  static_assert (true, "") /* So we require semicolon here. */
 # define _DEFINE_INSTANCE_ASSERTION0(_line, _assertion) _DEFINE_INSTANCE_ASSERTION1 (_line, _assertion)
 # define DEFINE_INSTANCE_ASSERTION(_assertion) _DEFINE_INSTANCE_ASSERTION0 (__LINE__, _assertion)
 
@@ -99,9 +97,9 @@
 
 #define DEFINE_SIZE_STATIC(size) \
   DEFINE_INSTANCE_ASSERTION (sizeof (*this) == (size)); \
+  inline unsigned int get_size (void) const { return (size); } \
   enum { static_size = (size) }; \
-  enum { min_size = (size) }; \
-  inline unsigned int get_size (void) const { return (size); }
+  enum { min_size = (size) }
 
 #define DEFINE_SIZE_UNION(size, _member) \
   DEFINE_INSTANCE_ASSERTION (0*sizeof(this->u._member.static_size) + sizeof(this->u._member) == (size)); \
@@ -114,11 +112,11 @@
 #define DEFINE_SIZE_ARRAY(size, array) \
   DEFINE_INSTANCE_ASSERTION (sizeof (*this) == (size) + VAR * sizeof (array[0])); \
   DEFINE_COMPILES_ASSERTION ((void) array[0].static_size) \
-  enum { min_size = (size) }; \
+  enum { min_size = (size) }
 
 #define DEFINE_SIZE_ARRAY_SIZED(size, array) \
-	DEFINE_SIZE_ARRAY(size, array); \
-	inline unsigned int get_size (void) const { return (size - array[0].min_size + array.get_size ()); }
+	inline unsigned int get_size (void) const { return (size - array.min_size + array.get_size ()); } \
+	DEFINE_SIZE_ARRAY(size, array)
 
 #define DEFINE_SIZE_ARRAY2(size, array1, array2) \
   DEFINE_INSTANCE_ASSERTION (sizeof (*this) == (size) + sizeof (this->array1[0]) + sizeof (this->array2[0])); \
@@ -136,7 +134,7 @@
   enum { max_debug_depth = MaxDebugDepth };
   typedef Return return_t;
   template <typename T, typename F>
-  inline bool may_dispatch (const T *obj, const F *format) { return true; }
+  inline bool may_dispatch (const T *obj HB_UNUSED, const F *format HB_UNUSED) { return true; }
   static return_t no_dispatch_return_value (void) { return Context::default_return_value (); }
 };
 
@@ -235,7 +233,7 @@
 
   inline const char *get_name (void) { return "SANITIZE"; }
   template <typename T, typename F>
-  inline bool may_dispatch (const T *obj, const F *format)
+  inline bool may_dispatch (const T *obj HB_UNUSED, const F *format)
   { return format->sanitize (this); }
   template <typename T>
   inline return_t dispatch (const T &obj) { return obj.sanitize (this); }
@@ -612,7 +610,7 @@
   }
   inline Supplier (const hb_vector_t<Type> *v)
   {
-    head = v->arrayZ();
+    head = *v;
     len = v->len;
     stride = sizeof (Type);
   }

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-map.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-map.cc	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-map.cc	2018-10-30 23:50:16 UTC (rev 49031)
@@ -27,7 +27,16 @@
 #include "hb-map.hh"
 
 
-/* Public API */
+/**
+ * SECTION:hb-map
+ * @title: hb-map
+ * @short_description: Object representing integer to integer mapping
+ * @include: hb.h
+ *
+ * Map objects are integer-to-integer hash-maps.  Currently they are
+ * not used in the HarfBuzz public API, but are provided for client's
+ * use if desired.
+ **/
 
 
 /**

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-map.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-map.hh	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-map.hh	2018-10-30 23:50:16 UTC (rev 49031)
@@ -44,6 +44,10 @@
 
 struct hb_map_t
 {
+  HB_NO_COPY_ASSIGN (hb_map_t);
+  inline hb_map_t (void) { init (); }
+  inline ~hb_map_t (void) { fini (); }
+
   struct item_t
   {
     hb_codepoint_t key;
@@ -77,9 +81,11 @@
   inline void fini_shallow (void)
   {
     free (items);
+    items = nullptr;
   }
   inline void fini (void)
   {
+    population = occupancy = 0;
     hb_object_fini (this);
     fini_shallow ();
   }

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-null.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-null.hh	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-null.hh	2018-10-30 23:50:16 UTC (rev 49031)
@@ -47,7 +47,7 @@
   static_assert (sizeof (Type) <= HB_NULL_POOL_SIZE, "Increase HB_NULL_POOL_SIZE.");
   return *reinterpret_cast<Type const *> (_hb_NullPool);
 }
-#define Null(Type) Null<Type>()
+#define Null(Type) Null<typename hb_remove_const<typename hb_remove_reference<Type>::value>::value>()
 
 /* Specializations for arbitrary-content Null objects expressed in bytes. */
 #define DECLARE_NULL_NAMESPACE_BYTES(Namespace, Type) \
@@ -90,7 +90,7 @@
   *obj = Null(Type);
   return *obj;
 }
-#define Crap(Type) Crap<Type>()
+#define Crap(Type) Crap<typename hb_remove_const<typename hb_remove_reference<Type>::value>::value>()
 
 template <typename Type>
 struct CrapOrNull {

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-object.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-object.hh	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-object.hh	2018-10-30 23:50:16 UTC (rev 49031)
@@ -195,14 +195,10 @@
 {
   hb_reference_count_t ref_count;
   hb_atomic_ptr_t<hb_user_data_array_t> user_data;
-
+};
 #define HB_OBJECT_HEADER_STATIC {HB_REFERENCE_COUNT_INIT, HB_ATOMIC_PTR_INIT (nullptr)}
 
-  private:
-  ASSERT_POD ();
-};
 
-
 /*
  * Object
  */
@@ -276,6 +272,7 @@
   {
     user_data->fini ();
     free (user_data);
+    user_data = nullptr;
   }
 }
 template <typename Type>

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	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-open-file.hh	2018-10-30 23:50:16 UTC (rev 49031)
@@ -330,8 +330,7 @@
   inline const ResourceRecord& get_resource_record (unsigned int i,
 						    const void *type_base) const
   {
-    return hb_array_t<ResourceRecord> ((type_base+resourcesZ).arrayZ,
-				       get_resource_count ()) [i];
+    return hb_array (type_base+resourcesZ, get_resource_count ())[i];
   }
 
   inline bool sanitize (hb_sanitize_context_t *c,

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	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-open-type.hh	2018-10-30 23:50:16 UTC (rev 49031)
@@ -149,9 +149,6 @@
 /* Glyph index number, same as uint16 (length = 16 bits) */
 typedef HBUINT16 GlyphID;
 
-/* Name-table index, same as uint16 (length = 16 bits) */
-typedef HBUINT16 NameID;
-
 /* Script/language-system/feature index */
 struct Index : HBUINT16 {
   enum { NOT_FOUND_INDEX = 0xFFFFu };
@@ -158,6 +155,8 @@
 };
 DECLARE_NULL_NAMESPACE_BYTES (OT, Index);
 
+typedef Index NameID;
+
 /* Offset, Null offset = 0 */
 template <typename Type, bool has_null=true>
 struct Offset : Type
@@ -336,6 +335,8 @@
 template <typename Type>
 struct UnsizedArrayOf
 {
+  HB_NO_CREATE_COPY_ASSIGN_TEMPLATE (UnsizedArrayOf, Type);
+
   inline const Type& operator [] (unsigned int i) const { return arrayZ[i]; }
   inline Type& operator [] (unsigned int i) { return arrayZ[i]; }
 
@@ -386,6 +387,14 @@
   public:
   DEFINE_SIZE_ARRAY (0, arrayZ);
 };
+} /* namespace OT */
+template <typename T> static inline
+hb_array_t<T> hb_array (OT::UnsizedArrayOf<T> &array, unsigned int len)
+{ return hb_array (array.arrayZ, len); }
+template <typename T> static inline
+hb_array_t<const T> hb_array (const OT::UnsizedArrayOf<T> &array, unsigned int len)
+{ return hb_array (array.arrayZ, len); }
+namespace OT {
 
 /* Unsized array of offset's */
 template <typename Type, typename OffsetType, bool has_null=true>
@@ -417,7 +426,9 @@
 template <typename Type, typename LenType=HBUINT16>
 struct ArrayOf
 {
-  const Type *sub_array (unsigned int start_offset, unsigned int *pcount /* IN/OUT */) const
+  HB_NO_CREATE_COPY_ASSIGN_TEMPLATE2 (ArrayOf, Type, LenType);
+
+  inline const Type *sub_array (unsigned int start_offset, unsigned int *pcount /* IN/OUT */) const
   {
     unsigned int count = len;
     if (unlikely (start_offset > count))
@@ -516,7 +527,6 @@
     ::qsort (arrayZ, len, sizeof (Type), Type::cmp);
   }
 
-  private:
   inline bool sanitize_shallow (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
@@ -533,8 +543,12 @@
 typedef ArrayOf<HBUINT8, HBUINT8> PString;
 
 /* Array of Offset's */
-template <typename Type, typename OffsetType=HBUINT16>
-struct OffsetArrayOf : ArrayOf<OffsetTo<Type, OffsetType> > {};
+template <typename Type>
+struct OffsetArrayOf : ArrayOf<OffsetTo<Type, HBUINT16> > {};
+template <typename Type>
+struct LOffsetArrayOf : ArrayOf<OffsetTo<Type, HBUINT32> > {};
+template <typename Type>
+struct LOffsetLArrayOf : ArrayOf<OffsetTo<Type, HBUINT32>, HBUINT32> {};
 
 /* Array of offsets relative to the beginning of the array itself. */
 template <typename Type>
@@ -579,6 +593,8 @@
 template <typename Type, typename LenType=HBUINT16>
 struct HeadlessArrayOf
 {
+  HB_NO_CREATE_COPY_ASSIGN_TEMPLATE2 (HeadlessArrayOf, Type, LenType);
+
   inline const Type& operator [] (unsigned int i) const
   {
     if (unlikely (i >= lenP1 || !i)) return Null(Type);
@@ -643,6 +659,8 @@
 template <typename Type, typename LenType=HBUINT16>
 struct ArrayOfM1
 {
+  HB_NO_CREATE_COPY_ASSIGN_TEMPLATE2 (ArrayOfM1, Type, LenType);
+
   inline const Type& operator [] (unsigned int i) const
   {
     if (unlikely (i > lenM1)) return Null(Type);
@@ -695,7 +713,7 @@
     int min = 0, max = (int) this->len - 1;
     while (min <= max)
     {
-      int mid = (min + max) / 2;
+      int mid = ((unsigned int) min + (unsigned int) max) / 2;
       int c = arr[mid].cmp (x);
       if (c < 0)
         max = mid - 1;
@@ -747,6 +765,7 @@
 template <typename Type, typename LenType=HBUINT16>
 struct BinSearchArrayOf : SortedArrayOf<Type, BinSearchHeader<LenType> > {};
 
+
 struct VarSizedBinSearchHeader
 {
 
@@ -772,6 +791,8 @@
 template <typename Type>
 struct VarSizedBinSearchArrayOf
 {
+  HB_NO_CREATE_COPY_ASSIGN_TEMPLATE (VarSizedBinSearchArrayOf, Type);
+
   inline const Type& operator [] (unsigned int i) const
   {
     if (unlikely (i >= header.nUnits)) return Null(Type);
@@ -818,7 +839,7 @@
     int min = 0, max = (int) header.nUnits - 1;
     while (min <= max)
     {
-      int mid = (min + max) / 2;
+      int mid = ((unsigned int) min + (unsigned int) max) / 2;
       const Type *p = (const Type *) (((const char *) &bytesZ) + (mid * size));
       int c = p->cmp (key);
       if (c < 0)

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	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-cmap-table.hh	2018-10-30 23:50:16 UTC (rev 49031)
@@ -228,6 +228,10 @@
 
   struct accelerator_t
   {
+    inline accelerator_t (void) {}
+    inline accelerator_t (const CmapSubtableFormat4 *subtable) { init (subtable); }
+    inline ~accelerator_t (void) { fini (); }
+
     inline void init (const CmapSubtableFormat4 *subtable)
     {
       segCount = subtable->segCountX2 / 2;
@@ -249,7 +253,7 @@
       unsigned int i;
       while (min <= max)
       {
-	int mid = (min + max) / 2;
+        int mid = ((unsigned int) min + (unsigned int) max) / 2;
 	if (codepoint < startCount[mid])
 	  max = mid - 1;
 	else if (codepoint > endCount[mid])
@@ -327,12 +331,12 @@
 
   inline bool get_glyph (hb_codepoint_t codepoint, hb_codepoint_t *glyph) const
   {
-    hb_auto_t<accelerator_t> accel (this);
+    accelerator_t accel (this);
     return accel.get_glyph_func (&accel, codepoint, glyph);
   }
   inline void collect_unicodes (hb_set_t *out) const
   {
-    hb_auto_t<accelerator_t> accel (this);
+    accelerator_t accel (this);
     accel.collect_unicodes (out);
   }
 
@@ -495,7 +499,7 @@
   {
     TRACE_SERIALIZE (this);
     if (unlikely (!c->extend_min (*this))) return_trace (false);
-    Supplier<CmapSubtableLongGroup> supplier (group_data.arrayZ(), group_data.len);
+    Supplier<CmapSubtableLongGroup> supplier (group_data, group_data.len);
     if (unlikely (!groups.serialize (c, supplier, group_data.len))) return_trace (false);
     return true;
   }
@@ -851,18 +855,6 @@
 
   struct subset_plan
   {
-    subset_plan(void)
-    {
-      format4_segments.init();
-      format12_groups.init();
-    }
-
-    ~subset_plan(void)
-    {
-      format4_segments.fini();
-      format12_groups.fini();
-    }
-
     inline size_t final_size() const
     {
       return 4 // header
@@ -871,9 +863,7 @@
           +  CmapSubtableFormat12::get_sub_table_size (this->format12_groups);
     }
 
-    // Format 4
     hb_vector_t<CmapSubtableFormat4::segment_plan> format4_segments;
-    // Format 12
     hb_vector_t<CmapSubtableLongGroup> format12_groups;
   };
 

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	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-color-cbdt-table.hh	2018-10-30 23:50:16 UTC (rev 49031)
@@ -166,7 +166,7 @@
     }
   }
 
-  inline bool get_extents (hb_glyph_extents_t *extents) const
+  inline bool get_extents (hb_glyph_extents_t *extents HB_UNUSED) const
   {
     switch (u.header.indexFormat) {
     case 2: case 5: /* TODO */
@@ -343,26 +343,30 @@
   }
 
   protected:
-  const IndexSubtableRecord *find_table (hb_codepoint_t glyph,
-					 unsigned int *x_ppem, unsigned int *y_ppem,
-					 const void **base) const
+  const BitmapSizeTable &choose_strike (hb_font_t *font) const
   {
-    /* TODO: Make it possible to select strike. */
+    unsigned count = sizeTables.len;
+    if (unlikely (!count))
+      return Null(BitmapSizeTable);
 
-    unsigned int count = sizeTables.len;
-    for (uint32_t i = 0; i < count; ++i)
+    unsigned int requested_ppem = MAX (font->x_ppem, font->y_ppem);
+    if (!requested_ppem)
+      requested_ppem = 1<<30; /* Choose largest strike. */
+    unsigned int best_i = 0;
+    unsigned int best_ppem = MAX (sizeTables[0].ppemX, sizeTables[0].ppemY);
+
+    for (unsigned int i = 1; i < count; i++)
     {
-      unsigned int startGlyphIndex = sizeTables.arrayZ[i].startGlyphIndex;
-      unsigned int endGlyphIndex = sizeTables.arrayZ[i].endGlyphIndex;
-      if (startGlyphIndex <= glyph && glyph <= endGlyphIndex)
+      unsigned int ppem = MAX (sizeTables[i].ppemX, sizeTables[i].ppemY);
+      if ((requested_ppem <= ppem && ppem < best_ppem) ||
+	  (requested_ppem > best_ppem && ppem > best_ppem))
       {
-	*x_ppem = sizeTables[i].ppemX;
-	*y_ppem = sizeTables[i].ppemY;
-	return sizeTables[i].find_table (glyph, this, base);
+	best_i = i;
+	best_ppem = ppem;
       }
     }
 
-    return nullptr;
+    return sizeTables[best_i];
   }
 
   protected:
@@ -376,13 +380,6 @@
 {
   static const hb_tag_t tableTag = HB_OT_TAG_CBDT;
 
-  inline bool sanitize (hb_sanitize_context_t *c) const
-  {
-    TRACE_SANITIZE (this);
-    return_trace (c->check_struct (this) &&
-		  likely (version.major == 2 || version.major == 3));
-  }
-
   struct accelerator_t
   {
     inline void init (hb_face_t *face)
@@ -409,16 +406,16 @@
       hb_blob_destroy (this->cbdt_blob);
     }
 
-    inline bool get_extents (hb_codepoint_t glyph, hb_glyph_extents_t *extents) const
+    inline bool get_extents (hb_font_t *font, hb_codepoint_t glyph,
+			     hb_glyph_extents_t *extents) const
     {
-      unsigned int x_ppem = upem, y_ppem = upem; /* TODO Use font ppem if available. */
-
       if (!cblc)
-	return false;  // Not a color bitmap font.
+	return false;
 
       const void *base;
-      const IndexSubtableRecord *subtable_record = this->cblc->find_table (glyph, &x_ppem, &y_ppem, &base);
-      if (!subtable_record || !x_ppem || !y_ppem)
+      const BitmapSizeTable &strike = this->cblc->choose_strike (font);
+      const IndexSubtableRecord *subtable_record = strike.find_table (glyph, cblc, &base);
+      if (!subtable_record || !strike.ppemX || !strike.ppemY)
 	return false;
 
       if (subtable_record->get_extents (extents, base))
@@ -437,12 +434,19 @@
 	  case 17: {
 	    if (unlikely (image_length < GlyphBitmapDataFormat17::min_size))
 	      return false;
-
 	    const GlyphBitmapDataFormat17& glyphFormat17 =
 		StructAtOffset<GlyphBitmapDataFormat17> (this->cbdt, image_offset);
 	    glyphFormat17.glyphMetrics.get_extents (extents);
+	    break;
 	  }
-	  break;
+	  case 18: {
+	    if (unlikely (image_length < GlyphBitmapDataFormat18::min_size))
+	      return false;
+	    const GlyphBitmapDataFormat18& glyphFormat18 =
+		StructAtOffset<GlyphBitmapDataFormat18> (this->cbdt, image_offset);
+	    glyphFormat18.glyphMetrics.get_extents (extents);
+	    break;
+	  }
 	  default:
 	    // TODO: Support other image formats.
 	    return false;
@@ -449,68 +453,75 @@
 	}
       }
 
-      /* Convert to the font units. */
-      extents->x_bearing *= upem / (float) x_ppem;
-      extents->y_bearing *= upem / (float) y_ppem;
-      extents->width *= upem / (float) x_ppem;
-      extents->height *= upem / (float) y_ppem;
+      /* Convert to font units. */
+      double x_scale = upem / (double) strike.ppemX;
+      double y_scale = upem / (double) strike.ppemY;
+      extents->x_bearing = round (extents->x_bearing * x_scale);
+      extents->y_bearing = round (extents->y_bearing * y_scale);
+      extents->width = round (extents->width * x_scale);
+      extents->height = round (extents->height * y_scale);
 
       return true;
     }
 
-    inline void dump (void (*callback) (const uint8_t* data, unsigned int length,
-        unsigned int group, unsigned int gid)) const
+    inline hb_blob_t* reference_png (hb_font_t      *font,
+				     hb_codepoint_t  glyph) const
     {
       if (!cblc)
-	return;  // Not a color bitmap font.
+	return hb_blob_get_empty ();
 
-      for (unsigned int i = 0; i < cblc->sizeTables.len; ++i)
+      const void *base;
+      const BitmapSizeTable &strike = this->cblc->choose_strike (font);
+      const IndexSubtableRecord *subtable_record = strike.find_table (glyph, cblc, &base);
+      if (!subtable_record || !strike.ppemX || !strike.ppemY)
+	return hb_blob_get_empty ();
+
+      unsigned int image_offset = 0, image_length = 0, image_format = 0;
+      if (!subtable_record->get_image_data (glyph, base, &image_offset, &image_length, &image_format))
+	return hb_blob_get_empty ();
+
       {
-        const BitmapSizeTable &sizeTable = cblc->sizeTables[i];
-        const IndexSubtableArray &subtable_array = cblc+sizeTable.indexSubtableArrayOffset;
-        for (unsigned int j = 0; j < sizeTable.numberOfIndexSubtables; ++j)
-        {
-          const IndexSubtableRecord &subtable_record = subtable_array.indexSubtablesZ[j];
-          for (unsigned int gid = subtable_record.firstGlyphIndex;
-                gid <= subtable_record.lastGlyphIndex; ++gid)
-          {
-            unsigned int image_offset = 0, image_length = 0, image_format = 0;
+	if (unlikely (image_offset > cbdt_len || cbdt_len - image_offset < image_length))
+	  return hb_blob_get_empty ();
 
-            if (!subtable_record.get_image_data (gid, &subtable_array,
-                  &image_offset, &image_length, &image_format))
-              continue;
+	switch (image_format)
+	{
+	  case 17: {
+	    if (unlikely (image_length < GlyphBitmapDataFormat17::min_size))
+	      return hb_blob_get_empty ();
+	    const GlyphBitmapDataFormat17& glyphFormat17 =
+	      StructAtOffset<GlyphBitmapDataFormat17> (this->cbdt, image_offset);
+	    return hb_blob_create_sub_blob (cbdt_blob,
+					    image_offset + GlyphBitmapDataFormat17::min_size,
+					    glyphFormat17.data.len);
+	  }
+	  case 18: {
+	    if (unlikely (image_length < GlyphBitmapDataFormat18::min_size))
+	      return hb_blob_get_empty ();
+	    const GlyphBitmapDataFormat18& glyphFormat18 =
+	      StructAtOffset<GlyphBitmapDataFormat18> (this->cbdt, image_offset);
+	    return hb_blob_create_sub_blob (cbdt_blob,
+					    image_offset + GlyphBitmapDataFormat18::min_size,
+					    glyphFormat18.data.len);
+	  }
+	  case 19: {
+	    if (unlikely (image_length < GlyphBitmapDataFormat19::min_size))
+	      return hb_blob_get_empty ();
+	    const GlyphBitmapDataFormat19& glyphFormat19 =
+	      StructAtOffset<GlyphBitmapDataFormat19> (this->cbdt, image_offset);
+	    return hb_blob_create_sub_blob (cbdt_blob,
+					    image_offset + GlyphBitmapDataFormat19::min_size,
+					    glyphFormat19.data.len);
+	  }
+	}
+      }
 
-            switch (image_format)
-            {
-            case 17: {
-              const GlyphBitmapDataFormat17& glyphFormat17 =
-                StructAtOffset<GlyphBitmapDataFormat17> (this->cbdt, image_offset);
-              callback ((const uint8_t *) &glyphFormat17.data.arrayZ,
-                glyphFormat17.data.len, i, gid);
-            }
-            break;
-            case 18: {
-              const GlyphBitmapDataFormat18& glyphFormat18 =
-                StructAtOffset<GlyphBitmapDataFormat18> (this->cbdt, image_offset);
-              callback ((const uint8_t *) &glyphFormat18.data.arrayZ,
-                glyphFormat18.data.len, i, gid);
-            }
-            break;
-            case 19: {
-              const GlyphBitmapDataFormat19& glyphFormat19 =
-                StructAtOffset<GlyphBitmapDataFormat19> (this->cbdt, image_offset);
-              callback ((const uint8_t *) &glyphFormat19.data.arrayZ,
-                glyphFormat19.data.len, i, gid);
-            }
-            break;
-            default:
-              continue;
-            }
-          }
-        }
-      }
+      return hb_blob_get_empty ();
     }
 
+    inline bool has_data () const
+    { return cbdt_len; }
+
     private:
     hb_blob_t *cblc_blob;
     hb_blob_t *cbdt_blob;
@@ -521,6 +532,12 @@
     unsigned int upem;
   };
 
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) &&
+		  likely (version.major == 2 || version.major == 3));
+  }
 
   protected:
   FixedVersion<>		version;

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	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-color-colr-table.hh	2018-10-30 23:50:16 UTC (rev 49031)
@@ -39,8 +39,6 @@
 
 struct LayerRecord
 {
-  friend struct COLR;
-
   inline bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
@@ -47,17 +45,34 @@
     return_trace (c->check_struct (this));
   }
 
-  protected:
-  GlyphID	glyphid;	/* Glyph ID of layer glyph */
-  HBUINT16	colorIdx;	/* Index value to use with a selected color palette */
   public:
+  GlyphID	glyphId;	/* Glyph ID of layer glyph */
+  Index		colorIdx;	/* Index value to use with a
+				 * selected color palette.
+				 * An index value of 0xFFFF
+				 * is a special case indicating
+				 * that the text foreground
+				 * color (defined by a
+				 * higher-level client) should
+				 * be used and shall not be
+				 * treated as actual index
+				 * into CPAL ColorRecord array. */
+  public:
   DEFINE_SIZE_STATIC (4);
 };
 
 struct BaseGlyphRecord
 {
-  friend struct COLR;
+  inline int cmp (hb_codepoint_t g) const
+  { return g < glyphId ? -1 : g > glyphId ? 1 : 0; }
 
+  static int cmp (const void *pa, const void *pb)
+  {
+    const hb_codepoint_t *a = (const hb_codepoint_t *) pa;
+    const BaseGlyphRecord *b = (const BaseGlyphRecord *) pb;
+    return b->cmp (*a);
+  }
+
   inline bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
@@ -64,29 +79,48 @@
     return_trace (likely (c->check_struct (this)));
   }
 
-  inline int cmp (hb_codepoint_t g) const {
-    return g < glyphid ? -1 : g > glyphid ? 1 : 0;
-  }
-
-  protected:
-  GlyphID	glyphid;	/* Glyph ID of reference glyph */
-  HBUINT16	firstLayerIdx;	/* Index to the layer record */
-  HBUINT16	numLayers;	/* Number of color layers associated with this glyph */
   public:
+  GlyphID	glyphId;	/* Glyph ID of reference glyph */
+  HBUINT16	firstLayerIdx;	/* Index (from beginning of
+				 * the Layer Records) to the
+				 * layer record. There will be
+				 * numLayers consecutive entries
+				 * for this base glyph. */
+  HBUINT16	numLayers;	/* Number of color layers
+				 * associated with this glyph */
+  public:
   DEFINE_SIZE_STATIC (6);
 };
 
-static int compare_bgr (const void *pa, const void *pb)
-{
-  const hb_codepoint_t *a = (const hb_codepoint_t *) pa;
-  const BaseGlyphRecord *b = (const BaseGlyphRecord *) pb;
-  return b->cmp (*a);
-}
-
 struct COLR
 {
   static const hb_tag_t tableTag = HB_OT_TAG_COLR;
 
+  inline bool has_data (void) const { return numBaseGlyphs; }
+
+  inline unsigned int get_glyph_layers (hb_codepoint_t       glyph,
+					unsigned int         start_offset,
+					unsigned int        *count, /* IN/OUT.  May be NULL. */
+					hb_ot_color_layer_t *layers /* OUT.     May be NULL. */) const
+  {
+    const BaseGlyphRecord &record = get_glyph_record (glyph);
+
+    hb_array_t<const LayerRecord> all_layers ((this+layersZ).arrayZ, numLayers);
+    hb_array_t<const LayerRecord> glyph_layers = all_layers.sub_array (record.firstLayerIdx,
+								       record.numLayers);
+    if (count)
+    {
+      hb_array_t<const LayerRecord> segment_layers = glyph_layers.sub_array (start_offset, *count);
+      *count = segment_layers.len;
+      for (unsigned int i = 0; i < segment_layers.len; i++)
+      {
+        layers[i].glyph = segment_layers.arrayZ[i].glyphId;
+        layers[i].color_index = segment_layers.arrayZ[i].colorIdx;
+      }
+    }
+    return glyph_layers.len;
+  }
+
   inline bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
@@ -95,45 +129,25 @@
 			  (this+layersZ).sanitize (c, numLayers)));
   }
 
-  inline bool get_base_glyph_record (hb_codepoint_t glyph_id,
-				     unsigned int *first_layer /* OUT */,
-				     unsigned int *num_layers /* OUT */) const
+  private:
+  inline const BaseGlyphRecord &get_glyph_record (hb_codepoint_t glyph_id) const
   {
-    const BaseGlyphRecord* record;
-    record = (BaseGlyphRecord *) bsearch (&glyph_id, &(this+baseGlyphsZ), numBaseGlyphs,
-					  sizeof (BaseGlyphRecord), compare_bgr);
-    if (unlikely (!record))
-      return false;
-
-    *first_layer = record->firstLayerIdx;
-    *num_layers = record->numLayers;
-    return true;
+    const BaseGlyphRecord *rec = (BaseGlyphRecord *) bsearch (&glyph_id,
+							      &(this+baseGlyphsZ),
+							      numBaseGlyphs,
+							      sizeof (BaseGlyphRecord),
+							      BaseGlyphRecord::cmp);
+    return rec ? *rec : Null(BaseGlyphRecord);
   }
 
-  inline bool get_layer_record (unsigned int record,
-				hb_codepoint_t *glyph_id /* OUT */,
-				unsigned int *palette_index /* OUT */) const
-  {
-    if (unlikely (record >= numLayers))
-    {
-      *glyph_id = 0;
-      *palette_index = 0xFFFF;
-      return false;
-    }
-    const LayerRecord &layer = (this+layersZ)[record];
-    *glyph_id = layer.glyphid;
-    *palette_index = layer.colorIdx;
-    return true;
-  }
-
   protected:
-  HBUINT16	version;	/* Table version number */
-  HBUINT16	numBaseGlyphs;	/* Number of Base Glyph Records */
+  HBUINT16	version;	/* Table version number (starts at 0). */
+  HBUINT16	numBaseGlyphs;	/* Number of Base Glyph Records. */
   LOffsetTo<UnsizedArrayOf<BaseGlyphRecord>, false>
 		baseGlyphsZ;	/* Offset to Base Glyph records. */
   LOffsetTo<UnsizedArrayOf<LayerRecord>, false>
-		layersZ;	/* Offset to Layer Records */
-  HBUINT16	numLayers;	/* Number of Layer Records */
+		layersZ;	/* Offset to Layer Records. */
+  HBUINT16	numLayers;	/* Number of Layer Records. */
   public:
   DEFINE_SIZE_STATIC (14);
 };

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-color-cpal-table.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-color-cpal-table.hh	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-color-cpal-table.hh	2018-10-30 23:50:16 UTC (rev 49031)
@@ -29,56 +29,11 @@
 #define HB_OT_COLOR_CPAL_TABLE_HH
 
 #include "hb-open-type.hh"
+#include "hb-ot-color.h"
+#include "hb-ot-name.h"
 
 
 /*
- * Following parts to be moved to a public header.
- */
-
-/**
- * hb_ot_color_t:
- * ARGB data type for holding color values.
- *
- * Since: REPLACEME
- */
-typedef uint32_t hb_ot_color_t;
-
-
-/**
- * hb_ot_color_palette_flags_t:
- * @HB_OT_COLOR_PALETTE_FLAG_DEFAULT: default indicating that there is nothing special to note about a color palette.
- * @HB_OT_COLOR_PALETTE_FLAG_FOR_LIGHT_BACKGROUND: flag indicating that the color palette is suitable for rendering text on light background.
- * @HB_OT_COLOR_PALETTE_FLAG_FOR_DARK_BACKGROUND: flag indicating that the color palette is suitable for rendering text on dark background.
- *
- * Since: REPLACEME
- */
-typedef enum { /*< flags >*/
-  HB_OT_COLOR_PALETTE_FLAG_DEFAULT = 0x00000000u,
-  HB_OT_COLOR_PALETTE_FLAG_FOR_LIGHT_BACKGROUND = 0x00000001u,
-  HB_OT_COLOR_PALETTE_FLAG_FOR_DARK_BACKGROUND = 0x00000002u,
-} hb_ot_color_palette_flags_t;
-
-// HB_EXTERN unsigned int
-// hb_ot_color_get_palette_count (hb_face_t *face);
-
-// HB_EXTERN unsigned int
-// hb_ot_color_get_palette_name_id (hb_face_t *face, unsigned int palette);
-
-// HB_EXTERN hb_ot_color_palette_flags_t
-// hb_ot_color_get_palette_flags (hb_face_t *face, unsigned int palette);
-
-// HB_EXTERN unsigned int
-// hb_ot_color_get_palette_colors (hb_face_t       *face,
-// 				unsigned int     palette, /* default=0 */
-// 				unsigned int     start_offset,
-// 				unsigned int    *color_count /* IN/OUT */,
-// 				hb_ot_color_t   *colors /* OUT */);
-
-
-
-
-
-/*
  * CPAL -- Color Palette
  * https://docs.microsoft.com/en-us/typography/opentype/spec/cpal
  */
@@ -92,43 +47,60 @@
 {
   friend struct CPAL;
 
-  inline bool
-  sanitize (hb_sanitize_context_t *c, const void *base, unsigned int palettes) const
+  private:
+  inline hb_ot_color_palette_flags_t
+  get_palette_flags (const void *base,
+		     unsigned int palette_index,
+		     unsigned int palette_count) const
   {
-    TRACE_SANITIZE (this);
-    return_trace (c->check_struct (this) &&
-		  (base+paletteFlagsZ).sanitize (c, palettes) &&
-		  (base+paletteLabelZ).sanitize (c, palettes) &&
-		  (base+paletteEntryLabelZ).sanitize (c, palettes));
+    if (!paletteFlagsZ) return HB_OT_COLOR_PALETTE_FLAG_DEFAULT;
+    return (hb_ot_color_palette_flags_t) (uint32_t)
+	   hb_array (base+paletteFlagsZ, palette_count)[palette_index];
   }
 
-  private:
-  inline hb_ot_color_palette_flags_t
-  get_palette_flags (const void *base, unsigned int palette) const
+  inline hb_ot_name_id_t
+  get_palette_name_id (const void *base,
+		       unsigned int palette_index,
+		       unsigned int palette_count) const
   {
-    // range checked at the CPAL caller
-    return (hb_ot_color_palette_flags_t) (uint32_t) (base+paletteFlagsZ)[palette];
+    if (!paletteLabelsZ) return HB_OT_NAME_ID_INVALID;
+    return hb_array (base+paletteLabelsZ, palette_count)[palette_index];
   }
 
-  inline unsigned int
-  get_palette_name_id (const void *base, unsigned int palette) const
+  inline hb_ot_name_id_t
+  get_color_name_id (const void *base,
+		     unsigned int color_index,
+		     unsigned int color_count) const
   {
-    // range checked at the CPAL caller
-    return (base+paletteLabelZ)[palette];
+    if (!colorLabelsZ) return HB_OT_NAME_ID_INVALID;
+    return hb_array (base+colorLabelsZ, color_count)[color_index];
   }
 
+  public:
+  inline bool sanitize (hb_sanitize_context_t *c,
+			const void *base,
+			unsigned int palette_count,
+			unsigned int color_count) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) &&
+		  (!paletteFlagsZ  || (base+paletteFlagsZ).sanitize (c, palette_count)) &&
+		  (!paletteLabelsZ || (base+paletteLabelsZ).sanitize (c, palette_count)) &&
+		  (!colorLabelsZ   || (base+colorLabelsZ).sanitize (c, color_count)));
+  }
+
   protected:
   LOffsetTo<UnsizedArrayOf<HBUINT32>, false>
 		paletteFlagsZ;		/* Offset from the beginning of CPAL table to
 					 * the Palette Type Array. Set to 0 if no array
 					 * is provided. */
-  LOffsetTo<UnsizedArrayOf<HBUINT16>, false>
-		paletteLabelZ;		/* Offset from the beginning of CPAL table to
-					 * the Palette Labels Array. Set to 0 if no
+  LOffsetTo<UnsizedArrayOf<NameID>, false>
+		paletteLabelsZ;		/* Offset from the beginning of CPAL table to
+					 * the palette labels array. Set to 0 if no
 					 * array is provided. */
-  LOffsetTo<UnsizedArrayOf<HBUINT16>, false>
-		paletteEntryLabelZ;	/* Offset from the beginning of CPAL table to
-					 * the Palette Entry Label Array. Set to 0
+  LOffsetTo<UnsizedArrayOf<NameID>, false>
+		colorLabelsZ;		/* Offset from the beginning of CPAL table to
+					 * the color labels array. Set to 0
 					 * if no array is provided. */
   public:
   DEFINE_SIZE_STATIC (12);
@@ -140,70 +112,70 @@
 {
   static const hb_tag_t tableTag = HB_OT_TAG_CPAL;
 
-  inline bool sanitize (hb_sanitize_context_t *c) const
-  {
-    TRACE_SANITIZE (this);
-    if (unlikely (!(c->check_struct (this) &&	// it checks colorRecordIndices also
-						// see #get_size
-		    (this+colorRecordsZ).sanitize (c, numColorRecords))))
-      return_trace (false);
+  inline bool has_data (void) const { return numPalettes; }
 
-    // Check for indices sanity so no need for doing it runtime
-    for (unsigned int i = 0; i < numPalettes; ++i)
-      if (unlikely (colorRecordIndicesZ[i] + numPaletteEntries > numColorRecords))
-	return_trace (false);
+  inline unsigned int get_size (void) const
+  { return min_size + numPalettes * sizeof (colorRecordIndicesZ[0]); }
 
-    // If version is zero, we are done here; otherwise we need to check tail also
-    if (version == 0)
-      return_trace (true);
+  inline unsigned int get_palette_count () const { return numPalettes; }
+  inline unsigned int get_color_count () const { return numColors; }
 
-    const CPALV1Tail &v1 = StructAfter<CPALV1Tail> (*this);
-    return_trace (likely (v1.sanitize (c, this, numPalettes)));
-  }
+  inline hb_ot_color_palette_flags_t get_palette_flags (unsigned int palette_index) const
+  { return v1 ().get_palette_flags (this, palette_index, numPalettes); }
 
-  inline unsigned int get_size (void) const
-  {
-    return min_size + numPalettes * sizeof (HBUINT16);
-  }
+  inline hb_ot_name_id_t get_palette_name_id (unsigned int palette_index) const
+  { return v1 ().get_palette_name_id (this, palette_index, numPalettes); }
 
-  inline hb_ot_color_palette_flags_t get_palette_flags (unsigned int palette) const
-  {
-    if (unlikely (version == 0 || palette >= numPalettes))
-      return HB_OT_COLOR_PALETTE_FLAG_DEFAULT;
+  inline hb_ot_name_id_t get_color_name_id (unsigned int color_index) const
+  { return v1 ().get_color_name_id (this, color_index, numColors); }
 
-    const CPALV1Tail& cpal1 = StructAfter<CPALV1Tail> (*this);
-    return cpal1.get_palette_flags (this, palette);
-  }
-
-  inline unsigned int get_palette_name_id (unsigned int palette) const
+  inline unsigned int get_palette_colors (unsigned int  palette_index,
+					  unsigned int  start_offset,
+					  unsigned int *color_count, /* IN/OUT.  May be NULL. */
+					  hb_color_t   *colors       /* OUT.     May be NULL. */) const
   {
-    if (unlikely (version == 0 || palette >= numPalettes))
-      return 0xFFFF;
-
-    const CPALV1Tail& cpal1 = StructAfter<CPALV1Tail> (*this);
-    return cpal1.get_palette_name_id (this, palette);
+    if (unlikely (palette_index >= numPalettes))
+    {
+      if (color_count) *color_count = 0;
+      return 0;
+    }
+    unsigned int start_index = colorRecordIndicesZ[palette_index];
+    hb_array_t<const BGRAColor> all_colors ((this+colorRecordsZ).arrayZ, numColorRecords);
+    hb_array_t<const BGRAColor> palette_colors = all_colors.sub_array (start_index,
+								       numColors);
+    if (color_count)
+    {
+      hb_array_t<const BGRAColor> segment_colors = palette_colors.sub_array (start_offset, *color_count);
+      /* Always return numColors colors per palette even if it has out-of-bounds start index. */
+      unsigned int count = MIN<unsigned int> (MAX<int> (numColors - start_offset, 0), *color_count);
+      *color_count = count;
+      for (unsigned int i = 0; i < count; i++)
+        colors[i] = segment_colors[i]; /* Bound-checked read. */
+    }
+    return numColors;
   }
 
-  inline unsigned int get_palette_count () const
+  private:
+  inline const CPALV1Tail& v1 (void) const
   {
-    return numPalettes;
+    if (version == 0) return Null(CPALV1Tail);
+    return StructAfter<CPALV1Tail> (*this);
   }
 
-  inline hb_ot_color_t
-  get_color_record_argb (unsigned int color_index, unsigned int palette) const
+  public:
+  inline bool sanitize (hb_sanitize_context_t *c) const
   {
-    if (unlikely (color_index >= numPaletteEntries || palette >= numPalettes))
-      return 0;
-
-    // No need for more range check as it is already done on #sanitize
-    const UnsizedArrayOf<BGRAColor>& color_records = this+colorRecordsZ;
-    return color_records[colorRecordIndicesZ[palette] + color_index];
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) &&
+		  (this+colorRecordsZ).sanitize (c, numColorRecords) &&
+		  colorRecordIndicesZ.sanitize (c, numPalettes) &&
+		  (version == 0 || v1 ().sanitize (c, this, numPalettes, numColors)));
   }
 
   protected:
   HBUINT16	version;		/* Table version number */
   /* Version 0 */
-  HBUINT16	numPaletteEntries;	/* Number of palette entries in each palette. */
+  HBUINT16	numColors;		/* Number of colors in each palette. */
   HBUINT16	numPalettes;		/* Number of palettes in the table. */
   HBUINT16	numColorRecords;	/* Total number of color records, combined for
 					 * all palettes. */

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-color-sbix-table.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-color-sbix-table.hh	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-color-sbix-table.hh	2018-10-30 23:50:16 UTC (rev 49031)
@@ -62,8 +62,6 @@
 
 struct SBIXStrike
 {
-  friend struct sbix;
-
   inline bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
@@ -71,10 +69,58 @@
 		  imageOffsetsZ.sanitize_shallow (c, c->get_num_glyphs () + 1));
   }
 
-  protected:
+  inline hb_blob_t *get_glyph_blob (unsigned int  glyph_id,
+				    hb_blob_t    *sbix_blob,
+				    hb_tag_t      file_type,
+				    int          *x_offset,
+				    int          *y_offset,
+				    unsigned int  num_glyphs,
+				    unsigned int *strike_ppem) const
+  {
+    if (unlikely (!ppem)) return hb_blob_get_empty (); /* To get Null() object out of the way. */
+
+    unsigned int retry_count = 8;
+    unsigned int sbix_len = sbix_blob->length;
+    unsigned int strike_offset = (const char *) this - (const char *) sbix_blob->data;
+    assert (strike_offset < sbix_len);
+
+  retry:
+    if (unlikely (glyph_id >= num_glyphs ||
+		  imageOffsetsZ[glyph_id + 1] <= imageOffsetsZ[glyph_id] ||
+		  imageOffsetsZ[glyph_id + 1] - imageOffsetsZ[glyph_id] <= SBIXGlyph::min_size ||
+		  (unsigned int) imageOffsetsZ[glyph_id + 1] > sbix_len - strike_offset))
+      return hb_blob_get_empty ();
+
+    unsigned int glyph_offset = strike_offset + (unsigned int) imageOffsetsZ[glyph_id] + SBIXGlyph::min_size;
+    unsigned int glyph_length = imageOffsetsZ[glyph_id + 1] - imageOffsetsZ[glyph_id] - SBIXGlyph::min_size;
+
+    const SBIXGlyph *glyph = &(this+imageOffsetsZ[glyph_id]);
+
+    if (glyph->graphicType == HB_TAG ('d','u','p','e'))
+    {
+      if (glyph_length >= 2)
+      {
+	glyph_id = *((HBUINT16 *) &glyph->data);
+	if (retry_count--)
+	  goto retry;
+      }
+      return hb_blob_get_empty ();
+    }
+
+    if (unlikely (file_type != glyph->graphicType))
+      return hb_blob_get_empty ();
+
+    if (strike_ppem) *strike_ppem = ppem;
+    if (x_offset) *x_offset = glyph->xOffset;
+    if (y_offset) *y_offset = glyph->yOffset;
+    return hb_blob_create_sub_blob (sbix_blob, glyph_offset, glyph_length);
+  }
+
+  public:
   HBUINT16	ppem;		/* The PPEM size for which this strike was designed. */
   HBUINT16	resolution;	/* The device pixel density (in PPI) for which this
 				 * strike was designed. (E.g., 96 PPI, 192 PPI.) */
+  protected:
   UnsizedArrayOf<LOffsetTo<SBIXGlyph> >
 		imageOffsetsZ;	/* Offset from the beginning of the strike data header
 				 * to bitmap data for an individual glyph ID. */
@@ -86,19 +132,17 @@
 {
   static const hb_tag_t tableTag = HB_OT_TAG_sbix;
 
-  inline bool sanitize (hb_sanitize_context_t *c) const
-  {
-    TRACE_SANITIZE (this);
-    return_trace (likely (c->check_struct (this) && strikes.sanitize (c, this)));
-  }
+  inline bool has_data (void) const { return version; }
 
+  inline const SBIXStrike &get_strike (unsigned int i) const { return this+strikes[i]; }
+
   struct accelerator_t
   {
     inline void init (hb_face_t *face)
     {
       sbix_blob = hb_sanitize_context_t().reference_table<sbix> (face);
-      sbix_len = hb_blob_get_length (sbix_blob);
-      sbix_table = sbix_blob->as<sbix> ();
+      table = sbix_blob->as<sbix> ();
+      num_glyphs = face->get_num_glyphs ();
     }
 
     inline void fini (void)
@@ -106,36 +150,147 @@
       hb_blob_destroy (sbix_blob);
     }
 
-    inline void dump (void (*callback) (const uint8_t* data, unsigned int length,
-					unsigned int group, unsigned int gid)) const
+    inline bool has_data () const
     {
-      for (unsigned group = 0; group < sbix_table->strikes.len; ++group)
+      /* XXX Fix somehow and remove next line.
+       * https://github.com/harfbuzz/harfbuzz/issues/1146 */
+      if (!num_glyphs) return false;
+      return table->has_data ();
+    }
+
+    inline bool get_extents (hb_font_t          *font,
+			     hb_codepoint_t      glyph,
+			     hb_glyph_extents_t *extents) const
+    {
+      /* We only support PNG right now, and following function checks type. */
+      return get_png_extents (font, glyph, extents);
+    }
+
+    inline hb_blob_t *reference_png (hb_font_t      *font,
+				     hb_codepoint_t  glyph_id,
+				     int            *x_offset,
+				     int            *y_offset,
+				     unsigned int   *available_ppem) const
+    {
+      return choose_strike (font).get_glyph_blob (glyph_id, sbix_blob,
+						  HB_TAG ('p','n','g',' '),
+						  x_offset, y_offset,
+						  num_glyphs, available_ppem);
+    }
+
+    private:
+
+    inline const SBIXStrike &choose_strike (hb_font_t *font) const
+    {
+      unsigned count = table->strikes.len;
+      if (unlikely (!count))
+        return Null(SBIXStrike);
+
+      unsigned int requested_ppem = MAX (font->x_ppem, font->y_ppem);
+      if (!requested_ppem)
+        requested_ppem = 1<<30; /* Choose largest strike. */
+      /* TODO Add DPI sensitivity as well? */
+      unsigned int best_i = 0;
+      unsigned int best_ppem = table->get_strike (0).ppem;
+
+      for (unsigned int i = 1; i < count; i++)
       {
-	const SBIXStrike &strike = sbix_table->strikes[group](sbix_table);
-	for (unsigned int glyph = 0; glyph < num_glyphs; ++glyph)
-	  if (strike.imageOffsetsZ[glyph + 1] - strike.imageOffsetsZ[glyph] > 0)
-	  {
-	    const SBIXGlyph &sbixGlyph = strike.imageOffsetsZ[glyph]((const void *) &strike);
-	    callback ((const uint8_t*) &sbixGlyph.data,
-		      strike.imageOffsetsZ[glyph + 1] - strike.imageOffsetsZ[glyph] - 8,
-		      group, glyph);
-	  }
+	unsigned int ppem = (table->get_strike (i)).ppem;
+	if ((requested_ppem <= ppem && ppem < best_ppem) ||
+	    (requested_ppem > best_ppem && ppem > best_ppem))
+	{
+	  best_i = i;
+	  best_ppem = ppem;
+	}
       }
+
+      return table->get_strike (best_i);
     }
 
+    struct PNGHeader
+    {
+      HBUINT8	signature[8];
+      struct
+      {
+        struct
+	{
+	  HBUINT32	length;
+	  Tag		type;
+	}		header;
+	HBUINT32	width;
+	HBUINT32	height;
+	HBUINT8		bitDepth;
+	HBUINT8		colorType;
+	HBUINT8		compressionMethod;
+	HBUINT8		filterMethod;
+	HBUINT8		interlaceMethod;
+      } IHDR;
+
+      public:
+      DEFINE_SIZE_STATIC (29);
+    };
+
+    inline bool get_png_extents (hb_font_t          *font,
+				 hb_codepoint_t      glyph,
+				 hb_glyph_extents_t *extents) const
+    {
+      /* Following code is safe to call even without data (XXX currently
+       * isn't.  See has_data()), but faster to short-circuit. */
+      if (!has_data ())
+        return false;
+
+      int x_offset = 0, y_offset = 0;
+      unsigned int strike_ppem = 0;
+      hb_blob_t *blob = reference_png (font, glyph, &x_offset, &y_offset, &strike_ppem);
+
+      if (unlikely (blob->length < sizeof (PNGHeader)))
+      {
+        hb_blob_destroy (blob);
+        return false;
+      }
+
+      const PNGHeader &png = *blob->as<PNGHeader>();
+
+      extents->x_bearing = x_offset;
+      extents->y_bearing = y_offset;
+      extents->width     = png.IHDR.width;
+      extents->height    = png.IHDR.height;
+
+      /* Convert to font units. */
+      if (strike_ppem)
+      {
+	double scale = font->face->upem / (double) strike_ppem;
+	extents->x_bearing = round (extents->x_bearing * scale);
+	extents->y_bearing = round (extents->y_bearing * scale);
+	extents->width = round (extents->width * scale);
+	extents->height = round (extents->height * scale);
+      }
+
+      hb_blob_destroy (blob);
+
+      return true;
+    }
+
     private:
     hb_blob_t *sbix_blob;
-    const sbix *sbix_table;
+    const sbix *table;
 
-    unsigned int sbix_len;
     unsigned int num_glyphs;
   };
 
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (likely (c->check_struct (this) &&
+			  version >= 1 &&
+			  strikes.sanitize (c, this)));
+  }
+
   protected:
   HBUINT16	version;	/* Table version number — set to 1 */
   HBUINT16	flags;		/* Bit 0: Set to 1. Bit 1: Draw outlines.
 				 * Bits 2 to 15: reserved (set to 0). */
-  LArrayOf<LOffsetTo<SBIXStrike> >
+  LOffsetLArrayOf<SBIXStrike>
 		strikes;	/* Offsets from the beginning of the 'sbix'
 				 * table to data for each individual bitmap strike. */
   public:
@@ -142,6 +297,8 @@
   DEFINE_SIZE_ARRAY (8, strikes);
 };
 
+struct sbix_accelerator_t : sbix::accelerator_t {};
+
 } /* namespace OT */
 
 #endif /* HB_OT_COLOR_SBIX_TABLE_HH */

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-color-svg-table.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-color-svg-table.hh	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-color-svg-table.hh	2018-10-30 23:50:16 UTC (rev 49031)
@@ -40,13 +40,21 @@
 
 struct SVGDocumentIndexEntry
 {
-  friend struct SVG;
+  inline int cmp (hb_codepoint_t g) const
+  { return g < startGlyphID ? -1 : g > endGlyphID ? 1 : 0; }
 
-  inline bool sanitize (hb_sanitize_context_t *c, const void* base) const
+  inline hb_blob_t *reference_blob (hb_blob_t *svg_blob, unsigned int index_offset) const
   {
+    return hb_blob_create_sub_blob (svg_blob,
+				    index_offset + (unsigned int) svgDoc,
+				    svgDocLength);
+  }
+
+  inline bool sanitize (hb_sanitize_context_t *c, const void *base) const
+  {
     TRACE_SANITIZE (this);
     return_trace (c->check_struct (this) &&
-		  (base+svgDoc).sanitize (c, svgDocLength));
+		  svgDoc.sanitize (c, base, svgDocLength));
   }
 
   protected:
@@ -57,41 +65,16 @@
   LOffsetTo<UnsizedArrayOf<HBUINT8>, false>
 		svgDoc;		/* Offset from the beginning of the SVG Document Index
 				 * to an SVG document. Must be non-zero. */
-  HBUINT32 svgDocLength;	/* Length of the SVG document.
+  HBUINT32	svgDocLength;	/* Length of the SVG document.
 				 * Must be non-zero. */
   public:
   DEFINE_SIZE_STATIC (12);
 };
 
-struct SVGDocumentIndex
-{
-  friend struct SVG;
-
-  inline bool sanitize (hb_sanitize_context_t *c) const
-  {
-    TRACE_SANITIZE (this);
-    return_trace (c->check_struct (this) &&
-		  entries.sanitize (c, this));
-  }
-
-  protected:
-  ArrayOf<SVGDocumentIndexEntry>
-		entries;	/* Array of SVG Document Index Entries. */
-  public:
-  DEFINE_SIZE_ARRAY (2, entries);
-};
-
 struct SVG
 {
   static const hb_tag_t tableTag = HB_OT_TAG_SVG;
 
-  inline bool sanitize (hb_sanitize_context_t *c) const
-  {
-    TRACE_SANITIZE (this);
-    return_trace (likely (c->check_struct (this) &&
-			  (this+svgDocIndex).sanitize (c)));
-  }
-
   struct accelerator_t
   {
     inline void init (hb_face_t *face)
@@ -98,7 +81,7 @@
     {
       svg_blob = hb_sanitize_context_t().reference_table<SVG> (face);
       svg_len = hb_blob_get_length (svg_blob);
-      svg = svg_blob->as<SVG> ();
+      table = svg_blob->as<SVG> ();
     }
 
     inline void fini (void)
@@ -106,37 +89,48 @@
       hb_blob_destroy (svg_blob);
     }
 
-    inline void
-    dump (void (*callback) (const uint8_t* data, unsigned int length,
-			    unsigned int start_glyph, unsigned int end_glyph)) const
+    inline hb_blob_t *reference_blob_for_glyph (hb_codepoint_t glyph_id) const
     {
-      const SVGDocumentIndex &index = svg+svg->svgDocIndex;
-      const ArrayOf<SVGDocumentIndexEntry> &entries = index.entries;
-      for (unsigned int i = 0; i < entries.len; ++i)
-      {
-	const SVGDocumentIndexEntry &entry = entries[i];
-	callback ((const uint8_t*) &entry.svgDoc (&index), entry.svgDocLength,
-						  entry.startGlyphID, entry.endGlyphID);
-      }
+      if (unlikely (!svg_len))
+        return hb_blob_get_empty ();
+      return table->get_glyph_entry (glyph_id).reference_blob (svg_blob, table->svgDocEntries);
     }
 
+    inline bool has_data () const { return svg_len; }
+
     private:
     hb_blob_t *svg_blob;
-    const SVG *svg;
+    const SVG *table;
 
     unsigned int svg_len;
   };
 
+  inline const SVGDocumentIndexEntry &get_glyph_entry (hb_codepoint_t glyph_id) const
+  {
+    const SortedArrayOf<SVGDocumentIndexEntry> &docs = this+svgDocEntries;
+    return docs[docs.bsearch (glyph_id)];
+  }
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (likely (c->check_struct (this) &&
+			  (this+svgDocEntries).sanitize_shallow (c)));
+  }
+
   protected:
   HBUINT16	version;	/* Table version (starting at 0). */
-  LOffsetTo<SVGDocumentIndex>
-		svgDocIndex;	/* Offset (relative to the start of the SVG table) to the
+  LOffsetTo<SortedArrayOf<SVGDocumentIndexEntry> >
+		svgDocEntries;	/* Offset (relative to the start of the SVG table) to the
 				 * SVG Documents Index. Must be non-zero. */
+				/* Array of SVG Document Index Entries. */
   HBUINT32	reserved;	/* Set to 0. */
   public:
   DEFINE_SIZE_STATIC (10);
 };
 
+struct SVG_accelerator_t : SVG::accelerator_t {};
+
 } /* namespace OT */
 
 

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	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-color.cc	2018-10-30 23:50:16 UTC (rev 49031)
@@ -22,12 +22,16 @@
  * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
  * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
  *
- * Google Author(s): Sascha Brawer
+ * Google Author(s): Sascha Brawer, Behdad Esfahbod
  */
 
 #include "hb-open-type.hh"
+#include "hb-ot-color-cbdt-table.hh"
 #include "hb-ot-color-colr-table.hh"
 #include "hb-ot-color-cpal-table.hh"
+#include "hb-ot-color-sbix-table.hh"
+#include "hb-ot-color-svg-table.hh"
+#include "hb-ot-face.hh"
 #include "hb-ot.h"
 
 #include <stdlib.h>
@@ -34,148 +38,298 @@
 #include <string.h>
 
 #include "hb-ot-layout.hh"
-#include "hb-shaper.hh"
 
-#if 0
-HB_MARK_AS_FLAG_T (hb_ot_color_palette_flags_t)
-//HB_SHAPER_DATA_ENSURE_DECLARE(ot, face) Hmm?
 
+/**
+ * SECTION:hb-ot-color
+ * @title: hb-ot-color
+ * @short_description: OpenType Color Fonts
+ * @include: hb-ot.h
+ *
+ * Functions for fetching color-font information from OpenType font faces.
+ **/
 
+
 static inline const OT::COLR&
 _get_colr (hb_face_t *face)
 {
   if (unlikely (!hb_ot_shaper_face_data_ensure (face))) return Null(OT::COLR);
-  return *(hb_ot_face_data (face)->colr.get ());
+  return *(hb_ot_face_data (face)->COLR.get ());
 }
 
+static inline const OT::CBDT_accelerator_t&
+_get_cbdt (hb_face_t *face)
+{
+  if (unlikely (!hb_ot_shaper_face_data_ensure (face))) return Null(OT::CBDT_accelerator_t);
+  return *(hb_ot_face_data (face)->CBDT.get ());
+}
+
 static inline const OT::CPAL&
 _get_cpal (hb_face_t *face)
 {
   if (unlikely (!hb_ot_shaper_face_data_ensure (face))) return Null(OT::CPAL);
-  return *(hb_ot_face_data (face)->cpal.get ());
+  return *(hb_ot_face_data (face)->CPAL.get ());
 }
 
+static inline const OT::sbix_accelerator_t&
+_get_sbix (hb_face_t *face)
+{
+  if (unlikely (!hb_ot_shaper_face_data_ensure (face))) return Null(OT::sbix_accelerator_t);
+  return *(hb_ot_face_data (face)->sbix.get ());
+}
 
+static inline const OT::SVG_accelerator_t&
+_get_svg (hb_face_t *face)
+{
+  if (unlikely (!hb_ot_shaper_face_data_ensure (face))) return Null(OT::SVG_accelerator_t);
+  return *(hb_ot_face_data (face)->SVG.get ());
+}
+
+
+/*
+ * CPAL
+ */
+
+
 /**
- * hb_ot_color_get_palette_count:
+ * hb_ot_color_has_palettes:
  * @face: a font face.
  *
+ * Returns: whether CPAL table is available.
+ *
+ * Since: 2.1.0
+ */
+hb_bool_t
+hb_ot_color_has_palettes (hb_face_t *face)
+{
+  return _get_cpal (face).has_data ();
+}
+
+/**
+ * hb_ot_color_palette_get_count:
+ * @face: a font face.
+ *
  * Returns: the number of color palettes in @face, or zero if @face has
  * no colors.
  *
- * Since: REPLACEME
+ * Since: 2.1.0
  */
 unsigned int
-hb_ot_color_get_palette_count (hb_face_t *face)
+hb_ot_color_palette_get_count (hb_face_t *face)
 {
-  const OT::CPAL& cpal = _get_cpal (face);
-  return cpal.get_palette_count ();
+  return _get_cpal (face).get_palette_count ();
 }
 
-
 /**
- * hb_ot_color_get_palette_name_id:
- * @face: a font face.
- * @palette: the index of the color palette whose name is being requested.
+ * hb_ot_color_palette_get_name_id:
+ * @face:    a font face.
+ * @palette_index: the index of the color palette whose name is being requested.
  *
  * Retrieves the name id of a color palette. For example, a color font can
  * have themed palettes like "Spring", "Summer", "Fall", and "Winter".
  *
  * Returns: an identifier within @face's `name` table.
- * If the requested palette has no name, or if @face has no colors,
- * or if @palette is not between 0 and hb_ot_color_get_palette_count(),
- * the result is 0xFFFF. The implementation does not check whether
- * the returned palette name id is actually in @face's `name` table.
+ * If the requested palette has no name the result is #HB_OT_NAME_ID_INVALID.
  *
- * Since: REPLACEME
+ * Since: 2.1.0
  */
-unsigned int
-hb_ot_color_get_palette_name_id (hb_face_t *face, unsigned int palette)
+hb_ot_name_id_t
+hb_ot_color_palette_get_name_id (hb_face_t *face,
+				 unsigned int palette_index)
 {
-  const OT::CPAL& cpal = _get_cpal (face);
-  return cpal.get_palette_name_id (palette);
+  return _get_cpal (face).get_palette_name_id (palette_index);
 }
 
+/**
+ * hb_ot_color_palette_color_get_name_id:
+ * @face:        a font face.
+ * @color_index: palette entry index.
+ *
+ * Returns: Name ID associated with a palette entry, e.g. eye color
+ *
+ * Since: 2.1.0
+ */
+hb_ot_name_id_t
+hb_ot_color_palette_color_get_name_id (hb_face_t *face,
+				       unsigned int color_index)
+{
+  return _get_cpal (face).get_color_name_id (color_index);
+}
 
 /**
- * hb_ot_color_get_palette_flags:
- * @face: a font face
- * @palette: the index of the color palette whose flags are being requested
+ * hb_ot_color_palette_get_flags:
+ * @face:          a font face
+ * @palette_index: the index of the color palette whose flags are being requested
  *
- * Returns: the flags for the requested color palette.  If @face has no colors,
- * or if @palette is not between 0 and hb_ot_color_get_palette_count(),
- * the result is #HB_OT_COLOR_PALETTE_FLAG_DEFAULT.
+ * Returns: the flags for the requested color palette.
  *
- * Since: REPLACEME
+ * Since: 2.1.0
  */
 hb_ot_color_palette_flags_t
-hb_ot_color_get_palette_flags (hb_face_t *face, unsigned int palette)
+hb_ot_color_palette_get_flags (hb_face_t *face,
+			       unsigned int palette_index)
 {
-  const OT::CPAL& cpal = _get_cpal(face);
-  return cpal.get_palette_flags (palette);
+  return _get_cpal(face).get_palette_flags (palette_index);
 }
 
-
 /**
- * hb_ot_color_get_palette_colors:
+ * hb_ot_color_palette_get_colors:
  * @face:         a font face.
- * @palette:      the index of the color palette whose colors
+ * @palette_index:the index of the color palette whose colors
  *                are being requested.
  * @start_offset: the index of the first color being requested.
  * @color_count:  (inout) (optional): on input, how many colors
  *                can be maximally stored into the @colors array;
  *                on output, how many colors were actually stored.
- * @colors: (array length=color_count) (optional):
- *                an array of #hb_ot_color_t records. After calling
+ * @colors: (array length=color_count) (out) (optional):
+ *                an array of #hb_color_t records. After calling
  *                this function, @colors will be filled with
  *                the palette colors. If @colors is NULL, the function
  *                will just return the number of total colors
  *                without storing any actual colors; this can be used
  *                for allocating a buffer of suitable size before calling
- *                hb_ot_color_get_palette_colors() a second time.
+ *                hb_ot_color_palette_get_colors() a second time.
  *
  * Retrieves the colors in a color palette.
  *
- * Returns: the total number of colors in the palette. All palettes in
- * a font have the same number of colors. If @face has no colors, or if
- * @palette is not between 0 and hb_ot_color_get_palette_count(),
- * the result is zero.
+ * Returns: the total number of colors in the palette.
  *
- * Since: REPLACEME
+ * Since: 2.1.0
  */
 unsigned int
-hb_ot_color_get_palette_colors (hb_face_t       *face,
-				unsigned int     palette, /* default=0 */
-				unsigned int     start_offset,
-				unsigned int    *color_count /* IN/OUT */,
-				hb_ot_color_t   *colors /* OUT */)
+hb_ot_color_palette_get_colors (hb_face_t     *face,
+				unsigned int   palette_index,
+				unsigned int   start_offset,
+				unsigned int  *colors_count  /* IN/OUT.  May be NULL. */,
+				hb_color_t    *colors        /* OUT.     May be NULL. */)
 {
-  const OT::CPAL& cpal = _get_cpal(face);
-  if (unlikely (palette >= cpal.numPalettes))
-  {
-    if (color_count) *color_count = 0;
-    return 0;
-  }
+  return _get_cpal (face).get_palette_colors (palette_index, start_offset, colors_count, colors);
+}
 
-  const OT::ColorRecord* crec = &cpal.offsetFirstColorRecord (&cpal);
-  crec += cpal.colorRecordIndices[palette];
 
-  unsigned int num_results = 0;
-  if (likely (color_count && colors))
-  {
-    for (unsigned int i = start_offset;
-	 i < cpal.numPaletteEntries && num_results < *color_count; ++i)
-    {
-      hb_ot_color_t* result = &colors[num_results];
-      result->red = crec[i].red;
-      result->green = crec[i].green;
-      result->blue = crec[i].blue;
-      result->alpha = crec[i].alpha;
-      ++num_results;
-    }
-  }
+/*
+ * COLR
+ */
 
-  if (likely (color_count)) *color_count = num_results;
-  return cpal.numPaletteEntries;
+/**
+ * hb_ot_color_has_layers:
+ * @face: a font face.
+ *
+ * Returns: whether COLR table is available.
+ *
+ * Since: 2.1.0
+ */
+hb_bool_t
+hb_ot_color_has_layers (hb_face_t *face)
+{
+  return _get_colr (face).has_data ();
 }
-#endif
+
+/**
+ * hb_ot_color_glyph_get_layers:
+ * @face:         a font face.
+ * @glyph:        a layered color glyph id.
+ * @start_offset: starting offset of layers.
+ * @count:  (inout) (optional): gets number of layers available to be written on buffer
+ * 				and returns number of written layers.
+ * @layers: (array length=count) (out) (optional): layers buffer to buffer.
+ *
+ * Returns: Total number of layers a layered color glyph have.
+ *
+ * Since: 2.1.0
+ */
+unsigned int
+hb_ot_color_glyph_get_layers (hb_face_t           *face,
+			      hb_codepoint_t       glyph,
+			      unsigned int         start_offset,
+			      unsigned int        *count, /* IN/OUT.  May be NULL. */
+			      hb_ot_color_layer_t *layers /* OUT.     May be NULL. */)
+{
+  return _get_colr (face).get_glyph_layers (glyph, start_offset, count, layers);
+}
+
+
+/*
+ * SVG
+ */
+
+/**
+ * hb_ot_color_has_svg:
+ * @face: a font face.
+ *
+ * Check whether @face has SVG glyph images.
+ *
+ * Returns true if available, false otherwise.
+ *
+ * Since: 2.1.0
+ */
+hb_bool_t
+hb_ot_color_has_svg (hb_face_t *face)
+{
+  return _get_svg (face).has_data ();
+}
+
+/**
+ * hb_ot_color_glyph_reference_svg:
+ * @face:  a font face.
+ * @glyph: a svg glyph index.
+ *
+ * Get SVG document for a glyph.
+ *
+ * Returns: (transfer full): respective svg blob of the glyph, if available.
+ *
+ * Since: 2.1.0
+ */
+hb_blob_t *
+hb_ot_color_glyph_reference_svg (hb_face_t *face, hb_codepoint_t glyph)
+{
+  return _get_svg (face).reference_blob_for_glyph (glyph);
+}
+
+
+/*
+ * PNG: CBDT or sbix
+ */
+
+/**
+ * hb_ot_color_has_png:
+ * @face: a font face.
+ *
+ * Check whether @face has PNG glyph images (either CBDT or sbix tables).
+ *
+ * Returns true if available, false otherwise.
+ *
+ * Since: 2.1.0
+ */
+hb_bool_t
+hb_ot_color_has_png (hb_face_t *face)
+{
+  return _get_cbdt (face).has_data () || _get_sbix (face).has_data ();
+}
+
+/**
+ * hb_ot_color_glyph_reference_png:
+ * @font:  a font object, not face. upem should be set on
+ * 	   that font object if one wants to get optimal png blob, otherwise
+ * 	   return the biggest one
+ * @glyph: a glyph index.
+ *
+ * Get PNG image for a glyph.
+ *
+ * Returns: (transfer full): respective PNG blob of the glyph, if available.
+ *
+ * Since: 2.1.0
+ */
+hb_blob_t *
+hb_ot_color_glyph_reference_png (hb_font_t *font, hb_codepoint_t  glyph)
+{
+  hb_blob_t *blob = hb_blob_get_empty ();
+
+  if (_get_sbix (font->face).has_data ())
+    blob = _get_sbix (font->face).reference_png (font, glyph, nullptr, nullptr, nullptr);
+
+  if (!blob->length && _get_cbdt (font->face).has_data ())
+    blob = _get_cbdt (font->face).reference_png (font, glyph);
+
+  return blob;
+}

Added: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-color.h
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-color.h	                        (rev 0)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-color.h	2018-10-30 23:50:16 UTC (rev 49031)
@@ -0,0 +1,139 @@
+/*
+ * Copyright © 2016  Google, Inc.
+ * Copyright © 2018  Khaled Hosny
+ * Copyright © 2018  Ebrahim Byagowi
+ *
+ *  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): Sascha Brawer, Behdad Esfahbod
+ */
+
+#ifndef HB_OT_H_IN
+#error "Include <hb-ot.h> instead."
+#endif
+
+#ifndef HB_OT_COLOR_H
+#define HB_OT_COLOR_H
+
+#include "hb.h"
+#include "hb-ot-name.h"
+
+HB_BEGIN_DECLS
+
+
+/*
+ * Color palettes.
+ */
+
+HB_EXTERN hb_bool_t
+hb_ot_color_has_palettes (hb_face_t *face);
+
+HB_EXTERN unsigned int
+hb_ot_color_palette_get_count (hb_face_t *face);
+
+HB_EXTERN hb_ot_name_id_t
+hb_ot_color_palette_get_name_id (hb_face_t *face,
+				 unsigned int palette_index);
+
+HB_EXTERN hb_ot_name_id_t
+hb_ot_color_palette_color_get_name_id (hb_face_t *face,
+				       unsigned int color_index);
+
+/**
+ * hb_ot_color_palette_flags_t:
+ * @HB_OT_COLOR_PALETTE_FLAG_DEFAULT: default indicating that there is nothing special
+ *   to note about a color palette.
+ * @HB_OT_COLOR_PALETTE_FLAG_USABLE_WITH_LIGHT_BACKGROUND: flag indicating that the color
+ *   palette is appropriate to use when displaying the font on a light background such as white.
+ * @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.
+ *
+ * Since: 2.1.0
+ */
+typedef enum { /*< flags >*/
+  HB_OT_COLOR_PALETTE_FLAG_DEFAULT			= 0x00000000u,
+  HB_OT_COLOR_PALETTE_FLAG_USABLE_WITH_LIGHT_BACKGROUND	= 0x00000001u,
+  HB_OT_COLOR_PALETTE_FLAG_USABLE_WITH_DARK_BACKGROUND	= 0x00000002u,
+} hb_ot_color_palette_flags_t;
+
+HB_EXTERN hb_ot_color_palette_flags_t
+hb_ot_color_palette_get_flags (hb_face_t *face,
+			       unsigned int palette_index);
+
+HB_EXTERN unsigned int
+hb_ot_color_palette_get_colors (hb_face_t    *face,
+				unsigned int  palette_index,
+				unsigned int  start_offset,
+				unsigned int *color_count,  /* IN/OUT.  May be NULL. */
+				hb_color_t   *colors        /* OUT.     May be NULL. */);
+
+
+/*
+ * Color layers.
+ */
+
+HB_EXTERN hb_bool_t
+hb_ot_color_has_layers (hb_face_t *face);
+
+/**
+ * hb_ot_color_layer_t:
+ *
+ * Pairs of glyph and color index.
+ *
+ * Since: 2.1.0
+ **/
+typedef struct hb_ot_color_layer_t
+{
+  hb_codepoint_t glyph;
+  unsigned int   color_index;
+} hb_ot_color_layer_t;
+
+HB_EXTERN unsigned int
+hb_ot_color_glyph_get_layers (hb_face_t           *face,
+			      hb_codepoint_t       glyph,
+			      unsigned int         start_offset,
+			      unsigned int        *count, /* IN/OUT.  May be NULL. */
+			      hb_ot_color_layer_t *layers /* OUT.     May be NULL. */);
+
+/*
+ * SVG
+ */
+
+HB_EXTERN hb_bool_t
+hb_ot_color_has_svg (hb_face_t *face);
+
+HB_EXTERN hb_blob_t *
+hb_ot_color_glyph_reference_svg (hb_face_t *face, hb_codepoint_t glyph);
+
+/*
+ * PNG: CBDT or sbix
+ */
+
+HB_EXTERN hb_bool_t
+hb_ot_color_has_png (hb_face_t *face);
+
+HB_EXTERN hb_blob_t *
+hb_ot_color_glyph_reference_png (hb_font_t *font, hb_codepoint_t glyph);
+
+
+HB_END_DECLS
+
+#endif /* HB_OT_COLOR_H */


Property changes on: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-color.h
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+LF
\ No newline at end of property
Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-face.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-face.cc	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-face.cc	2018-10-30 23:50:16 UTC (rev 49031)
@@ -30,8 +30,11 @@
 #include "hb-ot-glyf-table.hh"
 #include "hb-ot-hmtx-table.hh"
 #include "hb-ot-kern-table.hh"
+#include "hb-ot-name-table.hh"
 #include "hb-ot-post-table.hh"
 #include "hb-ot-color-cbdt-table.hh"
+#include "hb-ot-color-sbix-table.hh"
+#include "hb-ot-color-svg-table.hh"
 #include "hb-ot-layout-gdef-table.hh"
 #include "hb-ot-layout-gsub-table.hh"
 #include "hb-ot-layout-gpos-table.hh"

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-face.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-face.hh	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-face.hh	2018-10-30 23:50:16 UTC (rev 49031)
@@ -45,6 +45,9 @@
  * This is as good as any place. */
 #define HB_OT_TABLES \
     /* OpenType shaping. */ \
+    HB_OT_ACCELERATOR(OT, GDEF) \
+    HB_OT_ACCELERATOR(OT, GSUB) \
+    HB_OT_ACCELERATOR(OT, GPOS) \
     HB_OT_TABLE(OT, JSTF) \
     HB_OT_TABLE(OT, BASE) \
     /* AAT shaping. */ \
@@ -59,9 +62,6 @@
     /* OpenType math. */ \
     HB_OT_TABLE(OT, MATH) \
     /* OpenType fundamentals. */ \
-    HB_OT_ACCELERATOR(OT, GDEF) \
-    HB_OT_ACCELERATOR(OT, GSUB) \
-    HB_OT_ACCELERATOR(OT, GPOS) \
     HB_OT_ACCELERATOR(OT, cmap) \
     HB_OT_ACCELERATOR(OT, hmtx) \
     HB_OT_ACCELERATOR(OT, vmtx) \
@@ -68,7 +68,15 @@
     HB_OT_ACCELERATOR(OT, post) \
     HB_OT_ACCELERATOR(OT, kern) \
     HB_OT_ACCELERATOR(OT, glyf) \
+    HB_OT_TABLE(OT, VORG) \
+    HB_OT_ACCELERATOR(OT, name) \
+    HB_OT_TABLE(AAT, ltag) \
+    /* OpenType color fonts. */ \
+    HB_OT_TABLE(OT, COLR) \
+    HB_OT_TABLE(OT, CPAL) \
     HB_OT_ACCELERATOR(OT, CBDT) \
+    HB_OT_ACCELERATOR(OT, sbix) \
+    HB_OT_ACCELERATOR(OT, SVG) \
     /* */
 
 /* Declare tables. */

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-font.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-font.cc	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-font.cc	2018-10-30 23:50:16 UTC (rev 49031)
@@ -37,9 +37,23 @@
 #include "hb-ot-kern-table.hh"
 #include "hb-ot-post-table.hh"
 #include "hb-ot-glyf-table.hh"
+#include "hb-ot-vorg-table.hh"
 #include "hb-ot-color-cbdt-table.hh"
+#include "hb-ot-color-sbix-table.hh"
 
 
+/**
+ * SECTION:hb-ot-font
+ * @title: hb-ot-font
+ * @short_description: OpenType font implementation
+ * @include: hb-ot.h
+ *
+ * Functions for using OpenType fonts with hb_shape().  Not that fonts returned
+ * by hb_font_create() default to using these functions, so most clients would
+ * never need to call these functions directly.
+ **/
+
+
 static hb_bool_t
 hb_ot_get_nominal_glyph (hb_font_t *font HB_UNUSED,
 			 void *font_data,
@@ -138,9 +152,15 @@
 
   *x = font->get_glyph_h_advance (glyph) / 2;
 
+  const OT::VORG &VORG = *ot_face->VORG.get ();
+  if (VORG.has_data ())
+  {
+    *y = font->em_scale_y (VORG.get_y_origin (glyph));
+    return true;
+  }
+
   hb_glyph_extents_t extents = {0};
-  bool ret = ot_face->glyf->get_extents (glyph, &extents);
-  if (ret)
+  if (ot_face->glyf->get_extents (glyph, &extents))
   {
     const OT::vmtx_accelerator_t &vmtx = *ot_face->vmtx.get ();
     hb_position_t tsb = vmtx.get_side_bearing (glyph);
@@ -163,9 +183,11 @@
 			 void *user_data HB_UNUSED)
 {
   const hb_ot_face_data_t *ot_face = (const hb_ot_face_data_t *) font_data;
-  bool ret = ot_face->glyf->get_extents (glyph, extents);
+  bool ret = ot_face->sbix->get_extents (font, glyph, extents);
   if (!ret)
-    ret = ot_face->CBDT->get_extents (glyph, extents);
+    ret = ot_face->glyf->get_extents (glyph, extents);
+  if (!ret)
+    ret = ot_face->CBDT->get_extents (font, glyph, extents);
   // TODO Hook up side-bearings variations.
   extents->x_bearing = font->em_scale_x (extents->x_bearing);
   extents->y_bearing = font->em_scale_y (extents->y_bearing);

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	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-glyf-table.hh	2018-10-30 23:50:16 UTC (rev 49031)
@@ -47,7 +47,7 @@
 
   static const hb_tag_t tableTag = HB_OT_TAG_loca;
 
-  inline bool sanitize (hb_sanitize_context_t *c) const
+  inline bool sanitize (hb_sanitize_context_t *c HB_UNUSED) const
   {
     TRACE_SANITIZE (this);
     return_trace (true);
@@ -70,7 +70,7 @@
 {
   static const hb_tag_t tableTag = HB_OT_TAG_glyf;
 
-  inline bool sanitize (hb_sanitize_context_t *c) const
+  inline bool sanitize (hb_sanitize_context_t *c HB_UNUSED) const
   {
     TRACE_SANITIZE (this);
     /* We don't check for anything specific here.  The users of the

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-hmtx-table.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-hmtx-table.hh	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-hmtx-table.hh	2018-10-30 23:50:16 UTC (rev 49031)
@@ -56,7 +56,7 @@
 template <typename T, typename H>
 struct hmtxvmtx
 {
-  inline bool sanitize (hb_sanitize_context_t *c) const
+  inline bool sanitize (hb_sanitize_context_t *c HB_UNUSED) const
   {
     TRACE_SANITIZE (this);
     /* We don't check for anything specific here.  The users of the
@@ -199,8 +199,8 @@
 #define USE_TYPO_METRICS (1u<<7)
 	if (0 != (os2_table->fsSelection & USE_TYPO_METRICS))
 	{
-	  ascender = os2_table->sTypoAscender;
-	  descender = os2_table->sTypoDescender;
+	  ascender = abs (os2_table->sTypoAscender);
+	  descender = -abs (os2_table->sTypoDescender);
 	  line_gap = os2_table->sTypoLineGap;
 	  got_font_extents = (ascender | descender) != 0;
 	}
@@ -212,8 +212,8 @@
       num_advances = _hea_table->numberOfLongMetrics;
       if (!got_font_extents)
       {
-	ascender = _hea_table->ascender;
-	descender = _hea_table->descender;
+	ascender = abs (_hea_table->ascender);
+	descender = -abs (_hea_table->descender);
 	line_gap = _hea_table->lineGap;
 	got_font_extents = (ascender | descender) != 0;
       }

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	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-common.hh	2018-10-30 23:50:16 UTC (rev 49031)
@@ -51,7 +51,15 @@
 #define HB_CLOSURE_MAX_STAGES	32
 #endif
 
+#ifndef HB_MAX_SCRIPTS
+#define HB_MAX_SCRIPTS	500
+#endif
 
+#ifndef HB_MAX_LANGSYS
+#define HB_MAX_LANGSYS	2000
+#endif
+
+
 namespace OT {
 
 
@@ -555,6 +563,8 @@
 					  unsigned int *lookup_count /* IN/OUT */,
 					  unsigned int *lookup_tags /* OUT */) const
   { return lookupIndex.get_indexes (start_index, lookup_count, lookup_tags); }
+  inline void add_lookup_indexes_to (hb_set_t *lookup_indexes) const
+  { lookupIndex.add_indexes_to (lookup_indexes); }
 
   inline const FeatureParams &get_feature_params (void) const
   { return this+featureParams; }
@@ -858,8 +868,8 @@
   public:
   /* Older compilers need this to be public. */
   struct Iter {
-    inline void init (const struct CoverageFormat1 &c_) { c = &c_; i = 0; };
-    inline void fini (void) {};
+    inline void init (const struct CoverageFormat1 &c_) { c = &c_; i = 0; }
+    inline void fini (void) {}
     inline bool more (void) { return i < c->glyphArray.len; }
     inline void next (void) { i++; }
     inline hb_codepoint_t get_glyph (void) { return c->glyphArray[i]; }
@@ -986,7 +996,7 @@
         i = c->rangeRecord.len;
       }
     }
-    inline void fini (void) {};
+    inline void fini (void) {}
     inline bool more (void) { return i < c->rangeRecord.len; }
     inline void next (void)
     {
@@ -1106,9 +1116,9 @@
 
   struct Iter
   {
-    Iter (void) : format (0), u () {};
-    inline void init (const Coverage &c_)
+    inline Iter (const Coverage &c_)
     {
+      memset (this, 0, sizeof (*this));
       format = c_.u.format;
       switch (format)
       {
@@ -1117,7 +1127,6 @@
       default:				     return;
       }
     }
-    inline void fini (void) {}
     inline bool more (void)
     {
       switch (format)
@@ -1603,7 +1612,7 @@
   protected:
   HBUINT16				format;
   LOffsetTo<VarRegionList>		regions;
-  OffsetArrayOf<VarData, HBUINT32>	dataSets;
+  LOffsetArrayOf<VarData>		dataSets;
   public:
   DEFINE_SIZE_ARRAY (8, dataSets);
 };
@@ -1685,7 +1694,7 @@
   }
 
   protected:
-  OffsetArrayOf<Condition, HBUINT32> conditions;
+  LOffsetArrayOf<Condition>	conditions;
   public:
   DEFINE_SIZE_ARRAY (2, conditions);
 };

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	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-gpos-table.hh	2018-10-30 23:50:16 UTC (rev 49031)
@@ -663,7 +663,7 @@
     int min = 0, max = (int) count - 1;
     while (min <= max)
     {
-      int mid = (min + max) / 2;
+      int mid = ((unsigned int) min + (unsigned int) max) / 2;
       const PairValueRecord *record = &StructAtOffset<PairValueRecord> (&firstPairValueRecord, record_size * mid);
       hb_codepoint_t mid_x = record->secondGlyph;
       if (x < mid_x)
@@ -719,7 +719,7 @@
   inline bool intersects (const hb_set_t *glyphs) const
   {
     unsigned int count = pairSet.len;
-    for (hb_auto_t<Coverage::Iter> iter (this+coverage); iter.more (); iter.next ())
+    for (Coverage::Iter iter (this+coverage); iter.more (); iter.next ())
     {
       if (unlikely (iter.get_coverage () >= count))
         break; /* Work around malicious fonts. https://github.com/harfbuzz/harfbuzz/issues/363 */
@@ -1715,7 +1715,7 @@
 }
 
 void
-GPOS::position_finish_advances (hb_font_t *font HB_UNUSED, hb_buffer_t *buffer)
+GPOS::position_finish_advances (hb_font_t *font HB_UNUSED, hb_buffer_t *buffer HB_UNUSED)
 {
   //_hb_buffer_assert_gsubgpos_vars (buffer);
 }

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	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-gsub-table.hh	2018-10-30 23:50:16 UTC (rev 49031)
@@ -48,7 +48,7 @@
   inline void closure (hb_closure_context_t *c) const
   {
     TRACE_CLOSURE (this);
-    for (hb_auto_t<Coverage::Iter> iter (this+coverage); iter.more (); iter.next ())
+    for (Coverage::Iter iter (this+coverage); iter.more (); iter.next ())
     {
       /* TODO Switch to range-based API to work around malicious fonts.
        * https://github.com/harfbuzz/harfbuzz/issues/363 */
@@ -62,7 +62,7 @@
   {
     TRACE_COLLECT_GLYPHS (this);
     if (unlikely (!(this+coverage).add_coverage (c->input))) return;
-    for (hb_auto_t<Coverage::Iter> iter (this+coverage); iter.more (); iter.next ())
+    for (Coverage::Iter iter (this+coverage); iter.more (); iter.next ())
     {
       /* TODO Switch to range-based API to work around malicious fonts.
        * https://github.com/harfbuzz/harfbuzz/issues/363 */
@@ -110,10 +110,10 @@
   inline bool subset (hb_subset_context_t *c) const
   {
     TRACE_SUBSET (this);
-    hb_auto_t<hb_vector_t<GlyphID> > from;
-    hb_auto_t<hb_vector_t<GlyphID> > to;
+    hb_vector_t<GlyphID> from;
+    hb_vector_t<GlyphID> to;
     hb_codepoint_t delta = deltaGlyphID;
-    for (hb_auto_t<Coverage::Iter> iter (this+coverage); iter.more (); iter.next ())
+    for (Coverage::Iter iter (this+coverage); iter.more (); iter.next ())
     {
       if (!c->plan->glyphset->has (iter.get_glyph ()))
         continue;
@@ -157,7 +157,7 @@
   {
     TRACE_CLOSURE (this);
     unsigned int count = substitute.len;
-    for (hb_auto_t<Coverage::Iter> iter (this+coverage); iter.more (); iter.next ())
+    for (Coverage::Iter iter (this+coverage); iter.more (); iter.next ())
     {
       if (unlikely (iter.get_coverage () >= count))
         break; /* Work around malicious fonts. https://github.com/harfbuzz/harfbuzz/issues/363 */
@@ -171,7 +171,7 @@
     TRACE_COLLECT_GLYPHS (this);
     if (unlikely (!(this+coverage).add_coverage (c->input))) return;
     unsigned int count = substitute.len;
-    for (hb_auto_t<Coverage::Iter> iter (this+coverage); iter.more (); iter.next ())
+    for (Coverage::Iter iter (this+coverage); iter.more (); iter.next ())
     {
       if (unlikely (iter.get_coverage () >= count))
         break; /* Work around malicious fonts. https://github.com/harfbuzz/harfbuzz/issues/363 */
@@ -216,9 +216,9 @@
   inline bool subset (hb_subset_context_t *c) const
   {
     TRACE_SUBSET (this);
-    hb_auto_t<hb_vector_t<GlyphID> > from;
-    hb_auto_t<hb_vector_t<GlyphID> > to;
-    for (hb_auto_t<Coverage::Iter> iter (this+coverage); iter.more (); iter.next ())
+    hb_vector_t<GlyphID> from;
+    hb_vector_t<GlyphID> to;
+    for (Coverage::Iter iter (this+coverage); iter.more (); iter.next ())
     {
       if (!c->plan->glyphset->has (iter.get_glyph ()))
         continue;
@@ -395,7 +395,7 @@
   {
     TRACE_CLOSURE (this);
     unsigned int count = sequence.len;
-    for (hb_auto_t<Coverage::Iter> iter (this+coverage); iter.more (); iter.next ())
+    for (Coverage::Iter iter (this+coverage); iter.more (); iter.next ())
     {
       if (unlikely (iter.get_coverage () >= count))
         break; /* Work around malicious fonts. https://github.com/harfbuzz/harfbuzz/issues/363 */
@@ -585,7 +585,7 @@
   {
     TRACE_CLOSURE (this);
     unsigned int count = alternateSet.len;
-    for (hb_auto_t<Coverage::Iter> iter (this+coverage); iter.more (); iter.next ())
+    for (Coverage::Iter iter (this+coverage); iter.more (); iter.next ())
     {
       if (unlikely (iter.get_coverage () >= count))
         break; /* Work around malicious fonts. https://github.com/harfbuzz/harfbuzz/issues/363 */
@@ -599,7 +599,7 @@
     TRACE_COLLECT_GLYPHS (this);
     if (unlikely (!(this+coverage).add_coverage (c->input))) return;
     unsigned int count = alternateSet.len;
-    for (hb_auto_t<Coverage::Iter> iter (this+coverage); iter.more (); iter.next ())
+    for (Coverage::Iter iter (this+coverage); iter.more (); iter.next ())
     {
       if (unlikely (iter.get_coverage () >= count))
         break; /* Work around malicious fonts. https://github.com/harfbuzz/harfbuzz/issues/363 */
@@ -906,7 +906,7 @@
   inline bool intersects (const hb_set_t *glyphs) const
   {
     unsigned int count = ligatureSet.len;
-    for (hb_auto_t<Coverage::Iter> iter (this+coverage); iter.more (); iter.next ())
+    for (Coverage::Iter iter (this+coverage); iter.more (); iter.next ())
     {
       if (unlikely (iter.get_coverage () >= count))
         break; /* Work around malicious fonts. https://github.com/harfbuzz/harfbuzz/issues/363 */
@@ -921,7 +921,7 @@
   {
     TRACE_CLOSURE (this);
     unsigned int count = ligatureSet.len;
-    for (hb_auto_t<Coverage::Iter> iter (this+coverage); iter.more (); iter.next ())
+    for (Coverage::Iter iter (this+coverage); iter.more (); iter.next ())
     {
       if (unlikely (iter.get_coverage () >= count))
         break; /* Work around malicious fonts. https://github.com/harfbuzz/harfbuzz/issues/363 */
@@ -935,7 +935,7 @@
     TRACE_COLLECT_GLYPHS (this);
     if (unlikely (!(this+coverage).add_coverage (c->input))) return;
     unsigned int count = ligatureSet.len;
-    for (hb_auto_t<Coverage::Iter> iter (this+coverage); iter.more (); iter.next ())
+    for (Coverage::Iter iter (this+coverage); iter.more (); iter.next ())
     {
       if (unlikely (iter.get_coverage () >= count))
         break; /* Work around malicious fonts. https://github.com/harfbuzz/harfbuzz/issues/363 */
@@ -1114,7 +1114,7 @@
 
     const ArrayOf<GlyphID> &substitute = StructAfter<ArrayOf<GlyphID> > (lookahead);
     count = substitute.len;
-    for (hb_auto_t<Coverage::Iter> iter (this+coverage); iter.more (); iter.next ())
+    for (Coverage::Iter iter (this+coverage); iter.more (); iter.next ())
     {
       if (unlikely (iter.get_coverage () >= count))
         break; /* Work around malicious fonts. https://github.com/harfbuzz/harfbuzz/issues/363 */

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	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-gsubgpos.hh	2018-10-30 23:50:16 UTC (rev 49031)
@@ -93,7 +93,7 @@
 
   hb_face_t *face;
   hb_set_t *glyphs;
-  hb_auto_t<hb_set_t> out[1];
+  hb_set_t out[1];
   recurse_func_t recurse_func;
   unsigned int nesting_level_left;
   unsigned int debug_depth;
@@ -271,7 +271,7 @@
 	     syllable arg1(0),
 #undef arg1
 	     match_func (nullptr),
-	     match_data (nullptr) {};
+	     match_data (nullptr) {}
 
     typedef bool (*match_func_t) (hb_codepoint_t glyph_id, const HBUINT16 &value, const void *data);
 
@@ -1441,7 +1441,7 @@
     };
 
     unsigned int count = ruleSet.len;
-    for (hb_auto_t<Coverage::Iter> iter (this+coverage); iter.more (); iter.next ())
+    for (Coverage::Iter iter (this+coverage); iter.more (); iter.next ())
     {
       if (unlikely (iter.get_coverage () >= count))
         break; /* Work around malicious fonts. https://github.com/harfbuzz/harfbuzz/issues/363 */
@@ -1462,7 +1462,7 @@
     };
 
     unsigned int count = ruleSet.len;
-    for (hb_auto_t<Coverage::Iter> iter (this+coverage); iter.more (); iter.next ())
+    for (Coverage::Iter iter (this+coverage); iter.more (); iter.next ())
     {
       if (unlikely (iter.get_coverage () >= count))
         break; /* Work around malicious fonts. https://github.com/harfbuzz/harfbuzz/issues/363 */
@@ -2105,7 +2105,7 @@
     };
 
     unsigned int count = ruleSet.len;
-    for (hb_auto_t<Coverage::Iter> iter (this+coverage); iter.more (); iter.next ())
+    for (Coverage::Iter iter (this+coverage); iter.more (); iter.next ())
     {
       if (unlikely (iter.get_coverage () >= count))
         break; /* Work around malicious fonts. https://github.com/harfbuzz/harfbuzz/issues/363 */
@@ -2126,7 +2126,7 @@
     };
 
     unsigned int count = ruleSet.len;
-    for (hb_auto_t<Coverage::Iter> iter (this+coverage); iter.more (); iter.next ())
+    for (Coverage::Iter iter (this+coverage); iter.more (); iter.next ())
     {
       if (unlikely (iter.get_coverage () >= count))
         break; /* Work around malicious fonts. https://github.com/harfbuzz/harfbuzz/issues/363 */

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	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout.cc	2018-10-30 23:50:16 UTC (rev 49031)
@@ -41,14 +41,20 @@
 // Just so we compile them; unused otherwise:
 #include "hb-ot-layout-base-table.hh"
 #include "hb-ot-layout-jstf-table.hh"
-#include "hb-ot-color-colr-table.hh"
-#include "hb-ot-color-cpal-table.hh"
-#include "hb-ot-color-sbix-table.hh"
-#include "hb-ot-color-svg-table.hh"
 #include "hb-ot-kern-table.hh"
 #include "hb-ot-name-table.hh"
 
 
+/**
+ * SECTION:hb-ot-layout
+ * @title: hb-ot-layout
+ * @short_description: OpenType Layout
+ * @include: hb-ot.h
+ *
+ * Functions for querying OpenType Layout features in the font face.
+ **/
+
+
 static const OT::kern::accelerator_t& _get_kern (hb_face_t *face)
 {
   if (unlikely (!hb_ot_shaper_face_data_ensure (face))) return Null(OT::kern::accelerator_t);
@@ -555,19 +561,6 @@
   return l.has_required_feature ();
 }
 
-static void
-_hb_ot_layout_language_add_feature_indexes_to (hb_face_t    *face,
-                                               hb_tag_t      table_tag,
-                                               unsigned int  script_index,
-                                               unsigned int  language_index,
-                                               hb_set_t     *feature_indexes /* OUT */)
-{
-  const OT::GSUBGPOS &g = get_gsubgpos_table (face, table_tag);
-  const OT::LangSys &l = g.get_script (script_index).get_lang_sys (language_index);
-  l.add_feature_indexes_to (feature_indexes);
-}
-
-
 unsigned int
 hb_ot_layout_language_get_feature_indexes (hb_face_t    *face,
 					   hb_tag_t      table_tag,
@@ -665,117 +658,126 @@
 hb_ot_layout_table_get_lookup_count (hb_face_t    *face,
 				     hb_tag_t      table_tag)
 {
-  if (unlikely (!hb_ot_shaper_face_data_ensure (face))) return 0;
-  switch (table_tag)
-  {
-    case HB_OT_TAG_GSUB:
-    {
-      return hb_ot_face_data (face)->GSUB->lookup_count;
-    }
-    case HB_OT_TAG_GPOS:
-    {
-      return hb_ot_face_data (face)->GPOS->lookup_count;
-    }
-  }
-  return 0;
+  return get_gsubgpos_table (face, table_tag).get_lookup_count ();
 }
 
-static void
-_hb_ot_layout_collect_lookups_lookups (hb_face_t      *face,
-				       hb_tag_t        table_tag,
-				       unsigned int    feature_index,
-				       hb_set_t       *lookup_indexes /* OUT */)
+
+struct hb_collect_features_context_t
 {
-  unsigned int lookup_indices[32];
-  unsigned int offset, len;
+  hb_collect_features_context_t (hb_face_t       *face,
+				 hb_tag_t         table_tag,
+				 hb_set_t        *feature_indexes_)
+    : g (get_gsubgpos_table (face, table_tag)),
+      feature_indexes (feature_indexes_),
+      script_count(0),langsys_count(0) {}
 
-  offset = 0;
-  do {
-    len = ARRAY_LENGTH (lookup_indices);
-    hb_ot_layout_feature_get_lookups (face,
-				      table_tag,
-				      feature_index,
-				      offset, &len,
-				      lookup_indices);
+  bool inline visited (const OT::Script &s)
+  {
+    /* We might have Null() object here.  Don't want to involve
+     * that in the memoize.  So, detect empty objects and return. */
+    if (unlikely (!s.has_default_lang_sys () &&
+		  !s.get_lang_sys_count ()))
+      return true;
 
-    for (unsigned int i = 0; i < len; i++)
-      lookup_indexes->add (lookup_indices[i]);
+    if (script_count++ > HB_MAX_SCRIPTS)
+      return true;
 
-    offset += len;
-  } while (len == ARRAY_LENGTH (lookup_indices));
-}
+    return visited (s, visited_script);
+  }
+  bool inline visited (const OT::LangSys &l)
+  {
+    /* We might have Null() object here.  Don't want to involve
+     * that in the memoize.  So, detect empty objects and return. */
+    if (unlikely (!l.has_required_feature () &&
+		  !l.get_feature_count ()))
+      return true;
 
+    if (langsys_count++ > HB_MAX_LANGSYS)
+      return true;
+
+    return visited (l, visited_langsys);
+  }
+
+  private:
+  template <typename T>
+  bool inline visited (const T &p, hb_set_t &visited_set)
+  {
+    hb_codepoint_t delta = (hb_codepoint_t) ((uintptr_t) &p - (uintptr_t) &g);
+     if (visited_set.has (delta))
+      return true;
+
+    visited_set.add (delta);
+    return false;
+  }
+
+  public:
+  const OT::GSUBGPOS &g;
+  hb_set_t           *feature_indexes;
+
+  private:
+  hb_set_t visited_script;
+  hb_set_t visited_langsys;
+  unsigned int script_count;
+  unsigned int langsys_count;
+};
+
 static void
-_hb_ot_layout_collect_features_features (hb_face_t      *face,
-                                         hb_tag_t        table_tag,
-                                         unsigned int    script_index,
-                                         unsigned int    language_index,
-                                         const hb_tag_t *features,
-                                         hb_set_t       *feature_indexes /* OUT */)
+langsys_collect_features (hb_collect_features_context_t *c,
+			  const OT::LangSys  &l,
+			  const hb_tag_t     *features)
 {
+  if (c->visited (l)) return;
+
   if (!features)
   {
-    unsigned int required_feature_index;
-    if (hb_ot_layout_language_get_required_feature (face,
-						    table_tag,
-						    script_index,
-						    language_index,
-						    &required_feature_index,
-						    nullptr))
-      feature_indexes->add (required_feature_index);
+    /* All features. */
+    if (l.has_required_feature ())
+      c->feature_indexes->add (l.get_required_feature_index ());
 
-    /* All features */
-    _hb_ot_layout_language_add_feature_indexes_to (face,
-                                                   table_tag,
-                                                   script_index,
-                                                   language_index,
-                                                   feature_indexes);
+    l.add_feature_indexes_to (c->feature_indexes);
   }
   else
   {
+    /* Ugh. Any faster way? */
     for (; *features; features++)
     {
-      unsigned int feature_index;
-      if (hb_ot_layout_language_find_feature (face,
-					      table_tag,
-					      script_index,
-					      language_index,
-					      *features,
-					      &feature_index))
-        feature_indexes->add (feature_index);
+      hb_tag_t feature_tag = *features;
+      unsigned int num_features = l.get_feature_count ();
+      for (unsigned int i = 0; i < num_features; i++)
+      {
+	unsigned int feature_index = l.get_feature_index (i);
+
+	if (feature_tag == c->g.get_feature_tag (feature_index))
+	{
+	  c->feature_indexes->add (feature_index);
+	  break;
+	}
+      }
     }
   }
 }
 
 static void
-_hb_ot_layout_collect_features_languages (hb_face_t      *face,
-                                          hb_tag_t        table_tag,
-                                          unsigned int    script_index,
-                                          const hb_tag_t *languages,
-                                          const hb_tag_t *features,
-                                          hb_set_t       *feature_indexes /* OUT */)
+script_collect_features (hb_collect_features_context_t *c,
+			 const OT::Script   &s,
+			 const hb_tag_t *languages,
+			 const hb_tag_t *features)
 {
-  _hb_ot_layout_collect_features_features (face,
-                                           table_tag,
-                                           script_index,
-                                           HB_OT_LAYOUT_DEFAULT_LANGUAGE_INDEX,
-                                           features,
-                                           feature_indexes);
+  if (c->visited (s)) return;
 
   if (!languages)
   {
-    /* All languages */
-    unsigned int count = hb_ot_layout_script_get_language_tags (face,
-								table_tag,
-								script_index,
-								0, nullptr, nullptr);
+    /* All languages. */
+    if (s.has_default_lang_sys ())
+      langsys_collect_features (c,
+				s.get_default_lang_sys (),
+				features);
+
+    unsigned int count = s.get_lang_sys_count ();
     for (unsigned int language_index = 0; language_index < count; language_index++)
-      _hb_ot_layout_collect_features_features (face,
-                                               table_tag,
-                                               script_index,
-                                               language_index,
-                                               features,
-                                               feature_indexes);
+      langsys_collect_features (c,
+				s.get_lang_sys (language_index),
+				features);
   }
   else
   {
@@ -782,18 +784,10 @@
     for (; *languages; languages++)
     {
       unsigned int language_index;
-      if (hb_ot_layout_script_select_language (face,
-					       table_tag,
-					       script_index,
-					       1,
-					       languages,
-					       &language_index))
-        _hb_ot_layout_collect_features_features (face,
-                                                 table_tag,
-                                                 script_index,
-                                                 language_index,
-                                                 features,
-                                                 feature_indexes);
+      if (s.find_lang_sys_index (*languages, &language_index))
+	langsys_collect_features (c,
+				  s.get_lang_sys (language_index),
+				  features);
     }
   }
 }
@@ -811,19 +805,16 @@
                                const hb_tag_t *features,
                                hb_set_t       *feature_indexes /* OUT */)
 {
+  hb_collect_features_context_t c (face, table_tag, feature_indexes);
   if (!scripts)
   {
-    /* All scripts */
-    unsigned int count = hb_ot_layout_table_get_script_tags (face,
-							     table_tag,
-							     0, nullptr, nullptr);
+    /* All scripts. */
+    unsigned int count = c.g.get_script_count ();
     for (unsigned int script_index = 0; script_index < count; script_index++)
-      _hb_ot_layout_collect_features_languages (face,
-                                                table_tag,
-                                                script_index,
-                                                languages,
-                                                features,
-                                                feature_indexes);
+      script_collect_features (&c,
+			       c.g.get_script (script_index),
+			       languages,
+			       features);
   }
   else
   {
@@ -830,16 +821,11 @@
     for (; *scripts; scripts++)
     {
       unsigned int script_index;
-      if (hb_ot_layout_table_find_script (face,
-					  table_tag,
-					  *scripts,
-					  &script_index))
-        _hb_ot_layout_collect_features_languages (face,
-                                                  table_tag,
-                                                  script_index,
-                                                  languages,
-                                                  features,
-                                                  feature_indexes);
+      if (c.g.find_script_index (*scripts, &script_index))
+	script_collect_features (&c,
+				 c.g.get_script (script_index),
+				 languages,
+				 features);
     }
   }
 }
@@ -857,10 +843,14 @@
 			      const hb_tag_t *features,
 			      hb_set_t       *lookup_indexes /* OUT */)
 {
-  hb_auto_t<hb_set_t> feature_indexes;
+  const OT::GSUBGPOS &g = get_gsubgpos_table (face, table_tag);
+
+  hb_set_t feature_indexes;
   hb_ot_layout_collect_features (face, table_tag, scripts, languages, features, &feature_indexes);
-  for (hb_codepoint_t feature_index = HB_SET_VALUE_INVALID; hb_set_next (&feature_indexes, &feature_index);)
-    _hb_ot_layout_collect_lookups_lookups (face, table_tag, feature_index, lookup_indexes);
+
+  for (hb_codepoint_t feature_index = HB_SET_VALUE_INVALID;
+       hb_set_next (&feature_indexes, &feature_index);)
+    g.get_feature (feature_index).add_lookup_indexes_to (lookup_indexes);
 }
 
 /**
@@ -993,7 +983,7 @@
 				        unsigned int  lookup_index,
 				        hb_set_t     *glyphs)
 {
-  hb_auto_t<hb_map_t> done_lookups;
+  hb_map_t done_lookups;
   OT::hb_closure_context_t c (face, glyphs, &done_lookups);
 
   const OT::SubstLookup& l = _get_gsub (face).get_lookup (lookup_index);
@@ -1014,7 +1004,7 @@
                                          const hb_set_t *lookups,
                                          hb_set_t       *glyphs)
 {
-  hb_auto_t<hb_map_t> done_lookups;
+  hb_map_t done_lookups;
   OT::hb_closure_context_t c (face, glyphs, &done_lookups);
   const OT::GSUB& gsub = _get_gsub (face);
 
@@ -1072,12 +1062,12 @@
  * Since: 0.9.10
  **/
 hb_bool_t
-hb_ot_layout_get_size_params (hb_face_t    *face,
-			      unsigned int *design_size,       /* OUT.  May be NULL */
-			      unsigned int *subfamily_id,      /* OUT.  May be NULL */
-			      unsigned int *subfamily_name_id, /* OUT.  May be NULL */
-			      unsigned int *range_start,       /* OUT.  May be NULL */
-			      unsigned int *range_end          /* OUT.  May be NULL */)
+hb_ot_layout_get_size_params (hb_face_t       *face,
+			      unsigned int    *design_size,       /* OUT.  May be NULL */
+			      unsigned int    *subfamily_id,      /* OUT.  May be NULL */
+			      hb_ot_name_id_t *subfamily_name_id, /* OUT.  May be NULL */
+			      unsigned int    *range_start,       /* OUT.  May be NULL */
+			      unsigned int    *range_end          /* OUT.  May be NULL */)
 {
   const OT::GPOS &gpos = _get_gpos (face);
   const hb_tag_t tag = HB_TAG ('s','i','z','e');
@@ -1105,7 +1095,7 @@
 
   if (design_size) *design_size = 0;
   if (subfamily_id) *subfamily_id = 0;
-  if (subfamily_name_id) *subfamily_name_id = 0;
+  if (subfamily_name_id) *subfamily_name_id = HB_OT_NAME_ID_INVALID;
   if (range_start) *range_start = 0;
   if (range_end) *range_end = 0;
 
@@ -1115,8 +1105,8 @@
 /**
  * hb_ot_layout_feature_get_name_ids:
  * @face: #hb_face_t to work upon
- * @table_tag:
- * @feature_index:
+ * @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
  *            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
@@ -1137,14 +1127,14 @@
  * Since: 2.0.0
  **/
 hb_bool_t
-hb_ot_layout_feature_get_name_ids (hb_face_t    *face,
-				   hb_tag_t      table_tag,
-				   unsigned int  feature_index,
-				   hb_name_id_t *label_id,             /* OUT.  May be NULL */
-				   hb_name_id_t *tooltip_id,           /* OUT.  May be NULL */
-				   hb_name_id_t *sample_id,            /* OUT.  May be NULL */
-				   unsigned int *num_named_parameters, /* OUT.  May be NULL */
-				   hb_name_id_t *first_param_id        /* OUT.  May be NULL */)
+hb_ot_layout_feature_get_name_ids (hb_face_t       *face,
+				   hb_tag_t         table_tag,
+				   unsigned int     feature_index,
+				   hb_ot_name_id_t *label_id,             /* OUT.  May be NULL */
+				   hb_ot_name_id_t *tooltip_id,           /* OUT.  May be NULL */
+				   hb_ot_name_id_t *sample_id,            /* OUT.  May be NULL */
+				   unsigned int    *num_named_parameters, /* OUT.  May be NULL */
+				   hb_ot_name_id_t *first_param_id        /* OUT.  May be NULL */)
 {
   const OT::GSUBGPOS &g = get_gsubgpos_table (face, table_tag);
 
@@ -1160,10 +1150,10 @@
     {
       if (label_id) *label_id = ss_params.uiNameID;
       // ssXX features don't have the rest
-      if (tooltip_id) *tooltip_id = HB_NAME_ID_INVALID;
-      if (sample_id) *sample_id = HB_NAME_ID_INVALID;
+      if (tooltip_id) *tooltip_id = HB_OT_NAME_ID_INVALID;
+      if (sample_id) *sample_id = HB_OT_NAME_ID_INVALID;
       if (num_named_parameters) *num_named_parameters = 0;
-      if (first_param_id) *first_param_id = HB_NAME_ID_INVALID;
+      if (first_param_id) *first_param_id = HB_OT_NAME_ID_INVALID;
       return true;
     }
     const OT::FeatureParamsCharacterVariants& cv_params =
@@ -1179,19 +1169,19 @@
     }
   }
 
-  if (label_id) *label_id = HB_NAME_ID_INVALID;
-  if (tooltip_id) *tooltip_id = HB_NAME_ID_INVALID;
-  if (sample_id) *sample_id = HB_NAME_ID_INVALID;
+  if (label_id) *label_id = HB_OT_NAME_ID_INVALID;
+  if (tooltip_id) *tooltip_id = HB_OT_NAME_ID_INVALID;
+  if (sample_id) *sample_id = HB_OT_NAME_ID_INVALID;
   if (num_named_parameters) *num_named_parameters = 0;
-  if (first_param_id) *first_param_id = HB_NAME_ID_INVALID;
+  if (first_param_id) *first_param_id = HB_OT_NAME_ID_INVALID;
   return false;
 }
 
 /**
- * hb_ot_layout_feature_get_characters::
+ * hb_ot_layout_feature_get_characters:
  * @face: #hb_face_t to work upon
- * @table_tag:
- * @feature_index:
+ * @table_tag: table tag to query, "GSUB" or "GPOS".
+ * @feature_index: index of feature to query.
  * @start_offset: In case the resulting char_count was equal to its input value, there
  *                is a chance there were more characters on the tag so this API can be
  *                called with an offset till resulting char_count gets to a number
@@ -1199,7 +1189,7 @@
  *                one shot copying).
  * @char_count: (inout) (allow-none): The count of characters for which this feature
  *              provides glyph variants. (May be zero.)
- * @characters: (out) (allow-none): A buffer pointer. The Unicode Scalar Value
+ * @characters: (out caller-allocates) (array length=char_count): A buffer pointer. The Unicode codepoints
  *              of the characters for which this feature provides glyph variants.
  *
  * Fetches characters listed by designer under feature parameters for "Character

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	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout.h	2018-10-30 23:50:16 UTC (rev 49031)
@@ -33,7 +33,6 @@
 
 #include "hb.h"
 
-#include "hb-ot-tag.h"
 #include "hb-ot-name.h"
 
 HB_BEGIN_DECLS
@@ -47,6 +46,47 @@
 
 
 /*
+ * Script & Language tags.
+ */
+
+#define HB_OT_TAG_DEFAULT_SCRIPT	HB_TAG ('D', 'F', 'L', 'T')
+#define HB_OT_TAG_DEFAULT_LANGUAGE	HB_TAG ('d', 'f', 'l', 't')
+
+/**
+ * HB_OT_MAX_TAGS_PER_SCRIPT:
+ *
+ * Since: 2.0.0
+ **/
+#define HB_OT_MAX_TAGS_PER_SCRIPT	3u
+/**
+ * HB_OT_MAX_TAGS_PER_LANGUAGE:
+ *
+ * Since: 2.0.0
+ **/
+#define HB_OT_MAX_TAGS_PER_LANGUAGE	3u
+
+HB_EXTERN void
+hb_ot_tags_from_script_and_language (hb_script_t   script,
+				     hb_language_t language,
+				     unsigned int *script_count /* IN/OUT */,
+				     hb_tag_t     *script_tags /* OUT */,
+				     unsigned int *language_count /* IN/OUT */,
+				     hb_tag_t     *language_tags /* OUT */);
+
+HB_EXTERN hb_script_t
+hb_ot_tag_to_script (hb_tag_t tag);
+
+HB_EXTERN hb_language_t
+hb_ot_tag_to_language (hb_tag_t tag);
+
+HB_EXTERN void
+hb_ot_tags_to_script_and_language (hb_tag_t       script_tag,
+				   hb_tag_t       language_tag,
+				   hb_script_t   *script /* OUT */,
+				   hb_language_t *language /* OUT */);
+
+
+/*
  * GDEF
  */
 
@@ -324,23 +364,23 @@
 /* Optical 'size' feature info.  Returns true if found.
  * https://docs.microsoft.com/en-us/typography/opentype/spec/features_pt#size */
 HB_EXTERN hb_bool_t
-hb_ot_layout_get_size_params (hb_face_t    *face,
-			      unsigned int *design_size,       /* OUT.  May be NULL */
-			      unsigned int *subfamily_id,      /* OUT.  May be NULL */
-			      hb_name_id_t *subfamily_name_id, /* OUT.  May be NULL */
-			      unsigned int *range_start,       /* OUT.  May be NULL */
-			      unsigned int *range_end          /* OUT.  May be NULL */);
+hb_ot_layout_get_size_params (hb_face_t       *face,
+			      unsigned int    *design_size,       /* OUT.  May be NULL */
+			      unsigned int    *subfamily_id,      /* OUT.  May be NULL */
+			      hb_ot_name_id_t *subfamily_name_id, /* OUT.  May be NULL */
+			      unsigned int    *range_start,       /* OUT.  May be NULL */
+			      unsigned int    *range_end          /* OUT.  May be NULL */);
 
 
 HB_EXTERN hb_bool_t
-hb_ot_layout_feature_get_name_ids (hb_face_t    *face,
-				   hb_tag_t      table_tag,
-				   unsigned int  feature_index,
-				   hb_name_id_t *label_id             /* OUT.  May be NULL */,
-				   hb_name_id_t *tooltip_id           /* OUT.  May be NULL */,
-				   hb_name_id_t *sample_id            /* OUT.  May be NULL */,
-				   unsigned int *num_named_parameters /* OUT.  May be NULL */,
-				   hb_name_id_t *first_param_id       /* OUT.  May be NULL */);
+hb_ot_layout_feature_get_name_ids (hb_face_t       *face,
+				   hb_tag_t         table_tag,
+				   unsigned int     feature_index,
+				   hb_ot_name_id_t *label_id             /* OUT.  May be NULL */,
+				   hb_ot_name_id_t *tooltip_id           /* OUT.  May be NULL */,
+				   hb_ot_name_id_t *sample_id            /* OUT.  May be NULL */,
+				   unsigned int    *num_named_parameters /* OUT.  May be NULL */,
+				   hb_ot_name_id_t *first_param_id       /* OUT.  May be NULL */);
 
 
 HB_EXTERN unsigned int

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-map.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-map.cc	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-map.cc	2018-10-30 23:50:16 UTC (rev 49031)
@@ -79,8 +79,8 @@
 				       hb_ot_map_feature_flags_t flags,
 				       unsigned int value)
 {
+  if (unlikely (!tag)) return;
   feature_info_t *info = feature_infos.push();
-  if (unlikely (!tag)) return;
   info->tag = tag;
   info->seq = feature_infos.len;
   info->max_value = value;
@@ -175,6 +175,7 @@
   }
 
   /* Sort features and merge duplicates */
+  if (feature_infos.len)
   {
     feature_infos.qsort ();
     unsigned int j = 0;

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-map.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-map.hh	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-map.hh	2018-10-30 23:50:16 UTC (rev 49031)
@@ -162,7 +162,7 @@
   hb_mask_t global_mask;
 
   hb_vector_t<feature_map_t, 8> features;
-  hb_vector_t<lookup_map_t, 32> lookups[2]; /* GSUB/GPOS */
+  hb_vector_t<lookup_map_t, 16> lookups[2]; /* GSUB/GPOS */
   hb_vector_t<stage_map_t, 4> stages[2]; /* GSUB/GPOS */
 };
 

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-math-table.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-math-table.hh	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-math-table.hh	2018-10-30 23:50:16 UTC (rev 49031)
@@ -631,7 +631,7 @@
   inline const MathGlyphConstruction &
 		get_glyph_construction (hb_codepoint_t glyph,
 					hb_direction_t direction,
-					hb_font_t *font) const
+					hb_font_t *font HB_UNUSED) const
   {
     bool vertical = HB_DIRECTION_IS_VERTICAL (direction);
     unsigned int count = vertical ? vertGlyphCount : horizGlyphCount;

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	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-math.cc	2018-10-30 23:50:16 UTC (rev 49031)
@@ -29,6 +29,17 @@
 #include "hb-ot-face.hh"
 #include "hb-ot-math-table.hh"
 
+
+/**
+ * SECTION:hb-ot-math
+ * @title: hb-ot-math
+ * @short_description: OpenType Math information
+ * @include: hb-ot.h
+ *
+ * Functions for fetching mathematics layout data from OpenType fonts.
+ **/
+
+
 static inline const OT::MATH&
 _get_math (hb_face_t *face)
 {

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-maxp-table.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-maxp-table.hh	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-maxp-table.hh	2018-10-30 23:50:16 UTC (rev 49031)
@@ -117,7 +117,7 @@
     return result;
   }
 
-  static inline void drop_hint_fields (hb_subset_plan_t *plan, maxp *maxp_prime)
+  static inline void drop_hint_fields (hb_subset_plan_t *plan HB_UNUSED, maxp *maxp_prime)
   {
     if (maxp_prime->version.major == 1)
     {

Added: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-name-language.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-name-language.cc	                        (rev 0)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-name-language.cc	2018-10-30 23:50:16 UTC (rev 49031)
@@ -0,0 +1,457 @@
+/*
+ * 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-name-language.hh"
+
+/* Following two tables were generated by joining FreeType, FontConfig,
+ * and OpenType specification language lists, then filled in missing
+ * entries using:
+ * https://docs.microsoft.com/en-us/windows/desktop/intl/language-identifier-constants-and-strings
+ */
+
+struct hb_ot_language_map_t
+{
+  static int cmp (const void *key, const void *item)
+  {
+    unsigned int a = * (unsigned int *) key;
+    unsigned int b = ((const hb_ot_language_map_t *) item)->code;
+    return a < b ? -1 : a > b ? +1 : 0;
+  }
+
+  uint16_t	code;
+  char		lang[6];
+};
+
+static const hb_ot_language_map_t
+hb_ms_language_map[] =
+{
+  {0x0001,	"ar"},	/* ??? */
+  {0x0004,	"zh"},	/* ??? */
+  {0x0009,	"en"},	/* ??? */
+  {0x0401,	"ar"},	/* Arabic (Saudi Arabia) */
+  {0x0402,	"bg"},	/* Bulgarian (Bulgaria) */
+  {0x0403,	"ca"},	/* Catalan (Catalan) */
+  {0x0404,	"zh-tw"},	/* Chinese (Taiwan) */
+  {0x0405,	"cs"},	/* Czech (Czech Republic) */
+  {0x0406,	"da"},	/* Danish (Denmark) */
+  {0x0407,	"de"},	/* German (Germany) */
+  {0x0408,	"el"},	/* Greek (Greece) */
+  {0x0409,	"en"},	/* English (United States) */
+  {0x040A,	"es"},	/* Spanish (Traditional Sort) (Spain) */
+  {0x040B,	"fi"},	/* Finnish (Finland) */
+  {0x040C,	"fr"},	/* French (France) */
+  {0x040D,	"he"},	/* Hebrew (Israel) */
+  {0x040E,	"hu"},	/* Hungarian (Hungary) */
+  {0x040F,	"is"},	/* Icelandic (Iceland) */
+  {0x0410,	"it"},	/* Italian (Italy) */
+  {0x0411,	"ja"},	/* Japanese (Japan) */
+  {0x0412,	"ko"},	/* Korean (Korea) */
+  {0x0413,	"nl"},	/* Dutch (Netherlands) */
+  {0x0414,	"no"},	/* Norwegian (Bokmal) (Norway) */
+  {0x0415,	"pl"},	/* Polish (Poland) */
+  {0x0416,	"pt"},	/* Portuguese (Brazil) */
+  {0x0417,	"rm"},	/* Romansh (Switzerland) */
+  {0x0418,	"ro"},	/* Romanian (Romania) */
+  {0x0419,	"ru"},	/* Russian (Russia) */
+  {0x041A,	"hr"},	/* Croatian (Croatia) */
+  {0x041B,	"sk"},	/* Slovak (Slovakia) */
+  {0x041C,	"sq"},	/* Albanian (Albania) */
+  {0x041D,	"sv"},	/* Swedish (Sweden) */
+  {0x041E,	"th"},	/* Thai (Thailand) */
+  {0x041F,	"tr"},	/* Turkish (Turkey) */
+  {0x0420,	"ur"},	/* Urdu (Islamic Republic of Pakistan) */
+  {0x0421,	"id"},	/* Indonesian (Indonesia) */
+  {0x0422,	"uk"},	/* Ukrainian (Ukraine) */
+  {0x0423,	"be"},	/* Belarusian (Belarus) */
+  {0x0424,	"sl"},	/* Slovenian (Slovenia) */
+  {0x0425,	"et"},	/* Estonian (Estonia) */
+  {0x0426,	"lv"},	/* Latvian (Latvia) */
+  {0x0427,	"lt"},	/* Lithuanian (Lithuania) */
+  {0x0428,	"tg"},	/* Tajik (Cyrillic) (Tajikistan) */
+  {0x0429,	"fa"},	/* Persian (Iran) */
+  {0x042A,	"vi"},	/* Vietnamese (Vietnam) */
+  {0x042B,	"hy"},	/* Armenian (Armenia) */
+  {0x042C,	"az"},	/* Azeri (Latin) (Azerbaijan) */
+  {0x042D,	"eu"},	/* Basque (Basque) */
+  {0x042E,	"hsb"},	/* Upper Sorbian (Germany) */
+  {0x042F,	"mk"},	/* Macedonian (FYROM) (Former Yugoslav Republic of Macedonia) */
+  {0x0430,	"st"},	/* ??? */
+  {0x0431,	"ts"},	/* ??? */
+  {0x0432,	"tn"},	/* Setswana (South Africa) */
+  {0x0433,	"ven"},	/* ??? */
+  {0x0434,	"xh"},	/* isiXhosa (South Africa) */
+  {0x0435,	"zu"},	/* isiZulu (South Africa) */
+  {0x0436,	"af"},	/* Afrikaans (South Africa) */
+  {0x0437,	"ka"},	/* Georgian (Georgia) */
+  {0x0438,	"fo"},	/* Faroese (Faroe Islands) */
+  {0x0439,	"hi"},	/* Hindi (India) */
+  {0x043A,	"mt"},	/* Maltese (Malta) */
+  {0x043B,	"se"},	/* Sami (Northern) (Norway) */
+  {0x043C,	"ga"},	/* ??? */
+  {0x043D,	"yi"},	/* ??? */
+  {0x043E,	"ms"},	/* Malay (Malaysia) */
+  {0x043F,	"kk"},	/* Kazakh (Kazakhstan) */
+  {0x0440,	"ky"},	/* Kyrgyz (Kyrgyzstan) */
+  {0x0441,	"sw"},	/* Kiswahili (Kenya) */
+  {0x0442,	"tk"},	/* Turkmen (Turkmenistan) */
+  {0x0443,	"uz"},	/* Uzbek (Latin) (Uzbekistan) */
+  {0x0444,	"tt"},	/* Tatar (Russia) */
+  {0x0445,	"bn"},	/* Bengali (India) */
+  {0x0446,	"pa"},	/* Punjabi (India) */
+  {0x0447,	"gu"},	/* Gujarati (India) */
+  {0x0448,	"or"},	/* Odia (formerly Oriya) (India) */
+  {0x0449,	"ta"},	/* Tamil (India) */
+  {0x044A,	"te"},	/* Telugu (India) */
+  {0x044B,	"kn"},	/* Kannada (India) */
+  {0x044C,	"ml"},	/* Malayalam (India) */
+  {0x044D,	"as"},	/* Assamese (India) */
+  {0x044E,	"mr"},	/* Marathi (India) */
+  {0x044F,	"sa"},	/* Sanskrit (India) */
+  {0x0450,	"mn"},	/* Mongolian (Cyrillic) (Mongolia) */
+  {0x0451,	"bo"},	/* Tibetan (PRC) */
+  {0x0452,	"cy"},	/* Welsh (United Kingdom) */
+  {0x0453,	"km"},	/* Khmer (Cambodia) */
+  {0x0454,	"lo"},	/* Lao (Lao P.D.R.) */
+  {0x0455,	"my"},	/* ??? */
+  {0x0456,	"gl"},	/* Galician (Galician) */
+  {0x0457,	"kok"},	/* Konkani (India) */
+  {0x0458,	"mni"},	/* ??? */
+  {0x0459,	"sd"},	/* ??? */
+  {0x045A,	"syr"},	/* Syriac (Syria) */
+  {0x045B,	"si"},	/* Sinhala (Sri Lanka) */
+  {0x045C,	"chr"},	/* ??? */
+  {0x045D,	"iu"},	/* Inuktitut (Canada) */
+  {0x045E,	"am"},	/* Amharic (Ethiopia) */
+  {0x0460,	"ks"},	/* ??? */
+  {0x0461,	"ne"},	/* Nepali (Nepal) */
+  {0x0462,	"fy"},	/* Frisian (Netherlands) */
+  {0x0463,	"ps"},	/* Pashto (Afghanistan) */
+  {0x0464,	"phi"},	/* Filipino (Philippines) */
+  {0x0465,	"div"},	/* Divehi (Maldives) */
+  {0x0468,	"ha"},	/* Hausa (Latin) (Nigeria) */
+  {0x046A,	"yo"},	/* Yoruba (Nigeria) */
+  {0x046B,	"quz"},	/* Quechua (Bolivia) */
+  {0x046C,	"nso"},	/* Sesotho sa Leboa (South Africa) */
+  {0x046D,	"ba"},	/* Bashkir (Russia) */
+  {0x046E,	"lb"},	/* Luxembourgish (Luxembourg) */
+  {0x046F,	"kl"},	/* Greenlandic (Greenland) */
+  {0x0470,	"ibo"},	/* Igbo (Nigeria) */
+  {0x0471,	"kau"},	/* ??? */
+  {0x0472,	"om"},	/* ??? */
+  {0x0473,	"ti"},	/* ??? */
+  {0x0474,	"gn"},	/* ??? */
+  {0x0475,	"haw"},	/* ??? */
+  {0x0476,	"la"},	/* ??? */
+  {0x0477,	"so"},	/* ??? */
+  {0x0478,	"ii"},	/* Yi (PRC) */
+  {0x0479,	"pap"},	/* ??? */
+  {0x047A,	"arn"},	/* Mapudungun (Chile) */
+  {0x047C,	"moh"},	/* Mohawk (Mohawk) */
+  {0x047E,	"br"},	/* Breton (France) */
+  {0x0480,	"ug"},	/* Uighur (PRC) */
+  {0x0481,	"mi"},	/* Maori (New Zealand) */
+  {0x0482,	"oc"},	/* Occitan (France) */
+  {0x0483,	"co"},	/* Corsican (France) */
+  {0x0484,	"gsw"},	/* Alsatian (France) */
+  {0x0485,	"sah"},	/* Yakut (Russia) */
+  {0x0486,	"qut"},	/* K'iche (Guatemala) */
+  {0x0487,	"rw"},	/* Kinyarwanda (Rwanda) */
+  {0x0488,	"wo"},	/* Wolof (Senegal) */
+  {0x048C,	"fa"},	/* Dari (Afghanistan) */
+  {0x0801,	"ar"},	/* Arabic (Iraq) */
+  {0x0804,	"zh-cn"},	/* Chinese (People’s Republic of China) */
+  {0x0807,	"de"},	/* German (Switzerland) */
+  {0x0809,	"en"},	/* English (United Kingdom) */
+  {0x080A,	"es"},	/* Spanish (Mexico) */
+  {0x080C,	"fr"},	/* French (Belgium) */
+  {0x0810,	"it"},	/* Italian (Switzerland) */
+  {0x0812,	"ko"},	/* ??? */
+  {0x0813,	"nl"},	/* Dutch (Belgium) */
+  {0x0814,	"nn"},	/* Norwegian (Nynorsk) (Norway) */
+  {0x0816,	"pt"},	/* Portuguese (Portugal) */
+  {0x0818,	"mo"},	/* ??? */
+  {0x0819,	"ru"},	/* ??? */
+  {0x081A,	"sr"},	/* Serbian (Latin) (Serbia) */
+  {0x081D,	"sv"},	/* Sweden (Finland) */
+  {0x0820,	"ur"},	/* ??? */
+  {0x0827,	"lt"},	/* ??? */
+  {0x082C,	"az"},	/* Azeri (Cyrillic) (Azerbaijan) */
+  {0x082E,	"dsb"},	/* Lower Sorbian (Germany) */
+//{0x083B,	""},	/* Sami (Northern) (Sweden) */
+  {0x083C,	"gd"},	/* Irish (Ireland) */
+  {0x083E,	"ms"},	/* Malay (Brunei Darussalam) */
+  {0x0843,	"uz"},	/* Uzbek (Cyrillic) (Uzbekistan) */
+  {0x0845,	"bn"},	/* Bengali (Bangladesh) */
+  {0x0846,	"ar"},	/* ??? */
+  {0x0850,	"mn"},	/* Mongolian (Traditional) (People’s Republic of China) */
+  {0x0851,	"dz"},	/* ??? */
+  {0x085D,	"iu"},	/* Inuktitut (Latin) (Canada) */
+  {0x085F,	"tzm"},	/* Tamazight (Latin) (Algeria) */
+  {0x0861,	"ne"},	/* ??? */
+//{0x086B,	""},	/* Quechua (Ecuador) */
+  {0x0873,	"ti"},	/* ??? */
+  {0x0C01,	"ar"},	/* Arabic (Egypt) */
+  {0x0C04,	"zh-hk"},	/* Chinese (Hong Kong S.A.R.) */
+  {0x0C07,	"de"},	/* German (Austria) */
+  {0x0C09,	"en"},	/* English (Australia) */
+  {0x0C0A,	"es"},	/* Spanish (Modern Sort) (Spain) */
+  {0x0C0C,	"fr"},	/* French (Canada) */
+  {0x0C1A,	"sr"},	/* Serbian (Cyrillic) (Serbia) */
+  {0x0C3B,	"se"},	/* Sami (Northern) (Finland) */
+//{0x0C6B,	""},	/* Quechua (Peru) */
+  {0x1001,	"ar"},	/* Arabic (Libya) */
+  {0x1004,	"zh-sg"},	/* Chinese (Singapore) */
+  {0x1007,	"de"},	/* German (Luxembourg) */
+  {0x1009,	"en"},	/* English (Canada) */
+  {0x100A,	"es"},	/* Spanish (Guatemala) */
+  {0x100C,	"fr"},	/* French (Switzerland) */
+  {0x101A,	"hr"},	/* Croatian (Latin) (Bosnia and Herzegovina) */
+  {0x103B,	"smj"},	/* Sami (Lule) (Norway) */
+  {0x1401,	"ar"},	/* Arabic (Algeria) */
+//{0x1404,	""},	/* Chinese (Macao S.A.R.) */
+  {0x1407,	"de"},	/* German (Liechtenstein) */
+  {0x1409,	"en"},	/* English (New Zealand) */
+  {0x140A,	"es"},	/* Spanish (Costa Rica) */
+  {0x140C,	"fr"},	/* French (Luxembourg) */
+  {0x141A,	"bs"},	/* Bosnian (Latin) (Bosnia and Herzegovina) */
+//{0x143B,	""},	/* Sami (Lule) (Sweden) */
+  {0x1801,	"ar"},	/* Arabic (Morocco) */
+  {0x1809,	"en"},	/* English (Ireland) */
+  {0x180A,	"es"},	/* Spanish (Panama) */
+  {0x180C,	"fr"},	/* French (Principality of Monaco) */
+//{0x181A,	""},	/* Serbian (Latin) (Bosnia and Herzegovina) */
+  {0x183B,	"sma"},	/* Sami (Southern) (Norway) */
+  {0x1C01,	"ar"},	/* Arabic (Tunisia) */
+  {0x1C09,	"en"},	/* English (South Africa) */
+  {0x1C0A,	"es"},	/* Spanish (Dominican Republic) */
+  {0x1C0C,	"fr"},	/* ??? */
+//{0x1C1A,	""},	/* Serbian (Cyrillic) (Bosnia and Herzegovina) */
+//{0x1C3B,	""},	/* Sami (Southern) (Sweden) */
+  {0x2001,	"ar"},	/* Arabic (Oman) */
+  {0x2009,	"en"},	/* English (Jamaica) */
+  {0x200A,	"es"},	/* Spanish (Venezuela) */
+  {0x200C,	"fr"},	/* ??? */
+  {0x201A,	"bs"},	/* Bosnian (Cyrillic) (Bosnia and Herzegovina) */
+  {0x203B,	"sms"},	/* Sami (Skolt) (Finland) */
+  {0x2401,	"ar"},	/* Arabic (Yemen) */
+  {0x2409,	"en"},	/* English (Caribbean) */
+  {0x240A,	"es"},	/* Spanish (Colombia) */
+  {0x240C,	"fr"},	/* ??? */
+  {0x243B,	"smn"},	/* Sami (Inari) (Finland) */
+  {0x2801,	"ar"},	/* Arabic (Syria) */
+  {0x2809,	"en"},	/* English (Belize) */
+  {0x280A,	"es"},	/* Spanish (Peru) */
+  {0x280C,	"fr"},	/* ??? */
+  {0x2C01,	"ar"},	/* Arabic (Jordan) */
+  {0x2C09,	"en"},	/* English (Trinidad and Tobago) */
+  {0x2C0A,	"es"},	/* Spanish (Argentina) */
+  {0x2C0C,	"fr"},	/* ??? */
+  {0x3001,	"ar"},	/* Arabic (Lebanon) */
+  {0x3009,	"en"},	/* English (Zimbabwe) */
+  {0x300A,	"es"},	/* Spanish (Ecuador) */
+  {0x300C,	"fr"},	/* ??? */
+  {0x3401,	"ar"},	/* Arabic (Kuwait) */
+  {0x3409,	"en"},	/* English (Republic of the Philippines) */
+  {0x340A,	"es"},	/* Spanish (Chile) */
+  {0x340C,	"fr"},	/* ??? */
+  {0x3801,	"ar"},	/* Arabic (U.A.E.) */
+  {0x380A,	"es"},	/* Spanish (Uruguay) */
+  {0x380C,	"fr"},	/* ??? */
+  {0x3C01,	"ar"},	/* Arabic (Bahrain) */
+  {0x3C09,	"en"},	/* ??? */
+  {0x3C0A,	"es"},	/* Spanish (Paraguay) */
+  {0x3C0C,	"fr"},	/* ??? */
+  {0x4001,	"ar"},	/* Arabic (Qatar) */
+  {0x4009,	"en"},	/* English (India) */
+  {0x400A,	"es"},	/* Spanish (Bolivia) */
+  {0x4409,	"en"},	/* English (Malaysia) */
+  {0x440A,	"es"},	/* Spanish (El Salvador) */
+  {0x4809,	"en"},	/* English (Singapore) */
+  {0x480A,	"es"},	/* Spanish (Honduras) */
+  {0x4C0A,	"es"},	/* Spanish (Nicaragua) */
+  {0x500A,	"es"},	/* Spanish (Puerto Rico) */
+  {0x540A,	"es"},	/* Spanish (United States) */
+  {0xE40A,	"es"},	/* ??? */
+  {0xE40C,	"fr"},	/* ??? */
+};
+
+static const hb_ot_language_map_t
+hb_mac_language_map[] =
+{
+  {  0,	"en"},	/* English */
+  {  1,	"fr"},	/* French */
+  {  2,	"de"},	/* German */
+  {  3,	"it"},	/* Italian */
+  {  4,	"nl"},	/* Dutch */
+  {  5,	"sv"},	/* Swedish */
+  {  6,	"es"},	/* Spanish */
+  {  7,	"da"},	/* Danish */
+  {  8,	"pt"},	/* Portuguese */
+  {  9,	"no"},	/* Norwegian */
+  { 10,	"he"},	/* Hebrew */
+  { 11,	"ja"},	/* Japanese */
+  { 12,	"ar"},	/* Arabic */
+  { 13,	"fi"},	/* Finnish */
+  { 14,	"el"},	/* Greek */
+  { 15,	"is"},	/* Icelandic */
+  { 16,	"mt"},	/* Maltese */
+  { 17,	"tr"},	/* Turkish */
+  { 18,	"hr"},	/* Croatian */
+  { 19,	"zh-tw"},	/* Chinese (Traditional) */
+  { 20,	"ur"},	/* Urdu */
+  { 21,	"hi"},	/* Hindi */
+  { 22,	"th"},	/* Thai */
+  { 23,	"ko"},	/* Korean */
+  { 24,	"lt"},	/* Lithuanian */
+  { 25,	"pl"},	/* Polish */
+  { 26,	"hu"},	/* Hungarian */
+  { 27,	"et"},	/* Estonian */
+  { 28,	"lv"},	/* Latvian */
+//{ 29,	""},	/* Sami */
+  { 30,	"fo"},	/* Faroese */
+  { 31,	"fa"},	/* Farsi/Persian */
+  { 32,	"ru"},	/* Russian */
+  { 33,	"zh-cn"},	/* Chinese (Simplified) */
+  { 34,	"nl"},	/* Flemish */
+  { 35,	"ga"},	/* Irish Gaelic */
+  { 36,	"sq"},	/* Albanian */
+  { 37,	"ro"},	/* Romanian */
+  { 38,	"cs"},	/* Czech */
+  { 39,	"sk"},	/* Slovak */
+  { 40,	"sl"},	/* Slovenian */
+  { 41,	"yi"},	/* Yiddish */
+  { 42,	"sr"},	/* Serbian */
+  { 43,	"mk"},	/* Macedonian */
+  { 44,	"bg"},	/* Bulgarian */
+  { 45,	"uk"},	/* Ukrainian */
+  { 46,	"be"},	/* Byelorussian */
+  { 47,	"uz"},	/* Uzbek */
+  { 48,	"kk"},	/* Kazakh */
+  { 49,	"az"},	/* Azerbaijani (Cyrillic script) */
+  { 50,	"az"},	/* Azerbaijani (Arabic script) */
+  { 51,	"hy"},	/* Armenian */
+  { 52,	"ka"},	/* Georgian */
+  { 53,	"mo"},	/* Moldavian */
+  { 54,	"ky"},	/* Kirghiz */
+  { 55,	"tg"},	/* Tajiki */
+  { 56,	"tk"},	/* Turkmen */
+  { 57,	"mn"},	/* Mongolian (Mongolian script) */
+  { 58,	"mn"},	/* Mongolian (Cyrillic script) */
+  { 59,	"ps"},	/* Pashto */
+  { 60,	"ku"},	/* Kurdish */
+  { 61,	"ks"},	/* Kashmiri */
+  { 62,	"sd"},	/* Sindhi */
+  { 63,	"bo"},	/* Tibetan */
+  { 64,	"ne"},	/* Nepali */
+  { 65,	"sa"},	/* Sanskrit */
+  { 66,	"mr"},	/* Marathi */
+  { 67,	"bn"},	/* Bengali */
+  { 68,	"as"},	/* Assamese */
+  { 69,	"gu"},	/* Gujarati */
+  { 70,	"pa"},	/* Punjabi */
+  { 71,	"or"},	/* Oriya */
+  { 72,	"ml"},	/* Malayalam */
+  { 73,	"kn"},	/* Kannada */
+  { 74,	"ta"},	/* Tamil */
+  { 75,	"te"},	/* Telugu */
+  { 76,	"si"},	/* Sinhalese */
+  { 77,	"my"},	/* Burmese */
+  { 78,	"km"},	/* Khmer */
+  { 79,	"lo"},	/* Lao */
+  { 80,	"vi"},	/* Vietnamese */
+  { 81,	"id"},	/* Indonesian */
+  { 82,	"tl"},	/* Tagalog */
+  { 83,	"ms"},	/* Malay (Roman script) */
+  { 84,	"ms"},	/* Malay (Arabic script) */
+  { 85,	"am"},	/* Amharic */
+  { 86,	"ti"},	/* Tigrinya */
+  { 87,	"om"},	/* Galla */
+  { 88,	"so"},	/* Somali */
+  { 89,	"sw"},	/* Swahili */
+  { 90,	"rw"},	/* Kinyarwanda/Ruanda */
+  { 91,	"rn"},	/* Rundi */
+  { 92,	"ny"},	/* Nyanja/Chewa */
+  { 93,	"mg"},	/* Malagasy */
+  { 94,	"eo"},	/* Esperanto */
+  {128,	"cy"},	/* Welsh */
+  {129,	"eu"},	/* Basque */
+  {130,	"ca"},	/* Catalan */
+  {131,	"la"},	/* Latin */
+  {132,	"qu"},	/* Quechua */
+  {133,	"gn"},	/* Guarani */
+  {134,	"ay"},	/* Aymara */
+  {135,	"tt"},	/* Tatar */
+  {136,	"ug"},	/* Uighur */
+  {137,	"dz"},	/* Dzongkha */
+  {138,	"jw"},	/* Javanese (Roman script) */
+  {139,	"su"},	/* Sundanese (Roman script) */
+  {140,	"gl"},	/* Galician */
+  {141,	"af"},	/* Afrikaans */
+  {142,	"br"},	/* Breton */
+  {143,	"iu"},	/* Inuktitut */
+  {144,	"gd"},	/* Scottish Gaelic */
+  {145,	"gv"},	/* Manx Gaelic */
+  {146,	"ga"},	/* Irish Gaelic (with dot above) */
+  {147,	"to"},	/* Tongan */
+  {148,	"el"},	/* Greek (polytonic) */
+  {149,	"ik"},	/* Greenlandic */
+  {150,	"az"},	/* Azerbaijani (Roman script) */
+};
+
+
+static hb_language_t
+_hb_ot_name_language_for (unsigned int code,
+			  const hb_ot_language_map_t *array,
+			  unsigned int len)
+{
+  const hb_ot_language_map_t *entry = (const hb_ot_language_map_t *)
+				      hb_bsearch (&code,
+						  array,
+						  len,
+						  sizeof (array[0]),
+						  hb_ot_language_map_t::cmp);
+
+  if (entry)
+    return hb_language_from_string (entry->lang, -1);
+
+  return HB_LANGUAGE_INVALID;
+}
+
+hb_language_t
+_hb_ot_name_language_for_ms_code (unsigned int code)
+{
+  return _hb_ot_name_language_for (code,
+				   hb_ms_language_map,
+				   ARRAY_LENGTH (hb_ms_language_map));
+}
+
+hb_language_t
+_hb_ot_name_language_for_mac_code (unsigned int code)
+{
+  return _hb_ot_name_language_for (code,
+				   hb_mac_language_map,
+				   ARRAY_LENGTH (hb_mac_language_map));
+}

Added: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-name-language.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-name-language.hh	                        (rev 0)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-name-language.hh	2018-10-30 23:50:16 UTC (rev 49031)
@@ -0,0 +1,40 @@
+/*
+ * 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
+ */
+
+#ifndef HB_OT_NAME_LANGUAGE_HH
+#define HB_OT_NAME_LANGUAGE_HH
+
+#include "hb.hh"
+
+
+HB_INTERNAL hb_language_t
+_hb_ot_name_language_for_ms_code (unsigned int code);
+
+HB_INTERNAL hb_language_t
+_hb_ot_name_language_for_mac_code (unsigned int code);
+
+
+#endif /* HB_OT_NAME_LANGUAGE_HH */

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-name-table.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-name-table.hh	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-name-table.hh	2018-10-30 23:50:16 UTC (rev 49031)
@@ -28,11 +28,17 @@
 #define HB_OT_NAME_TABLE_HH
 
 #include "hb-open-type.hh"
+#include "hb-ot-name-language.hh"
+#include "hb-aat-layout.hh"
 
 
 namespace OT {
 
 
+#define entry_score var.u16[0]
+#define entry_index var.u16[1]
+
+
 /*
  * name -- Naming
  * https://docs.microsoft.com/en-us/typography/opentype/spec/name
@@ -39,25 +45,54 @@
  */
 #define HB_OT_TAG_name HB_TAG('n','a','m','e')
 
+#define UNSUPPORTED	42
 
 struct NameRecord
 {
-  static int cmp (const void *pa, const void *pb)
+  inline hb_language_t language (hb_face_t *face) const
   {
-    const NameRecord *a = (const NameRecord *) pa;
-    const NameRecord *b = (const NameRecord *) pb;
-    int ret;
-    ret = b->platformID.cmp (a->platformID);
-    if (ret) return ret;
-    ret = b->encodingID.cmp (a->encodingID);
-    if (ret) return ret;
-    ret = b->languageID.cmp (a->languageID);
-    if (ret) return ret;
-    ret = b->nameID.cmp (a->nameID);
-    if (ret) return ret;
-    return 0;
+    unsigned int p = platformID;
+    unsigned int l = languageID;
+
+    if (p == 3)
+      return _hb_ot_name_language_for_ms_code (l);
+
+    if (p == 1)
+      return _hb_ot_name_language_for_mac_code (l);
+
+    if (p == 0)
+      return _hb_aat_language_get (face, l);
+
+    return HB_LANGUAGE_INVALID;
   }
 
+  inline uint16_t score (void) const
+  {
+    /* Same order as in cmap::find_best_subtable(). */
+    unsigned int p = platformID;
+    unsigned int e = encodingID;
+
+    /* 32-bit. */
+    if (p == 3 && e == 10) return 0;
+    if (p == 0 && e ==  6) return 1;
+    if (p == 0 && e ==  4) return 2;
+
+    /* 16-bit. */
+    if (p == 3 && e ==  1) return 3;
+    if (p == 0 && e ==  3) return 4;
+    if (p == 0 && e ==  2) return 5;
+    if (p == 0 && e ==  1) return 6;
+    if (p == 0 && e ==  0) return 7;
+
+    /* Symbol. */
+    if (p == 3 && e ==  0) return 8;
+
+    /* We treat all Mac Latin names as ASCII only. */
+    if (p == 1 && e ==  0) return 10; /* 10 is magic number :| */
+
+    return UNSUPPORTED;
+  }
+
   inline bool sanitize (hb_sanitize_context_t *c, const void *base) const
   {
     TRACE_SANITIZE (this);
@@ -75,39 +110,57 @@
   DEFINE_SIZE_STATIC (12);
 };
 
-struct name
+static int
+_hb_ot_name_entry_cmp_key (const void *pa, const void *pb)
 {
-  static const hb_tag_t tableTag	= HB_OT_TAG_name;
+  const hb_ot_name_entry_t *a = (const hb_ot_name_entry_t *) pa;
+  const hb_ot_name_entry_t *b = (const hb_ot_name_entry_t *) pb;
 
-  inline unsigned int get_name (unsigned int platform_id,
-				unsigned int encoding_id,
-				unsigned int language_id,
-				unsigned int name_id,
-				void *buffer,
-				unsigned int buffer_length) const
-  {
-    NameRecord key;
-    key.platformID.set (platform_id);
-    key.encodingID.set (encoding_id);
-    key.languageID.set (language_id);
-    key.nameID.set (name_id);
-    NameRecord *match = (NameRecord *) bsearch (&key, nameRecordZ.arrayZ, count, sizeof (nameRecordZ[0]), NameRecord::cmp);
+  /* Compare by name_id, then language. */
 
-    if (!match)
-      return 0;
+  if (a->name_id != b->name_id)
+    return a->name_id < b->name_id ? -1 : +1;
 
-    unsigned int length = MIN (buffer_length, (unsigned int) match->length);
-    memcpy (buffer, (char *) this + stringOffset + match->offset, length);
-    return length;
-  }
+  if (a->language == b->language) return 0;
+  if (!a->language) return -1;
+  if (!b->language) return +1;
+  return strcmp (hb_language_to_string (a->language),
+		 hb_language_to_string (b->language));
+}
 
+static int
+_hb_ot_name_entry_cmp (const void *pa, const void *pb)
+{
+  /* Compare by name_id, then language, then score, then index. */
+
+  int v = _hb_ot_name_entry_cmp_key (pa, pb);
+  if (v)
+    return v;
+
+  const hb_ot_name_entry_t *a = (const hb_ot_name_entry_t *) pa;
+  const hb_ot_name_entry_t *b = (const hb_ot_name_entry_t *) pb;
+
+  if (a->entry_score != b->entry_score)
+    return a->entry_score < b->entry_score ? -1 : +1;
+
+  if (a->entry_index != b->entry_index)
+    return a->entry_index < b->entry_index ? -1 : +1;
+
+  return 0;
+}
+
+struct name
+{
+  static const hb_tag_t tableTag	= HB_OT_TAG_name;
+
   inline unsigned int get_size (void) const
   { return min_size + count * nameRecordZ[0].min_size; }
 
   inline bool sanitize_records (hb_sanitize_context_t *c) const {
     TRACE_SANITIZE (this);
-    char *string_pool = (char *) this + stringOffset;
+    const void *string_pool = (this+stringOffset).arrayZ;
     unsigned int _count = count;
+    /* Move to run-time?! */
     for (unsigned int i = 0; i < _count; i++)
       if (!nameRecordZ[i].sanitize (c, string_pool)) return_trace (false);
     return_trace (true);
@@ -119,13 +172,100 @@
     return_trace (c->check_struct (this) &&
 		  likely (format == 0 || format == 1) &&
 		  c->check_array (nameRecordZ.arrayZ, count) &&
-		  sanitize_records (c));
+		  c->check_range (this, stringOffset));
   }
 
+  struct accelerator_t
+  {
+    inline void init (hb_face_t *face)
+    {
+      this->blob = hb_sanitize_context_t().reference_table<name> (face);
+      this->table = this->blob->as<name> ();
+      assert (this->blob->length >= this->table->stringOffset);
+      this->pool = (this->table+this->table->stringOffset).arrayZ;
+      this->pool_len = this->blob->length - this->table->stringOffset;
+      const hb_array_t<const NameRecord> all_names (this->table->nameRecordZ.arrayZ,
+						    this->table->count);
+
+      this->names.init ();
+      this->names.alloc (all_names.len);
+
+      for (uint16_t i = 0; i < all_names.len; i++)
+      {
+	hb_ot_name_entry_t *entry = this->names.push ();
+
+	entry->name_id = all_names[i].nameID;
+	entry->language = all_names[i].language (face);
+	entry->entry_score =  all_names[i].score ();
+	entry->entry_index = i;
+      }
+
+      this->names.qsort (_hb_ot_name_entry_cmp);
+      /* Walk and pick best only for each name_id,language pair,
+       * while dropping unsupported encodings. */
+      unsigned int j = 0;
+      for (unsigned int i = 0; i < this->names.len; i++)
+      {
+        if (this->names[i].entry_score == UNSUPPORTED ||
+	    this->names[i].language == HB_LANGUAGE_INVALID)
+	  continue;
+        if (i &&
+	    this->names[i - 1].name_id  == this->names[i].name_id &&
+	    this->names[i - 1].language == this->names[i].language)
+	  continue;
+	this->names[j++] = this->names[i];
+      }
+      this->names.resize (j);
+    }
+
+    inline void fini (void)
+    {
+      this->names.fini ();
+      hb_blob_destroy (this->blob);
+    }
+
+    inline int get_index (hb_ot_name_id_t   name_id,
+			  hb_language_t     language,
+			  unsigned int     *width=nullptr) const
+    {
+      const hb_ot_name_entry_t key = {name_id, {0}, language};
+      const hb_ot_name_entry_t *entry = (const hb_ot_name_entry_t *)
+					hb_bsearch (&key,
+						    this->names.arrayZ(),
+						    this->names.len,
+						    sizeof (key),
+						    _hb_ot_name_entry_cmp_key);
+      if (!entry)
+        return -1;
+
+      if (width)
+        *width = entry->entry_score < 10 ? 2 : 1;
+
+      return entry->entry_index;
+    }
+
+    inline hb_bytes_t get_name (unsigned int idx) const
+    {
+      const hb_array_t<const NameRecord> all_names (table->nameRecordZ.arrayZ, table->count);
+      const NameRecord &record = all_names[idx];
+      const hb_array_t<const char> string_pool ((const char *) pool, pool_len);
+      return string_pool.sub_array (record.offset, record.length).as_bytes ();
+    }
+
+    private:
+    hb_blob_t *blob;
+    const void *pool;
+    unsigned int pool_len;
+    public:
+    const name *table;
+    hb_vector_t<hb_ot_name_entry_t> names;
+  };
+
   /* We only implement format 0 for now. */
   HBUINT16	format;			/* Format selector (=0/1). */
   HBUINT16	count;			/* Number of name records. */
-  Offset16	stringOffset;		/* Offset to start of string storage (from start of table). */
+  OffsetTo<UnsizedArrayOf<HBUINT8>, HBUINT16, false>
+		stringOffset;		/* Offset to start of string storage (from start of table). */
   UnsizedArrayOf<NameRecord>
 		nameRecordZ;		/* The name records where count is the number of records. */
   public:
@@ -132,6 +272,7 @@
   DEFINE_SIZE_ARRAY (6, nameRecordZ);
 };
 
+struct name_accelerator_t : name::accelerator_t {};
 
 } /* namespace OT */
 

Added: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-name.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-name.cc	                        (rev 0)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-name.cc	2018-10-30 23:50:16 UTC (rev 49031)
@@ -0,0 +1,231 @@
+/*
+ * 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.hh"
+
+#include "hb-ot-name-table.hh"
+
+#include "hb-ot-face.hh"
+#include "hb-utf.hh"
+
+
+/**
+ * SECTION:hb-ot-name
+ * @title: hb-ot-name
+ * @short_description: OpenType font name information
+ * @include: hb-ot.h
+ *
+ * Functions for fetching name strings from OpenType fonts.
+ **/
+
+
+static inline const OT::name_accelerator_t&
+_get_name (hb_face_t *face)
+{
+  if (unlikely (!hb_ot_shaper_face_data_ensure (face))) return Null(OT::name_accelerator_t);
+  return *(hb_ot_face_data (face)->name.get ());
+}
+
+/**
+ * hb_ot_name_list_names:
+ * @face: font face.
+ * @num_entries: (out): 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
+ * used as long as @face is alive.
+ *
+ * Returns: (out) (transfer none) (array length=num_entries): Array of available name entries.
+ * Since: 2.1.0
+ **/
+const hb_ot_name_entry_t *
+hb_ot_name_list_names (hb_face_t    *face,
+		       unsigned int *num_entries /* OUT */)
+{
+  const OT::name_accelerator_t &name = _get_name (face);
+  *num_entries = name.names.len;
+  return name.names.arrayZ();
+}
+
+
+template <typename in_utf_t, typename out_utf_t>
+static inline unsigned int
+hb_ot_name_convert_utf (const hb_bytes_t                *bytes,
+			unsigned int                    *text_size /* IN/OUT */,
+			typename out_utf_t::codepoint_t *text /* OUT */)
+{
+  unsigned int src_len = bytes->len / sizeof (typename in_utf_t::codepoint_t);
+  const typename in_utf_t::codepoint_t *src = (const typename in_utf_t::codepoint_t *) bytes->arrayZ;
+  const typename in_utf_t::codepoint_t *src_end = src + src_len;
+
+  typename out_utf_t::codepoint_t *dst = text;
+
+  hb_codepoint_t unicode;
+  const hb_codepoint_t replacement = HB_BUFFER_REPLACEMENT_CODEPOINT_DEFAULT;
+
+  if (text_size && *text_size)
+  {
+    (*text_size)--; /* Same room for NUL-termination. */
+    const typename out_utf_t::codepoint_t *dst_end = text + *text_size;
+
+    while (src < src_end && dst < dst_end)
+    {
+      const typename in_utf_t::codepoint_t *src_next = in_utf_t::next (src, src_end, &unicode, replacement);
+      typename out_utf_t::codepoint_t *dst_next = out_utf_t::encode (dst, dst_end, unicode);
+      if (dst_next == dst)
+        break; /* Out-of-room. */
+
+      dst = dst_next;
+      src = src_next;
+    };
+
+    *text_size = dst - text;
+    *dst = 0; /* NUL-terminate. */
+  }
+
+  /* Accumulate length of rest. */
+  unsigned int dst_len = dst - text;
+  while (src < src_end)
+  {
+    src = in_utf_t::next (src, src_end, &unicode, replacement);
+    dst_len += out_utf_t::encode_len (unicode);
+  };
+  return dst_len;
+}
+
+template <typename utf_t>
+static inline unsigned int
+hb_ot_name_get_utf (hb_face_t       *face,
+		    hb_ot_name_id_t  name_id,
+		    hb_language_t    language,
+		    unsigned int    *text_size /* IN/OUT */,
+		    typename utf_t::codepoint_t *text /* OUT */)
+{
+  const OT::name_accelerator_t &name = _get_name (face);
+
+  if (!language)
+    language = hb_language_from_string ("en", 2);
+
+  unsigned int width;
+  int idx = name.get_index (name_id, language, &width);
+  if (idx != -1)
+  {
+    hb_bytes_t bytes = name.get_name (idx);
+
+    if (width == 2) /* UTF16-BE */
+      return hb_ot_name_convert_utf<hb_utf16_be_t, utf_t> (&bytes, text_size, text);
+
+    if (width == 1) /* ASCII */
+      return hb_ot_name_convert_utf<hb_ascii_t, utf_t> (&bytes, text_size, text);
+  }
+
+  if (text_size)
+  {
+    if (*text_size)
+      *text = 0;
+    *text_size = 0;
+  }
+  return 0;
+}
+
+/**
+ * hb_ot_name_get_utf8:
+ * @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 written to buffer.
+ * @text: (out caller-allocates) (array length=text_size): buffer to write fetched name into.
+ *
+ * Fetches a font name from the OpenType 'name' table.
+ * If @language is #HB_LANGUAGE_INVALID, English ("en") is assumed.
+ * Returns string in UTF-8 encoding.
+ *
+ * Returns: full length of the requested string, or 0 if not found.
+ * Since: 2.1.0
+ **/
+unsigned int
+hb_ot_name_get_utf8 (hb_face_t       *face,
+		     hb_ot_name_id_t  name_id,
+		     hb_language_t    language,
+		     unsigned int    *text_size /* IN/OUT */,
+		     char            *text      /* OUT */)
+{
+  return hb_ot_name_get_utf<hb_utf8_t> (face, name_id, language, text_size,
+					(hb_utf8_t::codepoint_t *) text);
+}
+
+/**
+ * hb_ot_name_get_utf16:
+ * @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 written to buffer.
+ * @text: (out caller-allocates) (array length=text_size): buffer to write fetched name into.
+ *
+ * Fetches a font name from the OpenType 'name' table.
+ * If @language is #HB_LANGUAGE_INVALID, English ("en") is assumed.
+ * Returns string in UTF-16 encoding.
+ *
+ * Returns: full length of the requested string, or 0 if not found.
+ * Since: 2.1.0
+ **/
+unsigned int
+hb_ot_name_get_utf16 (hb_face_t       *face,
+		      hb_ot_name_id_t  name_id,
+		      hb_language_t    language,
+		      unsigned int    *text_size /* IN/OUT */,
+		      uint16_t        *text      /* OUT */)
+{
+  return hb_ot_name_get_utf<hb_utf16_t> (face, name_id, language, text_size, text);
+}
+
+/**
+ * hb_ot_name_get_utf32:
+ * @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 written to buffer.
+ * @text: (out caller-allocates) (array length=text_size): buffer to write fetched name into.
+ *
+ * Fetches a font name from the OpenType 'name' table.
+ * If @language is #HB_LANGUAGE_INVALID, English ("en") is assumed.
+ * Returns string in UTF-32 encoding.
+ *
+ * Returns: full length of the requested string, or 0 if not found.
+ * Since: 2.1.0
+ **/
+unsigned int
+hb_ot_name_get_utf32 (hb_face_t       *face,
+		      hb_ot_name_id_t  name_id,
+		      hb_language_t    language,
+		      unsigned int    *text_size /* IN/OUT */,
+		      uint32_t        *text      /* OUT */)
+{
+  return hb_ot_name_get_utf<hb_utf32_t> (face, name_id, language, text_size, text);
+}

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	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-name.h	2018-10-30 23:50:16 UTC (rev 49031)
@@ -35,19 +35,95 @@
 
 
 /**
- * hb_name_id_t:
+ * hb_ot_name_id_t:
+ * @HB_OT_NAME_ID_INVALID: Value to represent a nonexistent name ID.
  *
+ * An integral type representing an OpenType 'name' table name identifier.
+ * There are predefined name IDs, as well as name IDs return from other
+ * API.  These can be used to fetch name strings from a font face.
+ *
  * Since: 2.0.0
- */
-typedef unsigned int hb_name_id_t;
+ **/
+enum
+{
+  HB_OT_NAME_ID_COPYRIGHT		= 0,
+  HB_OT_NAME_ID_FONT_FAMILY		= 1,
+  HB_OT_NAME_ID_FONT_SUBFAMILY		= 2,
+  HB_OT_NAME_ID_UNIQUE_ID		= 3,
+  HB_OT_NAME_ID_FULL_NAME		= 4,
+  HB_OT_NAME_ID_VERSION_STRING		= 5,
+  HB_OT_NAME_ID_POSTSCRIPT_NAME		= 6,
+  HB_OT_NAME_ID_TRADEMARK		= 7,
+  HB_OT_NAME_ID_MANUFACTURER		= 8,
+  HB_OT_NAME_ID_DESIGNER		= 9,
+  HB_OT_NAME_ID_DESCRIPTION		= 10,
+  HB_OT_NAME_ID_VENDOR_URL		= 11,
+  HB_OT_NAME_ID_DESIGNER_URL		= 12,
+  HB_OT_NAME_ID_LICENSE			= 13,
+  HB_OT_NAME_ID_LICENSE_URL		= 14,
+/*HB_OT_NAME_ID_RESERVED		= 15,*/
+  HB_OT_NAME_ID_TYPOGRAPHIC_FAMILY	= 16,
+  HB_OT_NAME_ID_TYPOGRAPHIC_SUBFAMILY	= 17,
+  HB_OT_NAME_ID_MAC_FULL_NAME		= 18,
+  HB_OT_NAME_ID_SAMPLE_TEXT		= 19,
+  HB_OT_NAME_ID_CID_FINDFONT_NAME	= 20,
+  HB_OT_NAME_ID_WWS_FAMILY		= 21,
+  HB_OT_NAME_ID_WWS_SUBFAMILY		= 22,
+  HB_OT_NAME_ID_LIGHT_BACKGROUND	= 23,
+  HB_OT_NAME_ID_DARK_BACKGROUND		= 24,
+  HB_OT_NAME_ID_VARIATIONS_PS_PREFIX	= 25,
 
+  HB_OT_NAME_ID_INVALID			= 0xFFFF,
+};
+
+typedef unsigned int hb_ot_name_id_t;
+
+
 /**
- * HB_NAME_ID_INVALID
+ * hb_ot_name_entry_t:
+ * @name_id: name ID
+ * @language: language
  *
- * Since: 2.0.0
+ * Structure representing a name ID in a particular language.
+ *
+ * Since: 2.1.0
  **/
-#define HB_NAME_ID_INVALID 0xFFFF
+typedef struct hb_ot_name_entry_t
+{
+  hb_ot_name_id_t name_id;
+  /*< private >*/
+  hb_var_int_t    var;
+  /*< public >*/
+  hb_language_t   language;
+} hb_ot_name_entry_t;
 
+HB_EXTERN const hb_ot_name_entry_t *
+hb_ot_name_list_names (hb_face_t    *face,
+		       unsigned int *num_entries /* OUT */);
+
+
+HB_EXTERN unsigned int
+hb_ot_name_get_utf8 (hb_face_t       *face,
+		     hb_ot_name_id_t  name_id,
+		     hb_language_t    language,
+		     unsigned int    *text_size /* IN/OUT */,
+		     char            *text      /* OUT */);
+
+HB_EXTERN unsigned int
+hb_ot_name_get_utf16 (hb_face_t       *face,
+		      hb_ot_name_id_t  name_id,
+		      hb_language_t    language,
+		      unsigned int    *text_size /* IN/OUT */,
+		      uint16_t        *text      /* OUT */);
+
+HB_EXTERN unsigned int
+hb_ot_name_get_utf32 (hb_face_t       *face,
+		      hb_ot_name_id_t  name_id,
+		      hb_language_t    language,
+		      unsigned int    *text_size /* IN/OUT */,
+		      uint32_t        *text      /* OUT */);
+
+
 HB_END_DECLS
 
 #endif /* HB_OT_NAME_H */

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-os2-unicode-ranges.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-os2-unicode-ranges.hh	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-os2-unicode-ranges.hh	2018-10-30 23:50:16 UTC (rev 49031)
@@ -34,7 +34,7 @@
 struct OS2Range
 {
   static int
-  cmp (const void *_key, const void *_item, void *_arg)
+  cmp (const void *_key, const void *_item)
   {
     hb_codepoint_t cp = *((hb_codepoint_t *) _key);
     const OS2Range *range = (OS2Range *) _item;
@@ -233,10 +233,10 @@
 static unsigned int
 _hb_ot_os2_get_unicode_range_bit (hb_codepoint_t cp)
 {
-  OS2Range *range = (OS2Range*) hb_bsearch_r (&cp, _hb_os2_unicode_ranges,
-					      ARRAY_LENGTH (_hb_os2_unicode_ranges),
-					      sizeof (OS2Range),
-					      OS2Range::cmp, nullptr);
+  OS2Range *range = (OS2Range*) hb_bsearch (&cp, _hb_os2_unicode_ranges,
+					    ARRAY_LENGTH (_hb_os2_unicode_ranges),
+					    sizeof (OS2Range),
+					    OS2Range::cmp);
   if (range != nullptr)
     return range->bit;
   return -1;

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-arabic-fallback.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-arabic-fallback.hh	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-arabic-fallback.hh	2018-10-30 23:50:16 UTC (rev 49031)
@@ -194,8 +194,6 @@
 
 struct arabic_fallback_plan_t
 {
-  ASSERT_POD ();
-
   unsigned int num_lookups;
   bool free_lookups;
 
@@ -220,9 +218,9 @@
 typedef OT::ArrayOf<ManifestLookup> Manifest;
 
 static bool
-arabic_fallback_plan_init_win1256 (arabic_fallback_plan_t *fallback_plan,
-				   const hb_ot_shape_plan_t *plan,
-				   hb_font_t *font)
+arabic_fallback_plan_init_win1256 (arabic_fallback_plan_t *fallback_plan HB_UNUSED,
+				   const hb_ot_shape_plan_t *plan HB_UNUSED,
+				   hb_font_t *font HB_UNUSED)
 {
 #ifdef HB_WITH_WIN1256
   /* Does this font look like it's Windows-1256-encoded? */

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	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-arabic.cc	2018-10-30 23:50:16 UTC (rev 49031)
@@ -243,8 +243,6 @@
 
 struct arabic_shape_plan_t
 {
-  ASSERT_POD ();
-
   /* The "+ 1" in the next array is to accommodate for the "NONE" command,
    * which is not an OpenType feature, but this simplifies the code by not
    * having to do a "if (... < NONE) ..." and just rely on the fact that
@@ -416,7 +414,7 @@
 
 static void
 record_stch (const hb_ot_shape_plan_t *plan,
-	     hb_font_t *font,
+	     hb_font_t *font HB_UNUSED,
 	     hb_buffer_t *buffer)
 {
   const arabic_shape_plan_t *arabic_plan = (const arabic_shape_plan_t *) plan->data;
@@ -440,7 +438,7 @@
 }
 
 static void
-apply_stch (const hb_ot_shape_plan_t *plan,
+apply_stch (const hb_ot_shape_plan_t *plan HB_UNUSED,
 	    hb_buffer_t              *buffer,
 	    hb_font_t                *font)
 {
@@ -626,7 +624,7 @@
 }
 
 static void
-reorder_marks_arabic (const hb_ot_shape_plan_t *plan,
+reorder_marks_arabic (const hb_ot_shape_plan_t *plan HB_UNUSED,
 		      hb_buffer_t              *buffer,
 		      unsigned int              start,
 		      unsigned int              end)

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	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-hangul.cc	2018-10-30 23:50:16 UTC (rev 49031)
@@ -70,8 +70,6 @@
 
 struct hangul_shape_plan_t
 {
-  ASSERT_POD ();
-
   hb_mask_t mask_array[HANGUL_FEATURE_COUNT];
 };
 
@@ -128,7 +126,7 @@
 }
 
 static void
-preprocess_text_hangul (const hb_ot_shape_plan_t *plan,
+preprocess_text_hangul (const hb_ot_shape_plan_t *plan HB_UNUSED,
 			hb_buffer_t              *buffer,
 			hb_font_t                *font)
 {

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	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-indic.cc	2018-10-30 23:50:16 UTC (rev 49031)
@@ -25,6 +25,7 @@
  */
 
 #include "hb-ot-shape-complex-indic.hh"
+#include "hb-ot-shape-complex-vowel-constraints.hh"
 #include "hb-ot-layout.hh"
 
 
@@ -115,7 +116,8 @@
   {HB_TAG('c','j','c','t'), F_GLOBAL_MANUAL_JOINERS},
   /*
    * Other features.
-   * These features are applied all at once, after final_reordering.
+   * These features are applied all at once, after final_reordering
+   * but before clearing syllables.
    * Default Bengali font in Windows for example has intermixed
    * lookups for init,pres,abvs,blws features.
    */
@@ -250,8 +252,6 @@
 
 struct indic_shape_plan_t
 {
-  ASSERT_POD ();
-
   inline bool load_virama_glyph (hb_font_t *font, hb_codepoint_t *pglyph) const
   {
     hb_codepoint_t glyph = virama_glyph.get_relaxed ();
@@ -331,275 +331,6 @@
   free (data);
 }
 
-static void
-_output_with_dotted_circle (hb_buffer_t *buffer)
-{
-  hb_glyph_info_t &dottedcircle = buffer->output_glyph (0x25CCu);
-  _hb_glyph_info_reset_continuation (&dottedcircle);
-
-  buffer->next_glyph ();
-}
-
-static void
-preprocess_text_indic (const hb_ot_shape_plan_t *plan,
-		       hb_buffer_t              *buffer,
-		       hb_font_t                *font)
-{
-  /* UGLY UGLY UGLY business of adding dotted-circle in the middle of
-   * vowel-sequences that look like another vowel.  Data for each script
-   * collected from Unicode 11 book, tables named "Vowel Letters" with
-   * "Use" and "Do Not Use" columns.
-   *
-   * https://github.com/harfbuzz/harfbuzz/issues/1019
-   */
-  bool processed = false;
-  buffer->clear_output ();
-  unsigned int count = buffer->len;
-  switch ((unsigned) buffer->props.script)
-  {
-    case HB_SCRIPT_DEVANAGARI:
-      for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
-      {
-	bool matched = false;
-	switch (buffer->cur().codepoint)
-	{
-	  case 0x0905u:
-	    switch (buffer->cur(1).codepoint)
-	    {
-	      case 0x093Au: case 0x093Bu: case 0x093Eu: case 0x0945u:
-	      case 0x0946u: case 0x0949u: case 0x094Au: case 0x094Bu:
-	      case 0x094Cu: case 0x094Fu: case 0x0956u: case 0x0957u:
-		matched = true;
-		break;
-	    }
-	    break;
-	  case 0x0906u:
-	    switch (buffer->cur(1).codepoint)
-	    {
-	      case 0x093Au: case 0x0945u: case 0x0946u: case 0x0947u:
-	      case 0x0948u:
-		matched = true;
-		break;
-	    }
-	    break;
-	  case 0x0909u:
-	    switch (buffer->cur(1).codepoint)
-	    {
-	      case 0x0941u:
-		matched = true;
-		break;
-	    }
-	    break;
-	  case 0x090Fu:
-	    switch (buffer->cur(1).codepoint)
-	    {
-	      case 0x0945u: case 0x0946u: case 0x0947u:
-		matched = true;
-		break;
-	    }
-	    break;
-	  case 0x0930u:
-	    if (0x094Du == buffer->cur(1).codepoint &&
-		buffer->idx + 2 < count &&
-	        0x0907u == buffer->cur(2).codepoint)
-	    {
-	      buffer->next_glyph ();
-	      buffer->next_glyph ();
-	      buffer->output_glyph (0x25CCu);
-	    }
-	    break;
-	}
-	buffer->next_glyph ();
-	if (matched) _output_with_dotted_circle (buffer);
-      }
-      processed = true;
-      break;
-
-    case HB_SCRIPT_BENGALI:
-      for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
-      {
-	bool matched = false;
-	switch (buffer->cur().codepoint)
-	{
-	  case 0x0985u:
-	    matched = 0x09BE == buffer->cur(1).codepoint;
-	    break;
-	  case 0x098Bu:
-	    matched = 0x09C3 == buffer->cur(1).codepoint;
-	    break;
-	  case 0x098Cu:
-	    matched = 0x09E2 == buffer->cur(1).codepoint;
-	    break;
-	}
-	buffer->next_glyph ();
-	if (matched) _output_with_dotted_circle (buffer);
-      }
-      processed = true;
-      break;
-
-    case HB_SCRIPT_GURMUKHI:
-      for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
-      {
-	bool matched = false;
-	switch (buffer->cur().codepoint)
-	{
-	  case 0x0A05u:
-	    switch (buffer->cur(1).codepoint)
-	    {
-	      case 0x0A3Eu: case 0x0A48u: case 0x0A4Cu:
-		matched = true;
-		break;
-	    }
-	    break;
-	  case 0x0A72u:
-	    switch (buffer->cur(1).codepoint)
-	    {
-	      case 0x0A3Fu: case 0x0A40u: case 0x0A47u:
-		matched = true;
-		break;
-	    }
-	    break;
-	  case 0x0A73u:
-	    switch (buffer->cur(1).codepoint)
-	    {
-	      case 0x0A41u: case 0x0A42u: case 0x0A4Bu:
-		matched = true;
-		break;
-	    }
-	    break;
-	}
-	buffer->next_glyph ();
-	if (matched) _output_with_dotted_circle (buffer);
-      }
-      processed = true;
-      break;
-
-    case HB_SCRIPT_GUJARATI:
-      for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
-      {
-	bool matched = false;
-	switch (buffer->cur().codepoint)
-	{
-	  case 0x0A85u:
-	    switch (buffer->cur(1).codepoint)
-	    {
-	      case 0x0ABEu: case 0x0AC5u: case 0x0AC7u: case 0x0AC8u:
-	      case 0x0AC9u: case 0x0ACBu: case 0x0ACCu:
-		matched = true;
-		break;
-	    }
-	    break;
-	  case 0x0AC5u:
-	    matched = 0x0ABE == buffer->cur(1).codepoint;
-	    break;
-	}
-	buffer->next_glyph ();
-	if (matched) _output_with_dotted_circle (buffer);
-      }
-      processed = true;
-      break;
-
-    case HB_SCRIPT_ORIYA:
-      for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
-      {
-	bool matched = false;
-	switch (buffer->cur().codepoint)
-	{
-	  case 0x0B05u:
-	    matched = 0x0B3E == buffer->cur(1).codepoint;
-	    break;
-	  case 0x0B0Fu: case 0x0B13u:
-	    matched = 0x0B57 == buffer->cur(1).codepoint;
-	    break;
-	}
-	buffer->next_glyph ();
-	if (matched) _output_with_dotted_circle (buffer);
-      }
-      processed = true;
-      break;
-
-    case HB_SCRIPT_TELUGU:
-      for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
-      {
-	bool matched = false;
-	switch (buffer->cur().codepoint)
-	{
-	  case 0x0C12u:
-	    switch (buffer->cur(1).codepoint)
-	    {
-	      case 0x0C4Cu: case 0x0C55u:
-		matched = true;
-		break;
-	    }
-	    break;
-	  case 0x0C3Fu: case 0x0C46u: case 0xC4Au:
-	    matched = 0x0C55 == buffer->cur(1).codepoint;
-	    break;
-	}
-	buffer->next_glyph ();
-	if (matched) _output_with_dotted_circle (buffer);
-      }
-      processed = true;
-      break;
-
-    case HB_SCRIPT_KANNADA:
-      for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
-      {
-	bool matched = false;
-	switch (buffer->cur().codepoint)
-	{
-	  case 0x0C89u: case 0x0C8Bu:
-	    matched = 0x0CBE == buffer->cur(1).codepoint;
-	    break;
-	  case 0x0C92u:
-	    matched = 0x0CCC == buffer->cur(1).codepoint;
-	    break;
-	}
-	buffer->next_glyph ();
-	if (matched) _output_with_dotted_circle (buffer);
-      }
-      processed = true;
-      break;
-
-    case HB_SCRIPT_MALAYALAM:
-      for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
-      {
-	bool matched = false;
-	switch (buffer->cur().codepoint)
-	{
-	  case 0x0D07u: case 0x0D09u:
-	    matched = 0x0D57 == buffer->cur(1).codepoint;
-	    break;
-	  case 0x0D0Eu:
-	    matched = 0x0D46 == buffer->cur(1).codepoint;
-	    break;
-	  case 0x0D12u:
-	    switch (buffer->cur(1).codepoint)
-	    {
-	      case 0x0D3Eu: case 0x0D57u:
-		matched = true;
-		break;
-	    }
-	    break;
-	}
-	buffer->next_glyph ();
-	if (matched) _output_with_dotted_circle (buffer);
-      }
-      processed = true;
-      break;
-
-    default:
-      break;
-  }
-  if (processed)
-  {
-    if (buffer->idx < count)
-      buffer->next_glyph ();
-    if (likely (buffer->successful))
-      buffer->swap_buffers ();
-  }
-}
-
 static indic_position_t
 consonant_position_from_face (const indic_shape_plan_t *indic_plan,
 			      const hb_codepoint_t consonant,
@@ -1055,8 +786,10 @@
      *
      * 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.
      */
-    if (indic_plan->is_old_spec || end - base > 127)
+    if (indic_plan->is_old_spec || end - start > 127)
       buffer->merge_clusters (base, end);
     else
     {
@@ -1785,6 +1518,14 @@
 }
 
 
+static void
+preprocess_text_indic (const hb_ot_shape_plan_t *plan,
+		       hb_buffer_t              *buffer,
+		       hb_font_t                *font)
+{
+  _hb_preprocess_text_vowel_constraints (plan, buffer, font);
+}
+
 static bool
 decompose_indic (const hb_ot_shape_normalize_context_t *c,
 		 hb_codepoint_t  ab,

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	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-khmer.cc	2018-10-30 23:50:16 UTC (rev 49031)
@@ -46,7 +46,7 @@
   {HB_TAG('c','f','a','r'), F_MANUAL_JOINERS},
   /*
    * Other features.
-   * These features are applied all at once.
+   * These features are applied all at once after clearing syllables.
    */
   {HB_TAG('p','r','e','s'), F_GLOBAL_MANUAL_JOINERS},
   {HB_TAG('a','b','v','s'), F_GLOBAL_MANUAL_JOINERS},
@@ -174,8 +174,6 @@
 
 struct khmer_shape_plan_t
 {
-  ASSERT_POD ();
-
   inline bool get_virama_glyph (hb_font_t *font, hb_codepoint_t *pglyph) const
   {
     hb_codepoint_t glyph = virama_glyph;
@@ -267,7 +265,7 @@
 
 static void
 reorder_consonant_syllable (const hb_ot_shape_plan_t *plan,
-			    hb_face_t *face,
+			    hb_face_t *face HB_UNUSED,
 			    hb_buffer_t *buffer,
 			    unsigned int start, unsigned int end)
 {
@@ -438,8 +436,6 @@
 		 hb_font_t *font HB_UNUSED,
 		 hb_buffer_t *buffer)
 {
-  /* TODO: In USE, we clear syllables right after reorder.  Figure out
-   * what Uniscribe does. */
   hb_glyph_info_t *info = buffer->info;
   unsigned int count = buffer->len;
   for (unsigned int i = 0; i < count; i++)

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	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-myanmar.cc	2018-10-30 23:50:16 UTC (rev 49031)
@@ -36,7 +36,7 @@
 {
   /*
    * Basic features.
-   * These features are applied in order, one at a time, after initial_reordering.
+   * These features are applied in order, one at a time, after reordering.
    */
   HB_TAG('r','p','h','f'),
   HB_TAG('p','r','e','f'),
@@ -48,7 +48,7 @@
 {
   /*
    * Other features.
-   * These features are applied all at once, after final_reordering.
+   * These features are applied all at once, after clearing syllables.
    */
   HB_TAG('p','r','e','s'),
   HB_TAG('a','b','v','s'),
@@ -80,13 +80,13 @@
 		 hb_font_t *font,
 		 hb_buffer_t *buffer);
 static void
-initial_reordering (const hb_ot_shape_plan_t *plan,
-		    hb_font_t *font,
-		    hb_buffer_t *buffer);
+reorder (const hb_ot_shape_plan_t *plan,
+	 hb_font_t *font,
+	 hb_buffer_t *buffer);
 static void
-final_reordering (const hb_ot_shape_plan_t *plan,
-		  hb_font_t *font,
-		  hb_buffer_t *buffer);
+clear_syllables (const hb_ot_shape_plan_t *plan,
+		 hb_font_t *font,
+		 hb_buffer_t *buffer);
 
 static void
 collect_features_myanmar (hb_ot_shape_planner_t *plan)
@@ -102,7 +102,7 @@
   map->enable_feature (HB_TAG('c','c','m','p'));
 
 
-  map->add_gsub_pause (initial_reordering);
+  map->add_gsub_pause (reorder);
 
   for (unsigned int i = 0; i < ARRAY_LENGTH (basic_features); i++)
   {
@@ -110,7 +110,7 @@
     map->add_gsub_pause (nullptr);
   }
 
-  map->add_gsub_pause (final_reordering);
+  map->add_gsub_pause (clear_syllables);
 
   for (unsigned int i = 0; i < ARRAY_LENGTH (other_features); i++)
     map->enable_feature (other_features[i], F_MANUAL_ZWJ);
@@ -274,8 +274,8 @@
 }
 
 static void
-initial_reordering_syllable (const hb_ot_shape_plan_t *plan,
-			     hb_face_t *face,
+initial_reordering_syllable (const hb_ot_shape_plan_t *plan HB_UNUSED,
+			     hb_face_t *face HB_UNUSED,
 			     hb_buffer_t *buffer,
 			     unsigned int start, unsigned int end)
 {
@@ -348,30 +348,28 @@
 }
 
 static void
-initial_reordering (const hb_ot_shape_plan_t *plan,
-		    hb_font_t *font,
-		    hb_buffer_t *buffer)
+reorder (const hb_ot_shape_plan_t *plan,
+	 hb_font_t *font,
+	 hb_buffer_t *buffer)
 {
   insert_dotted_circles (plan, font, buffer);
 
   foreach_syllable (buffer, start, end)
     initial_reordering_syllable (plan, font->face, buffer, start, end);
+
+  HB_BUFFER_DEALLOCATE_VAR (buffer, myanmar_category);
+  HB_BUFFER_DEALLOCATE_VAR (buffer, myanmar_position);
 }
 
 static void
-final_reordering (const hb_ot_shape_plan_t *plan,
-		  hb_font_t *font HB_UNUSED,
-		  hb_buffer_t *buffer)
+clear_syllables (const hb_ot_shape_plan_t *plan HB_UNUSED,
+		 hb_font_t *font HB_UNUSED,
+		 hb_buffer_t *buffer)
 {
   hb_glyph_info_t *info = buffer->info;
   unsigned int count = buffer->len;
-
-  /* Zero syllables now... */
   for (unsigned int i = 0; i < count; i++)
     info[i].syllable() = 0;
-
-  HB_BUFFER_DEALLOCATE_VAR (buffer, myanmar_category);
-  HB_BUFFER_DEALLOCATE_VAR (buffer, myanmar_position);
 }
 
 

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	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-use.cc	2018-10-30 23:50:16 UTC (rev 49031)
@@ -28,6 +28,7 @@
 
 #include "hb-ot-shape-complex-use.hh"
 #include "hb-ot-shape-complex-arabic.hh"
+#include "hb-ot-shape-complex-vowel-constraints.hh"
 
 /* buffer var allocations */
 #define use_category() complex_var_u8_0()
@@ -79,7 +80,8 @@
 {
   /*
    * Other features.
-   * These features are applied all at once, after reordering.
+   * These features are applied all at once, after reordering and
+   * clearing syllables.
    */
   HB_TAG('a','b','v','s'),
   HB_TAG('b','l','w','s'),
@@ -119,6 +121,10 @@
 reorder (const hb_ot_shape_plan_t *plan,
 	 hb_font_t *font,
 	 hb_buffer_t *buffer);
+static void
+clear_syllables (const hb_ot_shape_plan_t *plan,
+		 hb_font_t *font,
+		 hb_buffer_t *buffer);
 
 static void
 collect_features_use (hb_ot_shape_planner_t *plan)
@@ -147,6 +153,7 @@
     map->enable_feature (basic_features[i], F_MANUAL_ZWJ);
 
   map->add_gsub_pause (reorder);
+  map->add_gsub_pause (clear_syllables);
 
   /* "Topographical features" */
   for (unsigned int i = 0; i < ARRAY_LENGTH (arabic_features); i++)
@@ -164,8 +171,6 @@
 
 struct use_shape_plan_t
 {
-  ASSERT_POD ();
-
   hb_mask_t rphf_mask;
 
   arabic_shape_plan_t *arabic_plan;
@@ -372,7 +377,7 @@
 }
 
 static void
-clear_substitution_flags (const hb_ot_shape_plan_t *plan,
+clear_substitution_flags (const hb_ot_shape_plan_t *plan HB_UNUSED,
 			  hb_font_t *font HB_UNUSED,
 			  hb_buffer_t *buffer)
 {
@@ -384,7 +389,7 @@
 
 static void
 record_rphf (const hb_ot_shape_plan_t *plan,
-	     hb_font_t *font,
+	     hb_font_t *font HB_UNUSED,
 	     hb_buffer_t *buffer)
 {
   const use_shape_plan_t *use_plan = (const use_shape_plan_t *) plan->data;
@@ -406,8 +411,8 @@
 }
 
 static void
-record_pref (const hb_ot_shape_plan_t *plan,
-	     hb_font_t *font,
+record_pref (const hb_ot_shape_plan_t *plan HB_UNUSED,
+	     hb_font_t *font HB_UNUSED,
 	     hb_buffer_t *buffer)
 {
   hb_glyph_info_t *info = buffer->info;
@@ -558,17 +563,30 @@
 {
   insert_dotted_circles (plan, font, buffer);
 
-  hb_glyph_info_t *info = buffer->info;
-
   foreach_syllable (buffer, start, end)
     reorder_syllable (buffer, start, end);
 
-  /* Zero syllables now... */
+  HB_BUFFER_DEALLOCATE_VAR (buffer, use_category);
+}
+
+static void
+clear_syllables (const hb_ot_shape_plan_t *plan HB_UNUSED,
+		 hb_font_t *font HB_UNUSED,
+		 hb_buffer_t *buffer)
+{
+  hb_glyph_info_t *info = buffer->info;
   unsigned int count = buffer->len;
   for (unsigned int i = 0; i < count; i++)
     info[i].syllable() = 0;
+}
 
-  HB_BUFFER_DEALLOCATE_VAR (buffer, use_category);
+
+static void
+preprocess_text_use (const hb_ot_shape_plan_t *plan,
+		     hb_buffer_t              *buffer,
+		     hb_font_t                *font)
+{
+  _hb_preprocess_text_vowel_constraints (plan, buffer, font);
 }
 
 static bool
@@ -591,7 +609,7 @@
   nullptr, /* override_features */
   data_create_use,
   data_destroy_use,
-  nullptr, /* preprocess_text */
+  preprocess_text_use,
   nullptr, /* postprocess_glyphs */
   HB_OT_SHAPE_NORMALIZATION_MODE_COMPOSED_DIACRITICS_NO_SHORT_CIRCUIT,
   nullptr, /* decompose */

Added: 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	                        (rev 0)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-vowel-constraints.cc	2018-10-30 23:50:16 UTC (rev 49031)
@@ -0,0 +1,438 @@
+/* == Start of generated functions == */
+/*
+ * The following functions are generated by running:
+ *
+ *   ./gen-vowel-constraints.py use Scripts.txt
+ *
+ * on files with these headers:
+ *
+ * # Copied from https://docs.microsoft.com/en-us/typography/script-development/use
+ * # On October 23, 2018; with documentd dated 02/07/2018.
+ *
+ * # Scripts-11.0.0.txt
+ * # Date: 2018-02-21, 05:34:31 GMT
+ */
+
+#include "hb-ot-shape-complex-vowel-constraints.hh"
+
+static void
+_output_dotted_circle (hb_buffer_t *buffer)
+{
+  hb_glyph_info_t &dottedcircle = buffer->output_glyph (0x25CCu);
+  _hb_glyph_info_reset_continuation (&dottedcircle);
+}
+
+static void
+_output_with_dotted_circle (hb_buffer_t *buffer)
+{
+  _output_dotted_circle (buffer);
+  buffer->next_glyph ();
+}
+
+void
+_hb_preprocess_text_vowel_constraints (const hb_ot_shape_plan_t *plan HB_UNUSED,
+				       hb_buffer_t              *buffer,
+				       hb_font_t                *font HB_UNUSED)
+{
+  /* UGLY UGLY UGLY business of adding dotted-circle in the middle of
+   * vowel-sequences that look like another vowel.  Data for each script
+   * collected from the USE script development spec.
+   *
+   * https://github.com/harfbuzz/harfbuzz/issues/1019
+   */
+  bool processed = false;
+  buffer->clear_output ();
+  unsigned int count = buffer->len;
+  switch ((unsigned) buffer->props.script)
+  {
+    case HB_SCRIPT_DEVANAGARI:
+      for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
+      {
+	bool matched = false;
+	switch (buffer->cur ().codepoint)
+	{
+	  case 0x0905u:
+	    switch (buffer->cur (1).codepoint)
+	    {
+	      case 0x093Au: case 0x093Bu: case 0x093Eu: case 0x0945u:
+	      case 0x0946u: case 0x0949u: case 0x094Au: case 0x094Bu:
+	      case 0x094Cu: case 0x094Fu: case 0x0956u: case 0x0957u:
+		matched = true;
+		break;
+	    }
+	    break;
+	  case 0x0906u:
+	    switch (buffer->cur (1).codepoint)
+	    {
+	      case 0x093Au: case 0x0945u: case 0x0946u: case 0x0947u:
+	      case 0x0948u:
+		matched = true;
+		break;
+	    }
+	    break;
+	  case 0x0909u:
+	    matched = 0x0941u == buffer->cur (1).codepoint;
+	    break;
+	  case 0x090Fu:
+	    switch (buffer->cur (1).codepoint)
+	    {
+	      case 0x0945u: case 0x0946u: case 0x0947u:
+		matched = true;
+		break;
+	    }
+	    break;
+	  case 0x0930u:
+	    if (0x094Du == buffer->cur (1).codepoint &&
+		buffer->idx + 2 < count &&
+		0x0907u == buffer->cur (2).codepoint)
+	    {
+	      buffer->next_glyph ();
+	      buffer->next_glyph ();
+	      _output_dotted_circle (buffer);
+	    }
+	    break;
+	}
+	buffer->next_glyph ();
+	if (matched) _output_with_dotted_circle (buffer);
+      }
+      processed = true;
+      break;
+
+    case HB_SCRIPT_BENGALI:
+      for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
+      {
+	bool matched = false;
+	switch (buffer->cur ().codepoint)
+	{
+	  case 0x0985u:
+	    matched = 0x09BEu == buffer->cur (1).codepoint;
+	    break;
+	  case 0x098Bu:
+	    matched = 0x09C3u == buffer->cur (1).codepoint;
+	    break;
+	  case 0x098Cu:
+	    matched = 0x09E2u == buffer->cur (1).codepoint;
+	    break;
+	}
+	buffer->next_glyph ();
+	if (matched) _output_with_dotted_circle (buffer);
+      }
+      processed = true;
+      break;
+
+    case HB_SCRIPT_GURMUKHI:
+      for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
+      {
+	bool matched = false;
+	switch (buffer->cur ().codepoint)
+	{
+	  case 0x0A05u:
+	    switch (buffer->cur (1).codepoint)
+	    {
+	      case 0x0A3Eu: case 0x0A48u: case 0x0A4Cu:
+		matched = true;
+		break;
+	    }
+	    break;
+	  case 0x0A72u:
+	    switch (buffer->cur (1).codepoint)
+	    {
+	      case 0x0A3Fu: case 0x0A40u: case 0x0A47u:
+		matched = true;
+		break;
+	    }
+	    break;
+	  case 0x0A73u:
+	    switch (buffer->cur (1).codepoint)
+	    {
+	      case 0x0A41u: case 0x0A42u: case 0x0A4Bu:
+		matched = true;
+		break;
+	    }
+	    break;
+	}
+	buffer->next_glyph ();
+	if (matched) _output_with_dotted_circle (buffer);
+      }
+      processed = true;
+      break;
+
+    case HB_SCRIPT_GUJARATI:
+      for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
+      {
+	bool matched = false;
+	switch (buffer->cur ().codepoint)
+	{
+	  case 0x0A85u:
+	    switch (buffer->cur (1).codepoint)
+	    {
+	      case 0x0ABEu: case 0x0AC5u: case 0x0AC7u: case 0x0AC8u:
+	      case 0x0AC9u: case 0x0ACBu: case 0x0ACCu:
+		matched = true;
+		break;
+	    }
+	    break;
+	  case 0x0AC5u:
+	    matched = 0x0ABEu == buffer->cur (1).codepoint;
+	    break;
+	}
+	buffer->next_glyph ();
+	if (matched) _output_with_dotted_circle (buffer);
+      }
+      processed = true;
+      break;
+
+    case HB_SCRIPT_ORIYA:
+      for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
+      {
+	bool matched = false;
+	switch (buffer->cur ().codepoint)
+	{
+	  case 0x0B05u:
+	    matched = 0x0B3Eu == buffer->cur (1).codepoint;
+	    break;
+	  case 0x0B0Fu: case 0x0B13u:
+	    matched = 0x0B57u == buffer->cur (1).codepoint;
+	    break;
+	}
+	buffer->next_glyph ();
+	if (matched) _output_with_dotted_circle (buffer);
+      }
+      processed = true;
+      break;
+
+    case HB_SCRIPT_TELUGU:
+      for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
+      {
+	bool matched = false;
+	switch (buffer->cur ().codepoint)
+	{
+	  case 0x0C12u:
+	    switch (buffer->cur (1).codepoint)
+	    {
+	      case 0x0C4Cu: case 0x0C55u:
+		matched = true;
+		break;
+	    }
+	    break;
+	  case 0x0C3Fu: case 0x0C46u: case 0x0C4Au:
+	    matched = 0x0C55u == buffer->cur (1).codepoint;
+	    break;
+	}
+	buffer->next_glyph ();
+	if (matched) _output_with_dotted_circle (buffer);
+      }
+      processed = true;
+      break;
+
+    case HB_SCRIPT_KANNADA:
+      for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
+      {
+	bool matched = false;
+	switch (buffer->cur ().codepoint)
+	{
+	  case 0x0C89u: case 0x0C8Bu:
+	    matched = 0x0CBEu == buffer->cur (1).codepoint;
+	    break;
+	  case 0x0C92u:
+	    matched = 0x0CCCu == buffer->cur (1).codepoint;
+	    break;
+	}
+	buffer->next_glyph ();
+	if (matched) _output_with_dotted_circle (buffer);
+      }
+      processed = true;
+      break;
+
+    case HB_SCRIPT_MALAYALAM:
+      for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
+      {
+	bool matched = false;
+	switch (buffer->cur ().codepoint)
+	{
+	  case 0x0D07u: case 0x0D09u:
+	    matched = 0x0D57u == buffer->cur (1).codepoint;
+	    break;
+	  case 0x0D0Eu:
+	    matched = 0x0D46u == buffer->cur (1).codepoint;
+	    break;
+	  case 0x0D12u:
+	    switch (buffer->cur (1).codepoint)
+	    {
+	      case 0x0D3Eu: case 0x0D57u:
+		matched = true;
+		break;
+	    }
+	    break;
+	}
+	buffer->next_glyph ();
+	if (matched) _output_with_dotted_circle (buffer);
+      }
+      processed = true;
+      break;
+
+    case HB_SCRIPT_SINHALA:
+      for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
+      {
+	bool matched = false;
+	switch (buffer->cur ().codepoint)
+	{
+	  case 0x0D85u:
+	    switch (buffer->cur (1).codepoint)
+	    {
+	      case 0x0DCFu: case 0x0DD0u: case 0x0DD1u:
+		matched = true;
+		break;
+	    }
+	    break;
+	  case 0x0D8Bu: case 0x0D8Fu: case 0x0D94u:
+	    matched = 0x0DDFu == buffer->cur (1).codepoint;
+	    break;
+	  case 0x0D8Du:
+	    matched = 0x0DD8u == buffer->cur (1).codepoint;
+	    break;
+	  case 0x0D91u:
+	    switch (buffer->cur (1).codepoint)
+	    {
+	      case 0x0DCAu: case 0x0DD9u: case 0x0DDAu: case 0x0DDCu:
+	      case 0x0DDDu:
+		matched = true;
+		break;
+	    }
+	    break;
+	}
+	buffer->next_glyph ();
+	if (matched) _output_with_dotted_circle (buffer);
+      }
+      processed = true;
+      break;
+
+    case HB_SCRIPT_BRAHMI:
+      for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
+      {
+	bool matched = false;
+	switch (buffer->cur ().codepoint)
+	{
+	  case 0x11005u:
+	    matched = 0x11038u == buffer->cur (1).codepoint;
+	    break;
+	  case 0x1100Bu:
+	    matched = 0x1103Eu == buffer->cur (1).codepoint;
+	    break;
+	  case 0x1100Fu:
+	    matched = 0x11042u == buffer->cur (1).codepoint;
+	    break;
+	}
+	buffer->next_glyph ();
+	if (matched) _output_with_dotted_circle (buffer);
+      }
+      processed = true;
+      break;
+
+    case HB_SCRIPT_KHUDAWADI:
+      for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
+      {
+	bool matched = false;
+	switch (buffer->cur ().codepoint)
+	{
+	  case 0x112B0u:
+	    switch (buffer->cur (1).codepoint)
+	    {
+	      case 0x112E0u: case 0x112E5u: case 0x112E6u: case 0x112E7u:
+	      case 0x112E8u:
+		matched = true;
+		break;
+	    }
+	    break;
+	}
+	buffer->next_glyph ();
+	if (matched) _output_with_dotted_circle (buffer);
+      }
+      processed = true;
+      break;
+
+    case HB_SCRIPT_TIRHUTA:
+      for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
+      {
+	bool matched = false;
+	switch (buffer->cur ().codepoint)
+	{
+	  case 0x11481u:
+	    matched = 0x114B0u == buffer->cur (1).codepoint;
+	    break;
+	  case 0x1148Bu: case 0x1148Du:
+	    matched = 0x114BAu == buffer->cur (1).codepoint;
+	    break;
+	  case 0x114AAu:
+	    switch (buffer->cur (1).codepoint)
+	    {
+	      case 0x114B5u: case 0x114B6u:
+		matched = true;
+		break;
+	    }
+	    break;
+	}
+	buffer->next_glyph ();
+	if (matched) _output_with_dotted_circle (buffer);
+      }
+      processed = true;
+      break;
+
+    case HB_SCRIPT_MODI:
+      for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
+      {
+	bool matched = false;
+	switch (buffer->cur ().codepoint)
+	{
+	  case 0x11600u: case 0x11601u:
+	    switch (buffer->cur (1).codepoint)
+	    {
+	      case 0x11639u: case 0x1163Au:
+		matched = true;
+		break;
+	    }
+	    break;
+	}
+	buffer->next_glyph ();
+	if (matched) _output_with_dotted_circle (buffer);
+      }
+      processed = true;
+      break;
+
+    case HB_SCRIPT_TAKRI:
+      for (buffer->idx = 0; buffer->idx + 1 < count && buffer->successful;)
+      {
+	bool matched = false;
+	switch (buffer->cur ().codepoint)
+	{
+	  case 0x11680u:
+	    switch (buffer->cur (1).codepoint)
+	    {
+	      case 0x116ADu: case 0x116B4u: case 0x116B5u:
+		matched = true;
+		break;
+	    }
+	    break;
+	  case 0x11686u:
+	    matched = 0x116B2u == buffer->cur (1).codepoint;
+	    break;
+	}
+	buffer->next_glyph ();
+	if (matched) _output_with_dotted_circle (buffer);
+      }
+      processed = true;
+      break;
+
+    default:
+      break;
+  }
+  if (processed)
+  {
+    if (buffer->idx < count)
+     buffer->next_glyph ();
+    if (likely (buffer->successful))
+      buffer->swap_buffers ();
+  }
+}
+
+/* == End of generated functions == */

Added: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-vowel-constraints.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-vowel-constraints.hh	                        (rev 0)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-vowel-constraints.hh	2018-10-30 23:50:16 UTC (rev 49031)
@@ -0,0 +1,39 @@
+/*
+ * 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
+ */
+
+#ifndef HB_OT_SHAPE_COMPLEX_VOWEL_CONSTRAINTS_HH
+#define HB_OT_SHAPE_COMPLEX_VOWEL_CONSTRAINTS_HH
+
+#include "hb.hh"
+
+#include "hb-ot-shape-complex.hh"
+
+HB_INTERNAL void
+_hb_preprocess_text_vowel_constraints (const hb_ot_shape_plan_t *plan,
+				       hb_buffer_t              *buffer,
+				       hb_font_t                *font);
+
+#endif /* HB_OT_SHAPE_COMPLEX_VOWEL_CONSTRAINTS_HH */

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-fallback.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-fallback.cc	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-fallback.cc	2018-10-30 23:50:16 UTC (rev 49031)
@@ -192,7 +192,7 @@
 }
 
 static inline void
-position_mark (const hb_ot_shape_plan_t *plan,
+position_mark (const hb_ot_shape_plan_t *plan HB_UNUSED,
 	       hb_font_t *font,
 	       hb_buffer_t  *buffer,
 	       hb_glyph_extents_t &base_extents,
@@ -472,7 +472,7 @@
 
 /* Adjusts width of various spaces. */
 void
-_hb_ot_shape_fallback_spaces (const hb_ot_shape_plan_t *plan,
+_hb_ot_shape_fallback_spaces (const hb_ot_shape_plan_t *plan HB_UNUSED,
 			      hb_font_t *font,
 			      hb_buffer_t  *buffer)
 {

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	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-normalize.cc	2018-10-30 23:50:16 UTC (rev 49031)
@@ -213,7 +213,9 @@
 }
 
 static inline void
-handle_variation_selector_cluster (const hb_ot_shape_normalize_context_t *c, unsigned int end, bool short_circuit)
+handle_variation_selector_cluster (const hb_ot_shape_normalize_context_t *c,
+				   unsigned int end,
+				   bool short_circuit HB_UNUSED)
 {
   /* TODO Currently if there's a variation-selector we give-up, it's just too hard. */
   hb_buffer_t * const buffer = c->buffer;
@@ -220,10 +222,10 @@
   hb_font_t * const font = c->font;
   for (; buffer->idx < end - 1 && buffer->successful;) {
     if (unlikely (buffer->unicode->is_variation_selector (buffer->cur(+1).codepoint))) {
-      /* The next two lines are some ugly lines... But work. */
       if (font->get_variation_glyph (buffer->cur().codepoint, buffer->cur(+1).codepoint, &buffer->cur().glyph_index()))
       {
-	buffer->replace_glyphs (2, 1, &buffer->cur().codepoint);
+	hb_codepoint_t unicode = buffer->cur().codepoint;
+	buffer->replace_glyphs (2, 1, &unicode);
       }
       else
       {

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	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape.cc	2018-10-30 23:50:16 UTC (rev 49031)
@@ -42,6 +42,16 @@
 #include "hb-aat-layout.hh"
 
 
+/**
+ * SECTION:hb-ot-shape
+ * @title: hb-ot-shape
+ * @short_description: OpenType shaping support
+ * @include: hb-ot.h
+ *
+ * Support functions for OpenType shaping related queries.
+ **/
+
+
 static bool
 _hb_apply_morx (hb_face_t *face)
 {
@@ -53,6 +63,16 @@
 	 hb_aat_layout_has_substitution (face);
 }
 
+hb_ot_shape_planner_t::hb_ot_shape_planner_t (const hb_shape_plan_t *master_plan) :
+						face (master_plan->face_unsafe),
+						props (master_plan->props),
+						map (face, &props),
+						aat_map (face, &props),
+						apply_morx (_hb_apply_morx (face)),
+						shaper (apply_morx ?
+						        &_hb_ot_complex_shaper_default :
+							hb_ot_shape_complex_categorize (this)) {}
+
 void
 hb_ot_shape_planner_t::compile (hb_ot_shape_plan_t &plan,
 				const int          *coords,
@@ -61,17 +81,21 @@
   plan.props = props;
   plan.shaper = shaper;
   map.compile (plan.map, coords, num_coords);
+  if (apply_morx)
+    aat_map.compile (plan.aat_map, coords, num_coords);
 
-  plan.rtlm_mask = plan.map.get_1_mask (HB_TAG ('r','t','l','m'));
   plan.frac_mask = plan.map.get_1_mask (HB_TAG ('f','r','a','c'));
   plan.numr_mask = plan.map.get_1_mask (HB_TAG ('n','u','m','r'));
   plan.dnom_mask = plan.map.get_1_mask (HB_TAG ('d','n','o','m'));
   plan.has_frac = plan.frac_mask || (plan.numr_mask && plan.dnom_mask);
+  plan.rtlm_mask = plan.map.get_1_mask (HB_TAG ('r','t','l','m'));
   hb_tag_t kern_tag = HB_DIRECTION_IS_HORIZONTAL (plan.props.direction) ?
 		      HB_TAG ('k','e','r','n') : HB_TAG ('v','k','r','n');
   plan.kern_mask = plan.map.get_mask (kern_tag);
+  plan.trak_mask = plan.map.get_mask (HB_TAG ('t','r','a','k'));
 
   plan.requested_kerning = !!plan.kern_mask;
+  plan.requested_tracking = !!plan.trak_mask;
   bool has_gpos_kern = plan.map.get_feature_index (1, kern_tag) != HB_OT_LAYOUT_NO_FEATURE_INDEX;
   bool disable_gpos = plan.shaper->gpos_tag &&
 		      plan.shaper->gpos_tag != plan.map.chosen_script[1];
@@ -87,7 +111,7 @@
    * Decide who does substitutions. GSUB, morx, or fallback.
    */
 
-  plan.apply_morx = _hb_apply_morx (face);
+  plan.apply_morx = apply_morx;
 
   /*
    * Decide who does positioning. GPOS, kerx, kern, or fallback.
@@ -116,7 +140,7 @@
     plan.fallback_mark_positioning = true;
 
   /* Currently we always apply trak. */
-  plan.apply_trak = hb_aat_layout_has_tracking (face);
+  plan.apply_trak = plan.requested_tracking && hb_aat_layout_has_tracking (face);
 }
 
 
@@ -177,12 +201,17 @@
   /* Random! */
   map->enable_feature (HB_TAG ('r','a','n','d'), F_RANDOM, HB_OT_MAP_MAX_VALUE);
 
-  map->enable_feature (HB_TAG('H','A','R','F'));
+  /* Tracking.  We enable dummy feature here just to allow disabling
+   * AAT 'trak' table using features.
+   * https://github.com/harfbuzz/harfbuzz/issues/1303 */
+  map->enable_feature (HB_TAG ('t','r','a','k'), F_HAS_FALLBACK);
 
+  map->enable_feature (HB_TAG ('H','A','R','F'));
+
   if (planner->shaper->collect_features)
     planner->shaper->collect_features (planner);
 
-  map->enable_feature (HB_TAG('B','U','Z','Z'));
+  map->enable_feature (HB_TAG ('B','U','Z','Z'));
 
   for (unsigned int i = 0; i < ARRAY_LENGTH (common_features); i++)
     map->add_feature (common_features[i]);
@@ -210,6 +239,16 @@
 		       feature->end == HB_FEATURE_GLOBAL_END) ?  F_GLOBAL : F_NONE,
 		      feature->value);
   }
+
+  if (planner->apply_morx)
+  {
+    hb_aat_map_builder_t *aat_map = &planner->aat_map;
+    for (unsigned int i = 0; i < num_user_features; i++)
+    {
+      const hb_feature_t *feature = &user_features[i];
+      aat_map->add_feature (feature->tag, feature->value);
+    }
+  }
 }
 
 
@@ -247,7 +286,7 @@
 }
 
 void
-_hb_ot_shaper_font_data_destroy (hb_ot_font_data_t *data)
+_hb_ot_shaper_font_data_destroy (hb_ot_font_data_t *data HB_UNUSED)
 {
 }
 
@@ -271,13 +310,6 @@
 
   hb_ot_shape_planner_t planner (shape_plan);
 
-  /* Ugly that we have to do this here...
-   * If we are going to apply morx, choose default shaper. */
-  if (_hb_apply_morx (planner.face))
-    planner.shaper = &_hb_ot_complex_shaper_default;
-  else
-    planner.shaper = hb_ot_shape_complex_categorize (&planner);
-
   hb_ot_shape_collect_features (&planner, &shape_plan->props,
 				user_features, num_user_features);
 

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape.hh	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape.hh	2018-10-30 23:50:16 UTC (rev 49031)
@@ -30,6 +30,7 @@
 #include "hb.hh"
 
 #include "hb-ot-map.hh"
+#include "hb-aat-map.hh"
 #include "hb-shape-plan.hh"
 
 
@@ -39,11 +40,15 @@
   hb_segment_properties_t props;
   const struct hb_ot_complex_shaper_t *shaper;
   hb_ot_map_t map;
+  hb_aat_map_t aat_map;
   const void *data;
-  hb_mask_t rtlm_mask, frac_mask, numr_mask, dnom_mask;
+  hb_mask_t frac_mask, numr_mask, dnom_mask;
+  hb_mask_t rtlm_mask;
   hb_mask_t kern_mask;
+  hb_mask_t trak_mask;
 
   bool requested_kerning : 1;
+  bool requested_tracking : 1;
   bool has_frac : 1;
   bool has_gpos_mark : 1;
   bool fallback_glyph_classes : 1;
@@ -74,9 +79,11 @@
   {
     memset (this, 0, sizeof (*this));
     map.init ();
+    aat_map.init ();
   }
   void fini (void) {
     map.fini ();
+    aat_map.fini ();
   }
 };
 
@@ -85,21 +92,16 @@
   /* In the order that they are filled in. */
   hb_face_t *face;
   hb_segment_properties_t props;
+  hb_ot_map_builder_t map;
+  hb_aat_map_builder_t aat_map;
+  bool apply_morx : 1;
   const struct hb_ot_complex_shaper_t *shaper;
-  hb_ot_map_builder_t map;
 
-  hb_ot_shape_planner_t (const hb_shape_plan_t *master_plan) :
-			 face (master_plan->face_unsafe),
-			 props (master_plan->props),
-			 shaper (nullptr),
-			 map (face, &props) {}
+  HB_INTERNAL hb_ot_shape_planner_t (const hb_shape_plan_t *master_plan);
 
   HB_INTERNAL void compile (hb_ot_shape_plan_t &plan,
 			    const int          *coords,
 			    unsigned int        num_coords);
-
-  private:
-  HB_DISALLOW_COPY_AND_ASSIGN (hb_ot_shape_planner_t);
 };
 
 

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	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-tag.cc	2018-10-30 23:50:16 UTC (rev 49031)
@@ -242,7 +242,6 @@
 static void
 hb_ot_tags_from_language (const char   *lang_str,
 			  const char   *limit,
-			  const char   *private_use_subtag,
 			  unsigned int *count,
 			  hb_tag_t     *tags)
 {
@@ -389,7 +388,7 @@
     needs_language = parse_private_use_subtag (private_use_subtag, language_count, language_tags, "-hbot", TOUPPER);
 
     if (needs_language && language_count && language_tags && *language_count)
-      hb_ot_tags_from_language (lang_str, limit, private_use_subtag, language_count, language_tags);
+      hb_ot_tags_from_language (lang_str, limit, language_count, language_tags);
   }
 
   if (needs_script && script_count && script_tags && *script_count)

Deleted: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-tag.h
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-tag.h	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-tag.h	2018-10-30 23:50:16 UTC (rev 49031)
@@ -1,78 +0,0 @@
-/*
- * Copyright © 2009  Red Hat, 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.
- *
- * Red Hat Author(s): Behdad Esfahbod
- */
-
-#ifndef HB_OT_H_IN
-#error "Include <hb-ot.h> instead."
-#endif
-
-#ifndef HB_OT_TAG_H
-#define HB_OT_TAG_H
-
-#include "hb.h"
-
-HB_BEGIN_DECLS
-
-
-#define HB_OT_TAG_DEFAULT_SCRIPT	HB_TAG ('D', 'F', 'L', 'T')
-#define HB_OT_TAG_DEFAULT_LANGUAGE	HB_TAG ('d', 'f', 'l', 't')
-
-/**
- * HB_OT_MAX_TAGS_PER_SCRIPT:
- *
- * Since: 2.0.0
- **/
-#define HB_OT_MAX_TAGS_PER_SCRIPT	3u
-/**
- * HB_OT_MAX_TAGS_PER_LANGUAGE:
- *
- * Since: 2.0.0
- **/
-#define HB_OT_MAX_TAGS_PER_LANGUAGE	3u
-
-HB_EXTERN void
-hb_ot_tags_from_script_and_language (hb_script_t   script,
-				     hb_language_t language,
-				     unsigned int *script_count /* IN/OUT */,
-				     hb_tag_t     *script_tags /* OUT */,
-				     unsigned int *language_count /* IN/OUT */,
-				     hb_tag_t     *language_tags /* OUT */);
-
-HB_EXTERN hb_script_t
-hb_ot_tag_to_script (hb_tag_t tag);
-
-HB_EXTERN hb_language_t
-hb_ot_tag_to_language (hb_tag_t tag);
-
-HB_EXTERN void
-hb_ot_tags_to_script_and_language (hb_tag_t       script_tag,
-				   hb_tag_t       language_tag,
-				   hb_script_t   *script /* OUT */,
-				   hb_language_t *language /* OUT */);
-
-
-HB_END_DECLS
-
-#endif /* HB_OT_TAG_H */

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	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-var.cc	2018-10-30 23:50:16 UTC (rev 49031)
@@ -32,6 +32,17 @@
 #include "hb-ot-var-mvar-table.hh"
 #include "hb-ot-var.h"
 
+
+/**
+ * SECTION:hb-ot-var
+ * @title: hb-ot-var
+ * @short_description: OpenType Font Variations
+ * @include: hb-ot.h
+ *
+ * Functions for fetching information about OpenType Variable Fonts.
+ **/
+
+
 /*
  * fvar/avar
  */

Added: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-vorg-table.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-vorg-table.hh	                        (rev 0)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-vorg-table.hh	2018-10-30 23:50:16 UTC (rev 49031)
@@ -0,0 +1,182 @@
+/*
+ * Copyright © 2018 Adobe Systems Incorporated.
+ *
+ *  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.
+ *
+ * Adobe Author(s): Michiharu Ariza
+ */
+
+#ifndef HB_OT_VORG_TABLE_HH
+#define HB_OT_VORG_TABLE_HH
+
+#include "hb-open-type.hh"
+
+/*
+ * VORG -- Vertical Origin Table
+ * https://docs.microsoft.com/en-us/typography/opentype/spec/vorg
+ */
+#define HB_OT_TAG_VORG HB_TAG('V','O','R','G')
+
+namespace OT {
+
+struct VertOriginMetric
+{
+  inline int cmp (hb_codepoint_t g) const { return glyph.cmp (g); }
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this));
+  }
+
+  public:
+  GlyphID	glyph;
+  FWORD		vertOriginY;
+
+  public:
+  DEFINE_SIZE_STATIC (4);
+};
+
+struct VORG
+{
+  static const hb_tag_t tableTag = HB_OT_TAG_VORG;
+
+  inline bool has_data (void) const { return version.to_int (); }
+
+  inline int get_y_origin (hb_codepoint_t glyph) const
+  {
+    int i = vertYOrigins.bsearch (glyph);
+    if (i != -1)
+      return vertYOrigins[i].vertOriginY;
+
+    return defaultVertOriginY;
+  }
+
+  inline bool _subset (const hb_subset_plan_t *plan HB_UNUSED,
+                       const VORG *vorg_table,
+                       const hb_vector_t<VertOriginMetric> &subset_metrics,
+                       unsigned int dest_sz,
+                       void *dest) const
+  {
+    hb_serialize_context_t c (dest, dest_sz);
+
+    VORG *subset_table = c.start_serialize<VORG> ();
+    if (unlikely (!c.extend_min (*subset_table)))
+      return false;
+
+    subset_table->version.major.set (1);
+    subset_table->version.minor.set (0);
+
+    subset_table->defaultVertOriginY.set (vorg_table->defaultVertOriginY);
+    subset_table->vertYOrigins.len.set (subset_metrics.len);
+
+    bool success = true;
+    if (subset_metrics.len > 0)
+    {
+      unsigned int  size = VertOriginMetric::static_size * subset_metrics.len;
+      VertOriginMetric  *metrics = c.allocate_size<VertOriginMetric> (size);
+      if (likely (metrics != nullptr))
+        memcpy (metrics, &subset_metrics[0], size);
+      else
+        success = false;
+    }
+    c.end_serialize ();
+
+    return success;
+  }
+
+  inline bool subset (hb_subset_plan_t *plan) const
+  {
+    hb_blob_t *vorg_blob = hb_sanitize_context_t().reference_table<VORG> (plan->source);
+    const VORG *vorg_table = vorg_blob->as<VORG> ();
+
+    /* count the number of glyphs to be included in the subset table */
+    hb_vector_t<VertOriginMetric> subset_metrics;
+    subset_metrics.init ();
+    unsigned int glyph = 0;
+    unsigned int i = 0;
+    while ((glyph < plan->glyphs.len) && (i < vertYOrigins.len))
+    {
+      if (plan->glyphs[glyph] > vertYOrigins[i].glyph)
+        i++;
+      else if (plan->glyphs[glyph] < vertYOrigins[i].glyph)
+        glyph++;
+      else
+      {
+        VertOriginMetric *metrics = subset_metrics.push ();
+        metrics->glyph.set (glyph);
+        metrics->vertOriginY.set (vertYOrigins[i].vertOriginY);
+        glyph++;
+        i++;
+      }
+    }
+
+    /* alloc the new table */
+    unsigned int dest_sz = VORG::min_size + VertOriginMetric::static_size * subset_metrics.len;
+    void *dest = (void *) malloc (dest_sz);
+    if (unlikely (!dest))
+    {
+      subset_metrics.fini ();
+      hb_blob_destroy (vorg_blob);
+      return false;
+    }
+
+    /* serialize the new table */
+    if (!_subset (plan, vorg_table, subset_metrics, dest_sz, dest))
+    {
+      subset_metrics.fini ();
+      free (dest);
+      hb_blob_destroy (vorg_blob);
+      return false;
+    }
+
+    hb_blob_t *result = hb_blob_create ((const char *)dest,
+                                        dest_sz,
+                                        HB_MEMORY_MODE_READONLY,
+                                        dest,
+                                        free);
+    bool success = plan->add_table (HB_OT_TAG_VORG, result);
+    hb_blob_destroy (result);
+    subset_metrics.fini ();
+    hb_blob_destroy (vorg_blob);
+    return success;
+  }
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) &&
+                  version.major == 1 &&
+                  vertYOrigins.sanitize (c));
+  }
+
+  protected:
+  FixedVersion<>	version;		/* Version of VORG table. Set to 0x00010000u. */
+  FWORD			defaultVertOriginY;	/* The default vertical origin. */
+  SortedArrayOf<VertOriginMetric>
+			vertYOrigins;		/* The array of vertical origins. */
+
+  public:
+  DEFINE_SIZE_ARRAY(8, vertYOrigins);
+};
+} /* namespace OT */
+
+#endif /* HB_OT_VORG_TABLE_HH */

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot.h
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot.h	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot.h	2018-10-30 23:50:16 UTC (rev 49031)
@@ -30,11 +30,11 @@
 
 #include "hb.h"
 
+#include "hb-ot-color.h"
 #include "hb-ot-font.h"
 #include "hb-ot-layout.h"
 #include "hb-ot-math.h"
 #include "hb-ot-name.h"
-#include "hb-ot-tag.h"
 #include "hb-ot-shape.h"
 #include "hb-ot-var.h"
 

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-set-digest.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-set-digest.hh	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-set-digest.hh	2018-10-30 23:50:16 UTC (rev 49031)
@@ -48,8 +48,6 @@
 template <typename mask_t, unsigned int shift>
 struct hb_set_digest_lowest_bits_t
 {
-  ASSERT_POD ();
-
   enum { mask_bytes = sizeof (mask_t) };
   enum { mask_bits = sizeof (mask_t) * 8 };
   static const unsigned int num_bits = 0
@@ -117,8 +115,6 @@
 template <typename head_t, typename tail_t>
 struct hb_set_digest_combiner_t
 {
-  ASSERT_POD ();
-
   inline void init (void) {
     head.init ();
     tail.init ();

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-set.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-set.cc	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-set.cc	2018-10-30 23:50:16 UTC (rev 49031)
@@ -27,7 +27,16 @@
 #include "hb-set.hh"
 
 
-/* Public API */
+/**
+ * SECTION:hb-set
+ * @title: hb-set
+ * @short_description: Object representing a set of integers
+ * @include: hb.h
+ *
+ * Set objects represent a mathematical set of integer values.  They are
+ * used in non-shaping API to query certain set of characters or glyphs,
+ * or other integer values.
+ **/
 
 
 /**
@@ -391,7 +400,7 @@
  * Deprecated: 1.6.1
  **/
 void
-hb_set_invert (hb_set_t *set)
+hb_set_invert (hb_set_t *set HB_UNUSED)
 {
 }
 

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-set.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-set.hh	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-set.hh	2018-10-30 23:50:16 UTC (rev 49031)
@@ -39,6 +39,10 @@
 
 struct hb_set_t
 {
+  HB_NO_COPY_ASSIGN (hb_set_t);
+  inline hb_set_t (void) { init (); }
+  inline ~hb_set_t (void) { fini (); }
+
   struct page_map_t
   {
     inline int cmp (const page_map_t *o) const { return (int) o->major - (int) major; }
@@ -49,8 +53,8 @@
 
   struct page_t
   {
-    inline void init0 (void) { memset (&v, 0, sizeof (v)); }
-    inline void init1 (void) { memset (&v, 0xff, sizeof (v)); }
+    inline void init0 (void) { memset (reinterpret_cast<char*>(&v), 0, sizeof (v)); }
+    inline void init1 (void) { memset (reinterpret_cast<char*>(&v), 0xff, sizeof (v)); }
 
     inline unsigned int len (void) const
     { return ARRAY_LENGTH_CONST (v); }
@@ -199,6 +203,7 @@
   }
   inline void fini_shallow (void)
   {
+    population = 0;
     page_map.fini ();
     pages.fini ();
   }
@@ -368,8 +373,8 @@
     if (!resize (count))
       return;
     population = other->population;
-    memcpy (pages.arrayZ(), other->pages.arrayZ(), count * sizeof (pages.arrayZ()[0]));
-    memcpy (page_map.arrayZ(), other->page_map.arrayZ(), count * sizeof (page_map.arrayZ()[0]));
+    memcpy (pages, other->pages, count * sizeof (pages[0]));
+    memcpy (page_map, other->page_map, count * sizeof (page_map[0]));
   }
 
   inline bool is_equal (const hb_set_t *other) const
@@ -669,7 +674,9 @@
 	return nullptr;
 
       pages[map.index].init0 ();
-      memmove (&page_map[i + 1], &page_map[i], (page_map.len - 1 - i) * sizeof (page_map[0]));
+      memmove (page_map + i + 1,
+	       page_map + i,
+	       (page_map.len - 1 - i) * sizeof (page_map[0]));
       page_map[i] = map;
     }
     return &pages[page_map[i].index];

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	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-shape-plan.cc	2018-10-30 23:50:16 UTC (rev 49031)
@@ -31,6 +31,19 @@
 #include "hb-buffer.hh"
 
 
+/**
+ * SECTION:hb-shape-plan
+ * @title: hb-shape-plan
+ * @short_description: Object representing a shaping plan
+ * @include: hb.h
+ *
+ * Shape plans are not used for shaping directly, but can be access to query
+ * certain information about how shaping will perform given a set of input
+ * parameters (script, language, direction, features, etc.)
+ * Most client would not need to deal with shape plans directly.
+ **/
+
+
 static void
 hb_shape_plan_plan (hb_shape_plan_t    *shape_plan,
 		    const hb_feature_t *user_features,
@@ -441,7 +454,7 @@
 }
 
 static inline hb_bool_t
-hb_coords_present (const int *coords,
+hb_coords_present (const int *coords HB_UNUSED,
 		   unsigned int num_coords)
 {
   return num_coords != 0;

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-shape-plan.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-shape-plan.hh	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-shape-plan.hh	2018-10-30 23:50:16 UTC (rev 49031)
@@ -34,7 +34,6 @@
 struct hb_shape_plan_t
 {
   hb_object_header_t header;
-  ASSERT_POD ();
 
   hb_bool_t default_shaper_list;
   hb_face_t *face_unsafe; /* We don't carry a reference to face. */

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-shape.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-shape.cc	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-shape.cc	2018-10-30 23:50:16 UTC (rev 49031)
@@ -34,18 +34,20 @@
 #include "hb-font.hh"
 #include "hb-machinery.hh"
 
+
 /**
  * SECTION:hb-shape
- * @title: Shaping
+ * @title: hb-shape
  * @short_description: Conversion of text strings into positioned glyphs
  * @include: hb.h
  *
  * Shaping is the central operation of HarfBuzz. Shaping operates on buffers,
  * which are sequences of Unicode characters that use the same font and have
- * the same text direction, script and language. After shaping the buffer
+ * the same text direction, script, and language. After shaping the buffer
  * contains the output glyphs and their positions.
  **/
 
+
 #ifdef HB_USE_ATEXIT
 static void free_static_shaper_list (void);
 #endif

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-input.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-input.hh	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-input.hh	2018-10-30 23:50:16 UTC (rev 49031)
@@ -37,7 +37,6 @@
 struct hb_subset_input_t
 {
   hb_object_header_t header;
-  ASSERT_POD ();
 
   hb_set_t *unicodes;
   hb_set_t *glyphs;

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	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-plan.cc	2018-10-30 23:50:16 UTC (rev 49031)
@@ -55,7 +55,7 @@
 static void
 _gsub_closure (hb_face_t *face, hb_set_t *gids_to_retain)
 {
-  hb_auto_t<hb_set_t> lookup_indices;
+  hb_set_t lookup_indices;
   hb_ot_layout_collect_lookups (face,
                                 HB_OT_TAG_GSUB,
                                 nullptr,

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	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-plan.hh	2018-10-30 23:50:16 UTC (rev 49031)
@@ -37,7 +37,6 @@
 struct hb_subset_plan_t
 {
   hb_object_header_t header;
-  ASSERT_POD ();
 
   bool drop_hints : 1;
   bool drop_layout : 1;

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset.cc	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset.cc	2018-10-30 23:50:16 UTC (rev 49031)
@@ -68,7 +68,7 @@
   hb_bool_t result = false;
   if (source_blob->data)
   {
-    hb_auto_t<hb_vector_t<char> > buf;
+    hb_vector_t<char> buf;
     unsigned int buf_size = _plan_estimate_subset_table_size (plan, source_blob->length);
     DEBUG_MSG(SUBSET, nullptr, "OT::%c%c%c%c initial estimated table size: %u bytes.", HB_UNTAG(tag), buf_size);
     if (unlikely (!buf.alloc (buf_size)))
@@ -77,7 +77,7 @@
       return false;
     }
   retry:
-    hb_serialize_context_t serializer (buf.arrayZ(), buf_size);
+    hb_serialize_context_t serializer (buf, buf_size);
     hb_subset_context_t c (plan, &serializer);
     result = table->subset (&c);
     if (serializer.ran_out_of_room)

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset.hh	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset.hh	2018-10-30 23:50:16 UTC (rev 49031)
@@ -43,7 +43,7 @@
   template <typename T>
   inline bool dispatch (const T &obj) { return obj.subset (this); }
   static bool default_return_value (void) { return true; }
-  bool stop_sublookup_iteration (bool r) const { return false; }
+  bool stop_sublookup_iteration (bool r HB_UNUSED) const { return false; }
 
   hb_subset_plan_t *plan;
   hb_serialize_context_t *serializer;

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-unicode.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-unicode.cc	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-unicode.cc	2018-10-30 23:50:16 UTC (rev 49031)
@@ -33,7 +33,21 @@
 #include "hb-unicode.hh"
 
 
+/**
+ * SECTION: hb-unicode
+ * @title: hb-unicode
+ * @short_description: Unicode character property access
+ * @include: hb.h
+ *
+ * Unicode functions are used to access Unicode character properties.
+ * Client can pass its own Unicode functions to HarfBuzz, or access
+ * the built-in Unicode functions that come with HarfBuzz.
+ *
+ * With the Unicode functions, one can query variour Unicode character
+ * properties, such as General Category, Script, Combining Class, etc.
+ **/
 
+
 /*
  * hb_unicode_funcs_t
  */
@@ -109,40 +123,23 @@
 }
 
 
-#define HB_UNICODE_FUNCS_IMPLEMENT_SET \
-  HB_UNICODE_FUNCS_IMPLEMENT (glib) \
-  HB_UNICODE_FUNCS_IMPLEMENT (icu) \
-  HB_UNICODE_FUNCS_IMPLEMENT (ucdn) \
-  HB_UNICODE_FUNCS_IMPLEMENT (nil) \
-  /* ^--- Add new callbacks before nil */
+extern "C" hb_unicode_funcs_t *hb_glib_get_unicode_funcs (void);
+extern "C" hb_unicode_funcs_t *hb_icu_get_unicode_funcs (void);
+extern "C" hb_unicode_funcs_t *hb_ucdn_get_unicode_funcs (void);
 
-#define hb_nil_get_unicode_funcs hb_unicode_funcs_get_empty
-
-/* Prototype them all */
-#define HB_UNICODE_FUNCS_IMPLEMENT(set) \
-extern "C" hb_unicode_funcs_t *hb_##set##_get_unicode_funcs (void);
-HB_UNICODE_FUNCS_IMPLEMENT_SET
-#undef HB_UNICODE_FUNCS_IMPLEMENT
-
-
 hb_unicode_funcs_t *
 hb_unicode_funcs_get_default (void)
 {
-#define HB_UNICODE_FUNCS_IMPLEMENT(set) \
-  return hb_##set##_get_unicode_funcs ();
-
 #if defined(HAVE_UCDN)
-  HB_UNICODE_FUNCS_IMPLEMENT(ucdn)
+  return hb_ucdn_get_unicode_funcs ();
 #elif defined(HAVE_GLIB)
-  HB_UNICODE_FUNCS_IMPLEMENT(glib)
+  return hb_glib_get_unicode_funcs ();
 #elif defined(HAVE_ICU) && defined(HAVE_ICU_BUILTIN)
-  HB_UNICODE_FUNCS_IMPLEMENT(icu)
+  return hb_icu_get_unicode_funcs ();
 #else
 #define HB_UNICODE_FUNCS_NIL 1
-  HB_UNICODE_FUNCS_IMPLEMENT(nil)
+  return hb_unicode_funcs_get_empty ();
 #endif
-
-#undef HB_UNICODE_FUNCS_IMPLEMENT
 }
 
 #if !defined(HB_NO_UNICODE_FUNCS) && defined(HB_UNICODE_FUNCS_NIL)
@@ -442,6 +439,7 @@
  * Return value: 
  *
  * Since: 0.9.2
+ * Deprecated: 2.0.0
  **/
 unsigned int
 hb_unicode_decompose_compatibility (hb_unicode_funcs_t *ufuncs,
@@ -575,8 +573,8 @@
 bool
 _hb_unicode_is_emoji_Extended_Pictographic (hb_codepoint_t cp)
 {
-  return hb_bsearch_r (&cp, _hb_unicode_emoji_Extended_Pictographic_table,
-		       ARRAY_LENGTH (_hb_unicode_emoji_Extended_Pictographic_table),
-		       sizeof (hb_unicode_range_t),
-		       hb_unicode_range_t::cmp, nullptr);
+  return hb_bsearch (&cp, _hb_unicode_emoji_Extended_Pictographic_table,
+		     ARRAY_LENGTH (_hb_unicode_emoji_Extended_Pictographic_table),
+		     sizeof (hb_unicode_range_t),
+		     hb_unicode_range_t::cmp);
 }

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-unicode.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-unicode.hh	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-unicode.hh	2018-10-30 23:50:16 UTC (rev 49031)
@@ -63,7 +63,6 @@
 struct hb_unicode_funcs_t
 {
   hb_object_header_t header;
-  ASSERT_POD ();
 
   hb_unicode_funcs_t *parent;
 
@@ -369,7 +368,7 @@
 struct hb_unicode_range_t
 {
   static int
-  cmp (const void *_key, const void *_item, void *_arg)
+  cmp (const void *_key, const void *_item)
   {
     hb_codepoint_t cp = *((hb_codepoint_t *) _key);
     const hb_unicode_range_t *range = (hb_unicode_range_t *) _item;

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-uniscribe.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-uniscribe.cc	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-uniscribe.cc	2018-10-30 23:50:16 UTC (rev 49031)
@@ -36,9 +36,19 @@
 
 #include "hb-open-file.hh"
 #include "hb-ot-name-table.hh"
-#include "hb-ot-tag.h"
+#include "hb-ot-layout.h"
 
 
+/**
+ * SECTION:hb-uniscribe
+ * @title: hb-uniscribe
+ * @short_description: Windows integration
+ * @include: hb-uniscribe.h
+ *
+ * Functions for using HarfBuzz with the Windows fonts.
+ **/
+
+
 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)
@@ -632,12 +642,12 @@
   /*
    * Set up features.
    */
-  hb_auto_t<hb_vector_t<OPENTYPE_FEATURE_RECORD> > feature_records;
-  hb_auto_t<hb_vector_t<range_record_t> > range_records;
+  hb_vector_t<OPENTYPE_FEATURE_RECORD> feature_records;
+  hb_vector_t<range_record_t> range_records;
   if (num_features)
   {
     /* Sort features by start/end events. */
-    hb_auto_t<hb_vector_t<feature_event_t> > feature_events;
+    hb_vector_t<feature_event_t> feature_events;
     for (unsigned int i = 0; i < num_features; i++)
     {
       active_feature_t feature;
@@ -672,7 +682,7 @@
     }
 
     /* Scan events and save features for each range. */
-    hb_auto_t<hb_vector_t<active_feature_t> > active_features;
+    hb_vector_t<active_feature_t> active_features;
     unsigned int last_index = 0;
     for (unsigned int i = 0; i < feature_events.len; i++)
     {
@@ -717,7 +727,7 @@
       {
         active_feature_t *feature = active_features.find (&event->feature);
 	if (feature)
-	  active_features.remove (feature - active_features.arrayZ());
+	  active_features.remove (feature - active_features);
       }
     }
 
@@ -728,7 +738,7 @@
     for (unsigned int i = 0; i < range_records.len; i++)
     {
       range_record_t *range = &range_records[i];
-      range->props.potfRecords = feature_records.arrayZ() + reinterpret_cast<uintptr_t> (range->props.potfRecords);
+      range->props.potfRecords = feature_records + reinterpret_cast<uintptr_t> (range->props.potfRecords);
     }
   }
 
@@ -844,8 +854,8 @@
 #undef MAX_ITEMS
 
   OPENTYPE_TAG language_tag = hb_uint32_swap (hb_ot_tag_from_language (buffer->props.language));
-  hb_auto_t<hb_vector_t<TEXTRANGE_PROPERTIES*> > range_properties;
-  hb_auto_t<hb_vector_t<int> > range_char_counts;
+  hb_vector_t<TEXTRANGE_PROPERTIES*> range_properties;
+  hb_vector_t<int> range_char_counts;
 
   unsigned int glyphs_offset = 0;
   unsigned int glyphs_len;
@@ -902,8 +912,8 @@
 				     &items[i].a,
 				     script_tags[i],
 				     language_tag,
-				     range_char_counts.arrayZ(),
-				     range_properties.arrayZ(),
+				     range_char_counts,
+				     range_properties,
 				     range_properties.len,
 				     pchars + chars_offset,
 				     item_chars_len,
@@ -943,8 +953,8 @@
 				     &items[i].a,
 				     script_tags[i],
 				     language_tag,
-				     range_char_counts.arrayZ(),
-				     range_properties.arrayZ(),
+				     range_char_counts,
+				     range_properties,
 				     range_properties.len,
 				     pchars + chars_offset,
 				     log_clusters + chars_offset,

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-utf.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-utf.hh	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-utf.hh	2018-10-30 23:50:16 UTC (rev 49031)
@@ -29,14 +29,16 @@
 
 #include "hb.hh"
 
+#include "hb-open-type.hh"
 
+
 struct hb_utf8_t
 {
   typedef uint8_t codepoint_t;
 
-  static inline const uint8_t *
-  next (const uint8_t *text,
-	const uint8_t *end,
+  static inline const codepoint_t *
+  next (const codepoint_t *text,
+	const codepoint_t *end,
 	hb_codepoint_t *unicode,
 	hb_codepoint_t replacement)
   {
@@ -103,13 +105,13 @@
     return text;
   }
 
-  static inline const uint8_t *
-  prev (const uint8_t *text,
-	const uint8_t *start,
+  static inline const codepoint_t *
+  prev (const codepoint_t *text,
+	const codepoint_t *start,
 	hb_codepoint_t *unicode,
 	hb_codepoint_t replacement)
   {
-    const uint8_t *end = text--;
+    const codepoint_t *end = text--;
     while (start < text && (*text & 0xc0) == 0x80 && end - text < 4)
       text--;
 
@@ -121,20 +123,71 @@
   }
 
   static inline unsigned int
-  strlen (const uint8_t *text)
+  strlen (const codepoint_t *text)
   {
     return ::strlen ((const char *) text);
   }
+
+  static inline unsigned int
+  encode_len (hb_codepoint_t unicode)
+  {
+    if (unicode <   0x0080u) return 1;
+    if (unicode <   0x0800u) return 2;
+    if (unicode <  0x10000u) return 3;
+    if (unicode < 0x110000u) return 4;
+    return 3;
+  }
+
+  static inline codepoint_t *
+  encode (codepoint_t *text,
+	  const codepoint_t *end,
+	  hb_codepoint_t unicode)
+  {
+    if (unlikely (unicode >= 0xD800u && (unicode <= 0xDFFFu || unicode > 0x10FFFFu)))
+      unicode = 0xFFFDu;
+    if (unicode < 0x0080u)
+     *text++ = unicode;
+    else if (unicode < 0x0800u)
+    {
+      if (end - text >= 2)
+      {
+	*text++ =  0xC0u + (0x1Fu & (unicode >>  6));
+	*text++ =  0x80u + (0x3Fu & (unicode      ));
+      }
+    }
+    else if (unicode < 0x10000u)
+    {
+      if (end - text >= 3)
+      {
+	*text++ =  0xE0u + (0x0Fu & (unicode >> 12));
+	*text++ =  0x80u + (0x3Fu & (unicode >>  6));
+	*text++ =  0x80u + (0x3Fu & (unicode      ));
+      }
+    }
+    else
+    {
+      if (end - text >= 4)
+      {
+	*text++ =  0xF0u + (0x07u & (unicode >> 18));
+	*text++ =  0x80u + (0x3Fu & (unicode >> 12));
+	*text++ =  0x80u + (0x3Fu & (unicode >>  6));
+	*text++ =  0x80u + (0x3Fu & (unicode      ));
+      }
+    }
+    return text;
+  }
 };
 
 
-struct hb_utf16_t
+template <typename TCodepoint>
+struct hb_utf16_xe_t
 {
-  typedef uint16_t codepoint_t;
+  static_assert (sizeof (TCodepoint) == 2, "");
+  typedef TCodepoint codepoint_t;
 
-  static inline const uint16_t *
-  next (const uint16_t *text,
-	const uint16_t *end,
+  static inline const codepoint_t *
+  next (const codepoint_t *text,
+	const codepoint_t *end,
 	hb_codepoint_t *unicode,
 	hb_codepoint_t replacement)
   {
@@ -164,9 +217,9 @@
     return text;
   }
 
-  static inline const uint16_t *
-  prev (const uint16_t *text,
-	const uint16_t *start,
+  static inline const codepoint_t *
+  prev (const codepoint_t *text,
+	const codepoint_t *start,
 	hb_codepoint_t *unicode,
 	hb_codepoint_t replacement)
   {
@@ -198,23 +251,51 @@
 
 
   static inline unsigned int
-  strlen (const uint16_t *text)
+  strlen (const codepoint_t *text)
   {
     unsigned int l = 0;
     while (*text++) l++;
     return l;
   }
+
+  static inline unsigned int
+  encode_len (hb_codepoint_t unicode)
+  {
+    return unicode < 0x10000 ? 1 : 2;
+  }
+
+  static inline codepoint_t *
+  encode (codepoint_t *text,
+	  const codepoint_t *end,
+	  hb_codepoint_t unicode)
+  {
+    if (unlikely (unicode >= 0xD800u && (unicode <= 0xDFFFu || unicode > 0x10FFFFu)))
+      unicode = 0xFFFDu;
+    if (unicode < 0x10000u)
+     *text++ = unicode;
+    else if (end - text >= 2)
+    {
+      unicode -= 0x10000u;
+      *text++ =  0xD800u + (unicode >> 10);
+      *text++ =  0xDC00u + (unicode & 0x03FFu);
+    }
+    return text;
+  }
 };
 
+typedef hb_utf16_xe_t<uint16_t> hb_utf16_t;
+typedef hb_utf16_xe_t<OT::HBUINT16> hb_utf16_be_t;
 
-template <bool validate=true>
-struct hb_utf32_t
+
+template <typename TCodepoint, bool validate=true>
+struct hb_utf32_xe_t
 {
-  typedef uint32_t codepoint_t;
+  static_assert (sizeof (TCodepoint) == 4, "");
+  typedef TCodepoint codepoint_t;
 
-  static inline const uint32_t *
-  next (const uint32_t *text,
-	const uint32_t *end HB_UNUSED,
+  static inline const TCodepoint *
+  next (const TCodepoint *text,
+	const TCodepoint *end HB_UNUSED,
 	hb_codepoint_t *unicode,
 	hb_codepoint_t replacement)
   {
@@ -224,9 +305,9 @@
     return text;
   }
 
-  static inline const uint32_t *
-  prev (const uint32_t *text,
-	const uint32_t *start HB_UNUSED,
+  static inline const TCodepoint *
+  prev (const TCodepoint *text,
+	const TCodepoint *start HB_UNUSED,
 	hb_codepoint_t *unicode,
 	hb_codepoint_t replacement)
   {
@@ -237,22 +318,42 @@
   }
 
   static inline unsigned int
-  strlen (const uint32_t *text)
+  strlen (const TCodepoint *text)
   {
     unsigned int l = 0;
     while (*text++) l++;
     return l;
   }
+
+  static inline unsigned int
+  encode_len (hb_codepoint_t unicode HB_UNUSED)
+  {
+    return 1;
+  }
+
+  static inline codepoint_t *
+  encode (codepoint_t *text,
+	  const codepoint_t *end HB_UNUSED,
+	  hb_codepoint_t unicode)
+  {
+    if (validate && unlikely (unicode >= 0xD800u && (unicode <= 0xDFFFu || unicode > 0x10FFFFu)))
+      unicode = 0xFFFDu;
+    *text++ = unicode;
+    return text;
+  }
 };
 
+typedef hb_utf32_xe_t<uint32_t> hb_utf32_t;
+typedef hb_utf32_xe_t<uint32_t, false> hb_utf32_novalidate_t;
 
+
 struct hb_latin1_t
 {
   typedef uint8_t codepoint_t;
 
-  static inline const uint8_t *
-  next (const uint8_t *text,
-	const uint8_t *end HB_UNUSED,
+  static inline const codepoint_t *
+  next (const codepoint_t *text,
+	const codepoint_t *end HB_UNUSED,
 	hb_codepoint_t *unicode,
 	hb_codepoint_t replacement HB_UNUSED)
   {
@@ -260,23 +361,95 @@
     return text;
   }
 
-  static inline const uint8_t *
-  prev (const uint8_t *text,
-	const uint8_t *start HB_UNUSED,
+  static inline const codepoint_t *
+  prev (const codepoint_t *text,
+	const codepoint_t *start HB_UNUSED,
 	hb_codepoint_t *unicode,
+	hb_codepoint_t replacement HB_UNUSED)
+  {
+    *unicode = *--text;
+    return text;
+  }
+
+  static inline unsigned int
+  strlen (const codepoint_t *text)
+  {
+    unsigned int l = 0;
+    while (*text++) l++;
+    return l;
+  }
+
+  static inline unsigned int
+  encode_len (hb_codepoint_t unicode HB_UNUSED)
+  {
+    return 1;
+  }
+
+  static inline codepoint_t *
+  encode (codepoint_t *text,
+	  const codepoint_t *end HB_UNUSED,
+	  hb_codepoint_t unicode)
+  {
+    if (unlikely (unicode >= 0x0100u))
+      unicode = '?';
+    *text++ = unicode;
+    return text;
+  }
+};
+
+
+struct hb_ascii_t
+{
+  typedef uint8_t codepoint_t;
+
+  static inline const codepoint_t *
+  next (const codepoint_t *text,
+	const codepoint_t *end HB_UNUSED,
+	hb_codepoint_t *unicode,
+	hb_codepoint_t replacement HB_UNUSED)
+  {
+    *unicode = *text++;
+    if (*unicode >= 0x0080u)
+      *unicode = replacement;
+    return text;
+  }
+
+  static inline const codepoint_t *
+  prev (const codepoint_t *text,
+	const codepoint_t *start HB_UNUSED,
+	hb_codepoint_t *unicode,
 	hb_codepoint_t replacement)
   {
     *unicode = *--text;
+    if (*unicode >= 0x0080u)
+      *unicode = replacement;
     return text;
   }
 
   static inline unsigned int
-  strlen (const uint8_t *text)
+  strlen (const codepoint_t *text)
   {
     unsigned int l = 0;
     while (*text++) l++;
     return l;
   }
+
+  static inline unsigned int
+  encode_len (hb_codepoint_t unicode HB_UNUSED)
+  {
+    return 1;
+  }
+
+  static inline codepoint_t *
+  encode (codepoint_t *text,
+	  const codepoint_t *end HB_UNUSED,
+	  hb_codepoint_t unicode)
+  {
+    if (unlikely (unicode >= 0x0080u))
+      unicode = '?';
+    *text++ = unicode;
+    return text;
+  }
 };
 
 #endif /* HB_UTF_HH */

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-vector.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-vector.hh	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-vector.hh	2018-10-30 23:50:16 UTC (rev 49031)
@@ -34,6 +34,10 @@
 template <typename Type, unsigned int StaticSize=8>
 struct hb_vector_t
 {
+  HB_NO_COPY_ASSIGN_TEMPLATE2 (hb_vector_t, Type, StaticSize);
+  inline hb_vector_t (void) { init (); }
+  inline ~hb_vector_t (void) { fini (); }
+
   unsigned int len;
   private:
   unsigned int allocated; /* == 0 means allocation failed. */
@@ -48,6 +52,22 @@
     arrayZ_ = nullptr;
   }
 
+  inline void fini (void)
+  {
+    if (arrayZ_)
+      free (arrayZ_);
+    arrayZ_ = nullptr;
+    allocated = len = 0;
+  }
+  inline void fini_deep (void)
+  {
+    Type *array = arrayZ();
+    unsigned int count = len;
+    for (unsigned int i = 0; i < count; i++)
+      array[i].fini ();
+    fini ();
+  }
+
   inline Type * arrayZ (void)
   { return arrayZ_ ? arrayZ_ : static_array; }
   inline const Type * arrayZ (void) const
@@ -66,6 +86,12 @@
     return arrayZ()[i];
   }
 
+  template <typename T> inline operator  T * (void) { return arrayZ(); }
+  template <typename T> inline operator const T * (void) const { return arrayZ(); }
+
+  inline Type * operator  + (unsigned int i) { return arrayZ() + i; }
+  inline const Type * operator  + (unsigned int i) const { return arrayZ() + i; }
+
   inline Type *push (void)
   {
     if (unlikely (!resize (len + 1)))
@@ -232,7 +258,7 @@
     const Type *array = this->arrayZ();
     while (min <= max)
     {
-      int mid = (min + max) / 2;
+      int mid = ((unsigned int) min + (unsigned int) max) / 2;
       int c = array[mid].cmp (&x);
       if (c < 0)
         max = mid - 1;
@@ -249,23 +275,6 @@
     *i = max;
     return false;
   }
-
-  inline void fini_deep (void)
-  {
-    Type *array = arrayZ();
-    unsigned int count = len;
-    for (unsigned int i = 0; i < count; i++)
-      array[i].fini ();
-    fini ();
-  }
-
-  inline void fini (void)
-  {
-    if (arrayZ_)
-      free (arrayZ_);
-    arrayZ_ = nullptr;
-    allocated = len = 0;
-  }
 };
 
 

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb.h
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb.h	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb.h	2018-10-30 23:50:16 UTC (rev 49031)
@@ -28,10 +28,6 @@
 #define HB_H
 #define HB_H_IN
 
-#ifndef HB_EXTERN
-#define HB_EXTERN extern
-#endif
-
 #include "hb-blob.h"
 #include "hb-buffer.h"
 #include "hb-common.h"

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb.hh	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb.hh	2018-10-30 23:50:16 UTC (rev 49031)
@@ -337,35 +337,40 @@
 static_assert ((sizeof (hb_var_int_t) == 4), "");
 
 
-/* We like our types POD */
+#if __cplusplus >= 201103L
 
-#define _ASSERT_TYPE_POD1(_line, _type)	union _type_##_type##_on_line_##_line##_is_not_POD { _type instance; }
-#define _ASSERT_TYPE_POD0(_line, _type)	_ASSERT_TYPE_POD1 (_line, _type)
-#define ASSERT_TYPE_POD(_type)		_ASSERT_TYPE_POD0 (__LINE__, _type)
+/* We only enable these with C++11 or later, since earlier language
+ * does not allow structs with constructors in unions, and we need
+ * those. */
 
-#ifdef __GNUC__
-# define _ASSERT_INSTANCE_POD1(_line, _instance) \
-	HB_STMT_START { \
-		typedef __typeof__(_instance) _type_##_line; \
-		_ASSERT_TYPE_POD1 (_line, _type_##_line); \
-	} HB_STMT_END
-#else
-# define _ASSERT_INSTANCE_POD1(_line, _instance)	typedef int _assertion_on_line_##_line##_not_tested
-#endif
-# define _ASSERT_INSTANCE_POD0(_line, _instance)	_ASSERT_INSTANCE_POD1 (_line, _instance)
-# define ASSERT_INSTANCE_POD(_instance)			_ASSERT_INSTANCE_POD0 (__LINE__, _instance)
+#define HB_NO_COPY_ASSIGN(TypeName) \
+  TypeName(const TypeName&); \
+  void operator=(const TypeName&)
+#define HB_NO_COPY_ASSIGN_TEMPLATE2(TypeName, T1, T2) \
+  TypeName(const TypeName<T1, T2>&); \
+  void operator=(const TypeName<T1, T2>&)
+#define HB_NO_CREATE_COPY_ASSIGN(TypeName) \
+  TypeName(void); \
+  TypeName(const TypeName&); \
+  void operator=(const TypeName&)
+#define HB_NO_CREATE_COPY_ASSIGN_TEMPLATE(TypeName, T) \
+  TypeName(void); \
+  TypeName(const TypeName<T>&); \
+  void operator=(const TypeName<T>&)
+#define HB_NO_CREATE_COPY_ASSIGN_TEMPLATE2(TypeName, T1, T2) \
+  TypeName(void); \
+  TypeName(const TypeName<T1, T2>&); \
+  void operator=(const TypeName<T1, T2>&)
 
-/* Check _assertion in a method environment */
-#define _ASSERT_POD1(_line) \
-	HB_UNUSED inline void _static_assertion_on_line_##_line (void) const \
-	{ _ASSERT_INSTANCE_POD1 (_line, *this); /* Make sure it's POD. */ }
-# define _ASSERT_POD0(_line)	_ASSERT_POD1 (_line)
-# define ASSERT_POD()		_ASSERT_POD0 (__LINE__)
+#else /* __cpluspplus >= 201103L */
 
+#define HB_NO_COPY_ASSIGN(TypeName)
+#define HB_NO_COPY_ASSIGN_TEMPLATE2(TypeName, T1, T2)
+#define HB_NO_CREATE_COPY_ASSIGN(TypeName)
+#define HB_NO_CREATE_COPY_ASSIGN_TEMPLATE(TypeName, T)
+#define HB_NO_CREATE_COPY_ASSIGN_TEMPLATE2(TypeName, T1, T2)
 
-#define HB_DISALLOW_COPY_AND_ASSIGN(TypeName) \
-  TypeName(const TypeName&); \
-  void operator=(const TypeName&)
+#endif /* __cpluspplus >= 201103L */
 
 
 /*
@@ -495,6 +500,15 @@
 #define HB_SCRIPT_MYANMAR_ZAWGYI	((hb_script_t) HB_TAG ('Q','a','a','g'))
 
 
+/* Some really basic things everyone wants. */
+template <typename T> struct hb_remove_const { typedef T value; };
+template <typename T> struct hb_remove_const<const T> { typedef T value; };
+template <typename T> struct hb_remove_reference { typedef T value; };
+template <typename T> struct hb_remove_reference<T &> { typedef T value; };
+template <typename T> struct hb_remove_pointer { typedef T value; };
+template <typename T> struct hb_remove_pointer<T *> { typedef T value; };
+
+
 /* Headers we include for everyone.  Keep sorted.  They express dependency amongst
  * themselves, but no other file should include them.*/
 #include "hb-atomic.hh"

Added: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/test-name-table.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/test-name-table.cc	                        (rev 0)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/test-name-table.cc	2018-10-30 23:50:16 UTC (rev 49031)
@@ -0,0 +1,67 @@
+/*
+ * 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.h"
+#include "hb-ot.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+
+int
+main (int argc, char **argv)
+{
+  if (argc != 2) {
+    fprintf (stderr, "usage: %s font-file\n", argv[0]);
+    exit (1);
+  }
+
+  hb_blob_t *blob = hb_blob_create_from_file (argv[1]);
+  hb_face_t *face = hb_face_create (blob, 0 /* first face */);
+  hb_blob_destroy (blob);
+  blob = NULL;
+
+  unsigned int count;
+  const hb_ot_name_entry_t *entries = hb_ot_name_list_names (face, &count);
+
+  for (unsigned int i = 0; i < count; i++)
+  {
+    printf ("%d	%s	",
+	    entries[i].name_id,
+	    hb_language_to_string (entries[i].language));
+
+    char buf[64];
+    unsigned int buf_size = sizeof (buf);
+    hb_ot_name_get_utf8 (face,
+			 entries[i].name_id,
+			 entries[i].language,
+			 &buf_size,
+			 buf);
+
+    printf ("%s\n", buf);
+  }
+
+  return count ? 0 : 1;
+}

Added: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/test-ot-color.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/test-ot-color.cc	                        (rev 0)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/test-ot-color.cc	2018-10-30 23:50:16 UTC (rev 49031)
@@ -0,0 +1,347 @@
+/*
+ * Copyright © 2018  Ebrahim Byagowi
+ * Copyright © 2018  Khaled Hosny
+ *
+ *  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.h"
+#include "hb-ot.h"
+
+#include "hb-ft.h"
+
+#include <ft2build.h>
+#include FT_FREETYPE_H
+#include FT_GLYPH_H
+
+#include <cairo.h>
+#include <cairo-ft.h>
+#include <cairo-svg.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+
+static void
+png_dump (hb_face_t *face, unsigned int face_index)
+{
+  unsigned glyph_count = hb_face_get_glyph_count (face);
+  hb_font_t *font = hb_font_create (face);
+
+  /* ugly hack, scans the font for strikes, not needed for regular clients */
+  #define STRIKES_MAX 20
+  unsigned int strikes_count = 0;
+  unsigned int strikes[STRIKES_MAX] = {0};
+  {
+    /* find a sample glyph */
+    unsigned int sample_glyph_id;
+    /* we don't care much about different strikes for different glyphs */
+    for (sample_glyph_id = 0; sample_glyph_id < glyph_count; sample_glyph_id++)
+    {
+      hb_blob_t *blob = hb_ot_color_glyph_reference_png (font, sample_glyph_id);
+      unsigned int blob_length = hb_blob_get_length (blob);
+      hb_blob_destroy (blob);
+      if (blob_length != 0)
+	break;
+    }
+    /* find strikes it has */
+    unsigned int upem = hb_face_get_upem (face);
+    unsigned int blob_length = 0;
+    for (unsigned int ppem = 1; ppem <= upem && strikes_count < STRIKES_MAX; ppem++)
+    {
+      hb_font_set_ppem (font, ppem, ppem);
+      hb_blob_t *blob = hb_ot_color_glyph_reference_png (font, sample_glyph_id);
+      unsigned int new_blob_length = hb_blob_get_length (blob);
+      if (blob_length != new_blob_length)
+      {
+	strikes_count++;
+	blob_length = new_blob_length;
+      }
+      if (strikes_count != 0)
+	strikes[strikes_count - 1] = ppem;
+      hb_blob_destroy (blob);
+    }
+    /* can't report the biggest strike correctly, and, we can't do anything about it */
+  }
+  #undef STRIKES_MAX
+
+  for (unsigned int strike = 0; strike < strikes_count; strike++)
+    for (unsigned int glyph_id = 0; glyph_id < glyph_count; glyph_id++)
+    {
+      unsigned int ppem = strikes[strike];
+      hb_font_set_ppem (font, ppem, ppem);
+      hb_blob_t *blob = hb_ot_color_glyph_reference_png (font, glyph_id);
+
+      if (hb_blob_get_length (blob) == 0) continue;
+
+      unsigned int length;
+      const char *data = hb_blob_get_data (blob, &length);
+
+      char output_path[255];
+      sprintf (output_path, "out/png-%d-%d-%d.png", glyph_id, strike, face_index);
+
+      FILE *f = fopen (output_path, "wb");
+      fwrite (data, 1, length, f);
+      fclose (f);
+
+      hb_blob_destroy (blob);
+    }
+
+  hb_font_destroy (font);
+}
+
+static void
+svg_dump (hb_face_t *face, unsigned int face_index)
+{
+  unsigned glyph_count = hb_face_get_glyph_count (face);
+
+  for (unsigned int glyph_id = 0; glyph_id < glyph_count; glyph_id++)
+  {
+    hb_blob_t *blob = hb_ot_color_glyph_reference_svg (face, glyph_id);
+
+    if (hb_blob_get_length (blob) == 0) continue;
+
+    unsigned int length;
+    const char *data = hb_blob_get_data (blob, &length);
+
+    char output_path[255];
+    sprintf (output_path, "out/svg-%d-%d.svg%s",
+	     glyph_id,
+	     face_index,
+	     // append "z" if the content is gzipped, https://stackoverflow.com/a/6059405
+	     (length > 2 && (data[0] == '\x1F') && (data[1] == '\x8B')) ? "z" : "");
+
+    FILE *f = fopen (output_path, "wb");
+    fwrite (data, 1, length, f);
+    fclose (f);
+
+    hb_blob_destroy (blob);
+  }
+}
+
+static void
+layered_glyph_dump (hb_face_t *face, cairo_font_face_t *cairo_face, unsigned int face_index)
+{
+  unsigned int upem = hb_face_get_upem (face);
+
+  unsigned glyph_count = hb_face_get_glyph_count (face);
+  for (hb_codepoint_t gid = 0; gid < glyph_count; ++gid)
+  {
+    unsigned int num_layers = hb_ot_color_glyph_get_layers (face, gid, 0, nullptr, nullptr);
+    if (!num_layers)
+      continue;
+
+    hb_ot_color_layer_t *layers = (hb_ot_color_layer_t*) malloc (num_layers * sizeof (hb_ot_color_layer_t));
+
+    hb_ot_color_glyph_get_layers (face, gid, 0, &num_layers, layers);
+    if (num_layers)
+    {
+      // Measure
+      cairo_text_extents_t extents;
+      {
+	cairo_surface_t *surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 1, 1);
+	cairo_t *cr = cairo_create (surface);
+	cairo_set_font_face (cr, cairo_face);
+	cairo_set_font_size (cr, upem);
+
+	cairo_glyph_t *glyphs = (cairo_glyph_t *) calloc (num_layers, sizeof (cairo_glyph_t));
+	for (unsigned int j = 0; j < num_layers; ++j)
+	  glyphs[j].index = layers[j].glyph;
+	cairo_glyph_extents (cr, glyphs, num_layers, &extents);
+	free (glyphs);
+	cairo_surface_destroy (surface);
+	cairo_destroy (cr);
+      }
+
+      // Add a slight margin
+      extents.width += extents.width / 10;
+      extents.height += extents.height / 10;
+      extents.x_bearing -= extents.width / 20;
+      extents.y_bearing -= extents.height / 20;
+
+      // Render
+      unsigned int palette_count = hb_ot_color_palette_get_count (face);
+      for (unsigned int palette = 0; palette < palette_count; palette++) {
+	char output_path[255];
+
+	unsigned int num_colors = hb_ot_color_palette_get_colors (face, palette, 0, nullptr, nullptr);
+	if (!num_colors)
+	  continue;
+
+	hb_color_t *colors = (hb_color_t*) calloc (num_colors, sizeof (hb_color_t));
+	hb_ot_color_palette_get_colors (face, palette, 0, &num_colors, colors);
+	if (num_colors)
+	{
+	  sprintf (output_path, "out/colr-%d-%d-%d.svg", gid, palette, face_index);
+
+	  cairo_surface_t *surface = cairo_svg_surface_create (output_path, extents.width, extents.height);
+	  cairo_t *cr = cairo_create (surface);
+	  cairo_set_font_face (cr, cairo_face);
+	  cairo_set_font_size (cr, upem);
+
+	  for (unsigned int layer = 0; layer < num_layers; ++layer)
+	  {
+	    hb_color_t color = 0x000000FF;
+	    if (layers[layer].color_index != 0xFFFF)
+	      color = colors[layers[layer].color_index];
+	    cairo_set_source_rgba (cr,
+				   hb_color_get_red (color) / 255.,
+				   hb_color_get_green (color) / 255.,
+				   hb_color_get_blue (color) / 255.,
+				   hb_color_get_alpha (color) / 255.);
+
+	    cairo_glyph_t glyph;
+	    glyph.index = layers[layer].glyph;
+	    glyph.x = -extents.x_bearing;
+	    glyph.y = -extents.y_bearing;
+	    cairo_show_glyphs (cr, &glyph, 1);
+	  }
+
+	  cairo_surface_destroy (surface);
+	  cairo_destroy (cr);
+	}
+	free (colors);
+      }
+    }
+
+    free (layers);
+  }
+}
+
+static void
+dump_glyphs (cairo_font_face_t *cairo_face, unsigned int upem,
+	     unsigned int num_glyphs, unsigned int face_index)
+{
+  for (unsigned int i = 0; i < num_glyphs; ++i)
+  {
+    cairo_text_extents_t extents;
+    cairo_glyph_t glyph = {0};
+    glyph.index = i;
+
+    // Measure
+    {
+      cairo_surface_t *surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 1, 1);
+      cairo_t *cr = cairo_create (surface);
+      cairo_set_font_face (cr, cairo_face);
+      cairo_set_font_size (cr, upem);
+
+      cairo_glyph_extents (cr, &glyph, 1, &extents);
+      cairo_surface_destroy (surface);
+      cairo_destroy (cr);
+    }
+
+    // Add a slight margin
+    extents.width += extents.width / 10;
+    extents.height += extents.height / 10;
+    extents.x_bearing -= extents.width / 20;
+    extents.y_bearing -= extents.height / 20;
+
+    // Render
+    {
+      char output_path[255];
+      sprintf (output_path, "out/%d-%d.svg", face_index, i);
+      cairo_surface_t *surface = cairo_svg_surface_create (output_path, extents.width, extents.height);
+      cairo_t *cr = cairo_create (surface);
+      cairo_set_font_face (cr, cairo_face);
+      cairo_set_font_size (cr, upem);
+      glyph.x = -extents.x_bearing;
+      glyph.y = -extents.y_bearing;
+      cairo_show_glyphs (cr, &glyph, 1);
+      cairo_surface_destroy (surface);
+      cairo_destroy (cr);
+    }
+  }
+}
+
+int
+main (int argc, char **argv)
+{
+  if (argc != 2) {
+    fprintf (stderr, "usage: %s font-file.ttf\n"
+		     "run it like `rm -rf out && mkdir out && %s font-file.ttf`\n",
+		     argv[0], argv[0]);
+    exit (1);
+  }
+
+
+  FILE *font_name_file = fopen ("out/.dumped_font_name", "r");
+  if (font_name_file != nullptr)
+  {
+    fprintf (stderr, "Purge or move ./out folder in order to run a new dump\n");
+    exit (1);
+  }
+
+  font_name_file = fopen ("out/.dumped_font_name", "w");
+  if (font_name_file == nullptr)
+  {
+    fprintf (stderr, "./out is not accessible as a folder, create it please\n");
+    exit (1);
+  }
+  fwrite (argv[1], 1, strlen (argv[1]), font_name_file);
+  fclose (font_name_file);
+
+  hb_blob_t *blob = hb_blob_create_from_file (argv[1]);
+  unsigned int num_faces = hb_face_count (blob);
+  if (num_faces == 0)
+  {
+    fprintf (stderr, "error: The file (%s) was corrupted, empty or not found", argv[1]);
+    exit (1);
+  }
+
+  for (unsigned int face_index = 0; face_index < hb_face_count (blob); face_index++)
+  {
+    hb_face_t *face = hb_face_create (blob, face_index);
+    hb_font_t *font = hb_font_create (face);
+
+    if (hb_ot_color_has_png (face)) printf ("Dumping png (cbdt/sbix)...\n");
+    png_dump (face, face_index);
+
+    if (hb_ot_color_has_svg (face)) printf ("Dumping svg...\n");
+    svg_dump (face, face_index);
+
+    cairo_font_face_t *cairo_face;
+    {
+      FT_Library library;
+      FT_Init_FreeType (&library);
+      FT_Face ft_face;
+      FT_New_Face (library, argv[1], 0, &ft_face);
+      cairo_face = cairo_ft_font_face_create_for_ft_face (ft_face, 0);
+    }
+    if (hb_ot_color_has_layers (face) && hb_ot_color_has_palettes (face))
+      printf ("Dumping layered color glyphs...\n");
+    layered_glyph_dump (face, cairo_face, face_index);
+
+    unsigned int num_glyphs = hb_face_get_glyph_count (face);
+    unsigned int upem = hb_face_get_upem (face);
+
+    // disabled when color font as cairo rendering of NotoColorEmoji is soooo slow
+    if (!hb_ot_color_has_layers (face) &&
+        !hb_ot_color_has_png (face) &&
+        !hb_ot_color_has_svg (face))
+      dump_glyphs (cairo_face, upem, num_glyphs, face_index);
+
+    hb_font_destroy (font);
+    hb_face_destroy (face);
+    }
+
+  hb_blob_destroy (blob);
+
+  return 0;
+}

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/test-size-params.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/test-size-params.cc	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/test-size-params.cc	2018-10-30 23:50:16 UTC (rev 49031)
@@ -46,7 +46,7 @@
   blob = nullptr;
 
   unsigned int p[5];
-  bool ret = hb_ot_layout_get_size_params (face, p, p+1, p+2, p+3, p+4);
+  bool ret = hb_ot_layout_get_size_params (face, p, p+1, (p+2), p+3, p+4);
 
   printf ("%g %u %u %g %g\n", p[0]/10., p[1], p[2], p[3]/10., p[4]/10.);
 

Modified: trunk/Build/source/libs/harfbuzz/include/Makefile.am
===================================================================
--- trunk/Build/source/libs/harfbuzz/include/Makefile.am	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/include/Makefile.am	2018-10-30 23:50:16 UTC (rev 49031)
@@ -30,12 +30,12 @@
 ## native OpenType Layout backend
 hdr_links += \
 	$(HARFBUZZ_SRC)/hb-ot.h \
+	$(HARFBUZZ_SRC)/hb-ot-color.h \
 	$(HARFBUZZ_SRC)/hb-ot-font.h \
 	$(HARFBUZZ_SRC)/hb-ot-layout.h \
 	$(HARFBUZZ_SRC)/hb-ot-math.h \
 	$(HARFBUZZ_SRC)/hb-ot-name.h \
 	$(HARFBUZZ_SRC)/hb-ot-shape.h \
-	$(HARFBUZZ_SRC)/hb-ot-tag.h \
 	$(HARFBUZZ_SRC)/hb-ot-var.h
 
 ## ICU library

Modified: trunk/Build/source/libs/harfbuzz/include/Makefile.in
===================================================================
--- trunk/Build/source/libs/harfbuzz/include/Makefile.in	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/include/Makefile.in	2018-10-30 23:50:16 UTC (rev 49031)
@@ -257,9 +257,9 @@
 	$(HARFBUZZ_SRC)/hb-set.h $(HARFBUZZ_SRC)/hb-shape.h \
 	$(HARFBUZZ_SRC)/hb-shape-plan.h $(HARFBUZZ_SRC)/hb-unicode.h \
 	$(HARFBUZZ_BLD)/hb-version.h $(HARFBUZZ_SRC)/hb-ot.h \
-	$(HARFBUZZ_SRC)/hb-ot-font.h $(HARFBUZZ_SRC)/hb-ot-layout.h \
-	$(HARFBUZZ_SRC)/hb-ot-math.h $(HARFBUZZ_SRC)/hb-ot-name.h \
-	$(HARFBUZZ_SRC)/hb-ot-shape.h $(HARFBUZZ_SRC)/hb-ot-tag.h \
+	$(HARFBUZZ_SRC)/hb-ot-color.h $(HARFBUZZ_SRC)/hb-ot-font.h \
+	$(HARFBUZZ_SRC)/hb-ot-layout.h $(HARFBUZZ_SRC)/hb-ot-math.h \
+	$(HARFBUZZ_SRC)/hb-ot-name.h $(HARFBUZZ_SRC)/hb-ot-shape.h \
 	$(HARFBUZZ_SRC)/hb-ot-var.h $(HARFBUZZ_SRC)/hb-icu.h \
 	$(HARFBUZZ_SRC)/hb-graphite2.h
 all: all-am

Modified: trunk/Build/source/libs/harfbuzz/version.ac
===================================================================
--- trunk/Build/source/libs/harfbuzz/version.ac	2018-10-30 20:45:57 UTC (rev 49030)
+++ trunk/Build/source/libs/harfbuzz/version.ac	2018-10-30 23:50:16 UTC (rev 49031)
@@ -8,4 +8,4 @@
 dnl --------------------------------------------------------
 dnl
 dnl  m4-include this file to define the current harfbuzz version
-m4_define([harfbuzz_version], [2.0.2])
+m4_define([harfbuzz_version], [2.1.0])



More information about the tex-live-commits mailing list