[buffer] Move delete_glyphs_inplace() here
This commit is contained in:
parent
dd88dae8a9
commit
ed43bc5118
|
@ -289,7 +289,7 @@ is_deleted_glyph (const hb_glyph_info_t *info)
|
|||
void
|
||||
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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -605,6 +605,53 @@ done:
|
|||
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
|
||||
hb_buffer_t::guess_segment_properties ()
|
||||
{
|
||||
|
|
|
@ -411,6 +411,8 @@ struct hb_buffer_t
|
|||
HB_INTERNAL void merge_out_clusters (unsigned int start, unsigned int end);
|
||||
/* Merge clusters for deleting current glyph, and skip it. */
|
||||
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.
|
||||
|
|
|
@ -1465,56 +1465,6 @@ hb_ot_layout_substitute_start (hb_font_t *font,
|
|||
_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:
|
||||
* @face: #hb_face_t to work upon
|
||||
|
|
|
@ -102,10 +102,6 @@ HB_INTERNAL void
|
|||
hb_ot_layout_substitute_start (hb_font_t *font,
|
||||
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 {
|
||||
struct hb_ot_apply_context_t;
|
||||
struct hb_ot_layout_lookup_accelerator_t;
|
||||
|
|
|
@ -864,7 +864,7 @@ hb_ot_hide_default_ignorables (hb_buffer_t *buffer,
|
|||
}
|
||||
}
|
||||
else
|
||||
hb_ot_layout_delete_glyphs_inplace (buffer, _hb_glyph_info_is_default_ignorable);
|
||||
buffer->delete_glyphs_inplace (_hb_glyph_info_is_default_ignorable);
|
||||
}
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue