Emoji skin tone modifiers need to be treated as combining marks
authorBehdad Esfahbod <behdad@behdad.org>
Thu, 18 Feb 2016 10:06:25 +0000 (17:06 +0700)
committerBehdad Esfahbod <behdad@behdad.org>
Thu, 18 Feb 2016 10:06:25 +0000 (17:06 +0700)
Fixes https://github.com/behdad/harfbuzz/issues/169

src/hb-ot-layout-private.hh
src/hb-unicode-private.hh

index da3ba3a9278be68912487f6183b0d1aa31063f74..094db9570717937bd23e5bfd372d9a32f723b6e0 100644 (file)
@@ -256,8 +256,11 @@ _hb_glyph_info_set_unicode_props (hb_glyph_info_t *info, hb_buffer_t *buffer)
       if (u == 0x200Cu) props |= UPROPS_MASK_ZWNJ;
       if (u == 0x200Du) props |= UPROPS_MASK_ZWJ;
     }
-    else if (unlikely (HB_UNICODE_GENERAL_CATEGORY_IS_NON_ENCLOSING_MARK (gen_cat)))
+    else if (unlikely (HB_UNICODE_GENERAL_CATEGORY_IS_NON_ENCLOSING_MARK_OR_MODIFIER_SYMBOL (gen_cat)))
     {
+      /* The above check is just an optimization to let in only things we need further
+       * processing on. */
+
       /* Only Mn and Mc can have non-zero ccc:
        * http://www.unicode.org/policies/stability_policy.html#Property_Value
        * """
@@ -272,6 +275,16 @@ _hb_glyph_info_set_unicode_props (hb_glyph_info_t *info, hb_buffer_t *buffer)
        * the "else if".
        */
       props |= unicode->modified_combining_class (info->codepoint)<<8;
+
+      /* Recategorize emoji skin-tone modifiers as Unicode mark, so they
+       * behave correctly in non-native directionality.  They originally
+       * are MODIFIER_SYMBOL.  Fixes:
+       * https://github.com/behdad/harfbuzz/issues/169
+       */
+      if (unlikely (hb_in_range (u, 0x1F3FBu, 0x1F3FFu)))
+      {
+       props = gen_cat = HB_UNICODE_GENERAL_CATEGORY_ENCLOSING_MARK;
+      }
     }
   }
 
index ecbec513cfa383e7446ac5f004b51a8985b82473..44fbe582e9300ecc6226451ebfc131cd1d64724f 100644 (file)
@@ -357,9 +357,10 @@ extern HB_INTERNAL const hb_unicode_funcs_t _hb_unicode_funcs_nil;
          FLAG (HB_UNICODE_GENERAL_CATEGORY_ENCLOSING_MARK) | \
          FLAG (HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK)))
 
-#define HB_UNICODE_GENERAL_CATEGORY_IS_NON_ENCLOSING_MARK(gen_cat) \
+#define HB_UNICODE_GENERAL_CATEGORY_IS_NON_ENCLOSING_MARK_OR_MODIFIER_SYMBOL(gen_cat) \
        (FLAG_SAFE (gen_cat) & \
         (FLAG (HB_UNICODE_GENERAL_CATEGORY_SPACING_MARK) | \
-         FLAG (HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK)))
+         FLAG (HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK) | \
+         FLAG (HB_UNICODE_GENERAL_CATEGORY_MODIFIER_SYMBOL)))
 
 #endif /* HB_UNICODE_PRIVATE_HH */