[GSUB/GPOS] Minor
Start squeezing more out of lig_id/lig_comp.
This commit is contained in:
parent
ef6e9cec33
commit
2ec3ba46a3
|
@ -215,7 +215,7 @@ struct Sequence
|
||||||
unsigned int klass = c->property & HB_OT_LAYOUT_GLYPH_CLASS_LIGATURE ? HB_OT_LAYOUT_GLYPH_CLASS_BASE_GLYPH : 0;
|
unsigned int klass = c->property & HB_OT_LAYOUT_GLYPH_CLASS_LIGATURE ? HB_OT_LAYOUT_GLYPH_CLASS_BASE_GLYPH : 0;
|
||||||
unsigned int count = substitute.len;
|
unsigned int count = substitute.len;
|
||||||
for (unsigned int i = 0; i < count; i++) {
|
for (unsigned int i = 0; i < count; i++) {
|
||||||
set_lig_props (c->buffer->cur(), 0, i);
|
set_lig_props_for_component (c->buffer->cur(), i);
|
||||||
c->output_glyph (substitute.array[i], klass);
|
c->output_glyph (substitute.array[i], klass);
|
||||||
}
|
}
|
||||||
c->buffer->skip_glyph ();
|
c->buffer->skip_glyph ();
|
||||||
|
@ -512,7 +512,7 @@ struct Ligature
|
||||||
/* Allocate new ligature id */
|
/* Allocate new ligature id */
|
||||||
unsigned int lig_id = is_a_mark_ligature ? 0 : allocate_lig_id (c->buffer);
|
unsigned int lig_id = is_a_mark_ligature ? 0 : allocate_lig_id (c->buffer);
|
||||||
if (!is_a_mark_ligature)
|
if (!is_a_mark_ligature)
|
||||||
set_lig_props (c->buffer->cur(), lig_id, 0);
|
set_lig_props_for_ligature (c->buffer->cur(), lig_id, count);
|
||||||
|
|
||||||
if (skippy_iter.idx < c->buffer->idx + count) /* No input glyphs skipped */
|
if (skippy_iter.idx < c->buffer->idx + count) /* No input glyphs skipped */
|
||||||
{
|
{
|
||||||
|
@ -536,7 +536,7 @@ struct Ligature
|
||||||
while (c->should_mark_skip_current_glyph ())
|
while (c->should_mark_skip_current_glyph ())
|
||||||
{
|
{
|
||||||
if (!is_a_mark_ligature)
|
if (!is_a_mark_ligature)
|
||||||
set_lig_props (c->buffer->cur(), lig_id, i);
|
set_lig_props_for_mark (c->buffer->cur(), lig_id, i);
|
||||||
c->buffer->next_glyph ();
|
c->buffer->next_glyph ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -94,18 +94,45 @@ _hb_ot_layout_skip_mark (hb_face_t *face,
|
||||||
static inline void
|
static inline void
|
||||||
set_lig_props (hb_glyph_info_t &info, unsigned int lig_id, unsigned int lig_comp)
|
set_lig_props (hb_glyph_info_t &info, unsigned int lig_id, unsigned int lig_comp)
|
||||||
{
|
{
|
||||||
info.lig_props() = (lig_id << 4) | (lig_comp & 0x0F);
|
info.lig_props() = (lig_id << 5) | (lig_comp & 0x0F);
|
||||||
}
|
}
|
||||||
|
static inline void
|
||||||
|
set_lig_props_for_ligature (hb_glyph_info_t &info, unsigned int lig_id, unsigned int lig_num_comps)
|
||||||
|
{
|
||||||
|
info.lig_props() = (lig_id << 5) | 0x10 | (lig_num_comps & 0x0F);
|
||||||
|
}
|
||||||
|
static inline void
|
||||||
|
set_lig_props_for_mark (hb_glyph_info_t &info, unsigned int lig_id, unsigned int lig_comp)
|
||||||
|
{
|
||||||
|
info.lig_props() = (lig_id << 5) | (lig_comp & 0x0F);
|
||||||
|
}
|
||||||
|
static inline void
|
||||||
|
set_lig_props_for_component (hb_glyph_info_t &info, unsigned int comp)
|
||||||
|
{
|
||||||
|
set_lig_props_for_mark (info, 0, comp);
|
||||||
|
}
|
||||||
|
|
||||||
static inline unsigned int
|
static inline unsigned int
|
||||||
get_lig_id (const hb_glyph_info_t &info)
|
get_lig_id (const hb_glyph_info_t &info)
|
||||||
{
|
{
|
||||||
return info.lig_props() >> 4;
|
return info.lig_props() >> 5;
|
||||||
}
|
}
|
||||||
static inline unsigned int
|
static inline unsigned int
|
||||||
get_lig_comp (const hb_glyph_info_t &info)
|
get_lig_comp (const hb_glyph_info_t &info)
|
||||||
{
|
{
|
||||||
|
if (info.lig_props() & 0x10)
|
||||||
|
return 0;
|
||||||
|
else
|
||||||
return info.lig_props() & 0x0F;
|
return info.lig_props() & 0x0F;
|
||||||
}
|
}
|
||||||
|
static inline unsigned int
|
||||||
|
get_lig_num_comps (const hb_glyph_info_t &info)
|
||||||
|
{
|
||||||
|
if (info.lig_props() & 0x10)
|
||||||
|
return info.lig_props() & 0x0F;
|
||||||
|
else
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
static inline bool
|
static inline bool
|
||||||
is_a_ligature (const hb_glyph_info_t &info)
|
is_a_ligature (const hb_glyph_info_t &info)
|
||||||
{
|
{
|
||||||
|
@ -113,7 +140,7 @@ is_a_ligature (const hb_glyph_info_t &info)
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline uint8_t allocate_lig_id (hb_buffer_t *buffer) {
|
static inline uint8_t allocate_lig_id (hb_buffer_t *buffer) {
|
||||||
uint8_t lig_id = buffer->next_serial () & 0x0F;
|
uint8_t lig_id = buffer->next_serial () & 0x07;
|
||||||
if (unlikely (!lig_id))
|
if (unlikely (!lig_id))
|
||||||
lig_id = allocate_lig_id (buffer); /* in case of overflow */
|
lig_id = allocate_lig_id (buffer); /* in case of overflow */
|
||||||
return lig_id;
|
return lig_id;
|
||||||
|
|
Loading…
Reference in New Issue