[buffer] Move delete_glyphs_inplace() here

This commit is contained in:
Behdad Esfahbod 2022-11-20 13:10:19 -07:00
parent dd88dae8a9
commit ed43bc5118
6 changed files with 51 additions and 56 deletions

View File

@ -289,7 +289,7 @@ is_deleted_glyph (const hb_glyph_info_t *info)
void void
hb_aat_layout_remove_deleted_glyphs (hb_buffer_t *buffer) hb_aat_layout_remove_deleted_glyphs (hb_buffer_t *buffer)
{ {
hb_ot_layout_delete_glyphs_inplace (buffer, is_deleted_glyph); buffer->delete_glyphs_inplace (is_deleted_glyph);
} }
/** /**

View File

@ -605,6 +605,53 @@ done:
skip_glyph (); skip_glyph ();
} }
void
hb_buffer_t::delete_glyphs_inplace (bool (*filter) (const hb_glyph_info_t *info))
{
/* Merge clusters and delete filtered glyphs.
* NOTE! We can't use out-buffer as we have positioning data. */
unsigned int j = 0;
unsigned int count = len;
for (unsigned int i = 0; i < count; i++)
{
if (filter (&info[i]))
{
/* Merge clusters.
* Same logic as delete_glyph(), but for in-place removal. */
unsigned int cluster = info[i].cluster;
if (i + 1 < count && cluster == info[i + 1].cluster)
continue; /* Cluster survives; do nothing. */
if (j)
{
/* Merge cluster backward. */
if (cluster < info[j - 1].cluster)
{
unsigned int mask = info[i].mask;
unsigned int old_cluster = info[j - 1].cluster;
for (unsigned k = j; k && info[k - 1].cluster == old_cluster; k--)
set_cluster (info[k - 1], cluster, mask);
}
continue;
}
if (i + 1 < count)
merge_clusters (i, i + 2); /* Merge cluster forward. */
continue;
}
if (j != i)
{
info[j] = info[i];
pos[j] = pos[i];
}
j++;
}
len = j;
}
void void
hb_buffer_t::guess_segment_properties () hb_buffer_t::guess_segment_properties ()
{ {

View File

@ -411,6 +411,8 @@ struct hb_buffer_t
HB_INTERNAL void merge_out_clusters (unsigned int start, unsigned int end); HB_INTERNAL void merge_out_clusters (unsigned int start, unsigned int end);
/* Merge clusters for deleting current glyph, and skip it. */ /* Merge clusters for deleting current glyph, and skip it. */
HB_INTERNAL void delete_glyph (); HB_INTERNAL void delete_glyph ();
HB_INTERNAL void delete_glyphs_inplace (bool (*filter) (const hb_glyph_info_t *info));
/* Adds glyph flags in mask to infos with clusters between start and end. /* Adds glyph flags in mask to infos with clusters between start and end.

View File

@ -1465,56 +1465,6 @@ hb_ot_layout_substitute_start (hb_font_t *font,
_hb_ot_layout_set_glyph_props (font, buffer); _hb_ot_layout_set_glyph_props (font, buffer);
} }
void
hb_ot_layout_delete_glyphs_inplace (hb_buffer_t *buffer,
bool (*filter) (const hb_glyph_info_t *info))
{
/* Merge clusters and delete filtered glyphs.
* NOTE! We can't use out-buffer as we have positioning data. */
unsigned int j = 0;
unsigned int count = buffer->len;
hb_glyph_info_t *info = buffer->info;
hb_glyph_position_t *pos = buffer->pos;
for (unsigned int i = 0; i < count; i++)
{
if (filter (&info[i]))
{
/* Merge clusters.
* Same logic as buffer->delete_glyph(), but for in-place removal. */
unsigned int cluster = info[i].cluster;
if (i + 1 < count && cluster == info[i + 1].cluster)
continue; /* Cluster survives; do nothing. */
if (j)
{
/* Merge cluster backward. */
if (cluster < info[j - 1].cluster)
{
unsigned int mask = info[i].mask;
unsigned int old_cluster = info[j - 1].cluster;
for (unsigned k = j; k && info[k - 1].cluster == old_cluster; k--)
buffer->set_cluster (info[k - 1], cluster, mask);
}
continue;
}
if (i + 1 < count)
buffer->merge_clusters (i, i + 2); /* Merge cluster forward. */
continue;
}
if (j != i)
{
info[j] = info[i];
pos[j] = pos[i];
}
j++;
}
buffer->len = j;
}
/** /**
* hb_ot_layout_lookup_substitute_closure: * hb_ot_layout_lookup_substitute_closure:
* @face: #hb_face_t to work upon * @face: #hb_face_t to work upon

View File

@ -102,10 +102,6 @@ HB_INTERNAL void
hb_ot_layout_substitute_start (hb_font_t *font, hb_ot_layout_substitute_start (hb_font_t *font,
hb_buffer_t *buffer); hb_buffer_t *buffer);
HB_INTERNAL void
hb_ot_layout_delete_glyphs_inplace (hb_buffer_t *buffer,
bool (*filter) (const hb_glyph_info_t *info));
namespace OT { namespace OT {
struct hb_ot_apply_context_t; struct hb_ot_apply_context_t;
struct hb_ot_layout_lookup_accelerator_t; struct hb_ot_layout_lookup_accelerator_t;

View File

@ -864,7 +864,7 @@ hb_ot_hide_default_ignorables (hb_buffer_t *buffer,
} }
} }
else else
hb_ot_layout_delete_glyphs_inplace (buffer, _hb_glyph_info_is_default_ignorable); buffer->delete_glyphs_inplace (_hb_glyph_info_is_default_ignorable);
} }