[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
|
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -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 ()
|
||||||
{
|
{
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue