diff --git a/Makefile b/Makefile index cbdd6ffa1..3d1e3529c 100644 --- a/Makefile +++ b/Makefile @@ -201,7 +201,7 @@ $(EMOJI).ttf: $(EMOJI).tmpl.ttf $(EMOJI_BUILDER) $(PUA_ADDER) \ $(ALL_COMPRESSED_FILES) | check_vs_adder @python $(EMOJI_BUILDER) -V $< "$@" "$(COMPRESSED_DIR)/emoji_u" @python $(PUA_ADDER) "$@" "$@-with-pua" - $(VS_ADDER) --dstdir '.' -o "$@-with-pua-varsel" "$@-with-pua" + $(VS_ADDER) -vs 2640 2642 2695 --dstdir '.' -o "$@-with-pua-varsel" "$@-with-pua" mv "$@-with-pua-varsel" "$@" rm "$@-with-pua" diff --git a/NotoColorEmoji.tmpl.ttx.tmpl b/NotoColorEmoji.tmpl.ttx.tmpl index 6fefe984c..817e18191 100644 --- a/NotoColorEmoji.tmpl.ttx.tmpl +++ b/NotoColorEmoji.tmpl.ttx.tmpl @@ -13,7 +13,7 @@ - + @@ -156,7 +156,7 @@ Noto Color Emoji - Version 1.32 + Version 1.33 NotoColorEmoji diff --git a/third_party/color_emoji/add_glyphs.py b/third_party/color_emoji/add_glyphs.py index 7f7b4f8cd..b653f30a7 100644 --- a/third_party/color_emoji/add_glyphs.py +++ b/third_party/color_emoji/add_glyphs.py @@ -17,6 +17,10 @@ import add_emoji_gsub def is_vs(cp): return cp >= 0xfe00 and cp <= 0xfe0f +def is_fitzpatrick(gname): + cp = int(gname[1:], 16) + return 0x1f3fb <= cp <= 0x1f3ff + def codes_to_string(codes): if "_" in codes: pieces = codes.split ("_") @@ -147,10 +151,19 @@ glyph_names = set() ligatures = {} def add_lig_sequence(ligatures, seq, n): - # Assume sequences with ZWJ are emoji 'ligatures' and rtl order - # is also valid. Internal permutations, though, no. - # We associate a sequence with a filename. We can overwrite the - # sequence with a different filename later. + # We have emoji sequences using regional indicator symbols, + # ZWJ, fitzpatrick modifiers, and combinations of ZWJ and fitzpatrick + # modifiers. Currently, Harfbuzz special-cases the fitzpatrick + # modifiers to treat them as combining marks instead of as Other + # Neutral, which unicode says they are, and processes them + # in visual order (at least in some circumstances). So to handle + # emoji sequences in an RTL context we need GSUB sequences that match + # this order. + # Regional indicator symbols are LTR, and emoji+fitzpatrick are + # effectively LTR, so we only reorder sequences with ZWJ. If however + # the ZWJ sequence has fitzpatrick modifiers, those need to still follow + # the emoji they logically follow, so simply reversing the sequence + # doesn't work. This code assumes the lig sequence is valid. tseq = tuple(seq) if tseq in ligatures: print 'lig sequence %s, replace %s with %s' % ( @@ -159,6 +172,12 @@ def add_lig_sequence(ligatures, seq, n): if 'u200D' in seq: rev_seq = seq[:] rev_seq.reverse() + for i in xrange(1, len(rev_seq)): + if is_fitzpatrick(rev_seq[i - 1]): + tmp = rev_seq[i] + rev_seq[i] = rev_seq[i-1] + rev_seq[i-1] = tmp + trseq = tuple(rev_seq) # if trseq in ligatures: # print 'rev lig sequence %s, replace %s with %s' % (