diff --git a/src/hb-ot-layout-private.hh b/src/hb-ot-layout-private.hh index 0278cb550..5b16dfc4f 100644 --- a/src/hb-ot-layout-private.hh +++ b/src/hb-ot-layout-private.hh @@ -48,6 +48,131 @@ #define syllable() var1.u8[3] /* GSUB/GPOS shaping boundaries */ +/* + * GDEF + */ + +typedef enum { + /* One bit available here... = 0x01u */ + + /* The following three match LookupFlags::Ignore* numbers. */ + HB_OT_LAYOUT_GLYPH_PROPS_BASE_GLYPH = 0x02u, + HB_OT_LAYOUT_GLYPH_PROPS_LIGATURE = 0x04u, + HB_OT_LAYOUT_GLYPH_PROPS_MARK = 0x08u + +} hb_ot_layout_glyph_class_mask_t; + + +/* + * GSUB/GPOS + */ + +HB_INTERNAL hb_bool_t +hb_ot_layout_lookup_would_substitute_fast (hb_face_t *face, + unsigned int lookup_index, + const hb_codepoint_t *glyphs, + unsigned int glyphs_length, + hb_bool_t zero_context); + + +/* Should be called before all the substitute_lookup's are done. */ +HB_INTERNAL void +hb_ot_layout_substitute_start (hb_font_t *font, + hb_buffer_t *buffer); + + +struct hb_ot_layout_lookup_accelerator_t; + +namespace OT { + struct hb_apply_context_t; + struct SubstLookup; +} + +HB_INTERNAL void +hb_ot_layout_substitute_lookup (OT::hb_apply_context_t *c, + const OT::SubstLookup &lookup, + const hb_ot_layout_lookup_accelerator_t &accel); + + +/* Should be called after all the substitute_lookup's are done */ +HB_INTERNAL void +hb_ot_layout_substitute_finish (hb_font_t *font, + hb_buffer_t *buffer); + + +/* Should be called before all the position_lookup's are done. Resets positions to zero. */ +HB_INTERNAL void +hb_ot_layout_position_start (hb_font_t *font, + hb_buffer_t *buffer); + +/* Should be called after all the position_lookup's are done */ +HB_INTERNAL void +hb_ot_layout_position_finish (hb_font_t *font, + hb_buffer_t *buffer); + + + +/* + * hb_ot_layout_t + */ + +namespace OT { + struct GDEF; + struct GSUB; + struct GPOS; +} + +struct hb_ot_layout_lookup_accelerator_t +{ + template + inline void init (const TLookup &lookup) + { + digest.init (); + lookup.add_coverage (&digest); + } + + template + inline void fini (const TLookup &lookup) + { + } + + hb_set_digest_t digest; +}; + +struct hb_ot_layout_t +{ + hb_blob_t *gdef_blob; + hb_blob_t *gsub_blob; + hb_blob_t *gpos_blob; + + const struct OT::GDEF *gdef; + const struct OT::GSUB *gsub; + const struct OT::GPOS *gpos; + + unsigned int gsub_lookup_count; + unsigned int gpos_lookup_count; + + hb_ot_layout_lookup_accelerator_t *gsub_accels; + hb_ot_layout_lookup_accelerator_t *gpos_accels; +}; + + +HB_INTERNAL hb_ot_layout_t * +_hb_ot_layout_create (hb_face_t *face); + +HB_INTERNAL void +_hb_ot_layout_destroy (hb_ot_layout_t *layout); + + +#define hb_ot_layout_from_face(face) ((hb_ot_layout_t *) face->shaper_data.ot) + + +/* + * Buffer var routines. + */ + +/* unicode_props */ + enum { MASK0_ZWJ = 0x20u, MASK0_ZWNJ = 0x40u, @@ -113,27 +238,7 @@ _hb_glyph_info_flip_joiners (hb_glyph_info_t *info) info->unicode_props0() ^= MASK0_ZWNJ | MASK0_ZWJ; } - -/* - * GDEF - */ - -typedef enum { - /* One bit available here... = 0x01u */ - - /* The following three match LookupFlags::Ignore* numbers. */ - HB_OT_LAYOUT_GLYPH_PROPS_BASE_GLYPH = 0x02u, - HB_OT_LAYOUT_GLYPH_PROPS_LIGATURE = 0x04u, - HB_OT_LAYOUT_GLYPH_PROPS_MARK = 0x08u - -} hb_ot_layout_glyph_class_mask_t; - - -/* - * GSUB/GPOS - */ - -/* lig_id / lig_comp +/* lig_props: aka lig_id / lig_comp * * When a ligature is formed: * @@ -143,7 +248,9 @@ typedef enum { * - The marks get lig_comp > 0, reflecting which component of the ligature * they were applied to. * - This is used in GPOS to attach marks to the right component of a ligature - * in MarkLigPos. + * in MarkLigPos, + * - Note that when marks are ligated together, much of the above is skipped + * and the current lig_id reused. * * When a multiple-substitution is done: * @@ -153,7 +260,7 @@ typedef enum { * multiple substitution in MarkBasePos. * * The numbers are also used in GPOS to do mark-to-mark positioning only - * to marks that belong to the same component of a ligature in MarkMarPos. + * to marks that belong to the same component of the same ligature. */ #define IS_LIG_BASE 0x10 static inline void @@ -207,104 +314,5 @@ static inline uint8_t allocate_lig_id (hb_buffer_t *buffer) { } -HB_INTERNAL hb_bool_t -hb_ot_layout_lookup_would_substitute_fast (hb_face_t *face, - unsigned int lookup_index, - const hb_codepoint_t *glyphs, - unsigned int glyphs_length, - hb_bool_t zero_context); - - -/* Should be called before all the substitute_lookup's are done. */ -HB_INTERNAL void -hb_ot_layout_substitute_start (hb_font_t *font, - hb_buffer_t *buffer); - - -struct hb_ot_layout_lookup_accelerator_t; - -namespace OT { - struct hb_apply_context_t; - struct SubstLookup; -} - -HB_INTERNAL void -hb_ot_layout_substitute_lookup (OT::hb_apply_context_t *c, - const OT::SubstLookup &lookup, - const hb_ot_layout_lookup_accelerator_t &accel); - - -/* Should be called after all the substitute_lookup's are done */ -HB_INTERNAL void -hb_ot_layout_substitute_finish (hb_font_t *font, - hb_buffer_t *buffer); - - -/* Should be called before all the position_lookup's are done. Resets positions to zero. */ -HB_INTERNAL void -hb_ot_layout_position_start (hb_font_t *font, - hb_buffer_t *buffer); - -/* Should be called after all the position_lookup's are done */ -HB_INTERNAL void -hb_ot_layout_position_finish (hb_font_t *font, - hb_buffer_t *buffer); - - - -/* - * hb_ot_layout_t - */ - -namespace OT { - struct GDEF; - struct GSUB; - struct GPOS; -} - -struct hb_ot_layout_lookup_accelerator_t -{ - template - inline void init (const TLookup &lookup) - { - digest.init (); - lookup.add_coverage (&digest); - } - - template - inline void fini (const TLookup &lookup) - { - } - - hb_set_digest_t digest; -}; - -struct hb_ot_layout_t -{ - hb_blob_t *gdef_blob; - hb_blob_t *gsub_blob; - hb_blob_t *gpos_blob; - - const struct OT::GDEF *gdef; - const struct OT::GSUB *gsub; - const struct OT::GPOS *gpos; - - unsigned int gsub_lookup_count; - unsigned int gpos_lookup_count; - - hb_ot_layout_lookup_accelerator_t *gsub_accels; - hb_ot_layout_lookup_accelerator_t *gpos_accels; -}; - - -HB_INTERNAL hb_ot_layout_t * -_hb_ot_layout_create (hb_face_t *face); - -HB_INTERNAL void -_hb_ot_layout_destroy (hb_ot_layout_t *layout); - - -#define hb_ot_layout_from_face(face) ((hb_ot_layout_t *) face->shaper_data.ot) - #endif /* HB_OT_LAYOUT_PRIVATE_HH */