[layout] Keep digest updated in the context

Don't recompute digest after every (applied) GSUB lookup.
This commit is contained in:
Behdad Esfahbod 2022-11-16 16:57:44 -07:00
parent a5964a2d2a
commit 8b2a211123
2 changed files with 19 additions and 16 deletions

View File

@ -686,6 +686,7 @@ struct hb_ot_apply_context_t :
bool random = false; bool random = false;
uint32_t random_state = 1; uint32_t random_state = 1;
unsigned new_syllables = (unsigned) -1; unsigned new_syllables = (unsigned) -1;
hb_set_digest_t digest;
hb_ot_apply_context_t (unsigned int table_index_, hb_ot_apply_context_t (unsigned int table_index_,
hb_font_t *font_, hb_font_t *font_,
@ -708,7 +709,8 @@ struct hb_ot_apply_context_t :
#endif #endif
), ),
direction (buffer_->props.direction), direction (buffer_->props.direction),
has_glyph_classes (gdef.has_glyph_classes ()) has_glyph_classes (gdef.has_glyph_classes ()),
digest (buffer_->digest ())
{ init_iters (); } { init_iters (); }
~hb_ot_apply_context_t () ~hb_ot_apply_context_t ()
@ -781,8 +783,10 @@ struct hb_ot_apply_context_t :
void _set_glyph_class (hb_codepoint_t glyph_index, void _set_glyph_class (hb_codepoint_t glyph_index,
unsigned int class_guess = 0, unsigned int class_guess = 0,
bool ligature = false, bool ligature = false,
bool component = false) const bool component = false)
{ {
digest.add (glyph_index);
if (new_syllables != (unsigned) -1) if (new_syllables != (unsigned) -1)
buffer->cur().syllable() = new_syllables; buffer->cur().syllable() = new_syllables;
@ -815,24 +819,24 @@ struct hb_ot_apply_context_t :
_hb_glyph_info_set_glyph_props (&buffer->cur(), props); _hb_glyph_info_set_glyph_props (&buffer->cur(), props);
} }
void replace_glyph (hb_codepoint_t glyph_index) const void replace_glyph (hb_codepoint_t glyph_index)
{ {
_set_glyph_class (glyph_index); _set_glyph_class (glyph_index);
(void) buffer->replace_glyph (glyph_index); (void) buffer->replace_glyph (glyph_index);
} }
void replace_glyph_inplace (hb_codepoint_t glyph_index) const void replace_glyph_inplace (hb_codepoint_t glyph_index)
{ {
_set_glyph_class (glyph_index); _set_glyph_class (glyph_index);
buffer->cur().codepoint = glyph_index; buffer->cur().codepoint = glyph_index;
} }
void replace_glyph_with_ligature (hb_codepoint_t glyph_index, void replace_glyph_with_ligature (hb_codepoint_t glyph_index,
unsigned int class_guess) const unsigned int class_guess)
{ {
_set_glyph_class (glyph_index, class_guess, true); _set_glyph_class (glyph_index, class_guess, true);
(void) buffer->replace_glyph (glyph_index); (void) buffer->replace_glyph (glyph_index);
} }
void output_glyph_for_component (hb_codepoint_t glyph_index, void output_glyph_for_component (hb_codepoint_t glyph_index,
unsigned int class_guess) const unsigned int class_guess)
{ {
_set_glyph_class (glyph_index, class_guess, false, true); _set_glyph_class (glyph_index, class_guess, false, true);
(void) buffer->output_glyph (glyph_index); (void) buffer->output_glyph (glyph_index);

View File

@ -1955,8 +1955,6 @@ inline void hb_ot_map_t::apply (const Proxy &proxy,
OT::hb_ot_apply_context_t c (table_index, font, buffer); OT::hb_ot_apply_context_t c (table_index, font, buffer);
c.set_recurse_func (Proxy::Lookup::template dispatch_recurse_func<OT::hb_ot_apply_context_t>); c.set_recurse_func (Proxy::Lookup::template dispatch_recurse_func<OT::hb_ot_apply_context_t>);
hb_set_digest_t digest = buffer->digest ();
for (unsigned int stage_index = 0; stage_index < stages[table_index].length; stage_index++) for (unsigned int stage_index = 0; stage_index < stages[table_index].length; stage_index++)
{ {
const stage_map_t *stage = &stages[table_index][stage_index]; const stage_map_t *stage = &stages[table_index][stage_index];
@ -1967,7 +1965,7 @@ inline void hb_ot_map_t::apply (const Proxy &proxy,
unsigned int lookup_index = lookup.index; unsigned int lookup_index = lookup.index;
if (!buffer->message (font, "start lookup %d", lookup_index)) continue; if (!buffer->message (font, "start lookup %d", lookup_index)) continue;
if (proxy.accels[lookup_index].digest.may_have (digest)) if (proxy.accels[lookup_index].digest.may_have (c.digest))
{ {
c.set_lookup_index (lookup_index); c.set_lookup_index (lookup_index);
c.set_lookup_mask (lookup.mask); c.set_lookup_mask (lookup.mask);
@ -1976,13 +1974,9 @@ inline void hb_ot_map_t::apply (const Proxy &proxy,
c.set_random (lookup.random); c.set_random (lookup.random);
c.set_per_syllable (lookup.per_syllable); c.set_per_syllable (lookup.per_syllable);
if (apply_string<Proxy> (&c, 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 = buffer->digest ();
}
} }
else else
(void) buffer->message (font, "skipped lookup %d because no glyph matches", lookup_index); (void) buffer->message (font, "skipped lookup %d because no glyph matches", lookup_index);
@ -1991,7 +1985,12 @@ inline void hb_ot_map_t::apply (const Proxy &proxy,
} }
if (stage->pause_func) if (stage->pause_func)
{
stage->pause_func (plan, font, buffer); stage->pause_func (plan, font, buffer);
/* Refresh working buffer digest since buffer content
* might have changed. */
c.digest = buffer->digest ();
}
} }
} }