[layout] Use buffer-digest for GSUB as well
Combined with previous commit, this shows up to 12% speed up with Roboto and the en-words (ie. short strings) benchmark, about 5% for longer English tests, and no adverse effect on heavier fonts.
This commit is contained in:
parent
15b6c32599
commit
654a2eafc8
|
@ -1908,15 +1908,16 @@ apply_backward (OT::hb_ot_apply_context_t *c,
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename Proxy>
|
template <typename Proxy>
|
||||||
static inline void
|
static inline bool
|
||||||
apply_string (OT::hb_ot_apply_context_t *c,
|
apply_string (OT::hb_ot_apply_context_t *c,
|
||||||
const typename Proxy::Lookup &lookup,
|
const typename Proxy::Lookup &lookup,
|
||||||
const OT::hb_ot_layout_lookup_accelerator_t &accel)
|
const OT::hb_ot_layout_lookup_accelerator_t &accel)
|
||||||
{
|
{
|
||||||
|
bool ret = false;
|
||||||
hb_buffer_t *buffer = c->buffer;
|
hb_buffer_t *buffer = c->buffer;
|
||||||
|
|
||||||
if (unlikely (!buffer->len || !c->lookup_mask))
|
if (unlikely (!buffer->len || !c->lookup_mask))
|
||||||
return;
|
return ret;
|
||||||
|
|
||||||
c->set_lookup_props (lookup.get_props ());
|
c->set_lookup_props (lookup.get_props ());
|
||||||
|
|
||||||
|
@ -1927,7 +1928,7 @@ apply_string (OT::hb_ot_apply_context_t *c,
|
||||||
buffer->clear_output ();
|
buffer->clear_output ();
|
||||||
|
|
||||||
buffer->idx = 0;
|
buffer->idx = 0;
|
||||||
apply_forward (c, accel);
|
ret = apply_forward (c, accel);
|
||||||
|
|
||||||
if (!Proxy::always_inplace)
|
if (!Proxy::always_inplace)
|
||||||
buffer->sync ();
|
buffer->sync ();
|
||||||
|
@ -1937,8 +1938,10 @@ apply_string (OT::hb_ot_apply_context_t *c,
|
||||||
/* in-place backward substitution/positioning */
|
/* in-place backward substitution/positioning */
|
||||||
assert (!buffer->have_output);
|
assert (!buffer->have_output);
|
||||||
buffer->idx = buffer->len - 1;
|
buffer->idx = buffer->len - 1;
|
||||||
apply_backward (c, accel);
|
ret = apply_backward (c, accel);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename Proxy>
|
template <typename Proxy>
|
||||||
|
@ -1954,7 +1957,6 @@ inline void hb_ot_map_t::apply (const Proxy &proxy,
|
||||||
|
|
||||||
hb_set_digest_t digest;
|
hb_set_digest_t digest;
|
||||||
digest.init ();
|
digest.init ();
|
||||||
if (proxy.table_index == 1) /* GPOS */
|
|
||||||
digest.add_array (&buffer->info[0].codepoint,
|
digest.add_array (&buffer->info[0].codepoint,
|
||||||
buffer->len,
|
buffer->len,
|
||||||
sizeof (buffer->info[0]));
|
sizeof (buffer->info[0]));
|
||||||
|
@ -1967,8 +1969,7 @@ inline void hb_ot_map_t::apply (const Proxy &proxy,
|
||||||
unsigned int lookup_index = lookups[table_index][i].index;
|
unsigned int lookup_index = lookups[table_index][i].index;
|
||||||
if (!buffer->message (font, "start lookup %d", lookup_index)) continue;
|
if (!buffer->message (font, "start lookup %d", lookup_index)) continue;
|
||||||
|
|
||||||
if (table_index != 1 ||
|
if (proxy.accels[lookup_index].digest.may_have (digest))
|
||||||
proxy.accels[lookup_index].digest.may_have (digest))
|
|
||||||
{
|
{
|
||||||
c.set_lookup_index (lookup_index);
|
c.set_lookup_index (lookup_index);
|
||||||
c.set_lookup_mask (lookups[table_index][i].mask);
|
c.set_lookup_mask (lookups[table_index][i].mask);
|
||||||
|
@ -1977,9 +1978,16 @@ inline void hb_ot_map_t::apply (const Proxy &proxy,
|
||||||
c.set_random (lookups[table_index][i].random);
|
c.set_random (lookups[table_index][i].random);
|
||||||
c.set_per_syllable (lookups[table_index][i].per_syllable);
|
c.set_per_syllable (lookups[table_index][i].per_syllable);
|
||||||
|
|
||||||
apply_string<Proxy> (&c,
|
if (apply_string<Proxy> (&c,
|
||||||
proxy.table.get_lookup (lookup_index),
|
proxy.table.get_lookup (lookup_index),
|
||||||
proxy.accels[lookup_index]);
|
proxy.accels[lookup_index]) &&
|
||||||
|
table_index == 0)
|
||||||
|
{
|
||||||
|
digest.init ();
|
||||||
|
digest.add_array (&buffer->info[0].codepoint,
|
||||||
|
buffer->len,
|
||||||
|
sizeof (buffer->info[0]));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
(void) buffer->message (font, "end lookup %d", lookup_index);
|
(void) buffer->message (font, "end lookup %d", lookup_index);
|
||||||
|
|
Loading…
Reference in New Issue