From 06cfe3f7369684fc05fa16da7f6778350f8bcba5 Mon Sep 17 00:00:00 2001 From: Khaled Hosny Date: Wed, 17 May 2017 21:32:47 +0300 Subject: [PATCH] Do not skip TAG characters in glyph substitution (#487) Hide them like Mongolian Free Variation Selectors instead. Fixes https://github.com/behdad/harfbuzz/issues/463 --- src/hb-ot-layout-gsubgpos-private.hh | 2 +- src/hb-ot-layout-private.hh | 13 +++++++++---- test/shaping/Makefile.am | 1 + .../53374c7ca3657be37efde7ed02ae34229a56ae1f.ttf | Bin 0 -> 5044 bytes test/shaping/tests/emoji-flag-tags.tests | 2 ++ 5 files changed, 13 insertions(+), 5 deletions(-) create mode 100644 test/shaping/fonts/sha1sum/53374c7ca3657be37efde7ed02ae34229a56ae1f.ttf create mode 100644 test/shaping/tests/emoji-flag-tags.tests diff --git a/src/hb-ot-layout-gsubgpos-private.hh b/src/hb-ot-layout-gsubgpos-private.hh index 921859a6..f77f5d98 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 071a439d..b476339e 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 89578e10..ab25a50a 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 GIT binary patch literal 5044 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 literal 0 HcmV?d00001 diff --git a/test/shaping/tests/emoji-flag-tags.tests b/test/shaping/tests/emoji-flag-tags.tests new file mode 100644 index 00000000..9b6da778 --- /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] -- GitLab