Skip to content

Commit

Permalink
[buffer] Optimize _infos_set_glyph_flags to avoid O(n^2) behavior
Browse files Browse the repository at this point in the history
  • Loading branch information
behdad committed Feb 6, 2023
1 parent 0b97ac3 commit 30b84fa
Showing 1 changed file with 38 additions and 6 deletions.
44 changes: 38 additions & 6 deletions src/hb-buffer.hh
Original file line number Diff line number Diff line change
Expand Up @@ -581,12 +581,44 @@ struct hb_buffer_t
unsigned int cluster,
hb_mask_t mask)
{
for (unsigned int i = start; i < end; i++)
if (cluster != infos[i].cluster)
{
scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_GLYPH_FLAGS;
infos[i].mask |= mask;
}
if (unlikely (start == end))
return;

unsigned cluster_first = info[start].cluster;
unsigned cluster_last = info[end - 1].cluster;

if (cluster_level == HB_BUFFER_CLUSTER_LEVEL_CHARACTERS ||
(cluster != cluster_first && cluster != cluster_last))
{
for (unsigned int i = start; i < end; i++)
if (cluster != infos[i].cluster)
{
scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_GLYPH_FLAGS;
infos[i].mask |= mask;
}
return;
}

/* Monotone clusters */

if (cluster == cluster_first)
{
for (unsigned int i = end; start < i && infos[i - 1].cluster != cluster_first; i--)
if (cluster != infos[i - 1].cluster)
{
scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_GLYPH_FLAGS;
infos[i - 1].mask |= mask;
}
}
else /* cluster == cluster_last */
{
for (unsigned int i = start; i < end && infos[i].cluster != cluster_last; i++)
if (cluster != infos[i].cluster)
{
scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_GLYPH_FLAGS;
infos[i].mask |= mask;
}
}
}
unsigned
_infos_find_min_cluster (const hb_glyph_info_t *infos,
Expand Down

0 comments on commit 30b84fa

Please sign in to comment.