diff --git a/src/hb-ot-layout-gsubgpos-private.hh b/src/hb-ot-layout-gsubgpos-private.hh index 921859a66035724e2c574bdf54f83ec98ee83093..f77f5d98ba7a03e18e891e8500b625ef341429e0 100644 --- a/src/hb-ot-layout-gsubgpos-private.hh +++ b/src/hb-ot-layout-gsubgpos-private.hh @@ -319,7 +319,7 @@ struct hb_apply_context_t : if (!c->check_glyph_property (&info, lookup_props)) return SKIP_YES; - if (unlikely (_hb_glyph_info_is_default_ignorable_and_not_fvs (&info) && + if (unlikely (_hb_glyph_info_is_default_ignorable_and_not_hidden (&info) && (ignore_zwnj || !_hb_glyph_info_is_zwnj (&info)) && (ignore_zwj || !_hb_glyph_info_is_zwj (&info)))) return SKIP_MAYBE; diff --git a/src/hb-ot-layout-private.hh b/src/hb-ot-layout-private.hh index 071a439d60c31c1e996e68aba89b09b658f5d734..b476339e1c0830fc28bd0b4f86185e3638ec3e66 100644 --- a/src/hb-ot-layout-private.hh +++ b/src/hb-ot-layout-private.hh @@ -240,7 +240,8 @@ _next_syllable (hb_buffer_t *buffer, unsigned int start) enum hb_unicode_props_flags_t { UPROPS_MASK_GEN_CAT = 0x001Fu, UPROPS_MASK_IGNORABLE = 0x0020u, - UPROPS_MASK_FVS = 0x0040u, /* MONGOLIAN FREE VARIATION SELECTOR 1..3 */ + UPROPS_MASK_HIDDEN = 0x0040u, /* MONGOLIAN FREE VARIATION SELECTOR 1..3, + * or TAG characters */ /* If GEN_CAT=FORMAT, top byte masks: */ UPROPS_MASK_Cf_ZWJ = 0x0100u, @@ -273,7 +274,11 @@ _hb_glyph_info_set_unicode_props (hb_glyph_info_t *info, hb_buffer_t *buffer) * Fixes: * https://github.com/behdad/harfbuzz/issues/234 */ - if (unlikely (hb_in_range (u, 0x180Bu, 0x180Du))) props |= UPROPS_MASK_FVS; + if (unlikely (hb_in_range (u, 0x180Bu, 0x180Du))) props |= UPROPS_MASK_HIDDEN; + /* TAG characters need similar treatment. Fixes: + * https://github.com/behdad/harfbuzz/issues/463 + */ + if (unlikely (hb_in_range (u, 0xE0020u, 0xE007Fu))) props |= UPROPS_MASK_HIDDEN; } else if (unlikely (HB_UNICODE_GENERAL_CATEGORY_IS_NON_ENCLOSING_MARK_OR_MODIFIER_SYMBOL (gen_cat))) { @@ -373,9 +378,9 @@ _hb_glyph_info_is_default_ignorable (const hb_glyph_info_t *info) !_hb_glyph_info_ligated (info); } static inline hb_bool_t -_hb_glyph_info_is_default_ignorable_and_not_fvs (const hb_glyph_info_t *info) +_hb_glyph_info_is_default_ignorable_and_not_hidden (const hb_glyph_info_t *info) { - return ((info->unicode_props() & (UPROPS_MASK_IGNORABLE|UPROPS_MASK_FVS)) + return ((info->unicode_props() & (UPROPS_MASK_IGNORABLE|UPROPS_MASK_HIDDEN)) == UPROPS_MASK_IGNORABLE) && !_hb_glyph_info_ligated (info); } diff --git a/test/shaping/Makefile.am b/test/shaping/Makefile.am index 89578e10b7f06d5a932c562281b56e4d165c6ca2..ab25a50a0a9f328d6994b99afef5c19fe40f1d5b 100644 --- a/test/shaping/Makefile.am +++ b/test/shaping/Makefile.am @@ -50,6 +50,7 @@ TESTS = \ tests/context-matching.tests \ tests/cursive-positioning.tests \ tests/default-ignorables.tests \ + tests/emoji-flag-tags.tests \ tests/fallback-positioning.tests \ tests/fuzzed.tests \ tests/hangul-jamo.tests \ diff --git a/test/shaping/fonts/sha1sum/53374c7ca3657be37efde7ed02ae34229a56ae1f.ttf b/test/shaping/fonts/sha1sum/53374c7ca3657be37efde7ed02ae34229a56ae1f.ttf new file mode 100644 index 0000000000000000000000000000000000000000..d7f2bdb0893644696453aae7bcdbe6e5862a6e40 Binary files /dev/null and b/test/shaping/fonts/sha1sum/53374c7ca3657be37efde7ed02ae34229a56ae1f.ttf differ diff --git a/test/shaping/tests/emoji-flag-tags.tests b/test/shaping/tests/emoji-flag-tags.tests new file mode 100644 index 0000000000000000000000000000000000000000..9b6da778b86619f54445d8f9c918273e770cf7c0 --- /dev/null +++ b/test/shaping/tests/emoji-flag-tags.tests @@ -0,0 +1,2 @@ +fonts/sha1sum/53374c7ca3657be37efde7ed02ae34229a56ae1f.ttf::U+1F3F4,U+E0055,U+E0053,U+E0064,U+E0065,U+E007F:[u1F3F4=0+2126|space=1+0|space=2+0|space=3+0|space=4+0|space=5+0] +fonts/sha1sum/53374c7ca3657be37efde7ed02ae34229a56ae1f.ttf::U+1F3F4,U+E0064,U+E0065,U+E007F:[de=0+3200]