src/hb-aat-layout-kerx-table.hh | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-)
New commits: commit 9552f4ef0da0b7e1fb28cb2738b865888e7941d9 Author: Behdad Esfahbod <[email protected]> Date: Fri Nov 23 15:24:17 2018 -0500 [kern] Don't enforce length of last subtable diff --git a/src/hb-aat-layout-kerx-table.hh b/src/hb-aat-layout-kerx-table.hh index 74fecbb1..c60f29a6 100644 --- a/src/hb-aat-layout-kerx-table.hh +++ b/src/hb-aat-layout-kerx-table.hh @@ -936,7 +936,11 @@ struct KerxTable if (reverse) c->buffer->reverse (); - c->sanitizer.set_object (*st); + /* See comment in sanitize() for conditional here. */ + if (i < count - 1) + c->sanitizer.set_object (*st); + else + c->sanitizer.reset_object (); ret |= st->dispatch (c); @@ -968,7 +972,18 @@ struct KerxTable unsigned int count = thiz()->tableCount; for (unsigned int i = 0; i < count; i++) { - c->set_object (*st); + /* 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. */ + if (i < count - 1) + c->set_object (*st); + else + c->reset_object (); + if (unlikely (!st->sanitize (c))) return_trace (false); st = &StructAfter<SubTable> (*st); _______________________________________________ HarfBuzz mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/harfbuzz
