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