src/hb-aat-layout-kerx-table.hh                                      |  169 
++++++----
 src/hb-aat-layout-morx-table.hh                                      |    4 
 src/hb-buffer.cc                                                     |   16 
 src/hb-ot-shape.cc                                                   |   16 
 test/shaping/data/text-rendering-tests/Makefile.sources              |    6 
 test/shaping/data/text-rendering-tests/fonts/TestMORXForty.ttf       |binary
 test/shaping/data/text-rendering-tests/fonts/TestMORXThirtyeight.ttf |binary
 test/shaping/data/text-rendering-tests/fonts/TestMORXThirtynine.ttf  |binary
 test/shaping/data/text-rendering-tests/fonts/TestMORXThirtyseven.ttf |binary
 test/shaping/data/text-rendering-tests/tests/MORX-35.tests           |    4 
 test/shaping/data/text-rendering-tests/tests/MORX-37.tests           |    4 
 test/shaping/data/text-rendering-tests/tests/MORX-38.tests           |    4 
 test/shaping/data/text-rendering-tests/tests/MORX-39.tests           |    4 
 test/shaping/data/text-rendering-tests/tests/MORX-40.tests           |    4 
 14 files changed, 154 insertions(+), 77 deletions(-)

New commits:
commit 2a5cb37fdb43230217e055f3d7c770a35cfd5c21
Author: Behdad Esfahbod <beh...@behdad.org>
Date:   Sun Oct 7 20:36:46 2018 -0400

    Revert "[morx] Fix MORX-35"
    
    This reverts commit f62f6e90ad1f1a83f77771ad65ee1ffb79470a8a.

diff --git a/src/hb-aat-layout-morx-table.hh b/src/hb-aat-layout-morx-table.hh
index b9dddb2a..cf08d796 100644
--- a/src/hb-aat-layout-morx-table.hh
+++ b/src/hb-aat-layout-morx-table.hh
@@ -661,17 +661,13 @@ struct InsertionSubtable
         * current glyph, the next glyph processed would in fact be the first
         * one inserted."
         *
-        * So, if DontAdvance *is* set, we move to "end", such that newly
-        * inserted glyphs are visible.
+        * This suggests that if DontAdvance is NOT set, we should move to
+        * end+count.  If it *was*, then move to end, such that newly inserted
+        * glyphs are now visible.
         *
-        * If DontAdvance is *not* set, if inserted before, move past them,
-        * such that original current glyph will be skipped over by the driver.
-        * Otherwise, again, just move to "end" such that current glyph will
-        * be skipped over by driver.
-        *
-        * https://github.com/harfbuzz/harfbuzz/issues/1224
+        * 
https://github.com/harfbuzz/harfbuzz/issues/1224#issuecomment-427691417
         */
-       buffer->move_to ((flags & DontAdvance) || !before ? end : end + count);
+       buffer->move_to ((flags & DontAdvance) ? end : end + count);
       }
 
       if (flags & SetMark)
diff --git a/test/shaping/data/text-rendering-tests/DISABLED 
b/test/shaping/data/text-rendering-tests/DISABLED
index 8539c0ee..4e8b1cf2 100644
--- a/test/shaping/data/text-rendering-tests/DISABLED
+++ b/test/shaping/data/text-rendering-tests/DISABLED
@@ -1,3 +1,6 @@
+# https://github.com/harfbuzz/harfbuzz/issues/1224
+tests/MORX-35.tests
+
 # Non-Unicode cmap
 tests/CMAP-3.tests
 
diff --git a/test/shaping/data/text-rendering-tests/Makefile.sources 
b/test/shaping/data/text-rendering-tests/Makefile.sources
index c7f48760..5a3d20a6 100644
--- a/test/shaping/data/text-rendering-tests/Makefile.sources
+++ b/test/shaping/data/text-rendering-tests/Makefile.sources
@@ -55,7 +55,6 @@ TESTS = \
        tests/MORX-32.tests \
        tests/MORX-33.tests \
        tests/MORX-34.tests \
-       tests/MORX-35.tests \
        tests/MORX-36.tests \
        tests/MORX-37.tests \
        tests/MORX-38.tests \
@@ -74,6 +73,7 @@ TESTS = \
 
 DISBALED_TESTS = \
        tests/CMAP-3.tests \
