From 2e96d2c6ee34142375373be07217c9953e7822cc Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 17 Oct 2013 21:16:20 +0200 Subject: [PATCH] [otlayout] More shuffling --- src/hb-ot-layout-private.hh | 288 ++++++++++++++++++------------------ 1 file changed, 148 insertions(+), 140 deletions(-) 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,72 +48,6 @@ #define syllable() var1.u8[3] /* GSUB/GPOS shaping boundaries */ -enum { - MASK0_ZWJ = 0x20u, - MASK0_ZWNJ = 0x40u, - MASK0_IGNORABLE = 0x80u, - MASK0_GEN_CAT = 0x1Fu -}; - -inline void -_hb_glyph_info_set_unicode_props (hb_glyph_info_t *info, hb_unicode_funcs_t *unicode) -{ - info->unicode_props0() = ((unsigned int) unicode->general_category (info->codepoint)) | - (unicode->is_default_ignorable (info->codepoint) ? MASK0_IGNORABLE : 0) | - (info->codepoint == 0x200C ? MASK0_ZWNJ : 0) | - (info->codepoint == 0x200D ? MASK0_ZWJ : 0); - info->unicode_props1() = unicode->modified_combining_class (info->codepoint); -} - -inline void -_hb_glyph_info_set_general_category (hb_glyph_info_t *info, hb_unicode_general_category_t gen_cat) -{ - info->unicode_props0() = (unsigned int) gen_cat | ((info->unicode_props0()) & ~MASK0_GEN_CAT); -} - -inline hb_unicode_general_category_t -_hb_glyph_info_get_general_category (const hb_glyph_info_t *info) -{ - return (hb_unicode_general_category_t) (info->unicode_props0() & MASK0_GEN_CAT); -} - -inline void -_hb_glyph_info_set_modified_combining_class (hb_glyph_info_t *info, unsigned int modified_class) -{ - info->unicode_props1() = modified_class; -} - -inline unsigned int -_hb_glyph_info_get_modified_combining_class (const hb_glyph_info_t *info) -{ - return info->unicode_props1(); -} - -inline hb_bool_t -_hb_glyph_info_is_default_ignorable (const hb_glyph_info_t *info) -{ - return !!(info->unicode_props0() & MASK0_IGNORABLE); -} - -inline hb_bool_t -_hb_glyph_info_is_zwnj (const hb_glyph_info_t *info) -{ - return !!(info->unicode_props0() & MASK0_ZWNJ); -} - -inline hb_bool_t -_hb_glyph_info_is_zwj (const hb_glyph_info_t *info) -{ - return !!(info->unicode_props0() & MASK0_ZWJ); -} - -inline void -_hb_glyph_info_flip_joiners (hb_glyph_info_t *info) -{ - info->unicode_props0() ^= MASK0_ZWNJ | MASK0_ZWJ; -} - - /* * GDEF */ @@ -133,80 +67,6 @@ typedef enum { * GSUB/GPOS */ -/* lig_id / lig_comp - * - * When a ligature is formed: - * - * - The ligature glyph and any marks in between all the same newly allocated - * lig_id, - * - The ligature glyph will get lig_num_comps set to the number of components - * - 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. - * - * When a multiple-substitution is done: - * - * - All resulting glyphs will have lig_id = 0, - * - The resulting glyphs will have lig_comp = 0, 1, 2, ... respectively. - * - This is used in GPOS to attach marks to the first component of a - * 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. - */ -#define IS_LIG_BASE 0x10 -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) | IS_LIG_BASE | (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 -get_lig_id (const hb_glyph_info_t &info) -{ - return info.lig_props() >> 5; -} -static inline bool -is_a_ligature (const hb_glyph_info_t &info) -{ - return !!(info.lig_props() & IS_LIG_BASE); -} -static inline unsigned int -get_lig_comp (const hb_glyph_info_t &info) -{ - if (is_a_ligature (info)) - return 0; - else - return info.lig_props() & 0x0F; -} -static inline unsigned int -get_lig_num_comps (const hb_glyph_info_t &info) -{ - if ((info.glyph_props() & HB_OT_LAYOUT_GLYPH_PROPS_LIGATURE) && is_a_ligature (info)) - return info.lig_props() & 0x0F; - else - return 1; -} - -static inline uint8_t allocate_lig_id (hb_buffer_t *buffer) { - uint8_t lig_id = buffer->next_serial () & 0x07; - if (unlikely (!lig_id)) - lig_id = allocate_lig_id (buffer); /* in case of overflow */ - return lig_id; -} - - HB_INTERNAL hb_bool_t hb_ot_layout_lookup_would_substitute_fast (hb_face_t *face, unsigned int lookup_index, @@ -307,4 +167,152 @@ _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, + MASK0_IGNORABLE = 0x80u, + MASK0_GEN_CAT = 0x1Fu +}; + +inline void +_hb_glyph_info_set_unicode_props (hb_glyph_info_t *info, hb_unicode_funcs_t *unicode) +{ + info->unicode_props0() = ((unsigned int) unicode->general_category (info->codepoint)) | + (unicode->is_default_ignorable (info->codepoint) ? MASK0_IGNORABLE : 0) | + (info->codepoint == 0x200C ? MASK0_ZWNJ : 0) | + (info->codepoint == 0x200D ? MASK0_ZWJ : 0); + info->unicode_props1() = unicode->modified_combining_class (info->codepoint); +} + +inline void +_hb_glyph_info_set_general_category (hb_glyph_info_t *info, hb_unicode_general_category_t gen_cat) +{ + info->unicode_props0() = (unsigned int) gen_cat | ((info->unicode_props0()) & ~MASK0_GEN_CAT); +} + +inline hb_unicode_general_category_t +_hb_glyph_info_get_general_category (const hb_glyph_info_t *info) +{ + return (hb_unicode_general_category_t) (info->unicode_props0() & MASK0_GEN_CAT); +} + +inline void +_hb_glyph_info_set_modified_combining_class (hb_glyph_info_t *info, unsigned int modified_class) +{ + info->unicode_props1() = modified_class; +} + +inline unsigned int +_hb_glyph_info_get_modified_combining_class (const hb_glyph_info_t *info) +{ + return info->unicode_props1(); +} + +inline hb_bool_t +_hb_glyph_info_is_default_ignorable (const hb_glyph_info_t *info) +{ + return !!(info->unicode_props0() & MASK0_IGNORABLE); +} + +inline hb_bool_t +_hb_glyph_info_is_zwnj (const hb_glyph_info_t *info) +{ + return !!(info->unicode_props0() & MASK0_ZWNJ); +} + +inline hb_bool_t +_hb_glyph_info_is_zwj (const hb_glyph_info_t *info) +{ + return !!(info->unicode_props0() & MASK0_ZWJ); +} + +inline void +_hb_glyph_info_flip_joiners (hb_glyph_info_t *info) +{ + info->unicode_props0() ^= MASK0_ZWNJ | MASK0_ZWJ; +} + +/* lig_props: aka lig_id / lig_comp + * + * When a ligature is formed: + * + * - The ligature glyph and any marks in between all the same newly allocated + * lig_id, + * - The ligature glyph will get lig_num_comps set to the number of components + * - 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, + * - 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: + * + * - All resulting glyphs will have lig_id = 0, + * - The resulting glyphs will have lig_comp = 0, 1, 2, ... respectively. + * - This is used in GPOS to attach marks to the first component of a + * 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 the same ligature. + */ +#define IS_LIG_BASE 0x10 +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) | IS_LIG_BASE | (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 +get_lig_id (const hb_glyph_info_t &info) +{ + return info.lig_props() >> 5; +} +static inline bool +is_a_ligature (const hb_glyph_info_t &info) +{ + return !!(info.lig_props() & IS_LIG_BASE); +} +static inline unsigned int +get_lig_comp (const hb_glyph_info_t &info) +{ + if (is_a_ligature (info)) + return 0; + else + return info.lig_props() & 0x0F; +} +static inline unsigned int +get_lig_num_comps (const hb_glyph_info_t &info) +{ + if ((info.glyph_props() & HB_OT_LAYOUT_GLYPH_PROPS_LIGATURE) && is_a_ligature (info)) + return info.lig_props() & 0x0F; + else + return 1; +} + +static inline uint8_t allocate_lig_id (hb_buffer_t *buffer) { + uint8_t lig_id = buffer->next_serial () & 0x07; + if (unlikely (!lig_id)) + lig_id = allocate_lig_id (buffer); /* in case of overflow */ + return lig_id; +} + + + #endif /* HB_OT_LAYOUT_PRIVATE_HH */