src/hb-aat-layout-kerx-table.hh | 12 +- src/hb-ot-kern-table.hh | 231 +++++++++++++++++++--------------------- test/api/Makefile.am | 4 3 files changed, 118 insertions(+), 129 deletions(-)
New commits: commit bfafe208da11817b5ebf3751f02af2dcdf57bd19 Author: Behdad Esfahbod <beh...@behdad.org> Date: Tue Nov 6 12:11:45 2018 -0500 [kern] Switch to dispatch diff --git a/src/hb-aat-layout-kerx-table.hh b/src/hb-aat-layout-kerx-table.hh index d2242c54..ca2fdb49 100644 --- a/src/hb-aat-layout-kerx-table.hh +++ b/src/hb-aat-layout-kerx-table.hh @@ -637,12 +637,12 @@ struct KerxTable 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 ()); + 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 ()); } } diff --git a/src/hb-ot-kern-table.hh b/src/hb-ot-kern-table.hh index 1073530d..66e827d1 100644 --- a/src/hb-ot-kern-table.hh +++ b/src/hb-ot-kern-table.hh @@ -476,6 +476,7 @@ template <typename KernSubTableHeader> struct KernSubTable { inline unsigned int get_size (void) const { return u.header.length; } + inline unsigned int get_type (void) const { return u.header.format; } inline bool is_simple (void) const { return !(u.header.coverage & (u.header.CrossStream | u.header.Variation)); } @@ -488,21 +489,24 @@ struct KernSubTable inline int get_kerning (hb_codepoint_t left, hb_codepoint_t right) const { - switch (u.header.format) { + switch (get_type ()) { /* This method hooks up to hb_font_t's get_h_kerning. Only support Format0. */ case 0: return u.format0.get_kerning (left, right); default:return 0; } } - inline void apply (AAT::hb_aat_apply_context_t *c) const + template <typename context_t> + inline typename context_t::return_t dispatch (context_t *c) const { - switch (u.header.format) { - case 0: u.format0.apply (c); return; - case 1: u.format1.apply (c); return; - case 2: u.format2.apply (c); return; - case 3: u.format3.apply (c); return; - default: return; + 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 3: return_trace (c->dispatch (u.format3)); + default: return_trace (c->default_return_value ()); } } @@ -512,13 +516,8 @@ struct KernSubTable if (unlikely (!u.header.sanitize (c) || u.header.length < u.header.min_size || !c->check_range (this, u.header.length))) return_trace (false); - switch (u.header.format) { - case 0: return_trace (u.format0.sanitize (c)); - case 1: return_trace (u.format1.sanitize (c)); - case 2: return_trace (u.format2.sanitize (c)); - case 3: return_trace (u.format3.sanitize (c)); - default:return_trace (true); - } + + return_trace (dispatch (c)); } protected: @@ -591,7 +590,7 @@ struct KernTable c->sanitizer.set_object (*st); - st->apply (c); + st->dispatch (c); (void) c->buffer->message (c->font, "end kern subtable %d", c->lookup_index); commit 213fa3bf711dae5028e3d041e305cdd35223de77 Author: Behdad Esfahbod <beh...@behdad.org> Date: Tue Nov 6 12:07:15 2018 -0500 [kern] Refactor to include header in each subtable type diff --git a/src/hb-ot-kern-table.hh b/src/hb-ot-kern-table.hh index e9d7e301..1073530d 100644 --- a/src/hb-ot-kern-table.hh +++ b/src/hb-ot-kern-table.hh @@ -155,6 +155,7 @@ struct KernPair DEFINE_SIZE_STATIC (6); }; +template <typename KernSubTableHeader> struct KernSubTableFormat0 { inline int get_kerning (hb_codepoint_t left, hb_codepoint_t right) const @@ -186,11 +187,13 @@ struct KernSubTableFormat0 } protected: - BinSearchArrayOf<KernPair> pairs; /* Array of kerning pairs. */ + KernSubTableHeader header; + BinSearchArrayOf<KernPair> pairs; /* Array of kerning pairs. */ public: - DEFINE_SIZE_ARRAY (8, pairs); + DEFINE_SIZE_ARRAY (KernSubTableHeader::static_size + 8, pairs); }; +template <typename KernSubTableHeader> struct KernSubTableFormat1 { typedef void EntryData; @@ -309,10 +312,11 @@ struct KernSubTableFormat1 } protected: + KernSubTableHeader header; AAT::StateTable<AAT::MortTypes, EntryData> machine; OffsetTo<UnsizedArrayOf<FWORD>, HBUINT16, false> kernAction; public: - DEFINE_SIZE_STATIC (10); + DEFINE_SIZE_STATIC (KernSubTableHeader::static_size + 10); }; struct KernClassTable @@ -333,6 +337,7 @@ struct KernClassTable DEFINE_SIZE_ARRAY (4, classes); }; +template <typename KernSubTableHeader> struct KernSubTableFormat2 { inline int get_kerning (hb_codepoint_t left, hb_codepoint_t right, @@ -393,20 +398,19 @@ struct KernSubTableFormat2 } protected: - HBUINT16 rowWidth; /* The width, in bytes, of a row in the table. */ - OffsetTo<KernClassTable> - leftClassTable; /* Offset from beginning of this subtable to - * left-hand class table. */ - OffsetTo<KernClassTable> - rightClassTable;/* Offset from beginning of this subtable to - * right-hand class table. */ - OffsetTo<FWORD> - array; /* Offset from beginning of this subtable to - * the start of the kerning array. */ + KernSubTableHeader header; + HBUINT16 rowWidth; /* The width, in bytes, of a row in the table. */ + OffsetTo<KernClassTable> leftClassTable; /* Offset from beginning of this subtable to + * left-hand class table. */ + OffsetTo<KernClassTable> rightClassTable;/* Offset from beginning of this subtable to + * right-hand class table. */ + OffsetTo<FWORD> array; /* Offset from beginning of this subtable to + * the start of the kerning array. */ public: - DEFINE_SIZE_MIN (8); + DEFINE_SIZE_MIN (KernSubTableHeader::static_size + 8); }; +template <typename KernSubTableHeader> struct KernSubTableFormat3 { inline int get_kerning (hb_codepoint_t left, hb_codepoint_t right) const @@ -448,44 +452,52 @@ struct KernSubTableFormat3 } protected: - HBUINT16 glyphCount; /* The number of glyphs in this font. */ - HBUINT8 kernValueCount; /* The number of kerning values. */ - HBUINT8 leftClassCount; /* The number of left-hand classes. */ - HBUINT8 rightClassCount;/* The number of right-hand classes. */ - HBUINT8 flags; /* Set to zero (reserved for future use). */ - UnsizedArrayOf<FWORD> - kernValueZ; /* The kerning values. - * Length kernValueCount. */ + KernSubTableHeader header; + HBUINT16 glyphCount; /* The number of glyphs in this font. */ + HBUINT8 kernValueCount; /* The number of kerning values. */ + HBUINT8 leftClassCount; /* The number of left-hand classes. */ + HBUINT8 rightClassCount;/* The number of right-hand classes. */ + HBUINT8 flags; /* Set to zero (reserved for future use). */ + UnsizedArrayOf<FWORD> kernValueZ; /* The kerning values. + * Length kernValueCount. */ #if 0 - UnsizedArrayOf<HBUINT8> - leftClass; /* The left-hand classes. - * Length glyphCount. */ - UnsizedArrayOf<HBUINT8> - RightClass; /* The right-hand classes. - * Length glyphCount. */ - UnsizedArrayOf<HBUINT8> - kernIndex; /* The indices into the kernValue array. - * Length leftClassCount * rightClassCount */ + UnsizedArrayOf<HBUINT8>leftClass; /* The left-hand classes. + * Length glyphCount. */ + UnsizedArrayOf<HBUINT8>rightClass; /* The right-hand classes. + * Length glyphCount. */ + UnsizedArrayOf<HBUINT8>kernIndex; /* The indices into the kernValue array. + * Length leftClassCount * rightClassCount */ #endif public: - DEFINE_SIZE_ARRAY (6, kernValueZ); + DEFINE_SIZE_ARRAY (KernSubTableHeader::static_size + 6, kernValueZ); }; +template <typename KernSubTableHeader> struct KernSubTable { - inline int get_kerning (hb_codepoint_t left, hb_codepoint_t right, unsigned int format) const + inline unsigned int get_size (void) const { return u.header.length; } + + inline bool is_simple (void) const + { return !(u.header.coverage & (u.header.CrossStream | u.header.Variation)); } + + inline bool is_horizontal (void) const + { return (u.header.coverage & u.header.Direction) == u.header.DirectionHorizontal; } + + inline bool is_override (void) const + { return bool (u.header.coverage & u.header.Override); } + + inline int get_kerning (hb_codepoint_t left, hb_codepoint_t right) const { - switch (format) { + switch (u.header.format) { /* This method hooks up to hb_font_t's get_h_kerning. Only support Format0. */ case 0: return u.format0.get_kerning (left, right); default:return 0; } } - inline void apply (AAT::hb_aat_apply_context_t *c, unsigned int format) const + inline void apply (AAT::hb_aat_apply_context_t *c) const { - /* TODO Switch to dispatch(). */ - switch (format) { + switch (u.header.format) { case 0: u.format0.apply (c); return; case 1: u.format1.apply (c); return; case 2: u.format2.apply (c); return; @@ -494,10 +506,13 @@ struct KernSubTable } } - inline bool sanitize (hb_sanitize_context_t *c, unsigned int format) const + inline bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); - switch (format) { + if (unlikely (!u.header.sanitize (c) || + u.header.length < u.header.min_size || + !c->check_range (this, u.header.length))) return_trace (false); + switch (u.header.format) { case 0: return_trace (u.format0.sanitize (c)); case 1: return_trace (u.format1.sanitize (c)); case 2: return_trace (u.format2.sanitize (c)); @@ -508,10 +523,11 @@ struct KernSubTable protected: union { - KernSubTableFormat0 format0; - KernSubTableFormat1 format1; - KernSubTableFormat2 format2; - KernSubTableFormat3 format3; + KernSubTableHeader header; + KernSubTableFormat0<KernSubTableHeader> format0; + KernSubTableFormat1<KernSubTableHeader> format1; + KernSubTableFormat2<KernSubTableHeader> format2; + KernSubTableFormat3<KernSubTableHeader> format3; } u; public: DEFINE_SIZE_MIN (0); @@ -519,39 +535,6 @@ struct KernSubTable template <typename T> -struct KernSubTableWrapper -{ - /* https://en.wikipedia.org/wiki/Curiously_recurring_template_pattern */ - inline const T* thiz (void) const { return static_cast<const T *> (this); } - - inline bool is_simple (void) const - { return !(thiz()->coverage & (T::CrossStream | T::Variation)); } - - inline bool is_horizontal (void) const - { return (thiz()->coverage & T::Direction) == T::DirectionHorizontal; } - - inline bool is_override (void) const - { return bool (thiz()->coverage & T::Override); } - - inline int get_kerning (hb_codepoint_t left, hb_codepoint_t right) const - { return thiz()->subtable.get_kerning (left, right, thiz()->format); } - - inline void apply (AAT::hb_aat_apply_context_t *c) const - { thiz()->subtable.apply (c, thiz()->format); } - - inline unsigned int get_size (void) const { return thiz()->length; } - - inline bool sanitize (hb_sanitize_context_t *c) const - { - TRACE_SANITIZE (this); - return_trace (c->check_struct (thiz()) && - thiz()->length >= T::min_size && - c->check_range (thiz(), thiz()->length) && - thiz()->subtable.sanitize (c, thiz()->format)); - } -}; - -template <typename T> struct KernTable { /* https://en.wikipedia.org/wiki/Curiously_recurring_template_pattern */ @@ -559,8 +542,10 @@ struct KernTable inline int get_h_kerning (hb_codepoint_t left, hb_codepoint_t right) const { + typedef KernSubTable<typename T::SubTableHeader> SubTable; + int v = 0; - const typename T::SubTableWrapper *st = CastP<typename T::SubTableWrapper> (&thiz()->dataZ); + const SubTable *st = CastP<SubTable> (&thiz()->dataZ); unsigned int count = thiz()->nTables; for (unsigned int i = 0; i < count; i++) { @@ -569,15 +554,17 @@ struct KernTable if (st->is_override ()) v = 0; v += st->get_kerning (left, right); - st = &StructAfter<typename T::SubTableWrapper> (*st); + st = &StructAfter<SubTable> (*st); } return v; } inline void apply (AAT::hb_aat_apply_context_t *c) const { + typedef KernSubTable<typename T::SubTableHeader> SubTable; + c->set_lookup_index (0); - const typename T::SubTableWrapper *st = CastP<typename T::SubTableWrapper> (&thiz()->dataZ); + const SubTable *st = CastP<SubTable> (&thiz()->dataZ); unsigned int count = thiz()->nTables; /* If there's an override subtable, skip subtables before that. */ unsigned int last_override = 0; @@ -585,9 +572,9 @@ struct KernTable { if (st->is_simple () && st->is_override ()) last_override = i; - st = &StructAfter<typename T::SubTableWrapper> (*st); + st = &StructAfter<SubTable> (*st); } - st = CastP<typename T::SubTableWrapper> (&thiz()->dataZ); + st = CastP<SubTable> (&thiz()->dataZ); for (unsigned int i = 0; i < count; i++) { if (!st->is_simple ()) @@ -609,7 +596,7 @@ struct KernTable (void) c->buffer->message (c->font, "end kern subtable %d", c->lookup_index); skip: - st = &StructAfter<typename T::SubTableWrapper> (*st); + st = &StructAfter<SubTable> (*st); } } @@ -620,13 +607,15 @@ struct KernTable thiz()->version != T::VERSION)) return_trace (false); - const typename T::SubTableWrapper *st = CastP<typename T::SubTableWrapper> (&thiz()->dataZ); + typedef KernSubTable<typename T::SubTableHeader> SubTable; + + const SubTable *st = CastP<SubTable> (&thiz()->dataZ); unsigned int count = thiz()->nTables; for (unsigned int i = 0; i < count; i++) { if (unlikely (!st->sanitize (c))) return_trace (false); - st = &StructAfter<typename T::SubTableWrapper> (*st); + st = &StructAfter<SubTable> (*st); } return_trace (true); @@ -639,11 +628,8 @@ struct KernOT : KernTable<KernOT> static const uint16_t VERSION = 0x0000u; - struct SubTableWrapper : KernSubTableWrapper<SubTableWrapper> + struct SubTableHeader { - friend struct KernTable<KernOT>; - friend struct KernSubTableWrapper<SubTableWrapper>; - enum Coverage { Direction = 0x01u, @@ -656,14 +642,19 @@ struct KernOT : KernTable<KernOT> DirectionHorizontal= 0x01u }; - protected: + inline bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + return_trace (c->check_struct (this)); + } + + public: HBUINT16 versionZ; /* Unused. */ HBUINT16 length; /* Length of the subtable (including this header). */ HBUINT8 format; /* Subtable format. */ HBUINT8 coverage; /* Coverage bits. */ - KernSubTable subtable; /* Subtable data. */ public: - DEFINE_SIZE_MIN (6); + DEFINE_SIZE_STATIC (6); }; protected: @@ -680,11 +671,8 @@ struct KernAAT : KernTable<KernAAT> static const uint32_t VERSION = 0x00010000u; - struct SubTableWrapper : KernSubTableWrapper<SubTableWrapper> + struct SubTableHeader { - friend struct KernTable<KernAAT>; - friend struct KernSubTableWrapper<SubTableWrapper>; - enum Coverage { Direction = 0x80u, @@ -696,15 +684,20 @@ struct KernAAT : KernTable<KernAAT> DirectionHorizontal= 0x00u }; - protected: + inline bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + return_trace (c->check_struct (this)); + } + + public: HBUINT32 length; /* Length of the subtable (including this header). */ HBUINT8 coverage; /* Coverage bits. */ HBUINT8 format; /* Subtable format. */ HBUINT16 tupleIndex; /* The tuple index (used for variations fonts). * This value specifies which tuple this subtable covers. */ - KernSubTable subtable; /* Subtable data. */ public: - DEFINE_SIZE_MIN (8); + DEFINE_SIZE_STATIC (8); }; protected: commit b0da2cd0b9c1346b7cda5997fb799e895e34aace Author: Behdad Esfahbod <beh...@behdad.org> Date: Tue Nov 6 11:16:45 2018 -0500 [kern] Some more diff --git a/src/hb-ot-kern-table.hh b/src/hb-ot-kern-table.hh index 2f27dcf4..e9d7e301 100644 --- a/src/hb-ot-kern-table.hh +++ b/src/hb-ot-kern-table.hh @@ -536,9 +536,6 @@ struct KernSubTableWrapper inline int get_kerning (hb_codepoint_t left, hb_codepoint_t right) const { return thiz()->subtable.get_kerning (left, right, thiz()->format); } - inline int get_h_kerning (hb_codepoint_t left, hb_codepoint_t right) const - { return is_simple () && is_horizontal () ? get_kerning (left, right) : 0; } - inline void apply (AAT::hb_aat_apply_context_t *c) const { thiz()->subtable.apply (c, thiz()->format); } @@ -567,9 +564,11 @@ struct KernTable unsigned int count = thiz()->nTables; for (unsigned int i = 0; i < count; i++) { - if (st->is_simple () && st->is_override ()) + if (!st->is_simple () || !st->is_horizontal ()) + continue; + if (st->is_override ()) v = 0; - v += st->get_h_kerning (left, right); + v += st->get_kerning (left, right); st = &StructAfter<typename T::SubTableWrapper> (*st); } return v; commit 75b00b51c8fca5d605c479333eb3abd608623613 Author: Behdad Esfahbod <beh...@behdad.org> Date: Tue Nov 6 11:13:40 2018 -0500 [kern] Renames diff --git a/src/hb-ot-kern-table.hh b/src/hb-ot-kern-table.hh index 5bc9e436..2f27dcf4 100644 --- a/src/hb-ot-kern-table.hh +++ b/src/hb-ot-kern-table.hh @@ -524,11 +524,11 @@ struct KernSubTableWrapper /* https://en.wikipedia.org/wiki/Curiously_recurring_template_pattern */ inline const T* thiz (void) const { return static_cast<const T *> (this); } - inline bool is_supported (void) const - { return !(thiz()->coverage & T::CheckFlags); } + inline bool is_simple (void) const + { return !(thiz()->coverage & (T::CrossStream | T::Variation)); } inline bool is_horizontal (void) const - { return (thiz()->coverage & T::Direction) == T::CheckHorizontal; } + { return (thiz()->coverage & T::Direction) == T::DirectionHorizontal; } inline bool is_override (void) const { return bool (thiz()->coverage & T::Override); } @@ -537,7 +537,7 @@ struct KernSubTableWrapper { return thiz()->subtable.get_kerning (left, right, thiz()->format); } inline int get_h_kerning (hb_codepoint_t left, hb_codepoint_t right) const - { return is_supported () && is_horizontal () ? get_kerning (left, right) : 0; } + { return is_simple () && is_horizontal () ? get_kerning (left, right) : 0; } inline void apply (AAT::hb_aat_apply_context_t *c) const { thiz()->subtable.apply (c, thiz()->format); } @@ -567,7 +567,7 @@ struct KernTable unsigned int count = thiz()->nTables; for (unsigned int i = 0; i < count; i++) { - if (st->is_supported () && st->is_override ()) + if (st->is_simple () && st->is_override ()) v = 0; v += st->get_h_kerning (left, right); st = &StructAfter<typename T::SubTableWrapper> (*st); @@ -584,14 +584,14 @@ struct KernTable unsigned int last_override = 0; for (unsigned int i = 0; i < count; i++) { - if (st->is_supported () && st->is_override ()) + if (st->is_simple () && st->is_override ()) last_override = i; st = &StructAfter<typename T::SubTableWrapper> (*st); } st = CastP<typename T::SubTableWrapper> (&thiz()->dataZ); for (unsigned int i = 0; i < count; i++) { - if (!st->is_supported ()) + if (!st->is_simple ()) goto skip; if (HB_DIRECTION_IS_HORIZONTAL (c->buffer->props.direction) != st->is_horizontal ()) @@ -654,8 +654,7 @@ struct KernOT : KernTable<KernOT> Variation = 0x00u, /* Not supported. */ - CheckFlags = 0x06u, - CheckHorizontal = 0x01u + DirectionHorizontal= 0x01u }; protected: @@ -695,8 +694,7 @@ struct KernAAT : KernTable<KernAAT> Override = 0x00u, /* Not supported. */ - CheckFlags = 0x60u, - CheckHorizontal = 0x00u + DirectionHorizontal= 0x00u }; protected: commit 5c3ccbc634158ba9f84d365c9a31a596f6d8825b Author: Khaled Hosny <khaledho...@eglug.org> Date: Tue Nov 6 18:10:56 2018 +0200 Another missing backlash Did this ever work? diff --git a/test/api/Makefile.am b/test/api/Makefile.am index 67044489..947832b8 100644 --- a/test/api/Makefile.am +++ b/test/api/Makefile.am @@ -150,7 +150,7 @@ check-gtester: VALGRIND_FLAGS = \ --tool=memcheck \ --track-origins=yes \ - --leak-check=yes + --leak-check=yes \ $(EXTRA_VALGRIND_FLAGS) # Can't do for now: --show-reachable=yes CLEANFILES += log-valgrind.txt commit d29602b962c13836f4c0d46796bc693f66f9b9fe Author: Khaled Hosny <khaledho...@eglug.org> Date: Tue Nov 6 18:07:47 2018 +0200 Add missing backslash diff --git a/test/api/Makefile.am b/test/api/Makefile.am index e6e08a25..67044489 100644 --- a/test/api/Makefile.am +++ b/test/api/Makefile.am @@ -148,7 +148,7 @@ check-gtester: # Check tests under valgrind. Saves log to log-valgrind.txt VALGRIND_FLAGS = \ - --tool=memcheck + --tool=memcheck \ --track-origins=yes \ --leak-check=yes $(EXTRA_VALGRIND_FLAGS) _______________________________________________ HarfBuzz mailing list HarfBuzz@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/harfbuzz