Push get_glyph_alternates() work all the way down

This commit is contained in:
Behdad Esfahbod 2020-06-18 15:49:01 -07:00
parent 5bede33885
commit bedf417121
1 changed files with 12 additions and 24 deletions

View File

@ -557,11 +557,11 @@ struct AlternateSet
} }
unsigned unsigned
get_glyph_alternates (unsigned start_offset, get_alternates (unsigned start_offset,
unsigned *alternate_count /* IN/OUT. May be NULL. */, unsigned *alternate_count /* IN/OUT. May be NULL. */,
hb_codepoint_t *alternate_glyphs /* OUT. May be NULL. */) const hb_codepoint_t *alternate_glyphs /* OUT. May be NULL. */) const
{ {
if (alternate_count) if (alternates.len && alternate_count)
{ {
+ alternates.sub_array (start_offset, alternate_count) + alternates.sub_array (start_offset, alternate_count)
| hb_sink (hb_array (alternate_glyphs, *alternate_count)) | hb_sink (hb_array (alternate_glyphs, *alternate_count))
@ -642,15 +642,13 @@ struct AlternateSubstFormat1
bool would_apply (hb_would_apply_context_t *c) const bool would_apply (hb_would_apply_context_t *c) const
{ return c->len == 1 && (this+coverage).get_coverage (c->glyphs[0]) != NOT_COVERED; } { return c->len == 1 && (this+coverage).get_coverage (c->glyphs[0]) != NOT_COVERED; }
unsigned get_coverage_index (hb_codepoint_t gid) const
{ return (this+coverage).get_coverage (gid); }
unsigned unsigned
get_glyph_alternates (unsigned index, get_glyph_alternates (hb_codepoint_t gid,
unsigned start_offset, unsigned start_offset,
unsigned *alternate_count /* IN/OUT. May be NULL. */, unsigned *alternate_count /* IN/OUT. May be NULL. */,
hb_codepoint_t *alternate_glyphs /* OUT. May be NULL. */) const hb_codepoint_t *alternate_glyphs /* OUT. May be NULL. */) const
{ return (this+alternateSet[index]).get_glyph_alternates (start_offset, alternate_count, alternate_glyphs); } { return (this+alternateSet[(this+coverage).get_coverage (gid)])
.get_alternates (start_offset, alternate_count, alternate_glyphs); }
bool apply (hb_ot_apply_context_t *c) const bool apply (hb_ot_apply_context_t *c) const
{ {
@ -740,22 +738,13 @@ struct AlternateSubst
} }
unsigned unsigned
get_coverage_index (hb_codepoint_t gid) const get_glyph_alternates (hb_codepoint_t gid,
{
switch (u.format) {
case 1: return u.format1.get_coverage_index (gid);
default:return NOT_COVERED;
}
}
unsigned
get_glyph_alternates (unsigned index,
unsigned start_offset, unsigned start_offset,
unsigned *alternate_count /* IN/OUT. May be NULL. */, unsigned *alternate_count /* IN/OUT. May be NULL. */,
hb_codepoint_t *alternate_glyphs /* OUT. May be NULL. */) const hb_codepoint_t *alternate_glyphs /* OUT. May be NULL. */) const
{ {
switch (u.format) { switch (u.format) {
case 1: return u.format1.get_glyph_alternates (index, start_offset, alternate_count, alternate_glyphs); case 1: return u.format1.get_glyph_alternates (gid, start_offset, alternate_count, alternate_glyphs);
default:assert (0); return 0; default:assert (0); return 0;
} }
} }
@ -1519,10 +1508,9 @@ struct SubstLookup : Lookup
unsigned size = get_subtable_count (); unsigned size = get_subtable_count ();
for (unsigned i = 0; i < size; ++i) for (unsigned i = 0; i < size; ++i)
{ {
const AlternateSubst &alternate_subtable = get_subtable (i).u.alternate; const AlternateSubst &subtable = get_subtable (i).u.alternate;
unsigned index = alternate_subtable.get_coverage_index (gid); auto ret = subtable.get_glyph_alternates (gid, start_offset, alternate_count, alternate_glyphs);
if (index != NOT_COVERED) if (ret) return (ret);
return alternate_subtable.get_glyph_alternates (index, start_offset, alternate_count, alternate_glyphs);
} }
} }
if (alternate_count) *alternate_count = 0; if (alternate_count) *alternate_count = 0;