Add fast-path to GSUB to check coverage

Shaves a good 10% off DejaVu Sans with simple Latin text for me.
Now, DejaVu is very ChainContext-intensive, but it's also a very
popular font!
This commit is contained in:
Behdad Esfahbod 2012-06-09 02:48:16 -04:00
parent f19e0b0099
commit 993c51915f
1 changed files with 16 additions and 2 deletions

View File

@ -968,6 +968,17 @@ struct SubstLookupSubTable
inline bool apply (hb_apply_context_t *c, unsigned int lookup_type) const inline bool apply (hb_apply_context_t *c, unsigned int lookup_type) const
{ {
TRACE_APPLY (); TRACE_APPLY ();
if (likely (lookup_type < Context) ||
(hb_in_range<unsigned int> (lookup_type, Context, ChainContext) &&
hb_in_range<unsigned int> (u.header.sub_format, 1, 2)))
{
/* Fast path, for most that have coverage in the same place.
* Note that ReverseChainSingle can also go through this but
* it's not worth the effort. */
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) { switch (lookup_type) {
case Single: return TRACE_RETURN (u.single.apply (c)); case Single: return TRACE_RETURN (u.single.apply (c));
case Multiple: return TRACE_RETURN (u.multiple.apply (c)); case Multiple: return TRACE_RETURN (u.multiple.apply (c));
@ -998,7 +1009,10 @@ struct SubstLookupSubTable
private: private:
union { union {
USHORT sub_format; struct {
USHORT sub_format;
OffsetTo<Coverage> coverage;
} header;
SingleSubst single; SingleSubst single;
MultipleSubst multiple; MultipleSubst multiple;
AlternateSubst alternate; AlternateSubst alternate;
@ -1009,7 +1023,7 @@ struct SubstLookupSubTable
ReverseChainSingleSubst reverseChainContextSingle; ReverseChainSingleSubst reverseChainContextSingle;
} u; } u;
public: public:
DEFINE_SIZE_UNION (2, sub_format); DEFINE_SIZE_UNION (2, header.sub_format);
}; };