Revert "[subst/SingleSubstFormat1] Rewrite nicer"
This reverts commit bababe1072
.
The hand-written code is still much faster :(.
This commit is contained in:
parent
71ce931e6d
commit
5d7556e184
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue