Use hb_zip() some mooore

This commit is contained in:
Behdad Esfahbod 2019-01-09 10:06:48 -08:00
parent af6c190235
commit 0d1fdf939d
2 changed files with 21 additions and 56 deletions

View File

@ -722,15 +722,10 @@ struct PairPosFormat1
{ {
bool intersects (const hb_set_t *glyphs) const bool intersects (const hb_set_t *glyphs) const
{ {
unsigned int count = pairSet.len; for (auto it = hb_zip (this+coverage, pairSet); it; ++it)
for (/*TODO(C++11)auto*/Coverage::iter_t iter = (this+coverage).iter (); iter; iter++) if (glyphs->has (it->first))
{ if ((this+it->second).intersects (glyphs, valueFormat))
if (unlikely (iter.get_coverage () >= count)) return true;
break; /* Work around malicious fonts. https://github.com/harfbuzz/harfbuzz/issues/363 */
if (glyphs->has (iter.get_glyph ()) &&
(this+pairSet[iter.get_coverage ()]).intersects (glyphs, valueFormat))
return true;
}
return false; return false;
} }

View File

@ -46,26 +46,16 @@ struct SingleSubstFormat1
void closure (hb_closure_context_t *c) const void closure (hb_closure_context_t *c) const
{ {
for (/*TODO(C++11)auto*/Coverage::iter_t iter = (this+coverage).iter (); iter; iter++) for (auto it = (this+coverage).iter (); it; ++it)
{ if (c->glyphs->has (*it))
/* TODO Switch to range-based API to work around malicious fonts. c->out->add ((*it + deltaGlyphID) & 0xFFFFu);
* https://github.com/harfbuzz/harfbuzz/issues/363 */
hb_codepoint_t glyph_id = iter.get_glyph ();
if (c->glyphs->has (glyph_id))
c->out->add ((glyph_id + deltaGlyphID) & 0xFFFFu);
}
} }
void collect_glyphs (hb_collect_glyphs_context_t *c) const void collect_glyphs (hb_collect_glyphs_context_t *c) const
{ {
if (unlikely (!(this+coverage).add_coverage (c->input))) return; if (unlikely (!(this+coverage).add_coverage (c->input))) return;
for (/*TODO(C++11)auto*/Coverage::iter_t iter = (this+coverage).iter (); iter; iter++) for (auto it = (this+coverage).iter (); it; ++it)
{ c->output->add ((*it + deltaGlyphID) & 0xFFFFu);
/* TODO Switch to range-based API to work around malicious fonts.
* https://github.com/harfbuzz/harfbuzz/issues/363 */
hb_codepoint_t glyph_id = iter.get_glyph ();
c->output->add ((glyph_id + deltaGlyphID) & 0xFFFFu);
}
} }
const Coverage &get_coverage () const { return this+coverage; } const Coverage &get_coverage () const { return this+coverage; }
@ -831,40 +821,25 @@ struct LigatureSubstFormat1
{ {
bool intersects (const hb_set_t *glyphs) const bool intersects (const hb_set_t *glyphs) const
{ {
unsigned int count = ligatureSet.len; for (auto it = hb_zip (this+coverage, ligatureSet); it; ++it)
for (/*TODO(C++11)auto*/Coverage::iter_t iter = (this+coverage).iter (); iter; iter++) if (glyphs->has (it->first))
{ if ((this+it->second).intersects (glyphs))
if (unlikely (iter.get_coverage () >= count)) return true;
break; /* Work around malicious fonts. https://github.com/harfbuzz/harfbuzz/issues/363 */
if (glyphs->has (iter.get_glyph ()) &&
(this+ligatureSet[iter.get_coverage ()]).intersects (glyphs))
return true;
}
return false; return false;
} }
void closure (hb_closure_context_t *c) const void closure (hb_closure_context_t *c) const
{ {
unsigned int count = ligatureSet.len; for (auto it = hb_zip (this+coverage, ligatureSet); it; ++it)
for (/*TODO(C++11)auto*/Coverage::iter_t iter = (this+coverage).iter (); iter; iter++) if (c->glyphs->has (it->first))
{ (this+it->second).closure (c);
if (unlikely (iter.get_coverage () >= count))
break; /* Work around malicious fonts. https://github.com/harfbuzz/harfbuzz/issues/363 */
if (c->glyphs->has (iter.get_glyph ()))
(this+ligatureSet[iter.get_coverage ()]).closure (c);
}
} }
void collect_glyphs (hb_collect_glyphs_context_t *c) const void collect_glyphs (hb_collect_glyphs_context_t *c) const
{ {
if (unlikely (!(this+coverage).add_coverage (c->input))) return; if (unlikely (!(this+coverage).add_coverage (c->input))) return;
unsigned int count = ligatureSet.len; for (auto it = hb_zip (this+coverage, ligatureSet); it; ++it)
for (/*TODO(C++11)auto*/Coverage::iter_t iter = (this+coverage).iter (); iter; iter++) (this+it->second).collect_glyphs (c);
{
if (unlikely (iter.get_coverage () >= count))
break; /* Work around malicious fonts. https://github.com/harfbuzz/harfbuzz/issues/363 */
(this+ligatureSet[iter.get_coverage ()]).collect_glyphs (c);
}
} }
const Coverage &get_coverage () const { return this+coverage; } const Coverage &get_coverage () const { return this+coverage; }
@ -1035,14 +1010,9 @@ struct ReverseChainSingleSubstFormat1
return; return;
const ArrayOf<GlyphID> &substitute = StructAfter<ArrayOf<GlyphID> > (lookahead); const ArrayOf<GlyphID> &substitute = StructAfter<ArrayOf<GlyphID> > (lookahead);
count = substitute.len; for (auto it = hb_zip (this+coverage, substitute); it; ++it)
for (/*TODO(C++11)auto*/Coverage::iter_t iter = (this+coverage).iter (); iter; iter++) if (c->glyphs->has (it->first))
{ c->out->add (it->second);
if (unlikely (iter.get_coverage () >= count))
break; /* Work around malicious fonts. https://github.com/harfbuzz/harfbuzz/issues/363 */
if (c->glyphs->has (iter.get_glyph ()))
c->out->add (substitute[iter.get_coverage ()]);
}
} }
void collect_glyphs (hb_collect_glyphs_context_t *c) const void collect_glyphs (hb_collect_glyphs_context_t *c) const