[GSUB/GPOS] Minor

Start squeezing more out of lig_id/lig_comp.
This commit is contained in:
Behdad Esfahbod 2012-07-29 22:02:24 -04:00
parent ef6e9cec33
commit 2ec3ba46a3
2 changed files with 34 additions and 7 deletions

View File

@ -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 ();
} }

View File

@ -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;