[serialize] Implement for ClassDefFormat2

This commit is contained in:
Behdad Esfahbod 2018-12-13 15:57:12 -05:00
parent c8b43cbe31
commit e5309e4fd8
1 changed files with 46 additions and 4 deletions

View File

@ -928,14 +928,15 @@ struct CoverageFormat2
rangeRecord[range].start = glyphs[0];
rangeRecord[range].value.set (0);
for (unsigned int i = 1; i < num_glyphs; i++)
if (glyphs[i - 1] + 1 != glyphs[i]) {
{
if (glyphs[i - 1] + 1 != glyphs[i])
{
range++;
rangeRecord[range].start = glyphs[i];
rangeRecord[range].value.set (i);
rangeRecord[range].end = glyphs[i];
} else {
rangeRecord[range].end = glyphs[i];
}
rangeRecord[range].end = glyphs[i];
}
glyphs += num_glyphs;
return_trace (true);
}
@ -1314,6 +1315,47 @@ struct ClassDefFormat2
return rangeRecord.bsearch (glyph_id).value;
}
inline bool serialize (hb_serialize_context_t *c,
hb_codepoint_t first_glyph,
Supplier<HBUINT16> &glyphs,
Supplier<HBUINT16> &klasses,
unsigned int num_glyphs)
{
TRACE_SERIALIZE (this);
if (unlikely (!c->extend_min (*this))) return_trace (false);
if (unlikely (!num_glyphs))
{
rangeRecord.len.set (0);
return_trace (true);
}
unsigned int num_ranges = 1;
for (unsigned int i = 1; i < num_glyphs; i++)
if (glyphs[i - 1] + 1 != glyphs[i] ||
klasses[i - 1] != klasses[i])
num_ranges++;
rangeRecord.len.set (num_ranges);
if (unlikely (!c->extend (rangeRecord))) return_trace (false);
unsigned int range = 0;
rangeRecord[range].start = glyphs[0];
rangeRecord[range].value.set (klasses[0]);
for (unsigned int i = 1; i < num_glyphs; i++)
{
if (glyphs[i - 1] + 1 != glyphs[i] ||
klasses[i - 1] != klasses[i])
{
range++;
rangeRecord[range].start = glyphs[i];
rangeRecord[range].value = klasses[i];
}
rangeRecord[range].end = glyphs[i];
}
glyphs += num_glyphs;
return_trace (true);
}
inline bool sanitize (hb_sanitize_context_t *c) const
{
TRACE_SANITIZE (this);