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:
parent
f19e0b0099
commit
993c51915f
|
@ -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 {
|
||||||
|
struct {
|
||||||
USHORT sub_format;
|
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);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue