[subset] optimize glyph closure method: step 3
Add function intersects_coverage_glyphs that collects set of matching glyphs in Coverage table
This commit is contained in:
parent
ef78d0f923
commit
62423504ee
|
@ -1260,6 +1260,14 @@ struct CoverageFormat1
|
|||
bool intersects_coverage (const hb_set_t *glyphs, unsigned int index) const
|
||||
{ return glyphs->has (glyphArray[index]); }
|
||||
|
||||
void intersected_coverage_glyphs (const hb_set_t *glyphs, hb_set_t *intersect_glyphs) const
|
||||
{
|
||||
unsigned count = glyphArray.len;
|
||||
for (unsigned i = 0; i < count; i++)
|
||||
if (glyphs->has (glyphArray[i]))
|
||||
intersect_glyphs->add (glyphArray[i]);
|
||||
}
|
||||
|
||||
template <typename set_t>
|
||||
bool collect_coverage (set_t *glyphs) const
|
||||
{ return glyphs->add_sorted_array (glyphArray.arrayZ, glyphArray.len); }
|
||||
|
@ -1382,6 +1390,17 @@ struct CoverageFormat2
|
|||
return false;
|
||||
}
|
||||
|
||||
void intersected_coverage_glyphs (const hb_set_t *glyphs, hb_set_t *intersect_glyphs) const
|
||||
{
|
||||
unsigned count = rangeRecord.len;
|
||||
for (unsigned i = 0; i < count; i++)
|
||||
{
|
||||
const RangeRecord &range = rangeRecord[i];
|
||||
for (hb_codepoint_t g = range.first; g <= range.last; g++)
|
||||
if (glyphs->has (g)) intersect_glyphs->add (g);
|
||||
}
|
||||
}
|
||||
|
||||
template <typename set_t>
|
||||
bool collect_coverage (set_t *glyphs) const
|
||||
{
|
||||
|
@ -1564,6 +1583,16 @@ struct Coverage
|
|||
}
|
||||
}
|
||||
|
||||
void intersected_coverage_glyphs (const hb_set_t *glyphs, hb_set_t *intersect_glyphs) const
|
||||
{
|
||||
switch (u.format)
|
||||
{
|
||||
case 1: return u.format1.intersected_coverage_glyphs (glyphs, intersect_glyphs);
|
||||
case 2: return u.format2.intersected_coverage_glyphs (glyphs, intersect_glyphs);
|
||||
default:return ;
|
||||
}
|
||||
}
|
||||
|
||||
struct iter_t : hb_iter_with_fallback_t<iter_t, hb_codepoint_t>
|
||||
{
|
||||
static constexpr bool is_sorted_iterator = true;
|
||||
|
@ -1838,7 +1867,7 @@ struct ClassDefFormat1
|
|||
return false;
|
||||
}
|
||||
|
||||
void intersects_class_glyphs (const hb_set_t *glyphs, unsigned klass, hb_set_t *intersect_glyphs)
|
||||
void intersected_class_glyphs (const hb_set_t *glyphs, unsigned klass, hb_set_t *intersect_glyphs) const
|
||||
{
|
||||
unsigned count = classValue.len;
|
||||
if (klass == 0)
|
||||
|
@ -2039,7 +2068,7 @@ struct ClassDefFormat2
|
|||
return false;
|
||||
}
|
||||
|
||||
void intersects_class_glyphs (const hb_set_t *glyphs, unsigned klass, hb_set_t *intersect_glyphs)
|
||||
void intersected_class_glyphs (const hb_set_t *glyphs, unsigned klass, hb_set_t *intersect_glyphs) const
|
||||
{
|
||||
unsigned count = rangeRecord.len;
|
||||
if (klass == 0)
|
||||
|
@ -2227,11 +2256,11 @@ struct ClassDef
|
|||
}
|
||||
}
|
||||
|
||||
void intersects_class_glyphs (const hb_set_t *glyphs, unsigned klass, hb_set_t *intersect_glyphs)
|
||||
void intersected_class_glyphs (const hb_set_t *glyphs, unsigned klass, hb_set_t *intersect_glyphs) const
|
||||
{
|
||||
switch (u.format) {
|
||||
case 1: return u.format1.intersects_class_glyphs (glyphs, klass, intersect_glyphs);
|
||||
case 2: return u.format2.intersects_class_glyphs (glyphs, klass, intersect_glyphs);
|
||||
case 1: return u.format1.intersected_class_glyphs (glyphs, klass, intersect_glyphs);
|
||||
case 2: return u.format2.intersected_class_glyphs (glyphs, klass, intersect_glyphs);
|
||||
default:return;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue