[GSUB] Support SingleSubst in get_glyph_alternates
Fixes https://github.com/harfbuzz/harfbuzz/discussions/4146
This commit is contained in:
parent
69183217df
commit
7327006d68
|
@ -95,6 +95,34 @@ struct SingleSubstFormat1_3
|
||||||
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_glyph_alternates (hb_codepoint_t glyph_id,
|
||||||
|
unsigned start_offset,
|
||||||
|
unsigned *alternate_count /* IN/OUT. May be NULL. */,
|
||||||
|
hb_codepoint_t *alternate_glyphs /* OUT. May be NULL. */) const
|
||||||
|
{
|
||||||
|
unsigned int index = (this+coverage).get_coverage (glyph_id);
|
||||||
|
if (likely (index == NOT_COVERED))
|
||||||
|
{
|
||||||
|
if (alternate_count)
|
||||||
|
*alternate_count = 0;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (alternate_count && *alternate_count)
|
||||||
|
{
|
||||||
|
hb_codepoint_t d = deltaGlyphID;
|
||||||
|
hb_codepoint_t mask = get_mask ();
|
||||||
|
|
||||||
|
glyph_id = (glyph_id + d) & mask;
|
||||||
|
|
||||||
|
*alternate_glyphs = glyph_id;
|
||||||
|
*alternate_count = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
bool apply (hb_ot_apply_context_t *c) const
|
bool apply (hb_ot_apply_context_t *c) const
|
||||||
{
|
{
|
||||||
TRACE_APPLY (this);
|
TRACE_APPLY (this);
|
||||||
|
|
|
@ -75,6 +75,31 @@ struct SingleSubstFormat2_4
|
||||||
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_glyph_alternates (hb_codepoint_t glyph_id,
|
||||||
|
unsigned start_offset,
|
||||||
|
unsigned *alternate_count /* IN/OUT. May be NULL. */,
|
||||||
|
hb_codepoint_t *alternate_glyphs /* OUT. May be NULL. */) const
|
||||||
|
{
|
||||||
|
unsigned int index = (this+coverage).get_coverage (glyph_id);
|
||||||
|
if (likely (index == NOT_COVERED))
|
||||||
|
{
|
||||||
|
if (alternate_count)
|
||||||
|
*alternate_count = 0;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (alternate_count && *alternate_count)
|
||||||
|
{
|
||||||
|
glyph_id = substitute[index];
|
||||||
|
|
||||||
|
*alternate_glyphs = glyph_id;
|
||||||
|
*alternate_count = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
bool apply (hb_ot_apply_context_t *c) const
|
bool apply (hb_ot_apply_context_t *c) const
|
||||||
{
|
{
|
||||||
TRACE_APPLY (this);
|
TRACE_APPLY (this);
|
||||||
|
|
Loading…
Reference in New Issue