提交 621c49cb 编写于 作者: B Behdad Esfahbod

Improve performance of ligature component matching

This O(N^2) was introduced in 8b2c94c4.
Make it O(N).
上级 ab8d70ec
......@@ -764,6 +764,12 @@ static inline bool match_input (hb_apply_context_t *c,
unsigned int first_lig_id = _hb_glyph_info_get_lig_id (&buffer->cur());
unsigned int first_lig_comp = _hb_glyph_info_get_lig_comp (&buffer->cur());
enum {
LIGBASE_NOT_CHECKED,
LIGBASE_MAY_NOT_SKIP,
LIGBASE_MAY_SKIP
} ligbase = LIGBASE_NOT_CHECKED;
match_positions[0] = buffer->idx;
for (unsigned int i = 1; i < count; i++)
{
......@@ -783,29 +789,34 @@ static inline bool match_input (hb_apply_context_t *c,
{
/* ...unless, we are attached to a base ligature and that base
* ligature is ignorable. */
bool found = false;
const hb_glyph_info_t *out = buffer->out_info;
unsigned int j = buffer->out_len;
while (j && _hb_glyph_info_get_lig_id (&out[j - 1]) == first_lig_id)
if (ligbase == LIGBASE_NOT_CHECKED)
{
if (_hb_glyph_info_get_lig_comp (&out[j - 1]) == 0)
bool found = false;
const hb_glyph_info_t *out = buffer->out_info;
unsigned int j = buffer->out_len;
while (j && _hb_glyph_info_get_lig_id (&out[j - 1]) == first_lig_id)
{
if (_hb_glyph_info_get_lig_comp (&out[j - 1]) == 0)
{
j--;
found = true;
break;
}
j--;
found = true;
break;
}
j--;
}
if (!found)
return_trace (false);
if (found && skippy_iter.may_skip (c, out[j]) == hb_apply_context_t::matcher_t::SKIP_YES)
ligbase = LIGBASE_MAY_SKIP;
else
ligbase = LIGBASE_MAY_NOT_SKIP;
}
if (skippy_iter.may_skip (c, out[j]) != hb_apply_context_t::matcher_t::SKIP_YES)
if (ligbase == LIGBASE_MAY_NOT_SKIP)
return_trace (false);
}
}
else
{
{
/* If first component was NOT attached to a previous ligature component,
* all subsequent components should also NOT be attached to any ligature
* component, unless they are attached to the first component itself! */
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册