texlive[49277] Build/source/libs: harfbuzz-2.2.0

commits+kakuto at tug.org commits+kakuto at tug.org
Fri Nov 30 02:09:56 CET 2018


Revision: 49277
          http://tug.org/svn/texlive?view=revision&revision=49277
Author:   kakuto
Date:     2018-11-30 02:09:56 +0100 (Fri, 30 Nov 2018)
Log Message:
-----------
harfbuzz-2.2.0

Modified Paths:
--------------
    trunk/Build/source/libs/README
    trunk/Build/source/libs/harfbuzz/ChangeLog
    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/ChangeLog
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/NEWS
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/README
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/configure.ac
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/Makefile.am
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/Makefile.sources
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/gen-emoji-table.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.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-feat-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-lcar-table.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-morx-table.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-trak-table.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-map.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-map.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-atomic.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-blob.hh
    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-debug.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-deprecated.h
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-dsalgs.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-face.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ft.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-glib.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-icu.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-machinery.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-null.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-open-file.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-open-type.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-cmap-table.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-color-colr-table.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-color-svg-table.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-face.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-font.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-glyf-table.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-kern-table.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-common.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-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.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-map.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-math-table.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-post-table.hh
    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-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-complex.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-var-fvar-table.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-var.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-var.h
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-vorg-table.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-set.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-shape.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-shaper.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-static.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ucdn.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-unicode-emoji-table.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-uniscribe.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-vector.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb.hh
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/test-name-table.cc
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/test-ot-color.cc
    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/hb-aat-layout.h
    trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat.h

Modified: trunk/Build/source/libs/README
===================================================================
--- trunk/Build/source/libs/README	2018-11-29 23:34:53 UTC (rev 49276)
+++ trunk/Build/source/libs/README	2018-11-30 01:09:56 UTC (rev 49277)
@@ -25,7 +25,7 @@
   http://sourceforge.net/projects/silgraphite/files/graphite2/
   (requires C++11)
 
-harfbuzz 2.1.3 - checked 19nov18
+harfbuzz 2.2.0 - checked 30nov18
   http://www.freedesktop.org/software/harfbuzz/release/
 
 icu 61.1 - checked 29mar18

Modified: trunk/Build/source/libs/harfbuzz/ChangeLog
===================================================================
--- trunk/Build/source/libs/harfbuzz/ChangeLog	2018-11-29 23:34:53 UTC (rev 49276)
+++ trunk/Build/source/libs/harfbuzz/ChangeLog	2018-11-30 01:09:56 UTC (rev 49277)
@@ -1,3 +1,8 @@
+2018-11-30  Akira Kakuto  <kakuto at fuk.kindai.ac.jp>
+
+	Import harfbuzz-2.2.0.
+	* version.ac, include/Makefile.am: Adjusted.
+
 2018-11-19  Akira Kakuto  <kakuto at fuk.kindai.ac.jp>
 
 	Import harfbuzz-2.1.3.

Modified: trunk/Build/source/libs/harfbuzz/TLpatches/ChangeLog
===================================================================
--- trunk/Build/source/libs/harfbuzz/TLpatches/ChangeLog	2018-11-29 23:34:53 UTC (rev 49276)
+++ trunk/Build/source/libs/harfbuzz/TLpatches/ChangeLog	2018-11-30 01:09:56 UTC (rev 49277)
@@ -1,3 +1,8 @@
+2018-11-30  Akira Kakuto  <kakuto at fuk.kindai.ac.jp>
+
+	Imported harfbuzz-2.2.0 source tree from:
+	  http://www.freedesktop.org/software/harfbuzz/release/
+
 2018-11-19  Akira Kakuto  <kakuto at fuk.kindai.ac.jp>
 
 	Imported harfbuzz-2.1.3 source tree from:

Modified: trunk/Build/source/libs/harfbuzz/TLpatches/TL-Changes
===================================================================
--- trunk/Build/source/libs/harfbuzz/TLpatches/TL-Changes	2018-11-29 23:34:53 UTC (rev 49276)
+++ trunk/Build/source/libs/harfbuzz/TLpatches/TL-Changes	2018-11-30 01:09:56 UTC (rev 49277)
@@ -1,4 +1,4 @@
-Changes applied to the harfbuzz-2.1.3/ tree as obtained from:
+Changes applied to the harfbuzz-2.2.0/ tree as obtained from:
 	http://www.freedesktop.org/software/harfbuzz/release/
 
 Removed:

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

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/ChangeLog
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/ChangeLog	2018-11-29 23:34:53 UTC (rev 49276)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/ChangeLog	2018-11-30 01:09:56 UTC (rev 49277)
@@ -1,3 +1,2442 @@
+commit 7b85081be4fbd6cad75dc28ae933ce920f71b22d
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Nov 29 11:34:22 2018 -0500
+
+    [icu] Minor
+
+ src/hb-icu.cc | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 0bcb1de1265368a27e53c6d935c965cbcb4130a0
+Merge: e0307de8 a85886fc
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Nov 29 10:39:18 2018 -0500
+
+    Merge pull request #1418 from gvictor/replace_icu_deprecated
+
+    Replace @Deprecated ICU API - USCRIPT_CODE_LIMIT
+
+commit e0307de818ad1f70ef96938642bda61d7a62532a
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Thu Nov 29 11:36:05 2018 +0330
+
+    [test][aat.kern] More (#1427)
+
+ test/shaping/data/in-house/tests/macos.tests | 12 ++++++++----
+ 1 file changed, 8 insertions(+), 4 deletions(-)
+
+commit 949655aa7853a4513af6b5247b9822be38f5d322
+Merge: 7b78d223 d3d0f15f
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Wed Nov 28 17:21:57 2018 -0500
+
+    Merge pull request #1425 from mbutterick/patch-1
+
+    update simple shaping example (closes #298)
+
+commit d3d0f15f7d20bedf7018fb2fb652f92ff4159bd7
+Author: Matthew Butterick <mbutterick at users.noreply.github.com>
+Date:   Wed Nov 28 13:46:12 2018 -0800
+
+    update simple shaping example (closes #298)
+
+    add call to `FT_Set_Char_Size`, otherwise default size remains at
+    `0`, and glyph positions come back as `0` too
+
+ docs/usermanual-getting-started.xml | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 7b78d2233df0e51e2967bc54a9202b3f9e05059a
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Thu Nov 29 00:55:05 2018 +0330
+
+    [test][aat] Update expectency
+
+    It is not visually noticeable but apparently affected by kern format2
+    correct implementation.
+    I should've checked CoreText result which can't as CircleCI outage.
+
+ test/shaping/data/in-house/tests/macos.tests | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 5155067e10011f78f1ce35b3dadb062bccd3a706
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Thu Nov 29 00:07:00 2018 +0330
+
+    [test] Add test for format2 kern (#1423)
+
+ test/shaping/data/in-house/Makefile.sources             |   1 +
+ .../fonts/e39391c77a6321c2ac7a2d644de0396470cd4bfe.ttf  | Bin 0 ->
+ 34116 bytes
+ test/shaping/data/in-house/tests/kern-format2.tests     |   3 +++
+ 3 files changed, 4 insertions(+)
+
+commit 42a2b496e428521151ff5cb07454d2e993f892cc
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Wed Nov 28 15:24:30 2018 -0500
+
+    [kerx] Fix Format2 index calc again
+
+ src/hb-aat-layout-common.hh     | 14 ++++++++++++++
+ src/hb-aat-layout-kerx-table.hh |  2 +-
+ 2 files changed, 15 insertions(+), 1 deletion(-)
+
+commit 9e4f03b6ed80a81f8aee5ba93564f5eabab4299c
+Merge: 19863c80 a3267cf8
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Wed Nov 28 15:08:01 2018 -0500
+
+    Merge remote-tracking branch 'fdo/master'
+
+commit a3267cf803082af157a7f2b0026af2633b14f8e3
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Wed Nov 28 15:06:01 2018 -0500
+
+    [kern] Fix kern table Format2 offsetToIndex
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1421
+
+ src/hb-aat-layout-kerx-table.hh | 8 ++++++--
+ 1 file changed, 6 insertions(+), 2 deletions(-)
+
+commit f9a9c0fd1e561715d696c7bd840bab552d0718ee
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Wed Nov 28 14:51:56 2018 -0500
+
+    [kerx] Fix ClassTable implementation for 'kern' table Format 2
+
+ src/hb-aat-layout-common.hh     |  8 +++++---
+ src/hb-aat-layout-kerx-table.hh | 10 ++--------
+ 2 files changed, 7 insertions(+), 11 deletions(-)
+
+commit 5b4a789ca857664668ff69936574dcd09bee6065
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Wed Nov 28 14:46:26 2018 -0500
+
+    [aat] Towards adding two ClassTable's
+
+ src/hb-aat-layout-common.hh | 40 ++++++++++++++++++++--------------------
+ 1 file changed, 20 insertions(+), 20 deletions(-)
+
+commit 19863c805982d5d1d059d4dd9376039d3fdaabcd
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Wed Nov 28 20:28:42 2018 +0330
+
+    [test][aat] Add a test and make macOS runners faster (#1422)
+
+ .circleci/config.yml                         | 15 +++-----
+ test/shaping/data/in-house/tests/macos.tests | 54
+ ++++++++++++++--------------
+ 2 files changed, 33 insertions(+), 36 deletions(-)
+
+commit 987f4187722a05e3f360b85c66309a351fc5d6ad
+Merge: 1042d9fb 4e2a03b6
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Nov 27 17:40:32 2018 -0500
+
+    Merge pull request #1398 from Adenilson/bigInt01
+
+    Optimize harfbuzz big integer conversions
+
+commit 4e2a03b6b6e0c0d1c4edea10dc1aae63eeb6c581
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Nov 27 17:40:09 2018 -0500
+
+    Comment
+
+ src/hb-machinery.hh | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit 4a719a7f4c997ea7e47588bc0288c97706dae015
+Author: Adenilson Cavalcanti <adenilson.cavalcanti at arm.com>
+Date:   Tue Nov 20 14:41:19 2018 -0800
+
+    Optimize harfbuzz big integer conversions
+
+    Profiling showed that type conversions were adding considerable
+    cycles in time
+    spent doing text shaping.
+
+    The idea is to optimize it using native processor instructions to
+    help Blink
+    layout performance.
+
+    Doing further investigation revelead that compilers may not use the
+    proper instruction on ARM 32bits builds (i.e. REV16).
+
+    One way to insure that the generated ASM was ideal for both gcc/clang
+    was using __builtin_bswap16.
+
+    Added bonus is that we no longer need to test for CPU architecture.
+
+ src/hb-machinery.hh | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit a85886fc77083084e9a12ee15b47eab7876f9f53
+Author: Victor Chang <vichang at google.com>
+Date:   Tue Nov 27 11:34:56 2018 +0000
+
+    Replace @Deprecated ICU API - USCRIPT_CODE_LIMIT
+
+    Use of the deprecated API USCRIPT_CODE_LIMIT prevents harfbuzz
+    using the ICU4C as a shared library.
+
+    The API has been replaced by u_getIntPropertyMaxValue(UCHAR_SCRIPT)
+
+ src/hb-icu.cc | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 1042d9fbc05aff9d51f15c2824a8521e963d0acd
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Mon Nov 26 18:58:39 2018 +0330
+
+    [ci] Add .codecov.yml
+
+    Similar to
+    https://github.com/GoogleChrome/lighthouse/blob/master/.codecov.yml
+
+    No strong preference on commenting, feel free to enable it again
+
+ .codecov.yml | 7 +++++++
+ 1 file changed, 7 insertions(+)
+
+commit 97eaedca5de76c74534bab41562aee130098558a
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Mon Nov 26 16:58:58 2018 +0330
+
+    [test][aat] Enable Tamil MN test (#1414)
+
+ test/shaping/data/in-house/tests/macos.tests | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+commit 574d888c8a409295a952361a39c8e83a52a0fc3d
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sun Nov 25 16:51:22 2018 -0500
+
+    [aat] Ignore GSUB table of Muthu Foundry if they have morx table
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1410
+
+ src/hb-ot-layout-gpos-table.hh |  3 +++
+ src/hb-ot-layout-gsub-table.hh |  3 +++
+ src/hb-ot-layout-gsubgpos.hh   |  5 +++++
+ src/hb-ot-layout.cc            | 36 +++++++++++++++++++++++++++++++++++-
+ 4 files changed, 46 insertions(+), 1 deletion(-)
+
+commit 4151c2848d8df75b6d0a4f5d79bee843158aa4a4
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sun Nov 25 16:38:36 2018 -0500
+
+    [GDEF] Move more code
+
+ src/hb-ot-layout-gdef-table.hh | 10 +++++++++-
+ src/hb-ot-layout.cc            | 11 -----------
+ 2 files changed, 9 insertions(+), 12 deletions(-)
+
+commit 4f21703f225b6977196ef180e8d7300ea86d2cc3
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sun Nov 25 15:59:18 2018 -0500
+
+    [GDEF] Move code around
+
+ src/hb-ot-layout-gdef-table.hh |  3 +++
+ src/hb-ot-layout.cc            | 16 +++++++---------
+ 2 files changed, 10 insertions(+), 9 deletions(-)
+
+commit 4ed9fb1a0050f3151f9332f08c8bb2c13652c607
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sun Nov 25 15:51:01 2018 -0500
+
+    [GDEF] Minor
+
+ src/hb-ot-layout.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 0e3a48e54248d69197e8fb23c824d987f91b3bf7
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Sun Nov 25 13:37:23 2018 +0330
+
+    [test][aat] fix 10.13.6 Helvetica expectation
+
+ test/shaping/data/in-house/tests/macos.tests | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit cbc541b426f01717641f1f3529a7c9703aec7a28
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Sun Nov 25 12:50:30 2018 +0330
+
+    [aat] Add m grave test (#1412)
+
+ test/shaping/data/in-house/tests/macos.tests | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+commit fa26ad0f48462063f2160a43cb62b018bb21e251
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Sun Nov 25 11:25:17 2018 +0330
+
+    [aat] Fix macos expectation
+
+ test/shaping/data/in-house/tests/macos.tests | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 926f512f354835f8323bb2c2e58789dd918a9b65
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sun Nov 25 01:14:40 2018 -0500
+
+    [aat.feat] Rework API and implementation
+
+    Fixes https://github.com/harfbuzz/harfbuzz/pull/1346
+
+ docs/harfbuzz-docs.xml          |  5 +++
+ docs/harfbuzz-sections.txt      |  7 ++--
+ src/hb-aat-layout-feat-table.hh | 89
+ +++++++++++++++++++++++------------------
+ src/hb-aat-layout.cc            | 80 ++++++++++++++++--------------------
+ src/hb-aat-layout.h             | 32 +++++++++------
+ test/api/test-aat-layout.c      | 58 ++++++++++++++-------------
+ 6 files changed, 141 insertions(+), 130 deletions(-)
+
+commit 84dacbca7ea54a3ca2d5d711d50272a7f3baf456
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sat Nov 24 12:08:36 2018 -0500
+
+    [aat.feat] Add _MAX_VALUE to enums
+
+ src/hb-aat-layout.h | 8 ++++++--
+ 1 file changed, 6 insertions(+), 2 deletions(-)
+
+commit 3922aae1620958768d3257c0988432d5609dca1b
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sat Nov 24 11:02:04 2018 -0500
+
+    [aat.feat] Minor
+
+ src/hb-aat-layout-feat-table.hh | 12 ++----------
+ 1 file changed, 2 insertions(+), 10 deletions(-)
+
+commit 0f8e98eca2463da3b83d1b66a19259a584df1682
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sat Nov 24 11:00:42 2018 -0500
+
+    [aat.feat] Whitespace
+
+ src/hb-aat-layout-feat-table.hh | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit c2256068339c9e10c8e6df5d1749be4b4eb04ad4
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sat Nov 24 10:54:40 2018 -0500
+
+    [aat.feat] Port to SortedUnsizedArrayOf.bsearch()
+
+ src/hb-aat-layout-feat-table.hh | 19 +++++++------------
+ 1 file changed, 7 insertions(+), 12 deletions(-)
+
+commit 52ae9867efd6520d17306b9f3ad612fe5463e93d
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sat Nov 24 10:46:56 2018 -0500
+
+    [AAT.feat] Use lsearch for looking up SettingName's
+
+    They are not sorted.
+
+ src/hb-aat-layout-feat-table.hh | 18 ++++++------------
+ src/hb-open-type.hh             | 16 ++++++++--------
+ src/hb-static.cc                |  6 ++++--
+ 3 files changed, 18 insertions(+), 22 deletions(-)
+
+commit 44b9331f663c09174d94e06baf36d48a50599c42
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sat Nov 24 10:30:35 2018 -0500
+
+    [aat] Fix include issues
+
+ src/Makefile.am | 2 ++
+ src/hb-aat.h    | 2 ++
+ 2 files changed, 4 insertions(+)
+
+commit b206133d1f616339a57996b634dadc7f0a2c4cfb
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Nov 23 14:05:11 2018 -0500
+
+    [aat] Move contents of hb-aat.h to hb-aat-layout.h
+
+    Since it was pages and pages...
+
+ src/Makefile.sources |   1 +
+ src/hb-aat-layout.cc |   1 -
+ src/hb-aat-layout.h  | 452
+ +++++++++++++++++++++++++++++++++++++++++++++++++++
+ src/hb-aat-layout.hh |   1 -
+ src/hb-aat-map.hh    |   1 -
+ src/hb-aat.h         | 417
+ +----------------------------------------------
+ src/hb.hh            |   2 +
+ 7 files changed, 458 insertions(+), 417 deletions(-)
+
+commit 2cb235d0210e74ea4ee123767b489301a9c340ab
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Nov 23 12:23:35 2018 -0500
+
+    [aat.feat] Fix enum namespace
+
+ src/hb-aat-layout-feat-table.hh |   2 +-
+ src/hb-aat-layout-morx-table.hh |   4 +-
+ src/hb-aat-layout.cc            | 150 ++++++------
+ src/hb-aat.h                    | 502
+ ++++++++++++++++++++--------------------
+ test/api/test-aat-layout.c      |   2 +-
+ 5 files changed, 330 insertions(+), 330 deletions(-)
+
+commit 712762cabbbe85e6ab8361cd115c22a176827734
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Nov 23 12:21:02 2018 -0500
+
+    Minor
+
+ src/hb-aat.h | 10 ++++++----
+ 1 file changed, 6 insertions(+), 4 deletions(-)
+
+commit e20f81f4fa977a8d22c6afee1e46fbf46bc182d9
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Nov 23 11:57:42 2018 -0500
+
+    [aat] Rename feat API a bit more
+
+ docs/harfbuzz-sections.txt      | 10 +++++-----
+ src/hb-aat-layout-feat-table.hh |  8 ++++----
+ src/hb-aat-layout.cc            | 32 ++++++++++++++++----------------
+ src/hb-aat.h                    | 26 +++++++++++++-------------
+ test/api/test-aat-layout.c      | 28 ++++++++++++++--------------
+ 5 files changed, 52 insertions(+), 52 deletions(-)
+
+commit 54f4c17f0a932b0ca0317e1ad5e5e43a11a83fd1
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Fri Nov 23 12:05:06 2018 +0330
+
+    [feat] Rename API uses of setting to selector
+
+ docs/harfbuzz-sections.txt      |  6 +--
+ src/hb-aat-layout-feat-table.hh | 52 ++++++++++++------------
+ src/hb-aat-layout-morx-table.hh |  2 +-
+ src/hb-aat-layout.cc            | 88
+ ++++++++++++++++++++---------------------
+ src/hb-aat-layout.hh            |  4 +-
+ src/hb-aat-map.cc               |  2 +-
+ src/hb-aat-map.hh               |  2 +-
+ src/hb-aat.h                    | 20 +++++-----
+ test/api/test-aat-layout.c      | 46 ++++++++++-----------
+ 9 files changed, 111 insertions(+), 111 deletions(-)
+
+commit 9c64b216ec7ae2c2c124ebd00dc6fa568752be78
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Fri Nov 23 11:44:53 2018 +0330
+
+    [feat] Apply renamings and add documentation
+
+ docs/harfbuzz-sections.txt | 10 ++++++++++
+ src/hb-aat-layout.cc       | 44
+ ++++++++++++++++++++++++++++++++++++++------
+ src/hb-aat.h               |  6 +++---
+ test/api/test-aat-layout.c | 28 ++++++++++++++--------------
+ 4 files changed, 65 insertions(+), 23 deletions(-)
+
+commit a8726cb4830f51a820db4bc6346ed09c91493817
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Sat Nov 17 14:23:11 2018 +0330
+
+    [feat] Use bsearch
+
+ src/hb-aat-layout-feat-table.hh | 36 ++++++++++++++++++++++--------------
+ src/hb-aat-layout-morx-table.hh |  2 +-
+ src/hb.hh                       |  2 ++
+ 3 files changed, 25 insertions(+), 15 deletions(-)
+
+commit 4009a05ca7de21fff2176621597cd0cd01e9d80e
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Sat Nov 17 11:30:50 2018 +0330
+
+    [feat] Address Behdad comments
+
+ src/hb-aat-layout-feat-table.hh | 114 ++++---
+ src/hb-aat-layout.cc            |  14 +-
+ src/hb-aat.h                    | 673
+ +++++++++++++++++-----------------------
+ test/api/test-aat-layout.c      |  88 +++---
+ 4 files changed, 423 insertions(+), 466 deletions(-)
+
+commit 19b6025534a98df96d67eee45c5c1ea6fbc1cc43
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Sat Nov 17 01:07:09 2018 +0330
+
+    [feat] Address @behdad comments
+
+ src/Makefile.sources            |   2 +-
+ src/hb-aat-layout-feat-table.hh |  82 +++----
+ src/hb-aat-layout-morx-table.hh |   2 +-
+ src/hb-aat-layout.cc            | 104 ++++----
+ src/hb-aat-map.cc               |   2 +-
+ src/hb-aat.h                    | 533
+ ++++++++++++----------------------------
+ src/hb-ot.h                     |   1 -
+ test/api/test-aat-layout.c      |  84 +++----
+ 8 files changed, 282 insertions(+), 528 deletions(-)
+
+commit 9212ec203c948e290a1d92b701619ccdbc89377c
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Fri Nov 9 00:50:10 2018 +0330
+
+    [feat] Complete feature types list
+
+ src/hb-aat-layout-morx-table.hh |   2 +-
+ src/hb-aat-layout.cc            | 154 ++++-----
+ src/hb-aat.h                    | 697
+ ++++++++++++++++++++++++++++++++++++++--
+ 3 files changed, 752 insertions(+), 101 deletions(-)
+
+commit fbad794bd2c574363a0c5c5fefabce764496f93c
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Thu Nov 1 22:24:42 2018 +0330
+
+    [feat] Add feature iteration API
+
+ src/hb-aat-layout-feat-table.hh | 36 +++++++++++++++++++++--------
+ src/hb-aat-layout.cc            | 26 +++++++++++----------
+ src/hb-aat.h                    | 23 +++++++++++++++++--
+ test/api/test-aat-layout.c      | 51
+ +++++++++++++++++++++++++++--------------
+ 4 files changed, 96 insertions(+), 40 deletions(-)
+
+commit 7a0471aa356bcd062d31a59bdb19c335249116c7
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Thu Nov 1 21:38:54 2018 +0330
+
+    [feat] Turn AAT feature id into enum
+
+ src/hb-aat-layout-feat-table.hh |  20 ++---
+ src/hb-aat-layout-morx-table.hh |  10 +--
+ src/hb-aat-layout.cc            | 170
+ ++++++++++++++++++++--------------------
+ src/hb-aat-layout.hh            |   6 +-
+ src/hb-aat-map.cc               |   2 +-
+ src/hb-aat-map.hh               |   4 +-
+ src/hb-aat.h                    |  64 +++++++++------
+ test/api/test-aat-layout.c      |   8 +-
+ test/api/test-c.c               |   1 +
+ 9 files changed, 150 insertions(+), 135 deletions(-)
+
+commit b233fa4bc9cdb1c6677b37106d96d878d6e03bfd
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Thu Nov 1 20:02:57 2018 +0330
+
+    [feat] Rename records to selectors as @drott
+
+ src/hb-aat-layout-feat-table.hh | 20 ++++++++++----------
+ src/hb-aat-layout.cc            | 10 +++++-----
+ src/hb-aat.h                    |  4 ++--
+ 3 files changed, 17 insertions(+), 17 deletions(-)
+
+commit a157b3e4ebd57ad29f217c4cef6519e7398cfa5c
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Thu Nov 1 19:56:16 2018 +0330
+
+    [feat] Apply @behdad comments
+
+ src/Makefile.sources              |  2 +-
+ src/hb-aat-layout-feat-table.hh   |  1 +
+ src/hb-aat-layout.cc              | 16 ++++++++--------
+ src/hb-aat-layout.hh              |  2 +-
+ src/hb-aat-map.hh                 |  2 +-
+ src/{hb-aat-layout.h => hb-aat.h} | 22 +++++++++++++---------
+ src/hb-ot.h                       |  1 +
+ test/api/test-aat-layout.c        | 14 +++++++-------
+ test/api/test-c.c                 |  1 -
+ 9 files changed, 33 insertions(+), 28 deletions(-)
+
+commit 3aff3f822f0d7bf7a2b5160ad93df3fe413c7c47
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Thu Nov 1 19:20:20 2018 +0330
+
+    [feat] Apply @drott and @jfkthame comments
+
+ src/hb-aat-layout-feat-table.hh | 14 ++++++--------
+ src/hb-aat-layout.cc            | 12 +++++++-----
+ src/hb-aat-layout.h             | 10 +++++-----
+ test/api/test-aat-layout.c      |  4 ++--
+ 4 files changed, 20 insertions(+), 20 deletions(-)
+
+commit b791bbbae47aa19709da640a1dc5e84590c5c2c2
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Thu Nov 1 15:15:56 2018 +0330
+
+    [feat] Apply @jfkthame reviews
+
+ src/hb-aat-layout-feat-table.hh |  27 +++++++++++++++------------
+ src/hb-aat-layout.cc            |  23 ++++++++++++-----------
+ src/hb-aat-layout.h             |  14 +++++++++-----
+ test/api/fonts/aat-feat.ttf     | Bin 0 -> 1132 bytes
+ test/api/test-aat-layout.c      |  30 ++++++++++++++++++------------
+ 5 files changed, 54 insertions(+), 40 deletions(-)
+
+commit 95abd53758e281325b9124f0942aafb382a89090
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Thu Nov 1 13:14:29 2018 +0330
+
+    [feat] Expose public API
+
+    * hb_aat_get_feature_settings
+
+ src/Makefile.sources            |  1 +
+ src/hb-aat-layout-feat-table.hh | 68 ++++++++++++++++++++++++++++++-
+ src/hb-aat-layout-morx-table.hh |  6 +--
+ src/hb-aat-layout.cc            | 33 +++++++++++++++
+ src/hb-aat-layout.h             | 75 ++++++++++++++++++++++++++++++++++
+ src/hb-aat-layout.hh            |  7 ++--
+ src/hb-aat-map.hh               |  5 ++-
+ src/hb-ot-face.hh               |  1 +
+ test/api/Makefile.am            |  1 +
+ test/api/test-aat-layout.c      | 89
+ +++++++++++++++++++++++++++++++++++++++++
+ test/api/test-c.c               |  1 +
+ 11 files changed, 278 insertions(+), 9 deletions(-)
+
+commit 264c4a539cbfd8d5e5f143206d9d27230a186897
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sun Nov 25 00:30:08 2018 -0500
+
+    [test] Reorder test suites
+
+    aots is less interesting.  Run text-rendering-tests before aots.
+
+ test/shaping/data/Makefile.am | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 9326912941e5927bcfb4689689c954b9a3995baa
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sun Nov 25 00:27:23 2018 -0500
+
+    [kerx] Fix crash
+
+ src/hb-machinery.hh | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 6ee401049d475b2a2d9c859e6dbf8ff2750a1609
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sun Nov 25 00:21:13 2018 -0500
+
+    Simplify sanitize set_object() / fix bots
+
+ src/hb-machinery.hh | 26 +++++++++++++-------------
+ 1 file changed, 13 insertions(+), 13 deletions(-)
+
+commit c5a6b355e165e90d8d90454ceeca7b100282945f
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sat Nov 24 23:49:23 2018 -0500
+
+    [kerx] Port to hb_sanitize_with_object_t
+
+ src/hb-aat-layout-kerx-table.hh | 19 +++++++------------
+ 1 file changed, 7 insertions(+), 12 deletions(-)
+
+commit c405ed0509afaa7c3846e8e461bedfbceb0cd937
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sat Nov 24 23:46:15 2018 -0500
+
+    [morx] Port to hb_sanitize_with_object_t
+
+ src/hb-aat-layout-morx-table.hh | 18 +++++++++---------
+ 1 file changed, 9 insertions(+), 9 deletions(-)
+
+commit 1e8994221fb5cfdb1902d5249c7a75cde6d6e3c8
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sat Nov 24 23:38:06 2018 -0500
+
+    Add hb_sanitize_with_object_t
+
+    Context manager.
+
+ src/hb-machinery.hh | 17 +++++++++++++++++
+ 1 file changed, 17 insertions(+)
+
+commit b3c5affc05a3c7bbcfbd98521703d3d3447fcd7d
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sat Nov 24 23:34:34 2018 -0500
+
+    Simplify sanitize set_object()
+
+ src/hb-aat-layout-kerx-table.hh | 12 ++++++------
+ src/hb-aat-layout-morx-table.hh | 10 +++++-----
+ src/hb-machinery.hh             | 26 +++++++++++++-------------
+ 3 files changed, 24 insertions(+), 24 deletions(-)
+
+commit 3d3097269995aa227b4b198d4da2baf942b65c66
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sat Nov 24 23:12:28 2018 -0500
+
+    [aat] Skip terminator in VarSizedBinSearchArray<>
+
+    Fixes shaping with Apple Chancery on 10.13 again.  In that font,
+    there was a terminator segment, that was tripping off sanitize().
+
+ src/hb-aat-layout-common.hh |  6 ++++++
+ src/hb-open-type.hh         | 21 ++++++++++++++++++++-
+ 2 files changed, 26 insertions(+), 1 deletion(-)
+
+commit 4202a3cde3b6065124feb7f4c662563de1e08126
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sat Nov 24 22:48:34 2018 -0500
+
+    Minor
+
+ src/hb-open-type.hh | 21 ++++++++++++++++-----
+ 1 file changed, 16 insertions(+), 5 deletions(-)
+
+commit 1c2302bbf1d2d0e66f49ab54ad98d1b61bc5603d
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sat Nov 24 22:32:17 2018 -0500
+
+    [debug] Print function in return_trace()
+
+ src/hb-debug.hh | 16 +++++++++++-----
+ 1 file changed, 11 insertions(+), 5 deletions(-)
+
+commit 748198a6718adbb200ee24ac013c617f62c946a4
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sat Nov 24 22:16:59 2018 -0500
+
+    Revert "[aat.morx] Remove set_object() business"
+
+    This reverts commit ae8ed58a6e53441d9ccbf67afd8a00b815cde99e.
+
+    Apparently this broke Apple Chancery from OS X 10.12 :(.
+    Investigating...
+
+ src/hb-aat-layout-morx-table.hh | 8 ++++++++
+ 1 file changed, 8 insertions(+)
+
+commit c8a2dc820eb0ee3124e3762cb1167ac9e528ad28
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sat Nov 24 22:16:53 2018 -0500
+
+    Revert "[aat.kerx] Remove kerx subtable boundary enforcement"
+
+    This reverts commit 15905a2a2998f7ddd964f920a4828602235d6b00.
+
+ src/hb-aat-layout-kerx-table.hh | 21 +++++++++++++++++++++
+ 1 file changed, 21 insertions(+)
+
+commit 9eeebd8ddedb96c03860ce7eb5500aafa3969d6b
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sat Nov 24 22:16:47 2018 -0500
+
+    Revert "[sanitize] Remove now-unused set_object() machinery"
+
+    This reverts commit bbdb6edb3e1cea4c5b7076c4f6b3e6998ae36dae.
+
+ src/hb-machinery.hh | 25 ++++++++++++++++++++++++-
+ 1 file changed, 24 insertions(+), 1 deletion(-)
+
+commit 248ce22857c8918bf3468ef48d906de4c19c3d4d
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sat Nov 24 22:01:06 2018 -0500
+
+    [tests] Minor
+
+ test/shaping/run-tests.py | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit f47c5da0aa04a88b37d9c3af4730204319a9a36b
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sat Nov 24 21:36:57 2018 -0500
+
+    [arrays] Use hb_array_t<> in all places with sub_array()
+
+ src/hb-aat-layout-lcar-table.hh |  6 +++---
+ src/hb-ot-layout-gdef-table.hh  | 14 ++++++++------
+ src/hb-ot-math-table.hh         | 10 ++++------
+ 3 files changed, 15 insertions(+), 15 deletions(-)
+
+commit 3246a8ebbd900bcc3e3c70532eab0f406b8f5c4a
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sat Nov 24 21:32:00 2018 -0500
+
+    [arrays] Merge ArrayOf's sub_array into hb_array_t's
+
+ src/hb-dsalgs.hh    | 44 +++++++++++++++++++++++++++-----------------
+ src/hb-open-type.hh | 30 ++++++++++++++++++------------
+ 2 files changed, 45 insertions(+), 29 deletions(-)
+
+commit e6877e28cd30e89af7cce59d903184a5a01ec970
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Sun Nov 25 02:12:40 2018 +0330
+
+    [test] Add the missed aots fonts
+
+ test/shaping/data/aots/fonts/classdef1_font1.otf   | Bin 0 -> 6004 bytes
+ test/shaping/data/aots/fonts/classdef1_font2.otf   | Bin 0 -> 6020 bytes
+ test/shaping/data/aots/tests/classdef1_empty.tests |   2 +-
+ 3 files changed, 1 insertion(+), 1 deletion(-)
+
+commit 825ea5a4607fafa11c56a72a82bda773f6b44e79
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Sun Nov 25 01:59:54 2018 +0330
+
+    [test] Merge 10.12.6 and 10.13.6 tests, update to Apple Chancery fix
+
+ test/shaping/data/in-house/Makefile.sources        |  3 +--
+ .../data/in-house/tests/macos-10.12.6.tests        | 11 ---------
+ .../data/in-house/tests/macos-10.13.6.tests        | 13 -----------
+ test/shaping/data/in-house/tests/macos.tests       | 26
+ ++++++++++++++++++++++
+ 4 files changed, 27 insertions(+), 26 deletions(-)
+
+commit bbdb6edb3e1cea4c5b7076c4f6b3e6998ae36dae
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sat Nov 24 17:15:38 2018 -0500
+
+    [sanitize] Remove now-unused set_object() machinery
+
+ src/hb-machinery.hh | 25 +------------------------
+ 1 file changed, 1 insertion(+), 24 deletions(-)
+
+commit 15905a2a2998f7ddd964f920a4828602235d6b00
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sat Nov 24 17:14:39 2018 -0500
+
+    [aat.kerx] Remove kerx subtable boundary enforcement
+
+    Have not encountered fonts needing this, but same reasoning as
+    for morx (see previos commit.)
+
+ src/hb-aat-layout-kerx-table.hh | 21 ---------------------
+ 1 file changed, 21 deletions(-)
+
+commit ae8ed58a6e53441d9ccbf67afd8a00b815cde99e
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sat Nov 24 17:11:09 2018 -0500
+
+    [aat.morx] Remove set_object() business
+
+    With OS X 10.13 Apple Chancery fails to ligate if we limit each morx
+    sub-chain to its declared length.  Perhaps their newer compiler does
+    object-sharing across sub-chains.  Anyway, since that's a valid, if
+    unspecified, way to compile tables, remove enforcement.
+
+    Probably do the same with kern/kerx.
+
+ src/hb-aat-layout-morx-table.hh | 8 --------
+ 1 file changed, 8 deletions(-)
+
+commit b518e5af9f66414396752069bb8f43466a9236fa
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Sun Nov 25 01:39:00 2018 +0330
+
+    Add 10.13.6 aat fonts tests and bot (#1409)
+
+ .circleci/config.yml                                     | 16
+ ++++++++++++++--
+ test/shaping/data/in-house/Makefile.sources              |  3 ++-
+ .../in-house/tests/{macos.tests => macos-10.12.6.tests}  |  2 --
+ test/shaping/data/in-house/tests/macos-10.13.6.tests     | 13
+ +++++++++++++
+ 4 files changed, 29 insertions(+), 5 deletions(-)
+
+commit b7f7950e8fc4b9e229b466ac2453d57b8da9a5a6
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sat Nov 24 15:56:17 2018 -0500
+
+    [aat] Add test for recent regression
+
+ test/shaping/data/in-house/tests/macos.tests | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit ea9512e61a7ed333b810918e74cce4c8bd2291b9
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sat Nov 24 15:49:33 2018 -0500
+
+    [tests] Redo test runner logging a  bit
+
+ test/shaping/run-tests.py | 44
+ +++++++++++++++++++++++---------------------
+ 1 file changed, 23 insertions(+), 21 deletions(-)
+
+commit 5020affc3877d39377506245ecaf01a659eef82a
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sat Nov 24 15:42:11 2018 -0500
+
+    [tests] Minor
+
+ test/shaping/data/in-house/tests/macos.tests | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit ee3a3e10d45f5df1a74b65fbe3df77f8dd8f902e
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sat Nov 24 15:37:01 2018 -0500
+
+    [tests/shaping] Allow comments in test files
+
+    Line should start with "# ".
+
+ test/shaping/run-tests.py | 17 +++++++++++++++--
+ 1 file changed, 15 insertions(+), 2 deletions(-)
+
+commit ed900ee9afa0dabdbf6bf9d2af46c2343a16773f
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sat Nov 24 15:22:09 2018 -0500
+
+    [tests] Rename
+
+ test/shaping/data/in-house/Makefile.sources                         |
+ 2 +-
+ test/shaping/data/in-house/tests/{macos-10.12.tests => macos.tests} | 0
+ 2 files changed, 1 insertion(+), 1 deletion(-)
+
+commit 20edc70d537b01e8a384ee05673335f2f8a18238
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sat Nov 24 14:52:34 2018 -0500
+
+    [morx/kerx] Fix sanitize regression
+
+    Broke in 8dcc1913a1670ede7b124f7b5b775d7ab8791386
+
+    If sanitizer is left with another object, it wouldn't work.
+
+    Better fix coming soon.
+
+ src/hb-aat-layout-kerx-table.hh | 6 +-----
+ src/hb-aat-layout-morx-table.hh | 4 +---
+ 2 files changed, 2 insertions(+), 8 deletions(-)
+
+commit 3cc14e78aeb1c70eb82891ab4513c0e7d0f59928
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Sat Nov 24 20:49:21 2018 +0330
+
+    [test] Enable more of aots tests (#1408)
+
+    The ones commented out in this change should've be passed :/
+    a closer look is needed.
+
+ test/shaping/data/aots/Makefile.sources            | 76
+ +++++++++++-----------
+ test/shaping/data/aots/hb-aots-tester.cpp          |  1 +
+ test/shaping/data/aots/tests/classdef1_empty.tests |  2 +-
+ test/shaping/data/aots/tests/gsub3_1_simple.tests  |  2 +-
+ .../data/aots/tests/lookupflag_ignore_attach.tests | 10 +--
+ 5 files changed, 46 insertions(+), 45 deletions(-)
+
+commit 24887d1115ee41cfad70577eb243382f6c23ab6e
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Sat Nov 24 20:07:24 2018 +0330
+
+    Add Adobe AOTS tests (#1395)
+
+    Annotated OpenType Specification or aots,
+    https://github.com/adobe-type-tools/aots
+    provides a set of tests for OpenType specification, this change add
+    those tests in addition
+    to modified version of their HarfBuzz test runner for generating
+    harfbuzz project specific tests.
+
+ configure.ac                                       |   1 +
+ test/shaping/CMakeLists.txt                        |  13 +-
+ test/shaping/data/Makefile.am                      |   1 +
+ test/shaping/data/aots/COPYING                     |  13 +
+ test/shaping/data/aots/Makefile.am                 |  37 +++
+ test/shaping/data/aots/Makefile.sources            | 126 ++++++++
+ test/shaping/data/aots/fonts/classdef1_font3.otf   | Bin 0 -> 6060 bytes
+ test/shaping/data/aots/fonts/classdef1_font4.otf   | Bin 0 -> 5984 bytes
+ test/shaping/data/aots/fonts/classdef2_font1.otf   | Bin 0 -> 6004 bytes
+ test/shaping/data/aots/fonts/classdef2_font2.otf   | Bin 0 -> 6016 bytes
+ test/shaping/data/aots/fonts/classdef2_font3.otf   | Bin 0 -> 6052 bytes
+ test/shaping/data/aots/fonts/classdef2_font4.otf   | Bin 0 -> 5984 bytes
+ test/shaping/data/aots/fonts/cmap0_font1.otf       | Bin 0 -> 5196 bytes
+ test/shaping/data/aots/fonts/cmap10_font1.otf      | Bin 0 -> 4968 bytes
+ test/shaping/data/aots/fonts/cmap10_font2.otf      | Bin 0 -> 4960 bytes
+ test/shaping/data/aots/fonts/cmap12_font1.otf      | Bin 0 -> 4980 bytes
+ test/shaping/data/aots/fonts/cmap14_font1.otf      | Bin 0 -> 5028 bytes
+ test/shaping/data/aots/fonts/cmap2_font1.otf       | Bin 0 -> 6000 bytes
+ test/shaping/data/aots/fonts/cmap4_font1.otf       | Bin 0 -> 4964 bytes
+ test/shaping/data/aots/fonts/cmap4_font2.otf       | Bin 0 -> 4956 bytes
+ test/shaping/data/aots/fonts/cmap4_font3.otf       | Bin 0 -> 4956 bytes
+ test/shaping/data/aots/fonts/cmap4_font4.otf       | Bin 0 -> 4972 bytes
+ test/shaping/data/aots/fonts/cmap6_font1.otf       | Bin 0 -> 4948 bytes
+ test/shaping/data/aots/fonts/cmap6_font2.otf       | Bin 0 -> 4944 bytes
+ test/shaping/data/aots/fonts/cmap8_font1.otf       | Bin 0 -> 13224 bytes
+ .../data/aots/fonts/cmap_composition_font1.otf     | Bin 0 -> 5096 bytes
+ .../aots/fonts/cmap_subtableselection_font1.otf    | Bin 0 -> 6412 bytes
+ .../aots/fonts/cmap_subtableselection_font2.otf    | Bin 0 -> 6140 bytes
+ .../aots/fonts/cmap_subtableselection_font3.otf    | Bin 0 -> 5872 bytes
+ .../aots/fonts/cmap_subtableselection_font4.otf    | Bin 0 -> 5600 bytes
+ .../aots/fonts/cmap_subtableselection_font5.otf    | Bin 0 -> 5332 bytes
+ .../data/aots/fonts/gpos1_1_lookupflag_f1.otf      | Bin 0 -> 5208 bytes
+ test/shaping/data/aots/fonts/gpos1_1_simple_f1.otf | Bin 0 -> 5136 bytes
+ test/shaping/data/aots/fonts/gpos1_1_simple_f2.otf | Bin 0 -> 5136 bytes
+ test/shaping/data/aots/fonts/gpos1_1_simple_f3.otf | Bin 0 -> 5136 bytes
+ test/shaping/data/aots/fonts/gpos1_1_simple_f4.otf | Bin 0 -> 5136 bytes
+ test/shaping/data/aots/fonts/gpos1_2_font1.otf     | Bin 0 -> 5108 bytes
+ test/shaping/data/aots/fonts/gpos1_2_font2.otf     | Bin 0 -> 5148 bytes
+ test/shaping/data/aots/fonts/gpos2_1_font6.otf     | Bin 0 -> 5120 bytes
+ test/shaping/data/aots/fonts/gpos2_1_font7.otf     | Bin 0 -> 5132 bytes
+ .../data/aots/fonts/gpos2_1_lookupflag_f1.otf      | Bin 0 -> 5220 bytes
+ .../data/aots/fonts/gpos2_1_lookupflag_f2.otf      | Bin 0 -> 5220 bytes
+ .../data/aots/fonts/gpos2_1_next_glyph_f1.otf      | Bin 0 -> 5180 bytes
+ .../data/aots/fonts/gpos2_1_next_glyph_f2.otf      | Bin 0 -> 5176 bytes
+ test/shaping/data/aots/fonts/gpos2_1_simple_f1.otf | Bin 0 -> 5148 bytes
+ test/shaping/data/aots/fonts/gpos2_2_font1.otf     | Bin 0 -> 5148 bytes
+ test/shaping/data/aots/fonts/gpos2_2_font2.otf     | Bin 0 -> 5188 bytes
+ test/shaping/data/aots/fonts/gpos2_2_font3.otf     | Bin 0 -> 5188 bytes
+ test/shaping/data/aots/fonts/gpos2_2_font4.otf     | Bin 0 -> 5148 bytes
+ test/shaping/data/aots/fonts/gpos2_2_font5.otf     | Bin 0 -> 5140 bytes
+ test/shaping/data/aots/fonts/gpos3_font1.otf       | Bin 0 -> 5120 bytes
+ test/shaping/data/aots/fonts/gpos3_font2.otf       | Bin 0 -> 5160 bytes
+ test/shaping/data/aots/fonts/gpos3_font3.otf       | Bin 0 -> 5164 bytes
+ .../data/aots/fonts/gpos4_lookupflag_f1.otf        | Bin 0 -> 5256 bytes
+ .../data/aots/fonts/gpos4_lookupflag_f2.otf        | Bin 0 -> 5240 bytes
+ .../data/aots/fonts/gpos4_multiple_anchors_1.otf   | Bin 0 -> 5352 bytes
+ test/shaping/data/aots/fonts/gpos4_simple_1.otf    | Bin 0 -> 5200 bytes
+ test/shaping/data/aots/fonts/gpos5_font1.otf       | Bin 0 -> 5284 bytes
+ test/shaping/data/aots/fonts/gpos6_font1.otf       | Bin 0 -> 5176 bytes
+ test/shaping/data/aots/fonts/gpos7_1_font1.otf     | Bin 0 -> 5160 bytes
+ test/shaping/data/aots/fonts/gpos9_font1.otf       | Bin 0 -> 5096 bytes
+ test/shaping/data/aots/fonts/gpos9_font2.otf       | Bin 0 -> 5124 bytes
+ .../data/aots/fonts/gpos_chaining1_boundary_f1.otf | Bin 0 -> 5496 bytes
+ .../data/aots/fonts/gpos_chaining1_boundary_f2.otf | Bin 0 -> 5500 bytes
+ .../data/aots/fonts/gpos_chaining1_boundary_f3.otf | Bin 0 -> 5496 bytes
+ .../data/aots/fonts/gpos_chaining1_boundary_f4.otf | Bin 0 -> 5496 bytes
+ .../aots/fonts/gpos_chaining1_lookupflag_f1.otf    | Bin 0 -> 5520 bytes
+ .../fonts/gpos_chaining1_multiple_subrules_f1.otf  | Bin 0 -> 5592 bytes
+ .../fonts/gpos_chaining1_multiple_subrules_f2.otf  | Bin 0 -> 5592 bytes
+ .../aots/fonts/gpos_chaining1_next_glyph_f1.otf    | Bin 0 -> 5540 bytes
+ .../data/aots/fonts/gpos_chaining1_simple_f1.otf   | Bin 0 -> 5488 bytes
+ .../data/aots/fonts/gpos_chaining1_simple_f2.otf   | Bin 0 -> 5488 bytes
+ .../aots/fonts/gpos_chaining1_successive_f1.otf    | Bin 0 -> 5524 bytes
+ .../data/aots/fonts/gpos_chaining2_boundary_f1.otf | Bin 0 -> 5704 bytes
+ .../data/aots/fonts/gpos_chaining2_boundary_f2.otf | Bin 0 -> 5708 bytes
+ .../data/aots/fonts/gpos_chaining2_boundary_f3.otf | Bin 0 -> 5704 bytes
+ .../data/aots/fonts/gpos_chaining2_boundary_f4.otf | Bin 0 -> 5704 bytes
+ .../aots/fonts/gpos_chaining2_lookupflag_f1.otf    | Bin 0 -> 5728 bytes
+ .../fonts/gpos_chaining2_multiple_subrules_f1.otf  | Bin 0 -> 5800 bytes
+ .../fonts/gpos_chaining2_multiple_subrules_f2.otf  | Bin 0 -> 5800 bytes
+ .../aots/fonts/gpos_chaining2_next_glyph_f1.otf    | Bin 0 -> 5744 bytes
+ .../data/aots/fonts/gpos_chaining2_simple_f1.otf   | Bin 0 -> 5696 bytes
+ .../data/aots/fonts/gpos_chaining2_simple_f2.otf   | Bin 0 -> 5696 bytes
+ .../aots/fonts/gpos_chaining2_successive_f1.otf    | Bin 0 -> 5732 bytes
+ .../data/aots/fonts/gpos_chaining3_boundary_f1.otf | Bin 0 -> 5504 bytes
+ .../data/aots/fonts/gpos_chaining3_boundary_f2.otf | Bin 0 -> 5508 bytes
+ .../data/aots/fonts/gpos_chaining3_boundary_f3.otf | Bin 0 -> 5500 bytes
+ .../data/aots/fonts/gpos_chaining3_boundary_f4.otf | Bin 0 -> 5500 bytes
+ .../aots/fonts/gpos_chaining3_lookupflag_f1.otf    | Bin 0 -> 5548 bytes
+ .../aots/fonts/gpos_chaining3_next_glyph_f1.otf    | Bin 0 -> 5524 bytes
+ .../data/aots/fonts/gpos_chaining3_simple_f1.otf   | Bin 0 -> 5496 bytes
+ .../data/aots/fonts/gpos_chaining3_simple_f2.otf   | Bin 0 -> 5516 bytes
+ .../aots/fonts/gpos_chaining3_successive_f1.otf    | Bin 0 -> 5544 bytes
+ .../data/aots/fonts/gpos_context1_boundary_f1.otf  | Bin 0 -> 5480 bytes
+ .../data/aots/fonts/gpos_context1_boundary_f2.otf  | Bin 0 -> 5480 bytes
+ .../data/aots/fonts/gpos_context1_expansion_f1.otf | Bin 0 -> 5492 bytes
+ .../aots/fonts/gpos_context1_lookupflag_f1.otf     | Bin 0 -> 5508 bytes
+ .../aots/fonts/gpos_context1_lookupflag_f2.otf     | Bin 0 -> 5500 bytes
+ .../fonts/gpos_context1_multiple_subrules_f1.otf   | Bin 0 -> 5568 bytes
+ .../fonts/gpos_context1_multiple_subrules_f2.otf   | Bin 0 -> 5568 bytes
+ .../aots/fonts/gpos_context1_next_glyph_f1.otf     | Bin 0 -> 5500 bytes
+ .../data/aots/fonts/gpos_context1_simple_f1.otf    | Bin 0 -> 5476 bytes
+ .../data/aots/fonts/gpos_context1_simple_f2.otf    | Bin 0 -> 5468 bytes
+ .../aots/fonts/gpos_context1_successive_f1.otf     | Bin 0 -> 5508 bytes
+ .../data/aots/fonts/gpos_context2_boundary_f1.otf  | Bin 0 -> 5492 bytes
+ .../data/aots/fonts/gpos_context2_boundary_f2.otf  | Bin 0 -> 5496 bytes
+ .../data/aots/fonts/gpos_context2_classes_f1.otf   | Bin 0 -> 5540 bytes
+ .../data/aots/fonts/gpos_context2_classes_f2.otf   | Bin 0 -> 5564 bytes
+ .../data/aots/fonts/gpos_context2_expansion_f1.otf | Bin 0 -> 5524 bytes
+ .../aots/fonts/gpos_context2_lookupflag_f1.otf     | Bin 0 -> 5540 bytes
+ .../aots/fonts/gpos_context2_lookupflag_f2.otf     | Bin 0 -> 5532 bytes
+ .../fonts/gpos_context2_multiple_subrules_f1.otf   | Bin 0 -> 5600 bytes
+ .../fonts/gpos_context2_multiple_subrules_f2.otf   | Bin 0 -> 5600 bytes
+ .../aots/fonts/gpos_context2_next_glyph_f1.otf     | Bin 0 -> 5512 bytes
+ .../data/aots/fonts/gpos_context2_simple_f1.otf    | Bin 0 -> 5508 bytes
+ .../data/aots/fonts/gpos_context2_simple_f2.otf    | Bin 0 -> 5484 bytes
+ .../aots/fonts/gpos_context2_successive_f1.otf     | Bin 0 -> 5544 bytes
+ .../data/aots/fonts/gpos_context3_boundary_f1.otf  | Bin 0 -> 5476 bytes
+ .../data/aots/fonts/gpos_context3_boundary_f2.otf  | Bin 0 -> 5472 bytes
+ .../aots/fonts/gpos_context3_lookupflag_f1.otf     | Bin 0 -> 5512 bytes
+ .../aots/fonts/gpos_context3_lookupflag_f2.otf     | Bin 0 -> 5504 bytes
+ .../aots/fonts/gpos_context3_next_glyph_f1.otf     | Bin 0 -> 5496 bytes
+ .../data/aots/fonts/gpos_context3_simple_f1.otf    | Bin 0 -> 5480 bytes
+ .../aots/fonts/gpos_context3_successive_f1.otf     | Bin 0 -> 5516 bytes
+ .../data/aots/fonts/gsub1_1_lookupflag_f1.otf      | Bin 0 -> 5208 bytes
+ test/shaping/data/aots/fonts/gsub1_1_modulo_f1.otf | Bin 0 -> 5216 bytes
+ test/shaping/data/aots/fonts/gsub1_1_simple_f1.otf | Bin 0 -> 5136 bytes
+ .../data/aots/fonts/gsub1_2_lookupflag_f1.otf      | Bin 0 -> 5212 bytes
+ test/shaping/data/aots/fonts/gsub1_2_simple_f1.otf | Bin 0 -> 5140 bytes
+ .../data/aots/fonts/gsub2_1_lookupflag_f1.otf      | Bin 0 -> 5224 bytes
+ .../aots/fonts/gsub2_1_multiple_sequences_f1.otf   | Bin 0 -> 5248 bytes
+ test/shaping/data/aots/fonts/gsub2_1_simple_f1.otf | Bin 0 -> 5144 bytes
+ .../data/aots/fonts/gsub3_1_lookupflag_f1.otf      | Bin 0 -> 5224 bytes
+ .../data/aots/fonts/gsub3_1_multiple_f1.otf        | Bin 0 -> 5168 bytes
+ test/shaping/data/aots/fonts/gsub3_1_simple_f1.otf | Bin 0 -> 5144 bytes
+ .../data/aots/fonts/gsub4_1_lookupflag_f1.otf      | Bin 0 -> 5220 bytes
+ .../aots/fonts/gsub4_1_multiple_ligatures_f1.otf   | Bin 0 -> 5252 bytes
+ .../aots/fonts/gsub4_1_multiple_ligatures_f2.otf   | Bin 0 -> 5252 bytes
+ .../aots/fonts/gsub4_1_multiple_ligsets_f1.otf     | Bin 0 -> 5240 bytes
+ test/shaping/data/aots/fonts/gsub4_1_simple_f1.otf | Bin 0 -> 5148 bytes
+ test/shaping/data/aots/fonts/gsub7_font1.otf       | Bin 0 -> 5096 bytes
+ test/shaping/data/aots/fonts/gsub7_font2.otf       | Bin 0 -> 5116 bytes
+ .../data/aots/fonts/gsub_chaining1_boundary_f1.otf | Bin 0 -> 5516 bytes
+ .../data/aots/fonts/gsub_chaining1_boundary_f2.otf | Bin 0 -> 5520 bytes
+ .../data/aots/fonts/gsub_chaining1_boundary_f3.otf | Bin 0 -> 5520 bytes
+ .../data/aots/fonts/gsub_chaining1_boundary_f4.otf | Bin 0 -> 5520 bytes
+ .../aots/fonts/gsub_chaining1_lookupflag_f1.otf    | Bin 0 -> 5544 bytes
+ .../fonts/gsub_chaining1_multiple_subrules_f1.otf  | Bin 0 -> 5616 bytes
+ .../fonts/gsub_chaining1_multiple_subrules_f2.otf  | Bin 0 -> 5616 bytes
+ .../aots/fonts/gsub_chaining1_next_glyph_f1.otf    | Bin 0 -> 5560 bytes
+ .../data/aots/fonts/gsub_chaining1_simple_f1.otf   | Bin 0 -> 5508 bytes
+ .../data/aots/fonts/gsub_chaining1_simple_f2.otf   | Bin 0 -> 5512 bytes
+ .../aots/fonts/gsub_chaining1_successive_f1.otf    | Bin 0 -> 5544 bytes
+ .../data/aots/fonts/gsub_chaining2_boundary_f1.otf | Bin 0 -> 5724 bytes
+ .../data/aots/fonts/gsub_chaining2_boundary_f2.otf | Bin 0 -> 5728 bytes
+ .../data/aots/fonts/gsub_chaining2_boundary_f3.otf | Bin 0 -> 5728 bytes
+ .../data/aots/fonts/gsub_chaining2_boundary_f4.otf | Bin 0 -> 5728 bytes
+ .../aots/fonts/gsub_chaining2_lookupflag_f1.otf    | Bin 0 -> 5752 bytes
+ .../fonts/gsub_chaining2_multiple_subrules_f1.otf  | Bin 0 -> 5824 bytes
+ .../fonts/gsub_chaining2_multiple_subrules_f2.otf  | Bin 0 -> 5824 bytes
+ .../aots/fonts/gsub_chaining2_next_glyph_f1.otf    | Bin 0 -> 5764 bytes
+ .../data/aots/fonts/gsub_chaining2_simple_f1.otf   | Bin 0 -> 5716 bytes
+ .../data/aots/fonts/gsub_chaining2_simple_f2.otf   | Bin 0 -> 5720 bytes
+ .../aots/fonts/gsub_chaining2_successive_f1.otf    | Bin 0 -> 5752 bytes
+ .../data/aots/fonts/gsub_chaining3_boundary_f1.otf | Bin 0 -> 5528 bytes
+ .../data/aots/fonts/gsub_chaining3_boundary_f2.otf | Bin 0 -> 5532 bytes
+ .../data/aots/fonts/gsub_chaining3_boundary_f3.otf | Bin 0 -> 5524 bytes
+ .../data/aots/fonts/gsub_chaining3_boundary_f4.otf | Bin 0 -> 5524 bytes
+ .../aots/fonts/gsub_chaining3_lookupflag_f1.otf    | Bin 0 -> 5572 bytes
+ .../aots/fonts/gsub_chaining3_next_glyph_f1.otf    | Bin 0 -> 5548 bytes
+ .../data/aots/fonts/gsub_chaining3_simple_f1.otf   | Bin 0 -> 5520 bytes
+ .../data/aots/fonts/gsub_chaining3_simple_f2.otf   | Bin 0 -> 5540 bytes
+ .../aots/fonts/gsub_chaining3_successive_f1.otf    | Bin 0 -> 5568 bytes
+ .../data/aots/fonts/gsub_context1_boundary_f1.otf  | Bin 0 -> 5500 bytes
+ .../data/aots/fonts/gsub_context1_boundary_f2.otf  | Bin 0 -> 5504 bytes
+ .../data/aots/fonts/gsub_context1_expansion_f1.otf | Bin 0 -> 5516 bytes
+ .../aots/fonts/gsub_context1_lookupflag_f1.otf     | Bin 0 -> 5532 bytes
+ .../aots/fonts/gsub_context1_lookupflag_f2.otf     | Bin 0 -> 5524 bytes
+ .../fonts/gsub_context1_multiple_subrules_f1.otf   | Bin 0 -> 5592 bytes
+ .../fonts/gsub_context1_multiple_subrules_f2.otf   | Bin 0 -> 5592 bytes
+ .../aots/fonts/gsub_context1_next_glyph_f1.otf     | Bin 0 -> 5520 bytes
+ .../data/aots/fonts/gsub_context1_simple_f1.otf    | Bin 0 -> 5500 bytes
+ .../data/aots/fonts/gsub_context1_simple_f2.otf    | Bin 0 -> 5492 bytes
+ .../aots/fonts/gsub_context1_successive_f1.otf     | Bin 0 -> 5528 bytes
+ .../data/aots/fonts/gsub_context2_boundary_f1.otf  | Bin 0 -> 5516 bytes
+ .../data/aots/fonts/gsub_context2_boundary_f2.otf  | Bin 0 -> 5516 bytes
+ .../data/aots/fonts/gsub_context2_classes_f1.otf   | Bin 0 -> 5564 bytes
+ .../data/aots/fonts/gsub_context2_classes_f2.otf   | Bin 0 -> 5584 bytes
+ .../data/aots/fonts/gsub_context2_expansion_f1.otf | Bin 0 -> 5544 bytes
+ .../aots/fonts/gsub_context2_lookupflag_f1.otf     | Bin 0 -> 5560 bytes
+ .../aots/fonts/gsub_context2_lookupflag_f2.otf     | Bin 0 -> 5552 bytes
+ .../fonts/gsub_context2_multiple_subrules_f1.otf   | Bin 0 -> 5620 bytes
+ .../fonts/gsub_context2_multiple_subrules_f2.otf   | Bin 0 -> 5620 bytes
+ .../aots/fonts/gsub_context2_next_glyph_f1.otf     | Bin 0 -> 5536 bytes
+ .../data/aots/fonts/gsub_context2_simple_f1.otf    | Bin 0 -> 5528 bytes
+ .../data/aots/fonts/gsub_context2_simple_f2.otf    | Bin 0 -> 5504 bytes
+ .../aots/fonts/gsub_context2_successive_f1.otf     | Bin 0 -> 5568 bytes
+ .../data/aots/fonts/gsub_context3_boundary_f1.otf  | Bin 0 -> 5500 bytes
+ .../data/aots/fonts/gsub_context3_boundary_f2.otf  | Bin 0 -> 5496 bytes
+ .../aots/fonts/gsub_context3_lookupflag_f1.otf     | Bin 0 -> 5536 bytes
+ .../aots/fonts/gsub_context3_lookupflag_f2.otf     | Bin 0 -> 5528 bytes
+ .../aots/fonts/gsub_context3_next_glyph_f1.otf     | Bin 0 -> 5520 bytes
+ .../data/aots/fonts/gsub_context3_simple_f1.otf    | Bin 0 -> 5504 bytes
+ .../aots/fonts/gsub_context3_successive_f1.otf     | Bin 0 -> 5540 bytes
+ .../aots/fonts/lookupflag_ignore_attach_f1.otf     | Bin 0 -> 5416 bytes
+ .../data/aots/fonts/lookupflag_ignore_base_f1.otf  | Bin 0 -> 5256 bytes
+ .../fonts/lookupflag_ignore_combination_f1.otf     | Bin 0 -> 5408 bytes
+ .../aots/fonts/lookupflag_ignore_ligatures_f1.otf  | Bin 0 -> 5320 bytes
+ .../data/aots/fonts/lookupflag_ignore_marks_f1.otf | Bin 0 -> 5288 bytes
+ test/shaping/data/aots/hb-aots-tester.cpp          | 343
+ +++++++++++++++++++++
+ test/shaping/data/aots/tests/classdef1.tests       |   1 +
+ test/shaping/data/aots/tests/classdef1_empty.tests |   1 +
+ .../data/aots/tests/classdef1_multiple.tests       |   1 +
+ .../shaping/data/aots/tests/classdef1_single.tests |   1 +
+ test/shaping/data/aots/tests/classdef2.tests       |   1 +
+ test/shaping/data/aots/tests/classdef2_empty.tests |   1 +
+ .../data/aots/tests/classdef2_multiple.tests       |   1 +
+ .../shaping/data/aots/tests/classdef2_single.tests |   1 +
+ .../data/aots/tests/gpos1_1_lookupflag.tests       |   1 +
+ test/shaping/data/aots/tests/gpos1_1_simple.tests  |   4 +
+ test/shaping/data/aots/tests/gpos1_2.tests         |   1 +
+ .../data/aots/tests/gpos1_2_lookupflag.tests       |   1 +
+ test/shaping/data/aots/tests/gpos2_1.tests         |   2 +
+ .../data/aots/tests/gpos2_1_lookupflag.tests       |   2 +
+ .../data/aots/tests/gpos2_1_next_glyph.tests       |   2 +
+ test/shaping/data/aots/tests/gpos2_1_simple.tests  |   2 +
+ test/shaping/data/aots/tests/gpos2_2.tests         |   5 +
+ test/shaping/data/aots/tests/gpos3.tests           |  11 +
+ .../shaping/data/aots/tests/gpos3_lookupflag.tests |   2 +
+ .../shaping/data/aots/tests/gpos4_lookupflag.tests |   2 +
+ .../data/aots/tests/gpos4_multiple_anchors.tests   |   1 +
+ test/shaping/data/aots/tests/gpos4_simple.tests    |   5 +
+ test/shaping/data/aots/tests/gpos5.tests           |   2 +
+ test/shaping/data/aots/tests/gpos6.tests           |   3 +
+ test/shaping/data/aots/tests/gpos7_1.tests         |   2 +
+ test/shaping/data/aots/tests/gpos9.tests           |   2 +
+ .../data/aots/tests/gpos_chaining1_boundary.tests  |   4 +
+ .../aots/tests/gpos_chaining1_lookupflag.tests     |   1 +
+ .../tests/gpos_chaining1_multiple_subrules.tests   |   2 +
+ .../aots/tests/gpos_chaining1_next_glyph.tests     |   1 +
+ .../data/aots/tests/gpos_chaining1_simple.tests    |  11 +
+ .../aots/tests/gpos_chaining1_successive.tests     |   1 +
+ .../data/aots/tests/gpos_chaining2_boundary.tests  |   4 +
+ .../aots/tests/gpos_chaining2_lookupflag.tests     |   1 +
+ .../tests/gpos_chaining2_multiple_subrules.tests   |   2 +
+ .../aots/tests/gpos_chaining2_next_glyph.tests     |   1 +
+ .../data/aots/tests/gpos_chaining2_simple.tests    |  11 +
+ .../aots/tests/gpos_chaining2_successive.tests     |   1 +
+ .../data/aots/tests/gpos_chaining3_boundary.tests  |   4 +
+ .../aots/tests/gpos_chaining3_lookupflag.tests     |   1 +
+ .../aots/tests/gpos_chaining3_next_glyph.tests     |   1 +
+ .../data/aots/tests/gpos_chaining3_simple.tests    |  11 +
+ .../aots/tests/gpos_chaining3_successive.tests     |   1 +
+ .../data/aots/tests/gpos_context1_boundary.tests   |   2 +
+ .../data/aots/tests/gpos_context1_expansion.tests  |   1 +
+ .../data/aots/tests/gpos_context1_lookupflag.tests |   2 +
+ .../tests/gpos_context1_multiple_subrules.tests    |   2 +
+ .../data/aots/tests/gpos_context1_next_glyph.tests |   1 +
+ .../data/aots/tests/gpos_context1_simple.tests     |   3 +
+ .../data/aots/tests/gpos_context1_successive.tests |   1 +
+ .../data/aots/tests/gpos_context2_boundary.tests   |   2 +
+ .../data/aots/tests/gpos_context2_classes.tests    |   2 +
+ .../data/aots/tests/gpos_context2_expansion.tests  |   1 +
+ .../data/aots/tests/gpos_context2_lookupflag.tests |   2 +
+ .../tests/gpos_context2_multiple_subrules.tests    |   2 +
+ .../data/aots/tests/gpos_context2_next_glyph.tests |   1 +
+ .../data/aots/tests/gpos_context2_simple.tests     |   3 +
+ .../data/aots/tests/gpos_context2_successive.tests |   1 +
+ .../data/aots/tests/gpos_context3_boundary.tests   |   2 +
+ .../data/aots/tests/gpos_context3_lookupflag.tests |   2 +
+ .../data/aots/tests/gpos_context3_next_glyph.tests |   1 +
+ .../data/aots/tests/gpos_context3_simple.tests     |   2 +
+ .../data/aots/tests/gpos_context3_successive.tests |   1 +
+ .../data/aots/tests/gsub1_1_lookupflag.tests       |   1 +
+ test/shaping/data/aots/tests/gsub1_1_modulo.tests  |   1 +
+ test/shaping/data/aots/tests/gsub1_1_simple.tests  |   1 +
+ .../data/aots/tests/gsub1_2_lookupflag.tests       |   1 +
+ test/shaping/data/aots/tests/gsub1_2_simple.tests  |   1 +
+ .../data/aots/tests/gsub2_1_lookupflag.tests       |   1 +
+ .../aots/tests/gsub2_1_multiple_sequences.tests    |   1 +
+ test/shaping/data/aots/tests/gsub2_1_simple.tests  |   2 +
+ .../data/aots/tests/gsub3_1_lookupflag.tests       |   1 +
+ .../shaping/data/aots/tests/gsub3_1_multiple.tests |   1 +
+ test/shaping/data/aots/tests/gsub3_1_simple.tests  |   1 +
+ .../data/aots/tests/gsub4_1_lookupflag.tests       |   1 +
+ .../aots/tests/gsub4_1_multiple_ligatures.tests    |   2 +
+ .../data/aots/tests/gsub4_1_multiple_ligsets.tests |   1 +
+ test/shaping/data/aots/tests/gsub4_1_simple.tests  |   1 +
+ test/shaping/data/aots/tests/gsub7.tests           |   2 +
+ .../data/aots/tests/gsub_chaining1_boundary.tests  |   4 +
+ .../aots/tests/gsub_chaining1_lookupflag.tests     |   1 +
+ .../tests/gsub_chaining1_multiple_subrules.tests   |   2 +
+ .../aots/tests/gsub_chaining1_next_glyph.tests     |   1 +
+ .../data/aots/tests/gsub_chaining1_simple.tests    |  11 +
+ .../aots/tests/gsub_chaining1_successive.tests     |   1 +
+ .../data/aots/tests/gsub_chaining2_boundary.tests  |   4 +
+ .../aots/tests/gsub_chaining2_lookupflag.tests     |   1 +
+ .../tests/gsub_chaining2_multiple_subrules.tests   |   2 +
+ .../aots/tests/gsub_chaining2_next_glyph.tests     |   1 +
+ .../data/aots/tests/gsub_chaining2_simple.tests    |  11 +
+ .../aots/tests/gsub_chaining2_successive.tests     |   1 +
+ .../data/aots/tests/gsub_chaining3_boundary.tests  |   4 +
+ .../aots/tests/gsub_chaining3_lookupflag.tests     |   1 +
+ .../aots/tests/gsub_chaining3_next_glyph.tests     |   1 +
+ .../data/aots/tests/gsub_chaining3_simple.tests    |  11 +
+ .../aots/tests/gsub_chaining3_successive.tests     |   1 +
+ .../data/aots/tests/gsub_context1_boundary.tests   |   2 +
+ .../data/aots/tests/gsub_context1_expansion.tests  |   1 +
+ .../data/aots/tests/gsub_context1_lookupflag.tests |   2 +
+ .../tests/gsub_context1_multiple_subrules.tests    |   2 +
+ .../data/aots/tests/gsub_context1_next_glyph.tests |   1 +
+ .../data/aots/tests/gsub_context1_simple.tests     |   3 +
+ .../data/aots/tests/gsub_context1_successive.tests |   1 +
+ .../data/aots/tests/gsub_context2_boundary.tests   |   2 +
+ .../data/aots/tests/gsub_context2_classes.tests    |   2 +
+ .../data/aots/tests/gsub_context2_expansion.tests  |   1 +
+ .../data/aots/tests/gsub_context2_lookupflag.tests |   2 +
+ .../tests/gsub_context2_multiple_subrules.tests    |   2 +
+ .../data/aots/tests/gsub_context2_next_glyph.tests |   1 +
+ .../data/aots/tests/gsub_context2_simple.tests     |   3 +
+ .../data/aots/tests/gsub_context2_successive.tests |   1 +
+ .../data/aots/tests/gsub_context3_boundary.tests   |   2 +
+ .../data/aots/tests/gsub_context3_lookupflag.tests |   2 +
+ .../data/aots/tests/gsub_context3_next_glyph.tests |   1 +
+ .../data/aots/tests/gsub_context3_simple.tests     |   2 +
+ .../data/aots/tests/gsub_context3_successive.tests |   1 +
+ .../data/aots/tests/lookupflag_ignore_attach.tests |   5 +
+ .../data/aots/tests/lookupflag_ignore_base.tests   |   2 +
+ .../aots/tests/lookupflag_ignore_combination.tests |   3 +
+ .../aots/tests/lookupflag_ignore_ligatures.tests   |   3 +
+ .../data/aots/tests/lookupflag_ignore_marks.tests  |   1 +
+ test/shaping/run-tests.py                          |   9 +-
+ 332 files changed, 815 insertions(+), 3 deletions(-)
+
+commit ae96c98dfaef3a789227ffecd40b92518dface8a
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sat Nov 24 10:25:10 2018 -0500
+
+    [color] Use SortedUnsizedArrayOf<>
+
+ src/hb-ot-color-colr-table.hh | 16 ++--------------
+ 1 file changed, 2 insertions(+), 14 deletions(-)
+
+commit 4a3b20738fca3231e5d9a36adba333b5bce05f4a
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sat Nov 24 10:17:59 2018 -0500
+
+    [trak] Coment
+
+ src/hb-aat-layout-trak-table.hh | 1 -
+ 1 file changed, 1 deletion(-)
+
+commit 918b1ee54d43eb493c9226bff7677ed8ec07934b
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sat Nov 24 10:09:17 2018 -0500
+
+    [arrays] Add not_found to reference bsearch as well
+
+ src/hb-open-type.hh | 16 ++++++++--------
+ 1 file changed, 8 insertions(+), 8 deletions(-)
+
+commit d77a098b735cf14aa601feab5bdb9f4e474c794f
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sat Nov 24 10:06:13 2018 -0500
+
+    [arrays] Improve bfind() interface
+
+    Much more useful now. :)
+
+ src/hb-dsalgs.hh           | 29 +++++++++++++++++++++++++----
+ src/hb-open-file.hh        |  9 +--------
+ src/hb-open-type.hh        | 12 ++++++++----
+ src/hb-ot-layout-common.hh | 10 ++--------
+ src/hb-set.hh              |  6 +++---
+ src/hb-vector.hh           |  6 ++++--
+ 6 files changed, 43 insertions(+), 29 deletions(-)
+
+commit 1204a247a5d9a4da39675d3da85d4fd3268a5b66
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sat Nov 24 09:49:21 2018 -0500
+
+    [fuzzing] Add tests for previous commit
+
+    Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=11526
+    Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=11522
+
+ ...zz-testcase-minimized-hb-shape-fuzzer-5634620935110656 | Bin 0 ->
+ 41 bytes
+ ...zz-testcase-minimized-hb-shape-fuzzer-5716208469409792 | Bin 0 ->
+ 243 bytes
+ 2 files changed, 0 insertions(+), 0 deletions(-)
+
+commit 8dcc1913a1670ede7b124f7b5b775d7ab8791386
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sat Nov 24 09:47:45 2018 -0500
+
+    [kerx/morx] Make sure object length is sanitized before accessing it
+
+ src/hb-aat-layout-kerx-table.hh | 5 +++++
+ src/hb-aat-layout-morx-table.hh | 5 +++++
+ 2 files changed, 10 insertions(+)
+
+commit 70d80c90fe2f4eca66bec3e1d313bbf7e4d0ab65
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sat Nov 24 01:59:50 2018 -0500
+
+    [arrays] Port ArrayOf.qsort() and hb_vector_t.qsort() to hb_array_t
+
+ src/hb-dsalgs.hh    | 14 ++++++++++++--
+ src/hb-open-type.hh | 14 ++++++++++++--
+ 2 files changed, 24 insertions(+), 4 deletions(-)
+
+commit 073d837aa2394d29dda72679802d583c559c3c5b
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sat Nov 24 01:48:48 2018 -0500
+
+    [arrays] Port ArrayOf.qsort() to hb_array_t's
+
+ src/hb-open-type.hh | 4 +---
+ 1 file changed, 1 insertion(+), 3 deletions(-)
+
+commit ad5c871d801b481f95dd32c8b65ecc70def597be
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sat Nov 24 01:47:49 2018 -0500
+
+    [arrays] Add copy-constructor to hb_array_t and hb_sorted_array_t
+
+ src/hb-dsalgs.hh | 2 ++
+ 1 file changed, 2 insertions(+)
+
+commit 61de55bf496c1edb120e4d096140eb1125552bbe
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sat Nov 24 01:45:58 2018 -0500
+
+    [arrays] Port hb_vector_t.qsort() to hb_array_t's
+
+ src/hb-dsalgs.hh | 16 +++++++++++++---
+ src/hb-vector.hh | 10 ++--------
+ 2 files changed, 15 insertions(+), 11 deletions(-)
+
+commit e3face8e791d677f94154e8a7f3d787d0d69a02f
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sat Nov 24 01:42:17 2018 -0500
+
+    [arrays] Remove one flavor of hb_vector_t.qsort()
+
+ src/hb-vector.hh | 8 ++------
+ 1 file changed, 2 insertions(+), 6 deletions(-)
+
+commit 7c1600dcd9813ca560ecccc5c54877a5750caf4e
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sat Nov 24 01:37:11 2018 -0500
+
+    [arrays] Add (unused) SortedUnsizedArrayOf<>
+
+ src/hb-open-type.hh | 21 +++++++++++++++++++++
+ 1 file changed, 21 insertions(+)
+
+commit e700392f5cbf366f1e03dc7e7b1a2eb6c3027b92
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sat Nov 24 01:31:00 2018 -0500
+
+    [arrays] Port SortedArrayOf.bsearch/bfind to hb_sorted_array_t's
+
+ src/hb-dsalgs.hh    |  9 +++------
+ src/hb-open-type.hh | 50
+ ++++++++++----------------------------------------
+ src/hb-vector.hh    | 35 ++++++++++-------------------------
+ 3 files changed, 23 insertions(+), 71 deletions(-)
+
+commit e604306f2829804e9016966c1378166253b19d29
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sat Nov 24 01:24:48 2018 -0500
+
+    [arrays] Port hb_vector_t.bsearch/bfind to (new) hb_sorted_array_t's
+
+ src/hb-dsalgs.hh    | 63
+ +++++++++++++++++++++++++++++++++++++++++++++++++----
+ src/hb-open-type.hh | 12 ++++++----
+ src/hb-vector.hh    | 57 +++++++++++++++++++-----------------------------
+ 3 files changed, 89 insertions(+), 43 deletions(-)
+
+commit 268eca24921e85eda98f4f0cce05d40c7235ba62
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sat Nov 24 01:11:12 2018 -0500
+
+    [arrays] Port (unused) ArrayOf.lsearch() to hb_array_t's
+
+ src/hb-open-type.hh | 12 ++----------
+ 1 file changed, 2 insertions(+), 10 deletions(-)
+
+commit 830856ba6b9454bf507e00416f9d45e9975fb7dc
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sat Nov 24 01:09:28 2018 -0500
+
+    [arrays] Port hb_vector_t.lsearch() to hb_array_t's
+
+ src/hb-dsalgs.hh | 26 +++++++++++++++++++++++---
+ src/hb-vector.hh | 16 ++++------------
+ 2 files changed, 27 insertions(+), 15 deletions(-)
+
+commit 96cf0889804b7d72a96274b25641bb18f7dd2e1e
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sat Nov 24 01:07:15 2018 -0500
+
+    [arrays] More
+
+ src/hb-face.cc   | 6 +++---
+ src/hb-vector.hh | 4 ++--
+ 2 files changed, 5 insertions(+), 5 deletions(-)
+
+commit 3e26c8d2b10fc08642c25c7f13aef68b0b1008f6
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sat Nov 24 00:58:44 2018 -0500
+
+    [arrays] Update ArrayOf.lsearch()
+
+    Currently unused apparently
+
+ src/hb-open-type.hh | 17 +++++++++++++----
+ 1 file changed, 13 insertions(+), 4 deletions(-)
+
+commit 22e1857b01c71714245ddca05cb3fa0127bf7da2
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sat Nov 24 00:53:19 2018 -0500
+
+    [arrays] Change argument type of cmp called by hb_vector_t.bsearch()
+
+    Towards consolidating all array bsearch/...
+
+ src/hb-aat-map.hh | 4 ++--
+ src/hb-ot-map.hh  | 4 ++--
+ src/hb-set.hh     | 2 +-
+ src/hb-vector.hh  | 4 ++--
+ 4 files changed, 7 insertions(+), 7 deletions(-)
+
+commit 5fdf7b724eb3cb5ac60cd7f90d3250877ad7ca06
+Author: Nathan Willis <nwillis at glyphography.com>
+Date:   Thu Nov 15 17:40:21 2018 -0600
+
+    Usermanual: clusters chapter; add brief grapheme definition and
+    clarify monotonous cluster handling.
+
+ docs/usermanual-clusters.xml | 56
+ ++++++++++++++++++++++++++++++--------------
+ 1 file changed, 39 insertions(+), 17 deletions(-)
+
+commit 939220e57da613e090d247aa1af2396c28370af4
+Author: Nathan Willis <nwillis at glyphography.com>
+Date:   Thu Nov 15 15:47:03 2018 -0600
+
+    Usermanual: clusters chapter, minor updates.
+
+ docs/usermanual-clusters.xml | 25 ++++++++++++++++---------
+ 1 file changed, 16 insertions(+), 9 deletions(-)
+
+commit 53ac46e974cf0ee8720b40ef394714eb97ff53b9
+Author: Nathan Willis <nwillis at glyphography.com>
+Date:   Mon Nov 12 12:17:06 2018 -0600
+
+    Usermanual: expand clusters chapter.
+
+ docs/usermanual-clusters.xml | 743
+ +++++++++++++++++++++++++++----------------
+ 1 file changed, 473 insertions(+), 270 deletions(-)
+
+commit 30cb45b3eaacda15cc45435815cae3fd50e87557
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sat Nov 24 00:35:31 2018 -0500
+
+    Change ArrayOf.bsearch() return semantics
+
+    Towards consolidating all array bsearch/...
+
+ src/hb-aat-layout-kerx-table.hh | 16 +++-------------
+ src/hb-open-file.hh             | 12 ++++++++----
+ src/hb-open-type.hh             | 42
+ ++++++++++++++++++++++++++++++++---------
+ src/hb-ot-cmap-table.hh         | 30 ++++++++++++-----------------
+ src/hb-ot-color-svg-table.hh    |  3 +--
+ src/hb-ot-layout-common.hh      | 29 +++++++++++-----------------
+ src/hb-ot-vorg-table.hh         |  9 ++++-----
+ src/hb-vector.hh                | 14 +++++++++-----
+ 8 files changed, 81 insertions(+), 74 deletions(-)
+
+commit 5cd9546ba73d9f8c8b7b8db0960d657c50b70f64
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sat Nov 24 00:38:36 2018 -0500
+
+    Minor
+
+ src/hb-ot-layout-common.hh | 5 +----
+ 1 file changed, 1 insertion(+), 4 deletions(-)
+
+commit fd94e729cb50f2b6bd83b80cbf400e10ac633a1c
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sat Nov 24 00:45:55 2018 -0500
+
+    Whitespace
+
+ src/hb-ot-layout-common.hh | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit bb2a2065080a3099eb0dc82d1df0891ad2601316
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sat Nov 24 00:31:40 2018 -0500
+
+    Assert that item-type of arrays have static size
+
+ src/hb-dsalgs.hh    | 2 ++
+ src/hb-open-type.hh | 4 ++++
+ src/hb-vector.hh    | 2 ++
+ 3 files changed, 8 insertions(+)
+
+commit 690d9eb83d3421b397b0cb824cd768d6d73cbf12
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sat Nov 24 00:29:22 2018 -0500
+
+    [vector] Rename
+
+ src/hb-vector.hh | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit ba38378fd4374f3d44bdc9aa0de902401b60b13d
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sat Nov 24 00:27:57 2018 -0500
+
+    [aat] Minor
+
+ src/hb-aat-layout-common.hh | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+commit 39b9d63b014380d421cc9b94a49dd411c7a5aabf
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sat Nov 24 00:25:40 2018 -0500
+
+    Add hb_static_size(T)
+
+ src/hb-null.hh | 19 +++++++++++++++++++
+ 1 file changed, 19 insertions(+)
+
+commit f99abcc37990a478189dda691d1fdac7b9d51386
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Sat Nov 24 00:22:21 2018 -0500
+
+    Add template-function convenience macros
+
+ src/hb-atomic.hh |  2 +-
+ src/hb-blob.hh   |  4 ++--
+ src/hb-common.cc |  2 +-
+ src/hb-ft.cc     |  2 +-
+ src/hb-null.hh   | 11 ++++++-----
+ src/hb.hh        |  3 +++
+ 6 files changed, 14 insertions(+), 10 deletions(-)
+
+commit ec83b2228e0bbb6df7e7b94dad49db32b041af4a
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Nov 23 19:58:49 2018 -0500
+
+    Add null bytes for CmapSubtableLongGroup
+
+ src/hb-ot-cmap-table.hh | 1 +
+ src/hb-static.cc        | 4 +++-
+ 2 files changed, 4 insertions(+), 1 deletion(-)
+
+commit e2ffb33a534a427c760dae53d0469eeced4343ba
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Nov 23 16:24:28 2018 -0500
+
+    Remove lsearch for small TableDirectorys
+
+ src/hb-open-file.hh | 4 +---
+ 1 file changed, 1 insertion(+), 3 deletions(-)
+
+commit 04f7e5536924e7f277d72b8cb9d878239877c331
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Nov 23 16:07:43 2018 -0500
+
+    [arrays] Add as_array() to hb_vector_t<>
+
+ src/hb-vector.hh | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit c514f65181390ab98b0f738632f71cda31e46b68
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Nov 23 16:04:56 2018 -0500
+
+    [arrays] Add as_array() to ArrayOf<>
+
+ src/hb-open-type.hh | 3 +++
+ 1 file changed, 3 insertions(+)
+
+commit 9552f4ef0da0b7e1fb28cb2738b865888e7941d9
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Nov 23 15:24:17 2018 -0500
+
+    [kern] Don't enforce length of last subtable
+
+ src/hb-aat-layout-kerx-table.hh | 19 +++++++++++++++++--
+ 1 file changed, 17 insertions(+), 2 deletions(-)
+
+commit 992b7128656e72f935089dc2e12c2d2a25511886
+Merge: c9cc96c0 018ba46e
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Nov 23 13:49:34 2018 -0500
+
+    Merge pull request #1407 from harfbuzz/at-sign
+
+    Don't canonicalize '@' to '-' in language tags
+
+commit 018ba46e4d003a5dd0f6d2d899226129c4ef0c60
+Author: David Corbett <corbett.dav at husky.neu.edu>
+Date:   Fri Nov 23 13:21:22 2018 -0500
+
+    Don't canonicalize '@' to '-' in language tags
+
+    Fixes #1406.
+
+ src/hb-common.cc       | 2 +-
+ test/api/test-ot-tag.c | 3 +++
+ 2 files changed, 4 insertions(+), 1 deletion(-)
+
+commit c9cc96c0cfbbb87b9292e413d500a454182be9f4
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Fri Nov 23 19:58:56 2018 +0330
+
+    [aat] Update expectation
+
+ test/shaping/data/in-house/tests/macos-10.12.tests | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 748962264a9f098b32b9cb3fe4d18c786907a184
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Nov 23 11:10:17 2018 -0500
+
+    [aat] Disable mark advance zeroing if kern table has state-machines
+
+    Geeza Pro for example, relies on that for fancy mark positioning.
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1405
+
+ src/hb-aat-layout-kerx-table.hh | 15 +++++++++++++++
+ src/hb-ot-kern-table.hh         |  9 +++++++++
+ src/hb-ot-layout.cc             |  6 ++++++
+ src/hb-ot-layout.hh             |  3 +++
+ src/hb-ot-shape.cc              |  4 +++-
+ 5 files changed, 36 insertions(+), 1 deletion(-)
+
+commit 3d2b98ef14af29acd74f01647bef60cd410825fb
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Fri Nov 23 10:45:44 2018 -0500
+
+    Minor
+
+ src/hb.hh | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit 341851efe158599a34d241a97593058a4333852e
+Author: Ebrahim Byagowi <ebrahim at gnu.org>
+Date:   Fri Nov 23 15:40:05 2018 +0330
+
+    [aat] Add macOS specific tests (#1404)
+
+ .circleci/config.yml                               | 46
+ ++++++++++++++--------
+ test/shaping/CMakeLists.txt                        |  2 +
+ test/shaping/data/in-house/Makefile.sources        |  1 +
+ test/shaping/data/in-house/tests/macos-10.12.tests | 10 +++++
+ test/shaping/run-tests.py                          | 38
+ ++++++++++++++----
+ 5 files changed, 73 insertions(+), 24 deletions(-)
+
+commit 22798e93c414a2655c757a6e41b300f67e04a9a3
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Nov 22 22:47:51 2018 -0500
+
+    [use] Minor clarification
+
+ src/hb-ot-shape-complex-use.cc | 34 +++++++++++++++++-----------------
+ 1 file changed, 17 insertions(+), 17 deletions(-)
+
+commit a2d6c1075a5595a08ef09357293919d9df8eb64a
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Nov 22 22:40:57 2018 -0500
+
+    Minor tweak to FLAG64
+
+ src/hb.hh | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+commit 8280459e74cff2dec3de012abd309cda9578b759
+Merge: e4a4555d 3c7792ca
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Nov 22 22:39:12 2018 -0500
+
+    Merge pull request #1291 from harfbuzz/use-reordering
+
+    [use] Fix reordering
+
+commit e4a4555d1e40dacdf72452805e9e6b6109627d63
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Nov 22 22:17:49 2018 -0500
+
+    [cmap] Move code around
+
+ src/hb-ot-cmap-table.hh | 18 ++++++++++--------
+ 1 file changed, 10 insertions(+), 8 deletions(-)
+
+commit 758c9d68e2143493978d8ac8391f4af2a2abc26a
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Nov 22 22:16:12 2018 -0500
+
+    [morx/kerx] Limit range to subtable when sanitizing
+
+ src/hb-aat-layout-kerx-table.hh | 2 ++
+ src/hb-aat-layout-morx-table.hh | 2 ++
+ 2 files changed, 4 insertions(+)
+
+commit a9fe787a11fc391d9a43a4ea19e6eb1c474199bd
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Nov 22 22:12:36 2018 -0500
+
+    [sanitizer] Add reset_object(), make set_object() do bounds-check
+
+    Affects morx/kerx run-time only currently.  Will adjust their
+    sanitize next.
+
+ src/hb-aat-layout-kerx-table.hh |  1 +
+ src/hb-aat-layout-morx-table.hh |  1 +
+ src/hb-machinery.hh             | 30 +++++++++++++++++++-----------
+ 3 files changed, 21 insertions(+), 11 deletions(-)
+
+commit 2c8188bf599e351a4e0804d74612f9643b3d2443
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Nov 22 22:02:19 2018 -0500
+
+    [kerx] Make sure subtables are non-zero-length
+
+    Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=11400
+
+ src/hb-aat-layout-kerx-table.hh                          |   1 +
+ src/hb-aat-layout-morx-table.hh                          |   2 +-
+ ...z-testcase-minimized-hb-shape-fuzzer-5722888989048832 | Bin 0 ->
+ 3608 bytes
+ 3 files changed, 2 insertions(+), 1 deletion(-)
+
+commit a9e0bdc35dfcbead7d4b6fa249d60ebedd7d43ca
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Nov 22 21:30:04 2018 -0500
+
+    [GSUB] Don't flush glyphset during recursion in closure()
+
+    See comment.
+
+    Supercedes https://github.com/harfbuzz/harfbuzz/pull/1401
+    Fixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=11366
+
+ src/hb-ot-layout-gsub-table.hh | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+commit 8982830d3ec54f50cc951de9569520fafc735e75
+Author: Garret Rieger <grieger at google.com>
+Date:   Mon Nov 19 13:00:24 2018 -0800
+
+    [subset] add fuzzer testcase.
+
+ ...z-testcase-minimized-hb-subset-fuzzer-5067936541179904 | Bin 0 ->
+ 172 bytes
+ 1 file changed, 0 insertions(+), 0 deletions(-)
+
+commit d0e81b2cc85d09d01905c5fc5b3382c25eaa3bb3
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Nov 22 21:20:39 2018 -0500
+
+    [set] Rename
+
+ src/hb-set.hh | 12 ++++++------
+ 1 file changed, 6 insertions(+), 6 deletions(-)
+
+commit e866910579e9cdc5b1ffa2e401fd0c056d44ca6a
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Nov 22 18:07:59 2018 -0500
+
+    Enforce requiring null_size even if min_size is 0
+
+    This concludes null-size enforcement changes
+
+ src/hb-null.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 4d4fd64ff47da04a7008d410c92e8fb4ad970781
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Nov 22 18:07:36 2018 -0500
+
+    Allow non-nullable OffsetTo<> to non-Null'able objects
+
+ src/hb-open-type.hh | 16 +++++++++++++++-
+ 1 file changed, 15 insertions(+), 1 deletion(-)
+
+commit fa9f585ec53bc7145d3bed1a4bd756d64dae1e55
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Nov 22 17:56:51 2018 -0500
+
+    [glyf] Don't mark structs UNBOUNDED
+
+    See comments.
+
+ src/hb-ot-glyf-table.hh | 8 ++++++--
+ 1 file changed, 6 insertions(+), 2 deletions(-)
+
+commit f47a60a7543dbaf41086c25a1a22ae518d8b92a9
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Nov 22 17:53:29 2018 -0500
+
+    Mark UnsizedArrayOf<> as UNBOUNDED
+
+    Since min_size is 0, Null() still accepts this type.
+
+ src/hb-open-type.hh | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+commit 199a0f7b41b691e371487fd569c0d0146da3c3f3
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Nov 22 17:31:07 2018 -0500
+
+    [ot-shape] Simplify logic
+
+ src/hb-ot-shape.cc | 9 ++++++---
+ 1 file changed, 6 insertions(+), 3 deletions(-)
+
+commit 014e4980ed9c8c473001abdb3a44121eb73fd50d
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Nov 22 16:21:49 2018 -0500
+
+    Move
+
+ src/hb-ot-shape.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 62890dee18b88865a2014fb6a1322c1c9218bd49
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Nov 22 16:20:29 2018 -0500
+
+    [aat] Zero mark advances if decided so even if there's cross-kerning
+
+    Cross-kerning can only take care of positioning vertically.
+    It doesn't
+    adjust mark advance...
+
+ src/hb-ot-shape.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit a201fa74cd67f36a402a5c8093889c9d793e9fd5
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Nov 22 15:52:29 2018 -0500
+
+    [aat] Tweak fallback positioning logic when applying morx
+
+    Such that for Indic-like scripts (eg. Khmer), we don't do any
+    fallback mark
+    advance-zeroing / positioning, but we do for Latin, etc.  Reuses
+    preferences
+    of our script-specific OpenType shapers for those.
+
+    Fixes regression: https://github.com/harfbuzz/harfbuzz/issues/1393
+    Which means, fixes again:
+    https://github.com/harfbuzz/harfbuzz/issues/1264
+    While not regressing: https://github.com/harfbuzz/harfbuzz/issues/1357
+
+ src/hb-ot-shape.cc | 38 +++++++++++++++++++++++---------------
+ src/hb-ot-shape.hh |  3 +++
+ 2 files changed, 26 insertions(+), 15 deletions(-)
+
+commit fa0bd8964d110c168a918bc331dcd350c3fed8c1
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Nov 22 14:46:39 2018 -0500
+
+    [myanmar] Minor move
+
+ src/hb-ot-shape-complex.hh | 12 ++++++------
+ 1 file changed, 6 insertions(+), 6 deletions(-)
+
+commit 7dc561984bdb1f29f09ae0793195b5fbf772522b
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Nov 22 14:45:46 2018 -0500
+
+    [myanmar] If there's no GSUB table, pick myanmar shaper
+
+    Needed for morx+kern mark-zeroing interaction.  All other scripts
+    work this way.
+
+ src/hb-ot-shape-complex.hh | 16 +++++++++++++---
+ 1 file changed, 13 insertions(+), 3 deletions(-)
+
+commit 25f52f58c20715cc0dee2dd2885669078a128b08
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Nov 22 14:41:01 2018 -0500
+
+    [myanmar] Remove myanmar_old shaper
+
+    Over time it has become the same as default shaper.  So, remove.
+
+ src/hb-ot-shape-complex-myanmar.cc | 21 ---------------------
+ src/hb-ot-shape-complex.hh         |  4 +---
+ 2 files changed, 1 insertion(+), 24 deletions(-)
+
+commit eeed802b1d0f932c61a088d3e0156ae70645b9e2
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Nov 22 01:53:36 2018 -0500
+
+    Fix spurious gcc warnings
+
+    ../../src/hb-null.hh:53:39: warning: enum constant in boolean context
+    [-Wint-in-bool-context]
+
+ src/hb-null.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit b96ecb9971a9ad089a631d0139f05ae9d880fc55
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Nov 22 01:49:12 2018 -0500
+
+    More
+
+    This makes more of the gcc spurious warning:
+
+    ../../src/hb-null.hh:53:39: warning: enum constant in boolean context
+    [-Wint-in-bool-context]
+
+    But not going to let that defeat correct code.  Type to switch
+    to clang
+    as my main compiler...
+
+ src/hb-blob.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 2737aa81e5aee721e868bf0c72f19c0245c721fe
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Nov 22 01:44:27 2018 -0500
+
+    Fix up recent change
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1300
+
+ src/hb-null.hh          | 12 +++++++++---
+ src/hb-open-type.hh     |  5 -----
+ src/hb-ot-glyf-table.hh |  4 ++--
+ 3 files changed, 11 insertions(+), 10 deletions(-)
+
+commit fffea5aff7a631eedd13c38c1fb7ea4f5f950930
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Nov 22 01:25:34 2018 -0500
+
+    Minor
+
+ src/hb-open-type.hh | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+commit 209b58ef731f102b92179ed76551e2fd6b5ed075
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Nov 22 01:22:33 2018 -0500
+
+    Minor
+
+ src/hb-ot-kern-table.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 3b9fd176e83bbebc4d0b5fc967c15b08fdef7015
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Nov 22 01:18:55 2018 -0500
+
+    Disallow taking Null() of unbounded structs
+
+    Not sure I've marked all such structs.  To be done as we discover.
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1300
+
+ src/hb-aat-layout-common.hh |  2 +-
+ src/hb-machinery.hh         |  4 ++++
+ src/hb-ot-kern-table.hh     |  2 +-
+ src/hb-ot-var-fvar-table.hh | 31 ++++++++++++++++---------------
+ 4 files changed, 22 insertions(+), 17 deletions(-)
+
+commit f2b91d6510face95008151bb0d25837723536f9f
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Nov 22 01:10:22 2018 -0500
+
+    Use Type::null_size for our structs in Null(), sizeof() for other
+    types
+
+ src/hb-null.hh | 17 +++++++++++++++--
+ 1 file changed, 15 insertions(+), 2 deletions(-)
+
+commit 7dd945a8764cbbf76f686fd9387918b63f7d2fb4
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Nov 22 01:05:02 2018 -0500
+
+    One more time..
+
+ src/hb-machinery.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit d062ad10de6c63d94676660b76526a160cf4299e
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Nov 22 00:39:14 2018 -0500
+
+    Fix bots happy again, hopefully
+
+    So, our fallback static_assert cannot be had more than once per line
+    of source.
+
+ src/hb-machinery.hh | 16 +++++++---------
+ 1 file changed, 7 insertions(+), 9 deletions(-)
+
+commit fb10c021c8a32f8dc054f008caf86af82667e109
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Thu Nov 22 00:21:49 2018 -0500
+
+    Revert alignof() == 1 check
+
+    Bots not happy with using "this" inside assertion...
+
+    This reverts 2656644887e77a9d814bb12374af3c26b42fd935
+
+ src/hb-machinery.hh | 12 ++++--------
+ 1 file changed, 4 insertions(+), 8 deletions(-)
+
+commit 8d778877b88155dec1808a994416ead0b3d98ae7
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Wed Nov 21 23:46:09 2018 -0500
+
+    ..
+
+ src/hb-machinery.hh | 8 ++++++--
+ src/hb-null.hh      | 4 ++--
+ 2 files changed, 8 insertions(+), 4 deletions(-)
+
+commit 8cfeed99486e87c3217dc141bc24b7768a460f32
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Wed Nov 21 23:42:31 2018 -0500
+
+    Minor
+
+ src/hb-machinery.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit e5d954a2fb0c390ea67e83763e3c3a47caa2eb50
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Wed Nov 21 23:30:50 2018 -0500
+
+    Minor
+
+ src/hb-machinery.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit e987059c618e03d2346c31ed64429d67ce0e367a
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Wed Nov 21 23:25:06 2018 -0500
+
+    Minor
+
+ src/hb-machinery.hh | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+commit a2b6d308a40d737f54a79f00bc7ace226bad5aaf
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Wed Nov 21 23:23:49 2018 -0500
+
+    Remove DEFINE_SIZE_ARRAY2
+
+ src/hb-machinery.hh        | 6 ------
+ src/hb-ot-layout-common.hh | 8 ++++----
+ src/hb-ot-post-table.hh    | 6 +++---
+ 3 files changed, 7 insertions(+), 13 deletions(-)
+
+commit 2656644887e77a9d814bb12374af3c26b42fd935
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Wed Nov 21 23:23:21 2018 -0500
+
+    Check alignof() structs are 1
+
+ src/hb-machinery.hh | 16 +++++++++++-----
+ 1 file changed, 11 insertions(+), 5 deletions(-)
+
+commit 6321fdf7040ce48e3de8d34fdcc57caa6433cb66
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Wed Nov 21 23:19:00 2018 -0500
+
+    Whitespace
+
+ src/hb-machinery.hh | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit f961c1eb88af0d178e5d3431b9d57bdf79669488
+Merge: ecdceea8 264439c6
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Wed Nov 21 17:27:27 2018 -0500
+
+    Merge pull request #1400 from harfbuzz/sharada-sandhi-mark
+
+    Test U+111C9 SHARADA SANDHI MARK
+
+commit 264439c6c308ac5f01c4ba4faf64daa2d642236a
+Author: David Corbett <corbett.dav at husky.neu.edu>
+Date:   Wed Nov 21 16:33:45 2018 -0500
+
+    Test U+111C9 SHARADA SANDHI MARK
+
+ .../fonts/86cdd983c4e4c4d7f27dd405d6ceb7d4b9ed3d35.ttf    | Bin 0 ->
+ 968 bytes
+ test/shaping/data/in-house/tests/use-syllable.tests       |   1 +
+ 2 files changed, 1 insertion(+)
+
+commit ecdceea861952be003e1d435aa3282a4e3e200a9
+Merge: b89c7fd3 b3d5b0a5
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Wed Nov 21 16:12:32 2018 -0500
+
+    Merge pull request #1399 from harfbuzz/sharada-sandhi-mark
+
+    Fix USE categories for U+111C9 SHARADA SANDHI MARK
+
+commit b89c7fd3dc505a958dd4b6acec0e0f8e57224fd8
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Wed Nov 21 12:32:48 2018 -0500
+
+    Allow defining HB_USE_ATEXIT to 0
+
+    That's better use of that value than requiring extra macro
+    HB_NO_ATEXIT
+
+ src/hb-common.cc    | 10 +++++-----
+ src/hb-ft.cc        | 12 ++++++------
+ src/hb-glib.cc      |  6 +++---
+ src/hb-icu.cc       |  6 +++---
+ src/hb-ot-font.cc   |  6 +++---
+ src/hb-shape.cc     |  6 +++---
+ src/hb-shaper.cc    |  6 +++---
+ src/hb-ucdn.cc      |  6 +++---
+ src/hb-uniscribe.cc |  4 ++--
+ src/hb.hh           |  5 ++++-
+ 10 files changed, 35 insertions(+), 32 deletions(-)
+
+commit b3d5b0a5d92115ca672b8103999ab7ac88e39a4a
+Author: David Corbett <corbett.dav at husky.neu.edu>
+Date:   Wed Nov 21 11:35:44 2018 -0500
+
+    Fix USE categories for U+111C9 SHARADA SANDHI MARK
+
+ src/gen-use-table.py                 | 7 ++++++-
+ src/hb-ot-shape-complex-use-table.cc | 2 +-
+ 2 files changed, 7 insertions(+), 2 deletions(-)
+
+commit f48bb9a3939067f24a81007e642caaac77cc7167
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Nov 20 20:40:55 2018 -0500
+
+    [var] Deprecated axis enumeration API and add new version
+
+    New version has axis flags.
+
+    New API:
+    +hb_ot_var_axis_info_t
+    +hb_ot_var_find_axis_info()
+    +hb_ot_var_get_axis_infos()
+
+    Deprecated API:
+    -HB_OT_VAR_NO_AXIS_INDEX
+    -hb_ot_var_axis_t
+    -hb_ot_var_find_axis()
+    -hb_ot_var_get_axes()
+
+ docs/harfbuzz-sections.txt  |  14 +++---
+ src/hb-deprecated.h         |  37 +++++++++++++++
+ src/hb-ot-var-fvar-table.hh | 112
+ ++++++++++++++++++++++++++++++++------------
+ src/hb-ot-var.cc            |  43 ++++++++++++++---
+ src/hb-ot-var.h             |  61 ++++++++++++------------
+ test/api/test-ot-face.c     |   2 +-
+ 6 files changed, 192 insertions(+), 77 deletions(-)
+
+commit b2d803cef6974519d5892af2c9efeb8dfba87618
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Nov 20 11:42:25 2018 -0500
+
+    Remove newly-added -hb_ot_var_axis_get_flags()
+
+ src/hb-ot-var-fvar-table.hh |  6 ------
+ src/hb-ot-var.cc            | 12 ------------
+ src/hb-ot-var.h             |  4 ----
+ 3 files changed, 22 deletions(-)
+
+commit 736897d7a1410fd281fbcedc084b85bf4ba1410c
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Nov 20 11:40:43 2018 -0500
+
+    [var] Make sure hb_ot_var_axis_flags_t is int-sized
+
+ src/hb-ot-var.h | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+commit eab5d15f6156e771cb606b760dd170b96c5cd398
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Nov 20 11:33:33 2018 -0500
+
+    [var] Move code
+
+ src/hb-ot-var.h | 27 ++++++++++++++-------------
+ 1 file changed, 14 insertions(+), 13 deletions(-)
+
+commit 064f703c7ac5a28803a8221720e922ea6dbd2505
+Merge: be1828da 82951182
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Nov 20 16:29:30 2018 -0500
+
+    Merge pull request #1397 from harfbuzz/small-emoji-table
+
+    Shrink the emoji table by merging adjacent ranges
+
+commit 82951182799772a642d32195dd87e6f0c116f545
+Author: David Corbett <corbett.dav at husky.neu.edu>
+Date:   Tue Nov 20 15:41:45 2018 -0500
+
+    Shrink the emoji table by merging adjacent ranges
+
+ src/gen-emoji-table.py        |  13 +--
+ src/hb-unicode-emoji-table.hh | 189
+ ++++--------------------------------------
+ 2 files changed, 23 insertions(+), 179 deletions(-)
+
+commit be1828daaa1e1a72d971aed8d34fff54688d0f41
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Nov 20 11:16:23 2018 -0500
+
+    [var] Fix type of coords returned
+
+    Ouch.  Wonder how none of the bots caught the float->int truncation.
+
+ src/hb-ot-var-fvar-table.hh | 2 +-
+ src/hb-ot-var.cc            | 2 +-
+ src/hb-ot-var.h             | 2 +-
+ 3 files changed, 3 insertions(+), 3 deletions(-)
+
+commit 8f3ee17ae468950a34439785d2e6ac4182efb65c
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Nov 20 01:38:23 2018 -0500
+
+    [travis] Update Coverity token
+
+ .travis.yml | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit f9552362986efd0973b2637d21b787edbc8479f2
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Nov 20 01:21:36 2018 -0500
+
+    Add codecov.io badge
+
+ README | 13 +++++++------
+ 1 file changed, 7 insertions(+), 6 deletions(-)
+
+commit 831ba74382e35f110006539f22bebce4d57c8502
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Nov 20 01:16:08 2018 -0500
+
+    Fix Codacy "issues"
+
+ src/test-name-table.cc  |  2 +-
+ src/test-ot-color.cc    | 14 +++++++-------
+ test/api/test-buffer.c  |  5 +++--
+ test/api/test-object.c  |  2 +-
+ test/api/test-ot-name.c |  2 +-
+ 5 files changed, 13 insertions(+), 12 deletions(-)
+
+commit c49e43c1ffee0e9664da6202ace493d932b725a1
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Nov 20 01:06:50 2018 -0500
+
+    [travis] Another push for codecov.io after setting token
+
+ .travis.yml | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+commit 96b24c5124a085b7601215360eed847ce5302699
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Tue Nov 20 01:03:42 2018 -0500
+
+    [travis] Add codecov.io
+
+ .travis.yml | 1 +
+ 1 file changed, 1 insertion(+)
+
+commit 3c7792ca326abfb989285f794d6ee71ad9f6bf89
+Author: David Corbett <corbett.dav at husky.neu.edu>
+Date:   Sat Oct 20 15:02:26 2018 -0400
+
+    [use] Fix reordering
+
+    Fixes #1235.
+
+ src/hb-ot-shape-complex-use.cc                     |  48
+ ++++++++++++++-------
+ src/hb.hh                                          |   2 +
+ .../4afb0e8b9a86bb9bd73a1247de4e33fbe3c1fd93.ttf   | Bin 0 -> 1824 bytes
+ test/shaping/data/in-house/tests/use.tests         |   3 ++
+ 4 files changed, 38 insertions(+), 15 deletions(-)
+
+commit 587d49fc657c10c8a20f2409a04d72bf80bb361e
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Nov 19 14:27:19 2018 -0500
+
+    [fvar] Add named-instance API
+
+    Fixes https://github.com/harfbuzz/harfbuzz/issues/1241
+
+ docs/harfbuzz-sections.txt  |  4 ++++
+ src/hb-ot-var-fvar-table.hh | 55
+ ++++++++++++++++++++++++++++++++++++++++++---
+ src/hb-ot-var.cc            | 33 +++++++++++++++++++++++++++
+ src/hb-ot-var.h             | 32 ++++++++++++++++++++++++++
+ 4 files changed, 121 insertions(+), 3 deletions(-)
+
+commit 46c0da820fc313bad8afaf019d2cd9065fa5f514
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Nov 19 13:32:48 2018 -0500
+
+    Fix build
+
+ src/hb-dsalgs.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+commit 56c9238d3da8c034336cf80ba37e03e33c493718
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Nov 19 13:09:53 2018 -0500
+
+    [fvar] Rewrite sanitize
+
+ src/hb-ot-var-fvar-table.hh | 8 +++-----
+ 1 file changed, 3 insertions(+), 5 deletions(-)
+
+commit 4a6a692e3ea4fab632a0162c6d513dc151054d8f
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Nov 19 13:04:43 2018 -0500
+
+    [fvar] Use hb_array_t for axes
+
+ src/hb-dsalgs.hh            |  6 ++++++
+ src/hb-ot-var-fvar-table.hh | 14 ++++----------
+ 2 files changed, 10 insertions(+), 10 deletions(-)
+
+commit e0097396010c40cf62641cd12ceb12dd5d79c9c7
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Nov 19 12:53:53 2018 -0500
+
+    [fvar] Minor
+
+ src/hb-ot-var-fvar-table.hh | 9 +++++----
+ 1 file changed, 5 insertions(+), 4 deletions(-)
+
+commit 1a2eb108b857de9c5e84cc5de0c12c7657e04498
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Nov 19 12:36:56 2018 -0500
+
+    [ot-var] Add hb_ot_var_axis_get_flags()
+
+    Part of https://github.com/harfbuzz/harfbuzz/issues/1241
+
+    New API:
+    +hb_ot_var_axis_flags_t
+    +hb_ot_var_axis_get_flags
+
+ docs/harfbuzz-sections.txt  |  2 ++
+ src/hb-buffer.h             |  2 ++
+ src/hb-ot-var-fvar-table.hh |  9 +++++++++
+ src/hb-ot-var.cc            | 12 ++++++++++++
+ src/hb-ot-var.h             | 13 +++++++++++++
+ 5 files changed, 38 insertions(+)
+
+commit bd6b2ba1d3910cc259db7abeb6c9bd7ed9494857
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Nov 19 11:34:56 2018 -0500
+
+    [ot-var] Add flags
+
+    Unfortunate that we don't have room in hb_ot_var_axis_t to expose
+    flags :(.
+
+ src/hb-ot-var-fvar-table.hh | 9 +++++++--
+ 1 file changed, 7 insertions(+), 2 deletions(-)
+
+commit c076c7b85ce4d069ae8b2b04143aca4c4f052ae9
+Author: Behdad Esfahbod <behdad at behdad.org>
+Date:   Mon Nov 19 11:30:40 2018 -0500
+
+    [ot-var] Use hb_ot_name_id_t
+
+ src/hb-ot-var.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
 commit e3a1a8350a6a7933b0a100194985f4425ab9de19
 Author: Behdad Esfahbod <behdad at behdad.org>
 Date:   Fri Nov 16 16:53:25 2018 -0800

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/NEWS
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/NEWS	2018-11-29 23:34:53 UTC (rev 49276)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/NEWS	2018-11-30 01:09:56 UTC (rev 49277)
@@ -1,3 +1,38 @@
+Overview of changes leading to 2.2.0
+Thursday, November 29, 2018
+====================================
+- Misc shaping bug fixes.
+- Add font variations named-instance API.
+- Deprecate font variations axis enumeration API and add replacement.
+- AAT shaping improvements:
+  o Fixed 'kern' table Format 2 implementation.
+  o Implement 'feat' table API for feature detection.
+  o Blacklist 'GSUB' table of fonts from 'MUTF' foundry that also have 'morx'.
+
+New API:
++hb_aat_layout_feature_type_t
++hb_aat_layout_feature_selector_t
++hb_aat_layout_get_feature_types()
++hb_aat_layout_feature_type_get_name_id
++hb_aat_layout_feature_selector_info_t
++HB_AAT_LAYOUT_NO_SELECTOR_INDEX
++hb_aat_layout_feature_type_get_selector_infos()
++hb_ot_var_axis_flags_t
++hb_ot_var_axis_info_t
++hb_ot_var_get_axis_infos()
++hb_ot_var_find_axis_info()
++hb_ot_var_get_named_instance_count()
++hb_ot_var_named_instance_get_subfamily_name_id()
++hb_ot_var_named_instance_get_postscript_name_id()
++hb_ot_var_named_instance_get_design_coords()
+
+Deprecated API:
++HB_OT_VAR_NO_AXIS_INDEX
++hb_ot_var_axis_t
++hb_ot_var_get_axes()
++hb_ot_var_find_axis()
+
+
 Overview of changes leading to 2.1.3
 Friday, November 16, 2018
 ====================================

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/README
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/README	2018-11-29 23:34:53 UTC (rev 49276)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/README	2018-11-30 01:09:56 UTC (rev 49277)
@@ -1,9 +1,10 @@
-[![Build Status](https://travis-ci.org/harfbuzz/harfbuzz.svg)](https://travis-ci.org/harfbuzz/harfbuzz)
-[![Build status](https://ci.appveyor.com/api/projects/status/0t0flrxpstj9lb9w?svg=true)](https://ci.appveyor.com/project/harfbuzz/harfbuzz)
-[![CircleCI](https://circleci.com/gh/harfbuzz/harfbuzz.svg?style=svg)](https://circleci.com/gh/harfbuzz/harfbuzz)
-[![Coverity](https://img.shields.io/coverity/scan/5450.svg)](https://scan.coverity.com/projects/behdad-harfbuzz)
-[![Codacy Badge](https://api.codacy.com/project/badge/Grade/f17f1708783c447488bc8dd317150eaa)](https://app.codacy.com/app/behdad/harfbuzz)
-[![Coverage Status](https://img.shields.io/coveralls/harfbuzz/harfbuzz.svg)](https://coveralls.io/r/harfbuzz/harfbuzz)
+[![Travis Build Status](https://travis-ci.org/harfbuzz/harfbuzz.svg)](https://travis-ci.org/harfbuzz/harfbuzz)
+[![AppVeyor Build Status](https://ci.appveyor.com/api/projects/status/0t0flrxpstj9lb9w?svg=true)](https://ci.appveyor.com/project/harfbuzz/harfbuzz)
+[![CircleCI Build Status](https://circleci.com/gh/harfbuzz/harfbuzz.svg?style=svg)](https://circleci.com/gh/harfbuzz/harfbuzz)
+[![Coverity Code Health](https://img.shields.io/coverity/scan/5450.svg)](https://scan.coverity.com/projects/behdad-harfbuzz)
+[![Codacy Code Health](https://api.codacy.com/project/badge/Grade/f17f1708783c447488bc8dd317150eaa)](https://app.codacy.com/app/behdad/harfbuzz)
+[![Codecov Code Coverage](https://codecov.io/gh/harfbuzz/harfbuzz/branch/master/graph/badge.svg)](https://codecov.io/gh/harfbuzz/harfbuzz)
+[![Coverals Code Coverage](https://img.shields.io/coveralls/harfbuzz/harfbuzz.svg)](https://coveralls.io/r/harfbuzz/harfbuzz)
 [ABI Tracker](http://abi-laboratory.pro/tracker/timeline/harfbuzz/)
 
 This is HarfBuzz, a text shaping library.

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/configure.ac
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/configure.ac	2018-11-29 23:34:53 UTC (rev 49276)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/configure.ac	2018-11-30 01:09:56 UTC (rev 49277)
@@ -1,6 +1,6 @@
 AC_PREREQ([2.64])
 AC_INIT([HarfBuzz],
-        [2.1.3],
+        [2.2.0],
         [https://github.com/harfbuzz/harfbuzz/issues/new],
         [harfbuzz],
         [http://harfbuzz.org/])
@@ -508,6 +508,7 @@
 test/fuzzing/Makefile
 test/shaping/Makefile
 test/shaping/data/Makefile
+test/shaping/data/aots/Makefile
 test/shaping/data/in-house/Makefile
 test/shaping/data/text-rendering-tests/Makefile
 test/subset/Makefile

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/Makefile.am
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/Makefile.am	2018-11-29 23:34:53 UTC (rev 49276)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/Makefile.am	2018-11-30 01:09:56 UTC (rev 49277)
@@ -424,6 +424,8 @@
 	-DHB_H_IN \
 	-DHB_OT_H \
 	-DHB_OT_H_IN \
+	-DHB_AAT_H \
+	-DHB_AAT_H_IN \
 	-DHB_GOBJECT_H \
 	-DHB_GOBJECT_H_IN \
 	-DHB_EXTERN= \

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/Makefile.sources
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/Makefile.sources	2018-11-29 23:34:53 UTC (rev 49276)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/Makefile.sources	2018-11-30 01:09:56 UTC (rev 49277)
@@ -181,6 +181,8 @@
 	$(NULL)
 
 HB_OT_headers = \
+	hb-aat.h \
+	hb-aat-layout.h \
 	hb-ot.h \
 	hb-ot-color.h \
 	hb-ot-font.h \

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/gen-emoji-table.py
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/gen-emoji-table.py	2018-11-29 23:34:53 UTC (rev 49276)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/gen-emoji-table.py	2018-11-30 01:09:56 UTC (rev 49277)
@@ -12,7 +12,7 @@
 f = open(sys.argv[1])
 header = [f.readline () for _ in range(10)]
 
-sets = OrderedDict()
+ranges = OrderedDict()
 for line in f.readlines():
 	line = line.strip()
 	if not line or line[0] == '#':
@@ -25,9 +25,12 @@
 	else:
 		start = end = rang[0]
 
-	if typ not in sets:
-		sets[typ] = set()
-	sets[typ].add((start, end))
+	if typ not in ranges:
+		ranges[typ] = []
+	if ranges[typ] and ranges[typ][-1][1] == start - 1:
+		ranges[typ][-1] = (ranges[typ][-1][0], end)
+	else:
+		ranges[typ].append((start, end))
 
 
 
@@ -49,7 +52,7 @@
 print ('#include "hb-unicode.hh"')
 print ()
 
-for typ,s in sets.items():
+for typ,s in ranges.items():
 	if typ != "Extended_Pictographic": continue
 	print()
 	print("static const struct hb_unicode_range_t _hb_unicode_emoji_%s_table[] =" % typ)

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-11-29 23:34:53 UTC (rev 49276)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/gen-use-table.py	2018-11-30 01:09:56 UTC (rev 49277)
@@ -50,6 +50,8 @@
 # TODO https://github.com/roozbehp/unicode-data/issues/9
 data[0][0x11C44] = 'Consonant_Placeholder'
 data[0][0x11C45] = 'Consonant_Placeholder'
+# TODO https://github.com/harfbuzz/harfbuzz/pull/1399
+data[0][0x111C8] = 'Consonant_Placeholder'
 for u in range (0xFE00, 0xFE0F + 1):
 	data[0][u] = defaults[0]
 
@@ -168,7 +170,7 @@
 def is_BASE_IND(U, UISC, UGC):
 	#SPEC-DRAFT return (UISC in [Consonant_Dead, Modifying_Letter] or UGC == Po)
 	return (UISC in [Consonant_Dead, Modifying_Letter] or
-		(UGC == Po and not U in [0x104B, 0x104E, 0x2022, 0x11A3F, 0x11A45, 0x11C44, 0x11C45]) or
+		(UGC == Po and not U in [0x104B, 0x104E, 0x2022, 0x111C8, 0x11A3F, 0x11A45, 0x11C44, 0x11C45]) or
 		False # SPEC-DRAFT-OUTDATED! U == 0x002D
 		)
 def is_BASE_NUM(U, UISC, UGC):
@@ -354,6 +356,9 @@
 		# TODO: https://github.com/harfbuzz/harfbuzz/issues/1105
 		if U == 0x11134: UISC = Gemination_Mark
 
+		# TODO: https://github.com/harfbuzz/harfbuzz/pull/1399
+		if U == 0x111C9: UISC = Consonant_Final
+
 		values = [k for k,v in items if v(U,UISC,UGC)]
 		assert len(values) == 1, "%s %s %s %s" % (hex(U), UISC, UGC, values)
 		USE = values[0]

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-common.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-common.hh	2018-11-29 23:34:53 UTC (rev 49276)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-common.hh	2018-11-30 01:09:56 UTC (rev 49277)
@@ -69,7 +69,7 @@
   UnsizedArrayOf<T>
 		arrayZ;		/* Array of lookup values, indexed by glyph index. */
   public:
-  DEFINE_SIZE_ARRAY (2, arrayZ);
+  DEFINE_SIZE_UNBOUNDED (2);
 };
 
 
@@ -76,6 +76,8 @@
 template <typename T>
 struct LookupSegmentSingle
 {
+  enum { TerminationWordCount = 2 };
+
   inline int cmp (hb_codepoint_t g) const {
     return g < first ? -1 : g <= last ? 0 : +1 ;
   }
@@ -134,6 +136,8 @@
 template <typename T>
 struct LookupSegmentArray
 {
+  enum { TerminationWordCount = 2 };
+
   inline const T* get_value (hb_codepoint_t glyph_id, const void *base) const
   {
     return first <= glyph_id && glyph_id <= last ? &(base+valuesZ)[glyph_id - first] : nullptr;
@@ -204,6 +208,8 @@
 template <typename T>
 struct LookupSingle
 {
+  enum { TerminationWordCount = 1 };
+
   inline int cmp (hb_codepoint_t g) const { return glyph.cmp (g); }
 
   inline bool sanitize (hb_sanitize_context_t *c) const
@@ -357,6 +363,14 @@
     }
   }
 
+  inline typename T::type get_class (hb_codepoint_t glyph_id,
+				     unsigned int num_glyphs,
+				     unsigned int outOfRange) const
+  {
+    const T *v = get_value (glyph_id, num_glyphs);
+    return v ? *v : outOfRange;
+  }
+
   inline bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
@@ -436,8 +450,10 @@
      * which ensures that data has a simple sanitize(). To be determined
      * if I need to remove that as well.
      *
-     * XXX Because we are a template, our DEFINE_SIZE_STATIC assertion
-     * wouldn't be checked. */
+     * HOWEVER! Because we are a template, our DEFINE_SIZE_STATIC
+     * assertion wouldn't be checked, hence the line below. */
+    static_assert (T::static_size, "");
+
     return_trace (c->check_struct (this));
   }
 
@@ -472,7 +488,7 @@
 {
   typedef typename Types::HBUINT HBUINT;
   typedef typename Types::HBUSHORT HBUSHORT;
-  typedef typename Types::ClassType ClassType;
+  typedef typename Types::ClassTypeNarrow ClassType;
 
   enum State
   {
@@ -630,6 +646,7 @@
   DEFINE_SIZE_STATIC (4 * sizeof (HBUINT));
 };
 
+template <typename HBUCHAR>
 struct ClassTable
 {
   inline unsigned int get_class (hb_codepoint_t glyph_id, unsigned int outOfRange) const
@@ -637,6 +654,12 @@
     unsigned int i = glyph_id - firstGlyph;
     return i >= classArray.len ? outOfRange : classArray.arrayZ[i];
   }
+  inline unsigned int get_class (hb_codepoint_t glyph_id,
+				 unsigned int num_glyphs HB_UNUSED,
+				 unsigned int outOfRange) const
+  {
+    return get_class (glyph_id, outOfRange);
+  }
   inline bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
@@ -644,7 +667,7 @@
   }
   protected:
   GlyphID		firstGlyph;	/* First glyph index included in the trimmed array. */
-  ArrayOf<HBUINT8>	classArray;	/* The class codes (indexed by glyph index minus
+  ArrayOf<HBUCHAR>	classArray;	/* The class codes (indexed by glyph index minus
 					 * firstGlyph). */
   public:
   DEFINE_SIZE_ARRAY (4, classArray);
@@ -655,15 +678,9 @@
   static const bool extended = false;
   typedef HBUINT16 HBUINT;
   typedef HBUINT8 HBUSHORT;
-  struct ClassType : ClassTable
-  {
-    inline unsigned int get_class (hb_codepoint_t glyph_id,
-				   unsigned int num_glyphs HB_UNUSED,
-				   unsigned int outOfRange) const
-    {
-      return ClassTable::get_class (glyph_id, outOfRange);
-    }
-  };
+  typedef ClassTable<HBUINT8> ClassTypeNarrow;
+  typedef ClassTable<HBUINT16> ClassTypeWide;
+
   template <typename T>
   static inline unsigned int offsetToIndex (unsigned int offset,
 					    const void *base,
@@ -672,6 +689,13 @@
     return (offset - ((const char *) array - (const char *) base)) / sizeof (T);
   }
   template <typename T>
+  static inline unsigned int byteOffsetToIndex (unsigned int offset,
+						const void *base,
+						const T *array)
+  {
+    return offsetToIndex (offset, base, array);
+  }
+  template <typename T>
   static inline unsigned int wordOffsetToIndex (unsigned int offset,
 						const void *base,
 						const T *array)
@@ -684,16 +708,9 @@
   static const bool extended = true;
   typedef HBUINT32 HBUINT;
   typedef HBUINT16 HBUSHORT;
-  struct ClassType : Lookup<HBUINT16>
-  {
-    inline unsigned int get_class (hb_codepoint_t glyph_id,
-				   unsigned int num_glyphs,
-				   unsigned int outOfRange) const
-    {
-      const HBUINT16 *v = get_value (glyph_id, num_glyphs);
-      return v ? *v : outOfRange;
-    }
-  };
+  typedef Lookup<HBUINT16> ClassTypeNarrow;
+  typedef Lookup<HBUINT16> ClassTypeWide;
+
   template <typename T>
   static inline unsigned int offsetToIndex (unsigned int offset,
 					    const void *base,
@@ -702,6 +719,13 @@
     return offset;
   }
   template <typename T>
+  static inline unsigned int byteOffsetToIndex (unsigned int offset,
+						const void *base,
+						const T *array)
+  {
+    return offset / 2;
+  }
+  template <typename T>
   static inline unsigned int wordOffsetToIndex (unsigned int offset,
 						const void *base,
 						const T *array)

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-feat-table.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-feat-table.hh	2018-11-29 23:34:53 UTC (rev 49276)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-feat-table.hh	2018-11-30 01:09:56 UTC (rev 49277)
@@ -39,6 +39,27 @@
 
 struct SettingName
 {
+  friend struct FeatureName;
+
+  int cmp (hb_aat_layout_feature_selector_t key) const
+  { return (int) key - (int) setting; }
+
+  inline hb_aat_layout_feature_selector_t get_selector (void) const
+  { return (hb_aat_layout_feature_selector_t) (unsigned) setting; }
+
+  inline void get_info (hb_aat_layout_feature_selector_info_t *s,
+			hb_aat_layout_feature_selector_t default_selector) const
+  {
+    s->name_id = nameIndex;
+
+    s->enable = (hb_aat_layout_feature_selector_t) (unsigned int) setting;
+    s->disable = default_selector == HB_AAT_LAYOUT_FEATURE_SELECTOR_INVALID ?
+		 (hb_aat_layout_feature_selector_t) (s->enable + 1) :
+		 default_selector;
+
+    s->reserved = 0;
+  }
+
   inline bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
@@ -51,28 +72,69 @@
   public:
   DEFINE_SIZE_STATIC (4);
 };
+DECLARE_NULL_NAMESPACE_BYTES (AAT, SettingName);
 
+struct feat;
+
 struct FeatureName
 {
+  int cmp (hb_aat_layout_feature_type_t key) const
+  { return (int) key - (int) feature; }
+
   enum {
-    Exclusive = 0x8000,		/* If set, the feature settings are mutually exclusive. */
-    NotDefault = 0x4000,	/* If clear, then the setting with an index of 0 in
+    Exclusive	= 0x8000,	/* If set, the feature settings are mutually exclusive. */
+    NotDefault	= 0x4000,	/* If clear, then the setting with an index of 0 in
 				 * the setting name array for this feature should
 				 * be taken as the default for the feature
 				 * (if one is required). If set, then bits 0-15 of this
 				 * featureFlags field contain the index of the setting
 				 * which is to be taken as the default. */
-    IndexMask = 0x00FF		/* If bits 30 and 31 are set, then these sixteen bits
+    IndexMask	= 0x00FF	/* If bits 30 and 31 are set, then these sixteen bits
 				 * indicate the index of the setting in the setting name
 				 * array for this feature which should be taken
 				 * as the default. */
   };
 
+  inline unsigned int get_selector_infos (unsigned int                           start_offset,
+					  unsigned int                          *selectors_count, /* IN/OUT.  May be NULL. */
+					  hb_aat_layout_feature_selector_info_t *selectors,       /* OUT.     May be NULL. */
+					  unsigned int                          *pdefault_index,  /* OUT.     May be NULL. */
+					  const void *base) const
+  {
+    hb_array_t< const SettingName> settings_table = (base+settingTableZ).as_array (nSettings);
+
+    static_assert (Index::NOT_FOUND_INDEX == HB_AAT_LAYOUT_NO_SELECTOR_INDEX, "");
+
+    hb_aat_layout_feature_selector_t default_selector = HB_AAT_LAYOUT_FEATURE_SELECTOR_INVALID;
+    unsigned int default_index = Index::NOT_FOUND_INDEX;
+    if (featureFlags & Exclusive)
+    {
+      default_index = (featureFlags & NotDefault) ? featureFlags & IndexMask : 0;
+      default_selector = settings_table[default_index].get_selector ();
+    }
+    if (pdefault_index)
+      *pdefault_index = default_index;
+
+    if (selectors_count)
+    {
+      hb_array_t<const SettingName> arr = settings_table.sub_array (start_offset, selectors_count);
+      unsigned int count = arr.len;
+      for (unsigned int i = 0; i < count; i++)
+        settings_table[start_offset + i].get_info (&selectors[i], default_selector);
+    }
+    return settings_table.len;
+  }
+
+  inline hb_aat_layout_feature_type_t get_feature_type () const
+  { return (hb_aat_layout_feature_type_t) (unsigned int) feature; }
+
+  inline hb_ot_name_id_t get_feature_name_id () const { return nameIndex; }
+
   inline bool sanitize (hb_sanitize_context_t *c, const void *base) const
   {
     TRACE_SANITIZE (this);
     return_trace (likely (c->check_struct (this) &&
-			  (base+settingTable).sanitize (c, nSettings)));
+			  (base+settingTableZ).sanitize (c, nSettings)));
   }
 
   protected:
@@ -79,7 +141,7 @@
   HBUINT16	feature;	/* Feature type. */
   HBUINT16	nSettings;	/* The number of records in the setting name array. */
   LOffsetTo<UnsizedArrayOf<SettingName>, false>
-		settingTable;	/* Offset in bytes from the beginning of this table to
+		settingTableZ;	/* Offset in bytes from the beginning of this table to
 				 * this feature's setting name array. The actual type of
 				 * record this offset refers to will depend on the
 				 * exclusivity value, as described below. */
@@ -95,11 +157,47 @@
 {
   static const hb_tag_t tableTag = HB_AAT_TAG_feat;
 
+  inline bool has_data (void) const { return version.to_int (); }
+
+  inline unsigned int get_feature_types (unsigned int                  start_offset,
+					 unsigned int                 *count,
+					 hb_aat_layout_feature_type_t *features) const
+  {
+    unsigned int feature_count = featureNameCount;
+    if (count && *count)
+    {
+      unsigned int len = MIN (feature_count - start_offset, *count);
+      for (unsigned int i = 0; i < len; i++)
+	features[i] = namesZ[i + start_offset].get_feature_type ();
+      *count = len;
+    }
+    return featureNameCount;
+  }
+
+  inline const FeatureName& get_feature (hb_aat_layout_feature_type_t feature_type) const
+  {
+    return namesZ.bsearch (featureNameCount, feature_type);
+  }
+
+  inline hb_ot_name_id_t get_feature_name_id (hb_aat_layout_feature_type_t feature) const
+  { return get_feature (feature).get_feature_name_id (); }
+
+  inline unsigned int get_selector_infos (hb_aat_layout_feature_type_t           feature_type,
+					  unsigned int                           start_offset,
+					  unsigned int                          *selectors_count, /* IN/OUT.  May be NULL. */
+					  hb_aat_layout_feature_selector_info_t *selectors,       /* OUT.     May be NULL. */
+					  unsigned int                          *default_index    /* OUT.     May be NULL. */) const
+  {
+    return get_feature (feature_type).get_selector_infos (start_offset, selectors_count, selectors,
+							  default_index, this);
+  }
+
   inline bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
     return_trace (likely (c->check_struct (this) &&
-			  names.sanitize (c, featureNameCount, this)));
+			  version.major == 1 &&
+			  namesZ.sanitize (c, featureNameCount, this)));
   }
 
   protected:
@@ -109,8 +207,8 @@
 				/* The number of entries in the feature name array. */
   HBUINT16	reserved1;	/* Reserved (set to zero). */
   HBUINT32	reserved2;	/* Reserved (set to zero). */
-  UnsizedArrayOf<FeatureName>
-		names;		/* The feature name array. */
+  SortedUnsizedArrayOf<FeatureName>
+		namesZ;		/* The feature name array. */
   public:
   DEFINE_SIZE_STATIC (24);
 };

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-kerx-table.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-kerx-table.hh	2018-11-29 23:34:53 UTC (rev 49276)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-kerx-table.hh	2018-11-30 01:09:56 UTC (rev 49277)
@@ -49,7 +49,7 @@
 	       const void *base,
 	       hb_aat_apply_context_t *c)
 {
-  if (likely (!tupleCount)) return value;
+  if (likely (!tupleCount || !c)) return value;
 
   unsigned int offset = value;
   const FWORD *pv = &StructAtOffset<FWORD> (base, offset);
@@ -93,21 +93,11 @@
 template <typename KernSubTableHeader>
 struct KerxSubTableFormat0
 {
-  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 int get_kerning (hb_codepoint_t left, hb_codepoint_t right,
-			  hb_aat_apply_context_t *c) const
+			  hb_aat_apply_context_t *c = nullptr) const
   {
     hb_glyph_pair_t pair = {left, right};
-    int i = pairs.bsearch (pair);
-    if (i == -1) return 0;
-    int v = pairs[i].get_kerning ();
+    int v = pairs.bsearch (pair).get_kerning ();
     return kerxTupleKern (v, header.tuple_count (), this, c);
   }
 
@@ -265,7 +255,7 @@
 	unsigned int tuple_count = MAX (1u, table->header.tuple_count ());
 
 	unsigned int kern_idx = Format1EntryT::kernActionIndex (entry);
-	kern_idx = Types::offsetToIndex (kern_idx, &table->machine, kernAction.arrayZ);
+	kern_idx = Types::byteOffsetToIndex (kern_idx, &table->machine, kernAction.arrayZ);
 	const FWORD *actions = &kernAction[kern_idx];
 	if (!c->sanitizer.check_array (actions, depth, tuple_count))
 	{
@@ -402,9 +392,13 @@
     unsigned int num_glyphs = c->sanitizer.get_num_glyphs ();
     unsigned int l = (this+leftClassTable).get_class (left, num_glyphs, 0);
     unsigned int r = (this+rightClassTable).get_class (right, num_glyphs, 0);
-    unsigned int offset = l + r;
-    const FWORD *v = &StructAtOffset<FWORD> (&(this+array), offset);
+
+    const UnsizedArrayOf<FWORD> &arrayZ = this+array;
+    unsigned int kern_idx = l + r;
+    kern_idx = Types::offsetToIndex (kern_idx, this, &arrayZ);
+    const FWORD *v = &arrayZ[kern_idx];
     if (unlikely (!v->sanitize (&c->sanitizer))) return 0;
+
     return kerxTupleKern (*v, header.tuple_count (), this, c);
   }
 
@@ -447,19 +441,13 @@
 			  c->check_range (this, array)));
   }
 
-  /* Note:
-   * OT kern table specifies ClassTable as having 16-bit entries, whereas
-   * AAT kern table specifies them as having 8bit entries.
-   * I've not seen any fonts with this format in kern table.
-   * We follow AAT. */
-
   protected:
   KernSubTableHeader	header;
   HBUINT		rowWidth;	/* The width, in bytes, of a row in the table. */
-  OffsetTo<typename Types::ClassType, HBUINT, false>
+  OffsetTo<typename Types::ClassTypeWide, HBUINT, false>
 			leftClassTable;	/* Offset from beginning of this subtable to
 					 * left-hand class table. */
-  OffsetTo<typename Types::ClassType, HBUINT, false>
+  OffsetTo<typename Types::ClassTypeWide, HBUINT, false>
 			rightClassTable;/* Offset from beginning of this subtable to
 					 * right-hand class table. */
   OffsetTo<UnsizedArrayOf<FWORD>, HBUINT, false>
@@ -812,6 +800,7 @@
   {
     TRACE_SANITIZE (this);
     if (!u.header.sanitize (c) ||
+	u.header.length <= u.header.static_size ||
 	!c->check_range (this, u.header.length))
       return_trace (false);
 
@@ -842,6 +831,21 @@
   /* https://en.wikipedia.org/wiki/Curiously_recurring_template_pattern */
   inline const T* thiz (void) const { return static_cast<const T *> (this); }
 
+  inline bool has_state_machine (void) const
+  {
+    typedef typename T::SubTable SubTable;
+
+    const SubTable *st = &thiz()->firstSubTable;
+    unsigned int count = thiz()->tableCount;
+    for (unsigned int i = 0; i < count; i++)
+    {
+      if (st->get_type () == 1)
+        return true;
+      st = &StructAfter<SubTable> (*st);
+    }
+    return false;
+  }
+
   inline bool has_cross_stream (void) const
   {
     typedef typename T::SubTable SubTable;
@@ -920,10 +924,12 @@
       if (reverse)
 	c->buffer->reverse ();
 
-      c->sanitizer.set_object (*st);
+      {
+	/* See comment in sanitize() for conditional here. */
+	hb_sanitize_with_object_t with (&c->sanitizer, i < count - 1 ? st : (const SubTable *) nullptr);
+	ret |= st->dispatch (c);
+      }
 
-      ret |= st->dispatch (c);
-
       if (reverse)
 	c->buffer->reverse ();
 
@@ -951,8 +957,20 @@
     unsigned int count = thiz()->tableCount;
     for (unsigned int i = 0; i < count; i++)
     {
+      if (unlikely (!st->u.header.sanitize (c)))
+	return_trace (false);
+      /* OpenType kern table has 2-byte subtable lengths.  That's limiting.
+       * MS implementation also only supports one subtable, of format 0,
+       * anyway.  Certain versions of some fonts, like Calibry, contain
+       * kern subtable that exceeds 64kb.  Looks like, the subtable length
+       * is simply ignored.  Which makes sense.  It's only needed if you
+       * have multiple subtables.  To handle such fonts, we just ignore
+       * the length for the last subtable. */
+      hb_sanitize_with_object_t with (c, i < count - 1 ? st : (const SubTable *) nullptr);
+
       if (unlikely (!st->sanitize (c)))
 	return_trace (false);
+
       st = &StructAfter<SubTable> (*st);
     }
 

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-lcar-table.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-lcar-table.hh	2018-11-29 23:34:53 UTC (rev 49276)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-lcar-table.hh	2018-11-30 01:09:56 UTC (rev 49277)
@@ -52,10 +52,10 @@
     const OffsetTo<LigCaretClassEntry>* entry_offset = lookup.get_value (glyph,
 									 font->face->get_num_glyphs ());
     const LigCaretClassEntry& array = entry_offset ? this+*entry_offset : Null (LigCaretClassEntry);
-    if (caret_count && *caret_count)
+    if (caret_count)
     {
-      const HBINT16 *arr = array.sub_array (start_offset, caret_count);
-      unsigned int count = *caret_count;
+      hb_array_t<const HBINT16> arr = array.sub_array (start_offset, caret_count);
+      unsigned int count = arr.len;
       for (unsigned int i = 0; i < count; ++i)
 	switch (format)
 	{

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-11-29 23:34:53 UTC (rev 49276)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-morx-table.hh	2018-11-30 01:09:56 UTC (rev 49277)
@@ -911,14 +911,22 @@
     }
   }
 
+  inline bool apply (hb_aat_apply_context_t *c) const
+  {
+    TRACE_APPLY (this);
+    hb_sanitize_with_object_t with (&c->sanitizer, this);
+    return_trace (dispatch (c));
+  }
+
   inline bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
     if (!length.sanitize (c) ||
-	length < min_size ||
+	length <= min_size ||
 	!c->check_range (this, length))
       return_trace (false);
 
+    hb_sanitize_with_object_t with (c, this);
     return_trace (dispatch (c));
   }
 
@@ -949,21 +957,21 @@
       unsigned int count = featureCount;
       for (unsigned i = 0; i < count; i++)
       {
-        const Feature &feature = featureZ[i];
-        uint16_t type = feature.featureType;
-	uint16_t setting = feature.featureSetting;
+	const Feature &feature = featureZ[i];
+	hb_aat_layout_feature_type_t type = (hb_aat_layout_feature_type_t) (unsigned int) feature.featureType;
+	hb_aat_layout_feature_selector_t setting = (hb_aat_layout_feature_selector_t) (unsigned int) feature.featureSetting;
       retry:
-	const hb_aat_map_builder_t::feature_info_t *info = map->features.bsearch (type);
+	const hb_aat_map_builder_t::feature_info_t *info = map->features.bsearch ((uint16_t) type);
 	if (info && info->setting == setting)
 	{
 	  flags &= feature.disableFlags;
 	  flags |= feature.enableFlags;
 	}
-	else if (type == 3/*kLetterCaseType*/ && setting == 3/*kSmallCapsSelector*/)
+	else if (type == HB_AAT_LAYOUT_FEATURE_TYPE_LETTER_CASE && setting == HB_AAT_LAYOUT_FEATURE_SELECTOR_SMALL_CAPS)
 	{
 	  /* Deprecated. https://github.com/harfbuzz/harfbuzz/issues/1342 */
-	  type = 37/*kLowerCaseType*/;
-	  setting = 1/*kLowerCaseSmallCapsSelector*/;
+	  type = HB_AAT_LAYOUT_FEATURE_TYPE_LOWER_CASE;
+	  setting = HB_AAT_LAYOUT_FEATURE_SELECTOR_LOWER_CASE_SMALL_CAPS;
 	  goto retry;
 	}
       }
@@ -1026,10 +1034,8 @@
       if (reverse)
         c->buffer->reverse ();
 
-      c->sanitizer.set_object (*subtable);
+      subtable->apply (c);
 
-      subtable->dispatch (c);
-
       if (reverse)
         c->buffer->reverse ();
 

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-trak-table.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-trak-table.hh	2018-11-29 23:34:53 UTC (rev 49276)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout-trak-table.hh	2018-11-30 01:09:56 UTC (rev 49277)
@@ -133,7 +133,6 @@
     if (!sizes) return 0.;
     if (sizes == 1) return trackTableEntry->get_value (base, 0, sizes);
 
-    /* TODO bfind() */
     hb_array_t<const Fixed> size_table ((base+sizeTable).arrayZ, sizes);
     unsigned int size_index;
     for (size_index = 0; size_index < sizes - 1; size_index++)

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-11-29 23:34:53 UTC (rev 49276)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout.cc	2018-11-30 01:09:56 UTC (rev 49277)
@@ -1,5 +1,6 @@
 /*
  * Copyright © 2017  Google, Inc.
+ * Copyright © 2018  Ebrahim Byagowi
  *
  *  This is part of HarfBuzz, a text shaping library.
  *
@@ -30,7 +31,7 @@
 #include "hb-aat-layout.hh"
 #include "hb-aat-layout-ankr-table.hh"
 #include "hb-aat-layout-bsln-table.hh" // Just so we compile it; unused otherwise.
-#include "hb-aat-layout-feat-table.hh" // Just so we compile it; unused otherwise.
+#include "hb-aat-layout-feat-table.hh"
 #include "hb-aat-layout-just-table.hh" // Just so we compile it; unused otherwise.
 #include "hb-aat-layout-kerx-table.hh"
 #include "hb-aat-layout-morx-table.hh"
@@ -38,86 +39,96 @@
 #include "hb-aat-ltag-table.hh"
 
 
+/**
+ * SECTION:hb-aat-layout
+ * @title: hb-aat-layout
+ * @short_description: Apple Advanced Typography Layout
+ * @include: hb-aat.h
+ *
+ * Functions for querying OpenType Layout features in the font face.
+ **/
+
+
 /* Table data courtesy of Apple.  Converted from mnemonics to integers
  * when moving to this file. */
 static const hb_aat_feature_mapping_t feature_mappings[] =
 {
-  {HB_TAG ('a','f','r','c'),	11/*kFractionsType*/,			1/*kVerticalFractionsSelector*/,		0/*kNoFractionsSelector*/},
-  {HB_TAG ('c','2','p','c'),	38/*kUpperCaseType*/,			2/*kUpperCasePetiteCapsSelector*/,		0/*kDefaultUpperCaseSelector*/},
-  {HB_TAG ('c','2','s','c'),	38/*kUpperCaseType*/,			1/*kUpperCaseSmallCapsSelector*/,		0/*kDefaultUpperCaseSelector*/},
-  {HB_TAG ('c','a','l','t'),	36/*kContextualAlternatesType*/,	0/*kContextualAlternatesOnSelector*/,		1/*kContextualAlternatesOffSelector*/},
-  {HB_TAG ('c','a','s','e'),	33/*kCaseSensitiveLayoutType*/,		0/*kCaseSensitiveLayoutOnSelector*/,		1/*kCaseSensitiveLayoutOffSelector*/},
-  {HB_TAG ('c','l','i','g'),	1/*kLigaturesType*/,			18/*kContextualLigaturesOnSelector*/,		19/*kContextualLigaturesOffSelector*/},
-  {HB_TAG ('c','p','s','p'),	33/*kCaseSensitiveLayoutType*/,		2/*kCaseSensitiveSpacingOnSelector*/,		3/*kCaseSensitiveSpacingOffSelector*/},
-  {HB_TAG ('c','s','w','h'),	36/*kContextualAlternatesType*/,	4/*kContextualSwashAlternatesOnSelector*/,	5/*kContextualSwashAlternatesOffSelector*/},
-  {HB_TAG ('d','l','i','g'),	1/*kLigaturesType*/,			4/*kRareLigaturesOnSelector*/,			5/*kRareLigaturesOffSelector*/},
-  {HB_TAG ('e','x','p','t'),	20/*kCharacterShapeType*/,		10/*kExpertCharactersSelector*/,		16},
-  {HB_TAG ('f','r','a','c'),	11/*kFractionsType*/,			2/*kDiagonalFractionsSelector*/,		0/*kNoFractionsSelector*/},
-  {HB_TAG ('f','w','i','d'),	22/*kTextSpacingType*/,			1/*kMonospacedTextSelector*/,			7},
-  {HB_TAG ('h','a','l','t'),	22/*kTextSpacingType*/,			6/*kAltHalfWidthTextSelector*/,			7},
-  {HB_TAG ('h','i','s','t'),	1/*kLigaturesType*/,			20/*kHistoricalLigaturesOnSelector*/,		21/*kHistoricalLigaturesOffSelector*/},
-  {HB_TAG ('h','k','n','a'),	34/*kAlternateKanaType*/,		0/*kAlternateHorizKanaOnSelector*/,		1/*kAlternateHorizKanaOffSelector*/,	},
-  {HB_TAG ('h','l','i','g'),	1/*kLigaturesType*/,			20/*kHistoricalLigaturesOnSelector*/,		21/*kHistoricalLigaturesOffSelector*/},
-  {HB_TAG ('h','n','g','l'),	23/*kTransliterationType*/,		1/*kHanjaToHangulSelector*/,			0/*kNoTransliterationSelector*/},
-  {HB_TAG ('h','o','j','o'),	20/*kCharacterShapeType*/,		12/*kHojoCharactersSelector*/,			16},
-  {HB_TAG ('h','w','i','d'),	22/*kTextSpacingType*/,			2/*kHalfWidthTextSelector*/,			7},
-  {HB_TAG ('i','t','a','l'),	32/*kItalicCJKRomanType*/,		2/*kCJKItalicRomanOnSelector*/,			3/*kCJKItalicRomanOffSelector*/},
-  {HB_TAG ('j','p','0','4'),	20/*kCharacterShapeType*/,		11/*kJIS2004CharactersSelector*/,		16},
-  {HB_TAG ('j','p','7','8'),	20/*kCharacterShapeType*/,		2/*kJIS1978CharactersSelector*/,		16},
-  {HB_TAG ('j','p','8','3'),	20/*kCharacterShapeType*/,		3/*kJIS1983CharactersSelector*/,		16},
-  {HB_TAG ('j','p','9','0'),	20/*kCharacterShapeType*/,		4/*kJIS1990CharactersSelector*/,		16},
-  {HB_TAG ('l','i','g','a'),	1/*kLigaturesType*/,			2/*kCommonLigaturesOnSelector*/,		3/*kCommonLigaturesOffSelector*/},
-  {HB_TAG ('l','n','u','m'),	21/*kNumberCaseType*/,			1/*kUpperCaseNumbersSelector*/,			2},
-  {HB_TAG ('m','g','r','k'),	15/*kMathematicalExtrasType*/,		10/*kMathematicalGreekOnSelector*/,		11/*kMathematicalGreekOffSelector*/},
-  {HB_TAG ('n','l','c','k'),	20/*kCharacterShapeType*/,		13/*kNLCCharactersSelector*/,			16},
-  {HB_TAG ('o','n','u','m'),	21/*kNumberCaseType*/,			0/*kLowerCaseNumbersSelector*/,			2},
-  {HB_TAG ('o','r','d','n'),	10/*kVerticalPositionType*/,		3/*kOrdinalsSelector*/,				0/*kNormalPositionSelector*/},
-  {HB_TAG ('p','a','l','t'),	22/*kTextSpacingType*/,			5/*kAltProportionalTextSelector*/,		7},
-  {HB_TAG ('p','c','a','p'),	37/*kLowerCaseType*/,			2/*kLowerCasePetiteCapsSelector*/,		0/*kDefaultLowerCaseSelector*/},
-  {HB_TAG ('p','k','n','a'),	22/*kTextSpacingType*/,			0/*kProportionalTextSelector*/,			7},
-  {HB_TAG ('p','n','u','m'),	6/*kNumberSpacingType*/,		1/*kProportionalNumbersSelector*/,		4},
-  {HB_TAG ('p','w','i','d'),	22/*kTextSpacingType*/,			0/*kProportionalTextSelector*/,			7},
-  {HB_TAG ('q','w','i','d'),	22/*kTextSpacingType*/,			4/*kQuarterWidthTextSelector*/,			7},
-  {HB_TAG ('r','u','b','y'),	28/*kRubyKanaType*/,			2/*kRubyKanaOnSelector*/,			3/*kRubyKanaOffSelector*/},
-  {HB_TAG ('s','i','n','f'),	10/*kVerticalPositionType*/,		4/*kScientificInferiorsSelector*/,		0/*kNormalPositionSelector*/},
-  {HB_TAG ('s','m','c','p'),	37/*kLowerCaseType*/,			1/*kLowerCaseSmallCapsSelector*/,		0/*kDefaultLowerCaseSelector*/},
-  {HB_TAG ('s','m','p','l'),	20/*kCharacterShapeType*/,		1/*kSimplifiedCharactersSelector*/,		16},
-  {HB_TAG ('s','s','0','1'),	35/*kStylisticAlternativesType*/,	2/*kStylisticAltOneOnSelector*/,		3/*kStylisticAltOneOffSelector*/},
-  {HB_TAG ('s','s','0','2'),	35/*kStylisticAlternativesType*/,	4/*kStylisticAltTwoOnSelector*/,		5/*kStylisticAltTwoOffSelector*/},
-  {HB_TAG ('s','s','0','3'),	35/*kStylisticAlternativesType*/,	6/*kStylisticAltThreeOnSelector*/,		7/*kStylisticAltThreeOffSelector*/},
-  {HB_TAG ('s','s','0','4'),	35/*kStylisticAlternativesType*/,	8/*kStylisticAltFourOnSelector*/,		9/*kStylisticAltFourOffSelector*/},
-  {HB_TAG ('s','s','0','5'),	35/*kStylisticAlternativesType*/,	10/*kStylisticAltFiveOnSelector*/,		11/*kStylisticAltFiveOffSelector*/},
-  {HB_TAG ('s','s','0','6'),	35/*kStylisticAlternativesType*/,	12/*kStylisticAltSixOnSelector*/,		13/*kStylisticAltSixOffSelector*/},
-  {HB_TAG ('s','s','0','7'),	35/*kStylisticAlternativesType*/,	14/*kStylisticAltSevenOnSelector*/,		15/*kStylisticAltSevenOffSelector*/},
-  {HB_TAG ('s','s','0','8'),	35/*kStylisticAlternativesType*/,	16/*kStylisticAltEightOnSelector*/,		17/*kStylisticAltEightOffSelector*/},
-  {HB_TAG ('s','s','0','9'),	35/*kStylisticAlternativesType*/,	18/*kStylisticAltNineOnSelector*/,		19/*kStylisticAltNineOffSelector*/},
-  {HB_TAG ('s','s','1','0'),	35/*kStylisticAlternativesType*/,	20/*kStylisticAltTenOnSelector*/,		21/*kStylisticAltTenOffSelector*/},
-  {HB_TAG ('s','s','1','1'),	35/*kStylisticAlternativesType*/,	22/*kStylisticAltElevenOnSelector*/,		23/*kStylisticAltElevenOffSelector*/},
-  {HB_TAG ('s','s','1','2'),	35/*kStylisticAlternativesType*/,	24/*kStylisticAltTwelveOnSelector*/,		25/*kStylisticAltTwelveOffSelector*/},
-  {HB_TAG ('s','s','1','3'),	35/*kStylisticAlternativesType*/,	26/*kStylisticAltThirteenOnSelector*/,		27/*kStylisticAltThirteenOffSelector*/},
-  {HB_TAG ('s','s','1','4'),	35/*kStylisticAlternativesType*/,	28/*kStylisticAltFourteenOnSelector*/,		29/*kStylisticAltFourteenOffSelector*/},
-  {HB_TAG ('s','s','1','5'),	35/*kStylisticAlternativesType*/,	30/*kStylisticAltFifteenOnSelector*/,		31/*kStylisticAltFifteenOffSelector*/},
-  {HB_TAG ('s','s','1','6'),	35/*kStylisticAlternativesType*/,	32/*kStylisticAltSixteenOnSelector*/,		33/*kStylisticAltSixteenOffSelector*/},
-  {HB_TAG ('s','s','1','7'),	35/*kStylisticAlternativesType*/,	34/*kStylisticAltSeventeenOnSelector*/,		35/*kStylisticAltSeventeenOffSelector*/},
-  {HB_TAG ('s','s','1','8'),	35/*kStylisticAlternativesType*/,	36/*kStylisticAltEighteenOnSelector*/,		37/*kStylisticAltEighteenOffSelector*/},
-  {HB_TAG ('s','s','1','9'),	35/*kStylisticAlternativesType*/,	38/*kStylisticAltNineteenOnSelector*/,		39/*kStylisticAltNineteenOffSelector*/},
-  {HB_TAG ('s','s','2','0'),	35/*kStylisticAlternativesType*/,	40/*kStylisticAltTwentyOnSelector*/,		41/*kStylisticAltTwentyOffSelector*/},
-  {HB_TAG ('s','u','b','s'),	10/*kVerticalPositionType*/,		2/*kInferiorsSelector*/,			0/*kNormalPositionSelector*/},
-  {HB_TAG ('s','u','p','s'),	10/*kVerticalPositionType*/,		1/*kSuperiorsSelector*/,			0/*kNormalPositionSelector*/},
-  {HB_TAG ('s','w','s','h'),	36/*kContextualAlternatesType*/,	2/*kSwashAlternatesOnSelector*/,		3/*kSwashAlternatesOffSelector*/},
-  {HB_TAG ('t','i','t','l'),	19/*kStyleOptionsType*/,		4/*kTitlingCapsSelector*/,			0/*kNoStyleOptionsSelector*/},
-  {HB_TAG ('t','n','a','m'),	20/*kCharacterShapeType*/,		14/*kTraditionalNamesCharactersSelector*/,	16},
-  {HB_TAG ('t','n','u','m'),	6/*kNumberSpacingType*/,		0/*kMonospacedNumbersSelector*/,		4},
-  {HB_TAG ('t','r','a','d'),	20/*kCharacterShapeType*/,		0/*kTraditionalCharactersSelector*/,		16},
-  {HB_TAG ('t','w','i','d'),	22/*kTextSpacingType*/,			3/*kThirdWidthTextSelector*/,			7},
-  {HB_TAG ('u','n','i','c'),	3/*kLetterCaseType*/,			14,						15},
-  {HB_TAG ('v','a','l','t'),	22/*kTextSpacingType*/,			5/*kAltProportionalTextSelector*/,		7},
-  {HB_TAG ('v','e','r','t'),	4/*kVerticalSubstitutionType*/,		0/*kSubstituteVerticalFormsOnSelector*/,	1/*kSubstituteVerticalFormsOffSelector*/},
-  {HB_TAG ('v','h','a','l'),	22/*kTextSpacingType*/,			6/*kAltHalfWidthTextSelector*/,			7},
-  {HB_TAG ('v','k','n','a'),	34/*kAlternateKanaType*/,		2/*kAlternateVertKanaOnSelector*/,		3/*kAlternateVertKanaOffSelector*/},
-  {HB_TAG ('v','p','a','l'),	22/*kTextSpacingType*/,			5/*kAltProportionalTextSelector*/,		7},
-  {HB_TAG ('v','r','t','2'),	4/*kVerticalSubstitutionType*/,		0/*kSubstituteVerticalFormsOnSelector*/,	1/*kSubstituteVerticalFormsOffSelector*/},
-  {HB_TAG ('z','e','r','o'),	14/*kTypographicExtrasType*/,		4/*kSlashedZeroOnSelector*/,			5/*kSlashedZeroOffSelector*/},
+  {HB_TAG ('a','f','r','c'), HB_AAT_LAYOUT_FEATURE_TYPE_FRACTIONS,               HB_AAT_LAYOUT_FEATURE_SELECTOR_VERTICAL_FRACTIONS,             HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_FRACTIONS},
+  {HB_TAG ('c','2','p','c'), HB_AAT_LAYOUT_FEATURE_TYPE_UPPER_CASE,              HB_AAT_LAYOUT_FEATURE_SELECTOR_UPPER_CASE_PETITE_CAPS,         HB_AAT_LAYOUT_FEATURE_SELECTOR_DEFAULT_UPPER_CASE},
+  {HB_TAG ('c','2','s','c'), HB_AAT_LAYOUT_FEATURE_TYPE_UPPER_CASE,              HB_AAT_LAYOUT_FEATURE_SELECTOR_UPPER_CASE_SMALL_CAPS,          HB_AAT_LAYOUT_FEATURE_SELECTOR_DEFAULT_UPPER_CASE},
+  {HB_TAG ('c','a','l','t'), HB_AAT_LAYOUT_FEATURE_TYPE_CONTEXTUAL_ALTERNATIVES, HB_AAT_LAYOUT_FEATURE_SELECTOR_CONTEXTUAL_ALTERNATES_ON,       HB_AAT_LAYOUT_FEATURE_SELECTOR_CONTEXTUAL_ALTERNATES_OFF},
+  {HB_TAG ('c','a','s','e'), HB_AAT_LAYOUT_FEATURE_TYPE_CASE_SENSITIVE_LAYOUT,   HB_AAT_LAYOUT_FEATURE_SELECTOR_CASE_SENSITIVE_LAYOUT_ON,       HB_AAT_LAYOUT_FEATURE_SELECTOR_CASE_SENSITIVE_LAYOUT_OFF},
+  {HB_TAG ('c','l','i','g'), HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES,               HB_AAT_LAYOUT_FEATURE_SELECTOR_CONTEXTUAL_LIGATURES_ON,        HB_AAT_LAYOUT_FEATURE_SELECTOR_CONTEXTUAL_LIGATURES_OFF},
+  {HB_TAG ('c','p','s','p'), HB_AAT_LAYOUT_FEATURE_TYPE_CASE_SENSITIVE_LAYOUT,   HB_AAT_LAYOUT_FEATURE_SELECTOR_CASE_SENSITIVE_SPACING_ON,      HB_AAT_LAYOUT_FEATURE_SELECTOR_CASE_SENSITIVE_SPACING_OFF},
+  {HB_TAG ('c','s','w','h'), HB_AAT_LAYOUT_FEATURE_TYPE_CONTEXTUAL_ALTERNATIVES, HB_AAT_LAYOUT_FEATURE_SELECTOR_CONTEXTUAL_SWASH_ALTERNATES_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_CONTEXTUAL_SWASH_ALTERNATES_OFF},
+  {HB_TAG ('d','l','i','g'), HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES,               HB_AAT_LAYOUT_FEATURE_SELECTOR_RARE_LIGATURES_ON,              HB_AAT_LAYOUT_FEATURE_SELECTOR_RARE_LIGATURES_OFF},
+  {HB_TAG ('e','x','p','t'), HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE,         HB_AAT_LAYOUT_FEATURE_SELECTOR_EXPERT_CHARACTERS,              (hb_aat_layout_feature_selector_t) 16},
+  {HB_TAG ('f','r','a','c'), HB_AAT_LAYOUT_FEATURE_TYPE_FRACTIONS,               HB_AAT_LAYOUT_FEATURE_SELECTOR_DIAGONAL_FRACTIONS,             HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_FRACTIONS},
+  {HB_TAG ('f','w','i','d'), HB_AAT_LAYOUT_FEATURE_TYPE_TEXT_SPACING,            HB_AAT_LAYOUT_FEATURE_SELECTOR_MONOSPACED_TEXT,                (hb_aat_layout_feature_selector_t) 7},
+  {HB_TAG ('h','a','l','t'), HB_AAT_LAYOUT_FEATURE_TYPE_TEXT_SPACING,            HB_AAT_LAYOUT_FEATURE_SELECTOR_ALT_HALF_WIDTH_TEXT,            (hb_aat_layout_feature_selector_t) 7},
+  {HB_TAG ('h','i','s','t'), HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES,               HB_AAT_LAYOUT_FEATURE_SELECTOR_HISTORICAL_LIGATURES_ON,        HB_AAT_LAYOUT_FEATURE_SELECTOR_HISTORICAL_LIGATURES_OFF},
+  {HB_TAG ('h','k','n','a'), HB_AAT_LAYOUT_FEATURE_TYPE_ALTERNATE_KANA,          HB_AAT_LAYOUT_FEATURE_SELECTOR_ALTERNATE_HORIZ_KANA_ON,        HB_AAT_LAYOUT_FEATURE_SELECTOR_ALTERNATE_HORIZ_KANA_OFF},
+  {HB_TAG ('h','l','i','g'), HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES,               HB_AAT_LAYOUT_FEATURE_SELECTOR_HISTORICAL_LIGATURES_ON,        HB_AAT_LAYOUT_FEATURE_SELECTOR_HISTORICAL_LIGATURES_OFF},
+  {HB_TAG ('h','n','g','l'), HB_AAT_LAYOUT_FEATURE_TYPE_TRANSLITERATION,         HB_AAT_LAYOUT_FEATURE_SELECTOR_HANJA_TO_HANGUL,                HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_TRANSLITERATION},
+  {HB_TAG ('h','o','j','o'), HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE,         HB_AAT_LAYOUT_FEATURE_SELECTOR_HOJO_CHARACTERS,                (hb_aat_layout_feature_selector_t) 16},
+  {HB_TAG ('h','w','i','d'), HB_AAT_LAYOUT_FEATURE_TYPE_TEXT_SPACING,            HB_AAT_LAYOUT_FEATURE_SELECTOR_HALF_WIDTH_TEXT,                (hb_aat_layout_feature_selector_t) 7},
+  {HB_TAG ('i','t','a','l'), HB_AAT_LAYOUT_FEATURE_TYPE_ITALIC_CJK_ROMAN,        HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_ITALIC_ROMAN_ON,            HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_ITALIC_ROMAN_OFF},
+  {HB_TAG ('j','p','0','4'), HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE,         HB_AAT_LAYOUT_FEATURE_SELECTOR_JIS2004_CHARACTERS,             (hb_aat_layout_feature_selector_t) 16},
+  {HB_TAG ('j','p','7','8'), HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE,         HB_AAT_LAYOUT_FEATURE_SELECTOR_JIS1978_CHARACTERS,             (hb_aat_layout_feature_selector_t) 16},
+  {HB_TAG ('j','p','8','3'), HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE,         HB_AAT_LAYOUT_FEATURE_SELECTOR_JIS1983_CHARACTERS,             (hb_aat_layout_feature_selector_t) 16},
+  {HB_TAG ('j','p','9','0'), HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE,         HB_AAT_LAYOUT_FEATURE_SELECTOR_JIS1990_CHARACTERS,             (hb_aat_layout_feature_selector_t) 16},
+  {HB_TAG ('l','i','g','a'), HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES,               HB_AAT_LAYOUT_FEATURE_SELECTOR_COMMON_LIGATURES_ON,            HB_AAT_LAYOUT_FEATURE_SELECTOR_COMMON_LIGATURES_OFF},
+  {HB_TAG ('l','n','u','m'), HB_AAT_LAYOUT_FEATURE_TYPE_NUMBER_CASE,             HB_AAT_LAYOUT_FEATURE_SELECTOR_UPPER_CASE_NUMBERS,             (hb_aat_layout_feature_selector_t) 2},
+  {HB_TAG ('m','g','r','k'), HB_AAT_LAYOUT_FEATURE_TYPE_MATHEMATICAL_EXTRAS,     HB_AAT_LAYOUT_FEATURE_SELECTOR_MATHEMATICAL_GREEK_ON,          HB_AAT_LAYOUT_FEATURE_SELECTOR_MATHEMATICAL_GREEK_OFF},
+  {HB_TAG ('n','l','c','k'), HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE,         HB_AAT_LAYOUT_FEATURE_SELECTOR_NLCCHARACTERS,                  (hb_aat_layout_feature_selector_t) 16},
+  {HB_TAG ('o','n','u','m'), HB_AAT_LAYOUT_FEATURE_TYPE_NUMBER_CASE,             HB_AAT_LAYOUT_FEATURE_SELECTOR_LOWER_CASE_NUMBERS,             (hb_aat_layout_feature_selector_t) 2},
+  {HB_TAG ('o','r','d','n'), HB_AAT_LAYOUT_FEATURE_TYPE_VERTICAL_POSITION,       HB_AAT_LAYOUT_FEATURE_SELECTOR_ORDINALS,                       HB_AAT_LAYOUT_FEATURE_SELECTOR_NORMAL_POSITION},
+  {HB_TAG ('p','a','l','t'), HB_AAT_LAYOUT_FEATURE_TYPE_TEXT_SPACING,            HB_AAT_LAYOUT_FEATURE_SELECTOR_ALT_PROPORTIONAL_TEXT,          (hb_aat_layout_feature_selector_t) 7},
+  {HB_TAG ('p','c','a','p'), HB_AAT_LAYOUT_FEATURE_TYPE_LOWER_CASE,              HB_AAT_LAYOUT_FEATURE_SELECTOR_LOWER_CASE_PETITE_CAPS,         HB_AAT_LAYOUT_FEATURE_SELECTOR_DEFAULT_LOWER_CASE},
+  {HB_TAG ('p','k','n','a'), HB_AAT_LAYOUT_FEATURE_TYPE_TEXT_SPACING,            HB_AAT_LAYOUT_FEATURE_SELECTOR_PROPORTIONAL_TEXT,              (hb_aat_layout_feature_selector_t) 7},
+  {HB_TAG ('p','n','u','m'), HB_AAT_LAYOUT_FEATURE_TYPE_NUMBER_SPACING,          HB_AAT_LAYOUT_FEATURE_SELECTOR_PROPORTIONAL_NUMBERS,           (hb_aat_layout_feature_selector_t) 4},
+  {HB_TAG ('p','w','i','d'), HB_AAT_LAYOUT_FEATURE_TYPE_TEXT_SPACING,            HB_AAT_LAYOUT_FEATURE_SELECTOR_PROPORTIONAL_TEXT,              (hb_aat_layout_feature_selector_t) 7},
+  {HB_TAG ('q','w','i','d'), HB_AAT_LAYOUT_FEATURE_TYPE_TEXT_SPACING,            HB_AAT_LAYOUT_FEATURE_SELECTOR_QUARTER_WIDTH_TEXT,             (hb_aat_layout_feature_selector_t) 7},
+  {HB_TAG ('r','u','b','y'), HB_AAT_LAYOUT_FEATURE_TYPE_RUBY_KANA,               HB_AAT_LAYOUT_FEATURE_SELECTOR_RUBY_KANA_ON,                   HB_AAT_LAYOUT_FEATURE_SELECTOR_RUBY_KANA_OFF},
+  {HB_TAG ('s','i','n','f'), HB_AAT_LAYOUT_FEATURE_TYPE_VERTICAL_POSITION,       HB_AAT_LAYOUT_FEATURE_SELECTOR_SCIENTIFIC_INFERIORS,           HB_AAT_LAYOUT_FEATURE_SELECTOR_NORMAL_POSITION},
+  {HB_TAG ('s','m','c','p'), HB_AAT_LAYOUT_FEATURE_TYPE_LOWER_CASE,              HB_AAT_LAYOUT_FEATURE_SELECTOR_LOWER_CASE_SMALL_CAPS,          HB_AAT_LAYOUT_FEATURE_SELECTOR_DEFAULT_LOWER_CASE},
+  {HB_TAG ('s','m','p','l'), HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE,         HB_AAT_LAYOUT_FEATURE_SELECTOR_SIMPLIFIED_CHARACTERS,          (hb_aat_layout_feature_selector_t) 16},
+  {HB_TAG ('s','s','0','1'), HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES,  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_ONE_ON,           HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_ONE_OFF},
+  {HB_TAG ('s','s','0','2'), HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES,  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TWO_ON,           HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TWO_OFF},
+  {HB_TAG ('s','s','0','3'), HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES,  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_THREE_ON,         HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_THREE_OFF},
+  {HB_TAG ('s','s','0','4'), HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES,  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FOUR_ON,          HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FOUR_OFF},
+  {HB_TAG ('s','s','0','5'), HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES,  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FIVE_ON,          HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FIVE_OFF},
+  {HB_TAG ('s','s','0','6'), HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES,  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SIX_ON,           HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SIX_OFF},
+  {HB_TAG ('s','s','0','7'), HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES,  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SEVEN_ON,         HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SEVEN_OFF},
+  {HB_TAG ('s','s','0','8'), HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES,  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_EIGHT_ON,         HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_EIGHT_OFF},
+  {HB_TAG ('s','s','0','9'), HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES,  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_NINE_ON,          HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_NINE_OFF},
+  {HB_TAG ('s','s','1','0'), HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES,  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TEN_ON,           HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TEN_OFF},
+  {HB_TAG ('s','s','1','1'), HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES,  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_ELEVEN_ON,        HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_ELEVEN_OFF},
+  {HB_TAG ('s','s','1','2'), HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES,  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TWELVE_ON,        HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TWELVE_OFF},
+  {HB_TAG ('s','s','1','3'), HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES,  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_THIRTEEN_ON,      HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_THIRTEEN_OFF},
+  {HB_TAG ('s','s','1','4'), HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES,  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FOURTEEN_ON,      HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FOURTEEN_OFF},
+  {HB_TAG ('s','s','1','5'), HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES,  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FIFTEEN_ON,       HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FIFTEEN_OFF},
+  {HB_TAG ('s','s','1','6'), HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES,  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SIXTEEN_ON,       HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SIXTEEN_OFF},
+  {HB_TAG ('s','s','1','7'), HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES,  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SEVENTEEN_ON,     HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SEVENTEEN_OFF},
+  {HB_TAG ('s','s','1','8'), HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES,  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_EIGHTEEN_ON,      HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_EIGHTEEN_OFF},
+  {HB_TAG ('s','s','1','9'), HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES,  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_NINETEEN_ON,      HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_NINETEEN_OFF},
+  {HB_TAG ('s','s','2','0'), HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES,  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TWENTY_ON,        HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TWENTY_OFF},
+  {HB_TAG ('s','u','b','s'), HB_AAT_LAYOUT_FEATURE_TYPE_VERTICAL_POSITION,       HB_AAT_LAYOUT_FEATURE_SELECTOR_INFERIORS,                      HB_AAT_LAYOUT_FEATURE_SELECTOR_NORMAL_POSITION},
+  {HB_TAG ('s','u','p','s'), HB_AAT_LAYOUT_FEATURE_TYPE_VERTICAL_POSITION,       HB_AAT_LAYOUT_FEATURE_SELECTOR_SUPERIORS,                      HB_AAT_LAYOUT_FEATURE_SELECTOR_NORMAL_POSITION},
+  {HB_TAG ('s','w','s','h'), HB_AAT_LAYOUT_FEATURE_TYPE_CONTEXTUAL_ALTERNATIVES, HB_AAT_LAYOUT_FEATURE_SELECTOR_SWASH_ALTERNATES_ON,            HB_AAT_LAYOUT_FEATURE_SELECTOR_SWASH_ALTERNATES_OFF},
+  {HB_TAG ('t','i','t','l'), HB_AAT_LAYOUT_FEATURE_TYPE_STYLE_OPTIONS,           HB_AAT_LAYOUT_FEATURE_SELECTOR_TITLING_CAPS,                   HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_STYLE_OPTIONS},
+  {HB_TAG ('t','n','a','m'), HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE,         HB_AAT_LAYOUT_FEATURE_SELECTOR_TRADITIONAL_NAMES_CHARACTERS,   (hb_aat_layout_feature_selector_t) 16},
+  {HB_TAG ('t','n','u','m'), HB_AAT_LAYOUT_FEATURE_TYPE_NUMBER_SPACING,          HB_AAT_LAYOUT_FEATURE_SELECTOR_MONOSPACED_NUMBERS,             (hb_aat_layout_feature_selector_t) 4},
+  {HB_TAG ('t','r','a','d'), HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE,         HB_AAT_LAYOUT_FEATURE_SELECTOR_TRADITIONAL_CHARACTERS,         (hb_aat_layout_feature_selector_t) 16},
+  {HB_TAG ('t','w','i','d'), HB_AAT_LAYOUT_FEATURE_TYPE_TEXT_SPACING,            HB_AAT_LAYOUT_FEATURE_SELECTOR_THIRD_WIDTH_TEXT,               (hb_aat_layout_feature_selector_t) 7},
+  {HB_TAG ('u','n','i','c'), HB_AAT_LAYOUT_FEATURE_TYPE_LETTER_CASE,             (hb_aat_layout_feature_selector_t) 14,                 (hb_aat_layout_feature_selector_t) 15},
+  {HB_TAG ('v','a','l','t'), HB_AAT_LAYOUT_FEATURE_TYPE_TEXT_SPACING,            HB_AAT_LAYOUT_FEATURE_SELECTOR_ALT_PROPORTIONAL_TEXT,          (hb_aat_layout_feature_selector_t) 7},
+  {HB_TAG ('v','e','r','t'), HB_AAT_LAYOUT_FEATURE_TYPE_VERTICAL_SUBSTITUTION,   HB_AAT_LAYOUT_FEATURE_SELECTOR_SUBSTITUTE_VERTICAL_FORMS_ON,   HB_AAT_LAYOUT_FEATURE_SELECTOR_SUBSTITUTE_VERTICAL_FORMS_OFF},
+  {HB_TAG ('v','h','a','l'), HB_AAT_LAYOUT_FEATURE_TYPE_TEXT_SPACING,            HB_AAT_LAYOUT_FEATURE_SELECTOR_ALT_HALF_WIDTH_TEXT,            (hb_aat_layout_feature_selector_t) 7},
+  {HB_TAG ('v','k','n','a'), HB_AAT_LAYOUT_FEATURE_TYPE_ALTERNATE_KANA,          HB_AAT_LAYOUT_FEATURE_SELECTOR_ALTERNATE_VERT_KANA_ON,         HB_AAT_LAYOUT_FEATURE_SELECTOR_ALTERNATE_VERT_KANA_OFF},
+  {HB_TAG ('v','p','a','l'), HB_AAT_LAYOUT_FEATURE_TYPE_TEXT_SPACING,            HB_AAT_LAYOUT_FEATURE_SELECTOR_ALT_PROPORTIONAL_TEXT,          (hb_aat_layout_feature_selector_t) 7},
+  {HB_TAG ('v','r','t','2'), HB_AAT_LAYOUT_FEATURE_TYPE_VERTICAL_SUBSTITUTION,   HB_AAT_LAYOUT_FEATURE_SELECTOR_SUBSTITUTE_VERTICAL_FORMS_ON,   HB_AAT_LAYOUT_FEATURE_SELECTOR_SUBSTITUTE_VERTICAL_FORMS_OFF},
+  {HB_TAG ('z','e','r','o'), HB_AAT_LAYOUT_FEATURE_TYPE_TYPOGRAPHIC_EXTRAS,      HB_AAT_LAYOUT_FEATURE_SELECTOR_SLASHED_ZERO_ON,                HB_AAT_LAYOUT_FEATURE_SELECTOR_SLASHED_ZERO_OFF},
 };
 
 const hb_aat_feature_mapping_t *
@@ -297,3 +308,65 @@
 {
   return face->table.ltag->get_language (i);
 }
+
+/**
+ * hb_aat_layout_get_feature_types:
+ * @face: a face object
+ * @start_offset: iteration's start offset
+ * @feature_count:(inout) (allow-none): buffer size as input, filled size as output
+ * @features: (out caller-allocates) (array length=feature_count): features buffer
+ *
+ * Return value: Number of all available feature types.
+ *
+ * Since: 2.2.0
+ */
+unsigned int
+hb_aat_layout_get_feature_types (hb_face_t                    *face,
+				 unsigned int                  start_offset,
+				 unsigned int                 *feature_count, /* IN/OUT.  May be NULL. */
+				 hb_aat_layout_feature_type_t *features       /* OUT.     May be NULL. */)
+{
+  return face->table.feat->get_feature_types (start_offset, feature_count, features);
+}
+
+/**
+ * hb_aat_layout_feature_type_get_name_id:
+ * @face: a face object
+ * @feature_type: feature id
+ *
+ * Return value: Name ID index
+ *
+ * Since: 2.2.0
+ */
+hb_ot_name_id_t
+hb_aat_layout_feature_type_get_name_id (hb_face_t                    *face,
+					hb_aat_layout_feature_type_t  feature_type)
+{ return face->table.feat->get_feature_name_id (feature_type); }
+
+/**
+ * hb_aat_layout_feature_type_get_selectors:
+ * @face:    a face object
+ * @feature_type: feature id
+ * @start_offset:    iteration's start offset
+ * @selector_count: (inout) (allow-none): buffer size as input, filled size as output
+ * @selectors: (out caller-allocates) (array length=selector_count): settings buffer
+ * @default_index: (out) (allow-none): index of default selector if any
+ *
+ * If upon return, @default_index is set to #HB_AAT_LAYOUT_NO_SELECTOR_INDEX, then
+ * the feature type is non-exclusive.  Otherwise, @default_index is the index of
+ * the selector that is selected by default.
+ *
+ * Return value: Number of all available feature selectors.
+ *
+ * Since: 2.2.0
+ */
+unsigned int
+hb_aat_layout_feature_type_get_selector_infos (hb_face_t                             *face,
+					       hb_aat_layout_feature_type_t           feature_type,
+					       unsigned int                           start_offset,
+					       unsigned int                          *selector_count, /* IN/OUT.  May be NULL. */
+					       hb_aat_layout_feature_selector_info_t *selectors,      /* OUT.     May be NULL. */
+					       unsigned int                          *default_index   /* OUT.     May be NULL. */)
+{
+  return face->table.feat->get_selector_infos (feature_type, start_offset, selector_count, selectors, default_index);
+}

Added: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout.h
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout.h	                        (rev 0)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout.h	2018-11-30 01:09:56 UTC (rev 49277)
@@ -0,0 +1,462 @@
+/*
+ * 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_H_IN
+#error "Include <hb-aat.h> instead."
+#endif
+
+#ifndef HB_AAT_LAYOUT_H
+#define HB_AAT_LAYOUT_H
+
+#include "hb.h"
+
+#include "hb-ot.h"
+
+HB_BEGIN_DECLS
+
+/**
+ * hb_aat_layout_feature_type_t:
+ *
+ *
+ * Since: 2.2.0
+ */
+typedef enum
+{
+  HB_AAT_LAYOUT_FEATURE_TYPE_INVALID				= 0xFFFF,
+
+  HB_AAT_LAYOUT_FEATURE_TYPE_ALL_TYPOGRAPHIC			= 0,
+  HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES				= 1,
+  HB_AAT_LAYOUT_FEATURE_TYPE_CURISVE_CONNECTION			= 2,
+  HB_AAT_LAYOUT_FEATURE_TYPE_LETTER_CASE			= 3,
+  HB_AAT_LAYOUT_FEATURE_TYPE_VERTICAL_SUBSTITUTION		= 4,
+  HB_AAT_LAYOUT_FEATURE_TYPE_LINGUISTIC_REARRANGEMENT		= 5,
+  HB_AAT_LAYOUT_FEATURE_TYPE_NUMBER_SPACING			= 6,
+  HB_AAT_LAYOUT_FEATURE_TYPE_SMART_SWASH_TYPE			= 8,
+  HB_AAT_LAYOUT_FEATURE_TYPE_DIACRITICS_TYPE			= 9,
+  HB_AAT_LAYOUT_FEATURE_TYPE_VERTICAL_POSITION			= 10,
+  HB_AAT_LAYOUT_FEATURE_TYPE_FRACTIONS				= 11,
+  HB_AAT_LAYOUT_FEATURE_TYPE_OVERLAPPING_CHARACTERS_TYPE	= 13,
+  HB_AAT_LAYOUT_FEATURE_TYPE_TYPOGRAPHIC_EXTRAS			= 14,
+  HB_AAT_LAYOUT_FEATURE_TYPE_MATHEMATICAL_EXTRAS		= 15,
+  HB_AAT_LAYOUT_FEATURE_TYPE_ORNAMENT_SETS_TYPE			= 16,
+  HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_ALTERNATIVES		= 17,
+  HB_AAT_LAYOUT_FEATURE_TYPE_DESIGN_COMPLEXITY_TYPE		= 18,
+  HB_AAT_LAYOUT_FEATURE_TYPE_STYLE_OPTIONS			= 19,
+  HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE			= 20,
+  HB_AAT_LAYOUT_FEATURE_TYPE_NUMBER_CASE			= 21,
+  HB_AAT_LAYOUT_FEATURE_TYPE_TEXT_SPACING			= 22,
+  HB_AAT_LAYOUT_FEATURE_TYPE_TRANSLITERATION			= 23,
+  HB_AAT_LAYOUT_FEATURE_TYPE_ANNOTATION_TYPE			= 24,
+  HB_AAT_LAYOUT_FEATURE_TYPE_KANA_SPACING_TYPE			= 25,
+  HB_AAT_LAYOUT_FEATURE_TYPE_IDEOGRAPHIC_SPACING_TYPE		= 26,
+  HB_AAT_LAYOUT_FEATURE_TYPE_UNICODE_DECOMPOSITION_TYPE		= 27,
+  HB_AAT_LAYOUT_FEATURE_TYPE_RUBY_KANA				= 28,
+  HB_AAT_LAYOUT_FEATURE_TYPE_CJK_SYMBOL_ALTERNATIVES_TYPE	= 29,
+  HB_AAT_LAYOUT_FEATURE_TYPE_IDEOGRAPHIC_ALTERNATIVES_TYPE	= 30,
+  HB_AAT_LAYOUT_FEATURE_TYPE_CJK_VERTICAL_ROMAN_PLACEMENT_TYPE	= 31,
+  HB_AAT_LAYOUT_FEATURE_TYPE_ITALIC_CJK_ROMAN			= 32,
+  HB_AAT_LAYOUT_FEATURE_TYPE_CASE_SENSITIVE_LAYOUT		= 33,
+  HB_AAT_LAYOUT_FEATURE_TYPE_ALTERNATE_KANA			= 34,
+  HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES		= 35,
+  HB_AAT_LAYOUT_FEATURE_TYPE_CONTEXTUAL_ALTERNATIVES		= 36,
+  HB_AAT_LAYOUT_FEATURE_TYPE_LOWER_CASE				= 37,
+  HB_AAT_LAYOUT_FEATURE_TYPE_UPPER_CASE				= 38,
+  HB_AAT_LAYOUT_FEATURE_TYPE_LANGUAGE_TAG_TYPE			= 39,
+  HB_AAT_LAYOUT_FEATURE_TYPE_CJK_ROMAN_SPACING_TYPE		= 103,
+
+  _HB_AAT_LAYOUT_FEATURE_TYPE_MAX_VALUE= 0x7FFFFFFFu, /*< skip >*/
+} hb_aat_layout_feature_type_t;
+
+/**
+ * hb_aat_layout_feature_selector_t:
+ *
+ *
+ * Since: 2.2.0
+ */
+typedef enum
+{
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_INVALID			= 0xFFFF,
+
+  /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_ALL_TYPOGRAPHIC */
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_ALL_TYPE_FEATURES_ON		= 0,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_ALL_TYPE_FEATURES_OFF		= 1,
+
+  /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES */
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_REQUIRED_LIGATURES_ON		= 0,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_REQUIRED_LIGATURES_OFF		= 1,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_COMMON_LIGATURES_ON		= 2,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_COMMON_LIGATURES_OFF		= 3,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_RARE_LIGATURES_ON		= 4,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_RARE_LIGATURES_OFF		= 5,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_LOGOS_ON			= 6,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_LOGOS_OFF			= 7,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_REBUS_PICTURES_ON		= 8,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_REBUS_PICTURES_OFF		= 9,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_DIPHTHONG_LIGATURES_ON		= 10,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_DIPHTHONG_LIGATURES_OFF	= 11,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_SQUARED_LIGATURES_ON		= 12,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_SQUARED_LIGATURES_OFF		= 13,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_ABBREV_SQUARED_LIGATURES_ON	= 14,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_ABBREV_SQUARED_LIGATURES_OFF	= 15,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_SYMBOL_LIGATURES_ON		= 16,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_SYMBOL_LIGATURES_OFF		= 17,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_CONTEXTUAL_LIGATURES_ON	= 18,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_CONTEXTUAL_LIGATURES_OFF	= 19,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_HISTORICAL_LIGATURES_ON	= 20,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_HISTORICAL_LIGATURES_OFF	= 21,
+
+  /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES */
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_UNCONNECTED			= 0,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_PARTIALLY_CONNECTED		= 1,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_CURSIVE			= 2,
+
+  /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_LETTER_CASE */
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_UPPER_AND_LOWER_CASE		= 0, /* deprecated */
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_ALL_CAPS			= 1, /* deprecated */
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_ALL_LOWER_CASE			= 2, /* deprecated */
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_SMALL_CAPS			= 3, /* deprecated */
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_INITIAL_CAPS			= 4, /* deprecated */
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_INITIAL_CAPS_AND_SMALL_CAPS	= 5, /* deprecated */
+
+  /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_VERTICAL_SUBSTITUTION */
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_SUBSTITUTE_VERTICAL_FORMS_ON	= 0,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_SUBSTITUTE_VERTICAL_FORMS_OFF	= 1,
+
+  /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_LINGUISTIC_REARRANGEMENT */
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_LINGUISTIC_REARRANGEMENT_ON	= 0,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_LINGUISTIC_REARRANGEMENT_OFF	= 1,
+
+  /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_NUMBER_SPACING */
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_MONOSPACED_NUMBERS		= 0,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_PROPORTIONAL_NUMBERS		= 1,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_THIRD_WIDTH_NUMBERS		= 2,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_QUARTER_WIDTH_NUMBERS		= 3,
+
+  /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_SMART_SWASH_TYPE */
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_WORD_INITIAL_SWASHES_ON	= 0,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_WORD_INITIAL_SWASHES_OFF	= 1,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_WORD_FINAL_SWASHES_ON		= 2,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_WORD_FINAL_SWASHES_OFF		= 3,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_LINE_INITIAL_SWASHES_ON	= 4,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_LINE_INITIAL_SWASHES_OFF	= 5,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_LINE_FINAL_SWASHES_ON		= 6,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_LINE_FINAL_SWASHES_OFF		= 7,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_NON_FINAL_SWASHES_ON		= 8,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_NON_FINAL_SWASHES_OFF		= 9,
+
+  /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_DIACRITICS_TYPE */
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_SHOW_DIACRITICS		= 0,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_HIDE_DIACRITICS		= 1,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_DECOMPOSE_DIACRITICS		= 2,
+
+  /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_VERTICAL_POSITION */
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_NORMAL_POSITION		= 0,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_SUPERIORS			= 1,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_INFERIORS			= 2,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_ORDINALS			= 3,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_SCIENTIFIC_INFERIORS		= 4,
+
+  /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_FRACTIONS */
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_FRACTIONS			= 0,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_VERTICAL_FRACTIONS		= 1,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_DIAGONAL_FRACTIONS		= 2,
+
+  /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_OVERLAPPING_CHARACTERS_TYPE */
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_PREVENT_OVERLAP_ON		= 0,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_PREVENT_OVERLAP_OFF		= 1,
+
+  /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_TYPOGRAPHIC_EXTRAS */
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_HYPHENS_TO_EM_DASH_ON		= 0,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_HYPHENS_TO_EM_DASH_OFF		= 1,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_HYPHEN_TO_EN_DASH_ON		= 2,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_HYPHEN_TO_EN_DASH_OFF		= 3,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_SLASHED_ZERO_ON		= 4,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_SLASHED_ZERO_OFF		= 5,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_FORM_INTERROBANG_ON		= 6,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_FORM_INTERROBANG_OFF		= 7,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_SMART_QUOTES_ON		= 8,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_SMART_QUOTES_OFF		= 9,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_PERIODS_TO_ELLIPSIS_ON		= 10,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_PERIODS_TO_ELLIPSIS_OFF	= 11,
+
+  /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_MATHEMATICAL_EXTRAS */
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_HYPHEN_TO_MINUS_ON		= 0,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_HYPHEN_TO_MINUS_OFF		= 1,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_ASTERISK_TO_MULTIPLY_ON	= 2,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_ASTERISK_TO_MULTIPLY_OFF	= 3,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_SLASH_TO_DIVIDE_ON		= 4,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_SLASH_TO_DIVIDE_OFF		= 5,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_INEQUALITY_LIGATURES_ON	= 6,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_INEQUALITY_LIGATURES_OFF	= 7,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_EXPONENTS_ON			= 8,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_EXPONENTS_OFF			= 9,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_MATHEMATICAL_GREEK_ON		= 10,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_MATHEMATICAL_GREEK_OFF		= 11,
+
+  /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_ORNAMENT_SETS_TYPE */
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_ORNAMENTS			= 0,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_DINGBATS			= 1,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_PI_CHARACTERS			= 2,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_FLEURONS			= 3,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_DECORATIVE_BORDERS		= 4,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_INTERNATIONAL_SYMBOLS		= 5,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_MATH_SYMBOLS			= 6,
+
+  /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_ALTERNATIVES */
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_ALTERNATES			= 0,
+
+  /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_DESIGN_COMPLEXITY_TYPE */
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_DESIGN_LEVEL1			= 0,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_DESIGN_LEVEL2			= 1,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_DESIGN_LEVEL3			= 2,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_DESIGN_LEVEL4			= 3,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_DESIGN_LEVEL5			= 4,
+
+  /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_STYLE_OPTIONS */
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_STYLE_OPTIONS		= 0,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_DISPLAY_TEXT			= 1,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_ENGRAVED_TEXT			= 2,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_ILLUMINATED_CAPS		= 3,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_TITLING_CAPS			= 4,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_TALL_CAPS			= 5,
+
+  /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE */
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_TRADITIONAL_CHARACTERS		= 0,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_SIMPLIFIED_CHARACTERS		= 1,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_JIS1978_CHARACTERS		= 2,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_JIS1983_CHARACTERS		= 3,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_JIS1990_CHARACTERS		= 4,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_TRADITIONAL_ALT_ONE		= 5,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_TRADITIONAL_ALT_TWO		= 6,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_TRADITIONAL_ALT_THREE		= 7,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_TRADITIONAL_ALT_FOUR		= 8,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_TRADITIONAL_ALT_FIVE		= 9,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_EXPERT_CHARACTERS		= 10,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_JIS2004_CHARACTERS		= 11,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_HOJO_CHARACTERS		= 12,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_NLCCHARACTERS			= 13,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_TRADITIONAL_NAMES_CHARACTERS	= 14,
+
+  /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_NUMBER_CASE */
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_LOWER_CASE_NUMBERS		= 0,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_UPPER_CASE_NUMBERS		= 1,
+
+  /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_TEXT_SPACING */
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_PROPORTIONAL_TEXT		= 0,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_MONOSPACED_TEXT		= 1,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_HALF_WIDTH_TEXT		= 2,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_THIRD_WIDTH_TEXT		= 3,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_QUARTER_WIDTH_TEXT		= 4,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_ALT_PROPORTIONAL_TEXT		= 5,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_ALT_HALF_WIDTH_TEXT		= 6,
+
+  /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_TRANSLITERATION */
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_TRANSLITERATION		= 0,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_HANJA_TO_HANGUL		= 1,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_HIRAGANA_TO_KATAKANA		= 2,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_KATAKANA_TO_HIRAGANA		= 3,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_KANA_TO_ROMANIZATION		= 4,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_ROMANIZATION_TO_HIRAGANA	= 5,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_ROMANIZATION_TO_KATAKANA	= 6,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_HANJA_TO_HANGUL_ALT_ONE	= 7,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_HANJA_TO_HANGUL_ALT_TWO	= 8,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_HANJA_TO_HANGUL_ALT_THREE	= 9,
+
+  /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_ANNOTATION_TYPE */
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_ANNOTATION			= 0,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_BOX_ANNOTATION			= 1,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_ROUNDED_BOX_ANNOTATION		= 2,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_CIRCLE_ANNOTATION		= 3,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_INVERTED_CIRCLE_ANNOTATION	= 4,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_PARENTHESIS_ANNOTATION		= 5,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_PERIOD_ANNOTATION		= 6,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_ROMAN_NUMERAL_ANNOTATION	= 7,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_DIAMOND_ANNOTATION		= 8,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_INVERTED_BOX_ANNOTATION	= 9,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_INVERTED_ROUNDED_BOX_ANNOTATION= 10,
+
+  /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_KANA_SPACING_TYPE */
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_FULL_WIDTH_KANA		= 0,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_PROPORTIONAL_KANA		= 1,
+
+  /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_IDEOGRAPHIC_SPACING_TYPE */
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_FULL_WIDTH_IDEOGRAPHS		= 0,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_PROPORTIONAL_IDEOGRAPHS	= 1,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_HALF_WIDTH_IDEOGRAPHS		= 2,
+
+  /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_UNICODE_DECOMPOSITION_TYPE */
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_CANONICAL_COMPOSITION_ON	= 0,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_CANONICAL_COMPOSITION_OFF	= 1,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_COMPATIBILITY_COMPOSITION_ON	= 2,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_COMPATIBILITY_COMPOSITION_OFF	= 3,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_TRANSCODING_COMPOSITION_ON	= 4,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_TRANSCODING_COMPOSITION_OFF	= 5,
+
+  /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_RUBY_KANA */
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_RUBY_KANA			= 0, /* deprecated - use HB_AAT_LAYOUT_FEATURE_SELECTOR_RUBY_KANA_OFF instead */
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_RUBY_KANA			= 1, /* deprecated - use HB_AAT_LAYOUT_FEATURE_SELECTOR_RUBY_KANA_ON instead */
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_RUBY_KANA_ON			= 2,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_RUBY_KANA_OFF			= 3,
+
+  /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_CJK_SYMBOL_ALTERNATIVES_TYPE */
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_CJK_SYMBOL_ALTERNATIVES	= 0,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_SYMBOL_ALT_ONE		= 1,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_SYMBOL_ALT_TWO		= 2,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_SYMBOL_ALT_THREE		= 3,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_SYMBOL_ALT_FOUR		= 4,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_SYMBOL_ALT_FIVE		= 5,
+
+  /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_IDEOGRAPHIC_ALTERNATIVES_TYPE */
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_IDEOGRAPHIC_ALTERNATIVES	= 0,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_IDEOGRAPHIC_ALT_ONE		= 1,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_IDEOGRAPHIC_ALT_TWO		= 2,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_IDEOGRAPHIC_ALT_THREE		= 3,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_IDEOGRAPHIC_ALT_FOUR		= 4,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_IDEOGRAPHIC_ALT_FIVE		= 5,
+
+  /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_CJK_VERTICAL_ROMAN_PLACEMENT_TYPE */
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_VERTICAL_ROMAN_CENTERED	= 0,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_VERTICAL_ROMAN_HBASELINE	= 1,
+
+  /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_ITALIC_CJK_ROMAN */
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_CJK_ITALIC_ROMAN		= 0,    /* deprecated - use HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_ITALIC_ROMAN_OFF instead */
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_ITALIC_ROMAN		= 1,    /* deprecated - use HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_ITALIC_ROMAN_ON instead */
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_ITALIC_ROMAN_ON		= 2,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_ITALIC_ROMAN_OFF		= 3,
+
+  /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_CASE_SENSITIVE_LAYOUT */
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_CASE_SENSITIVE_LAYOUT_ON	= 0,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_CASE_SENSITIVE_LAYOUT_OFF	= 1,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_CASE_SENSITIVE_SPACING_ON	= 2,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_CASE_SENSITIVE_SPACING_OFF	= 3,
+
+  /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_ALTERNATE_KANA */
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_ALTERNATE_HORIZ_KANA_ON	= 0,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_ALTERNATE_HORIZ_KANA_OFF	= 1,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_ALTERNATE_VERT_KANA_ON		= 2,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_ALTERNATE_VERT_KANA_OFF	= 3,
+
+  /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES */
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_STYLISTIC_ALTERNATES	= 0,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_ONE_ON		= 2,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_ONE_OFF		= 3,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TWO_ON		= 4,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TWO_OFF		= 5,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_THREE_ON		= 6,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_THREE_OFF	= 7,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FOUR_ON		= 8,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FOUR_OFF		= 9,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FIVE_ON		= 10,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FIVE_OFF		= 11,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SIX_ON		= 12,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SIX_OFF		= 13,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SEVEN_ON		= 14,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SEVEN_OFF	= 15,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_EIGHT_ON		= 16,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_EIGHT_OFF	= 17,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_NINE_ON		= 18,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_NINE_OFF		= 19,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TEN_ON		= 20,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TEN_OFF		= 21,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_ELEVEN_ON	= 22,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_ELEVEN_OFF	= 23,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TWELVE_ON	= 24,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TWELVE_OFF	= 25,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_THIRTEEN_ON	= 26,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_THIRTEEN_OFF	= 27,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FOURTEEN_ON	= 28,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FOURTEEN_OFF	= 29,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FIFTEEN_ON	= 30,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FIFTEEN_OFF	= 31,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SIXTEEN_ON	= 32,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SIXTEEN_OFF	= 33,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SEVENTEEN_ON	= 34,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SEVENTEEN_OFF	= 35,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_EIGHTEEN_ON	= 36,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_EIGHTEEN_OFF	= 37,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_NINETEEN_ON	= 38,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_NINETEEN_OFF	= 39,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TWENTY_ON	= 40,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TWENTY_OFF	= 41,
+
+  /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_CONTEXTUAL_ALTERNATIVES */
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_CONTEXTUAL_ALTERNATES_ON	= 0,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_CONTEXTUAL_ALTERNATES_OFF	= 1,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_SWASH_ALTERNATES_ON		= 2,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_SWASH_ALTERNATES_OFF		= 3,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_CONTEXTUAL_SWASH_ALTERNATES_ON	= 4,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_CONTEXTUAL_SWASH_ALTERNATES_OFF= 5,
+
+  /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_LOWER_CASE */
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_DEFAULT_LOWER_CASE		= 0,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_LOWER_CASE_SMALL_CAPS		= 1,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_LOWER_CASE_PETITE_CAPS		= 2,
+
+  /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_UPPER_CASE */
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_DEFAULT_UPPER_CASE		= 0,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_UPPER_CASE_SMALL_CAPS		= 1,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_UPPER_CASE_PETITE_CAPS		= 2,
+
+  /* Selectors for #HB_AAT_LAYOUT_FEATURE_TYPE_CJK_ROMAN_SPACING_TYPE */
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_HALF_WIDTH_CJK_ROMAN		= 0,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_PROPORTIONAL_CJK_ROMAN		= 1,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_DEFAULT_CJK_ROMAN		= 2,
+  HB_AAT_LAYOUT_FEATURE_SELECTOR_FULL_WIDTH_CJK_ROMAN		= 3,
+
+  _HB_AAT_LAYOUT_FEATURE_SELECTOR_MAX_VALUE= 0x7FFFFFFFu, /*< skip >*/
+} hb_aat_layout_feature_selector_t;
+
+HB_EXTERN unsigned int
+hb_aat_layout_get_feature_types (hb_face_t                    *face,
+				 unsigned int                  start_offset,
+				 unsigned int                 *feature_count, /* IN/OUT.  May be NULL. */
+				 hb_aat_layout_feature_type_t *features       /* OUT.     May be NULL. */);
+
+HB_EXTERN hb_ot_name_id_t
+hb_aat_layout_feature_type_get_name_id (hb_face_t                    *face,
+					hb_aat_layout_feature_type_t  feature_type);
+
+typedef struct hb_aat_layout_feature_selector_info_t
+{
+  hb_ot_name_id_t			name_id;
+  hb_aat_layout_feature_selector_t	enable;
+  hb_aat_layout_feature_selector_t	disable;
+  /*< private >*/
+  unsigned int				reserved;
+} hb_aat_layout_feature_selector_info_t;
+
+#define HB_AAT_LAYOUT_NO_SELECTOR_INDEX		0xFFFFu
+
+HB_EXTERN unsigned int
+hb_aat_layout_feature_type_get_selector_infos (hb_face_t                             *face,
+					       hb_aat_layout_feature_type_t           feature_type,
+					       unsigned int                           start_offset,
+					       unsigned int                          *selector_count, /* IN/OUT.  May be NULL. */
+					       hb_aat_layout_feature_selector_info_t *selectors,      /* OUT.     May be NULL. */
+					       unsigned int                          *default_index   /* OUT.     May be NULL. */);
+
+
+HB_END_DECLS
+
+#endif /* HB_AAT_LAYOUT_H */


Property changes on: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout.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-aat-layout.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout.hh	2018-11-29 23:34:53 UTC (rev 49276)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-layout.hh	2018-11-30 01:09:56 UTC (rev 49277)
@@ -35,9 +35,9 @@
 struct hb_aat_feature_mapping_t
 {
   hb_tag_t otFeatureTag;
-  uint16_t aatFeatureType;
-  uint16_t selectorToEnable;
-  uint16_t selectorToDisable;
+  hb_aat_layout_feature_type_t aatFeatureType;
+  hb_aat_layout_feature_selector_t selectorToEnable;
+  hb_aat_layout_feature_selector_t selectorToDisable;
 
   static inline int cmp (const void *key_, const void *entry_)
   {

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-map.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-map.cc	2018-11-29 23:34:53 UTC (rev 49276)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-map.cc	2018-11-30 01:09:56 UTC (rev 49277)
@@ -37,8 +37,8 @@
   if (tag == HB_TAG ('a','a','l','t'))
   {
     feature_info_t *info = features.push();
-    info->type = 17/*kCharacterAlternativesType*/;
-    info->setting = value;
+    info->type = HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_ALTERNATIVES;
+    info->setting = (hb_aat_layout_feature_selector_t) value;
     return;
   }
 

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-map.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-map.hh	2018-11-29 23:34:53 UTC (rev 49276)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat-map.hh	2018-11-30 01:09:56 UTC (rev 49277)
@@ -65,8 +65,8 @@
   public:
   struct feature_info_t
   {
-    uint16_t  type;
-    uint16_t  setting;
+    hb_aat_layout_feature_type_t  type;
+    hb_aat_layout_feature_selector_t  setting;
     unsigned  seq; /* For stable sorting only. */
 
     static int cmp (const void *pa, const void *pb)
@@ -77,9 +77,9 @@
 	     (a->seq < b->seq ? -1 : a->seq > b->seq ? 1 : 0);
     }
 
-    int cmp (const short unsigned int *ty) const
+    int cmp (unsigned int ty) const
     {
-      return (type != *ty) ? (type < *ty ? -1 : 1) : 0;
+      return (type != ty) ? (type < ty ? -1 : 1) : 0;
     }
   };
 

Added: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat.h
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat.h	                        (rev 0)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat.h	2018-11-30 01:09:56 UTC (rev 49277)
@@ -0,0 +1,38 @@
+/*
+ * 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_H
+#define HB_AAT_H
+#define HB_AAT_H_IN
+
+#include "hb.h"
+
+#include "hb-aat-layout.h"
+
+HB_BEGIN_DECLS
+
+HB_END_DECLS
+
+#undef HB_AAT_H_IN
+#endif /* HB_AAT_H */


Property changes on: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-aat.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-atomic.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-atomic.hh	2018-11-29 23:34:53 UTC (rev 49276)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-atomic.hh	2018-11-30 01:09:56 UTC (rev 49277)
@@ -282,7 +282,7 @@
 template <typename P>
 struct hb_atomic_ptr_t
 {
-  typedef typename hb_remove_pointer<P>::value T;
+  typedef typename hb_remove_pointer (P) T;
 
   inline void init (T* v_ = nullptr) { set_relaxed (v_); }
   inline void set_relaxed (T* v_) { hb_atomic_ptr_impl_set_relaxed (&v, v_); }

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-blob.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-blob.hh	2018-11-29 23:34:53 UTC (rev 49276)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-blob.hh	2018-11-30 01:09:56 UTC (rev 49277)
@@ -60,7 +60,7 @@
   template <typename Type>
   inline const Type* as (void) const
   {
-    return length < Type::min_size ? &Null(Type) : reinterpret_cast<const Type *> (data);
+    return length < hb_null_size (Type) ? &Null(Type) : reinterpret_cast<const Type *> (data);
   }
   inline hb_bytes_t as_bytes (void) const
   {
@@ -86,7 +86,7 @@
 template <typename P>
 struct hb_blob_ptr_t
 {
-  typedef typename hb_remove_pointer<P>::value T;
+  typedef typename hb_remove_pointer (P) T;
 
   inline hb_blob_ptr_t (hb_blob_t *b_ = nullptr) : b (b_) {}
   inline hb_blob_t * operator = (hb_blob_t *b_) { return b = b_; }

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer.h
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer.h	2018-11-29 23:34:53 UTC (rev 49276)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-buffer.h	2018-11-30 01:09:56 UTC (rev 49277)
@@ -90,6 +90,8 @@
  * 				   the reshaping to a small piece around the
  * 				   breaking point only.
  * @HB_GLYPH_FLAG_DEFINED: All the currently defined flags.
+ *
+ * Since: 1.5.0
  */
 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-11-29 23:34:53 UTC (rev 49276)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-common.cc	2018-11-30 01:09:56 UTC (rev 49277)
@@ -204,7 +204,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', '1', '2', '3', '4', '5', '6', '7',  '8', '9',  0,   0,   0,   0,   0,   0,
-  '-', 'a', 'b', 'c', 'd', 'e', 'f', 'g',  'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',
+   0,  'a', 'b', 'c', 'd', 'e', 'f', 'g',  'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',
   'p', 'q', 'r', 's', 't', 'u', 'v', 'w',  'x', 'y', 'z',  0,   0,   0,   0,  '-',
    0,  'a', 'b', 'c', 'd', 'e', 'f', 'g',  'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',
   'p', 'q', 'r', 's', 't', 'u', 'v', 'w',  'x', 'y', 'z',  0,   0,   0,   0,   0
@@ -276,7 +276,7 @@
 
 static hb_atomic_ptr_t <hb_language_item_t> langs;
 
-#ifdef HB_USE_ATEXIT
+#if HB_USE_ATEXIT
 static void
 free_langs (void)
 {
@@ -323,7 +323,7 @@
     goto retry;
   }
 
-#ifdef HB_USE_ATEXIT
+#if HB_USE_ATEXIT
   if (!first_lang)
     atexit (free_langs); /* First person registers atexit() callback. */
 #endif
@@ -780,11 +780,11 @@
 
 #ifdef USE_XLOCALE
 
-#ifdef HB_USE_ATEXIT
+#if HB_USE_ATEXIT
 static void free_static_C_locale (void);
 #endif
 
-static struct hb_C_locale_lazy_loader_t : hb_lazy_loader_t<hb_remove_pointer<HB_LOCALE_T>::value,
+static struct hb_C_locale_lazy_loader_t : hb_lazy_loader_t<hb_remove_pointer (HB_LOCALE_T),
 							  hb_C_locale_lazy_loader_t>
 {
   static inline HB_LOCALE_T create (void)
@@ -791,7 +791,7 @@
   {
     HB_LOCALE_T C_locale = HB_CREATE_LOCALE ("C");
 
-#ifdef HB_USE_ATEXIT
+#if HB_USE_ATEXIT
     atexit (free_static_C_locale);
 #endif
 
@@ -807,7 +807,7 @@
   }
 } static_C_locale;
 
-#ifdef HB_USE_ATEXIT
+#if HB_USE_ATEXIT
 static
 void free_static_C_locale (void)
 {

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-debug.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-debug.hh	2018-11-29 23:34:53 UTC (rev 49276)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-debug.hh	2018-11-30 01:09:56 UTC (rev 49277)
@@ -293,7 +293,9 @@
     if (plevel) --*plevel;
   }
 
-  inline ret_t ret (ret_t v, unsigned int line = 0)
+  inline ret_t ret (ret_t v,
+		    const char *func = "",
+		    unsigned int line = 0)
   {
     if (unlikely (returned)) {
       fprintf (stderr, "OUCH, double calls to return_trace().  This is a bug, please report.\n");
@@ -300,7 +302,7 @@
       return v;
     }
 
-    _hb_debug_msg<max_level> (what, obj, nullptr, true, plevel ? *plevel : 1, -1,
+    _hb_debug_msg<max_level> (what, obj, func, true, plevel ? *plevel : 1, -1,
 			      "return %s (line %d)",
 			      hb_printer_t<ret_t>().print (v), line);
     if (plevel) --*plevel;
@@ -325,7 +327,9 @@
 				   const char *message,
 				   ...) HB_PRINTF_FUNC(6, 7) {}
 
-  inline ret_t ret (ret_t v, unsigned int line HB_UNUSED = 0) { return v; }
+  inline ret_t ret (ret_t v,
+		    const char *func HB_UNUSED = 0,
+		    unsigned int line HB_UNUSED = 0) { return v; }
 };
 
 /* For disabled tracing; optimize out everything.
@@ -332,10 +336,12 @@
  * https://github.com/harfbuzz/harfbuzz/pull/605 */
 template <typename ret_t>
 struct hb_no_trace_t {
-  inline ret_t ret (ret_t v, unsigned int line HB_UNUSED = 0) { return v; }
+  inline ret_t ret (ret_t v,
+		    const char *func HB_UNUSED = "",
+		    unsigned int line HB_UNUSED = 0) { return v; }
 };
 
-#define return_trace(RET) return trace.ret (RET, __LINE__)
+#define return_trace(RET) return trace.ret (RET, HB_FUNC, __LINE__)
 
 
 /*

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-deprecated.h
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-deprecated.h	2018-11-29 23:34:53 UTC (rev 49276)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-deprecated.h	2018-11-30 01:09:56 UTC (rev 49277)
@@ -241,6 +241,43 @@
 hb_ot_tag_from_language (hb_language_t language);
 
 
+typedef unsigned int hb_ot_name_id_t; /* Since is in hb-ot.h */
+
+/**
+ * HB_OT_VAR_NO_AXIS_INDEX:
+ *
+ * Since: 1.4.2
+ * Deprecated: 2.2.0
+ */
+#define HB_OT_VAR_NO_AXIS_INDEX		0xFFFFFFFFu
+
+/**
+ * hb_ot_var_axis_t:
+ *
+ * Since: 1.4.2
+ * Deprecated: 2.2.0
+ */
+typedef struct hb_ot_var_axis_t
+{
+  hb_tag_t tag;
+  hb_ot_name_id_t name_id;
+  float min_value;
+  float default_value;
+  float max_value;
+} hb_ot_var_axis_t;
+
+HB_EXTERN HB_DEPRECATED_FOR (hb_ot_var_get_axis_infos) unsigned int
+hb_ot_var_get_axes (hb_face_t        *face,
+		    unsigned int      start_offset,
+		    unsigned int     *axes_count /* IN/OUT */,
+		    hb_ot_var_axis_t *axes_array /* OUT */);
+
+HB_EXTERN HB_DEPRECATED_FOR (hb_ot_var_find_axis_info) hb_bool_t
+hb_ot_var_find_axis (hb_face_t        *face,
+		     hb_tag_t          axis_tag,
+		     unsigned int     *axis_index,
+		     hb_ot_var_axis_t *axis_info);
+
 #endif
 
 HB_END_DECLS

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-dsalgs.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-dsalgs.hh	2018-11-29 23:34:53 UTC (rev 49276)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-dsalgs.hh	2018-11-30 01:09:56 UTC (rev 49277)
@@ -560,9 +560,15 @@
 };
 
 template <typename Type>
+struct hb_sorted_array_t;
+
+template <typename Type>
 struct hb_array_t
 {
+  static_assert ((bool) (unsigned) hb_static_size (Type), "");
+
   inline hb_array_t (void) : arrayZ (nullptr), len (0) {}
+  inline hb_array_t (const hb_array_t &o) : arrayZ (o.arrayZ), len (o.len) {}
   inline hb_array_t (Type *array_, unsigned int len_) : arrayZ (array_), len (len_) {}
 
   inline Type& operator [] (unsigned int i) const
@@ -571,35 +577,162 @@
     return arrayZ[i];
   }
 
-  inline unsigned int get_size (void) const { return len * sizeof (Type); }
-
   template <typename T> inline operator  T * (void) const { return arrayZ; }
 
   inline Type * operator & (void) const { return arrayZ; }
 
-  inline hb_array_t<Type> sub_array (unsigned int start_offset, unsigned int seg_count) const
+  inline unsigned int get_size (void) const { return len * sizeof (Type); }
+
+  inline hb_array_t<Type> sub_array (unsigned int start_offset, unsigned int *seg_count /* IN/OUT */) const
   {
+    if (!seg_count) return hb_array_t<Type> ();
+
     unsigned int count = len;
     if (unlikely (start_offset > count))
       count = 0;
     else
       count -= start_offset;
-    count = MIN (count, seg_count);
+    count = *seg_count = MIN (count, *seg_count);
     return hb_array_t<Type> (arrayZ + start_offset, count);
   }
+  inline hb_array_t<Type> sub_array (unsigned int start_offset, unsigned int seg_count) const
+  { return sub_array (start_offset, &seg_count); }
 
   inline hb_bytes_t as_bytes (void) const
+  { return hb_bytes_t (arrayZ, len * sizeof (Type)); }
+
+  template <typename T>
+  inline Type *lsearch (const T &x,
+			Type *not_found = nullptr)
   {
-    return hb_bytes_t (arrayZ, len * sizeof (Type));
+    unsigned int count = len;
+    for (unsigned int i = 0; i < count; i++)
+      if (!this->arrayZ[i].cmp (x))
+	return &this->arrayZ[i];
+    return not_found;
   }
+  template <typename T>
+  inline const Type *lsearch (const T &x,
+			      const Type *not_found = nullptr) const
+  {
+    unsigned int count = len;
+    for (unsigned int i = 0; i < count; i++)
+      if (!this->arrayZ[i].cmp (x))
+	return &this->arrayZ[i];
+    return not_found;
+  }
 
-  inline void free (void) { ::free ((void *) arrayZ); arrayZ = nullptr; len = 0; }
+  inline hb_sorted_array_t<Type> qsort (int (*cmp)(const void*, const void*))
+  {
+    ::qsort (arrayZ, len, sizeof (Type), cmp);
+    return hb_sorted_array_t<Type> (*this);
+  }
+  inline hb_sorted_array_t<Type> qsort (void)
+  {
+    ::qsort (arrayZ, len, sizeof (Type), Type::cmp);
+    return hb_sorted_array_t<Type> (*this);
+  }
+  inline void qsort (unsigned int start, unsigned int end)
+  {
+    end = MIN (end, len);
+    assert (start <= end);
+    ::qsort (arrayZ + start, end - start, sizeof (Type), Type::cmp);
+  }
 
+  inline void free (void)
+  { ::free ((void *) arrayZ); arrayZ = nullptr; len = 0; }
+
+  template <typename hb_sanitize_context_t>
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  { return c->check_array (arrayZ, len); }
+
+  public:
   Type *arrayZ;
   unsigned int len;
 };
+template <typename T>
+inline hb_array_t<T> hb_array (T *array, unsigned int len)
+{ return hb_array_t<T> (array, len); }
 
+enum hb_bfind_not_found_t
+{
+  HB_BFIND_NOT_FOUND_DONT_STORE,
+  HB_BFIND_NOT_FOUND_STORE,
+  HB_BFIND_NOT_FOUND_STORE_CLOSEST,
+};
 
+template <typename Type>
+struct hb_sorted_array_t : hb_array_t<Type>
+{
+  inline hb_sorted_array_t (void) : hb_array_t<Type> () {}
+  inline hb_sorted_array_t (const hb_array_t<Type> &o) : hb_array_t<Type> (o) {}
+  inline hb_sorted_array_t (Type *array_, unsigned int len_) : hb_array_t<Type> (array_, len_) {}
+
+  inline hb_sorted_array_t<Type> sub_array (unsigned int start_offset, unsigned int *seg_count /* IN/OUT */) const
+  { return hb_sorted_array_t<Type> (((const hb_array_t<Type> *) (this))->sub_array (start_offset, seg_count)); }
+  inline hb_sorted_array_t<Type> sub_array (unsigned int start_offset, unsigned int seg_count) const
+  { return sub_array (start_offset, &seg_count); }
+
+  template <typename T>
+  inline Type *bsearch (const T &x, Type *not_found = nullptr)
+  {
+    unsigned int i;
+    return bfind (x, &i) ? &this->arrayZ[i] : not_found;
+  }
+  template <typename T>
+  inline const Type *bsearch (const T &x, const Type *not_found = nullptr) const
+  {
+    unsigned int i;
+    return bfind (x, &i) ? &this->arrayZ[i] : not_found;
+  }
+  template <typename T>
+  inline bool bfind (const T &x, unsigned int *i = nullptr,
+		     hb_bfind_not_found_t not_found = HB_BFIND_NOT_FOUND_DONT_STORE,
+		     unsigned int to_store = (unsigned int) -1) const
+  {
+    int min = 0, max = (int) this->len - 1;
+    const Type *array = this->arrayZ;
+    while (min <= max)
+    {
+      int mid = ((unsigned int) min + (unsigned int) max) / 2;
+      int c = array[mid].cmp (x);
+      if (c < 0)
+        max = mid - 1;
+      else if (c > 0)
+        min = mid + 1;
+      else
+      {
+	if (i)
+	  *i = mid;
+	return true;
+      }
+    }
+    if (i)
+    {
+      switch (not_found)
+      {
+	case HB_BFIND_NOT_FOUND_DONT_STORE:
+	  break;
+
+	case HB_BFIND_NOT_FOUND_STORE:
+	  *i = to_store;
+	  break;
+
+	case HB_BFIND_NOT_FOUND_STORE_CLOSEST:
+	  if (max < 0 || (max < (int) this->len && array[max].cmp (x) > 0))
+	    max++;
+	  *i = max;
+	  break;
+      }
+    }
+    return false;
+  }
+};
+template <typename T>
+inline hb_sorted_array_t<T> hb_sorted_array (T *array, unsigned int len)
+{ return hb_sorted_array_t<T> (array, len); }
+
+
 struct HbOpOr
 {
   static const bool passthru_left = true;

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-face.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-face.cc	2018-11-29 23:34:53 UTC (rev 49276)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-face.cc	2018-11-30 01:09:56 UTC (rev 49277)
@@ -588,10 +588,10 @@
 {
   struct table_entry_t
   {
-    inline int cmp (const hb_tag_t *t) const
+    inline int cmp (hb_tag_t t) const
     {
-      if (*t < tag) return -1;
-      if (*t > tag) return -1;
+      if (t < tag) return -1;
+      if (t > tag) return -1;
       return 0;
     }
 

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ft.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ft.cc	2018-11-29 23:34:53 UTC (rev 49276)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ft.cc	2018-11-30 01:09:56 UTC (rev 49277)
@@ -478,7 +478,7 @@
   return true;
 }
 
-#ifdef HB_USE_ATEXIT
+#if HB_USE_ATEXIT
 static void free_static_ft_funcs (void);
 #endif
 
@@ -504,7 +504,7 @@
 
     hb_font_funcs_make_immutable (funcs);
 
-#ifdef HB_USE_ATEXIT
+#if HB_USE_ATEXIT
     atexit (free_static_ft_funcs);
 #endif
 
@@ -512,7 +512,7 @@
   }
 } static_ft_funcs;
 
-#ifdef HB_USE_ATEXIT
+#if HB_USE_ATEXIT
 static
 void free_static_ft_funcs (void)
 {
@@ -744,11 +744,11 @@
   return hb_ft_font_create (ft_face, _hb_ft_face_destroy);
 }
 
-#ifdef HB_USE_ATEXIT
+#if HB_USE_ATEXIT
 static void free_static_ft_library (void);
 #endif
 
-static struct hb_ft_library_lazy_loader_t : hb_lazy_loader_t<hb_remove_pointer<FT_Library>::value,
+static struct hb_ft_library_lazy_loader_t : hb_lazy_loader_t<hb_remove_pointer (FT_Library),
 							     hb_ft_library_lazy_loader_t>
 {
   static inline FT_Library create (void)
@@ -757,7 +757,7 @@
     if (FT_Init_FreeType (&l))
       return nullptr;
 
-#ifdef HB_USE_ATEXIT
+#if HB_USE_ATEXIT
     atexit (free_static_ft_library);
 #endif
 
@@ -773,7 +773,7 @@
   }
 } static_ft_library;
 
-#ifdef HB_USE_ATEXIT
+#if HB_USE_ATEXIT
 static
 void free_static_ft_library (void)
 {

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-glib.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-glib.cc	2018-11-29 23:34:53 UTC (rev 49276)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-glib.cc	2018-11-30 01:09:56 UTC (rev 49277)
@@ -336,7 +336,7 @@
 }
 
 
-#ifdef HB_USE_ATEXIT
+#if HB_USE_ATEXIT
 static void free_static_glib_funcs (void);
 #endif
 
@@ -355,7 +355,7 @@
 
     hb_unicode_funcs_make_immutable (funcs);
 
-#ifdef HB_USE_ATEXIT
+#if HB_USE_ATEXIT
     atexit (free_static_glib_funcs);
 #endif
 
@@ -363,7 +363,7 @@
   }
 } static_glib_funcs;
 
-#ifdef HB_USE_ATEXIT
+#if HB_USE_ATEXIT
 static
 void free_static_glib_funcs (void)
 {

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-icu.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-icu.cc	2018-11-29 23:34:53 UTC (rev 49276)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-icu.cc	2018-11-30 01:09:56 UTC (rev 49277)
@@ -65,7 +65,8 @@
   if (unlikely (script == HB_SCRIPT_INVALID))
     return USCRIPT_INVALID_CODE;
 
-  for (unsigned int i = 0; i < USCRIPT_CODE_LIMIT; i++)
+  unsigned int numScriptCode = 1 + u_getIntPropertyMaxValue (UCHAR_SCRIPT);
+  for (unsigned int i = 0; i < numScriptCode; i++)
     if (unlikely (hb_icu_script_to_script ((UScriptCode) i) == script))
       return (UScriptCode) i;
 
@@ -300,7 +301,7 @@
 }
 
 
-#ifdef HB_USE_ATEXIT
+#if HB_USE_ATEXIT
 static void free_static_icu_funcs (void);
 #endif
 
@@ -326,7 +327,7 @@
 
     hb_unicode_funcs_make_immutable (funcs);
 
-#ifdef HB_USE_ATEXIT
+#if HB_USE_ATEXIT
     atexit (free_static_icu_funcs);
 #endif
 
@@ -334,7 +335,7 @@
   }
 } static_icu_funcs;
 
-#ifdef HB_USE_ATEXIT
+#if HB_USE_ATEXIT
 static
 void free_static_icu_funcs (void)
 {

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-machinery.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-machinery.hh	2018-11-29 23:34:53 UTC (rev 49276)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-machinery.hh	2018-11-30 01:09:56 UTC (rev 49277)
@@ -82,8 +82,7 @@
 /* Check _assertion in a method environment */
 #define _DEFINE_INSTANCE_ASSERTION1(_line, _assertion) \
   inline void _instance_assertion_on_line_##_line (void) const \
-  { static_assert ((_assertion), ""); } \
-  static_assert (true, "") /* So we require semicolon here. */
+  { static_assert ((_assertion), ""); }
 # define _DEFINE_INSTANCE_ASSERTION0(_line, _assertion) _DEFINE_INSTANCE_ASSERTION1 (_line, _assertion)
 # define DEFINE_INSTANCE_ASSERTION(_assertion) _DEFINE_INSTANCE_ASSERTION0 (__LINE__, _assertion)
 
@@ -96,34 +95,38 @@
 
 
 #define DEFINE_SIZE_STATIC(size) \
-  DEFINE_INSTANCE_ASSERTION (sizeof (*this) == (size)); \
+  DEFINE_INSTANCE_ASSERTION (sizeof (*this) == (size)) \
   inline unsigned int get_size (void) const { return (size); } \
-  enum { static_size = (size) }; \
-  enum { min_size = (size) }
+  enum { null_size = (size) }; \
+  enum { min_size = (size) }; \
+  enum { static_size = (size) }
 
 #define DEFINE_SIZE_UNION(size, _member) \
-  DEFINE_INSTANCE_ASSERTION (0*sizeof(this->u._member.static_size) + sizeof(this->u._member) == (size)); \
-  static const unsigned int min_size = (size)
+  DEFINE_COMPILES_ASSERTION ((void) this->u._member.static_size) \
+  DEFINE_INSTANCE_ASSERTION (sizeof(this->u._member) == (size)) \
+  enum { null_size = (size) }; \
+  enum { min_size = (size) }
 
 #define DEFINE_SIZE_MIN(size) \
-  DEFINE_INSTANCE_ASSERTION (sizeof (*this) >= (size)); \
-  static const unsigned int min_size = (size)
+  DEFINE_INSTANCE_ASSERTION (sizeof (*this) >= (size)) \
+  enum { null_size = (size) }; \
+  enum { min_size = (size) }
 
+#define DEFINE_SIZE_UNBOUNDED(size) \
+  DEFINE_INSTANCE_ASSERTION (sizeof (*this) >= (size)) \
+  enum { min_size = (size) }
+
 #define DEFINE_SIZE_ARRAY(size, array) \
-  DEFINE_INSTANCE_ASSERTION (sizeof (*this) == (size) + VAR * sizeof ((array)[0])); \
   DEFINE_COMPILES_ASSERTION ((void) (array)[0].static_size) \
+  DEFINE_INSTANCE_ASSERTION (sizeof (*this) == (size) + VAR * sizeof ((array)[0])) \
+  enum { null_size = (size) }; \
   enum { min_size = (size) }
 
 #define DEFINE_SIZE_ARRAY_SIZED(size, array) \
-	inline unsigned int get_size (void) const { return (size - (array).min_size + (array).get_size ()); } \
-	DEFINE_SIZE_ARRAY(size, array)
+  inline unsigned int get_size (void) const { return (size - (array).min_size + (array).get_size ()); } \
+  DEFINE_SIZE_ARRAY(size, array)
 
-#define DEFINE_SIZE_ARRAY2(size, array1, array2) \
-  DEFINE_INSTANCE_ASSERTION (sizeof (*this) == (size) + sizeof (this->array1[0]) + sizeof (this->array2[0])); \
-  DEFINE_COMPILES_ASSERTION ((void) (array1)[0].static_size; (void) (array2)[0].static_size) \
-  static const unsigned int min_size = (size)
 
-
 /*
  * Dispatch
  */
@@ -256,26 +259,36 @@
 
   inline void set_max_ops (int max_ops_) { max_ops = max_ops_; }
 
-  /* TODO
-   * This set_object() thing is to use sanitize at runtime lookup
-   * application time.  This is very distinct from the regular
-   * sanitizer operation, so, eventually, separate into another
-   * type and make hb_aat_apply_context_t use that one instead
-   * of abusing this one.
-   */
   template <typename T>
-  inline void set_object (const T& obj)
+  inline void set_object (const T *obj)
   {
-    this->start = (const char *) &obj;
-    this->end = (const char *) &obj + obj.get_size ();
-    assert (this->start <= this->end); /* Must not overflow. */
+    reset_object ();
+
+    if (!obj) return;
+
+    const char *obj_start = (const char *) obj;
+    const char *obj_end = (const char *) obj + obj->get_size ();
+    assert (obj_start <= obj_end); /* Must not overflow. */
+
+    if (unlikely (obj_end < this->start || this->end < obj_start))
+      this->start = this->end = nullptr;
+    else
+    {
+      this->start = MAX (this->start, obj_start);
+      this->end   = MIN (this->end  , obj_end  );
+    }
   }
 
-  inline void start_processing (void)
+  inline void reset_object (void)
   {
     this->start = this->blob->data;
     this->end = this->start + this->blob->length;
     assert (this->start <= this->end); /* Must not overflow. */
+  }
+
+  inline void start_processing (void)
+  {
+    reset_object ();
     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;
@@ -469,7 +482,24 @@
   bool  num_glyphs_set;
 };
 
+struct hb_sanitize_with_object_t
+{
+  template <typename T>
+  inline hb_sanitize_with_object_t (hb_sanitize_context_t *c,
+				    const T& obj) : c (c)
+  {
+    c->set_object (obj);
+  }
+  inline ~hb_sanitize_with_object_t (void)
+  {
+    c->reset_object ();
+  }
 
+  private:
+  hb_sanitize_context_t *c;
+};
+
+
 /*
  * Serialize
  */
@@ -691,6 +721,12 @@
   }
   inline operator Type (void) const
   {
+#if defined(__GNUC__) || defined(__clang__)
+    /* Spoon-feed the compiler a big-endian integer with alignment 1.
+     * https://github.com/harfbuzz/harfbuzz/pull/1398 */
+    struct __attribute__((packed)) packed_uint16_t { uint16_t v; };
+    return __builtin_bswap16 (((packed_uint16_t *) this)->v);
+#endif
     return (v[0] <<  8)
          + (v[1]      );
   }

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-null.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-null.hh	2018-11-29 23:34:53 UTC (rev 49276)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-null.hh	2018-11-30 01:09:56 UTC (rev 49277)
@@ -38,6 +38,45 @@
 
 #define HB_NULL_POOL_SIZE 1024
 
+/* Use SFINAE to sniff whether T has min_size; in which case return T::null_size,
+ * otherwise return sizeof(T). */
+
+/* The hard way...
+ * https://stackoverflow.com/questions/7776448/sfinae-tried-with-bool-gives-compiler-error-template-argument-tvalue-invol
+ */
+
+template<bool> struct _hb_bool_type {};
+
+template <typename T, typename B>
+struct _hb_null_size
+{ enum { value = sizeof (T) }; };
+template <typename T>
+struct _hb_null_size<T, _hb_bool_type<(bool) (1 + (unsigned int) T::min_size)> >
+{ enum { value = T::null_size }; };
+
+template <typename T>
+struct hb_null_size
+{ enum { value = _hb_null_size<T, _hb_bool_type<true> >::value }; };
+#define hb_null_size(T) hb_null_size<T>::value
+
+/* This doesn't belong here, but since is copy/paste from above, put it here. */
+
+template <typename T, typename B>
+struct _hb_static_size
+{ enum { value = sizeof (T) }; };
+template <typename T>
+struct _hb_static_size<T, _hb_bool_type<(bool) (1 + (unsigned int) T::min_size)> >
+{ enum { value = T::static_size }; };
+
+template <typename T>
+struct hb_static_size
+{ enum { value = _hb_static_size<T, _hb_bool_type<true> >::value }; };
+#define hb_static_size(T) hb_static_size<T>::value
+
+
+/*
+ * Null()
+ */
 extern HB_INTERNAL
 hb_vector_size_impl_t const _hb_NullPool[(HB_NULL_POOL_SIZE + sizeof (hb_vector_size_impl_t) - 1) / sizeof (hb_vector_size_impl_t)];
 
@@ -44,15 +83,15 @@
 /* Generic nul-content Null objects. */
 template <typename Type>
 static inline Type const & Null (void) {
-  static_assert (sizeof (Type) <= HB_NULL_POOL_SIZE, "Increase HB_NULL_POOL_SIZE.");
+  static_assert (hb_null_size (Type) <= HB_NULL_POOL_SIZE, "Increase HB_NULL_POOL_SIZE.");
   return *reinterpret_cast<Type const *> (_hb_NullPool);
 }
-#define Null(Type) Null<typename hb_remove_const<typename hb_remove_reference<Type>::value>::value>()
+#define Null(Type) Null<typename hb_remove_const (typename hb_remove_reference (Type))> ()
 
 /* Specializations for arbitrary-content Null objects expressed in bytes. */
 #define DECLARE_NULL_NAMESPACE_BYTES(Namespace, Type) \
 	} /* Close namespace. */ \
-	extern HB_INTERNAL const unsigned char _hb_Null_##Namespace##_##Type[Namespace::Type::min_size]; \
+	extern HB_INTERNAL const unsigned char _hb_Null_##Namespace##_##Type[Namespace::Type::null_size]; \
 	template <> \
 	/*static*/ inline const Namespace::Type& Null<Namespace::Type> (void) { \
 	  return *reinterpret_cast<const Namespace::Type *> (_hb_Null_##Namespace##_##Type); \
@@ -60,7 +99,7 @@
 	namespace Namespace { \
 	static_assert (true, "Just so we take semicolon after.")
 #define DEFINE_NULL_NAMESPACE_BYTES(Namespace, Type) \
-	const unsigned char _hb_Null_##Namespace##_##Type[Namespace::Type::min_size]
+	const unsigned char _hb_Null_##Namespace##_##Type[Namespace::Type::null_size]
 
 /* Specializations for arbitrary-content Null objects expressed as struct initializer. */
 #define DECLARE_NULL_INSTANCE(Type) \
@@ -85,12 +124,12 @@
 /* CRAP pool: Common Region for Access Protection. */
 template <typename Type>
 static inline Type& Crap (void) {
-  static_assert (sizeof (Type) <= HB_NULL_POOL_SIZE, "Increase HB_NULL_POOL_SIZE.");
+  static_assert (hb_null_size (Type) <= HB_NULL_POOL_SIZE, "Increase HB_NULL_POOL_SIZE.");
   Type *obj = reinterpret_cast<Type *> (_hb_CrapPool);
   memcpy (obj, &Null(Type), sizeof (*obj));
   return *obj;
 }
-#define Crap(Type) Crap<typename hb_remove_const<typename hb_remove_reference<Type>::value>::value>()
+#define Crap(Type) Crap<typename hb_remove_const (typename hb_remove_reference (Type))> ()
 
 template <typename Type>
 struct CrapOrNull {
@@ -110,7 +149,7 @@
 template <typename P>
 struct hb_nonnull_ptr_t
 {
-  typedef typename hb_remove_pointer<P>::value T;
+  typedef typename hb_remove_pointer (P) T;
 
   inline hb_nonnull_ptr_t (T *v_ = nullptr) : v (v_) {}
   inline T * operator = (T *v_) { return v = v_; }

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-open-file.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-open-file.hh	2018-11-29 23:34:53 UTC (rev 49276)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-open-file.hh	2018-11-30 01:09:56 UTC (rev 49277)
@@ -111,12 +111,7 @@
   {
     Tag t;
     t.set (tag);
-    /* Linear-search for small tables to work around fonts with unsorted
-     * table list. */
-    int i = tables.len < 64 ? tables.lsearch (t) : tables.bsearch (t);
-    if (table_index)
-      *table_index = i == -1 ? (unsigned) Index::NOT_FOUND_INDEX : (unsigned) i;
-    return i != -1;
+    return tables.bfind (t, table_index, HB_BFIND_NOT_FOUND_STORE, Index::NOT_FOUND_INDEX);
   }
   inline const TableRecord& get_table_by_tag (hb_tag_t tag) const
   {

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-open-type.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-open-type.hh	2018-11-29 23:34:53 UTC (rev 49276)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-open-type.hh	2018-11-30 01:09:56 UTC (rev 49277)
@@ -231,22 +231,31 @@
  * Use: (base+offset)
  */
 
-template <typename Type, bool has_null_> struct assert_has_min_size { static_assert (Type::min_size > 0, ""); };
-template <typename Type> struct assert_has_min_size<Type, false> {};
+template <typename Type, bool has_null>
+struct _hb_has_null
+{
+  static inline const Type *get_null (void) { return nullptr; }
+  static inline Type *get_crap (void) { return nullptr; }
+};
+template <typename Type>
+struct _hb_has_null<Type, true>
+{
+  static inline const Type *get_null (void) { return &Null(Type); }
+  static inline Type *get_crap (void) { return &Crap(Type); }
+};
 
 template <typename Type, typename OffsetType=HBUINT16, bool has_null=true>
 struct OffsetTo : Offset<OffsetType, has_null>
 {
-  static_assert (sizeof (assert_has_min_size<Type, has_null>) || true, "");
-
   inline const Type& operator () (const void *base) const
   {
-    if (unlikely (this->is_null ())) return Null (Type);
+    if (unlikely (this->is_null ())) return *_hb_has_null<Type, has_null>::get_null ();
     return StructAtOffset<const Type> (base, *this);
   }
   inline Type& operator () (void *base) const
   {
     if (unlikely (this->is_null ())) return Crap (Type);
+    if (unlikely (this->is_null ())) return *_hb_has_null<Type, has_null>::get_crap ();
     return StructAtOffset<Type> (base, *this);
   }
 
@@ -322,6 +331,7 @@
   DEFINE_SIZE_STATIC (sizeof (OffsetType));
 };
 template <typename Type, bool has_null=true> struct LOffsetTo : OffsetTo<Type, HBUINT32, has_null> {};
+
 template <typename Base, typename OffsetType, bool has_null, typename Type>
 static inline const Type& operator + (const Base &base, const OffsetTo<Type, OffsetType, has_null> &offset) { return offset (base); }
 template <typename Base, typename OffsetType, bool has_null, typename Type>
@@ -335,6 +345,8 @@
 template <typename Type>
 struct UnsizedArrayOf
 {
+  static_assert ((bool) (unsigned) hb_static_size (Type), "");
+
   enum { item_size = Type::static_size };
 
   HB_NO_CREATE_COPY_ASSIGN_TEMPLATE (UnsizedArrayOf, Type);
@@ -358,9 +370,21 @@
   inline unsigned int get_size (unsigned int len) const
   { return len * Type::static_size; }
 
-  inline hb_array_t<Type> as_array (unsigned int len) { return hb_array_t<Type> (arrayZ, len); }
-  inline hb_array_t<const Type> as_array (unsigned int len) const { return hb_array_t<const Type> (arrayZ, len); }
+  inline hb_array_t<Type> as_array (unsigned int len)
+  { return hb_array (arrayZ, len); }
+  inline hb_array_t<const Type> as_array (unsigned int len) const
+  { return hb_array (arrayZ, len); }
 
+  template <typename T>
+  inline Type &lsearch (unsigned int len, const T &x, Type &not_found = Crap (Type))
+  { return *as_array (len).lsearch (x, &not_found); }
+  template <typename T>
+  inline const Type &lsearch (unsigned int len, const T &x, const Type &not_found = Null (Type)) const
+  { return *as_array (len).lsearch (x, &not_found); }
+
+  inline void qsort (unsigned int len, unsigned int start = 0, unsigned int end = (unsigned int) -1)
+  { as_array (len).qsort (start, end); }
+
   inline bool sanitize (hb_sanitize_context_t *c, unsigned int count) const
   {
     TRACE_SANITIZE (this);
@@ -406,7 +430,7 @@
   public:
   Type		arrayZ[VAR];
   public:
-  DEFINE_SIZE_ARRAY (0, arrayZ);
+  DEFINE_SIZE_UNBOUNDED (0);
 };
 
 /* Unsized array of offset's */
@@ -419,9 +443,18 @@
 {
   inline const Type& operator [] (unsigned int i) const
   {
-    return this+this->arrayZ[i];
+    const OffsetTo<Type, OffsetType, has_null> *p = &this->arrayZ[i];
+    if (unlikely (p < this->arrayZ)) return Null (Type); /* Overflowed. */
+    return this+*p;
   }
+  inline Type& operator [] (unsigned int i)
+  {
+    const OffsetTo<Type, OffsetType, has_null> *p = &this->arrayZ[i];
+    if (unlikely (p < this->arrayZ)) return Crap (Type); /* Overflowed. */
+    return this+*p;
+  }
 
+
   inline bool sanitize (hb_sanitize_context_t *c, unsigned int count) const
   {
     TRACE_SANITIZE (this);
@@ -435,26 +468,39 @@
   }
 };
 
+/* An array with sorted elements.  Supports binary searching. */
+template <typename Type>
+struct SortedUnsizedArrayOf : UnsizedArrayOf<Type>
+{
+  inline hb_sorted_array_t<Type> as_array (unsigned int len)
+  { return hb_sorted_array (this->arrayZ, len); }
+  inline hb_sorted_array_t<const Type> as_array (unsigned int len) const
+  { return hb_sorted_array (this->arrayZ, len); }
+
+  template <typename T>
+  inline Type &bsearch (unsigned int len, const T &x, Type &not_found = Crap (Type))
+  { return *as_array (len).bsearch (x, &not_found); }
+  template <typename T>
+  inline const Type &bsearch (unsigned int len, const T &x, const Type &not_found = Null (Type)) const
+  { return *as_array (len).bsearch (x, &not_found); }
+  template <typename T>
+  inline bool bfind (unsigned int len, const T &x, unsigned int *i = nullptr,
+		     hb_bfind_not_found_t not_found = HB_BFIND_NOT_FOUND_DONT_STORE,
+		     unsigned int to_store = (unsigned int) -1) const
+  { return as_array (len).bfind (x, i, not_found, to_store); }
+};
+
+
 /* An array with a number of elements. */
 template <typename Type, typename LenType=HBUINT16>
 struct ArrayOf
 {
+  static_assert ((bool) (unsigned) hb_static_size (Type), "");
+
   enum { item_size = Type::static_size };
 
   HB_NO_CREATE_COPY_ASSIGN_TEMPLATE2 (ArrayOf, Type, LenType);
 
-  inline const Type *sub_array (unsigned int start_offset, unsigned int *pcount /* IN/OUT */) const
-  {
-    unsigned int count = len;
-    if (unlikely (start_offset > count))
-      count = 0;
-    else
-      count -= start_offset;
-    count = MIN (count, *pcount);
-    *pcount = count;
-    return arrayZ + start_offset;
-  }
-
   inline const Type& operator [] (unsigned int i) const
   {
     if (unlikely (i >= len)) return Null (Type);
@@ -469,6 +515,20 @@
   inline unsigned int get_size (void) const
   { return len.static_size + len * Type::static_size; }
 
+  inline hb_array_t<Type> as_array (void)
+  { return hb_array (arrayZ, len); }
+  inline hb_array_t<const Type> as_array (void) const
+  { return hb_array (arrayZ, len); }
+
+  inline hb_array_t<const Type> sub_array (unsigned int start_offset, unsigned int count) const
+  { return as_array ().sub_array (start_offset, count);}
+  inline hb_array_t<const Type> sub_array (unsigned int start_offset, unsigned int *count /* IN/OUT */) const
+  { return as_array ().sub_array (start_offset, count);}
+  inline hb_array_t<Type> sub_array (unsigned int start_offset, unsigned int count)
+  { return as_array ().sub_array (start_offset, count);}
+  inline hb_array_t<Type> sub_array (unsigned int start_offset, unsigned int *count /* IN/OUT */)
+  { return as_array ().sub_array (start_offset, count);}
+
   inline bool serialize (hb_serialize_context_t *c,
 			 unsigned int items_len)
   {
@@ -528,20 +588,15 @@
     return_trace (true);
   }
 
-  template <typename SearchType>
-  inline int lsearch (const SearchType &x) const
-  {
-    unsigned int count = len;
-    for (unsigned int i = 0; i < count; i++)
-      if (!this->arrayZ[i].cmp (x))
-	return i;
-    return -1;
-  }
+  template <typename T>
+  inline Type &lsearch (const T &x, Type &not_found = Crap (Type))
+  { return *as_array ().lsearch (x, &not_found); }
+  template <typename T>
+  inline const Type &lsearch (const T &x, const Type &not_found = Null (Type)) const
+  { return *as_array ().lsearch (x, &not_found); }
 
-  inline void qsort (void)
-  {
-    ::qsort (arrayZ, len, sizeof (Type), Type::cmp);
-  }
+  inline void qsort (unsigned int start = 0, unsigned int end = (unsigned int) -1)
+  { as_array ().qsort (start, end); }
 
   inline bool sanitize_shallow (hb_sanitize_context_t *c) const
   {
@@ -723,22 +778,31 @@
 template <typename Type, typename LenType=HBUINT16>
 struct SortedArrayOf : ArrayOf<Type, LenType>
 {
-  template <typename SearchType>
-  inline int bsearch (const SearchType &x) const
-  {
-    /* Hand-coded bsearch here since this is in the hot inner loop. */
-    const Type *arr = this->arrayZ;
-    int min = 0, max = (int) this->len - 1;
-    while (min <= max)
-    {
-      int mid = ((unsigned int) min + (unsigned int) max) / 2;
-      int c = arr[mid].cmp (x);
-      if (c < 0) max = mid - 1;
-      else if (c > 0) min = mid + 1;
-      else return mid;
-    }
-    return -1;
-  }
+  inline hb_sorted_array_t<Type> as_array (void)
+  { return hb_sorted_array (this->arrayZ, this->len); }
+  inline hb_sorted_array_t<const Type> as_array (void) const
+  { return hb_sorted_array (this->arrayZ, this->len); }
+
+  inline hb_array_t<const Type> sub_array (unsigned int start_offset, unsigned int count) const
+  { return as_array ().sub_array (start_offset, count);}
+  inline hb_array_t<const Type> sub_array (unsigned int start_offset, unsigned int *count /* IN/OUT */) const
+  { return as_array ().sub_array (start_offset, count);}
+  inline hb_array_t<Type> sub_array (unsigned int start_offset, unsigned int count)
+  { return as_array ().sub_array (start_offset, count);}
+  inline hb_array_t<Type> sub_array (unsigned int start_offset, unsigned int *count /* IN/OUT */)
+  { return as_array ().sub_array (start_offset, count);}
+
+  template <typename T>
+  inline Type &bsearch (const T &x, Type &not_found = Crap (Type))
+  { return *as_array ().bsearch (x, &not_found); }
+  template <typename T>
+  inline const Type &bsearch (const T &x, const Type &not_found = Null (Type)) const
+  { return *as_array ().bsearch (x, &not_found); }
+  template <typename T>
+  inline bool bfind (const T &x, unsigned int *i = nullptr,
+		     hb_bfind_not_found_t not_found = HB_BFIND_NOT_FOUND_DONT_STORE,
+		     unsigned int to_store = (unsigned int) -1) const
+  { return as_array ().bfind (x, i, not_found, to_store); }
 };
 
 /*
@@ -810,15 +874,36 @@
 
   HB_NO_CREATE_COPY_ASSIGN_TEMPLATE (VarSizedBinSearchArrayOf, Type);
 
+  inline bool last_is_terminator (void) const
+  {
+    if (unlikely (!header.nUnits)) return false;
+
+    /* Gah.
+     *
+     * "The number of termination values that need to be included is table-specific.
+     * The value that indicates binary search termination is 0xFFFF." */
+    const HBUINT16 *words = &StructAtOffset<HBUINT16> (&bytesZ, (header.nUnits - 1) * header.unitSize);
+    unsigned int count = Type::TerminationWordCount;
+    for (unsigned int i = 0; i < count; i++)
+      if (words[i] != 0xFFFFu)
+        return false;
+    return true;
+  }
+
   inline const Type& operator [] (unsigned int i) const
   {
-    if (unlikely (i >= header.nUnits)) return Null (Type);
+    if (unlikely (i >= get_length ())) return Null (Type);
     return StructAtOffset<Type> (&bytesZ, i * header.unitSize);
   }
   inline Type& operator [] (unsigned int i)
   {
+    if (unlikely (i >= get_length ())) return Crap (Type);
     return StructAtOffset<Type> (&bytesZ, i * header.unitSize);
   }
+  inline unsigned int get_length (void) const
+  {
+    return header.nUnits - last_is_terminator ();
+  }
   inline unsigned int get_size (void) const
   { return header.static_size + header.nUnits * header.unitSize; }
 
@@ -842,7 +927,7 @@
   {
     TRACE_SANITIZE (this);
     if (unlikely (!sanitize_shallow (c))) return_trace (false);
-    unsigned int count = header.nUnits;
+    unsigned int count = get_length ();
     for (unsigned int i = 0; i < count; i++)
       if (unlikely (!(*this)[i].sanitize (c, base)))
 	return_trace (false);
@@ -853,7 +938,7 @@
   {
     TRACE_SANITIZE (this);
     if (unlikely (!sanitize_shallow (c))) return_trace (false);
-    unsigned int count = header.nUnits;
+    unsigned int count = get_length ();
     for (unsigned int i = 0; i < count; i++)
       if (unlikely (!(*this)[i].sanitize (c, base, user_data)))
 	return_trace (false);
@@ -864,7 +949,7 @@
   inline const Type *bsearch (const T &key) const
   {
     unsigned int size = header.unitSize;
-    int min = 0, max = (int) header.nUnits - 1;
+    int min = 0, max = (int) get_length () - 1;
     while (min <= max)
     {
       int mid = ((unsigned int) min + (unsigned int) max) / 2;

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-11-29 23:34:53 UTC (rev 49276)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-cmap-table.hh	2018-11-30 01:09:56 UTC (rev 49277)
@@ -417,6 +417,7 @@
   public:
   DEFINE_SIZE_STATIC (12);
 };
+DECLARE_NULL_NAMESPACE_BYTES (OT, CmapSubtableLongGroup);
 
 template <typename UINT>
 struct CmapSubtableTrimmed
@@ -467,10 +468,7 @@
 
   inline bool get_glyph (hb_codepoint_t codepoint, hb_codepoint_t *glyph) const
   {
-    int i = groups.bsearch (codepoint);
-    if (i == -1)
-      return false;
-    hb_codepoint_t gid = T::group_get_glyph (groups[i], codepoint);
+    hb_codepoint_t gid = T::group_get_glyph (groups.bsearch (codepoint), codepoint);
     if (!gid)
       return false;
     *glyph = gid;
@@ -517,7 +515,8 @@
 {
   static inline hb_codepoint_t group_get_glyph (const CmapSubtableLongGroup &group,
 						hb_codepoint_t u)
-  { return group.glyphID + (u - group.startCharCode); }
+  { return likely (group.startCharCode <= group.endCharCode) ?
+	   group.glyphID + (u - group.startCharCode) : 0; }
 
 
   bool serialize (hb_serialize_context_t *c,
@@ -673,16 +672,12 @@
 				    hb_codepoint_t *glyph,
 				    const void *base) const
   {
-    int i;
-    const DefaultUVS &defaults = base+defaultUVS;
-    i = defaults.bsearch (codepoint);
-    if (i != -1)
+    if ((base+defaultUVS).bfind (codepoint))
       return GLYPH_VARIANT_USE_DEFAULT;
-    const NonDefaultUVS &nonDefaults = base+nonDefaultUVS;
-    i = nonDefaults.bsearch (codepoint);
-    if (i != -1 && nonDefaults[i].glyphID)
+    const UVSMapping &nonDefault = (base+nonDefaultUVS).bsearch (codepoint);
+    if (nonDefault.glyphID)
     {
-      *glyph = nonDefaults[i].glyphID;
+      *glyph = nonDefault.glyphID;
        return GLYPH_VARIANT_FOUND;
     }
     return GLYPH_VARIANT_NOT_FOUND;
@@ -722,7 +717,7 @@
 					    hb_codepoint_t variation_selector,
 					    hb_codepoint_t *glyph) const
   {
-    return record[record.bsearch (variation_selector)].get_glyph (codepoint, glyph, this);
+    return record.bsearch (variation_selector).get_glyph (codepoint, glyph, this);
   }
 
   inline void collect_variation_selectors (hb_set_t *out) const
@@ -734,7 +729,7 @@
   inline void collect_variation_unicodes (hb_codepoint_t variation_selector,
 					  hb_set_t *out) const
   {
-    record[record.bsearch (variation_selector)].collect_unicodes (out, this);
+    record.bsearch (variation_selector).collect_unicodes (out, this);
   }
 
   inline bool sanitize (hb_sanitize_context_t *c) const
@@ -863,14 +858,6 @@
     hb_vector_t<CmapSubtableLongGroup> format12_groups;
   };
 
-  inline bool sanitize (hb_sanitize_context_t *c) const
-  {
-    TRACE_SANITIZE (this);
-    return_trace (c->check_struct (this) &&
-		  likely (version == 0) &&
-		  encodingRecord.sanitize (c, this));
-  }
-
   inline bool _create_plan (const hb_subset_plan_t *plan,
 			    subset_plan *cmap_plan) const
   {
@@ -1164,13 +1151,23 @@
     key.platformID.set (platform_id);
     key.encodingID.set (encoding_id);
 
-    int result = encodingRecord.bsearch (key);
-    if (result == -1 || !encodingRecord[result].subtable)
+    const EncodingRecord &result = encodingRecord.bsearch (key);
+    if (!result.subtable)
       return nullptr;
 
-    return &(this+encodingRecord[result].subtable);
+    return &(this+result.subtable);
   }
 
+  public:
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) &&
+		  likely (version == 0) &&
+		  encodingRecord.sanitize (c, this));
+  }
+
   protected:
   HBUINT16		version;	/* Table version number (0). */
   SortedArrayOf<EncodingRecord>

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-color-colr-table.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-color-colr-table.hh	2018-11-29 23:34:53 UTC (rev 49276)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-color-colr-table.hh	2018-11-30 01:09:56 UTC (rev 49277)
@@ -66,13 +66,6 @@
   inline int cmp (hb_codepoint_t g) const
   { return g < glyphId ? -1 : g > glyphId ? 1 : 0; }
 
-  static int cmp (const void *pa, const void *pb)
-  {
-    const hb_codepoint_t *a = (const hb_codepoint_t *) pa;
-    const BaseGlyphRecord *b = (const BaseGlyphRecord *) pb;
-    return b->cmp (*a);
-  }
-
   inline bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
@@ -103,12 +96,7 @@
 					unsigned int        *count, /* IN/OUT.  May be NULL. */
 					hb_ot_color_layer_t *layers /* OUT.     May be NULL. */) const
   {
-    const BaseGlyphRecord *rec = (BaseGlyphRecord *) bsearch (&glyph,
-							      &(this+baseGlyphsZ),
-							      numBaseGlyphs,
-							      sizeof (BaseGlyphRecord),
-							      BaseGlyphRecord::cmp);
-    const BaseGlyphRecord &record = rec ? *rec : Null (BaseGlyphRecord);
+    const BaseGlyphRecord &record = (this+baseGlyphsZ).bsearch (numBaseGlyphs, glyph);
 
     hb_array_t<const LayerRecord> all_layers ((this+layersZ).arrayZ, numLayers);
     hb_array_t<const LayerRecord> glyph_layers = all_layers.sub_array (record.firstLayerIdx,
@@ -137,7 +125,7 @@
   protected:
   HBUINT16	version;	/* Table version number (starts at 0). */
   HBUINT16	numBaseGlyphs;	/* Number of Base Glyph Records. */
-  LOffsetTo<UnsizedArrayOf<BaseGlyphRecord>, false>
+  LOffsetTo<SortedUnsizedArrayOf<BaseGlyphRecord>, false>
 		baseGlyphsZ;	/* Offset to Base Glyph records. */
   LOffsetTo<UnsizedArrayOf<LayerRecord>, false>
 		layersZ;	/* Offset to Layer Records. */

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-color-svg-table.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-color-svg-table.hh	2018-11-29 23:34:53 UTC (rev 49276)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-color-svg-table.hh	2018-11-30 01:09:56 UTC (rev 49277)
@@ -103,8 +103,7 @@
 
   inline const SVGDocumentIndexEntry &get_glyph_entry (hb_codepoint_t glyph_id) const
   {
-    const SortedArrayOf<SVGDocumentIndexEntry> &docs = this+svgDocEntries;
-    return docs[docs.bsearch (glyph_id)];
+    return (this+svgDocEntries).bsearch (glyph_id);
   }
 
   inline bool sanitize (hb_sanitize_context_t *c) const

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-face.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-face.hh	2018-11-29 23:34:53 UTC (rev 49276)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-face.hh	2018-11-30 01:09:56 UTC (rev 49277)
@@ -65,6 +65,7 @@
     HB_OT_TABLE(AAT, trak) \
     HB_OT_TABLE(AAT, lcar) \
     HB_OT_TABLE(AAT, ltag) \
+    HB_OT_TABLE(AAT, feat) \
     /* OpenType variations. */ \
     HB_OT_TABLE(OT, fvar) \
     HB_OT_TABLE(OT, avar) \

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-11-29 23:34:53 UTC (rev 49276)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-font.cc	2018-11-30 01:09:56 UTC (rev 49277)
@@ -243,7 +243,7 @@
   return vmtx.has_font_extents;
 }
 
-#ifdef HB_USE_ATEXIT
+#if HB_USE_ATEXIT
 static void free_static_ot_funcs (void);
 #endif
 
@@ -269,7 +269,7 @@
 
     hb_font_funcs_make_immutable (funcs);
 
-#ifdef HB_USE_ATEXIT
+#if HB_USE_ATEXIT
     atexit (free_static_ot_funcs);
 #endif
 
@@ -277,7 +277,7 @@
   }
 } static_ot_funcs;
 
-#ifdef HB_USE_ATEXIT
+#if HB_USE_ATEXIT
 static
 void free_static_ot_funcs (void)
 {

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-11-29 23:34:53 UTC (rev 49276)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-glyf-table.hh	2018-11-30 01:09:56 UTC (rev 49277)
@@ -56,7 +56,9 @@
   protected:
   UnsizedArrayOf<HBUINT8>	dataZ;		/* Location data. */
   public:
-  DEFINE_SIZE_ARRAY (0, dataZ);
+  DEFINE_SIZE_MIN (0); /* In reality, this is UNBOUNDED() type; but since we always
+			* check the size externally, allow Null() object of it by
+			* defining it MIN() instead. */
 };
 
 
@@ -465,7 +467,9 @@
   protected:
   UnsizedArrayOf<HBUINT8>	dataZ;		/* Glyphs data. */
   public:
-  DEFINE_SIZE_ARRAY (0, dataZ);
+  DEFINE_SIZE_MIN (0); /* In reality, this is UNBOUNDED() type; but since we always
+			* check the size externally, allow Null() object of it by
+			* defining it MIN() instead. */
 };
 
 struct glyf_accelerator_t : glyf::accelerator_t {};

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-kern-table.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-kern-table.hh	2018-11-29 23:34:53 UTC (rev 49276)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-kern-table.hh	2018-11-30 01:09:56 UTC (rev 49277)
@@ -154,7 +154,7 @@
   KernSubTableFormat3<KernSubTableHeader>	format3;
   } u;
   public:
-  DEFINE_SIZE_MIN (0);
+  DEFINE_SIZE_MIN (KernSubTableHeader::static_size);
 };
 
 
@@ -274,6 +274,15 @@
   inline bool has_data (void) const { return u.version32; }
   inline unsigned int get_type (void) const { return u.major; }
 
+  inline bool has_state_machine (void) const
+  {
+    switch (get_type ()) {
+    case 0: return u.ot.has_state_machine ();
+    case 1: return u.aat.has_state_machine ();
+    default:return false;
+    }
+  }
+
   inline bool has_cross_stream (void) const
   {
     switch (get_type ()) {

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-common.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-common.hh	2018-11-29 23:34:53 UTC (rev 49276)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-common.hh	2018-11-30 01:09:56 UTC (rev 49277)
@@ -128,15 +128,7 @@
   }
   inline bool find_index (hb_tag_t tag, unsigned int *index) const
   {
-    /* If we want to allow non-sorted data, we can lsearch(). */
-    int i = this->/*lsearch*/bsearch (tag);
-    if (i != -1) {
-      if (index) *index = i;
-      return true;
-    } else {
-      if (index) *index = Index::NOT_FOUND_INDEX;
-      return false;
-    }
+    return this->bfind (tag, index, HB_BFIND_NOT_FOUND_STORE, Index::NOT_FOUND_INDEX);
   }
 };
 
@@ -802,11 +794,11 @@
   HBUINT16	lookupFlag;		/* Lookup qualifiers */
   ArrayOf<Offset16>
 		subTable;		/* Array of SubTables */
-  HBUINT16	markFilteringSetX[VAR];	/* Index (base 0) into GDEF mark glyph sets
+/*HBUINT16	markFilteringSetX[VAR];*//* Index (base 0) into GDEF mark glyph sets
 					 * structure. This field is only present if bit
 					 * UseMarkFilteringSet of lookup flags is set. */
   public:
-  DEFINE_SIZE_ARRAY2 (6, subTable, markFilteringSetX);
+  DEFINE_SIZE_ARRAY (6, subTable);
 };
 
 typedef OffsetListOf<Lookup> LookupList;
@@ -823,8 +815,8 @@
   private:
   inline unsigned int get_coverage (hb_codepoint_t glyph_id) const
   {
-    int i = glyphArray.bsearch (glyph_id);
-    static_assert ((((unsigned int) -1) == NOT_COVERED), "");
+    unsigned int i;
+    glyphArray.bfind (glyph_id, &i, HB_BFIND_NOT_FOUND_STORE, NOT_COVERED);
     return i;
   }
 
@@ -896,12 +888,10 @@
   private:
   inline unsigned int get_coverage (hb_codepoint_t glyph_id) const
   {
-    int i = rangeRecord.bsearch (glyph_id);
-    if (i != -1) {
-      const RangeRecord &range = rangeRecord[i];
-      return (unsigned int) range.value + (glyph_id - range.start);
-    }
-    return NOT_COVERED;
+    const RangeRecord &range = rangeRecord.bsearch (glyph_id);
+    return likely (range.start <= range.end) ?
+	   (unsigned int) range.value + (glyph_id - range.start) :
+	   NOT_COVERED;
   }
 
   inline bool serialize (hb_serialize_context_t *c,
@@ -1194,10 +1184,7 @@
   private:
   inline unsigned int get_class (hb_codepoint_t glyph_id) const
   {
-    unsigned int i = (unsigned int) (glyph_id - startGlyph);
-    if (unlikely (i < classValue.len))
-      return classValue[i];
-    return 0;
+    return classValue[(unsigned int) (glyph_id - startGlyph)];
   }
 
   inline bool sanitize (hb_sanitize_context_t *c) const
@@ -1265,10 +1252,10 @@
   }
 
   protected:
-  HBUINT16	classFormat;		/* Format identifier--format = 1 */
-  GlyphID	startGlyph;		/* First GlyphID of the classValueArray */
+  HBUINT16	classFormat;	/* Format identifier--format = 1 */
+  GlyphID	startGlyph;	/* First GlyphID of the classValueArray */
   ArrayOf<HBUINT16>
-		classValue;		/* Array of Class Values--one per GlyphID */
+		classValue;	/* Array of Class Values--one per GlyphID */
   public:
   DEFINE_SIZE_ARRAY (6, classValue);
 };
@@ -1280,10 +1267,7 @@
   private:
   inline unsigned int get_class (hb_codepoint_t glyph_id) const
   {
-    int i = rangeRecord.bsearch (glyph_id);
-    if (unlikely (i != -1))
-      return rangeRecord[i].value;
-    return 0;
+    return rangeRecord.bsearch (glyph_id).value;
   }
 
   inline bool sanitize (hb_sanitize_context_t *c) const
@@ -1568,9 +1552,9 @@
   HBUINT16		itemCount;
   HBUINT16		shortCount;
   ArrayOf<HBUINT16>	regionIndices;
-  UnsizedArrayOf<HBUINT8>bytesX;
+/*UnsizedArrayOf<HBUINT8>bytesX;*/
   public:
-  DEFINE_SIZE_ARRAY2 (6, regionIndices, bytesX);
+  DEFINE_SIZE_ARRAY (6, regionIndices);
 };
 
 struct VariationStore

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-11-29 23:34:53 UTC (rev 49276)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-gdef-table.hh	2018-11-30 01:09:56 UTC (rev 49277)
@@ -61,9 +61,10 @@
 
     const AttachPoint &points = this+attachPoint[index];
 
-    if (point_count) {
-      const HBUINT16 *array = points.sub_array (start_offset, point_count);
-      unsigned int count = *point_count;
+    if (point_count)
+    {
+      hb_array_t<const HBUINT16> array = points.sub_array (start_offset, point_count);
+      unsigned int count = array.len;
       for (unsigned int i = 0; i < count; i++)
 	point_array[i] = array[i];
     }
@@ -216,9 +217,10 @@
 				      unsigned int *caret_count /* IN/OUT */,
 				      hb_position_t *caret_array /* OUT */) const
   {
-    if (caret_count) {
-      const OffsetTo<CaretValue> *array = carets.sub_array (start_offset, caret_count);
-      unsigned int count = *caret_count;
+    if (caret_count)
+    {
+      hb_array_t <const OffsetTo<CaretValue> > array = carets.sub_array (start_offset, caret_count);
+      unsigned int count = array.len;
       for (unsigned int i = 0; i < count; i++)
 	caret_array[i] = (this+array[i]).get_caret_value (font, direction, glyph_id, var_store);
     }
@@ -406,9 +408,20 @@
     }
   }
 
+  HB_INTERNAL bool is_blacklisted (hb_blob_t *blob,
+				   hb_face_t *face) const;
+
   struct accelerator_t
   {
-    HB_INTERNAL void init (hb_face_t *face);
+    inline void init (hb_face_t *face)
+    {
+      this->table = hb_sanitize_context_t().reference_table<GDEF> (face);
+      if (unlikely (this->table->is_blacklisted (this->table.get_blob (), face)))
+      {
+	hb_blob_destroy (this->table.get_blob ());
+	this->table = hb_blob_get_empty ();
+      }
+    }
 
     inline void fini (void)
     {

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-11-29 23:34:53 UTC (rev 49276)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-gpos-table.hh	2018-11-30 01:09:56 UTC (rev 49277)
@@ -1643,6 +1643,9 @@
   inline bool sanitize (hb_sanitize_context_t *c) const
   { return GSUBGPOS::sanitize<PosLookup> (c); }
 
+  HB_INTERNAL bool is_blacklisted (hb_blob_t *blob,
+				   hb_face_t *face) const;
+
   typedef GSUBGPOS::accelerator_t<GPOS> accelerator_t;
 };
 

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-11-29 23:34:53 UTC (rev 49276)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-gsub-table.hh	2018-11-30 01:09:56 UTC (rev 49277)
@@ -1449,7 +1449,10 @@
 
     hb_closure_context_t::return_t ret = dispatch_recurse_func (c, lookup_index);
 
-    c->flush ();
+    /* While in theory we should flush here, it will cause timeouts because a recursive
+     * lookup can keep growing the glyph set.  Skip, and outer loop will retry up to
+     * HB_CLOSURE_MAX_STAGES time, which should be enough for every realistic font. */
+    //c->flush ();
 
     return ret;
   }
@@ -1483,6 +1486,9 @@
   inline bool sanitize (hb_sanitize_context_t *c) const
   { return GSUBGPOS::sanitize<SubstLookup> (c); }
 
+  HB_INTERNAL bool is_blacklisted (hb_blob_t *blob,
+				   hb_face_t *face) const;
+
   typedef GSUBGPOS::accelerator_t<GSUB> accelerator_t;
 };
 

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-gsubgpos.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-gsubgpos.hh	2018-11-29 23:34:53 UTC (rev 49276)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout-gsubgpos.hh	2018-11-30 01:09:56 UTC (rev 49277)
@@ -2753,6 +2753,11 @@
     inline void init (hb_face_t *face)
     {
       this->table = hb_sanitize_context_t().reference_table<T> (face);
+      if (unlikely (this->table->is_blacklisted (this->table.get_blob (), face)))
+      {
+	hb_blob_destroy (this->table.get_blob ());
+	this->table = hb_blob_get_empty ();
+      }
 
       this->lookup_count = table->get_lookup_count ();
 

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-11-29 23:34:53 UTC (rev 49276)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout.cc	2018-11-30 01:09:56 UTC (rev 49277)
@@ -34,15 +34,17 @@
 #include "hb-ot-map.hh"
 #include "hb-map.hh"
 
+#include "hb-ot-kern-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-base-table.hh" // Just so we compile it; unused otherwise
 #include "hb-ot-layout-jstf-table.hh" // Just so we compile it; unused otherwise
-#include "hb-ot-kern-table.hh"
 #include "hb-ot-name-table.hh"
+#include "hb-ot-os2-table.hh"
 
 #include "hb-aat-layout-lcar-table.hh"
+#include "hb-aat-layout-morx-table.hh"
 
 
 /**
@@ -66,6 +68,12 @@
 }
 
 bool
+hb_ot_layout_has_machine_kerning (hb_face_t *face)
+{
+  return face->table.kern->has_state_machine ();
+}
+
+bool
 hb_ot_layout_has_cross_kerning (hb_face_t *face)
 {
   return face->table.kern->has_cross_stream ();
@@ -89,10 +97,9 @@
  * GDEF
  */
 
-static bool
-_hb_ot_blacklist_gdef (unsigned int gdef_len,
-		       unsigned int gsub_len,
-		       unsigned int gpos_len)
+bool
+OT::GDEF::is_blacklisted (hb_blob_t *blob,
+			  hb_face_t *face) const
 {
   /* The ugly business of blacklisting individual fonts' tables happen here!
    * See this thread for why we finally had to bend in and do this:
@@ -111,8 +118,10 @@
    *     https://bugzilla.mozilla.org/show_bug.cgi?id=1279693
    *     https://bugzilla.mozilla.org/show_bug.cgi?id=1279875
    */
-#define ENCODE(x,y,z) ((int64_t) (x) << 32 | (int64_t) (y) << 16 | (z))
-  switch ENCODE(gdef_len, gsub_len, gpos_len)
+#define ENCODE(x,y,z) (((uint64_t) (x) << 48) | ((uint64_t) (y) << 24) | (uint64_t) (z))
+  switch ENCODE(blob->length,
+		face->table.GSUB->table.get_length (),
+		face->table.GPOS->table.get_length ())
   {
     /* sha1sum:c5ee92f0bca4bfb7d06c4d03e8cf9f9cf75d2e8a Windows 7? timesi.ttf */
     case ENCODE (442, 2874, 42038):
@@ -191,20 +200,6 @@
   return false;
 }
 
-void
-OT::GDEF::accelerator_t::init (hb_face_t *face)
-{
-  this->table = hb_sanitize_context_t().reference_table<GDEF> (face);
-
-  if (unlikely (_hb_ot_blacklist_gdef (this->table.get_length (),
-				       face->table.GSUB->table.get_length (),
-				       face->table.GPOS->table.get_length ())))
-  {
-    hb_blob_destroy (this->table.get_blob ());
-    this->table = hb_blob_get_empty ();
-  }
-}
-
 static void
 _hb_ot_layout_set_glyph_props (hb_font_t *font,
 			       hb_buffer_t *buffer)
@@ -291,6 +286,38 @@
  * GSUB/GPOS
  */
 
+bool
+OT::GSUB::is_blacklisted (hb_blob_t *blob HB_UNUSED,
+			  hb_face_t *face) const
+{
+  /* Mac OS X prefers morx over GSUB.  It also ships with various Indic fonts,
+   * all by 'MUTF' foundry (Tamil MN, Tamil Sangam MN, etc.), that have broken
+   * GSUB/GPOS tables.  Some have GSUB with zero scripts, those are ignored by
+   * our morx/GSUB preference code.  But if GSUB has non-zero scripts, we tend
+   * to prefer it over morx because we want to be consistent with other OpenType
+   * shapers.
+   *
+   * To work around broken Indic Mac system fonts, we ignore GSUB table if
+   * OS/2 VendorId is 'MUTF' and font has morx table as well.
+   *
+   * https://github.com/harfbuzz/harfbuzz/issues/1410
+   * https://github.com/harfbuzz/harfbuzz/issues/1348
+   * https://github.com/harfbuzz/harfbuzz/issues/1391
+   */
+  if (unlikely (face->table.OS2->achVendID == HB_TAG ('M','U','T','F') &&
+		face->table.morx->has_data ()))
+    return true;
+
+  return false;
+}
+
+bool
+OT::GPOS::is_blacklisted (hb_blob_t *blob HB_UNUSED,
+			  hb_face_t *face HB_UNUSED) const
+{
+  return false;
+}
+
 static const OT::GSUBGPOS&
 get_gsubgpos_table (hb_face_t *face,
 		    hb_tag_t   table_tag)

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout.hh	2018-11-29 23:34:53 UTC (rev 49276)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-layout.hh	2018-11-30 01:09:56 UTC (rev 49277)
@@ -49,6 +49,9 @@
 hb_ot_layout_has_kerning (hb_face_t *face);
 
 HB_INTERNAL bool
+hb_ot_layout_has_machine_kerning (hb_face_t *face);
+
+HB_INTERNAL bool
 hb_ot_layout_has_cross_kerning (hb_face_t *face);
 
 HB_INTERNAL void

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-map.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-map.hh	2018-11-29 23:34:53 UTC (rev 49276)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-map.hh	2018-11-30 01:09:56 UTC (rev 49277)
@@ -57,8 +57,8 @@
     unsigned int auto_zwj : 1;
     unsigned int random : 1;
 
-    inline int cmp (const hb_tag_t *tag_) const
-    { return *tag_ < tag ? -1 : *tag_ > tag ? 1 : 0; }
+    inline int cmp (const hb_tag_t tag_) const
+    { return tag_ < tag ? -1 : tag_ > tag ? 1 : 0; }
   };
 
   struct lookup_map_t {

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-math-table.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-math-table.hh	2018-11-29 23:34:53 UTC (rev 49276)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-math-table.hh	2018-11-30 01:09:56 UTC (rev 49277)
@@ -509,9 +509,8 @@
     if (parts_count)
     {
       int scale = font->dir_scale (direction);
-      const MathGlyphPartRecord *arr =
-	    partRecords.sub_array (start_offset, parts_count);
-      unsigned int count = *parts_count;
+      hb_array_t<const MathGlyphPartRecord> arr = partRecords.sub_array (start_offset, parts_count);
+      unsigned int count = arr.len;
       for (unsigned int i = 0; i < count; i++)
 	arr[i].extract (parts[i], scale, font);
     }
@@ -556,9 +555,8 @@
     if (variants_count)
     {
       int scale = font->dir_scale (direction);
-      const MathGlyphVariantRecord *arr =
-	    mathGlyphVariantRecord.sub_array (start_offset, variants_count);
-      unsigned int count = *variants_count;
+      hb_array_t<const MathGlyphVariantRecord> arr = mathGlyphVariantRecord.sub_array (start_offset, variants_count);
+      unsigned int count = arr.len;
       for (unsigned int i = 0; i < count; i++)
       {
 	variants[i].glyph = arr[i].variantGlyph;

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-post-table.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-post-table.hh	2018-11-29 23:34:53 UTC (rev 49276)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-post-table.hh	2018-11-30 01:09:56 UTC (rev 49277)
@@ -61,12 +61,12 @@
   ArrayOf<HBUINT16>	glyphNameIndex;	/* This is not an offset, but is the
 					 * ordinal number of the glyph in 'post'
 					 * string tables. */
-  UnsizedArrayOf<HBUINT8>
-			namesX;		/* Glyph names with length bytes [variable]
+/*UnsizedArrayOf<HBUINT8>
+			namesX;*/	/* Glyph names with length bytes [variable]
 					 * (a Pascal string). */
 
   public:
-  DEFINE_SIZE_ARRAY2 (2, glyphNameIndex, namesX);
+  DEFINE_SIZE_ARRAY (2, glyphNameIndex);
 };
 
 struct post

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-11-29 23:34:53 UTC (rev 49276)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-myanmar.cc	2018-11-30 01:09:56 UTC (rev 49277)
@@ -391,27 +391,6 @@
 };
 
 
-/* Uniscribe seems to have a shaper for 'mymr' that is like the
- * generic shaper, except that it zeros mark advances GDEF_LATE. */
-const hb_ot_complex_shaper_t _hb_ot_complex_shaper_myanmar_old =
-{
-  nullptr, /* collect_features */
-  nullptr, /* override_features */
-  nullptr, /* data_create */
-  nullptr, /* data_destroy */
-  nullptr, /* preprocess_text */
-  nullptr, /* postprocess_glyphs */
-  HB_OT_SHAPE_NORMALIZATION_MODE_DEFAULT,
-  nullptr, /* decompose */
-  nullptr, /* compose */
-  nullptr, /* setup_masks */
-  HB_TAG_NONE, /* gpos_tag */
-  nullptr, /* reorder_marks */
-  HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_LATE,
-  true, /* fallback_position */
-};
-
-
 /* Ugly Zawgyi encoding.
  * Disable all auto processing.
  * https://github.com/harfbuzz/harfbuzz/issues/1162 */

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-11-29 23:34:53 UTC (rev 49276)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-use-table.cc	2018-11-30 01:09:56 UTC (rev 49277)
@@ -544,7 +544,7 @@
   /* 11190 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 111A0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,
   /* 111B0 */     B,     B,     B,  VPst,  VPre,  VPst,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VBlw,  VAbv,  VAbv,  VAbv,  VAbv,
-  /* 111C0 */     H,     B,     R,     R,     O,     O,     O,     O,     O,    FM, CMBlw,  VAbv,  VBlw,     O,     O,     O,
+  /* 111C0 */     H,     B,     R,     R,     O,     O,     O,     O,    GB,  FBlw, CMBlw,  VAbv,  VBlw,     O,     O,     O,
   /* 111D0 */     B,     B,     B,     B,     B,     B,     B,     B,     B,     B,     O,     O,     O,     O,     O,     O,
 
   /* Sinhala Archaic Numbers */

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-11-29 23:34:53 UTC (rev 49276)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex-use.cc	2018-11-30 01:09:56 UTC (rev 49277)
@@ -432,7 +432,8 @@
 static inline bool
 is_halant (const hb_glyph_info_t &info)
 {
-  return info.use_category() == USE_H && !_hb_glyph_info_ligated (&info);
+  return (info.use_category() == USE_H || info.use_category() == USE_HVM) &&
+	 !_hb_glyph_info_ligated (&info);
 }
 
 static void
@@ -449,19 +450,38 @@
 
   hb_glyph_info_t *info = buffer->info;
 
-#define BASE_FLAGS (FLAG (USE_B) | FLAG (USE_GB))
+#define POST_BASE_FLAGS64 (FLAG64 (USE_FM) | \
+			   FLAG64 (USE_FAbv) | \
+			   FLAG64 (USE_FBlw) | \
+			   FLAG64 (USE_FPst) | \
+			   FLAG64 (USE_MAbv) | \
+			   FLAG64 (USE_MBlw) | \
+			   FLAG64 (USE_MPst) | \
+			   FLAG64 (USE_MPre) | \
+			   FLAG64 (USE_VAbv) | \
+			   FLAG64 (USE_VBlw) | \
+			   FLAG64 (USE_VPst) | \
+			   FLAG64 (USE_VPre) | \
+			   FLAG64 (USE_VMAbv) | \
+			   FLAG64 (USE_VMBlw) | \
+			   FLAG64 (USE_VMPst) | \
+			   FLAG64 (USE_VMPre))
 
   /* Move things forward. */
   if (info[start].use_category() == USE_R && end - start > 1)
   {
-    /* Got a repha.  Reorder it to after first base, before first halant. */
+    /* Got a repha.  Reorder it towards the end, but before the first post-base
+     * glyph. */
     for (unsigned int i = start + 1; i < end; i++)
-      if ((FLAG_UNSAFE (info[i].use_category()) & (BASE_FLAGS)) || is_halant (info[i]))
+    {
+      bool is_post_base_glyph = (FLAG64_UNSAFE (info[i].use_category()) & POST_BASE_FLAGS64) ||
+				is_halant (info[i]);
+      if (is_post_base_glyph || i == end - 1)
       {
-	/* If we hit a halant, move before it; otherwise it's a base: move to it's
-	 * place, and shift things in between backward. */
+	/* If we hit a post-base glyph, move before it; otherwise move to the
+	 * end. Shift things in between backward. */
 
-	if (is_halant (info[i]))
+	if (is_post_base_glyph)
 	  i--;
 
 	buffer->merge_clusters (start, i + 1);
@@ -471,21 +491,19 @@
 
 	break;
       }
+    }
   }
 
   /* Move things back. */
-  unsigned int j = end;
+  unsigned int j = start;
   for (unsigned int i = start; i < end; i++)
   {
     uint32_t flag = FLAG_UNSAFE (info[i].use_category());
-    if ((flag & (BASE_FLAGS)) || is_halant (info[i]))
+    if (is_halant (info[i]))
     {
-      /* If we hit a halant, move after it; otherwise it's a base: move to it's
-       * place, and shift things in between backward. */
-      if (is_halant (info[i]))
-	j = i + 1;
-      else
-	j = i;
+      /* If we hit a halant, move after it; otherwise move to the beginning, and
+       * shift things in between forward. */
+      j = i + 1;
     }
     else if (((flag) & (FLAG (USE_VPre) | FLAG (USE_VMPre))) &&
 	     /* Only move the first component of a MultipleSubst. */

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex.hh	2018-11-29 23:34:53 UTC (rev 49276)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape-complex.hh	2018-11-30 01:09:56 UTC (rev 49277)
@@ -57,7 +57,6 @@
   HB_COMPLEX_SHAPER_IMPLEMENT (indic) \
   HB_COMPLEX_SHAPER_IMPLEMENT (khmer) \
   HB_COMPLEX_SHAPER_IMPLEMENT (myanmar) \
-  HB_COMPLEX_SHAPER_IMPLEMENT (myanmar_old) \
   HB_COMPLEX_SHAPER_IMPLEMENT (myanmar_zawgyi) \
   HB_COMPLEX_SHAPER_IMPLEMENT (thai) \
   HB_COMPLEX_SHAPER_IMPLEMENT (use) \
@@ -269,14 +268,27 @@
 	return &_hb_ot_complex_shaper_khmer;
 
     case HB_SCRIPT_MYANMAR:
-      if (planner->map.chosen_script[0] == HB_TAG ('m','y','m','2'))
+      /* If the designer designed the font for the 'DFLT' script,
+       * (or we ended up arbitrarily pick 'latn'), use the default shaper.
+       * Otherwise, use the specific shaper.
+       *
+       * If designer designed for 'mymr' tag, also send to default
+       * shaper.  That's tag used from before Myanmar shaping spec
+       * was developed.  The shaping spec uses 'mym2' tag. */
+      if (planner->map.chosen_script[0] == HB_TAG ('D','F','L','T') ||
+	  planner->map.chosen_script[0] == HB_TAG ('l','a','t','n') ||
+	  planner->map.chosen_script[0] == HB_TAG ('m','y','m','r'))
+	return &_hb_ot_complex_shaper_default;
+      else
 	return &_hb_ot_complex_shaper_myanmar;
-      else if (planner->map.chosen_script[0] == HB_TAG ('m','y','m','r'))
-	return &_hb_ot_complex_shaper_myanmar_old;
-      else
-	return &_hb_ot_complex_shaper_default;
 
 
+    /* https://github.com/harfbuzz/harfbuzz/issues/1162 */
+    case HB_SCRIPT_MYANMAR_ZAWGYI:
+
+      return &_hb_ot_complex_shaper_myanmar_zawgyi;
+
+
     /* Unicode-2.0 additions */
     case HB_SCRIPT_TIBETAN:
 
@@ -375,10 +387,6 @@
 	return &_hb_ot_complex_shaper_default;
       else
 	return &_hb_ot_complex_shaper_use;
-
-    /* https://github.com/harfbuzz/harfbuzz/issues/1162 */
-    case HB_SCRIPT_MYANMAR_ZAWGYI:
-      return &_hb_ot_complex_shaper_myanmar_zawgyi;
   }
 }
 

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-11-29 23:34:53 UTC (rev 49276)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape.cc	2018-11-30 01:09:56 UTC (rev 49277)
@@ -76,11 +76,17 @@
 						props (*props),
 						map (face, props),
 						aat_map (face, props),
-						apply_morx (_hb_apply_morx (face)),
-						shaper (apply_morx ?
-						        &_hb_ot_complex_shaper_default :
-							hb_ot_shape_complex_categorize (this)) {}
+						apply_morx (_hb_apply_morx (face))
+{
+  shaper = hb_ot_shape_complex_categorize (this);
 
+  script_zero_marks = shaper->zero_width_marks != HB_OT_SHAPE_ZERO_WIDTH_MARKS_NONE;
+  script_fallback_mark_positioning = shaper->fallback_position;
+
+  if (apply_morx)
+    shaper = &_hb_ot_complex_shaper_default;
+}
+
 void
 hb_ot_shape_planner_t::compile (hb_ot_shape_plan_t           &plan,
 				const hb_ot_shape_plan_key_t &key)
@@ -140,11 +146,18 @@
       plan.apply_kern = true;
   }
 
-  bool has_kern_mark = plan.apply_kern && hb_ot_layout_has_cross_kerning (face);
-  plan.zero_marks = !plan.apply_morx && !plan.apply_kerx && !has_kern_mark;
+  plan.zero_marks = script_zero_marks &&
+		    !plan.apply_kerx &&
+		    (!plan.apply_kern || !hb_ot_layout_has_machine_kerning (face));
   plan.has_gpos_mark = !!plan.map.get_1_mask (HB_TAG ('m','a','r','k'));
-  plan.fallback_mark_positioning = !plan.apply_gpos && plan.zero_marks;
 
+  plan.adjust_mark_positioning_when_zeroing = !plan.apply_gpos &&
+					      !plan.apply_kerx &&
+					      (!plan.apply_kern || !hb_ot_layout_has_cross_kerning (face));
+
+  plan.fallback_mark_positioning = plan.adjust_mark_positioning_when_zeroing &&
+				   script_fallback_mark_positioning;
+
   /* Currently we always apply trak. */
   plan.apply_trak = plan.requested_tracking && hb_aat_layout_has_tracking (face);
 }
@@ -158,6 +171,7 @@
 
   hb_ot_shape_planner_t planner (face,
 				 &key->props);
+
   hb_ot_shape_collect_features (&planner,
 				key->user_features,
 				key->num_user_features);
@@ -811,17 +825,16 @@
   hb_glyph_info_t *info = c->buffer->info;
   hb_glyph_position_t *pos = c->buffer->pos;
 
-  /* If the font has no GPOS, AND, no fallback positioning will
-   * happen, AND, direction is forward, then when zeroing mark
-   * widths, we shift the mark with it, such that the mark
-   * is positioned hanging over the previous glyph.  When
+  /* If the font has no GPOS and direction is forward, then when
+   * zeroing mark widths, we shift the mark with it, such that the
+   * mark is positioned hanging over the previous glyph.  When
    * direction is backward we don't shift and it will end up
    * hanging over the next glyph after the final reordering.
-   * If fallback positinoing happens or GPOS is present, we don't
-   * care.
+   *
+   * Note: If fallback positinoing happens, we don't care about
+   * this as it will be overriden.
    */
-  bool adjust_offsets_when_zeroing = c->plan->fallback_mark_positioning &&
-				     !c->plan->shaper->fallback_position &&
+  bool adjust_offsets_when_zeroing = c->plan->adjust_mark_positioning_when_zeroing &&
 				     HB_DIRECTION_IS_FORWARD (c->buffer->props.direction);
 
   /* We change glyph origin to what GPOS expects (horizontal), apply GPOS, change it back. */
@@ -877,7 +890,7 @@
 					&pos[i].x_offset,
 					&pos[i].y_offset);
 
-  if (c->plan->fallback_mark_positioning && c->plan->shaper->fallback_position)
+  if (c->plan->fallback_mark_positioning)
     _hb_ot_shape_fallback_mark_position (c->plan, c->font, c->buffer);
 }
 

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape.hh	2018-11-29 23:34:53 UTC (rev 49276)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-shape.hh	2018-11-30 01:09:56 UTC (rev 49277)
@@ -77,6 +77,7 @@
   bool zero_marks : 1;
   bool fallback_glyph_classes : 1;
   bool fallback_mark_positioning : 1;
+  bool adjust_mark_positioning_when_zeroing : 1;
 
   bool apply_gpos : 1;
   bool apply_kerx : 1;
@@ -113,6 +114,8 @@
   hb_ot_map_builder_t map;
   hb_aat_map_builder_t aat_map;
   bool apply_morx : 1;
+  bool script_zero_marks : 1;
+  bool script_fallback_mark_positioning : 1;
   const struct hb_ot_complex_shaper_t *shaper;
 
   HB_INTERNAL hb_ot_shape_planner_t (hb_face_t                     *face,

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-var-fvar-table.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-var-fvar-table.hh	2018-11-29 23:34:53 UTC (rev 49276)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-var-fvar-table.hh	2018-11-30 01:09:56 UTC (rev 49277)
@@ -42,6 +42,11 @@
 
 struct InstanceRecord
 {
+  friend struct fvar;
+
+  inline hb_array_t<const Fixed> get_coordinates (unsigned int axis_count) const
+  { return coordinatesZ.as_array (axis_count); }
+
   inline bool sanitize (hb_sanitize_context_t *c, unsigned int axis_count) const
   {
     TRACE_SANITIZE (this);
@@ -52,7 +57,7 @@
   protected:
   NameID	subfamilyNameID;/* The name ID for entries in the 'name' table
 				 * that provide subfamily names for this instance. */
-  HBUINT16	reserved;	/* Reserved for future use — set to 0. */
+  HBUINT16	flags;		/* Reserved for future use — set to 0. */
   UnsizedArrayOf<Fixed>
 		coordinatesZ;	/* The coordinates array for this instance. */
   //NameID	postScriptNameIDX;/*Optional. The name ID for entries in the 'name'
@@ -60,11 +65,16 @@
   //				  * instance. */
 
   public:
-  DEFINE_SIZE_ARRAY (4, coordinatesZ);
+  DEFINE_SIZE_UNBOUNDED (4);
 };
 
 struct AxisRecord
 {
+  enum
+  {
+    AXIS_FLAG_HIDDEN	= 0x0001,
+  };
+
   inline bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
@@ -76,7 +86,7 @@
   Fixed		minValue;	/* The minimum coordinate value for the axis. */
   Fixed		defaultValue;	/* The default coordinate value for the axis. */
   Fixed		maxValue;	/* The maximum coordinate value for the axis. */
-  HBUINT16	reserved;	/* Reserved for future use — set to 0. */
+  HBUINT16	flags;		/* Axis flags. */
   NameID	axisNameID;	/* The name ID for entries in the 'name' table that
 				 * provide a display name for this axis. */
 
@@ -96,42 +106,71 @@
     return_trace (version.sanitize (c) &&
 		  likely (version.major == 1) &&
 		  c->check_struct (this) &&
+		  axisSize == 20 && /* Assumed in our code. */
 		  instanceSize >= axisCount * 4 + 4 &&
-		  axisSize <= 1024 && /* Arbitrary, just to simplify overflow checks. */
-		  instanceSize <= 1024 && /* Arbitrary, just to simplify overflow checks. */
-		  c->check_range (this, things) &&
-		  c->check_range (&StructAtOffset<char> (this, things),
-				  axisCount * axisSize + instanceCount * instanceSize));
+		  get_axes ().sanitize (c) &&
+		  c->check_range (get_instance (0), instanceCount, instanceSize));
   }
 
   inline unsigned int get_axis_count (void) const
   { return axisCount; }
 
-  inline bool get_axis (unsigned int index, hb_ot_var_axis_t *info) const
+  inline void get_axis_deprecated (unsigned int axis_index,
+				   hb_ot_var_axis_t *info) const
   {
-    if (unlikely (index >= axisCount))
-      return false;
+    const AxisRecord &axis = get_axes ()[axis_index];
+    info->tag = axis.axisTag;
+    info->name_id =  axis.axisNameID;
+    info->default_value = axis.defaultValue / 65536.;
+    /* Ensure order, to simplify client math. */
+    info->min_value = MIN<float> (info->default_value, axis.minValue / 65536.);
+    info->max_value = MAX<float> (info->default_value, axis.maxValue / 65536.);
+  }
 
-    if (info)
+  inline void get_axis_info (unsigned int axis_index,
+			     hb_ot_var_axis_info_t *info) const
+  {
+    const AxisRecord &axis = get_axes ()[axis_index];
+    info->axis_index = axis_index;
+    info->tag = axis.axisTag;
+    info->name_id =  axis.axisNameID;
+    info->flags = (hb_ot_var_axis_flags_t) (unsigned int) axis.flags;
+    info->default_value = axis.defaultValue / 65536.;
+    /* Ensure order, to simplify client math. */
+    info->min_value = MIN<float> (info->default_value, axis.minValue / 65536.);
+    info->max_value = MAX<float> (info->default_value, axis.maxValue / 65536.);
+    info->reserved = 0;
+  }
+
+  inline unsigned int get_axes_deprecated (unsigned int      start_offset,
+					   unsigned int     *axes_count /* IN/OUT */,
+					   hb_ot_var_axis_t *axes_array /* OUT */) const
+  {
+    if (axes_count)
     {
-      const AxisRecord &axis = get_axes ()[index];
-      info->tag = axis.axisTag;
-      info->name_id =  axis.axisNameID;
-      info->default_value = axis.defaultValue / 65536.;
-      /* Ensure order, to simplify client math. */
-      info->min_value = MIN<float> (info->default_value, axis.minValue / 65536.);
-      info->max_value = MAX<float> (info->default_value, axis.maxValue / 65536.);
+      /* TODO Rewrite as hb_array_t<>::sub-array() */
+      unsigned int count = axisCount;
+      start_offset = MIN (start_offset, count);
+
+      count -= start_offset;
+      axes_array += start_offset;
+
+      count = MIN (count, *axes_count);
+      *axes_count = count;
+
+      for (unsigned int i = 0; i < count; i++)
+	get_axis_deprecated (start_offset + i, axes_array + i);
     }
-
-    return true;
+    return axisCount;
   }
 
-  inline unsigned int get_axis_infos (unsigned int      start_offset,
-				      unsigned int     *axes_count /* IN/OUT */,
-				      hb_ot_var_axis_t *axes_array /* OUT */) const
+  inline unsigned int get_axis_infos (unsigned int           start_offset,
+				      unsigned int          *axes_count /* IN/OUT */,
+				      hb_ot_var_axis_info_t *axes_array /* OUT */) const
   {
     if (axes_count)
     {
+      /* TODO Rewrite as hb_array_t<>::sub-array() */
       unsigned int count = axisCount;
       start_offset = MIN (start_offset, count);
 
@@ -142,12 +181,14 @@
       *axes_count = count;
 
       for (unsigned int i = 0; i < count; i++)
-	get_axis (start_offset + i, axes_array + i);
+	get_axis_info (start_offset + i, axes_array + i);
     }
     return axisCount;
   }
 
-  inline bool find_axis (hb_tag_t tag, unsigned int *index, hb_ot_var_axis_t *info) const
+  inline bool find_axis_deprecated (hb_tag_t tag,
+				    unsigned int *axis_index,
+				    hb_ot_var_axis_t *info) const
   {
     const AxisRecord *axes = get_axes ();
     unsigned int count = get_axis_count ();
@@ -154,20 +195,34 @@
     for (unsigned int i = 0; i < count; i++)
       if (axes[i].axisTag == tag)
       {
-        if (index)
-	  *index = i;
-	return get_axis (i, info);
+        if (axis_index)
+	  *axis_index = i;
+	get_axis_deprecated (i, info);
+	return true;
       }
-    if (index)
-      *index = HB_OT_VAR_NO_AXIS_INDEX;
+    if (axis_index)
+      *axis_index = HB_OT_VAR_NO_AXIS_INDEX;
     return false;
   }
 
+  inline bool find_axis_info (hb_tag_t tag,
+			      hb_ot_var_axis_info_t *info) const
+  {
+    const AxisRecord *axes = get_axes ();
+    unsigned int count = get_axis_count ();
+    for (unsigned int i = 0; i < count; i++)
+      if (axes[i].axisTag == tag)
+      {
+	get_axis_info (i, info);
+	return true;
+      }
+    return false;
+  }
+
   inline int normalize_axis_value (unsigned int axis_index, float v) const
   {
-    hb_ot_var_axis_t axis;
-    if (!get_axis (axis_index, &axis))
-      return 0;
+    hb_ot_var_axis_info_t axis;
+    get_axis_info (axis_index, &axis);
 
     v = MAX (MIN (v, axis.max_value), axis.min_value); /* Clamp. */
 
@@ -180,17 +235,63 @@
     return (int) (v * 16384.f + (v >= 0.f ? .5f : -.5f));
   }
 
+  inline unsigned int get_instance_count (void) const
+  { return instanceCount; }
+
+  inline hb_ot_name_id_t get_instance_subfamily_name_id (unsigned int instance_index) const
+  {
+    const InstanceRecord *instance = get_instance (instance_index);
+    if (unlikely (!instance)) return HB_OT_NAME_ID_INVALID;
+    return instance->subfamilyNameID;
+  }
+
+  inline hb_ot_name_id_t get_instance_postscript_name_id (unsigned int instance_index) const
+  {
+    const InstanceRecord *instance = get_instance (instance_index);
+    if (unlikely (!instance)) return HB_OT_NAME_ID_INVALID;
+    if (instanceSize >= axisCount * 4 + 6)
+      return StructAfter<NameID> (instance->get_coordinates (axisCount));
+    return HB_OT_NAME_ID_INVALID;
+  }
+
+  inline unsigned int get_instance_coords (unsigned int  instance_index,
+					   unsigned int *coords_length, /* IN/OUT */
+					   float        *coords         /* OUT */) const
+  {
+    const InstanceRecord *instance = get_instance (instance_index);
+    if (unlikely (!instance))
+    {
+      if (coords_length)
+        *coords_length = 0;
+      return 0;
+    }
+
+    if (coords_length && *coords_length)
+    {
+      hb_array_t<const Fixed> instanceCoords = instance->get_coordinates (axisCount)
+							 .sub_array (0, *coords_length);
+      for (unsigned int i = 0; i < instanceCoords.len; i++)
+        coords[i] = instanceCoords.arrayZ[i].to_float ();
+    }
+    return axisCount;
+  }
+
   protected:
-  inline const AxisRecord * get_axes (void) const
-  { return &StructAtOffset<AxisRecord> (this, things); }
+  inline hb_array_t<const AxisRecord> get_axes (void) const
+  { return hb_array (&(this+firstAxis), axisCount); }
 
-  inline const InstanceRecord * get_instances (void) const
-  { return &StructAtOffset<InstanceRecord> (get_axes () + axisCount, 0); }
+  inline const InstanceRecord *get_instance (unsigned int i) const
+  {
+    if (unlikely (i >= instanceCount)) return nullptr;
+   return &StructAtOffset<InstanceRecord> (&StructAfter<InstanceRecord> (get_axes ()),
+					   i * instanceSize);
+  }
 
   protected:
   FixedVersion<>version;	/* Version of the fvar table
 				 * initially set to 0x00010000u */
-  Offset16	things;		/* Offset in bytes from the beginning of the table
+  OffsetTo<AxisRecord>
+		firstAxis;	/* Offset in bytes from the beginning of the table
 				 * to the start of the AxisRecord array. */
   HBUINT16	reserved;	/* This field is permanently reserved. Set to 2. */
   HBUINT16	axisCount;	/* The number of variation axes in the font (the

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-var.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-var.cc	2018-11-29 23:34:53 UTC (rev 49276)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-var.cc	2018-11-30 01:09:56 UTC (rev 49277)
@@ -53,7 +53,6 @@
  * @face: #hb_face_t to test
  *
  * This function allows to verify the presence of OpenType variation data on the face.
- * Alternatively, use hb_ot_var_get_axis_count().
  *
  * Return value: true if face has a `fvar' table and false otherwise
  *
@@ -80,6 +79,7 @@
  * hb_ot_var_get_axes:
  *
  * Since: 1.4.2
+ * Deprecated: 2.2.0
  **/
 unsigned int
 hb_ot_var_get_axes (hb_face_t        *face,
@@ -87,7 +87,7 @@
 		    unsigned int     *axes_count /* IN/OUT */,
 		    hb_ot_var_axis_t *axes_array /* OUT */)
 {
-  return face->table.fvar->get_axis_infos (start_offset, axes_count, axes_array);
+  return face->table.fvar->get_axes_deprecated (start_offset, axes_count, axes_array);
 }
 
 /**
@@ -94,6 +94,7 @@
  * hb_ot_var_find_axis:
  *
  * Since: 1.4.2
+ * Deprecated: 2.2.0
  **/
 hb_bool_t
 hb_ot_var_find_axis (hb_face_t        *face,
@@ -101,11 +102,72 @@
 		     unsigned int     *axis_index,
 		     hb_ot_var_axis_t *axis_info)
 {
-  return face->table.fvar->find_axis (axis_tag, axis_index, axis_info);
+  return face->table.fvar->find_axis_deprecated (axis_tag, axis_index, axis_info);
 }
 
+/**
+ * hb_ot_var_get_axis_infos:
+ *
+ * Since: 2.2.0
+ **/
+HB_EXTERN unsigned int
+hb_ot_var_get_axis_infos (hb_face_t             *face,
+			  unsigned int           start_offset,
+			  unsigned int          *axes_count /* IN/OUT */,
+			  hb_ot_var_axis_info_t *axes_array /* OUT */)
+{
+  return face->table.fvar->get_axis_infos (start_offset, axes_count, axes_array);
+}
 
 /**
+ * hb_ot_var_find_axis_info:
+ *
+ * Since: 2.2.0
+ **/
+HB_EXTERN hb_bool_t
+hb_ot_var_find_axis_info (hb_face_t             *face,
+			  hb_tag_t               axis_tag,
+			  hb_ot_var_axis_info_t *axis_info)
+{
+  return face->table.fvar->find_axis_info (axis_tag, axis_info);
+}
+
+
+/*
+ * Named instances.
+ */
+
+unsigned int
+hb_ot_var_get_named_instance_count (hb_face_t *face)
+{
+  return face->table.fvar->get_instance_count ();
+}
+
+hb_ot_name_id_t
+hb_ot_var_named_instance_get_subfamily_name_id (hb_face_t   *face,
+						unsigned int instance_index)
+{
+  return face->table.fvar->get_instance_subfamily_name_id (instance_index);
+}
+
+hb_ot_name_id_t
+hb_ot_var_named_instance_get_postscript_name_id (hb_face_t  *face,
+						unsigned int instance_index)
+{
+  return face->table.fvar->get_instance_postscript_name_id (instance_index);
+}
+
+unsigned int
+hb_ot_var_named_instance_get_design_coords (hb_face_t    *face,
+					    unsigned int  instance_index,
+					    unsigned int *coords_length, /* IN/OUT */
+					    float        *coords         /* OUT */)
+{
+  return face->table.fvar->get_instance_coords (instance_index, coords_length, coords);
+}
+
+
+/**
  * hb_ot_var_normalize_variations:
  *
  * Since: 1.4.2
@@ -123,10 +185,10 @@
   const OT::fvar &fvar = *face->table.fvar;
   for (unsigned int i = 0; i < variations_length; i++)
   {
-    unsigned int axis_index;
-    if (hb_ot_var_find_axis (face, variations[i].tag, &axis_index, nullptr) &&
-	axis_index < coords_length)
-      coords[axis_index] = fvar.normalize_axis_value (axis_index, variations[i].value);
+    hb_ot_var_axis_info_t info;
+    if (hb_ot_var_find_axis_info (face, variations[i].tag, &info) &&
+	info.axis_index < coords_length)
+      coords[info.axis_index] = fvar.normalize_axis_value (info.axis_index, variations[i].value);
   }
 
   face->table.avar->map_coords (coords, coords_length);

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-var.h
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-var.h	2018-11-29 23:34:53 UTC (rev 49276)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-var.h	2018-11-30 01:09:56 UTC (rev 49277)
@@ -47,45 +47,86 @@
  * fvar / avar
  */
 
+HB_EXTERN hb_bool_t
+hb_ot_var_has_data (hb_face_t *face);
+
+
+/*
+ * Variation axes.
+ */
+
+
+HB_EXTERN unsigned int
+hb_ot_var_get_axis_count (hb_face_t *face);
+
 /**
- * hb_ot_var_axis_t:
+ * hb_ot_var_axis_flags_t:
+ * @HB_OT_VAR_AXIS_FLAG_HIDDEN: The axis should not be exposed directly in user interfaces.
  *
- * Since: 1.4.2
+ * Since: 2.2.0
  */
-typedef struct hb_ot_var_axis_t {
-  hb_tag_t tag;
-  unsigned int name_id;
-  float min_value;
-  float default_value;
-  float max_value;
-} hb_ot_var_axis_t;
+typedef enum { /*< flags >*/
+  HB_OT_VAR_AXIS_FLAG_HIDDEN	= 0x00000001u,
 
-HB_EXTERN hb_bool_t
-hb_ot_var_has_data (hb_face_t *face);
+  _HB_OT_VAR_AXIS_FLAG_MAX_VALUE= 0x7FFFFFFFu, /*< skip >*/
+} hb_ot_var_axis_flags_t;
 
 /**
- * HB_OT_VAR_NO_AXIS_INDEX:
+ * hb_ot_var_axis_info_t:
  *
- * Since: 1.4.2
+ * Since: 2.2.0
  */
-#define HB_OT_VAR_NO_AXIS_INDEX		0xFFFFFFFFu
+typedef struct hb_ot_var_axis_info_t
+{
+  unsigned int			axis_index;
+  hb_tag_t			tag;
+  hb_ot_name_id_t		name_id;
+  hb_ot_var_axis_flags_t	flags;
+  float				min_value;
+  float				default_value;
+  float				max_value;
+  /*< private >*/
+  unsigned int			reserved;
+} hb_ot_var_axis_info_t;
 
 HB_EXTERN unsigned int
-hb_ot_var_get_axis_count (hb_face_t *face);
+hb_ot_var_get_axis_infos (hb_face_t             *face,
+			  unsigned int           start_offset,
+			  unsigned int          *axes_count /* IN/OUT */,
+			  hb_ot_var_axis_info_t *axes_array /* OUT */);
 
+HB_EXTERN hb_bool_t
+hb_ot_var_find_axis_info (hb_face_t             *face,
+			  hb_tag_t               axis_tag,
+			  hb_ot_var_axis_info_t *axis_info);
+
+
+/*
+ * Named instances.
+ */
+
 HB_EXTERN unsigned int
-hb_ot_var_get_axes (hb_face_t        *face,
-		    unsigned int      start_offset,
-		    unsigned int     *axes_count /* IN/OUT */,
-		    hb_ot_var_axis_t *axes_array /* OUT */);
+hb_ot_var_get_named_instance_count (hb_face_t *face);
 
-HB_EXTERN hb_bool_t
-hb_ot_var_find_axis (hb_face_t        *face,
-		     hb_tag_t          axis_tag,
-		     unsigned int     *axis_index,
-		     hb_ot_var_axis_t *axis_info);
+HB_EXTERN hb_ot_name_id_t
+hb_ot_var_named_instance_get_subfamily_name_id (hb_face_t   *face,
+						unsigned int instance_index);
 
+HB_EXTERN hb_ot_name_id_t
+hb_ot_var_named_instance_get_postscript_name_id (hb_face_t  *face,
+						unsigned int instance_index);
 
+HB_EXTERN unsigned int
+hb_ot_var_named_instance_get_design_coords (hb_face_t    *face,
+					    unsigned int  instance_index,
+					    unsigned int *coords_length, /* IN/OUT */
+					    float        *coords         /* OUT */);
+
+
+/*
+ * Conversions.
+ */
+
 HB_EXTERN void
 hb_ot_var_normalize_variations (hb_face_t            *face,
 				const hb_variation_t *variations, /* IN */

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-vorg-table.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-vorg-table.hh	2018-11-29 23:34:53 UTC (rev 49276)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ot-vorg-table.hh	2018-11-30 01:09:56 UTC (rev 49277)
@@ -63,11 +63,10 @@
 
   inline int get_y_origin (hb_codepoint_t glyph) const
   {
-    int i = vertYOrigins.bsearch (glyph);
-    if (i != -1)
-      return vertYOrigins[i].vertOriginY;
-
-    return defaultVertOriginY;
+    unsigned int i;
+    if (!vertYOrigins.bfind (glyph, &i))
+      return defaultVertOriginY;
+    return vertYOrigins[i].vertOriginY;
   }
 
   inline bool _subset (const hb_subset_plan_t *plan HB_UNUSED,

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-set.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-set.hh	2018-11-29 23:34:53 UTC (rev 49276)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-set.hh	2018-11-30 01:09:56 UTC (rev 49277)
@@ -45,7 +45,7 @@
 
   struct page_map_t
   {
-    inline int cmp (const page_map_t *o) const { return (int) o->major - (int) major; }
+    inline int cmp (const page_map_t &o) const { return (int) o.major - (int) major; }
 
     uint32_t major;
     uint32_t index;
@@ -341,11 +341,11 @@
   {
     /* TODO perform op even if !successful. */
     if (unlikely (!successful)) return;
-    page_t *p = page_for (g);
-    if (!p)
+    page_t *page = page_for (g);
+    if (!page)
       return;
     dirty ();
-    p->del (g);
+    page->del (g);
   }
   inline void del_range (hb_codepoint_t a, hb_codepoint_t b)
   {
@@ -357,10 +357,10 @@
   }
   inline bool has (hb_codepoint_t g) const
   {
-    const page_t *p = page_for (g);
-    if (!p)
+    const page_t *page = page_for (g);
+    if (!page)
       return false;
-    return p->has (g);
+    return page->has (g);
   }
   inline bool intersects (hb_codepoint_t first,
 			  hb_codepoint_t last) const
@@ -544,7 +544,7 @@
 
     page_map_t map = {get_major (*codepoint), 0};
     unsigned int i;
-    page_map.bfind (map, &i);
+    page_map.bfind (map, &i, HB_BFIND_NOT_FOUND_STORE_CLOSEST);
     if (i < page_map.len && page_map[i].major == map.major)
     {
       if (pages[page_map[i].index].next (codepoint))
@@ -575,7 +575,7 @@
 
     page_map_t map = {get_major (*codepoint), 0};
     unsigned int i;
-    page_map.bfind (map, &i);
+    page_map.bfind (map, &i, HB_BFIND_NOT_FOUND_STORE_CLOSEST);
     if (i < page_map.len && page_map[i].major == map.major)
     {
       if (pages[page_map[i].index].previous (codepoint))
@@ -670,7 +670,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, HB_BFIND_NOT_FOUND_STORE_CLOSEST))
     {
       if (!resize (pages.len + 1))
 	return nullptr;

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-shape.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-shape.cc	2018-11-29 23:34:53 UTC (rev 49276)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-shape.cc	2018-11-30 01:09:56 UTC (rev 49277)
@@ -48,7 +48,7 @@
  **/
 
 
-#ifdef HB_USE_ATEXIT
+#if HB_USE_ATEXIT
 static void free_static_shaper_list (void);
 #endif
 
@@ -69,7 +69,7 @@
       shaper_list[i] = shapers[i].name;
     shaper_list[i] = nullptr;
 
-#ifdef HB_USE_ATEXIT
+#if HB_USE_ATEXIT
     atexit (free_static_shaper_list);
 #endif
 
@@ -85,7 +85,7 @@
   }
 } static_shaper_list;
 
-#ifdef HB_USE_ATEXIT
+#if HB_USE_ATEXIT
 static
 void free_static_shaper_list (void)
 {

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-shaper.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-shaper.cc	2018-11-29 23:34:53 UTC (rev 49276)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-shaper.cc	2018-11-30 01:09:56 UTC (rev 49277)
@@ -35,7 +35,7 @@
 #undef HB_SHAPER_IMPLEMENT
 };
 
-#ifdef HB_USE_ATEXIT
+#if HB_USE_ATEXIT
 static void free_static_shapers (void);
 #endif
 
@@ -80,7 +80,7 @@
 	p = end + 1;
     }
 
-#ifdef HB_USE_ATEXIT
+#if HB_USE_ATEXIT
     atexit (free_static_shapers);
 #endif
 
@@ -96,7 +96,7 @@
   }
 } static_shapers;
 
-#ifdef HB_USE_ATEXIT
+#if HB_USE_ATEXIT
 static
 void free_static_shapers (void)
 {

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-static.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-static.cc	2018-11-29 23:34:53 UTC (rev 49276)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-static.cc	2018-11-30 01:09:56 UTC (rev 49277)
@@ -27,10 +27,12 @@
 #include "hb.hh"
 
 #include "hb-open-type.hh"
+#include "hb-face.hh"
+
+#include "hb-aat-layout-common.hh"
+#include "hb-aat-layout-feat-table.hh"
 #include "hb-ot-layout-common.hh"
-#include "hb-aat-layout-common.hh"
-
-#include "hb-face.hh"
+#include "hb-ot-cmap-table.hh"
 #include "hb-ot-head-table.hh"
 #include "hb-ot-maxp-table.hh"
 
@@ -42,6 +44,8 @@
 DEFINE_NULL_NAMESPACE_BYTES (OT, Index) =  {0xFF,0xFF};
 DEFINE_NULL_NAMESPACE_BYTES (OT, LangSys) = {0x00,0x00, 0xFF,0xFF, 0x00,0x00};
 DEFINE_NULL_NAMESPACE_BYTES (OT, RangeRecord) = {0x00,0x01, 0x00,0x00, 0x00, 0x00};
+DEFINE_NULL_NAMESPACE_BYTES (OT, CmapSubtableLongGroup) = {0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00};
+DEFINE_NULL_NAMESPACE_BYTES (AAT, SettingName) = {0xFF,0xFF, 0xFF,0xFF};
 /* Hand-coded because Lookup is a template.  Sad. */
 const unsigned char _hb_Null_AAT_Lookup[2] = {0xFF, 0xFF};
 

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ucdn.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ucdn.cc	2018-11-29 23:34:53 UTC (rev 49276)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-ucdn.cc	2018-11-30 01:09:56 UTC (rev 49277)
@@ -222,7 +222,7 @@
 }
 
 
-#ifdef HB_USE_ATEXIT
+#if HB_USE_ATEXIT
 static void free_static_ucdn_funcs (void);
 #endif
 
@@ -241,7 +241,7 @@
 
     hb_unicode_funcs_make_immutable (funcs);
 
-#ifdef HB_USE_ATEXIT
+#if HB_USE_ATEXIT
     atexit (free_static_ucdn_funcs);
 #endif
 
@@ -249,7 +249,7 @@
   }
 } static_ucdn_funcs;
 
-#ifdef HB_USE_ATEXIT
+#if HB_USE_ATEXIT
 static
 void free_static_ucdn_funcs (void)
 {

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-unicode-emoji-table.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-unicode-emoji-table.hh	2018-11-29 23:34:53 UTC (rev 49276)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-unicode-emoji-table.hh	2018-11-30 01:09:56 UTC (rev 49277)
@@ -47,38 +47,9 @@
   {0x25FB, 0x25FE},
   {0x2600, 0x2605},
   {0x2607, 0x2612},
-  {0x2614, 0x2615},
-  {0x2616, 0x2617},
-  {0x2618, 0x2618},
-  {0x2619, 0x2619},
-  {0x261A, 0x266F},
-  {0x2670, 0x2671},
-  {0x2672, 0x267D},
-  {0x267E, 0x267F},
-  {0x2680, 0x2685},
-  {0x2690, 0x2691},
-  {0x2692, 0x269C},
-  {0x269D, 0x269D},
-  {0x269E, 0x269F},
-  {0x26A0, 0x26A1},
-  {0x26A2, 0x26B1},
-  {0x26B2, 0x26B2},
-  {0x26B3, 0x26BC},
-  {0x26BD, 0x26BF},
-  {0x26C0, 0x26C3},
-  {0x26C4, 0x26CD},
-  {0x26CE, 0x26CE},
-  {0x26CF, 0x26E1},
-  {0x26E2, 0x26E2},
-  {0x26E3, 0x26E3},
-  {0x26E4, 0x26E7},
-  {0x26E8, 0x26FF},
-  {0x2700, 0x2700},
-  {0x2701, 0x2704},
-  {0x2705, 0x2705},
-  {0x2708, 0x2709},
-  {0x270A, 0x270B},
-  {0x270C, 0x2712},
+  {0x2614, 0x2685},
+  {0x2690, 0x2705},
+  {0x2708, 0x2712},
   {0x2714, 0x2714},
   {0x2716, 0x2716},
   {0x271D, 0x271D},
@@ -105,163 +76,33 @@
   {0x303D, 0x303D},
   {0x3297, 0x3297},
   {0x3299, 0x3299},
-  {0x1F000, 0x1F02B},
-  {0x1F02C, 0x1F02F},
-  {0x1F030, 0x1F093},
-  {0x1F094, 0x1F09F},
-  {0x1F0A0, 0x1F0AE},
-  {0x1F0AF, 0x1F0B0},
-  {0x1F0B1, 0x1F0BE},
-  {0x1F0BF, 0x1F0BF},
-  {0x1F0C0, 0x1F0C0},
-  {0x1F0C1, 0x1F0CF},
-  {0x1F0D0, 0x1F0D0},
-  {0x1F0D1, 0x1F0DF},
-  {0x1F0E0, 0x1F0F5},
-  {0x1F0F6, 0x1F0FF},
+  {0x1F000, 0x1F0FF},
   {0x1F10D, 0x1F10F},
   {0x1F12F, 0x1F12F},
-  {0x1F16C, 0x1F16F},
-  {0x1F170, 0x1F171},
-  {0x1F17E, 0x1F17E},
-  {0x1F17F, 0x1F17F},
+  {0x1F16C, 0x1F171},
+  {0x1F17E, 0x1F17F},
   {0x1F18E, 0x1F18E},
   {0x1F191, 0x1F19A},
   {0x1F1AD, 0x1F1E5},
-  {0x1F201, 0x1F202},
-  {0x1F203, 0x1F20F},
+  {0x1F201, 0x1F20F},
   {0x1F21A, 0x1F21A},
   {0x1F22F, 0x1F22F},
   {0x1F232, 0x1F23A},
   {0x1F23C, 0x1F23F},
-  {0x1F249, 0x1F24F},
-  {0x1F250, 0x1F251},
-  {0x1F252, 0x1F25F},
-  {0x1F260, 0x1F265},
-  {0x1F266, 0x1F2FF},
-  {0x1F300, 0x1F320},
-  {0x1F321, 0x1F32C},
-  {0x1F32D, 0x1F32F},
-  {0x1F330, 0x1F335},
-  {0x1F336, 0x1F336},
-  {0x1F337, 0x1F37C},
-  {0x1F37D, 0x1F37D},
-  {0x1F37E, 0x1F37F},
-  {0x1F380, 0x1F393},
-  {0x1F394, 0x1F39F},
-  {0x1F3A0, 0x1F3C4},
-  {0x1F3C5, 0x1F3C5},
-  {0x1F3C6, 0x1F3CA},
-  {0x1F3CB, 0x1F3CE},
-  {0x1F3CF, 0x1F3D3},
-  {0x1F3D4, 0x1F3DF},
-  {0x1F3E0, 0x1F3F0},
-  {0x1F3F1, 0x1F3F7},
-  {0x1F3F8, 0x1F3FA},
-  {0x1F400, 0x1F43E},
-  {0x1F43F, 0x1F43F},
-  {0x1F440, 0x1F440},
-  {0x1F441, 0x1F441},
-  {0x1F442, 0x1F4F7},
-  {0x1F4F8, 0x1F4F8},
-  {0x1F4F9, 0x1F4FC},
-  {0x1F4FD, 0x1F4FE},
-  {0x1F4FF, 0x1F4FF},
-  {0x1F500, 0x1F53D},
-  {0x1F546, 0x1F54A},
-  {0x1F54B, 0x1F54F},
-  {0x1F550, 0x1F567},
-  {0x1F568, 0x1F579},
-  {0x1F57A, 0x1F57A},
-  {0x1F57B, 0x1F5A3},
-  {0x1F5A4, 0x1F5A4},
-  {0x1F5A5, 0x1F5FA},
-  {0x1F5FB, 0x1F5FF},
-  {0x1F600, 0x1F600},
-  {0x1F601, 0x1F610},
-  {0x1F611, 0x1F611},
-  {0x1F612, 0x1F614},
-  {0x1F615, 0x1F615},
-  {0x1F616, 0x1F616},
-  {0x1F617, 0x1F617},
-  {0x1F618, 0x1F618},
-  {0x1F619, 0x1F619},
-  {0x1F61A, 0x1F61A},
-  {0x1F61B, 0x1F61B},
-  {0x1F61C, 0x1F61E},
-  {0x1F61F, 0x1F61F},
-  {0x1F620, 0x1F625},
-  {0x1F626, 0x1F627},
-  {0x1F628, 0x1F62B},
-  {0x1F62C, 0x1F62C},
-  {0x1F62D, 0x1F62D},
-  {0x1F62E, 0x1F62F},
-  {0x1F630, 0x1F633},
-  {0x1F634, 0x1F634},
-  {0x1F635, 0x1F640},
-  {0x1F641, 0x1F642},
-  {0x1F643, 0x1F644},
-  {0x1F645, 0x1F64F},
-  {0x1F680, 0x1F6C5},
-  {0x1F6C6, 0x1F6CF},
-  {0x1F6D0, 0x1F6D0},
-  {0x1F6D1, 0x1F6D2},
-  {0x1F6D3, 0x1F6D4},
-  {0x1F6D5, 0x1F6DF},
-  {0x1F6E0, 0x1F6EC},
-  {0x1F6ED, 0x1F6EF},
-  {0x1F6F0, 0x1F6F3},
-  {0x1F6F4, 0x1F6F6},
-  {0x1F6F7, 0x1F6F8},
-  {0x1F6F9, 0x1F6F9},
-  {0x1F6FA, 0x1F6FF},
+  {0x1F249, 0x1F3FA},
+  {0x1F400, 0x1F53D},
+  {0x1F546, 0x1F64F},
+  {0x1F680, 0x1F6FF},
   {0x1F774, 0x1F77F},
-  {0x1F7D5, 0x1F7D8},
-  {0x1F7D9, 0x1F7FF},
+  {0x1F7D5, 0x1F7FF},
   {0x1F80C, 0x1F80F},
   {0x1F848, 0x1F84F},
   {0x1F85A, 0x1F85F},
   {0x1F888, 0x1F88F},
   {0x1F8AE, 0x1F8FF},
-  {0x1F90C, 0x1F90F},
-  {0x1F910, 0x1F918},
-  {0x1F919, 0x1F91E},
-  {0x1F91F, 0x1F91F},
-  {0x1F920, 0x1F927},
-  {0x1F928, 0x1F92F},
-  {0x1F930, 0x1F930},
-  {0x1F931, 0x1F932},
-  {0x1F933, 0x1F93A},
-  {0x1F93C, 0x1F93E},
-  {0x1F93F, 0x1F93F},
-  {0x1F940, 0x1F945},
-  {0x1F947, 0x1F94B},
-  {0x1F94C, 0x1F94C},
-  {0x1F94D, 0x1F94F},
-  {0x1F950, 0x1F95E},
-  {0x1F95F, 0x1F96B},
-  {0x1F96C, 0x1F970},
-  {0x1F971, 0x1F972},
-  {0x1F973, 0x1F976},
-  {0x1F977, 0x1F979},
-  {0x1F97A, 0x1F97A},
-  {0x1F97B, 0x1F97B},
-  {0x1F97C, 0x1F97F},
-  {0x1F980, 0x1F984},
-  {0x1F985, 0x1F991},
-  {0x1F992, 0x1F997},
-  {0x1F998, 0x1F9A2},
-  {0x1F9A3, 0x1F9AF},
-  {0x1F9B0, 0x1F9B9},
-  {0x1F9BA, 0x1F9BF},
-  {0x1F9C0, 0x1F9C0},
-  {0x1F9C1, 0x1F9C2},
-  {0x1F9C3, 0x1F9CF},
-  {0x1F9D0, 0x1F9E6},
-  {0x1F9E7, 0x1F9FF},
-  {0x1FA00, 0x1FA5F},
-  {0x1FA60, 0x1FA6D},
-  {0x1FA6E, 0x1FFFD},
+  {0x1F90C, 0x1F93A},
+  {0x1F93C, 0x1F945},
+  {0x1F947, 0x1FFFD},
 };
 
 #endif /* HB_UNICODE_EMOJI_TABLE_HH */

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-uniscribe.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-uniscribe.cc	2018-11-29 23:34:53 UTC (rev 49276)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-uniscribe.cc	2018-11-30 01:09:56 UTC (rev 49277)
@@ -245,7 +245,7 @@
 
     funcs->init ();
 
-#ifdef HB_USE_ATEXIT
+#if HB_USE_ATEXIT
     atexit (free_static_uniscribe_shaper_funcs);
 #endif
 
@@ -261,7 +261,7 @@
   }
 } static_uniscribe_shaper_funcs;
 
-#ifdef HB_USE_ATEXIT
+#if HB_USE_ATEXIT
 static
 void free_static_uniscribe_shaper_funcs (void)
 {

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-vector.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-vector.hh	2018-11-29 23:34:53 UTC (rev 49276)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-vector.hh	2018-11-30 01:09:56 UTC (rev 49277)
@@ -31,13 +31,15 @@
 #include "hb.hh"
 
 
-template <typename Type, unsigned int StaticSize=8>
+template <typename Type, unsigned int PreallocedCount=8>
 struct hb_vector_t
 {
+  static_assert ((bool) (unsigned) hb_static_size (Type), "");
+
   typedef Type ItemType;
   enum { item_size = sizeof (Type) };
 
-  HB_NO_COPY_ASSIGN_TEMPLATE2 (hb_vector_t, Type, StaticSize);
+  HB_NO_COPY_ASSIGN_TEMPLATE2 (hb_vector_t, Type, PreallocedCount);
   inline hb_vector_t (void) { init (); }
   inline ~hb_vector_t (void) { fini (); }
 
@@ -45,7 +47,7 @@
   private:
   unsigned int allocated; /* == 0 means allocation failed. */
   Type *arrayZ_;
-  Type static_array[StaticSize];
+  Type static_array[PreallocedCount];
   public:
 
   void init (void)
@@ -89,6 +91,16 @@
     return arrayZ()[i];
   }
 
+  inline hb_array_t<Type> as_array (void)
+  { return hb_array (arrayZ(), len); }
+  inline hb_array_t<const Type> as_array (void) const
+  { return hb_array (arrayZ(), len); }
+
+  inline hb_sorted_array_t<Type> as_sorted_array (void)
+  { return hb_sorted_array (arrayZ(), len); }
+  inline hb_sorted_array_t<const Type> as_sorted_array (void) const
+  { return hb_sorted_array (arrayZ(), len); }
+
   template <typename T> inline operator  T * (void) { return arrayZ(); }
   template <typename T> inline operator const T * (void) const { return arrayZ(); }
 
@@ -209,75 +221,28 @@
   }
 
   inline void qsort (int (*cmp)(const void*, const void*))
-  {
-    ::qsort (arrayZ(), len, sizeof (Type), cmp);
-  }
+  { as_array ().qsort (cmp); }
+  inline void qsort (unsigned int start = 0, unsigned int end = (unsigned int) -1)
+  { as_array ().qsort (start, end); }
 
-  inline void qsort (void)
-  {
-    ::qsort (arrayZ(), len, sizeof (Type), Type::cmp);
-  }
-
-  inline void qsort (unsigned int start, unsigned int end)
-  {
-    ::qsort (arrayZ() + start, end - start, sizeof (Type), Type::cmp);
-  }
-
   template <typename T>
-  inline Type *lsearch (const T &x)
-  {
-    Type *array = arrayZ();
-    for (unsigned int i = 0; i < len; i++)
-      if (0 == array[i].cmp (&x))
-	return &array[i];
-    return nullptr;
-  }
+  inline Type *lsearch (const T &x, Type *not_found = nullptr)
+  { return as_array ().lsearch (x, not_found); }
   template <typename T>
-  inline const Type *lsearch (const T &x) const
-  {
-    const Type *array = arrayZ();
-    for (unsigned int i = 0; i < len; i++)
-      if (0 == array[i].cmp (&x))
-	return &array[i];
-    return nullptr;
-  }
+  inline const Type *lsearch (const T &x, const Type *not_found = nullptr) const
+  { return as_array ().lsearch (x, not_found); }
 
   template <typename T>
-  inline Type *bsearch (const T &x)
-  {
-    unsigned int i;
-    return bfind (x, &i) ? &arrayZ()[i] : nullptr;
-  }
+  inline Type *bsearch (const T &x, Type *not_found = nullptr)
+  { return as_sorted_array ().bsearch (x, not_found); }
   template <typename T>
-  inline const Type *bsearch (const T &x) const
-  {
-    unsigned int i;
-    return bfind (x, &i) ? &arrayZ()[i] : nullptr;
-  }
+  inline const Type *bsearch (const T &x, const Type *not_found = nullptr) const
+  { return as_sorted_array ().bsearch (x, not_found); }
   template <typename T>
-  inline bool bfind (const T &x, unsigned int *i) const
-  {
-    int min = 0, max = (int) this->len - 1;
-    const Type *array = this->arrayZ();
-    while (min <= max)
-    {
-      int mid = ((unsigned int) min + (unsigned int) max) / 2;
-      int c = array[mid].cmp (&x);
-      if (c < 0)
-        max = mid - 1;
-      else if (c > 0)
-        min = mid + 1;
-      else
-      {
-        *i = mid;
-	return true;
-      }
-    }
-    if (max < 0 || (max < (int) this->len && array[max].cmp (&x) > 0))
-      max++;
-    *i = max;
-    return false;
-  }
+  inline bool bfind (const T &x, unsigned int *i = nullptr,
+		     hb_bfind_not_found_t not_found = HB_BFIND_NOT_FOUND_DONT_STORE,
+		     unsigned int to_store = (unsigned int) -1) const
+  { return as_sorted_array ().bfind (x, i, not_found, to_store); }
 };
 
 

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb.hh
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb.hh	2018-11-29 23:34:53 UTC (rev 49276)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/hb.hh	2018-11-30 01:09:56 UTC (rev 49277)
@@ -47,7 +47,11 @@
 #define HB_H_IN
 #include "hb-ot.h"
 #define HB_OT_H_IN
+#include "hb-aat.h"
+#define HB_AAT_H_IN
 
+#include "hb-aat.h"
+
 #include <math.h>
 #include <stdlib.h>
 #include <stddef.h>
@@ -281,7 +285,7 @@
 #  endif
 #endif
 
-#if HAVE_ATEXIT
+#if defined(HAVE_ATEXIT) && !defined(HB_USE_ATEXIT)
 /* atexit() is only safe to be called from shared libraries on certain
  * platforms.  Whitelist.
  * https://bugs.freedesktop.org/show_bug.cgi?id=82246 */
@@ -313,6 +317,9 @@
 #ifdef HB_NO_ATEXIT
 #  undef HB_USE_ATEXIT
 #endif
+#ifndef HB_USE_ATEXIT
+#  define HB_USE_ATEXIT 0
+#endif
 
 #define HB_STMT_START do
 #define HB_STMT_END   while (0)
@@ -443,9 +450,11 @@
  * For example, for testing "x ∈ {x1, x2, x3}" use:
  * (FLAG_UNSAFE(x) & (FLAG(x1) | FLAG(x2) | FLAG(x3)))
  */
-#define FLAG(x) (ASSERT_STATIC_EXPR_ZERO ((unsigned int)(x) < 32) + (1U << (unsigned int)(x)))
-#define FLAG_UNSAFE(x) ((unsigned int)(x) < 32 ? (1U << (unsigned int)(x)) : 0)
+#define FLAG(x) (ASSERT_STATIC_EXPR_ZERO ((unsigned)(x) < 32) + (((uint32_t) 1U) << (unsigned)(x)))
+#define FLAG_UNSAFE(x) ((unsigned)(x) < 32 ? (((uint32_t) 1U) << (unsigned)(x)) : 0)
 #define FLAG_RANGE(x,y) (ASSERT_STATIC_EXPR_ZERO ((x) < (y)) + FLAG(y+1) - FLAG(x))
+#define FLAG64(x) (ASSERT_STATIC_EXPR_ZERO ((unsigned)(x) < 64) + (((uint64_t) 1ULL) << (unsigned)(x)))
+#define FLAG64_UNSAFE(x) ((unsigned)(x) < 64 ? (((uint64_t) 1ULL) << (unsigned)(x)) : 0)
 
 
 /* Size signifying variable-sized array */
@@ -503,10 +512,13 @@
 /* Some really basic things everyone wants. */
 template <typename T> struct hb_remove_const { typedef T value; };
 template <typename T> struct hb_remove_const<const T> { typedef T value; };
+#define hb_remove_const(T) hb_remove_const<T>::value
 template <typename T> struct hb_remove_reference { typedef T value; };
 template <typename T> struct hb_remove_reference<T &> { typedef T value; };
+#define hb_remove_reference(T) hb_remove_reference<T>::value
 template <typename T> struct hb_remove_pointer { typedef T value; };
 template <typename T> struct hb_remove_pointer<T *> { typedef T value; };
+#define hb_remove_pointer(T) hb_remove_pointer<T>::value
 
 
 /* Headers we include for everyone.  Keep sorted.  They express dependency amongst

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/test-name-table.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/test-name-table.cc	2018-11-29 23:34:53 UTC (rev 49276)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/test-name-table.cc	2018-11-30 01:09:56 UTC (rev 49277)
@@ -48,7 +48,7 @@
 
   for (unsigned int i = 0; i < count; i++)
   {
-    printf ("%d	%s	",
+    printf ("%u	%s	",
 	    entries[i].name_id,
 	    hb_language_to_string (entries[i].language));
 

Modified: trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/test-ot-color.cc
===================================================================
--- trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/test-ot-color.cc	2018-11-29 23:34:53 UTC (rev 49276)
+++ trunk/Build/source/libs/harfbuzz/harfbuzz-src/src/test-ot-color.cc	2018-11-30 01:09:56 UTC (rev 49277)
@@ -54,7 +54,7 @@
     const char *data = hb_blob_get_data (blob, &length);
 
     char output_path[255];
-    sprintf (output_path, "out/svg-%d-%d.svg%s",
+    sprintf (output_path, "out/svg-%u-%u.svg%s",
 	     glyph_id,
 	     face_index,
 	     // append "z" if the content is gzipped, https://stackoverflow.com/a/6059405
@@ -108,7 +108,7 @@
 	const char *data = hb_blob_get_data (blob, &length);
 
 	char output_path[255];
-	sprintf (output_path, "out/png-%d-%d-%d.png", glyph_id, strike, face_index);
+	sprintf (output_path, "out/png-%u-%u-%u.png", glyph_id, strike, face_index);
 
 	FILE *f = fopen (output_path, "wb");
 	fwrite (data, 1, length, f);
@@ -167,9 +167,8 @@
 
       // Render
       unsigned int palette_count = hb_ot_color_palette_get_count (face);
-      for (unsigned int palette = 0; palette < palette_count; palette++) {
-	char output_path[255];
-
+      for (unsigned int palette = 0; palette < palette_count; palette++)
+      {
 	unsigned int num_colors = hb_ot_color_palette_get_colors (face, palette, 0, NULL, NULL);
 	if (!num_colors)
 	  continue;
@@ -178,7 +177,8 @@
 	hb_ot_color_palette_get_colors (face, palette, 0, &num_colors, colors);
 	if (num_colors)
 	{
-	  sprintf (output_path, "out/colr-%d-%d-%d.svg", gid, palette, face_index);
+	  char output_path[255];
+	  sprintf (output_path, "out/colr-%u-%u-%u.svg", gid, palette, face_index);
 
 	  cairo_surface_t *surface = cairo_svg_surface_create (output_path, extents.width, extents.height);
 	  cairo_t *cr = cairo_create (surface);
@@ -245,7 +245,7 @@
     // Render
     {
       char output_path[255];
-      sprintf (output_path, "out/%d-%d.svg", face_index, i);
+      sprintf (output_path, "out/%u-%u.svg", face_index, i);
       cairo_surface_t *surface = cairo_svg_surface_create (output_path, extents.width, extents.height);
       cairo_t *cr = cairo_create (surface);
       cairo_set_font_face (cr, cairo_face);

Modified: trunk/Build/source/libs/harfbuzz/include/Makefile.am
===================================================================
--- trunk/Build/source/libs/harfbuzz/include/Makefile.am	2018-11-29 23:34:53 UTC (rev 49276)
+++ trunk/Build/source/libs/harfbuzz/include/Makefile.am	2018-11-30 01:09:56 UTC (rev 49277)
@@ -14,6 +14,8 @@
 ## common
 hdr_links = \
 	$(HARFBUZZ_SRC)/hb.h \
+	$(HARFBUZZ_SRC)/hb-aat-layout.h \
+	$(HARFBUZZ_SRC)/hb-aat.h \
 	$(HARFBUZZ_SRC)/hb-blob.h \
 	$(HARFBUZZ_SRC)/hb-buffer.h \
 	$(HARFBUZZ_SRC)/hb-common.h \

Modified: trunk/Build/source/libs/harfbuzz/include/Makefile.in
===================================================================
--- trunk/Build/source/libs/harfbuzz/include/Makefile.in	2018-11-29 23:34:53 UTC (rev 49276)
+++ trunk/Build/source/libs/harfbuzz/include/Makefile.in	2018-11-30 01:09:56 UTC (rev 49277)
@@ -250,7 +250,8 @@
 top_srcdir = @top_srcdir@
 HARFBUZZ_SRC = $(top_srcdir)/$(HARFBUZZ_TREE)/src
 HARFBUZZ_BLD = $(top_builddir)
-hdr_links = $(HARFBUZZ_SRC)/hb.h $(HARFBUZZ_SRC)/hb-blob.h \
+hdr_links = $(HARFBUZZ_SRC)/hb.h $(HARFBUZZ_SRC)/hb-aat-layout.h \
+	$(HARFBUZZ_SRC)/hb-aat.h $(HARFBUZZ_SRC)/hb-blob.h \
 	$(HARFBUZZ_SRC)/hb-buffer.h $(HARFBUZZ_SRC)/hb-common.h \
 	$(HARFBUZZ_SRC)/hb-deprecated.h $(HARFBUZZ_SRC)/hb-face.h \
 	$(HARFBUZZ_SRC)/hb-font.h $(HARFBUZZ_SRC)/hb-map.h \

Modified: trunk/Build/source/libs/harfbuzz/version.ac
===================================================================
--- trunk/Build/source/libs/harfbuzz/version.ac	2018-11-29 23:34:53 UTC (rev 49276)
+++ trunk/Build/source/libs/harfbuzz/version.ac	2018-11-30 01:09:56 UTC (rev 49277)
@@ -8,4 +8,4 @@
 dnl --------------------------------------------------------
 dnl
 dnl  m4-include this file to define the current harfbuzz version
-m4_define([harfbuzz_version], [2.1.3])
+m4_define([harfbuzz_version], [2.2.0])



More information about the tex-live-commits mailing list