[gsubgpos] Refactor skippy_iter.match()
This commit is contained in:
parent
ef2a8f722f
commit
b29fbd16fa
|
@ -532,6 +532,30 @@ struct hb_ot_apply_context_t :
|
|||
may_skip (const hb_glyph_info_t &info) const
|
||||
{ return matcher.may_skip (c, info); }
|
||||
|
||||
enum match_t {
|
||||
MATCH,
|
||||
NOT_MATCH,
|
||||
SKIP
|
||||
};
|
||||
|
||||
match_t match (hb_glyph_info_t &info)
|
||||
{
|
||||
matcher_t::may_skip_t skip = matcher.may_skip (c, info);
|
||||
if (unlikely (skip == matcher_t::SKIP_YES))
|
||||
return SKIP;
|
||||
|
||||
matcher_t::may_match_t match = matcher.may_match (info, get_glyph_data ());
|
||||
if (match == matcher_t::MATCH_YES ||
|
||||
(match == matcher_t::MATCH_MAYBE &&
|
||||
skip == matcher_t::SKIP_NO))
|
||||
return MATCH;
|
||||
|
||||
if (skip == matcher_t::SKIP_NO)
|
||||
return NOT_MATCH;
|
||||
|
||||
return SKIP;
|
||||
}
|
||||
|
||||
bool next (unsigned *unsafe_to = nullptr)
|
||||
{
|
||||
assert (num_items > 0);
|
||||
|
@ -543,28 +567,23 @@ struct hb_ot_apply_context_t :
|
|||
while ((signed) idx < stop)
|
||||
{
|
||||
idx++;
|
||||
hb_glyph_info_t &info = c->buffer->info[idx];
|
||||
|
||||
matcher_t::may_skip_t skip = matcher.may_skip (c, info);
|
||||
if (unlikely (skip == matcher_t::SKIP_YES))
|
||||
continue;
|
||||
|
||||
matcher_t::may_match_t match = matcher.may_match (info, get_glyph_data ());
|
||||
if (match == matcher_t::MATCH_YES ||
|
||||
(match == matcher_t::MATCH_MAYBE &&
|
||||
skip == matcher_t::SKIP_NO))
|
||||
switch (match (c->buffer->info[idx]))
|
||||
{
|
||||
case MATCH:
|
||||
{
|
||||
num_items--;
|
||||
advance_glyph_data ();
|
||||
return true;
|
||||
}
|
||||
|
||||
if (skip == matcher_t::SKIP_NO)
|
||||
case NOT_MATCH:
|
||||
{
|
||||
if (unsafe_to)
|
||||
*unsafe_to = idx + 1;
|
||||
return false;
|
||||
}
|
||||
case SKIP:
|
||||
continue;
|
||||
}
|
||||
}
|
||||
if (unsafe_to)
|
||||
*unsafe_to = end;
|
||||
|
@ -588,28 +607,23 @@ struct hb_ot_apply_context_t :
|
|||
while (idx > stop)
|
||||
{
|
||||
idx--;
|
||||
hb_glyph_info_t &info = c->buffer->out_info[idx];
|
||||
|
||||
matcher_t::may_skip_t skip = matcher.may_skip (c, info);
|
||||
if (unlikely (skip == matcher_t::SKIP_YES))
|
||||
continue;
|
||||
|
||||
matcher_t::may_match_t match = matcher.may_match (info, get_glyph_data ());
|
||||
if (match == matcher_t::MATCH_YES ||
|
||||
(match == matcher_t::MATCH_MAYBE &&
|
||||
skip == matcher_t::SKIP_NO))
|
||||
switch (match (c->buffer->out_info[idx]))
|
||||
{
|
||||
case MATCH:
|
||||
{
|
||||
num_items--;
|
||||
advance_glyph_data ();
|
||||
return true;
|
||||
}
|
||||
|
||||
if (skip == matcher_t::SKIP_NO)
|
||||
case NOT_MATCH:
|
||||
{
|
||||
if (unsafe_from)
|
||||
*unsafe_from = hb_max (1u, idx) - 1u;
|
||||
return false;
|
||||
}
|
||||
case SKIP:
|
||||
continue;
|
||||
}
|
||||
}
|
||||
if (unsafe_from)
|
||||
*unsafe_from = 0;
|
||||
|
|
Loading…
Reference in New Issue