Add fast-path for GPOS too

Shaves another 3% for DejaVu Sans long Latin strings.
This commit is contained in:
Behdad Esfahbod 2012-06-09 02:53:57 -04:00
parent 993c51915f
commit 4e766ff28d
1 changed files with 14 additions and 2 deletions

View File

@ -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<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. */
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> 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);
};