Revert "[subst/SingleSubstFormat1] Rewrite nicer"

This reverts commit bababe1072.

The hand-written code is still much faster :(.
This commit is contained in:
Behdad Esfahbod 2022-07-21 10:42:29 -06:00
parent 71ce931e6d
commit 5d7556e184
1 changed files with 50 additions and 14 deletions

View File

@ -42,18 +42,35 @@ struct SingleSubstFormat1_3
hb_codepoint_t d = deltaGlyphID; hb_codepoint_t d = deltaGlyphID;
hb_codepoint_t mask = get_mask (); hb_codepoint_t mask = get_mask ();
if ((this+coverage).get_population () < c->parent_active_glyphs ().get_population ()) if (1)
{ {
+ hb_iter (this+coverage) /* Walk the coverage and set together, to bail out when the
| hb_filter (c->parent_active_glyphs ()) * coverage iterator runs over the end of glyphset. Otherwise,
| hb_map ([d, mask] (hb_codepoint_t g) { return (g + d) & mask; }) * the coverage may cover many glyphs and we spend a lot of
| hb_sink (c->output) * time here. Other subtables don't have this problem because
; * they zip coverage iterator with some array... */
auto c_iter = hb_iter (this+coverage);
auto s_iter = hb_iter (c->parent_active_glyphs ());
while (c_iter && s_iter)
{
hb_codepoint_t cv = *c_iter;
hb_codepoint_t sv = *s_iter;
if (cv == sv)
{
c->output->add ((cv + d) & mask);
c_iter++;
s_iter++;
}
else if (cv < sv)
c_iter++;
else
s_iter++;
}
} }
else else
{ {
+ hb_iter (c->parent_active_glyphs ()) + hb_iter (this+coverage)
| hb_filter (this+coverage) | hb_filter (c->parent_active_glyphs ())
| hb_map ([d, mask] (hb_codepoint_t g) { return (g + d) & mask; }) | hb_map ([d, mask] (hb_codepoint_t g) { return (g + d) & mask; })
| hb_sink (c->output) | hb_sink (c->output)
; ;
@ -119,16 +136,35 @@ struct SingleSubstFormat1_3
hb_codepoint_t mask = get_mask (); hb_codepoint_t mask = get_mask ();
hb_sorted_vector_t<hb_codepoint_t> intersection; hb_sorted_vector_t<hb_codepoint_t> intersection;
if ((this+coverage).get_population () < glyphset.get_population ()) if (1)
{ {
+ hb_iter (this+coverage) /* Walk the coverage and set together, to bail out when the
| hb_filter (glyphset) * coverage iterator runs over the end of glyphset. Otherwise,
| hb_sink (intersection); * the coverage may cover many glyphs and we spend a lot of
* time here. Other subtables don't have this problem because
* they zip coverage iterator with some array... */
auto c_iter = hb_iter (this+coverage);
auto s_iter = hb_iter (glyphset);
while (c_iter && s_iter)
{
hb_codepoint_t cv = *c_iter;
hb_codepoint_t sv = *s_iter;
if (cv == sv)
{
intersection.push (cv);
c_iter++;
s_iter++;
}
else if (cv < sv)
c_iter++;
else
s_iter++;
}
} }
else else
{ {
+ hb_iter (glyphset) + hb_iter (this+coverage)
| hb_filter (this+coverage) | hb_filter (glyphset)
| hb_sink (intersection); | hb_sink (intersection);
} }