+       tests/MORX-35.tests \
        tests/SHARAN-1.tests \
        tests/SHBALI-1.tests \
        tests/SHBALI-2.tests \
commit 14ebf8af0c04efcae6ca788ac85601bfe462f28d
Author: Behdad Esfahbod <beh...@behdad.org>
Date:   Sun Oct 7 20:35:06 2018 -0400

    [buffer] Improve shift_forward()
    
    "Improve" is a strong word in this case though, I understand.

diff --git a/src/hb-buffer.cc b/src/hb-buffer.cc
index 0b8593f8..2b7b8864 100644
--- a/src/hb-buffer.cc
+++ b/src/hb-buffer.cc
@@ -182,7 +182,11 @@ hb_buffer_t::shift_forward (unsigned int count)
   if (idx + count > len)
   {
     /* Under memory failure we might expose this area.  At least
-     * clean it up.  Oh well... */
+     * clean it up.  Oh well...
+     *
+     * Ideally, we should at least set Default_Ignorable bits on
+     * these, as well as consistent cluster values.  But the former
+     * is layering violation... */
     memset (info + len, 0, (idx + count - len) * sizeof (info[0]));
   }
   len += count;
@@ -399,8 +403,14 @@ hb_buffer_t::move_to (unsigned int i)
     unsigned int count = out_len - i;
 
     /* This will blow in our face if memory allocation fails later
-     * in this same lookup... */
-    if (unlikely (idx < count && !shift_forward (count + 32))) return false;
+     * in this same lookup...
+     *
+     * We used to shift with extra 32 items, instead of the 0 below.
+     * But that would leave empty slots in the buffer in case of allocation
+     * failures.  Setting to zero for now to avoid other problems (see
+     * comments in shift_forward().  This can cause O(N^2) behavior more
+     * severely than adding 32 empty slots can... */
+    if (unlikely (idx < count && !shift_forward (count + 0))) return false;
 
     assert (idx >= count);
 
commit f62f6e90ad1f1a83f77771ad65ee1ffb79470a8a
Author: Behdad Esfahbod <beh...@behdad.org>
Date:   Sun Oct 7 18:06:53 2018 -0400

    [morx] Fix MORX-35
    
    Fixes https://github.com/harfbuzz/harfbuzz/issues/1224

diff --git a/src/hb-aat-layout-morx-table.hh b/src/hb-aat-layout-morx-table.hh
index 63b937ba..b9dddb2a 100644
--- a/src/hb-aat-layout-morx-table.hh
+++ b/src/hb-aat-layout-morx-table.hh
@@ -661,11 +661,17 @@ struct InsertionSubtable
         * current glyph, the next glyph processed would in fact be the first
         * one inserted."
         *
-        * This suggests that if DontAdvance is NOT set, we should move to
-        * end+count.  If it *was*, then move to end, such that newly inserted
-        * glyphs are now visible.
+        * So, if DontAdvance *is* set, we move to "end", such that newly
+        * inserted glyphs are visible.
+        *
+        * If DontAdvance is *not* set, if inserted before, move past them,
+        * such that original current glyph will be skipped over by the driver.
+        * Otherwise, again, just move to "end" such that current glyph will
+        * be skipped over by driver.
+        *
+        * https://github.com/harfbuzz/harfbuzz/issues/1224
         */
-       buffer->move_to ((flags & DontAdvance) ? end : end + count);
+       buffer->move_to ((flags & DontAdvance) || !before ? end : end + count);
       }
 
       if (flags & SetMark)
diff --git a/test/shaping/data/text-rendering-tests/DISABLED 
b/test/shaping/data/text-rendering-tests/DISABLED
index 4e8b1cf2..8539c0ee 100644
--- a/test/shaping/data/text-rendering-tests/DISABLED
+++ b/test/shaping/data/text-rendering-tests/DISABLED
@@ -1,6 +1,3 @@
-# https://github.com/harfbuzz/harfbuzz/issues/1224
-tests/MORX-35.tests
-
 # Non-Unicode cmap
 tests/CMAP-3.tests
 
diff --git a/test/shaping/data/text-rendering-tests/Makefile.sources 
b/test/shaping/data/text-rendering-tests/Makefile.sources
index 5a3d20a6..c7f48760 100644
--- a/test/shaping/data/text-rendering-tests/Makefile.sources
+++ b/test/shaping/data/text-rendering-tests/Makefile.sources
@@ -55,6 +55,7 @@ TESTS = \
        tests/MORX-32.tests \
        tests/MORX-33.tests \
        tests/MORX-34.tests \
+       tests/MORX-35.tests \
        tests/MORX-36.tests \
        tests/MORX-37.tests \
        tests/MORX-38.tests \
@@ -73,7 +74,6 @@ TESTS = \
 
 DISBALED_TESTS = \
        tests/CMAP-3.tests \
-       tests/MORX-35.tests \
        tests/SHARAN-1.tests \
        tests/SHBALI-1.tests \
        tests/SHBALI-2.tests \
commit 94368855c6bd7201d562cab3d2107685589e69c8
Author: Behdad Esfahbod <beh...@behdad.org>
Date:   Sun Oct 7 18:52:12 2018 -0400

    Remove some code
    
    We use scratch-flags to short-circuit this function.  No need for previous
    early loop.

diff --git a/src/hb-ot-shape.cc b/src/hb-ot-shape.cc
index 3b79ef46..4e5bd4e9 100644
--- a/src/hb-ot-shape.cc
+++ b/src/hb-ot-shape.cc
@@ -537,23 +537,13 @@ hb_ot_hide_default_ignorables (hb_ot_shape_context_t *c)
   unsigned int count = buffer->len;
   hb_glyph_info_t *info = buffer->info;
   hb_glyph_position_t *pos = buffer->pos;
-  unsigned int i = 0;
-  for (i = 0; i < count; i++)
-  {
-    if (unlikely (_hb_glyph_info_is_default_ignorable (&info[i])))
-      break;
-  }
-
-  /* No default-ignorables found; return. */
-  if (i == count)
-    return;
 
   hb_codepoint_t invisible = c->buffer->invisible;
   if (!(buffer->flags & HB_BUFFER_FLAG_REMOVE_DEFAULT_IGNORABLES) &&
       (invisible || c->font->get_nominal_glyph (' ', &invisible)))
   {
     /* Replace default-ignorables with a zero-advance invisible glyph. */
-    for (/*continue*/; i < count; i++)
+    for (unsigned int i = 0; i < count; i++)
     {
       if (_hb_glyph_info_is_default_ignorable (&info[i]))
        info[i].codepoint = invisible;
@@ -563,8 +553,8 @@ hb_ot_hide_default_ignorables (hb_ot_shape_context_t *c)
   {
     /* Merge clusters and delete default-ignorables.
      * NOTE! We can't use out-buffer as we have positioning data. */
-    unsigned int j = i;
-    for (; i < count; i++)
+    unsigned int j = 0;
+    for (unsigned int i = 0; i < count; i++)
     {
       if (_hb_glyph_info_is_default_ignorable (&info[i]))
       {
commit c07b91b812dc66b38b11329cd6a93258a3769f9e
Author: Behdad Esfahbod <beh...@behdad.org>
Date:   Sun Oct 7 18:00:14 2018 -0400

    [test/text-rendering-tests] Update from upstream

diff --git a/test/shaping/data/text-rendering-tests/Makefile.sources 
b/test/shaping/data/text-rendering-tests/Makefile.sources
index 29d064b7..5a3d20a6 100644
--- a/test/shaping/data/text-rendering-tests/Makefile.sources
+++ b/test/shaping/data/text-rendering-tests/Makefile.sources
@@ -56,7 +56,11 @@ TESTS = \
        tests/MORX-33.tests \
        tests/MORX-34.tests \
        tests/MORX-36.tests \
+       tests/MORX-37.tests \
+       tests/MORX-38.tests \
+       tests/MORX-39.tests \
        tests/MORX-3.tests \
+       tests/MORX-40.tests \
        tests/MORX-4.tests \
        tests/MORX-5.tests \
        tests/MORX-6.tests \
@@ -68,8 +72,8 @@ TESTS = \
        $(NULL)
 
 DISBALED_TESTS = \
-       tests/MORX-35.tests \
        tests/CMAP-3.tests \
+       tests/MORX-35.tests \
        tests/SHARAN-1.tests \
        tests/SHBALI-1.tests \
        tests/SHBALI-2.tests \
diff --git a/test/shaping/data/text-rendering-tests/fonts/TestMORXForty.ttf 
b/test/shaping/data/text-rendering-tests/fonts/TestMORXForty.ttf
new file mode 100644
index 00000000..37d0b637
Binary files /dev/null and 
b/test/shaping/data/text-rendering-tests/fonts/TestMORXForty.ttf differ
diff --git 
a/test/shaping/data/text-rendering-tests/fonts/TestMORXThirtyeight.ttf 
b/test/shaping/data/text-rendering-tests/fonts/TestMORXThirtyeight.ttf
new file mode 100644
index 00000000..29a41d0a
Binary files /dev/null and 
b/test/shaping/data/text-rendering-tests/fonts/TestMORXThirtyeight.ttf differ
diff --git 
a/test/shaping/data/text-rendering-tests/fonts/TestMORXThirtynine.ttf 
b/test/shaping/data/text-rendering-tests/fonts/TestMORXThirtynine.ttf
new file mode 100644
index 00000000..c106ae94
Binary files /dev/null and 
b/test/shaping/data/text-rendering-tests/fonts/TestMORXThirtynine.ttf differ
diff --git 
a/test/shaping/data/text-rendering-tests/fonts/TestMORXThirtyseven.ttf 
b/test/shaping/data/text-rendering-tests/fonts/TestMORXThirtyseven.ttf
new file mode 100644
index 00000000..22057f18
Binary files /dev/null and 
b/test/shaping/data/text-rendering-tests/fonts/TestMORXThirtyseven.ttf differ
diff --git a/test/shaping/data/text-rendering-tests/tests/MORX-35.tests 
b/test/shaping/data/text-rendering-tests/tests/MORX-35.tests
index 1061034d..616b2f9b 100644
--- a/test/shaping/data/text-rendering-tests/tests/MORX-35.tests
+++ b/test/shaping/data/text-rendering-tests/tests/MORX-35.tests
@@ -1,2 +1,2 @@
-../fonts/TestMORXThirtyfive.ttf:--font-size=1000 --ned 
--remove-default-ignorables --font-funcs=ft:U+0041:[A|B@639,0|C@1265,0]
-../fonts/TestMORXThirtyfive.ttf:--font-size=1000 --ned 
--remove-default-ignorables 
--font-funcs=ft:U+0058,U+0041,U+0059:[X|A@586,0|B@1225,0|C@1851,0|E@2447,0|Y@3003,0]
+../fonts/TestMORXThirtyfive.ttf:--font-size=1000 --ned 
--remove-default-ignorables 
--font-funcs=ft:U+0041:[A|B@639,0|E@1265,0|C@1821,0|E@2417,0]
+../fonts/TestMORXThirtyfive.ttf:--font-size=1000 --ned 
--remove-default-ignorables 
--font-funcs=ft:U+0058,U+0041,U+0059:[X|A@586,0|B@1225,0|E@1851,0|C@2407,0|E@3003,0|Y@3559,0]
diff --git a/test/shaping/data/text-rendering-tests/tests/MORX-37.tests 
b/test/shaping/data/text-rendering-tests/tests/MORX-37.tests
new file mode 100644
index 00000000..f28c5e2a
--- /dev/null
+++ b/test/shaping/data/text-rendering-tests/tests/MORX-37.tests
@@ -0,0 +1,4 @@
+../fonts/TestMORXThirtyseven.ttf:--font-size=1000 --ned 
--remove-default-ignorables --font-funcs=ft:U+0041,U+0042:[A.alt|B.alt@1000,0]
+../fonts/TestMORXThirtyseven.ttf:--font-size=1000 --ned 
--remove-default-ignorables --font-funcs=ft:U+0042,U+0041:[B|A@650,0]
+../fonts/TestMORXThirtyseven.ttf:--font-size=1000 --ned 
--remove-default-ignorables 
--font-funcs=ft:U+05D0,U+05D1:[uni05D1|uni05D0@542,0]
+../fonts/TestMORXThirtyseven.ttf:--font-size=1000 --ned 
--remove-default-ignorables 
--font-funcs=ft:U+05D1,U+05D0:[uni05D0.alt|uni05D1.alt@1000,0]
diff --git a/test/shaping/data/text-rendering-tests/tests/MORX-38.tests 
b/test/shaping/data/text-rendering-tests/tests/MORX-38.tests
new file mode 100644
index 00000000..abefe29b
--- /dev/null
+++ b/test/shaping/data/text-rendering-tests/tests/MORX-38.tests
@@ -0,0 +1,4 @@
+../fonts/TestMORXThirtyeight.ttf:--font-size=1000 --ned 
--remove-default-ignorables --font-funcs=ft:U+0041,U+0042:[A.alt|B.alt@1000,0]
+../fonts/TestMORXThirtyeight.ttf:--font-size=1000 --ned 
--remove-default-ignorables --font-funcs=ft:U+0042,U+0041:[B|A@650,0]
+../fonts/TestMORXThirtyeight.ttf:--font-size=1000 --ned 
--remove-default-ignorables 
--font-funcs=ft:U+05D0,U+05D1:[uni05D1.alt|uni05D0.alt@1000,0]
+../fonts/TestMORXThirtyeight.ttf:--font-size=1000 --ned 
--remove-default-ignorables 
--font-funcs=ft:U+05D1,U+05D0:[uni05D0|uni05D1@606,0]
diff --git a/test/shaping/data/text-rendering-tests/tests/MORX-39.tests 
b/test/shaping/data/text-rendering-tests/tests/MORX-39.tests
new file mode 100644
index 00000000..83bfa52b
--- /dev/null
+++ b/test/shaping/data/text-rendering-tests/tests/MORX-39.tests
@@ -0,0 +1,4 @@
+../fonts/TestMORXThirtynine.ttf:--font-size=1000 --ned 
--remove-default-ignorables --font-funcs=ft:U+0041,U+0042:[A|B@639,0]
+../fonts/TestMORXThirtynine.ttf:--font-size=1000 --ned 
--remove-default-ignorables --font-funcs=ft:U+0042,U+0041:[B.alt|A.alt@1000,0]
+../fonts/TestMORXThirtynine.ttf:--font-size=1000 --ned 
--remove-default-ignorables 
--font-funcs=ft:U+05D0,U+05D1:[uni05D1.alt|uni05D0.alt@1000,0]
+../fonts/TestMORXThirtynine.ttf:--font-size=1000 --ned 
--remove-default-ignorables 
--font-funcs=ft:U+05D1,U+05D0:[uni05D0|uni05D1@606,0]
diff --git a/test/shaping/data/text-rendering-tests/tests/MORX-40.tests 
b/test/shaping/data/text-rendering-tests/tests/MORX-40.tests
new file mode 100644
index 00000000..c99155e2
--- /dev/null
+++ b/test/shaping/data/text-rendering-tests/tests/MORX-40.tests
@@ -0,0 +1,4 @@
+../fonts/TestMORXForty.ttf:--font-size=1000 --ned --remove-default-ignorables 
--font-funcs=ft:U+0041,U+0042:[A|B@639,0]
+../fonts/TestMORXForty.ttf:--font-size=1000 --ned --remove-default-ignorables 
--font-funcs=ft:U+0042,U+0041:[B.alt|A.alt@1000,0]
+../fonts/TestMORXForty.ttf:--font-size=1000 --ned --remove-default-ignorables 
--font-funcs=ft:U+05D0,U+05D1:[uni05D1|uni05D0@542,0]
+../fonts/TestMORXForty.ttf:--font-size=1000 --ned --remove-default-ignorables 
--font-funcs=ft:U+05D1,U+05D0:[uni05D0.alt|uni05D1.alt@1000,0]
commit fdce1e15434f14b7f4802edd67f7af737cf2b075
Author: Behdad Esfahbod <beh...@behdad.org>
Date:   Sun Oct 7 14:01:33 2018 -0400

    [kerx] Clean up kerx and KerxTable structures

diff --git a/src/hb-aat-layout-kerx-table.hh b/src/hb-aat-layout-kerx-table.hh
index 615a8f8d..21fd26b4 100644
--- a/src/hb-aat-layout-kerx-table.hh
+++ b/src/hb-aat-layout-kerx-table.hh
@@ -30,7 +30,6 @@
 
 #include "hb-open-type.hh"
 #include "hb-aat-layout-common.hh"
-#include "hb-aat-layout-ankr-table.hh"
 
 /*
  * kerx -- Extended Kerning
@@ -71,6 +70,14 @@ struct KerxSubTableFormat0
   //     return 0;
   //   return pairs[i].get_kerning ();
   // }
+  inline bool apply (hb_aat_apply_context_t *c) const
+  {
+    TRACE_APPLY (this);
+
+    /* TODO */
+
+    return_trace (true);
+  }
 
   inline bool sanitize (hb_sanitize_context_t *c) const
   {
@@ -96,6 +103,15 @@ struct KerxSubTableFormat0
 
 struct KerxSubTableFormat1
 {
+  inline bool apply (hb_aat_apply_context_t *c) const
+  {
+    TRACE_APPLY (this);
+
+    /* TODO */
+
+    return_trace (true);
+  }
+
   inline bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
@@ -145,6 +161,15 @@ struct KerxSubTableFormat2
     return *v;
   }
 
+  inline bool apply (hb_aat_apply_context_t *c) const
+  {
+    TRACE_APPLY (this);
+
+    /* TODO */
+
+    return_trace (true);
+  }
+
   inline bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
@@ -172,6 +197,15 @@ struct KerxSubTableFormat2
 
 struct KerxSubTableFormat4
 {
+  inline bool apply (hb_aat_apply_context_t *c) const
+  {
+    TRACE_APPLY (this);
+
+    /* TODO */
+
+    return_trace (true);
+  }
+
   inline bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
@@ -199,6 +233,15 @@ struct KerxSubTableFormat4
 
 struct KerxSubTableFormat6
 {
+  inline bool apply (hb_aat_apply_context_t *c) const
+  {
+    TRACE_APPLY (this);
+
+    /* TODO */
+
+    return_trace (true);
+  }
+
   inline bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
@@ -221,47 +264,55 @@ struct KerxSubTableFormat6
   DEFINE_SIZE_STATIC (24);
 };
 
-enum coverage_flags_t
-{
-  COVERAGE_VERTICAL_FLAG       = 0x80u,
-  COVERAGE_CROSSSTREAM_FLAG    = 0x40u,
-  COVERAGE_VARIATION_FLAG      = 0x20u,
-  COVERAGE_PROCESS_DIRECTION   = 0x10u,
-};
-
 struct KerxTable
 {
-  inline bool apply (hb_aat_apply_context_t *c, const AAT::ankr *ankr) const
+  inline unsigned int get_size (void) const { return length; }
+  inline unsigned int get_type (void) const { return coverage & SubtableType; }
+
+  enum Coverage
   {
-    TRACE_APPLY (this);
-    /* TODO */
-    return_trace (false);
+    Vertical           = 0x80000000,   /* Set if table has vertical kerning 
values. */
+    CrossStream                = 0x40000000,   /* Set if table has 
cross-stream kerning values. */
+    Variation          = 0x20000000,   /* Set if table has variation kerning 
values. */
+    ProcessDirection   = 0x10000000,   /* If clear, process the glyphs 
forwards, that
+                                        * is, from first to last in the glyph 
stream.
+                                        * If we, process them from last to 
first.
+                                        * This flag only applies to 
state-table based
+                                        * 'kerx' subtables (types 1 and 4). */
+    Reserved           = 0x0FFFFF00,   /* Reserved, set to zero. */
+    SubtableType       = 0x000000FF,   /* Subtable type. */
+  };
+
+  template <typename context_t>
+  inline typename context_t::return_t dispatch (context_t *c) const
+  {
+    unsigned int subtable_type = get_type ();
+    TRACE_DISPATCH (this, subtable_type);
+    switch (subtable_type) {
+    case 0     :               return_trace (c->dispatch (u.format0));
+    case 1     :               return_trace (c->dispatch (u.format1));
+    case 2     :               return_trace (c->dispatch (u.format2));
+    case 4     :               return_trace (c->dispatch (u.format4));
+    case 6     :               return_trace (c->dispatch (u.format6));
+    default:                   return_trace (c->default_return_value ());
+    }
   }
 
-  inline unsigned int get_size (void) const { return length; }
-
   inline bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
-    if (unlikely (!c->check_struct (this)))
+    if (!length.sanitize (c) ||
+       length < min_size ||
+       !c->check_range (this, length))
       return_trace (false);
 
-    switch (format) {
-    case 0: return u.format0.sanitize (c);
-    case 1: return u.format1.sanitize (c);
-    case 2: return u.format2.sanitize (c);
-    case 4: return u.format4.sanitize (c);
-    case 6: return u.format6.sanitize (c);
-    default:return_trace (false);
-    }
+    return_trace (dispatch (c));
   }
 
 protected:
   HBUINT32     length;
-  HBUINT8      coverage;
-  HBUINT16     unused;
-  HBUINT8      format;
-  HBUINT32     tupleIndex;
+  HBUINT32     coverage;
+  HBUINT32     tupleCount;
   union {
   KerxSubTableFormat0  format0;
   KerxSubTableFormat1  format1;
@@ -273,7 +324,7 @@ public:
   DEFINE_SIZE_MIN (12);
 };
 
-struct SubtableGlyphCoverageArray
+struct SubtableXXX
 {
   inline bool sanitize (hb_sanitize_context_t *c) const
   {
@@ -289,55 +340,59 @@ struct SubtableGlyphCoverageArray
   DEFINE_SIZE_STATIC (12);
 };
 
+
+/*
+ * The 'kerx' Table
+ */
+
 struct kerx
 {
   static const hb_tag_t tableTag = HB_AAT_TAG_kerx;
 
-  inline bool apply (hb_aat_apply_context_t *c, const AAT::ankr *ankr) const
+  inline bool has_data (void) const { return version != 0; }
+
+  inline void apply (hb_aat_apply_context_t *c) const
   {
-    TRACE_APPLY (this);
-    const KerxTable &table = StructAfter<KerxTable> (*this);
-    return_trace (table.apply (c, ankr));
+    c->set_lookup_index (0);
+    const KerxTable *table = &firstTable;
+    unsigned int count = tableCount;
+    for (unsigned int i = 0; i < count; i++)
+    {
+      table->dispatch (c);
+      table = &StructAfter<KerxTable> (*table);
+    }
   }
 
   inline bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
-    if (unlikely (!(c->check_struct (this))))
-     return_trace (false);
-
-    /* TODO: Something like `morx`s ChainSubtable should be done here instead 
*/
-    const KerxTable *table = &StructAfter<KerxTable> (*this);
-    if (unlikely (!(table->sanitize (c))))
+    if (!version.sanitize (c) || version < 2 ||
+       !tableCount.sanitize (c))
       return_trace (false);
 
-    for (unsigned int i = 0; i < nTables - 1; ++i)
+    const KerxTable *table = &firstTable;
+    unsigned int count = tableCount;
+    for (unsigned int i = 0; i < count; i++)
     {
+      if (!table->sanitize (c))
+       return_trace (false);
       table = &StructAfter<KerxTable> (*table);
-      if (unlikely (!(table->sanitize (c))))
-        return_trace (false);
     }
 
-    // If version is less than 3, we are done here; otherwise better to check 
footer also
-    if (version < 3)
-      return_trace (true);
-
-    // TODO: Investigate why this just work on some fonts no matter of version
-    // const SubtableGlyphCoverageArray &footer =
-    //   StructAfter<SubtableGlyphCoverageArray> (*table);
-    // return_trace (footer.sanitize (c));
-
     return_trace (true);
   }
 
   protected:
-  HBUINT16             version;
-  HBUINT16             padding;
-  HBUINT32             nTables;
-/*KerxTable tablesZ[VAR]; XXX ArrayOf??? */
-/*SubtableGlyphCoverageArray coverage_array;*/
+  HBUINT16     version;        /* The version number of the extended kerning 
table
+                                * (currently 2, 3, or 4). */
+  HBUINT16     unused;         /* Set to 0. */
+  HBUINT32     tableCount;     /* The number of subtables included in the 
extended kerning
+                                * table. */
+  KerxTable    firstTable;     /* Subtables. */
+/*subtableGlyphCoverageArray*/ /* Only if version >= 3. We don't use. */
+
   public:
-  DEFINE_SIZE_STATIC (8);
+  DEFINE_SIZE_MIN (8);
 };
 
 } /* namespace AAT */
diff --git a/src/hb-aat-layout-morx-table.hh b/src/hb-aat-layout-morx-table.hh
index e9869036..63b937ba 100644
--- a/src/hb-aat-layout-morx-table.hh
+++ b/src/hb-aat-layout-morx-table.hh
@@ -940,7 +940,7 @@ struct Chain
 
 
 /*
- * The 'mort'/'morx' Tables
+ * The 'morx' Table
  */
 
 struct morx
_______________________________________________
HarfBuzz mailing list
HarfBuzz@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/harfbuzz

Reply via email to