diff --git a/src/hb-ot-layout-gpos-table.hh b/src/hb-ot-layout-gpos-table.hh index 0b7f54829..b8262641e 100644 --- a/src/hb-ot-layout-gpos-table.hh +++ b/src/hb-ot-layout-gpos-table.hh @@ -1311,6 +1311,15 @@ struct PosLookupSubTable inline bool apply (hb_apply_context_t *c, unsigned int lookup_type) const { TRACE_APPLY (); + if (likely (lookup_type < Context) || + (hb_in_range (lookup_type, Context, ChainContext) && + hb_in_range (u.header.sub_format, 1, 2))) + { + /* Fast path, for most that have coverage in the same place. */ + hb_codepoint_t glyph_id = c->buffer->cur().codepoint; + unsigned int index = (this+u.header.coverage) (glyph_id); + if (likely (index == NOT_COVERED)) return TRACE_RETURN (false); + } switch (lookup_type) { case Single: return TRACE_RETURN (u.single.apply (c)); case Pair: return TRACE_RETURN (u.pair.apply (c)); @@ -1343,7 +1352,10 @@ struct PosLookupSubTable private: union { - USHORT sub_format; + struct { + USHORT sub_format; + OffsetTo coverage; + } header; SinglePos single; PairPos pair; CursivePos cursive; @@ -1355,7 +1367,7 @@ struct PosLookupSubTable ExtensionPos extension; } u; public: - DEFINE_SIZE_UNION (2, sub_format); + DEFINE_SIZE_UNION (2, header.sub_format); };