[iter] Port Coverage iterator to hb_iter_t

This commit is contained in:
Behdad Esfahbod 2018-12-26 22:27:23 -05:00
parent c68bca0f95
commit e16884248f
4 changed files with 27 additions and 21 deletions

View File

@ -1104,7 +1104,9 @@ struct Coverage
}
}
struct Iter
struct Iter :
hb_iter_t<Iter, const hb_pair_t<unsigned, hb_codepoint_t> >,
hb_iter_mixin_t<Iter, const hb_pair_t<unsigned, hb_codepoint_t> >
{
Iter (const Coverage &c_)
{
@ -1117,7 +1119,7 @@ struct Coverage
default: return;
}
}
bool more () const
bool __more__ () const
{
switch (format)
{
@ -1126,7 +1128,7 @@ struct Coverage
default:return false;
}
}
void next ()
void __next__ ()
{
switch (format)
{
@ -1135,6 +1137,9 @@ struct Coverage
default: break;
}
}
typedef hb_pair_t<unsigned, hb_codepoint_t> __item_type__;
__item_type__ __item__ () const { return hb_pair (get_coverage (), get_glyph ()); }
hb_codepoint_t get_glyph () const
{
switch (format)
@ -1161,6 +1166,7 @@ struct Coverage
CoverageFormat1::Iter format1;
} u;
};
Iter iter () const { return Iter (*this); }
protected:
union {

View File

@ -723,7 +723,7 @@ struct PairPosFormat1
bool intersects (const hb_set_t *glyphs) const
{
unsigned int count = pairSet.len;
for (Coverage::Iter iter (this+coverage); iter.more (); iter.next ())
for (auto iter = (this+coverage).iter (); iter; iter++)
{
if (unlikely (iter.get_coverage () >= count))
break; /* Work around malicious fonts. https://github.com/harfbuzz/harfbuzz/issues/363 */

View File

@ -46,7 +46,7 @@ struct SingleSubstFormat1
void closure (hb_closure_context_t *c) const
{
for (Coverage::Iter iter (this+coverage); iter.more (); iter.next ())
for (auto iter = (this+coverage).iter (); iter; iter++)
{
/* TODO Switch to range-based API to work around malicious fonts.
* https://github.com/harfbuzz/harfbuzz/issues/363 */
@ -59,7 +59,7 @@ struct SingleSubstFormat1
void collect_glyphs (hb_collect_glyphs_context_t *c) const
{
if (unlikely (!(this+coverage).add_coverage (c->input))) return;
for (Coverage::Iter iter (this+coverage); iter.more (); iter.next ())
for (auto iter = (this+coverage).iter (); iter; iter++)
{
/* TODO Switch to range-based API to work around malicious fonts.
* https://github.com/harfbuzz/harfbuzz/issues/363 */
@ -110,7 +110,7 @@ struct SingleSubstFormat1
hb_vector_t<GlyphID> from;
hb_vector_t<GlyphID> to;
hb_codepoint_t delta = deltaGlyphID;
for (Coverage::Iter iter (this+coverage); iter.more (); iter.next ())
for (auto iter = (this+coverage).iter (); iter; iter++)
{
if (!glyphset.has (iter.get_glyph ())) continue;
from.push ()->set (glyph_map[iter.get_glyph ()]);
@ -146,7 +146,7 @@ struct SingleSubstFormat2
void closure (hb_closure_context_t *c) const
{
unsigned int count = substitute.len;
for (Coverage::Iter iter (this+coverage); iter.more (); iter.next ())
for (auto iter = (this+coverage).iter (); iter; iter++)
{
if (unlikely (iter.get_coverage () >= count))
break; /* Work around malicious fonts. https://github.com/harfbuzz/harfbuzz/issues/363 */
@ -159,7 +159,7 @@ struct SingleSubstFormat2
{
if (unlikely (!(this+coverage).add_coverage (c->input))) return;
unsigned int count = substitute.len;
for (Coverage::Iter iter (this+coverage); iter.more (); iter.next ())
for (auto iter = (this+coverage).iter (); iter; iter++)
{
if (unlikely (iter.get_coverage () >= count))
break; /* Work around malicious fonts. https://github.com/harfbuzz/harfbuzz/issues/363 */
@ -206,7 +206,7 @@ struct SingleSubstFormat2
const hb_map_t &glyph_map = *c->plan->glyph_map;
hb_vector_t<GlyphID> from;
hb_vector_t<GlyphID> to;
for (Coverage::Iter iter (this+coverage); iter.more (); iter.next ())
for (auto iter = (this+coverage).iter (); iter; iter++)
{
if (!glyphset.has (iter.get_glyph ())) continue;
from.push ()->set (glyph_map[iter.get_glyph ()]);
@ -362,7 +362,7 @@ struct MultipleSubstFormat1
void closure (hb_closure_context_t *c) const
{
unsigned int count = sequence.len;
for (Coverage::Iter iter (this+coverage); iter.more (); iter.next ())
for (auto iter = (this+coverage).iter (); iter; iter++)
{
if (unlikely (iter.get_coverage () >= count))
break; /* Work around malicious fonts. https://github.com/harfbuzz/harfbuzz/issues/363 */
@ -542,7 +542,7 @@ struct AlternateSubstFormat1
void closure (hb_closure_context_t *c) const
{
unsigned int count = alternateSet.len;
for (Coverage::Iter iter (this+coverage); iter.more (); iter.next ())
for (auto iter = (this+coverage).iter (); iter; iter++)
{
if (unlikely (iter.get_coverage () >= count))
break; /* Work around malicious fonts. https://github.com/harfbuzz/harfbuzz/issues/363 */
@ -555,7 +555,7 @@ struct AlternateSubstFormat1
{
if (unlikely (!(this+coverage).add_coverage (c->input))) return;
unsigned int count = alternateSet.len;
for (Coverage::Iter iter (this+coverage); iter.more (); iter.next ())
for (auto iter = (this+coverage).iter (); iter; iter++)
{
if (unlikely (iter.get_coverage () >= count))
break; /* Work around malicious fonts. https://github.com/harfbuzz/harfbuzz/issues/363 */
@ -858,7 +858,7 @@ struct LigatureSubstFormat1
bool intersects (const hb_set_t *glyphs) const
{
unsigned int count = ligatureSet.len;
for (Coverage::Iter iter (this+coverage); iter.more (); iter.next ())
for (auto iter = (this+coverage).iter (); iter; iter++)
{
if (unlikely (iter.get_coverage () >= count))
break; /* Work around malicious fonts. https://github.com/harfbuzz/harfbuzz/issues/363 */
@ -872,7 +872,7 @@ struct LigatureSubstFormat1
void closure (hb_closure_context_t *c) const
{
unsigned int count = ligatureSet.len;
for (Coverage::Iter iter (this+coverage); iter.more (); iter.next ())
for (auto iter = (this+coverage).iter (); iter; iter++)
{
if (unlikely (iter.get_coverage () >= count))
break; /* Work around malicious fonts. https://github.com/harfbuzz/harfbuzz/issues/363 */
@ -885,7 +885,7 @@ struct LigatureSubstFormat1
{
if (unlikely (!(this+coverage).add_coverage (c->input))) return;
unsigned int count = ligatureSet.len;
for (Coverage::Iter iter (this+coverage); iter.more (); iter.next ())
for (auto iter = (this+coverage).iter (); iter; iter++)
{
if (unlikely (iter.get_coverage () >= count))
break; /* Work around malicious fonts. https://github.com/harfbuzz/harfbuzz/issues/363 */
@ -1062,7 +1062,7 @@ struct ReverseChainSingleSubstFormat1
const ArrayOf<GlyphID> &substitute = StructAfter<ArrayOf<GlyphID> > (lookahead);
count = substitute.len;
for (Coverage::Iter iter (this+coverage); iter.more (); iter.next ())
for (auto iter = (this+coverage).iter (); iter; iter++)
{
if (unlikely (iter.get_coverage () >= count))
break; /* Work around malicious fonts. https://github.com/harfbuzz/harfbuzz/issues/363 */

View File

@ -1438,7 +1438,7 @@ struct ContextFormat1
};
unsigned int count = ruleSet.len;
for (Coverage::Iter iter (this+coverage); iter.more (); iter.next ())
for (auto iter = (this+coverage).iter (); iter; iter++)
{
if (unlikely (iter.get_coverage () >= count))
break; /* Work around malicious fonts. https://github.com/harfbuzz/harfbuzz/issues/363 */
@ -1457,7 +1457,7 @@ struct ContextFormat1
};
unsigned int count = ruleSet.len;
for (Coverage::Iter iter (this+coverage); iter.more (); iter.next ())
for (auto iter = (this+coverage).iter (); iter; iter++)
{
if (unlikely (iter.get_coverage () >= count))
break; /* Work around malicious fonts. https://github.com/harfbuzz/harfbuzz/issues/363 */
@ -2091,7 +2091,7 @@ struct ChainContextFormat1
};
unsigned int count = ruleSet.len;
for (Coverage::Iter iter (this+coverage); iter.more (); iter.next ())
for (auto iter = (this+coverage).iter (); iter; iter++)
{
if (unlikely (iter.get_coverage () >= count))
break; /* Work around malicious fonts. https://github.com/harfbuzz/harfbuzz/issues/363 */
@ -2110,7 +2110,7 @@ struct ChainContextFormat1
};
unsigned int count = ruleSet.len;
for (Coverage::Iter iter (this+coverage); iter.more (); iter.next ())
for (auto iter = (this+coverage).iter (); iter; iter++)
{
if (unlikely (iter.get_coverage () >= count))
break; /* Work around malicious fonts. https://github.com/harfbuzz/harfbuzz/issues/363 */