From 4e766ff28d1fb831ded20666799787478129c07c Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Sat, 9 Jun 2012 02:53:57 -0400 Subject: [PATCH] Add fast-path for GPOS too Shaves another 3% for DejaVu Sans long Latin strings. --- src/hb-ot-layout-gpos-table.hh | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) 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); };