diff --git a/src/hb-ot-layout-gsubgpos-private.hh b/src/hb-ot-layout-gsubgpos-private.hh index 4cf615090676aa37dfa8b042092027cb6531b99e..fee026a83a92ddfdeed1961cdbd801072ef483a1 100644 --- a/src/hb-ot-layout-gsubgpos-private.hh +++ b/src/hb-ot-layout-gsubgpos-private.hh @@ -225,7 +225,8 @@ struct hb_apply_context_t inline bool should_mark_skip_current_glyph (void) const { - return _hb_ot_layout_skip_mark (face, &buffer->cur(), lookup_props, NULL); + unsigned int property; + return _hb_ot_layout_skip_mark (face, &buffer->cur(), lookup_props, &property); } diff --git a/src/hb-ot-layout.cc b/src/hb-ot-layout.cc index da65cda8502d26c9933f2cad75d3a8940f00b29d..86550ca9c0cd97e44c131ef8625f48b18ecc558e 100644 --- a/src/hb-ot-layout.cc +++ b/src/hb-ot-layout.cc @@ -107,9 +107,31 @@ _hb_ot_layout_get_glyph_property (hb_face_t *face, return info->props_cache(); } -static hb_bool_t +static inline hb_bool_t +_hb_ot_layout_match_properties_mark (hb_face_t *face, + hb_codepoint_t glyph, + unsigned int glyph_props, + unsigned int lookup_props) +{ + /* If using mark filtering sets, the high short of + * lookup_props has the set index. + */ + if (lookup_props & LookupFlag::UseMarkFilteringSet) + return _get_gdef (face).mark_set_covers (lookup_props >> 16, glyph); + + /* The second byte of lookup_props has the meaning + * "ignore marks of attachment type different than + * the attachment type specified." + */ + if (lookup_props & LookupFlag::MarkAttachmentType && glyph_props & LookupFlag::MarkAttachmentType) + return (lookup_props & LookupFlag::MarkAttachmentType) == (glyph_props & LookupFlag::MarkAttachmentType); + + return true; +} + +static inline hb_bool_t _hb_ot_layout_match_properties (hb_face_t *face, - hb_codepoint_t codepoint, + hb_codepoint_t glyph, unsigned int glyph_props, unsigned int lookup_props) { @@ -119,21 +141,8 @@ _hb_ot_layout_match_properties (hb_face_t *face, if (glyph_props & lookup_props & LookupFlag::IgnoreFlags) return false; - if (glyph_props & HB_OT_LAYOUT_GLYPH_CLASS_MARK) - { - /* If using mark filtering sets, the high short of - * lookup_props has the set index. - */ - if (lookup_props & LookupFlag::UseMarkFilteringSet) - return _get_gdef (face).mark_set_covers (lookup_props >> 16, codepoint); - - /* The second byte of lookup_props has the meaning - * "ignore marks of attachment type different than - * the attachment type specified." - */ - if (lookup_props & LookupFlag::MarkAttachmentType && glyph_props & LookupFlag::MarkAttachmentType) - return (lookup_props & LookupFlag::MarkAttachmentType) == (glyph_props & LookupFlag::MarkAttachmentType); - } + if (unlikely (glyph_props & HB_OT_LAYOUT_GLYPH_CLASS_MARK)) + return _hb_ot_layout_match_properties_mark (face, glyph, glyph_props, lookup_props); return true; } @@ -161,7 +170,8 @@ _hb_ot_layout_skip_mark (hb_face_t *face, unsigned int property; property = _hb_ot_layout_get_glyph_property (face, ginfo); - (void) (property_out && (*property_out = property)); + if (property_out) + *property_out = property; /* If it's a mark, skip it we don't accept it. */ if (unlikely (property & HB_OT_LAYOUT_GLYPH_CLASS_MARK))