texlive[46877] Build/source/libs: harfbuzz-1.7.6

commits+kakuto at tug.org commits+kakuto at tug.org
Wed Mar 7 23:32:14 CET 2018


Revision: 46877
          http://tug.org/svn/texlive?view=revision&revision=46877
Author:   kakuto
Date:     2018-03-07 23:32:14 +0100 (Wed, 07 Mar 2018)
Log Message:
-----------
harfbuzz-1.7.6

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/TODO
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/autogen.sh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/config.h.in
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/configure.ac
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/Makefile.am
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/Makefile.sources
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/check-libstdc++.sh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/check-symbols.sh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/gen-def.py
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/gen-use-table.py
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-common-private.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-private.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-blob.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-blob.h
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer-deserialize-json.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer-deserialize-json.rl
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer-deserialize-text.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer-deserialize-text.rl
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer-private.hh
    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-common.cc
    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-directwrite.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-face.h
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ft.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-gobject-enums.h.tmpl
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-gobject-structs.h
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-graphite2.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-open-file-private.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-open-type-private.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-cmap-table.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-head-table.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-hhea-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-private.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-gdef-table.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-private.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-private.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-private.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-map.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-maxp-table.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-os2-table.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-indic-private.hh
    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-machine.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-myanmar-machine.rl
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-myanmar.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-use-machine.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-use-machine.rl
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-use-private.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-use-table.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-use.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.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-private.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-set-private.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-set.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-set.h
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-uniscribe.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/main.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/test-buffer-serialize.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/dump-indic-data.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/dump-khmer-data.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/dump-myanmar-data.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/dump-use-data.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/harfbuzz-config.cmake.in
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/harfbuzz-subset.pc.in
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-ankr-table.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-trak-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.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-hdmx-table.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-base-table.hh
    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-khmer-private.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-myanmar-private.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-glyf.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-glyf.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-input.cc
    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-private.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset.h
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/test-unicode-ranges.cc

Removed Paths:
-------------
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/check-defs.sh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-cbdt-table.hh

Modified: trunk/Build/source/libs/README
===================================================================
--- trunk/Build/source/libs/README	2018-03-07 21:52:46 UTC (rev 46876)
+++ trunk/Build/source/libs/README	2018-03-07 22:32:14 UTC (rev 46877)
@@ -24,7 +24,7 @@
 graphite2 1.3.11 - checked 05mar18
   http://sourceforge.net/projects/silgraphite/files/graphite2/
 
-harfbuzz 1.7.5 - checked 31jan18
+harfbuzz 1.7.6 - checked 07mar18
   http://www.freedesktop.org/software/harfbuzz/release/
 
 icu 60.2 - checked 11jan18

Modified: trunk/Build/source/libs/harfbuzz/ChangeLog
===================================================================
--- trunk/Build/source/libs/harfbuzz/ChangeLog	2018-03-07 21:52:46 UTC (rev 46876)
+++ trunk/Build/source/libs/harfbuzz/ChangeLog	2018-03-07 22:32:14 UTC (rev 46877)
@@ -1,3 +1,8 @@
+2018-03-07  Akira Kakuto  <kakuto at fuk.kindai.ac.jp>
+
+	Import harfbuzz-1.7.6.
+	* Makefile.am, version.ac, include/Makefile.am: Adjusted.
+
 2018-01-31  Akira Kakuto  <kakuto at fuk.kindai.ac.jp>
 
 	Import harfbuzz-1.7.5.

Modified: trunk/Build/source/libs/harfbuzz/Makefile.am
===================================================================
--- trunk/Build/source/libs/harfbuzz/Makefile.am	2018-03-07 21:52:46 UTC (rev 46876)
+++ trunk/Build/source/libs/harfbuzz/Makefile.am	2018-03-07 22:32:14 UTC (rev 46877)
@@ -31,6 +31,10 @@
 	-I$(top_srcdir)/$(HARFBUZZ_SRC)
 libharfbuzz_dependencies =
 libharfbuzz_a_SOURCES =  \
+	@HARFBUZZ_TREE@/src/dump-indic-data.cc \
+	@HARFBUZZ_TREE@/src/dump-khmer-data.cc \
+	@HARFBUZZ_TREE@/src/dump-myanmar-data.cc \
+	@HARFBUZZ_TREE@/src/dump-use-data.cc \
 	@HARFBUZZ_TREE@/src/hb-atomic-private.hh \
 	@HARFBUZZ_TREE@/src/hb-blob.cc \
 	@HARFBUZZ_TREE@/src/hb-buffer-deserialize-json.hh \
@@ -50,16 +54,24 @@
 	@HARFBUZZ_TREE@/src/hb-object-private.hh \
 	@HARFBUZZ_TREE@/src/hb-open-file-private.hh \
 	@HARFBUZZ_TREE@/src/hb-open-type-private.hh \
-	@HARFBUZZ_TREE@/src/hb-ot-cbdt-table.hh \
+	@HARFBUZZ_TREE@/src/hb-ot-color-cbdt-table.hh \
+	@HARFBUZZ_TREE@/src/hb-ot-color-colr-table.hh \
+	@HARFBUZZ_TREE@/src/hb-ot-color-cpal-table.hh \
+	@HARFBUZZ_TREE@/src/hb-ot-color.cc \
+	@HARFBUZZ_TREE@/src/hb-ot-hdmx-table.hh \
 	@HARFBUZZ_TREE@/src/hb-ot-head-table.hh \
 	@HARFBUZZ_TREE@/src/hb-ot-hhea-table.hh \
 	@HARFBUZZ_TREE@/src/hb-ot-hmtx-table.hh \
 	@HARFBUZZ_TREE@/src/hb-ot-kern-table.hh \
+	@HARFBUZZ_TREE@/src/hb-ot-layout-base-table.hh \
 	@HARFBUZZ_TREE@/src/hb-ot-maxp-table.hh \
 	@HARFBUZZ_TREE@/src/hb-ot-name-table.hh \
 	@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 \
 	@HARFBUZZ_TREE@/src/hb-ot-post-table.hh \
+	@HARFBUZZ_TREE@/src/hb-ot-shape-complex-khmer-private.hh \
+	@HARFBUZZ_TREE@/src/hb-ot-shape-complex-myanmar-private.hh \
 	@HARFBUZZ_TREE@/src/hb-ot-var-mvar-table.hh \
 	@HARFBUZZ_TREE@/src/hb-ot-tag.cc \
 	@HARFBUZZ_TREE@/src/hb-private.hh \
@@ -74,6 +86,14 @@
 	@HARFBUZZ_TREE@/src/hb-shaper-private.hh \
 	@HARFBUZZ_TREE@/src/hb-shaper.cc \
 	@HARFBUZZ_TREE@/src/hb-string-array.hh \
+	@HARFBUZZ_TREE@/src/hb-subset-glyf.cc \
+	@HARFBUZZ_TREE@/src/hb-subset-glyf.hh \
+	@HARFBUZZ_TREE@/src/hb-subset-input.cc \
+	@HARFBUZZ_TREE@/src/hb-subset-plan.cc \
+	@HARFBUZZ_TREE@/src/hb-subset-plan.hh \
+	@HARFBUZZ_TREE@/src/hb-subset-private.hh \
+	@HARFBUZZ_TREE@/src/hb-subset.cc \
+	@HARFBUZZ_TREE@/src/hb-subset.h \
 	@HARFBUZZ_TREE@/src/hb-unicode-private.hh \
 	@HARFBUZZ_TREE@/src/hb-unicode.cc \
 	@HARFBUZZ_TREE@/src/hb-utf-private.hh \

Modified: trunk/Build/source/libs/harfbuzz/Makefile.in
===================================================================
--- trunk/Build/source/libs/harfbuzz/Makefile.in	2018-03-07 21:52:46 UTC (rev 46876)
+++ trunk/Build/source/libs/harfbuzz/Makefile.in	2018-03-07 22:32:14 UTC (rev 46877)
@@ -120,7 +120,12 @@
 libharfbuzz_a_AR = $(AR) $(ARFLAGS)
 libharfbuzz_a_LIBADD =
 am__dirstamp = $(am__leading_dot)dirstamp
-am_libharfbuzz_a_OBJECTS = @HARFBUZZ_TREE@/src/hb-blob.$(OBJEXT) \
+am_libharfbuzz_a_OBJECTS =  \
+	@HARFBUZZ_TREE@/src/dump-indic-data.$(OBJEXT) \
+	@HARFBUZZ_TREE@/src/dump-khmer-data.$(OBJEXT) \
+	@HARFBUZZ_TREE@/src/dump-myanmar-data.$(OBJEXT) \
+	@HARFBUZZ_TREE@/src/dump-use-data.$(OBJEXT) \
+	@HARFBUZZ_TREE@/src/hb-blob.$(OBJEXT) \
 	@HARFBUZZ_TREE@/src/hb-buffer-serialize.$(OBJEXT) \
 	@HARFBUZZ_TREE@/src/hb-buffer.$(OBJEXT) \
 	@HARFBUZZ_TREE@/src/hb-common.$(OBJEXT) \
@@ -127,11 +132,16 @@
 	@HARFBUZZ_TREE@/src/hb-face.$(OBJEXT) \
 	@HARFBUZZ_TREE@/src/hb-fallback-shape.$(OBJEXT) \
 	@HARFBUZZ_TREE@/src/hb-font.$(OBJEXT) \
+	@HARFBUZZ_TREE@/src/hb-ot-color.$(OBJEXT) \
 	@HARFBUZZ_TREE@/src/hb-ot-tag.$(OBJEXT) \
 	@HARFBUZZ_TREE@/src/hb-set.$(OBJEXT) \
 	@HARFBUZZ_TREE@/src/hb-shape.$(OBJEXT) \
 	@HARFBUZZ_TREE@/src/hb-shape-plan.$(OBJEXT) \
 	@HARFBUZZ_TREE@/src/hb-shaper.$(OBJEXT) \
+	@HARFBUZZ_TREE@/src/hb-subset-glyf.$(OBJEXT) \
+	@HARFBUZZ_TREE@/src/hb-subset-input.$(OBJEXT) \
+	@HARFBUZZ_TREE@/src/hb-subset-plan.$(OBJEXT) \
+	@HARFBUZZ_TREE@/src/hb-subset.$(OBJEXT) \
 	@HARFBUZZ_TREE@/src/hb-unicode.$(OBJEXT) \
 	@HARFBUZZ_TREE@/src/hb-warning.$(OBJEXT) \
 	@HARFBUZZ_TREE@/src/hb-ot-font.$(OBJEXT) \
@@ -649,7 +659,11 @@
 	-I$(top_srcdir)/$(HARFBUZZ_SRC) $(ICU_INCLUDES) \
 	$(GRAPHITE2_INCLUDES)
 libharfbuzz_dependencies = $(ICU_DEPEND) $(GRAPHITE2_DEPEND)
-libharfbuzz_a_SOURCES = @HARFBUZZ_TREE@/src/hb-atomic-private.hh \
+libharfbuzz_a_SOURCES = @HARFBUZZ_TREE@/src/dump-indic-data.cc \
+	@HARFBUZZ_TREE@/src/dump-khmer-data.cc \
+	@HARFBUZZ_TREE@/src/dump-myanmar-data.cc \
+	@HARFBUZZ_TREE@/src/dump-use-data.cc \
+	@HARFBUZZ_TREE@/src/hb-atomic-private.hh \
 	@HARFBUZZ_TREE@/src/hb-blob.cc \
 	@HARFBUZZ_TREE@/src/hb-buffer-deserialize-json.hh \
 	@HARFBUZZ_TREE@/src/hb-buffer-deserialize-text.hh \
@@ -668,16 +682,24 @@
 	@HARFBUZZ_TREE@/src/hb-object-private.hh \
 	@HARFBUZZ_TREE@/src/hb-open-file-private.hh \
 	@HARFBUZZ_TREE@/src/hb-open-type-private.hh \
-	@HARFBUZZ_TREE@/src/hb-ot-cbdt-table.hh \
+	@HARFBUZZ_TREE@/src/hb-ot-color-cbdt-table.hh \
+	@HARFBUZZ_TREE@/src/hb-ot-color-colr-table.hh \
+	@HARFBUZZ_TREE@/src/hb-ot-color-cpal-table.hh \
+	@HARFBUZZ_TREE@/src/hb-ot-color.cc \
+	@HARFBUZZ_TREE@/src/hb-ot-hdmx-table.hh \
 	@HARFBUZZ_TREE@/src/hb-ot-head-table.hh \
 	@HARFBUZZ_TREE@/src/hb-ot-hhea-table.hh \
 	@HARFBUZZ_TREE@/src/hb-ot-hmtx-table.hh \
 	@HARFBUZZ_TREE@/src/hb-ot-kern-table.hh \
+	@HARFBUZZ_TREE@/src/hb-ot-layout-base-table.hh \
 	@HARFBUZZ_TREE@/src/hb-ot-maxp-table.hh \
 	@HARFBUZZ_TREE@/src/hb-ot-name-table.hh \
 	@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 \
 	@HARFBUZZ_TREE@/src/hb-ot-post-table.hh \
+	@HARFBUZZ_TREE@/src/hb-ot-shape-complex-khmer-private.hh \
+	@HARFBUZZ_TREE@/src/hb-ot-shape-complex-myanmar-private.hh \
 	@HARFBUZZ_TREE@/src/hb-ot-var-mvar-table.hh \
 	@HARFBUZZ_TREE@/src/hb-ot-tag.cc \
 	@HARFBUZZ_TREE@/src/hb-private.hh \
@@ -691,6 +713,14 @@
 	@HARFBUZZ_TREE@/src/hb-shaper-private.hh \
 	@HARFBUZZ_TREE@/src/hb-shaper.cc \
 	@HARFBUZZ_TREE@/src/hb-string-array.hh \
+	@HARFBUZZ_TREE@/src/hb-subset-glyf.cc \
+	@HARFBUZZ_TREE@/src/hb-subset-glyf.hh \
+	@HARFBUZZ_TREE@/src/hb-subset-input.cc \
+	@HARFBUZZ_TREE@/src/hb-subset-plan.cc \
+	@HARFBUZZ_TREE@/src/hb-subset-plan.hh \
+	@HARFBUZZ_TREE@/src/hb-subset-private.hh \
+	@HARFBUZZ_TREE@/src/hb-subset.cc \
+	@HARFBUZZ_TREE@/src/hb-subset.h \
 	@HARFBUZZ_TREE@/src/hb-unicode-private.hh \
 	@HARFBUZZ_TREE@/src/hb-unicode.cc \
 	@HARFBUZZ_TREE@/src/hb-utf-private.hh \
@@ -826,6 +856,18 @@
 @HARFBUZZ_TREE@/src/$(DEPDIR)/$(am__dirstamp):
 	@$(MKDIR_P) @HARFBUZZ_TREE@/src/$(DEPDIR)
 	@: > @HARFBUZZ_TREE@/src/$(DEPDIR)/$(am__dirstamp)
+ at HARFBUZZ_TREE@/src/dump-indic-data.$(OBJEXT):  \
+	@HARFBUZZ_TREE@/src/$(am__dirstamp) \
+	@HARFBUZZ_TREE@/src/$(DEPDIR)/$(am__dirstamp)
+ at HARFBUZZ_TREE@/src/dump-khmer-data.$(OBJEXT):  \
+	@HARFBUZZ_TREE@/src/$(am__dirstamp) \
+	@HARFBUZZ_TREE@/src/$(DEPDIR)/$(am__dirstamp)
+ at HARFBUZZ_TREE@/src/dump-myanmar-data.$(OBJEXT):  \
+	@HARFBUZZ_TREE@/src/$(am__dirstamp) \
+	@HARFBUZZ_TREE@/src/$(DEPDIR)/$(am__dirstamp)
+ at HARFBUZZ_TREE@/src/dump-use-data.$(OBJEXT):  \
+	@HARFBUZZ_TREE@/src/$(am__dirstamp) \
+	@HARFBUZZ_TREE@/src/$(DEPDIR)/$(am__dirstamp)
 @HARFBUZZ_TREE@/src/hb-blob.$(OBJEXT):  \
 	@HARFBUZZ_TREE@/src/$(am__dirstamp) \
 	@HARFBUZZ_TREE@/src/$(DEPDIR)/$(am__dirstamp)
@@ -847,6 +889,9 @@
 @HARFBUZZ_TREE@/src/hb-font.$(OBJEXT):  \
 	@HARFBUZZ_TREE@/src/$(am__dirstamp) \
 	@HARFBUZZ_TREE@/src/$(DEPDIR)/$(am__dirstamp)
+ at HARFBUZZ_TREE@/src/hb-ot-color.$(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)
@@ -862,6 +907,18 @@
 @HARFBUZZ_TREE@/src/hb-shaper.$(OBJEXT):  \
 	@HARFBUZZ_TREE@/src/$(am__dirstamp) \
 	@HARFBUZZ_TREE@/src/$(DEPDIR)/$(am__dirstamp)
+ at HARFBUZZ_TREE@/src/hb-subset-glyf.$(OBJEXT):  \
+	@HARFBUZZ_TREE@/src/$(am__dirstamp) \
+	@HARFBUZZ_TREE@/src/$(DEPDIR)/$(am__dirstamp)
+ at HARFBUZZ_TREE@/src/hb-subset-input.$(OBJEXT):  \
+	@HARFBUZZ_TREE@/src/$(am__dirstamp) \
+	@HARFBUZZ_TREE@/src/$(DEPDIR)/$(am__dirstamp)
+ at HARFBUZZ_TREE@/src/hb-subset-plan.$(OBJEXT):  \
+	@HARFBUZZ_TREE@/src/$(am__dirstamp) \
+	@HARFBUZZ_TREE@/src/$(DEPDIR)/$(am__dirstamp)
+ at HARFBUZZ_TREE@/src/hb-subset.$(OBJEXT):  \
+	@HARFBUZZ_TREE@/src/$(am__dirstamp) \
+	@HARFBUZZ_TREE@/src/$(DEPDIR)/$(am__dirstamp)
 @HARFBUZZ_TREE@/src/hb-unicode.$(OBJEXT):  \
 	@HARFBUZZ_TREE@/src/$(am__dirstamp) \
 	@HARFBUZZ_TREE@/src/$(DEPDIR)/$(am__dirstamp)
@@ -956,6 +1013,10 @@
 
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/hbtest-dummy.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/hbtest-hbtest.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote@@HARFBUZZ_TREE@/src/$(DEPDIR)/dump-indic-data.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote@@HARFBUZZ_TREE@/src/$(DEPDIR)/dump-khmer-data.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote@@HARFBUZZ_TREE@/src/$(DEPDIR)/dump-myanmar-data.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote@@HARFBUZZ_TREE@/src/$(DEPDIR)/dump-use-data.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-blob.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-buffer-serialize.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-buffer.Po at am__quote@
@@ -965,6 +1026,7 @@
 @AMDEP_TRUE@@am__include@ @am__quote@@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-font.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-graphite2.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-icu.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote@@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-color.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-font.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-layout.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-ot-map.Po at am__quote@
@@ -990,6 +1052,10 @@
 @AMDEP_TRUE@@am__include@ @am__quote@@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-shape-plan.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-shape.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-shaper.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote@@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-subset-glyf.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote@@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-subset-input.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote@@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-subset-plan.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote@@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-subset.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-unicode.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@@HARFBUZZ_TREE@/src/$(DEPDIR)/hb-warning.Po at am__quote@
 

Modified: trunk/Build/source/libs/harfbuzz/TLpatches/ChangeLog
===================================================================
--- trunk/Build/source/libs/harfbuzz/TLpatches/ChangeLog	2018-03-07 21:52:46 UTC (rev 46876)
+++ trunk/Build/source/libs/harfbuzz/TLpatches/ChangeLog	2018-03-07 22:32:14 UTC (rev 46877)
@@ -1,3 +1,8 @@
+2018-03-07  Akira Kakuto  <kakuto at fuk.kindai.ac.jp>
+
+	Imported harfbuzz-1.7.6 source tree from:
+	  http://www.freedesktop.org/software/harfbuzz/release/
+
 2018-01-31  Akira Kakuto  <kakuto at fuk.kindai.ac.jp>
 
 	Imported harfbuzz-1.7.5 source tree from:

Modified: trunk/Build/source/libs/harfbuzz/TLpatches/TL-Changes
===================================================================
--- trunk/Build/source/libs/harfbuzz/TLpatches/TL-Changes	2018-03-07 21:52:46 UTC (rev 46876)
+++ trunk/Build/source/libs/harfbuzz/TLpatches/TL-Changes	2018-03-07 22:32:14 UTC (rev 46877)
@@ -1,4 +1,4 @@
-Changes applied to the harfbuzz-1.7.5/ tree as obtained from:
+Changes applied to the harfbuzz-1.7.6/ 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-03-07 21:52:46 UTC (rev 46876)
+++ trunk/Build/source/libs/harfbuzz/configure	2018-03-07 22:32:14 UTC (rev 46877)
@@ -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) 1.7.5.
+# Generated by GNU Autoconf 2.69 for harfbuzz (TeX Live) 1.7.6.
 #
 # 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='1.7.5'
-PACKAGE_STRING='harfbuzz (TeX Live) 1.7.5'
+PACKAGE_VERSION='1.7.6'
+PACKAGE_STRING='harfbuzz (TeX Live) 1.7.6'
 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) 1.7.5 to adapt to many kinds of systems.
+\`configure' configures harfbuzz (TeX Live) 1.7.6 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) 1.7.5:";;
+     short | recursive ) echo "Configuration of harfbuzz (TeX Live) 1.7.6:";;
    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 1.7.5
+harfbuzz (TeX Live) configure 1.7.6
 generated by GNU Autoconf 2.69
 
 Copyright (C) 2012 Free Software Foundation, Inc.
@@ -2085,7 +2085,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 1.7.5, which was
+It was created by harfbuzz (TeX Live) $as_me 1.7.6, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   $ $0 $@
@@ -4008,7 +4008,7 @@
 
 # Define the identity of the package.
  PACKAGE='harfbuzz--tex-live-'
- VERSION='1.7.5'
+ VERSION='1.7.6'
 
 
 # Some tools Automake needs.
@@ -4202,8 +4202,8 @@
 
 HB_VERSION_MAJOR=1
 HB_VERSION_MINOR=7
-HB_VERSION_MICRO=5
-HB_VERSION=1.7.5
+HB_VERSION_MICRO=6
+HB_VERSION=1.7.6
 
 ac_ext=c
 ac_cpp='$CPP $CPPFLAGS'
@@ -8065,7 +8065,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 1.7.5, which was
+This file was extended by harfbuzz (TeX Live) $as_me 1.7.6, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -8131,7 +8131,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 1.7.5
+harfbuzz (TeX Live) config.status 1.7.6
 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-03-07 21:52:46 UTC (rev 46876)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/CMakeLists.txt	2018-03-07 22:32:14 UTC (rev 46877)
@@ -91,6 +91,7 @@
 add_definitions(-DHAVE_FALLBACK)
 
 
+## Functions and headers
 include (CheckFunctionExists)
 include (CheckIncludeFile)
 macro (check_funcs) # Similar to AC_CHECK_FUNCS of autotools
@@ -102,16 +103,15 @@
     endif ()
   endforeach ()
 endmacro ()
-check_funcs(atexit mprotect sysconf mmap strtod_l) #TODO: getpagesize newlocale isatty
-
-check_include_file(unistd.h HAVE_UNIST_H)
-if (${HAVE_UNIST_H})
-  add_definitions(-DHAVE_UNIST_H)
+check_funcs(atexit mprotect sysconf getpagesize mmap isatty newlocale strtod_l)
+check_include_file(unistd.h HAVE_UNISTD_H)
+if (${HAVE_UNISTD_H})
+  add_definitions(-DHAVE_UNISTD_H)
 endif ()
-#check_include_file(sys/mman.h HAVE_SYS_MMAN_H)
-#if (${HAVE_SYS_MMAN_H})
-#  add_definitions(-DHAVE_SYS_MMAN_H)
-#endif ()
+check_include_file(sys/mman.h HAVE_SYS_MMAN_H)
+if (${HAVE_SYS_MMAN_H})
+  add_definitions(-DHAVE_SYS_MMAN_H)
+endif ()
 check_include_file(xlocale.h HAVE_XLOCALE_H)
 if (${HAVE_XLOCALE_H})
   add_definitions(-DHAVE_XLOCALE_H)
@@ -132,12 +132,11 @@
 
 
 ## Detect if we are running inside a distribution or regular repository folder
-set (IN_HB_DIST FALSE)
-if (EXISTS "${PROJECT_SOURCE_DIR}/ChangeLog")
-  # perhaps we are on dist directory
-  set (IN_HB_DIST TRUE)
-  set (HB_VERSION_H "${PROJECT_SOURCE_DIR}/src/hb-version.h")
-endif ()
+# if (EXISTS "${PROJECT_SOURCE_DIR}/ChangeLog")
+#   # perhaps we are on dist directory
+#   set (IN_HB_DIST TRUE)
+#   #set (HB_VERSION_H "${PROJECT_SOURCE_DIR}/src/hb-version.h")
+# endif ()
 
 
 ## Extract variables from Makefile files
@@ -171,20 +170,28 @@
 extract_make_variable(HB_OT_headers ${SRCSOURCES})
 add_prefix_to_list(HB_OT_headers "${PROJECT_SOURCE_DIR}/src/")
 
+extract_make_variable(HB_SUBSET_sources ${SRCSOURCES})
+add_prefix_to_list(HB_SUBSET_sources "${PROJECT_SOURCE_DIR}/src/")
+
+extract_make_variable(HB_SUBSET_headers ${SRCSOURCES})
+add_prefix_to_list(HB_SUBSET_headers "${PROJECT_SOURCE_DIR}/src/")
+
 extract_make_variable(HB_BASE_RAGEL_GENERATED_sources ${SRCSOURCES})
 extract_make_variable(HB_OT_RAGEL_GENERATED_sources ${SRCSOURCES})
-if (IN_HB_DIST)
+#if (IN_HB_DIST)
   add_prefix_to_list(HB_BASE_RAGEL_GENERATED_sources "${PROJECT_SOURCE_DIR}/src/")
   add_prefix_to_list(HB_OT_RAGEL_GENERATED_sources "${PROJECT_SOURCE_DIR}/src/")
-else ()
-  add_prefix_to_list(HB_BASE_RAGEL_GENERATED_sources "${PROJECT_BINARY_DIR}/src/")
-  add_prefix_to_list(HB_OT_RAGEL_GENERATED_sources "${PROJECT_BINARY_DIR}/src/")
-endif ()
+#else ()
+#  add_prefix_to_list(HB_BASE_RAGEL_GENERATED_sources "${PROJECT_BINARY_DIR}/src/")
+#  add_prefix_to_list(HB_OT_RAGEL_GENERATED_sources "${PROJECT_BINARY_DIR}/src/")
+#endif ()
 
 extract_make_variable(HB_VIEW_sources ${UTILSOURCES})
 add_prefix_to_list(HB_VIEW_sources "${PROJECT_SOURCE_DIR}/util/")
 extract_make_variable(HB_SHAPE_sources ${UTILSOURCES})
 add_prefix_to_list(HB_SHAPE_sources "${PROJECT_SOURCE_DIR}/util/")
+extract_make_variable(HB_SUBSET_CLI_sources ${UTILSOURCES})
+add_prefix_to_list(HB_SUBSET_CLI_sources "${PROJECT_SOURCE_DIR}/util/")
 extract_make_variable(HB_OT_SHAPE_CLOSURE_sources ${UTILSOURCES})
 add_prefix_to_list(HB_OT_SHAPE_CLOSURE_sources "${PROJECT_SOURCE_DIR}/util/")
 
@@ -201,41 +208,33 @@
 
 
 ## Define ragel tasks
-if (NOT IN_HB_DIST)
-  find_program(RAGEL "ragel" CMAKE_FIND_ROOT_PATH_BOTH)
+# if (NOT IN_HB_DIST)
+#  foreach (ragel_output IN ITEMS ${HB_BASE_RAGEL_GENERATED_sources} ${HB_OT_RAGEL_GENERATED_sources})
+#    string(REGEX MATCH "([^/]+)\\.hh" temp ${ragel_output})
+#    set (target_name ${CMAKE_MATCH_1})
+#    add_custom_command(OUTPUT ${ragel_output}
+#      COMMAND ${RAGEL} -G2 -o ${ragel_output} ${PROJECT_SOURCE_DIR}/src/${target_name}.rl -I ${PROJECT_SOURCE_DIR} ${ARGN}
+#      DEPENDS ${PROJECT_SOURCE_DIR}/src/${target_name}.rl
+#    )
+#    add_custom_target(harfbuzz_${target_name} DEPENDS ${PROJECT_BINARY_DIR}/src/${target_name})
+#  endforeach ()
 
-  if (RAGEL)
-    message(STATUS "ragel found at: ${RAGEL}")
-  else ()
-    message(FATAL_ERROR "ragel not found, get it here -- http://www.complang.org/ragel/ or, use harfbuzz releases https://github.com/harfbuzz/harfbuzz/releases")
-  endif ()
+#  mark_as_advanced(RAGEL)
+# endif ()
 
-  foreach (ragel_output IN ITEMS ${HB_BASE_RAGEL_GENERATED_sources} ${HB_OT_RAGEL_GENERATED_sources})
-    string(REGEX MATCH "([^/]+)\\.hh" temp ${ragel_output})
-    set (target_name ${CMAKE_MATCH_1})
-    add_custom_command(OUTPUT ${ragel_output}
-      COMMAND ${RAGEL} -G2 -o ${ragel_output} ${PROJECT_SOURCE_DIR}/src/${target_name}.rl -I ${PROJECT_SOURCE_DIR} ${ARGN}
-      DEPENDS ${PROJECT_SOURCE_DIR}/src/${target_name}.rl
-    )
-    add_custom_target(harfbuzz_${target_name} DEPENDS ${PROJECT_BINARY_DIR}/src/${target_name})
-  endforeach ()
 
-  mark_as_advanced(RAGEL)
-endif ()
-
-
 ## Generate hb-version.h
-if (NOT IN_HB_DIST)
-  set (HB_VERSION_H_IN "${PROJECT_SOURCE_DIR}/src/hb-version.h.in")
-  set (HB_VERSION_H "${PROJECT_BINARY_DIR}/src/hb-version.h")
-  set_source_files_properties("${HB_VERSION_H}" PROPERTIES GENERATED true)
-  configure_file("${HB_VERSION_H_IN}" "${HB_VERSION_H}.tmp" @ONLY)
-  execute_process(COMMAND "${CMAKE_COMMAND}" -E copy_if_different
-    "${HB_VERSION_H}.tmp"
-    "${HB_VERSION_H}"
-  )
-  file(REMOVE "${HB_VERSION_H}.tmp")
-endif ()
+# if (NOT IN_HB_DIST)
+#  set (HB_VERSION_H_IN "${PROJECT_SOURCE_DIR}/src/hb-version.h.in")
+#  set (HB_VERSION_H "${PROJECT_BINARY_DIR}/src/hb-version.h")
+#  set_source_files_properties("${HB_VERSION_H}" PROPERTIES GENERATED true)
+#  configure_file("${HB_VERSION_H_IN}" "${HB_VERSION_H}.tmp" @ONLY)
+#  execute_process(COMMAND "${CMAKE_COMMAND}" -E copy_if_different
+#    "${HB_VERSION_H}.tmp"
+#    "${HB_VERSION_H}"
+#  )
+#  file(REMOVE "${HB_VERSION_H}.tmp")
+# endif ()
 
 
 ## Define sources and headers of the project
@@ -248,16 +247,24 @@
   ${HB_OT_RAGEL_GENERATED_sources}
 )
 
+set (subset_project_sources
+  ${HB_SUBSET_sources}
+)
+
 set (project_extra_sources)
 
 set (project_headers
-  ${HB_VERSION_H}
+  #${HB_VERSION_H}
 
   ${HB_BASE_headers}
   ${HB_OT_headers}
 )
 
+set (subset_project_headers
+  ${HB_SUBSET_headers}
+)
 
+
 ## Find and include needed header folders and libraries
 if (HB_HAVE_FREETYPE)
   include (FindFreetype)
@@ -519,25 +526,28 @@
 add_library(harfbuzz ${project_sources} ${project_extra_sources} ${project_headers})
 target_link_libraries(harfbuzz ${THIRD_PARTY_LIBS})
 
+## Define harfbuzz-subset library
+add_library(harfbuzz-subset ${subset_project_sources} ${subset_project_headers})
+add_dependencies(harfbuzz-subset harfbuzz)
+target_link_libraries(harfbuzz-subset harfbuzz ${THIRD_PARTY_LIBS})
+
 if (UNIX OR MINGW)
   # Make symbols link locally
   link_libraries(-Bsymbolic-functions)
 
-  # Make sure we don't link to libstdc++
   if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang" OR CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
+    # Make sure we don't link to libstdc++
     set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-rtti -fno-exceptions")
     set (CMAKE_CXX_IMPLICIT_LINK_LIBRARIES "m") # libm
     set (CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES "")
     set_target_properties(harfbuzz PROPERTIES LINKER_LANGUAGE C)
-  endif ()
+    set_target_properties(harfbuzz-subset PROPERTIES LINKER_LANGUAGE C)
 
-  # No threadsafe statics as we do it ourselves
-  if (BUILD_SHARED_LIBS)
+    # No threadsafe statics as we do it ourselves
     set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-threadsafe-statics")
   endif ()
 endif ()
 
-
 ## Define harfbuzz-gobject library
 if (HB_HAVE_GOBJECT)
   add_library(harfbuzz-gobject
@@ -708,6 +718,9 @@
   add_executable(hb-shape ${HB_SHAPE_sources})
   target_link_libraries(hb-shape harfbuzz)
 
+  add_executable(hb-subset ${HB_SUBSET_CLI_sources})
+  target_link_libraries(hb-subset harfbuzz harfbuzz-subset)
+
   add_executable(hb-ot-shape-closure ${HB_OT_SHAPE_CLOSURE_sources})
   target_link_libraries(hb-ot-shape-closure harfbuzz)
 
@@ -785,7 +798,7 @@
 
 
 ## src/ executables
-foreach (prog main test test-would-substitute test-size-params test-buffer-serialize hb-ot-tag)
+foreach (prog main test test-would-substitute test-size-params test-buffer-serialize hb-ot-tag test-unicode-ranges)
   set (prog_name ${prog})
   if (${prog_name} STREQUAL "test")
     # test can not be used as a valid executable name on cmake, lets special case it
@@ -796,7 +809,6 @@
 endforeach ()
 set_target_properties(hb-ot-tag PROPERTIES COMPILE_FLAGS "-DMAIN")
 
-
 ## Tests
 if (UNIX OR MINGW)
   if (BUILD_SHARED_LIBS)
@@ -812,10 +824,12 @@
     )
     add_test(NAME check-libstdc++.sh COMMAND ${PROJECT_SOURCE_DIR}/src/check-libstdc++.sh)
     add_test(NAME check-symbols.sh COMMAND ${PROJECT_SOURCE_DIR}/src/check-symbols.sh)
-    add_test(NAME check-defs.sh COMMAND ${PROJECT_SOURCE_DIR}/src/check-defs.sh)
 
-    set_tests_properties(check-static-inits.sh check-libstdc++.sh check-symbols.sh check-defs.sh
-      PROPERTIES ENVIRONMENT "libs=.;srcdir=${PROJECT_SOURCE_DIR}/src")
+    set_tests_properties(
+      check-static-inits.sh check-libstdc++.sh check-symbols.sh
+      PROPERTIES
+        ENVIRONMENT "libs=.;srcdir=${PROJECT_SOURCE_DIR}/src"
+        SKIP_RETURN_CODE 77)
   endif ()
 
   add_test(NAME check-c-linkage-decls.sh COMMAND ./check-c-linkage-decls.sh)
@@ -824,7 +838,9 @@
   add_test(NAME check-includes.sh COMMAND ./check-includes.sh)
   set_tests_properties(
     check-c-linkage-decls.sh check-header-guards.sh check-externs.sh check-includes.sh
-    PROPERTIES WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}/src)
+    PROPERTIES
+      WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}/src
+      SKIP_RETURN_CODE 77)
 endif ()
 
 # Needs to come last so that variables defined above are passed to

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/ChangeLog
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/ChangeLog	2018-03-07 21:52:46 UTC (rev 46876)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/ChangeLog	2018-03-07 22:32:14 UTC (rev 46877)
@@ -1,3 +1,5356 @@
+commit ac2ece3e153167224c85cc384e2826ea9711a8b5
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Wed Mar 7 15:52:42 2018 +0100
+
+    [ot] Comment out AAT include
+
+ src/hb-ot-shape.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 23a9ac993862b4a9032d38e80491a769b7ee86da
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Wed Mar 7 15:51:42 2018 +0100
+
+    Remove hb-ot-color.h
+
+    So I can make a release.
+
+ src/Makefile.sources          |  1 -
+ src/hb-ot-color-cpal-table.hh | 48 +++++++++++++++++++++++++
+ src/hb-ot-color.h             | 81
+ -------------------------------------------
+ src/hb-ot.h                   |  1 -
+ 4 files changed, 48 insertions(+), 83 deletions(-)
+
+commit 790a11700773dd664e4d5edac63c404c5ebce080
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Wed Mar 7 15:31:15 2018 +0100
+
+    [ot] Remove hb-ot-base.h
+
+    BASE table API will go into hb-ot-layout.h.
+
+ src/Makefile.sources           |  1 -
+ src/hb-ot-base.h               | 56
+ ------------------------------------------
+ src/hb-ot-layout-base-table.hh |  1 -
+ src/hb-ot-layout.h             | 16 ++++++++++++
+ src/hb-ot.h                    |  1 -
+ 5 files changed, 16 insertions(+), 59 deletions(-)
+
+commit f014a124f582215fa96afc28b534a1ca0bf17167
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Wed Mar 7 10:49:26 2018 +0100
+
+    [set] Fix algebra
+
+    Was totally b0rked. Ouch!
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/863
+
+ src/hb-set-private.hh | 20 +++++++++++++++++---
+ 1 file changed, 17 insertions(+), 3 deletions(-)
+
+commit 7587683cdce8ee9b7f07bae82aa1bb163e79ab92
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Wed Mar 7 09:55:22 2018 +0100
+
+    [set] Minor
+
+    In preparation to fix https://github.com/harfbuzz/harfbuzz/issues/863
+
+    Binary operations are sets are completely broken. Ouch.
+
+ src/hb-set-private.hh | 21 ++++++++++++++-------
+ 1 file changed, 14 insertions(+), 7 deletions(-)
+
+commit e4cbb87bd3512c3a6e97ea3923ecd1b26b0a1251
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Wed Mar 7 09:37:22 2018 +0100
+
+    Minor
+
+ src/hb-ot-color-colr-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit c6150333c29b458ed34858f24e94acc0f771aa0b
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Wed Mar 7 09:27:16 2018 +0100
+
+    Sign
+
+ src/test-unicode-ranges.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 9a6f9b4d4284f0378a71a181fe216d97c913669e
+Author: Garret Rieger <grieger at google.com>
+Date:   Tue Mar 6 13:46:51 2018 -0800
+
+    [set] add a test demonstrating a bug in hb_set_union.
+
+ test/api/test-set.c | 10 ++++++++++
+ 1 file changed, 10 insertions(+)
+
+commit 9b4a5d7ef1ec068042e3c793845a4dbc3308d4b7
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Wed Mar 7 00:23:40 2018 +0330
+
+    [ci] Enable -Werror=unused (#862)
+
+ .travis.yml             | 4 ++--
+ src/hb-ot-glyf-table.hh | 1 -
+ 2 files changed, 2 insertions(+), 3 deletions(-)
+
+commit 54cbe6702c1e4c934c60512367abaf801294c1bb
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Tue Mar 6 16:41:08 2018 +0330
+
+    [ot-color] Further improvements on COLR/CPAL implementation (#859)
+
+    * Implemented a bsearch on get_base_glyph_record
+    * Made get_color_record_argb actually work
+
+ src/hb-ot-color-colr-table.hh | 35 ++++++++++++++-----------
+ src/hb-ot-color-cpal-table.hh | 59
+ +++++++++++++++----------------------------
+ src/hb-ot-color.h             | 12 ++-------
+ 3 files changed, 42 insertions(+), 64 deletions(-)
+
+commit 18d14b8e0d5d28106800ebf835ff3155a4f4de7c
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Mon Mar 5 14:25:11 2018 +0330
+
+    [dev-run] an option to open using a GUI app
+
+ src/dev-run.sh | 22 ++++++++++++++++++----
+ 1 file changed, 18 insertions(+), 4 deletions(-)
+
+commit 1db83954948dfae3f75f61c535c5de1b3a843a69
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Mon Mar 5 13:02:50 2018 +0330
+
+    [ci] minor, bring back the removed assertion
+
+ .ci/run-coveralls.sh | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 5895fe3d4d0441dacf8989740cf4150193397796
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Mon Mar 5 12:58:34 2018 +0330
+
+    [ci] minor
+
+ .ci/trigger-coverity.sh | 6 ++----
+ 1 file changed, 2 insertions(+), 4 deletions(-)
+
+commit a3e29fd38f01b26b6306f9f7142a54cc7d6c6080
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Sun Mar 4 02:56:27 2018 +0330
+
+    [aat/kerx] Add a TODO
+
+ src/hb-aat-layout-kerx-table.hh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 0ef6ab25ab4456e387711ae246900486ad738d26
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Sun Mar 4 02:47:26 2018 +0330
+
+    [ot-color] Move cbdt to the namespace (#860)
+
+ src/Makefile.sources                                   | 2 +-
+ src/{hb-ot-cbdt-table.hh => hb-ot-color-cbdt-table.hh} | 6 +++---
+ src/hb-ot-font.cc                                      | 3 ++-
+ 3 files changed, 6 insertions(+), 5 deletions(-)
+
+commit 6659cb56fae0c900ae88e95bedcb3b76234c8838
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Sun Mar 4 02:31:53 2018 +0330
+
+    [ci] Remove --coverage as use of --enable-code-coverage
+
+ .travis.yml | 5 ++---
+ 1 file changed, 2 insertions(+), 3 deletions(-)
+
+commit 00dd321ace75ff0d1824cf75cd41490c5dd6ad76
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Sat Mar 3 23:26:11 2018 +0330
+
+    [ci] Don't run coveralls on freetype folder
+
+ .travis.yml | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit f50aedd371f1a6894d1bf7732f017b51cbdd59bd
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Sat Mar 3 23:17:36 2018 +0330
+
+    [ci] Remove failing check on run-coveralls
+
+ .ci/run-coveralls.sh | 2 --
+ 1 file changed, 2 deletions(-)
+
+commit a0031c120e3ac5c059b81a004b9386fab3d662fc
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Sat Mar 3 23:09:25 2018 +0330
+
+    Add lcov tool for coverage tests
+
+ .travis.yml | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit ecef95b21264347f9505e3ed4fb25ec7e4ccca5d
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Sat Mar 3 23:03:13 2018 +0330
+
+    [ci] Enable code coverage on Travis Linux builds
+
+ .travis.yml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit f7399796a1ed36cfc4f1ef7631584569baa80981
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Sat Mar 3 22:55:09 2018 +0330
+
+    Enable coverage test on autotools (#857)
+
+ configure.ac           |   1 +
+ m4/ax_code_coverage.m4 | 264
+ +++++++++++++++++++++++++++++++++++++++++++++++++
+ src/Makefile.am        |   6 +-
+ 3 files changed, 269 insertions(+), 2 deletions(-)
+
+commit c446c23f0f09e541891b49184febdfc75cb3505f
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Sat Mar 3 22:43:23 2018 +0330
+
+    [ot-color] Move the related tables to hb-ot-color-* (#858)
+
+ src/Makefile.sources                                   | 4 ++--
+ src/{hb-ot-colr-table.hh => hb-ot-color-colr-table.hh} | 6 +++---
+ src/{hb-ot-cpal-table.hh => hb-ot-color-cpal-table.hh} | 6 +++---
+ src/hb-ot-color.cc                                     | 4 ++--
+ src/hb-ot-layout.cc                                    | 4 ++--
+ 5 files changed, 12 insertions(+), 12 deletions(-)
+
+commit 48ed15a2bcdc1999e2d39fdcb2644ba4c3beccfe
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Sat Mar 3 22:00:29 2018 +0330
+
+    [COLR/CPAL] Provide enough helper for rasterization (#855)
+
+ src/hb-ot-colr-table.hh | 47
+ ++++++++++++++++++++++++++++++++++++++++++++---
+ src/hb-ot-cpal-table.hh | 18 +++++++++++++++---
+ 2 files changed, 59 insertions(+), 6 deletions(-)
+
+commit 432758a7ac3c1a857e67069f157efbf4ebf5521b
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Sat Mar 3 01:05:59 2018 +0330
+
+    [COLR] Revert previous sanitization on the table
+
+    That sanitization wasn't right, firstLayerIndex is an index from
+    beginning of the Layer Records
+    not the table itself.
+
+ src/hb-ot-colr-table.hh | 23 ++++++-----------------
+ 1 file changed, 6 insertions(+), 17 deletions(-)
+
+commit 71b4598ea37b316571bae22ced2f1b38185c9f44
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Fri Mar 2 11:04:09 2018 +0330
+
+    [aat/kerx] Improve format 6 subtable
+
+ src/hb-aat-layout-kerx-table.hh | 14 +++++++++-----
+ 1 file changed, 9 insertions(+), 5 deletions(-)
+
+commit b73a5a1c240478616827529c94f0133018f9f790
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Fri Mar 2 00:07:26 2018 +0330
+
+    [aat/kerx] Make parsing of the table actually work (#850)
+
+ src/hb-aat-layout-kerx-table.hh | 298
+ +++++++++++++++++-----------------------
+ 1 file changed, 124 insertions(+), 174 deletions(-)
+
+commit a570edcde2f89e59b5ccd4867a8c0eed084bf35d
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Fri Mar 2 00:06:03 2018 +0330
+
+    [COLR] Sanitize BaseGlyphRecord (#854)
+
+ src/hb-ot-colr-table.hh | 27 ++++++++++++++++++---------
+ 1 file changed, 18 insertions(+), 9 deletions(-)
+
+commit 7e958646a4a825bfe3aac56ddb96100d68c5592c
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Thu Mar 1 10:27:18 2018 +0330
+
+    [CPAL] Fix version checking logic on sanitizer (#851)
+
+ src/hb-ot-cpal-table.hh | 14 ++++++--------
+ 1 file changed, 6 insertions(+), 8 deletions(-)
+
+commit bcf578fefe6d7af0a962329ceb9989ce61ec467d
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Wed Feb 28 16:31:46 2018 -0800
+
+    [test] Add test suite for Brahmi Number Joiners
+
+    https://github.com/harfbuzz/harfbuzz/pull/660
+
+ .../fonts/1ed7e9064f008f62de6ff0207bb4dd29409597a5.ttf   | Bin 0 ->
+ 2768 bytes
+ test/shaping/data/in-house/tests/use-syllable.tests      |   1 +
+ test/shaping/record-test.sh                              |   2 +-
+ 3 files changed, 2 insertions(+), 1 deletion(-)
+
+commit b4ba71ea7ccce70e24138373774741c7f03dd24e
+Author: Garret Rieger <grieger at google.com>
+Date:   Wed Feb 28 15:44:00 2018 -0800
+
+    [subset] In subset integration test pass output through ots-sanitize
+    if present.
+
+ test/subset/run-tests.py | 25 +++++++++++++++++++++++--
+ 1 file changed, 23 insertions(+), 2 deletions(-)
+
+commit 588a4e0f9b2d71362503a274de7200f3eb4367f7
+Merge: 55a4dfa3 b3f1a045
+Author: rsheeter <rsheeter at google.com>
+Date:   Wed Feb 28 13:52:29 2018 -0800
+
+    Merge pull request #845 from googlefonts/drophints
+
+    [subset] drop hints from composites
+
+commit b3f1a045a8b86747afce6bc154f2a166ea678efb
+Author: Rod Sheeter <rsheeter at google.com>
+Date:   Wed Feb 28 11:41:24 2018 -0800
+
+    [subset] kick the build
+
+ src/hb-subset-glyf.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 20d57399235b410d2bdc98103c8bb3dfd1c34176
+Author: Rod Sheeter <rsheeter at google.com>
+Date:   Wed Feb 28 11:15:08 2018 -0800
+
+    [subset] extract a method to flip off composite instruction flag
+
+ src/hb-subset-glyf.cc | 24 +++++++++++++++---------
+ 1 file changed, 15 insertions(+), 9 deletions(-)
+
+commit 55a4dfa374bae1db846c3b848b7e59fb0014b627
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Wed Feb 28 15:43:23 2018 +0330
+
+    Use old project location of coverity
+
+    https://github.com/harfbuzz/harfbuzz/commit/8089711a61687d565f207c56d3d2b658f514d7ab#commitcomment-27835452
+
+ .travis.yml | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 3821978bcd92cbdb607111452796e051c456f391
+Merge: 77227462 f671f7f0
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Wed Feb 28 13:30:17 2018 +0330
+
+    Merge pull request #847 from ebraminio/colr
+
+    [colr] Implement
+
+commit f671f7f0a8caa7b5763e00146e1ec4b9a7258227
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Wed Feb 28 13:19:40 2018 +0330
+
+    [colr] Implement
+
+ src/Makefile.sources        |  1 +
+ src/hb-ot-color.cc          |  9 +++++
+ src/hb-ot-color.h           |  9 -----
+ src/hb-ot-colr-table.hh     | 98
+ +++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-ot-cpal-table.hh     |  6 +--
+ src/hb-ot-layout-private.hh |  6 ++-
+ src/hb-ot-layout.cc         | 11 +++--
+ 7 files changed, 122 insertions(+), 18 deletions(-)
+
+commit 772274625e9f17d726f2a1da8192ec3ec24793a3
+Merge: 0eec3315 5b9c2340
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Wed Feb 28 12:05:49 2018 +0330
+
+    Merge pull request #841 from ebraminio/color
+
+    Support CPAL table
+
+commit 0eec33154a418fba97a08be7169b59e748b7e785
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Wed Feb 28 11:53:39 2018 +0330
+
+    [cmake] cleanup (#846)
+
+ CMakeLists.txt          | 70
+ ++++++++++++++++++++-----------------------------
+ test/api/CMakeLists.txt |  2 +-
+ 2 files changed, 30 insertions(+), 42 deletions(-)
+
+commit 5b9c234043d0483e53e9da5fe4afd7743190b538
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Tue Feb 27 22:56:17 2018 +0330
+
+    [CPAL] Refactor and address the reviews
+
+ NEWS                                               |   3 +-
+ src/Makefile.am                                    |   1 -
+ src/hb-ot-color.cc                                 |  70 +++----------
+ src/hb-ot-color.h                                  |  31 +++---
+ src/hb-ot-cpal-table.hh                            | 116
+ +++++++++++++++------
+ src/hb-ot-layout-private.hh                        |   3 +-
+ src/hb-ot-layout.cc                                |   5 +-
+ test/api/hb-test.h                                 |   2 +
+ test/api/test-ot-color.c                           |  39 +++----
+ .../319f5d7ebffbefc5c5e6569f8cea73444d7a7268.ttf   | Bin
+ .../e90374e5e439e00725b4fe7a8d73db57c5a97f82.ttf   | Bin
+ 11 files changed, 141 insertions(+), 129 deletions(-)
+
+commit 6836a821428b714b9f2e95d5c4ebbd73867d9a53
+Author: Rod Sheeter <rsheeter at google.com>
+Date:   Tue Feb 27 20:51:12 2018 -0800
+
+    [subset] remove WE_HAVE_INSTRUCTIONS from composites when dropping
+    hints
+
+ src/hb-subset-glyf.cc | 12 +++++++++++-
+ 1 file changed, 11 insertions(+), 1 deletion(-)
+
+commit ffcb5cbf71b312cdd4606a3285e10e201ff5bccd
+Author: Rod Sheeter <rsheeter at google.com>
+Date:   Tue Feb 27 20:17:04 2018 -0800
+
+    [subset] update the test file for composite, fix an offset calculation
+
+ src/hb-ot-glyf-table.hh                                  |   2 +-
+ test/api/fonts/Roboto-Regular.components.1fc.nohints.ttf | Bin 0 ->
+ 932 bytes
+ test/api/test-subset-glyf.c                              |   5 ++---
+ 3 files changed, 3 insertions(+), 4 deletions(-)
+
+commit c8b230e4377bc8e80d37835a229511ce0e30cc47
+Merge: b3790a65 904dd7be
+Author: Rod Sheeter <rsheeter at google.com>
+Date:   Tue Feb 27 17:25:32 2018 -0800
+
+    Merge branch 'expand-tests' of github.com:googlefonts/harfbuzz
+    into drophints
+
+commit 904dd7beea756fd7429fad36f5c37321aedb4e81
+Author: Garret Rieger <grieger at google.com>
+Date:   Tue Feb 27 14:33:36 2018 -0800
+
+    [subset] Add drop hinting profile to full-font.tests
+
+ .../Roboto-Regular.drop-hints.1FC,21,41,20,62,63.ttf     | Bin 0 ->
+ 2152 bytes
+ .../full-font/Roboto-Regular.drop-hints.61,62,63.ttf     | Bin 0 ->
+ 1968 bytes
+ test/subset/data/tests/full-font.tests                   |   1 +
+ 3 files changed, 1 insertion(+)
+
+commit 70a1049b3f8dc241fcb9b524bd010f0c1606f6ad
+Author: Garret Rieger <grieger at google.com>
+Date:   Tue Feb 27 14:28:50 2018 -0800
+
+    [subset] Add a drop hints profile to basics.tests
+
+ .../basics/Roboto-Regular.abc.drop-hints.61,62,63.ttf     | Bin 0 ->
+ 876 bytes
+ .../basics/Roboto-Regular.abc.drop-hints.61,63.ttf        | Bin 0 ->
+ 792 bytes
+ .../expected/basics/Roboto-Regular.abc.drop-hints.61.ttf  | Bin 0 ->
+ 684 bytes
+ .../expected/basics/Roboto-Regular.abc.drop-hints.62.ttf  | Bin 0 ->
+ 652 bytes
+ .../expected/basics/Roboto-Regular.abc.drop-hints.63.ttf  | Bin 0 ->
+ 656 bytes
+ test/subset/data/profiles/drop-hints.txt                  |   1 +
+ test/subset/data/tests/basics.tests                       |   1 +
+ 7 files changed, 2 insertions(+)
+
+commit 5241d7f4b999d5457de564bd950b60d70f9d0e19
+Author: Garret Rieger <grieger at google.com>
+Date:   Tue Feb 27 13:15:40 2018 -0800
+
+    [subset] apply subset profiles (flags) to the subset integration
+    tests.
+
+ test/subset/generate-expected-outputs.py | 27 ++++++++++++++-------------
+ test/subset/run-tests.py                 |  3 ++-
+ test/subset/subset_test_suite.py         | 11 ++++++++---
+ 3 files changed, 24 insertions(+), 17 deletions(-)
+
+commit a4aca190a93f94c25c906ec0269183d8b2d0b5e8
+Author: Garret Rieger <grieger at google.com>
+Date:   Tue Feb 27 11:36:16 2018 -0800
+
+    [subset] add expected/full-font to dist files.
+
+ test/subset/data/Makefile.am | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit d31ace32740b1777ebb023ffdb10cd0cfec3997e
+Author: Garret Rieger <grieger at google.com>
+Date:   Mon Feb 26 18:51:56 2018 -0800
+
+    [subset] Add subset integration tests using the full roboto font.
+
+ test/subset/data/Makefile.sources                      |   1 +
+ .../Roboto-Regular.default.1FC,21,41,20,62,63.ttf      | Bin 0 ->
+ 3700 bytes
+ .../full-font/Roboto-Regular.default.61,62,63.ttf      | Bin 0 ->
+ 3320 bytes
+ test/subset/data/fonts/Roboto-Regular.ttf              | Bin 0 ->
+ 171676 bytes
+ test/subset/data/tests/full-font.tests                 |  10 ++++++++++
+ test/subset/generate-expected-outputs.py               |  12 ++++++++----
+ 6 files changed, 19 insertions(+), 4 deletions(-)
+
+commit 33f4381314c5248b8b112e344af7548806f93a82
+Author: Garret Rieger <grieger at google.com>
+Date:   Mon Feb 26 18:39:09 2018 -0800
+
+    [subset] Add some more variations of the basic test.
+
+ .../basics/Roboto-Regular.abc.default.61,62,63.ttf       | Bin 0 ->
+ 2120 bytes
+ .../expected/basics/Roboto-Regular.abc.default.61,63.ttf | Bin 0 ->
+ 1932 bytes
+ .../expected/basics/Roboto-Regular.abc.default.61.ttf    | Bin 0 ->
+ 1744 bytes
+ .../expected/basics/Roboto-Regular.abc.default.63.ttf    | Bin 0 ->
+ 1668 bytes
+ test/subset/data/tests/basics.tests                      |   4 ++++
+ 5 files changed, 4 insertions(+)
+
+commit b3790a65a18e8402b2b09dfc24aaea40a51de569
+Author: Rod Sheeter <rsheeter at google.com>
+Date:   Tue Feb 27 17:23:30 2018 -0800
+
+    [subset] add a (failing for now) test for composite glyf hint dropping
+
+ src/hb-ot-glyf-table.hh     |  8 ++++----
+ test/api/test-subset-glyf.c | 27 +++++++++++++++++++++++++--
+ 2 files changed, 29 insertions(+), 6 deletions(-)
+
+commit 4c6023f861a4b87782c17ac626ffee7e93f15fc8
+Merge: d7633d0a 921b65cb
+Author: Garret Rieger <grieger at google.com>
+Date:   Tue Feb 27 17:06:27 2018 -0700
+
+    Merge pull request #842 from googlefonts/maxp
+
+    [subset] when dropping hints, clear hint related fields in maxp.
+
+commit 921b65cbc29f0c2c9c13e9fb272dafe4c8a14591
+Author: Garret Rieger <grieger at google.com>
+Date:   Tue Feb 27 14:37:18 2018 -0800
+
+    [subset] minor fixes in hb-ot-maxp-table.hh
+
+ src/hb-ot-maxp-table.hh | 15 +++++++--------
+ 1 file changed, 7 insertions(+), 8 deletions(-)
+
+commit b26db48bfff804e139331817a86ecc811547afcd
+Author: Garret Rieger <grieger at google.com>
+Date:   Tue Feb 27 14:14:05 2018 -0800
+
+    [subset] whitespace for hb-ot-maxp-table.hh
+
+ src/hb-ot-maxp-table.hh | 30 +++++++++++++++---------------
+ 1 file changed, 15 insertions(+), 15 deletions(-)
+
+commit a76344da796670f33b2fa48a9b1676545dac93c2
+Author: Garret Rieger <grieger at google.com>
+Date:   Tue Feb 27 14:11:36 2018 -0800
+
+    [subset] Add maxpV1Tail instead of defining a struct inside maxp
+    for v1 data.
+
+ src/hb-ot-maxp-table.hh | 81
+ ++++++++++++++++++++++++++++++-------------------
+ 1 file changed, 49 insertions(+), 32 deletions(-)
+
+commit f14d1b64c2d148ffdec95c17adbee3f185d5d436
+Author: Garret Rieger <grieger at google.com>
+Date:   Tue Feb 27 13:49:00 2018 -0800
+
+    [subset] when dropping hints, clear hint related fields in maxp.
+
+ src/hb-ot-maxp-table.hh     | 43
+ ++++++++++++++++++++++++++++++++++++++++---
+ test/api/test-subset-glyf.c | 30 +++++++++++++++++++++++-------
+ 2 files changed, 63 insertions(+), 10 deletions(-)
+
+commit d7633d0a4091c025638ba3fc8fb0d8e9a0e9ff8c
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Feb 27 12:50:57 2018 -0800
+
+    [BASE] More
+
+ src/hb-ot-layout-base-table.hh | 153
+ ++++-------------------------------------
+ 1 file changed, 12 insertions(+), 141 deletions(-)
+
+commit 7a70c20fec6ece9e729dc2634e2896a8d8eb9962
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Feb 27 12:45:26 2018 -0800
+
+    [BASE] Clean up first 29%
+
+ src/hb-ot-layout-base-table.hh | 262
+ +++++++++++++++++++----------------------
+ src/hb-ot-layout-gsub-table.hh |   2 +-
+ 2 files changed, 125 insertions(+), 139 deletions(-)
+
+commit 101850f9e6b9e0932fe1dd4169f88d6764c669c1
+Merge: 5967eaba f110c0c8
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Tue Feb 27 20:15:54 2018 +0330
+
+    Merge with master
+
+commit f110c0c8866c853c0d5a930564a2b69231a33322
+Merge: 4a1d51ef 0ad8c663
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Tue Feb 27 11:41:12 2018 +0330
+
+    Merge pull request #838 from harfbuzz/BASE
+
+    BASE table
+
+commit 0ad8c663e0b4602e2a413e77a8158bf8a46755d5
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Mon Feb 26 12:45:08 2018 +0330
+
+    Remove public API of the branch
+
+ src/hb-ot-base.h               |  4 ++--
+ src/hb-ot-layout-base-table.hh | 20 +++++++++---------
+ src/hb-ot-layout.cc            | 48
+ ++++++++++++++++++++----------------------
+ 3 files changed, 35 insertions(+), 37 deletions(-)
+
+commit 4a1d51ef15a423706406f784a146078073147885
+Merge: d0caf7e5 903771b6
+Author: rsheeter <rsheeter at google.com>
+Date:   Mon Feb 26 20:23:41 2018 -0800
+
+    Merge pull request #818 from googlefonts/drophints
+
+    [subset] Drop hints
+
+commit 903771b6c7689b9eee9a11bac128c42f39833b2e
+Author: Rod Sheeter <rsheeter at google.com>
+Date:   Mon Feb 26 19:50:06 2018 -0800
+
+    [subset] clearer name for trim() and better comment about composite
+    handling, per review feedback
+
+ src/hb-ot-glyf-table.hh |  8 +++++---
+ src/hb-subset-glyf.cc   | 17 ++++++++---------
+ 2 files changed, 13 insertions(+), 12 deletions(-)
+
+commit d0caf7e5e3294c25230ed0e5580c647fa0f1a2c8
+Merge: 6c844ae8 44dc36dd
+Author: Garret Rieger <grieger at google.com>
+Date:   Mon Feb 26 19:24:18 2018 -0700
+
+    Merge pull request #840 from googlefonts/os2
+
+    [subset] During os2 subsetting update ulUnicodeRange[]c
+
+commit 44dc36dd82fc948a15e2ad0d605eb4a466b3553d
+Author: Garret Rieger <grieger at google.com>
+Date:   Mon Feb 26 17:56:23 2018 -0800
+
+    [subset] update to comment in hb-ot-os2-unicode-ranges.hh
+
+ src/hb-ot-os2-unicode-ranges.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit ad3f2f77dafdee524e836e732077ee9670602369
+Author: Garret Rieger <grieger at google.com>
+Date:   Mon Feb 26 17:51:27 2018 -0800
+
+    [subset] small cleanups in hb-ot-os2-table.
+
+ src/hb-ot-os2-table.hh          | 5 +++--
+ src/hb-ot-os2-unicode-ranges.hh | 2 +-
+ 2 files changed, 4 insertions(+), 3 deletions(-)
+
+commit f1c8fc3487d5c5efb8ee1804acb07e6e282d3bc5
+Author: Garret Rieger <grieger at google.com>
+Date:   Mon Feb 26 17:48:51 2018 -0800
+
+    [subset] small updates to gen-unicode-ranges.py
+
+ src/gen-unicode-ranges.py       | 6 ++++--
+ src/hb-ot-os2-unicode-ranges.hh | 3 ++-
+ 2 files changed, 6 insertions(+), 3 deletions(-)
+
+commit 0c0fe2ff8209228f2ddfce464b7b6f1b1ee1654a
+Author: Garret Rieger <grieger at google.com>
+Date:   Mon Feb 26 17:47:10 2018 -0800
+
+    [subset] Move util/generated-unicode-ranges.py to
+    src/gen-unicode-ranges.py
+
+ util/generate-unicode-ranges.py => src/gen-unicode-ranges.py | 0
+ 1 file changed, 0 insertions(+), 0 deletions(-)
+
+commit f630ae5161bfc8420f9ae0127fd8c7f447874fdd
+Author: Garret Rieger <grieger at google.com>
+Date:   Mon Feb 26 17:46:17 2018 -0800
+
+    [subset] unsigned int -> hb_codepoint_t.
+
+ src/hb-ot-os2-unicode-ranges.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 6368ce4c927b1457cf19945d5957e91d4621dc8b
+Author: Garret Rieger <grieger at google.com>
+Date:   Mon Feb 26 17:44:39 2018 -0800
+
+    [subset] const in _compare_range.
+
+ src/hb-ot-os2-unicode-ranges.hh | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit 0be9fea0a96701b159a9db190e55b1c3efc38a28
+Author: Garret Rieger <grieger at google.com>
+Date:   Mon Feb 26 16:15:09 2018 -0800
+
+    [subset] Add comment to os2UnicodeRangesSorted.
+
+ src/hb-ot-os2-unicode-ranges.hh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit e20ab71d12b032371b830b76462e5e979d963b58
+Author: Garret Rieger <grieger at google.com>
+Date:   Mon Feb 26 16:13:10 2018 -0800
+
+    [subset] Fix incorrect index.
+
+ src/hb-ot-os2-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 074b5a29a166d1812abc7229a71af4a3bb311536
+Author: Garret Rieger <grieger at google.com>
+Date:   Mon Feb 26 16:11:24 2018 -0800
+
+    [subset] Add special case handling of bit 57 in os2 ulUnicodeRange.
+
+ src/hb-ot-os2-table.hh     | 7 +++++++
+ src/test-unicode-ranges.cc | 3 ---
+ 2 files changed, 7 insertions(+), 3 deletions(-)
+
+commit ddc4f2b9fc5566e70558a57133289f84d467cc98
+Author: Garret Rieger <grieger at google.com>
+Date:   Mon Feb 26 15:59:32 2018 -0800
+
+    [subset] Add python util that was used to generated
+    hb-ot-os2-unicode-ranges.hh
+
+ util/generate-unicode-ranges.py | 50
+ +++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 50 insertions(+)
+
+commit f757757eda5f00a89a156e3427bdf8c4313611ef
+Author: Garret Rieger <grieger at google.com>
+Date:   Mon Feb 26 15:56:36 2018 -0800
+
+    [subset] Add cmake build def for test-unicode-ranges.
+
+ CMakeLists.txt  | 2 +-
+ src/Makefile.am | 1 -
+ 2 files changed, 1 insertion(+), 2 deletions(-)
+
+commit f82f2a3e50805503d93aa1aa1ccb27da4967a14a
+Author: Garret Rieger <grieger at google.com>
+Date:   Mon Feb 26 15:52:01 2018 -0800
+
+    [subset] Rename hb-os2-unicode-ranges.cc to test-unicode-ranges.cc.
+
+ src/Makefile.am                                             | 2 +-
+ src/{hb-ot-os2-unicode-ranges.cc => test-unicode-ranges.cc} | 0
+ 2 files changed, 1 insertion(+), 1 deletion(-)
+
+commit 4014555ca083dea3e4f42120aeaf52a2186b8a09
+Author: Garret Rieger <grieger at google.com>
+Date:   Mon Feb 26 15:50:13 2018 -0800
+
+    [subset] set ulUnicodeRange[] in os2.
+
+ src/Makefile.sources            |   1 -
+ src/hb-ot-os2-table.hh          |  23 ++++-
+ src/hb-ot-os2-unicode-ranges.cc | 221
+ ++--------------------------------------
+ src/hb-ot-os2-unicode-ranges.hh | 210
+ +++++++++++++++++++++++++++++++++++++-
+ 4 files changed, 236 insertions(+), 219 deletions(-)
+
+commit a570142d0c6d819feeeeb9e209fc90a33c1c2b48
+Author: Garret Rieger <grieger at google.com>
+Date:   Mon Feb 26 15:20:23 2018 -0800
+
+    [subset] Move hb-ot-os2-unicode-ranges into a cc file with a helper
+    methods and tests.
+
+ src/Makefile.am                 |   9 +-
+ src/Makefile.sources            |   2 +
+ src/hb-ot-os2-unicode-ranges.cc | 279
+ ++++++++++++++++++++++++++++++++++++++++
+ src/hb-ot-os2-unicode-ranges.hh | 189 +--------------------------
+ 4 files changed, 292 insertions(+), 187 deletions(-)
+
+commit 8e81799b32f3dfaca000fa5d42943ceed9af8d17
+Author: Garret Rieger <grieger at google.com>
+Date:   Fri Feb 23 18:35:41 2018 -0800
+
+    [subset] Add hb-ot-os2-unicode-ranges.hh, a map of os2 unicode ranges.
+
+ src/hb-ot-os2-unicode-ranges.hh | 220
+ ++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 220 insertions(+)
+
+commit 6c844ae8e89f52f5f40eace66bb987544fc316e3
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Mon Feb 26 23:04:27 2018 +0330
+
+    [dev-run] show images using iTerm2 images feature
+
+ src/dev-run.sh | 32 ++++++++++++++++++++++++++++----
+ 1 file changed, 28 insertions(+), 4 deletions(-)
+
+commit 28c4245e9f76c6c53a4589e7745a60ed0e97414a
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Feb 26 01:10:42 2018 -0800
+
+    [aat/ankr] Define Anchor struct
+
+ src/hb-aat-layout-ankr-table.hh | 16 +++++++++++++++-
+ 1 file changed, 15 insertions(+), 1 deletion(-)
+
+commit e347fb908b188f71df13215c8939b0f3a12c716f
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Feb 26 01:08:00 2018 -0800
+
+    Minor
+
+ src/hb-ot-layout-gdef-table.hh |  4 ++--
+ src/hb-ot-layout-gpos-table.hh | 12 ++++++------
+ 2 files changed, 8 insertions(+), 8 deletions(-)
+
+commit 05fbd14e715ed5d0f0f86388b1538ad8e8c7c506
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Feb 26 01:04:16 2018 -0800
+
+    [aat/ankr] Minor
+
+    DEFINE_SIZE_MIN is to be used only in rare cases. For fixed-size
+    structs
+    we want DEFINE_SIZE_STATIC.
+
+ src/hb-aat-layout-ankr-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit f90cd9b1f5ade8ad5e3b7caf0272936ad7a0f419
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Feb 26 01:03:23 2018 -0800
+
+    [aat/ankr] Hook up Lookup table
+
+ src/hb-aat-layout-ankr-table.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit c36598450e9698168851c0ae7d0b4c9e562c4924
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Feb 26 00:57:07 2018 -0800
+
+    [aat/ankr] Simplify
+
+ src/hb-aat-layout-ankr-table.hh | 36 ++++++++----------------------------
+ 1 file changed, 8 insertions(+), 28 deletions(-)
+
+commit fa3a69e2334ec4122d672670614a8e5a95611d75
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Feb 26 00:32:11 2018 -0800
+
+    [aat/trak] Simplify sanitize()
+
+ src/hb-aat-layout-trak-table.hh | 67
+ ++++++++++-------------------------------
+ 1 file changed, 16 insertions(+), 51 deletions(-)
+
+commit f0bc6c0992c4302ae1a20f155ad256bfa331087c
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Feb 26 00:18:17 2018 -0800
+
+    [aat/trak] Clean up
+
+    We always just used "unsigned int" for counter values. There's
+    no use for uint16_t outside of a struct.
+
+    Also, no need for explict casting where implicit does.
+
+ src/hb-aat-layout-trak-table.hh | 12 ++++++------
+ 1 file changed, 6 insertions(+), 6 deletions(-)
+
+commit bb82f01383db7cf05040fbd5881e17e263ef6369
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Sun Feb 25 12:30:33 2018 +0330
+
+    [aat] trak sanitization
+
+ src/dev-run.sh                  |  4 +-
+ src/hb-aat-layout-trak-table.hh | 95
+ ++++++++++++++++++++++++++++++++---------
+ src/hb-aat-layout.cc            |  2 +-
+ util/options.hh                 |  2 +-
+ 4 files changed, 78 insertions(+), 25 deletions(-)
+
+commit becb1d9eea15c07f9ea4e229be56f9aca0f768af
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Mon Feb 26 11:29:48 2018 +0330
+
+    [aat] minor
+
+    Ops, this was done for testing
+
+ src/hb-aat-layout-ankr-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit df1c7d5b60520d2b3c756b700d5ac41668fc0983
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sun Feb 25 19:06:25 2018 -0800
+
+    Minor
+
+ src/hb-open-type-private.hh | 5 +++--
+ src/hb-subset.cc            | 2 +-
+ 2 files changed, 4 insertions(+), 3 deletions(-)
+
+commit 6dd46fa598cacdd046ba4548bc6ddf7f37c46dee
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sun Feb 25 18:54:52 2018 -0800
+
+    [aat/trak] Minor
+
+    Maybe we should make DEFINE_* make structs uncopyable.
+
+ src/hb-aat-layout-trak-table.hh | 56
+ +++++++++++++++++++++++------------------
+ 1 file changed, 32 insertions(+), 24 deletions(-)
+
+commit ae14dd0fb0a176f6f0143690907b51626999d248
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Mon Feb 26 00:31:09 2018 +0330
+
+    [aat] Implement ankr
+
+ src/Makefile.sources            |  3 +-
+ src/hb-aat-layout-ankr-table.hh | 86
+ +++++++++++++++++++++++++++++++++++++++++
+ src/hb-aat-layout-kerx-table.hh |  2 +-
+ src/hb-aat-layout.cc            | 37 +++++++++++++-----
+ src/hb-ot-layout-private.hh     |  6 ++-
+ src/hb-ot-layout.cc             |  6 ++-
+ 6 files changed, 124 insertions(+), 16 deletions(-)
+
+commit 551fa2d200a06d00d054f2c8e7aad1cb4d25249b
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sun Feb 25 16:32:17 2018 -0800
+
+    [BASE] Minor
+
+ src/Makefile.sources           |   1 -
+ src/hb-ot-base.cc              |  58 -----------------------
+ src/hb-ot-layout-base-table.hh | 103
+ ++++++++++++++++++++++++++++-------------
+ src/hb-ot-layout.cc            |  34 ++++++++++++++
+ src/hb-ot-layout.h             |   1 +
+ 5 files changed, 105 insertions(+), 92 deletions(-)
+
+commit 05699fd996ed9c0e5dde8918388ac188e58df1a7
+Merge: 83af6c23 3ebcd5a3
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sat Feb 24 12:01:54 2018 -0800
+
+    Merge remote-tracking branch 'eroux/add-base'
+
+commit a8d3c2c030d2c21c70e0b8bd43f7d05ff4818b75
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Sat Feb 24 16:42:12 2018 +0330
+
+    [ci] Add clang O3/O0 testers (#834)
+
+ .circleci/config.yml | 16 ++++++++++++++++
+ 1 file changed, 16 insertions(+)
+
+commit c73255f3eb2f060ec72d18790b374f6b6e4032aa
+Author: Khaled Hosny <khaledhosny at eglug.org>
+Date:   Sat Feb 24 00:44:07 2018 +0200
+
+    Workaround for old automake on Travis Linux images
+
+    https://github.com/harfbuzz/harfbuzz/pull/821#issuecomment-368116538
+
+ .ci/fail.sh | 10 ++++++++--
+ 1 file changed, 8 insertions(+), 2 deletions(-)
+
+commit cd28eb9f5dc237325c64380d9d87e673b8e94985
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Sat Feb 24 14:17:54 2018 +0330
+
+    Add -Werror=unused-function check to Travis (#832)
+
+ .travis.yml          |  4 ++--
+ src/hb-aat-layout.cc | 24 ++++++++++++------------
+ test/api/test-set.c  | 19 ++++++++++---------
+ 3 files changed, 24 insertions(+), 23 deletions(-)
+
+commit 1ab16f4556ef3e54a40b63cf4570c0ae986894e7
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Sat Feb 24 12:49:42 2018 +0330
+
+    [aat] Implement trak logic (#816)
+
+ src/hb-aat-layout-kerx-table.hh |  7 ++++
+ src/hb-aat-layout-private.hh    |  3 ++
+ src/hb-aat-layout-trak-table.hh | 78
+ +++++++++++++++++++++++++++++++++++++++--
+ src/hb-aat-layout.cc            | 46 ++++++++++++++++++++++++
+ src/hb-open-type-private.hh     |  4 +--
+ src/hb-ot-layout-private.hh     | 22 ++++++++++++
+ src/hb-ot-layout.cc             |  4 +++
+ src/hb-ot-shape.cc              |  2 ++
+ 8 files changed, 161 insertions(+), 5 deletions(-)
+
+commit b91e8da36e164168cd532fd6e6950c5d743a14dd
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Feb 23 22:51:17 2018 -0800
+
+    Include hb-version.h in git (#825)
+
+ CMakeLists.txt       | 36 ++++++++++++++--------------
+ src/Makefile.am      |  8 +++----
+ src/Makefile.sources |  3 ---
+ src/hb-version.h     | 66
+ ++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 4 files changed, 87 insertions(+), 26 deletions(-)
+
+commit 5267520e078ed413df78f3a6781fd5370b6da63a
+Author: Rod Sheeter <rsheeter at google.com>
+Date:   Fri Feb 23 18:36:22 2018 -0800
+
+    [subset] update hdmx test to create input explicitly
+
+ test/api/test-subset-hdmx.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 2e3ee489f8374227fa94a8d8684e839e643888ea
+Author: Rod Sheeter <rsheeter at google.com>
+Date:   Fri Feb 23 18:18:54 2018 -0800
+
+    [subset] format tweak, doc string
+
+ src/hb-subset-input.cc | 12 +++++++++---
+ src/hb-subset.h        |  2 +-
+ 2 files changed, 10 insertions(+), 4 deletions(-)
+
+commit d78393b5547135b8db0356b0ec14d5ed0d334768
+Merge: 1454d82a 83af6c23
+Author: Rod Sheeter <rsheeter at google.com>
+Date:   Fri Feb 23 17:53:26 2018 -0800
+
+    Merge branch 'master' of https://github.com/harfbuzz/harfbuzz into
+    drophints
+
+commit 1454d82a9d3d9a47901b3d92ff7f2c05c596c0d5
+Author: Rod Sheeter <rsheeter at google.com>
+Date:   Fri Feb 23 17:49:23 2018 -0800
+
+    [subset] keep glyph trim separate of more general get_offset
+
+ src/hb-ot-glyf-table.hh | 12 ++++--------
+ src/hb-subset-glyf.cc   |  6 ++++--
+ 2 files changed, 8 insertions(+), 10 deletions(-)
+
+commit 0ac8c0c1e6a6c076ce33b16baa173ff8763ac04e
+Author: Rod Sheeter <rsheeter at google.com>
+Date:   Fri Feb 23 17:43:00 2018 -0800
+
+    [subset] zero glyf and loca memory before writing so pads are
+    clean. Test just the part of maxp we care about
+
+ src/hb-ot-glyf-table.hh     |  6 +++---
+ src/hb-subset-glyf.cc       |  4 ++--
+ test/api/test-subset-glyf.c | 19 ++++++++++++++++---
+ 3 files changed, 21 insertions(+), 8 deletions(-)
+
+commit 83af6c237f2bfd66af76a8647a62b3d1ab996744
+Merge: 7e5e1feb dc5c7927
+Author: Garret Rieger <grieger at google.com>
+Date:   Fri Feb 23 18:33:25 2018 -0700
+
+    Merge pull request #829 from googlefonts/test-checksum
+
+    [subset] Caclculate head table checksum adjustment
+
+commit dc5c7927e75ea09461e46fe6e56897091b4b4f00
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Feb 23 16:42:06 2018 -0800
+
+    [subset] Caclculate head table checksum adjustment
+
+    Test still fails, because we do not serialize tables in the same
+    order that fonttools subsetter does.
+
+ src/hb-open-file-private.hh | 51
+ ++++++++++++++++++++++++++++++++++-----------
+ src/hb-ot-head-table.hh     |  2 ++
+ src/hb-subset.cc            |  2 ++
+ 3 files changed, 43 insertions(+), 12 deletions(-)
+
+commit 7e5e1feb666d6a861b5cd64bf29a16e3854fb812
+Merge: ec2538c8 99967e21
+Author: Garret Rieger <grieger at google.com>
+Date:   Fri Feb 23 17:59:08 2018 -0700
+
+    Merge pull request #828 from googlefonts/mem-fixes
+
+    [subset] Fix several memory leaks in subsetting.
+
+commit ec2538c8803be254b6e09ca0ea724b07c35126da
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Feb 23 15:51:26 2018 -0800
+
+    [subset] Fix checksum calc out-of-bounds access
+
+ src/hb-open-file-private.hh | 18 ++++++++++--------
+ src/hb-open-type-private.hh |  3 ++-
+ 2 files changed, 12 insertions(+), 9 deletions(-)
+
+commit 99967e21c6e3f6882d6eadf5c22f4120684b1fc5
+Author: Garret Rieger <grieger at google.com>
+Date:   Fri Feb 23 15:45:45 2018 -0800
+
+    [subset] Fix memory leak in hb-subset-glyf.
+
+ src/hb-subset-glyf.cc | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit e61f360dc828bfd46477b7ddff56874da9f03538
+Author: Garret Rieger <grieger at google.com>
+Date:   Fri Feb 23 15:44:21 2018 -0800
+
+    [subset] Fix memory leak in hb-subset-plan.
+
+ src/hb-subset-plan.cc | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 66b0a390793ab06692dd49e67baef52a6a7d82aa
+Author: Garret Rieger <grieger at google.com>
+Date:   Fri Feb 23 15:41:52 2018 -0800
+
+    [subset] Fix memory leak in hb-subset.
+
+ src/hb-subset.cc | 7 ++-----
+ 1 file changed, 2 insertions(+), 5 deletions(-)
+
+commit 0fb8a5ce192025ffd83ae714db932e4b86594ae1
+Author: Garret Rieger <grieger at google.com>
+Date:   Fri Feb 23 15:37:43 2018 -0800
+
+    [subset] Fix memory leak in cmap subsetting.
+
+ src/hb-ot-cmap-table.hh | 8 +++++---
+ 1 file changed, 5 insertions(+), 3 deletions(-)
+
+commit 4665aaa19304bdf0362bdfcebcae65feb19a8964
+Author: Garret Rieger <grieger at google.com>
+Date:   Fri Feb 23 15:36:14 2018 -0800
+
+    [subset] Fix memory leak in hmtx subsetting.
+
+ src/hb-ot-hmtx-table.hh | 8 +++++---
+ 1 file changed, 5 insertions(+), 3 deletions(-)
+
+commit 5a36b55fba03cd07c9b101f0222b8d189bcd3bbf
+Author: Garret Rieger <grieger at google.com>
+Date:   Fri Feb 23 15:30:14 2018 -0800
+
+    [subset] Fix memory leak in subset face destroy.
+
+ src/hb-subset.cc | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit d38f37b2e37942a3fd13cd753c8b8587a06c0f3a
+Author: Ben Boeckel <mathstuf at users.noreply.github.com>
+Date:   Fri Feb 23 16:55:53 2018 -0500
+
+    autoconf: provide a harfbuzz-config for use from CMake (#822)
+
+ configure.ac                 |  2 ++
+ src/Makefile.am              |  4 ++-
+ src/harfbuzz-config.cmake.in | 82
+ ++++++++++++++++++++++++++++++++++++++++++++
+ 3 files changed, 87 insertions(+), 1 deletion(-)
+
+commit e0939d811f1fdeda9c5763e7e53887b3d3cb21eb
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Feb 23 13:19:34 2018 -0800
+
+    Clean up check-defs and check-symbols (#821)
+
+    Also, call c++filt on their results.
+
+    Also build and fix and check harfbuzz-gobject.def
+
+    Also changes harfbuzz-gobject to distribute generated enum sources.
+
+ CMakeLists.txt              |  3 +--
+ src/Makefile.am             | 33 ++++++++++++++++------------
+ src/Makefile.sources        |  9 +++++---
+ src/check-defs.sh           | 52
+ ---------------------------------------------
+ src/check-symbols.sh        | 30 ++++++++++++++++++++------
+ src/hb-gobject-enums.h.tmpl |  3 ++-
+ src/hb-gobject-structs.h    | 45 ++++++++++++++++++++++++++-------------
+ 7 files changed, 81 insertions(+), 94 deletions(-)
+
+commit 9bd6d25254d9bfc612004982dba286a3751d1d29
+Author: Rod Sheeter <rsheeter at google.com>
+Date:   Fri Feb 23 13:05:58 2018 -0800
+
+    [subset] clone trim logic from fonttools glyf handling
+
+ src/hb-ot-glyf-table.hh                      |  92
+ ++++++++++++++++++++++++++-
+ src/hb-subset-glyf.cc                        |  26 ++++----
+ src/hb-subset-plan.cc                        |   3 +
+ src/hb-subset.cc                             |  13 ++--
+ test/api/fonts/Roboto-Regular.ac.nohints.ttf | Bin 1128 -> 848 bytes
+ test/api/hb-subset-test.h                    |   1 +
+ test/api/test-subset-glyf.c                  |   6 +-
+ 7 files changed, 117 insertions(+), 24 deletions(-)
+
+commit b1ec82105189053d648a798cf5b3ab2887046298
+Merge: e15e41ef c2e4713b
+Author: Garret Rieger <grieger at google.com>
+Date:   Fri Feb 23 12:32:18 2018 -0700
+
+    Merge pull request #823 from googlefonts/hdmx
+
+    [subset] Add hdmx subsetting.
+
+commit e15e41ef12e146333e355defef8db210378b5be0
+Author: Garret Rieger <grieger at google.com>
+Date:   Thu Feb 22 18:41:50 2018 -0800
+
+    [subset] Remove commented code from run-tests.py.
+
+ test/subset/run-tests.py | 3 ---
+ 1 file changed, 3 deletions(-)
+
+commit 2b844803433bd1557a7fd0c93a91c66ef5319b21
+Author: Garret Rieger <grieger at google.com>
+Date:   Thu Feb 22 18:38:44 2018 -0800
+
+    [subset] Update expected files for subsetting integration test to
+    not include cmap 4.
+
+ .../expected/basics/Roboto-Regular.abc.default.62.ttf | Bin 1740 ->
+ 1692 bytes
+ 1 file changed, 0 insertions(+), 0 deletions(-)
+
+commit a88504c601ac95601730bd602861c13e5ac4fdd8
+Author: Garret Rieger <grieger at google.com>
+Date:   Thu Feb 22 14:28:18 2018 -0800
+
+    [subset] Fix checksum clearning in subset test diff. Add an updated
+    expected file (has cmap4 restored).
+
+ .../expected/basics/Roboto-Regular.abc.default.62.ttf | Bin 1692 ->
+ 1740 bytes
+ test/subset/run-tests.py                              |   7 +++++--
+ 2 files changed, 5 insertions(+), 2 deletions(-)
+
+commit 537698b60131bd3d7999919a04596c41dda6b2e4
+Author: Garret Rieger <grieger at google.com>
+Date:   Thu Feb 22 14:07:52 2018 -0800
+
+    [subset] Don't compare actual to itself in Fix
+    test/subset/run-tests. Print a diff on failure.
+
+ test/subset/run-tests.py | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+commit c2e4713b5b561675b0f7b358ccf83d64ef0b6c41
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Feb 23 10:45:03 2018 -0800
+
+    [hdmx] Fix sanitize()
+
+ src/hb-ot-hdmx-table.hh | 23 +++++++----------------
+ 1 file changed, 7 insertions(+), 16 deletions(-)
+
+commit 84d4bb91ceca22484abb597c19eb18311e2514f1
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Feb 23 10:38:35 2018 -0800
+
+    [hdmx] Minor
+
+ src/hb-ot-hdmx-table.hh | 21 +++++++++++----------
+ 1 file changed, 11 insertions(+), 10 deletions(-)
+
+commit cf7a6e520e9601da9d27bc8f6bbe5d2eff23998d
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Feb 23 10:34:26 2018 -0800
+
+    [hdmx] Move DeviceRecord to toplevel again
+
+    More readable.
+
+ src/hb-ot-hdmx-table.hh | 112
+ ++++++++++++++++++++++++------------------------
+ 1 file changed, 57 insertions(+), 55 deletions(-)
+
+commit 96d7805a9235443972c6b6c5cd9502283c8836e9
+Author: Garret Rieger <grieger at google.com>
+Date:   Thu Feb 22 16:48:28 2018 -0800
+
+    [subset] More complete sanitization implementation for hdmx.
+
+ src/hb-ot-hdmx-table.hh | 18 ++++++++++++++----
+ 1 file changed, 14 insertions(+), 4 deletions(-)
+
+commit c02532a3d2325c8fb9332f63f687cbaec77b2239
+Author: Garret Rieger <grieger at google.com>
+Date:   Thu Feb 22 16:40:50 2018 -0800
+
+    [subset] Formatting and comments in hdmx.
+
+ src/hb-ot-hdmx-table.hh | 31 +++++++++++++++++++------------
+ 1 file changed, 19 insertions(+), 12 deletions(-)
+
+commit 6b372f439b257808b048d02ebf5a867dabcd1231
+Author: Garret Rieger <grieger at google.com>
+Date:   Thu Feb 22 12:00:00 2018 -0800
+
+    [subset] In hb-ot-hdmx-table, s/glyf/hdmx.
+
+ src/hb-ot-hdmx-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit ec302ad5bda6bea870f6d33f9698a1782472a213
+Author: Garret Rieger <grieger at google.com>
+Date:   Thu Feb 22 11:57:35 2018 -0800
+
+    [subset] Fail subset if a table fails to sanitize.
+
+ src/hb-subset.cc | 19 +++++++++++--------
+ 1 file changed, 11 insertions(+), 8 deletions(-)
+
+commit 15fc45bfedef433025145289fe916739907b573b
+Author: Garret Rieger <grieger at google.com>
+Date:   Wed Feb 21 17:59:57 2018 -0800
+
+    [subset] Add a unit test for hdmx subsetting.
+
+ test/api/Makefile.am        |  2 ++
+ test/api/test-subset-hdmx.c | 81
+ +++++++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 83 insertions(+)
+
+commit aa4aa2353c52f86fd56446de6b7ff86a9e990b9c
+Author: Garret Rieger <grieger at google.com>
+Date:   Wed Feb 21 17:43:32 2018 -0800
+
+    [subset] Enable hdmx subsetting.
+
+ src/hb-subset.cc | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit bd18b6adf8697c1ce3f4e3831b9f2a99d930e97d
+Author: Garret Rieger <grieger at google.com>
+Date:   Wed Feb 21 17:42:58 2018 -0800
+
+    [subset] Move DeviceRecord inside of hdmx.
+
+ src/hb-ot-hdmx-table.hh | 98
+ +++++++++++++++++++++++++------------------------
+ 1 file changed, 50 insertions(+), 48 deletions(-)
+
+commit 6704cded65985b2de262bdd3bb0887929e5a3b0b
+Author: Garret Rieger <grieger at google.com>
+Date:   Wed Feb 21 16:00:10 2018 -0800
+
+    [subset] Add hdmx subsetting implementation.
+
+ src/hb-ot-hdmx-table.hh | 29 ++++++++++++++++++++++++++---
+ 1 file changed, 26 insertions(+), 3 deletions(-)
+
+commit 84b68e58862647b4ede414b2e608c47d390fd60a
+Author: Garret Rieger <grieger at google.com>
+Date:   Wed Feb 21 15:43:47 2018 -0800
+
+    [subset] In hdmx serialize set the correct value of sizeDeviceRecord.
+
+ src/hb-ot-hdmx-table.hh | 29 ++++++++++++++++-------------
+ 1 file changed, 16 insertions(+), 13 deletions(-)
+
+commit dddf44279f610e77e8b9a0819fd91f48802158b6
+Author: Garret Rieger <grieger at google.com>
+Date:   Wed Feb 21 15:36:09 2018 -0800
+
+    [subset] When serializing a DeviceRecord in hdmx pad to make 32
+    bit aligned.
+
+ src/hb-ot-hdmx-table.hh | 19 +++++++++++++------
+ 1 file changed, 13 insertions(+), 6 deletions(-)
+
+commit ab7a8f3b7419b604816e12cb93e77c0ba45a57af
+Author: Garret Rieger <grieger at google.com>
+Date:   Wed Feb 21 15:15:22 2018 -0800
+
+    [subset] Begin implementing serialize for hdmx.
+
+ src/hb-ot-hdmx-table.hh | 79
+ +++++++++++++++++++++++++++++++++++++++++++++++--
+ 1 file changed, 77 insertions(+), 2 deletions(-)
+
+commit fe42862ab30d17483a1d0c2e2b1d859d01bbaff1
+Author: Garret Rieger <grieger at google.com>
+Date:   Wed Feb 21 14:18:49 2018 -0800
+
+    [subset] Sketch out a basic hb-ot-hdmx.hh.
+
+ src/Makefile.sources    |  1 +
+ src/hb-ot-hdmx-table.hh | 77
+ +++++++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-subset.cc        |  1 +
+ 3 files changed, 79 insertions(+)
+
+commit 4f6f7c3b22ec788f609bdffc7e0893816657b3a0
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Fri Feb 23 02:54:12 2018 +0330
+
+    [util] Implement ppem/ptem on hb-{shape,view} (#811)
+
+ util/options.cc | 33 ++++++++++++++++++++++++++++-----
+ util/options.hh |  6 ++++++
+ 2 files changed, 34 insertions(+), 5 deletions(-)
+
+commit a6bd6bcee08c9522f9269b5c63f784688abddcff
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Thu Feb 22 16:52:56 2018 +0330
+
+    [dev-run] minor
+
+ src/dev-run.sh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit fa13a04cf3345311a2434f0d7f6346f967491c45
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Thu Feb 22 16:48:03 2018 +0330
+
+    [dev-run] Add gdb/lldb shortcuts
+
+ src/dev-run.sh | 40 +++++++++++++++++++++++++++++++---------
+ 1 file changed, 31 insertions(+), 9 deletions(-)
+
+commit 4f07437dfebd3dc5923f40154c6f1b7e1dce1bd4
+Author: Rod Sheeter <rsheeter at google.com>
+Date:   Wed Feb 21 22:23:05 2018 -0800
+
+    [subset] sketch out dropping in-glyf instructions. Sometimes yields
+    differnet size glyphs than fonttools, possibly due to padding not
+    being corrected
+
+ src/hb-ot-glyf-table.hh                      |  45 ++++++++++++++++
+ src/hb-subset-glyf.cc                        |  78
+ +++++++++++++++++++++------
+ src/hb-subset-input.cc                       |   6 +++
+ src/hb-subset.h                              |   2 +
+ test/api/fonts/Roboto-Regular.ac.nohints.ttf | Bin 0 -> 1128 bytes
+ test/api/hb-subset-test.h                    |  15 +++---
+ test/api/test-subset-cmap.c                  |   4 +-
+ test/api/test-subset-glyf.c                  |  32 +++++++++--
+ test/api/test-subset-hmtx.c                  |  10 ++--
+ test/api/test-subset-os2.c                   |   2 +-
+ 10 files changed, 160 insertions(+), 34 deletions(-)
+
+commit 2d0265242bb9a080886d6e0aa653c62e5770a15a
+Author: Rod Sheeter <rsheeter at google.com>
+Date:   Wed Feb 21 09:42:46 2018 -0800
+
+    [subset] keep the result of _subset
+
+ src/hb-subset.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 4fb97be78d9287e489c9f67d1bfe7682235bdf38
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Wed Feb 21 14:38:02 2018 -0800
+
+    Add two more ragel-generated headers
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/817
+
+ src/hb-buffer-deserialize-json.hh | 643
+ ++++++++++++++++++++++++++++++++++++++
+ src/hb-buffer-deserialize-text.hh | 571 +++++++++++++++++++++++++++++++++
+ 2 files changed, 1214 insertions(+)
+
+commit 74e0c13a4a55848e797242c02c8f067e587ea603
+Author: Rod Sheeter <rsheeter at google.com>
+Date:   Wed Feb 21 11:19:18 2018 -0800
+
+    [subset] drop hint tables if so flagged. Still need to dump glyf
+    instructions.
+
+ src/hb-subset-plan.cc    |  1 +
+ src/hb-subset-plan.hh    |  2 ++
+ src/hb-subset-private.hh |  2 +-
+ src/hb-subset.cc         | 11 +++++++++--
+ util/hb-subset.cc        |  2 +-
+ util/options.cc          |  2 +-
+ util/options.hh          |  4 ++--
+ 7 files changed, 17 insertions(+), 7 deletions(-)
+
+commit edee28801e4dbb5b734b4038d93fe1594e267ab1
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Wed Feb 21 22:13:58 2018 +0330
+
+    Add .editorconfig (#810)
+
+    More information: http://editorconfig.org/
+
+ .editorconfig | 18 ++++++++++++++++++
+ 1 file changed, 18 insertions(+)
+
+commit 0bd100e144885ed8144cf23e7e106014858a1724
+Author: Rod Sheeter <rsheeter at google.com>
+Date:   Wed Feb 21 10:34:00 2018 -0800
+
+    [subset] add --hinting flag
+
+ src/hb-subset-private.hh |  1 +
+ util/hb-subset.cc        |  6 +++++-
+ util/options.cc          | 15 +++++++++++++++
+ util/options.hh          | 14 ++++++++++++++
+ 4 files changed, 35 insertions(+), 1 deletion(-)
+
+commit 7ecca8c0a83a6c71154fcc80887a4f895c0c5a23
+Author: Rod Sheeter <rsheeter at google.com>
+Date:   Wed Feb 21 09:42:46 2018 -0800
+
+    [subset] keep the result of _subset
+
+ src/hb-subset.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit eada749e4642ea90300c9c68c226fa76a3e35a75
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Wed Feb 21 00:35:23 2018 -0800
+
+    Use HB_SET_VALUE_INVALID consistently
+
+ src/hb-ot-layout-common-private.hh | 6 +++---
+ src/hb-ot-shape.cc                 | 2 +-
+ 2 files changed, 4 insertions(+), 4 deletions(-)
+
+commit 2cc845f311b6dc4f0feda8b8fc5609fbd51b5923
+Author: Garret Rieger <grieger at google.com>
+Date:   Tue Feb 20 18:13:41 2018 -0800
+
+    [subset] fix calculation of range shiftz. Should be 16 * len -
+    searchRange not 16 * (len - searchRange).
+
+ src/hb-open-type-private.hh | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit 8e614ade5aef102baed56f91c2fcb1f3d1788ea9
+Author: Garret Rieger <grieger at google.com>
+Date:   Tue Feb 20 17:36:54 2018 -0800
+
+    [subset] Reverse table order for font serialization to match what
+    OTS expects.
+
+ src/hb-open-file-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit a998eeee4ad7bba4a1574c9735618891b6bd0948
+Author: Garret Rieger <grieger at google.com>
+Date:   Tue Feb 20 16:48:52 2018 -0800
+
+    [subset] sanity check glyph data writes during glyph subsetting to
+    ensure they are inbounds.
+
+ src/hb-subset-glyf.cc | 11 +++++++++--
+ 1 file changed, 9 insertions(+), 2 deletions(-)
+
+commit 0ab73e594275cf064e09b9df2e1df337a589745d
+Author: Garret Rieger <grieger at google.com>
+Date:   Tue Feb 20 15:33:03 2018 -0800
+
+    [subset] Sanity check that loca writes are inbounds.
+
+ src/hb-subset-glyf.cc | 55
+ ++++++++++++++++++++++++++++++++++++++-------------
+ 1 file changed, 41 insertions(+), 14 deletions(-)
+
+commit 73e20ec6e9ad86bea023fc8b6fc10287889ed048
+Merge: 6ae4013f 69e443b2
+Author: Garret Rieger <grieger at google.com>
+Date:   Tue Feb 20 17:34:59 2018 -0700
+
+    Merge pull request #812 from googlefonts/cleanup
+
+    Clean up of glyf subsetting.
+
+commit 6ae4013f2e53d6496507a58b715298fee4eadcee
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Feb 20 15:02:25 2018 -0800
+
+    [aat] Cosmetic touch-ups to trak table
+
+ src/hb-aat-layout-trak-table.hh | 31 +++++++++++++++++--------------
+ 1 file changed, 17 insertions(+), 14 deletions(-)
+
+commit abc82b493e301e5588d689baa1434b3ce6577fcd
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Feb 20 14:34:16 2018 -0800
+
+    Add Ragel-generated files to git
+
+    I know it's bad form; I know I've said no to this multiple times...
+    But this is part of an experiment to see if we can make rolling
+    HarfBuzz
+    into Chrome much faster. That will give us a lot more testing exposure
+    that currently Chrome does.
+
+    Doing this while those files are still considered ignored by our
+    gitignore rules; will see how that flies.
+
+ autogen.sh                                 |   10 +-
+ src/Makefile.am                            |    3 +-
+ src/hb-ot-shape-complex-indic-machine.hh   | 1319
+ ++++++++++++++++++++++++++++
+ src/hb-ot-shape-complex-khmer-machine.hh   |  294 +++++++
+ src/hb-ot-shape-complex-myanmar-machine.hh |  413 +++++++++
+ src/hb-ot-shape-complex-use-machine.hh     |  502 +++++++++++
+ 6 files changed, 2535 insertions(+), 6 deletions(-)
+
+commit 69e443b254fceb29f26f6a0c0129fe3c93c19cfb
+Author: Garret Rieger <grieger at google.com>
+Date:   Tue Feb 20 14:29:21 2018 -0800
+
+    [subset] Switch to hb_blob_copy_writable_or_fail in glyf subsetting.
+
+ src/hb-ot-glyf-table.hh | 29 +++++++++++------------------
+ src/hb-ot-maxp-table.hh |  3 +--
+ 2 files changed, 12 insertions(+), 20 deletions(-)
+
+commit e3e0ac98238b78530a625a6b7e7647dbabbe1c4d
+Author: Garret Rieger <grieger at google.com>
+Date:   Tue Feb 20 14:07:40 2018 -0800
+
+    [subset] Move glyf subsetting code into hb-ot-glyf-table.hh
+
+ src/hb-ot-glyf-table.hh | 49
+ +++++++++++++++++++++++++++++++++++++++++++++++-
+ src/hb-subset.cc        | 50
+ +------------------------------------------------
+ 2 files changed, 49 insertions(+), 50 deletions(-)
+
+commit d1f16fce963092404bf0b59e449a3215ca031b54
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Feb 20 10:32:09 2018 -0800
+
+    Don't use %zu
+
+    Some of our bots / compilers don't like it. Wasn't caught by bots
+    because this
+    is only in debug code.
+
+    https://github.com/harfbuzz/harfbuzz/pull/809/commits/825ad378e0f0e6e6bb690894a0d5d25f198be21b
+
+ src/hb-ot-cmap-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit c7e834a2fc5f8fb81f5316447e4075902d58d8a3
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Tue Feb 20 17:59:04 2018 +0330
+
+    [dev-run] minor
+
+ src/dev-run.sh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 975c35214f8c8f0d90a8b114e1a8c06d5ecdecfd
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Tue Feb 20 17:49:29 2018 +0330
+
+    [dev-run] Support autotools builds
+
+ src/dev-run.sh | 46 +++++++++++++++++++++++++++++++---------------
+ 1 file changed, 31 insertions(+), 15 deletions(-)
+
+commit 25136d9b7265d8920a78f3f832f1c69da4ef1f5b
+Author: Dominik Röttsches <drott at chromium.org>
+Date:   Tue Feb 20 10:26:07 2018 +0200
+
+    Use %zu format specifier for size_t to fix cross platform build
+
+    Fixes Chromium Android builds, compare
+    https://ci.chromium.org/buildbot/tryserver.chromium.android/linux_android_rel_ng/491787
+
+ src/hb-ot-cmap-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 53cf61b0299775f94c625de1bb0a7979b3b0c379
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Tue Feb 20 10:53:10 2018 +0330
+
+    Change Alpine and ArchLinux bot to test O3 and O0 on gcc, #801
+
+ .circleci/config.yml | 14 ++++++++------
+ 1 file changed, 8 insertions(+), 6 deletions(-)
+
+commit a64eacd8a6cb9811bcaadf20b8b8ae56306cbd75
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Mon Feb 19 23:27:08 2018 +0330
+
+    [aat] First dig on 'trak'
+
+ src/Makefile.sources            |   3 +-
+ src/hb-aat-layout-trak-table.hh | 100
+ ++++++++++++++++++++++++++++++++++++++++
+ src/hb-aat-layout.cc            |   3 +-
+ src/hb-ot-layout-private.hh     |   6 ++-
+ 4 files changed, 108 insertions(+), 4 deletions(-)
+
+commit 0bff6991de308044b077ce74bd45d57d8c4afe5f
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Feb 19 11:51:25 2018 -0800
+
+    Ugh. Really fix build.
+
+ src/hb-subset-private.hh  | 2 +-
+ src/hb-subset.cc          | 3 +--
+ test/api/hb-subset-test.h | 1 +
+ 3 files changed, 3 insertions(+), 3 deletions(-)
+
+commit 4fcbd22b18040cbfd7410e6a090c5f9624eb9a0f
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Feb 19 11:49:25 2018 -0800
+
+    Fix build after previous commit
+
+ src/hb-subset-plan.hh | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 0bbf90ded00dd00ee3f79c1bd16c775d7c893278
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Feb 19 11:38:53 2018 -0800
+
+    [subset] Don't include hb-subset.h from hb.h
+
+ src/hb.h | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit fde04777d1d429fd0981002194f5c19599fda350
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Mon Feb 19 20:00:07 2018 +0330
+
+    Check availability of entr instead now that this works with it
+
+ src/dev-run.sh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit b095ce59ebc5723a1b9c049eebb8f204455c9a72
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Mon Feb 19 11:58:20 2018 +0330
+
+    Simplify hb-fuzzer output printing and fix ArchLinux bot
+
+ test/fuzzing/run-fuzzer-tests.py | 6 +-----
+ 1 file changed, 1 insertion(+), 5 deletions(-)
+
+commit be51f763a752bed1c395bff19afe3291a6063d00
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Mon Feb 19 11:06:13 2018 +0330
+
+    Test debug builds on ArchLinux bot
+
+    Fixes #805
+
+ .circleci/config.yml | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit e2d2d819848ed0ff1c60b9bde1f9c8f9495ec5b4
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sun Feb 18 17:28:53 2018 -0800
+
+    Limit how much work sanitize() can do
+
+    Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=6022
+
+ src/Makefile.am                                       |   2 ++
+ src/hb-open-type-private.hh                           |  16
+ ++++++++++++++--
+ .../233c1e252e737ca79e03a9fd56b71aaa4a230f2b.ttf      | Bin 0 ->
+ 1048576 bytes
+ test/shaping/data/in-house/tests/fuzzed.tests         |   1 +
+ 4 files changed, 17 insertions(+), 2 deletions(-)
+
+commit 7033fe5877c6f9500575f20f17135f74dc9c0547
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sun Feb 18 17:12:04 2018 -0800
+
+    [aat] Minor
+
+ src/hb-aat-layout-common-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 6fa690c75a572a1076124b428b76929b2674e532
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sun Feb 18 16:27:59 2018 -0800
+
+    Fix debug build
+
+    Context needs to be called 'c'. The TRACE_* rely on that.
+
+ src/hb-ot-cmap-table.hh | 22 +++++++++++-----------
+ 1 file changed, 11 insertions(+), 11 deletions(-)
+
+commit 05d1e77db8f3e5280e93b6885ff4f7df113b612b
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sun Feb 18 16:26:04 2018 -0800
+
+    [aat] Silence warning
+
+ src/hb-aat-layout-kerx-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit a21fceb05311f61ef179b2f3aa6497562555f241
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sun Feb 18 16:10:15 2018 -0800
+
+    [ci] Make AppVeyor less noisy
+
+ appveyor.yml | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 1c50a88623a881a9e2b2b0f1f6a783962626f03a
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sun Feb 18 15:57:09 2018 -0800
+
+    Readjust mark attachment heuristic a bit more
+
+    Previously adjusted logic could fail if nothing around was ligated,
+    and something moved.  This should take care of that.
+
+    CC https://github.com/harfbuzz/harfbuzz/issues/740
+
+ src/hb-ot-layout-gpos-table.hh | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+commit 246e280d88b6b26757297a349f01e52c15eaec53
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sun Feb 18 15:42:25 2018 -0800
+
+    [test] Add test for https://github.com/harfbuzz/harfbuzz/issues/740
+
+ .../fonts/573d3a3177c9a8646e94c8a0d7b224334340946a.ttf   | Bin 0 ->
+ 5680 bytes
+ test/shaping/data/in-house/tests/use.tests               |   1 +
+ 2 files changed, 1 insertion(+)
+
+commit 79756c9039a628b0df441228ca1ea20b8a91e3e8
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Mon Feb 19 03:17:44 2018 +0330
+
+    [aat] First dig on 'kerx' (#704)
+
+ src/Makefile.sources            |   1 +
+ src/hb-aat-layout-kerx-table.hh | 377
+ ++++++++++++++++++++++++++++++++++++++++
+ src/hb-aat-layout.cc            |   1 +
+ src/hb-ot-layout-private.hh     |   2 +
+ 4 files changed, 381 insertions(+)
+
+commit 279c70a5b36446f444e5d2f4ac1db7614c8a3db8
+Merge: e9164478 89b82814
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sun Feb 18 14:04:33 2018 -0800
+
+    Merge pull request #796 from ebraminio/dev-run
+
+    Add a continuous builder using fswatch
+
+commit e91644786bf7c278e75962b851d5d47011ff175c
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sun Feb 18 12:41:24 2018 -0800
+
+    Remove unused check
+
+ configure.ac | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit 89b82814b605d2bfcc481a47607e642a928dff15
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Fri Feb 16 12:53:33 2018 +0330
+
+    Add a continuous builder using fswatch
+
+ CMakeLists.txt          | 24 +++++++++++++-----------
+ src/dev-run.sh          | 22 ++++++++++++++++++++++
+ test/api/CMakeLists.txt |  2 +-
+ 3 files changed, 36 insertions(+), 12 deletions(-)
+
+commit 0bd2d76bdd83569366762416bf7c8fd8e90021aa
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sun Feb 18 11:55:26 2018 -0800
+
+    [test] Fix a couple of coverity_scan issues
+
+ test/api/hb-subset-test.h | 17 +++++++++++------
+ 1 file changed, 11 insertions(+), 6 deletions(-)
+
+commit 8089711a61687d565f207c56d3d2b658f514d7ab
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Sun Feb 18 23:25:15 2018 +0330
+
+    Another attempt on fixing coverity
+
+    I hope I am in a correct direction at least
+
+ .travis.yml | 5 ++---
+ 1 file changed, 2 insertions(+), 3 deletions(-)
+
+commit 79d0d791b9ee920e1f687a93de5adf5d113cc829
+Merge: 21646cc4 97a71102
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sun Feb 18 11:35:51 2018 -0800
+
+    Merge pull request #800 from harfbuzz/bitops
+
+    Optimize set through optimized bit operations
+
+commit 97a71102153d28982297a190739c7d82e76b109e
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sun Feb 18 10:50:24 2018 -0800
+
+    Fix BitScanForward() usage
+
+    Should fix Win64 bot.
+
+ src/hb-private.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit fe8f40a4180e7b02831a264c0b3c66763156abb6
+Merge: cd11107b 21646cc4
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sun Feb 18 10:45:33 2018 -0800
+
+    Merge branch 'master' into bitops
+
+commit 21646cc4a6160088933774e179df9be4865a9f4b
+Author: David Corbett <corbett.dav at husky.neu.edu>
+Date:   Fri Feb 16 12:08:55 2018 -0500
+
+    Do not mark the first glyph as unsafe to break
+
+    Fixes #791.
+
+ src/hb-buffer-private.hh | 3 +--
+ src/hb-coretext.cc       | 4 ----
+ src/hb-directwrite.cc    | 2 --
+ src/hb-graphite2.cc      | 1 -
+ src/hb-uniscribe.cc      | 2 --
+ 5 files changed, 1 insertion(+), 11 deletions(-)
+
+commit 04dedec96b76600eecdb739b72814a4a56b270ae
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Feb 16 18:32:57 2018 -0800
+
+    [test] Remove unused var
+
+ test/api/test-subset-hmtx.c | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit 181b7471074cc814e0f498fc05fd6850c3f5e403
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Feb 16 17:08:44 2018 -0800
+
+    Update outdated TODO file
+
+ TODO | 29 +----------------------------
+ 1 file changed, 1 insertion(+), 28 deletions(-)
+
+commit 6d56db8983e03fbebbeb61282bef8cb1f9abb8e2
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Feb 16 17:02:57 2018 -0800
+
+    [test/api] Distribute all fonts
+
+ test/api/Makefile.am | 21 ++-------------------
+ 1 file changed, 2 insertions(+), 19 deletions(-)
+
+commit e5ab34fd3a104f7ff2f0b36c66770c88b2ea1051
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Feb 16 16:58:17 2018 -0800
+
+    Misc fixes
+
+    Should bring bag djgpp bot.
+
+ src/hb-ot-os2-table.hh | 54
+ +++++++++++++++++++++++++-------------------------
+ src/hb-subset-plan.cc  | 16 +++++++--------
+ 2 files changed, 34 insertions(+), 36 deletions(-)
+
+commit df9e22656de746bde65dee775a66f1a80f1c2e32
+Author: Garret Rieger <grieger at google.com>
+Date:   Fri Feb 16 17:02:51 2018 -0700
+
+    [subset] add a glyf subsetting test for a font with composite glyphs.
+
+ .../api/fonts/Roboto-Regular.components.subset.ttf | Bin 0 -> 2052 bytes
+ test/api/fonts/Roboto-Regular.components.ttf       | Bin 0 -> 2572 bytes
+ test/api/test-subset-glyf.c                        |  21
+ +++++++++++++++++++++
+ 3 files changed, 21 insertions(+)
+
+commit c36d015b0e9c363431cd9d228b776ad419fde474
+Author: Garret Rieger <grieger at google.com>
+Date:   Fri Feb 16 17:02:15 2018 -0700
+
+    [subset] missing return.
+
+ test/api/hb-subset-test.h | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 2130392dcc30784ee34c487ab16316006c91f16d
+Author: Garret Rieger <grieger at google.com>
+Date:   Fri Feb 16 17:01:00 2018 -0700
+
+    [subset] Add support for updating reference gids in components to
+    their new values.
+
+ src/hb-subset-glyf.cc | 38 +++++++++++++++++++++++++++++++++-----
+ 1 file changed, 33 insertions(+), 5 deletions(-)
+
+commit 49544eb860e523838892d6ce88eeca72ffd19da4
+Author: Garret Rieger <grieger at google.com>
+Date:   Fri Feb 16 16:56:15 2018 -0700
+
+    [subset] Refactor composite glyf iteration code into an Iterator
+    outside of the accelerator.
+
+ src/hb-ot-glyf-table.hh | 110
+ +++++++++++++++++++++++++-----------------------
+ src/hb-subset-plan.cc   |   6 +--
+ 2 files changed, 60 insertions(+), 56 deletions(-)
+
+commit dc6d67df1395faf38d7587b1dd3c6661ee7cd6f0
+Author: Garret Rieger <grieger at google.com>
+Date:   Fri Feb 16 15:20:14 2018 -0700
+
+    [subset] Use gids_to_retain_sorted to produce old gid -> new gid
+    mapping since it now has the more complete set.
+
+ src/hb-subset-plan.cc | 10 ++++++----
+ 1 file changed, 6 insertions(+), 4 deletions(-)
+
+commit dcac9fe96429d4e272a3fbd60a6162f988f58f71
+Author: Garret Rieger <grieger at google.com>
+Date:   Fri Feb 16 11:27:03 2018 -0700
+
+    [subset] Use complex glyph closure to populate gids_to_retain_sorted.
+
+ src/hb-subset-plan.cc | 43 ++++++++++++++++++++++++-------------------
+ src/hb-subset-plan.hh |  6 ++++++
+ 2 files changed, 30 insertions(+), 19 deletions(-)
+
+commit 58a54c9d4f72e228c012451c4469da730742d3d8
+Author: Garret Rieger <grieger at google.com>
+Date:   Fri Feb 16 11:20:38 2018 -0700
+
+    [subset] add constant to get_composite and in_table methods in
+    hb-ot-glyf-table
+
+ src/hb-ot-glyf-table.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 73e1434814eb37005b4159babf972a2743b25700
+Author: Garret Rieger <grieger at google.com>
+Date:   Thu Feb 15 14:41:56 2018 -0800
+
+    [subset] Add a DFS search to produce a closure of composite glyphs.
+
+ src/hb-subset-plan.cc | 21 +++++++++++++++++++++
+ 1 file changed, 21 insertions(+)
+
+commit d3684141437fad6ebf5f9945f92125c9a42ea853
+Author: Garret Rieger <grieger at google.com>
+Date:   Thu Feb 15 14:03:34 2018 -0800
+
+    [subset] add helper methods to glyf accelerator for reading composite
+    glyph information.
+
+ src/hb-ot-glyf-table.hh | 115
+ ++++++++++++++++++++++++++++++++++++++++++++++--
+ 1 file changed, 112 insertions(+), 3 deletions(-)
+
+commit cd11107bb44ac719709e10264e9e6ba6a1cfae0c
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Feb 16 18:28:58 2018 -0800
+
+    Another bitops fallback fix
+
+    I'm confident that all bugs are hashed out now.
+
+ src/hb-private.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 4e517ecb6b7c27d4053a6476bb9262858e2567ed
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Feb 16 18:20:12 2018 -0800
+
+    Another bitops fallback impl fix
+
+ src/hb-private.hh | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit f18b9fbf6583dff72675be7859fc147ec24a0dd2
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Feb 16 18:14:41 2018 -0800
+
+    [set] Implement iteration using bitop intrinsics
+
+ src/hb-set-private.hh | 55
+ ++++++++++++++++++---------------------------------
+ 1 file changed, 19 insertions(+), 36 deletions(-)
+
+commit 6a91a2eb04951f6e33706c2b8e9cd987b429fce9
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Feb 16 17:49:41 2018 -0800
+
+    Fix wide bitops implemenetation
+
+ src/hb-private.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit d25c3e69e9b0cb9d947e98845b9e3a14ce58e350
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Feb 16 17:45:09 2018 -0800
+
+    [set] Readjust parameters
+
+ src/hb-set-private.hh | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 6d5c0bf8b18ed53e8d40dcbae83ec66ed2116843
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Feb 16 17:33:26 2018 -0800
+
+    Fix bitops fallback impl
+
+ src/hb-private.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 82eb1dac163cb4aef8a2e4ebad542378f4e28dca
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Feb 16 16:52:09 2018 -0800
+
+    Flesh out other bit ops some more for 128bit as well
+
+ src/hb-private.hh | 165
+ +++++++++++++++++++++++++++++++++++++++++-------------
+ 1 file changed, 126 insertions(+), 39 deletions(-)
+
+commit 864a2dddae9eb1303c59d0d3717fce307a72a524
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Feb 16 14:21:40 2018 -0800
+
+    Clean up bit functions
+
+    Compile all code-paths possible, to better catch errors.
+    Also enable MSVC ones on mingw which seems to support them.
+
+ src/hb-private.hh | 43 +++++++++++++++++++++++++++----------------
+ 1 file changed, 27 insertions(+), 16 deletions(-)
+
+commit 978ace6fbbc828adc20f21591d138f41d8508ebc
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Feb 16 16:06:17 2018 -0800
+
+    Improve _hb_popcount()
+
+    Support 128bit type.
+
+ configure.ac                   |  3 ++-
+ src/hb-ot-layout-gpos-table.hh |  2 +-
+ src/hb-ot-map.cc               |  2 +-
+ src/hb-private.hh              | 61
+ +++++++++++++++++++++++++++---------------
+ 4 files changed, 44 insertions(+), 24 deletions(-)
+
+commit 7b5ce7404716a17f91ff86d374c7b76ee7ce3247
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Feb 16 15:37:22 2018 -0800
+
+    Fix warnings
+
+ src/hb-ot-os2-table.hh    | 2 +-
+ test/api/hb-subset-test.h | 3 ++-
+ test/api/hb-test.h        | 9 +++++++--
+ 3 files changed, 10 insertions(+), 4 deletions(-)
+
+commit 94d32d1b83892ed4f124463cf4322bf74b3e850d
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Feb 16 15:36:20 2018 -0800
+
+    Enable C99 if available
+
+    Hopefully we can now mix-and-match code and declaration in the C
+    test files.
+
+ configure.ac | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 926db874552519734fab6c04258887ea634f5324
+Merge: 882a3bf4 c7a633f9
+Author: rsheeter <rsheeter at google.com>
+Date:   Fri Feb 16 15:27:29 2018 -0800
+
+    Merge pull request #792 from googlefonts/master
+
+    Support more tables in subsetter
+
+commit 882a3bf4abcdac60414db41d54dbbb7d2368c908
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Feb 16 14:17:20 2018 -0800
+
+    That didn't work...
+
+ RELEASING.md | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit b1f186df78ed14cbc8be919e7f552df2bd7561e0
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Feb 16 14:13:38 2018 -0800
+
+    Add mingw32.sh and mingw64.sh
+
+ RELEASING.md | 28 +---------------------------
+ mingw32.sh   | 22 ++++++++++++++++++++++
+ mingw64.sh   | 22 ++++++++++++++++++++++
+ 3 files changed, 45 insertions(+), 27 deletions(-)
+
+commit d37310ac5d5f8a3fd1ce1e535647e7c6bb0d7926
+Author: Arkady Shapkin <arkady.shapkin at gmail.com>
+Date:   Fri Feb 16 21:45:08 2018 +0300
+
+    Remove checking macros __OPTIMIZE__ for MSVC
+
+    Visual C++ compiler doesn't define macros __OPTIMIZE__  when
+    optimizations enabled
+
+ src/hb-private.hh | 9 ++++-----
+ 1 file changed, 4 insertions(+), 5 deletions(-)
+
+commit 4eff0fc5b87084765ac2e36ba9f09d7d257f32fb
+Author: Khaled Hosny <khaledhosny at eglug.org>
+Date:   Fri Feb 16 20:22:52 2018 +0200
+
+    Make this work for old versions of automake
+
+ .ci/fail.sh | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit f8077c97909778c117d37773c9da570d831dacd2
+Author: Khaled Hosny <khaledhosny at eglug.org>
+Date:   Thu Feb 15 11:47:08 2018 +0200
+
+    Print only the failed log
+
+ .ci/fail.sh | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+commit 8e3b4c0e11642470069b866a73768a866ac3fdb3
+Author: Khaled Hosny <khaledhosny at eglug.org>
+Date:   Thu Feb 15 11:25:24 2018 +0200
+
+    Simplify calls to collect-logs.sh
+
+ .ci/{collect-logs.sh => fail.sh} |  3 +++
+ .circleci/config.yml             | 13 +++++++++----
+ .travis.yml                      |  6 +++---
+ appveyor.yml                     |  2 +-
+ 4 files changed, 16 insertions(+), 8 deletions(-)
+
+commit c7a633f95710fcf2fe9151b41feba7db4b1bab0e
+Author: Rod Sheeter <rsheeter at google.com>
+Date:   Fri Feb 16 11:11:20 2018 -0800
+
+    [subset] try to get more info from bot where g_assert_cmpmem fails
+
+ test/api/hb-subset-test.h | 12 +++++-------
+ test/api/hb-test.h        | 11 ++++++++---
+ 2 files changed, 13 insertions(+), 10 deletions(-)
+
+commit 0bb2d7ac12b7cf482580b6d2e8534eef8a233f96
+Author: Rod Sheeter <rsheeter at google.com>
+Date:   Fri Feb 16 06:26:02 2018 -0800
+
+    [subset] fix int type for blob length in hb-subset-test.h
+
+ test/api/hb-subset-test.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit be0a01a67613f45db7f7e9be84cb883f0344c817
+Merge: 7acaa3b7 139c9928
+Author: Rod Sheeter <rsheeter at google.com>
+Date:   Fri Feb 16 06:01:41 2018 -0800
+
+    Merge branch 'master' of https://github.com/harfbuzz/harfbuzz
+
+commit 139c9928f6152088fa6eee0279e33cb821aeb541
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Fri Feb 16 13:27:26 2018 +0330
+
+    Fix hb-private.hh compile issue
+
+ src/hb-private.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 6c10328eb88b0641586f31a782b63f45eada5609
+Author: Arkady Shapkin <arkady.shapkin at gmail.com>
+Date:   Thu Feb 15 23:17:46 2018 +0300
+
+    Use _BitScanForward and _BitScanReverse on MSVC
+
+ src/hb-private.hh | 12 ++++++++++++
+ 1 file changed, 12 insertions(+)
+
+commit 7acaa3b781da835cdb11dbe523c819feb4eef996
+Author: Rod Sheeter <rsheeter at google.com>
+Date:   Thu Feb 15 14:28:29 2018 -0800
+
+    [subset] apparently C99 is too much to ask in 2018
+
+ src/hb-ot-hmtx-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit b1740106a9c825874faf3f1315770d1e3c790cf9
+Author: Rod Sheeter <rsheeter at google.com>
+Date:   Thu Feb 15 13:55:21 2018 -0800
+
+    [subset] fix format specifier for size_t
+
+ src/hb-ot-hmtx-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit e00c37aaae3922b425c0528bfdd36d59cf9c5796
+Author: Rod Sheeter <rsheeter at google.com>
+Date:   Thu Feb 15 12:53:52 2018 -0800
+
+    [subset] fix no matching function MIN in djgpp
+
+ src/hb-ot-hmtx-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 6122ad2442666d89ef39bdf5a2bb9d3f6d8e2b03
+Author: Rod Sheeter <rsheeter at google.com>
+Date:   Thu Feb 15 11:40:28 2018 -0800
+
+    [subset] add files to EXTRA_DIST
+
+ test/api/Makefile.am | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 0758cbc4c2f52c629d05515b8d2816e8d6a2a2c1
+Author: Rod Sheeter <rsheeter at google.com>
+Date:   Thu Feb 15 11:29:01 2018 -0800
+
+    [subset] correct bug introduced to get_advance
+
+ src/hb-ot-hmtx-table.hh | 8 ++++++--
+ 1 file changed, 6 insertions(+), 2 deletions(-)
+
+commit 3fd11f4397aec9cda3a7d29246ab3ae56115ad36
+Author: Rod Sheeter <rsheeter at google.com>
+Date:   Thu Feb 15 11:15:12 2018 -0800
+
+    [subset] remove unused decl
+
+ src/hb-subset-private.hh | 3 ---
+ 1 file changed, 3 deletions(-)
+
+commit 23d21a74b55eaf6d6d367097099e6b3bb78bae37
+Author: Khaled Hosny <khaledhosny at eglug.org>
+Date:   Thu Feb 15 02:52:15 2018 +0200
+
+    Move collect_logs to .ci dir
+
+    Next to other CI scripts.
+
+ .collect_logs => .ci/collect-logs.sh | 0
+ .circleci/config.yml                 | 8 ++++----
+ .travis.yml                          | 6 +++---
+ appveyor.yml                         | 2 +-
+ 4 files changed, 8 insertions(+), 8 deletions(-)
+
+commit 0e088a63d10dd09e025515bfa8ae68aa2922eaf6
+Author: Rod Sheeter <rsheeter at google.com>
+Date:   Wed Feb 14 21:11:45 2018 -0800
+
+    [subset] hmtx space bracket. authors++
+
+ src/hb-ot-hmtx-table.hh | 40 ++++++++++++++++++++--------------------
+ 1 file changed, 20 insertions(+), 20 deletions(-)
+
+commit 1725c35da0ea2f829b6d6b6c1963607fd6dfb577
+Author: Rod Sheeter <rsheeter at google.com>
+Date:   Wed Feb 14 19:36:33 2018 -0800
+
+    [subset] cmap space bracket
+
+ src/hb-ot-cmap-table.hh | 72
+ ++++++++++++++++++++++++-------------------------
+ 1 file changed, 36 insertions(+), 36 deletions(-)
+
+commit e158739bfb9e5d60989e179fcc8744f3125e2067
+Author: Rod Sheeter <rsheeter at google.com>
+Date:   Wed Feb 14 19:22:37 2018 -0800
+
+    [subset] space bracket
+
+ src/hb-ot-hmtx-table.hh | 5 ++---
+ 1 file changed, 2 insertions(+), 3 deletions(-)
+
+commit 2d6b1e2af74abea645a943d264e148d56d018101
+Author: Rod Sheeter <rsheeter at google.com>
+Date:   Wed Feb 14 19:14:01 2018 -0800
+
+    [subset] maxp copy writeable fn
+
+ src/hb-ot-maxp-table.hh | 9 ++++-----
+ 1 file changed, 4 insertions(+), 5 deletions(-)
+
+commit 1efecd965fe81d65e2763be4f43df2d8c4d8be44
+Author: Rod Sheeter <rsheeter at google.com>
+Date:   Wed Feb 14 18:42:29 2018 -0800
+
+    [subset] hmtx use copy writeable fn instead of direct memory
+
+ src/hb-ot-hmtx-table.hh | 23 ++++-------------------
+ 1 file changed, 4 insertions(+), 19 deletions(-)
+
+commit 27012526f9b3848676bc2a4fb8e68c630af18620
+Author: Rod Sheeter <rsheeter at google.com>
+Date:   Wed Feb 14 19:01:00 2018 -0800
+
+    [subset] whitespace
+
+ test/api/test-subset-hmtx.c | 7 +++----
+ 1 file changed, 3 insertions(+), 4 deletions(-)
+
+commit b1bd0b5f506dad9d04fd3a6abcb92122f231e0f7
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Wed Feb 14 18:50:19 2018 -0800
+
+    [subset] Minor
+
+ src/hb-ot-cmap-table.hh | 10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
+
+commit 83f57e24bfc2000373192ec44b067fdd7dee8a65
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Wed Feb 14 18:43:53 2018 -0800
+
+    [test] Reinstate
+    test/shaping/data/in-house/tests/myanmar-syllable.tests
+
+ test/shaping/data/in-house/tests/myanmar-syllable.tests | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 5ae6526ef4aa9b3c943cad984dc2fff09cdf597b
+Merge: 2903b2f3 04c1ec2b
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Wed Feb 14 18:42:32 2018 -0800
+
+    [subset] Merge remote-tracking branch 'googlefonts/master'
+
+commit 04c1ec2b7396c05f6e8afc9d87679422782aa1e8
+Author: Garret Rieger <grieger at google.com>
+Date:   Wed Feb 14 17:00:18 2018 -0800
+
+    [subset] Don't fail on different checksum adjustment in subsetting
+    tests.
+
+ .../expected/basics/Roboto-Regular.abc.default.62.ttf | Bin 1740 ->
+ 1692 bytes
+ test/subset/run-tests.py                              |   8 ++++++++
+ 2 files changed, 8 insertions(+)
+
+commit 0775bc0f7a59241456142b48abced75fd3db5a42
+Author: Garret Rieger <grieger at google.com>
+Date:   Wed Feb 14 16:37:35 2018 -0800
+
+    [subset] Fix hhea subsetting and clean up some memory leaks.
+
+ src/hb-ot-hmtx-table.hh | 25 ++++++++++++++-----------
+ 1 file changed, 14 insertions(+), 11 deletions(-)
+
+commit b56c9384bcc177236debd26fdbbf14319e4c62b9
+Author: Garret Rieger <grieger at google.com>
+Date:   Wed Feb 14 16:05:39 2018 -0800
+
+    [subset] Add missing face reference in hb-subset-plan plus ensure
+    all struct members are cleaned up on destroy.
+
+ src/hb-subset-plan.cc | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+commit e0ffebead6230b8e1ee8dd97425505706321793e
+Author: Garret Rieger <grieger at google.com>
+Date:   Wed Feb 14 16:01:08 2018 -0800
+
+    [subset] In hb-subset-test use hb_set_union instead of manually
+    copying set.
+
+ test/api/hb-subset-test.h | 8 +++-----
+ 1 file changed, 3 insertions(+), 5 deletions(-)
+
+commit e330ef3711c543372f9f8550a967c512bbf87d83
+Author: Garret Rieger <grieger at google.com>
+Date:   Wed Feb 14 15:57:11 2018 -0800
+
+    [subset] Restore hb_face_data_destroy to be internal.
+
+ src/hb-subset.cc | 10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
+
+commit 3ab7d2649bf5c92d3837b3132d65d4659d0fa003
+Author: Garret Rieger <grieger at google.com>
+Date:   Wed Feb 14 15:48:57 2018 -0800
+
+    [subset] Fix memory leak in hb-ot-{maxp,os2}. Plus some formatting.
+
+ src/hb-ot-maxp-table.hh |  6 ++++--
+ src/hb-ot-os2-table.hh  | 24 +++++++++++++-----------
+ 2 files changed, 17 insertions(+), 13 deletions(-)
+
+commit 2903b2f357eb495c9badac1b2f74e65e1d1075bd
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Wed Feb 14 15:46:27 2018 -0800
+
+    Another linker tweaking
+
+    Trying to fix this warning:
+    cc1: warning: command line option ‘-fno-threadsafe-statics’ is
+    valid for C++/ObjC++ but not for C
+
+    Let's see what the clang bots think of it.
+
+ src/Makefile.am | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit e1f1f96577a80846749782b6e199a661f4189ec0
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Wed Feb 14 15:44:48 2018 -0800
+
+    [set] Tune size again
+
+    Switch from a 128+64 hierarchy, to 32+32. New page size is 1024.
+    This should make set iteration faster, without affecting other op
+    performances much.
+
+ src/hb-set-private.hh | 7 +++----
+ 1 file changed, 3 insertions(+), 4 deletions(-)
+
+commit 66e282df32410831f1c4e157e9dcf8c76f2bc3d8
+Author: Rod Sheeter <rsheeter at google.com>
+Date:   Wed Feb 14 15:31:13 2018 -0800
+
+    [subset] remove TODO that was already done
+
+ src/hb-subset-plan.hh | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit 4696624ad9987b0eebcf5c84dafdb204b886f28e
+Author: Rod Sheeter <rsheeter at google.com>
+Date:   Wed Feb 14 15:30:49 2018 -0800
+
+    [subset] maxp wrong int type, note to use copy_writable_or_fail
+
+ src/hb-ot-maxp-table.hh | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 3ed70e5e64910e1c22225f542a525807b000cb2a
+Author: Rod Sheeter <rsheeter at google.com>
+Date:   Wed Feb 14 15:24:49 2018 -0800
+
+    [subset] return bool not hb_bool_t from table::subset
+
+ src/hb-ot-cmap-table.hh | 2 +-
+ src/hb-ot-maxp-table.hh | 2 +-
+ src/hb-ot-os2-table.hh  | 2 +-
+ src/hb-subset.cc        | 2 +-
+ 4 files changed, 4 insertions(+), 4 deletions(-)
+
+commit 88d56e241bd6bb768656d77cf8f99ccc97fb2446
+Author: Rod Sheeter <rsheeter at google.com>
+Date:   Wed Feb 14 15:20:43 2018 -0800
+
+    [subset] Use a supplier instead of memcpy and fix a few unnecessary
+    {}s for cmap
+
+ src/hb-ot-cmap-table.hh | 24 ++++++------------------
+ 1 file changed, 6 insertions(+), 18 deletions(-)
+
+commit 42a80f00d51317207c49611b76d6bba06230371b
+Author: Rod Sheeter <rsheeter at google.com>
+Date:   Wed Feb 14 15:04:35 2018 -0800
+
+    [subset] add free
+
+ src/hb-ot-hmtx-table.hh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit d463e9f6b57bebb3aa4875fe11c927c26c3e3974
+Author: Rod Sheeter <rsheeter at google.com>
+Date:   Wed Feb 14 15:04:15 2018 -0800
+
+    [subset] Give Behdad credit again
+
+ src/hb-subset.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit fa87770372a3156658412ff0d70e32083c6b0484
+Author: Rod Sheeter <rsheeter at google.com>
+Date:   Wed Feb 14 14:16:25 2018 -0800
+
+    [subset] First pass at hmtx
+
+ src/hb-ot-cmap-table.hh                           |  19 +--
+ src/hb-ot-hhea-table.hh                           |   6 +-
+ src/hb-ot-hmtx-table.hh                           | 163
+ ++++++++++++++++++---
+ src/hb-ot-maxp-table.hh                           |   8 +-
+ src/hb-ot-os2-table.hh                            |   8 +-
+ src/hb-subset-glyf.cc                             |   5 +-
+ src/hb-subset-glyf.hh                             |   1 -
+ src/hb-subset-plan.cc                             |  12 ++
+ src/hb-subset-plan.hh                             |  10 ++
+ src/hb-subset-private.hh                          |  11 ++
+ src/hb-subset.cc                                  |  85 ++++++-----
+ test/api/Makefile.am                              |   7 +
+ test/api/fonts/Inconsolata-Regular.ab.ttf         | Bin 0 -> 5048 bytes
+ test/api/fonts/Inconsolata-Regular.abc.ttf        | Bin 0 -> 5224 bytes
+ test/api/fonts/Inconsolata-Regular.abc.widerc.ttf | Bin 0 -> 5228 bytes
+ test/api/fonts/Inconsolata-Regular.ac.ttf         | Bin 0 -> 4940 bytes
+ test/api/fonts/Inconsolata-Regular.ac.widerc.ttf  | Bin 0 -> 4944 bytes
+ test/api/fonts/README                             |   2 +
+ test/api/test-subset-hmtx.c                       | 164
+ ++++++++++++++++++++++
+ 19 files changed, 422 insertions(+), 79 deletions(-)
+
+commit 20022575c658b29796db80c387641309d0c49586
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Thu Feb 15 01:15:39 2018 +0330
+
+    Redirect email notifications to another mailing list dedicated for
+    this (#790)
+
+ .travis.yml  | 4 ++--
+ appveyor.yml | 5 +++++
+ 2 files changed, 7 insertions(+), 2 deletions(-)
+
+commit 581996ea7976847b6356c9cc81b564f0c278f0f3
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Thu Feb 15 00:43:46 2018 +0330
+
+    Add .collect_logs and use it on CI bots, fixes #786 (#789)
+
+ .circleci/config.yml | 8 ++++----
+ .collect_logs        | 6 ++++++
+ .travis.yml          | 6 +++---
+ appveyor.yml         | 2 +-
+ 4 files changed, 14 insertions(+), 8 deletions(-)
+
+commit e5edcc81bf14311c56bd2f50808552076c3c4d77
+Author: Garret Rieger <grieger at google.com>
+Date:   Wed Feb 14 11:17:53 2018 -0800
+
+    [subset] Fix codepoint iteration in hb-subset-test.
+
+ test/api/hb-subset-test.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit ccae99fdadcf86aeda15dc230a3ddcd6ff176533
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Wed Feb 14 11:12:09 2018 -0800
+
+    Another try
+
+ src/Makefile.am | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 8b1dbbef1aec3b6880186070e7386a5553d67b15
+Author: Garret Rieger <grieger at google.com>
+Date:   Wed Feb 14 11:04:12 2018 -0800
+
+    Fix compile error in hb-subset-test.
+
+ test/api/hb-subset-test.h | 9 ++++++++-
+ 1 file changed, 8 insertions(+), 1 deletion(-)
+
+commit f53627e19100df6eb7f32d58e7c4ce47a783f1a6
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Wed Feb 14 10:59:22 2018 -0800
+
+    [test] Fix warning
+
+ test/api/test-subset.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 8c3612af650e4c8e01a9fdc127342b07b5c77962
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Wed Feb 14 10:57:34 2018 -0800
+
+    Tweak Makefile some more
+
+ src/Makefile.am | 10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
+
+commit d594f947b68ad36d32ce107847f5f02ec3528076
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Wed Feb 14 10:55:25 2018 -0800
+
+    [subset] Allow linking to libstdc++
+
+    We want to use it.
+
+ src/Makefile.am | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit a0fe3011bafbe36e7d5810acc7df21bea08c802a
+Author: Rod Sheeter <rsheeter at google.com>
+Date:   Wed Feb 14 10:52:41 2018 -0800
+
+    copy all cmap groups at once
+
+ src/hb-ot-cmap-table.hh | 14 ++++----------
+ 1 file changed, 4 insertions(+), 10 deletions(-)
+
+commit d008b62887afe631f50009f40e605c8456ddd011
+Merge: b0eefacf 109314cb
+Author: Garret Rieger <grieger at google.com>
+Date:   Wed Feb 14 10:38:52 2018 -0800
+
+    Merge remote-tracking branch 'upstream/master' into fixed
+
+commit b0eefacf4cb885f510f9551bf2e9216808ca61e8
+Author: Garret Rieger <grieger at google.com>
+Date:   Mon Feb 12 18:15:58 2018 -0800
+
+    [subset] Drop GSUB, GDEF, GPOS, and DSIG from subsetter expected
+    test outputs.
+
+ .../expected/basics/Roboto-Regular.abc.default.62.ttf | Bin 2460 ->
+ 1740 bytes
+ test/subset/generate-expected-outputs.py              |   1 +
+ 2 files changed, 1 insertion(+)
+
+commit 89f17e3965ba776565f2de2bf56a4b135f336e53
+Author: Garret Rieger <grieger at google.com>
+Date:   Mon Feb 12 18:14:50 2018 -0800
+
+    [subset] capitalize dsig.
+
+ src/hb-subset.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit df6d780355d7da805a9b9033452f8814c5360bba
+Author: Garret Rieger <grieger at google.com>
+Date:   Mon Feb 12 17:56:17 2018 -0800
+
+    [subset] Extract maxp subsetting into hb-ot-maxp-table.
+
+ src/hb-ot-maxp-table.hh     | 19 ++++++++++++++++++-
+ src/hb-subset.cc            | 28 ++--------------------------
+ test/api/test-subset-glyf.c |  5 +++--
+ 3 files changed, 23 insertions(+), 29 deletions(-)
+
+commit 865b6971ad5c2ec4bc33c36a78a36b90da5f5543
+Author: Garret Rieger <grieger at google.com>
+Date:   Mon Feb 12 17:42:20 2018 -0800
+
+    [subset] Add a test for OS/2 fixes during subsetting.
+
+ test/api/Makefile.am                |   2 ++
+ test/api/fonts/Roboto-Regular.b.ttf | Bin 0 -> 1996 bytes
+ test/api/test-subset-os2.c          |  59
+ ++++++++++++++++++++++++++++++++++++
+ 3 files changed, 61 insertions(+)
+
+commit 343dfe89655683966836e44afb4fd32c47377844
+Author: Garret Rieger <grieger at google.com>
+Date:   Mon Feb 12 17:33:48 2018 -0800
+
+    [subset] white and add inline in hb-ot-cmap-table.
+
+ src/hb-ot-cmap-table.hh | 18 +++++++++---------
+ 1 file changed, 9 insertions(+), 9 deletions(-)
+
+commit 24904383df03c472c865bd97bfe844f5e86a7172
+Author: Garret Rieger <grieger at google.com>
+Date:   Mon Feb 12 17:31:01 2018 -0800
+
+    [subset] Correct usFirstCharIndex and usLastCharIndex in OS2 table
+    when subsetting.
+
+ src/hb-ot-os2-table.hh | 45 +++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-subset.cc       | 16 ++++++++++------
+ 2 files changed, 55 insertions(+), 6 deletions(-)
+
+commit 109314cb55e6d95d5c3a87b9ed1ba4e74a880078
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Wed Feb 14 21:05:11 2018 +0330
+
+    Another attempt on fixing the tests on Travis (#788)
+
+ src/Makefile.am | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 694eaf636713b8d0bbe13f38c2553b1a2f3d2d3a
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Wed Feb 14 01:00:10 2018 -0800
+
+    [set] Add backwards iterator
+
+    New API:
+    - hb_set_previous()
+    - hb_set_previous_range()
+
+ docs/harfbuzz-sections.txt |  2 ++
+ src/hb-set-private.hh      | 79
+ +++++++++++++++++++++++++++++++++++++++++++++-
+ src/hb-set.cc              | 49 +++++++++++++++++++++++++++-
+ src/hb-set.h               | 19 ++++++++---
+ test/api/test-set.c        | 53 +++++++++++++++++++++++++++++--
+ 5 files changed, 194 insertions(+), 8 deletions(-)
+
+commit fe3bc524bd4f93bd67c13ed402720a13dd3484d3
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Feb 13 23:51:45 2018 -0800
+
+    [set] Allow starting iteration from a non-member of the set
+
+ src/hb-set-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit a989f3edec5864d5de8b217aa595c962d8fc4b0a
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Feb 13 22:12:36 2018 -0800
+
+    Add hb_blob_copy_writable_or_fail()
+
+    New API:
+    - hb_blob_copy_writable_or_fail()
+
+ docs/harfbuzz-sections.txt |  1 +
+ src/hb-blob.cc             | 25 +++++++++++++++++++++++++
+ src/hb-blob.h              |  3 +++
+ 3 files changed, 29 insertions(+)
+
+commit 9046e924421869bf167b52cd394e868796091f62
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Feb 13 22:07:12 2018 -0800
+
+    [subset] Rename constructor to hb_subset_input_create_or_fail()
+
+    To signify that unlike rest of library, returns nullptr on failure.
+
+ src/hb-subset-input.cc      | 6 ++----
+ src/hb-subset.h             | 2 +-
+ test/api/test-subset-glyf.c | 3 ++-
+ test/api/test-subset.c      | 7 +++++--
+ util/hb-subset.cc           | 2 +-
+ 5 files changed, 11 insertions(+), 9 deletions(-)
+
+commit 507804479a81672ec0c089313adad9fa308d78fd
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Feb 13 21:46:28 2018 -0800
+
+    [use] Add dump-use-data
+
+ src/Makefile.am                        |  4 ++++
+ src/dump-use-data.cc                   | 38
+ ++++++++++++++++++++++++++++++++++
+ src/gen-use-table.py                   |  2 +-
+ src/hb-ot-shape-complex-use-private.hh |  2 +-
+ src/hb-ot-shape-complex-use-table.cc   |  2 +-
+ src/hb-ot-shape-complex-use.cc         |  4 ++--
+ 6 files changed, 47 insertions(+), 5 deletions(-)
+
+commit 15ba4fbe01433c8627f9e6a60106ca77d3e1ad4c
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Feb 13 21:41:51 2018 -0800
+
+    [khmer] Add dump-khmer-data
+
+ src/Makefile.am                          |   4 +
+ src/Makefile.sources                     |   1 +
+ src/dump-khmer-data.cc                   |  43 +++++++++++
+ src/hb-ot-shape-complex-khmer-private.hh | 124
+ +++++++++++++++++++++++++++++++
+ src/hb-ot-shape-complex-khmer.cc         |  98 +-----------------------
+ 5 files changed, 173 insertions(+), 97 deletions(-)
+
+commit effddd03bd6fb0aac14b46a16b281f3749e44780
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Feb 13 21:38:15 2018 -0800
+
+    [myanmar] Add dump-myanmar-data
+
+ src/Makefile.am                            |   4 +
+ src/Makefile.sources                       |   1 +
+ src/dump-myanmar-data.cc                   |  43 ++++++++
+ src/hb-ot-shape-complex-indic-private.hh   |   8 +-
+ src/hb-ot-shape-complex-myanmar-private.hh | 171
+ +++++++++++++++++++++++++++++
+ src/hb-ot-shape-complex-myanmar.cc         | 138 +----------------------
+ 6 files changed, 225 insertions(+), 140 deletions(-)
+
+commit c0e45b60a001a45c8ed1f12af8f2f222161eca6a
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Feb 13 21:23:38 2018 -0800
+
+    [indic] Rename print-indic-table to dump-indic-data
+
+    Makes more sense given what this prints, err, dumps.
+
+ src/Makefile.am                                  | 8 ++++----
+ src/{print-indic-table.cc => dump-indic-data.cc} | 0
+ 2 files changed, 4 insertions(+), 4 deletions(-)
+
+commit 9b878bd2165236b067d59410673cf5cc54968fa7
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Feb 13 21:22:47 2018 -0800
+
+    [indic] Explicitly number indic_position_t
+
+    So it's easier to cross-reference from output of print-indic-table.
+
+ src/hb-ot-shape-complex-indic-private.hh | 32
+ ++++++++++++++++----------------
+ 1 file changed, 16 insertions(+), 16 deletions(-)
+
+commit 8634846a0a1049c42ea84ca34402957c981b4c73
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Feb 13 21:18:00 2018 -0800
+
+    More tweaking linker and linker flags
+
+ src/Makefile.am | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit d830d3d2448b2248dff642c701b442e1260e2d85
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Feb 13 19:01:03 2018 -0800
+
+    [indic] Share some copy/pasta code
+
+ src/hb-ot-shape-complex-indic-private.hh | 29
+ +++++++++++++++++++++++++++--
+ src/hb-ot-shape-complex-indic.cc         | 27 ---------------------------
+ src/hb-ot-shape-complex-khmer.cc         | 30
+ ++++++++----------------------
+ src/hb-ot-shape-complex-myanmar.cc       | 19 ++-----------------
+ 4 files changed, 37 insertions(+), 68 deletions(-)
+
+commit 397ed53e55b9450742867a43d164b498ec735f50
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Feb 13 18:54:26 2018 -0800
+
+    [indic] Add print-indic-table
+
+ src/Makefile.am                          |  14 ++-
+ src/hb-ot-shape-complex-indic-private.hh | 185
+ ++++++++++++++++++++++++++++++
+ src/hb-ot-shape-complex-indic.cc         | 187
+ -------------------------------
+ src/print-indic-table.cc                 |  43 +++++++
+ 4 files changed, 239 insertions(+), 190 deletions(-)
+
+commit fd0bde6325a7dfe3ba54b683646ca0693c414446
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Feb 13 16:35:30 2018 -0800
+
+    [subset] Fix loca offsets
+
+    Was writing source font's offsets. Ouch.
+
+ src/hb-subset-glyf.cc | 30 +++++++++++-------------------
+ 1 file changed, 11 insertions(+), 19 deletions(-)
+
+commit aeed082e282b97e40c2e8590bdd8818affc7de6c
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Feb 13 14:02:59 2018 -0800
+
+    Another tweak at libstdc++ things
+
+    To fix this warning:
+
+    cc1: warning: command line option ‘-fno-threadsafe-statics’ is
+    valid for C++/ObjC++ but not for C
+
+ src/Makefile.am | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit c7d7c9898e22905888dc4304f6d8e79b55654174
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Feb 13 14:00:14 2018 -0800
+
+    [aat] Minor
+
+ src/hb-aat-layout-morx-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 2dbfeecf96c6993d42594f43133d945d67ddbdbc
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Feb 13 13:59:39 2018 -0800
+
+    Minor
+
+ src/hb-aat-layout-morx-table.hh | 10 ++++++----
+ 1 file changed, 6 insertions(+), 4 deletions(-)
+
+commit d5b33f2fe1603e894e21f45afb4c00c8d670fb5c
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Feb 13 13:50:50 2018 -0800
+
+    [subset] hb_subset_input_t changes
+
+ src/Makefile.sources        |   1 +
+ src/hb-face.h               |   1 -
+ src/hb-set.cc               |  14 +++---
+ src/hb-subset-input.cc      | 109
+ ++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-subset-plan.cc       |   2 +-
+ src/hb-subset-private.hh    |  11 ++++-
+ src/hb-subset.cc            |  40 ++--------------
+ src/hb-subset.h             |  12 ++++-
+ test/api/test-subset-glyf.c |   4 +-
+ test/api/test-subset.c      |   2 +-
+ util/hb-subset.cc           |  20 ++++----
+ 11 files changed, 153 insertions(+), 63 deletions(-)
+
+commit 28e63a1287fd38a98eed6725c2f4d0820066b0d8
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Feb 13 13:39:50 2018 -0800
+
+    Disable threadsafe static's for all libraries
+
+    Even in libharfbuzz-subset, we still will handle our own threadsafety
+    for statics.
+
+ src/Makefile.am | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 7caddb51b1e69a2803f86756e2ce2acff685c7d0
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Tue Feb 13 15:12:43 2018 +0330
+
+    Specify the project name for coverity, trying to fix #785
+
+ .travis.yml | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit b969a82e30f0ff7bf6b2ea2600ef170764774a8c
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Feb 12 20:51:26 2018 -0800
+
+    Pass no-libstdc++ flags only to libraries suppressing it
+
+ src/Makefile.am | 20 ++++++++++----------
+ 1 file changed, 10 insertions(+), 10 deletions(-)
+
+commit 97a2f0320056b591d7a747022869fe9cd8ecc6e1
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Feb 12 18:51:10 2018 -0800
+
+    [subset] Allocate bulk memory with malloc(), not calloc()
+
+    We use calloc() to allocate simple structs and set them to zero.
+    For bulk memory, use malloc() that doesn't zero.
+
+ src/hb-subset-glyf.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 96f1f52ea3a42b27f59aecffe65c918295e53b3b
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Feb 12 18:48:51 2018 -0800
+
+    Use hb_face_get_upem() instead of face->get_upem()
+
+    Such that hmtx accelerator can be used from libharfbuzz-subset.
+
+ src/hb-ot-cbdt-table.hh | 2 +-
+ src/hb-ot-hmtx-table.hh | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit 3d66f441cc4d4feb2fd4b03be9f764c91f4de8b2
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Feb 12 18:43:42 2018 -0800
+
+    [subset] Remove unreachable code
+
+    sanitizer.sanitize never return nullptr.
+
+ src/hb-subset.cc | 4 ----
+ 1 file changed, 4 deletions(-)
+
+commit 42040a273facc696d9a54fc4d89857665e87e3d1
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Feb 12 18:41:36 2018 -0800
+
+    Allow libharfbuzz-subset to link to libstdc++
+
+    We want to use it instead of reinventing hashmap...
+
+    Also, don't change linker for ICU since libicu also uses libstdc++.
+
+ src/Makefile.am        | 2 --
+ src/check-libstdc++.sh | 3 ++-
+ 2 files changed, 2 insertions(+), 3 deletions(-)
+
+commit 4af3c5e25822cc5a401837da547c75a17b7f7b48
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Mon Feb 12 23:21:24 2018 +0330
+
+    Move linker specifying to a better place
+
+ src/Makefile.am | 15 +++++++--------
+ 1 file changed, 7 insertions(+), 8 deletions(-)
+
+commit 8cf8b78faaf3e7ee261bdc44a1ad5a1973eab1a2
+Author: Garret Rieger <grieger at google.com>
+Date:   Mon Feb 12 16:30:21 2018 -0800
+
+    [subset] whitespace
+
+ test/api/test-subset-cmap.c | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit d1a4d5616f792c6ad84bcc5011040167ddd7cc3f
+Author: Rod Sheeter <rsheeter at google.com>
+Date:   Mon Feb 12 16:25:32 2018 -0800
+
+    output format 12 as enc 10 to match how Roboto did it
+
+ src/hb-ot-cmap-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 89ee20f1a39ac78268b57a9aebe8e7428f9944bf
+Author: Rod Sheeter <rsheeter at google.com>
+Date:   Mon Feb 12 16:01:15 2018 -0800
+
+    basic wiring for a (failing) cmap test
+
+ test/api/Makefile.am                               |   2 +
+ test/api/fonts/README                              |   1 +
+ .../Roboto-Regular.abc.cmap-format12-only.ttf      | Bin 0 -> 2412 bytes
+ .../fonts/Roboto-Regular.ac.cmap-format12-only.ttf | Bin 0 -> 2212 bytes
+ test/api/hb-subset-test.h                          |   3 +-
+ test/api/test-subset-cmap.c                        |  82
+ +++++++++++++++++++++
+ test/api/test-subset-glyf.c                        |   5 +-
+ .../data/in-house/tests/myanmar-syllable.tests     |   1 -
+ 8 files changed, 87 insertions(+), 7 deletions(-)
+
+commit afb1da3a1891b7c0fdd047bcb7b3bde86e830444
+Author: Rod Sheeter <rsheeter at google.com>
+Date:   Mon Feb 12 14:37:47 2018 -0800
+
+    auto-completed the wrong gids_to_retain
+
+ src/hb-subset-plan.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 1330edc4fe3ffbf18313d6432045606865c610c4
+Author: Rod Sheeter <rsheeter at google.com>
+Date:   Mon Feb 12 14:29:23 2018 -0800
+
+    Use functions to get new gids. Avoid 0; fonttools drops it from cmap.
+
+ src/hb-ot-cmap-table.hh | 24 ++++++++++++++++++------
+ src/hb-subset-plan.cc   | 25 ++++++++++++++++++++-----
+ src/hb-subset-plan.hh   |  5 +++++
+ src/hb-subset.cc        |  2 +-
+ 4 files changed, 44 insertions(+), 12 deletions(-)
+
+commit 1639bdd33122dc8e5522b95c37660273d1fc609e
+Author: Garret Rieger <grieger at google.com>
+Date:   Mon Feb 12 13:40:42 2018 -0800
+
+    [subset] Remove test-subset, testing is planned to be done at the
+    table level here with test/subset covering the complete subsetting
+    operation.
+
+ test/api/Makefile.am   |  1 -
+ test/api/test-subset.c | 73
+ --------------------------------------------------
+ 2 files changed, 74 deletions(-)
+
+commit 4cdd1b16c99f2681eb11d626c4408eebcc1672be
+Author: Garret Rieger <grieger at google.com>
+Date:   Mon Feb 12 13:36:28 2018 -0800
+
+    [subset] added todo in test-subset-glyf.
+
+ test/api/test-subset-glyf.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 1714feef4f7ec9e758e65edcbe5d5591562f46ee
+Author: Garret Rieger <grieger at google.com>
+Date:   Mon Feb 12 13:35:17 2018 -0800
+
+    [subset] re-enable test-subset-glyf. Refactor to use common functions
+    in hb-subset-test.h
+
+ test/api/test-subset-glyf.c | 109
+ +++++++++++---------------------------------
+ 1 file changed, 27 insertions(+), 82 deletions(-)
+
+commit d8d8bd8405ec0db781c4c2bbb7ebd6ff520b3c2d
+Author: Garret Rieger <grieger at google.com>
+Date:   Mon Feb 12 13:33:55 2018 -0800
+
+    [subset] Add some helper functions for writing tests around
+    subsetting.
+
+ test/api/Makefile.am      |   2 +-
+ test/api/hb-subset-test.h | 123
+ ++++++++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 124 insertions(+), 1 deletion(-)
+
+commit e8318188c0e53a267a01c45b0fc8d29ad775738a
+Author: Garret Rieger <grieger at google.com>
+Date:   Mon Feb 12 11:38:28 2018 -0800
+
+    [subset] Fix loca generation, was previously writing the original
+    glyph starting offset.
+
+ src/hb-subset-glyf.cc | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+commit 0b94d590d971de0b44b0db941c7a3e095f15fbc9
+Author: Khaled Hosny <khaledhosny at eglug.org>
+Date:   Mon Feb 12 16:45:36 2018 +0200
+
+    Rename --with-stdcpp → --with-libstdc++
+
+    Also improve wording a bit and fix make check in --with-libstdc++=yes.
+
+ configure.ac    | 11 ++++++-----
+ src/Makefile.am | 11 ++++++++---
+ 2 files changed, 14 insertions(+), 8 deletions(-)
+
+commit a5713bc2cb4a3fd71d3bc94b9f155339b09eb71a
+Author: Rod Sheeter <rsheeter at google.com>
+Date:   Mon Feb 12 11:30:45 2018 -0800
+
+    we love all our groups
+
+ src/hb-ot-cmap-table.hh | 7 ++-----
+ 1 file changed, 2 insertions(+), 5 deletions(-)
+
+commit 692f86e569847adb332186cbb08f344ebe41fa6c
+Author: Rod Sheeter <rsheeter at google.com>
+Date:   Mon Feb 12 11:29:23 2018 -0800
+
+    drop GDEF, GPOS, GSUB, and dsig
+
+ src/hb-subset.cc | 19 +++++++++++++++++++
+ 1 file changed, 19 insertions(+)
+
+commit 83e1ef92156d8688b96d14957efcdf7601768799
+Author: Garret Rieger <grieger at google.com>
+Date:   Mon Feb 12 11:22:32 2018 -0800
+
+    [subset] Set the new number of glyphs in maxp.
+
+ src/hb-ot-maxp-table.hh |  5 +++++
+ src/hb-subset.cc        | 37 ++++++++++++++++++++++++++++++++-----
+ 2 files changed, 37 insertions(+), 5 deletions(-)
+
+commit 427f9e4b90bfadb8af13cbd27b7c3ee0153ca8b1
+Author: Garret Rieger <grieger at google.com>
+Date:   Mon Feb 12 11:18:28 2018 -0800
+
+    Don't force loca version to long.
+
+ src/hb-subset-glyf.cc | 2 --
+ 1 file changed, 2 deletions(-)
+
+commit 5df080bf155a12f98929b99438da492063ab9218
+Author: Garret Rieger <grieger at google.com>
+Date:   Mon Feb 12 10:15:59 2018 -0800
+
+    Destroy the subset plan at the end of subsetting.
+
+ src/hb-subset.cc | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 0301e5be286f5080ec34e9f30c75e73f28d0218b
+Author: Rod Sheeter <rsheeter at google.com>
+Date:   Mon Feb 12 10:12:11 2018 -0800
+
+    Build a working cmap format 12
+
+ src/hb-ot-cmap-table.hh | 13 ++++++++++++-
+ 1 file changed, 12 insertions(+), 1 deletion(-)
+
+commit ebd31d376d63c9698c0eae34ed295558f7230918
+Author: Rod Sheeter <rsheeter at google.com>
+Date:   Mon Feb 12 10:10:08 2018 -0800
+
+    subset for real
+
+ src/hb-subset.cc | 4 +---
+ 1 file changed, 1 insertion(+), 3 deletions(-)
+
+commit 62c7d677e8699143e55e7bfa0cc3c1db75f32506
+Author: Rod Sheeter <rsheeter at google.com>
+Date:   Mon Feb 12 10:09:35 2018 -0800
+
+    C-style comments
+
+ src/hb-open-file-private.hh | 15 ++++++++-------
+ 1 file changed, 8 insertions(+), 7 deletions(-)
+
+commit 91f0d51f0525097fef6173046379a89414cb515f
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Mon Feb 12 17:20:12 2018 +0330
+
+    Fix symbol exporting issue on msys2 and ✅ bringing all the bots
+    (#781)
+
+ src/Makefile.am | 14 ++++++++------
+ 1 file changed, 8 insertions(+), 6 deletions(-)
+
+commit 133e17fe2335abb77f61dbf1cff1955c21334137
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Mon Feb 12 15:24:22 2018 +0330
+
+    Minor
+
+ src/check-defs.sh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 16f5b53eec4c3238cf92438a17e6dc532e8a61f5
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Mon Feb 12 15:18:13 2018 +0330
+
+    Minor, don't skip the whole test when one .def file not found
+
+ src/check-defs.sh | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit a9b650d38407f6f2a26d8386e801600b1004d5d6
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Mon Feb 12 15:10:13 2018 +0330
+
+    Apply check-defs.sh to -icu and -subset, toward mingw fix (#780)
+
+ CMakeLists.txt    | 11 ++++++++---
+ src/Makefile.am   | 21 ++++++++++++++++-----
+ src/check-defs.sh | 12 +++++-------
+ src/gen-def.py    |  9 ++++++---
+ 4 files changed, 35 insertions(+), 18 deletions(-)
+
+commit 2efc8965506d8fd31934be1dba3322f922f3409d
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Mon Feb 12 12:00:07 2018 +0330
+
+    Add --with-stdcpp for ossfuzzer and mupdf use (#770)
+
+ configure.ac    | 12 ++++++------
+ src/Makefile.am | 14 +++++++++++++-
+ 2 files changed, 19 insertions(+), 7 deletions(-)
+
+commit 82e04758c895ce2cd6bddde5f72e592c718fcb69
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Mon Feb 12 11:56:32 2018 +0330
+
+    minor
+
+ .travis.yml | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit 7daa2822f6320801dfed09782ae46687e7c8cbb3
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Mon Feb 12 11:27:00 2018 +0330
+
+    Add Travis based Coverity trigger (#778)
+
+ .ci/trigger-coverity.sh | 13 +++++++++++++
+ .travis.yml             | 14 ++++++++++++++
+ 2 files changed, 27 insertions(+)
+
+commit 7747bdb11b0635738a14c099bfaf58461cadd79a
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sun Feb 11 19:12:52 2018 -0800
+
+    Remove linker selection from hb-ucdn
+
+    Since this is a convenience library, it's not actually linked. Or
+    so I think.
+    Hoping this might fix this Appveyor failure:
+
+    https://ci.appveyor.com/project/harfbuzz/harfbuzz/build/job/9884jyb5vryja9pw
+
+    Making all in hb-ucdn
+    make[4]: Entering directory '/c/projects/harfbuzz/src/hb-ucdn'
+      CC       libhb_ucdn_la-ucdn.lo
+      GEN      libhb-ucdn.la
+    /bin/sh: libhb_ucdn_la-ucdn.lo: command not found
+    make[4]: *** [Makefile:404: libhb-ucdn.la] Error 127
+    make[4]: Leaving directory '/c/projects/harfbuzz/src/hb-ucdn'
+    make[3]: *** [Makefile:2548: all-recursive] Error 1
+    make[3]: Leaving directory '/c/projects/harfbuzz/src'
+    make[2]: *** [Makefile:1382: all] Error 2
+    make[2]: Leaving directory '/c/projects/harfbuzz/src'
+    make[1]: *** [Makefile:486: all-recursive] Error 1
+    make[1]: Leaving directory '/c/projects/harfbuzz'
+    make: *** [Makefile:418: all] Error 2
+
+ src/hb-ucdn/Makefile.am | 11 -----------
+ 1 file changed, 11 deletions(-)
+
+commit 90d1c740c370b97dfff52420db013ed50075b984
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sun Feb 11 19:08:59 2018 -0800
+
+    Add MSVC to no-visibility list
+
+ src/hb-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 0db6c6f214a83ffeeefb7c3b77476567e534facb
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sun Feb 11 18:28:10 2018 -0800
+
+    Add Sun compiler to no-visibility as well
+
+    Fixes https://github.com/harfbuzz/harfbuzz/pull/776
+
+ src/hb-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit d33ba163611c42acd0125472191ea40745f905eb
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sun Feb 11 18:26:41 2018 -0800
+
+    Fix more warnings
+
+ test/api/test-buffer.c | 14 +++++++-------
+ 1 file changed, 7 insertions(+), 7 deletions(-)
+
+commit dde6448379c9eeb0fc7cc476688002be661229b8
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sun Feb 11 18:24:22 2018 -0800
+
+    Another try at fixing multiple-defintion of NullPool
+
+    This one might do it...
+
+ src/hb-open-type-private.hh | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+commit b5f25844fbdd3167051c8d3586b404ae7f077b3b
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sun Feb 11 19:49:18 2018 -0600
+
+    [docs] Minor update
+
+ docs/harfbuzz-sections.txt | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit 41906cd5efc2fe17f5fff3fa5fe8488e0cdc6399
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sun Feb 11 19:46:06 2018 -0600
+
+    [subset] Another fixup
+
+    I broke this in c31fcf4c58d96eb7d9781a986991b1a79ac7be44
+
+ src/hb-ot-cmap-table.hh  | 2 +-
+ test/subset/run-tests.py | 1 +
+ 2 files changed, 2 insertions(+), 1 deletion(-)
+
+commit cd32177a322b5fd70c92f67f21b64686bf5d5533
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sun Feb 11 19:34:05 2018 -0600
+
+    Try at fixing multiple-definition of NullPool
+
+    If we don't have visibility, make NullPool static.
+
+ src/hb-open-type-private.hh | 8 +++++++-
+ src/hb-ot-layout.cc         | 2 ++
+ src/hb-private.hh           | 4 +---
+ 3 files changed, 10 insertions(+), 4 deletions(-)
+
+commit 3d421ce30713582484471baba76470c84dabc118
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sun Feb 11 19:01:44 2018 -0600
+
+    [subset] Use auto_array_t where it does make sense
+
+    Better fix for https://github.com/harfbuzz/harfbuzz/pull/775
+
+ src/hb-subset-plan.cc | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit 9aa2eb61e6cb3e4308140bed8a8531877ffd6adf
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sun Feb 11 19:00:42 2018 -0600
+
+    Minor
+
+ src/hb-ot-cmap-table.hh | 7 +++----
+ 1 file changed, 3 insertions(+), 4 deletions(-)
+
+commit ae6d0259b4f075885070f833d0f2a96333bf4af3
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Sun Feb 11 15:40:55 2018 +0330
+
+    Install fonttools on two bots and enable cmake hb-subset test (#777)
+
+ .circleci/config.yml       | 6 ++++--
+ test/subset/CMakeLists.txt | 8 ++++----
+ 2 files changed, 8 insertions(+), 6 deletions(-)
+
+commit c8d4c2e32f1cea610a9c91dc6b0c32e9ffe84f20
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Sun Feb 11 13:15:44 2018 +0330
+
+    Initialize bad_indices on hb-subset (#775)
+
+ src/hb-subset-plan.cc | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 5845e5ca3bac21c0b03e71eab282b02fb7e868a4
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Sun Feb 11 12:03:33 2018 +0330
+
+    fix gobject compile issue (#773)
+
+ src/hb-gobject-structs.h | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 9b5af3ec7f80a7793d5d3891e762d83026de0a5b
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sat Feb 10 21:50:26 2018 -0600
+
+    [gpos] Adjust mark attachment heuristic
+
+    Hopefully it...
+    fixes https://github.com/harfbuzz/harfbuzz/issues/740
+
+ src/hb-ot-layout-gpos-table.hh | 9 +++++++--
+ 1 file changed, 7 insertions(+), 2 deletions(-)
+
+commit 70b06cc6e71e15f0d7550f67b113eed5e6f30a5f
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sat Feb 10 16:13:06 2018 -0600
+
+    More fixes
+
+ util/hb-subset.cc | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 6c1848b1e3b8969afc441f094b0d7b64b4b14933
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sat Feb 10 15:52:35 2018 -0600
+
+    Misc warning fixes
+
+ test/api/test-blob.c   |  2 +-
+ test/api/test-buffer.c | 14 +++++++-------
+ test/api/test-ot-tag.c |  2 +-
+ 3 files changed, 9 insertions(+), 9 deletions(-)
+
+commit 7039803b51f23cb15dd7e12b105c379bd2e38d71
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sat Feb 10 15:47:50 2018 -0600
+
+    Fix djgpp bot
+
+ src/hb-subset-glyf.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit cdab20df1e55da196ffc6bc00d580e5ef74c1975
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sat Feb 10 15:45:17 2018 -0600
+
+    Minor
+
+ src/hb-ot-layout.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 203b647530b1550388bb3ce2f67e3b17e019d3e4
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Sun Feb 11 01:00:03 2018 +0330
+
+    Favor use of static instead HB_INTERNAL
+
+ src/hb-subset-glyf.cc | 8 ++++----
+ src/hb-subset-plan.cc | 4 ++--
+ src/hb-subset.cc      | 2 +-
+ 3 files changed, 7 insertions(+), 7 deletions(-)
+
+commit 4c5bdb4b39a723b624346d9b9ff9ace964fff0fe
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sat Feb 10 15:40:54 2018 -0600
+
+    [test] Disable test-subset-glyf for now
+
+ test/api/test-subset-glyf.c | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+commit 43314ff4c05076decbd1eb07ed78f732b6ebcba9
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sat Feb 10 15:40:03 2018 -0600
+
+    More fixes
+
+    test-subset-glyf still failing. No idea why :(
+
+ src/hb-subset.cc            |  3 +--
+ test/api/test-subset-glyf.c | 26 ++++++++++++++++----------
+ 2 files changed, 17 insertions(+), 12 deletions(-)
+
+commit a981d798eab41b6a7c6484776f04fe178bd536ba
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sat Feb 10 15:17:28 2018 -0600
+
+    Fix more build issues
+
+    Hopefully most bots come back with this...
+
+ src/check-libstdc++.sh   |  5 +++--
+ src/check-symbols.sh     |  2 +-
+ src/hb-buffer.h          |  1 -
+ src/hb-gobject-structs.h |  6 ++++++
+ src/hb-subset-plan.cc    | 10 +++++++---
+ src/hb-subset.cc         |  6 +++---
+ 6 files changed, 20 insertions(+), 10 deletions(-)
+
+commit 6c4ca6135a2ce846431b0ede6a288d3b2f97167e
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Sun Feb 11 00:42:06 2018 +0330
+
+    Hide more symbols of hb-subset (#771)
+
+ src/hb-subset-plan.cc | 2 +-
+ src/hb-subset.cc      | 6 +++---
+ 2 files changed, 4 insertions(+), 4 deletions(-)
+
+commit c31fcf4c58d96eb7d9781a986991b1a79ac7be44
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sat Feb 10 14:20:10 2018 -0600
+
+    [subset] Replace auto_array with prealloced_array
+
+    auto_array has constructor/destructor. Cannot be used in POD object,
+    as the clang
+    bots all noticed...
+
+ src/hb-ot-cmap-table.hh |  8 ++++----
+ src/hb-subset-glyf.cc   |  6 +++---
+ src/hb-subset-plan.cc   | 23 +++++++++++------------
+ src/hb-subset-plan.hh   |  9 +++------
+ 4 files changed, 21 insertions(+), 25 deletions(-)
+
+commit 931d67900ee6d96b5962a475c1b71a58b821bcba
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sat Feb 10 14:11:16 2018 -0600
+
+    Fix some other bots
+
+ src/hb-subset-glyf.cc | 5 ++---
+ 1 file changed, 2 insertions(+), 3 deletions(-)
+
+commit 4011d885b7fca87c717fdaa4bd0318a42308865a
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sat Feb 10 14:09:06 2018 -0600
+
+    [util] Remove use of ssize_t which was failing on MSVC
+
+ util/hb-subset.cc | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit bfa871634ce9ef9f4ed18348d898686952d6cbe3
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sat Feb 10 13:37:28 2018 -0600
+
+    Minor
+
+ src/hb-subset-glyf.hh | 2 +-
+ src/hb-subset-plan.hh | 2 +-
+ src/hb-subset.cc      | 3 +--
+ src/hb-subset.h       | 2 +-
+ 4 files changed, 4 insertions(+), 5 deletions(-)
+
+commit 844f48ea9a72d28e2c088497f6c403c54e1751a8
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Sat Feb 10 23:13:12 2018 +0330
+
+    Fix symbol exporting and libstdc++ linkage of hb-subset (#769)
+
+ CMakeLists.txt          |  6 ++----
+ src/Makefile.am         |  3 +++
+ src/check-defs.sh       |  2 +-
+ src/check-libstdc++.sh  | 20 +++++++++++---------
+ src/check-symbols.sh    | 28 +++++++++++++++-------------
+ src/hb-subset-glyf.cc   |  8 ++++----
+ src/hb-subset-glyf.hh   |  2 +-
+ src/hb-subset-plan.cc   |  4 ++--
+ src/hb-subset-plan.hh   |  8 ++++----
+ src/hb-subset.cc        |  2 +-
+ src/hb-ucdn/Makefile.am | 11 +++++++++++
+ 11 files changed, 55 insertions(+), 39 deletions(-)
+
+commit 91519c6a5b130ced569cedc3710ab395b663240d
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sat Feb 10 13:35:17 2018 -0600
+
+    [aat] Add buffer messages
+
+ src/hb-aat-layout-morx-table.hh | 8 ++++++++
+ 1 file changed, 8 insertions(+)
+
+commit af274507c4f4c5a582543affa71d81a87d6d9151
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sat Feb 10 13:25:49 2018 -0600
+
+    Minor
+
+ src/hb-private.hh | 15 ++++++---------
+ 1 file changed, 6 insertions(+), 9 deletions(-)
+
+commit 570d523761b23a3c668d9071712d5f10944d21fc
+Merge: 71130a20 d18decd2
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sat Feb 10 13:24:22 2018 -0600
+
+    [subset] Merge remote-tracking branch 'googlefonts/master'
+
+commit 71130a20fae7c256b0ab1aa397cc1ac2d11dd487
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sat Feb 10 13:15:57 2018 -0600
+
+    Replace Supplier.advance with Supplier::operator+=
+
+ src/hb-open-file-private.hh        |  4 ++--
+ src/hb-open-type-private.hh        |  7 ++++---
+ src/hb-ot-layout-common-private.hh |  4 ++--
+ src/hb-ot-layout-gsub-table.hh     | 10 +++++-----
+ 4 files changed, 13 insertions(+), 12 deletions(-)
+
+commit d0f3e7f59719bdb6a2105ee85a8f3ee799741dab
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sat Feb 10 12:45:28 2018 -0600
+
+    [util] Use setlinebuf() if present
+
+    To work around mysterious bug on OS X.
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/727
+
+ configure.ac    |  6 ++----
+ util/options.cc | 12 ++++++++++--
+ 2 files changed, 12 insertions(+), 6 deletions(-)
+
+commit ad575a5f47a51ee553710873ac2672479b76ba5e
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Sat Feb 10 19:50:11 2018 +0330
+
+    Fix cast warnings on clang (#768)
+
+ src/hb-open-type-private.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit d18decd2013f24f315dbd3b15cdd80c5a734e7e9
+Author: Garret Rieger <grieger at google.com>
+Date:   Fri Feb 9 18:41:21 2018 -0800
+
+    In glyf subsetting add suport for writing out a short loca table
+    when possible.
+
+ src/hb-subset-glyf.cc | 42 +++++++++++++++++++++++++++++++++---------
+ 1 file changed, 33 insertions(+), 9 deletions(-)
+
+commit 9275bd03ea427eb607dde6a8e65f78a350b88323
+Author: Rod Sheeter <rsheeter at google.com>
+Date:   Fri Feb 9 17:33:34 2018 -0800
+
+    First pass at building a cmap
+
+ src/hb-ot-cmap-table.hh | 103
+ ++++++++++++++++++++++++++++++++++++++++++++----
+ src/hb-subset.cc        |  37 +++++++++--------
+ 2 files changed, 115 insertions(+), 25 deletions(-)
+
+commit d2170d14780ad6f8e0d17a1e011445c3bcc20871
+Author: Garret Rieger <grieger at google.com>
+Date:   Fri Feb 9 17:24:16 2018 -0800
+
+    Check for failures from add table.
+
+ src/hb-subset.cc | 9 ++++-----
+ 1 file changed, 4 insertions(+), 5 deletions(-)
+
+commit 4816064c0e5464d032a55001a959a9abcef7f70e
+Author: Rod Sheeter <rsheeter at google.com>
+Date:   Fri Feb 9 17:14:37 2018 -0800
+
+    add missing return
+
+ src/hb-private.hh | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit 0089443756cdcef0182e55cf8480b96a64d31cc7
+Author: Garret Rieger <grieger at google.com>
+Date:   Fri Feb 9 16:22:09 2018 -0800
+
+    Keep a second set of glyph ids in subset plan which is sorted by
+    glyph id and always has gid 0
+
+ src/hb-subset-glyf.cc |  2 +-
+ src/hb-subset-plan.cc | 34 +++++++++++++++++++++++++---------
+ src/hb-subset-plan.hh |  1 +
+ 3 files changed, 27 insertions(+), 10 deletions(-)
+
+commit 3bc81558d836e27e77bda0d6da9c71f530719579
+Author: Garret Rieger <grieger at google.com>
+Date:   Fri Feb 9 16:06:33 2018 -0800
+
+    Formatting for hb-subset-plan.
+
+ src/hb-subset-plan.cc | 51
+ +++++++++++++++++++++++++++------------------------
+ 1 file changed, 27 insertions(+), 24 deletions(-)
+
+commit 8cef3a61995317d3a5724221108647d7e66fe24a
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Feb 9 16:04:23 2018 -0600
+
+    Try fixing build with Sun Studio
+
+    Trying to fix:
+    https://circleci.com/gh/harfbuzz/harfbuzz/6635
+
+    Also part of:
+    https://github.com/harfbuzz/harfbuzz/issues/630
+
+ src/hb-private.hh | 9 ++++++++-
+ 1 file changed, 8 insertions(+), 1 deletion(-)
+
+commit 86aa4b3ba7cd075f01614874dae88a771b8c54fd
+Author: Garret Rieger <grieger at google.com>
+Date:   Fri Feb 9 13:54:43 2018 -0800
+
+    Return empty face on hb_subset failure instead of null. Plus some
+    minor cleanups for _add_head_and_set_loca_version
+
+ src/hb-subset.cc | 11 +++++------
+ 1 file changed, 5 insertions(+), 6 deletions(-)
+
+commit d45f240e4e330cedad737fdb792b311c37a19e32
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Feb 9 15:51:45 2018 -0600
+
+    Typo
+
+ src/hb-buffer.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 3b7aa651b4714b996816023a4929c0289065493f
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Feb 9 15:43:20 2018 -0600
+
+    [docs] Improve UNSAFE_TO_BREAK docs
+
+ src/hb-buffer.h | 17 +++++++++++++++--
+ 1 file changed, 15 insertions(+), 2 deletions(-)
+
+commit 671f0a7733a496eb46b08dc88c3c46b804cdd895
+Author: bungeman <bungeman at chromium.org>
+Date:   Thu Feb 1 13:31:25 2018 -0500
+
+    Documentation for HB_GLYPH_FLAG_UNSAFE_TO_BREAK.
+
+    HB_GLYPH_FLAG_UNSAFE_TO_BREAK means that the glyph with this flag is
+    somehow affected by the previous logical glyph (the previous index
+    in the buffer if ltr and the next index if the buffer is rtl). If
+    these two glyphs are separated by a break (line or otherwise) then the
+    underlying text should be re-shaped on both sides up to corresponding
+    position in the text of some glyph not marked with this flag.
+
+ src/hb-buffer.h | 6 ++++++
+ 1 file changed, 6 insertions(+)
+
+commit 1582eabee6017839518b821ef93a329a0a86a453
+Author: Garret Rieger <grieger at google.com>
+Date:   Fri Feb 9 12:52:08 2018 -0800
+
+    Update head table with loca format selected by glyf+loca subsetting.
+
+ src/hb-subset-glyf.cc |  7 +++----
+ src/hb-subset-glyf.hh |  1 +
+ src/hb-subset.cc      | 37 +++++++++++++++++++++++++++++++++++--
+ 3 files changed, 39 insertions(+), 6 deletions(-)
+
+commit 335bbaa66f66e86d417cc123a2bf397e8b834f64
+Author: Garret Rieger <grieger at google.com>
+Date:   Fri Feb 9 10:55:15 2018 -0800
+
+    Remove uneeded code in hb-subset.
+
+ src/hb-subset.cc | 19 -------------------
+ 1 file changed, 19 deletions(-)
+
+commit 3346ba9cd5198d27c7416b8c71fecb6c8d3cb335
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Feb 9 11:05:17 2018 -0600
+
+    [test/text-rendering-tests] Update from upstream
+
+ .../text-rendering-tests/fonts/TestMORXTwentysix.ttf  | Bin 3260 ->
+ 3252 bytes
+ 1 file changed, 0 insertions(+), 0 deletions(-)
+
+commit 1cd98d05e07498653ba60a68b6342d1a90429eba
+Author: Rod Sheeter <rsheeter at google.com>
+Date:   Thu Feb 8 19:39:57 2018 -0800
+
+    Create the groups for a cmap format12. Does not yet build the
+    actual table.
+
+ src/hb-ot-cmap-table.hh | 25 +++++++++++++++++++++++++
+ 1 file changed, 25 insertions(+)
+
+commit 59c658c8d53481990fe0efa66422353d0687474b
+Author: Rod Sheeter <rsheeter at google.com>
+Date:   Thu Feb 8 19:22:47 2018 -0800
+
+    capture codepoints sorted so we can use them for cmap later. one
+    day we will have a map
+
+ src/hb-ot-cmap-table.hh | 14 ---------
+ src/hb-private.hh       | 61 +++++++++++++++++++++++++---------------
+ src/hb-subset-glyf.cc   | 16 +++++------
+ src/hb-subset-plan.cc   | 75
+ ++++++++++++++++++++++++++++++++++---------------
+ src/hb-subset-plan.hh   |  8 ++++--
+ src/hb-subset.cc        | 29 ++++++++++++-------
+ 6 files changed, 123 insertions(+), 80 deletions(-)
+
+commit 8431c38cdc05ddcddb1aa5fbb72a95446b500fd2
+Author: Rod Sheeter <rsheeter at google.com>
+Date:   Thu Feb 8 19:20:58 2018 -0800
+
+    remove output noise
+
+ util/hb-subset.cc | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit 5cca0c07afbe9ab4b28d333f6f853063ecd75aff
+Author: Rod Sheeter <rsheeter at google.com>
+Date:   Thu Feb 8 19:05:46 2018 -0800
+
+    fix comment
+
+ src/hb-open-file-private.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit a19138e668e77a0c05da2ab065c5366c8359b377
+Author: Rod Sheeter <rsheeter at google.com>
+Date:   Thu Feb 8 19:03:41 2018 -0800
+
+    comment the serialization of table
+
+ src/hb-open-file-private.hh | 8 ++++++++
+ 1 file changed, 8 insertions(+)
+
+commit 5a34114f9685680d4a8cdf85a8ac90172c5620d7
+Author: Garret Rieger <grieger at google.com>
+Date:   Thu Feb 8 18:32:24 2018 -0800
+
+    Add an extra entry to the end of the loca table to identify the end
+    of the last glyph's data.
+
+ src/hb-subset-glyf.cc | 7 ++++++-
+ 1 file changed, 6 insertions(+), 1 deletion(-)
+
+commit aac7d962120aa137385324b33a173df4f19fd80b
+Author: Garret Rieger <grieger at google.com>
+Date:   Thu Feb 8 18:18:16 2018 -0800
+
+    Apply per table subsetting while building the new face in hb_subset.
+
+ src/hb-subset-glyf.cc |   1 +
+ src/hb-subset.cc      | 105
+ ++++++++++++++++++++++++++++++--------------------
+ 2 files changed, 65 insertions(+), 41 deletions(-)
+
+commit 3e81832432a1cae0dc28242bb6ff279753effd27
+Author: Garret Rieger <grieger at google.com>
+Date:   Thu Feb 8 15:55:12 2018 -0800
+
+    Disable subset tests on cmake for now.
+
+ test/subset/CMakeLists.txt | 7 ++++---
+ 1 file changed, 4 insertions(+), 3 deletions(-)
+
+commit 2f941053111d60433ab39cc70edd69c962896961
+Author: Garret Rieger <grieger at google.com>
+Date:   Thu Feb 8 15:55:12 2018 -0800
+
+    Disable subset tests on cmake for now.
+
+ test/subset/CMakeLists.txt | 7 ++++---
+ 1 file changed, 4 insertions(+), 3 deletions(-)
+
+commit e081c9e8fc84843740c8a55b49403acc3fe4f0b7
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Feb 8 17:44:24 2018 -0600
+
+    Oops!
+
+ test/subset/run-tests.py | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 1c49afe179e7e1884ceeae1d93e50fa51f18f894
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Feb 8 17:38:58 2018 -0600
+
+    Whitespace
+
+ test/subset/run-tests.py | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 9682ef135f16cb3368b9c5970fdcec71301b687e
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Feb 8 17:35:57 2018 -0600
+
+    Minor fixups
+
+ CMakeLists.txt              | 2 +-
+ src/hb-ot-cmap-table.hh     | 6 +++---
+ src/hb-subset.cc            | 6 +++---
+ test/api/hb-test.h          | 5 +++++
+ test/api/test-subset-glyf.c | 4 ----
+ test/api/test-subset.c      | 4 ----
+ 6 files changed, 12 insertions(+), 15 deletions(-)
+
+commit 35eeb893efcdfa2bf6a136cd2911d564334e573c
+Author: Garret Rieger <grieger at google.com>
+Date:   Thu Feb 8 15:17:34 2018 -0800
+
+    Don't include subset headers in libharfbuzz.
+
+ CMakeLists.txt | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit 42234424a0fc43d298be082b4c7b1e288e94bbb6
+Author: Garret Rieger <grieger at google.com>
+Date:   Thu Feb 8 15:11:15 2018 -0800
+
+    Fix include gaurds and include order in hb-subset-glyf and
+    hb-subset-plan
+
+ src/hb-subset-glyf.hh | 6 ++++--
+ src/hb-subset-plan.cc | 2 +-
+ src/hb-subset-plan.hh | 5 +++--
+ 3 files changed, 8 insertions(+), 5 deletions(-)
+
+commit 0f3c756cbfe8a263ee388481acac7a24d9684c44
+Author: Garret Rieger <grieger at google.com>
+Date:   Thu Feb 8 14:59:32 2018 -0800
+
+    Add CMake config for building a separate harfbuzz-subset.
+
+ CMakeLists.txt          | 17 ++++++++++++++---
+ test/api/CMakeLists.txt |  2 +-
+ 2 files changed, 15 insertions(+), 4 deletions(-)
+
+commit d4d120ad79ff65c6987ca127da5d9ee30740b0b1
+Author: Garret Rieger <grieger at google.com>
+Date:   Thu Feb 8 14:26:18 2018 -0800
+
+    Skip subset to fonttools comparison test if TTX is not present.
+
+ test/subset/run-tests.py | 5 +++++
+ 1 file changed, 5 insertions(+)
+
+commit 29d915284e46fb9be01221a88c9e969080daa1b2
+Author: Garret Rieger <grieger at google.com>
+Date:   Thu Feb 8 11:31:27 2018 -0800
+
+    Whitespace
+
+ test/subset/run-tests.py | 16 ++++++++--------
+ 1 file changed, 8 insertions(+), 8 deletions(-)
+
+commit f9420d9effcfb3464d4b99e54decb3d90e4a410d
+Author: Garret Rieger <grieger at google.com>
+Date:   Thu Feb 8 11:30:36 2018 -0800
+
+    In the hb-subset to fontTools comparison, use ttx to compare the
+    fonts. This allows for some binary differences such as re-ordered
+    tables.
+
+ test/subset/run-tests.py | 21 ++++++++++++++-------
+ 1 file changed, 14 insertions(+), 7 deletions(-)
+
+commit 8e9fd6f1ab491519cf7205467bc5d20056fce99d
+Author: Garret Rieger <grieger at google.com>
+Date:   Wed Feb 7 19:01:21 2018 -0800
+
+    Implement basic loca (long version only) subsetting.
+
+ src/hb-subset-glyf.cc | 66
+ +++++++++++++++++++++++++++++++++++----------------
+ 1 file changed, 46 insertions(+), 20 deletions(-)
+
+commit f9c665fed1347f7af6d36ba129f9d174f4ac54dc
+Author: Garret Rieger <grieger at google.com>
+Date:   Wed Feb 7 16:53:18 2018 -0800
+
+    Update interface to hb-subset-glyf to subset glyf and loca.
+
+ src/hb-subset-glyf.cc | 10 +++++++---
+ src/hb-subset-glyf.hh |  7 ++++---
+ src/hb-subset.cc      |  7 +++++--
+ 3 files changed, 16 insertions(+), 8 deletions(-)
+
+commit f2ceb5ee4d745e0e6e754f0b0ea16b29dbedbf1b
+Author: Garret Rieger <grieger at google.com>
+Date:   Wed Feb 7 16:47:31 2018 -0800
+
+    Comment out failing assert in test-subset-glyf for now. Should be
+    re-enabled once hb_subset is writing out a new face.
+
+ test/api/test-subset-glyf.c | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit 89dbebd4ad948ddad8e10323315a809c11d7cafa
+Author: Garret Rieger <grieger at google.com>
+Date:   Wed Feb 7 16:32:56 2018 -0800
+
+    Add a basic test for glyf subsetting.
+
+ test/api/Makefile.am                  |   4 +
+ test/api/fonts/Roboto-Regular.abc.ttf | Bin 0 -> 2460 bytes
+ test/api/fonts/Roboto-Regular.ac.ttf  | Bin 0 -> 2268 bytes
+ test/api/test-subset-glyf.c           | 134
+ ++++++++++++++++++++++++++++++++++
+ 4 files changed, 138 insertions(+)
+
+commit 217ed5e3c885532fa8b332cc0d0f9cb4eef32e2b
+Author: Garret Rieger <grieger at google.com>
+Date:   Wed Feb 7 16:30:07 2018 -0800
+
+    Cleanups in hb-subset-glyf and hb-subset-plan.
+
+ src/hb-subset-glyf.cc | 30 +++++++++++++++---------------
+ src/hb-subset-plan.hh |  2 +-
+ 2 files changed, 16 insertions(+), 16 deletions(-)
+
+commit 13193a9b97302480cc11787787fa6826a97be4bb
+Author: Rod Sheeter <rsheeter at google.com>
+Date:   Wed Feb 7 16:09:52 2018 -0800
+
+    move to the hb_face_t dest pattern
+
+ src/hb-ot-cmap-table.hh |  7 ++++++-
+ src/hb-subset.cc        | 28 +++++++++++++---------------
+ 2 files changed, 19 insertions(+), 16 deletions(-)
+
+commit 0859a006695097c2a66a07284f3cc5b8de8edb05
+Author: Rod Sheeter <rsheeter at google.com>
+Date:   Wed Feb 7 15:59:36 2018 -0800
+
+    sketch a subset<T> and call it for cmap. Add subset to cmap, albeit
+    not working even for the msot basic case just yet
+
+ src/hb-ot-cmap-table.hh | 18 ++++++++++++++++--
+ src/hb-subset.cc        | 30 ++++++++++++++++++++++++++++++
+ 2 files changed, 46 insertions(+), 2 deletions(-)
+
+commit c1ab95dd907b1c4a2e2de17447683fe803fe4087
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Feb 8 17:22:07 2018 -0600
+
+    Fix overflow in space fallback shaping
+
+    Fixes https://bugs.chromium.org/p/chromium/issues/detail?id=657466
+
+ src/hb-ot-shape-fallback.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit b220b5a44425db387b2149c4904a43ab369a2d6a
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Feb 8 17:14:52 2018 -0600
+
+    Avoid undefined-behavior in fallback mark positioning
+
+    Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=5584
+
+ src/hb-ot-shape-fallback.cc | 11 ++++++-----
+ 1 file changed, 6 insertions(+), 5 deletions(-)
+
+commit 3b68a03a1c5a23adbc73f4508009dd5b72bc9d81
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Feb 8 17:00:37 2018 -0600
+
+    [fuzzer] Minor
+
+ src/Makefile.am | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 194140d3f352b53b95757cccb7fff50425747cd6
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Feb 8 16:27:57 2018 -0600
+
+    [util] Minor
+
+ util/hb-subset.cc |  2 +-
+ util/options.hh   | 10 ++++++++--
+ 2 files changed, 9 insertions(+), 3 deletions(-)
+
+commit 5021ba2a2186a77d7d70be5602b960d14634d8b2
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Feb 8 15:11:28 2018 -0600
+
+    [aat] Minor
+
+ src/hb-aat-layout-common-private.hh | 10 +++++-----
+ src/hb-aat-layout-morx-table.hh     |  7 +++----
+ 2 files changed, 8 insertions(+), 9 deletions(-)
+
+commit 1242ad8424f5e8357fe6fd2143430aa8cfaf0954
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Feb 8 14:10:01 2018 -0600
+
+    [test/text-rendering-tests] Update from upstream
+
+ test/shaping/data/text-rendering-tests/DISABLED          |   2 ++
+ test/shaping/data/text-rendering-tests/Makefile.sources  |   2 ++
+ .../text-rendering-tests/fonts/TestMORXTwentyfive.ttf    | Bin 0 ->
+ 3260 bytes
+ .../text-rendering-tests/fonts/TestMORXTwentysix.ttf     | Bin 0 ->
+ 3260 bytes
+ .../data/text-rendering-tests/tests/MORX-25.tests        |   9 +++++++++
+ .../data/text-rendering-tests/tests/MORX-26.tests        |   2 ++
+ 6 files changed, 15 insertions(+)
+
+commit 77ad8b5c8b3a9148cf2944abdd494618e642ee2c
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Wed Feb 7 21:54:33 2018 -0600
+
+    TODO
+
+ src/hb-open-file-private.hh | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 941bbd9f257367f838e55d079751c6059974fe2f
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Wed Feb 7 21:49:01 2018 -0600
+
+    [subset] Fix thinko
+
+ src/hb-open-file-private.hh | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+commit 931f8b7eb5e740ce81e5be6bfec60dbe3ac7ebc4
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Wed Feb 7 21:42:03 2018 -0600
+
+    Fix another thinko
+
+ src/hb-open-file-private.hh | 2 +-
+ src/hb-private.hh           | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+commit 39b86695cf56736170c772424c9a8b75bca0254c
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Wed Feb 7 21:37:03 2018 -0600
+
+    [subset] Fix thinko
+
+ src/hb-subset.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit eeffabc87572193a9e95f22647e80ae44e5a0089
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Wed Feb 7 21:34:05 2018 -0600
+
+    Build
+
+ src/Makefile.am | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit c479a59988b0cf3e557e22e97e1977962c803fa7
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Wed Feb 7 21:13:10 2018 -0600
+
+    [subset] Assemble font
+
+ src/hb-open-file-private.hh | 50
+ +++++++++++++++++++++++++++++++++++++++++++-
+ src/hb-open-type-private.hh | 33 +++++++++++++++++++++++------
+ src/hb-ot-map-private.hh    | 10 ++++-----
+ src/hb-private.hh           | 20 +++++++++++-------
+ src/hb-set-private.hh       |  8 +++----
+ src/hb-subset.cc            | 51
+ +++++++++++++++++++++++++++++++++++++++------
+ test/api/test-subset.c      |  9 ++++++--
+ 7 files changed, 150 insertions(+), 31 deletions(-)
+
+commit 34ac3548b7c9dbc57f277cf9a7a337cd1a8a04bb
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Wed Feb 7 18:07:45 2018 -0600
+
+    [set] Respect stride
+
+    Ouch!
+
+ src/hb-set-private.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 577becaf7b5ccd9de8ba533447f944427b9e4452
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Wed Feb 7 17:38:40 2018 -0600
+
+    [subset] Fixup
+
+ src/hb-subset.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit c9acab3cfbe4a21e86ad309ebb452f103b1c1b04
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Wed Feb 7 17:12:55 2018 -0600
+
+    Whitespace
+
+ src/hb-open-file-private.hh | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 7fd0b61dee18380c302009f8be9cd68dadab7308
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Wed Feb 7 16:44:52 2018 -0600
+
+    [subset] Create new face and copy all tables to it
+
+    test-subset fails now because subset-face does not know how to
+    compile itself.
+
+ src/hb-subset.cc | 37 ++++++++++++++++++++++++++-----------
+ 1 file changed, 26 insertions(+), 11 deletions(-)
+
+commit 4e1abe2ce0b5163cbbbb8f8be0e9f7deba5ab2cb
+Author: Garret Rieger <grieger at google.com>
+Date:   Wed Feb 7 13:28:11 2018 -0800
+
+    Refactor subset glyf to remove multiple calls to glyf.fini()
+
+ src/hb-subset-glyf.cc | 52
+ +++++++++++++++++++++++++++++----------------------
+ 1 file changed, 30 insertions(+), 22 deletions(-)
+
+commit 0a5d1440f829f07454592adde9dd3aa93ad74442
+Author: Garret Rieger <grieger at google.com>
+Date:   Wed Feb 7 13:09:54 2018 -0800
+
+    Add implementation of glyf subsetting.
+
+ src/hb-subset-glyf.cc | 81
+ +++++++++++++++++++++++++++++++++++++++++++++++----
+ 1 file changed, 76 insertions(+), 5 deletions(-)
+
+commit 05d65baa1bb64664ba838993fd35f3899d52eb8d
+Author: Garret Rieger <grieger at google.com>
+Date:   Wed Feb 7 10:55:30 2018 -0800
+
+    Extract glyf offset calculation into it's own method.
+
+ src/hb-ot-glyf-table.hh | 26 ++++++++++++++++++--------
+ 1 file changed, 18 insertions(+), 8 deletions(-)
+
+commit 6d7c6e19dc769cf9997b7c1f8a4598eb44ca0b3c
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Wed Feb 7 14:09:56 2018 -0600
+
+    Fix two undefined-behavior issues
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/761
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/762
+
+ src/hb-ot-hmtx-table.hh              |  4 ++--
+ src/hb-ot-layout-gsubgpos-private.hh | 10 +++++-----
+ 2 files changed, 7 insertions(+), 7 deletions(-)
+
+commit b87cbe2bec1d589621ba143af59443f63230ffeb
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Wed Feb 7 14:11:26 2018 -0500
+
+    Try fixing build for platforms that have no visibility attributes
+
+ src/hb-private.hh | 1 +
+ src/hb-subset.cc  | 2 ++
+ src/main.cc       | 2 ++
+ 3 files changed, 5 insertions(+)
+
+commit f70100417c71cff071c119607a7b75dcead05a05
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Wed Feb 7 13:58:23 2018 -0500
+
+    [test] Minor
+
+ test/api/test-ot-tag.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 6804b61d2e49fcf9eac9fa0b86497ba91b220bee
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Wed Feb 7 13:47:35 2018 -0500
+
+    [subset] Add hb_subset_face
+
+    It's a hb_face_t that has add_table() and in the future knows how to
+    compile itself into a font blob.
+
+ src/hb-private.hh |  9 ++++++
+ src/hb-subset.cc  | 88
+ +++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 97 insertions(+)
+
+commit af02812fc51812a7e2265a1100bbca1a5bf8af45
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Wed Feb 7 13:07:46 2018 -0500
+
+    [subset] Change hb_subset API to remove hb_subset_face_t
+
+ src/hb-subset-plan.cc    | 12 ++++++++---
+ src/hb-subset-plan.hh    |  2 +-
+ src/hb-subset-private.hh | 10 ----------
+ src/hb-subset.cc         | 52
+ ++++++++----------------------------------------
+ src/hb-subset.h          | 25 ++++++-----------------
+ test/api/test-subset.c   |  9 +++++----
+ util/hb-subset.cc        | 12 ++++++-----
+ 7 files changed, 36 insertions(+), 86 deletions(-)
+
+commit 2da0d87e769b2ced71e4281e336bdbca65de2b3f
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Wed Feb 7 12:44:35 2018 -0500
+
+    Remove NullPool visibility hack
+
+    We keep a separate private NullPool in libharfbuzz-subset.so
+    This can fire back later since now there are two separate null
+    objects,
+    and comparisons to the null pool can be confused.  Something to deal
+    with when it comes up. Ouch!
+
+ src/hb-open-type-private.hh | 4 +---
+ src/hb-subset.cc            | 4 ++++
+ 2 files changed, 5 insertions(+), 3 deletions(-)
+
+commit b95aa204ee284c47e63dc1e34b3c5b4bdf9e7ab7
+Author: Rod Sheeter <rsheeter at google.com>
+Date:   Wed Feb 7 09:37:06 2018 -0800
+
+    glyph ids to retain should most likely keep the glyph id not the
+    codepoint
+
+ src/hb-subset-plan.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 91428713bd6975b3bbfbdce54701f6aef5457121
+Author: Rod Sheeter <rsheeter at google.com>
+Date:   Wed Feb 7 09:35:59 2018 -0800
+
+    Remove \ns leftover from fprintf
+
+ src/hb-subset-plan.cc | 4 ++--
+ src/hb-subset.cc      | 4 ++--
+ 2 files changed, 4 insertions(+), 4 deletions(-)
+
+commit eb485bb9e90017abaf7dcdd7e39a82125d6807c3
+Author: Rod Sheeter <rsheeter at google.com>
+Date:   Wed Feb 7 09:32:36 2018 -0800
+
+    Horrid hack to assign new gids. Use DEBUG_MSG over fprintf
+
+ src/hb-subset-plan.cc | 27 +++++++++++++++++++++++----
+ src/hb-subset-plan.hh |  5 +++++
+ src/hb-subset.cc      |  9 +++++++++
+ 3 files changed, 37 insertions(+), 4 deletions(-)
+
+commit 8b80cbb1dd13e2870a956825f5dafc4419b44200
+Author: Rod Sheeter <rsheeter at google.com>
+Date:   Wed Feb 7 09:31:31 2018 -0800
+
+    Add a subset debug category
+
+ src/hb-debug.hh | 13 +++++++++++++
+ 1 file changed, 13 insertions(+)
+
+commit ee433d36fa544c3138718cc3f796b29e6df8a195
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Wed Feb 7 12:30:18 2018 -0500
+
+    [aat] Set debug lookup_index
+
+ src/hb-aat-layout-common-private.hh | 2 ++
+ src/hb-aat-layout-morx-table.hh     | 3 +++
+ 2 files changed, 5 insertions(+)
+
+commit 38df1ec8e0b457be9140c67e2c5c19153714d90e
+Author: Rod Sheeter <rsheeter at google.com>
+Date:   Wed Feb 7 07:58:58 2018 -0800
+
+    TEMPORARY: remove HB_INTERNAL from null pool so subset builds again
+
+ src/hb-open-type-private.hh | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit 53aa0e95420c5c3bfe8af21cf7956535d35b06e6
+Author: Garret Rieger <grieger at google.com>
+Date:   Tue Feb 6 17:05:22 2018 -0800
+
+    Add an instance of glyf::accelerator_t to hb-subset-glyf.
+
+ src/hb-subset-glyf.cc | 13 ++++++++++---
+ src/hb-subset-glyf.hh |  2 +-
+ src/hb-subset.cc      |  4 +---
+ 3 files changed, 12 insertions(+), 7 deletions(-)
+
+commit ef62dfed3fc7cfad7f7ce9292cb3bd1616f09384
+Author: Rod Sheeter <rsheeter at google.com>
+Date:   Tue Feb 6 17:12:17 2018 -0800
+
+    add back assert_pod
+
+ src/hb-subset-private.hh | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit d0ce3c66e2af2785203f7bbb1d4abca5c226045d
+Author: Rod Sheeter <rsheeter at google.com>
+Date:   Tue Feb 6 16:58:35 2018 -0800
+
+    Resolve codepoints:glyph ids. Does not compile; undefined reference
+    to OT::_hb_NullPool
+
+ src/hb-subset-plan.cc    | 25 +++++++++++++++++++------
+ src/hb-subset-plan.hh    |  2 +-
+ src/hb-subset-private.hh | 17 +++++++++++++++--
+ src/hb-subset.cc         | 13 ++++---------
+ 4 files changed, 39 insertions(+), 18 deletions(-)
+
+commit 6a45e5df24ccc59c5a39bf42323c9b550f49e16d
+Author: Garret Rieger <grieger at google.com>
+Date:   Tue Feb 6 16:04:09 2018 -0800
+
+    Add skeleton of hb-subset-glyf, call if from hb_subset(...)
+
+ src/Makefile.sources  |  2 ++
+ src/hb-subset-glyf.cc | 45 +++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-subset-glyf.hh | 37 +++++++++++++++++++++++++++++++++++++
+ src/hb-subset.cc      | 18 ++++++++++++++++--
+ 4 files changed, 100 insertions(+), 2 deletions(-)
+
+commit 31ec3c2ec41161c6ae75bc91d1c237bf2d245e37
+Author: Garret Rieger <grieger at google.com>
+Date:   Tue Feb 6 15:37:34 2018 -0800
+
+    Create a subset plan in hb_subset.
+
+ src/hb-subset.cc | 12 ++++++++++++
+ 1 file changed, 12 insertions(+)
+
+commit 6c52d94fd11915b76e858bc45633ee60b8c1d8f4
+Author: Rod Sheeter <rsheeter at google.com>
+Date:   Tue Feb 6 15:31:14 2018 -0800
+
+    capture the set of codepoints passed by --unicodes
+
+ util/hb-subset.cc | 17 ++++++++++++++++-
+ 1 file changed, 16 insertions(+), 1 deletion(-)
+
+commit 25e9173fe8446735f7e36ec963c7d3554c85631b
+Author: Garret Rieger <grieger at google.com>
+Date:   Mon Feb 5 17:26:25 2018 -0800
+
+    Make hb-subset-plan private.
+
+ src/Makefile.sources                        |  2 +-
+ src/hb-subset-plan.cc                       | 27
+ ++++++++++++++++-----------
+ src/{hb-subset-plan.h => hb-subset-plan.hh} | 22 +++++++++++++---------
+ 3 files changed, 30 insertions(+), 21 deletions(-)
+
+commit af46a4da5a47dd6e0dd98e1740f18e93c337e689
+Author: Garret Rieger <grieger at google.com>
+Date:   Mon Feb 5 17:14:46 2018 -0800
+
+    Move definition of hb_subset_input into hb-subset-private.hh.
+
+ src/Makefile.sources     |  1 +
+ src/hb-subset-plan.cc    |  2 +-
+ src/hb-subset-private.hh | 40 ++++++++++++++++++++++++++++++++++++++++
+ src/hb-subset.cc         | 12 ++----------
+ 4 files changed, 44 insertions(+), 11 deletions(-)
+
+commit 7481f0ce21489d2b19b2e33d05358736ddee20bf
+Author: Garret Rieger <grieger at google.com>
+Date:   Mon Feb 5 16:05:12 2018 -0800
+
+    Add codepoints to subset input.
+
+ src/hb-subset.cc       | 24 ++++++++++++++++--------
+ src/hb-subset.h        |  2 +-
+ test/api/test-subset.c |  2 +-
+ util/hb-subset.cc      |  2 +-
+ 4 files changed, 19 insertions(+), 11 deletions(-)
+
+commit 1cfe650f020cf440bf157daa9907bffd6e35bd7a
+Author: Garret Rieger <grieger at google.com>
+Date:   Mon Feb 5 15:22:30 2018 -0800
+
+    Add a basic sketch of hb-subset-plan.
+
+ src/Makefile.sources  |  2 ++
+ src/hb-subset-plan.cc | 72
+ +++++++++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-subset-plan.h  | 49 +++++++++++++++++++++++++++++++++++
+ 3 files changed, 123 insertions(+)
+
+commit 126ffdbe95020c04dc61413690febd8a56bf264f
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Wed Feb 7 12:26:41 2018 -0500
+
+    [aat] Fix debug compile
+
+ src/hb-aat-layout-common-private.hh | 6 +++++-
+ src/hb-aat-layout-morx-table.hh     | 2 +-
+ 2 files changed, 6 insertions(+), 2 deletions(-)
+
+commit 8cb8bfd5b5eff75247cd447f3766294fdff2d644
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Tue Feb 6 20:40:42 2018 +0330
+
+    [test] Fix test-subset on old distros (#758)
+
+    https://developer.gnome.org/glib/stable/glib-Testing.html#g-assert-cmpmem
+
+ test/api/test-subset.c | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit 2971e9da49d6ac07f8a9a4e9b00e167b800a5c7f
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Feb 6 11:48:04 2018 -0500
+
+    [aat] Adjust unsafe-to-break logic some more
+
+    I believe I'm happy with it now.
+
+ src/hb-aat-layout-common-private.hh | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit f49256d80f19bc265e6a197719345313ba26f9d6
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Feb 6 11:39:36 2018 -0500
+
+    [aat] Simplify unsafe-to-break logic
+
+ src/hb-aat-layout-common-private.hh | 11 +++--------
+ 1 file changed, 3 insertions(+), 8 deletions(-)
+
+commit cc1e0840baed881f2bfd8468a9645bfe94f47303
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Feb 6 10:20:48 2018 -0500
+
+    [buffer] Tweak diff re glyph_flags again
+
+    We expect the buffer to have no flags that the reference doesn't...
+    Meh. Makes MORX tests pass now. Need to better define the behavior.
+
+ src/hb-buffer.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit d49ae5154e0b069ffa2605ea3f66abb583319ec8
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Tue Feb 6 13:48:10 2018 +0330
+
+    Fix hb-buffer logic error
+
+ src/hb-buffer.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 70e13ade81a2a09e17d75bdc7e3fe45d8ec9e2c6
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Tue Feb 6 13:20:38 2018 +0330
+
+    [subset] Fix Windows issue on endlines (#756)
+
+ util/hb-subset.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit f41b92134a276716b7e2d7ef54996b30f36a10a9
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Feb 5 19:51:09 2018 -0500
+
+    Fix fallthrough compiler warning with gcc >= 7
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/755
+
+ src/hb-private.hh | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit b7b7f0ac59ec85b224e13d9e6c3c4063e731ad32
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Feb 5 19:40:31 2018 -0500
+
+    [test] Minor
+
+ test/api/Makefile.am | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit 0ff007daaa471d05cc0473beec4ba4d434b084b1
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sun Feb 4 20:22:07 2018 -0500
+
+    [subset] Minor
+
+ src/hb-subset.h | 7 +------
+ 1 file changed, 1 insertion(+), 6 deletions(-)
+
+commit fc1e82a5aef410138381bc8f5476dcff5679b464
+Merge: ae39fc81 2ea22893
+Author: Garret Rieger <grieger at google.com>
+Date:   Mon Feb 5 15:35:13 2018 -0800
+
+    Merge pull request #754 from googlefonts/master
+
+    Fix build for subsetting code.
+
+commit 2ea228935d41b55fed45b7423b69bc15b42e3abc
+Author: Garret Rieger <grieger at google.com>
+Date:   Mon Feb 5 15:10:01 2018 -0800
+
+    ssize_t -> size_t
+
+ util/hb-subset.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit c25898eb54217e2a1c681233a6b9adcd7940652e
+Author: Garret Rieger <grieger at google.com>
+Date:   Mon Feb 5 14:35:32 2018 -0800
+
+    Switch to fopen() instead of open() in subset test. open wasn't
+    compiling on windows.
+
+ util/hb-subset.cc | 13 ++++++-------
+ 1 file changed, 6 insertions(+), 7 deletions(-)
+
+commit fc04f11ce1999da042a39c5b271351223033292f
+Author: Garret Rieger <grieger at google.com>
+Date:   Mon Feb 5 11:12:33 2018 -0800
+
+    Rename HB_SUBSET_sources -> HB_SUBSET_CLI_sources to match what
+    cmake is looking for.
+
+ util/Makefile.am      | 3 +--
+ util/Makefile.sources | 2 +-
+ 2 files changed, 2 insertions(+), 3 deletions(-)
+
+commit e428f7b1c21e0a7d6b9af507d98031b8eebcbeb5
+Author: Garret Rieger <grieger at google.com>
+Date:   Mon Feb 5 10:24:16 2018 -0800
+
+    Wrap unistd.h include in ifdef.
+
+ util/hb-subset.cc | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 5f6eb1256fb6c251303d3728fc27875fe7a9ffb8
+Author: Garret Rieger <grieger at google.com>
+Date:   Mon Feb 5 10:23:38 2018 -0800
+
+    Add libharfbuzz-subset.la to linking when building api tests.
+
+ test/api/Makefile.am | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit ae39fc8171b2c26d4ae64954a8055732c9241bcc
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sun Feb 4 20:18:52 2018 -0500
+
+    [subset] Build hb-subset into separate libharfbuzz-subset.so
+
+ src/Makefile.am           | 19 +++++++++++++------
+ src/harfbuzz-subset.pc.in | 12 ++++++++++++
+ util/Makefile.am          |  2 ++
+ 3 files changed, 27 insertions(+), 6 deletions(-)
+
+commit eac20e459564134e0087497ed76b1c84195ad7e3
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sun Feb 4 20:08:50 2018 -0500
+
+    [subset] Minor
+
+ util/Makefile.am      |  2 +-
+ util/Makefile.sources |  2 +-
+ util/hb-subset.cc     | 10 +++++-----
+ 3 files changed, 7 insertions(+), 7 deletions(-)
+
+commit 257022b1789f928975b04b5d214bbe9192e11997
+Merge: 3615f344 edcd3b80
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sun Feb 4 20:01:35 2018 -0500
+
+    Merge pull request #745 from googlefonts/master
+
+    Interface for hb_subset, skeleton for the hb-subset cli, and basic
+    testing rigging.
+
+commit 3615f344ec00059972d8ce75522022b5294764a7
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sun Feb 4 17:19:58 2018 -0500
+
+    [test/text-rendering-tests] Update from upstream
+
+ test/shaping/data/text-rendering-tests/DISABLED          |   1 +
+ test/shaping/data/text-rendering-tests/Makefile.sources  |   3 ++-
+ .../text-rendering-tests/fonts/TestMORXTwentythree.ttf   | Bin 0 ->
+ 1836 bytes
+ .../data/text-rendering-tests/tests/MORX-23.tests        |   1 +
+ 4 files changed, 4 insertions(+), 1 deletion(-)
+
+commit 54e6efadd6a30587736858d3fb497ed4e5e5f252
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sun Feb 4 14:58:02 2018 -0500
+
+    [aat] Fix unsafe-to-break
+
+    At any position, if state is not zero, mark unsafe-to-break before,
+    unless we can reason it safe.
+
+    At any position, if there's an action entry for end-of-text, mark
+    unsafe to break.
+
+    Also changes buffer diff impl to allow for flag differences as long
+    as the buffer glyph flags are superset of reference glyph flags.
+
+    With this, all MORX tests pass.
+
+ src/hb-aat-layout-common-private.hh | 31 +++++++++++++++++++++++++------
+ src/hb-aat-layout-morx-table.hh     | 35
+ +++++++++++++++++++++++------------
+ src/hb-buffer.cc                    |  2 +-
+ 3 files changed, 49 insertions(+), 19 deletions(-)
+
+commit edcd3b80e9617ec8c4c4a55536938fb510b6aeba
+Author: Rod Sheeter <rsheeter at google.com>
+Date:   Sun Feb 4 12:31:24 2018 -0800
+
+    Actually call hb_subset
+
+ util/hb-subset.cc | 51
+ ++++++++++++++++++++++++++++++++++-----------------
+ 1 file changed, 34 insertions(+), 17 deletions(-)
+
+commit 7b01761adef6f64f1139b30c985aa5f52314073a
+Author: Garret Rieger <grieger at google.com>
+Date:   Fri Feb 2 17:54:11 2018 -0800
+
+    Add CMakeLists.txt to dist files for subset test.
+
+ test/subset/Makefile.am | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit f83a43b56134188c2e1f3496d40ec0cd9109f250
+Author: Garret Rieger <grieger at google.com>
+Date:   Fri Feb 2 17:50:45 2018 -0800
+
+    Add CMake configuration for all of the new subsetting code.
+
+ CMakeLists.txt             | 14 ++++++++++++++
+ src/Makefile.sources       |  9 +++++++--
+ test/CMakeLists.txt        |  1 +
+ test/subset/CMakeLists.txt |  9 +++++++++
+ util/Makefile.am           |  2 +-
+ util/Makefile.sources      |  2 +-
+ 6 files changed, 33 insertions(+), 4 deletions(-)
+
+commit 5bc0cda179bca452145d4523eeba415986edb6e3
+Author: Garret Rieger <grieger at google.com>
+Date:   Fri Feb 2 17:49:14 2018 -0800
+
+    Add missing unistd header to hb-subset.
+
+ util/hb-subset.cc | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 06fe297f2a9fc6ee98179ddd26ef089b7fdb9e74
+Author: Garret Rieger <grieger at google.com>
+Date:   Thu Feb 1 18:36:15 2018 -0800
+
+    Properly include subset test data files.
+
+ test/subset/data/Makefile.am | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 058b1260ad1105d0d8d6bf21f8f65a336e735bd2
+Author: Garret Rieger <grieger at google.com>
+Date:   Thu Feb 1 18:22:14 2018 -0800
+
+    Re-write hb-subset utility to use main-font-text driver.
+
+ test/subset/run-tests.py |  15 +++---
+ util/Makefile.sources    |   3 ++
+ util/hb-subset.cc        | 131
+ +++++++++++++++++++++++++----------------------
+ 3 files changed, 82 insertions(+), 67 deletions(-)
+
+commit ede84ffa426edb950c4ec4f89833c85475a1c64f
+Author: Garret Rieger <grieger at google.com>
+Date:   Thu Feb 1 17:17:36 2018 -0800
+
+    Whitespace
+
+ util/hb-subset.cc | 36 ++++++++++++++++++------------------
+ 1 file changed, 18 insertions(+), 18 deletions(-)
+
+commit 2763a2c5982c0db072697abe8ba01342d5977237
+Author: Garret Rieger <grieger at google.com>
+Date:   Thu Feb 1 17:14:51 2018 -0800
+
+    Include subset test files in distribution.
+
+ test/subset/Makefile.am      | 7 ++++++-
+ test/subset/data/Makefile.am | 7 +++++++
+ 2 files changed, 13 insertions(+), 1 deletion(-)
+
+commit 34fa7b3ad23b544b0914bc6002d60525224c68e1
+Author: Garret Rieger <grieger at google.com>
+Date:   Thu Feb 1 16:50:18 2018 -0800
+
+    Whitespace
+
+ src/hb-subset.h | 20 ++++++++++----------
+ 1 file changed, 10 insertions(+), 10 deletions(-)
+
+commit 8c3a6727377895f18e1b5c7076404d8aede17176
+Author: Garret Rieger <grieger at google.com>
+Date:   Wed Jan 31 15:43:24 2018 -0800
+
+    Get test-subset to pass.
+
+ src/hb-subset.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 74d39ed2639857d5f1a90d9c0d864227a6482b40
+Author: Garret Rieger <grieger at google.com>
+Date:   Wed Jan 31 15:20:52 2018 -0800
+
+    Attach add a hb_face_t to hb_subset_face_t.
+
+ src/hb-subset.cc | 17 +++++++++++++----
+ 1 file changed, 13 insertions(+), 4 deletions(-)
+
+commit 76b84c36b9560e132918adb4c0c5a0d9bdfb0978
+Author: Garret Rieger <grieger at google.com>
+Date:   Wed Jan 31 14:53:28 2018 -0800
+
+    Whitespace
+
+ test/api/Makefile.am | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit a2965f2ea5428c19be54f998ef9152c5ff6975ea
+Author: Garret Rieger <grieger at google.com>
+Date:   Wed Jan 31 14:53:09 2018 -0800
+
+    Add a basic implementation of hb-subset to enable compilation of
+    test-subset.
+
+ src/hb-subset.cc       | 146
+ +++++++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-subset.h        |   5 +-
+ test/api/Makefile.am   |   1 +
+ test/api/test-subset.c |  12 ++--
+ 4 files changed, 156 insertions(+), 8 deletions(-)
+
+commit 38af23b8df1a84f24d379d27d1a1e20f9ce07f34
+Author: Garret Rieger <grieger at google.com>
+Date:   Wed Jan 31 11:32:23 2018 -0800
+
+    Make the expected output for subsetting basics test be equal to the
+    input file for now.
+
+ .../expected/basics/Roboto-Regular.abc.default.62.ttf | Bin 1996 ->
+ 2460 bytes
+ 1 file changed, 0 insertions(+), 0 deletions(-)
+
+commit b59c08eb045db2b6c952de81510b8159a4f72fb1
+Author: Garret Rieger <grieger at google.com>
+Date:   Wed Jan 31 11:14:53 2018 -0800
+
+    Add the beginning of a unit test for hb-subset
+
+ test/api/test-subset.c | 67
+ ++++++++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 67 insertions(+)
+
+commit e9d154ac8ddd2712a34c53c95a17e469f95e5b30
+Author: Rod Sheeter <rsheeter at google.com>
+Date:   Tue Jan 30 19:27:11 2018 -0800
+
+    tweak test failure output. write to a temp file not stdout. test
+    still fails because expected is not just an identical copy of input
+
+ test/subset/run-tests.py | 41 +++++++++++++++++++++++++++----------
+ util/hb-subset.cc        | 53
+ +++++++++++++++++++++++++++++++++---------------
+ 2 files changed, 67 insertions(+), 27 deletions(-)
+
+commit cf403e1a53381f293aceac5cdbe031bbb2a7af77
+Author: Garret Rieger <grieger at google.com>
+Date:   Tue Jan 30 18:40:23 2018 -0800
+
+    Add hb-subset.h to hb.h
+
+ src/hb.h | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit c02573516c05ac97acb243ef5dec26af86086ded
+Author: Garret Rieger <grieger at google.com>
+Date:   Tue Jan 30 18:39:41 2018 -0800
+
+    Fix typo in hb-subset.h
+
+ src/hb-subset.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 76351518ca9bc88aa6fbc975e1e35bd86432d652
+Author: Garret Rieger <grieger at google.com>
+Date:   Tue Jan 30 14:03:16 2018 -0800
+
+    Remove basic subset test from XFAIL
+
+ test/subset/data/Makefile.sources | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit b029b7c19a733a2a39860238ad300e6c4a3f7802
+Author: Garret Rieger <grieger at google.com>
+Date:   Mon Jan 29 13:31:49 2018 -0800
+
+    Whitespace
+
+ test/subset/data/Makefile.sources | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 0853260e997aded264f42bb369d4fcb39cccb7d6
+Author: Garret Rieger <grieger at google.com>
+Date:   Mon Jan 29 13:30:02 2018 -0800
+
+    Configure automake to run the new subset tests.
+
+ configure.ac                                        |  2 ++
+ test/Makefile.am                                    |  2 +-
+ test/subset/Makefile.am                             | 16 ++++++++++++++++
+ test/subset/data/Makefile.am                        | 16 ++++++++++++++++
+ test/subset/data/Makefile.sources                   | 10 ++++++++++
+ test/subset/data/tests/{basics.txt => basics.tests} |  0
+ 6 files changed, 45 insertions(+), 1 deletion(-)
+
+commit 5c63c37b2b5aba8bf2f8ff35b7da0d116ebfe8b5
+Author: Garret Rieger <grieger at google.com>
+Date:   Fri Jan 26 16:57:42 2018 -0800
+
+    WIP test runner for subset tests.
+
+ test/subset/run-tests.py | 64
+ ++++++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 64 insertions(+)
+
+commit cc46cd88a1b84b02694fa6d88c4286e93336f096
+Author: Garret Rieger <grieger at google.com>
+Date:   Fri Jan 26 14:25:39 2018 -0800
+
+    In generate-expected-outputs read the test definition with utf8
+    encoding.
+
+ test/subset/generate-expected-outputs.py | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 4cdae914e2e2fff1ff91e2f42648a8acb82a5494
+Author: Garret Rieger <grieger at google.com>
+Date:   Fri Jan 26 13:57:48 2018 -0800
+
+    Add basic directory structure for subsetter integration tests. Plus
+    a utility for generating expected output files.
+
+ .../basics/Roboto-Regular.abc.default.62.ttf       | Bin 0 -> 1996 bytes
+ test/subset/data/fonts/Roboto-Regular.abc.ttf      | Bin 0 -> 2460 bytes
+ test/subset/data/profiles/default.txt              |   0
+ test/subset/data/tests/basics.txt                  |   8 ++
+ test/subset/generate-expected-outputs.py           |  40 ++++++++++
+ test/subset/subset_test_suite.py                   |  82
+ +++++++++++++++++++++
+ 6 files changed, 130 insertions(+)
+
+commit 9ccb8366f603a9e4a7a3c3f96420a19d4f6fb390
+Author: Rod Sheeter <rsheeter at google.com>
+Date:   Wed Jan 17 22:09:07 2018 -0800
+
+    Start to sketch APIs for subsetting
+
+ src/Makefile.am       |  2 ++
+ src/Makefile.sources  |  4 +++
+ src/hb-subset.cc      |  0
+ src/hb-subset.h       | 88
+ +++++++++++++++++++++++++++++++++++++++++++++++++++
+ util/Makefile.am      |  3 ++
+ util/Makefile.sources |  4 +++
+ util/hb-subset.cc     | 61 +++++++++++++++++++++++++++++++++++
+ 7 files changed, 162 insertions(+)
+
+commit 89b1906d990658c763f35113c8978a5e21bffc22
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sun Feb 4 14:45:02 2018 -0500
+
+    [aat] More adjustment to ContextualSubtable
+
+    See comment.
+
+    With this, MORX-20 passes if I turn --verify off.  Our unsafe-to-break
+    logic is currently broken in presence of end-of-text actions.  That's,
+    ugh, extra work to fix.  Let me try...
+
+ src/hb-aat-layout-morx-table.hh | 8 ++++++++
+ 1 file changed, 8 insertions(+)
+
+commit 8be596f0b76543e19644c0b77c1bcf4d9e783c2b
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sun Feb 4 14:40:17 2018 -0500
+
+    [aat] In ContextualSubstitute, apply end-of-text action to last glyph
+
+ src/hb-aat-layout-morx-table.hh | 9 +++++----
+ 1 file changed, 5 insertions(+), 4 deletions(-)
+
+commit c0b1c7eb2eed67147adec3d2c9e02d01f279c8f4
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sun Feb 4 14:19:41 2018 -0500
+
+    [aat] Remove unneeded check
+
+ src/hb-aat-layout-morx-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit fcb8be1a385cb4432dc6064fba77939716d27a02
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sun Feb 4 12:38:18 2018 -0500
+
+    [configure] Fix wording
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/741
+
+ configure.ac | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit aed32589af6d5fce3e68fe41865e258ea7eb2413
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Feb 2 16:08:50 2018 -0500
+
+    [aat] In ContextualSubtable, mark mark after substituting mark
+
+    Fixes MORX-21.
+
+ src/hb-aat-layout-morx-table.hh | 16 ++++++++--------
+ 1 file changed, 8 insertions(+), 8 deletions(-)
+
+commit fe5f9b1ae318939eaa23d0175a5eb7e1739177ac
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Feb 2 15:53:25 2018 -0500
+
+    [aat] Fix ContextualSubtable sanitization
+
+    Fixes MORX-18, MORX-19, and MORX-22.
+
+ src/hb-aat-layout-morx-table.hh | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+commit cf943f682bcdd73e3ad1f6108c1a1870b991d5e4
+Author: Khaled Hosny <khaledhosny at eglug.org>
+Date:   Sun Feb 4 12:05:12 2018 +0200
+
+    Correctly show documentation build status
+
+    Correctly show if building documentation is enabled or not in
+    configure
+    summary.
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/741
+
+ configure.ac | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit e8859fca3eafb5aab6d029563b31219ccca0d673
+Author: Bruce Mitchener <bruce.mitchener at gmail.com>
+Date:   Sun Feb 4 01:26:57 2018 +0700
+
+    Enable use of atexit() on macOS and related platforms.
+
+    The atexit() man page indicates that this is expected to behave
+    in the expected way on unloading of shared libraries.
+
+ src/hb-private.hh | 6 ++++++
+ 1 file changed, 6 insertions(+)
+
+commit a89573770b4c0f9c444ad6499bec5dc022087a97
+Author: Bruce Mitchener <bruce.mitchener at gmail.com>
+Date:   Sun Feb 4 01:31:53 2018 +0700
+
+    Use nullptr, not NULL.
+
+ src/hb-aat-layout-common-private.hh | 2 +-
+ src/hb-buffer-deserialize-json.rl   | 4 ++--
+ src/hb-buffer-deserialize-text.rl   | 4 ++--
+ 3 files changed, 5 insertions(+), 5 deletions(-)
+
+commit 07885e65adf1d3cb324de99501f9867f1a2553f8
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Sat Feb 3 12:53:48 2018 +0330
+
+    [cmake] unistd typo fix (#747)
+
+ CMakeLists.txt | 18 +++++++++---------
+ 1 file changed, 9 insertions(+), 9 deletions(-)
+
+commit ccb0367dae4cbb9c8215dbf20ac7f9acfba2fa14
+Author: David Corbett <corbett.dav at husky.neu.edu>
+Date:   Fri Feb 2 12:04:04 2018 -0500
+
+    Let VS1 follow U+1031 MYANMAR VOWEL SIGN E
+
+ src/hb-ot-shape-complex-myanmar-machine.rl               |   2 +-
+ src/hb-ot-shape-complex-myanmar.cc                       |   5 +++++
+ test/shaping/README.md                                   |  10 +++++-----
+ test/shaping/data/in-house/Makefile.sources              |   1 +
+ .../fonts/af3086380b743099c54a3b11b96766039ea62fcd.ttf   | Bin 0 ->
+ 1536 bytes
+ test/shaping/data/in-house/tests/myanmar-syllable.tests  |   1 +
+ 6 files changed, 13 insertions(+), 6 deletions(-)
+
+commit c6dbf6e77cae30772ffa110c651cb4287ab3b0dc
+Author: punchcutter <zarijoscha at gmail.com>
+Date:   Wed Jan 31 14:09:04 2018 -0800
+
+    Allow optional ZWJ in virama terminated cluster
+
+ src/hb-ot-shape-complex-use-machine.rl | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit dae20fb5a79caad9a4af14137a961b60fe256235
+Author: Bruce Mitchener <bruce.mitchener at gmail.com>
+Date:   Wed Jan 31 20:16:08 2018 +0700
+
+    Use nullptr instead of 0.
+
+ src/hb-coretext.cc           | 4 ++--
+ src/test-buffer-serialize.cc | 2 +-
+ 2 files changed, 3 insertions(+), 3 deletions(-)
+
+commit 90218fa93cf8b5d4b192be12d31aed92d271d09e
+Author: Bruce Mitchener <bruce.mitchener at gmail.com>
+Date:   Wed Jan 31 20:44:45 2018 +0700
+
+    Fix typos.
+
+ src/hb-blob.cc                     | 2 +-
+ src/hb-buffer-private.hh           | 2 +-
+ src/hb-common.cc                   | 2 +-
+ src/hb-coretext.cc                 | 2 +-
+ src/hb-directwrite.cc              | 2 +-
+ src/hb-ft.cc                       | 2 +-
+ src/hb-graphite2.cc                | 2 +-
+ src/hb-ot-layout-common-private.hh | 2 +-
+ 8 files changed, 8 insertions(+), 8 deletions(-)
+
+commit 148ca61075d821a09e42e2c75fbc9be47cfc6003
+Author: Bruce Mitchener <bruce.mitchener at gmail.com>
+Date:   Wed Jan 31 22:24:51 2018 +0700
+
+    [ot-layout] Fix nullptr dereference.
+
+    If the `calloc` for `gsub_accels` or `gpos_accels` fails, then the
+    unlikely branch afterwards can be taken, which frees up the
+    `hb_ot_layout_t`, but since those fields can now be `nullptr`, then
+    we don't want to dereference them.
+
+ src/hb-ot-layout.cc | 10 ++++++----
+ 1 file changed, 6 insertions(+), 4 deletions(-)
+
+commit 0c66043a924fd114017a862d2cacd70f64b92370
+Author: Bruce Mitchener <bruce.mitchener at gmail.com>
+Date:   Wed Jan 31 20:24:27 2018 +0700
+
+    [coretext] Fix memory leaks.
+
+    In `reference_table`, if the data is empty and we return early,
+    we still need to release the data object.
+
+    In `hb_coretext_shape`, there two edge cases where an early
+    return should release the attributed string.
+
+ src/hb-coretext.cc | 9 +++++++++
+ 1 file changed, 9 insertions(+)
+
 commit f0b700db394ccdff30ff83961a3e2ea9ff4ea472
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Tue Jan 30 11:16:51 2018 -0800
@@ -8497,6 +13850,30 @@
  src/hb-ot-layout-gsubgpos-private.hh | 24 +++++++++++++++++++++++-
  1 file changed, 23 insertions(+), 1 deletion(-)
 
+commit 3ebcd5a381e2de27a0cfb5af3359331f0b7e7108
+Author: Elie Roux <elie.roux at telecom-bretagne.eu>
+Date:   Sun Mar 5 16:26:01 2017 +0100
+
+    first working version!
+
+ src/hb-ot-layout.cc | 2 ++
+ src/hb-ot.h         | 1 +
+ 2 files changed, 3 insertions(+)
+
+commit e65aaaa00a3b5ac811b5c73b5186cd7d65731f7b
+Author: Elie Roux <elie.roux at telecom-bretagne.eu>
+Date:   Sun Mar 5 14:53:39 2017 +0100
+
+    BASE: start api
+
+ src/Makefile.sources           |  2 ++
+ src/hb-ot-base.cc              | 58
+ ++++++++++++++++++++++++++++++++++++++++++
+ src/hb-ot-base.h               | 56
+ ++++++++++++++++++++++++++++++++++++++++
+ src/hb-ot-layout-base-table.hh | 15 ++---------
+ 4 files changed, 118 insertions(+), 13 deletions(-)
+
 commit 5aec2fb8d0a4db52ae414d980b66018ca5ce1e9c
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Thu Mar 2 11:46:33 2017 -0800
@@ -8521,6 +13898,25 @@
  test/shaping/tests/context-matching.tests                |   1 +
  3 files changed, 4 insertions(+), 4 deletions(-)
 
+commit f72726c52b104a71ebf5b39fa1e3eb9febd446fc
+Author: Elie Roux <elie.roux at telecom-bretagne.eu>
+Date:   Sun Feb 26 15:08:43 2017 +0100
+
+    BASE: add function in main BASE object
+
+ src/hb-ot-layout-base-table.hh | 24 ++++++++++++++++++++++++
+ 1 file changed, 24 insertions(+)
+
+commit 3963315f1b2eae2504bc683760245c827cd1ef16
+Author: Elie Roux <elie.roux at telecom-bretagne.eu>
+Date:   Sun Feb 26 15:07:53 2017 +0100
+
+    BASE: first complete version
+
+ src/hb-ot-layout-base-table.hh | 444
+ +++++++++++++++++++++++++++++------------
+ 1 file changed, 317 insertions(+), 127 deletions(-)
+
 commit a11501444cfc4854bfe2b1d3ce0fc5a957e959d8
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Sat Feb 25 13:37:54 2017 -0800
@@ -8554,6 +13950,16 @@
  src/hb-ot-shape-complex-indic.cc | 2 +-
  1 file changed, 1 insertion(+), 1 deletion(-)
 
+commit d34e35b47457e757781b1769a1fbaf107ec6e32f
+Author: Elie Roux <elie.roux at telecom-bretagne.eu>
+Date:   Sat Feb 25 20:41:05 2017 +0100
+
+    BASE: WIP: more access functions
+
+ src/hb-ot-layout-base-table.hh | 212
+ +++++++++++++++++++++++++++++++++++++----
+ 1 file changed, 191 insertions(+), 21 deletions(-)
+
 commit 6685d281d6f50bf046bbfef4a5263e15d15f2f02
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Sat Feb 25 11:35:05 2017 -0800
@@ -8564,6 +13970,45 @@
  configure.ac |  2 +-
  2 files changed, 13 insertions(+), 1 deletion(-)
 
+commit bd15567ed6a3667e6f8332b7374aece6a6f2361b
+Author: Elie Roux <elie.roux at telecom-bretagne.eu>
+Date:   Sat Feb 25 17:08:01 2017 +0100
+
+    BASE: align member's names
+
+ src/hb-ot-layout-base-table.hh | 70
+ +++++++++++++++++++++---------------------
+ 1 file changed, 35 insertions(+), 35 deletions(-)
+
+commit 499b4bef2a5b6d49374ab4977509d1fbf7bd6038
+Author: Elie Roux <elie.roux at telecom-bretagne.eu>
+Date:   Sat Feb 25 16:48:22 2017 +0100
+
+    BASE: more consistent naming (with spec and Harfbuzz code base)
+
+ src/hb-ot-layout-base-table.hh | 44
+ +++++++++++++++++++++---------------------
+ 1 file changed, 22 insertions(+), 22 deletions(-)
+
+commit a0bdd546c584eb7c7ea3ca7e19a178723e6fe77f
+Author: Elie Roux <elie.roux at telecom-bretagne.eu>
+Date:   Sat Feb 25 16:34:58 2017 +0100
+
+    factorize horiz+vertAxis
+
+ src/hb-ot-layout-base-table.hh | 31 +++++--------------------------
+ 1 file changed, 5 insertions(+), 26 deletions(-)
+
+commit 1d30c6d935535743c73b2d18abcc6ae86a1cfc5b
+Author: Elie Roux <elie.roux at telecom-bretagne.eu>
+Date:   Sat Feb 25 16:19:35 2017 +0100
+
+    BASE: sanitize
+
+ src/hb-ot-layout-base-table.hh | 151
+ ++++++++++++++++++++++++++++++++++++++++-
+ 1 file changed, 148 insertions(+), 3 deletions(-)
+
 commit a657f23ca31237d652b5c101ed24194b6aeadaf8
 Author: Dominik Röttsches <d-r at roettsches.de>
 Date:   Mon Feb 20 21:52:07 2017 +0200
@@ -8578,6 +14023,45 @@
  src/hb-ot-layout.cc | 3 +++
  1 file changed, 3 insertions(+)
 
+commit f131f00b1779b44633223915e17cbce358ad063a
+Author: Elie Roux <elie.roux at telecom-bretagne.eu>
+Date:   Sun Feb 19 10:12:22 2017 +0100
+
+    compile, move into hb-ot-layout.cc
+
+ src/hb-ot-font.cc              |  1 -
+ src/hb-ot-layout-base-table.hh | 57
+ +++++++++++++++++++++++++++++++-----------
+ src/hb-ot-layout.cc            |  1 +
+ 3 files changed, 43 insertions(+), 16 deletions(-)
+
+commit d0b97353e930d9b258f42f1cc1ac1a75306b76a8
+Author: Elie Roux <elie.roux at telecom-bretagne.eu>
+Date:   Sun Feb 19 08:48:22 2017 +0100
+
+    hb-ot-base-table.hh -> hb-ot-layout-base-table.hh
+
+    per
+    https://github.com/behdad/harfbuzz/issues/418#issuecomment-280873811
+
+ src/Makefile.sources                                    | 2 +-
+ src/hb-ot-font.cc                                       | 2 +-
+ src/{hb-ot-base-table.hh => hb-ot-layout-base-table.hh} | 0
+ 3 files changed, 2 insertions(+), 2 deletions(-)
+
+commit f748e11645a3361f94d6fb10ce59febbaa5ba8ca
+Author: Elie Roux <elie.roux at telecom-bretagne.eu>
+Date:   Sat Feb 18 19:54:33 2017 +0100
+
+    bootstraping structure
+
+ src/Makefile.sources        |   1 +
+ src/hb-ot-base-table.hh     | 238
+ ++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-ot-font.cc           |   1 +
+ src/hb-ot-layout-private.hh |   2 +
+ 4 files changed, 242 insertions(+)
+
 commit 70202983f57fe85b2d3b56a9c205effeee66222d
 Author: ebraminio <ebrahim at gnu.org>
 Date:   Sat Feb 18 10:37:36 2017 +0330
@@ -11702,6 +17186,23 @@
  src/hb-directwrite.cc | 15 ++++++---------
  1 file changed, 6 insertions(+), 9 deletions(-)
 
+commit 5967eaba728ca3e4f5026142c25d455fa3a59764
+Author: Sascha Brawer <sascha at brawer.ch>
+Date:   Fri Jun 24 16:42:27 2016 +0200
+
+    [CPAL] Return 0xFFFF as name id for unnamed palettes
+
+    The name id 0 is used as Copyright notice. It's quite unlikely that a
+    font supplies a color palette with the exact same name as the font's
+    copyright notice, but the API should not prevent this.
+
+    Also, try to fix a problem with GObject introspection, where the
+    auto-generated Python bindings could not return palette colors.
+
+ src/hb-ot-color.cc       | 13 ++++++-------
+ test/api/test-ot-color.c | 14 +++++++-------
+ 2 files changed, 13 insertions(+), 14 deletions(-)
+
 commit 07b724f3419a28c479cd8a75ae0eecb841a6d2f3
 Author: Ebrahim Byagowi <ebrahim at gnu.org>
 Date:   Fri Jun 24 12:23:25 2016 +0430
@@ -11759,6 +17260,29 @@
 
     Merge branch 'master' into conflictingFontFix
 
+commit d34d3ac985a6c8c848ae49635b648a72e0c8f30d
+Author: Sascha Brawer <sascha at brawer.ch>
+Date:   Mon Apr 25 18:20:57 2016 +0200
+
+    Support CPAL table
+
+ NEWS                                               |   6 +-
+ src/Makefile.am                                    |   3 +
+ src/Makefile.sources                               |   3 +
+ src/hb-ot-color.cc                                 | 213 ++++++++++++++
+ src/hb-ot-color.h                                  |  99 +++++++
+ src/hb-ot-cpal-table.hh                            | 121 ++++++++
+ src/hb-ot-layout-private.hh                        |   3 +
+ src/hb-ot-layout.cc                                |   7 +
+ src/hb-ot.h                                        |   1 +
+ test/api/Makefile.am                               |   1 +
+ test/api/hb-test.h                                 |  30 ++
+ test/api/test-ot-color.c                           | 318
+ +++++++++++++++++++++
+ .../319f5d7ebffbefc5c5e6569f8cea73444d7a7268.ttf   | Bin 0 -> 2128 bytes
+ .../e90374e5e439e00725b4fe7a8d73db57c5a97f82.ttf   | Bin 0 -> 1948 bytes
+ 14 files changed, 804 insertions(+), 1 deletion(-)
+
 commit 07461d06d242cd5cfda7ccb891189f074a89b460
 Author: Kelvin <kelvinsthirteen at gmail.com>
 Date:   Sat Jun 18 22:46:38 2016 +0000

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/NEWS
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/NEWS	2018-03-07 21:52:46 UTC (rev 46876)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/NEWS	2018-03-07 22:32:14 UTC (rev 46877)
@@ -1,3 +1,18 @@
+Overview of changes leading to 1.7.6
+Wednesday, March 7, 2018
+====================================
+
+- Fix to hb_set_t binary operations. Ouch.
+- New experimental harfbuzz-subset library. All of hb-subset.h
+  is experimental right now and API WILL change.
+
+- New API:
+hb_blob_copy_writable_or_fail()
+HB_OT_TAG_BASE
+hb_set_previous()
+hb_set_previous_range()
+
+
 Overview of changes leading to 1.7.5
 Tuesday, January 30, 2018
 ====================================

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/RELEASING.md
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/RELEASING.md	2018-03-07 21:52:46 UTC (rev 46876)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/RELEASING.md	2018-03-07 22:32:14 UTC (rev 46877)
@@ -35,7 +35,7 @@
 
    a. Put contents of [this](https://drive.google.com/open?id=0B3_fQkxDZZXXbWltRGd5bjVrUDQ) on your `~/.local/i686-w64-mingw32`,
 
-   b. Run `./MING32 --with-uniscribe` script (available below) to configure harfbuzz with mingw in a subdirector (eg. winbuild/),
+   b. Run `../mingw32.sh --with-uniscribe` script (available below) to configure harfbuzz with mingw in a subdirector (eg. winbuild/),
 
    c. make
 
@@ -63,32 +63,6 @@
     edit the tag, upload artefacts and NEWS entry and save.
 
 
-## MING32
-```bash
-#!/bin/bash
-
-target=i686-w64-mingw32
-
-unset CC
-unset CXX
-unset CPP
-unset LD
-unset LDFLAGS
-unset CFLAGS
-unset CXXFLAGS
-unset PKG_CONFIG_PATH
-
-# Removed -static from the following
-export CFLAGS="-static-libgcc"
-export CXXFLAGS="-static-libgcc -static-libstdc++"
-export CPPFLAGS=-I$HOME/.local/$target/include
-export LDFLAGS=-L$HOME/.local/$target/lib
-export PKG_CONFIG_LIBDIR=$HOME/.local/$target/lib/pkgconfig
-export PATH=$HOME/.local/$target/bin:$PATH
-
-../configure --build=`../config.guess` --host=$target --prefix=$HOME/.local/$target "$@"
-```
-
 ## UPDATE.sh
 ```bash
 #!/bin/bash

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/TODO
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/TODO	2018-03-07 21:52:46 UTC (rev 46876)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/TODO	2018-03-07 22:32:14 UTC (rev 46877)
@@ -1,24 +1,14 @@
 General fixes:
 =============
 
-- AAT 'morx' implementation.
-
-- Return "safe-to-break" bit from shaping.
-
 - Implement 'rand' feature.
 
-- mask propagation? (when ligation, "or" the masks).
 
-
 API issues:
 ===========
 
 - API to accept a list of languages?
 
-- Add init_func to font_funcs.  Adjust ft.
-
-- 'const' for getter APIs? (use mutable internally)
-
 - Remove hb_ot_shape_glyphs_closure()?
 
 
@@ -39,7 +29,7 @@
 
 - Add query / enumeration API for aalt-like features?
 
-- SFNT api? get_num_faces? get_table_tags? (there's something in stash)
+- SFNT api? get_num_faces?
 
 - Add segmentation API
 
@@ -50,20 +40,3 @@
 ===============================
 
 - Add --width, --height, --auto-size, --ink-box, --align, etc?
-
-
-Tests to write:
-==============
-
-- ot-layout enumeration API (needs font)
-
-- Finish test-shape.c, grep for TODO
-
-- Finish test-unicode.c, grep for TODO
-
-- GObject, FreeType, etc
-
-- hb_cache_t and relatives
-
-- hb_feature_to/from_string
-- hb_buffer_[sg]et_contents

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/autogen.sh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/autogen.sh	2018-03-07 21:52:46 UTC (rev 46876)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/autogen.sh	2018-03-07 22:32:14 UTC (rev 46877)
@@ -7,11 +7,11 @@
 olddir=`pwd`
 cd $srcdir
 
-echo -n "checking for ragel... "
-which ragel || {
-	echo "You need to install ragel... See http://www.complang.org/ragel/"
-	exit 1
-}
+#echo -n "checking for ragel... "
+#which ragel || {
+#	echo "You need to install ragel... See http://www.complang.org/ragel/"
+#	exit 1
+#}
 
 echo -n "checking for pkg-config... "
 which pkg-config || {

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/config.h.in
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/config.h.in	2018-03-07 21:52:46 UTC (rev 46876)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/config.h.in	2018-03-07 22:32:14 UTC (rev 46877)
@@ -96,6 +96,9 @@
 /* Have sched_yield */
 #undef HAVE_SCHED_YIELD
 
+/* Define to 1 if you have the `setlinebuf' function. */
+#undef HAVE_SETLINEBUF
+
 /* Have Solaris __machine_*_barrier and atomic_* operations */
 #undef HAVE_SOLARIS_ATOMIC_OPS
 

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/configure.ac
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/configure.ac	2018-03-07 21:52:46 UTC (rev 46876)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/configure.ac	2018-03-07 22:32:14 UTC (rev 46877)
@@ -1,6 +1,6 @@
 AC_PREREQ([2.64])
 AC_INIT([HarfBuzz],
-        [1.7.5],
+        [1.7.6],
         [https://github.com/harfbuzz/harfbuzz/issues/new],
         [harfbuzz],
         [http://harfbuzz.org/])
@@ -11,6 +11,7 @@
 
 AM_INIT_AUTOMAKE([1.13.0 gnits tar-ustar dist-bzip2 no-dist-gzip -Wall no-define color-tests -Wno-portability])
 AM_SILENT_RULES([yes])
+AX_CODE_COVERAGE
 
 # Initialize libtool
 m4_ifdef([AM_PROG_AR], [AM_PROG_AR])
@@ -20,6 +21,7 @@
 # Check for programs
 AC_USE_SYSTEM_EXTENSIONS
 AC_PROG_CC
+AC_PROG_CC_C99
 AM_PROG_CC_C_O
 AC_PROG_CXX
 dnl AX_CXX_COMPILE_STDCXX(11, noext, optional)
@@ -57,6 +59,13 @@
 HB_LIBTOOL_VERSION_INFO=hb_libtool_current:hb_libtool_revision:hb_libtool_age
 AC_SUBST(HB_LIBTOOL_VERSION_INFO)
 
+AC_ARG_WITH([libstdc++],
+	[AS_HELP_STRING([--with-libstdc++=@<:@yes/no@:>@],
+			[Allow linking with libstdc++ @<:@default=no@:>@])],
+	[with_libstdcxx=$withval],
+	[with_libstdcxx=no])
+AM_CONDITIONAL(WITH_LIBSTDCXX, [test "x$with_libstdcxx" = "xyes"])
+
 # Documentation
 have_gtk_doc=false
 m4_ifdef([GTK_DOC_CHECK], [
@@ -68,8 +77,8 @@
 	AM_CONDITIONAL([ENABLE_GTK_DOC], false)
 ])
 
-# Functions and headers
-AC_CHECK_FUNCS(atexit mprotect sysconf getpagesize mmap isatty newlocale strtod_l)
+# Functions, and headers
+AC_CHECK_FUNCS(atexit mprotect sysconf getpagesize mmap isatty newlocale strtod_l setlinebuf)
 AC_CHECK_HEADERS(unistd.h sys/mman.h xlocale.h)
 
 # Compiler flags
@@ -80,12 +89,6 @@
 	# Make symbols link locally
 	LDFLAGS="$LDFLAGS -Bsymbolic-functions"
 
-	# Make sure we don't link to libstdc++
-	CXXFLAGS="$CXXFLAGS -fno-rtti -fno-exceptions"
-
-	# No threadsafe statics and C++ as we do it ourselves
-	CXXFLAGS="$CXXFLAGS -fno-threadsafe-statics"
-
 	# Assorted warnings
 	CXXFLAGS="$CXXFLAGS -Wcast-align"
 
@@ -182,6 +185,7 @@
 	AC_SUBST(GLIB_MKENUMS)
 fi
 AM_CONDITIONAL(HAVE_GOBJECT, $have_gobject)
+AC_SUBST(have_gobject)
 
 dnl ===========================================================================
 
@@ -355,9 +359,7 @@
 	AC_DEFINE(HAVE_FREETYPE, 1, [Have FreeType 2 library])
 	save_libs=$LIBS
 	LIBS="$LIBS $FREETYPE_LIBS"
-	AC_CHECK_FUNCS(FT_Get_Var_Blend_Coordinates)
-	AC_CHECK_FUNCS(FT_Set_Var_Blend_Coordinates)
-	AC_CHECK_FUNCS(FT_Done_MM_Var)
+	AC_CHECK_FUNCS(FT_Get_Var_Blend_Coordinates FT_Set_Var_Blend_Coordinates FT_Done_MM_Var)
 	LIBS=$save_libs
 fi
 AM_CONDITIONAL(HAVE_FREETYPE, $have_freetype)
@@ -491,6 +493,7 @@
 Makefile
 src/Makefile
 src/hb-version.h
+src/harfbuzz-config.cmake
 src/hb-ucdn/Makefile
 util/Makefile
 test/Makefile
@@ -500,6 +503,8 @@
 test/shaping/data/Makefile
 test/shaping/data/in-house/Makefile
 test/shaping/data/text-rendering-tests/Makefile
+test/subset/Makefile
+test/subset/data/Makefile
 docs/Makefile
 docs/version.xml
 ])
@@ -515,7 +520,7 @@
 	Glib:			${have_glib}
 	ICU:			${have_icu}
 
-Font callbacks (the more the better):
+Font callbacks (the more the merrier):
 	FreeType:		${have_freetype}
 
 Tools used for command-line utilities:
@@ -522,7 +527,7 @@
 	Cairo:			${have_cairo}
 	Fontconfig:		${have_fontconfig}
 
-Additional shapers (the more the better):
+Additional shapers (the more the merrier):
 	Graphite2:		${have_graphite2}
 
 Platform shapers (not normally needed):
@@ -531,7 +536,7 @@
 	DirectWrite:		${have_directwrite}
 
 Other features:
-	Documentation:		${have_gtk_doc}
+	Documentation:		${enable_gtk_doc}
 	GObject bindings:	${have_gobject}
 	Introspection:		${have_introspection}
 ])

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/Makefile.am
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/Makefile.am	2018-03-07 21:52:46 UTC (rev 46876)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/Makefile.am	2018-03-07 22:32:14 UTC (rev 46877)
@@ -9,12 +9,14 @@
 DISTCLEANFILES =
 MAINTAINERCLEANFILES =
 DISTCHECK_CONFIGURE_FLAGS = --enable-introspection
+TESTS =
+check_PROGRAMS =
 
 # The following warning options are useful for debugging: -Wpadded
 #AM_CXXFLAGS =
 
 # Convenience targets:
-lib: $(BUILT_SOURCES) libharfbuzz.la
+lib: $(BUILT_SOURCES) libharfbuzz.la libharfbuzz-subset.la
 fuzzing: $(BUILT_SOURCES) libharfbuzz-fuzzing.la
 
 lib_LTLIBRARIES = libharfbuzz.la
@@ -28,8 +30,16 @@
 HBSOURCES =  $(HB_BASE_sources)
 HBSOURCES += $(HB_BASE_RAGEL_GENERATED_sources)
 HBHEADERS = $(HB_BASE_headers)
-HBNODISTHEADERS = $(HB_NODIST_headers)
 
+if WITH_LIBSTDCXX
+HBNOLIBCXXCFLAGS =
+else
+# Make sure we don't link to libstdc++
+# No threadsafe statics in C++ as we do it ourselves
+HBCFLAGS += -fno-exceptions
+HBNOLIBCXXFLAGS = -fno-threadsafe-statics -fno-rtti
+endif
+
 if HAVE_OT
 HBSOURCES += $(HB_OT_sources)
 HBSOURCES += $(HB_OT_RAGEL_GENERATED_sources)
@@ -114,31 +124,59 @@
 if OS_WIN32
 export_symbols = -export-symbols harfbuzz.def
 harfbuzz_def_dependency = harfbuzz.def
-libharfbuzz_la_LINK = $(CXXLINK) $(libharfbuzz_la_LDFLAGS)
+export_symbols_subset = -export-symbols harfbuzz-subset.def
+harfbuzz_subset_def_dependency = harfbuzz-subset.def
+export_symbols_icu = -export-symbols harfbuzz-icu.def
+harfbuzz_icu_def_dependency = harfbuzz-icu.def
+export_symbols_gobject = -export-symbols harfbuzz-gobject.def
+harfbuzz_gobject_def_dependency = harfbuzz-gobject.def
+chosen_linker = $(CXXLINK)
 else
+if WITH_LIBSTDCXX
+chosen_linker = $(CXXLINK)
+else
+if HAVE_GCC
 # Use a C linker for GCC, not C++; Don't link to libstdc++
-if HAVE_GCC
-libharfbuzz_la_LINK = $(LINK) $(libharfbuzz_la_LDFLAGS)
+chosen_linker = $(LINK)
 else
-libharfbuzz_la_LINK = $(CXXLINK) $(libharfbuzz_la_LDFLAGS)
+chosen_linker = $(CXXLINK)
 endif
 endif
+endif
 
-libharfbuzz_la_SOURCES = $(HBSOURCES) $(HBHEADERS) $(HBNODISTHEADERS)
-libharfbuzz_la_CPPFLAGS = $(HBCFLAGS)
-libharfbuzz_la_LDFLAGS = $(AM_LDFLAGS) -lm -version-info $(HB_LIBTOOL_VERSION_INFO) $(export_symbols) -no-undefined
+ at CODE_COVERAGE_RULES@
+
+base_link_flags = $(AM_LDFLAGS) -lm -version-info $(HB_LIBTOOL_VERSION_INFO) -no-undefined
+libharfbuzz_la_LINK = $(chosen_linker) $(libharfbuzz_la_LDFLAGS) $(CODE_COVERAGE_LDFLAGS)
+libharfbuzz_la_SOURCES = $(HBSOURCES) $(HBHEADERS)
+libharfbuzz_la_CPPFLAGS = $(HBCFLAGS) $(HBNOLIBCXXFLAGS) $(CODE_COVERAGE_CFLAGS)
+libharfbuzz_la_LDFLAGS = $(base_link_flags) $(export_symbols)
 libharfbuzz_la_LIBADD = $(HBLIBS)
 EXTRA_libharfbuzz_la_DEPENDENCIES = $(harfbuzz_def_dependency)
 pkginclude_HEADERS = $(HBHEADERS)
-nodist_pkginclude_HEADERS = $(HBNODISTHEADERS)
+nodist_pkginclude_HEADERS =
 pkgconfigdir = $(libdir)/pkgconfig
 pkgconfig_DATA = harfbuzz.pc
-EXTRA_DIST += harfbuzz.pc.in
+cmakedir = $(libdir)/cmake/harfbuzz
+cmake_DATA = harfbuzz-config.cmake
+EXTRA_DIST += harfbuzz.pc.in harfbuzz-config.cmake.in
 
+lib_LTLIBRARIES += libharfbuzz-subset.la
+libharfbuzz_subset_la_SOURCES = $(HB_SUBSET_sources)
+libharfbuzz_subset_la_CPPFLAGS = $(HBCFLAGS)
+libharfbuzz_subset_la_LDFLAGS = $(base_link_flags) $(export_symbols_subset)
+libharfbuzz_subset_la_LIBADD = libharfbuzz.la
+EXTRA_libharfbuzz_subset_la_DEPENDENCIES = $(harfbuzz_subset_def_dependency)
+pkginclude_HEADERS += $(HB_SUBSET_headers)
+pkgconfig_DATA += harfbuzz-subset.pc
+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 \
+	-DHB_SANITIZE_MAX_OPS_MIN=128 \
 	-DHB_BUFFER_MAX_LEN_FACTOR=3 \
 	-DHB_BUFFER_MAX_LEN_MIN=8 \
 	-DHB_BUFFER_MAX_LEN_DEFAULT=128 \
@@ -147,10 +185,10 @@
 	-DHB_BUFFER_MAX_OPS_DEFAULT=1024 \
 	$(NULL)
 EXTRA_LTLIBRARIES = libharfbuzz-fuzzing.la
-libharfbuzz_fuzzing_la_LINK = $(libharfbuzz_la_LINK)
+libharfbuzz_fuzzing_la_LINK = $(chosen_linker) $(libharfbuzz_fuzzing_la_LDFLAGS)
 libharfbuzz_fuzzing_la_SOURCES = $(libharfbuzz_la_SOURCES)
-libharfbuzz_fuzzing_la_CPPFLAGS = $(libharfbuzz_la_CPPFLAGS) $(FUZZING_CPPFLAGS)
-libharfbuzz_fuzzing_la_LDFLAGS = $(libharfbuzz_la_LDFLAGS)
+libharfbuzz_fuzzing_la_CPPFLAGS = $(HBCFLAGS) $(FUZZING_CPPFLAGS)
+libharfbuzz_fuzzing_la_LDFLAGS = $(AM_LDFLAGS)
 libharfbuzz_fuzzing_la_LIBADD = $(libharfbuzz_la_LIBADD)
 EXTRA_libharfbuzz_fuzzing_la_DEPENDENCIES = $(EXTRA_libharfbuzz_la_DEPENDENCIES)
 CLEANFILES += libharfbuzz-fuzzing.la
@@ -164,9 +202,10 @@
 else
 lib_LTLIBRARIES += libharfbuzz-icu.la
 libharfbuzz_icu_la_SOURCES = $(HB_ICU_sources)
-libharfbuzz_icu_la_CPPFLAGS = $(ICU_CFLAGS)
-libharfbuzz_icu_la_LDFLAGS = $(AM_LDFLAGS) -version-info $(HB_LIBTOOL_VERSION_INFO) -no-undefined
+libharfbuzz_icu_la_CPPFLAGS = $(HBCFLAGS) $(ICU_CFLAGS)
+libharfbuzz_icu_la_LDFLAGS = $(base_link_flags) $(export_symbols_icu)
 libharfbuzz_icu_la_LIBADD = $(ICU_LIBS) libharfbuzz.la
+EXTRA_libharfbuzz_icu_la_DEPENDENCIES = $(harfbuzz_icu_def_dependency)
 pkginclude_HEADERS += $(HB_ICU_headers)
 pkgconfig_DATA += harfbuzz-icu.pc
 endif
@@ -175,13 +214,15 @@
 
 if HAVE_GOBJECT
 lib_LTLIBRARIES += libharfbuzz-gobject.la
-libharfbuzz_gobject_la_SOURCES = $(HB_GOBJECT_sources)
-nodist_libharfbuzz_gobject_la_SOURCES = $(HB_GOBJECT_ENUM_sources)
-libharfbuzz_gobject_la_CPPFLAGS = $(GOBJECT_CFLAGS)
-libharfbuzz_gobject_la_LDFLAGS = $(AM_LDFLAGS) -version-info $(HB_LIBTOOL_VERSION_INFO) -no-undefined
+libharfbuzz_gobject_la_LINK = $(chosen_linker) $(libharfbuzz_gobject_la_LDFLAGS)
+libharfbuzz_gobject_la_SOURCES = $(HB_GOBJECT_DIST_sources)
+nodist_libharfbuzz_gobject_la_SOURCES = $(HB_GOBJECT_NODIST_sources)
+libharfbuzz_gobject_la_CPPFLAGS = $(HBCFLAGS) $(HBNOLIBCXXFLAGS) $(GOBJECT_CFLAGS)
+libharfbuzz_gobject_la_LDFLAGS = $(base_link_flags)
 libharfbuzz_gobject_la_LIBADD = $(GOBJECT_LIBS) libharfbuzz.la
-pkginclude_HEADERS += $(HB_GOBJECT_headers)
-nodist_pkginclude_HEADERS += $(HB_GOBJECT_ENUM_headers)
+EXTRA_libharfbuzz_gobject_la_DEPENDENCIES = $(harfbuzz_gobject_def_dependency)
+pkginclude_HEADERS += $(HB_GOBJECT_DIST_headers)
+nodist_pkginclude_HEADERS += $(HB_GOBJECT_NODIST_headers)
 pkgconfig_DATA += harfbuzz-gobject.pc
 
 BUILT_SOURCES += \
@@ -221,9 +262,20 @@
 CLEANFILES += $(pkgconfig_DATA)
 
 
-CLEANFILES += harfbuzz.def
+DEF_FILES = harfbuzz.def harfbuzz-subset.def harfbuzz-icu.def
+if HAVE_GOBJECT
+DEF_FILES += harfbuzz-gobject.def
+endif
+check: $(DEF_FILES) # For check-symbols.sh
+CLEANFILES += $(DEF_FILES)
 harfbuzz.def: $(HBHEADERS) $(HBNODISTHEADERS)
 	$(AM_V_GEN) headers="$^" $(srcdir)/gen-def.py $@
+harfbuzz-subset.def: $(HB_SUBSET_headers)
+	$(AM_V_GEN) headers="$^" $(srcdir)/gen-def.py $@
+harfbuzz-icu.def: $(HB_ICU_headers)
+	$(AM_V_GEN) headers="$^" $(srcdir)/gen-def.py $@
+harfbuzz-gobject.def: $(HB_GOBJECT_headers)
+	$(AM_V_GEN) headers="$^" $(srcdir)/gen-def.py $@
 
 
 GENERATORS = \
@@ -261,7 +313,8 @@
 	$(HB_BASE_RAGEL_sources) \
 	$(HB_OT_RAGEL_sources) \
 	$(NULL)
-MAINTAINERCLEANFILES += $(RAGEL_GENERATED)
+# We decided to add ragel-generated files to git...
+#MAINTAINERCLEANFILES += $(RAGEL_GENERATED)
 $(srcdir)/%.hh: $(srcdir)/%.rl
 	$(AM_V_GEN)(cd $(srcdir) && $(RAGEL) -e -F1 -o "$*.hh" "$*.rl") \
 	|| ($(RM) "$@"; false)
@@ -295,32 +348,56 @@
 test_buffer_serialize_CPPFLAGS = $(HBCFLAGS)
 test_buffer_serialize_LDADD = libharfbuzz.la $(HBLIBS)
 
-check: harfbuzz.def # For check-defs.sh
-
 dist_check_SCRIPTS = \
 	check-c-linkage-decls.sh \
-	check-defs.sh \
 	check-externs.sh \
 	check-header-guards.sh \
 	check-includes.sh \
-	check-libstdc++.sh \
 	check-static-inits.sh \
 	check-symbols.sh \
 	$(NULL)
+TESTS += $(dist_check_SCRIPTS)
 
-check_PROGRAMS = \
-	test-ot-tag \
+if !WITH_LIBSTDCXX
+dist_check_SCRIPTS += \
+	check-libstdc++.sh \
 	$(NULL)
+endif
+
+check_PROGRAMS += \
+	dump-indic-data \
+	dump-khmer-data \
+	dump-myanmar-data \
+	dump-use-data \
+	$(NULL)
+dump_indic_data_SOURCES = dump-indic-data.cc hb-ot-shape-complex-indic-table.cc
+dump_indic_data_CPPFLAGS = $(HBCFLAGS)
+dump_indic_data_LDADD = libharfbuzz.la $(HBLIBS)
+dump_khmer_data_SOURCES = dump-khmer-data.cc hb-ot-shape-complex-indic-table.cc
+dump_khmer_data_CPPFLAGS = $(HBCFLAGS)
+dump_khmer_data_LDADD = libharfbuzz.la $(HBLIBS)
+dump_myanmar_data_SOURCES = dump-myanmar-data.cc hb-ot-shape-complex-indic-table.cc
+dump_myanmar_data_CPPFLAGS = $(HBCFLAGS)
+dump_myanmar_data_LDADD = libharfbuzz.la $(HBLIBS)
+dump_use_data_SOURCES = dump-use-data.cc hb-ot-shape-complex-use-table.cc
+dump_use_data_CPPFLAGS = $(HBCFLAGS)
+dump_use_data_LDADD = libharfbuzz.la $(HBLIBS)
+
+check_PROGRAMS += test-ot-tag test-unicode-ranges
+TESTS += test-ot-tag test-unicode-ranges
+
 test_ot_tag_SOURCES = hb-ot-tag.cc
 test_ot_tag_CPPFLAGS = $(HBCFLAGS) -DMAIN
 test_ot_tag_LDADD = libharfbuzz.la $(HBLIBS)
 
-TESTS = $(dist_check_SCRIPTS) $(check_PROGRAMS)
+test_unicode_ranges_SOURCES = test-unicode-ranges.cc
+test_unicode_ranges_LDADD = libharfbuzz.la $(HBLIBS)
+
 TESTS_ENVIRONMENT = \
 	srcdir="$(srcdir)" \
 	MAKE="$(MAKE) $(AM_MAKEFLAGS)" \
 	HBSOURCES="$(HBSOURCES)" \
-	HBHEADERS="$(HBHEADERS) $(HBNODISTHEADERS)" \
+	HBHEADERS="$(HBHEADERS)" \
 	$(NULL)
 
 if HAVE_INTROSPECTION
@@ -350,12 +427,9 @@
 	$(NULL)
 HarfBuzz_0_0_gir_FILES = \
 	$(HBHEADERS) \
-	$(HBNODISTHEADERS) \
 	$(HBSOURCES) \
-	$(HB_GOBJECT_ENUM_sources) \
-	$(HB_GOBJECT_ENUM_headers) \
 	$(HB_GOBJECT_sources) \
-	$(HB_GOBJECT_STRUCTS_headers) \
+	$(HB_GOBJECT_headers) \
 	$(NULL)
 
 girdir = $(datadir)/gir-1.0

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/Makefile.sources
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/Makefile.sources	2018-03-07 21:52:46 UTC (rev 46876)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/Makefile.sources	2018-03-07 22:32:14 UTC (rev 46877)
@@ -17,9 +17,10 @@
 	hb-object-private.hh \
 	hb-open-file-private.hh \
 	hb-open-type-private.hh \
-	hb-ot-cbdt-table.hh \
+	hb-ot-color-cbdt-table.hh \
 	hb-ot-cmap-table.hh \
 	hb-ot-glyf-table.hh \
+	hb-ot-hdmx-table.hh \
 	hb-ot-head-table.hh \
 	hb-ot-hhea-table.hh \
 	hb-ot-hmtx-table.hh \
@@ -27,6 +28,7 @@
 	hb-ot-maxp-table.hh \
 	hb-ot-name-table.hh \
 	hb-ot-os2-table.hh \
+	hb-ot-os2-unicode-ranges.hh \
 	hb-ot-post-macroman.hh \
 	hb-ot-post-table.hh \
 	hb-ot-tag.cc \
@@ -69,9 +71,6 @@
 	hb-shape.h \
 	hb-shape-plan.h \
 	hb-unicode.h \
-	$(NULL)
-
-HB_NODIST_headers = \
 	hb-version.h \
 	$(NULL)
 
@@ -82,10 +81,14 @@
 HB_OT_sources = \
 	hb-aat-layout.cc \
 	hb-aat-layout-common-private.hh \
+	hb-aat-layout-ankr-table.hh \
+	hb-aat-layout-kerx-table.hh \
 	hb-aat-layout-morx-table.hh \
+	hb-aat-layout-trak-table.hh \
 	hb-aat-layout-private.hh \
 	hb-ot-font.cc \
 	hb-ot-layout.cc \
+	hb-ot-layout-base-table.hh \
 	hb-ot-layout-common-private.hh \
 	hb-ot-layout-gdef-table.hh \
 	hb-ot-layout-gpos-table.hh \
@@ -93,6 +96,9 @@
 	hb-ot-layout-gsub-table.hh \
 	hb-ot-layout-jstf-table.hh \
 	hb-ot-layout-private.hh \
+	hb-ot-color.cc \
+	hb-ot-color-colr-table.hh \
+	hb-ot-color-cpal-table.hh \
 	hb-ot-map.cc \
 	hb-ot-map-private.hh \
 	hb-ot-math.cc \
@@ -109,7 +115,9 @@
 	hb-ot-shape-complex-indic.cc \
 	hb-ot-shape-complex-indic-private.hh \
 	hb-ot-shape-complex-indic-table.cc \
+	hb-ot-shape-complex-khmer-private.hh \
 	hb-ot-shape-complex-khmer.cc \
+	hb-ot-shape-complex-myanmar-private.hh \
 	hb-ot-shape-complex-myanmar.cc \
 	hb-ot-shape-complex-thai.cc \
 	hb-ot-shape-complex-tibetan.cc \
@@ -181,8 +189,26 @@
 HB_ICU_sources = hb-icu.cc
 HB_ICU_headers = hb-icu.h
 
-HB_GOBJECT_sources = hb-gobject-structs.cc
-HB_GOBJECT_STRUCTS_headers = hb-gobject-structs.h
-HB_GOBJECT_headers = hb-gobject.h $(HB_GOBJECT_STRUCTS_headers)
+# Sources for libharfbuzz-subset
+HB_SUBSET_sources = \
+	hb-subset.cc \
+	hb-subset-glyf.cc \
+	hb-subset-input.cc \
+	hb-subset-plan.cc \
+	$(NULL)
+
+HB_SUBSET_headers = \
+	hb-subset.h \
+	hb-subset-glyf.hh \
+	hb-subset-plan.hh \
+	hb-subset-private.hh \
+	$(NULL)
+
+HB_GOBJECT_DIST_sources = hb-gobject-structs.cc
+HB_GOBJECT_DIST_headers = hb-gobject.h hb-gobject-structs.h
 HB_GOBJECT_ENUM_sources = hb-gobject-enums.cc
 HB_GOBJECT_ENUM_headers = hb-gobject-enums.h
+HB_GOBJECT_NODIST_sources = $(HB_GOBJECT_ENUM_sources)
+HB_GOBJECT_NODIST_headers = $(HB_GOBJECT_ENUM_headers)
+HB_GOBJECT_sources = $(HB_GOBJECT_DIST_sources) $(HB_GOBJECT_NODIST_sources)
+HB_GOBJECT_headers = $(HB_GOBJECT_DIST_headers) $(HB_GOBJECT_NODIST_headers)

Deleted: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/check-defs.sh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/check-defs.sh	2018-03-07 21:52:46 UTC (rev 46876)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/check-defs.sh	2018-03-07 22:32:14 UTC (rev 46877)
@@ -1,54 +0,0 @@
-#!/bin/sh
-
-LC_ALL=C
-export LC_ALL
-
-test -z "$srcdir" && srcdir=.
-test -z "$libs" && libs=.libs
-stat=0
-
-if which nm 2>/dev/null >/dev/null; then
-	:
-else
-	echo "check-defs.sh: 'nm' not found; skipping test"
-	exit 77
-fi
-
-defs="harfbuzz.def"
-if ! test -f "$defs"; then
-	echo "check-defs.sh: '$defs' not found; skipping test"
-	exit 77
-fi
-
-tested=false
-for def in $defs; do
-	lib=`echo "$def" | sed 's/[.]def$//;s at .*/@@'`
-	for suffix in so dylib; do
-		so=$libs/lib${lib}.$suffix
-		if ! test -f "$so"; then continue; fi
-
-		# On mac, C symbols are prefixed with _
-		if test $suffix = dylib; then prefix="_"; fi
-
-		EXPORTED_SYMBOLS="`nm "$so" | grep ' [BCDGINRSTVW] .' | grep -v " $prefix"'\(_fini\>\|_init\>\|_fdata\>\|_ftext\>\|_fbss\>\|__bss_start\>\|__bss_start__\>\|__bss_end__\>\|_edata\>\|_end\>\|_bss_end__\>\|__end__\>\|__gcov_flush\>\|llvm_\)' | cut -d' ' -f3`"
-
-		if test -f "$so"; then
-
-			echo "Checking that $so has the same symbol list as $def"
-			{
-				echo EXPORTS
-				echo "$EXPORTED_SYMBOLS" | sed -e "s/^${prefix}hb/hb/g"
-				# cheat: copy the last line from the def file!
-				tail -n1 "$def"
-			} | diff "$def" - >&2 || stat=1
-
-			tested=true
-		fi
-	done
-done
-if ! $tested; then
-	echo "check-defs.sh: libharfbuzz shared library not found; skipping test"
-	exit 77
-fi
-
-exit $stat

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/check-libstdc++.sh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/check-libstdc++.sh	2018-03-07 21:52:46 UTC (rev 46876)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/check-libstdc++.sh	2018-03-07 22:32:14 UTC (rev 46877)
@@ -21,16 +21,20 @@
 fi
 
 tested=false
-for suffix in so dylib; do
-	so=$libs/libharfbuzz.$suffix
-	if ! test -f "$so"; then continue; fi
+# harfbuzz-icu links to libstdc++ because icu does.
+# harfbuzz-subset uses libstdc++.
+for soname in harfbuzz harfbuzz-gobject; do
+	for suffix in so dylib; do
+		so=$libs/lib$soname.$suffix
+		if ! test -f "$so"; then continue; fi
 
-	echo "Checking that we are not linking to libstdc++ or libc++"
-	if $LDD $so | grep 'libstdc[+][+]\|libc[+][+]'; then
-		echo "Ouch, linked to libstdc++ or libc++"
-		stat=1
-	fi
-	tested=true
+		echo "Checking that we are not linking to libstdc++ or libc++ in $so"
+		if $LDD $so | grep 'libstdc[+][+]\|libc[+][+]'; then
+			echo "Ouch, linked to libstdc++ or libc++"
+			stat=1
+		fi
+		tested=true
+	done
 done
 if ! $tested; then
 	echo "check-libstdc++.sh: libharfbuzz shared library not found; skipping test"

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/check-symbols.sh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/check-symbols.sh	2018-03-07 21:52:46 UTC (rev 46876)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/check-symbols.sh	2018-03-07 22:32:14 UTC (rev 46877)
@@ -7,6 +7,7 @@
 test -z "$libs" && libs=.libs
 stat=0
 
+IGNORED_SYMBOLS='_fini\|_init\|_fdata\|_ftext\|_fbss\|__bss_start\|__bss_start__\|__bss_end__\|_edata\|_end\|_bss_end__\|__end__\|__gcov_flush\|llvm_.*'
 
 if which nm 2>/dev/null >/dev/null; then
 	:
@@ -15,29 +16,46 @@
 	exit 77
 fi
 
-echo "Checking that we are not exposing internal symbols"
 tested=false
-for suffix in so dylib; do
-	so=$libs/libharfbuzz.$suffix
-	if ! test -f "$so"; then continue; fi
+for soname in harfbuzz harfbuzz-subset harfbuzz-icu harfbuzz-gobject; do
+	for suffix in so dylib; do
+		so=$libs/lib$soname.$suffix
+		if ! test -f "$so"; then continue; fi
 
-	EXPORTED_SYMBOLS="`nm "$so" | grep ' [BCDGINRSTVW] .' | grep -v ' _fini\>\| _init\>\| _fdata\>\| _ftext\>\| _fbss\>\| __bss_start\>\| __bss_start__\>\| __bss_end__\>\| _edata\>\| _end\>\| _bss_end__\>\| __end__\>\| __gcov_flush\>\| ___gcov_flush\>\| llvm_\| _llvm_' | cut -d' ' -f3`"
+		# On macOS, C symbols are prefixed with _
+		symprefix=
+		if test $suffix = dylib; then symprefix=_; fi
 
-	prefix=`basename "$so" | sed 's/libharfbuzz/hb/; s/-/_/g; s/[.].*//'`
+		EXPORTED_SYMBOLS="`nm "$so" | grep ' [BCDGINRSTVW] .' | grep -v " $symprefix\\($IGNORED_SYMBOLS\\>\\)" | cut -d' ' -f3 | c++filt`"
 
-	# On mac, C symbols are prefixed with _
-	if test $suffix = dylib; then prefix="_$prefix"; fi
+		prefix=$symprefix`basename "$so" | sed 's/libharfbuzz/hb/; s/-/_/g; s/[.].*//'`
 
-	echo "Processing $so"
-	if echo "$EXPORTED_SYMBOLS" | grep -v "^${prefix}_"; then
-		echo "Ouch, internal symbols exposed"
-		stat=1
-	fi
+		echo
+		echo "Checking that $so does not expose internal symbols"
+		if echo "$EXPORTED_SYMBOLS" | grep -v "^${prefix}\(_\|$\)"; then
+			echo "Ouch, internal symbols exposed"
+			stat=1
+		fi
 
-	tested=true
+		def=$soname.def
+		if ! test -f "$def"; then
+			echo "'$def' not found; skipping"
+		else
+			echo
+			echo "Checking that $so has the same symbol list as $def"
+			{
+				echo EXPORTS
+				echo "$EXPORTED_SYMBOLS" | sed -e "s/^${symprefix}hb/hb/g"
+				# cheat: copy the last line from the def file!
+				tail -n1 "$def"
+			} | c++filt | diff "$def" - >&2 || stat=1
+		fi
+
+		tested=true
+	done
 done
 if ! $tested; then
-	echo "check-symbols.sh: no shared library found; skipping test"
+	echo "check-symbols.sh: no shared libraries found; skipping test"
 	exit 77
 fi
 

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

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

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

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

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/gen-def.py
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/gen-def.py	2018-03-07 21:52:46 UTC (rev 46876)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/gen-def.py	2018-03-07 22:32:14 UTC (rev 46877)
@@ -9,8 +9,11 @@
 	if h.endswith (".h"):
 		with io.open(h, encoding='utf8') as f: headers_content.append (f.read ())
 
-result = ("EXPORTS\n" +
-	"\n".join (sorted (re.findall (r"^hb_\w+(?= \()", "\n".join (headers_content), re.M))) +
-	"\nLIBRARY libharfbuzz-0.dll")
+result = """EXPORTS
+%s
+LIBRARY lib%s-0.dll""" % (
+	"\n".join (sorted (re.findall (r"^hb_\w+(?= \()", "\n".join (headers_content), re.M))),
+	sys.argv[1].replace ('.def', '')
+)
 
 with open (sys.argv[1], "w") as f: f.write (result)

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/gen-use-table.py
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/gen-use-table.py	2018-03-07 21:52:46 UTC (rev 46876)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/gen-use-table.py	2018-03-07 22:32:14 UTC (rev 46877)
@@ -449,7 +449,7 @@
 print "}; /* Table items: %d; occupancy: %d%% */" % (offset, occupancy)
 print
 print "USE_TABLE_ELEMENT_TYPE"
-print "hb_use_get_categories (hb_codepoint_t u)"
+print "hb_use_get_category (hb_codepoint_t u)"
 print "{"
 print "  switch (u >> %d)" % page_bits
 print "  {"

Added: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/harfbuzz-config.cmake.in
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/harfbuzz-config.cmake.in	                        (rev 0)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/harfbuzz-config.cmake.in	2018-03-07 22:32:14 UTC (rev 46877)
@@ -0,0 +1,82 @@
+# Set these variables so that the `${prefix}/lib` expands to something we can
+# remove.
+set(_harfbuzz_remove_string "REMOVE_ME")
+set(exec_prefix "${_harfbuzz_remove_string}")
+set(prefix "${_harfbuzz_remove_string}")
+
+# Compute the installation prefix by stripping components from our current
+# location.
+get_filename_component(_harfbuzz_prefix "${CMAKE_CURRENT_LIST_DIR}" DIRECTORY)
+get_filename_component(_harfbuzz_prefix "${_harfbuzz_prefix}" DIRECTORY)
+set(_harfbuzz_libdir "@libdir@")
+string(REPLACE "${_harfbuzz_remove_string}/" "" _harfbuzz_libdir "${_harfbuzz_libdir}")
+set(_harfbuzz_libdir_iter "${_harfbuzz_libdir}")
+while (_harfbuzz_libdir_iter)
+  get_filename_component(_harfbuzz_libdir_iter "${_harfbuzz_libdir_iter}" DIRECTORY)
+  get_filename_component(_harfbuzz_prefix "${_harfbuzz_prefix}" DIRECTORY)
+endwhile ()
+unset(_harfbuzz_libdir_iter)
+
+# Get the include subdir.
+set(_harfbuzz_includedir "@includedir@")
+string(REPLACE "${_harfbuzz_remove_string}/" "" _harfbuzz_includedir "${_harfbuzz_includedir}")
+
+# Extract version information from libtool.
+set(_harfbuzz_version_info "@HB_LIBTOOL_VERSION_INFO@")
+string(REPLACE ":" ";" _harfbuzz_version_info "${_harfbuzz_version_info}")
+list(GET _harfbuzz_version_info 0
+  _harfbuzz_current)
+list(GET _harfbuzz_version_info 1
+  _harfbuzz_revision)
+list(GET _harfbuzz_version_info 2
+  _harfbuzz_age)
+unset(_harfbuzz_version_info)
+
+if (APPLE)
+  set(_harfbuzz_lib_suffix ".0${CMAKE_SHARED_LIBRARY_SUFFIX}")
+elseif (UNIX)
+  set(_harfbuzz_lib_suffix "${CMAKE_SHARED_LIBRARY_SUFFIX}.0.${_harfbuzz_current}.${_harfbuzz_revision}")
+else ()
+  # Unsupported.
+  set(harfbuzz_FOUND 0)
+endif ()
+
+# Add the libraries.
+add_library(harfbuzz::harfbuzz SHARED IMPORTED)
+set_target_properties(harfbuzz::harfbuzz PROPERTIES
+  INTERFACE_INCLUDE_DIRECTORIES "${_harfbuzz_prefix}/${_harfbuzz_includedir}/harfbuzz"
+  IMPORTED_LOCATION "${_harfbuzz_prefix}/${_harfbuzz_libdir}/libharfbuzz${_harfbuzz_lib_suffix}")
+
+add_library(harfbuzz::icu SHARED IMPORTED)
+set_target_properties(harfbuzz::icu PROPERTIES
+  INTERFACE_INCLUDE_DIRECTORIES "${_harfbuzz_prefix}/${_harfbuzz_includedir}/harfbuzz"
+  INTERFACE_LINK_LIBRARIES "harfbuzz::harfbuzz"
+  IMPORTED_LOCATION "${_harfbuzz_prefix}/${_harfbuzz_libdir}/libharfbuzz-icu${_harfbuzz_lib_suffix}")
+
+add_library(harfbuzz::subset SHARED IMPORTED)
+set_target_properties(harfbuzz::subset PROPERTIES
+  INTERFACE_INCLUDE_DIRECTORIES "${_harfbuzz_prefix}/${_harfbuzz_includedir}/harfbuzz"
+  INTERFACE_LINK_LIBRARIES "harfbuzz::harfbuzz"
+  IMPORTED_LOCATION "${_harfbuzz_prefix}/${_harfbuzz_libdir}/libharfbuzz-subset${_harfbuzz_lib_suffix}")
+
+# Only add the gobject library if it was built.
+set(_harfbuzz_have_gobject "@have_gobject@")
+if (_harfbuzz_have_gobject)
+  add_library(harfbuzz::gobject SHARED IMPORTED)
+  set_target_properties(harfbuzz::gobject PROPERTIES
+    INTERFACE_INCLUDE_DIRECTORIES "${_harfbuzz_prefix}/${_harfbuzz_includedir}/harfbuzz"
+    INTERFACE_LINK_LIBRARIES "harfbuzz::harfbuzz"
+    IMPORTED_LOCATION "${_harfbuzz_prefix}/${_harfbuzz_libdir}/libharfbuzz-gobject${_harfbuzz_lib_suffix}")
+endif ()
+
+# Clean out variables we used in our scope.
+unset(_harfbuzz_lib_suffix)
+unset(_harfbuzz_current)
+unset(_harfbuzz_revision)
+unset(_harfbuzz_age)
+unset(_harfbuzz_includedir)
+unset(_harfbuzz_libdir)
+unset(_harfbuzz_prefix)
+unset(exec_prefix)
+unset(prefix)
+unset(_harfbuzz_remove_string)

Added: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/harfbuzz-subset.pc.in
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/harfbuzz-subset.pc.in	                        (rev 0)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/harfbuzz-subset.pc.in	2018-03-07 22:32:14 UTC (rev 46877)
@@ -0,0 +1,12 @@
+prefix=%prefix%
+exec_prefix=%exec_prefix%
+libdir=%libdir%
+includedir=%includedir%
+
+Name: harfbuzz
+Description: HarfBuzz font subsetter
+Version: %VERSION%
+
+Requires: harfbuzz
+Libs: -L${libdir} -lharfbuzz-subset
+Cflags: -I${includedir}/harfbuzz

Added: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-ankr-table.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-ankr-table.hh	                        (rev 0)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-ankr-table.hh	2018-03-07 22:32:14 UTC (rev 46877)
@@ -0,0 +1,80 @@
+/*
+ * 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.
+ */
+
+#ifndef HB_AAT_LAYOUT_ANKR_TABLE_HH
+#define HB_AAT_LAYOUT_ANKR_TABLE_HH
+
+#include "hb-aat-layout-common-private.hh"
+
+#define HB_AAT_TAG_ankr HB_TAG('a','n','k','r')
+
+
+namespace AAT {
+
+
+/*
+ * ankr -- Anchor point
+ */
+
+struct Anchor
+{
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this));
+  }
+
+  FWORD		xCoordinate;
+  FWORD		yCoordinate;
+  public:
+  DEFINE_SIZE_STATIC (4);
+};
+
+struct ankr
+{
+  static const hb_tag_t tableTag = HB_AAT_TAG_ankr;
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) && version == 0 &&
+		  lookupTable.sanitize (c, this) &&
+		  anchors.sanitize (c, this));
+  }
+
+  protected:
+  HBUINT16			version; 	/* Version number (set to zero) */
+  HBUINT16			flags;		/* Flags (currently unused; set to zero) */
+  LOffsetTo<Lookup<HBUINT16> >	lookupTable;	/* Offset to the table's lookup table */
+  LOffsetTo<ArrayOf<Anchor, HBUINT32> >
+				anchors;	/* Offset to the glyph data table */
+
+  public:
+  DEFINE_SIZE_STATIC (12);
+};
+
+} /* namespace AAT */
+
+
+#endif /* HB_AAT_LAYOUT_ANKR_TABLE_HH */

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-common-private.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-common-private.hh	2018-03-07 21:52:46 UTC (rev 46876)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-common-private.hh	2018-03-07 22:32:14 UTC (rev 46877)
@@ -120,7 +120,7 @@
       else
 	return p;
     }
-    return NULL;
+    return nullptr;
   }
 
   private:
@@ -563,9 +563,9 @@
     unsigned int entry = 0;
     while (state < num_states)
     {
-      if (unlikely (!c->check_array (states + state * nClasses,
-				     states[0].static_size,
-				     nClasses * (num_states - state))))
+      if (unlikely (!c->check_array (states,
+				     states[0].static_size * nClasses,
+				     num_states)))
 	return_trace (false);
       { /* Sweep new states. */
 	const HBUINT16 *stop = &states[num_states * nClasses];
@@ -574,9 +574,9 @@
 	state = num_states;
       }
 
-      if (unlikely (!c->check_array (entries + entry,
+      if (unlikely (!c->check_array (entries,
 				     entries[0].static_size,
-				     num_entries - entry)))
+				     num_entries)))
 	return_trace (false);
       { /* Sweep new entries. */
 	const Entry<Extra> *stop = &entries[num_entries];
@@ -614,8 +614,7 @@
 			   hb_face_t *face_) :
 	      machine (machine_),
 	      buffer (buffer_),
-	      num_glyphs (face_->get_num_glyphs ()),
-	      last_zero (0) {}
+	      num_glyphs (face_->get_num_glyphs ()) {}
 
   template <typename context_t>
   inline void drive (context_t *c)
@@ -629,9 +628,6 @@
     bool last_was_dont_advance = false;
     for (buffer->idx = 0;;)
     {
-      if (!state)
-	last_zero = buffer->idx;
-
       unsigned int klass = buffer->idx < buffer->len ?
 			   machine.get_class (info[buffer->idx].codepoint, num_glyphs) :
 			   0 /* End of text */;
@@ -639,10 +635,29 @@
       if (unlikely (!entry))
 	break;
 
+      /* Unsafe-to-break before this if not in state 0, as things might
+       * go differently if we start from state 0 here. */
+      if (state && buffer->idx)
+      {
+	/* If there's no action and we're just epsilon-transitioning to state 0,
+	 * safe to break. */
+	if (c->is_actionable (this, entry) ||
+	    !(entry->newState == 0 && entry->flags == context_t::DontAdvance))
+	  buffer->unsafe_to_break (buffer->idx - 1, buffer->idx + 1);
+      }
+
+      /* Unsafe-to-break if end-of-text would kick in here. */
+      if (buffer->idx + 2 <= buffer->len)
+      {
+	const Entry<EntryData> *end_entry = machine.get_entryZ (state, 0);
+	if (c->is_actionable (this, end_entry))
+	  buffer->unsafe_to_break (buffer->idx, buffer->idx + 2);
+      }
+
       if (unlikely (!c->transition (this, entry)))
         break;
 
-      last_was_dont_advance = (entry->flags & context_t::DontAdvance) && buffer->max_ops--;
+      last_was_dont_advance = (entry->flags & context_t::DontAdvance) && buffer->max_ops-- > 0;
 
       state = entry->newState;
 
@@ -665,7 +680,6 @@
   const StateTable<EntryData> &machine;
   hb_buffer_t *buffer;
   unsigned int num_glyphs;
-  unsigned int last_zero;
 };
 
 
@@ -684,11 +698,15 @@
   hb_buffer_t *buffer;
   hb_sanitize_context_t sanitizer;
 
+  /* Unused. For debug tracing only. */
+  unsigned int lookup_index;
+  unsigned int debug_depth;
+
   inline hb_aat_apply_context_t (hb_font_t *font_,
 				 hb_buffer_t *buffer_,
 				 hb_blob_t *table) :
 		font (font_), face (font->face), buffer (buffer_),
-		sanitizer ()
+		sanitizer (), lookup_index (0), debug_depth (0)
   {
     sanitizer.init (table);
     sanitizer.num_glyphs = face->get_num_glyphs ();
@@ -695,6 +713,8 @@
     sanitizer.start_processing ();
   }
 
+  inline void set_lookup_index (unsigned int i) { lookup_index = i; }
+
   inline ~hb_aat_apply_context_t (void)
   {
     sanitizer.end_processing ();

Added: 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	                        (rev 0)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-kerx-table.hh	2018-03-07 22:32:14 UTC (rev 46877)
@@ -0,0 +1,339 @@
+/*
+ * Copyright © 2018  Ebrahim Byagowi
+ * 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_LAYOUT_KERX_TABLE_HH
+#define HB_AAT_LAYOUT_KERX_TABLE_HH
+
+#include "hb-open-type-private.hh"
+#include "hb-aat-layout-common-private.hh"
+
+#define HB_AAT_TAG_KERX HB_TAG('k','e','r','x')
+
+
+namespace AAT {
+
+using namespace OT;
+
+
+struct KerxFormat0Records
+{
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this));
+  }
+
+  protected:
+  GlyphID	left;
+  GlyphID	right;
+  FWORD		value;
+  public:
+  DEFINE_SIZE_STATIC (6);
+};
+
+struct KerxSubTableFormat0
+{
+  // TODO(ebraminio) Enable when we got suitable BinSearchArrayOf
+  // inline int get_kerning (hb_codepoint_t left, hb_codepoint_t right) const
+  // {
+  //   hb_glyph_pair_t pair = {left, right};
+  //   int i = pairs.bsearch (pair);
+  //   if (i == -1)
+  //     return 0;
+  //   return pairs[i].get_kerning ();
+  // }
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) &&
+      c->check_array (records, records[0].static_size, nPairs));
+  }
+
+  protected:
+  // TODO(ebraminio): A custom version of "BinSearchArrayOf<KerxPair> pairs;" is
+  // needed here to use HBUINT32 instead
+  HBUINT32 nPairs;	/* The number of kerning pairs in this subtable */
+  HBUINT32 searchRange; /* The largest power of two less than or equal to the value of nPairs,
+                         * multiplied by the size in bytes of an entry in the subtable. */
+  HBUINT32 entrySelector; /* This is calculated as log2 of the largest power of two less
+                           * than or equal to the value of nPairs. */
+  HBUINT32 rangeShift;	/* The value of nPairs minus the largest power of two less than or equal to nPairs. */
+  KerxFormat0Records records[VAR]; /* VAR=nPairs */
+  public:
+  DEFINE_SIZE_ARRAY (16, records);
+};
+
+struct KerxSubTableFormat1
+{
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) &&
+      stateHeader.sanitize (c));
+  }
+
+  protected:
+  StateTable<HBUINT16>		stateHeader;
+  LOffsetTo<ArrayOf<HBUINT16> >	valueTable;
+  public:
+  DEFINE_SIZE_STATIC (20);
+};
+
+// TODO(ebraminio): Maybe this can be replaced with Lookup<HBUINT16>?
+struct KerxClassTable
+{
+  inline unsigned int get_class (hb_codepoint_t g) const { return classes[g - firstGlyph]; }
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (firstGlyph.sanitize (c) && classes.sanitize (c));
+  }
+
+  protected:
+  HBUINT16		firstGlyph;	/* First glyph in class range. */
+  ArrayOf<HBUINT16>	classes;	/* Glyph classes. */
+  public:
+  DEFINE_SIZE_ARRAY (4, classes);
+};
+
+struct KerxSubTableFormat2
+{
+  inline int get_kerning (hb_codepoint_t left, hb_codepoint_t right, const char *end) const
+  {
+    unsigned int l = (this+leftClassTable).get_class (left);
+    unsigned int r = (this+leftClassTable).get_class (left);
+    unsigned int offset = l * rowWidth + r * sizeof (FWORD);
+    const FWORD *arr = &(this+array);
+    if (unlikely ((const void *) arr < (const void *) this || (const void *) arr >= (const void *) end))
+      return 0;
+    const FWORD *v = &StructAtOffset<FWORD> (arr, offset);
+    if (unlikely ((const void *) v < (const void *) arr || (const void *) (v + 1) > (const void *) end))
+      return 0;
+    return *v;
+  }
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) &&
+      rowWidth.sanitize (c) &&
+		  leftClassTable.sanitize (c, this) &&
+		  rightClassTable.sanitize (c, this) &&
+		  array.sanitize (c, this));
+  }
+
+  protected:
+  HBUINT32	rowWidth;	/* The width, in bytes, of a row in the table. */
+  LOffsetTo<KerxClassTable>
+		leftClassTable;	/* Offset from beginning of this subtable to
+				 * left-hand class table. */
+  LOffsetTo<KerxClassTable>
+		rightClassTable;/* Offset from beginning of this subtable to
+				 * right-hand class table. */
+  LOffsetTo<FWORD>
+		array;		/* Offset from beginning of this subtable to
+				 * the start of the kerning array. */
+  public:
+  DEFINE_SIZE_STATIC (16);
+};
+
+struct KerxSubTableFormat4
+{
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) &&
+      rowWidth.sanitize (c) &&
+		  leftClassTable.sanitize (c, this) &&
+		  rightClassTable.sanitize (c, this) &&
+		  array.sanitize (c, this));
+  }
+
+  protected:
+  HBUINT32	rowWidth;	/* The width, in bytes, of a row in the table. */
+  LOffsetTo<KerxClassTable>
+		leftClassTable;	/* Offset from beginning of this subtable to
+				 * left-hand class table. */
+  LOffsetTo<KerxClassTable>
+		rightClassTable;/* Offset from beginning of this subtable to
+				 * right-hand class table. */
+  LOffsetTo<FWORD>
+		array;		/* Offset from beginning of this subtable to
+				 * the start of the kerning array. */
+  public:
+  DEFINE_SIZE_STATIC (16);
+};
+
+struct KerxSubTableFormat6
+{
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) &&
+      rowIndexTable.sanitize (c, this) &&
+      columnIndexTable.sanitize (c, this) &&
+      kerningArray.sanitize (c, this) &&
+      kerningVector.sanitize (c, this));
+  }
+
+  protected:
+  HBUINT32	flags;
+  HBUINT16	rowCount;
+  HBUINT16	columnCount;
+  LOffsetTo<Lookup<HBUINT16> >	rowIndexTable;
+  LOffsetTo<Lookup<HBUINT16> >	columnIndexTable;
+  LOffsetTo<Lookup<HBUINT16> >	kerningArray;
+  LOffsetTo<Lookup<HBUINT16> >	kerningVector;
+  public:
+  DEFINE_SIZE_STATIC (24);
+};
+
+enum coverage_flags_t
+{
+  COVERAGE_VERTICAL_FLAG	= 0x80u,
+  COVERAGE_CROSSSTREAM_FLAG	= 0x40u,
+  COVERAGE_VARIATION_FLAG	= 0x20u,
+  COVERAGE_PROCESS_DIRECTION	= 0x10u,
+};
+
+struct KerxTable
+{
+  inline bool apply (hb_aat_apply_context_t *c, const AAT::ankr *ankr) const
+  {
+    TRACE_APPLY (this);
+    /* TODO */
+    return_trace (false);
+  }
+
+  inline unsigned int get_size (void) const { return length; }
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    if (!c->check_struct (this))
+      return_trace (false);
+
+    switch (format) {
+    case 0: return u.format0.sanitize (c);
+    case 1: return u.format1.sanitize (c);
+    case 2: return u.format2.sanitize (c);
+    case 4: return u.format4.sanitize (c);
+    case 6: return u.format6.sanitize (c);
+    default:return_trace (false);
+    }
+  }
+
+protected:
+  HBUINT32	length;
+  HBUINT8	coverage;
+  HBUINT16	unused;
+  HBUINT8	format;
+  HBUINT32	tupleIndex;
+  union {
+  KerxSubTableFormat0	format0;
+  KerxSubTableFormat1	format1;
+  KerxSubTableFormat2	format2;
+  KerxSubTableFormat4	format4;
+  KerxSubTableFormat6	format6;
+  } u;
+public:
+  DEFINE_SIZE_MIN (12);
+};
+
+struct SubtableGlyphCoverageArray
+{
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this));
+  }
+
+  protected:
+  HBUINT32	length;
+  HBUINT32	coverage;
+  HBUINT32	tupleCount;
+  public:
+  DEFINE_SIZE_STATIC (12);
+};
+
+struct kerx
+{
+  static const hb_tag_t tableTag = HB_AAT_TAG_KERX;
+
+  inline bool apply (hb_aat_apply_context_t *c, const AAT::ankr *ankr) const
+  {
+    TRACE_APPLY (this);
+    const KerxTable &table = StructAfter<KerxTable> (*this);
+    return_trace (table.apply (c, ankr));
+  }
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    if (!(c->check_struct (this)))
+     return_trace (false);
+
+    /* TODO: Something like `morx`s ChainSubtable should be done here instead */
+    const KerxTable *table = &StructAfter<KerxTable> (*this);
+    if (!(table->sanitize (c)))
+      return_trace (false);
+
+    for (unsigned int i = 0; i < nTables - 1; ++i)
+    {
+      table = &StructAfter<KerxTable> (*table);
+      if (!(table->sanitize (c)))
+        return_trace (false);
+    }
+
+    // If version is less than 3, we are done here; otherwise better to check footer also
+    if (version < 3)
+      return_trace (true);
+
+    // TODO: Investigate why this just work on some fonts no matter of version
+    // const SubtableGlyphCoverageArray &footer =
+    //   StructAfter<SubtableGlyphCoverageArray> (*table);
+    // return_trace (footer.sanitize (c));
+
+    return_trace (true);
+  }
+
+  protected:
+  HBUINT16		version;
+  HBUINT16		padding;
+  HBUINT32		nTables;
+/*KerxTable tables[VAR];*/
+/*SubtableGlyphCoverageArray coverage_array;*/
+  public:
+  DEFINE_SIZE_STATIC (8);
+};
+
+} /* namespace AAT */
+
+
+#endif /* HB_AAT_LAYOUT_KERX_TABLE_HH */

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-03-07 21:52:46 UTC (rev 46876)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-morx-table.hh	2018-03-07 22:32:14 UTC (rev 46877)
@@ -40,6 +40,8 @@
 
 struct RearrangementSubtable
 {
+  typedef void EntryData;
+
   struct driver_context_t
   {
     static const bool in_place = true;
@@ -58,20 +60,21 @@
 
     inline driver_context_t (const RearrangementSubtable *table) :
 	ret (false),
-	start (0), end (0),
-	last_zero_before_start (0) {}
+	start (0), end (0) {}
 
-    inline bool transition (StateTableDriver<void> *driver,
-			    const Entry<void> *entry)
+    inline bool is_actionable (StateTableDriver<EntryData> *driver,
+			       const Entry<EntryData> *entry)
     {
+      return (entry->flags & Verb) && start < end;
+    }
+    inline bool transition (StateTableDriver<EntryData> *driver,
+			    const Entry<EntryData> *entry)
+    {
       hb_buffer_t *buffer = driver->buffer;
       unsigned int flags = entry->flags;
 
       if (flags & MarkFirst)
-      {
 	start = buffer->idx;
-	last_zero_before_start = driver->last_zero;
-      }
 
       if (flags & MarkLast)
 	end = MIN (buffer->idx + 1, buffer->len);
@@ -110,7 +113,7 @@
 
 	if (end - start >= l + r)
 	{
-	  buffer->unsafe_to_break (last_zero_before_start, MIN (buffer->idx + 1, buffer->len));
+	  buffer->merge_clusters (start, MIN (buffer->idx + 1, buffer->len));
 	  buffer->merge_clusters (start, end);
 
 	  hb_glyph_info_t *info = buffer->info;
@@ -147,7 +150,6 @@
     private:
     unsigned int start;
     unsigned int end;
-    unsigned int last_zero_before_start;
   };
 
   inline bool apply (hb_aat_apply_context_t *c) const
@@ -169,7 +171,7 @@
   }
 
   protected:
-  StateTable<void>	machine;
+  StateTable<EntryData>	machine;
   public:
   DEFINE_SIZE_STATIC (16);
 };
@@ -198,20 +200,29 @@
 
     inline driver_context_t (const ContextualSubtable *table) :
 	ret (false),
+	mark_set (false),
 	mark (0),
-	last_zero_before_mark (0),
 	subs (table+table->substitutionTables) {}
 
+    inline bool is_actionable (StateTableDriver<EntryData> *driver,
+			       const Entry<EntryData> *entry)
+    {
+      hb_buffer_t *buffer = driver->buffer;
+
+      if (buffer->idx == buffer->len && !mark_set)
+        return false;
+
+      return entry->data.markIndex != 0xFFFF || entry->data.currentIndex != 0xFFFF;
+    }
     inline bool transition (StateTableDriver<EntryData> *driver,
 			    const Entry<EntryData> *entry)
     {
       hb_buffer_t *buffer = driver->buffer;
 
-      if (entry->flags & SetMark)
-      {
-	mark = buffer->idx;
-	last_zero_before_mark = driver->last_zero;
-      }
+      /* Looks like CoreText applies neither mark nor current substitution for
+       * end-of-text if mark was not explicitly set. */
+      if (buffer->idx == buffer->len && !mark_set)
+        return true;
 
       if (entry->data.markIndex != 0xFFFF)
       {
@@ -220,7 +231,7 @@
 	const GlyphID *replacement = lookup.get_value (info[mark].codepoint, driver->num_glyphs);
 	if (replacement)
 	{
-	  buffer->unsafe_to_break (last_zero_before_mark, MIN (buffer->idx + 1, buffer->len));
+	  buffer->unsafe_to_break (mark, MIN (buffer->idx + 1, buffer->len));
 	  info[mark].codepoint = *replacement;
 	  ret = true;
 	}
@@ -227,17 +238,23 @@
       }
       if (entry->data.currentIndex != 0xFFFF)
       {
+        unsigned int idx = MIN (buffer->idx, buffer->len - 1);
 	const Lookup<GlyphID> &lookup = subs[entry->data.currentIndex];
 	hb_glyph_info_t *info = buffer->info;
-	const GlyphID *replacement = lookup.get_value (info[buffer->idx].codepoint, driver->num_glyphs);
+	const GlyphID *replacement = lookup.get_value (info[idx].codepoint, driver->num_glyphs);
 	if (replacement)
 	{
-	  buffer->unsafe_to_break (driver->last_zero, MIN (buffer->idx + 1, buffer->len));
-	  info[buffer->idx].codepoint = *replacement;
+	  info[idx].codepoint = *replacement;
 	  ret = true;
 	}
       }
 
+      if (entry->flags & SetMark)
+      {
+	mark_set = true;
+	mark = buffer->idx;
+      }
+
       return true;
     }
 
@@ -244,8 +261,8 @@
     public:
     bool ret;
     private:
+    bool mark_set;
     unsigned int mark;
-    unsigned int last_zero_before_mark;
     const UnsizedOffsetListOf<Lookup<GlyphID>, HBUINT32> &subs;
   };
 
@@ -265,8 +282,8 @@
   {
     TRACE_SANITIZE (this);
 
-    unsigned int num_entries;
-    if (unlikely (!machine.sanitize (c, &num_entries))) return false;
+    unsigned int num_entries = 0;
+    if (unlikely (!machine.sanitize (c, &num_entries))) return_trace (false);
 
     unsigned int num_lookups = 0;
 
@@ -275,8 +292,10 @@
     {
       const EntryData &data = entries[i].data;
 
-      num_lookups = MAX<unsigned int> (num_lookups, 1 + data.markIndex);
-      num_lookups = MAX<unsigned int> (num_lookups, 1 + data.currentIndex);
+      if (data.markIndex != 0xFFFF)
+	num_lookups = MAX<unsigned int> (num_lookups, 1 + data.markIndex);
+      if (data.currentIndex != 0xFFFF)
+	num_lookups = MAX<unsigned int> (num_lookups, 1 + data.currentIndex);
     }
 
     return_trace (substitutionTables.sanitize (c, this, num_lookups));
@@ -333,6 +352,11 @@
 	ligature (table+table->ligature),
 	match_length (0) {}
 
+    inline bool is_actionable (StateTableDriver<EntryData> *driver,
+			       const Entry<EntryData> *entry)
+    {
+      return !!(entry->flags & PerformAction);
+    }
     inline bool transition (StateTableDriver<EntryData> *driver,
 			    const Entry<EntryData> *entry)
     {
@@ -432,9 +456,8 @@
   {
     TRACE_SANITIZE (this);
     /* The rest of array sanitizations are done at run-time. */
-    return c->check_struct (this) && machine.sanitize (c) &&
-	   ligAction && component && ligature;
-    return_trace (true);
+    return_trace (c->check_struct (this) && machine.sanitize (c) &&
+		  ligAction && component && ligature);
   }
 
   protected:
@@ -593,8 +616,18 @@
     unsigned int count = subtableCount;
     for (unsigned int i = 0; i < count; i++)
     {
+      if (!c->buffer->message (c->font, "start chain subtable %d", c->lookup_index))
+      {
+	c->set_lookup_index (c->lookup_index + 1);
+	continue;
+      }
+
       subtable->apply (c);
       subtable = &StructAfter<ChainSubtable> (*subtable);
+
+      (void) c->buffer->message (c->font, "end chain subtable %d", c->lookup_index);
+
+      c->set_lookup_index (c->lookup_index + 1);
     }
   }
 
@@ -648,6 +681,7 @@
 
   inline void apply (hb_aat_apply_context_t *c) const
   {
+    c->set_lookup_index (0);
     const Chain *chain = chains;
     unsigned int count = chainCount;
     for (unsigned int i = 0; i < count; i++)

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-private.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-private.hh	2018-03-07 21:52:46 UTC (rev 46876)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-private.hh	2018-03-07 22:32:14 UTC (rev 46877)
@@ -37,4 +37,7 @@
 HB_INTERNAL void
 hb_aat_layout_substitute (hb_font_t *font, hb_buffer_t *buffer);
 
+HB_INTERNAL void
+hb_aat_layout_position (hb_font_t *font, hb_buffer_t *buffer);
+
 #endif /* HB_AAT_LAYOUT_PRIVATE_HH */

Added: 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	                        (rev 0)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-trak-table.hh	2018-03-07 22:32:14 UTC (rev 46877)
@@ -0,0 +1,201 @@
+/*
+ * Copyright © 2018  Ebrahim Byagowi
+ * 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_LAYOUT_TRAK_TABLE_HH
+#define HB_AAT_LAYOUT_TRAK_TABLE_HH
+
+#include "hb-aat-layout-common-private.hh"
+#include "hb-open-type-private.hh"
+
+#define HB_AAT_TAG_trak HB_TAG('t','r','a','k')
+
+
+namespace AAT {
+
+
+struct TrackTableEntry
+{
+  inline bool sanitize (hb_sanitize_context_t *c, const void *base, unsigned int size) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) && (values.sanitize (c, base, size)));
+  }
+
+  inline float get_track_value () const
+  {
+    return track.to_float ();
+  }
+
+  inline int get_value (const void *base, unsigned int index) const
+  {
+    return (base+values)[index];
+  }
+
+  protected:
+  Fixed			track;		/* Track value for this record. */
+  HBUINT16		trackNameID;	/* The 'name' table index for this track */
+  OffsetTo<UnsizedArrayOf<FWORD> >
+			values;		/* Offset from start of tracking table to
+					 * per-size tracking values for this track. */
+
+  public:
+  DEFINE_SIZE_STATIC (8);
+};
+
+struct TrackData
+{
+  inline bool sanitize (hb_sanitize_context_t *c, const void *base) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) &&
+		  sizeTable.sanitize (c, base, nSizes) &&
+		  trackTable.sanitize (c, nTracks, base, nSizes));
+  }
+
+  inline float get_tracking (const void *base, float ptem) const
+  {
+    /* CoreText points are CSS pixels (96 per inch),
+     * NOT typographic points (72 per inch).
+     *
+     * https://developer.apple.com/library/content/documentation/GraphicsAnimation/Conceptual/HighResolutionOSX/Explained/Explained.html
+     */
+    float csspx = ptem * 96.f / 72.f;
+    Fixed fixed_size;
+    fixed_size.set_float (csspx);
+
+    /* XXX Clean this up. Make it work with nSizes==1 and 0. */
+
+    unsigned int sizes = nSizes;
+
+    const TrackTableEntry *trackTableEntry = nullptr;
+    for (unsigned int i = 0; i < sizes; ++i)
+      // For now we only seek for track entries with zero tracking value
+      if (trackTable[i].get_track_value () == 0.)
+        trackTableEntry = &trackTable[0];
+
+    // We couldn't match any, exit
+    if (!trackTableEntry) return 0.;
+
+    /* TODO bfind() */
+    unsigned int size_index;
+    UnsizedArrayOf<Fixed> size_table = base+sizeTable;
+    for (size_index = 0; size_index < sizes; ++size_index)
+      if (size_table[size_index] >= fixed_size)
+        break;
+
+    // TODO(ebraminio): We don't attempt to extrapolate to larger or
+    // smaller values for now but we should do, per spec
+    if (size_index == sizes)
+      return trackTableEntry->get_value (base, sizes - 1);
+    if (size_index == 0 || size_table[size_index] == fixed_size)
+      return trackTableEntry->get_value (base, size_index);
+
+    float s0 = size_table[size_index - 1].to_float ();
+    float s1 = size_table[size_index].to_float ();
+    float t = (csspx - s0) / (s1 - s0);
+    return t * trackTableEntry->get_value (base, size_index) +
+      (1.0 - t) * trackTableEntry->get_value (base, size_index - 1);
+  }
+
+  protected:
+  HBUINT16		nTracks;	/* Number of separate tracks included in this table. */
+  HBUINT16		nSizes;		/* Number of point sizes included in this table. */
+  LOffsetTo<UnsizedArrayOf<Fixed> >	/* Offset to array[nSizes] of size values. */
+			sizeTable;
+  UnsizedArrayOf<TrackTableEntry>
+			trackTable;	/* Array[nTracks] of TrackTableEntry records. */
+
+  public:
+  DEFINE_SIZE_ARRAY (8, trackTable);
+};
+
+struct trak
+{
+  static const hb_tag_t tableTag = HB_AAT_TAG_trak;
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+
+    return_trace (c->check_struct (this) &&
+		  horizData.sanitize (c, this, this) &&
+		  vertData.sanitize (c, this, this));
+  }
+
+  inline bool apply (hb_aat_apply_context_t *c) const
+  {
+    TRACE_APPLY (this);
+
+    const float ptem = c->font->ptem;
+    if (ptem <= 0.f)
+      return_trace (false);
+
+    hb_buffer_t *buffer = c->buffer;
+    if (HB_DIRECTION_IS_HORIZONTAL (buffer->props.direction))
+    {
+      const TrackData &trackData = this+horizData;
+      float tracking = trackData.get_tracking (this, ptem);
+      hb_position_t advance_to_add = c->font->em_scalef_x (tracking / 2);
+      foreach_grapheme (buffer, start, end)
+      {
+	/* TODO This is wrong. */
+	buffer->pos[start].x_advance += advance_to_add;
+	buffer->pos[end].x_advance += advance_to_add;
+      }
+    }
+    else
+    {
+      const TrackData &trackData = this+vertData;
+      float tracking = trackData.get_tracking (this, ptem);
+      hb_position_t advance_to_add = c->font->em_scalef_y (tracking / 2);
+      foreach_grapheme (buffer, start, end)
+      {
+	/* TODO This is wrong. */
+	buffer->pos[start].y_advance += advance_to_add;
+	buffer->pos[end].y_advance += advance_to_add;
+      }
+    }
+
+    return_trace (true);
+  }
+
+  protected:
+  FixedVersion<>	version;	/* Version of the tracking table--currently
+					 * 0x00010000u for version 1.0. */
+  HBUINT16		format; 	/* Format of the tracking table */
+  OffsetTo<TrackData>	horizData;	/* TrackData for horizontal text */
+  OffsetTo<TrackData>	vertData;	/* TrackData for vertical text */
+  HBUINT16		reserved;	/* Reserved. Set to 0. */
+
+  public:
+  DEFINE_SIZE_MIN (12);
+};
+
+} /* namespace AAT */
+
+
+#endif /* HB_AAT_LAYOUT_TRAK_TABLE_HH */

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-03-07 21:52:46 UTC (rev 46876)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout.cc	2018-03-07 22:32:14 UTC (rev 46877)
@@ -30,12 +30,48 @@
 #include "hb-ot-layout-gsubgpos-private.hh"
 
 #include "hb-aat-layout-private.hh"
+#include "hb-aat-layout-ankr-table.hh"
+#include "hb-aat-layout-kerx-table.hh"
 #include "hb-aat-layout-morx-table.hh"
+#include "hb-aat-layout-trak-table.hh"
 
 /*
- * mort/morx
+ * morx/kerx/trak
  */
 
+static inline const AAT::ankr&
+_get_ankr (hb_face_t *face, hb_blob_t **blob = nullptr)
+{
+  if (unlikely (!hb_ot_shaper_face_data_ensure (face)))
+  {
+    if (blob)
+      *blob = hb_blob_get_empty ();
+    return OT::Null(AAT::ankr);
+  }
+  hb_ot_layout_t * layout = hb_ot_layout_from_face (face);
+  const AAT::ankr& ankr = *(layout->ankr.get ());
+  if (blob)
+    *blob = layout->ankr.blob;
+  return ankr;
+}
+
+static inline const AAT::kerx&
+_get_kerx (hb_face_t *face, hb_blob_t **blob = nullptr)
+{
+  if (unlikely (!hb_ot_shaper_face_data_ensure (face)))
+  {
+    if (blob)
+      *blob = hb_blob_get_empty ();
+    return OT::Null(AAT::kerx);
+  }
+  hb_ot_layout_t * layout = hb_ot_layout_from_face (face);
+  /* XXX this doesn't call set_num_glyphs on sanitizer. */
+  const AAT::kerx& kerx = *(layout->kerx.get ());
+  if (blob)
+    *blob = layout->kerx.blob;
+  return kerx;
+}
+
 static inline const AAT::morx&
 _get_morx (hb_face_t *face, hb_blob_t **blob = nullptr)
 {
@@ -53,20 +89,36 @@
   return morx;
 }
 
-static inline void
-_hb_aat_layout_create (hb_face_t *face)
+static inline const AAT::trak&
+_get_trak (hb_face_t *face, hb_blob_t **blob = nullptr)
 {
-  OT::Sanitizer<AAT::morx> sanitizer;
-  sanitizer.set_num_glyphs (face->get_num_glyphs ());
-  hb_blob_t *morx_blob = sanitizer.sanitize (face->reference_table (HB_AAT_TAG_MORX));
-  OT::Sanitizer<AAT::morx>::lock_instance (morx_blob);
-
-  if (0)
+  if (unlikely (!hb_ot_shaper_face_data_ensure (face)))
   {
-    OT::Sanitizer<AAT::Lookup<OT::GlyphID> >::lock_instance (morx_blob)->get_value (1, face->get_num_glyphs ());
+    if (blob)
+      *blob = hb_blob_get_empty ();
+    return OT::Null(AAT::trak);
   }
+  hb_ot_layout_t * layout = hb_ot_layout_from_face (face);
+  const AAT::trak& trak = *(layout->trak.get ());
+  if (blob)
+    *blob = layout->trak.blob;
+  return trak;
 }
 
+// static inline void
+// _hb_aat_layout_create (hb_face_t *face)
+// {
+//   OT::Sanitizer<AAT::morx> sanitizer;
+//   sanitizer.set_num_glyphs (face->get_num_glyphs ());
+//   hb_blob_t *morx_blob = sanitizer.sanitize (face->reference_table (HB_AAT_TAG_MORX));
+//   OT::Sanitizer<AAT::morx>::lock_instance (morx_blob);
+
+//   if (0)
+//   {
+//     OT::Sanitizer<AAT::Lookup<OT::GlyphID> >::lock_instance (morx_blob)->get_value (1, face->get_num_glyphs ());
+//   }
+// }
+
 void
 hb_aat_layout_substitute (hb_font_t *font, hb_buffer_t *buffer)
 {
@@ -76,3 +128,16 @@
   AAT::hb_aat_apply_context_t c (font, buffer, blob);
   morx.apply (&c);
 }
+
+void
+hb_aat_layout_position (hb_font_t *font, hb_buffer_t *buffer)
+{
+  hb_blob_t *blob;
+  const AAT::ankr& ankr = _get_ankr (font->face, &blob);
+  const AAT::kerx& kerx = _get_kerx (font->face, &blob);
+  const AAT::trak& trak = _get_trak (font->face, &blob);
+
+  AAT::hb_aat_apply_context_t c (font, buffer, blob);
+  kerx.apply (&c, &ankr);
+  trak.apply (&c);
+}

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-blob.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-blob.cc	2018-03-07 21:52:46 UTC (rev 46876)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-blob.cc	2018-03-07 22:32:14 UTC (rev 46877)
@@ -171,6 +171,31 @@
 }
 
 /**
+ * hb_blob_copy_writable_or_fail:
+ * @blob: A blob.
+ *
+ * Makes a writable copy of @blob.
+ *
+ * Return value: New blob, or nullptr if allocation failed.
+ *
+ * Since: 1.8.0
+ **/
+hb_blob_t *
+hb_blob_copy_writable_or_fail (hb_blob_t *blob)
+{
+  blob = hb_blob_create (blob->data,
+			 blob->length,
+			 HB_MEMORY_MODE_DUPLICATE,
+			 nullptr,
+			 nullptr);
+
+  if (unlikely (blob == hb_blob_get_empty ()))
+    blob = nullptr;
+
+  return blob;
+}
+
+/**
  * hb_blob_get_empty:
  *
  * Returns the singleton empty blob.
@@ -222,7 +247,7 @@
  * hb_blob_destroy: (skip)
  * @blob: a blob.
  *
- * Descreases the reference count on @blob, and if it reaches zero, destroys
+ * Decreases the reference count on @blob, and if it reaches zero, destroys
  * @blob, freeing all memory, possibly calling the destroy-callback the blob
  * was created for if it has not been called already.
  *

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-blob.h
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-blob.h	2018-03-07 21:52:46 UTC (rev 46876)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-blob.h	2018-03-07 22:32:14 UTC (rev 46877)
@@ -83,6 +83,9 @@
 			 unsigned int  length);
 
 HB_EXTERN hb_blob_t *
+hb_blob_copy_writable_or_fail (hb_blob_t *blob);
+
+HB_EXTERN hb_blob_t *
 hb_blob_get_empty (void);
 
 HB_EXTERN hb_blob_t *

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer-deserialize-json.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer-deserialize-json.hh	2018-03-07 21:52:46 UTC (rev 46876)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer-deserialize-json.hh	2018-03-07 22:32:14 UTC (rev 46877)
@@ -34,397 +34,397 @@
 
 #line 36 "hb-buffer-deserialize-json.hh"
 static const unsigned char _deserialize_json_trans_keys[] = {
-	0u, 0u, 9u, 123u, 9u, 34u, 97u, 103u, 120u, 121u, 34u, 34u, 9u, 58u, 9u, 57u, 
-	48u, 57u, 9u, 125u, 9u, 125u, 9u, 125u, 34u, 34u, 9u, 58u, 9u, 57u, 48u, 57u, 
-	9u, 125u, 9u, 125u, 108u, 108u, 34u, 34u, 9u, 58u, 9u, 57u, 9u, 125u, 9u, 125u, 
-	120u, 121u, 34u, 34u, 9u, 58u, 9u, 57u, 48u, 57u, 9u, 125u, 9u, 125u, 34u, 34u, 
-	9u, 58u, 9u, 57u, 48u, 57u, 9u, 125u, 9u, 125u, 34u, 34u, 9u, 58u, 9u, 57u, 
+	0u, 0u, 9u, 123u, 9u, 34u, 97u, 103u, 120u, 121u, 34u, 34u, 9u, 58u, 9u, 57u,
+	48u, 57u, 9u, 125u, 9u, 125u, 9u, 125u, 34u, 34u, 9u, 58u, 9u, 57u, 48u, 57u,
+	9u, 125u, 9u, 125u, 108u, 108u, 34u, 34u, 9u, 58u, 9u, 57u, 9u, 125u, 9u, 125u,
+	120u, 121u, 34u, 34u, 9u, 58u, 9u, 57u, 48u, 57u, 9u, 125u, 9u, 125u, 34u, 34u,
+	9u, 58u, 9u, 57u, 48u, 57u, 9u, 125u, 9u, 125u, 34u, 34u, 9u, 58u, 9u, 57u,
 	65u, 122u, 34u, 122u, 9u, 125u, 9u, 125u, 9u, 93u, 9u, 123u, 0u, 0u, 0
 };
 
 static const char _deserialize_json_key_spans[] = {
-	0, 115, 26, 7, 2, 1, 50, 49, 
-	10, 117, 117, 117, 1, 50, 49, 10, 
-	117, 117, 1, 1, 50, 49, 117, 117, 
-	2, 1, 50, 49, 10, 117, 117, 1, 
-	50, 49, 10, 117, 117, 1, 50, 49, 
+	0, 115, 26, 7, 2, 1, 50, 49,
+	10, 117, 117, 117, 1, 50, 49, 10,
+	117, 117, 1, 1, 50, 49, 117, 117,
+	2, 1, 50, 49, 10, 117, 117, 1,
+	50, 49, 10, 117, 117, 1, 50, 49,
 	58, 89, 117, 117, 85, 115, 0
 };
 
 static const short _deserialize_json_index_offsets[] = {
-	0, 0, 116, 143, 151, 154, 156, 207, 
-	257, 268, 386, 504, 622, 624, 675, 725, 
-	736, 854, 972, 974, 976, 1027, 1077, 1195, 
-	1313, 1316, 1318, 1369, 1419, 1430, 1548, 1666, 
-	1668, 1719, 1769, 1780, 1898, 2016, 2018, 2069, 
+	0, 0, 116, 143, 151, 154, 156, 207,
+	257, 268, 386, 504, 622, 624, 675, 725,
+	736, 854, 972, 974, 976, 1027, 1077, 1195,
+	1313, 1316, 1318, 1369, 1419, 1430, 1548, 1666,
+	1668, 1719, 1769, 1780, 1898, 2016, 2018, 2069,
 	2119, 2178, 2268, 2386, 2504, 2590, 2706
 };
 
 static const char _deserialize_json_indicies[] = {
-	0, 0, 0, 0, 0, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	0, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 2, 1, 3, 3, 3, 
-	3, 3, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 3, 1, 4, 1, 
-	5, 1, 6, 7, 1, 1, 8, 1, 
-	9, 10, 1, 11, 1, 11, 11, 11, 
-	11, 11, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 11, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 12, 1, 
-	12, 12, 12, 12, 12, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 12, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 13, 1, 1, 14, 
-	15, 15, 15, 15, 15, 15, 15, 15, 
-	15, 1, 16, 17, 17, 17, 17, 17, 
-	17, 17, 17, 17, 1, 18, 18, 18, 
-	18, 18, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 18, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	19, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 20, 1, 21, 21, 21, 21, 21, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 21, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 3, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 22, 
-	1, 18, 18, 18, 18, 18, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	18, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 19, 1, 1, 1, 
-	17, 17, 17, 17, 17, 17, 17, 17, 
-	17, 17, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 20, 1, 23, 
-	1, 23, 23, 23, 23, 23, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	23, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 24, 1, 24, 24, 24, 24, 
-	24, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 24, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	25, 1, 1, 26, 27, 27, 27, 27, 
-	27, 27, 27, 27, 27, 1, 28, 29, 
-	29, 29, 29, 29, 29, 29, 29, 29, 
-	1, 30, 30, 30, 30, 30, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	30, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 31, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 32, 1, 30, 
-	30, 30, 30, 30, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 30, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 31, 1, 1, 1, 29, 29, 
-	29, 29, 29, 29, 29, 29, 29, 29, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 32, 1, 33, 1, 34, 
-	1, 34, 34, 34, 34, 34, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	34, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 35, 1, 35, 35, 35, 35, 
-	35, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 35, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 36, 37, 37, 37, 37, 
-	37, 37, 37, 37, 37, 1, 38, 38, 
-	38, 38, 38, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 38, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 39, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 40, 1, 38, 38, 38, 38, 
-	38, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 38, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 39, 
-	1, 1, 1, 41, 41, 41, 41, 41, 
-	41, 41, 41, 41, 41, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	40, 1, 42, 43, 1, 44, 1, 44, 
-	44, 44, 44, 44, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 44, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	45, 1, 45, 45, 45, 45, 45, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 45, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 46, 1, 
-	1, 47, 48, 48, 48, 48, 48, 48, 
-	48, 48, 48, 1, 49, 50, 50, 50, 
-	50, 50, 50, 50, 50, 50, 1, 51, 
-	51, 51, 51, 51, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 51, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 52, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 53, 1, 51, 51, 51, 
-	51, 51, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 51, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	52, 1, 1, 1, 50, 50, 50, 50, 
-	50, 50, 50, 50, 50, 50, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 53, 1, 54, 1, 54, 54, 54, 
-	54, 54, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 54, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 55, 1, 
-	55, 55, 55, 55, 55, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 55, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 56, 1, 1, 57, 
-	58, 58, 58, 58, 58, 58, 58, 58, 
-	58, 1, 59, 60, 60, 60, 60, 60, 
-	60, 60, 60, 60, 1, 61, 61, 61, 
-	61, 61, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 61, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	62, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 63, 1, 61, 61, 61, 61, 61, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 61, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 62, 1, 
-	1, 1, 60, 60, 60, 60, 60, 60, 
-	60, 60, 60, 60, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 63, 
-	1, 64, 1, 64, 64, 64, 64, 64, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 64, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 65, 1, 65, 65, 
-	65, 65, 65, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 65, 1, 66, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 67, 68, 68, 
-	68, 68, 68, 68, 68, 68, 68, 1, 
-	69, 69, 69, 69, 69, 69, 69, 69, 
-	69, 69, 69, 69, 69, 69, 69, 69, 
-	69, 69, 69, 69, 69, 69, 69, 69, 
-	69, 69, 1, 1, 1, 1, 1, 1, 
-	69, 69, 69, 69, 69, 69, 69, 69, 
-	69, 69, 69, 69, 69, 69, 69, 69, 
-	69, 69, 69, 69, 69, 69, 69, 69, 
-	69, 69, 1, 70, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 71, 71, 
-	1, 71, 71, 71, 71, 71, 71, 71, 
-	71, 71, 71, 1, 1, 1, 1, 1, 
-	1, 1, 71, 71, 71, 71, 71, 71, 
-	71, 71, 71, 71, 71, 71, 71, 71, 
-	71, 71, 71, 71, 71, 71, 71, 71, 
-	71, 71, 71, 71, 1, 1, 1, 1, 
-	71, 1, 71, 71, 71, 71, 71, 71, 
-	71, 71, 71, 71, 71, 71, 71, 71, 
-	71, 71, 71, 71, 71, 71, 71, 71, 
-	71, 71, 71, 71, 1, 72, 72, 72, 
-	72, 72, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 72, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	73, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 74, 1, 72, 72, 72, 72, 72, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 72, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 73, 1, 
-	1, 1, 75, 75, 75, 75, 75, 75, 
-	75, 75, 75, 75, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 74, 
-	1, 76, 76, 76, 76, 76, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	76, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 77, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 78, 1, 0, 
-	0, 0, 0, 0, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 0, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
+	0, 0, 0, 0, 0, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	0, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 2, 1, 3, 3, 3,
+	3, 3, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 3, 1, 4, 1,
+	5, 1, 6, 7, 1, 1, 8, 1,
+	9, 10, 1, 11, 1, 11, 11, 11,
+	11, 11, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 11, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 12, 1,
+	12, 12, 12, 12, 12, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 12,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 13, 1, 1, 14,
+	15, 15, 15, 15, 15, 15, 15, 15,
+	15, 1, 16, 17, 17, 17, 17, 17,
+	17, 17, 17, 17, 1, 18, 18, 18,
+	18, 18, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 18, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	19, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 20, 1, 21, 21, 21, 21, 21,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 21, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 3, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 22,
+	1, 18, 18, 18, 18, 18, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	18, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 19, 1, 1, 1,
+	17, 17, 17, 17, 17, 17, 17, 17,
+	17, 17, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 20, 1, 23,
+	1, 23, 23, 23, 23, 23, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	23, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 24, 1, 24, 24, 24, 24,
+	24, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 24, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	25, 1, 1, 26, 27, 27, 27, 27,
+	27, 27, 27, 27, 27, 1, 28, 29,
+	29, 29, 29, 29, 29, 29, 29, 29,
+	1, 30, 30, 30, 30, 30, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	30, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 31, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 32, 1, 30,
+	30, 30, 30, 30, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 30, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 31, 1, 1, 1, 29, 29,
+	29, 29, 29, 29, 29, 29, 29, 29,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 32, 1, 33, 1, 34,
+	1, 34, 34, 34, 34, 34, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	34, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 35, 1, 35, 35, 35, 35,
+	35, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 35, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 36, 37, 37, 37, 37,
+	37, 37, 37, 37, 37, 1, 38, 38,
+	38, 38, 38, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 38, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 39, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 40, 1, 38, 38, 38, 38,
+	38, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 38, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 39,
+	1, 1, 1, 41, 41, 41, 41, 41,
+	41, 41, 41, 41, 41, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	40, 1, 42, 43, 1, 44, 1, 44,
+	44, 44, 44, 44, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 44, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	45, 1, 45, 45, 45, 45, 45, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 45, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 46, 1,
+	1, 47, 48, 48, 48, 48, 48, 48,
+	48, 48, 48, 1, 49, 50, 50, 50,
+	50, 50, 50, 50, 50, 50, 1, 51,
+	51, 51, 51, 51, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 51, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 52, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 53, 1, 51, 51, 51,
+	51, 51, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 51, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	52, 1, 1, 1, 50, 50, 50, 50,
+	50, 50, 50, 50, 50, 50, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 53, 1, 54, 1, 54, 54, 54,
+	54, 54, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 54, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 55, 1,
+	55, 55, 55, 55, 55, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 55,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 56, 1, 1, 57,
+	58, 58, 58, 58, 58, 58, 58, 58,
+	58, 1, 59, 60, 60, 60, 60, 60,
+	60, 60, 60, 60, 1, 61, 61, 61,
+	61, 61, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 61, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	62, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 63, 1, 61, 61, 61, 61, 61,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 61, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 62, 1,
+	1, 1, 60, 60, 60, 60, 60, 60,
+	60, 60, 60, 60, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 63,
+	1, 64, 1, 64, 64, 64, 64, 64,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 64, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 65, 1, 65, 65,
+	65, 65, 65, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 65, 1, 66,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 67, 68, 68,
+	68, 68, 68, 68, 68, 68, 68, 1,
+	69, 69, 69, 69, 69, 69, 69, 69,
+	69, 69, 69, 69, 69, 69, 69, 69,
+	69, 69, 69, 69, 69, 69, 69, 69,
+	69, 69, 1, 1, 1, 1, 1, 1,
+	69, 69, 69, 69, 69, 69, 69, 69,
+	69, 69, 69, 69, 69, 69, 69, 69,
+	69, 69, 69, 69, 69, 69, 69, 69,
+	69, 69, 1, 70, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 71, 71,
+	1, 71, 71, 71, 71, 71, 71, 71,
+	71, 71, 71, 1, 1, 1, 1, 1,
+	1, 1, 71, 71, 71, 71, 71, 71,
+	71, 71, 71, 71, 71, 71, 71, 71,
+	71, 71, 71, 71, 71, 71, 71, 71,
+	71, 71, 71, 71, 1, 1, 1, 1,
+	71, 1, 71, 71, 71, 71, 71, 71,
+	71, 71, 71, 71, 71, 71, 71, 71,
+	71, 71, 71, 71, 71, 71, 71, 71,
+	71, 71, 71, 71, 1, 72, 72, 72,
+	72, 72, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 72, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	73, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 74, 1, 72, 72, 72, 72, 72,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 72, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 73, 1,
+	1, 1, 75, 75, 75, 75, 75, 75,
+	75, 75, 75, 75, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 74,
+	1, 76, 76, 76, 76, 76, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	76, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 77, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 78, 1, 0,
+	0, 0, 0, 0, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 0, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
 	1, 2, 1, 1, 0
 };
 
 static const char _deserialize_json_trans_targs[] = {
-	1, 0, 2, 2, 3, 4, 18, 24, 
-	37, 5, 12, 6, 7, 8, 9, 11, 
-	9, 11, 10, 2, 44, 10, 44, 13, 
-	14, 15, 16, 17, 16, 17, 10, 2, 
-	44, 19, 20, 21, 22, 23, 10, 2, 
-	44, 23, 25, 31, 26, 27, 28, 29, 
-	30, 29, 30, 10, 2, 44, 32, 33, 
-	34, 35, 36, 35, 36, 10, 2, 44, 
-	38, 39, 40, 42, 43, 41, 10, 41, 
+	1, 0, 2, 2, 3, 4, 18, 24,
+	37, 5, 12, 6, 7, 8, 9, 11,
+	9, 11, 10, 2, 44, 10, 44, 13,
+	14, 15, 16, 17, 16, 17, 10, 2,
+	44, 19, 20, 21, 22, 23, 10, 2,
+	44, 23, 25, 31, 26, 27, 28, 29,
+	30, 29, 30, 10, 2, 44, 32, 33,
+	34, 35, 36, 35, 36, 10, 2, 44,
+	38, 39, 40, 42, 43, 41, 10, 41,
 	10, 2, 44, 43, 44, 45, 46
 };
 
 static const char _deserialize_json_trans_actions[] = {
-	0, 0, 1, 0, 0, 0, 0, 0, 
-	0, 0, 0, 0, 0, 2, 2, 2, 
-	0, 0, 3, 3, 4, 0, 5, 0, 
-	0, 2, 2, 2, 0, 0, 6, 6, 
-	7, 0, 0, 0, 2, 2, 8, 8, 
-	9, 0, 0, 0, 0, 0, 2, 2, 
-	2, 0, 0, 10, 10, 11, 0, 0, 
-	2, 2, 2, 0, 0, 12, 12, 13, 
-	0, 0, 0, 2, 2, 2, 14, 0, 
+	0, 0, 1, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 2, 2, 2,
+	0, 0, 3, 3, 4, 0, 5, 0,
+	0, 2, 2, 2, 0, 0, 6, 6,
+	7, 0, 0, 0, 2, 2, 8, 8,
+	9, 0, 0, 0, 0, 0, 2, 2,
+	2, 0, 0, 10, 10, 11, 0, 0,
+	2, 2, 2, 0, 0, 12, 12, 13,
+	0, 0, 0, 2, 2, 2, 14, 0,
 	15, 15, 16, 0, 0, 0, 0
 };
 
@@ -461,7 +461,7 @@
   int cs;
   hb_glyph_info_t info = {0};
   hb_glyph_position_t pos = {0};
-  
+
 #line 466 "hb-buffer-deserialize-json.hh"
 	{
 	cs = deserialize_json_start;

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer-deserialize-json.rl
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer-deserialize-json.rl	2018-03-07 21:52:46 UTC (rev 46876)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer-deserialize-json.rl	2018-03-07 22:32:14 UTC (rev 46877)
@@ -106,7 +106,7 @@
   const char *p = buf, *pe = buf + buf_len;
 
   /* Ensure we have positions. */
-  (void) hb_buffer_get_glyph_positions (buffer, NULL);
+  (void) hb_buffer_get_glyph_positions (buffer, nullptr);
 
   while (p < pe && ISSPACE (*p))
     p++;
@@ -115,7 +115,7 @@
     *end_ptr = ++p;
   }
 
-  const char *tok = NULL;
+  const char *tok = nullptr;
   int cs;
   hb_glyph_info_t info = {0};
   hb_glyph_position_t pos = {0};

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer-deserialize-text.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer-deserialize-text.hh	2018-03-07 21:52:46 UTC (rev 46876)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer-deserialize-text.hh	2018-03-07 22:32:14 UTC (rev 46877)
@@ -34,274 +34,274 @@
 
 #line 36 "hb-buffer-deserialize-text.hh"
 static const unsigned char _deserialize_text_trans_keys[] = {
-	0u, 0u, 9u, 122u, 45u, 57u, 48u, 57u, 45u, 57u, 48u, 57u, 48u, 57u, 45u, 57u, 
-	48u, 57u, 44u, 44u, 45u, 57u, 48u, 57u, 44u, 57u, 9u, 124u, 9u, 124u, 0u, 0u, 
-	9u, 122u, 9u, 124u, 9u, 124u, 9u, 124u, 9u, 124u, 9u, 124u, 9u, 124u, 9u, 124u, 
+	0u, 0u, 9u, 122u, 45u, 57u, 48u, 57u, 45u, 57u, 48u, 57u, 48u, 57u, 45u, 57u,
+	48u, 57u, 44u, 44u, 45u, 57u, 48u, 57u, 44u, 57u, 9u, 124u, 9u, 124u, 0u, 0u,
+	9u, 122u, 9u, 124u, 9u, 124u, 9u, 124u, 9u, 124u, 9u, 124u, 9u, 124u, 9u, 124u,
 	9u, 124u, 9u, 124u, 9u, 124u, 0
 };
 
 static const char _deserialize_text_key_spans[] = {
-	0, 114, 13, 10, 13, 10, 10, 13, 
-	10, 1, 13, 10, 14, 116, 116, 0, 
-	114, 116, 116, 116, 116, 116, 116, 116, 
+	0, 114, 13, 10, 13, 10, 10, 13,
+	10, 1, 13, 10, 14, 116, 116, 0,
+	114, 116, 116, 116, 116, 116, 116, 116,
 	116, 116, 116
 };
 
 static const short _deserialize_text_index_offsets[] = {
-	0, 0, 115, 129, 140, 154, 165, 176, 
-	190, 201, 203, 217, 228, 243, 360, 477, 
-	478, 593, 710, 827, 944, 1061, 1178, 1295, 
+	0, 0, 115, 129, 140, 154, 165, 176,
+	190, 201, 203, 217, 228, 243, 360, 477,
+	478, 593, 710, 827, 944, 1061, 1178, 1295,
 	1412, 1529, 1646
 };
 
 static const char _deserialize_text_indicies[] = {
-	0, 0, 0, 0, 0, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	0, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	2, 3, 3, 3, 3, 3, 3, 3, 
-	3, 3, 1, 1, 1, 1, 1, 1, 
-	1, 4, 4, 4, 4, 4, 4, 4, 
-	4, 4, 4, 4, 4, 4, 4, 4, 
-	4, 4, 4, 4, 4, 4, 4, 4, 
-	4, 4, 4, 1, 1, 1, 1, 1, 
-	1, 4, 4, 4, 4, 4, 4, 4, 
-	4, 4, 4, 4, 4, 4, 4, 4, 
-	4, 4, 4, 4, 4, 4, 4, 4, 
-	4, 4, 4, 1, 5, 1, 1, 6, 
-	7, 7, 7, 7, 7, 7, 7, 7, 
-	7, 1, 8, 9, 9, 9, 9, 9, 
-	9, 9, 9, 9, 1, 10, 1, 1, 
-	11, 12, 12, 12, 12, 12, 12, 12, 
-	12, 12, 1, 13, 14, 14, 14, 14, 
-	14, 14, 14, 14, 14, 1, 15, 16, 
-	16, 16, 16, 16, 16, 16, 16, 16, 
-	1, 17, 1, 1, 18, 19, 19, 19, 
-	19, 19, 19, 19, 19, 19, 1, 20, 
-	21, 21, 21, 21, 21, 21, 21, 21, 
-	21, 1, 22, 1, 23, 1, 1, 24, 
-	25, 25, 25, 25, 25, 25, 25, 25, 
-	25, 1, 26, 27, 27, 27, 27, 27, 
-	27, 27, 27, 27, 1, 22, 1, 1, 
-	1, 21, 21, 21, 21, 21, 21, 21, 
-	21, 21, 21, 1, 28, 28, 28, 28, 
-	28, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 28, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 29, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	30, 1, 1, 31, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	32, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 33, 
-	1, 34, 34, 34, 34, 34, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	34, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 35, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 36, 1, 1, 0, 
-	0, 0, 0, 0, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 0, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 2, 3, 
-	3, 3, 3, 3, 3, 3, 3, 3, 
-	1, 1, 1, 1, 1, 1, 1, 4, 
-	4, 4, 4, 4, 4, 4, 4, 4, 
-	4, 4, 4, 4, 4, 4, 4, 4, 
-	4, 4, 4, 4, 4, 4, 4, 4, 
-	4, 1, 1, 1, 1, 1, 1, 4, 
-	4, 4, 4, 4, 4, 4, 4, 4, 
-	4, 4, 4, 4, 4, 4, 4, 4, 
-	4, 4, 4, 4, 4, 4, 4, 4, 
-	4, 1, 28, 28, 28, 28, 28, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 28, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 29, 1, 1, 1, 
-	1, 37, 37, 37, 37, 37, 37, 37, 
-	37, 37, 37, 1, 1, 1, 30, 1, 
-	1, 31, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 32, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 33, 1, 38, 
-	38, 38, 38, 38, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 38, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 39, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 40, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 41, 1, 42, 42, 42, 42, 
-	42, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 42, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	43, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 44, 
-	1, 42, 42, 42, 42, 42, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	42, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	14, 14, 14, 14, 14, 14, 14, 14, 
-	14, 14, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 43, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 44, 1, 38, 38, 
-	38, 38, 38, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 38, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 39, 1, 1, 1, 9, 9, 9, 
-	9, 9, 9, 9, 9, 9, 9, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 40, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 41, 1, 45, 45, 45, 45, 45, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 45, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 46, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 47, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 48, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 49, 1, 
-	50, 50, 50, 50, 50, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 50, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 51, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 52, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 53, 1, 50, 50, 50, 
-	50, 50, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 50, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 51, 
-	1, 1, 1, 1, 27, 27, 27, 27, 
-	27, 27, 27, 27, 27, 27, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 52, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	53, 1, 45, 45, 45, 45, 45, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 45, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 46, 1, 1, 1, 
-	1, 54, 54, 54, 54, 54, 54, 54, 
-	54, 54, 54, 1, 1, 1, 1, 1, 
-	1, 47, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 48, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 49, 1, 28, 
-	28, 28, 28, 28, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 1, 1, 1, 1, 1, 28, 1, 
-	1, 1, 1, 1, 1, 1, 1, 1, 
-	1, 29, 1, 55, 55, 1, 55, 55, 
-	55, 55, 55, 55, 55, 55, 55, 55, 
-	1, 1, 1, 30, 1, 1, 31, 55, 
-	55, 55, 55, 55, 55, 55, 55, 55, 
-	55, 55, 55, 55, 55, 55, 55, 55, 
-	55, 55, 55, 55, 55, 55, 55, 55, 
-	55, 1, 1, 32, 1, 55, 1, 55, 
-	55, 55, 55, 55, 55, 55, 55, 55, 
-	55, 55, 55, 55, 55, 55, 55, 55, 
-	55, 55, 55, 55, 55, 55, 55, 55, 
+	0, 0, 0, 0, 0, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	0, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	2, 3, 3, 3, 3, 3, 3, 3,
+	3, 3, 1, 1, 1, 1, 1, 1,
+	1, 4, 4, 4, 4, 4, 4, 4,
+	4, 4, 4, 4, 4, 4, 4, 4,
+	4, 4, 4, 4, 4, 4, 4, 4,
+	4, 4, 4, 1, 1, 1, 1, 1,
+	1, 4, 4, 4, 4, 4, 4, 4,
+	4, 4, 4, 4, 4, 4, 4, 4,
+	4, 4, 4, 4, 4, 4, 4, 4,
+	4, 4, 4, 1, 5, 1, 1, 6,
+	7, 7, 7, 7, 7, 7, 7, 7,
+	7, 1, 8, 9, 9, 9, 9, 9,
+	9, 9, 9, 9, 1, 10, 1, 1,
+	11, 12, 12, 12, 12, 12, 12, 12,
+	12, 12, 1, 13, 14, 14, 14, 14,
+	14, 14, 14, 14, 14, 1, 15, 16,
+	16, 16, 16, 16, 16, 16, 16, 16,
+	1, 17, 1, 1, 18, 19, 19, 19,
+	19, 19, 19, 19, 19, 19, 1, 20,
+	21, 21, 21, 21, 21, 21, 21, 21,
+	21, 1, 22, 1, 23, 1, 1, 24,
+	25, 25, 25, 25, 25, 25, 25, 25,
+	25, 1, 26, 27, 27, 27, 27, 27,
+	27, 27, 27, 27, 1, 22, 1, 1,
+	1, 21, 21, 21, 21, 21, 21, 21,
+	21, 21, 21, 1, 28, 28, 28, 28,
+	28, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 28, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 29, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	30, 1, 1, 31, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	32, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 33,
+	1, 34, 34, 34, 34, 34, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	34, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 35, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 36, 1, 1, 0,
+	0, 0, 0, 0, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 0, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 2, 3,
+	3, 3, 3, 3, 3, 3, 3, 3,
+	1, 1, 1, 1, 1, 1, 1, 4,
+	4, 4, 4, 4, 4, 4, 4, 4,
+	4, 4, 4, 4, 4, 4, 4, 4,
+	4, 4, 4, 4, 4, 4, 4, 4,
+	4, 1, 1, 1, 1, 1, 1, 4,
+	4, 4, 4, 4, 4, 4, 4, 4,
+	4, 4, 4, 4, 4, 4, 4, 4,
+	4, 4, 4, 4, 4, 4, 4, 4,
+	4, 1, 28, 28, 28, 28, 28, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 28, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 29, 1, 1, 1,
+	1, 37, 37, 37, 37, 37, 37, 37,
+	37, 37, 37, 1, 1, 1, 30, 1,
+	1, 31, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 32, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 33, 1, 38,
+	38, 38, 38, 38, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 38, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 39, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 40, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 41, 1, 42, 42, 42, 42,
+	42, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 42, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	43, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 44,
+	1, 42, 42, 42, 42, 42, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	42, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	14, 14, 14, 14, 14, 14, 14, 14,
+	14, 14, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 43, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 44, 1, 38, 38,
+	38, 38, 38, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 38, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 39, 1, 1, 1, 9, 9, 9,
+	9, 9, 9, 9, 9, 9, 9, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 40, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 41, 1, 45, 45, 45, 45, 45,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 45, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 46, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 47, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 48,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 49, 1,
+	50, 50, 50, 50, 50, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 50,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 51, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 52, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 53, 1, 50, 50, 50,
+	50, 50, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 50, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 51,
+	1, 1, 1, 1, 27, 27, 27, 27,
+	27, 27, 27, 27, 27, 27, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 52, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	53, 1, 45, 45, 45, 45, 45, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 45, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 46, 1, 1, 1,
+	1, 54, 54, 54, 54, 54, 54, 54,
+	54, 54, 54, 1, 1, 1, 1, 1,
+	1, 47, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 48, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 49, 1, 28,
+	28, 28, 28, 28, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 1, 1, 1, 1, 1, 28, 1,
+	1, 1, 1, 1, 1, 1, 1, 1,
+	1, 29, 1, 55, 55, 1, 55, 55,
+	55, 55, 55, 55, 55, 55, 55, 55,
+	1, 1, 1, 30, 1, 1, 31, 55,
+	55, 55, 55, 55, 55, 55, 55, 55,
+	55, 55, 55, 55, 55, 55, 55, 55,
+	55, 55, 55, 55, 55, 55, 55, 55,
+	55, 1, 1, 32, 1, 55, 1, 55,
+	55, 55, 55, 55, 55, 55, 55, 55,
+	55, 55, 55, 55, 55, 55, 55, 55,
+	55, 55, 55, 55, 55, 55, 55, 55,
 	55, 1, 33, 1, 0
 };
 
 static const char _deserialize_text_trans_targs[] = {
-	1, 0, 13, 17, 26, 3, 18, 21, 
-	18, 21, 5, 19, 20, 19, 20, 22, 
-	25, 8, 9, 12, 9, 12, 10, 11, 
-	23, 24, 23, 24, 14, 2, 6, 7, 
-	15, 16, 14, 15, 16, 17, 14, 4, 
-	15, 16, 14, 15, 16, 14, 2, 7, 
+	1, 0, 13, 17, 26, 3, 18, 21,
+	18, 21, 5, 19, 20, 19, 20, 22,
+	25, 8, 9, 12, 9, 12, 10, 11,
+	23, 24, 23, 24, 14, 2, 6, 7,
+	15, 16, 14, 15, 16, 17, 14, 4,
+	15, 16, 14, 15, 16, 14, 2, 7,
 	15, 16, 14, 2, 15, 16, 25, 26
 };
 
 static const char _deserialize_text_trans_actions[] = {
-	0, 0, 1, 1, 1, 2, 2, 2, 
-	0, 0, 2, 2, 2, 0, 0, 2, 
-	2, 2, 2, 2, 0, 0, 3, 2, 
-	2, 2, 0, 0, 4, 5, 5, 5, 
-	4, 4, 0, 0, 0, 0, 6, 7, 
-	6, 6, 8, 8, 8, 9, 10, 10, 
+	0, 0, 1, 1, 1, 2, 2, 2,
+	0, 0, 2, 2, 2, 0, 0, 2,
+	2, 2, 2, 2, 0, 0, 3, 2,
+	2, 2, 0, 0, 4, 5, 5, 5,
+	4, 4, 0, 0, 0, 0, 6, 7,
+	6, 6, 8, 8, 8, 9, 10, 10,
 	9, 9, 11, 12, 11, 11, 0, 0
 };
 
 static const char _deserialize_text_eof_actions[] = {
-	0, 0, 0, 0, 0, 0, 0, 0, 
-	0, 0, 0, 0, 0, 4, 0, 0, 
-	0, 4, 6, 8, 8, 6, 9, 11, 
+	0, 0, 0, 0, 0, 0, 0, 0,
+	0, 0, 0, 0, 0, 4, 0, 0,
+	0, 4, 6, 8, 8, 6, 9, 11,
 	11, 9, 4
 };
 
@@ -338,7 +338,7 @@
   int cs;
   hb_glyph_info_t info = {0};
   hb_glyph_position_t pos = {0};
-  
+
 #line 343 "hb-buffer-deserialize-text.hh"
 	{
 	cs = deserialize_text_start;

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer-deserialize-text.rl
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer-deserialize-text.rl	2018-03-07 21:52:46 UTC (rev 46876)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer-deserialize-text.rl	2018-03-07 22:32:14 UTC (rev 46877)
@@ -100,7 +100,7 @@
   const char *p = buf, *pe = buf + buf_len;
 
   /* Ensure we have positions. */
-  (void) hb_buffer_get_glyph_positions (buffer, NULL);
+  (void) hb_buffer_get_glyph_positions (buffer, nullptr);
 
   while (p < pe && ISSPACE (*p))
     p++;
@@ -109,7 +109,7 @@
     *end_ptr = ++p;
   }
 
-  const char *eof = pe, *tok = NULL;
+  const char *eof = pe, *tok = nullptr;
   int cs;
   hb_glyph_info_t info = {0};
   hb_glyph_position_t pos = {0};

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer-private.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer-private.hh	2018-03-07 21:52:46 UTC (rev 46876)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer-private.hh	2018-03-07 22:32:14 UTC (rev 46877)
@@ -93,7 +93,7 @@
   hb_buffer_flags_t flags; /* BOT / EOT / etc. */
   hb_buffer_cluster_level_t cluster_level;
   hb_codepoint_t replacement; /* U+FFFD or something else. */
-  hb_buffer_scratch_flags_t scratch_flags; /* Have space-flallback, etc. */
+  hb_buffer_scratch_flags_t scratch_flags; /* Have space-fallback, etc. */
   unsigned int max_len; /* Maximum allowed len. */
   int max_ops; /* Maximum allowed operations. */
 
@@ -344,8 +344,7 @@
   inline void
   unsafe_to_break_all (void)
   {
-    for (unsigned int i = 0; i < len; i++)
-      info[i].mask |= HB_GLYPH_FLAG_UNSAFE_TO_BREAK;
+    unsafe_to_break_impl (0, len);
   }
   inline void
   safe_to_break_all (void)

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer.cc	2018-03-07 21:52:46 UTC (rev 46876)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer.cc	2018-03-07 22:32:14 UTC (rev 46877)
@@ -1933,7 +1933,7 @@
       result |= HB_BUFFER_DIFF_FLAG_CODEPOINT_MISMATCH;
     if (buf_info->cluster != ref_info->cluster)
       result |= HB_BUFFER_DIFF_FLAG_CLUSTER_MISMATCH;
-    if ((buf_info->mask & HB_GLYPH_FLAG_DEFINED) != (ref_info->mask & HB_GLYPH_FLAG_DEFINED))
+    if ((buf_info->mask & ~ref_info->mask & HB_GLYPH_FLAG_DEFINED))
       result |= HB_BUFFER_DIFF_FLAG_GLYPH_FLAGS_MISMATCH;
     if (contains && ref_info->codepoint == dottedcircle_glyph)
       result |= HB_BUFFER_DIFF_FLAG_DOTTED_CIRCLE_PRESENT;

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer.h
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer.h	2018-03-07 21:52:46 UTC (rev 46876)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer.h	2018-03-07 22:32:14 UTC (rev 46877)
@@ -71,6 +71,24 @@
   hb_var_int_t   var2;
 } hb_glyph_info_t;
 
+/**
+ * hb_glyph_flags_t:
+ * @HB_GLYPH_FLAG_UNSAFE_TO_BREAK: Indicates that if input text is broken at the
+ * 				   beginning of the cluster this glyph is part of,
+ * 				   then both sides need to be re-shaped, as the
+ * 				   result might be different.  On the flip side,
+ * 				   it means that when this flag is not present,
+ * 				   then it's safe to break the glyph-run at the
+ * 				   beginning of this cluster, and the two sides
+ * 				   represent the exact same result one would get
+ * 				   if breaking input text at the beginning of
+ * 				   this cluster and shaping the two sides
+ * 				   separately.  This can be used to optimize
+ * 				   paragraph layout, by avoiding re-shaping
+ * 				   of each line after line-breaking, or limiting
+ * 				   the reshaping to a small piece around the
+ * 				   breaking point only.
+ */
 typedef enum { /*< flags >*/
   HB_GLYPH_FLAG_UNSAFE_TO_BREAK		= 0x00000001,
 

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-common.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-common.cc	2018-03-07 21:52:46 UTC (rev 46876)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-common.cc	2018-03-07 22:32:14 UTC (rev 46877)
@@ -879,7 +879,7 @@
                    parse_bool (pp, end, &feature->value);
   /* CSS doesn't use equal-sign between tag and value.
    * If there was an equal-sign, then there *must* be a value.
-   * A value without an eqaul-sign is ok, but not required. */
+   * A value without an equal-sign is ok, but not required. */
   return !had_equal || had_value;
 }
 

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-coretext.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-coretext.cc	2018-03-07 21:52:46 UTC (rev 46876)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-coretext.cc	2018-03-07 22:32:14 UTC (rev 46877)
@@ -74,7 +74,10 @@
   const char *data = reinterpret_cast<const char*> (CFDataGetBytePtr (cf_data));
   const size_t length = CFDataGetLength (cf_data);
   if (!data || !length)
+  {
+    CFRelease (cf_data);
     return nullptr;
+  }
 
   return hb_blob_create (data, length, HB_MEMORY_MODE_READONLY,
 			 reinterpret_cast<void *> (const_cast<__CFData *> (cf_data)),
@@ -311,7 +314,7 @@
 hb_font_t *
 hb_coretext_font_create (CTFontRef ct_font)
 {
-  CGFontRef cg_font = CTFontCopyGraphicsFont (ct_font, 0);
+  CGFontRef cg_font = CTFontCopyGraphicsFont (ct_font, nullptr);
   hb_face_t *face = hb_coretext_face_create (cg_font);
   CFRelease (cg_font);
   hb_font_t *font = hb_font_create (face);
@@ -877,7 +880,10 @@
 							    kCFStringEncodingUTF8,
 							    kCFAllocatorNull);
 	if (unlikely (!lang))
+        {
+	  CFRelease (attr_string);
 	  FAIL ("CFStringCreateWithCStringNoCopy failed");
+        }
 	CFAttributedStringSetAttribute (attr_string, CFRangeMake (0, chars_len),
 					kCTLanguageAttributeName, lang);
 	CFRelease (lang);
@@ -946,7 +952,10 @@
 						    &kCFTypeDictionaryValueCallBacks);
       CFRelease (level_number);
       if (unlikely (!options))
+      {
+        CFRelease (attr_string);
         FAIL ("CFDictionaryCreate failed");
+      }
 
       CTTypesetterRef typesetter = CTTypesetterCreateWithAttributedStringAndOptions (attr_string, options);
       CFRelease (options);
@@ -1036,7 +1045,7 @@
 	  }
 	if (!matched)
 	{
-	  CGFontRef run_cg_font = CTFontCopyGraphicsFont (run_ct_font, 0);
+	  CGFontRef run_cg_font = CTFontCopyGraphicsFont (run_ct_font, nullptr);
 	  if (run_cg_font)
 	  {
 	    matched = CFEqual (run_cg_font, cg_font);
@@ -1209,7 +1218,7 @@
     }
 
     /* Mac OS 10.6 doesn't have kCTTypesetterOptionForcedEmbeddingLevel,
-     * or if it does, it doesn't resepct it.  So we get runs with wrong
+     * or if it does, it doesn't respect it.  So we get runs with wrong
      * directions.  As such, disable the assert...  It wouldn't crash, but
      * cursoring will be off...
      *
@@ -1235,8 +1244,6 @@
 	pos->x_offset = info->var1.i32;
 	pos->y_offset = info->var2.i32;
 
-	info->mask = HB_GLYPH_FLAG_UNSAFE_TO_BREAK;
-
 	info++, pos++;
       }
     else
@@ -1246,8 +1253,6 @@
 	pos->x_offset = info->var1.i32;
 	pos->y_offset = info->var2.i32;
 
-	info->mask = HB_GLYPH_FLAG_UNSAFE_TO_BREAK;
-
 	info++, pos++;
       }
 

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-debug.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-debug.hh	2018-03-07 21:52:46 UTC (rev 46876)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-debug.hh	2018-03-07 22:32:14 UTC (rev 46877)
@@ -396,6 +396,18 @@
 #define TRACE_SERIALIZE(this) hb_no_trace_t<bool> trace
 #endif
 
+#ifndef HB_DEBUG_SUBSET
+#define HB_DEBUG_SUBSET (HB_DEBUG+0)
+#endif
+#if HB_DEBUG_SUBSET
+#define TRACE_SUBSET(this) \
+  hb_auto_trace_t<HB_DEBUG_SUBSET, bool> trace \
+  (&c->debug_depth, c->get_name (), this, HB_FUNC, \
+   " ");
+#else
+#define TRACE_SUBSET(this) hb_no_trace_t<bool> trace
+#endif
+
 #ifndef HB_DEBUG_WOULD_APPLY
 #define HB_DEBUG_WOULD_APPLY (HB_DEBUG+0)
 #endif
@@ -415,6 +427,7 @@
 	HB_DEBUG_COLLECT_GLYPHS + \
 	HB_DEBUG_SANITIZE + \
 	HB_DEBUG_SERIALIZE + \
+  HB_DEBUG_SUBSET + \
 	HB_DEBUG_WOULD_APPLY + \
 	0)
 #endif

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-directwrite.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-directwrite.cc	2018-03-07 21:52:46 UTC (rev 46876)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-directwrite.cc	2018-03-07 22:32:14 UTC (rev 46877)
@@ -370,7 +370,7 @@
   {
     if (textPosition == 0 || textPosition > mTextLength) {
       // Either there is no text before here (== 0), or this
-      // is an invalid position. The query is considered valid thouh.
+      // is an invalid position. The query is considered valid though.
       *textString = nullptr;
       *textLength = 0;
     }
@@ -878,8 +878,6 @@
     pos->x_offset =
       x_mult * (isRightToLeft ? -info->var1.i32 : info->var1.i32);
     pos->y_offset = y_mult * info->var2.i32;
-
-    info->mask = HB_GLYPH_FLAG_UNSAFE_TO_BREAK;
   }
 
   if (isRightToLeft)

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-face.h
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-face.h	2018-03-07 21:52:46 UTC (rev 46876)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-face.h	2018-03-07 22:32:14 UTC (rev 46877)
@@ -71,7 +71,6 @@
 		       hb_destroy_func_t   destroy,
 		       hb_bool_t           replace);
 
-
 HB_EXTERN void *
 hb_face_get_user_data (hb_face_t          *face,
 		       hb_user_data_key_t *key);

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ft.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ft.cc	2018-03-07 21:52:46 UTC (rev 46876)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ft.cc	2018-03-07 22:32:14 UTC (rev 46877)
@@ -58,7 +58,7 @@
  *
  *   - In the future, we should add constructors to create fonts in font space?
  *
- *   - FT_Load_Glyph() is exteremely costly.  Do something about it?
+ *   - FT_Load_Glyph() is extremely costly.  Do something about it?
  */
 
 

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-gobject-enums.h.tmpl
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-gobject-enums.h.tmpl	2018-03-07 21:52:46 UTC (rev 46876)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-gobject-enums.h.tmpl	2018-03-07 22:32:14 UTC (rev 46877)
@@ -42,7 +42,8 @@
 /*** END file-header ***/
 
 /*** BEGIN value-header ***/
-HB_EXTERN GType @enum_name at _get_type (void) G_GNUC_CONST;
+HB_EXTERN GType
+ at enum_name@_get_type (void) G_GNUC_CONST;
 #define @ENUMPREFIX at _TYPE_@ENUMSHORT@ (@enum_name at _get_type ())
 
 /*** END value-header ***/

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-gobject-structs.h
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-gobject-structs.h	2018-03-07 21:52:46 UTC (rev 46876)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-gobject-structs.h	2018-03-07 22:32:14 UTC (rev 46877)
@@ -45,7 +45,8 @@
  *
  * Since: 0.9.2
  **/
-HB_EXTERN GType hb_gobject_blob_get_type (void);
+HB_EXTERN GType
+hb_gobject_blob_get_type (void);
 #define HB_GOBJECT_TYPE_BLOB (hb_gobject_blob_get_type ())
 
 /**
@@ -53,7 +54,8 @@
  *
  * Since: 0.9.2
  **/
-HB_EXTERN GType hb_gobject_buffer_get_type (void);
+HB_EXTERN GType
+hb_gobject_buffer_get_type (void);
 #define HB_GOBJECT_TYPE_BUFFER (hb_gobject_buffer_get_type ())
 
 /**
@@ -61,7 +63,8 @@
  *
  * Since: 0.9.2
  **/
-HB_EXTERN GType hb_gobject_face_get_type (void);
+HB_EXTERN GType
+hb_gobject_face_get_type (void);
 #define HB_GOBJECT_TYPE_FACE (hb_gobject_face_get_type ())
 
 /**
@@ -69,7 +72,8 @@
  *
  * Since: 0.9.2
  **/
-HB_EXTERN GType hb_gobject_font_get_type (void);
+HB_EXTERN GType
+hb_gobject_font_get_type (void);
 #define HB_GOBJECT_TYPE_FONT (hb_gobject_font_get_type ())
 
 /**
@@ -77,13 +81,16 @@
  *
  * Since: 0.9.2
  **/
-HB_EXTERN GType hb_gobject_font_funcs_get_type (void);
+HB_EXTERN GType
+hb_gobject_font_funcs_get_type (void);
 #define HB_GOBJECT_TYPE_FONT_FUNCS (hb_gobject_font_funcs_get_type ())
 
-HB_EXTERN GType hb_gobject_set_get_type (void);
+HB_EXTERN GType
+hb_gobject_set_get_type (void);
 #define HB_GOBJECT_TYPE_SET (hb_gobject_set_get_type ())
 
-HB_EXTERN GType hb_gobject_shape_plan_get_type (void);
+HB_EXTERN GType
+hb_gobject_shape_plan_get_type (void);
 #define HB_GOBJECT_TYPE_SHAPE_PLAN (hb_gobject_shape_plan_get_type ())
 
 /**
@@ -91,27 +98,41 @@
  *
  * Since: 0.9.2
  **/
-HB_EXTERN GType hb_gobject_unicode_funcs_get_type (void);
+HB_EXTERN GType
+hb_gobject_unicode_funcs_get_type (void);
 #define HB_GOBJECT_TYPE_UNICODE_FUNCS (hb_gobject_unicode_funcs_get_type ())
 
 /* Value types */
 
-HB_EXTERN GType hb_gobject_feature_get_type (void);
+HB_EXTERN GType
+hb_gobject_feature_get_type (void);
 #define HB_GOBJECT_TYPE_FEATURE (hb_gobject_feature_get_type ())
 
-HB_EXTERN GType hb_gobject_glyph_info_get_type (void);
+HB_EXTERN GType
+hb_gobject_glyph_info_get_type (void);
 #define HB_GOBJECT_TYPE_GLYPH_INFO (hb_gobject_glyph_info_get_type ())
 
-HB_EXTERN GType hb_gobject_glyph_position_get_type (void);
+HB_EXTERN GType
+hb_gobject_glyph_position_get_type (void);
 #define HB_GOBJECT_TYPE_GLYPH_POSITION (hb_gobject_glyph_position_get_type ())
 
-HB_EXTERN GType hb_gobject_segment_properties_get_type (void);
+HB_EXTERN GType
+hb_gobject_segment_properties_get_type (void);
 #define HB_GOBJECT_TYPE_SEGMENT_PROPERTIES (hb_gobject_segment_properties_get_type ())
 
-HB_EXTERN GType hb_gobject_user_data_key_get_type (void);
+HB_EXTERN GType
+hb_gobject_user_data_key_get_type (void);
 #define HB_GOBJECT_TYPE_USER_DATA_KEY (hb_gobject_user_data_key_get_type ())
 
+HB_EXTERN GType
+hb_gobject_ot_math_glyph_variant_get_type (void);
+#define HB_GOBJECT_TYPE_OT_MATH_GLYPH_VARIANT (hb_gobject_ot_math_glyph_variant_get_type ())
 
+HB_EXTERN GType
+hb_gobject_ot_math_glyph_part_get_type (void);
+#define HB_GOBJECT_TYPE_OT_MATH_GLYPH_PART (hb_gobject_ot_math_glyph_part_get_type ())
+
+
 HB_END_DECLS
 
 #endif /* HB_GOBJECT_H */

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-graphite2.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-graphite2.cc	2018-03-07 21:52:46 UTC (rev 46876)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-graphite2.cc	2018-03-07 22:32:14 UTC (rev 46877)
@@ -80,7 +80,7 @@
     p->tag = tag;
 
     /* TODO Not thread-safe, but fairly harmless.
-     * We can do the double-chcked pointer cmpexch thing here. */
+     * We can do the double-checked pointer cmpexch thing here. */
     p->next = face_data->tlist;
     face_data->tlist = p;
   }
@@ -360,7 +360,6 @@
       hb_glyph_info_t *info = &buffer->info[clusters[i].base_glyph + j];
       info->codepoint = gids[clusters[i].base_glyph + j];
       info->cluster = clusters[i].cluster;
-      info->mask = HB_GLYPH_FLAG_UNSAFE_TO_BREAK;
       info->var1.i32 = clusters[i].advance;     // all glyphs in the cluster get the same advance
     }
   }

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-open-file-private.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-open-file-private.hh	2018-03-07 21:52:46 UTC (rev 46876)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-open-file-private.hh	2018-03-07 22:32:14 UTC (rev 46877)
@@ -30,6 +30,7 @@
 #define HB_OPEN_FILE_PRIVATE_HH
 
 #include "hb-open-type-private.hh"
+#include "hb-ot-head-table.hh"
 
 
 namespace OT {
@@ -54,8 +55,15 @@
 typedef struct TableRecord
 {
   int cmp (Tag t) const
-  { return t.cmp (tag); }
+  { return -t.cmp (tag); }
 
+  static int cmp (const void *pa, const void *pb)
+  {
+    const TableRecord *a = (const TableRecord *) pa;
+    const TableRecord *b = (const TableRecord *) pb;
+    return b->cmp (a->tag);
+  }
+
   inline bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
@@ -64,9 +72,9 @@
 
   Tag		tag;		/* 4-byte identifier. */
   CheckSum	checkSum;	/* CheckSum for this table. */
-  HBUINT32		offset;		/* Offset from beginning of TrueType font
+  Offset32	offset;		/* Offset from beginning of TrueType font
 				 * file. */
-  HBUINT32		length;		/* Length of this table. */
+  HBUINT32	length;		/* Length of this table. */
   public:
   DEFINE_SIZE_STATIC (16);
 } OpenTypeTable;
@@ -81,7 +89,7 @@
   {
     return tables[i];
   }
-  inline unsigned int get_table_tags (unsigned int start_offset,
+  inline unsigned int get_table_tags (unsigned int  start_offset,
 				      unsigned int *table_count, /* IN/OUT */
 				      hb_tag_t     *table_tags /* OUT */) const
   {
@@ -118,6 +126,78 @@
   }
 
   public:
+
+  inline bool serialize (hb_serialize_context_t *c,
+			 hb_tag_t sfnt_tag,
+			 Supplier<hb_tag_t> &tags,
+			 Supplier<hb_blob_t *> &blobs,
+			 unsigned int table_count)
+  {
+    TRACE_SERIALIZE (this);
+    /* Alloc 12 for the OTHeader. */
+    if (unlikely (!c->extend_min (*this))) return_trace (false);
+    /* Write sfntVersion (bytes 0..3). */
+    sfnt_version.set (sfnt_tag);
+    /* Take space for numTables, searchRange, entrySelector, RangeShift
+     * and the TableRecords themselves.  */
+    if (unlikely (!tables.serialize (c, table_count))) return_trace (false);
+
+    const char *dir_end = (const char *) c->head;
+    HBUINT32 *checksum_adjustment = nullptr;
+
+    /* Write OffsetTables, alloc for and write actual table blobs. */
+    for (unsigned int i = 0; i < table_count; i++)
+    {
+      TableRecord &rec = tables.array[i];
+      hb_blob_t *blob = blobs[i];
+      rec.tag.set (tags[i]);
+      rec.length.set (hb_blob_get_length (blob));
+      rec.offset.serialize (c, this);
+
+      /* Allocate room for the table and copy it. */
+      char *start = (char *) c->allocate_size<void> (rec.length);
+      if (unlikely (!start)) {return false;}
+
+      memcpy (start, hb_blob_get_data (blob, nullptr), rec.length);
+
+      /* 4-byte allignment. */
+      if (rec.length % 4)
+	c->allocate_size<void> (4 - rec.length % 4);
+      const char *end = (const char *) c->head;
+
+      if (tags[i] == HB_OT_TAG_head && end - start >= head::static_size)
+      {
+	head *h = (head *) start;
+	checksum_adjustment = &h->checkSumAdjustment;
+	checksum_adjustment->set (0);
+      }
+
+      rec.checkSum.set_for_data (start, end - start);
+    }
+    tags += table_count;
+    blobs += table_count;
+
+    tables.qsort ();
+
+    if (checksum_adjustment)
+    {
+      CheckSum checksum;
+
+      /* The following line is a slower version of the following block. */
+      //checksum.set_for_data (this, (const char *) c->head - (const char *) this);
+      checksum.set_for_data (this, dir_end - (const char *) this);
+      for (unsigned int i = 0; i < table_count; i++)
+      {
+	TableRecord &rec = tables.array[i];
+	checksum.set (checksum + rec.checkSum);
+      }
+
+      checksum_adjustment->set (0xB1B0AFBAu - checksum);
+    }
+
+    return_trace (true);
+  }
+
   inline bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
@@ -249,6 +329,18 @@
     }
   }
 
+  inline bool serialize_single (hb_serialize_context_t *c,
+				hb_tag_t sfnt_tag,
+			        Supplier<hb_tag_t> &tags,
+			        Supplier<hb_blob_t *> &blobs,
+			        unsigned int table_count)
+  {
+    TRACE_SERIALIZE (this);
+    assert (sfnt_tag != TTCTag);
+    if (unlikely (!c->extend_min (*this))) return_trace (false);
+    return_trace (u.fontFace.serialize (c, sfnt_tag, tags, blobs, table_count));
+  }
+
   inline bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-open-type-private.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-open-type-private.hh	2018-03-07 21:52:46 UTC (rev 46876)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-open-type-private.hh	2018-03-07 22:32:14 UTC (rev 46877)
@@ -134,8 +134,18 @@
 
 #define HB_NULL_POOL_SIZE 264
 static_assert (HB_NULL_POOL_SIZE % sizeof (void *) == 0, "Align HB_NULL_POOL_SIZE.");
-extern HB_INTERNAL const void * const _hb_NullPool[HB_NULL_POOL_SIZE / sizeof (void *)];
 
+#ifdef HB_NO_VISIBILITY
+static
+#else
+extern HB_INTERNAL
+#endif
+const void * const _hb_NullPool[HB_NULL_POOL_SIZE / sizeof (void *)]
+#ifdef HB_NO_VISIBILITY
+= {}
+#endif
+;
+
 /* Generic nul-content Null objects. */
 template <typename Type>
 static inline const Type& Null (void) {
@@ -179,6 +189,12 @@
 #ifndef HB_SANITIZE_MAX_EDITS
 #define HB_SANITIZE_MAX_EDITS 32
 #endif
+#ifndef HB_SANITIZE_MAX_OPS_FACTOR
+#define HB_SANITIZE_MAX_OPS_FACTOR 8
+#endif
+#ifndef HB_SANITIZE_MAX_OPS_MIN
+#define HB_SANITIZE_MAX_OPS_MIN 16384
+#endif
 
 struct hb_sanitize_context_t :
        hb_dispatch_context_t<hb_sanitize_context_t, bool, HB_DEBUG_SANITIZE>
@@ -186,7 +202,7 @@
   inline hb_sanitize_context_t (void) :
 	debug_depth (0),
 	start (nullptr), end (nullptr),
-	writable (false), edit_count (0),
+	writable (false), edit_count (0), max_ops (0),
 	blob (nullptr),
 	num_glyphs (0) {}
 
@@ -211,6 +227,8 @@
     this->start = hb_blob_get_data (this->blob, nullptr);
     this->end = this->start + hb_blob_get_length (this->blob);
     assert (this->start <= this->end); /* Must not overflow. */
+    this->max_ops = MAX ((unsigned int) (this->end - this->start) * HB_SANITIZE_MAX_OPS_FACTOR,
+			 (unsigned) HB_SANITIZE_MAX_OPS_MIN);
     this->edit_count = 0;
     this->debug_depth = 0;
 
@@ -234,7 +252,10 @@
   inline bool check_range (const void *base, unsigned int len) const
   {
     const char *p = (const char *) base;
-    bool ok = this->start <= p && p <= this->end && (unsigned int) (this->end - p) >= len;
+    bool ok = this->max_ops-- > 0 &&
+	      this->start <= p &&
+	      p <= this->end &&
+	      (unsigned int) (this->end - p) >= len;
 
     DEBUG_MSG_LEVEL (SANITIZE, p, this->debug_depth+1, 0,
        "check_range [%p..%p] (%d bytes) in [%p..%p] -> %s",
@@ -298,6 +319,7 @@
   const char *start, *end;
   bool writable;
   unsigned int edit_count;
+  mutable int max_ops;
   hb_blob_t *blob;
   unsigned int num_glyphs;
 };
@@ -499,23 +521,25 @@
 template <typename Type>
 struct Supplier
 {
-  inline Supplier (const Type *array, unsigned int len_)
+  inline Supplier (const Type *array, unsigned int len_, unsigned int stride_=sizeof(Type))
   {
     head = array;
     len = len_;
+    stride = stride_;
   }
   inline const Type operator [] (unsigned int i) const
   {
     if (unlikely (i >= len)) return Type ();
-    return head[i];
+    return * (const Type *) (const void *) ((const char *) head + stride * i);
   }
 
-  inline void advance (unsigned int count)
+  inline Supplier<Type> & operator += (unsigned int count)
   {
     if (unlikely (count > len))
       count = len;
     len -= count;
-    head += count;
+    head = (const Type *) (const void *) ((const char *) head + stride * count);
+    return *this;
   }
 
   private:
@@ -523,6 +547,7 @@
   inline Supplier<Type>& operator= (const Supplier<Type> &); /* Disallow copy */
 
   unsigned int len;
+  unsigned int stride;
   const Type *head;
 };
 
@@ -667,8 +692,8 @@
 /* 32-bit signed fixed-point number (16.16). */
 struct Fixed: HBINT32
 {
-  //inline float to_float (void) const { return ???; }
-  //inline void set_float (float f) { v.set (f * ???); }
+  inline float to_float (void) const { return ((int32_t) v) / 65536.0; }
+  inline void set_float (float f) { v.set (round (f * 65536.0)); }
   public:
   DEFINE_SIZE_STATIC (4);
 };
@@ -715,6 +740,14 @@
 struct Offset : Type
 {
   inline bool is_null (void) const { return 0 == *this; }
+
+  inline void *serialize (hb_serialize_context_t *c, const void *base)
+  {
+    void *t = c->start_embed<void> ();
+    this->set ((char *) t - (char *) base); /* TODO(serialize) Overflow? */
+    return t;
+  }
+
   public:
   DEFINE_SIZE_STATIC (sizeof(Type));
 };
@@ -730,7 +763,8 @@
   static inline uint32_t CalcTableChecksum (const HBUINT32 *Table, uint32_t Length)
   {
     uint32_t Sum = 0L;
-    const HBUINT32 *EndPtr = Table+((Length+3) & ~3) / HBUINT32::static_size;
+    assert (0 == (Length & 3));
+    const HBUINT32 *EndPtr = Table + Length / HBUINT32::static_size;
 
     while (Table < EndPtr)
       Sum += *Table++;
@@ -786,9 +820,7 @@
 
   inline Type& serialize (hb_serialize_context_t *c, const void *base)
   {
-    Type *t = c->start_embed<Type> ();
-    this->set ((char *) t - (char *) base); /* TODO(serialize) Overflow? */
-    return *t;
+    return * (Type *) Offset<OffsetType>::serialize (c, base);
   }
 
   inline bool sanitize (hb_sanitize_context_t *c, const void *base) const
@@ -876,7 +908,7 @@
     if (unlikely (!serialize (c, items_len))) return_trace (false);
     for (unsigned int i = 0; i < items_len; i++)
       array[i] = items[i];
-    items.advance (items_len);
+    items += items_len;
     return_trace (true);
   }
 
@@ -928,6 +960,11 @@
     return -1;
   }
 
+  inline void qsort (void)
+  {
+    ::qsort (array, len, sizeof (Type), Type::cmp);
+  }
+
   private:
   inline bool sanitize_shallow (hb_sanitize_context_t *c) const
   {
@@ -994,7 +1031,7 @@
     if (unlikely (!c->extend (*this))) return_trace (false);
     for (unsigned int i = 0; i < items_len - 1; i++)
       array[i] = items[i];
-    items.advance (items_len - 1);
+    items += items_len - 1;
     return_trace (true);
   }
 
@@ -1072,6 +1109,17 @@
     return_trace (c->check_struct (this));
   }
 
+  inline void set (unsigned int v)
+  {
+    len.set (v);
+    assert (len == v);
+    entrySelectorZ.set (MAX (1u, _hb_bit_storage (v)) - 1);
+    searchRangeZ.set (16 * (1u << entrySelectorZ));
+    rangeShiftZ.set (v * 16 > searchRangeZ
+                     ? 16 * v - searchRangeZ
+                     : 0);
+  }
+
   protected:
   HBUINT16	len;
   HBUINT16	searchRangeZ;

Deleted: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-cbdt-table.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-cbdt-table.hh	2018-03-07 21:52:46 UTC (rev 46876)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-cbdt-table.hh	2018-03-07 22:32:14 UTC (rev 46877)
@@ -1,471 +0,0 @@
-/*
- * Copyright © 2016  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): Seigo Nonaka
- */
-
-#ifndef HB_OT_CBDT_TABLE_HH
-#define HB_OT_CBDT_TABLE_HH
-
-#include "hb-open-type-private.hh"
-
-namespace OT {
-
-struct SmallGlyphMetrics
-{
-  inline bool sanitize (hb_sanitize_context_t *c) const
-  {
-    TRACE_SANITIZE (this);
-    return_trace (c->check_struct (this));
-  }
-
-  inline void get_extents (hb_glyph_extents_t *extents) const
-  {
-    extents->x_bearing = bearingX;
-    extents->y_bearing = bearingY;
-    extents->width = width;
-    extents->height = -height;
-  }
-
-  HBUINT8 height;
-  HBUINT8 width;
-  HBINT8 bearingX;
-  HBINT8 bearingY;
-  HBUINT8 advance;
-
-  DEFINE_SIZE_STATIC(5);
-};
-
-struct BigGlyphMetrics : SmallGlyphMetrics
-{
-  HBINT8 vertBearingX;
-  HBINT8 vertBearingY;
-  HBUINT8 vertAdvance;
-
-  DEFINE_SIZE_STATIC(8);
-};
-
-struct SBitLineMetrics
-{
-  inline bool sanitize (hb_sanitize_context_t *c) const
-  {
-    TRACE_SANITIZE (this);
-    return_trace (c->check_struct (this));
-  }
-
-  HBINT8 ascender;
-  HBINT8 decender;
-  HBUINT8 widthMax;
-  HBINT8 caretSlopeNumerator;
-  HBINT8 caretSlopeDenominator;
-  HBINT8 caretOffset;
-  HBINT8 minOriginSB;
-  HBINT8 minAdvanceSB;
-  HBINT8 maxBeforeBL;
-  HBINT8 minAfterBL;
-  HBINT8 padding1;
-  HBINT8 padding2;
-
-  DEFINE_SIZE_STATIC(12);
-};
-
-
-/*
- * Index Subtables.
- */
-
-struct IndexSubtableHeader
-{
-  inline bool sanitize (hb_sanitize_context_t *c) const
-  {
-    TRACE_SANITIZE (this);
-    return_trace (c->check_struct (this));
-  }
-
-  HBUINT16 indexFormat;
-  HBUINT16 imageFormat;
-  HBUINT32 imageDataOffset;
-
-  DEFINE_SIZE_STATIC(8);
-};
-
-template <typename OffsetType>
-struct IndexSubtableFormat1Or3
-{
-  inline bool sanitize (hb_sanitize_context_t *c, unsigned int glyph_count) const
-  {
-    TRACE_SANITIZE (this);
-    return_trace (c->check_struct (this) &&
-		  c->check_array (offsetArrayZ, offsetArrayZ[0].static_size, glyph_count + 1));
-  }
-
-  bool get_image_data (unsigned int idx,
-		       unsigned int *offset,
-		       unsigned int *length) const
-  {
-    if (unlikely (offsetArrayZ[idx + 1] <= offsetArrayZ[idx]))
-      return false;
-
-    *offset = header.imageDataOffset + offsetArrayZ[idx];
-    *length = offsetArrayZ[idx + 1] - offsetArrayZ[idx];
-    return true;
-  }
-
-  IndexSubtableHeader header;
-  Offset<OffsetType> offsetArrayZ[VAR];
-
-  DEFINE_SIZE_ARRAY(8, offsetArrayZ);
-};
-
-struct IndexSubtableFormat1 : IndexSubtableFormat1Or3<HBUINT32> {};
-struct IndexSubtableFormat3 : IndexSubtableFormat1Or3<HBUINT16> {};
-
-struct IndexSubtable
-{
-  inline bool sanitize (hb_sanitize_context_t *c, unsigned int glyph_count) const
-  {
-    TRACE_SANITIZE (this);
-    if (!u.header.sanitize (c)) return_trace (false);
-    switch (u.header.indexFormat) {
-    case 1: return_trace (u.format1.sanitize (c, glyph_count));
-    case 3: return_trace (u.format3.sanitize (c, glyph_count));
-    default:return_trace (true);
-    }
-  }
-
-  inline bool get_extents (hb_glyph_extents_t *extents) const
-  {
-    switch (u.header.indexFormat) {
-    case 2: case 5: /* TODO */
-    case 1: case 3: case 4: /* Variable-metrics formats do not have metrics here. */
-    default:return (false);
-    }
-  }
-
-  bool get_image_data (unsigned int idx,
-		       unsigned int *offset,
-		       unsigned int *length,
-		       unsigned int *format) const
-  {
-    *format = u.header.imageFormat;
-    switch (u.header.indexFormat) {
-    case 1: return u.format1.get_image_data (idx, offset, length);
-    case 3: return u.format3.get_image_data (idx, offset, length);
-    default: return false;
-    }
-  }
-
-  protected:
-  union {
-  IndexSubtableHeader	header;
-  IndexSubtableFormat1	format1;
-  IndexSubtableFormat3	format3;
-  /* TODO: Format 2, 4, 5. */
-  } u;
-  public:
-  DEFINE_SIZE_UNION (8, header);
-};
-
-struct IndexSubtableRecord
-{
-  inline bool sanitize (hb_sanitize_context_t *c, const void *base) const
-  {
-    TRACE_SANITIZE (this);
-    return_trace (c->check_struct (this) &&
-		  firstGlyphIndex <= lastGlyphIndex &&
-		  offsetToSubtable.sanitize (c, this, lastGlyphIndex - firstGlyphIndex + 1));
-  }
-
-  inline bool get_extents (hb_glyph_extents_t *extents) const
-  {
-    return (this+offsetToSubtable).get_extents (extents);
-  }
-
-  bool get_image_data (unsigned int gid,
-		       unsigned int *offset,
-		       unsigned int *length,
-		       unsigned int *format) const
-  {
-    if (gid < firstGlyphIndex || gid > lastGlyphIndex)
-    {
-      return false;
-    }
-    return (this+offsetToSubtable).get_image_data (gid - firstGlyphIndex,
-						   offset, length, format);
-  }
-
-  HBUINT16 firstGlyphIndex;
-  HBUINT16 lastGlyphIndex;
-  LOffsetTo<IndexSubtable> offsetToSubtable;
-
-  DEFINE_SIZE_STATIC(8);
-};
-
-struct IndexSubtableArray
-{
-  inline bool sanitize (hb_sanitize_context_t *c, unsigned int count) const
-  {
-    TRACE_SANITIZE (this);
-    if (unlikely (!c->check_array (&indexSubtablesZ, indexSubtablesZ[0].static_size, count)))
-      return_trace (false);
-    for (unsigned int i = 0; i < count; i++)
-      if (unlikely (!indexSubtablesZ[i].sanitize (c, this)))
-	return_trace (false);
-    return_trace (true);
-  }
-
-  public:
-  const IndexSubtableRecord* find_table (hb_codepoint_t glyph, unsigned int numTables) const
-  {
-    for (unsigned int i = 0; i < numTables; ++i)
-    {
-      unsigned int firstGlyphIndex = indexSubtablesZ[i].firstGlyphIndex;
-      unsigned int lastGlyphIndex = indexSubtablesZ[i].lastGlyphIndex;
-      if (firstGlyphIndex <= glyph && glyph <= lastGlyphIndex) {
-        return &indexSubtablesZ[i];
-      }
-    }
-    return nullptr;
-  }
-
-  protected:
-  IndexSubtableRecord indexSubtablesZ[VAR];
-
-  public:
-  DEFINE_SIZE_ARRAY(0, indexSubtablesZ);
-};
-
-struct BitmapSizeTable
-{
-  friend struct CBLC;
-
-  inline bool sanitize (hb_sanitize_context_t *c, const void *base) const
-  {
-    TRACE_SANITIZE (this);
-    return_trace (c->check_struct (this) &&
-		  indexSubtableArrayOffset.sanitize (c, base, numberOfIndexSubtables) &&
-		  c->check_range (&(base+indexSubtableArrayOffset), indexTablesSize) &&
-		  horizontal.sanitize (c) &&
-		  vertical.sanitize (c));
-  }
-
-  const IndexSubtableRecord *find_table (hb_codepoint_t glyph, const void *base) const
-  {
-    return (base+indexSubtableArrayOffset).find_table (glyph, numberOfIndexSubtables);
-  }
-
-  protected:
-  LOffsetTo<IndexSubtableArray> indexSubtableArrayOffset;
-  HBUINT32 indexTablesSize;
-  HBUINT32 numberOfIndexSubtables;
-  HBUINT32 colorRef;
-  SBitLineMetrics horizontal;
-  SBitLineMetrics vertical;
-  HBUINT16 startGlyphIndex;
-  HBUINT16 endGlyphIndex;
-  HBUINT8 ppemX;
-  HBUINT8 ppemY;
-  HBUINT8 bitDepth;
-  HBINT8 flags;
-
-  public:
-  DEFINE_SIZE_STATIC(48);
-};
-
-
-/*
- * Glyph Bitmap Data Formats.
- */
-
-struct GlyphBitmapDataFormat17
-{
-  SmallGlyphMetrics glyphMetrics;
-  HBUINT32 dataLen;
-  HBUINT8 dataZ[VAR];
-
-  DEFINE_SIZE_ARRAY(9, dataZ);
-};
-
-
-/*
- * CBLC -- Color Bitmap Location Table
- */
-
-#define HB_OT_TAG_CBLC HB_TAG('C','B','L','C')
-
-struct CBLC
-{
-  friend struct CBDT;
-
-  static const hb_tag_t tableTag = HB_OT_TAG_CBLC;
-
-  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) &&
-		  sizeTables.sanitize (c, this));
-  }
-
-  protected:
-  const IndexSubtableRecord *find_table (hb_codepoint_t glyph,
-					 unsigned int *x_ppem, unsigned int *y_ppem) const
-  {
-    /* TODO: Make it possible to select strike. */
-
-    unsigned int count = sizeTables.len;
-    for (uint32_t i = 0; i < count; ++i)
-    {
-      unsigned int startGlyphIndex = sizeTables.array[i].startGlyphIndex;
-      unsigned int endGlyphIndex = sizeTables.array[i].endGlyphIndex;
-      if (startGlyphIndex <= glyph && glyph <= endGlyphIndex)
-      {
-	*x_ppem = sizeTables[i].ppemX;
-	*y_ppem = sizeTables[i].ppemY;
-	return sizeTables[i].find_table (glyph, this);
-      }
-    }
-
-    return nullptr;
-  }
-
-  protected:
-  FixedVersion<>		version;
-  LArrayOf<BitmapSizeTable>	sizeTables;
-
-  public:
-  DEFINE_SIZE_ARRAY(8, sizeTables);
-};
-
-/*
- * CBDT -- Color Bitmap Data Table
- */
-#define HB_OT_TAG_CBDT HB_TAG('C','B','D','T')
-
-struct CBDT
-{
-  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)
-    {
-      upem = face->get_upem();
-
-      cblc_blob = Sanitizer<CBLC>().sanitize (face->reference_table (HB_OT_TAG_CBLC));
-      cbdt_blob = Sanitizer<CBDT>().sanitize (face->reference_table (HB_OT_TAG_CBDT));
-      cbdt_len = hb_blob_get_length (cbdt_blob);
-
-      if (hb_blob_get_length (cblc_blob) == 0) {
-	cblc = nullptr;
-	cbdt = nullptr;
-	return;  /* Not a bitmap font. */
-      }
-      cblc = Sanitizer<CBLC>::lock_instance (cblc_blob);
-      cbdt = Sanitizer<CBDT>::lock_instance (cbdt_blob);
-
-    }
-
-    inline void fini (void)
-    {
-      hb_blob_destroy (this->cblc_blob);
-      hb_blob_destroy (this->cbdt_blob);
-    }
-
-    inline bool get_extents (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.
-
-      const IndexSubtableRecord *subtable_record = this->cblc->find_table(glyph, &x_ppem, &y_ppem);
-      if (!subtable_record || !x_ppem || !y_ppem)
-	return false;
-
-      if (subtable_record->get_extents (extents))
-	return true;
-
-      unsigned int image_offset = 0, image_length = 0, image_format = 0;
-      if (!subtable_record->get_image_data (glyph, &image_offset, &image_length, &image_format))
-	return false;
-
-      {
-	if (unlikely (image_offset > cbdt_len || cbdt_len - image_offset < image_length))
-	  return false;
-
-	switch (image_format)
-	{
-	  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;
-	  default:
-	    // TODO: Support other image formats.
-	    return false;
-	}
-      }
-
-      /* 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;
-
-      return true;
-    }
-
-    private:
-    hb_blob_t *cblc_blob;
-    hb_blob_t *cbdt_blob;
-    const CBLC *cblc;
-    const CBDT *cbdt;
-
-    unsigned int cbdt_len;
-    unsigned int upem;
-  };
-
-
-  protected:
-  FixedVersion<>version;
-  HBUINT8 dataZ[VAR];
-
-  public:
-  DEFINE_SIZE_ARRAY(4, dataZ);
-};
-
-} /* namespace OT */
-
-#endif /* HB_OT_CBDT_TABLE_HH */

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-03-07 21:52:46 UTC (rev 46876)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-cmap-table.hh	2018-03-07 22:32:14 UTC (rev 46877)
@@ -28,8 +28,8 @@
 #define HB_OT_CMAP_TABLE_HH
 
 #include "hb-open-type-private.hh"
+#include "hb-subset-plan.hh"
 
-
 namespace OT {
 
 
@@ -61,7 +61,7 @@
   HBUINT16	format;		/* Format number is set to 0. */
   HBUINT16	lengthZ;	/* Byte length of this subtable. */
   HBUINT16	languageZ;	/* Ignore. */
-  HBUINT8		glyphIdArray[256];/* An array that maps character
+  HBUINT8	glyphIdArray[256];/* An array that maps character
 				 * code to glyph index values. */
   public:
   DEFINE_SIZE_STATIC (6 + 256);
@@ -193,6 +193,7 @@
 {
   friend struct CmapSubtableFormat12;
   friend struct CmapSubtableFormat13;
+  friend struct cmap;
 
   int cmp (hb_codepoint_t codepoint) const
   {
@@ -253,6 +254,8 @@
 template <typename T>
 struct CmapSubtableLongSegmented
 {
+  friend struct cmap;
+
   inline bool get_glyph (hb_codepoint_t codepoint, hb_codepoint_t *glyph) const
   {
     int i = groups.bsearch (codepoint);
@@ -268,6 +271,16 @@
     return_trace (c->check_struct (this) && groups.sanitize (c));
   }
 
+  inline bool serialize (hb_serialize_context_t *c,
+                         hb_prealloced_array_t<CmapSubtableLongGroup> &group_data)
+  {
+    TRACE_SERIALIZE (this);
+    if (unlikely (!c->extend_min (*this))) return_trace (false);
+    Supplier<CmapSubtableLongGroup> supplier (group_data.array, group_data.len);
+    if (unlikely (!groups.serialize (c, supplier, group_data.len))) return_trace (false);
+    return true;
+  }
+
   protected:
   HBUINT16	format;		/* Subtable format; set to 12. */
   HBUINT16	reservedZ;	/* Reserved; set to 0. */
@@ -422,12 +435,12 @@
 			 hb_codepoint_t *glyph) const
   {
     switch (u.format) {
-    case  0: return u.format0 .get_glyph(codepoint, glyph);
-    case  4: return u.format4 .get_glyph(codepoint, glyph);
-    case  6: return u.format6 .get_glyph(codepoint, glyph);
-    case 10: return u.format10.get_glyph(codepoint, glyph);
-    case 12: return u.format12.get_glyph(codepoint, glyph);
-    case 13: return u.format13.get_glyph(codepoint, glyph);
+    case  0: return u.format0 .get_glyph (codepoint, glyph);
+    case  4: return u.format4 .get_glyph (codepoint, glyph);
+    case  6: return u.format6 .get_glyph (codepoint, glyph);
+    case 10: return u.format10.get_glyph (codepoint, glyph);
+    case 12: return u.format12.get_glyph (codepoint, glyph);
+    case 13: return u.format13.get_glyph (codepoint, glyph);
     case 14:
     default: return false;
     }
@@ -504,6 +517,114 @@
 		  encodingRecord.sanitize (c, this));
   }
 
+  inline bool populate_groups (hb_subset_plan_t *plan,
+			       hb_prealloced_array_t<CmapSubtableLongGroup> *groups) const
+  {
+    CmapSubtableLongGroup *group = nullptr;
+    for (unsigned int i = 0; i < plan->codepoints.len; i++) {
+
+      hb_codepoint_t cp = plan->codepoints[i];
+      if (!group || cp - 1 != group->endCharCode)
+      {
+        group = groups->push ();
+        group->startCharCode.set (cp);
+        group->endCharCode.set (cp);
+        hb_codepoint_t new_gid;
+        if (unlikely (!hb_subset_plan_new_gid_for_codepoint (plan, cp, &new_gid)))
+        {
+          DEBUG_MSG(SUBSET, nullptr, "Unable to find new gid for %04x", cp);
+          return false;
+        }
+        group->glyphID.set (new_gid);
+      } else
+      {
+        group->endCharCode.set (cp);
+      }
+    }
+
+    DEBUG_MSG(SUBSET, nullptr, "cmap");
+    for (unsigned int i = 0; i < groups->len; i++) {
+      CmapSubtableLongGroup& group = (*groups)[i];
+      DEBUG_MSG(SUBSET, nullptr, "  %d: U+%04X-U+%04X, gid %d-%d", i, (uint32_t) group.startCharCode, (uint32_t) group.endCharCode, (uint32_t) group.glyphID, (uint32_t) group.glyphID + ((uint32_t) group.endCharCode - (uint32_t) group.startCharCode));
+    }
+
+    return true;
+  }
+
+  inline bool _subset (hb_prealloced_array_t<CmapSubtableLongGroup> &groups,
+		       size_t dest_sz,
+		       void *dest) const
+  {
+    hb_serialize_context_t c (dest, dest_sz);
+
+    OT::cmap *cmap = c.start_serialize<OT::cmap> ();
+    if (unlikely (!c.extend_min (*cmap)))
+    {
+      return false;
+    }
+
+    cmap->version.set (0);
+
+    if (unlikely (!cmap->encodingRecord.serialize (&c, /* numTables */ 1))) return false;
+
+    EncodingRecord &rec = cmap->encodingRecord[0];
+    rec.platformID.set (3); // Windows
+    rec.encodingID.set (10); // Unicode UCS-4
+
+    /* capture offset to subtable */
+    CmapSubtable &subtable = rec.subtable.serialize (&c, cmap);
+
+    subtable.u.format.set (12);
+
+    CmapSubtableFormat12 &format12 = subtable.u.format12;
+    if (unlikely (!c.extend_min (format12))) return false;
+
+    format12.format.set (12);
+    format12.reservedZ.set (0);
+    format12.lengthZ.set (16 + 12 * groups.len);
+
+    if (unlikely (!format12.serialize (&c, groups))) return false;
+
+    c.end_serialize ();
+
+    return true;
+  }
+
+  inline bool subset (hb_subset_plan_t *plan) const
+  {
+    hb_auto_array_t<CmapSubtableLongGroup> groups;
+
+    if (unlikely (!populate_groups (plan, &groups))) return false;
+
+    // We now know how big our blob needs to be
+    // TODO use APIs from the structs to get size?
+    size_t dest_sz = 4 // header
+                   + 8 // 1 EncodingRecord
+                   + 16 // Format 12 header
+                   + 12 * groups.len; // SequentialMapGroup records
+    void *dest = malloc (dest_sz);
+    if (unlikely (!dest)) {
+      DEBUG_MSG(SUBSET, nullptr, "Unable to alloc %lu for cmap subset output", (unsigned long) dest_sz);
+      return false;
+    }
+
+    if (unlikely (!_subset (groups, dest_sz, dest)))
+    {
+      free (dest);
+      return false;
+    }
+
+    // all done, write the blob into dest
+    hb_blob_t *cmap_prime = hb_blob_create ((const char *)dest,
+                                            dest_sz,
+                                            HB_MEMORY_MODE_READONLY,
+                                            dest,
+                                            free);
+    bool result =  hb_subset_plan_add_table (plan, HB_OT_TAG_cmap, cmap_prime);
+    hb_blob_destroy (cmap_prime);
+    return result;
+  }
+
   struct accelerator_t
   {
     inline void init (hb_face_t *face)

Added: 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	                        (rev 0)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-color-cbdt-table.hh	2018-03-07 22:32:14 UTC (rev 46877)
@@ -0,0 +1,471 @@
+/*
+ * Copyright © 2016  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): Seigo Nonaka
+ */
+
+#ifndef HB_OT_COLOR_CBDT_TABLE_HH
+#define HB_OT_COLOR_CBDT_TABLE_HH
+
+#include "hb-open-type-private.hh"
+
+namespace OT {
+
+struct SmallGlyphMetrics
+{
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this));
+  }
+
+  inline void get_extents (hb_glyph_extents_t *extents) const
+  {
+    extents->x_bearing = bearingX;
+    extents->y_bearing = bearingY;
+    extents->width = width;
+    extents->height = -height;
+  }
+
+  HBUINT8 height;
+  HBUINT8 width;
+  HBINT8 bearingX;
+  HBINT8 bearingY;
+  HBUINT8 advance;
+
+  DEFINE_SIZE_STATIC(5);
+};
+
+struct BigGlyphMetrics : SmallGlyphMetrics
+{
+  HBINT8 vertBearingX;
+  HBINT8 vertBearingY;
+  HBUINT8 vertAdvance;
+
+  DEFINE_SIZE_STATIC(8);
+};
+
+struct SBitLineMetrics
+{
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this));
+  }
+
+  HBINT8 ascender;
+  HBINT8 decender;
+  HBUINT8 widthMax;
+  HBINT8 caretSlopeNumerator;
+  HBINT8 caretSlopeDenominator;
+  HBINT8 caretOffset;
+  HBINT8 minOriginSB;
+  HBINT8 minAdvanceSB;
+  HBINT8 maxBeforeBL;
+  HBINT8 minAfterBL;
+  HBINT8 padding1;
+  HBINT8 padding2;
+
+  DEFINE_SIZE_STATIC(12);
+};
+
+
+/*
+ * Index Subtables.
+ */
+
+struct IndexSubtableHeader
+{
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this));
+  }
+
+  HBUINT16 indexFormat;
+  HBUINT16 imageFormat;
+  HBUINT32 imageDataOffset;
+
+  DEFINE_SIZE_STATIC(8);
+};
+
+template <typename OffsetType>
+struct IndexSubtableFormat1Or3
+{
+  inline bool sanitize (hb_sanitize_context_t *c, unsigned int glyph_count) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) &&
+		  c->check_array (offsetArrayZ, offsetArrayZ[0].static_size, glyph_count + 1));
+  }
+
+  bool get_image_data (unsigned int idx,
+		       unsigned int *offset,
+		       unsigned int *length) const
+  {
+    if (unlikely (offsetArrayZ[idx + 1] <= offsetArrayZ[idx]))
+      return false;
+
+    *offset = header.imageDataOffset + offsetArrayZ[idx];
+    *length = offsetArrayZ[idx + 1] - offsetArrayZ[idx];
+    return true;
+  }
+
+  IndexSubtableHeader header;
+  Offset<OffsetType> offsetArrayZ[VAR];
+
+  DEFINE_SIZE_ARRAY(8, offsetArrayZ);
+};
+
+struct IndexSubtableFormat1 : IndexSubtableFormat1Or3<HBUINT32> {};
+struct IndexSubtableFormat3 : IndexSubtableFormat1Or3<HBUINT16> {};
+
+struct IndexSubtable
+{
+  inline bool sanitize (hb_sanitize_context_t *c, unsigned int glyph_count) const
+  {
+    TRACE_SANITIZE (this);
+    if (!u.header.sanitize (c)) return_trace (false);
+    switch (u.header.indexFormat) {
+    case 1: return_trace (u.format1.sanitize (c, glyph_count));
+    case 3: return_trace (u.format3.sanitize (c, glyph_count));
+    default:return_trace (true);
+    }
+  }
+
+  inline bool get_extents (hb_glyph_extents_t *extents) const
+  {
+    switch (u.header.indexFormat) {
+    case 2: case 5: /* TODO */
+    case 1: case 3: case 4: /* Variable-metrics formats do not have metrics here. */
+    default:return (false);
+    }
+  }
+
+  bool get_image_data (unsigned int idx,
+		       unsigned int *offset,
+		       unsigned int *length,
+		       unsigned int *format) const
+  {
+    *format = u.header.imageFormat;
+    switch (u.header.indexFormat) {
+    case 1: return u.format1.get_image_data (idx, offset, length);
+    case 3: return u.format3.get_image_data (idx, offset, length);
+    default: return false;
+    }
+  }
+
+  protected:
+  union {
+  IndexSubtableHeader	header;
+  IndexSubtableFormat1	format1;
+  IndexSubtableFormat3	format3;
+  /* TODO: Format 2, 4, 5. */
+  } u;
+  public:
+  DEFINE_SIZE_UNION (8, header);
+};
+
+struct IndexSubtableRecord
+{
+  inline bool sanitize (hb_sanitize_context_t *c, const void *base) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) &&
+		  firstGlyphIndex <= lastGlyphIndex &&
+		  offsetToSubtable.sanitize (c, this, lastGlyphIndex - firstGlyphIndex + 1));
+  }
+
+  inline bool get_extents (hb_glyph_extents_t *extents) const
+  {
+    return (this+offsetToSubtable).get_extents (extents);
+  }
+
+  bool get_image_data (unsigned int gid,
+		       unsigned int *offset,
+		       unsigned int *length,
+		       unsigned int *format) const
+  {
+    if (gid < firstGlyphIndex || gid > lastGlyphIndex)
+    {
+      return false;
+    }
+    return (this+offsetToSubtable).get_image_data (gid - firstGlyphIndex,
+						   offset, length, format);
+  }
+
+  HBUINT16 firstGlyphIndex;
+  HBUINT16 lastGlyphIndex;
+  LOffsetTo<IndexSubtable> offsetToSubtable;
+
+  DEFINE_SIZE_STATIC(8);
+};
+
+struct IndexSubtableArray
+{
+  inline bool sanitize (hb_sanitize_context_t *c, unsigned int count) const
+  {
+    TRACE_SANITIZE (this);
+    if (unlikely (!c->check_array (&indexSubtablesZ, indexSubtablesZ[0].static_size, count)))
+      return_trace (false);
+    for (unsigned int i = 0; i < count; i++)
+      if (unlikely (!indexSubtablesZ[i].sanitize (c, this)))
+	return_trace (false);
+    return_trace (true);
+  }
+
+  public:
+  const IndexSubtableRecord* find_table (hb_codepoint_t glyph, unsigned int numTables) const
+  {
+    for (unsigned int i = 0; i < numTables; ++i)
+    {
+      unsigned int firstGlyphIndex = indexSubtablesZ[i].firstGlyphIndex;
+      unsigned int lastGlyphIndex = indexSubtablesZ[i].lastGlyphIndex;
+      if (firstGlyphIndex <= glyph && glyph <= lastGlyphIndex) {
+        return &indexSubtablesZ[i];
+      }
+    }
+    return nullptr;
+  }
+
+  protected:
+  IndexSubtableRecord indexSubtablesZ[VAR];
+
+  public:
+  DEFINE_SIZE_ARRAY(0, indexSubtablesZ);
+};
+
+struct BitmapSizeTable
+{
+  friend struct CBLC;
+
+  inline bool sanitize (hb_sanitize_context_t *c, const void *base) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) &&
+		  indexSubtableArrayOffset.sanitize (c, base, numberOfIndexSubtables) &&
+		  c->check_range (&(base+indexSubtableArrayOffset), indexTablesSize) &&
+		  horizontal.sanitize (c) &&
+		  vertical.sanitize (c));
+  }
+
+  const IndexSubtableRecord *find_table (hb_codepoint_t glyph, const void *base) const
+  {
+    return (base+indexSubtableArrayOffset).find_table (glyph, numberOfIndexSubtables);
+  }
+
+  protected:
+  LOffsetTo<IndexSubtableArray> indexSubtableArrayOffset;
+  HBUINT32 indexTablesSize;
+  HBUINT32 numberOfIndexSubtables;
+  HBUINT32 colorRef;
+  SBitLineMetrics horizontal;
+  SBitLineMetrics vertical;
+  HBUINT16 startGlyphIndex;
+  HBUINT16 endGlyphIndex;
+  HBUINT8 ppemX;
+  HBUINT8 ppemY;
+  HBUINT8 bitDepth;
+  HBINT8 flags;
+
+  public:
+  DEFINE_SIZE_STATIC(48);
+};
+
+
+/*
+ * Glyph Bitmap Data Formats.
+ */
+
+struct GlyphBitmapDataFormat17
+{
+  SmallGlyphMetrics glyphMetrics;
+  HBUINT32 dataLen;
+  HBUINT8 dataZ[VAR];
+
+  DEFINE_SIZE_ARRAY(9, dataZ);
+};
+
+
+/*
+ * CBLC -- Color Bitmap Location Table
+ */
+
+#define HB_OT_TAG_CBLC HB_TAG('C','B','L','C')
+
+struct CBLC
+{
+  friend struct CBDT;
+
+  static const hb_tag_t tableTag = HB_OT_TAG_CBLC;
+
+  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) &&
+		  sizeTables.sanitize (c, this));
+  }
+
+  protected:
+  const IndexSubtableRecord *find_table (hb_codepoint_t glyph,
+					 unsigned int *x_ppem, unsigned int *y_ppem) const
+  {
+    /* TODO: Make it possible to select strike. */
+
+    unsigned int count = sizeTables.len;
+    for (uint32_t i = 0; i < count; ++i)
+    {
+      unsigned int startGlyphIndex = sizeTables.array[i].startGlyphIndex;
+      unsigned int endGlyphIndex = sizeTables.array[i].endGlyphIndex;
+      if (startGlyphIndex <= glyph && glyph <= endGlyphIndex)
+      {
+	*x_ppem = sizeTables[i].ppemX;
+	*y_ppem = sizeTables[i].ppemY;
+	return sizeTables[i].find_table (glyph, this);
+      }
+    }
+
+    return nullptr;
+  }
+
+  protected:
+  FixedVersion<>		version;
+  LArrayOf<BitmapSizeTable>	sizeTables;
+
+  public:
+  DEFINE_SIZE_ARRAY(8, sizeTables);
+};
+
+/*
+ * CBDT -- Color Bitmap Data Table
+ */
+#define HB_OT_TAG_CBDT HB_TAG('C','B','D','T')
+
+struct CBDT
+{
+  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)
+    {
+      upem = hb_face_get_upem (face);
+
+      cblc_blob = Sanitizer<CBLC>().sanitize (face->reference_table (HB_OT_TAG_CBLC));
+      cbdt_blob = Sanitizer<CBDT>().sanitize (face->reference_table (HB_OT_TAG_CBDT));
+      cbdt_len = hb_blob_get_length (cbdt_blob);
+
+      if (hb_blob_get_length (cblc_blob) == 0) {
+	cblc = nullptr;
+	cbdt = nullptr;
+	return;  /* Not a bitmap font. */
+      }
+      cblc = Sanitizer<CBLC>::lock_instance (cblc_blob);
+      cbdt = Sanitizer<CBDT>::lock_instance (cbdt_blob);
+
+    }
+
+    inline void fini (void)
+    {
+      hb_blob_destroy (this->cblc_blob);
+      hb_blob_destroy (this->cbdt_blob);
+    }
+
+    inline bool get_extents (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.
+
+      const IndexSubtableRecord *subtable_record = this->cblc->find_table(glyph, &x_ppem, &y_ppem);
+      if (!subtable_record || !x_ppem || !y_ppem)
+	return false;
+
+      if (subtable_record->get_extents (extents))
+	return true;
+
+      unsigned int image_offset = 0, image_length = 0, image_format = 0;
+      if (!subtable_record->get_image_data (glyph, &image_offset, &image_length, &image_format))
+	return false;
+
+      {
+	if (unlikely (image_offset > cbdt_len || cbdt_len - image_offset < image_length))
+	  return false;
+
+	switch (image_format)
+	{
+	  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;
+	  default:
+	    // TODO: Support other image formats.
+	    return false;
+	}
+      }
+
+      /* 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;
+
+      return true;
+    }
+
+    private:
+    hb_blob_t *cblc_blob;
+    hb_blob_t *cbdt_blob;
+    const CBLC *cblc;
+    const CBDT *cbdt;
+
+    unsigned int cbdt_len;
+    unsigned int upem;
+  };
+
+
+  protected:
+  FixedVersion<>version;
+  HBUINT8 dataZ[VAR];
+
+  public:
+  DEFINE_SIZE_ARRAY(4, dataZ);
+};
+
+} /* namespace OT */
+
+#endif /* HB_OT_COLOR_CBDT_TABLE_HH */

Added: 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	                        (rev 0)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-color-colr-table.hh	2018-03-07 22:32:14 UTC (rev 46877)
@@ -0,0 +1,142 @@
+/*
+ * 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.
+ */
+
+#ifndef HB_OT_COLOR_COLR_TABLE_HH
+#define HB_OT_COLOR_COLR_TABLE_HH
+
+#include "hb-open-type-private.hh"
+
+/*
+ * Color Palette
+ * http://www.microsoft.com/typography/otspec/colr.htm
+ */
+
+#define HB_OT_TAG_COLR HB_TAG('C','O','L','R')
+
+namespace OT {
+
+
+struct LayerRecord
+{
+  friend struct COLR;
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this));
+  }
+
+  protected:
+  GlyphID gID;			/* Glyph ID of layer glyph */
+  HBUINT16 paletteIndex;	/* Index value to use with a selected color palette */
+  public:
+  DEFINE_SIZE_STATIC (4);
+};
+
+struct BaseGlyphRecord
+{
+  friend struct COLR;
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this));
+  }
+
+  protected:
+  GlyphID gID;			/* Glyph ID of reference glyph */
+  HBUINT16 firstLayerIndex;	/* Index to the layer record */
+  HBUINT16 numLayers;		/* Number of color layers associated with this glyph */
+  public:
+  DEFINE_SIZE_STATIC (6);
+};
+
+struct COLR
+{
+  static const hb_tag_t tableTag = HB_OT_TAG_COLR;
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    if (!(c->check_struct (this) &&
+        c->check_array ((const void*) &layerRecordsOffsetZ, sizeof (LayerRecord), numLayerRecords) &&
+        c->check_array ((const void*) &baseGlyphRecordsZ, sizeof (BaseGlyphRecord), numBaseGlyphRecords)))
+      return_trace (false);
+
+    const BaseGlyphRecord* base_glyph_records = &baseGlyphRecordsZ (this);
+    for (unsigned int i = 0; i < numBaseGlyphRecords; ++i)
+      if (base_glyph_records[i].firstLayerIndex +
+          base_glyph_records[i].numLayers > numLayerRecords)
+        return_trace (false);
+
+    return_trace (true);
+  }
+
+  inline bool get_base_glyph_record (
+    hb_codepoint_t glyph_id, unsigned int &first_layer, unsigned int &num_layers) const
+  {
+    const BaseGlyphRecord* base_glyph_records = &baseGlyphRecordsZ (this);
+    unsigned int min = 0, max = numBaseGlyphRecords - 1;
+    while (min <= max)
+    {
+      unsigned int mid = (min + max) / 2;
+      hb_codepoint_t gID = base_glyph_records[mid].gID;
+      if (gID > glyph_id)
+        max = mid - 1;
+      else if (gID < glyph_id)
+        min = mid + 1;
+      else
+      {
+        first_layer = base_glyph_records[mid].firstLayerIndex;
+        num_layers = base_glyph_records[mid].numLayers;
+        return true;
+      }
+    }
+    return false;
+  }
+
+  inline void get_layer_record (int layer,
+    hb_codepoint_t &glyph_id, unsigned int &palette_index) const
+  {
+    const LayerRecord* records = &layerRecordsOffsetZ (this);
+    glyph_id = records[layer].gID;
+    palette_index = records[layer].paletteIndex;
+  }
+
+  protected:
+  HBUINT16	version;		/* Table version number */
+  HBUINT16	numBaseGlyphRecords;	/* Number of Base Glyph Records */
+  LOffsetTo<BaseGlyphRecord>
+		baseGlyphRecordsZ;	/* Offset to Base Glyph records. */
+  LOffsetTo<LayerRecord>
+		layerRecordsOffsetZ;	/* Offset to Layer Records */
+  HBUINT16	numLayerRecords;	/* Number of Layer Records */
+  public:
+  DEFINE_SIZE_STATIC (14);
+};
+
+} /* namespace OT */
+
+
+#endif /* HB_OT_COLOR_COLR_TABLE_HH */

Added: 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	                        (rev 0)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-color-cpal-table.hh	2018-03-07 22:32:14 UTC (rev 46877)
@@ -0,0 +1,208 @@
+/*
+ * Copyright © 2016  Google, Inc.
+ * 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
+ */
+
+#ifndef HB_OT_COLOR_CPAL_TABLE_HH
+#define HB_OT_COLOR_CPAL_TABLE_HH
+
+#include "hb-open-type-private.hh"
+
+
+/*
+ * 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 */);
+
+
+
+
+
+/*
+ * Color Palette
+ * http://www.microsoft.com/typography/otspec/cpal.htm
+ */
+
+#define HB_OT_TAG_CPAL HB_TAG('C','P','A','L')
+
+namespace OT {
+
+
+struct CPALV1Tail
+{
+  friend struct CPAL;
+
+  inline bool sanitize (hb_sanitize_context_t *c, unsigned int palettes) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (
+      c->check_struct (this) &&
+      c->check_array ((const void*) &paletteFlags, sizeof (HBUINT32), palettes) &&
+      c->check_array ((const void*) &paletteLabel, sizeof (HBUINT16), palettes) &&
+      c->check_array ((const void*) &paletteEntryLabel, sizeof (HBUINT16), palettes));
+  }
+
+  private:
+  inline hb_ot_color_palette_flags_t
+  get_palette_flags (const void *base, unsigned int palette) const
+  {
+    const HBUINT32* flags = &paletteFlags (base);
+    return (hb_ot_color_palette_flags_t) (uint32_t) flags[palette];
+  }
+
+  inline unsigned int
+  get_palette_name_id (const void *base, unsigned int palette) const
+  {
+    const HBUINT16* name_ids = &paletteLabel (base);
+    return name_ids[palette];
+  }
+
+  protected:
+  LOffsetTo<HBUINT32> paletteFlags;
+  LOffsetTo<HBUINT16> paletteLabel;
+  LOffsetTo<HBUINT16> paletteEntryLabel;
+  public:
+  DEFINE_SIZE_STATIC (12);
+};
+
+typedef HBUINT32 BGRAColor;
+
+struct CPAL
+{
+  static const hb_tag_t tableTag = HB_OT_TAG_CPAL;
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    if (!(c->check_struct (this) && // This checks colorRecordIndicesX sanity also, see #get_size
+        c->check_array ((const void*) &colorRecordsZ, sizeof (BGRAColor), numColorRecords)))
+      return_trace (false);
+
+    // Check for indices sanity so no need for doing it runtime
+    for (unsigned int i = 0; i < numPalettes; ++i)
+      if (colorRecordIndicesX[i] + numPaletteEntries > numColorRecords)
+        return_trace (false);
+
+    // If version is zero, we are done here; otherwise we need to check tail also
+    if (version == 0)
+      return_trace (true);
+
+    const CPALV1Tail &v1 = StructAfter<CPALV1Tail> (*this);
+    return_trace (v1.sanitize (c, numPalettes));
+  }
+
+  inline unsigned int get_size (void) const
+  {
+    return min_size + numPalettes * sizeof (HBUINT16);
+  }
+
+  inline hb_ot_color_palette_flags_t get_palette_flags (unsigned int palette) const
+  {
+    if (version == 0 || palette >= numPalettes)
+      return HB_OT_COLOR_PALETTE_FLAG_DEFAULT;
+
+    const CPALV1Tail& cpal1 = StructAfter<CPALV1Tail> (*this);
+    return cpal1.get_palette_flags (this, palette);
+  }
+
+  inline unsigned int get_palette_name_id (unsigned int palette) const
+  {
+    if (version == 0 || palette >= numPalettes)
+      return 0xFFFF;
+
+    const CPALV1Tail& cpal1 = StructAfter<CPALV1Tail> (*this);
+    return cpal1.get_palette_name_id (this, palette);
+  }
+
+  inline unsigned int get_palette_count () const
+  {
+    return numPalettes;
+  }
+
+  inline hb_ot_color_t get_color_record_argb (unsigned int color_index, unsigned int palette) const
+  {
+    if (color_index >= numPaletteEntries || palette >= numPalettes)
+      return 0;
+
+    const BGRAColor* records = &colorRecordsZ(this);
+    // No need for more range check as it is already done on #sanitize
+    return records[colorRecordIndicesX[palette] + color_index];
+  }
+
+  protected:
+  HBUINT16	version;
+  /* Version 0 */
+  HBUINT16	numPaletteEntries;
+  HBUINT16	numPalettes;
+  HBUINT16	numColorRecords;
+  LOffsetTo<HBUINT32>	colorRecordsZ;
+  HBUINT16	colorRecordIndicesX[VAR];  // VAR=numPalettes
+/*CPALV1Tail	v1[VAR];*/
+  public:
+  DEFINE_SIZE_ARRAY (12, colorRecordIndicesX);
+};
+
+} /* namespace OT */
+
+
+#endif /* HB_OT_COLOR_CPAL_TABLE_HH */

Added: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-color.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-color.cc	                        (rev 0)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-color.cc	2018-03-07 22:32:14 UTC (rev 46877)
@@ -0,0 +1,183 @@
+/*
+ * Copyright © 2016  Google, Inc.
+ * 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
+ */
+
+#include "hb-open-type-private.hh"
+#include "hb-ot-color-colr-table.hh"
+#include "hb-ot-color-cpal-table.hh"
+#include "hb-ot.h"
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "hb-ot-layout-private.hh"
+#include "hb-shaper-private.hh"
+
+#if 0
+HB_MARK_AS_FLAG_T (hb_ot_color_palette_flags_t)
+//HB_SHAPER_DATA_ENSURE_DECLARE(ot, face) Hmm?
+
+
+static inline const OT::COLR&
+_get_colr (hb_face_t *face)
+{
+  if (unlikely (!hb_ot_shaper_face_data_ensure (face))) return OT::Null(OT::COLR);
+  hb_ot_layout_t * layout = hb_ot_layout_from_face (face);
+  return *(layout->colr.get ());
+}
+
+static inline const OT::CPAL&
+_get_cpal (hb_face_t *face)
+{
+  if (unlikely (!hb_ot_shaper_face_data_ensure (face))) return OT::Null(OT::CPAL);
+  hb_ot_layout_t * layout = hb_ot_layout_from_face (face);
+  return *(layout->cpal.get ());
+}
+
+
+/**
+ * hb_ot_color_get_palette_count:
+ * @face: a font face.
+ *
+ * Returns: the number of color palettes in @face, or zero if @face has
+ * no colors.
+ *
+ * Since: REPLACEME
+ */
+unsigned int
+hb_ot_color_get_palette_count (hb_face_t *face)
+{
+  const OT::CPAL& cpal = _get_cpal (face);
+  return cpal.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.
+ *
+ * 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.
+ *
+ * Since: REPLACEME
+ */
+unsigned int
+hb_ot_color_get_palette_name_id (hb_face_t *face, unsigned int palette)
+{
+  const OT::CPAL& cpal = _get_cpal (face);
+  return cpal.get_palette_name_id (palette);
+}
+
+
+/**
+ * hb_ot_color_get_palette_flags:
+ * @face: a font face
+ * @palette: 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.
+ *
+ * Since: REPLACEME
+ */
+hb_ot_color_palette_flags_t
+hb_ot_color_get_palette_flags (hb_face_t *face, unsigned int palette)
+{
+  const OT::CPAL& cpal = _get_cpal(face);
+  return cpal.get_palette_flags (palette);
+}
+
+
+/**
+ * hb_ot_color_get_palette_colors:
+ * @face:         a font face.
+ * @palette:      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
+ *                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.
+ *
+ * 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.
+ *
+ * Since: REPLACEME
+ */
+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 */)
+{
+  const OT::CPAL& cpal = _get_cpal(face);
+  if (unlikely (palette >= cpal.numPalettes))
+  {
+    if (color_count) *color_count = 0;
+    return 0;
+  }
+
+  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;
+    }
+  }
+
+  if (likely (color_count)) *color_count = num_results;
+  return cpal.numPaletteEntries;
+}
+#endif

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-03-07 21:52:46 UTC (rev 46876)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-font.cc	2018-03-07 22:32:14 UTC (rev 46877)
@@ -31,13 +31,14 @@
 #include "hb-font-private.hh"
 
 #include "hb-ot-cmap-table.hh"
-#include "hb-ot-cbdt-table.hh"
 #include "hb-ot-glyf-table.hh"
 #include "hb-ot-hmtx-table.hh"
 #include "hb-ot-kern-table.hh"
 #include "hb-ot-post-table.hh"
 
+#include "hb-ot-color-cbdt-table.hh"
 
+
 struct hb_ot_font_t
 {
   OT::cmap::accelerator_t cmap;

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-03-07 21:52:46 UTC (rev 46876)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-glyf-table.hh	2018-03-07 22:32:14 UTC (rev 46877)
@@ -29,8 +29,10 @@
 
 #include "hb-open-type-private.hh"
 #include "hb-ot-head-table.hh"
+#include "hb-subset-glyf.hh"
+#include "hb-subset-plan.hh"
+#include "hb-subset-private.hh"
 
-
 namespace OT {
 
 
@@ -78,12 +80,50 @@
     return_trace (true);
   }
 
+  inline bool subset (hb_subset_plan_t *plan) const
+  {
+    hb_blob_t *glyf_prime = nullptr;
+    hb_blob_t *loca_prime = nullptr;
+
+    bool success = true;
+    bool use_short_loca = false;
+    if (hb_subset_glyf_and_loca (plan, &use_short_loca, &glyf_prime, &loca_prime)) {
+      success = success && hb_subset_plan_add_table (plan, HB_OT_TAG_glyf, glyf_prime);
+      success = success && hb_subset_plan_add_table (plan, HB_OT_TAG_loca, loca_prime);
+      success = success && _add_head_and_set_loca_version (plan->source, use_short_loca, plan->dest);
+    } else {
+      success = false;
+    }
+    hb_blob_destroy (loca_prime);
+    hb_blob_destroy (glyf_prime);
+
+    return success;
+  }
+
+  static bool
+  _add_head_and_set_loca_version (hb_face_t *source, bool use_short_loca, hb_face_t *dest)
+  {
+    hb_blob_t *head_blob = OT::Sanitizer<OT::head>().sanitize (hb_face_reference_table (source, HB_OT_TAG_head));
+    hb_blob_t *head_prime_blob = hb_blob_copy_writable_or_fail (head_blob);
+    hb_blob_destroy (head_blob);
+
+    if (unlikely (!head_prime_blob))
+      return false;
+
+    OT::head *head_prime = (OT::head *) hb_blob_get_data_writable (head_prime_blob, nullptr);
+    head_prime->indexToLocFormat.set (use_short_loca ? 0 : 1);
+    bool success = hb_subset_face_add_table (dest, HB_OT_TAG_head, head_prime_blob);
+
+    hb_blob_destroy (head_prime_blob);
+    return success;
+  }
+
   struct GlyphHeader
   {
     HBINT16		numberOfContours;	/* If the number of contours is
-					   * greater than or equal to zero,
-					   * this is a simple glyph; if negative,
-					   * this is a composite glyph. */
+                                                 * greater than or equal to zero,
+                                                 * this is a simple glyph; if negative,
+                                                 * this is a composite glyph. */
     FWORD		xMin;			/* Minimum x for coordinate data. */
     FWORD		yMin;			/* Minimum y for coordinate data. */
     FWORD		xMax;			/* Maximum x for coordinate data. */
@@ -92,6 +132,102 @@
     DEFINE_SIZE_STATIC (10);
   };
 
+  struct CompositeGlyphHeader
+  {
+    static const uint16_t ARG_1_AND_2_ARE_WORDS =      0x0001;
+    static const uint16_t ARGS_ARE_XY_VALUES =         0x0002;
+    static const uint16_t ROUND_XY_TO_GRID =           0x0004;
+    static const uint16_t WE_HAVE_A_SCALE =            0x0008;
+    static const uint16_t MORE_COMPONENTS =            0x0020;
+    static const uint16_t WE_HAVE_AN_X_AND_Y_SCALE =   0x0040;
+    static const uint16_t WE_HAVE_A_TWO_BY_TWO =       0x0080;
+    static const uint16_t WE_HAVE_INSTRUCTIONS =       0x0100;
+    static const uint16_t USE_MY_METRICS =             0x0200;
+    static const uint16_t OVERLAP_COMPOUND =           0x0400;
+    static const uint16_t SCALED_COMPONENT_OFFSET =    0x0800;
+    static const uint16_t UNSCALED_COMPONENT_OFFSET =  0x1000;
+
+    HBUINT16 flags;
+    HBUINT16 glyphIndex;
+
+    inline unsigned int get_size (void) const
+    {
+      unsigned int size = min_size;
+      if (flags & ARG_1_AND_2_ARE_WORDS) {
+        // arg1 and 2 are int16
+        size += 4;
+      } else {
+        // arg1 and 2 are int8
+        size += 2;
+      }
+      if (flags & WE_HAVE_A_SCALE) {
+        // One x 16 bit (scale)
+        size += 2;
+      } else if (flags & WE_HAVE_AN_X_AND_Y_SCALE) {
+        // Two x 16 bit (xscale, yscale)
+        size += 4;
+      } else if (flags & WE_HAVE_A_TWO_BY_TWO) {
+        // Four x 16 bit (xscale, scale01, scale10, yscale)
+        size += 8;
+      }
+      return size;
+    }
+
+    struct Iterator
+    {
+      const char *glyph_start;
+      const char *glyph_end;
+      const CompositeGlyphHeader *current;
+
+      inline bool move_to_next ()
+      {
+	if (current->flags & CompositeGlyphHeader::MORE_COMPONENTS)
+	{
+	  const CompositeGlyphHeader *possible =
+	    &StructAfter<CompositeGlyphHeader, CompositeGlyphHeader> (*current);
+	  if (!in_range (possible))
+	    return false;
+	  current = possible;
+	  return true;
+	}
+	return false;
+      }
+
+      inline bool in_range (const CompositeGlyphHeader *composite) const
+      {
+	return (const char *) composite >= glyph_start
+	  && ((const char *) composite + CompositeGlyphHeader::min_size) <= glyph_end
+	  && ((const char *) composite + composite->get_size()) <= glyph_end;
+      }
+    };
+
+    static inline bool get_iterator (const char * glyph_data,
+				     unsigned int length,
+				     CompositeGlyphHeader::Iterator *iterator /* OUT */)
+    {
+      if (length < GlyphHeader::static_size)
+	return false; /* Empty glyph; zero extents. */
+
+      const GlyphHeader &glyph_header = StructAtOffset<GlyphHeader> (glyph_data, 0);
+      if (glyph_header.numberOfContours < 0)
+      {
+        const CompositeGlyphHeader *possible =
+	  &StructAfter<CompositeGlyphHeader, GlyphHeader> (glyph_header);
+
+	iterator->glyph_start = glyph_data;
+	iterator->glyph_end = (const char *) glyph_data + length;
+	if (!iterator->in_range (possible))
+          return false;
+        iterator->current = possible;
+        return true;
+      }
+
+      return false;
+    }
+
+    DEFINE_SIZE_MIN (4);
+  };
+
   struct accelerator_t
   {
     inline void init (hb_face_t *face)
@@ -122,30 +258,187 @@
       hb_blob_destroy (glyf_blob);
     }
 
-    inline bool get_extents (hb_codepoint_t glyph,
-			     hb_glyph_extents_t *extents) const
+    /*
+     * Returns true if the referenced glyph is a valid glyph and a composite glyph.
+     * If true is returned a pointer to the composite glyph will be written into
+     * composite.
+     */
+    inline bool get_composite (hb_codepoint_t glyph,
+			       CompositeGlyphHeader::Iterator *composite /* OUT */) const
     {
+      unsigned int start_offset, end_offset;
+      if (!get_offsets (glyph, &start_offset, &end_offset))
+        return false; /* glyph not found */
+
+      return CompositeGlyphHeader::get_iterator ((const char*) this->glyf_table + start_offset,
+						 end_offset - start_offset,
+						 composite);
+    }
+
+    /* based on FontTools _g_l_y_f.py::trim */
+    inline bool remove_padding(unsigned int start_offset,
+                               unsigned int *end_offset) const
+    {
+      static const int FLAG_X_SHORT = 0x02;
+      static const int FLAG_Y_SHORT = 0x04;
+      static const int FLAG_REPEAT = 0x08;
+      static const int FLAG_X_SAME = 0x10;
+      static const int FLAG_Y_SAME = 0x20;
+
+      if (*end_offset - start_offset < GlyphHeader::static_size)
+        return true;
+
+      const char *glyph = ((const char *) glyf_table) + start_offset;
+      const char * const glyph_end = glyph + (*end_offset - start_offset);
+      const GlyphHeader &glyph_header = StructAtOffset<GlyphHeader> (glyph, 0);
+      int16_t num_contours = (int16_t) glyph_header.numberOfContours;
+
+      if (num_contours < 0)
+        /* Trimming for composites not implemented.
+         * If removing hints it falls out of that. */
+        return true;
+      else if (num_contours > 0)
+      {
+        /* simple glyph w/contours, possibly trimmable */
+        glyph += GlyphHeader::static_size + 2 * num_contours;
+
+        if (unlikely (glyph + 2 >= glyph_end)) return false;
+        uint16_t nCoordinates = (uint16_t) StructAtOffset<HBUINT16>(glyph - 2, 0) + 1;
+        uint16_t nInstructions = (uint16_t) StructAtOffset<HBUINT16>(glyph, 0);
+
+        glyph += 2 + nInstructions;
+        if (unlikely (glyph + 2 >= glyph_end)) return false;
+
+        unsigned int coordBytes = 0;
+        unsigned int coordsWithFlags = 0;
+        while (glyph < glyph_end)
+        {
+          uint8_t flag = (uint8_t) *glyph;
+          glyph++;
+
+          unsigned int repeat = 1;
+          if (flag & FLAG_REPEAT)
+          {
+            if (glyph >= glyph_end)
+            {
+              DEBUG_MSG(SUBSET, nullptr, "Bad flag");
+              return false;
+            }
+            repeat = ((uint8_t) *glyph) + 1;
+            glyph++;
+          }
+
+          unsigned int xBytes, yBytes;
+          xBytes = yBytes = 0;
+          if (flag & FLAG_X_SHORT)
+            xBytes = 1;
+          else if ((flag & FLAG_X_SAME) == 0)
+            xBytes = 2;
+
+          if (flag & FLAG_Y_SHORT)
+            yBytes = 1;
+          else if ((flag & FLAG_Y_SAME) == 0)
+            yBytes = 2;
+
+          coordBytes += (xBytes + yBytes) * repeat;
+          coordsWithFlags += repeat;
+          if (coordsWithFlags >= nCoordinates)
+            break;
+        }
+
+        if (coordsWithFlags != nCoordinates)
+        {
+          DEBUG_MSG(SUBSET, nullptr, "Expect %d coords to have flags, got flags for %d", nCoordinates, coordsWithFlags);
+          return false;
+        }
+        glyph += coordBytes;
+
+        if (glyph < glyph_end)
+          *end_offset -= glyph_end - glyph;
+      }
+      return true;
+    }
+
+    inline bool get_offsets (hb_codepoint_t  glyph,
+                             unsigned int   *start_offset /* OUT */,
+                             unsigned int   *end_offset   /* OUT */) const
+    {
       if (unlikely (glyph >= num_glyphs))
 	return false;
 
-      unsigned int start_offset, end_offset;
       if (short_offset)
       {
         const HBUINT16 *offsets = (const HBUINT16 *) loca_table->dataX;
-	start_offset = 2 * offsets[glyph];
-	end_offset   = 2 * offsets[glyph + 1];
+	*start_offset = 2 * offsets[glyph];
+	*end_offset   = 2 * offsets[glyph + 1];
       }
       else
       {
         const HBUINT32 *offsets = (const HBUINT32 *) loca_table->dataX;
-	start_offset = offsets[glyph];
-	end_offset   = offsets[glyph + 1];
+
+	*start_offset = offsets[glyph];
+	*end_offset   = offsets[glyph + 1];
       }
 
-      if (start_offset > end_offset || end_offset > glyf_len)
+      if (*start_offset > *end_offset || *end_offset > glyf_len)
 	return false;
 
+      return true;
+    }
+
+    inline bool get_instruction_offsets(unsigned int start_offset,
+                                        unsigned int end_offset,
+                                        unsigned int *instruction_start /* OUT */,
+                                        unsigned int *instruction_end /* OUT */) const
+    {
       if (end_offset - start_offset < GlyphHeader::static_size)
+      {
+        *instruction_start = 0;
+        *instruction_end = 0;
+        return true; /* Empty glyph; no instructions. */
+      }
+      const GlyphHeader &glyph_header = StructAtOffset<GlyphHeader> (glyf_table, start_offset);
+      int16_t num_contours = (int16_t) glyph_header.numberOfContours;
+      if (num_contours < 0)
+      {
+        CompositeGlyphHeader::Iterator composite_it;
+        if (unlikely (!CompositeGlyphHeader::get_iterator (
+            (const char*) this->glyf_table + start_offset,
+             end_offset - start_offset, &composite_it))) return false;
+        const CompositeGlyphHeader *last;
+        do {
+          last = composite_it.current;
+        } while (composite_it.move_to_next());
+
+        if ( (uint16_t) last->flags & CompositeGlyphHeader::WE_HAVE_INSTRUCTIONS)
+          *instruction_start = ((char *) last - (char *) glyf_table->dataX) + last->get_size();
+        else
+          *instruction_start = end_offset;
+        *instruction_end = end_offset;
+        if (unlikely (*instruction_start > *instruction_end))
+        {
+          DEBUG_MSG(SUBSET, nullptr, "Invalid instruction offset, %d is outside [%d, %d]", *instruction_start, start_offset, end_offset);
+          return false;
+        }
+      }
+      else
+      {
+        unsigned int instruction_length_offset = start_offset + GlyphHeader::static_size + 2 * num_contours;
+        const HBUINT16 &instruction_length = StructAtOffset<HBUINT16> (glyf_table, instruction_length_offset);
+        *instruction_start = instruction_length_offset + 2;
+        *instruction_end = *instruction_start + (uint16_t) instruction_length;
+      }
+      return true;
+    }
+
+    inline bool get_extents (hb_codepoint_t glyph,
+			     hb_glyph_extents_t *extents) const
+    {
+      unsigned int start_offset, end_offset;
+      if (!get_offsets (glyph, &start_offset, &end_offset))
+        return false;
+
+      if (end_offset - start_offset < GlyphHeader::static_size)
 	return true; /* Empty glyph; zero extents. */
 
       const GlyphHeader &glyph_header = StructAtOffset<GlyphHeader> (glyf_table, start_offset);

Added: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-hdmx-table.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-hdmx-table.hh	                        (rev 0)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-hdmx-table.hh	2018-03-07 22:32:14 UTC (rev 46877)
@@ -0,0 +1,198 @@
+/*
+ * 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): Garret Rieger
+ */
+
+#ifndef HB_OT_HDMX_TABLE_HH
+#define HB_OT_HDMX_TABLE_HH
+
+#include "hb-open-type-private.hh"
+
+namespace OT {
+
+
+/*
+ * hdmx - Horizontal Device Metric
+ */
+
+#define HB_OT_TAG_hdmx HB_TAG('h','d','m','x')
+
+struct DeviceRecord
+{
+  struct SubsetView
+  {
+    const DeviceRecord *source_device_record;
+    hb_subset_plan_t *subset_plan;
+
+    inline void init(const DeviceRecord *source_device_record,
+		     hb_subset_plan_t   *subset_plan)
+    {
+      this->source_device_record = source_device_record;
+      this->subset_plan = subset_plan;
+    }
+
+    inline unsigned int len () const
+    {
+      return this->subset_plan->gids_to_retain_sorted.len;
+    }
+
+    inline const HBUINT8& operator [] (unsigned int i) const
+    {
+      if (unlikely (i >= len())) return Null(HBUINT8);
+      hb_codepoint_t gid = this->subset_plan->gids_to_retain_sorted [i];
+      return this->source_device_record->widths[gid];
+    }
+  };
+
+  static inline unsigned int get_size (unsigned int count)
+  {
+    unsigned int raw_size = min_size + count * HBUINT8::static_size;
+    if (raw_size % 4)
+      /* Align to 32 bits */
+      return raw_size + (4 - (raw_size % 4));
+    return raw_size;
+  }
+
+  inline bool serialize (hb_serialize_context_t *c, const SubsetView &subset_view)
+  {
+    TRACE_SERIALIZE (this);
+
+    if (unlikely (!c->allocate_size<DeviceRecord> (get_size (subset_view.len()))))
+      return_trace (false);
+
+    this->pixel_size.set (subset_view.source_device_record->pixel_size);
+    this->max_width.set (subset_view.source_device_record->max_width);
+
+    for (unsigned int i = 0; i < subset_view.len(); i++)
+      widths[i].set (subset_view[i]);
+
+    return_trace (true);
+  }
+
+  inline bool sanitize (hb_sanitize_context_t *c, unsigned int size_device_record) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (likely (c->check_struct (this) &&
+			  c->check_range (this, size_device_record)));
+  }
+
+  HBUINT8 pixel_size;   /* Pixel size for following widths (as ppem). */
+  HBUINT8 max_width;    /* Maximum width. */
+  HBUINT8 widths[VAR];  /* Array of widths (numGlyphs is from the 'maxp' table). */
+  public:
+  DEFINE_SIZE_ARRAY (2, widths);
+};
+
+
+struct hdmx
+{
+  static const hb_tag_t tableTag = HB_OT_TAG_hdmx;
+
+  inline unsigned int get_size (void) const
+  {
+    return min_size + num_records * size_device_record;
+  }
+
+  inline const DeviceRecord& operator [] (unsigned int i) const
+  {
+    if (unlikely (i >= num_records)) return Null(DeviceRecord);
+    return StructAtOffset<DeviceRecord> (this, min_size + i * size_device_record);
+  }
+
+  inline bool serialize (hb_serialize_context_t *c, const hdmx *source_hdmx, hb_subset_plan_t *plan)
+  {
+    TRACE_SERIALIZE (this);
+
+    if (unlikely (!c->extend_min ((*this))))  return_trace (false);
+
+    this->version.set (source_hdmx->version);
+    this->num_records.set (source_hdmx->num_records);
+    this->size_device_record.set (DeviceRecord::get_size (plan->gids_to_retain_sorted.len));
+
+    for (unsigned int i = 0; i < source_hdmx->num_records; i++)
+    {
+      DeviceRecord::SubsetView subset_view;
+      subset_view.init (&(*source_hdmx)[i], plan);
+
+      c->start_embed<DeviceRecord> ()->serialize (c, subset_view);
+    }
+
+    return_trace (true);
+  }
+
+  static inline size_t get_subsetted_size (hb_subset_plan_t *plan)
+  {
+    return min_size + DeviceRecord::get_size (plan->gids_to_retain_sorted.len);
+  }
+
+  inline bool subset (hb_subset_plan_t *plan) const
+  {
+    size_t dest_size = get_subsetted_size (plan);
+    hdmx *dest = (hdmx *) malloc (dest_size);
+    if (unlikely (!dest))
+    {
+      DEBUG_MSG(SUBSET, nullptr, "Unable to alloc %lu for hdmx subset output.", (unsigned long) dest_size);
+      return false;
+    }
+
+    hb_serialize_context_t c (dest, dest_size);
+    hdmx *hdmx_prime = c.start_serialize<hdmx> ();
+    if (!hdmx_prime || !hdmx_prime->serialize (&c, this, plan)) {
+      free (dest);
+      return false;
+    }
+    c.end_serialize ();
+
+    hb_blob_t *hdmx_prime_blob = hb_blob_create ((const char *) dest,
+						 dest_size,
+						 HB_MEMORY_MODE_READONLY,
+						 dest,
+						 free);
+    bool result = hb_subset_plan_add_table (plan, HB_OT_TAG_hdmx, hdmx_prime_blob);
+    hb_blob_destroy (hdmx_prime_blob);
+
+    return result;
+  }
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) && version == 0 &&
+		  !_hb_unsigned_int_mul_overflows (num_records, size_device_record) &&
+		  c->check_range (this, get_size()));
+  }
+
+  protected:
+  HBUINT16	version;		/* Table version number (0) */
+  HBUINT16	num_records;		/* Number of device records. */
+  HBUINT32	size_device_record;	/* Size of a device record, 32-bit aligned. */
+  HBUINT8	data[VAR];		/* Array of device records. */
+  public:
+  DEFINE_SIZE_ARRAY (8, data);
+};
+
+} /* namespace OT */
+
+
+#endif /* HB_OT_HDMX_TABLE_HH */

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-head-table.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-head-table.hh	2018-03-07 21:52:46 UTC (rev 46876)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-head-table.hh	2018-03-07 22:32:14 UTC (rev 46877)
@@ -43,6 +43,8 @@
 
 struct head
 {
+  friend struct OffsetTable;
+
   static const hb_tag_t tableTag	= HB_OT_TAG_head;
 
   inline unsigned int get_upem (void) const

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-hhea-table.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-hhea-table.hh	2018-03-07 21:52:46 UTC (rev 46876)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-hhea-table.hh	2018-03-07 22:32:14 UTC (rev 46877)
@@ -41,7 +41,7 @@
 #define HB_OT_TAG_hhea HB_TAG('h','h','e','a')
 #define HB_OT_TAG_vhea HB_TAG('v','h','e','a')
 
-
+template <typename T>
 struct _hea
 {
   inline bool sanitize (hb_sanitize_context_t *c) const
@@ -84,10 +84,10 @@
   DEFINE_SIZE_STATIC (36);
 };
 
-struct hhea : _hea {
+struct hhea : _hea<hhea> {
   static const hb_tag_t tableTag	= HB_OT_TAG_hhea;
 };
-struct vhea : _hea {
+struct vhea : _hea<vhea> {
   static const hb_tag_t tableTag	= HB_OT_TAG_vhea;
 };
 

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-03-07 21:52:46 UTC (rev 46876)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-hmtx-table.hh	2018-03-07 22:32:14 UTC (rev 46877)
@@ -21,7 +21,7 @@
  * 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
+ * Google Author(s): Behdad Esfahbod, Roderick Sheeter
  */
 
 #ifndef HB_OT_HMTX_TABLE_HH
@@ -53,7 +53,7 @@
   DEFINE_SIZE_STATIC (4);
 };
 
-template <typename T>
+template <typename T, typename H>
 struct hmtxvmtx
 {
   inline bool sanitize (hb_sanitize_context_t *c) const
@@ -64,17 +64,128 @@
     return_trace (true);
   }
 
+
+  inline bool subset_update_header (hb_subset_plan_t *plan,
+                                    unsigned int num_hmetrics) const
+  {
+    hb_blob_t *src_blob = OT::Sanitizer<H> ().sanitize (plan->source->reference_table (H::tableTag));
+    hb_blob_t *dest_blob = hb_blob_copy_writable_or_fail(src_blob);
+    hb_blob_destroy (src_blob);
+
+    if (unlikely (!dest_blob)) {
+      return false;
+    }
+
+    unsigned int length;
+    H *table = (H *) hb_blob_get_data (dest_blob, &length);
+    table->numberOfLongMetrics.set (num_hmetrics);
+
+    bool result = hb_subset_plan_add_table (plan, H::tableTag, dest_blob);
+    hb_blob_destroy (dest_blob);
+
+    return result;
+  }
+
+  inline bool subset (hb_subset_plan_t *plan) const
+  {
+    typename T::accelerator_t _mtx;
+    _mtx.init (plan->source);
+
+    /* All the trailing glyphs with the same advance can use one LongMetric
+     * and just keep LSB */
+    hb_prealloced_array_t<hb_codepoint_t> &gids = plan->gids_to_retain_sorted;
+    unsigned int num_advances = gids.len;
+    unsigned int last_advance = _mtx.get_advance (gids[num_advances - 1]);
+    while (num_advances > 1
+        && last_advance == _mtx.get_advance (gids[num_advances - 2]))
+    {
+      num_advances--;
+    }
+
+    /* alloc the new table */
+    size_t dest_sz = num_advances * 4
+                  + (gids.len - num_advances) * 2;
+    void *dest = (void *) malloc (dest_sz);
+    if (unlikely (!dest))
+    {
+      return false;
+    }
+    DEBUG_MSG(SUBSET, nullptr, "%c%c%c%c in src has %d advances, %d lsbs", HB_UNTAG(T::tableTag), _mtx.num_advances, _mtx.num_metrics - _mtx.num_advances);
+    DEBUG_MSG(SUBSET, nullptr, "%c%c%c%c in dest has %d advances, %d lsbs, %u bytes", HB_UNTAG(T::tableTag), num_advances, gids.len - num_advances, (unsigned int) dest_sz);
+
+    const char *source_table = hb_blob_get_data (_mtx.blob, nullptr);
+    // Copy everything over
+    LongMetric * old_metrics = (LongMetric *) source_table;
+    FWORD *lsbs = (FWORD *) (old_metrics + _mtx.num_advances);
+    char * dest_pos = (char *) dest;
+    for (unsigned int i = 0; i < gids.len; i++)
+    {
+      /* the last metric or the one for gids[i] */
+      LongMetric *src_metric = old_metrics + MIN ((hb_codepoint_t) _mtx.num_advances - 1, gids[i]);
+      if (gids[i] < _mtx.num_advances)
+      {
+        /* src is a LongMetric */
+        if (i < num_advances)
+        {
+          /* dest is a LongMetric, copy it */
+          *((LongMetric *) dest_pos) = *src_metric;
+        }
+        else
+        {
+          /* dest just lsb */
+          *((FWORD *) dest_pos) = src_metric->lsb;
+        }
+      }
+      else
+      {
+        FWORD src_lsb = *(lsbs + gids[i] - _mtx.num_advances);
+        if (i < num_advances)
+        {
+          /* dest needs a full LongMetric */
+          LongMetric *metric = (LongMetric *)dest_pos;
+          metric->advance = src_metric->advance;
+          metric->lsb = src_lsb;
+        }
+        else
+        {
+          /* dest just needs an lsb */
+          *((FWORD *) dest_pos) = src_lsb;
+        }
+      }
+      dest_pos += (i < num_advances ? 4 : 2);
+    }
+    _mtx.fini ();
+
+    // Amend header num hmetrics
+    if (unlikely (!subset_update_header (plan, num_advances)))
+    {
+      free (dest);
+      return false;
+    }
+
+    hb_blob_t *result = hb_blob_create ((const char *)dest,
+                                        dest_sz,
+                                        HB_MEMORY_MODE_READONLY,
+                                        dest,
+                                        free);
+    bool success = hb_subset_plan_add_table (plan, T::tableTag, result);
+    hb_blob_destroy (result);
+    return success;
+  }
+
   struct accelerator_t
   {
+    friend struct hmtxvmtx;
+
     inline void init (hb_face_t *face,
 		      unsigned int default_advance_ = 0)
     {
-      default_advance = default_advance_ ? default_advance_ : face->get_upem ();
+      default_advance = default_advance_ ? default_advance_ : hb_face_get_upem (face);
 
       bool got_font_extents = false;
       if (T::os2Tag)
       {
-	hb_blob_t *os2_blob = Sanitizer<os2>().sanitize (face->reference_table (T::os2Tag));
+	hb_blob_t *os2_blob = Sanitizer<os2> ().sanitize (face->reference_table (T::os2Tag));
 	const os2 *os2_table = Sanitizer<os2>::lock_instance (os2_blob);
 #define USE_TYPO_METRICS (1u<<7)
 	if (0 != (os2_table->fsSelection & USE_TYPO_METRICS))
@@ -87,8 +198,8 @@
 	hb_blob_destroy (os2_blob);
       }
 
-      hb_blob_t *_hea_blob = Sanitizer<_hea>().sanitize (face->reference_table (T::headerTag));
-      const _hea *_hea_table = Sanitizer<_hea>::lock_instance (_hea_blob);
+      hb_blob_t *_hea_blob = Sanitizer<H> ().sanitize (face->reference_table (H::tableTag));
+      const H *_hea_table = Sanitizer<H>::lock_instance (_hea_blob);
       num_advances = _hea_table->numberOfLongMetrics;
       if (!got_font_extents)
       {
@@ -101,7 +212,7 @@
 
       has_font_extents = got_font_extents;
 
-      blob = Sanitizer<hmtxvmtx>().sanitize (face->reference_table (T::tableTag));
+      blob = Sanitizer<hmtxvmtx> ().sanitize (face->reference_table (T::tableTag));
 
       /* Cap num_metrics() and num_advances() based on table length. */
       unsigned int len = hb_blob_get_length (blob);
@@ -119,7 +230,7 @@
       }
       table = Sanitizer<hmtxvmtx>::lock_instance (blob);
 
-      var_blob = Sanitizer<HVARVVAR>().sanitize (face->reference_table (T::variationsTag));
+      var_blob = Sanitizer<HVARVVAR> ().sanitize (face->reference_table (T::variationsTag));
       var_table = Sanitizer<HVARVVAR>::lock_instance (var_blob);
     }
 
@@ -129,24 +240,33 @@
       hb_blob_destroy (var_blob);
     }
 
-    inline unsigned int get_advance (hb_codepoint_t  glyph,
-				     hb_font_t      *font) const
+    inline unsigned int get_advance (hb_codepoint_t  glyph) const
     {
       if (unlikely (glyph >= num_metrics))
       {
-	/* If num_metrics is zero, it means we don't have the metrics table
-	 * for this direction: return default advance.  Otherwise, it means that the
-	 * glyph index is out of bound: return zero. */
-	if (num_metrics)
-	  return 0;
-	else
-	  return default_advance;
+        /* If num_metrics is zero, it means we don't have the metrics table
+         * for this direction: return default advance.  Otherwise, it means that the
+         * glyph index is out of bound: return zero. */
+        if (num_metrics)
+          return 0;
+        else
+          return default_advance;
       }
 
-      return table->longMetric[MIN (glyph, (uint32_t) num_advances - 1)].advance
-	   + (font->num_coords ? var_table->get_advance_var (glyph, font->coords, font->num_coords) : 0); // TODO Optimize?!
+      return table->longMetric[MIN (glyph, (uint32_t) num_advances - 1)].advance;
     }
 
+    inline unsigned int get_advance (hb_codepoint_t  glyph,
+                                     hb_font_t      *font) const
+    {
+      unsigned int advance = get_advance (glyph);
+      if (likely(glyph < num_metrics))
+      {
+        advance += (font->num_coords ? var_table->get_advance_var (glyph, font->coords, font->num_coords) : 0); // TODO Optimize?!
+      }
+      return advance;	        
+    }
+
     public:
     bool has_font_extents;
     unsigned short ascender;
@@ -153,11 +273,12 @@
     unsigned short descender;
     unsigned short line_gap;
 
-    private:
+    protected:
     unsigned int num_metrics;
     unsigned int num_advances;
     unsigned int default_advance;
 
+    private:
     const hmtxvmtx *table;
     hb_blob_t *blob;
     const HVARVVAR *var_table;
@@ -173,7 +294,7 @@
 					 * be in the array, but that entry is
 					 * required. The last entry applies to
 					 * all subsequent glyphs. */
-  FWORD		leadingBearingX[VAR];	/* Here the advance is assumed
+/*FWORD		leadingBearingX[VAR];*/	/* Here the advance is assumed
 					 * to be the same as the advance
 					 * for the last entry above. The
 					 * number of entries in this array is
@@ -187,18 +308,16 @@
 					 * font to vary the side bearing
 					 * values for each glyph. */
   public:
-  DEFINE_SIZE_ARRAY2 (0, longMetric, leadingBearingX);
+  DEFINE_SIZE_ARRAY (0, longMetric);
 };
 
-struct hmtx : hmtxvmtx<hmtx> {
+struct hmtx : hmtxvmtx<hmtx, hhea> {
   static const hb_tag_t tableTag	= HB_OT_TAG_hmtx;
-  static const hb_tag_t headerTag	= HB_OT_TAG_hhea;
   static const hb_tag_t variationsTag	= HB_OT_TAG_HVAR;
   static const hb_tag_t os2Tag		= HB_OT_TAG_os2;
 };
-struct vmtx : hmtxvmtx<vmtx> {
+struct vmtx : hmtxvmtx<vmtx, vhea> {
   static const hb_tag_t tableTag	= HB_OT_TAG_vmtx;
-  static const hb_tag_t headerTag	= HB_OT_TAG_vhea;
   static const hb_tag_t variationsTag	= HB_OT_TAG_VVAR;
   static const hb_tag_t os2Tag		= HB_TAG_NONE;
 };

Added: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-base-table.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-base-table.hh	                        (rev 0)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-base-table.hh	2018-03-07 22:32:14 UTC (rev 46877)
@@ -0,0 +1,655 @@
+/*
+ * Copyright © 2016 Elie Roux <elie.roux at telecom-bretagne.eu>
+ * 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_LAYOUT_BASE_TABLE_HH
+#define HB_OT_LAYOUT_BASE_TABLE_HH
+
+#include "hb-open-type-private.hh"
+#include "hb-ot-layout-common-private.hh"
+
+namespace OT {
+
+#define NOT_INDEXED   ((unsigned int) -1)
+
+/*
+ * BASE -- The BASE Table
+ */
+
+struct BaseCoordFormat1
+{
+  inline int get_coord (void) const { return coordinate; }
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this));
+  }
+
+  protected:
+  HBUINT16	format;		/* Format identifier--format = 1 */
+  HBINT16	coordinate;	/* X or Y value, in design units */
+  public:
+  DEFINE_SIZE_STATIC (4);
+};
+
+struct BaseCoordFormat2
+{
+  inline int get_coord (void) const
+  {
+    /* TODO */
+    return coordinate;
+  }
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this));
+  }
+
+  protected:
+  HBUINT16	format;		/* Format identifier--format = 2 */
+  HBINT16	coordinate;	/* X or Y value, in design units */
+  GlyphID	referenceGlyph;	/* Glyph ID of control glyph */
+  HBUINT16	coordPoint;	/* Index of contour point on the
+				 * reference glyph */
+  public:
+  DEFINE_SIZE_STATIC (8);
+};
+
+struct BaseCoordFormat3
+{
+  inline int get_coord (void) const
+  {
+    /* TODO */
+    return coordinate;
+  }
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) && deviceTable.sanitize (c, this));
+  }
+
+  protected:
+  HBUINT16		format;		/* Format identifier--format = 3 */
+  HBINT16		coordinate;	/* X or Y value, in design units */
+  OffsetTo<Device>	deviceTable;	/* Offset to Device table for X or
+					 * Y value, from beginning of
+					 * BaseCoord table (may be NULL). */
+  public:
+  DEFINE_SIZE_STATIC (6);
+};
+
+struct BaseCoord
+{
+  inline int get_coord (void) const
+  {
+    switch (u.format) {
+    case 1: return u.format1.get_coord ();
+    case 2: return u.format2.get_coord ();
+    case 3: return u.format3.get_coord ();
+    default:return 0;
+    }
+  }
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    if (!u.format.sanitize (c)) return_trace (false);
+    switch (u.format) {
+    case 1: return_trace (u.format1.sanitize (c));
+    case 2: return_trace (u.format2.sanitize (c));
+    case 3: return_trace (u.format3.sanitize (c));
+    default:return_trace (false);
+    }
+  }
+
+  protected:
+  union {
+    HBUINT16		format;
+    BaseCoordFormat1	format1;
+    BaseCoordFormat2	format2;
+    BaseCoordFormat3	format3;
+  } u;
+  public:
+  DEFINE_SIZE_UNION (2, format);
+};
+
+struct FeatMinMaxRecord
+{
+  inline int get_min_value (void) const
+  { return (this+minCoord).get_coord(); }
+
+  inline int get_max_value (void) const
+  { return (this+maxCoord).get_coord(); }
+
+  inline const Tag &get_tag () const
+  { return tag; }
+
+  inline bool sanitize (hb_sanitize_context_t *c, const void *base) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) &&
+		  minCoord.sanitize (c, base) &&
+		  maxCoord.sanitize (c, base));
+  }
+
+  protected:
+  Tag                   tag;		/* 4-byte feature identification tag--must
+					 * match feature tag in FeatureList */
+  OffsetTo<BaseCoord>   minCoord;	/* Offset to BaseCoord table that defines
+					 * the minimum extent value, from beginning
+					 * of MinMax table (may be NULL) */
+  OffsetTo<BaseCoord>   maxCoord;	/* Offset to BaseCoord table that defines
+					 * the maximum extent value, from beginning
+					 * of MinMax table (may be NULL) */
+  public:
+  DEFINE_SIZE_STATIC (8);
+
+};
+
+struct MinMax
+{
+  inline unsigned int get_feature_tag_index (Tag featureTableTag) const
+  {
+    /* TODO bsearch */
+    unsigned int count = featMinMaxRecords.len;
+    for (unsigned int i = 0; i < count; i++)
+    {
+      Tag tag = featMinMaxRecords[i].get_tag();
+      int cmp = tag.cmp(featureTableTag);
+      if (cmp == 0) return i;
+      if (cmp > 0)  return NOT_INDEXED;
+    }
+    return NOT_INDEXED;
+  }
+
+  inline int get_min_value (unsigned int featureTableTagIndex) const
+  {
+    if (featureTableTagIndex == NOT_INDEXED)
+      return (this+minCoord).get_coord();
+    return featMinMaxRecords[featureTableTagIndex].get_min_value();
+  }
+
+  inline int get_max_value (unsigned int featureTableTagIndex) const
+  {
+    if (featureTableTagIndex == NOT_INDEXED)
+      return (this+maxCoord).get_coord();
+    return featMinMaxRecords[featureTableTagIndex].get_max_value();
+  }
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) &&
+		  minCoord.sanitize (c, this) &&
+		  maxCoord.sanitize (c, this) &&
+		  featMinMaxRecords.sanitize (c, this));
+  }
+
+  protected:
+  OffsetTo<BaseCoord>	minCoord;	/* Offset to BaseCoord table that defines
+					 * minimum extent value, from the beginning
+					 * of MinMax table (may be NULL) */
+  OffsetTo<BaseCoord>	maxCoord;	/* Offset to BaseCoord table that defines
+					 * maximum extent value, from the beginning
+					 * of MinMax table (may be NULL) */
+  ArrayOf<FeatMinMaxRecord>
+		featMinMaxRecords;	/* Array of FeatMinMaxRecords, in alphabetical
+					 * order by featureTableTag */
+  public:
+  DEFINE_SIZE_ARRAY (6, featMinMaxRecords);
+};
+
+/* TODO... */
+struct BaseLangSysRecord
+{
+  inline const Tag& get_tag(void) const
+  { return baseLangSysTag; }
+
+  inline unsigned int get_feature_tag_index (Tag featureTableTag) const
+  { return (this+minMax).get_feature_tag_index(featureTableTag); }
+
+  inline int get_min_value (unsigned int featureTableTagIndex) const
+  { return (this+minMax).get_min_value(featureTableTagIndex); }
+
+  inline int get_max_value (unsigned int featureTableTagIndex) const
+  { return (this+minMax).get_max_value(featureTableTagIndex); }
+
+  inline bool sanitize (hb_sanitize_context_t *c, const void *base) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) &&
+		  minMax.sanitize (c, base));
+  }
+
+  protected:
+  Tag			baseLangSysTag;
+  OffsetTo<MinMax>	minMax;
+  public:
+  DEFINE_SIZE_STATIC (6);
+
+};
+
+struct BaseValues
+{
+  inline unsigned int get_default_base_tag_index (void) const
+  { return defaultIndex; }
+
+  inline int get_base_coord (unsigned int baselineTagIndex) const
+  {
+    return (this+baseCoords[baselineTagIndex]).get_coord();
+  }
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) &&
+      defaultIndex <= baseCoordCount &&
+      baseCoords.sanitize (c, this));
+  }
+
+  protected:
+  Index				defaultIndex;
+  HBUINT16			baseCoordCount;
+  OffsetArrayOf<BaseCoord>	baseCoords;
+  public:
+  DEFINE_SIZE_ARRAY (6, baseCoords);
+
+};
+
+struct BaseScript {
+
+  inline unsigned int get_lang_tag_index (Tag baseLangSysTag) const
+  {
+    Tag tag;
+    int cmp;
+    for (unsigned int i = 0; i < baseLangSysCount; i++) {
+      tag = baseLangSysRecords[i].get_tag();
+      // taking advantage of alphabetical order
+      cmp = tag.cmp(baseLangSysTag);
+      if (cmp == 0) return i;
+      if (cmp > 0)  return NOT_INDEXED;
+    }
+    return NOT_INDEXED;
+  }
+
+  inline unsigned int get_feature_tag_index (unsigned int baseLangSysIndex, Tag featureTableTag) const
+  {
+    if (baseLangSysIndex == NOT_INDEXED) {
+      if (unlikely(defaultMinMax)) return NOT_INDEXED;
+      return (this+defaultMinMax).get_feature_tag_index(featureTableTag);
+    }
+    if (unlikely(baseLangSysIndex >= baseLangSysCount)) return NOT_INDEXED;
+    return baseLangSysRecords[baseLangSysIndex].get_feature_tag_index(featureTableTag);
+  }
+
+  inline int get_min_value (unsigned int baseLangSysIndex, unsigned int featureTableTagIndex) const
+  {
+    if (baseLangSysIndex == NOT_INDEXED)
+      return (this+defaultMinMax).get_min_value(featureTableTagIndex);
+    return baseLangSysRecords[baseLangSysIndex].get_max_value(featureTableTagIndex);
+  }
+
+  inline int get_max_value (unsigned int baseLangSysIndex, unsigned int featureTableTagIndex) const
+  {
+    if (baseLangSysIndex == NOT_INDEXED)
+      return (this+defaultMinMax).get_min_value(featureTableTagIndex);
+    return baseLangSysRecords[baseLangSysIndex].get_max_value(featureTableTagIndex);
+  }
+
+  inline unsigned int get_default_base_tag_index (void) const
+  { return (this+baseValues).get_default_base_tag_index(); }
+
+  inline int get_base_coord (unsigned int baselineTagIndex) const
+  { return (this+baseValues).get_base_coord(baselineTagIndex); }
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) &&
+      baseValues.sanitize (c, this) &&
+      defaultMinMax.sanitize (c, this) &&
+      baseLangSysRecords.sanitize (c, this));
+  }
+
+  protected:
+  OffsetTo<BaseValues>        baseValues;
+  OffsetTo<MinMax>            defaultMinMax;
+  HBUINT16                      baseLangSysCount;
+  ArrayOf<BaseLangSysRecord>  baseLangSysRecords;
+
+  public:
+    DEFINE_SIZE_ARRAY (8, baseLangSysRecords);
+};
+
+
+struct BaseScriptRecord {
+
+  inline const Tag& get_tag (void) const
+  { return baseScriptTag; }
+
+  inline unsigned int get_default_base_tag_index(void) const
+  { return (this+baseScript).get_default_base_tag_index(); }
+
+  inline int get_base_coord(unsigned int baselineTagIndex) const
+  { return (this+baseScript).get_base_coord(baselineTagIndex); }
+
+  inline unsigned int get_lang_tag_index (Tag baseLangSysTag) const
+  { return (this+baseScript).get_lang_tag_index(baseLangSysTag); }
+
+  inline unsigned int get_feature_tag_index (unsigned int baseLangSysIndex, Tag featureTableTag) const
+  { return (this+baseScript).get_feature_tag_index(baseLangSysIndex, featureTableTag); }
+
+  inline int get_max_value (unsigned int baseLangSysIndex, unsigned int featureTableTagIndex) const
+  { return (this+baseScript).get_max_value(baseLangSysIndex, featureTableTagIndex); }
+
+  inline int get_min_value (unsigned int baseLangSysIndex, unsigned int featureTableTagIndex) const
+  { return (this+baseScript).get_min_value(baseLangSysIndex, featureTableTagIndex); }
+
+  inline bool sanitize (hb_sanitize_context_t *c, const void *base) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) &&
+      baseScript != Null(OffsetTo<BaseScript>) &&
+      baseScript.sanitize (c, base));
+  }
+
+  protected:
+  Tag                   baseScriptTag;
+  OffsetTo<BaseScript>  baseScript;
+
+  public:
+    DEFINE_SIZE_STATIC (6);
+};
+
+struct BaseScriptList {
+
+  inline unsigned int get_base_script_index (Tag baseScriptTag) const
+  {
+    for (unsigned int i = 0; i < baseScriptCount; i++)
+      if (baseScriptRecords[i].get_tag() == baseScriptTag)
+        return i;
+    return NOT_INDEXED;
+  }
+
+  inline unsigned int get_default_base_tag_index (unsigned int baseScriptIndex) const
+  {
+    if (unlikely(baseScriptIndex >= baseScriptCount)) return NOT_INDEXED;
+    return baseScriptRecords[baseScriptIndex].get_default_base_tag_index();
+  }
+
+  inline int get_base_coord(unsigned int baseScriptIndex, unsigned int baselineTagIndex) const
+  {
+    return baseScriptRecords[baseScriptIndex].get_base_coord(baselineTagIndex);
+  }
+
+  inline unsigned int get_lang_tag_index (unsigned int baseScriptIndex, Tag baseLangSysTag) const
+  {
+    if (unlikely(baseScriptIndex >= baseScriptCount)) return NOT_INDEXED;
+    return baseScriptRecords[baseScriptIndex].get_lang_tag_index(baseLangSysTag);
+  }
+
+  inline unsigned int get_feature_tag_index (unsigned int baseScriptIndex, unsigned int baseLangSysIndex, Tag featureTableTag) const
+  {
+    if (unlikely(baseScriptIndex >= baseScriptCount)) return NOT_INDEXED;
+    return baseScriptRecords[baseScriptIndex].get_feature_tag_index(baseLangSysIndex, featureTableTag);
+  }
+
+  inline int get_max_value (unsigned int baseScriptIndex, unsigned int baseLangSysIndex, unsigned int featureTableTagIndex) const
+  {
+    return baseScriptRecords[baseScriptIndex].get_max_value(baseLangSysIndex, featureTableTagIndex);
+  }
+
+  inline int get_min_value (unsigned int baseScriptIndex, unsigned int baseLangSysIndex, unsigned int featureTableTagIndex) const
+  {
+    return baseScriptRecords[baseScriptIndex].get_min_value(baseLangSysIndex, featureTableTagIndex);
+  }
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) &&
+      baseScriptRecords.sanitize (c, this));
+  }
+
+  protected:
+  HBUINT16                    baseScriptCount;
+  ArrayOf<BaseScriptRecord> baseScriptRecords;
+
+  public:
+  DEFINE_SIZE_ARRAY (4, baseScriptRecords);
+
+};
+
+struct BaseTagList
+{
+
+  inline unsigned int get_tag_index(Tag baselineTag) const
+  {
+    for (unsigned int i = 0; i < baseTagCount; i++)
+      if (baselineTags[i] == baselineTag)
+        return i;
+    return NOT_INDEXED;
+  }
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this));
+  }
+
+  protected:
+  HBUINT16        baseTagCount;
+  SortedArrayOf<Tag>  baselineTags;
+
+  public:
+  DEFINE_SIZE_ARRAY (4, baselineTags);
+};
+
+struct Axis
+{
+
+  inline unsigned int get_base_tag_index(Tag baselineTag) const
+  {
+    if (unlikely(baseTagList == Null(OffsetTo<BaseTagList>))) return NOT_INDEXED;
+    return (this+baseTagList).get_tag_index(baselineTag);
+  }
+
+  inline unsigned int get_default_base_tag_index_for_script_index (unsigned int baseScriptIndex) const
+  {
+    if (unlikely(baseScriptList == Null(OffsetTo<BaseScriptList>))) return NOT_INDEXED;
+    return (this+baseScriptList).get_default_base_tag_index(baseScriptIndex);
+  }
+
+  inline int get_base_coord(unsigned int baseScriptIndex, unsigned int baselineTagIndex) const
+  {
+    return (this+baseScriptList).get_base_coord(baseScriptIndex, baselineTagIndex);
+  }
+
+  inline unsigned int get_lang_tag_index (unsigned int baseScriptIndex, Tag baseLangSysTag) const
+  {
+    if (unlikely(baseScriptList == Null(OffsetTo<BaseScriptList>))) return NOT_INDEXED;
+    return (this+baseScriptList).get_lang_tag_index(baseScriptIndex, baseLangSysTag);
+  }
+
+  inline unsigned int get_feature_tag_index (unsigned int baseScriptIndex, unsigned int baseLangSysIndex, Tag featureTableTag) const
+  {
+    if (unlikely(baseScriptList == Null(OffsetTo<BaseScriptList>))) return NOT_INDEXED;
+    return (this+baseScriptList).get_feature_tag_index(baseScriptIndex, baseLangSysIndex, featureTableTag);
+  }
+
+  inline int get_max_value (unsigned int baseScriptIndex, unsigned int baseLangSysIndex, unsigned int featureTableTagIndex) const
+  {
+    return (this+baseScriptList).get_max_value(baseScriptIndex, baseLangSysIndex, featureTableTagIndex);
+  }
+
+  inline int get_min_value (unsigned int baseScriptIndex, unsigned int baseLangSysIndex, unsigned int featureTableTagIndex) const
+  {
+    return (this+baseScriptList).get_min_value(baseScriptIndex, baseLangSysIndex, featureTableTagIndex);
+  }
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) &&
+      baseTagList.sanitize (c, this) &&
+      baseScriptList.sanitize (c, this));
+  }
+
+  protected:
+  OffsetTo<BaseTagList>     baseTagList;
+  OffsetTo<BaseScriptList>  baseScriptList;
+
+  public:
+  DEFINE_SIZE_STATIC (4);
+};
+
+struct BASE
+{
+  static const hb_tag_t tableTag = HB_OT_TAG_BASE;
+
+  inline bool has_vert_axis(void)
+  { return vertAxis != Null(OffsetTo<Axis>); }
+
+  inline bool has_horiz_axis(void)
+  { return horizAxis != Null(OffsetTo<Axis>); }
+
+  // horizontal axis base coords:
+
+  inline unsigned int get_horiz_base_tag_index(Tag baselineTag) const
+  {
+    if (unlikely(horizAxis == Null(OffsetTo<Axis>))) return NOT_INDEXED;
+    return (this+horizAxis).get_base_tag_index(baselineTag);
+  }
+
+  inline unsigned int get_horiz_default_base_tag_index_for_script_index (unsigned int baseScriptIndex) const
+  {
+    if (unlikely(horizAxis == Null(OffsetTo<Axis>))) return NOT_INDEXED;
+    return (this+horizAxis).get_default_base_tag_index_for_script_index(baseScriptIndex);
+  }
+
+  inline int get_horiz_base_coord(unsigned int baseScriptIndex, unsigned int baselineTagIndex) const
+  {
+    return (this+horizAxis).get_base_coord(baseScriptIndex, baselineTagIndex);
+  }
+
+  // vertical axis base coords:
+
+  inline unsigned int get_vert_base_tag_index(Tag baselineTag) const
+  {
+    if (unlikely(vertAxis == Null(OffsetTo<Axis>))) return NOT_INDEXED;
+    return (this+vertAxis).get_base_tag_index(baselineTag);
+  }
+
+  inline unsigned int get_vert_default_base_tag_index_for_script_index (unsigned int baseScriptIndex) const
+  {
+    if (unlikely(vertAxis == Null(OffsetTo<Axis>))) return NOT_INDEXED;
+    return (this+vertAxis).get_default_base_tag_index_for_script_index(baseScriptIndex);
+  }
+
+  inline int get_vert_base_coord(unsigned int baseScriptIndex, unsigned int baselineTagIndex) const
+  {
+    return (this+vertAxis).get_base_coord(baseScriptIndex, baselineTagIndex);
+  }
+
+  // horizontal axis min/max coords:
+
+  inline unsigned int get_horiz_lang_tag_index (unsigned int baseScriptIndex, Tag baseLangSysTag) const
+  {
+    if (unlikely(horizAxis == Null(OffsetTo<Axis>))) return NOT_INDEXED;
+    return (this+horizAxis).get_lang_tag_index (baseScriptIndex, baseLangSysTag);
+  }
+
+  inline unsigned int get_horiz_feature_tag_index (unsigned int baseScriptIndex, unsigned int baseLangSysIndex, Tag featureTableTag) const
+  {
+    if (unlikely(horizAxis == Null(OffsetTo<Axis>))) return NOT_INDEXED;
+    return (this+horizAxis).get_feature_tag_index (baseScriptIndex, baseLangSysIndex, featureTableTag);
+  }
+
+  inline int get_horiz_max_value (unsigned int baseScriptIndex, unsigned int baseLangSysIndex, unsigned int featureTableTagIndex) const
+  {
+    return (this+horizAxis).get_max_value (baseScriptIndex, baseLangSysIndex, featureTableTagIndex);
+  }
+
+  inline int get_horiz_min_value (unsigned int baseScriptIndex, unsigned int baseLangSysIndex, unsigned int featureTableTagIndex) const
+  {
+    return (this+horizAxis).get_min_value (baseScriptIndex, baseLangSysIndex, featureTableTagIndex);
+  }
+
+    // vertical axis min/max coords:
+
+  inline unsigned int get_vert_lang_tag_index (unsigned int baseScriptIndex, Tag baseLangSysTag) const
+  {
+    if (unlikely(vertAxis == Null(OffsetTo<Axis>))) return NOT_INDEXED;
+    return (this+vertAxis).get_lang_tag_index (baseScriptIndex, baseLangSysTag);
+  }
+
+  inline unsigned int get_vert_feature_tag_index (unsigned int baseScriptIndex, unsigned int baseLangSysIndex, Tag featureTableTag) const
+  {
+    if (unlikely(vertAxis == Null(OffsetTo<Axis>))) return NOT_INDEXED;
+    return (this+vertAxis).get_feature_tag_index (baseScriptIndex, baseLangSysIndex, featureTableTag);
+  }
+
+  inline int get_vert_max_value (unsigned int baseScriptIndex, unsigned int baseLangSysIndex, unsigned int featureTableTagIndex) const
+  {
+    return (this+vertAxis).get_max_value (baseScriptIndex, baseLangSysIndex, featureTableTagIndex);
+  }
+
+  inline int get_vert_min_value (unsigned int baseScriptIndex, unsigned int baseLangSysIndex, unsigned int featureTableTagIndex) const
+  {
+    return (this+vertAxis).get_min_value (baseScriptIndex, baseLangSysIndex, featureTableTagIndex);
+  }
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) &&
+		  likely (version.major == 1) &&
+		  horizAxis.sanitize (c, this) &&
+		  vertAxis.sanitize (c, this) &&
+		  (version.to_int () < 0x00010001u || varStore.sanitize (c, this)));
+  }
+
+  protected:
+  FixedVersion<>  version;
+  OffsetTo<Axis>  horizAxis;
+  OffsetTo<Axis>  vertAxis;
+  LOffsetTo<VariationStore>
+		varStore;		/* Offset to the table of Item Variation
+					 * Store--from beginning of BASE
+					 * header (may be NULL).  Introduced
+					 * in version 0x00010001. */
+  public:
+  DEFINE_SIZE_MIN (8);
+};
+
+
+} /* namespace OT */
+
+
+#endif /* HB_OT_LAYOUT_BASE_TABLE_HH */

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-common-private.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-common-private.hh	2018-03-07 21:52:46 UTC (rev 46876)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-common-private.hh	2018-03-07 22:32:14 UTC (rev 46877)
@@ -299,7 +299,7 @@
      * better.
      *
      * Assume that the offset to the size feature is according to specification,
-     * and make the following value checks. If it fails, assume the the size
+     * and make the following value checks. If it fails, assume the size
      * feature is calculated as versions of MakeOTF before the AFDKO 2.0 built it.
      * If this fails, reject the 'size' feature. The older makeOTF's calculated the
      * offset from the beginning of the FeatureList table, rather than from the
@@ -700,7 +700,7 @@
     if (unlikely (!c->extend (glyphArray))) return_trace (false);
     for (unsigned int i = 0; i < num_glyphs; i++)
       glyphArray[i] = glyphs[i];
-    glyphs.advance (num_glyphs);
+    glyphs += num_glyphs;
     return_trace (true);
   }
 
@@ -789,7 +789,7 @@
       } else {
         rangeRecord[range].end = glyphs[i];
       }
-    glyphs.advance (num_glyphs);
+    glyphs += num_glyphs;
     return_trace (true);
   }
 
@@ -1057,7 +1057,7 @@
     if (klass == 0)
     {
       /* Match if there's any glyph that is not listed! */
-      hb_codepoint_t g = -1;
+      hb_codepoint_t g = HB_SET_VALUE_INVALID;
       if (!hb_set_next (glyphs, &g))
         return false;
       if (g < startGlyph)
@@ -1128,7 +1128,7 @@
     if (klass == 0)
     {
       /* Match if there's any glyph that is not listed! */
-      hb_codepoint_t g = (hb_codepoint_t) -1;
+      hb_codepoint_t g = HB_SET_VALUE_INVALID;
       for (unsigned int i = 0; i < count; i++)
       {
 	if (!hb_set_next (glyphs, &g))
@@ -1137,7 +1137,7 @@
 	  return true;
 	g = rangeRecord[i].end;
       }
-      if (g != (hb_codepoint_t) -1 && hb_set_next (glyphs, &g))
+      if (g != HB_SET_VALUE_INVALID && hb_set_next (glyphs, &g))
         return true;
       /* Fall through. */
     }

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-gdef-table.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-gdef-table.hh	2018-03-07 21:52:46 UTC (rev 46876)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-gdef-table.hh	2018-03-07 22:32:14 UTC (rev 46877)
@@ -110,7 +110,7 @@
 
   protected:
   HBUINT16	caretValueFormat;	/* Format identifier--format = 1 */
-  HBINT16		coordinate;		/* X or Y value, in design units */
+  FWORD		coordinate;		/* X or Y value, in design units */
   public:
   DEFINE_SIZE_STATIC (4);
 };
@@ -161,7 +161,7 @@
 
   protected:
   HBUINT16	caretValueFormat;	/* Format identifier--format = 3 */
-  HBINT16		coordinate;		/* X or Y value, in design units */
+  FWORD		coordinate;		/* X or Y value, in design units */
   OffsetTo<Device>
 		deviceTable;		/* Offset to Device table for X or Y
 					 * value--from beginning of CaretValue

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-03-07 21:52:46 UTC (rev 46876)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-gpos-table.hh	2018-03-07 22:32:14 UTC (rev 46877)
@@ -99,7 +99,7 @@
 #endif
 
   inline unsigned int get_len (void) const
-  { return _hb_popcount32 ((unsigned int) *this); }
+  { return _hb_popcount ((unsigned int) *this); }
   inline unsigned int get_size (void) const
   { return get_len () * Value::static_size; }
 
@@ -248,8 +248,8 @@
 
   protected:
   HBUINT16	format;			/* Format identifier--format = 1 */
-  HBINT16		xCoordinate;		/* Horizontal value--in design units */
-  HBINT16		yCoordinate;		/* Vertical value--in design units */
+  FWORD		xCoordinate;		/* Horizontal value--in design units */
+  FWORD		yCoordinate;		/* Vertical value--in design units */
   public:
   DEFINE_SIZE_STATIC (6);
 };
@@ -279,8 +279,8 @@
 
   protected:
   HBUINT16	format;			/* Format identifier--format = 2 */
-  HBINT16		xCoordinate;		/* Horizontal value--in design units */
-  HBINT16		yCoordinate;		/* Vertical value--in design units */
+  FWORD		xCoordinate;		/* Horizontal value--in design units */
+  FWORD		yCoordinate;		/* Vertical value--in design units */
   HBUINT16	anchorPoint;		/* Index to glyph contour point */
   public:
   DEFINE_SIZE_STATIC (8);
@@ -309,8 +309,8 @@
 
   protected:
   HBUINT16	format;			/* Format identifier--format = 3 */
-  HBINT16		xCoordinate;		/* Horizontal value--in design units */
-  HBINT16		yCoordinate;		/* Vertical value--in design units */
+  FWORD		xCoordinate;		/* Horizontal value--in design units */
+  FWORD		yCoordinate;		/* Vertical value--in design units */
   OffsetTo<Device>
 		xDeviceTable;		/* Offset to Device table for X
 					 * coordinate-- from beginning of
@@ -1072,9 +1072,17 @@
     skippy_iter.set_lookup_props (LookupFlag::IgnoreMarks);
     do {
       if (!skippy_iter.prev ()) return_trace (false);
-      /* We only want to attach to the first of a MultipleSubst sequence.  Reject others. */
+      /* We only want to attach to the first of a MultipleSubst sequence.
+       * https://github.com/harfbuzz/harfbuzz/issues/740
+       * Reject others. */
       if (!_hb_glyph_info_multiplied (&buffer->info[skippy_iter.idx]) ||
-	  0 == _hb_glyph_info_get_lig_comp (&buffer->info[skippy_iter.idx]))
+	  0 == _hb_glyph_info_get_lig_comp (&buffer->info[skippy_iter.idx]) ||
+	  (skippy_iter.idx == 0 ||
+	   _hb_glyph_info_get_lig_id (&buffer->info[skippy_iter.idx]) !=
+	   _hb_glyph_info_get_lig_id (&buffer->info[skippy_iter.idx - 1]) ||
+	   _hb_glyph_info_get_lig_comp (&buffer->info[skippy_iter.idx]) !=
+	   _hb_glyph_info_get_lig_comp (&buffer->info[skippy_iter.idx - 1]) + 1
+	   ))
 	break;
       skippy_iter.reject ();
     } while (1);

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-03-07 21:52:46 UTC (rev 46876)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-gsub-table.hh	2018-03-07 22:32:14 UTC (rev 46877)
@@ -114,7 +114,7 @@
   OffsetTo<Coverage>
 		coverage;		/* Offset to Coverage table--from
 					 * beginning of Substitution table */
-  HBINT16		deltaGlyphID;		/* Add to original GlyphID to get
+  HBINT16	deltaGlyphID;		/* Add to original GlyphID to get
 					 * substitute GlyphID */
   public:
   DEFINE_SIZE_STATIC (6);
@@ -386,7 +386,7 @@
       if (unlikely (!sequence[i].serialize (c, this).serialize (c,
 								substitute_glyphs_list,
 								substitute_len_list[i]))) return_trace (false);
-    substitute_len_list.advance (num_glyphs);
+    substitute_len_list += num_glyphs;
     if (unlikely (!coverage.serialize (c, this).serialize (c, glyphs, num_glyphs))) return_trace (false);
     return_trace (true);
   }
@@ -536,7 +536,7 @@
       if (unlikely (!alternateSet[i].serialize (c, this).serialize (c,
 								    alternate_glyphs_list,
 								    alternate_len_list[i]))) return_trace (false);
-    alternate_len_list.advance (num_glyphs);
+    alternate_len_list += num_glyphs;
     if (unlikely (!coverage.serialize (c, this).serialize (c, glyphs, num_glyphs))) return_trace (false);
     return_trace (true);
   }
@@ -757,8 +757,8 @@
 								ligatures[i],
 								component_list,
 								component_count_list[i]))) return_trace (false);
-    ligatures.advance (num_ligatures);
-    component_count_list.advance (num_ligatures);
+    ligatures += num_ligatures;
+    component_count_list += num_ligatures;
     return_trace (true);
   }
 
@@ -850,7 +850,7 @@
 								   component_count_list,
 								   ligature_per_first_glyph_count_list[i],
 								   component_list))) return_trace (false);
-    ligature_per_first_glyph_count_list.advance (num_first_glyphs);
+    ligature_per_first_glyph_count_list += num_first_glyphs;
     if (unlikely (!coverage.serialize (c, this).serialize (c, first_glyphs, num_first_glyphs))) return_trace (false);
     return_trace (true);
   }

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-gsubgpos-private.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-gsubgpos-private.hh	2018-03-07 21:52:46 UTC (rev 46876)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-gsubgpos-private.hh	2018-03-07 22:32:14 UTC (rev 46877)
@@ -1212,7 +1212,7 @@
 		  lookupCount.sanitize (c) &&
 		  c->check_range (inputZ,
 				  inputZ[0].static_size * inputCount +
-				  lookupRecordX[0].static_size * lookupCount));
+				  LookupRecord::static_size * lookupCount));
   }
 
   protected:
@@ -1222,10 +1222,10 @@
   HBUINT16	lookupCount;		/* Number of LookupRecords */
   HBUINT16	inputZ[VAR];		/* Array of match inputs--start with
 					 * second glyph */
-  LookupRecord	lookupRecordX[VAR];	/* Array of LookupRecords--in
+/*LookupRecord	lookupRecordX[VAR];*/	/* Array of LookupRecords--in
 					 * design order */
   public:
-  DEFINE_SIZE_ARRAY2 (4, inputZ, lookupRecordX);
+  DEFINE_SIZE_ARRAY (4, inputZ);
 };
 
 struct RuleSet
@@ -1556,10 +1556,10 @@
   OffsetTo<Coverage>
 		coverageZ[VAR];		/* Array of offsets to Coverage
 					 * table in glyph sequence order */
-  LookupRecord	lookupRecordX[VAR];	/* Array of LookupRecords--in
+/*LookupRecord	lookupRecordX[VAR];*/	/* Array of LookupRecords--in
 					 * design order */
   public:
-  DEFINE_SIZE_ARRAY2 (6, coverageZ, lookupRecordX);
+  DEFINE_SIZE_ARRAY (6, coverageZ);
 };
 
 struct Context

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-private.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-private.hh	2018-03-07 21:52:46 UTC (rev 46876)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-private.hh	2018-03-07 22:32:14 UTC (rev 46877)
@@ -122,6 +122,9 @@
  */
 
 namespace OT {
+  struct BASE;
+  struct COLR;
+  struct CPAL;
   struct GDEF;
   struct GSUB;
   struct GPOS;
@@ -131,7 +134,10 @@
 }
 
 namespace AAT {
+  struct ankr;
+  struct kerx;
   struct morx;
+  struct trak;
 }
 
 struct hb_ot_layout_lookup_accelerator_t
@@ -166,10 +172,16 @@
   const struct OT::GPOS *gpos;
 
   /* TODO Move the following out of this struct. */
+  OT::hb_lazy_table_loader_t<struct OT::BASE> base;
+  OT::hb_lazy_table_loader_t<struct OT::COLR> colr;
+  OT::hb_lazy_table_loader_t<struct OT::CPAL> cpal;
   OT::hb_lazy_table_loader_t<struct OT::MATH> math;
   OT::hb_lazy_table_loader_t<struct OT::fvar> fvar;
   OT::hb_lazy_table_loader_t<struct OT::avar> avar;
+  OT::hb_lazy_table_loader_t<struct AAT::ankr> ankr;
+  OT::hb_lazy_table_loader_t<struct AAT::kerx> kerx;
   OT::hb_lazy_table_loader_t<struct AAT::morx> morx;
+  OT::hb_lazy_table_loader_t<struct AAT::trak> trak;
 
   unsigned int gsub_lookup_count;
   unsigned int gpos_lookup_count;
@@ -359,6 +371,28 @@
   return _hb_glyph_info_is_unicode_mark (info) ? info->unicode_props()>>8 : 0;
 }
 
+
+/* Loop over grapheme. Based on foreach_cluster(). */
+#define foreach_grapheme(buffer, start, end) \
+  for (unsigned int \
+       _count = buffer->len, \
+       start = 0, end = _count ? _next_grapheme (buffer, 0) : 0; \
+       start < _count; \
+       start = end, end = _next_grapheme (buffer, start))
+
+static inline unsigned int
+_next_grapheme (hb_buffer_t *buffer, unsigned int start)
+{
+  hb_glyph_info_t *info = buffer->info;
+  unsigned int count = buffer->len;
+
+  while (++start < count && _hb_glyph_info_is_unicode_mark (&info[start]))
+    ;
+
+  return start;
+}
+
+
 #define info_cc(info) (_hb_glyph_info_get_modified_combining_class (&(info)))
 
 static inline bool

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-03-07 21:52:46 UTC (rev 46876)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout.cc	2018-03-07 22:32:14 UTC (rev 46877)
@@ -31,16 +31,21 @@
 #include "hb-open-type-private.hh"
 #include "hb-ot-layout-private.hh"
 
+#include "hb-ot-layout-base-table.hh"
 #include "hb-ot-layout-gdef-table.hh"
 #include "hb-ot-layout-gsub-table.hh"
 #include "hb-ot-layout-gpos-table.hh"
 #include "hb-ot-layout-jstf-table.hh" // Just so we compile it; unused otherwise.
 #include "hb-ot-name-table.hh" // Just so we compile it; unused otherwise.
+#include "hb-ot-color-colr-table.hh"
+#include "hb-ot-color-cpal-table.hh"
 
 #include "hb-ot-map-private.hh"
 
 
+#ifndef HB_NO_VISIBILITY
 const void * const OT::_hb_NullPool[HB_NULL_POOL_SIZE / sizeof (void *)] = {};
+#endif
 
 
 hb_ot_layout_t *
@@ -59,10 +64,16 @@
   layout->gpos_blob = OT::Sanitizer<OT::GPOS>().sanitize (face->reference_table (HB_OT_TAG_GPOS));
   layout->gpos = OT::Sanitizer<OT::GPOS>::lock_instance (layout->gpos_blob);
 
+  layout->base.init (face);
+  layout->colr.init (face);
+  layout->cpal.init (face);
   layout->math.init (face);
   layout->fvar.init (face);
   layout->avar.init (face);
+  layout->ankr.init (face);
+  layout->kerx.init (face);
   layout->morx.init (face);
+  layout->trak.init (face);
 
   {
     /*
@@ -195,10 +206,12 @@
 void
 _hb_ot_layout_destroy (hb_ot_layout_t *layout)
 {
-  for (unsigned int i = 0; i < layout->gsub_lookup_count; i++)
-    layout->gsub_accels[i].fini ();
-  for (unsigned int i = 0; i < layout->gpos_lookup_count; i++)
-    layout->gpos_accels[i].fini ();
+  if (layout->gsub_accels)
+    for (unsigned int i = 0; i < layout->gsub_lookup_count; i++)
+      layout->gsub_accels[i].fini ();
+  if (layout->gpos_accels)
+    for (unsigned int i = 0; i < layout->gpos_lookup_count; i++)
+      layout->gpos_accels[i].fini ();
 
   free (layout->gsub_accels);
   free (layout->gpos_accels);
@@ -207,14 +220,28 @@
   hb_blob_destroy (layout->gsub_blob);
   hb_blob_destroy (layout->gpos_blob);
 
+  layout->base.fini ();
+  layout->colr.fini ();
+  layout->cpal.fini ();
   layout->math.fini ();
   layout->fvar.fini ();
   layout->avar.fini ();
+  layout->ankr.fini ();
+  layout->kerx.fini ();
   layout->morx.fini ();
+  layout->trak.fini ();
 
   free (layout);
 }
 
+// static inline const OT::BASE&
+// _get_base (hb_face_t *face)
+// {
+//   if (unlikely (!hb_ot_shaper_face_data_ensure (face))) return OT::Null(OT::BASE);
+//   hb_ot_layout_t * layout = hb_ot_layout_from_face (face);
+//   return *(layout->base.get ());
+// }
+
 static inline const OT::GDEF&
 _get_gdef (hb_face_t *face)
 {
@@ -1253,7 +1280,7 @@
   apply (proxy, plan, font, buffer);
 }
 
-HB_INTERNAL void
+void
 hb_ot_layout_substitute_lookup (OT::hb_ot_apply_context_t *c,
 				const OT::SubstLookup &lookup,
 				const hb_ot_layout_lookup_accelerator_t &accel)
@@ -1260,3 +1287,27 @@
 {
   apply_string<GSUBProxy> (c, lookup, accel);
 }
+
+
+
+
+/*
+ * OT::BASE
+ */
+
+// /**
+//  * hb_ot_base_has_data:
+//  * @face: #hb_face_t to test
+//  *
+//  * This function allows to verify the presence of an OpenType BASE table on the
+//  * face.
+//  *
+//  * Return value: true if face has a BASE table, false otherwise
+//  *
+//  * Since: XXX
+//  **/
+// hb_bool_t
+// hb_ot_base_has_data (hb_face_t *face)
+// {
+//   return &_get_base (face) != &OT::Null(OT::BASE);
+// }

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-03-07 21:52:46 UTC (rev 46876)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout.h	2018-03-07 22:32:14 UTC (rev 46877)
@@ -38,6 +38,7 @@
 HB_BEGIN_DECLS
 
 
+#define HB_OT_TAG_BASE HB_TAG('B','A','S','E')
 #define HB_OT_TAG_GDEF HB_TAG('G','D','E','F')
 #define HB_OT_TAG_GSUB HB_TAG('G','S','U','B')
 #define HB_OT_TAG_GPOS HB_TAG('G','P','O','S')
@@ -316,6 +317,22 @@
 			      unsigned int *range_end          /* OUT.  May be NULL */);
 
 
+/*
+ * BASE
+ */
+#if 0
+
+#define HB_OT_TAG_BASE_HANG HB_TAG('h','a','n','g')
+#define HB_OT_TAG_BASE_ICFB HB_TAG('i','c','f','b')
+#define HB_OT_TAG_BASE_ICFT HB_TAG('i','c','f','t')
+#define HB_OT_TAG_BASE_IDEO HB_TAG('i','d','e','o')
+#define HB_OT_TAG_BASE_IDTB HB_TAG('i','d','t','b')
+#define HB_OT_TAG_BASE_MATH HB_TAG('m','a','t','h')
+#define HB_OT_TAG_BASE_ROMN HB_TAG('r','o','m','n')
+
+#endif
+
+
 HB_END_DECLS
 
 #endif /* HB_OT_LAYOUT_H */

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-map-private.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-map-private.hh	2018-03-07 21:52:46 UTC (rev 46876)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-map-private.hh	2018-03-07 22:32:14 UTC (rev 46877)
@@ -84,28 +84,28 @@
   inline hb_mask_t get_global_mask (void) const { return global_mask; }
 
   inline hb_mask_t get_mask (hb_tag_t feature_tag, unsigned int *shift = nullptr) const {
-    const feature_map_t *map = features.bsearch (&feature_tag);
+    const feature_map_t *map = features.bsearch (feature_tag);
     if (shift) *shift = map ? map->shift : 0;
     return map ? map->mask : 0;
   }
 
   inline bool needs_fallback (hb_tag_t feature_tag) const {
-    const feature_map_t *map = features.bsearch (&feature_tag);
+    const feature_map_t *map = features.bsearch (feature_tag);
     return map ? map->needs_fallback : false;
   }
 
   inline hb_mask_t get_1_mask (hb_tag_t feature_tag) const {
-    const feature_map_t *map = features.bsearch (&feature_tag);
+    const feature_map_t *map = features.bsearch (feature_tag);
     return map ? map->_1_mask : 0;
   }
 
   inline unsigned int get_feature_index (unsigned int table_index, hb_tag_t feature_tag) const {
-    const feature_map_t *map = features.bsearch (&feature_tag);
+    const feature_map_t *map = features.bsearch (feature_tag);
     return map ? map->index[table_index] : HB_OT_LAYOUT_NO_FEATURE_INDEX;
   }
 
   inline unsigned int get_feature_stage (unsigned int table_index, hb_tag_t feature_tag) const {
-    const feature_map_t *map = features.bsearch (&feature_tag);
+    const feature_map_t *map = features.bsearch (feature_tag);
     return map ? map->stage[table_index] : (unsigned int) -1;
   }
 

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-03-07 21:52:46 UTC (rev 46876)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-map.cc	2018-03-07 22:32:14 UTC (rev 46877)
@@ -139,7 +139,7 @@
 {
   static_assert ((!(HB_GLYPH_FLAG_DEFINED & (HB_GLYPH_FLAG_DEFINED + 1))), "");
   unsigned int global_bit_mask = HB_GLYPH_FLAG_DEFINED + 1;
-  unsigned int global_bit_shift = _hb_popcount32 (HB_GLYPH_FLAG_DEFINED);
+  unsigned int global_bit_shift = _hb_popcount (HB_GLYPH_FLAG_DEFINED);
 
   m.global_mask = global_bit_mask;
 

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-03-07 21:52:46 UTC (rev 46876)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-maxp-table.hh	2018-03-07 22:32:14 UTC (rev 46877)
@@ -28,8 +28,8 @@
 #define HB_OT_MAXP_TABLE_HH
 
 #include "hb-open-type-private.hh"
+#include "hb-subset-plan.hh"
 
-
 namespace OT {
 
 
@@ -39,9 +39,39 @@
 
 #define HB_OT_TAG_maxp HB_TAG('m','a','x','p')
 
+struct maxpV1Tail
+{
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this));
+  }
+
+  HBUINT16 maxPoints;		  /* Maximum points in a non-composite glyph. */
+  HBUINT16 maxContours;		  /* Maximum contours in a non-composite glyph. */
+  HBUINT16 maxCompositePoints;	  /* Maximum points in a composite glyph. */
+  HBUINT16 maxCompositeContours;  /* Maximum contours in a composite glyph. */
+  HBUINT16 maxZones;		  /* 1 if instructions do not use the twilight zone (Z0),
+				   * or 2 if instructions do use Z0; should be set to 2 in
+				   * most cases. */
+  HBUINT16 maxTwilightPoints;	  /* Maximum points used in Z0. */
+  HBUINT16 maxStorage;		  /* Number of Storage Area locations. */
+  HBUINT16 maxFunctionDefs;	  /* Number of FDEFs, equal to the highest function number + 1. */
+  HBUINT16 maxInstructionDefs;	  /* Number of IDEFs. */
+  HBUINT16 maxStackElements;	  /* Maximum stack depth. (This includes Font and CVT
+				   * Programs, as well as the instructions for each glyph.) */
+  HBUINT16 maxSizeOfInstructions; /* Maximum byte count for glyph instructions. */
+  HBUINT16 maxComponentElements;  /* Maximum number of components referenced at
+				   * "top level" for any composite glyph. */
+  HBUINT16 maxComponentDepth;	  /* Maximum levels of recursion; 1 for simple components. */
+ public:
+  DEFINE_SIZE_STATIC (26);
+};
+
+
 struct maxp
 {
-  static const hb_tag_t tableTag	= HB_OT_TAG_maxp;
+  static const hb_tag_t tableTag = HB_OT_TAG_maxp;
 
   inline unsigned int get_num_glyphs (void) const
   {
@@ -48,19 +78,65 @@
     return numGlyphs;
   }
 
+  inline void set_num_glyphs (unsigned int count)
+  {
+    numGlyphs.set (count);
+  }
+
   inline bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
-    return_trace (c->check_struct (this) &&
-		  likely (version.major == 1 ||
-			  (version.major == 0 && version.minor == 0x5000u)));
+    if (unlikely (!c->check_struct (this)))
+      return_trace (false);
+
+    if (version.major == 1)
+    {
+      const maxpV1Tail &v1 = StructAfter<maxpV1Tail> (*this);
+      return v1.sanitize (c);
+    }
+    return_trace (likely (version.major == 0 && version.minor == 0x5000u));
   }
 
-  /* We only implement version 0.5 as none of the extra fields in version 1.0 are useful. */
+  inline bool subset (hb_subset_plan_t *plan) const
+  {
+    hb_blob_t *maxp_blob = OT::Sanitizer<OT::maxp>().sanitize (hb_face_reference_table (plan->source, HB_OT_TAG_maxp));
+    hb_blob_t *maxp_prime_blob = hb_blob_copy_writable_or_fail (maxp_blob);
+    hb_blob_destroy (maxp_blob);
+
+    if (unlikely (!maxp_prime_blob)) {
+      return false;
+    }
+    OT::maxp *maxp_prime = (OT::maxp *) hb_blob_get_data (maxp_prime_blob, nullptr);
+
+    maxp_prime->set_num_glyphs (plan->gids_to_retain_sorted.len);
+    if (plan->drop_hints)
+      drop_hint_fields (plan, maxp_prime);
+
+    bool result = hb_subset_plan_add_table(plan, HB_OT_TAG_maxp, maxp_prime_blob);
+    hb_blob_destroy (maxp_prime_blob);
+    return result;
+  }
+
+  static inline void drop_hint_fields (hb_subset_plan_t *plan, OT::maxp *maxp_prime)
+  {
+    if (maxp_prime->version.major == 1)
+    {
+      maxpV1Tail &v1 = StructAfter<maxpV1Tail> (*maxp_prime);
+      v1.maxZones.set (1);
+      v1.maxTwilightPoints.set (0);
+      v1.maxStorage.set (0);
+      v1.maxFunctionDefs.set (0);
+      v1.maxInstructionDefs.set (0);
+      v1.maxStackElements.set (0);
+      v1.maxSizeOfInstructions.set (0);
+    }
+  }
+
   protected:
   FixedVersion<>version;		/* Version of the maxp table (0.5 or 1.0),
 					 * 0x00005000u or 0x00010000u. */
   HBUINT16	numGlyphs;		/* The number of glyphs in the font. */
+/*maxpV1Tail v1Tail[VAR]; */
   public:
   DEFINE_SIZE_STATIC (6);
 };

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-os2-table.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-os2-table.hh	2018-03-07 21:52:46 UTC (rev 46876)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-os2-table.hh	2018-03-07 22:32:14 UTC (rev 46877)
@@ -28,8 +28,8 @@
 #define HB_OT_OS2_TABLE_HH
 
 #include "hb-open-type-private.hh"
+#include "hb-ot-os2-unicode-ranges.hh"
 
-
 namespace OT {
 
 /*
@@ -49,51 +49,127 @@
     return_trace (c->check_struct (this));
   }
 
+  inline bool subset (hb_subset_plan_t *plan) const
+  {
+    hb_blob_t *os2_blob = OT::Sanitizer<OT::os2>().sanitize (hb_face_reference_table (plan->source, HB_OT_TAG_os2));
+    hb_blob_t *os2_prime_blob = hb_blob_create_sub_blob (os2_blob, 0, -1);
+    // TODO(grieger): move to hb_blob_copy_writable_or_fail
+    hb_blob_destroy (os2_blob);
+
+    OT::os2 *os2_prime = (OT::os2 *) hb_blob_get_data_writable (os2_prime_blob, nullptr);
+    if (unlikely (!os2_prime)) {
+      hb_blob_destroy (os2_prime_blob);
+      return false;
+    }
+
+    uint16_t min_cp, max_cp;
+    find_min_and_max_codepoint (plan->codepoints, &min_cp, &max_cp);
+    os2_prime->usFirstCharIndex.set (min_cp);
+    os2_prime->usLastCharIndex.set (max_cp);
+
+    _update_unicode_ranges (plan->codepoints, os2_prime->ulUnicodeRange);
+    bool result = hb_subset_plan_add_table(plan, HB_OT_TAG_os2, os2_prime_blob);
+
+    hb_blob_destroy (os2_prime_blob);
+    return result;
+  }
+
+  inline void _update_unicode_ranges (const hb_prealloced_array_t<hb_codepoint_t> &codepoints,
+                                      HBUINT32 ulUnicodeRange[4]) const
+  {
+    for (unsigned int i = 0; i < 4; i++)
+      ulUnicodeRange[i].set (0);
+
+    for (unsigned int i = 0; i < codepoints.len; i++)
+    {
+      hb_codepoint_t cp = codepoints[i];
+      unsigned int bit = hb_get_unicode_range_bit (cp);
+      if (bit < 128)
+      {
+        unsigned int block = bit / 32;
+        unsigned int bit_in_block = bit % 32;
+        unsigned int mask = 1 << bit_in_block;
+        ulUnicodeRange[block].set (ulUnicodeRange[block] | mask);
+      }
+      if (cp >= 0x10000 && cp <= 0x110000)
+      {
+        /* the spec says that bit 57 ("Non Plane 0") implies that there's
+           at least one codepoint beyond the BMP; so I also include all
+           the non-BMP codepoints here */
+        ulUnicodeRange[1].set (ulUnicodeRange[1] | (1 << 25));
+      }
+    }
+  }
+
+  static inline void find_min_and_max_codepoint (const hb_prealloced_array_t<hb_codepoint_t> &codepoints,
+                                                 uint16_t *min_cp, /* OUT */
+                                                 uint16_t *max_cp  /* OUT */)
+  {
+    hb_codepoint_t min = -1, max = 0;
+
+    for (unsigned int i = 0; i < codepoints.len; i++)
+    {
+      hb_codepoint_t cp = codepoints[i];
+      if (cp < min)
+        min = cp;
+      if (cp > max)
+        max = cp;
+    }
+
+    if (min > 0xFFFF)
+      min = 0xFFFF;
+    if (max > 0xFFFF)
+      max = 0xFFFF;
+
+    *min_cp = min;
+    *max_cp = max;
+  }
+
   public:
   HBUINT16	version;
 
   /* Version 0 */
-  HBINT16		xAvgCharWidth;
+  HBINT16	xAvgCharWidth;
   HBUINT16	usWeightClass;
   HBUINT16	usWidthClass;
   HBUINT16	fsType;
-  HBINT16		ySubscriptXSize;
-  HBINT16		ySubscriptYSize;
-  HBINT16		ySubscriptXOffset;
-  HBINT16		ySubscriptYOffset;
-  HBINT16		ySuperscriptXSize;
-  HBINT16		ySuperscriptYSize;
-  HBINT16		ySuperscriptXOffset;
-  HBINT16		ySuperscriptYOffset;
-  HBINT16		yStrikeoutSize;
-  HBINT16		yStrikeoutPosition;
-  HBINT16		sFamilyClass;
-  HBUINT8		panose[10];
-  HBUINT32		ulUnicodeRange[4];
+  HBINT16	ySubscriptXSize;
+  HBINT16	ySubscriptYSize;
+  HBINT16	ySubscriptXOffset;
+  HBINT16	ySubscriptYOffset;
+  HBINT16	ySuperscriptXSize;
+  HBINT16	ySuperscriptYSize;
+  HBINT16	ySuperscriptXOffset;
+  HBINT16	ySuperscriptYOffset;
+  HBINT16	yStrikeoutSize;
+  HBINT16	yStrikeoutPosition;
+  HBINT16	sFamilyClass;
+  HBUINT8	panose[10];
+  HBUINT32	ulUnicodeRange[4];
   Tag		achVendID;
   HBUINT16	fsSelection;
   HBUINT16	usFirstCharIndex;
   HBUINT16	usLastCharIndex;
-  HBINT16		sTypoAscender;
-  HBINT16		sTypoDescender;
-  HBINT16		sTypoLineGap;
+  HBINT16	sTypoAscender;
+  HBINT16	sTypoDescender;
+  HBINT16	sTypoLineGap;
   HBUINT16	usWinAscent;
   HBUINT16	usWinDescent;
 
   /* Version 1 */
-  //HBUINT32 ulCodePageRange1;
-  //HBUINT32 ulCodePageRange2;
+  //HBUINT32	ulCodePageRange1;
+  //HBUINT32	ulCodePageRange2;
 
   /* Version 2 */
-  //HBINT16 sxHeight;
-  //HBINT16 sCapHeight;
-  //HBUINT16  usDefaultChar;
-  //HBUINT16  usBreakChar;
-  //HBUINT16  usMaxContext;
+  //HBINT16	sxHeight;
+  //HBINT16	sCapHeight;
+  //HBUINT16	usDefaultChar;
+  //HBUINT16	usBreakChar;
+  //HBUINT16	usMaxContext;
 
   /* Version 5 */
-  //HBUINT16  usLowerOpticalPointSize;
-  //HBUINT16  usUpperOpticalPointSize;
+  //HBUINT16	usLowerOpticalPointSize;
+  //HBUINT16	usUpperOpticalPointSize;
 
   public:
   DEFINE_SIZE_STATIC (78);

Added: 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	                        (rev 0)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-os2-unicode-ranges.hh	2018-03-07 22:32:14 UTC (rev 46877)
@@ -0,0 +1,247 @@
+/*
+ * 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): Garret Rieger
+ */
+
+#ifndef HB_OT_OS2_UNICODE_RANGES_HH
+#define HB_OT_OS2_UNICODE_RANGES_HH
+
+#include "hb-private.hh"
+#include "hb-dsalgs.hh"
+
+namespace OT {
+
+struct Range {
+  hb_codepoint_t start;
+  hb_codepoint_t end;
+  unsigned int bit;
+};
+
+/* Note: The contents of this array was generated using src/gen-unicode-ranges.py. */
+static Range os2UnicodeRangesSorted[] =
+{
+  {     0x0,     0x7F,   0}, // Basic Latin
+  {    0x80,     0xFF,   1}, // Latin-1 Supplement
+  {   0x100,    0x17F,   2}, // Latin Extended-A
+  {   0x180,    0x24F,   3}, // Latin Extended-B
+  {   0x250,    0x2AF,   4}, // IPA Extensions
+  {   0x2B0,    0x2FF,   5}, // Spacing Modifier Letters
+  {   0x300,    0x36F,   6}, // Combining Diacritical Marks
+  {   0x370,    0x3FF,   7}, // Greek and Coptic
+  {   0x400,    0x4FF,   9}, // Cyrillic
+  {   0x500,    0x52F,   9}, // Cyrillic Supplement
+  {   0x530,    0x58F,  10}, // Armenian
+  {   0x590,    0x5FF,  11}, // Hebrew
+  {   0x600,    0x6FF,  13}, // Arabic
+  {   0x700,    0x74F,  71}, // Syriac
+  {   0x750,    0x77F,  13}, // Arabic Supplement
+  {   0x780,    0x7BF,  72}, // Thaana
+  {   0x7C0,    0x7FF,  14}, // NKo
+  {   0x900,    0x97F,  15}, // Devanagari
+  {   0x980,    0x9FF,  16}, // Bengali
+  {   0xA00,    0xA7F,  17}, // Gurmukhi
+  {   0xA80,    0xAFF,  18}, // Gujarati
+  {   0xB00,    0xB7F,  19}, // Oriya
+  {   0xB80,    0xBFF,  20}, // Tamil
+  {   0xC00,    0xC7F,  21}, // Telugu
+  {   0xC80,    0xCFF,  22}, // Kannada
+  {   0xD00,    0xD7F,  23}, // Malayalam
+  {   0xD80,    0xDFF,  73}, // Sinhala
+  {   0xE00,    0xE7F,  24}, // Thai
+  {   0xE80,    0xEFF,  25}, // Lao
+  {   0xF00,    0xFFF,  70}, // Tibetan
+  {  0x1000,   0x109F,  74}, // Myanmar
+  {  0x10A0,   0x10FF,  26}, // Georgian
+  {  0x1100,   0x11FF,  28}, // Hangul Jamo
+  {  0x1200,   0x137F,  75}, // Ethiopic
+  {  0x1380,   0x139F,  75}, // Ethiopic Supplement
+  {  0x13A0,   0x13FF,  76}, // Cherokee
+  {  0x1400,   0x167F,  77}, // Unified Canadian Aboriginal Syllabics
+  {  0x1680,   0x169F,  78}, // Ogham
+  {  0x16A0,   0x16FF,  79}, // Runic
+  {  0x1700,   0x171F,  84}, // Tagalog
+  {  0x1720,   0x173F,  84}, // Hanunoo
+  {  0x1740,   0x175F,  84}, // Buhid
+  {  0x1760,   0x177F,  84}, // Tagbanwa
+  {  0x1780,   0x17FF,  80}, // Khmer
+  {  0x1800,   0x18AF,  81}, // Mongolian
+  {  0x1900,   0x194F,  93}, // Limbu
+  {  0x1950,   0x197F,  94}, // Tai Le
+  {  0x1980,   0x19DF,  95}, // New Tai Lue
+  {  0x19E0,   0x19FF,  80}, // Khmer Symbols
+  {  0x1A00,   0x1A1F,  96}, // Buginese
+  {  0x1B00,   0x1B7F,  27}, // Balinese
+  {  0x1B80,   0x1BBF, 112}, // Sundanese
+  {  0x1C00,   0x1C4F, 113}, // Lepcha
+  {  0x1C50,   0x1C7F, 114}, // Ol Chiki
+  {  0x1D00,   0x1D7F,   4}, // Phonetic Extensions
+  {  0x1D80,   0x1DBF,   4}, // Phonetic Extensions Supplement
+  {  0x1DC0,   0x1DFF,   6}, // Combining Diacritical Marks Supplement
+  {  0x1E00,   0x1EFF,  29}, // Latin Extended Additional
+  {  0x1F00,   0x1FFF,  30}, // Greek Extended
+  {  0x2000,   0x206F,  31}, // General Punctuation
+  {  0x2070,   0x209F,  32}, // Superscripts And Subscripts
+  {  0x20A0,   0x20CF,  33}, // Currency Symbols
+  {  0x20D0,   0x20FF,  34}, // Combining Diacritical Marks For Symbols
+  {  0x2100,   0x214F,  35}, // Letterlike Symbols
+  {  0x2150,   0x218F,  36}, // Number Forms
+  {  0x2190,   0x21FF,  37}, // Arrows
+  {  0x2200,   0x22FF,  38}, // Mathematical Operators
+  {  0x2300,   0x23FF,  39}, // Miscellaneous Technical
+  {  0x2400,   0x243F,  40}, // Control Pictures
+  {  0x2440,   0x245F,  41}, // Optical Character Recognition
+  {  0x2460,   0x24FF,  42}, // Enclosed Alphanumerics
+  {  0x2500,   0x257F,  43}, // Box Drawing
+  {  0x2580,   0x259F,  44}, // Block Elements
+  {  0x25A0,   0x25FF,  45}, // Geometric Shapes
+  {  0x2600,   0x26FF,  46}, // Miscellaneous Symbols
+  {  0x2700,   0x27BF,  47}, // Dingbats
+  {  0x27C0,   0x27EF,  38}, // Miscellaneous Mathematical Symbols-A
+  {  0x27F0,   0x27FF,  37}, // Supplemental Arrows-A
+  {  0x2800,   0x28FF,  82}, // Braille Patterns
+  {  0x2900,   0x297F,  37}, // Supplemental Arrows-B
+  {  0x2980,   0x29FF,  38}, // Miscellaneous Mathematical Symbols-B
+  {  0x2A00,   0x2AFF,  38}, // Supplemental Mathematical Operators
+  {  0x2B00,   0x2BFF,  37}, // Miscellaneous Symbols and Arrows
+  {  0x2C00,   0x2C5F,  97}, // Glagolitic
+  {  0x2C60,   0x2C7F,  29}, // Latin Extended-C
+  {  0x2C80,   0x2CFF,   8}, // Coptic
+  {  0x2D00,   0x2D2F,  26}, // Georgian Supplement
+  {  0x2D30,   0x2D7F,  98}, // Tifinagh
+  {  0x2D80,   0x2DDF,  75}, // Ethiopic Extended
+  {  0x2DE0,   0x2DFF,   9}, // Cyrillic Extended-A
+  {  0x2E00,   0x2E7F,  31}, // Supplemental Punctuation
+  {  0x2E80,   0x2EFF,  59}, // CJK Radicals Supplement
+  {  0x2F00,   0x2FDF,  59}, // Kangxi Radicals
+  {  0x2FF0,   0x2FFF,  59}, // Ideographic Description Characters
+  {  0x3000,   0x303F,  48}, // CJK Symbols And Punctuation
+  {  0x3040,   0x309F,  49}, // Hiragana
+  {  0x30A0,   0x30FF,  50}, // Katakana
+  {  0x3100,   0x312F,  51}, // Bopomofo
+  {  0x3130,   0x318F,  52}, // Hangul Compatibility Jamo
+  {  0x3190,   0x319F,  59}, // Kanbun
+  {  0x31A0,   0x31BF,  51}, // Bopomofo Extended
+  {  0x31C0,   0x31EF,  61}, // CJK Strokes
+  {  0x31F0,   0x31FF,  50}, // Katakana Phonetic Extensions
+  {  0x3200,   0x32FF,  54}, // Enclosed CJK Letters And Months
+  {  0x3300,   0x33FF,  55}, // CJK Compatibility
+  {  0x3400,   0x4DBF,  59}, // CJK Unified Ideographs Extension A
+  {  0x4DC0,   0x4DFF,  99}, // Yijing Hexagram Symbols
+  {  0x4E00,   0x9FFF,  59}, // CJK Unified Ideographs
+  {  0xA000,   0xA48F,  83}, // Yi Syllables
+  {  0xA490,   0xA4CF,  83}, // Yi Radicals
+  {  0xA500,   0xA63F,  12}, // Vai
+  {  0xA640,   0xA69F,   9}, // Cyrillic Extended-B
+  {  0xA700,   0xA71F,   5}, // Modifier Tone Letters
+  {  0xA720,   0xA7FF,  29}, // Latin Extended-D
+  {  0xA800,   0xA82F, 100}, // Syloti Nagri
+  {  0xA840,   0xA87F,  53}, // Phags-pa
+  {  0xA880,   0xA8DF, 115}, // Saurashtra
+  {  0xA900,   0xA92F, 116}, // Kayah Li
+  {  0xA930,   0xA95F, 117}, // Rejang
+  {  0xAA00,   0xAA5F, 118}, // Cham
+  {  0xAC00,   0xD7AF,  56}, // Hangul Syllables
+  {  0xD800,   0xDFFF,  57}, // Non-Plane 0 *
+  {  0xE000,   0xF8FF,  60}, // Private Use Area (plane 0)
+  {  0xF900,   0xFAFF,  61}, // CJK Compatibility Ideographs
+  {  0xFB00,   0xFB4F,  62}, // Alphabetic Presentation Forms
+  {  0xFB50,   0xFDFF,  63}, // Arabic Presentation Forms-A
+  {  0xFE00,   0xFE0F,  91}, // Variation Selectors
+  {  0xFE10,   0xFE1F,  65}, // Vertical Forms
+  {  0xFE20,   0xFE2F,  64}, // Combining Half Marks
+  {  0xFE30,   0xFE4F,  65}, // CJK Compatibility Forms
+  {  0xFE50,   0xFE6F,  66}, // Small Form Variants
+  {  0xFE70,   0xFEFF,  67}, // Arabic Presentation Forms-B
+  {  0xFF00,   0xFFEF,  68}, // Halfwidth And Fullwidth Forms
+  {  0xFFF0,   0xFFFF,  69}, // Specials
+  { 0x10000,  0x1007F, 101}, // Linear B Syllabary
+  { 0x10080,  0x100FF, 101}, // Linear B Ideograms
+  { 0x10100,  0x1013F, 101}, // Aegean Numbers
+  { 0x10140,  0x1018F, 102}, // Ancient Greek Numbers
+  { 0x10190,  0x101CF, 119}, // Ancient Symbols
+  { 0x101D0,  0x101FF, 120}, // Phaistos Disc
+  { 0x10280,  0x1029F, 121}, // Lycian
+  { 0x102A0,  0x102DF, 121}, // Carian
+  { 0x10300,  0x1032F,  85}, // Old Italic
+  { 0x10330,  0x1034F,  86}, // Gothic
+  { 0x10380,  0x1039F, 103}, // Ugaritic
+  { 0x103A0,  0x103DF, 104}, // Old Persian
+  { 0x10400,  0x1044F,  87}, // Deseret
+  { 0x10450,  0x1047F, 105}, // Shavian
+  { 0x10480,  0x104AF, 106}, // Osmanya
+  { 0x10800,  0x1083F, 107}, // Cypriot Syllabary
+  { 0x10900,  0x1091F,  58}, // Phoenician
+  { 0x10920,  0x1093F, 121}, // Lydian
+  { 0x10A00,  0x10A5F, 108}, // Kharoshthi
+  { 0x12000,  0x123FF, 110}, // Cuneiform
+  { 0x12400,  0x1247F, 110}, // Cuneiform Numbers and Punctuation
+  { 0x1D000,  0x1D0FF,  88}, // Byzantine Musical Symbols
+  { 0x1D100,  0x1D1FF,  88}, // Musical Symbols
+  { 0x1D200,  0x1D24F,  88}, // Ancient Greek Musical Notation
+  { 0x1D300,  0x1D35F, 109}, // Tai Xuan Jing Symbols
+  { 0x1D360,  0x1D37F, 111}, // Counting Rod Numerals
+  { 0x1D400,  0x1D7FF,  89}, // Mathematical Alphanumeric Symbols
+  { 0x1F000,  0x1F02F, 122}, // Mahjong Tiles
+  { 0x1F030,  0x1F09F, 122}, // Domino Tiles
+  { 0x20000,  0x2A6DF,  59}, // CJK Unified Ideographs Extension B
+  { 0x2F800,  0x2FA1F,  61}, // CJK Compatibility Ideographs Supplement
+  { 0xE0000,  0xE007F,  92}, // Tags
+  { 0xE0100,  0xE01EF,  91}, // Variation Selectors Supplement
+  { 0xF0000,  0xFFFFD,  90}, // Private Use (plane 15)
+  {0x100000, 0x10FFFD,  90}, // Private Use (plane 16)
+};
+
+static int
+_compare_range (const void *_key, const void *_item, void *_arg)
+{
+  hb_codepoint_t cp = *((hb_codepoint_t *) _key);
+  const Range *range = (Range *) _item;
+
+  if (cp < range->start)
+    return -1;
+  else if (cp <= range->end)
+    return 0;
+  else
+    return 1;
+}
+
+/**
+ * hb_get_unicode_range_bit:
+ * Returns the bit to be set in os/2 ulUnicodeRange for a given codepoint.
+ **/
+static unsigned int
+hb_get_unicode_range_bit (hb_codepoint_t cp)
+{
+  Range *range = (Range*) hb_bsearch_r (&cp, os2UnicodeRangesSorted,
+                                        sizeof (os2UnicodeRangesSorted) / sizeof(Range),
+                                        sizeof(Range),
+                                        _compare_range, nullptr);
+  if (range != NULL)
+    return range->bit;
+  return -1;
+}
+
+} /* namespace OT */
+
+#endif /* HB_OT_OS2_UNICODE_RANGES_HH */

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-indic-private.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-indic-private.hh	2018-03-07 21:52:46 UTC (rev 46876)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-indic-private.hh	2018-03-07 22:32:14 UTC (rev 46877)
@@ -34,6 +34,11 @@
 #include "hb-ot-shape-private.hh" /* XXX Remove */
 
 
+/* buffer var allocations */
+#define indic_category() complex_var_u8_0() /* indic_category_t */
+#define indic_position() complex_var_u8_1() /* indic_position_t */
+
+
 #define INDIC_TABLE_ELEMENT_TYPE uint16_t
 
 /* Cateories used in the OpenType spec:
@@ -77,29 +82,29 @@
 
 /* Visual positions in a syllable from left to right. */
 enum indic_position_t {
-  POS_START,
+  POS_START = 0,
 
-  POS_RA_TO_BECOME_REPH,
-  POS_PRE_M,
-  POS_PRE_C,
+  POS_RA_TO_BECOME_REPH = 1,
+  POS_PRE_M = 2,
+  POS_PRE_C = 3,
 
-  POS_BASE_C,
-  POS_AFTER_MAIN,
+  POS_BASE_C = 4,
+  POS_AFTER_MAIN = 5,
 
-  POS_ABOVE_C,
+  POS_ABOVE_C = 6,
 
-  POS_BEFORE_SUB,
-  POS_BELOW_C,
-  POS_AFTER_SUB,
+  POS_BEFORE_SUB = 7,
+  POS_BELOW_C = 8,
+  POS_AFTER_SUB = 9,
 
-  POS_BEFORE_POST,
-  POS_POST_C,
-  POS_AFTER_POST,
+  POS_BEFORE_POST = 10,
+  POS_POST_C = 11,
+  POS_AFTER_POST = 12,
 
-  POS_FINAL_C,
-  POS_SMVD,
+  POS_FINAL_C = 13,
+  POS_SMVD = 14,
 
-  POS_END
+  POS_END = 15
 };
 
 /* Categories used in IndicSyllabicCategory.txt from UCD. */
@@ -186,4 +191,211 @@
 HB_INTERNAL INDIC_TABLE_ELEMENT_TYPE
 hb_indic_get_categories (hb_codepoint_t u);
 
+
+static inline bool
+is_one_of (const hb_glyph_info_t &info, unsigned int flags)
+{
+  /* If it ligated, all bets are off. */
+  if (_hb_glyph_info_ligated (&info)) return false;
+  return !!(FLAG_UNSAFE (info.indic_category()) & flags);
+}
+
+static inline bool
+is_joiner (const hb_glyph_info_t &info)
+{
+  return is_one_of (info, JOINER_FLAGS);
+}
+
+static inline bool
+is_consonant (const hb_glyph_info_t &info)
+{
+  return is_one_of (info, CONSONANT_FLAGS);
+}
+
+static inline bool
+is_halant (const hb_glyph_info_t &info)
+{
+  return is_one_of (info, FLAG (OT_H));
+}
+
+#define IN_HALF_BLOCK(u, Base) (((u) & ~0x7Fu) == (Base))
+
+#define IS_DEVA(u) (IN_HALF_BLOCK (u, 0x0900u))
+#define IS_BENG(u) (IN_HALF_BLOCK (u, 0x0980u))
+#define IS_GURU(u) (IN_HALF_BLOCK (u, 0x0A00u))
+#define IS_GUJR(u) (IN_HALF_BLOCK (u, 0x0A80u))
+#define IS_ORYA(u) (IN_HALF_BLOCK (u, 0x0B00u))
+#define IS_TAML(u) (IN_HALF_BLOCK (u, 0x0B80u))
+#define IS_TELU(u) (IN_HALF_BLOCK (u, 0x0C00u))
+#define IS_KNDA(u) (IN_HALF_BLOCK (u, 0x0C80u))
+#define IS_MLYM(u) (IN_HALF_BLOCK (u, 0x0D00u))
+#define IS_SINH(u) (IN_HALF_BLOCK (u, 0x0D80u))
+
+
+#define MATRA_POS_LEFT(u)	POS_PRE_M
+#define MATRA_POS_RIGHT(u)	( \
+				  IS_DEVA(u) ? POS_AFTER_SUB  : \
+				  IS_BENG(u) ? POS_AFTER_POST : \
+				  IS_GURU(u) ? POS_AFTER_POST : \
+				  IS_GUJR(u) ? POS_AFTER_POST : \
+				  IS_ORYA(u) ? POS_AFTER_POST : \
+				  IS_TAML(u) ? POS_AFTER_POST : \
+				  IS_TELU(u) ? (u <= 0x0C42u ? POS_BEFORE_SUB : POS_AFTER_SUB) : \
+				  IS_KNDA(u) ? (u < 0x0CC3u || u > 0xCD6u ? POS_BEFORE_SUB : POS_AFTER_SUB) : \
+				  IS_MLYM(u) ? POS_AFTER_POST : \
+				  IS_SINH(u) ? POS_AFTER_SUB  : \
+				  /*default*/  POS_AFTER_SUB    \
+				)
+#define MATRA_POS_TOP(u)	( /* BENG and MLYM don't have top matras. */ \
+				  IS_DEVA(u) ? POS_AFTER_SUB  : \
+				  IS_GURU(u) ? POS_AFTER_POST : /* Deviate from spec */ \
+				  IS_GUJR(u) ? POS_AFTER_SUB  : \
+				  IS_ORYA(u) ? POS_AFTER_MAIN : \
+				  IS_TAML(u) ? POS_AFTER_SUB  : \
+				  IS_TELU(u) ? POS_BEFORE_SUB : \
+				  IS_KNDA(u) ? POS_BEFORE_SUB : \
+				  IS_SINH(u) ? POS_AFTER_SUB  : \
+				  /*default*/  POS_AFTER_SUB    \
+				)
+#define MATRA_POS_BOTTOM(u)	( \
+				  IS_DEVA(u) ? POS_AFTER_SUB  : \
+				  IS_BENG(u) ? POS_AFTER_SUB  : \
+				  IS_GURU(u) ? POS_AFTER_POST : \
+				  IS_GUJR(u) ? POS_AFTER_POST : \
+				  IS_ORYA(u) ? POS_AFTER_SUB  : \
+				  IS_TAML(u) ? POS_AFTER_POST : \
+				  IS_TELU(u) ? POS_BEFORE_SUB : \
+				  IS_KNDA(u) ? POS_BEFORE_SUB : \
+				  IS_MLYM(u) ? POS_AFTER_POST : \
+				  IS_SINH(u) ? POS_AFTER_SUB  : \
+				  /*default*/  POS_AFTER_SUB    \
+				)
+
+static inline indic_position_t
+matra_position_indic (hb_codepoint_t u, indic_position_t side)
+{
+  switch ((int) side)
+  {
+    case POS_PRE_C:	return MATRA_POS_LEFT (u);
+    case POS_POST_C:	return MATRA_POS_RIGHT (u);
+    case POS_ABOVE_C:	return MATRA_POS_TOP (u);
+    case POS_BELOW_C:	return MATRA_POS_BOTTOM (u);
+  };
+  return side;
+}
+
+/* XXX
+ * This is a hack for now.  We should move this data into the main Indic table.
+ * Or completely remove it and just check in the tables.
+ */
+static const hb_codepoint_t ra_chars[] = {
+  0x0930u, /* Devanagari */
+  0x09B0u, /* Bengali */
+  0x09F0u, /* Bengali */
+  0x0A30u, /* Gurmukhi */	/* No Reph */
+  0x0AB0u, /* Gujarati */
+  0x0B30u, /* Oriya */
+  0x0BB0u, /* Tamil */		/* No Reph */
+  0x0C30u, /* Telugu */		/* Reph formed only with ZWJ */
+  0x0CB0u, /* Kannada */
+  0x0D30u, /* Malayalam */	/* No Reph, Logical Repha */
+
+  0x0DBBu, /* Sinhala */		/* Reph formed only with ZWJ */
+};
+
+static inline bool
+is_ra (hb_codepoint_t u)
+{
+  for (unsigned int i = 0; i < ARRAY_LENGTH (ra_chars); i++)
+    if (u == ra_chars[i])
+      return true;
+  return false;
+}
+
+static inline void
+set_indic_properties (hb_glyph_info_t &info)
+{
+  hb_codepoint_t u = info.codepoint;
+  unsigned int type = hb_indic_get_categories (u);
+  indic_category_t cat = (indic_category_t) (type & 0x7Fu);
+  indic_position_t pos = (indic_position_t) (type >> 8);
+
+
+  /*
+   * Re-assign category
+   */
+
+  /* The following act more like the Bindus. */
+  if (unlikely (hb_in_range<hb_codepoint_t> (u, 0x0953u, 0x0954u)))
+    cat = OT_SM;
+  /* The following act like consonants. */
+  else if (unlikely (hb_in_ranges<hb_codepoint_t> (u, 0x0A72u, 0x0A73u,
+				      0x1CF5u, 0x1CF6u)))
+    cat = OT_C;
+  /* TODO: The following should only be allowed after a Visarga.
+   * For now, just treat them like regular tone marks. */
+  else if (unlikely (hb_in_range<hb_codepoint_t> (u, 0x1CE2u, 0x1CE8u)))
+    cat = OT_A;
+  /* TODO: The following should only be allowed after some of
+   * the nasalization marks, maybe only for U+1CE9..U+1CF1.
+   * For now, just treat them like tone marks. */
+  else if (unlikely (u == 0x1CEDu))
+    cat = OT_A;
+  /* The following take marks in standalone clusters, similar to Avagraha. */
+  else if (unlikely (hb_in_ranges<hb_codepoint_t> (u, 0xA8F2u, 0xA8F7u,
+				      0x1CE9u, 0x1CECu,
+				      0x1CEEu, 0x1CF1u)))
+  {
+    cat = OT_Symbol;
+    static_assert (((int) INDIC_SYLLABIC_CATEGORY_AVAGRAHA == OT_Symbol), "");
+  }
+  else if (unlikely (u == 0x0A51u))
+  {
+    /* https://github.com/harfbuzz/harfbuzz/issues/524 */
+    cat = OT_M;
+    pos = POS_BELOW_C;
+  }
+
+  /* According to ScriptExtensions.txt, these Grantha marks may also be used in Tamil,
+   * so the Indic shaper needs to know their categories. */
+  else if (unlikely (u == 0x11301u || u == 0x11303u)) cat = OT_SM;
+  else if (unlikely (u == 0x1133cu)) cat = OT_N;
+
+  else if (unlikely (u == 0x0AFBu)) cat = OT_N; /* https://github.com/harfbuzz/harfbuzz/issues/552 */
+
+  else if (unlikely (u == 0x0980u)) cat = OT_PLACEHOLDER; /* https://github.com/harfbuzz/harfbuzz/issues/538 */
+  else if (unlikely (u == 0x0C80u)) cat = OT_PLACEHOLDER; /* https://github.com/harfbuzz/harfbuzz/pull/623 */
+  else if (unlikely (hb_in_range<hb_codepoint_t> (u, 0x2010u, 0x2011u)))
+				    cat = OT_PLACEHOLDER;
+  else if (unlikely (u == 0x25CCu)) cat = OT_DOTTEDCIRCLE;
+
+
+  /*
+   * Re-assign position.
+   */
+
+  if ((FLAG_UNSAFE (cat) & CONSONANT_FLAGS))
+  {
+    pos = POS_BASE_C;
+    if (is_ra (u))
+      cat = OT_Ra;
+  }
+  else if (cat == OT_M)
+  {
+    pos = matra_position_indic (u, pos);
+  }
+  else if ((FLAG_UNSAFE (cat) & (FLAG (OT_SM) /* | FLAG (OT_VD) */ | FLAG (OT_A) | FLAG (OT_Symbol))))
+  {
+    pos = POS_SMVD;
+  }
+
+  if (unlikely (u == 0x0B01u)) pos = POS_BEFORE_SUB; /* Oriya Bindu is BeforeSub in the spec. */
+
+
+
+  info.indic_category() = cat;
+  info.indic_position() = pos;
+}
+
+
 #endif /* HB_OT_SHAPE_COMPLEX_INDIC_PRIVATE_HH */

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-03-07 21:52:46 UTC (rev 46876)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-indic.cc	2018-03-07 22:32:14 UTC (rev 46877)
@@ -27,227 +27,13 @@
 #include "hb-ot-shape-complex-indic-private.hh"
 #include "hb-ot-layout-private.hh"
 
-/* buffer var allocations */
-#define indic_category() complex_var_u8_0() /* indic_category_t */
-#define indic_position() complex_var_u8_1() /* indic_position_t */
 
-
 /*
  * Indic shaper.
  */
 
 
-#define IN_HALF_BLOCK(u, Base) (((u) & ~0x7Fu) == (Base))
-
-#define IS_DEVA(u) (IN_HALF_BLOCK (u, 0x0900u))
-#define IS_BENG(u) (IN_HALF_BLOCK (u, 0x0980u))
-#define IS_GURU(u) (IN_HALF_BLOCK (u, 0x0A00u))
-#define IS_GUJR(u) (IN_HALF_BLOCK (u, 0x0A80u))
-#define IS_ORYA(u) (IN_HALF_BLOCK (u, 0x0B00u))
-#define IS_TAML(u) (IN_HALF_BLOCK (u, 0x0B80u))
-#define IS_TELU(u) (IN_HALF_BLOCK (u, 0x0C00u))
-#define IS_KNDA(u) (IN_HALF_BLOCK (u, 0x0C80u))
-#define IS_MLYM(u) (IN_HALF_BLOCK (u, 0x0D00u))
-#define IS_SINH(u) (IN_HALF_BLOCK (u, 0x0D80u))
-
-
-#define MATRA_POS_LEFT(u)	POS_PRE_M
-#define MATRA_POS_RIGHT(u)	( \
-				  IS_DEVA(u) ? POS_AFTER_SUB  : \
-				  IS_BENG(u) ? POS_AFTER_POST : \
-				  IS_GURU(u) ? POS_AFTER_POST : \
-				  IS_GUJR(u) ? POS_AFTER_POST : \
-				  IS_ORYA(u) ? POS_AFTER_POST : \
-				  IS_TAML(u) ? POS_AFTER_POST : \
-				  IS_TELU(u) ? (u <= 0x0C42u ? POS_BEFORE_SUB : POS_AFTER_SUB) : \
-				  IS_KNDA(u) ? (u < 0x0CC3u || u > 0xCD6u ? POS_BEFORE_SUB : POS_AFTER_SUB) : \
-				  IS_MLYM(u) ? POS_AFTER_POST : \
-				  IS_SINH(u) ? POS_AFTER_SUB  : \
-				  /*default*/  POS_AFTER_SUB    \
-				)
-#define MATRA_POS_TOP(u)	( /* BENG and MLYM don't have top matras. */ \
-				  IS_DEVA(u) ? POS_AFTER_SUB  : \
-				  IS_GURU(u) ? POS_AFTER_POST : /* Deviate from spec */ \
-				  IS_GUJR(u) ? POS_AFTER_SUB  : \
-				  IS_ORYA(u) ? POS_AFTER_MAIN : \
-				  IS_TAML(u) ? POS_AFTER_SUB  : \
-				  IS_TELU(u) ? POS_BEFORE_SUB : \
-				  IS_KNDA(u) ? POS_BEFORE_SUB : \
-				  IS_SINH(u) ? POS_AFTER_SUB  : \
-				  /*default*/  POS_AFTER_SUB    \
-				)
-#define MATRA_POS_BOTTOM(u)	( \
-				  IS_DEVA(u) ? POS_AFTER_SUB  : \
-				  IS_BENG(u) ? POS_AFTER_SUB  : \
-				  IS_GURU(u) ? POS_AFTER_POST : \
-				  IS_GUJR(u) ? POS_AFTER_POST : \
-				  IS_ORYA(u) ? POS_AFTER_SUB  : \
-				  IS_TAML(u) ? POS_AFTER_POST : \
-				  IS_TELU(u) ? POS_BEFORE_SUB : \
-				  IS_KNDA(u) ? POS_BEFORE_SUB : \
-				  IS_MLYM(u) ? POS_AFTER_POST : \
-				  IS_SINH(u) ? POS_AFTER_SUB  : \
-				  /*default*/  POS_AFTER_SUB    \
-				)
-
-static inline indic_position_t
-matra_position (hb_codepoint_t u, indic_position_t side)
-{
-  switch ((int) side)
-  {
-    case POS_PRE_C:	return MATRA_POS_LEFT (u);
-    case POS_POST_C:	return MATRA_POS_RIGHT (u);
-    case POS_ABOVE_C:	return MATRA_POS_TOP (u);
-    case POS_BELOW_C:	return MATRA_POS_BOTTOM (u);
-  };
-  return side;
-}
-
-/* XXX
- * This is a hack for now.  We should move this data into the main Indic table.
- * Or completely remove it and just check in the tables.
- */
-static const hb_codepoint_t ra_chars[] = {
-  0x0930u, /* Devanagari */
-  0x09B0u, /* Bengali */
-  0x09F0u, /* Bengali */
-  0x0A30u, /* Gurmukhi */	/* No Reph */
-  0x0AB0u, /* Gujarati */
-  0x0B30u, /* Oriya */
-  0x0BB0u, /* Tamil */		/* No Reph */
-  0x0C30u, /* Telugu */		/* Reph formed only with ZWJ */
-  0x0CB0u, /* Kannada */
-  0x0D30u, /* Malayalam */	/* No Reph, Logical Repha */
-
-  0x0DBBu, /* Sinhala */		/* Reph formed only with ZWJ */
-};
-
-static inline bool
-is_ra (hb_codepoint_t u)
-{
-  for (unsigned int i = 0; i < ARRAY_LENGTH (ra_chars); i++)
-    if (u == ra_chars[i])
-      return true;
-  return false;
-}
-
-static inline bool
-is_one_of (const hb_glyph_info_t &info, unsigned int flags)
-{
-  /* If it ligated, all bets are off. */
-  if (_hb_glyph_info_ligated (&info)) return false;
-  return !!(FLAG_UNSAFE (info.indic_category()) & flags);
-}
-
-static inline bool
-is_joiner (const hb_glyph_info_t &info)
-{
-  return is_one_of (info, JOINER_FLAGS);
-}
-
-static inline bool
-is_consonant (const hb_glyph_info_t &info)
-{
-  return is_one_of (info, CONSONANT_FLAGS);
-}
-
-static inline bool
-is_halant (const hb_glyph_info_t &info)
-{
-  return is_one_of (info, FLAG (OT_H));
-}
-
-static inline void
-set_indic_properties (hb_glyph_info_t &info)
-{
-  hb_codepoint_t u = info.codepoint;
-  unsigned int type = hb_indic_get_categories (u);
-  indic_category_t cat = (indic_category_t) (type & 0x7Fu);
-  indic_position_t pos = (indic_position_t) (type >> 8);
-
-
-  /*
-   * Re-assign category
-   */
-
-  /* The following act more like the Bindus. */
-  if (unlikely (hb_in_range<hb_codepoint_t> (u, 0x0953u, 0x0954u)))
-    cat = OT_SM;
-  /* The following act like consonants. */
-  else if (unlikely (hb_in_ranges<hb_codepoint_t> (u, 0x0A72u, 0x0A73u,
-				      0x1CF5u, 0x1CF6u)))
-    cat = OT_C;
-  /* TODO: The following should only be allowed after a Visarga.
-   * For now, just treat them like regular tone marks. */
-  else if (unlikely (hb_in_range<hb_codepoint_t> (u, 0x1CE2u, 0x1CE8u)))
-    cat = OT_A;
-  /* TODO: The following should only be allowed after some of
-   * the nasalization marks, maybe only for U+1CE9..U+1CF1.
-   * For now, just treat them like tone marks. */
-  else if (unlikely (u == 0x1CEDu))
-    cat = OT_A;
-  /* The following take marks in standalone clusters, similar to Avagraha. */
-  else if (unlikely (hb_in_ranges<hb_codepoint_t> (u, 0xA8F2u, 0xA8F7u,
-				      0x1CE9u, 0x1CECu,
-				      0x1CEEu, 0x1CF1u)))
-  {
-    cat = OT_Symbol;
-    static_assert (((int) INDIC_SYLLABIC_CATEGORY_AVAGRAHA == OT_Symbol), "");
-  }
-  else if (unlikely (u == 0x0A51u))
-  {
-    /* https://github.com/harfbuzz/harfbuzz/issues/524 */
-    cat = OT_M;
-    pos = POS_BELOW_C;
-  }
-
-  /* According to ScriptExtensions.txt, these Grantha marks may also be used in Tamil,
-   * so the Indic shaper needs to know their categories. */
-  else if (unlikely (u == 0x11301u || u == 0x11303u)) cat = OT_SM;
-  else if (unlikely (u == 0x1133cu)) cat = OT_N;
-
-  else if (unlikely (u == 0x0AFBu)) cat = OT_N; /* https://github.com/harfbuzz/harfbuzz/issues/552 */
-
-  else if (unlikely (u == 0x0980u)) cat = OT_PLACEHOLDER; /* https://github.com/harfbuzz/harfbuzz/issues/538 */
-  else if (unlikely (u == 0x0C80u)) cat = OT_PLACEHOLDER; /* https://github.com/harfbuzz/harfbuzz/pull/623 */
-  else if (unlikely (hb_in_range<hb_codepoint_t> (u, 0x2010u, 0x2011u)))
-				    cat = OT_PLACEHOLDER;
-  else if (unlikely (u == 0x25CCu)) cat = OT_DOTTEDCIRCLE;
-
-
-  /*
-   * Re-assign position.
-   */
-
-  if ((FLAG_UNSAFE (cat) & CONSONANT_FLAGS))
-  {
-    pos = POS_BASE_C;
-    if (is_ra (u))
-      cat = OT_Ra;
-  }
-  else if (cat == OT_M)
-  {
-    pos = matra_position (u, pos);
-  }
-  else if ((FLAG_UNSAFE (cat) & (FLAG (OT_SM) /* | FLAG (OT_VD) */ | FLAG (OT_A) | FLAG (OT_Symbol))))
-  {
-    pos = POS_SMVD;
-  }
-
-  if (unlikely (u == 0x0B01u)) pos = POS_BEFORE_SUB; /* Oriya Bindu is BeforeSub in the spec. */
-
-
-
-  info.indic_category() = cat;
-  info.indic_position() = pos;
-}
-
 /*
- * Things above this line should ideally be moved to the Indic table itself.
- */
-
-
-/*
  * Indic configurations.  Note that we do not want to keep every single script-specific
  * behavior in these tables necessarily.  This should mainly be used for per-script
  * properties that are cheaper keeping here, than in the code.  Ie. if, say, one and

Added: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-khmer-private.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-khmer-private.hh	                        (rev 0)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-khmer-private.hh	2018-03-07 22:32:14 UTC (rev 46877)
@@ -0,0 +1,124 @@
+/*
+ * 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_KHMER_PRIVATE_HH
+#define HB_OT_SHAPE_COMPLEX_KHMER_PRIVATE_HH
+
+#include "hb-private.hh"
+
+#include "hb-ot-shape-complex-indic-private.hh"
+
+
+/* buffer var allocations */
+#define khmer_category() indic_category() /* khmer_category_t */
+#define khmer_position() indic_position() /* khmer_position_t */
+
+
+typedef indic_category_t khmer_category_t;
+typedef indic_position_t khmer_position_t;
+
+
+static inline khmer_position_t
+matra_position_khmer (khmer_position_t side)
+{
+  switch ((int) side)
+  {
+    case POS_PRE_C:
+      return POS_PRE_M;
+
+    case POS_POST_C:
+    case POS_ABOVE_C:
+    case POS_BELOW_C:
+      return POS_AFTER_POST;
+
+    default:
+      return side;
+  };
+}
+
+static inline bool
+is_consonant_or_vowel (const hb_glyph_info_t &info)
+{
+  return is_one_of (info, CONSONANT_FLAGS | FLAG (OT_V));
+}
+
+static inline bool
+is_coeng (const hb_glyph_info_t &info)
+{
+  return is_one_of (info, FLAG (OT_Coeng));
+}
+
+static inline void
+set_khmer_properties (hb_glyph_info_t &info)
+{
+  hb_codepoint_t u = info.codepoint;
+  unsigned int type = hb_indic_get_categories (u);
+  khmer_category_t cat = (khmer_category_t) (type & 0x7Fu);
+  khmer_position_t pos = (khmer_position_t) (type >> 8);
+
+
+  /*
+   * Re-assign category
+   */
+
+  if (unlikely (u == 0x17C6u)) cat = OT_N; /* Khmer Bindu doesn't like to be repositioned. */
+  else if (unlikely (hb_in_range<hb_codepoint_t> (u, 0x17CDu, 0x17D1u) ||
+		     u == 0x17CBu || u == 0x17D3u || u == 0x17DDu)) /* Khmer Various signs */
+  {
+    /* These can occur mid-syllable (eg. before matras), even though Unicode marks them as Syllable_Modifier.
+     * https://github.com/roozbehp/unicode-data/issues/5 */
+    cat = OT_M;
+    pos = POS_ABOVE_C;
+  }
+  else if (unlikely (hb_in_range<hb_codepoint_t> (u, 0x2010u, 0x2011u))) cat = OT_PLACEHOLDER;
+  else if (unlikely (u == 0x25CCu)) cat = OT_DOTTEDCIRCLE;
+
+
+  /*
+   * Re-assign position.
+   */
+
+  if ((FLAG_UNSAFE (cat) & CONSONANT_FLAGS))
+  {
+    pos = POS_BASE_C;
+    if (u == 0x179Au)
+      cat = OT_Ra;
+  }
+  else if (cat == OT_M)
+  {
+    pos = matra_position_khmer (pos);
+  }
+  else if ((FLAG_UNSAFE (cat) & (FLAG (OT_SM) | FLAG (OT_A) | FLAG (OT_Symbol))))
+  {
+    pos = POS_SMVD;
+  }
+
+  info.khmer_category() = cat;
+  info.khmer_position() = pos;
+}
+
+
+#endif /* HB_OT_SHAPE_COMPLEX_KHMER_PRIVATE_HH */

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-03-07 21:52:46 UTC (rev 46876)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-khmer.cc	2018-03-07 22:32:14 UTC (rev 46877)
@@ -24,124 +24,14 @@
  * Google Author(s): Behdad Esfahbod
  */
 
-#include "hb-ot-shape-complex-indic-private.hh"
+#include "hb-ot-shape-complex-khmer-private.hh"
 #include "hb-ot-layout-private.hh"
 
-/* buffer var allocations */
-#define khmer_category() complex_var_u8_0() /* khmer_category_t */
-#define khmer_position() complex_var_u8_1() /* khmer_position_t */
 
-
 /*
  * Khmer shaper.
  */
 
-typedef indic_category_t khmer_category_t;
-typedef indic_position_t khmer_position_t;
-
-
-static inline khmer_position_t
-matra_position (khmer_position_t side)
-{
-  switch ((int) side)
-  {
-    case POS_PRE_C:
-      return POS_PRE_M;
-
-    case POS_POST_C:
-    case POS_ABOVE_C:
-    case POS_BELOW_C:
-      return POS_AFTER_POST;
-
-    default:
-      return side;
-  };
-}
-
-static inline bool
-is_one_of (const hb_glyph_info_t &info, unsigned int flags)
-{
-  /* If it ligated, all bets are off. */
-  if (_hb_glyph_info_ligated (&info)) return false;
-  return !!(FLAG_UNSAFE (info.khmer_category()) & flags);
-}
-
-static inline bool
-is_joiner (const hb_glyph_info_t &info)
-{
-  return is_one_of (info, JOINER_FLAGS);
-}
-
-static inline bool
-is_consonant (const hb_glyph_info_t &info)
-{
-  return is_one_of (info, CONSONANT_FLAGS | FLAG (OT_V));
-}
-
-static inline bool
-is_coeng (const hb_glyph_info_t &info)
-{
-  return is_one_of (info, FLAG (OT_Coeng));
-}
-
-static inline void
-set_khmer_properties (hb_glyph_info_t &info)
-{
-  hb_codepoint_t u = info.codepoint;
-  unsigned int type = hb_indic_get_categories (u);
-  khmer_category_t cat = (khmer_category_t) (type & 0x7Fu);
-  khmer_position_t pos = (khmer_position_t) (type >> 8);
-
-
-  /*
-   * Re-assign category
-   */
-
-  if (unlikely (u == 0x17C6u)) cat = OT_N; /* Khmer Bindu doesn't like to be repositioned. */
-  else if (unlikely (hb_in_range<hb_codepoint_t> (u, 0x17CDu, 0x17D1u) ||
-		     u == 0x17CBu || u == 0x17D3u || u == 0x17DDu)) /* Khmer Various signs */
-  {
-    /* These can occur mid-syllable (eg. before matras), even though Unicode marks them as Syllable_Modifier.
-     * https://github.com/roozbehp/unicode-data/issues/5 */
-    cat = OT_M;
-    pos = POS_ABOVE_C;
-  }
-  else if (unlikely (hb_in_range<hb_codepoint_t> (u, 0x2010u, 0x2011u))) cat = OT_PLACEHOLDER;
-  else if (unlikely (u == 0x25CCu)) cat = OT_DOTTEDCIRCLE;
-
-
-  /*
-   * Re-assign position.
-   */
-
-  if ((FLAG_UNSAFE (cat) & CONSONANT_FLAGS))
-  {
-    pos = POS_BASE_C;
-    if (u == 0x179Au)
-      cat = OT_Ra;
-  }
-  else if (cat == OT_M)
-  {
-    pos = matra_position (pos);
-  }
-  else if ((FLAG_UNSAFE (cat) & (FLAG (OT_SM) | FLAG (OT_A) | FLAG (OT_Symbol))))
-  {
-    pos = POS_SMVD;
-  }
-
-  info.khmer_category() = cat;
-  info.khmer_position() = pos;
-}
-
-/*
- * Things above this line should ideally be moved to the Indic table itself.
- */
-
-
-/*
- * Khmer shaper.
- */
-
 struct feature_list_t {
   hb_tag_t tag;
   hb_ot_map_feature_flags_t flags;
@@ -404,7 +294,7 @@
 
   /* Mark all subsequent consonants as below. */
   for (unsigned int i = base + 1; i < end; i++)
-    if (is_consonant (info[i]))
+    if (is_consonant_or_vowel (info[i]))
       info[i].khmer_position() = POS_BELOW_C;
 
   /* Mark final consonants.  A final consonant is one appearing after a matra,
@@ -412,7 +302,7 @@
   for (unsigned int i = base + 1; i < end; i++)
     if (info[i].khmer_category() == OT_M) {
       for (unsigned int j = i + 1; j < end; j++)
-        if (is_consonant (info[j])) {
+        if (is_consonant_or_vowel (info[j])) {
 	  info[j].khmer_position() = POS_FINAL_C;
 	  break;
 	}
@@ -455,7 +345,7 @@
   {
     unsigned int last = base;
     for (unsigned int i = base + 1; i < end; i++)
-      if (is_consonant (info[i]))
+      if (is_consonant_or_vowel (info[i]))
       {
 	for (unsigned int j = last + 1; j < i; j++)
 	  if (info[j].khmer_position() < POS_SMVD)

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-myanmar-machine.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-myanmar-machine.hh	2018-03-07 21:52:46 UTC (rev 46876)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-myanmar-machine.hh	2018-03-07 22:32:14 UTC (rev 46877)
@@ -36,28 +36,29 @@
 static const unsigned char _myanmar_syllable_machine_trans_keys[] = {
 	1u, 32u, 3u, 30u, 5u, 29u, 5u, 8u, 5u, 29u, 3u, 25u, 5u, 25u, 5u, 25u, 
 	3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, 1u, 16u, 3u, 29u, 3u, 29u, 3u, 29u, 
-	3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, 5u, 29u, 5u, 8u, 
-	5u, 29u, 3u, 25u, 5u, 25u, 5u, 25u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, 
-	3u, 30u, 3u, 29u, 1u, 32u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, 
-	3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, 1u, 32u, 8u, 8u, 0
+	3u, 29u, 3u, 29u, 3u, 30u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, 5u, 29u, 
+	5u, 8u, 5u, 29u, 3u, 25u, 5u, 25u, 5u, 25u, 3u, 29u, 3u, 29u, 3u, 29u, 
+	3u, 29u, 3u, 30u, 3u, 29u, 1u, 32u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, 
+	3u, 29u, 3u, 30u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, 1u, 32u, 8u, 8u, 
+	0
 };
 
 static const char _myanmar_syllable_machine_key_spans[] = {
 	32, 28, 25, 4, 25, 23, 21, 21, 
 	27, 27, 27, 27, 16, 27, 27, 27, 
-	27, 27, 27, 27, 27, 27, 25, 4, 
-	25, 23, 21, 21, 27, 27, 27, 27, 
-	28, 27, 32, 27, 27, 27, 27, 27, 
-	27, 27, 27, 27, 32, 1
+	27, 27, 28, 27, 27, 27, 27, 25, 
+	4, 25, 23, 21, 21, 27, 27, 27, 
+	27, 28, 27, 32, 27, 27, 27, 27, 
+	27, 28, 27, 27, 27, 27, 32, 1
 };
 
 static const short _myanmar_syllable_machine_index_offsets[] = {
 	0, 33, 62, 88, 93, 119, 143, 165, 
 	187, 215, 243, 271, 299, 316, 344, 372, 
-	400, 428, 456, 484, 512, 540, 568, 594, 
-	599, 625, 649, 671, 693, 721, 749, 777, 
-	805, 834, 862, 895, 923, 951, 979, 1007, 
-	1035, 1063, 1091, 1119, 1147, 1180
+	400, 428, 456, 485, 513, 541, 569, 597, 
+	623, 628, 654, 678, 700, 722, 750, 778, 
+	806, 834, 863, 891, 924, 952, 980, 1008, 
+	1036, 1064, 1093, 1121, 1149, 1177, 1205, 1238
 };
 
 static const char _myanmar_syllable_machine_indicies[] = {
@@ -105,7 +106,7 @@
 	21, 21, 21, 27, 21, 21, 28, 29, 
 	30, 31, 32, 33, 34, 35, 36, 21, 
 	22, 21, 24, 24, 21, 25, 21, 26, 
-	21, 21, 21, 21, 21, 21, 21, 35, 
+	21, 21, 21, 21, 21, 21, 21, 43, 
 	21, 21, 21, 21, 21, 21, 32, 33, 
 	34, 35, 36, 21, 22, 21, 24, 24, 
 	21, 25, 21, 26, 21, 21, 21, 21, 
@@ -119,106 +120,114 @@
 	21, 21, 21, 21, 21, 21, 21, 21, 
 	21, 21, 32, 21, 34, 21, 36, 21, 
 	22, 21, 24, 24, 21, 25, 21, 26, 
-	21, 21, 21, 21, 21, 21, 21, 35, 
-	21, 21, 28, 21, 30, 21, 32, 33, 
-	34, 35, 36, 21, 22, 21, 24, 24, 
-	21, 25, 21, 26, 21, 21, 21, 21, 
-	21, 21, 21, 35, 21, 21, 28, 21, 
-	21, 21, 32, 33, 34, 35, 36, 21, 
-	22, 21, 24, 24, 21, 25, 21, 26, 
-	21, 21, 21, 21, 21, 21, 21, 35, 
-	21, 21, 28, 29, 30, 21, 32, 33, 
-	34, 35, 36, 21, 22, 23, 24, 24, 
-	21, 25, 21, 26, 21, 21, 21, 21, 
-	21, 21, 21, 27, 21, 21, 28, 29, 
-	30, 31, 32, 33, 34, 35, 36, 21, 
-	3, 3, 43, 5, 43, 43, 43, 43, 
-	43, 43, 43, 43, 43, 44, 43, 43, 
-	43, 43, 43, 43, 14, 43, 43, 43, 
-	18, 43, 3, 3, 43, 5, 43, 3, 
-	3, 43, 5, 43, 43, 43, 43, 43, 
-	43, 43, 43, 43, 43, 43, 43, 43, 
-	43, 43, 43, 14, 43, 43, 43, 18, 
-	43, 45, 43, 3, 3, 43, 5, 43, 
-	14, 43, 43, 43, 43, 43, 43, 43, 
-	46, 43, 43, 43, 43, 43, 43, 14, 
-	43, 3, 3, 43, 5, 43, 43, 43, 
-	43, 43, 43, 43, 43, 43, 46, 43, 
-	43, 43, 43, 43, 43, 14, 43, 3, 
-	3, 43, 5, 43, 43, 43, 43, 43, 
-	43, 43, 43, 43, 43, 43, 43, 43, 
-	43, 43, 43, 14, 43, 2, 43, 3, 
-	3, 43, 5, 43, 6, 43, 43, 43, 
-	43, 43, 43, 43, 47, 43, 43, 47, 
-	43, 43, 43, 14, 48, 43, 43, 18, 
-	43, 2, 43, 3, 3, 43, 5, 43, 
-	6, 43, 43, 43, 43, 43, 43, 43, 
-	43, 43, 43, 43, 43, 43, 43, 14, 
-	43, 43, 43, 18, 43, 2, 43, 3, 
-	3, 43, 5, 43, 6, 43, 43, 43, 
-	43, 43, 43, 43, 47, 43, 43, 43, 
-	43, 43, 43, 14, 48, 43, 43, 18, 
-	43, 2, 43, 3, 3, 43, 5, 43, 
-	6, 43, 43, 43, 43, 43, 43, 43, 
-	43, 43, 43, 43, 43, 43, 43, 14, 
-	48, 43, 43, 18, 43, 22, 23, 24, 
+	21, 21, 21, 21, 21, 21, 21, 21, 
+	21, 21, 21, 21, 21, 21, 32, 33, 
+	34, 35, 36, 43, 21, 22, 21, 24, 
 	24, 21, 25, 21, 26, 21, 21, 21, 
-	21, 21, 21, 21, 49, 21, 21, 28, 
-	29, 30, 31, 32, 33, 34, 35, 36, 
-	37, 21, 22, 50, 24, 24, 21, 25, 
+	21, 21, 21, 21, 43, 21, 21, 28, 
+	21, 30, 21, 32, 33, 34, 35, 36, 
+	21, 22, 21, 24, 24, 21, 25, 21, 
+	26, 21, 21, 21, 21, 21, 21, 21, 
+	43, 21, 21, 28, 21, 21, 21, 32, 
+	33, 34, 35, 36, 21, 22, 21, 24, 
+	24, 21, 25, 21, 26, 21, 21, 21, 
+	21, 21, 21, 21, 43, 21, 21, 28, 
+	29, 30, 21, 32, 33, 34, 35, 36, 
+	21, 22, 23, 24, 24, 21, 25, 21, 
+	26, 21, 21, 21, 21, 21, 21, 21, 
+	27, 21, 21, 28, 29, 30, 31, 32, 
+	33, 34, 35, 36, 21, 3, 3, 44, 
+	5, 44, 44, 44, 44, 44, 44, 44, 
+	44, 44, 45, 44, 44, 44, 44, 44, 
+	44, 14, 44, 44, 44, 18, 44, 3, 
+	3, 44, 5, 44, 3, 3, 44, 5, 
+	44, 44, 44, 44, 44, 44, 44, 44, 
+	44, 44, 44, 44, 44, 44, 44, 44, 
+	14, 44, 44, 44, 18, 44, 46, 44, 
+	3, 3, 44, 5, 44, 14, 44, 44, 
+	44, 44, 44, 44, 44, 47, 44, 44, 
+	44, 44, 44, 44, 14, 44, 3, 3, 
+	44, 5, 44, 44, 44, 44, 44, 44, 
+	44, 44, 44, 47, 44, 44, 44, 44, 
+	44, 44, 14, 44, 3, 3, 44, 5, 
+	44, 44, 44, 44, 44, 44, 44, 44, 
+	44, 44, 44, 44, 44, 44, 44, 44, 
+	14, 44, 2, 44, 3, 3, 44, 5, 
+	44, 6, 44, 44, 44, 44, 44, 44, 
+	44, 48, 44, 44, 48, 44, 44, 44, 
+	14, 49, 44, 44, 18, 44, 2, 44, 
+	3, 3, 44, 5, 44, 6, 44, 44, 
+	44, 44, 44, 44, 44, 44, 44, 44, 
+	44, 44, 44, 44, 14, 44, 44, 44, 
+	18, 44, 2, 44, 3, 3, 44, 5, 
+	44, 6, 44, 44, 44, 44, 44, 44, 
+	44, 48, 44, 44, 44, 44, 44, 44, 
+	14, 49, 44, 44, 18, 44, 2, 44, 
+	3, 3, 44, 5, 44, 6, 44, 44, 
+	44, 44, 44, 44, 44, 44, 44, 44, 
+	44, 44, 44, 44, 14, 49, 44, 44, 
+	18, 44, 22, 23, 24, 24, 21, 25, 
 	21, 26, 21, 21, 21, 21, 21, 21, 
-	21, 27, 21, 21, 28, 29, 30, 31, 
-	32, 33, 34, 35, 36, 21, 1, 1, 
-	2, 3, 3, 3, 43, 5, 43, 6, 
-	1, 43, 43, 43, 43, 1, 43, 8, 
-	43, 43, 10, 11, 12, 13, 14, 15, 
-	16, 17, 18, 19, 43, 1, 43, 2, 
-	43, 3, 3, 43, 5, 43, 6, 43, 
-	43, 43, 43, 43, 43, 43, 8, 43, 
-	43, 10, 11, 12, 13, 14, 15, 16, 
-	17, 18, 43, 2, 43, 3, 3, 43, 
-	5, 43, 6, 43, 43, 43, 43, 43, 
-	43, 43, 17, 43, 43, 43, 43, 43, 
-	43, 14, 15, 16, 17, 18, 43, 2, 
-	43, 3, 3, 43, 5, 43, 6, 43, 
-	43, 43, 43, 43, 43, 43, 43, 43, 
-	43, 43, 43, 43, 43, 14, 15, 16, 
-	17, 18, 43, 2, 43, 3, 3, 43, 
-	5, 43, 6, 43, 43, 43, 43, 43, 
-	43, 43, 43, 43, 43, 43, 43, 43, 
-	43, 14, 15, 16, 43, 18, 43, 2, 
-	43, 3, 3, 43, 5, 43, 6, 43, 
-	43, 43, 43, 43, 43, 43, 43, 43, 
-	43, 43, 43, 43, 43, 14, 43, 16, 
-	43, 18, 43, 2, 43, 3, 3, 43, 
-	5, 43, 6, 43, 43, 43, 43, 43, 
-	43, 43, 17, 43, 43, 10, 43, 12, 
-	43, 14, 15, 16, 17, 18, 43, 2, 
-	43, 3, 3, 43, 5, 43, 6, 43, 
-	43, 43, 43, 43, 43, 43, 17, 43, 
-	43, 10, 43, 43, 43, 14, 15, 16, 
-	17, 18, 43, 2, 43, 3, 3, 43, 
-	5, 43, 6, 43, 43, 43, 43, 43, 
-	43, 43, 17, 43, 43, 10, 11, 12, 
-	43, 14, 15, 16, 17, 18, 43, 2, 
-	3, 3, 3, 43, 5, 43, 6, 43, 
-	43, 43, 43, 43, 43, 43, 8, 43, 
-	43, 10, 11, 12, 13, 14, 15, 16, 
-	17, 18, 43, 1, 1, 51, 51, 51, 
-	51, 51, 51, 51, 51, 1, 51, 51, 
-	51, 51, 1, 51, 51, 51, 51, 51, 
-	51, 51, 51, 51, 51, 51, 51, 51, 
-	51, 51, 1, 51, 52, 51, 0
+	21, 50, 21, 21, 28, 29, 30, 31, 
+	32, 33, 34, 35, 36, 37, 21, 22, 
+	51, 24, 24, 21, 25, 21, 26, 21, 
+	21, 21, 21, 21, 21, 21, 27, 21, 
+	21, 28, 29, 30, 31, 32, 33, 34, 
+	35, 36, 21, 1, 1, 2, 3, 3, 
+	3, 44, 5, 44, 6, 1, 44, 44, 
+	44, 44, 1, 44, 8, 44, 44, 10, 
+	11, 12, 13, 14, 15, 16, 17, 18, 
+	19, 44, 1, 44, 2, 44, 3, 3, 
+	44, 5, 44, 6, 44, 44, 44, 44, 
+	44, 44, 44, 8, 44, 44, 10, 11, 
+	12, 13, 14, 15, 16, 17, 18, 44, 
+	2, 44, 3, 3, 44, 5, 44, 6, 
+	44, 44, 44, 44, 44, 44, 44, 52, 
+	44, 44, 44, 44, 44, 44, 14, 15, 
+	16, 17, 18, 44, 2, 44, 3, 3, 
+	44, 5, 44, 6, 44, 44, 44, 44, 
+	44, 44, 44, 44, 44, 44, 44, 44, 
+	44, 44, 14, 15, 16, 17, 18, 44, 
+	2, 44, 3, 3, 44, 5, 44, 6, 
+	44, 44, 44, 44, 44, 44, 44, 44, 
+	44, 44, 44, 44, 44, 44, 14, 15, 
+	16, 44, 18, 44, 2, 44, 3, 3, 
+	44, 5, 44, 6, 44, 44, 44, 44, 
+	44, 44, 44, 44, 44, 44, 44, 44, 
+	44, 44, 14, 44, 16, 44, 18, 44, 
+	2, 44, 3, 3, 44, 5, 44, 6, 
+	44, 44, 44, 44, 44, 44, 44, 44, 
+	44, 44, 44, 44, 44, 44, 14, 15, 
+	16, 17, 18, 52, 44, 2, 44, 3, 
+	3, 44, 5, 44, 6, 44, 44, 44, 
+	44, 44, 44, 44, 52, 44, 44, 10, 
+	44, 12, 44, 14, 15, 16, 17, 18, 
+	44, 2, 44, 3, 3, 44, 5, 44, 
+	6, 44, 44, 44, 44, 44, 44, 44, 
+	52, 44, 44, 10, 44, 44, 44, 14, 
+	15, 16, 17, 18, 44, 2, 44, 3, 
+	3, 44, 5, 44, 6, 44, 44, 44, 
+	44, 44, 44, 44, 52, 44, 44, 10, 
+	11, 12, 44, 14, 15, 16, 17, 18, 
+	44, 2, 3, 3, 3, 44, 5, 44, 
+	6, 44, 44, 44, 44, 44, 44, 44, 
+	8, 44, 44, 10, 11, 12, 13, 14, 
+	15, 16, 17, 18, 44, 1, 1, 53, 
+	53, 53, 53, 53, 53, 53, 53, 1, 
+	53, 53, 53, 53, 1, 53, 53, 53, 
+	53, 53, 53, 53, 53, 53, 53, 53, 
+	53, 53, 53, 53, 1, 53, 54, 53, 
+	0
 };
 
 static const char _myanmar_syllable_machine_trans_targs[] = {
-	0, 1, 22, 0, 0, 23, 29, 32, 
-	35, 44, 36, 40, 41, 42, 25, 38, 
-	39, 37, 28, 43, 45, 0, 2, 12, 
-	0, 3, 9, 13, 14, 18, 19, 20, 
-	5, 16, 17, 15, 8, 21, 4, 6, 
-	7, 10, 11, 0, 24, 26, 27, 30, 
-	31, 33, 34, 0, 0
+	0, 1, 23, 0, 0, 24, 30, 33, 
+	36, 46, 37, 42, 43, 44, 26, 39, 
+	40, 41, 29, 45, 47, 0, 2, 12, 
+	0, 3, 9, 13, 14, 19, 20, 21, 
+	5, 16, 17, 18, 8, 22, 4, 6, 
+	7, 10, 11, 15, 0, 25, 27, 28, 
+	31, 32, 34, 35, 38, 0, 0
 };
 
 static const char _myanmar_syllable_machine_trans_actions[] = {
@@ -227,8 +236,8 @@
 	0, 0, 0, 0, 0, 6, 0, 0, 
 	7, 0, 0, 0, 0, 0, 0, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
-	0, 0, 0, 8, 0, 0, 0, 0, 
-	0, 0, 0, 9, 10
+	0, 0, 0, 0, 8, 0, 0, 0, 
+	0, 0, 0, 0, 0, 9, 10
 };
 
 static const char _myanmar_syllable_machine_to_state_actions[] = {
@@ -237,7 +246,7 @@
 	0, 0, 0, 0, 0, 0, 0, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
-	0, 0, 0, 0, 0, 0
+	0, 0, 0, 0, 0, 0, 0, 0
 };
 
 static const char _myanmar_syllable_machine_from_state_actions[] = {
@@ -246,16 +255,16 @@
 	0, 0, 0, 0, 0, 0, 0, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
-	0, 0, 0, 0, 0, 0
+	0, 0, 0, 0, 0, 0, 0, 0
 };
 
 static const short _myanmar_syllable_machine_eof_trans[] = {
 	0, 22, 22, 22, 22, 22, 22, 22, 
 	22, 22, 22, 22, 22, 22, 22, 22, 
-	22, 22, 22, 22, 22, 22, 44, 44, 
-	44, 44, 44, 44, 44, 44, 44, 44, 
-	22, 22, 44, 44, 44, 44, 44, 44, 
-	44, 44, 44, 44, 52, 52
+	22, 22, 22, 22, 22, 22, 22, 45, 
+	45, 45, 45, 45, 45, 45, 45, 45, 
+	45, 22, 22, 45, 45, 45, 45, 45, 
+	45, 45, 45, 45, 45, 45, 54, 54
 };
 
 static const int myanmar_syllable_machine_start = 0;
@@ -289,7 +298,7 @@
   int cs;
   hb_glyph_info_t *info = buffer->info;
   
-#line 293 "hb-ot-shape-complex-myanmar-machine.hh"
+#line 302 "hb-ot-shape-complex-myanmar-machine.hh"
 	{
 	cs = myanmar_syllable_machine_start;
 	ts = 0;
@@ -306,7 +315,7 @@
   unsigned int last = 0;
   unsigned int syllable_serial = 1;
   
-#line 310 "hb-ot-shape-complex-myanmar-machine.hh"
+#line 319 "hb-ot-shape-complex-myanmar-machine.hh"
 	{
 	int _slen;
 	int _trans;
@@ -320,7 +329,7 @@
 #line 1 "NONE"
 	{ts = p;}
 	break;
-#line 324 "hb-ot-shape-complex-myanmar-machine.hh"
+#line 333 "hb-ot-shape-complex-myanmar-machine.hh"
 	}
 
 	_keys = _myanmar_syllable_machine_trans_keys + (cs<<1);
@@ -370,7 +379,7 @@
 #line 90 "hb-ot-shape-complex-myanmar-machine.rl"
 	{te = p;p--;{ found_syllable (non_myanmar_cluster); }}
 	break;
-#line 374 "hb-ot-shape-complex-myanmar-machine.hh"
+#line 383 "hb-ot-shape-complex-myanmar-machine.hh"
 	}
 
 _again:
@@ -379,7 +388,7 @@
 #line 1 "NONE"
 	{ts = 0;}
 	break;
-#line 383 "hb-ot-shape-complex-myanmar-machine.hh"
+#line 392 "hb-ot-shape-complex-myanmar-machine.hh"
 	}
 
 	if ( ++p != pe )

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-myanmar-machine.rl
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-myanmar-machine.rl	2018-03-07 21:52:46 UTC (rev 46876)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-myanmar-machine.rl	2018-03-07 22:32:14 UTC (rev 46877)
@@ -70,7 +70,7 @@
 c = C|Ra;			# is_consonant
 
 medial_group = MY? MR? MW? MH? As?;
-main_vowel_group = VPre* VAbv* VBlw* A* (DB As?)?;
+main_vowel_group = (VPre.VS?)* VAbv* VBlw* A* (DB As?)?;
 post_vowel_group = VPst MH? As* VAbv* A* (DB As?)?;
 pwo_tone_group = PT A* DB? As?;
 

Added: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-myanmar-private.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-myanmar-private.hh	                        (rev 0)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-myanmar-private.hh	2018-03-07 22:32:14 UTC (rev 46877)
@@ -0,0 +1,171 @@
+/*
+ * 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_MYANMAR_PRIVATE_HH
+#define HB_OT_SHAPE_COMPLEX_MYANMAR_PRIVATE_HH
+
+#include "hb-private.hh"
+
+#include "hb-ot-shape-complex-indic-private.hh"
+
+
+/* buffer var allocations */
+#define myanmar_category() indic_category() /* myanmar_category_t */
+#define myanmar_position() indic_position() /* myanmar_position_t */
+
+
+/* Note: This enum is duplicated in the -machine.rl source file.
+ * Not sure how to avoid duplication. */
+enum myanmar_category_t {
+  OT_As  = 18,  /* Asat */
+  OT_D0  = 20, /* Digit zero */
+  OT_DB  = OT_N, /* Dot below */
+  OT_GB  = OT_PLACEHOLDER,
+  OT_MH  = 21, /* Various consonant medial types */
+  OT_MR  = 22, /* Various consonant medial types */
+  OT_MW  = 23, /* Various consonant medial types */
+  OT_MY  = 24, /* Various consonant medial types */
+  OT_PT  = 25, /* Pwo and other tones */
+  OT_VAbv = 26,
+  OT_VBlw = 27,
+  OT_VPre = 28,
+  OT_VPst = 29,
+  OT_VS   = 30, /* Variation selectors */
+  OT_P    = 31, /* Punctuation */
+  OT_D    = 32, /* Digits except zero */
+};
+
+
+static inline void
+set_myanmar_properties (hb_glyph_info_t &info)
+{
+  hb_codepoint_t u = info.codepoint;
+  unsigned int type = hb_indic_get_categories (u);
+  indic_category_t cat = (indic_category_t) (type & 0x7Fu);
+  indic_position_t pos = (indic_position_t) (type >> 8);
+
+  /* Myanmar
+   * http://www.microsoft.com/typography/OpenTypeDev/myanmar/intro.htm#analyze
+   */
+  if (unlikely (hb_in_range<hb_codepoint_t> (u, 0xFE00u, 0xFE0Fu)))
+    cat = (indic_category_t) OT_VS;
+
+  switch (u)
+  {
+    case 0x104Eu:
+      cat = (indic_category_t) OT_C; /* The spec says C, IndicSyllableCategory doesn't have. */
+      break;
+
+    case 0x002Du: case 0x00A0u: case 0x00D7u: case 0x2012u:
+    case 0x2013u: case 0x2014u: case 0x2015u: case 0x2022u:
+    case 0x25CCu: case 0x25FBu: case 0x25FCu: case 0x25FDu:
+    case 0x25FEu:
+      cat = (indic_category_t) OT_GB;
+      break;
+
+    case 0x1004u: case 0x101Bu: case 0x105Au:
+      cat = (indic_category_t) OT_Ra;
+      break;
+
+    case 0x1032u: case 0x1036u:
+      cat = (indic_category_t) OT_A;
+      break;
+
+    case 0x1039u:
+      cat = (indic_category_t) OT_H;
+      break;
+
+    case 0x103Au:
+      cat = (indic_category_t) OT_As;
+      break;
+
+    case 0x1041u: case 0x1042u: case 0x1043u: case 0x1044u:
+    case 0x1045u: case 0x1046u: case 0x1047u: case 0x1048u:
+    case 0x1049u: case 0x1090u: case 0x1091u: case 0x1092u:
+    case 0x1093u: case 0x1094u: case 0x1095u: case 0x1096u:
+    case 0x1097u: case 0x1098u: case 0x1099u:
+      cat = (indic_category_t) OT_D;
+      break;
+
+    case 0x1040u:
+      cat = (indic_category_t) OT_D; /* XXX The spec says D0, but Uniscribe doesn't seem to do. */
+      break;
+
+    case 0x103Eu: case 0x1060u:
+      cat = (indic_category_t) OT_MH;
+      break;
+
+    case 0x103Cu:
+      cat = (indic_category_t) OT_MR;
+      break;
+
+    case 0x103Du: case 0x1082u:
+      cat = (indic_category_t) OT_MW;
+      break;
+
+    case 0x103Bu: case 0x105Eu: case 0x105Fu:
+      cat = (indic_category_t) OT_MY;
+      break;
+
+    case 0x1063u: case 0x1064u: case 0x1069u: case 0x106Au:
+    case 0x106Bu: case 0x106Cu: case 0x106Du: case 0xAA7Bu:
+      cat = (indic_category_t) OT_PT;
+      break;
+
+    case 0x1038u: case 0x1087u: case 0x1088u: case 0x1089u:
+    case 0x108Au: case 0x108Bu: case 0x108Cu: case 0x108Du:
+    case 0x108Fu: case 0x109Au: case 0x109Bu: case 0x109Cu:
+      cat = (indic_category_t) OT_SM;
+      break;
+
+    case 0x104Au: case 0x104Bu:
+      cat = (indic_category_t) OT_P;
+      break;
+
+    case 0xAA74u: case 0xAA75u: case 0xAA76u:
+      /* https://github.com/roozbehp/unicode-data/issues/3 */
+      cat = (indic_category_t) OT_C;
+      break;
+  }
+
+  if (cat == OT_M)
+  {
+    switch ((int) pos)
+    {
+      case POS_PRE_C:	cat = (indic_category_t) OT_VPre;
+			pos = POS_PRE_M;                  break;
+      case POS_ABOVE_C:	cat = (indic_category_t) OT_VAbv; break;
+      case POS_BELOW_C:	cat = (indic_category_t) OT_VBlw; break;
+      case POS_POST_C:	cat = (indic_category_t) OT_VPst; break;
+    }
+  }
+
+  info.myanmar_category() = (myanmar_category_t) cat;
+  info.myanmar_position() = pos;
+}
+
+
+#endif /* HB_OT_SHAPE_COMPLEX_MYANMAR_PRIVATE_HH */

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-03-07 21:52:46 UTC (rev 46876)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-myanmar.cc	2018-03-07 22:32:14 UTC (rev 46877)
@@ -24,13 +24,9 @@
  * Google Author(s): Behdad Esfahbod
  */
 
-#include "hb-ot-shape-complex-indic-private.hh"
+#include "hb-ot-shape-complex-myanmar-private.hh"
 
-/* buffer var allocations */
-#define myanmar_category() complex_var_u8_0() /* myanmar_category_t */
-#define myanmar_position() complex_var_u8_1() /* myanmar_position_t */
 
-
 /*
  * Myanmar shaper.
  */
@@ -127,153 +123,6 @@
 #include "hb-ot-shape-complex-myanmar-machine.hh"
 
 
-/* Note: This enum is duplicated in the -machine.rl source file.
- * Not sure how to avoid duplication. */
-enum myanmar_category_t {
-  OT_As  = 18,  /* Asat */
-  OT_D0  = 20, /* Digit zero */
-  OT_DB  = OT_N, /* Dot below */
-  OT_GB  = OT_PLACEHOLDER,
-  OT_MH  = 21, /* Various consonant medial types */
-  OT_MR  = 22, /* Various consonant medial types */
-  OT_MW  = 23, /* Various consonant medial types */
-  OT_MY  = 24, /* Various consonant medial types */
-  OT_PT  = 25, /* Pwo and other tones */
-  OT_VAbv = 26,
-  OT_VBlw = 27,
-  OT_VPre = 28,
-  OT_VPst = 29,
-  OT_VS   = 30, /* Variation selectors */
-  OT_P    = 31, /* Punctuation */
-  OT_D    = 32, /* Digits except zero */
-};
-
-
-static inline bool
-is_one_of (const hb_glyph_info_t &info, unsigned int flags)
-{
-  /* If it ligated, all bets are off. */
-  if (_hb_glyph_info_ligated (&info)) return false;
-  return !!(FLAG_UNSAFE (info.myanmar_category()) & flags);
-}
-
-static inline bool
-is_consonant (const hb_glyph_info_t &info)
-{
-  return is_one_of (info, CONSONANT_FLAGS);
-}
-
-
-static inline void
-set_myanmar_properties (hb_glyph_info_t &info)
-{
-  hb_codepoint_t u = info.codepoint;
-  unsigned int type = hb_indic_get_categories (u);
-  indic_category_t cat = (indic_category_t) (type & 0x7Fu);
-  indic_position_t pos = (indic_position_t) (type >> 8);
-
-  /* Myanmar
-   * http://www.microsoft.com/typography/OpenTypeDev/myanmar/intro.htm#analyze
-   */
-  if (unlikely (hb_in_range<hb_codepoint_t> (u, 0xFE00u, 0xFE0Fu)))
-    cat = (indic_category_t) OT_VS;
-
-  switch (u)
-  {
-    case 0x104Eu:
-      cat = (indic_category_t) OT_C; /* The spec says C, IndicSyllableCategory doesn't have. */
-      break;
-
-    case 0x002Du: case 0x00A0u: case 0x00D7u: case 0x2012u:
-    case 0x2013u: case 0x2014u: case 0x2015u: case 0x2022u:
-    case 0x25CCu: case 0x25FBu: case 0x25FCu: case 0x25FDu:
-    case 0x25FEu:
-      cat = (indic_category_t) OT_GB;
-      break;
-
-    case 0x1004u: case 0x101Bu: case 0x105Au:
-      cat = (indic_category_t) OT_Ra;
-      break;
-
-    case 0x1032u: case 0x1036u:
-      cat = (indic_category_t) OT_A;
-      break;
-
-    case 0x1039u:
-      cat = (indic_category_t) OT_H;
-      break;
-
-    case 0x103Au:
-      cat = (indic_category_t) OT_As;
-      break;
-
-    case 0x1041u: case 0x1042u: case 0x1043u: case 0x1044u:
-    case 0x1045u: case 0x1046u: case 0x1047u: case 0x1048u:
-    case 0x1049u: case 0x1090u: case 0x1091u: case 0x1092u:
-    case 0x1093u: case 0x1094u: case 0x1095u: case 0x1096u:
-    case 0x1097u: case 0x1098u: case 0x1099u:
-      cat = (indic_category_t) OT_D;
-      break;
-
-    case 0x1040u:
-      cat = (indic_category_t) OT_D; /* XXX The spec says D0, but Uniscribe doesn't seem to do. */
-      break;
-
-    case 0x103Eu: case 0x1060u:
-      cat = (indic_category_t) OT_MH;
-      break;
-
-    case 0x103Cu:
-      cat = (indic_category_t) OT_MR;
-      break;
-
-    case 0x103Du: case 0x1082u:
-      cat = (indic_category_t) OT_MW;
-      break;
-
-    case 0x103Bu: case 0x105Eu: case 0x105Fu:
-      cat = (indic_category_t) OT_MY;
-      break;
-
-    case 0x1063u: case 0x1064u: case 0x1069u: case 0x106Au:
-    case 0x106Bu: case 0x106Cu: case 0x106Du: case 0xAA7Bu:
-      cat = (indic_category_t) OT_PT;
-      break;
-
-    case 0x1038u: case 0x1087u: case 0x1088u: case 0x1089u:
-    case 0x108Au: case 0x108Bu: case 0x108Cu: case 0x108Du:
-    case 0x108Fu: case 0x109Au: case 0x109Bu: case 0x109Cu:
-      cat = (indic_category_t) OT_SM;
-      break;
-
-    case 0x104Au: case 0x104Bu:
-      cat = (indic_category_t) OT_P;
-      break;
-
-    case 0xAA74u: case 0xAA75u: case 0xAA76u:
-      /* https://github.com/roozbehp/unicode-data/issues/3 */
-      cat = (indic_category_t) OT_C;
-      break;
-  }
-
-  if (cat == OT_M)
-  {
-    switch ((int) pos)
-    {
-      case POS_PRE_C:	cat = (indic_category_t) OT_VPre;
-			pos = POS_PRE_M;                  break;
-      case POS_ABOVE_C:	cat = (indic_category_t) OT_VAbv; break;
-      case POS_BELOW_C:	cat = (indic_category_t) OT_VBlw; break;
-      case POS_POST_C:	cat = (indic_category_t) OT_VPst; break;
-    }
-  }
-
-  info.myanmar_category() = (myanmar_category_t) cat;
-  info.myanmar_position() = pos;
-}
-
-
-
 static void
 setup_masks_myanmar (const hb_ot_shape_plan_t *plan HB_UNUSED,
 		   hb_buffer_t              *buffer,
@@ -374,6 +223,11 @@
       {
 	continue;
       }
+      if (info[i].myanmar_category() == OT_VS)
+      {
+	info[i].myanmar_position() = info[i - 1].myanmar_position();
+	continue;
+      }
 
       if (pos == POS_AFTER_MAIN && info[i].myanmar_category() == OT_VBlw)
       {

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-use-machine.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-use-machine.hh	2018-03-07 21:52:46 UTC (rev 46876)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-use-machine.hh	2018-03-07 22:32:14 UTC (rev 46877)
@@ -36,245 +36,243 @@
 
 #line 38 "hb-ot-shape-complex-use-machine.hh"
 static const unsigned char _use_syllable_machine_trans_keys[] = {
-	1u, 1u, 12u, 12u, 1u, 15u, 1u, 15u, 1u, 1u, 12u, 12u, 0u, 43u, 21u, 21u, 
-	8u, 39u, 8u, 39u, 1u, 15u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 26u, 8u, 26u, 
-	8u, 26u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 
-	8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 13u, 21u, 4u, 4u, 13u, 13u, 
-	8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 26u, 8u, 26u, 8u, 26u, 8u, 39u, 
+	12u, 12u, 1u, 15u, 1u, 1u, 12u, 12u, 0u, 43u, 21u, 21u, 8u, 39u, 8u, 39u, 
+	1u, 15u, 1u, 1u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 26u, 8u, 26u, 8u, 26u, 
 	8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 
-	8u, 39u, 8u, 39u, 1u, 15u, 12u, 12u, 1u, 39u, 8u, 39u, 21u, 42u, 41u, 42u, 
-	42u, 42u, 1u, 5u, 0
+	8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 13u, 21u, 4u, 4u, 13u, 13u, 8u, 39u, 
+	8u, 39u, 8u, 39u, 8u, 39u, 8u, 26u, 8u, 26u, 8u, 26u, 8u, 39u, 8u, 39u, 
+	8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 
+	8u, 39u, 1u, 15u, 12u, 12u, 1u, 39u, 8u, 39u, 21u, 42u, 41u, 42u, 42u, 42u, 
+	1u, 5u, 0
 };
 
 static const char _use_syllable_machine_key_spans[] = {
-	1, 1, 15, 15, 1, 1, 44, 1, 
-	32, 32, 15, 32, 32, 32, 19, 19, 
-	19, 32, 32, 32, 32, 32, 32, 32, 
-	32, 32, 32, 32, 32, 9, 1, 1, 
-	32, 32, 32, 32, 19, 19, 19, 32, 
+	1, 15, 1, 1, 44, 1, 32, 32, 
+	15, 1, 32, 32, 32, 19, 19, 19, 
 	32, 32, 32, 32, 32, 32, 32, 32, 
-	32, 32, 15, 1, 39, 32, 22, 2, 
-	1, 5
+	32, 32, 32, 32, 9, 1, 1, 32, 
+	32, 32, 32, 19, 19, 19, 32, 32, 
+	32, 32, 32, 32, 32, 32, 32, 32, 
+	32, 15, 1, 39, 32, 22, 2, 1, 
+	5
 };
 
 static const short _use_syllable_machine_index_offsets[] = {
-	0, 2, 4, 20, 36, 38, 40, 85, 
-	87, 120, 153, 169, 202, 235, 268, 288, 
-	308, 328, 361, 394, 427, 460, 493, 526, 
-	559, 592, 625, 658, 691, 724, 734, 736, 
-	738, 771, 804, 837, 870, 890, 910, 930, 
-	963, 996, 1029, 1062, 1095, 1128, 1161, 1194, 
-	1227, 1260, 1293, 1309, 1311, 1351, 1384, 1407, 
-	1410, 1412
+	0, 2, 18, 20, 22, 67, 69, 102, 
+	135, 151, 153, 186, 219, 252, 272, 292, 
+	312, 345, 378, 411, 444, 477, 510, 543, 
+	576, 609, 642, 675, 708, 718, 720, 722, 
+	755, 788, 821, 854, 874, 894, 914, 947, 
+	980, 1013, 1046, 1079, 1112, 1145, 1178, 1211, 
+	1244, 1277, 1293, 1295, 1335, 1368, 1391, 1394, 
+	1396
 };
 
 static const char _use_syllable_machine_indicies[] = {
-	1, 0, 3, 2, 1, 2, 2, 2, 
+	1, 0, 3, 2, 2, 2, 2, 2, 
 	2, 2, 2, 2, 2, 2, 2, 2, 
-	2, 2, 4, 2, 5, 0, 0, 0, 
-	0, 0, 0, 0, 0, 0, 0, 0, 
-	0, 0, 6, 0, 5, 0, 8, 7, 
-	9, 10, 11, 9, 12, 10, 11, 11, 
-	13, 11, 11, 5, 14, 11, 11, 15, 
-	9, 9, 16, 17, 11, 11, 18, 19, 
-	20, 21, 22, 23, 24, 18, 25, 26, 
-	27, 28, 29, 30, 11, 31, 32, 33, 
-	11, 11, 11, 34, 11, 36, 35, 38, 
-	37, 37, 1, 39, 37, 37, 40, 37, 
-	37, 37, 37, 37, 41, 42, 43, 44, 
-	45, 46, 47, 48, 42, 49, 41, 50, 
-	51, 52, 53, 37, 54, 55, 56, 37, 
-	38, 37, 37, 1, 39, 37, 37, 40, 
-	37, 37, 37, 37, 37, 57, 42, 43, 
-	44, 45, 46, 47, 48, 42, 49, 50, 
-	50, 51, 52, 53, 37, 54, 55, 56, 
-	37, 1, 58, 58, 58, 58, 58, 58, 
-	58, 58, 58, 58, 58, 58, 58, 4, 
-	58, 38, 37, 37, 1, 39, 37, 37, 
-	40, 37, 37, 37, 37, 37, 37, 42, 
-	43, 44, 45, 46, 47, 48, 42, 49, 
-	50, 50, 51, 52, 53, 37, 54, 55, 
-	56, 37, 38, 37, 37, 37, 37, 37, 
-	37, 37, 37, 37, 37, 37, 37, 37, 
-	42, 43, 44, 45, 46, 37, 37, 37, 
-	37, 37, 37, 51, 52, 53, 37, 54, 
-	55, 56, 37, 38, 37, 37, 37, 37, 
-	37, 37, 37, 37, 37, 37, 37, 37, 
-	37, 37, 43, 44, 45, 46, 37, 37, 
-	37, 37, 37, 37, 37, 37, 37, 37, 
-	54, 55, 56, 37, 38, 37, 37, 37, 
-	37, 37, 37, 37, 37, 37, 37, 37, 
-	37, 37, 37, 37, 44, 45, 46, 37, 
-	38, 37, 37, 37, 37, 37, 37, 37, 
-	37, 37, 37, 37, 37, 37, 37, 37, 
-	37, 45, 46, 37, 38, 37, 37, 37, 
-	37, 37, 37, 37, 37, 37, 37, 37, 
-	37, 37, 37, 37, 37, 37, 46, 37, 
-	38, 37, 37, 37, 37, 37, 37, 37, 
-	37, 37, 37, 37, 37, 37, 37, 37, 
-	44, 45, 46, 37, 37, 37, 37, 37, 
-	37, 37, 37, 37, 37, 54, 55, 56, 
-	37, 38, 37, 37, 37, 37, 37, 37, 
-	37, 37, 37, 37, 37, 37, 37, 37, 
-	37, 44, 45, 46, 37, 37, 37, 37, 
-	37, 37, 37, 37, 37, 37, 37, 55, 
-	56, 37, 38, 37, 37, 37, 37, 37, 
-	37, 37, 37, 37, 37, 37, 37, 37, 
-	37, 37, 44, 45, 46, 37, 37, 37, 
-	37, 37, 37, 37, 37, 37, 37, 37, 
-	37, 56, 37, 38, 37, 37, 37, 37, 
-	37, 37, 37, 37, 37, 37, 37, 37, 
-	37, 37, 43, 44, 45, 46, 37, 37, 
-	37, 37, 37, 37, 51, 52, 53, 37, 
-	54, 55, 56, 37, 38, 37, 37, 37, 
-	37, 37, 37, 37, 37, 37, 37, 37, 
-	37, 37, 37, 43, 44, 45, 46, 37, 
-	37, 37, 37, 37, 37, 37, 52, 53, 
-	37, 54, 55, 56, 37, 38, 37, 37, 
-	37, 37, 37, 37, 37, 37, 37, 37, 
-	37, 37, 37, 37, 43, 44, 45, 46, 
-	37, 37, 37, 37, 37, 37, 37, 37, 
-	53, 37, 54, 55, 56, 37, 38, 37, 
-	37, 37, 37, 37, 37, 37, 37, 37, 
-	37, 37, 37, 37, 42, 43, 44, 45, 
-	46, 37, 48, 42, 37, 37, 37, 51, 
-	52, 53, 37, 54, 55, 56, 37, 38, 
-	37, 37, 37, 37, 37, 37, 37, 37, 
-	37, 37, 37, 37, 37, 42, 43, 44, 
-	45, 46, 37, 59, 42, 37, 37, 37, 
-	51, 52, 53, 37, 54, 55, 56, 37, 
-	38, 37, 37, 37, 37, 37, 37, 37, 
-	37, 37, 37, 37, 37, 37, 42, 43, 
-	44, 45, 46, 37, 37, 42, 37, 37, 
-	37, 51, 52, 53, 37, 54, 55, 56, 
-	37, 38, 37, 37, 37, 37, 37, 37, 
-	37, 37, 37, 37, 37, 37, 37, 42, 
-	43, 44, 45, 46, 47, 48, 42, 37, 
-	37, 37, 51, 52, 53, 37, 54, 55, 
-	56, 37, 38, 37, 37, 1, 39, 37, 
-	37, 40, 37, 37, 37, 37, 37, 37, 
-	42, 43, 44, 45, 46, 47, 48, 42, 
-	49, 37, 50, 51, 52, 53, 37, 54, 
-	55, 56, 37, 38, 37, 37, 1, 39, 
-	37, 37, 40, 37, 37, 37, 37, 37, 
-	37, 42, 43, 44, 45, 46, 47, 48, 
-	42, 49, 41, 50, 51, 52, 53, 37, 
-	54, 55, 56, 37, 61, 60, 60, 60, 
-	60, 60, 60, 60, 62, 60, 12, 63, 
-	61, 60, 13, 64, 64, 5, 8, 64, 
-	64, 65, 64, 64, 64, 64, 64, 66, 
-	18, 19, 20, 21, 22, 23, 24, 18, 
-	25, 27, 27, 28, 29, 30, 64, 31, 
-	32, 33, 64, 13, 64, 64, 5, 8, 
-	64, 64, 65, 64, 64, 64, 64, 64, 
-	64, 18, 19, 20, 21, 22, 23, 24, 
-	18, 25, 27, 27, 28, 29, 30, 64, 
-	31, 32, 33, 64, 13, 64, 64, 64, 
-	64, 64, 64, 64, 64, 64, 64, 64, 
-	64, 64, 18, 19, 20, 21, 22, 64, 
-	64, 64, 64, 64, 64, 28, 29, 30, 
-	64, 31, 32, 33, 64, 13, 64, 64, 
-	64, 64, 64, 64, 64, 64, 64, 64, 
-	64, 64, 64, 64, 19, 20, 21, 22, 
-	64, 64, 64, 64, 64, 64, 64, 64, 
-	64, 64, 31, 32, 33, 64, 13, 64, 
-	64, 64, 64, 64, 64, 64, 64, 64, 
-	64, 64, 64, 64, 64, 64, 20, 21, 
-	22, 64, 13, 64, 64, 64, 64, 64, 
-	64, 64, 64, 64, 64, 64, 64, 64, 
-	64, 64, 64, 21, 22, 64, 13, 64, 
-	64, 64, 64, 64, 64, 64, 64, 64, 
-	64, 64, 64, 64, 64, 64, 64, 64, 
-	22, 64, 13, 64, 64, 64, 64, 64, 
-	64, 64, 64, 64, 64, 64, 64, 64, 
-	64, 64, 20, 21, 22, 64, 64, 64, 
-	64, 64, 64, 64, 64, 64, 64, 31, 
-	32, 33, 64, 13, 64, 64, 64, 64, 
-	64, 64, 64, 64, 64, 64, 64, 64, 
-	64, 64, 64, 20, 21, 22, 64, 64, 
-	64, 64, 64, 64, 64, 64, 64, 64, 
-	64, 32, 33, 64, 13, 64, 64, 64, 
-	64, 64, 64, 64, 64, 64, 64, 64, 
-	64, 64, 64, 64, 20, 21, 22, 64, 
-	64, 64, 64, 64, 64, 64, 64, 64, 
-	64, 64, 64, 33, 64, 13, 64, 64, 
-	64, 64, 64, 64, 64, 64, 64, 64, 
-	64, 64, 64, 64, 19, 20, 21, 22, 
-	64, 64, 64, 64, 64, 64, 28, 29, 
-	30, 64, 31, 32, 33, 64, 13, 64, 
-	64, 64, 64, 64, 64, 64, 64, 64, 
-	64, 64, 64, 64, 64, 19, 20, 21, 
-	22, 64, 64, 64, 64, 64, 64, 64, 
-	29, 30, 64, 31, 32, 33, 64, 13, 
-	64, 64, 64, 64, 64, 64, 64, 64, 
-	64, 64, 64, 64, 64, 64, 19, 20, 
-	21, 22, 64, 64, 64, 64, 64, 64, 
-	64, 64, 30, 64, 31, 32, 33, 64, 
-	13, 64, 64, 64, 64, 64, 64, 64, 
-	64, 64, 64, 64, 64, 64, 18, 19, 
-	20, 21, 22, 64, 24, 18, 64, 64, 
-	64, 28, 29, 30, 64, 31, 32, 33, 
-	64, 13, 64, 64, 64, 64, 64, 64, 
-	64, 64, 64, 64, 64, 64, 64, 18, 
-	19, 20, 21, 22, 64, 67, 18, 64, 
-	64, 64, 28, 29, 30, 64, 31, 32, 
-	33, 64, 13, 64, 64, 64, 64, 64, 
-	64, 64, 64, 64, 64, 64, 64, 64, 
-	18, 19, 20, 21, 22, 64, 64, 18, 
-	64, 64, 64, 28, 29, 30, 64, 31, 
-	32, 33, 64, 13, 64, 64, 64, 64, 
-	64, 64, 64, 64, 64, 64, 64, 64, 
-	64, 18, 19, 20, 21, 22, 23, 24, 
-	18, 64, 64, 64, 28, 29, 30, 64, 
-	31, 32, 33, 64, 13, 64, 64, 5, 
-	8, 64, 64, 65, 64, 64, 64, 64, 
-	64, 64, 18, 19, 20, 21, 22, 23, 
-	24, 18, 25, 64, 27, 28, 29, 30, 
-	64, 31, 32, 33, 64, 5, 68, 68, 
+	4, 2, 3, 2, 6, 5, 7, 8, 
+	9, 7, 10, 8, 9, 9, 11, 9, 
+	9, 3, 12, 9, 9, 13, 7, 7, 
+	14, 15, 9, 9, 16, 17, 18, 19, 
+	20, 21, 22, 16, 23, 24, 25, 26, 
+	27, 28, 9, 29, 30, 31, 9, 9, 
+	9, 32, 9, 34, 33, 36, 35, 35, 
+	37, 1, 35, 35, 38, 35, 35, 35, 
+	35, 35, 39, 40, 41, 42, 43, 44, 
+	45, 46, 40, 47, 39, 48, 49, 50, 
+	51, 35, 52, 53, 54, 35, 36, 35, 
+	35, 37, 1, 35, 35, 38, 35, 35, 
+	35, 35, 35, 55, 40, 41, 42, 43, 
+	44, 45, 46, 40, 47, 48, 48, 49, 
+	50, 51, 35, 52, 53, 54, 35, 37, 
+	56, 56, 56, 56, 56, 56, 56, 56, 
+	56, 56, 56, 56, 56, 57, 56, 37, 
+	56, 36, 35, 35, 37, 1, 35, 35, 
+	38, 35, 35, 35, 35, 35, 35, 40, 
+	41, 42, 43, 44, 45, 46, 40, 47, 
+	48, 48, 49, 50, 51, 35, 52, 53, 
+	54, 35, 36, 35, 35, 35, 35, 35, 
+	35, 35, 35, 35, 35, 35, 35, 35, 
+	40, 41, 42, 43, 44, 35, 35, 35, 
+	35, 35, 35, 49, 50, 51, 35, 52, 
+	53, 54, 35, 36, 35, 35, 35, 35, 
+	35, 35, 35, 35, 35, 35, 35, 35, 
+	35, 35, 41, 42, 43, 44, 35, 35, 
+	35, 35, 35, 35, 35, 35, 35, 35, 
+	52, 53, 54, 35, 36, 35, 35, 35, 
+	35, 35, 35, 35, 35, 35, 35, 35, 
+	35, 35, 35, 35, 42, 43, 44, 35, 
+	36, 35, 35, 35, 35, 35, 35, 35, 
+	35, 35, 35, 35, 35, 35, 35, 35, 
+	35, 43, 44, 35, 36, 35, 35, 35, 
+	35, 35, 35, 35, 35, 35, 35, 35, 
+	35, 35, 35, 35, 35, 35, 44, 35, 
+	36, 35, 35, 35, 35, 35, 35, 35, 
+	35, 35, 35, 35, 35, 35, 35, 35, 
+	42, 43, 44, 35, 35, 35, 35, 35, 
+	35, 35, 35, 35, 35, 52, 53, 54, 
+	35, 36, 35, 35, 35, 35, 35, 35, 
+	35, 35, 35, 35, 35, 35, 35, 35, 
+	35, 42, 43, 44, 35, 35, 35, 35, 
+	35, 35, 35, 35, 35, 35, 35, 53, 
+	54, 35, 36, 35, 35, 35, 35, 35, 
+	35, 35, 35, 35, 35, 35, 35, 35, 
+	35, 35, 42, 43, 44, 35, 35, 35, 
+	35, 35, 35, 35, 35, 35, 35, 35, 
+	35, 54, 35, 36, 35, 35, 35, 35, 
+	35, 35, 35, 35, 35, 35, 35, 35, 
+	35, 35, 41, 42, 43, 44, 35, 35, 
+	35, 35, 35, 35, 49, 50, 51, 35, 
+	52, 53, 54, 35, 36, 35, 35, 35, 
+	35, 35, 35, 35, 35, 35, 35, 35, 
+	35, 35, 35, 41, 42, 43, 44, 35, 
+	35, 35, 35, 35, 35, 35, 50, 51, 
+	35, 52, 53, 54, 35, 36, 35, 35, 
+	35, 35, 35, 35, 35, 35, 35, 35, 
+	35, 35, 35, 35, 41, 42, 43, 44, 
+	35, 35, 35, 35, 35, 35, 35, 35, 
+	51, 35, 52, 53, 54, 35, 36, 35, 
+	35, 35, 35, 35, 35, 35, 35, 35, 
+	35, 35, 35, 35, 40, 41, 42, 43, 
+	44, 35, 46, 40, 35, 35, 35, 49, 
+	50, 51, 35, 52, 53, 54, 35, 36, 
+	35, 35, 35, 35, 35, 35, 35, 35, 
+	35, 35, 35, 35, 35, 40, 41, 42, 
+	43, 44, 35, 58, 40, 35, 35, 35, 
+	49, 50, 51, 35, 52, 53, 54, 35, 
+	36, 35, 35, 35, 35, 35, 35, 35, 
+	35, 35, 35, 35, 35, 35, 40, 41, 
+	42, 43, 44, 35, 35, 40, 35, 35, 
+	35, 49, 50, 51, 35, 52, 53, 54, 
+	35, 36, 35, 35, 35, 35, 35, 35, 
+	35, 35, 35, 35, 35, 35, 35, 40, 
+	41, 42, 43, 44, 45, 46, 40, 35, 
+	35, 35, 49, 50, 51, 35, 52, 53, 
+	54, 35, 36, 35, 35, 37, 1, 35, 
+	35, 38, 35, 35, 35, 35, 35, 35, 
+	40, 41, 42, 43, 44, 45, 46, 40, 
+	47, 35, 48, 49, 50, 51, 35, 52, 
+	53, 54, 35, 36, 35, 35, 37, 1, 
+	35, 35, 38, 35, 35, 35, 35, 35, 
+	35, 40, 41, 42, 43, 44, 45, 46, 
+	40, 47, 39, 48, 49, 50, 51, 35, 
+	52, 53, 54, 35, 60, 59, 59, 59, 
+	59, 59, 59, 59, 61, 59, 10, 62, 
+	60, 59, 11, 63, 63, 3, 6, 63, 
+	63, 64, 63, 63, 63, 63, 63, 65, 
+	16, 17, 18, 19, 20, 21, 22, 16, 
+	23, 25, 25, 26, 27, 28, 63, 29, 
+	30, 31, 63, 11, 63, 63, 3, 6, 
+	63, 63, 64, 63, 63, 63, 63, 63, 
+	63, 16, 17, 18, 19, 20, 21, 22, 
+	16, 23, 25, 25, 26, 27, 28, 63, 
+	29, 30, 31, 63, 11, 63, 63, 63, 
+	63, 63, 63, 63, 63, 63, 63, 63, 
+	63, 63, 16, 17, 18, 19, 20, 63, 
+	63, 63, 63, 63, 63, 26, 27, 28, 
+	63, 29, 30, 31, 63, 11, 63, 63, 
+	63, 63, 63, 63, 63, 63, 63, 63, 
+	63, 63, 63, 63, 17, 18, 19, 20, 
+	63, 63, 63, 63, 63, 63, 63, 63, 
+	63, 63, 29, 30, 31, 63, 11, 63, 
+	63, 63, 63, 63, 63, 63, 63, 63, 
+	63, 63, 63, 63, 63, 63, 18, 19, 
+	20, 63, 11, 63, 63, 63, 63, 63, 
+	63, 63, 63, 63, 63, 63, 63, 63, 
+	63, 63, 63, 19, 20, 63, 11, 63, 
+	63, 63, 63, 63, 63, 63, 63, 63, 
+	63, 63, 63, 63, 63, 63, 63, 63, 
+	20, 63, 11, 63, 63, 63, 63, 63, 
+	63, 63, 63, 63, 63, 63, 63, 63, 
+	63, 63, 18, 19, 20, 63, 63, 63, 
+	63, 63, 63, 63, 63, 63, 63, 29, 
+	30, 31, 63, 11, 63, 63, 63, 63, 
+	63, 63, 63, 63, 63, 63, 63, 63, 
+	63, 63, 63, 18, 19, 20, 63, 63, 
+	63, 63, 63, 63, 63, 63, 63, 63, 
+	63, 30, 31, 63, 11, 63, 63, 63, 
+	63, 63, 63, 63, 63, 63, 63, 63, 
+	63, 63, 63, 63, 18, 19, 20, 63, 
+	63, 63, 63, 63, 63, 63, 63, 63, 
+	63, 63, 63, 31, 63, 11, 63, 63, 
+	63, 63, 63, 63, 63, 63, 63, 63, 
+	63, 63, 63, 63, 17, 18, 19, 20, 
+	63, 63, 63, 63, 63, 63, 26, 27, 
+	28, 63, 29, 30, 31, 63, 11, 63, 
+	63, 63, 63, 63, 63, 63, 63, 63, 
+	63, 63, 63, 63, 63, 17, 18, 19, 
+	20, 63, 63, 63, 63, 63, 63, 63, 
+	27, 28, 63, 29, 30, 31, 63, 11, 
+	63, 63, 63, 63, 63, 63, 63, 63, 
+	63, 63, 63, 63, 63, 63, 17, 18, 
+	19, 20, 63, 63, 63, 63, 63, 63, 
+	63, 63, 28, 63, 29, 30, 31, 63, 
+	11, 63, 63, 63, 63, 63, 63, 63, 
+	63, 63, 63, 63, 63, 63, 16, 17, 
+	18, 19, 20, 63, 22, 16, 63, 63, 
+	63, 26, 27, 28, 63, 29, 30, 31, 
+	63, 11, 63, 63, 63, 63, 63, 63, 
+	63, 63, 63, 63, 63, 63, 63, 16, 
+	17, 18, 19, 20, 63, 66, 16, 63, 
+	63, 63, 26, 27, 28, 63, 29, 30, 
+	31, 63, 11, 63, 63, 63, 63, 63, 
+	63, 63, 63, 63, 63, 63, 63, 63, 
+	16, 17, 18, 19, 20, 63, 63, 16, 
+	63, 63, 63, 26, 27, 28, 63, 29, 
+	30, 31, 63, 11, 63, 63, 63, 63, 
+	63, 63, 63, 63, 63, 63, 63, 63, 
+	63, 16, 17, 18, 19, 20, 21, 22, 
+	16, 63, 63, 63, 26, 27, 28, 63, 
+	29, 30, 31, 63, 11, 63, 63, 3, 
+	6, 63, 63, 64, 63, 63, 63, 63, 
+	63, 63, 16, 17, 18, 19, 20, 21, 
+	22, 16, 23, 63, 25, 26, 27, 28, 
+	63, 29, 30, 31, 63, 3, 67, 67, 
+	67, 67, 67, 67, 67, 67, 67, 67, 
+	67, 67, 67, 4, 67, 6, 67, 8, 
+	63, 63, 63, 8, 63, 63, 11, 63, 
+	63, 3, 6, 63, 63, 64, 63, 63, 
+	63, 63, 63, 63, 16, 17, 18, 19, 
+	20, 21, 22, 16, 23, 24, 25, 26, 
+	27, 28, 63, 29, 30, 31, 63, 11, 
+	63, 63, 3, 6, 63, 63, 64, 63, 
+	63, 63, 63, 63, 63, 16, 17, 18, 
+	19, 20, 21, 22, 16, 23, 24, 25, 
+	26, 27, 28, 63, 29, 30, 31, 63, 
+	69, 68, 68, 68, 68, 68, 68, 68, 
 	68, 68, 68, 68, 68, 68, 68, 68, 
-	68, 68, 68, 6, 68, 8, 68, 10, 
-	64, 64, 64, 10, 64, 64, 13, 64, 
-	64, 5, 8, 64, 64, 65, 64, 64, 
-	64, 64, 64, 64, 18, 19, 20, 21, 
-	22, 23, 24, 18, 25, 26, 27, 28, 
-	29, 30, 64, 31, 32, 33, 64, 13, 
-	64, 64, 5, 8, 64, 64, 65, 64, 
-	64, 64, 64, 64, 64, 18, 19, 20, 
-	21, 22, 23, 24, 18, 25, 26, 27, 
-	28, 29, 30, 64, 31, 32, 33, 64, 
-	70, 69, 69, 69, 69, 69, 69, 69, 
-	69, 69, 69, 69, 69, 69, 69, 69, 
-	69, 69, 69, 69, 70, 71, 69, 70, 
-	71, 69, 71, 69, 10, 68, 68, 68, 
-	10, 68, 0
+	68, 68, 68, 68, 69, 70, 68, 69, 
+	70, 68, 70, 68, 8, 67, 67, 67, 
+	8, 67, 0
 };
 
 static const char _use_syllable_machine_trans_targs[] = {
-	6, 9, 6, 2, 0, 32, 4, 6, 
-	3, 7, 8, 6, 29, 6, 50, 51, 
-	52, 54, 34, 35, 36, 37, 38, 45, 
-	46, 48, 53, 49, 42, 43, 44, 39, 
-	40, 41, 57, 6, 6, 6, 6, 10, 
-	1, 28, 12, 13, 14, 15, 16, 23, 
-	24, 26, 27, 20, 21, 22, 17, 18, 
-	19, 11, 6, 25, 6, 30, 31, 6, 
-	6, 5, 33, 47, 6, 6, 55, 56
+	4, 8, 4, 31, 2, 4, 1, 5, 
+	6, 4, 28, 4, 49, 50, 51, 53, 
+	33, 34, 35, 36, 37, 44, 45, 47, 
+	52, 48, 41, 42, 43, 38, 39, 40, 
+	56, 4, 4, 4, 4, 7, 0, 27, 
+	11, 12, 13, 14, 15, 22, 23, 25, 
+	26, 19, 20, 21, 16, 17, 18, 10, 
+	4, 9, 24, 4, 29, 30, 4, 4, 
+	3, 32, 46, 4, 4, 54, 55
 };
 
 static const char _use_syllable_machine_trans_actions[] = {
-	1, 2, 3, 0, 0, 4, 0, 5, 
-	0, 0, 2, 8, 0, 9, 10, 10, 
-	4, 0, 0, 0, 0, 0, 0, 0, 
-	0, 0, 4, 4, 0, 0, 0, 0, 
-	0, 0, 0, 11, 12, 13, 14, 15, 
-	0, 2, 0, 0, 0, 0, 0, 0, 
-	0, 0, 2, 0, 0, 0, 0, 0, 
-	0, 2, 16, 0, 17, 0, 0, 18, 
-	19, 0, 4, 0, 20, 21, 0, 0
+	1, 0, 2, 3, 0, 4, 0, 0, 
+	7, 8, 0, 9, 10, 10, 3, 0, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	3, 3, 0, 0, 0, 0, 0, 0, 
+	0, 11, 12, 13, 14, 7, 0, 7, 
+	0, 0, 0, 0, 0, 0, 0, 0, 
+	7, 0, 0, 0, 0, 0, 0, 7, 
+	15, 0, 0, 16, 0, 0, 17, 18, 
+	0, 3, 0, 19, 20, 0, 0
 };
 
 static const char _use_syllable_machine_to_state_actions[] = {
-	0, 0, 0, 0, 0, 0, 6, 0, 
+	0, 0, 0, 0, 5, 0, 0, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
@@ -281,11 +279,11 @@
 	0, 0, 0, 0, 0, 0, 0, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
-	0, 0
+	0
 };
 
 static const char _use_syllable_machine_from_state_actions[] = {
-	0, 0, 0, 0, 0, 0, 7, 0, 
+	0, 0, 0, 0, 6, 0, 0, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
@@ -292,25 +290,25 @@
 	0, 0, 0, 0, 0, 0, 0, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
 	0, 0, 0, 0, 0, 0, 0, 0, 
-	0, 0
+	0
 };
 
 static const short _use_syllable_machine_eof_trans[] = {
-	1, 3, 3, 1, 1, 8, 0, 36, 
-	38, 38, 59, 38, 38, 38, 38, 38, 
-	38, 38, 38, 38, 38, 38, 38, 38, 
-	38, 38, 38, 38, 38, 61, 64, 61, 
-	65, 65, 65, 65, 65, 65, 65, 65, 
-	65, 65, 65, 65, 65, 65, 65, 65, 
-	65, 65, 69, 69, 65, 65, 70, 70, 
-	70, 69
+	1, 3, 3, 6, 0, 34, 36, 36, 
+	57, 57, 36, 36, 36, 36, 36, 36, 
+	36, 36, 36, 36, 36, 36, 36, 36, 
+	36, 36, 36, 36, 60, 63, 60, 64, 
+	64, 64, 64, 64, 64, 64, 64, 64, 
+	64, 64, 64, 64, 64, 64, 64, 64, 
+	64, 68, 68, 64, 64, 69, 69, 69, 
+	68
 };
 
-static const int use_syllable_machine_start = 6;
-static const int use_syllable_machine_first_final = 6;
+static const int use_syllable_machine_start = 4;
+static const int use_syllable_machine_first_final = 4;
 static const int use_syllable_machine_error = -1;
 
-static const int use_syllable_machine_en_main = 6;
+static const int use_syllable_machine_en_main = 4;
 
 
 #line 38 "hb-ot-shape-complex-use-machine.rl"
@@ -337,7 +335,7 @@
   int cs;
   hb_glyph_info_t *info = buffer->info;
   
-#line 341 "hb-ot-shape-complex-use-machine.hh"
+#line 339 "hb-ot-shape-complex-use-machine.hh"
 	{
 	cs = use_syllable_machine_start;
 	ts = 0;
@@ -354,7 +352,7 @@
   unsigned int last = 0;
   unsigned int syllable_serial = 1;
   
-#line 358 "hb-ot-shape-complex-use-machine.hh"
+#line 356 "hb-ot-shape-complex-use-machine.hh"
 	{
 	int _slen;
 	int _trans;
@@ -364,11 +362,11 @@
 		goto _test_eof;
 _resume:
 	switch ( _use_syllable_machine_from_state_actions[cs] ) {
-	case 7:
+	case 6:
 #line 1 "NONE"
 	{ts = p;}
 	break;
-#line 372 "hb-ot-shape-complex-use-machine.hh"
+#line 370 "hb-ot-shape-complex-use-machine.hh"
 	}
 
 	_keys = _use_syllable_machine_trans_keys + (cs<<1);
@@ -386,6 +384,10 @@
 		goto _again;
 
 	switch ( _use_syllable_machine_trans_actions[_trans] ) {
+	case 7:
+#line 1 "NONE"
+	{te = p+1;}
+	break;
 	case 12:
 #line 130 "hb-ot-shape-complex-use-machine.rl"
 	{te = p+1;{ found_syllable (independent_cluster); }}
@@ -406,7 +408,7 @@
 #line 130 "hb-ot-shape-complex-use-machine.rl"
 	{te = p;p--;{ found_syllable (independent_cluster); }}
 	break;
-	case 16:
+	case 15:
 #line 131 "hb-ot-shape-complex-use-machine.rl"
 	{te = p;p--;{ found_syllable (virama_terminated_cluster); }}
 	break;
@@ -414,43 +416,37 @@
 #line 132 "hb-ot-shape-complex-use-machine.rl"
 	{te = p;p--;{ found_syllable (standard_cluster); }}
 	break;
-	case 18:
+	case 17:
 #line 133 "hb-ot-shape-complex-use-machine.rl"
 	{te = p;p--;{ found_syllable (number_joiner_terminated_cluster); }}
 	break;
-	case 17:
+	case 16:
 #line 134 "hb-ot-shape-complex-use-machine.rl"
 	{te = p;p--;{ found_syllable (numeral_cluster); }}
 	break;
-	case 21:
+	case 20:
 #line 135 "hb-ot-shape-complex-use-machine.rl"
 	{te = p;p--;{ found_syllable (symbol_cluster); }}
 	break;
-	case 19:
+	case 18:
 #line 136 "hb-ot-shape-complex-use-machine.rl"
 	{te = p;p--;{ found_syllable (broken_cluster); }}
 	break;
-	case 20:
+	case 19:
 #line 137 "hb-ot-shape-complex-use-machine.rl"
 	{te = p;p--;{ found_syllable (non_cluster); }}
 	break;
-	case 3:
+	case 1:
 #line 132 "hb-ot-shape-complex-use-machine.rl"
 	{{p = ((te))-1;}{ found_syllable (standard_cluster); }}
 	break;
-	case 5:
+	case 4:
 #line 136 "hb-ot-shape-complex-use-machine.rl"
 	{{p = ((te))-1;}{ found_syllable (broken_cluster); }}
 	break;
-	case 1:
+	case 2:
 #line 1 "NONE"
 	{	switch( act ) {
-	case 2:
-	{{p = ((te))-1;} found_syllable (virama_terminated_cluster); }
-	break;
-	case 3:
-	{{p = ((te))-1;} found_syllable (standard_cluster); }
-	break;
 	case 7:
 	{{p = ((te))-1;} found_syllable (broken_cluster); }
 	break;
@@ -460,21 +456,9 @@
 	}
 	}
 	break;
-	case 15:
+	case 3:
 #line 1 "NONE"
 	{te = p+1;}
-#line 131 "hb-ot-shape-complex-use-machine.rl"
-	{act = 2;}
-	break;
-	case 2:
-#line 1 "NONE"
-	{te = p+1;}
-#line 132 "hb-ot-shape-complex-use-machine.rl"
-	{act = 3;}
-	break;
-	case 4:
-#line 1 "NONE"
-	{te = p+1;}
 #line 136 "hb-ot-shape-complex-use-machine.rl"
 	{act = 7;}
 	break;
@@ -484,16 +468,16 @@
 #line 137 "hb-ot-shape-complex-use-machine.rl"
 	{act = 8;}
 	break;
-#line 488 "hb-ot-shape-complex-use-machine.hh"
+#line 472 "hb-ot-shape-complex-use-machine.hh"
 	}
 
 _again:
 	switch ( _use_syllable_machine_to_state_actions[cs] ) {
-	case 6:
+	case 5:
 #line 1 "NONE"
 	{ts = 0;}
 	break;
-#line 497 "hb-ot-shape-complex-use-machine.hh"
+#line 481 "hb-ot-shape-complex-use-machine.hh"
 	}
 
 	if ( ++p != pe )

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-use-machine.rl
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-use-machine.rl	2018-03-07 21:52:46 UTC (rev 46876)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-use-machine.rl	2018-03-07 22:32:14 UTC (rev 46877)
@@ -100,7 +100,7 @@
 virama_terminated_cluster =
 	(R|CS)? (B | GB) VS?
 	consonant_modifiers
-	H
+	ZWJ?.H.ZWJ?
 ;
 standard_cluster =
 	(R|CS)? (B | GB) VS?

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-use-private.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-use-private.hh	2018-03-07 21:52:46 UTC (rev 46876)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-use-private.hh	2018-03-07 22:32:14 UTC (rev 46877)
@@ -92,6 +92,6 @@
 };
 
 HB_INTERNAL USE_TABLE_ELEMENT_TYPE
-hb_use_get_categories (hb_codepoint_t u);
+hb_use_get_category (hb_codepoint_t u);
 
 #endif /* HB_OT_SHAPE_COMPLEX_USE_PRIVATE_HH */

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-use-table.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-use-table.cc	2018-03-07 21:52:46 UTC (rev 46876)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-use-table.cc	2018-03-07 22:32:14 UTC (rev 46877)
@@ -690,7 +690,7 @@
 }; /* Table items: 5424; occupancy: 73% */
 
 USE_TABLE_ELEMENT_TYPE
-hb_use_get_categories (hb_codepoint_t u)
+hb_use_get_category (hb_codepoint_t u)
 {
   switch (u >> 12)
   {

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-03-07 21:52:46 UTC (rev 46876)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-use.cc	2018-03-07 22:32:14 UTC (rev 46877)
@@ -262,7 +262,7 @@
   unsigned int count = buffer->len;
   hb_glyph_info_t *info = buffer->info;
   for (unsigned int i = 0; i < count; i++)
-    info[i].use_category() = hb_use_get_categories (info[i].codepoint);
+    info[i].use_category() = hb_use_get_category (info[i].codepoint);
 }
 
 static void
@@ -505,7 +505,7 @@
   hb_glyph_info_t dottedcircle = {0};
   if (!font->get_nominal_glyph (0x25CCu, &dottedcircle.codepoint))
     return;
-  dottedcircle.use_category() = hb_use_get_categories (0x25CC);
+  dottedcircle.use_category() = hb_use_get_category (0x25CC);
 
   buffer->clear_output ();
 

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-03-07 21:52:46 UTC (rev 46876)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-fallback.cc	2018-03-07 22:32:14 UTC (rev 46877)
@@ -200,8 +200,7 @@
 	       unsigned int combining_class)
 {
   hb_glyph_extents_t mark_extents;
-  if (!font->get_glyph_extents (buffer->info[i].codepoint,
-				&mark_extents))
+  if (!font->get_glyph_extents (buffer->info[i].codepoint, &mark_extents))
     return;
 
   hb_position_t y_gap = font->y_scale / 16;
@@ -322,7 +321,9 @@
   base_extents.y_bearing += buffer->pos[base].y_offset;
 
   unsigned int lig_id = _hb_glyph_info_get_lig_id (&buffer->info[base]);
-  unsigned int num_lig_components = _hb_glyph_info_get_lig_num_comps (&buffer->info[base]);
+  /* Use integer for num_lig_components such that it doesn't convert to unsigned
+   * when we divide or multiply by it. */
+  int num_lig_components = _hb_glyph_info_get_lig_num_comps (&buffer->info[base]);
 
   hb_position_t x_offset = 0, y_offset = 0;
   if (HB_DIRECTION_IS_FORWARD (buffer->props.direction)) {
@@ -331,7 +332,7 @@
   }
 
   hb_glyph_extents_t component_extents = base_extents;
-  unsigned int last_lig_component = (unsigned int) -1;
+  int last_lig_component = -1;
   unsigned int last_combining_class = 255;
   hb_glyph_extents_t cluster_extents = base_extents; /* Initialization is just to shut gcc up. */
   hb_glyph_info_t *info = buffer->info;
@@ -340,7 +341,7 @@
     {
       if (num_lig_components > 1) {
 	unsigned int this_lig_id = _hb_glyph_info_get_lig_id (&info[i]);
-	unsigned int this_lig_component = _hb_glyph_info_get_lig_comp (&info[i]) - 1;
+	int this_lig_component = _hb_glyph_info_get_lig_comp (&info[i]) - 1;
 	/* Conditions for attaching to the last component. */
 	if (!lig_id || lig_id != this_lig_id || this_lig_component >= num_lig_components)
 	  this_lig_component = num_lig_components - 1;
@@ -526,7 +527,7 @@
 	  break;
 
 	case t::SPACE_4_EM_18:
-	  pos[i].x_advance = font->x_scale * 4 / 18;
+	  pos[i].x_advance = (int64_t) font->x_scale * 4 / 18;
 	  break;
 
 	case t::SPACE_FIGURE:

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-03-07 21:52:46 UTC (rev 46876)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape.cc	2018-03-07 22:32:14 UTC (rev 46877)
@@ -41,7 +41,7 @@
 #include "hb-set-private.hh"
 
 #include "hb-ot-layout-gsubgpos-private.hh"
-#include "hb-aat-layout-private.hh"
+//#include "hb-aat-layout-private.hh"
 
 static hb_tag_t common_features[] = {
   HB_TAG('c','c','m','p'),
@@ -787,6 +787,8 @@
     _hb_ot_shape_fallback_kern (c->plan, c->font, c->buffer);
 
   _hb_buffer_deallocate_gsubgpos_vars (c->buffer);
+
+  //hb_aat_layout_position (c->font, c->buffer);
 }
 
 static inline void
@@ -957,7 +959,7 @@
   hb_set_t *copy = hb_set_create ();
   do {
     copy->set (glyphs);
-    for (hb_codepoint_t lookup_index = -1; hb_set_next (lookups, &lookup_index);)
+    for (hb_codepoint_t lookup_index = HB_SET_VALUE_INVALID; hb_set_next (lookups, &lookup_index);)
       hb_ot_layout_lookup_substitute_closure (font->face, lookup_index, glyphs);
   } while (!copy->is_equal (glyphs));
   hb_set_destroy (copy);

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-private.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-private.hh	2018-03-07 21:52:46 UTC (rev 46876)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-private.hh	2018-03-07 22:32:14 UTC (rev 46877)
@@ -51,6 +51,9 @@
 #include <stdio.h>
 #include <stdarg.h>
 
+#if defined(_MSC_VER) || defined(__MINGW32__)
+#include <intrin.h>
+#endif
 
 #define HB_PASTE1(a,b) a##b
 #define HB_PASTE(a,b) HB_PASTE1(a,b)
@@ -120,10 +123,11 @@
 #endif
 
 #ifndef HB_INTERNAL
-# if !defined(__MINGW32__) && !defined(__CYGWIN__)
+# if !defined(HB_NO_VISIBILITY) && !defined(__MINGW32__) && !defined(__CYGWIN__) && !defined(_MSC_VER) && !defined(__SUNPRO_CC)
 #  define HB_INTERNAL __attribute__((__visibility__("hidden")))
 # else
 #  define HB_INTERNAL
+#  define HB_NO_VISIBILITY 1
 # endif
 #endif
 
@@ -135,6 +139,11 @@
 #define HB_FUNC __func__
 #endif
 
+#ifdef __SUNPRO_CC
+/* https://github.com/harfbuzz/harfbuzz/issues/630 */
+#define __restrict
+#endif
+
 /*
  * Borrowed from https://bugzilla.mozilla.org/show_bug.cgi?id=1215411
  * HB_FALLTHROUGH is an annotation to suppress compiler warnings about switch
@@ -154,6 +163,9 @@
 #if defined(__clang__) && __cplusplus >= 201103L
    /* clang's fallthrough annotations are only available starting in C++11. */
 #  define HB_FALLTHROUGH [[clang::fallthrough]]
+#elif __GNUC__ >= 7
+   /* GNU fallthrough attribute is available from GCC7 */
+#  define HB_FALLTHROUGH __attribute__((fallthrough))
 #elif defined(_MSC_VER)
    /*
     * MSVC's __fallthrough annotations are checked by /analyze (Code Analysis):
@@ -221,6 +233,12 @@
  * https://developer.android.com/tools/sdk/ndk/index.html
  */
 #    define HB_USE_ATEXIT 1
+#  elif defined(__APPLE__)
+/* For macOS and related platforms, the atexit man page indicates
+ * that it will be invoked when the library is unloaded, not only
+ * at application exit.
+ */
+#    define HB_USE_ATEXIT 1
 #  endif
 #endif
 
@@ -304,64 +322,189 @@
 typedef const struct _hb_void_t *hb_void_t;
 #define HB_VOID ((const _hb_void_t *) nullptr)
 
-/* Return the number of 1 bits in mask. */
+/* Return the number of 1 bits in v. */
+template <typename T>
 static inline HB_CONST_FUNC unsigned int
-_hb_popcount32 (uint32_t mask)
+_hb_popcount (T v)
 {
-#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
-  return __builtin_popcount (mask);
-#else
-  /* "HACKMEM 169" */
-  uint32_t y;
-  y = (mask >> 1) &033333333333;
-  y = mask - y - ((y >>1) & 033333333333);
-  return (((y + (y >> 3)) & 030707070707) % 077);
+#if (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) && defined(__OPTIMIZE__)
+  if (sizeof (T) <= sizeof (unsigned int))
+    return __builtin_popcount (v);
+
+  if (sizeof (T) <= sizeof (unsigned long))
+    return __builtin_popcountl (v);
+
+  if (sizeof (T) <= sizeof (unsigned long long))
+    return __builtin_popcountll (v);
 #endif
+
+  if (sizeof (T) <= 4)
+  {
+    /* "HACKMEM 169" */
+    uint32_t y;
+    y = (v >> 1) &033333333333;
+    y = v - y - ((y >>1) & 033333333333);
+    return (((y + (y >> 3)) & 030707070707) % 077);
+  }
+
+  if (sizeof (T) == 8)
+  {
+    unsigned int shift = 32;
+    return _hb_popcount<uint32_t> ((uint32_t) v) + _hb_popcount ((uint32_t) (v >> shift));
+  }
+
+  if (sizeof (T) == 16)
+  {
+    unsigned int shift = 64;
+    return _hb_popcount<uint64_t> ((uint64_t) v) + _hb_popcount ((uint64_t) (v >> shift));
+  }
+
+  assert (0);
 }
-static inline HB_CONST_FUNC unsigned int
-_hb_popcount64 (uint64_t mask)
-{
-#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
-  if (sizeof (long) >= sizeof (mask))
-    return __builtin_popcountl (mask);
-#endif
-  return _hb_popcount32 (mask & 0xFFFFFFFF) + _hb_popcount32 (mask >> 32);
-}
-template <typename T> static inline unsigned int _hb_popcount (T mask);
-template <> inline unsigned int _hb_popcount<uint32_t> (uint32_t mask) { return _hb_popcount32 (mask); }
-template <> inline unsigned int _hb_popcount<uint64_t> (uint64_t mask) { return _hb_popcount64 (mask); }
 
 /* Returns the number of bits needed to store number */
+template <typename T>
 static inline HB_CONST_FUNC unsigned int
-_hb_bit_storage (unsigned int number)
+_hb_bit_storage (T v)
 {
+  if (unlikely (!v)) return 0;
+
 #if defined(__GNUC__) && (__GNUC__ >= 4) && defined(__OPTIMIZE__)
-  return likely (number) ? (sizeof (unsigned int) * 8 - __builtin_clz (number)) : 0;
-#else
-  unsigned int n_bits = 0;
-  while (number) {
-    n_bits++;
-    number >>= 1;
+  if (sizeof (T) <= sizeof (unsigned int))
+    return sizeof (unsigned int) * 8 - __builtin_clz (v);
+
+  if (sizeof (T) <= sizeof (unsigned long))
+    return sizeof (unsigned long) * 8 - __builtin_clzl (v);
+
+  if (sizeof (T) <= sizeof (unsigned long long))
+    return sizeof (unsigned long long) * 8 - __builtin_clzll (v);
+#endif
+
+#if defined(_MSC_VER) || defined(__MINGW32__)
+  if (sizeof (T) <= sizeof (unsigned int))
+  {
+    unsigned long where;
+    _BitScanReverse (&where, v);
+    return 1 + where;
   }
-  return n_bits;
+# if _WIN64
+  if (sizeof (T) <= 8)
+  {
+    unsigned long where;
+    _BitScanReverse64 (&where, v);
+    return 1 + where;
+  }
+# endif
 #endif
+
+  if (sizeof (T) <= 4)
+  {
+    /* "bithacks" */
+    const unsigned int b[] = {0x2, 0xC, 0xF0, 0xFF00, 0xFFFF0000};
+    const unsigned int S[] = {1, 2, 4, 8, 16};
+    unsigned int r = 0;
+    for (int i = 4; i >= 0; i--)
+      if (v & b[i])
+      {
+	v >>= S[i];
+	r |= S[i];
+      }
+    return r + 1;
+  }
+  if (sizeof (T) <= 8)
+  {
+    /* "bithacks" */
+    const uint64_t b[] = {0x2, 0xC, 0xF0, 0xFF00, 0xFFFF0000, 0xFFFFFFFF00000000};
+    const unsigned int S[] = {1, 2, 4, 8, 16, 32};
+    unsigned int r = 0;
+    for (int i = 5; i >= 0; i--)
+      if (v & b[i])
+      {
+	v >>= S[i];
+	r |= S[i];
+      }
+    return r + 1;
+  }
+  if (sizeof (T) == 16)
+  {
+    unsigned int shift = 64;
+    return (v >> shift) ? _hb_bit_storage<uint64_t> ((uint64_t) v >> shift) + shift :
+			  _hb_bit_storage<uint64_t> ((uint64_t) v);
+  }
+
+  assert (0);
 }
 
-/* Returns the number of zero bits in the least significant side of number */
+/* Returns the number of zero bits in the least significant side of v */
+template <typename T>
 static inline HB_CONST_FUNC unsigned int
-_hb_ctz (unsigned int number)
+_hb_ctz (T v)
 {
+  if (unlikely (!v)) return 0;
+
 #if defined(__GNUC__) && (__GNUC__ >= 4) && defined(__OPTIMIZE__)
-  return likely (number) ? __builtin_ctz (number) : 0;
-#else
-  unsigned int n_bits = 0;
-  if (unlikely (!number)) return 0;
-  while (!(number & 1)) {
-    n_bits++;
-    number >>= 1;
+  if (sizeof (T) <= sizeof (unsigned int))
+    return __builtin_ctz (v);
+
+  if (sizeof (T) <= sizeof (unsigned long))
+    return __builtin_ctzl (v);
+
+  if (sizeof (T) <= sizeof (unsigned long long))
+    return __builtin_ctzll (v);
+#endif
+
+#if defined(_MSC_VER) || defined(__MINGW32__)
+  if (sizeof (T) <= sizeof (unsigned int))
+  {
+    unsigned long where;
+    _BitScanForward (&where, v);
+    return where;
   }
-  return n_bits;
+# if _WIN64
+  if (sizeof (T) <= 8)
+  {
+    unsigned long where;
+    _BitScanForward64 (&where, v);
+    return where;
+  }
+# endif
 #endif
+
+  if (sizeof (T) <= 4)
+  {
+    /* "bithacks" */
+    unsigned int c = 32;
+    v &= - (int32_t) v;
+    if (v) c--;
+    if (v & 0x0000FFFF) c -= 16;
+    if (v & 0x00FF00FF) c -= 8;
+    if (v & 0x0F0F0F0F) c -= 4;
+    if (v & 0x33333333) c -= 2;
+    if (v & 0x55555555) c -= 1;
+    return c;
+  }
+  if (sizeof (T) <= 8)
+  {
+    /* "bithacks" */
+    unsigned int c = 64;
+    v &= - (int64_t) (v);
+    if (v) c--;
+    if (v & 0x00000000FFFFFFFF) c -= 32;
+    if (v & 0x0000FFFF0000FFFF) c -= 16;
+    if (v & 0x00FF00FF00FF00FF) c -= 8;
+    if (v & 0x0F0F0F0F0F0F0F0F) c -= 4;
+    if (v & 0x3333333333333333) c -= 2;
+    if (v & 0x5555555555555555) c -= 1;
+    return c;
+  }
+  if (sizeof (T) == 16)
+  {
+    unsigned int shift = 64;
+    return (uint64_t) v ? _hb_bit_storage<uint64_t> ((uint64_t) v) :
+			  _hb_bit_storage<uint64_t> ((uint64_t) v >> shift) + shift;
+  }
+
+  assert (0);
 }
 
 static inline bool
@@ -370,8 +513,14 @@
   return (size > 0) && (count >= ((unsigned int) -1) / size);
 }
 
+static inline unsigned int
+_hb_ceil_to_4 (unsigned int v)
+{
+  return ((v - 1) | 3) + 1;
+}
 
 
+
 /* arrays and maps */
 
 
@@ -402,36 +551,45 @@
     return &array[len - 1];
   }
 
-  inline bool resize (unsigned int size)
+  /* Allocate for size but don't adjust len. */
+  inline bool alloc(unsigned int size)
   {
-    if (unlikely (size > allocated))
-    {
-      /* Need to reallocate */
+    if (likely (size <= allocated))
+      return true;
 
-      unsigned int new_allocated = allocated;
-      while (size >= new_allocated)
-        new_allocated += (new_allocated >> 1) + 8;
+    /* Reallocate */
 
-      Type *new_array = nullptr;
+    unsigned int new_allocated = allocated;
+    while (size >= new_allocated)
+      new_allocated += (new_allocated >> 1) + 8;
 
-      if (array == static_array) {
-	new_array = (Type *) calloc (new_allocated, sizeof (Type));
-	if (new_array)
-	  memcpy (new_array, array, len * sizeof (Type));
-      } else {
-	bool overflows = (new_allocated < allocated) || _hb_unsigned_int_mul_overflows (new_allocated, sizeof (Type));
-	if (likely (!overflows)) {
-	  new_array = (Type *) realloc (array, new_allocated * sizeof (Type));
-	}
+    Type *new_array = nullptr;
+
+    if (array == static_array) {
+      new_array = (Type *) calloc (new_allocated, sizeof (Type));
+      if (new_array)
+        memcpy (new_array, array, len * sizeof (Type));
+          } else {
+      bool overflows = (new_allocated < allocated) || _hb_unsigned_int_mul_overflows (new_allocated, sizeof (Type));
+      if (likely (!overflows)) {
+        new_array = (Type *) realloc (array, new_allocated * sizeof (Type));
       }
+    }
 
-      if (unlikely (!new_array))
-	return false;
+    if (unlikely (!new_array))
+      return false;
 
-      array = new_array;
-      allocated = new_allocated;
-    }
+    array = new_array;
+    allocated = new_allocated;
 
+    return true;
+  }
+
+  inline bool resize (unsigned int size)
+  {
+    if (!alloc (size))
+      return false;
+
     len = size;
     return true;
   }
@@ -472,6 +630,11 @@
     return nullptr;
   }
 
+  inline void qsort (int (*cmp)(const void*, const void*))
+  {
+    ::qsort (array, len, sizeof (Type), cmp);
+  }
+
   inline void qsort (void)
   {
     ::qsort (array, len, sizeof (Type), Type::cmp);
@@ -483,25 +646,34 @@
   }
 
   template <typename T>
-  inline Type *bsearch (T *x)
+  inline Type *lsearch (const T &x)
   {
+    for (unsigned int i = 0; i < len; i++)
+      if (0 == this->array[i].cmp (&x))
+	return &array[i];
+    return nullptr;
+  }
+
+  template <typename T>
+  inline Type *bsearch (const T &x)
+  {
     unsigned int i;
     return bfind (x, &i) ? &array[i] : nullptr;
   }
   template <typename T>
-  inline const Type *bsearch (T *x) const
+  inline const Type *bsearch (const T &x) const
   {
     unsigned int i;
     return bfind (x, &i) ? &array[i] : nullptr;
   }
   template <typename T>
-  inline bool bfind (T *x, unsigned int *i) const
+  inline bool bfind (const T &x, unsigned int *i) const
   {
     int min = 0, max = (int) this->len - 1;
     while (min <= max)
     {
       int mid = (min + max) / 2;
-      int c = this->array[mid].cmp (x);
+      int c = this->array[mid].cmp (&x);
       if (c < 0)
         max = mid - 1;
       else if (c > 0)
@@ -512,7 +684,7 @@
 	return true;
       }
     }
-    if (max < 0 || (max < (int) this->len && this->array[max].cmp (x) > 0))
+    if (max < 0 || (max < (int) this->len && this->array[max].cmp (&x) > 0))
       max++;
     *i = max;
     return false;

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-set-private.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-set-private.hh	2018-03-07 21:52:46 UTC (rev 46876)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-set-private.hh	2018-03-07 22:32:14 UTC (rev 46877)
@@ -109,32 +109,44 @@
       unsigned int i = m / ELT_BITS;
       unsigned int j = m & ELT_MASK;
 
-      for (; j < ELT_BITS; j++)
-        if (v[i] & (elt_t (1) << j))
-	  goto found;
-      for (i++; i < len (); i++)
-        if (v[i])
-	  for (j = 0; j < ELT_BITS; j++)
-	    if (v[i] & (elt_t (1) << j))
-	      goto found;
+      const elt_t vv = v[i] & ~((elt_t (1) << j) - 1);
+      for (const elt_t *p = &vv; i < len (); p = &v[++i])
+	if (*p)
+	{
+	  *codepoint = i * ELT_BITS + elt_get_min (*p);
+	  return true;
+	}
 
       *codepoint = INVALID;
       return false;
+    }
+    inline bool previous (hb_codepoint_t *codepoint) const
+    {
+      unsigned int m = (*codepoint - 1) & MASK;
+      if (m == MASK)
+      {
+	*codepoint = INVALID;
+	return false;
+      }
+      unsigned int i = m / ELT_BITS;
+      unsigned int j = m & ELT_MASK;
 
-    found:
-      *codepoint = i * ELT_BITS + j;
-      return true;
+      const elt_t vv = v[i] & ((elt_t (1) << (j + 1)) - 1);
+      for (const elt_t *p = &vv; (int) i >= 0; p = &v[--i])
+	if (*p)
+	{
+	  *codepoint = i * ELT_BITS + elt_get_max (*p);
+	  return true;
+	}
+
+      *codepoint = INVALID;
+      return false;
     }
     inline hb_codepoint_t get_min (void) const
     {
       for (unsigned int i = 0; i < len (); i++)
         if (v[i])
-	{
-	  elt_t e = v[i];
-	  for (unsigned int j = 0; j < ELT_BITS; j++)
-	    if (e & (elt_t (1) << j))
-	      return i * ELT_BITS + j;
-	}
+	  return i * ELT_BITS + elt_get_min (v[i]);
       return INVALID;
     }
     inline hb_codepoint_t get_max (void) const
@@ -141,19 +153,16 @@
     {
       for (int i = len () - 1; i >= 0; i--)
         if (v[i])
-	{
-	  elt_t e = v[i];
-	  for (int j = ELT_BITS - 1; j >= 0; j--)
-	    if (e & (elt_t (1) << j))
-	      return i * ELT_BITS + j;
-	}
+	  return i * ELT_BITS + elt_get_max (v[i]);
       return 0;
     }
 
-    static const unsigned int PAGE_BITS = 8192; /* Use to tune. */
+    typedef unsigned long long elt_t;
+    static const unsigned int PAGE_BITS = 1024;
     static_assert ((PAGE_BITS & ((PAGE_BITS) - 1)) == 0, "");
 
-    typedef uint64_t elt_t;
+    static inline unsigned int elt_get_min (const elt_t &elt) { return _hb_ctz (elt); }
+    static inline unsigned int elt_get_max (const elt_t &elt) { return _hb_bit_storage (elt) - 1; }
 
 #if 0 && HAVE_VECTOR_SIZE
     /* The vectorized version does not work with clang as non-const
@@ -273,7 +282,7 @@
       {
 	page->add (g);
 
-	array++;
+	array = (const T *) ((const char *) array + stride);
 	count--;
       }
       while (count && (g = *array, start <= g && g < end));
@@ -302,7 +311,7 @@
 	last_g = g;
 	page->add (g);
 
-	array++;
+	array = (const T *) ((const char *) array + stride);
 	count--;
       }
       while (count && (g = *array, g < end));
@@ -380,6 +389,7 @@
 
     unsigned int na = pages.len;
     unsigned int nb = other->pages.len;
+    unsigned int next_page = na;
 
     unsigned int count = 0;
     unsigned int a = 0, b = 0;
@@ -421,27 +431,47 @@
       {
 	a--;
 	b--;
-        Op::process (page_at (--count).v, page_at (a).v, other->page_at (b).v);
+	count--;
+	page_map[count] = page_map[a];
+	Op::process (page_at (count).v, page_at (a).v, other->page_at (b).v);
       }
       else if (page_map[a - 1].major > other->page_map[b - 1].major)
       {
-        a--;
-        if (Op::passthru_left)
-	  page_at (--count).v = page_at (a).v;
+	a--;
+	if (Op::passthru_left)
+	{
+	  count--;
+	  page_map[count] = page_map[a];
+	}
       }
       else
       {
-        b--;
-        if (Op::passthru_right)
-	  page_at (--count).v = other->page_at (b).v;
+	b--;
+	if (Op::passthru_right)
+	{
+	  count--;
+	  page_map[count].major = other->page_map[b].major;
+	  page_map[count].index = next_page++;
+	  page_at (count).v = other->page_at (b).v;
+	}
       }
     }
     if (Op::passthru_left)
       while (a)
-	page_at (--count).v = page_at (--a).v;
+      {
+	a--;
+	count--;
+	page_map[count] = page_map [a];
+      }
     if (Op::passthru_right)
       while (b)
-	page_at (--count).v = other->page_at (--b).v;
+      {
+	b--;
+	count--;
+	page_map[count].major = other->page_map[b].major;
+	page_map[count].index = next_page++;
+	page_at (count).v = other->page_at (b).v;
+      }
     assert (!count);
   }
 
@@ -470,13 +500,13 @@
 
     page_map_t map = {get_major (*codepoint), 0};
     unsigned int i;
-    page_map.bfind (&map, &i);
-    if (i < page_map.len)
+    page_map.bfind (map, &i);
+    if (i < page_map.len && page_map[i].major == map.major)
     {
       if (pages[page_map[i].index].next (codepoint))
       {
 	*codepoint += page_map[i].major * page_t::PAGE_BITS;
-        return true;
+	return true;
       }
       i++;
     }
@@ -492,6 +522,37 @@
     *codepoint = INVALID;
     return false;
   }
+  inline bool previous (hb_codepoint_t *codepoint) const
+  {
+    if (unlikely (*codepoint == INVALID)) {
+      *codepoint = get_max ();
+      return *codepoint != INVALID;
+    }
+
+    page_map_t map = {get_major (*codepoint), 0};
+    unsigned int i;
+    page_map.bfind (map, &i);
+    if (i < page_map.len && page_map[i].major == map.major)
+    {
+      if (pages[page_map[i].index].previous (codepoint))
+      {
+	*codepoint += page_map[i].major * page_t::PAGE_BITS;
+	return true;
+      }
+    }
+    i--;
+    for (; (int) i >= 0; i--)
+    {
+      hb_codepoint_t m = pages[page_map[i].index].get_max ();
+      if (m != INVALID)
+      {
+	*codepoint = page_map[i].major * page_t::PAGE_BITS + m;
+	return true;
+      }
+    }
+    *codepoint = INVALID;
+    return false;
+  }
   inline bool next_range (hb_codepoint_t *first, hb_codepoint_t *last) const
   {
     hb_codepoint_t i;
@@ -503,6 +564,7 @@
       return false;
     }
 
+    /* TODO Speed up. */
     *last = *first = i;
     while (next (&i) && i == *last + 1)
       (*last)++;
@@ -509,7 +571,25 @@
 
     return true;
   }
+  inline bool previous_range (hb_codepoint_t *first, hb_codepoint_t *last) const
+  {
+    hb_codepoint_t i;
 
+    i = *first;
+    if (!previous (&i))
+    {
+      *last = *first = INVALID;
+      return false;
+    }
+
+    /* TODO Speed up. */
+    *last = *first = i;
+    while (previous (&i) && i == *first - 1)
+      (*first)--;
+
+    return true;
+  }
+
   inline unsigned int get_population (void) const
   {
     unsigned int pop = 0;
@@ -541,7 +621,7 @@
   {
     page_map_t map = {get_major (g), pages.len};
     unsigned int i;
-    if (!page_map.bfind (&map, &i))
+    if (!page_map.bfind (map, &i))
     {
       if (!resize (pages.len + 1))
 	return nullptr;
@@ -555,7 +635,7 @@
   inline page_t *page_for (hb_codepoint_t g)
   {
     page_map_t key = {get_major (g)};
-    const page_map_t *found = page_map.bsearch (&key);
+    const page_map_t *found = page_map.bsearch (key);
     if (found)
       return &pages[found->index];
     return nullptr;
@@ -563,7 +643,7 @@
   inline const page_t *page_for (hb_codepoint_t g) const
   {
     page_map_t key = {get_major (g)};
-    const page_map_t *found = page_map.bsearch (&key);
+    const page_map_t *found = page_map.bsearch (key);
     if (found)
       return &pages[found->index];
     return nullptr;

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-set.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-set.cc	2018-03-07 21:52:46 UTC (rev 46876)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-set.cc	2018-03-07 22:32:14 UTC (rev 46877)
@@ -50,6 +50,13 @@
   return set;
 }
 
+static const hb_set_t _hb_set_nil = {
+  HB_OBJECT_HEADER_STATIC,
+  true, /* in_error */
+
+  {0} /* elts */
+};
+
 /**
  * hb_set_get_empty:
  *
@@ -60,13 +67,6 @@
 hb_set_t *
 hb_set_get_empty (void)
 {
-  static const hb_set_t _hb_set_nil = {
-    HB_OBJECT_HEADER_STATIC,
-    true, /* in_error */
-
-    {0} /* elts */
-  };
-
   return const_cast<hb_set_t *> (&_hb_set_nil);
 }
 
@@ -437,8 +437,10 @@
  * @set: a set.
  * @codepoint: (inout):
  *
- * 
+ * Gets the next number in @set that is greater than current value of @codepoint.
  *
+ * Set @codepoint to %HB_SET_VALUE_INVALID to get started.
+ *
  * Return value: whether there was a next value.
  *
  * Since: 0.9.2
@@ -451,6 +453,26 @@
 }
 
 /**
+ * hb_set_previous:
+ * @set: a set.
+ * @codepoint: (inout):
+ *
+ * Gets the previous number in @set that is slower than current value of @codepoint.
+ *
+ * Set @codepoint to %HB_SET_VALUE_INVALID to get started.
+ *
+ * Return value: whether there was a previous value.
+ *
+ * Since: 1.8.0
+ **/
+hb_bool_t
+hb_set_previous (const hb_set_t *set,
+		 hb_codepoint_t *codepoint)
+{
+  return set->previous (codepoint);
+}
+
+/**
  * hb_set_next_range:
  * @set: a set.
  * @first: (out): output first codepoint in the range.
@@ -459,6 +481,8 @@
  * Gets the next consecutive range of numbers in @set that
  * are greater than current value of @last.
  *
+ * Set @last to %HB_SET_VALUE_INVALID to get started.
+ *
  * Return value: whether there was a next range.
  *
  * Since: 0.9.7
@@ -470,3 +494,26 @@
 {
   return set->next_range (first, last);
 }
+
+/**
+ * hb_set_previous_range:
+ * @set: a set.
+ * @first: (inout): input current first and output first codepoint in the range.
+ * @last: (out): output last codepoint in the range.
+ *
+ * Gets the previous consecutive range of numbers in @set that
+ * are greater than current value of @last.
+ *
+ * Set @first to %HB_SET_VALUE_INVALID to get started.
+ *
+ * Return value: whether there was a previous range.
+ *
+ * Since: 1.8.0
+ **/
+hb_bool_t
+hb_set_previous_range (const hb_set_t *set,
+		       hb_codepoint_t *first,
+		       hb_codepoint_t *last)
+{
+  return set->previous_range (first, last);
+}

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-set.h
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-set.h	2018-03-07 21:52:46 UTC (rev 46876)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-set.h	2018-03-07 22:32:14 UTC (rev 46877)
@@ -129,26 +129,37 @@
 HB_EXTERN unsigned int
 hb_set_get_population (const hb_set_t *set);
 
-/* Returns -1 if set empty. */
+/* Returns HB_SET_VALUE_INVALID if set empty. */
 HB_EXTERN hb_codepoint_t
 hb_set_get_min (const hb_set_t *set);
 
-/* Returns -1 if set empty. */
+/* Returns HB_SET_VALUE_INVALID if set empty. */
 HB_EXTERN hb_codepoint_t
 hb_set_get_max (const hb_set_t *set);
 
-/* Pass -1 in to get started. */
+/* Pass HB_SET_VALUE_INVALID in to get started. */
 HB_EXTERN hb_bool_t
 hb_set_next (const hb_set_t *set,
 	     hb_codepoint_t *codepoint);
 
-/* Pass -1 for first and last to get started. */
+/* Pass HB_SET_VALUE_INVALID in to get started. */
 HB_EXTERN hb_bool_t
+hb_set_previous (const hb_set_t *set,
+		 hb_codepoint_t *codepoint);
+
+/* Pass HB_SET_VALUE_INVALID for first and last to get started. */
+HB_EXTERN hb_bool_t
 hb_set_next_range (const hb_set_t *set,
 		   hb_codepoint_t *first,
 		   hb_codepoint_t *last);
 
+/* Pass HB_SET_VALUE_INVALID for first and last to get started. */
+HB_EXTERN hb_bool_t
+hb_set_previous_range (const hb_set_t *set,
+		       hb_codepoint_t *first,
+		       hb_codepoint_t *last);
 
+
 HB_END_DECLS
 
 #endif /* HB_SET_H */

Added: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-glyf.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-glyf.cc	                        (rev 0)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-glyf.cc	2018-03-07 22:32:14 UTC (rev 46877)
@@ -0,0 +1,307 @@
+/*
+ * 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): Garret Rieger, Roderick Sheeter
+ */
+
+#include "hb-open-type-private.hh"
+#include "hb-ot-glyf-table.hh"
+#include "hb-set.h"
+#include "hb-subset-glyf.hh"
+#include "hb-subset-plan.hh"
+
+static bool
+_calculate_glyf_and_loca_prime_size (const OT::glyf::accelerator_t &glyf,
+                                     hb_prealloced_array_t<hb_codepoint_t> &glyph_ids,
+                                     hb_bool_t drop_hints,
+                                     bool *use_short_loca /* OUT */,
+                                     unsigned int *glyf_size /* OUT */,
+                                     unsigned int *loca_size /* OUT */,
+                                     hb_prealloced_array_t<unsigned int> *instruction_ranges /* OUT */)
+{
+  unsigned int total = 0;
+  for (unsigned int i = 0; i < glyph_ids.len; i++)
+  {
+    hb_codepoint_t next_glyph = glyph_ids[i];
+    unsigned int *instruction_start = instruction_ranges->push();
+    unsigned int *instruction_end = instruction_ranges->push();
+    *instruction_start = 0;
+    *instruction_end = 0;
+
+    unsigned int start_offset, end_offset;
+    if (unlikely (!(glyf.get_offsets(next_glyph, &start_offset, &end_offset)
+                    && glyf.remove_padding(start_offset, &end_offset))))
+    {
+      DEBUG_MSG(SUBSET, nullptr, "Invalid gid %d", next_glyph);
+      continue;
+    }
+    if (end_offset - start_offset < OT::glyf::GlyphHeader::static_size)
+      continue; /* 0-length glyph */
+
+    if (drop_hints)
+    {
+      if (unlikely (!glyf.get_instruction_offsets(start_offset, end_offset,
+                                                  instruction_start, instruction_end)))
+      {
+        DEBUG_MSG(SUBSET, nullptr, "Unable to get instruction offsets for %d", next_glyph);
+        return false;
+      }
+    }
+
+    total += end_offset - start_offset - (*instruction_end - *instruction_start);
+    /* round2 so short loca will work */
+    total += total % 2;
+  }
+
+  *glyf_size = total;
+  *use_short_loca = (total <= 131070);
+  *loca_size = (glyph_ids.len + 1)
+      * (*use_short_loca ? sizeof(OT::HBUINT16) : sizeof(OT::HBUINT32));
+
+  DEBUG_MSG(SUBSET, nullptr, "preparing to subset glyf: final size %d, loca size %d, using %s loca",
+            total,
+            *loca_size,
+            *use_short_loca ? "short" : "long");
+  return true;
+}
+
+static bool
+_write_loca_entry (unsigned int  id,
+                   unsigned int  offset,
+                   bool          is_short,
+                   void         *loca_prime,
+                   unsigned int  loca_size)
+{
+  unsigned int entry_size = is_short ? sizeof (OT::HBUINT16) : sizeof (OT::HBUINT32);
+  if ((id + 1) * entry_size <= loca_size)
+  {
+    if (is_short) {
+      ((OT::HBUINT16*) loca_prime) [id].set (offset / 2);
+    } else {
+      ((OT::HBUINT32*) loca_prime) [id].set (offset);
+    }
+    return true;
+  }
+
+  // Offset was not written because the write is out of bounds.
+  DEBUG_MSG (SUBSET,
+             nullptr,
+             "WARNING: Attempted to write an out of bounds loca entry at index %d. Loca size is %d.",
+             id,
+             loca_size);
+  return false;
+}
+
+static void
+_update_components (hb_subset_plan_t * plan,
+		    char * glyph_start,
+		    unsigned int length)
+
+{
+  OT::glyf::CompositeGlyphHeader::Iterator iterator;
+  if (OT::glyf::CompositeGlyphHeader::get_iterator (glyph_start,
+						    length,
+						    &iterator))
+  {
+    do
+    {
+      hb_codepoint_t new_gid;
+      if (!hb_subset_plan_new_gid_for_old_id (plan,
+					      iterator.current->glyphIndex,
+					      &new_gid))
+	continue;
+
+      ((OT::glyf::CompositeGlyphHeader *) iterator.current)->glyphIndex.set (new_gid);
+    } while (iterator.move_to_next());
+  }
+}
+
+static bool _remove_composite_instruction_flag(char *glyf_prime, unsigned int length)
+{
+  /* remove WE_HAVE_INSTRUCTIONS from flags in dest */
+  OT::glyf::CompositeGlyphHeader::Iterator composite_it;
+  if (unlikely (!OT::glyf::CompositeGlyphHeader::get_iterator (glyf_prime, length, &composite_it))) return false;
+  const OT::glyf::CompositeGlyphHeader *glyph;
+  do {
+    glyph = composite_it.current;
+    OT::HBUINT16 *flags = const_cast<OT::HBUINT16 *> (&glyph->flags);
+    flags->set ( (uint16_t) *flags & ~OT::glyf::CompositeGlyphHeader::WE_HAVE_INSTRUCTIONS);
+  } while (composite_it.move_to_next());
+  return true;
+}
+
+static bool
+_write_glyf_and_loca_prime (hb_subset_plan_t              *plan,
+			    const OT::glyf::accelerator_t &glyf,
+                            const char                    *glyf_data,
+                            bool                           use_short_loca,
+                            hb_prealloced_array_t<unsigned int> &instruction_ranges,
+                            unsigned int                   glyf_prime_size,
+                            char                          *glyf_prime_data /* OUT */,
+                            unsigned int                   loca_prime_size,
+                            char                          *loca_prime_data /* OUT */)
+{
+  hb_prealloced_array_t<hb_codepoint_t> &glyph_ids = plan->gids_to_retain_sorted;
+  char *glyf_prime_data_next = glyf_prime_data;
+
+  bool success = true;
+  for (unsigned int i = 0; i < glyph_ids.len; i++)
+  {
+    unsigned int start_offset, end_offset;
+    if (unlikely (!(glyf.get_offsets (glyph_ids[i], &start_offset, &end_offset)
+                    && glyf.remove_padding(start_offset, &end_offset))))
+      end_offset = start_offset = 0;
+    unsigned int instruction_start = instruction_ranges[i * 2];
+    unsigned int instruction_end = instruction_ranges[i * 2 + 1];
+
+    int length = end_offset - start_offset - (instruction_end - instruction_start);
+    length += length % 2;
+
+    if (glyf_prime_data_next + length > glyf_prime_data + glyf_prime_size)
+    {
+      DEBUG_MSG (SUBSET,
+                 nullptr,
+                 "WARNING: Attempted to write an out of bounds glyph entry for gid %d (length %d)",
+                 i, length);
+      return false;
+    }
+
+    if (instruction_start == instruction_end)
+      memcpy (glyf_prime_data_next, glyf_data + start_offset, length);
+    else
+    {
+      memcpy (glyf_prime_data_next, glyf_data + start_offset, instruction_start - start_offset);
+      memcpy (glyf_prime_data_next + instruction_start - start_offset, glyf_data + instruction_end, end_offset - instruction_end);
+      /* if the instructions end at the end this was a composite glyph, else simple */
+      if (instruction_end == end_offset)
+      {
+        if (unlikely (!_remove_composite_instruction_flag (glyf_prime_data_next, length))) return false;
+      }
+      else
+        /* zero instruction length, which is just before instruction_start */
+        memset (glyf_prime_data_next + instruction_start - start_offset - 2, 0, 2);
+    }
+
+    success = success && _write_loca_entry (i,
+                                            glyf_prime_data_next - glyf_prime_data,
+                                            use_short_loca,
+                                            loca_prime_data,
+                                            loca_prime_size);
+    _update_components (plan, glyf_prime_data_next, length);
+
+    glyf_prime_data_next += length;
+  }
+
+  success = success && _write_loca_entry (glyph_ids.len,
+                                          glyf_prime_data_next - glyf_prime_data,
+                                          use_short_loca,
+                                          loca_prime_data,
+                                          loca_prime_size);
+  return success;
+}
+
+static bool
+_hb_subset_glyf_and_loca (const OT::glyf::accelerator_t  &glyf,
+                          const char                     *glyf_data,
+                          hb_subset_plan_t               *plan,
+                          bool                           *use_short_loca,
+                          hb_blob_t                     **glyf_prime /* OUT */,
+                          hb_blob_t                     **loca_prime /* OUT */)
+{
+  // TODO(grieger): Sanity check allocation size for the new table.
+  hb_prealloced_array_t<hb_codepoint_t> &glyphs_to_retain = plan->gids_to_retain_sorted;
+
+  unsigned int glyf_prime_size;
+  unsigned int loca_prime_size;
+  hb_prealloced_array_t<unsigned int> instruction_ranges;
+  instruction_ranges.init();
+
+  if (unlikely (!_calculate_glyf_and_loca_prime_size (glyf,
+                                                      glyphs_to_retain,
+                                                      plan->drop_hints,
+                                                      use_short_loca,
+                                                      &glyf_prime_size,
+                                                      &loca_prime_size,
+                                                      &instruction_ranges))) {
+    instruction_ranges.finish();
+    return false;
+  }
+
+  char *glyf_prime_data = (char *) calloc (1, glyf_prime_size);
+  char *loca_prime_data = (char *) calloc (1, loca_prime_size);
+  if (unlikely (!_write_glyf_and_loca_prime (plan, glyf, glyf_data,
+                                             *use_short_loca,
+                                             instruction_ranges,
+                                             glyf_prime_size, glyf_prime_data,
+                                             loca_prime_size, loca_prime_data))) {
+    free (glyf_prime_data);
+    free (loca_prime_data);
+    instruction_ranges.finish();
+    return false;
+  }
+  instruction_ranges.finish();
+
+  *glyf_prime = hb_blob_create (glyf_prime_data,
+                                glyf_prime_size,
+                                HB_MEMORY_MODE_READONLY,
+                                glyf_prime_data,
+                                free);
+  *loca_prime = hb_blob_create (loca_prime_data,
+                                loca_prime_size,
+                                HB_MEMORY_MODE_READONLY,
+                                loca_prime_data,
+                                free);
+  return true;
+}
+
+/**
+ * hb_subset_glyf:
+ * Subsets the glyph table according to a provided plan.
+ *
+ * Return value: subsetted glyf table.
+ *
+ * Since: 1.7.5
+ **/
+bool
+hb_subset_glyf_and_loca (hb_subset_plan_t *plan,
+                         bool             *use_short_loca, /* OUT */
+                         hb_blob_t       **glyf_prime, /* OUT */
+                         hb_blob_t       **loca_prime /* OUT */)
+{
+  hb_blob_t *glyf_blob = OT::Sanitizer<OT::glyf>().sanitize (plan->source->reference_table (HB_OT_TAG_glyf));
+  const char *glyf_data = hb_blob_get_data(glyf_blob, nullptr);
+
+  OT::glyf::accelerator_t glyf;
+  glyf.init(plan->source);
+  bool result = _hb_subset_glyf_and_loca (glyf,
+                                          glyf_data,
+                                          plan,
+                                          use_short_loca,
+                                          glyf_prime,
+                                          loca_prime);
+
+  hb_blob_destroy (glyf_blob);
+  glyf.fini();
+
+  return result;
+}

Added: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-glyf.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-glyf.hh	                        (rev 0)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-glyf.hh	2018-03-07 22:32:14 UTC (rev 46877)
@@ -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): Garret Rieger
+ */
+
+#ifndef HB_SUBSET_GLYF_HH
+#define HB_SUBSET_GLYF_HH
+
+#include "hb-private.hh"
+
+#include "hb-subset-plan.hh"
+
+HB_INTERNAL bool
+hb_subset_glyf_and_loca (hb_subset_plan_t *plan,
+                         bool             *use_short_loca, /* OUT */
+                         hb_blob_t       **glyf_prime /* OUT */,
+                         hb_blob_t       **loca_prime /* OUT */);
+
+#endif /* HB_SUBSET_GLYF_HH */

Added: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-input.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-input.cc	                        (rev 0)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-input.cc	2018-03-07 22:32:14 UTC (rev 46877)
@@ -0,0 +1,119 @@
+/*
+ * 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): Garret Rieger, Rod Sheeter, Behdad Esfahbod
+ */
+
+#include "hb-object-private.hh"
+#include "hb-subset-private.hh"
+#include "hb-set-private.hh"
+
+/**
+ * hb_subset_input_create_or_fail:
+ *
+ * Return value: New subset input.
+ *
+ * Since: 1.8.0
+ **/
+hb_subset_input_t *
+hb_subset_input_create_or_fail (void)
+{
+  hb_subset_input_t *input = hb_object_create<hb_subset_input_t>();
+
+  if (unlikely (!input))
+    return nullptr;
+
+  input->unicodes = hb_set_create ();
+  input->glyphs = hb_set_create ();
+
+  return input;
+}
+
+/**
+ * hb_subset_input_reference: (skip)
+ * @subset_input: a subset_input.
+ *
+ *
+ *
+ * Return value:
+ *
+ * Since: 1.8.0
+ **/
+hb_subset_input_t *
+hb_subset_input_reference (hb_subset_input_t *subset_input)
+{
+  return hb_object_reference (subset_input);
+}
+
+/**
+ * hb_subset_input_destroy:
+ * @subset_input: a subset_input.
+ *
+ * Since: 1.8.0
+ **/
+void
+hb_subset_input_destroy(hb_subset_input_t *subset_input)
+{
+  if (!hb_object_destroy (subset_input)) return;
+
+  hb_set_destroy (subset_input->unicodes);
+  hb_set_destroy (subset_input->glyphs);
+
+  free (subset_input);
+}
+
+/**
+ * hb_subset_input_unicode_set:
+ * @subset_input: a subset_input.
+ *
+ * Since: 1.8.0
+ **/
+HB_EXTERN hb_set_t *
+hb_subset_input_unicode_set (hb_subset_input_t *subset_input)
+{
+  return subset_input->unicodes;
+}
+
+/**
+ * hb_subset_input_glyph_set:
+ * @subset_input: a subset_input.
+ *
+ * Since: 1.8.0
+ **/
+HB_EXTERN hb_set_t *
+hb_subset_input_glyph_set (hb_subset_input_t *subset_input)
+{
+  return subset_input->glyphs;
+}
+
+/**
+ * hb_subset_input_drop_hints:
+ * @subset_input: a subset_input.
+ *
+ * Since: 1.8.0
+ **/
+HB_EXTERN hb_bool_t *
+hb_subset_input_drop_hints (hb_subset_input_t *subset_input)
+{
+  return &subset_input->drop_hints;
+}

Added: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-plan.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-plan.cc	                        (rev 0)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-plan.cc	2018-03-07 22:32:14 UTC (rev 46877)
@@ -0,0 +1,227 @@
+/*
+ * 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): Garret Rieger, Roderick Sheeter
+ */
+
+#include "hb-subset-private.hh"
+
+#include "hb-subset-plan.hh"
+#include "hb-ot-cmap-table.hh"
+#include "hb-ot-glyf-table.hh"
+
+static int
+_hb_codepoint_t_cmp (const void *pa, const void *pb)
+{
+  hb_codepoint_t a = * (hb_codepoint_t *) pa;
+  hb_codepoint_t b = * (hb_codepoint_t *) pb;
+
+  return a < b ? -1 : a > b ? +1 : 0;
+}
+
+hb_bool_t
+hb_subset_plan_new_gid_for_codepoint (hb_subset_plan_t *plan,
+                                      hb_codepoint_t codepoint,
+                                      hb_codepoint_t *new_gid)
+{
+  // TODO actual map, delete this garbage.
+  for (unsigned int i = 0; i < plan->codepoints.len; i++)
+  {
+    if (plan->codepoints[i] != codepoint) continue;
+    if (!hb_subset_plan_new_gid_for_old_id(plan, plan->gids_to_retain[i], new_gid))
+    {
+      return false;
+    }
+    return true;
+  }
+  return false;
+}
+
+hb_bool_t
+hb_subset_plan_new_gid_for_old_id (hb_subset_plan_t *plan,
+                                   hb_codepoint_t old_gid,
+                                   hb_codepoint_t *new_gid)
+{
+  // the index in old_gids is the new gid; only up to codepoints.len are valid
+  for (unsigned int i = 0; i < plan->gids_to_retain_sorted.len; i++)
+  {
+    if (plan->gids_to_retain_sorted[i] == old_gid)
+    {
+      *new_gid = i;
+      return true;
+    }
+  }
+  return false;
+}
+
+hb_bool_t
+hb_subset_plan_add_table (hb_subset_plan_t *plan,
+                          hb_tag_t tag,
+                          hb_blob_t *contents)
+{
+  hb_blob_t *source_blob = plan->source->reference_table (tag);
+  DEBUG_MSG(SUBSET, nullptr, "add table %c%c%c%c, dest %d bytes, source %d bytes", HB_UNTAG(tag), hb_blob_get_length (contents), hb_blob_get_length (source_blob));
+  hb_blob_destroy (source_blob);
+  return hb_subset_face_add_table(plan->dest, tag, contents);
+}
+
+static void
+_populate_codepoints (hb_set_t *input_codepoints,
+                      hb_prealloced_array_t<hb_codepoint_t>& plan_codepoints)
+{
+  plan_codepoints.alloc (hb_set_get_population (input_codepoints));
+  hb_codepoint_t cp = -1;
+  while (hb_set_next (input_codepoints, &cp)) {
+    hb_codepoint_t *wr = plan_codepoints.push();
+    *wr = cp;
+  }
+  plan_codepoints.qsort (_hb_codepoint_t_cmp);
+}
+
+static void
+_add_gid_and_children (const OT::glyf::accelerator_t &glyf,
+		       hb_codepoint_t gid,
+		       hb_set_t *gids_to_retain)
+{
+  if (hb_set_has (gids_to_retain, gid))
+    // Already visited this gid, ignore.
+    return;
+
+  hb_set_add (gids_to_retain, gid);
+
+  OT::glyf::CompositeGlyphHeader::Iterator composite;
+  if (glyf.get_composite (gid, &composite))
+  {
+    do
+    {
+      _add_gid_and_children (glyf, (hb_codepoint_t) composite.current->glyphIndex, gids_to_retain);
+    } while (composite.move_to_next());
+  }
+}
+
+static void
+_populate_gids_to_retain (hb_face_t *face,
+                          hb_prealloced_array_t<hb_codepoint_t>& codepoints,
+                          hb_prealloced_array_t<hb_codepoint_t>& old_gids,
+                          hb_prealloced_array_t<hb_codepoint_t>& old_gids_sorted)
+{
+  OT::cmap::accelerator_t cmap;
+  OT::glyf::accelerator_t glyf;
+  cmap.init (face);
+  glyf.init (face);
+
+  hb_auto_array_t<unsigned int> bad_indices;
+
+  old_gids.alloc (codepoints.len);
+  for (unsigned int i = 0; i < codepoints.len; i++)
+  {
+    hb_codepoint_t gid;
+    if (!cmap.get_nominal_glyph (codepoints[i], &gid))
+    {
+      gid = -1;
+      *(bad_indices.push ()) = i;
+    }
+    *(old_gids.push ()) = gid;
+  }
+
+  /* Generally there shouldn't be any */
+  while (bad_indices.len > 0)
+  {
+    unsigned int i = bad_indices[bad_indices.len - 1];
+    bad_indices.pop ();
+    DEBUG_MSG(SUBSET, nullptr, "Drop U+%04X; no gid", codepoints[i]);
+    codepoints.remove (i);
+    old_gids.remove (i);
+  }
+
+  // Populate a full set of glyphs to retain by adding all referenced
+  // composite glyphs.
+  // TODO expand with glyphs reached by G*
+  hb_set_t * all_gids_to_retain = hb_set_create ();
+  _add_gid_and_children (glyf, 0, all_gids_to_retain);
+  for (unsigned int i = 0; i < old_gids.len; i++)
+    _add_gid_and_children (glyf, old_gids[i], all_gids_to_retain);
+
+  // Transfer to a sorted list.
+  old_gids_sorted.alloc (hb_set_get_population (all_gids_to_retain));
+  hb_codepoint_t gid = HB_SET_VALUE_INVALID;
+  while (hb_set_next (all_gids_to_retain, &gid))
+    *(old_gids_sorted.push ()) = gid;
+
+  hb_set_destroy (all_gids_to_retain);
+  glyf.fini ();
+  cmap.fini ();
+}
+
+/**
+ * hb_subset_plan_create:
+ * Computes a plan for subsetting the supplied face according
+ * to a provide profile and input. The plan describes
+ * which tables and glyphs should be retained.
+ *
+ * Return value: New subset plan.
+ *
+ * Since: 1.7.5
+ **/
+hb_subset_plan_t *
+hb_subset_plan_create (hb_face_t           *face,
+                       hb_subset_profile_t *profile,
+                       hb_subset_input_t   *input)
+{
+  hb_subset_plan_t *plan = hb_object_create<hb_subset_plan_t> ();
+
+  plan->codepoints.init();
+  plan->gids_to_retain.init();
+  plan->gids_to_retain_sorted.init();
+  plan->source = hb_face_reference (face);
+  plan->dest = hb_subset_face_create ();
+  plan->drop_hints = input->drop_hints;
+
+  _populate_codepoints (input->unicodes, plan->codepoints);
+  _populate_gids_to_retain (face,
+                            plan->codepoints,
+                            plan->gids_to_retain,
+                            plan->gids_to_retain_sorted);
+
+  return plan;
+}
+
+/**
+ * hb_subset_plan_destroy:
+ *
+ * Since: 1.7.5
+ **/
+void
+hb_subset_plan_destroy (hb_subset_plan_t *plan)
+{
+  if (!hb_object_destroy (plan)) return;
+
+  plan->codepoints.finish ();
+  plan->gids_to_retain.finish ();
+  plan->gids_to_retain_sorted.finish ();
+
+  hb_face_destroy (plan->source);
+  hb_face_destroy (plan->dest);
+
+  free (plan);
+}

Added: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-plan.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-plan.hh	                        (rev 0)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-plan.hh	2018-03-07 22:32:14 UTC (rev 46877)
@@ -0,0 +1,85 @@
+/*
+ * 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): Garret Rieger, Roderick Sheeter
+ */
+
+#ifndef HB_SUBSET_PLAN_HH
+#define HB_SUBSET_PLAN_HH
+
+#include "hb-private.hh"
+
+#include "hb-subset.h"
+
+#include "hb-object-private.hh"
+
+struct hb_subset_plan_t {
+  hb_object_header_t header;
+  ASSERT_POD ();
+
+  hb_bool_t drop_hints;
+
+  // TODO(Q1) actual map, drop this crap
+  // Look at me ma, I'm a poor mans map codepoint : new gid
+  // codepoints is sorted and aligned with gids_to_retain.
+
+  // These first two lists provide a mapping from cp -> gid
+  // As a result it does not list the full set of glyphs to retain.
+  hb_prealloced_array_t<hb_codepoint_t> codepoints;
+  hb_prealloced_array_t<hb_codepoint_t> gids_to_retain;
+
+  // This list contains the complete set of glyphs to retain and may contain
+  // more glyphs then the lists above.
+  hb_prealloced_array_t<hb_codepoint_t> gids_to_retain_sorted;
+
+  // Plan is only good for a specific source/dest so keep them with it
+  hb_face_t *source;
+  hb_face_t *dest;
+};
+
+typedef struct hb_subset_plan_t hb_subset_plan_t;
+
+HB_INTERNAL hb_subset_plan_t *
+hb_subset_plan_create (hb_face_t           *face,
+                       hb_subset_profile_t *profile,
+                       hb_subset_input_t   *input);
+
+HB_INTERNAL hb_bool_t
+hb_subset_plan_new_gid_for_old_id(hb_subset_plan_t *plan,
+                                  hb_codepoint_t old_gid,
+                                  hb_codepoint_t *new_gid /* OUT */);
+
+HB_INTERNAL hb_bool_t
+hb_subset_plan_new_gid_for_codepoint(hb_subset_plan_t *plan,
+                                     hb_codepoint_t codepont,
+                                     hb_codepoint_t *new_gid /* OUT */);
+
+HB_INTERNAL hb_bool_t
+hb_subset_plan_add_table(hb_subset_plan_t *plan,
+                         hb_tag_t tag,
+                         hb_blob_t *contents);
+
+HB_INTERNAL void
+hb_subset_plan_destroy (hb_subset_plan_t *plan);
+
+#endif /* HB_SUBSET_PLAN_HH */

Added: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-private.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-private.hh	                        (rev 0)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-private.hh	2018-03-07 22:32:14 UTC (rev 46877)
@@ -0,0 +1,62 @@
+/*
+ * 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): Garret Rieger, Roderick Sheeter
+ */
+
+#ifndef HB_SUBSET_PRIVATE_HH
+#define HB_SUBSET_PRIVATE_HH
+
+
+#include "hb-private.hh"
+
+#include "hb-subset.h"
+
+#include "hb-font-private.hh"
+
+typedef struct hb_subset_face_data_t hb_subset_face_data_t;
+
+struct hb_subset_input_t {
+  hb_object_header_t header;
+  ASSERT_POD ();
+
+  hb_set_t *unicodes;
+  hb_set_t *glyphs;
+
+  hb_bool_t drop_hints;
+  /* TODO
+   *
+   * features
+   * lookups
+   * nameIDs
+   * ...
+   */
+};
+
+HB_INTERNAL hb_face_t *
+hb_subset_face_create (void);
+
+HB_INTERNAL hb_bool_t
+hb_subset_face_add_table (hb_face_t *face, hb_tag_t tag, hb_blob_t *blob);
+
+#endif /* HB_SUBSET_PRIVATE_HH */

Added: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset.cc	                        (rev 0)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset.cc	2018-03-07 22:32:14 UTC (rev 46877)
@@ -0,0 +1,339 @@
+/*
+ * 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): Garret Rieger, Rod Sheeter, Behdad Esfahbod
+ */
+
+#include "hb-private.hh"
+#include "hb-object-private.hh"
+#include "hb-open-type-private.hh"
+
+#include "hb-subset-glyf.hh"
+#include "hb-subset-private.hh"
+#include "hb-subset-plan.hh"
+
+#include "hb-open-file-private.hh"
+#include "hb-ot-cmap-table.hh"
+#include "hb-ot-glyf-table.hh"
+#include "hb-ot-hdmx-table.hh"
+#include "hb-ot-head-table.hh"
+#include "hb-ot-hhea-table.hh"
+#include "hb-ot-hmtx-table.hh"
+#include "hb-ot-maxp-table.hh"
+#include "hb-ot-os2-table.hh"
+
+
+#ifndef HB_NO_VISIBILITY
+const void * const OT::_hb_NullPool[HB_NULL_POOL_SIZE / sizeof (void *)] = {};
+#endif
+
+
+struct hb_subset_profile_t {
+  hb_object_header_t header;
+  ASSERT_POD ();
+};
+
+/**
+ * hb_subset_profile_create:
+ *
+ * Return value: New profile with default settings.
+ *
+ * Since: 1.8.0
+ **/
+hb_subset_profile_t *
+hb_subset_profile_create ()
+{
+  return hb_object_create<hb_subset_profile_t>();
+}
+
+/**
+ * hb_subset_profile_destroy:
+ *
+ * Since: 1.8.0
+ **/
+void
+hb_subset_profile_destroy (hb_subset_profile_t *profile)
+{
+  if (!hb_object_destroy (profile)) return;
+
+  free (profile);
+}
+
+template<typename TableType>
+static bool
+_subset (hb_subset_plan_t *plan)
+{
+  OT::Sanitizer<TableType> sanitizer;
+
+  hb_blob_t *source_blob = sanitizer.sanitize (plan->source->reference_table (TableType::tableTag));
+  const TableType *table = OT::Sanitizer<TableType>::lock_instance (source_blob);
+
+  hb_bool_t result = false;
+  if (table != &OT::Null(TableType))
+    result = table->subset(plan);
+
+  hb_blob_destroy (source_blob);
+  hb_tag_t tag = TableType::tableTag;
+  DEBUG_MSG(SUBSET, nullptr, "OT::%c%c%c%c::subset %s", HB_UNTAG(tag), result ? "success" : "FAILED!");
+  return result;
+}
+
+
+/*
+ * A face that has add_table().
+ */
+
+struct hb_subset_face_data_t
+{
+  struct table_entry_t
+  {
+    inline int cmp (const hb_tag_t *t) const
+    {
+      if (*t < tag) return -1;
+      if (*t > tag) return -1;
+      return 0;
+    }
+
+    hb_tag_t   tag;
+    hb_blob_t *blob;
+  };
+
+  hb_prealloced_array_t<table_entry_t, 32> tables;
+};
+
+static hb_subset_face_data_t *
+_hb_subset_face_data_create (void)
+{
+  hb_subset_face_data_t *data = (hb_subset_face_data_t *) calloc (1, sizeof (hb_subset_face_data_t));
+  if (unlikely (!data))
+    return nullptr;
+
+  return data;
+}
+
+static void
+_hb_subset_face_data_destroy (void *user_data)
+{
+  hb_subset_face_data_t *data = (hb_subset_face_data_t *) user_data;
+
+  for (unsigned int i = 0; i < data->tables.len; i++)
+    hb_blob_destroy (data->tables[i].blob);
+
+  data->tables.finish ();
+
+  free (data);
+}
+
+static hb_blob_t *
+_hb_subset_face_data_reference_blob (hb_subset_face_data_t *data)
+{
+
+  unsigned int table_count = data->tables.len;
+  unsigned int face_length = table_count * 16 + 12;
+
+  for (unsigned int i = 0; i < table_count; i++)
+    face_length += _hb_ceil_to_4 (hb_blob_get_length (data->tables.array[i].blob));
+
+  char *buf = (char *) malloc (face_length);
+  if (unlikely (!buf))
+    return nullptr;
+
+  OT::hb_serialize_context_t c (buf, face_length);
+  OT::OpenTypeFontFile *f = c.start_serialize<OT::OpenTypeFontFile> ();
+
+  bool is_cff = data->tables.lsearch (HB_TAG ('C','F','F',' ')) || data->tables.lsearch (HB_TAG ('C','F','F','2'));
+  hb_tag_t sfnt_tag = is_cff ? OT::OpenTypeFontFile::CFFTag : OT::OpenTypeFontFile::TrueTypeTag;
+
+  OT::Supplier<hb_tag_t>    tags_supplier  (&data->tables[0].tag, table_count, sizeof (data->tables[0]));
+  OT::Supplier<hb_blob_t *> blobs_supplier (&data->tables[0].blob, table_count, sizeof (data->tables[0]));
+  bool ret = f->serialize_single (&c,
+				  sfnt_tag,
+				  tags_supplier,
+				  blobs_supplier,
+				  table_count);
+
+  c.end_serialize ();
+
+  if (unlikely (!ret))
+  {
+    free (buf);
+    return nullptr;
+  }
+
+  return hb_blob_create (buf, face_length, HB_MEMORY_MODE_WRITABLE, buf, free);
+}
+
+static hb_blob_t *
+_hb_subset_face_reference_table (hb_face_t *face, hb_tag_t tag, void *user_data)
+{
+  hb_subset_face_data_t *data = (hb_subset_face_data_t *) user_data;
+
+  if (!tag)
+    return _hb_subset_face_data_reference_blob (data);
+
+  hb_subset_face_data_t::table_entry_t *entry = data->tables.lsearch (tag);
+  if (entry)
+    return hb_blob_reference (entry->blob);
+
+  return nullptr;
+}
+
+/* TODO: Move this to hb-face.h and rename to hb_face_builder_create()
+ * with hb_face_builder_add_table(). */
+hb_face_t *
+hb_subset_face_create (void)
+{
+  hb_subset_face_data_t *data = _hb_subset_face_data_create ();
+  if (unlikely (!data)) return hb_face_get_empty ();
+
+  return hb_face_create_for_tables (_hb_subset_face_reference_table,
+				    data,
+				    _hb_subset_face_data_destroy);
+}
+
+hb_bool_t
+hb_subset_face_add_table (hb_face_t *face, hb_tag_t tag, hb_blob_t *blob)
+{
+  if (unlikely (face->destroy != _hb_subset_face_data_destroy))
+    return false;
+
+  hb_subset_face_data_t *data = (hb_subset_face_data_t *) face->user_data;
+  hb_subset_face_data_t::table_entry_t *entry = data->tables.push ();
+  if (unlikely (!entry))
+    return false;
+
+  entry->tag = tag;
+  entry->blob = hb_blob_reference (blob);
+
+  return true;
+}
+
+static bool
+_subset_table (hb_subset_plan_t *plan,
+               hb_tag_t          tag)
+{
+  DEBUG_MSG(SUBSET, nullptr, "begin subset %c%c%c%c", HB_UNTAG(tag));
+  bool result = true;
+  switch (tag) {
+    case HB_OT_TAG_glyf:
+      result = _subset<const OT::glyf> (plan);
+      break;
+    case HB_OT_TAG_hdmx:
+      result = _subset<const OT::hdmx> (plan);
+      break;
+    case HB_OT_TAG_head:
+      // TODO that won't work well if there is no glyf
+      DEBUG_MSG(SUBSET, nullptr, "skip head, handled by glyf");
+      result = true;
+      break;
+    case HB_OT_TAG_hhea:
+      DEBUG_MSG(SUBSET, nullptr, "skip hhea handled by hmtx");
+      return true;
+    case HB_OT_TAG_hmtx:
+      result = _subset<const OT::hmtx> (plan);
+      break;
+    case HB_OT_TAG_maxp:
+      result = _subset<const OT::maxp> (plan);
+      break;
+    case HB_OT_TAG_loca:
+      DEBUG_MSG(SUBSET, nullptr, "skip loca handled by glyf");
+      return true;
+    case HB_OT_TAG_cmap:
+      result = _subset<const OT::cmap> (plan);
+      break;
+    case HB_OT_TAG_os2:
+      result = _subset<const OT::os2> (plan);
+      break;
+    default:
+      hb_blob_t *source_table = hb_face_reference_table(plan->source, tag);
+      if (likely (source_table))
+        result = hb_subset_plan_add_table(plan, tag, source_table);
+      else
+        result = false;
+      hb_blob_destroy (source_table);
+      break;
+  }
+  DEBUG_MSG(SUBSET, nullptr, "subset %c%c%c%c %s", HB_UNTAG(tag), result ? "ok" : "FAILED");
+  return result;
+}
+
+static bool
+_should_drop_table(hb_subset_plan_t *plan, hb_tag_t tag)
+{
+    switch (tag) {
+      case HB_TAG ('c', 'v', 'a', 'r'): /* hint table, fallthrough */
+      case HB_TAG ('c', 'v', 't', ' '): /* hint table, fallthrough */
+      case HB_TAG ('f', 'p', 'g', 'm'): /* hint table, fallthrough */
+      case HB_TAG ('p', 'r', 'e', 'p'): /* hint table, fallthrough */
+      case HB_TAG ('h', 'd', 'm', 'x'): /* hint table, fallthrough */
+      case HB_TAG ('V', 'D', 'M', 'X'): /* hint table, fallthrough */
+        return plan->drop_hints;
+      case HB_TAG ('G', 'D', 'E', 'F'): /* temporary */
+      case HB_TAG ('G', 'P', 'O', 'S'): /* temporary */
+      case HB_TAG ('G', 'S', 'U', 'B'): /* temporary */
+      case HB_TAG ('D', 'S', 'I', 'G'):
+        return true;
+      default:
+        return false;
+  }
+}
+
+/**
+ * hb_subset:
+ * @source: font face data to be subset.
+ * @profile: profile to use for the subsetting.
+ * @input: input to use for the subsetting.
+ *
+ * Subsets a font according to provided profile and input.
+ **/
+hb_face_t *
+hb_subset (hb_face_t *source,
+           hb_subset_profile_t *profile,
+           hb_subset_input_t *input)
+{
+  if (unlikely (!profile || !input || !source)) return hb_face_get_empty();
+
+  hb_subset_plan_t *plan = hb_subset_plan_create (source, profile, input);
+
+  hb_tag_t table_tags[32];
+  unsigned int offset = 0, count;
+  bool success = true;
+  do {
+    count = ARRAY_LENGTH (table_tags);
+    hb_face_get_table_tags (source, offset, &count, table_tags);
+    for (unsigned int i = 0; i < count; i++)
+    {
+      hb_tag_t tag = table_tags[i];
+      if (_should_drop_table(plan, tag))
+      {
+        DEBUG_MSG(SUBSET, nullptr, "drop %c%c%c%c", HB_UNTAG(tag));
+        continue;
+      }
+      success = success && _subset_table (plan, tag);
+    }
+  } while (count == ARRAY_LENGTH (table_tags));
+
+  hb_face_t *result = success ? hb_face_reference(plan->dest) : hb_face_get_empty();
+  hb_subset_plan_destroy (plan);
+  return result;
+}

Added: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset.h
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset.h	                        (rev 0)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset.h	2018-03-07 22:32:14 UTC (rev 46877)
@@ -0,0 +1,83 @@
+/*
+ * 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): Rod Sheeter
+ */
+
+#ifndef HB_SUBSET_H
+#define HB_SUBSET_H
+
+#include "hb.h"
+
+HB_BEGIN_DECLS
+
+/*
+ * hb_subset_profile_t
+ * Things that change based on target environment, e.g. OS.
+ * Threadsafe for multiple concurrent subset operations.
+ */
+
+typedef struct hb_subset_profile_t hb_subset_profile_t;
+
+HB_EXTERN hb_subset_profile_t *
+hb_subset_profile_create (void);
+
+HB_EXTERN void
+hb_subset_profile_destroy (hb_subset_profile_t *profile);
+
+/*
+ * hb_subset_input_t
+ *
+ * Things that change based on the input. Characters to keep, etc.
+ */
+
+typedef struct hb_subset_input_t hb_subset_input_t;
+
+HB_EXTERN hb_subset_input_t *
+hb_subset_input_create_or_fail (void);
+
+HB_EXTERN hb_subset_input_t *
+hb_subset_input_reference (hb_subset_input_t *subset_input);
+
+HB_EXTERN void
+hb_subset_input_destroy (hb_subset_input_t *subset_input);
+
+HB_EXTERN hb_set_t *
+hb_subset_input_unicode_set (hb_subset_input_t *subset_input);
+
+HB_EXTERN hb_set_t *
+hb_subset_input_glyph_set (hb_subset_input_t *subset_input);
+
+HB_EXTERN hb_bool_t *
+hb_subset_input_drop_hints (hb_subset_input_t *subset_input);
+
+/* hb_subset() */
+
+HB_EXTERN hb_face_t *
+hb_subset (hb_face_t *source,
+	   hb_subset_profile_t *profile,
+           hb_subset_input_t *input);
+
+HB_END_DECLS
+
+#endif /* HB_SUBSET_H */


Property changes on: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset.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-uniscribe.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-uniscribe.cc	2018-03-07 21:52:46 UTC (rev 46876)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-uniscribe.cc	2018-03-07 22:32:14 UTC (rev 46877)
@@ -1025,8 +1025,6 @@
     pos->x_advance = x_mult * (int32_t) info->mask;
     pos->x_offset = x_mult * (backward ? -info->var1.i32 : info->var1.i32);
     pos->y_offset = y_mult * info->var2.i32;
-
-    info->mask = HB_GLYPH_FLAG_UNSAFE_TO_BREAK;
   }
 
   if (backward)

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/main.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/main.cc	2018-03-07 21:52:46 UTC (rev 46876)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/main.cc	2018-03-07 22:32:14 UTC (rev 46877)
@@ -37,7 +37,9 @@
 
 using namespace OT;
 
+#ifndef HB_NO_VISIBILITY
 const void * const OT::_hb_NullPool[HB_NULL_POOL_SIZE / sizeof (void *)] = {};
+#endif
 
 int
 main (int argc, char **argv)

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/test-buffer-serialize.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/test-buffer-serialize.cc	2018-03-07 21:52:46 UTC (rev 46876)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/test-buffer-serialize.cc	2018-03-07 22:32:14 UTC (rev 46877)
@@ -101,7 +101,7 @@
 
   bool ret = true;
   char line[BUFSIZ], out[BUFSIZ];
-  while (fgets (line, sizeof(line), stdin) != 0)
+  while (fgets (line, sizeof(line), stdin) != nullptr)
   {
     hb_buffer_clear_contents (buf);
 

Added: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/test-unicode-ranges.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/test-unicode-ranges.cc	                        (rev 0)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/test-unicode-ranges.cc	2018-03-07 22:32:14 UTC (rev 46877)
@@ -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): Garret Rieger
+ */
+
+#include "hb-private.hh"
+
+#include "hb-ot-os2-unicode-ranges.hh"
+
+void
+test (hb_codepoint_t cp, unsigned int bit)
+{
+  if (OT::hb_get_unicode_range_bit (cp) != bit)
+  {
+    fprintf (stderr, "got incorrect bit (%d) for cp 0x%X. Should have been %d.",
+             OT::hb_get_unicode_range_bit (cp),
+             cp,
+             bit);
+    abort();
+  }
+}
+
+void
+test_get_unicode_range_bit (void)
+{
+  test (0x0000, 0);
+  test (0x0042, 0);
+  test (0x007F, 0);
+  test (0x0080, 1);
+
+  test (0x30A0, 50);
+  test (0x30B1, 50);
+  test (0x30FF, 50);
+
+  test (0x10FFFD, 90);
+
+  test (0x30000, -1);
+  test (0x110000, -1);
+}
+
+int
+main (void)
+{
+  test_get_unicode_range_bit ();
+  return 0;
+}

Modified: trunk/Build/source/libs/harfbuzz/include/Makefile.am
===================================================================
--- trunk/Build/source/libs/harfbuzz/include/Makefile.am	2018-03-07 21:52:46 UTC (rev 46876)
+++ trunk/Build/source/libs/harfbuzz/include/Makefile.am	2018-03-07 22:32:14 UTC (rev 46877)
@@ -23,6 +23,7 @@
 	$(HARFBUZZ_SRC)/hb-set.h \
 	$(HARFBUZZ_SRC)/hb-shape.h \
 	$(HARFBUZZ_SRC)/hb-shape-plan.h \
+	$(HARFBUZZ_SRC)/hb-subset.h \
 	$(HARFBUZZ_SRC)/hb-unicode.h \
 	$(HARFBUZZ_BLD)/hb-version.h
 

Modified: trunk/Build/source/libs/harfbuzz/include/Makefile.in
===================================================================
--- trunk/Build/source/libs/harfbuzz/include/Makefile.in	2018-03-07 21:52:46 UTC (rev 46876)
+++ trunk/Build/source/libs/harfbuzz/include/Makefile.in	2018-03-07 22:32:14 UTC (rev 46877)
@@ -255,12 +255,12 @@
 	$(HARFBUZZ_SRC)/hb-deprecated.h $(HARFBUZZ_SRC)/hb-face.h \
 	$(HARFBUZZ_SRC)/hb-font.h $(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-shape.h $(HARFBUZZ_SRC)/hb-ot-tag.h \
-	$(HARFBUZZ_SRC)/hb-ot-var.h $(HARFBUZZ_SRC)/hb-icu.h \
-	$(HARFBUZZ_SRC)/hb-graphite2.h
+	$(HARFBUZZ_SRC)/hb-subset.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-shape.h \
+	$(HARFBUZZ_SRC)/hb-ot-tag.h $(HARFBUZZ_SRC)/hb-ot-var.h \
+	$(HARFBUZZ_SRC)/hb-icu.h $(HARFBUZZ_SRC)/hb-graphite2.h
 all: all-am
 
 .SUFFIXES:

Modified: trunk/Build/source/libs/harfbuzz/version.ac
===================================================================
--- trunk/Build/source/libs/harfbuzz/version.ac	2018-03-07 21:52:46 UTC (rev 46876)
+++ trunk/Build/source/libs/harfbuzz/version.ac	2018-03-07 22:32:14 UTC (rev 46877)
@@ -8,4 +8,4 @@
 dnl --------------------------------------------------------
 dnl
 dnl  m4-include this file to define the current harfbuzz version
-m4_define([harfbuzz_version], [1.7.5])
+m4_define([harfbuzz_version], [1.7.6])



More information about the tex-live-commits mailing list