diff --git a/errata.md b/errata.md index bbbb0f6..d7529d1 100644 --- a/errata.md +++ b/errata.md @@ -11,6 +11,9 @@ specification documents. - [ZWJ and ZWNJ](#zwj-and-zwnj) - [Scope of ZWJ and ZWNJ](#scope-of-zwj-and-zwnj) - [ZWJ in redundant ligature lookups](#zwj-in-redundant-ligature-lookups) + - [Emoji](#emoji) + - [Skin-tone permutations](#skin-tone-permutations) + - [Gender permutations](#gender-permutations) - [OpenType](#opentype) - [Null offsets in GSUB and GPOS](#null-offsets-in-gsub-and-gpos) - [Sorting of GSUB and GPOS lookups](#sorting-of-gsub-and-gpos-lookups) @@ -73,6 +76,38 @@ duplicates the effects of the existing "f,i" ligature lookup. Using ZWJ within lookup patterns in the manner suggested by the "Implementation Notes" is not common practice. +### Emoji ### + +#### Skin-tone permutations #### + +It is unclear whether ZWJ multi-person group emoji sequences are +expected to include combinations where some emoji in the sequence are +followed by a Fitzpatrick skin-tone modifier but other emoji in the +sequence are not followed by a Fitzpatrick skin-tone modifier. + +For example, it is unclear whether the sequence +"Man,ZWJ,Handshake,Man,SkinTone-2" constitues a valid ZWJ "Couple +holding hands" sequence. + + +#### Gender permutations #### + +It is unclear whether ZWJ multi-person group emoji sequences are +expected to include combinations where some emoji in the sequence are +are an explicit gender but other emoji in the sequence are not +explicit gender. + +For example, it is unclear whether the sequence +"Man,ZWJ,Handshake,Person" constitues a valid ZWJ "Couple +holding hands" sequence. + +It is also unclear whether the ZWJ multi-person family sequence must +have explicit gender-ordering for the adult humans depicted. + +For example, it is unclear whether the sequence +"Man,ZWJ,Woman,ZWJ,Girl" should be rendered identically to the +sequence "Woman,ZWJ,Man,ZWJ,Girl". + ## OpenType ## diff --git a/images/emoji/ZZZ.png b/images/emoji/ZZZ.png new file mode 100644 index 0000000..ca15ae0 Binary files /dev/null and b/images/emoji/ZZZ.png differ diff --git a/images/emoji/airplane.png b/images/emoji/airplane.png new file mode 100644 index 0000000..f97cc86 Binary files /dev/null and b/images/emoji/airplane.png differ diff --git a/images/emoji/b-isolate.png b/images/emoji/b-isolate.png new file mode 100644 index 0000000..8ccf4a8 Binary files /dev/null and b/images/emoji/b-isolate.png differ diff --git a/images/emoji/blank-tag-high.png b/images/emoji/blank-tag-high.png new file mode 100644 index 0000000..be453bf Binary files /dev/null and b/images/emoji/blank-tag-high.png differ diff --git a/images/emoji/blank-tag-low.png b/images/emoji/blank-tag-low.png new file mode 100644 index 0000000..0a18221 Binary files /dev/null and b/images/emoji/blank-tag-low.png differ diff --git a/images/emoji/blank-tag.png b/images/emoji/blank-tag.png new file mode 100644 index 0000000..1d9fb19 Binary files /dev/null and b/images/emoji/blank-tag.png differ diff --git a/images/emoji/color-after.png b/images/emoji/color-after.png new file mode 100644 index 0000000..cb0c223 Binary files /dev/null and b/images/emoji/color-after.png differ diff --git a/images/emoji/color-before.png b/images/emoji/color-before.png new file mode 100644 index 0000000..7121d93 Binary files /dev/null and b/images/emoji/color-before.png differ diff --git a/images/emoji/color-black.png b/images/emoji/color-black.png new file mode 100644 index 0000000..f334773 Binary files /dev/null and b/images/emoji/color-black.png differ diff --git a/images/emoji/color-sequence.png b/images/emoji/color-sequence.png new file mode 100644 index 0000000..5ead622 Binary files /dev/null and b/images/emoji/color-sequence.png differ diff --git a/images/emoji/default-emoji-after.png b/images/emoji/default-emoji-after.png new file mode 100644 index 0000000..cf82b34 Binary files /dev/null and b/images/emoji/default-emoji-after.png differ diff --git a/images/emoji/default-emoji-before.png b/images/emoji/default-emoji-before.png new file mode 100644 index 0000000..8b35e5a Binary files /dev/null and b/images/emoji/default-emoji-before.png differ diff --git a/images/emoji/default-text-after.png b/images/emoji/default-text-after.png new file mode 100644 index 0000000..a8c94b3 Binary files /dev/null and b/images/emoji/default-text-after.png differ diff --git a/images/emoji/default-text-before.png b/images/emoji/default-text-before.png new file mode 100644 index 0000000..9384e14 Binary files /dev/null and b/images/emoji/default-text-before.png differ diff --git a/images/emoji/direction-rightward.png b/images/emoji/direction-rightward.png new file mode 100644 index 0000000..ca30a65 Binary files /dev/null and b/images/emoji/direction-rightward.png differ diff --git a/images/emoji/dotted-square.png b/images/emoji/dotted-square.png new file mode 100644 index 0000000..3d1c929 Binary files /dev/null and b/images/emoji/dotted-square.png differ diff --git a/images/emoji/emoji-image-generation-log.md b/images/emoji/emoji-image-generation-log.md new file mode 100644 index 0000000..7c08b43 --- /dev/null +++ b/images/emoji/emoji-image-generation-log.md @@ -0,0 +1,452 @@ +# Commands used to generate the images in [opentype-shaping-emoji.md](../../opentype-shaping-emoji.md) + +## Arrow general + +hb-view --font-size=110 --output-file=right-arrow.png --background=FFFFFF00 --margin=0,0,0,0 /usr/share/fonts/truetype/gentiumplus/GentiumPlus-R.ttf --unicodes=2192 + + +## Invisibles general + +> Two options for VS15 and VS16 are included. +> +> Adobe Source Emoji includes non-color glyphs for both codepoints that +> offer a degree of visual communication to prevent confusion in the +> sequence illustrations, but they are not immediately associated with +> the codepoint itself, like Gentium Plus's are. + +hb-view --font-size=110 --margin=2,16,2,16 --preserve-default-ignorables --output-file=text-pres-selector.png --font-funcs=ot --background=FFFFFF00 ./AdobeSourceEmoji/SourceEmoji-BnW.otf --unicodes=fe0e + +hb-view --font-size=110 --margin=2,16,2,16 --features="ss06" --shapers=ot --preserve-default-ignorables --output-file=vs15.png --background=FFFFFF00 /usr/share/fonts/truetype/gentiumplus/GentiumPlus-R.ttf --unicodes=fe0e + +hb-view --font-size=110 --margin=2,16,2,16 --preserve-default-ignorables --output-file=emoji-pres-selector.png --font-funcs=ot --background=FFFFFF00 ./AdobeSourceEmoji/SourceEmoji-BnW.otf --unicodes=fe0f + +hb-view --font-size=110 --margin=2,16,2,16 --features="ss06" --shapers=ot --preserve-default-ignorables --output-file=vs16.png --background=FFFFFF00 /usr/share/fonts/truetype/gentiumplus/GentiumPlus-R.ttf --unicodes=fe0f + + +> Gentium Plus's ZWJ and ZWNJ are visually preferrable: +hb-view --font-size=110 --margin=2,16,2,16 --features="ss06" --shapers=ot --preserve-default-ignorables --output-file=zwj.png --background=FFFFFF00 /usr/share/fonts/truetype/gentiumplus/GentiumPlus-R.ttf --unicodes=200d + +hb-view --font-size=110 --margin=2,16,2,16 --features="ss06" --shapers=ot --preserve-default-ignorables --output-file=zwnj.png --background=FFFFFF00 /usr/share/fonts/truetype/gentiumplus/GentiumPlus-R.ttf --unicodes=200c + + +## Human beings general + +hb-view --font-size=110 --margin=2,16,2,16 --preserve-default-ignorables --font-funcs=ot --output-file=fallback-boy.png --background=FFFFFF00 /usr/share/fonts/truetype/noto/NotoColorEmoji.ttf --unicodes=1f466 + +hb-view --font-size=110 --margin=2,16,2,16 --preserve-default-ignorables --font-funcs=ot --output-file=fallback-girl.png --background=FFFFFF00 /usr/share/fonts/truetype/noto/NotoColorEmoji.ttf --unicodes=1f467 + +hb-view --font-size=110 --margin=2,16,2,16 --preserve-default-ignorables --font-funcs=ot --output-file=fallback-man.png --background=FFFFFF00 /usr/share/fonts/truetype/noto/NotoColorEmoji.ttf --unicodes=1f468 + +hb-view --font-size=110 --margin=2,16,2,16 --preserve-default-ignorables --font-funcs=ot --output-file=fallback-woman.png --background=FFFFFF00 /usr/share/fonts/truetype/noto/NotoColorEmoji.ttf --unicodes=1f469 + +hb-view --font-size=110 --margin=2,16,2,16 --preserve-default-ignorables --font-funcs=ot --output-file=fallback-generalperson.png --background=FFFFFF00 /usr/share/fonts/truetype/noto/NotoColorEmoji.ttf --unicodes=1f9d1 + + +## Presentation sequences + +> Codepoints used are based on defaults in https://www.unicode.org/emoji/charts-14.0/text-style.html + +> Invisibles: +montage vs15.png text-pres-selector.png -geometry +0+0 -background transparent -tile 2x1 text-presentation.png + +montage vs16.png emoji-pres-selector.png -geometry +0+0 -background transparent -tile 2x1 emoji-presentation.png + + +> Default text-presentation: U+26A0, warning arrow: +hb-view --font-size=110 --margin=2,16,2,16 --preserve-default-ignorables --font-funcs=ot --output-file=default-text-before.png --background=FFFFFF00 ./Noto\ Emoji\ BW-via-GoogleFonts/static/NotoEmoji-Regular.ttf --unicodes=26a0 + +hb-view --font-size=110 --margin=2,16,2,16 --preserve-default-ignorables --font-funcs=ot --output-file=default-text-after.png --background=FFFFFF00 /usr/share/fonts/truetype/noto/NotoColorEmoji.ttf --unicodes=26a0 + +montage default-text-before.png emoji-pres-selector.png right-arrow.png default-text-after.png -geometry +0+0 -background transparent -tile 4x1 emoji-pres-sequence.png + + +> Default emoji-presentation: U+231B, hourglass: +hb-view --font-size=110 --margin=2,16,2,16 --preserve-default-ignorables --font-funcs=ot --output-file=default-emoji-before.png --background=FFFFFF00 /usr/share/fonts/truetype/noto/NotoColorEmoji.ttf --unicodes=231b + +hb-view --font-size=110 --margin=2,16,2,16 --preserve-default-ignorables --font-funcs=ot --output-file=default-emoji-after.png --background=FFFFFF00 ./Noto\ Emoji\ BW-via-GoogleFonts/static/NotoEmoji-Regular.ttf --unicodes=231b + +montage default-emoji-before.png text-pres-selector.png right-arrow.png default-emoji-after.png -geometry +0+0 -background transparent -tile 4x1 text-pres-sequence.png + + + +## Modifier sequences + +> Adobe Source Emoji for invisibles: +hb-view --font-size=110 --margin=2,16,2,16 --preserve-default-ignorables --output-file=skintone-2.png --background=FFFFFF00 ./AdobeSourceEmoji/SourceEmoji-BnW.otf --unicodes=1f3fb + +hb-view --font-size=110 --margin=2,16,2,16 --preserve-default-ignorables --output-file=skintone-3.png --background=FFFFFF00 ./AdobeSourceEmoji/SourceEmoji-BnW.otf --unicodes=1f3fc + +hb-view --font-size=110 --margin=2,16,2,16 --preserve-default-ignorables --output-file=skintone-4.png --background=FFFFFF00 ./AdobeSourceEmoji/SourceEmoji-BnW.otf --unicodes=1f3fd + +hb-view --font-size=110 --margin=2,16,2,16 --preserve-default-ignorables --output-file=skintone-5.png --background=FFFFFF00 ./AdobeSourceEmoji/SourceEmoji-BnW.otf --unicodes=1f3fe + +hb-view --font-size=110 --margin=2,16,2,16 --preserve-default-ignorables --output-file=skintone-6.png --background=FFFFFF00 ./AdobeSourceEmoji/SourceEmoji-BnW.otf --unicodes=1f3ff + + +> NotoColorEmoji squares for fallback skin-tone-squares: +hb-view --font-size=110 --margin=2,16,2,16 --preserve-default-ignorables --font-funcs=ot --output-file=skintone-fallback-2.png --background=FFFFFF00 /usr/share/fonts/truetype/noto/NotoColorEmoji.ttf --unicodes=1f3fb + +hb-view --font-size=110 --margin=2,16,2,16 --preserve-default-ignorables --font-funcs=ot --output-file=skintone-fallback-3.png --background=FFFFFF00 /usr/share/fonts/truetype/noto/NotoColorEmoji.ttf --unicodes=1f3fc + +hb-view --font-size=110 --margin=2,16,2,16 --preserve-default-ignorables --font-funcs=ot --output-file=skintone-fallback-4.png --background=FFFFFF00 /usr/share/fonts/truetype/noto/NotoColorEmoji.ttf --unicodes=1f3fd + +hb-view --font-size=110 --margin=2,16,2,16 --preserve-default-ignorables --font-funcs=ot --output-file=skintone-fallback-5.png --background=FFFFFF00 /usr/share/fonts/truetype/noto/NotoColorEmoji.ttf --unicodes=1f3fe + +hb-view --font-size=110 --margin=2,16,2,16 --preserve-default-ignorables --font-funcs=ot --output-file=skintone-fallback-6.png --background=FFFFFF00 /usr/share/fonts/truetype/noto/NotoColorEmoji.ttf --unicodes=1f3ff + + +> Symbola for text-mode fallback squares: +hb-view --font-size=110 --margin=2,16,2,16 --preserve-default-ignorables --output-file=skintone-2-text-fallback.png --background=FFFFFF00 /usr/share/fonts/truetype/ancient-scripts/Symbola_hint.ttf --unicodes=1f3fb + +hb-view --font-size=110 --margin=2,16,2,16 --preserve-default-ignorables --output-file=skintone-3-text-fallback.png --background=FFFFFF00 /usr/share/fonts/truetype/ancient-scripts/Symbola_hint.ttf --unicodes=1f3fc + +hb-view --font-size=110 --margin=2,16,2,16 --preserve-default-ignorables --output-file=skintone-4-text-fallback.png --background=FFFFFF00 /usr/share/fonts/truetype/ancient-scripts/Symbola_hint.ttf --unicodes=1f3fd + +hb-view --font-size=110 --margin=2,16,2,16 --preserve-default-ignorables --output-file=skintone-5-text-fallback.png --background=FFFFFF00 /usr/share/fonts/truetype/ancient-scripts/Symbola_hint.ttf --unicodes=1f3fe + +hb-view --font-size=110 --margin=2,16,2,16 --preserve-default-ignorables --output-file=skintone-6-text-fallback.png --background=FFFFFF00 /usr/share/fonts/truetype/ancient-scripts/Symbola_hint.ttf --unicodes=1f3ff + + +> Fitzpatrick scale: +montage skintone-2.png skintone-fallback-2.png -geometry +0+0 -background transparent -tile 2x1 fitzpatrick-2.png + +montage skintone-3.png skintone-fallback-3.png -geometry +0+0 -background transparent -tile 2x1 fitzpatrick-3.png + +montage skintone-4.png skintone-fallback-4.png -geometry +0+0 -background transparent -tile 2x1 fitzpatrick-4.png + +montage skintone-5.png skintone-fallback-5.png -geometry +0+0 -background transparent -tile 2x1 fitzpatrick-5.png + +montage skintone-6.png skintone-fallback-6.png -geometry +0+0 -background transparent -tile 2x1 fitzpatrick-6.png + + +> Fitzpatrick scale text fallback: +> (currently unused) +montage skintone-2.png skintone-2-text-fallback.png -geometry +0+0 -background transparent -tile 2x1 fitzpatrick-2-text-fallback.png + +montage skintone-3.png skintone-3-text-fallback.png -geometry +0+0 -background transparent -tile 2x1 fitzpatrick-3-text-fallback.png + +montage skintone-4.png skintone-4-text-fallback.png -geometry +0+0 -background transparent -tile 2x1 fitzpatrick-4-text-fallback.png + +ontage skintone-5.png skintone-5-text-fallback.png -geometry +0+0 -background transparent -tile 2x1 fitzpatrick-5-text-fallback.png + +montage skintone-6.png skintone-6-text-fallback.png -geometry +0+0 -background transparent -tile 2x1 fitzpatrick-6-text-fallback.png + + +> Sequence: +hb-view --font-size=110 --margin=2,16,2,16 --preserve-default-ignorables --font-funcs=ot --output-file=modifier-before.png --background=FFFFFF00 /usr/share/fonts/truetype/noto/NotoColorEmoji.ttf --unicodes=1f44b + +hb-view --font-size=110 --margin=2,16,2,16 --preserve-default-ignorables --font-funcs=ot --output-file=modifier-after.png --background=FFFFFF00 /usr/share/fonts/truetype/noto/NotoColorEmoji.ttf --unicodes=1f44b,1f3fd + +montage modifier-before.png skintone-4.png right-arrow.png modifier-after.png -geometry +0+0 -background transparent -tile 4x1 modifier-sequence.png + +montage modifier-before.png skintone-4.png right-arrow.png modifier-before.png skintone-fallback-4.png -geometry +0+0 -background transparent -tile 5x1 modifier-sequence-fallback.png + + +## Regional Indicator flag sequences + +> UN chosen for maximum acheivable internationality + +> Sequence +hb-view --font-size=110 --margin=2,16,2,16 --preserve-default-ignorables --output-file=regional-flag-un-before.png --background=FFFFFF00 ./AdobeSourceEmoji/SourceEmoji-BnW.otf --unicodes=1f1fa,1f1f3 + +hb-view --font-size=110 --margin=2,16,2,16 --preserve-default-ignorables --font-funcs=ot --output-file=regional-flag-un-after.png --background=FFFFFF00 /usr/share/fonts/truetype/noto/NotoColorEmoji.ttf --unicodes=1f1fa,1f1f3 + +montage regional-flag-un-before.png right-arrow.png regional-flag-un-after.png -geometry +0+0 -background transparent regional-indicator-flag-sequence-un.png + +> Fallbacks + +hb-view --font-size=110 --margin=2,16,2,16 --preserve-default-ignorables --font-funcs=ot --output-file=regional-flag-un-fallback.png --background=FFFFFF00 ./Noto\ Emoji\ BW-via-GoogleFonts/static/NotoEmoji-Regular.ttf --unicodes=1f1fa,1f1f3 + +montage regional-flag-un-before.png right-arrow.png regional-flag-un-fallback.png -geometry +0+0 -background transparent regional-indicator-flag-sequence-un-fallback.png + + + +## Tag flag sequences + +> From https://unicode.org/reports/tr51/#valid-emoji-tag-sequences +> +> Wales chosen to be most distinctive example KNOWN to be widely implemented + + +> Tag pseudo-glyphs + +> LastResort. This crops in, non-precisely, on the "tag" symbol itself: +hb-view --font-size=110 --margin=-42,-28,-44,-28 --preserve-default-ignorables --output-file=tag-isolate.png --background=FFFFFF00 ./unicode/Last-Resort/LastResort-Regular.ttf --unicodes=e007f + +> Margin-adjusted versions: +hb-view --font-size=110 --margin=-20,-28,-48,-28 --preserve-default-ignorables --output-file=tag-isolate-high.png --background=FFFFFF00 ./unicode/Last-Resort/LastResort-Regular.ttf --unicodes=e007f + +hb-view --font-size=110 --margin=-44,-28,-24,-28 --preserve-default-ignorables --output-file=tag-isolate-low.png --background=FFFFFF00 ./unicode/Last-Resort/LastResort-Regular.ttf --unicodes=e007f + + +> DejaVu empty dotted square, U+2B1A: +hb-view --font-size=110 --margin=-16,2,2,2 --preserve-default-ignorables --output-file=dotted-square.png --background=FFFFFF00 /usr/share/fonts/truetype/dejavu/DejaVuSans.ttf --unicodes=2b1a + + +> Letters and "end" components: +hb-view --font-size=40 --margin=16,2,2,2 --preserve-default-ignorables --output-file=g-isolate.png --background=FFFFFF00 /usr/share/fonts/truetype/dejavu/DejaVuSans.ttf --unicodes=0067 + +hb-view --font-size=40 --margin=16,2,2,2 --preserve-default-ignorables --output-file=b-isolate.png --background=FFFFFF00 /usr/share/fonts/truetype/dejavu/DejaVuSans.ttf --unicodes=0062 + +hb-view --font-size=40 --margin=16,2,2,2 --preserve-default-ignorables --output-file=w-isolate.png --background=FFFFFF00 /usr/share/fonts/truetype/dejavu/DejaVuSans.ttf --unicodes=0077 + +hb-view --font-size=40 --margin=16,2,2,2 --preserve-default-ignorables --output-file=l-isolate.png --background=FFFFFF00 /usr/share/fonts/truetype/dejavu/DejaVuSans.ttf --unicodes=006c + +hb-view --font-size=40 --margin=16,2,2,2 --preserve-default-ignorables --output-file=s-isolate.png --background=FFFFFF00 /usr/share/fonts/truetype/dejavu/DejaVuSans.ttf --unicodes=0073 + +hb-view --font-size=32 --margin=2,2,16,2 --preserve-default-ignorables --output-file=end-isolate.png --background=FFFFFF00 /usr/share/fonts/truetype/dejavu/DejaVuSans.ttf --unicodes=0045,004e,0044 + + +> Composite tags: + +composite -gravity north tag-isolate-high.png dotted-square.png blank-tag-high.png + +composite -gravity south tag-isolate-low.png dotted-square.png blank-tag-low.png + +composite -gravity north g-isolate.png blank-tag-low.png tag-g.png + +composite -gravity north b-isolate.png blank-tag-low.png tag-b.png + +composite -gravity north w-isolate.png blank-tag-low.png tag-w.png + +composite -gravity north l-isolate.png blank-tag-low.png tag-l.png + +composite -gravity north s-isolate.png blank-tag-low.png tag-s.png + +composite -gravity south end-isolate.png blank-tag-high.png tag-end.png + + +> Completed sequence: + +hb-view --font-size=110 --margin=2,16,2,16 --preserve-default-ignorables --font-funcs=ot --output-file=tag-flag-black.png --background=FFFFFF00 /usr/share/fonts/truetype/noto/NotoColorEmoji.ttf --unicodes=1f3f4 + +hb-view --font-size=110 --margin=2,16,2,16 --preserve-default-ignorables --font-funcs=ot --output-file=tag-flag-wales-after.png --background=FFFFFF00 /usr/share/fonts/truetype/noto/NotoColorEmoji.ttf --unicodes=1f3f4,e0067,e0062,e0077,e006c,e0073,e007f + +montage tag-flag-black.png tag-g.png tag-b.png tag-w.png tag-l.png tag-s.png tag-end.png -geometry +0+0 -background transparent -tile 7x1 tag-flag-wales-before.png + +montage tag-flag-wales-before.png right-arrow.png tag-flag-wales-after.png -geometry +0+0 -background transparent tag-flag-sequence-wales.png + + + +## Keycap sequences + +> Noto Sans Symbols has a visual CEK: +hb-view --font-size=110 --margin=2,64,2,64 --preserve-default-ignorables --output-file=keycap-cek.png --background=FFFFFF00 /usr/share/fonts/truetype/noto/NotoSansSymbols-Regular.ttf --unicodes=20e3 + + +> Sequence: +hb-view --font-size=110 --margin=2,16,2,16 --preserve-default-ignorables --font-funcs=ot --output-file=keycap-before.png --background=FFFFFF00 /usr/share/fonts/truetype/noto/NotoSerif-Regular.ttf --unicodes=0034 + +hb-view --font-size=110 --margin=2,16,2,16 --preserve-default-ignorables --font-funcs=ot --output-file=keycap-after.png --background=FFFFFF00 /usr/share/fonts/truetype/noto/NotoColorEmoji.ttf --unicodes=0034,20e3 + +> Something off here; the -gravity and -geometry switches are *not* working as expected.... +montage keycap-before.png keycap-cek.png right-arrow.png keycap-after.png -geometry +0+0 -background transparent -tile 4x1 keycap-sequence.png + + + +## ZWJ sequences + +### ZWJ hair sequences + +> Hairstyles: +hb-view --font-size=110 --margin=2,16,2,16 --preserve-default-ignorables --font-funcs=ot --output-file=hair-red.png --background=FFFFFF00 /usr/share/fonts/truetype/noto/NotoColorEmoji.ttf --unicodes=1f9b0 + +hb-view --font-size=110 --margin=2,16,2,16 --preserve-default-ignorables --font-funcs=ot --output-file=hair-curly.png --background=FFFFFF00 /usr/share/fonts/truetype/noto/NotoColorEmoji.ttf --unicodes=1f9b1 + +hb-view --font-size=110 --margin=2,16,2,16 --preserve-default-ignorables --font-funcs=ot --output-file=hair-bald.png --background=FFFFFF00 /usr/share/fonts/truetype/noto/NotoColorEmoji.ttf --unicodes=1f9b2 + +hb-view --font-size=110 --margin=2,16,2,16 --preserve-default-ignorables --font-funcs=ot --output-file=hair-white.png --background=FFFFFF00 /usr/share/fonts/truetype/noto/NotoColorEmoji.ttf --unicodes=1f9b3 + + +> Sequence: +hb-view --font-size=110 --margin=2,16,2,16 --preserve-default-ignorables --font-funcs=ot --output-file=woman-white-hair.png --background=FFFFFF00 /usr/share/fonts/truetype/noto/NotoColorEmoji.ttf --unicodes=1F469,200d,1f9b3 + +montage fallback-woman.png zwj.png hair-white.png right-arrow.png woman-white-hair.png -geometry +0+0 -background transparent -tile 5x1 hairstyle-sequence.png + + + +### ZWJ gendered person sequences + +> Gender signs, input (text-presentation style): +hb-view --font-size=110 --margin=2,16,2,16 --preserve-default-ignorables --font-funcs=ot --output-file=gendersign-female.png --background=FFFFFF00 ./AdobeSourceEmoji/SourceEmoji-BnW.otf --unicodes=2640 + +hb-view --font-size=110 --margin=2,16,2,16 --preserve-default-ignorables --font-funcs=ot --output-file=gendersign-male.png --background=FFFFFF00 ./AdobeSourceEmoji/SourceEmoji-BnW.otf --unicodes=2642 + +> Gender signs, output fallback (emoji-presentation style): +hb-view --font-size=110 --margin=2,16,2,16 --preserve-default-ignorables --font-funcs=ot --output-file=gendersign-female-fallback.png --background=FFFFFF00 /usr/share/fonts/truetype/noto/NotoColorEmoji.ttf --unicodes=2640 + +hb-view --font-size=110 --margin=2,16,2,16 --preserve-default-ignorables --font-funcs=ot --output-file=gendersign-male-fallback.png --background=FFFFFF00 /usr/share/fonts/truetype/noto/NotoColorEmoji.ttf --unicodes=2642 + + +> Sequence: +hb-view --font-size=110 --margin=2,16,2,16 --preserve-default-ignorables --font-funcs=ot --output-file=gendered-person-before.png --background=FFFFFF00 /usr/share/fonts/truetype/noto/NotoColorEmoji.ttf --unicodes=1F3c4 + +hb-view --font-size=110 --margin=2,16,2,16 --preserve-default-ignorables --font-funcs=ot --output-file=gendered-person-after.png --background=FFFFFF00 /usr/share/fonts/truetype/noto/NotoColorEmoji.ttf --unicodes=1F3c4,200d,2640,fe0f + +montage gendered-person-before.png zwj.png gendersign-female.png emoji-pres-selector.png right-arrow.png gendered-person-after.png -geometry +0+0 -background transparent -tile 6x1 gendered-person-sequence.png + + +### ZWJ multi-person group sequences + +> +> Couple with heart: +hb-view --font-size=110 --margin=2,16,2,16 --preserve-default-ignorables --font-funcs=ot --output-file=heart.png --background=FFFFFF00 ./AdobeSourceEmoji/SourceEmoji-BnW.otf --unicodes=2764 + +hb-view --font-size=110 --margin=2,16,2,16 --preserve-default-ignorables --font-funcs=ot --output-file=multi-person-man-heart-man-after.png --background=FFFFFF00 /usr/share/fonts/truetype/noto/NotoColorEmoji.ttf --unicodes=1f468,200d,2764,fe0f,200d,1f468 + +hb-view --font-size=110 --margin=2,16,2,16 --preserve-default-ignorables --font-funcs=ot --output-file=multi-person-man-skintone-2-heart-man-skintone-2-after.png --background=FFFFFF00 /usr/share/fonts/truetype/noto/NotoColorEmoji.ttf --unicodes=1f468,1f3fb,200d,2764,fe0f,200d,1f468,1f3fb + +> Sequence: +montage fallback-man.png zwj.png heart.png emoji-pres-selector.png zwj.png fallback-man.png right-arrow.png multi-person-man-heart-man-after.png -geometry +0+0 -background transparent -tile 8x1 multi-person-heart-sequence.png + +montage fallback-man.png skintone-2.png zwj.png heart.png emoji-pres-selector.png zwj.png fallback-man.png skintone-2.png right-arrow.png multi-person-man-skintone-2-heart-man-skintone-2-after.png -geometry +0+0 -background transparent -tile 10x1 multi-person-heart-skintone-sequence.png + + +> +> Couple kiss: +hb-view --font-size=110 --margin=2,16,2,16 --preserve-default-ignorables --font-funcs=ot --output-file=kiss-mark.png --background=FFFFFF00 /usr/share/fonts/truetype/noto/NotoColorEmoji.ttf --unicodes=1f48b + +hb-view --font-size=110 --margin=2,16,2,16 --preserve-default-ignorables --font-funcs=ot --output-file=multi-person-kiss-sequence-after.png --background=FFFFFF00 /usr/share/fonts/truetype/noto/NotoColorEmoji.ttf --unicodes=1f469,200d,2764,fe0f,200d,1f48b,200d,1f468 + +hb-view --font-size=110 --margin=2,16,2,16 --preserve-default-ignorables --font-funcs=ot --output-file=multi-person-kiss-sequence-skintone-after.png --background=FFFFFF00 /usr/share/fonts/truetype/noto/NotoColorEmoji.ttf --unicodes=1f469,1f3ff,200d,2764,fe0f,200d,1f48b,200d,1f468,1f3fd + +> Sequence: +montage fallback-woman.png zwj.png heart.png emoji-pres-selector.png zwj.png kiss-mark.png zwj.png fallback-man.png right-arrow.png multi-person-kiss-sequence-after.png -geometry +0+0 -background transparent -tile 10x1 multi-person-kiss-sequence.png + +montage fallback-woman.png skintone-6.png zwj.png heart.png emoji-pres-selector.png zwj.png kiss-mark.png zwj.png fallback-man.png skintone-4.png right-arrow.png multi-person-kiss-sequence-skintone-after.png -geometry +0+0 -background transparent -tile 12x1 multi-person-kiss-skintone-sequence.png + + +> +> Couple holding hands: +hb-view --font-size=110 --margin=2,16,2,16 --preserve-default-ignorables --font-funcs=ot --output-file=handshake.png --background=FFFFFF00 /usr/share/fonts/truetype/noto/NotoColorEmoji.ttf --unicodes=1f91d + +> Noto Color Emoji does not support this sequence, perhaps because it expects +> fallback to `U+1F46D` to occur, e.g. at the keyboard/UI level.... +hb-view --font-size=110 --margin=2,16,2,16 --preserve-default-ignorables --font-funcs=ot --output-file=multi-person-holding-hands-sequence-woman-woman-after.png --background=FFFFFF00 /usr/share/fonts/truetype/noto/NotoColorEmoji.ttf --unicodes=1f46d + +> This modifier sequence IS supported in Noto Color Emoji +hb-view --font-size=110 --margin=2,16,2,16 --preserve-default-ignorables --font-funcs=ot --output-file=multi-person-holding-hands-sequence-woman-woman-skintone-after.png --background=FFFFFF00 /usr/share/fonts/truetype/noto/NotoColorEmoji.ttf --unicodes=1f469,1f3fc,200d,1f91d,200d,1f469,1f3fe + +> Sequence: +montage fallback-woman.png zwj.png handshake.png zwj.png fallback-woman.png right-arrow.png multi-person-holding-hands-sequence-woman-woman-after.png -geometry +0+0 -background transparent -tile 7x1 multi-person-holding-hands-sequence.png + +montage fallback-woman.png skintone-3.png zwj.png handshake.png zwj.png fallback-woman.png skintone-5.png right-arrow.png multi-person-holding-hands-sequence-woman-woman-skintone-after.png -geometry +0+0 -background transparent -tile 9x1 multi-person-holding-hands-skintone-sequence.png + + +> +> Family: +> +> Noto Color Emoji supports "Man,ZWJ,Woman,ZWJ,_child_" but not "Woman,ZWJ,Man,ZWJ,_child_". +> +> Noto Color Emoji supports "Woman,ZWJ,Woman,ZWJ,Girl,ZWJ,Boy" but not "Woman,ZWJ,Woman,ZWJ,Boy,ZWJ,Girl". +hb-view --font-size=110 --margin=2,16,2,16 --preserve-default-ignorables --font-funcs=ot --output-file=multi-person-family-man-boy-after.png --background=FFFFFF00 /usr/share/fonts/truetype/noto/NotoColorEmoji.ttf --unicodes=1f468,200d,1f466 + +hb-view --font-size=110 --margin=2,16,2,16 --preserve-default-ignorables --font-funcs=ot --output-file=multi-person-family-man-girl-girl-after.png --background=FFFFFF00 /usr/share/fonts/truetype/noto/NotoColorEmoji.ttf --unicodes=1f468,200d,1f467,200d,1f467 + +hb-view --font-size=110 --margin=2,16,2,16 --preserve-default-ignorables --font-funcs=ot --output-file=multi-person-family-man-woman-girl-after.png --background=FFFFFF00 /usr/share/fonts/truetype/noto/NotoColorEmoji.ttf --unicodes=1f468,200d,1f469,200d,1f467 + +hb-view --font-size=110 --margin=2,16,2,16 --preserve-default-ignorables --font-funcs=ot --output-file=multi-person-family-woman-woman-girl-boy-after.png --background=FFFFFF00 /usr/share/fonts/truetype/noto/NotoColorEmoji.ttf --unicodes=1f469,200d,1f469,200d,1f467,200d,1f466 + +> Sequence: +montage fallback-man.png zwj.png fallback-boy.png right-arrow.png multi-person-family-man-boy-after.png -geometry +0+0 -background transparent -tile 5x1 multi-person-family-man-boy-sequence.png + +montage fallback-man.png zwj.png fallback-girl.png zwj.png fallback-girl.png right-arrow.png multi-person-family-man-girl-girl-after.png -geometry +0+0 -background transparent -tile 7x1 multi-person-family-man-girl-girl-sequence.png + +montage fallback-man.png zwj.png fallback-woman.png zwj.png fallback-girl.png right-arrow.png multi-person-family-man-woman-girl-after.png -geometry +0+0 -background transparent -tile 7x1 multi-person-family-man-woman-girl-sequence.png + +montage fallback-woman.png zwj.png fallback-woman.png zwj.png fallback-girl.png zwj.png fallback-boy.png right-arrow.png multi-person-family-woman-woman-girl-boy-after.png -geometry +0+0 -background transparent -tile 9x1 multi-person-family-woman-woman-girl-boy-sequence.png + +> +> Noto Color Emoji does not seem to support skin-tone modifiers for family sequences, +> at least in the current release on my system. +> +> + + +> +> Shaking hands: +hb-view --font-size=110 --margin=2,16,2,16 --preserve-default-ignorables --font-funcs=ot --output-file=hand-left.png --background=FFFFFF00 ./blobmoji/Blobmoji.ttf --unicodes=1faf1 + +hb-view --font-size=110 --margin=2,16,2,16 --preserve-default-ignorables --font-funcs=ot --output-file=hand-right.png --background=FFFFFF00 ./blobmoji/Blobmoji.ttf --unicodes=1faf2 + +hb-view --font-size=110 --margin=2,16,2,16 --preserve-default-ignorables --font-funcs=ot --output-file=multi-person-shaking-hands-after.png --background=FFFFFF00 ./blobmoji/Blobmoji.ttf --unicodes=1faf1,1f3fd,200d,1faf2,1f3ff + +> Sequence: +montage hand-left.png skintone-4.png zwj.png hand-right.png skintone-6.png right-arrow.png multi-person-handshake-after.png -geometry +0+0 -background transparent -tile 7x1 multi-person-shaking-hands-sequence.png + + + +### ZWJ role sequences + +> Firefighter (emoji-pres-by-default): +hb-view --font-size=110 --margin=2,16,2,16 --preserve-default-ignorables --font-funcs=ot --output-file=firetruck.png --background=FFFFFF00 /usr/share/fonts/truetype/noto/NotoColorEmoji.ttf --unicodes=1F692 + +hb-view --font-size=110 --margin=2,16,2,16 --preserve-default-ignorables --font-funcs=ot --output-file=role-firefighter-man-after.png --background=FFFFFF00 /usr/share/fonts/truetype/noto/NotoColorEmoji.ttf --unicodes=1f468,200d,1F692 + +hb-view --font-size=110 --margin=2,16,2,16 --preserve-default-ignorables --font-funcs=ot --output-file=role-firefighter-man-skintone-6-after.png --background=FFFFFF00 /usr/share/fonts/truetype/noto/NotoColorEmoji.ttf --unicodes=1f468,1f3ff,200d,1F692 + +montage fallback-man.png zwj.png firetruck.png right-arrow.png role-firefighter-man-after.png -geometry +0+0 -background transparent -tile 5x1 role-sequence-firefighter.png + +montage fallback-man.png skintone-6.png zwj.png firetruck.png right-arrow.png role-firefighter-man-skintone-6-after.png -geometry +0+0 -background transparent -tile 6x1 role-sequence-firefighter-skintone-6.png + + + +> Pilot (non-emoji-pres-by-default) +hb-view --font-size=110 --margin=2,16,2,16 --preserve-default-ignorables --font-funcs=ot --output-file=airplane.png --background=FFFFFF00 ./Noto\ Emoji\ BW-via-GoogleFonts/static/NotoEmoji-Regular.ttf --unicodes=2708,fe0e + +hb-view --font-size=110 --margin=2,16,2,16 --preserve-default-ignorables --font-funcs=ot --output-file=role-pilot-woman-after.png --background=FFFFFF00 /usr/share/fonts/truetype/noto/NotoColorEmoji.ttf --unicodes=1f469,200d,2708,fe0f + +hb-view --font-size=110 --margin=2,16,2,16 --preserve-default-ignorables --font-funcs=ot --output-file=role-pilot-woman-skintone-2-after.png --background=FFFFFF00 /usr/share/fonts/truetype/noto/NotoColorEmoji.ttf --unicodes=1f469,1f3fb,200d,2708,fe0f + +montage fallback-woman.png zwj.png airplane.png emoji-pres-selector.png right-arrow.png role-pilot-woman-after.png -geometry +0+0 -background transparent -tile 6x1 role-sequence-pilot.png + +montage fallback-woman.png skintone-2.png zwj.png airplane.png emoji-pres-selector.png right-arrow.png role-pilot-woman-skintone-2-after.png -geometry +0+0 -background transparent -tile 7x1 role-sequence-pilot-skintone-2.png + + + +### ZWJ color sequences + +> Noto Color Emoji, "black cat" seems to be the only widely-implemented sequence: +hb-view --font-size=110 --margin=2,16,2,16 --preserve-default-ignorables --font-funcs=ot --output-file=color-before.png --background=FFFFFF00 /usr/share/fonts/truetype/noto/NotoColorEmoji.ttf --unicodes=1F408 + +hb-view --font-size=110 --margin=2,16,2,16 --preserve-default-ignorables --font-funcs=ot --output-file=color-after.png --background=FFFFFF00 /usr/share/fonts/truetype/noto/NotoColorEmoji.ttf --unicodes=1F408,200d,2b1b + +hb-view --font-size=110 --margin=2,16,2,16 --preserve-default-ignorables --font-funcs=ot --output-file=color-black.png --background=FFFFFF00 /usr/share/fonts/truetype/noto/NotoColorEmoji.ttf --unicodes=2b1b + +montage color-before.png zwj.png color-black.png right-arrow.png color-after.png -geometry +0+0 -background transparent -tile 5x1 color-sequence.png + + +### ZWJ directionality sequences + +> These are not widely implemented, and possible not implemented at all in open-source fonts. +hb-view --font-size=110 --margin=2,16,2,16 --preserve-default-ignorables --font-funcs=ot --output-file=running.png --background=FFFFFF00 /usr/share/fonts/truetype/noto/NotoColorEmoji.ttf --unicodes=1f3c3 + +hb-view --font-size=110 --margin=2,16,2,16 --preserve-default-ignorables --font-funcs=ot --output-file=direction-rightward.png --background=FFFFFF00 ./Noto\ Emoji\ BW-via-GoogleFonts/static/NotoEmoji-Regular.ttf --unicodes=27a1 + +convert -flop running.png running-rightward.png + +montage running.png zwj.png direction-rightward.png emoji-pres-selector.png right-arrow.png running-rightward.png -geometry +0+0 -background transparent -tile 6x1 zwj-directionality-sequence.png + + + +### ZWJ additional sequences + +> 13 on the named list. Heart-on-fire is clearly not just an overlay, and not a flag: +hb-view --font-size=110 --margin=2,16,2,16 --preserve-default-ignorables --font-funcs=ot --output-file=fire.png --background=FFFFFF00 /usr/share/fonts/truetype/noto/NotoColorEmoji.ttf --unicodes=1f525 + +hb-view --font-size=110 --margin=2,16,2,16 --preserve-default-ignorables --font-funcs=ot --output-file=heart-on-fire-after.png --background=FFFFFF00 /usr/share/fonts/truetype/noto/NotoColorEmoji.ttf --unicodes=2764,fe0f,200d,1f525 + +montage heart.png emoji-pres-selector.png zwj.png fire.png right-arrow.png heart-on-fire-after.png -geometry +0+0 -background transparent -tile 6x1 zwj-sequence-heart-on-fire.png + + +## Other sequences and ligatures + +> For non-standard ligatures (banana split?) + +> Adobe SourceEmoji has a "hand + zwj + heart -> i-love-you-hand" ligature: + + +>Other possiblities: +> https://blog.emojipedia.org/emoji-flags-explained/ (discusses flag options for vendors that don't require Unicode pre-/formal-approval) +> Noto monochromatic emoji details: https://blog.emojipedia.org/exploring-googles-new-black-and-blobby-emoji-font/ +> Are Noto's "Emoji Kitchen" emoji (beginning with magic wand) just ligatures, or all they all "stickers"? https://blog.emojipedia.org/emoji-kitchen-beta-magics-back-the-blobs/ diff --git a/images/emoji/emoji-pres-selector.png b/images/emoji/emoji-pres-selector.png new file mode 100644 index 0000000..7cd4503 Binary files /dev/null and b/images/emoji/emoji-pres-selector.png differ diff --git a/images/emoji/emoji-pres-sequence.png b/images/emoji/emoji-pres-sequence.png new file mode 100644 index 0000000..81e55a7 Binary files /dev/null and b/images/emoji/emoji-pres-sequence.png differ diff --git a/images/emoji/emoji-presentation.png b/images/emoji/emoji-presentation.png new file mode 100644 index 0000000..57a7282 Binary files /dev/null and b/images/emoji/emoji-presentation.png differ diff --git a/images/emoji/emoji-text-pres-before.png b/images/emoji/emoji-text-pres-before.png new file mode 100644 index 0000000..0d43c2d Binary files /dev/null and b/images/emoji/emoji-text-pres-before.png differ diff --git a/images/emoji/end-isolate.png b/images/emoji/end-isolate.png new file mode 100644 index 0000000..cc0e734 Binary files /dev/null and b/images/emoji/end-isolate.png differ diff --git a/images/emoji/fallback-boy.png b/images/emoji/fallback-boy.png new file mode 100644 index 0000000..cd34c49 Binary files /dev/null and b/images/emoji/fallback-boy.png differ diff --git a/images/emoji/fallback-generalperson.png b/images/emoji/fallback-generalperson.png new file mode 100644 index 0000000..0452c42 Binary files /dev/null and b/images/emoji/fallback-generalperson.png differ diff --git a/images/emoji/fallback-girl.png b/images/emoji/fallback-girl.png new file mode 100644 index 0000000..b60aaa7 Binary files /dev/null and b/images/emoji/fallback-girl.png differ diff --git a/images/emoji/fallback-man.png b/images/emoji/fallback-man.png new file mode 100644 index 0000000..ba59acd Binary files /dev/null and b/images/emoji/fallback-man.png differ diff --git a/images/emoji/fallback-woman.png b/images/emoji/fallback-woman.png new file mode 100644 index 0000000..9a90426 Binary files /dev/null and b/images/emoji/fallback-woman.png differ diff --git a/images/emoji/fire.png b/images/emoji/fire.png new file mode 100644 index 0000000..f981da6 Binary files /dev/null and b/images/emoji/fire.png differ diff --git a/images/emoji/firetruck.png b/images/emoji/firetruck.png new file mode 100644 index 0000000..d3191ab Binary files /dev/null and b/images/emoji/firetruck.png differ diff --git a/images/emoji/fitzpatrick-2-text-fallback.png b/images/emoji/fitzpatrick-2-text-fallback.png new file mode 100644 index 0000000..7342c5f Binary files /dev/null and b/images/emoji/fitzpatrick-2-text-fallback.png differ diff --git a/images/emoji/fitzpatrick-2.png b/images/emoji/fitzpatrick-2.png new file mode 100644 index 0000000..854cdb8 Binary files /dev/null and b/images/emoji/fitzpatrick-2.png differ diff --git a/images/emoji/fitzpatrick-3-text-fallback.png b/images/emoji/fitzpatrick-3-text-fallback.png new file mode 100644 index 0000000..e17de63 Binary files /dev/null and b/images/emoji/fitzpatrick-3-text-fallback.png differ diff --git a/images/emoji/fitzpatrick-3.png b/images/emoji/fitzpatrick-3.png new file mode 100644 index 0000000..f95b908 Binary files /dev/null and b/images/emoji/fitzpatrick-3.png differ diff --git a/images/emoji/fitzpatrick-4-text-fallback.png b/images/emoji/fitzpatrick-4-text-fallback.png new file mode 100644 index 0000000..316e7b4 Binary files /dev/null and b/images/emoji/fitzpatrick-4-text-fallback.png differ diff --git a/images/emoji/fitzpatrick-4.png b/images/emoji/fitzpatrick-4.png new file mode 100644 index 0000000..c3104e7 Binary files /dev/null and b/images/emoji/fitzpatrick-4.png differ diff --git a/images/emoji/fitzpatrick-5-text-fallback.png b/images/emoji/fitzpatrick-5-text-fallback.png new file mode 100644 index 0000000..31f34ce Binary files /dev/null and b/images/emoji/fitzpatrick-5-text-fallback.png differ diff --git a/images/emoji/fitzpatrick-5.png b/images/emoji/fitzpatrick-5.png new file mode 100644 index 0000000..6f86851 Binary files /dev/null and b/images/emoji/fitzpatrick-5.png differ diff --git a/images/emoji/fitzpatrick-6-text-fallback.png b/images/emoji/fitzpatrick-6-text-fallback.png new file mode 100644 index 0000000..f452ae7 Binary files /dev/null and b/images/emoji/fitzpatrick-6-text-fallback.png differ diff --git a/images/emoji/fitzpatrick-6.png b/images/emoji/fitzpatrick-6.png new file mode 100644 index 0000000..d7a03dc Binary files /dev/null and b/images/emoji/fitzpatrick-6.png differ diff --git a/images/emoji/flag-isolate.png b/images/emoji/flag-isolate.png new file mode 100644 index 0000000..45e00be Binary files /dev/null and b/images/emoji/flag-isolate.png differ diff --git a/images/emoji/flag-un.png b/images/emoji/flag-un.png new file mode 100644 index 0000000..45e00be Binary files /dev/null and b/images/emoji/flag-un.png differ diff --git a/images/emoji/g-isolate.png b/images/emoji/g-isolate.png new file mode 100644 index 0000000..b26df25 Binary files /dev/null and b/images/emoji/g-isolate.png differ diff --git a/images/emoji/gendered-person-after.png b/images/emoji/gendered-person-after.png new file mode 100644 index 0000000..844ecc0 Binary files /dev/null and b/images/emoji/gendered-person-after.png differ diff --git a/images/emoji/gendered-person-before.png b/images/emoji/gendered-person-before.png new file mode 100644 index 0000000..b7e4faf Binary files /dev/null and b/images/emoji/gendered-person-before.png differ diff --git a/images/emoji/gendered-person-sequence-fallback.png b/images/emoji/gendered-person-sequence-fallback.png new file mode 100644 index 0000000..9f55dde Binary files /dev/null and b/images/emoji/gendered-person-sequence-fallback.png differ diff --git a/images/emoji/gendered-person-sequence.png b/images/emoji/gendered-person-sequence.png new file mode 100644 index 0000000..5f41a2f Binary files /dev/null and b/images/emoji/gendered-person-sequence.png differ diff --git a/images/emoji/gendersign-female-fallback.png b/images/emoji/gendersign-female-fallback.png new file mode 100644 index 0000000..3b7a9a5 Binary files /dev/null and b/images/emoji/gendersign-female-fallback.png differ diff --git a/images/emoji/gendersign-female.png b/images/emoji/gendersign-female.png new file mode 100644 index 0000000..37f2f82 Binary files /dev/null and b/images/emoji/gendersign-female.png differ diff --git a/images/emoji/gendersign-male-fallback.png b/images/emoji/gendersign-male-fallback.png new file mode 100644 index 0000000..f7f68a6 Binary files /dev/null and b/images/emoji/gendersign-male-fallback.png differ diff --git a/images/emoji/gendersign-male.png b/images/emoji/gendersign-male.png new file mode 100644 index 0000000..2707d48 Binary files /dev/null and b/images/emoji/gendersign-male.png differ diff --git a/images/emoji/hair-bald.png b/images/emoji/hair-bald.png new file mode 100644 index 0000000..d19ed4e Binary files /dev/null and b/images/emoji/hair-bald.png differ diff --git a/images/emoji/hair-curly.png b/images/emoji/hair-curly.png new file mode 100644 index 0000000..797c2f4 Binary files /dev/null and b/images/emoji/hair-curly.png differ diff --git a/images/emoji/hair-red.png b/images/emoji/hair-red.png new file mode 100644 index 0000000..eeeb3c1 Binary files /dev/null and b/images/emoji/hair-red.png differ diff --git a/images/emoji/hair-white.png b/images/emoji/hair-white.png new file mode 100644 index 0000000..db62967 Binary files /dev/null and b/images/emoji/hair-white.png differ diff --git a/images/emoji/hairstyle-sequence.png b/images/emoji/hairstyle-sequence.png new file mode 100644 index 0000000..bff7d2b Binary files /dev/null and b/images/emoji/hairstyle-sequence.png differ diff --git a/images/emoji/hand-left.png b/images/emoji/hand-left.png new file mode 100644 index 0000000..834d6bc Binary files /dev/null and b/images/emoji/hand-left.png differ diff --git a/images/emoji/hand-right.png b/images/emoji/hand-right.png new file mode 100644 index 0000000..21cad2c Binary files /dev/null and b/images/emoji/hand-right.png differ diff --git a/images/emoji/handshake.png b/images/emoji/handshake.png new file mode 100644 index 0000000..100bf93 Binary files /dev/null and b/images/emoji/handshake.png differ diff --git a/images/emoji/heart-on-fire-after.png b/images/emoji/heart-on-fire-after.png new file mode 100644 index 0000000..6ee2e40 Binary files /dev/null and b/images/emoji/heart-on-fire-after.png differ diff --git a/images/emoji/heart.png b/images/emoji/heart.png new file mode 100644 index 0000000..bdd343f Binary files /dev/null and b/images/emoji/heart.png differ diff --git a/images/emoji/keycap-after.png b/images/emoji/keycap-after.png new file mode 100644 index 0000000..6c1de3b Binary files /dev/null and b/images/emoji/keycap-after.png differ diff --git a/images/emoji/keycap-before.png b/images/emoji/keycap-before.png new file mode 100644 index 0000000..86a24c7 Binary files /dev/null and b/images/emoji/keycap-before.png differ diff --git a/images/emoji/keycap-cek.png b/images/emoji/keycap-cek.png new file mode 100644 index 0000000..040c148 Binary files /dev/null and b/images/emoji/keycap-cek.png differ diff --git a/images/emoji/keycap-sequence.png b/images/emoji/keycap-sequence.png new file mode 100644 index 0000000..ef9d997 Binary files /dev/null and b/images/emoji/keycap-sequence.png differ diff --git a/images/emoji/keycap-sequenceX.png b/images/emoji/keycap-sequenceX.png new file mode 100644 index 0000000..8a94a2d Binary files /dev/null and b/images/emoji/keycap-sequenceX.png differ diff --git a/images/emoji/kiss-mark.png b/images/emoji/kiss-mark.png new file mode 100644 index 0000000..c9bb933 Binary files /dev/null and b/images/emoji/kiss-mark.png differ diff --git a/images/emoji/l-isolate.png b/images/emoji/l-isolate.png new file mode 100644 index 0000000..7d6327d Binary files /dev/null and b/images/emoji/l-isolate.png differ diff --git a/images/emoji/modifier-after.png b/images/emoji/modifier-after.png new file mode 100644 index 0000000..86fa870 Binary files /dev/null and b/images/emoji/modifier-after.png differ diff --git a/images/emoji/modifier-before.png b/images/emoji/modifier-before.png new file mode 100644 index 0000000..e92a566 Binary files /dev/null and b/images/emoji/modifier-before.png differ diff --git a/images/emoji/modifier-sequence-fallback.png b/images/emoji/modifier-sequence-fallback.png new file mode 100644 index 0000000..31d6fa4 Binary files /dev/null and b/images/emoji/modifier-sequence-fallback.png differ diff --git a/images/emoji/modifier-sequence.png b/images/emoji/modifier-sequence.png new file mode 100644 index 0000000..90132ba Binary files /dev/null and b/images/emoji/modifier-sequence.png differ diff --git a/images/emoji/multi-person-family-man-boy-after.png b/images/emoji/multi-person-family-man-boy-after.png new file mode 100644 index 0000000..bd0cd0c Binary files /dev/null and b/images/emoji/multi-person-family-man-boy-after.png differ diff --git a/images/emoji/multi-person-family-man-boy-sequence.png b/images/emoji/multi-person-family-man-boy-sequence.png new file mode 100644 index 0000000..ce19f3c Binary files /dev/null and b/images/emoji/multi-person-family-man-boy-sequence.png differ diff --git a/images/emoji/multi-person-family-man-girl-girl-after.png b/images/emoji/multi-person-family-man-girl-girl-after.png new file mode 100644 index 0000000..ece4ac2 Binary files /dev/null and b/images/emoji/multi-person-family-man-girl-girl-after.png differ diff --git a/images/emoji/multi-person-family-man-girl-girl-sequence.png b/images/emoji/multi-person-family-man-girl-girl-sequence.png new file mode 100644 index 0000000..d64282f Binary files /dev/null and b/images/emoji/multi-person-family-man-girl-girl-sequence.png differ diff --git a/images/emoji/multi-person-family-man-woman-girl-after.png b/images/emoji/multi-person-family-man-woman-girl-after.png new file mode 100644 index 0000000..4ce3813 Binary files /dev/null and b/images/emoji/multi-person-family-man-woman-girl-after.png differ diff --git a/images/emoji/multi-person-family-man-woman-girl-sequence.png b/images/emoji/multi-person-family-man-woman-girl-sequence.png new file mode 100644 index 0000000..468afd0 Binary files /dev/null and b/images/emoji/multi-person-family-man-woman-girl-sequence.png differ diff --git a/images/emoji/multi-person-family-woman-woman-girl-boy-after.png b/images/emoji/multi-person-family-woman-woman-girl-boy-after.png new file mode 100644 index 0000000..7673771 Binary files /dev/null and b/images/emoji/multi-person-family-woman-woman-girl-boy-after.png differ diff --git a/images/emoji/multi-person-family-woman-woman-girl-boy-sequence.png b/images/emoji/multi-person-family-woman-woman-girl-boy-sequence.png new file mode 100644 index 0000000..e8c341f Binary files /dev/null and b/images/emoji/multi-person-family-woman-woman-girl-boy-sequence.png differ diff --git a/images/emoji/multi-person-heart-sequence.png b/images/emoji/multi-person-heart-sequence.png new file mode 100644 index 0000000..8d82345 Binary files /dev/null and b/images/emoji/multi-person-heart-sequence.png differ diff --git a/images/emoji/multi-person-heart-skintone-sequence.png b/images/emoji/multi-person-heart-skintone-sequence.png new file mode 100644 index 0000000..e86c59c Binary files /dev/null and b/images/emoji/multi-person-heart-skintone-sequence.png differ diff --git a/images/emoji/multi-person-holding-hands-sequence-after.png b/images/emoji/multi-person-holding-hands-sequence-after.png new file mode 100644 index 0000000..943278e Binary files /dev/null and b/images/emoji/multi-person-holding-hands-sequence-after.png differ diff --git a/images/emoji/multi-person-holding-hands-sequence-woman-woman-after.png b/images/emoji/multi-person-holding-hands-sequence-woman-woman-after.png new file mode 100644 index 0000000..42e6fb4 Binary files /dev/null and b/images/emoji/multi-person-holding-hands-sequence-woman-woman-after.png differ diff --git a/images/emoji/multi-person-holding-hands-sequence-woman-woman-skintone-after.png b/images/emoji/multi-person-holding-hands-sequence-woman-woman-skintone-after.png new file mode 100644 index 0000000..242c86a Binary files /dev/null and b/images/emoji/multi-person-holding-hands-sequence-woman-woman-skintone-after.png differ diff --git a/images/emoji/multi-person-holding-hands-sequence.png b/images/emoji/multi-person-holding-hands-sequence.png new file mode 100644 index 0000000..a9db3b4 Binary files /dev/null and b/images/emoji/multi-person-holding-hands-sequence.png differ diff --git a/images/emoji/multi-person-holding-hands-skintone-sequence.png b/images/emoji/multi-person-holding-hands-skintone-sequence.png new file mode 100644 index 0000000..8e83b75 Binary files /dev/null and b/images/emoji/multi-person-holding-hands-skintone-sequence.png differ diff --git a/images/emoji/multi-person-kiss-sequence-after.png b/images/emoji/multi-person-kiss-sequence-after.png new file mode 100644 index 0000000..eb89b53 Binary files /dev/null and b/images/emoji/multi-person-kiss-sequence-after.png differ diff --git a/images/emoji/multi-person-kiss-sequence-skintone-after.png b/images/emoji/multi-person-kiss-sequence-skintone-after.png new file mode 100644 index 0000000..d243d09 Binary files /dev/null and b/images/emoji/multi-person-kiss-sequence-skintone-after.png differ diff --git a/images/emoji/multi-person-kiss-sequence.png b/images/emoji/multi-person-kiss-sequence.png new file mode 100644 index 0000000..6059ec5 Binary files /dev/null and b/images/emoji/multi-person-kiss-sequence.png differ diff --git a/images/emoji/multi-person-kiss-skintone-sequence.png b/images/emoji/multi-person-kiss-skintone-sequence.png new file mode 100644 index 0000000..80fe40b Binary files /dev/null and b/images/emoji/multi-person-kiss-skintone-sequence.png differ diff --git a/images/emoji/multi-person-man-heart-man-after.png b/images/emoji/multi-person-man-heart-man-after.png new file mode 100644 index 0000000..f035fbc Binary files /dev/null and b/images/emoji/multi-person-man-heart-man-after.png differ diff --git a/images/emoji/multi-person-man-skintone-2-heart-man-skintone-2-after.png b/images/emoji/multi-person-man-skintone-2-heart-man-skintone-2-after.png new file mode 100644 index 0000000..c90787d Binary files /dev/null and b/images/emoji/multi-person-man-skintone-2-heart-man-skintone-2-after.png differ diff --git a/images/emoji/multi-person-shaking-hands-after.png b/images/emoji/multi-person-shaking-hands-after.png new file mode 100644 index 0000000..ca15ae0 Binary files /dev/null and b/images/emoji/multi-person-shaking-hands-after.png differ diff --git a/images/emoji/multi-person-shaking-hands-sequence.png b/images/emoji/multi-person-shaking-hands-sequence.png new file mode 100644 index 0000000..7ee0670 Binary files /dev/null and b/images/emoji/multi-person-shaking-hands-sequence.png differ diff --git a/images/emoji/regional-flag-un-after.png b/images/emoji/regional-flag-un-after.png new file mode 100644 index 0000000..6e555c0 Binary files /dev/null and b/images/emoji/regional-flag-un-after.png differ diff --git a/images/emoji/regional-flag-un-before.png b/images/emoji/regional-flag-un-before.png new file mode 100644 index 0000000..54cc557 Binary files /dev/null and b/images/emoji/regional-flag-un-before.png differ diff --git a/images/emoji/regional-flag-un-fallback.png b/images/emoji/regional-flag-un-fallback.png new file mode 100644 index 0000000..7bac91d Binary files /dev/null and b/images/emoji/regional-flag-un-fallback.png differ diff --git a/images/emoji/regional-indicator-flag-sequence-un-fallback.png b/images/emoji/regional-indicator-flag-sequence-un-fallback.png new file mode 100644 index 0000000..a3e1732 Binary files /dev/null and b/images/emoji/regional-indicator-flag-sequence-un-fallback.png differ diff --git a/images/emoji/regional-indicator-flag-sequence-un.png b/images/emoji/regional-indicator-flag-sequence-un.png new file mode 100644 index 0000000..bf30ea5 Binary files /dev/null and b/images/emoji/regional-indicator-flag-sequence-un.png differ diff --git a/images/emoji/right-arrow.png b/images/emoji/right-arrow.png new file mode 100644 index 0000000..2c8f7b5 Binary files /dev/null and b/images/emoji/right-arrow.png differ diff --git a/images/emoji/role-firefighter-man-after.png b/images/emoji/role-firefighter-man-after.png new file mode 100644 index 0000000..056ab81 Binary files /dev/null and b/images/emoji/role-firefighter-man-after.png differ diff --git a/images/emoji/role-firefighter-man-skintone-6-after.png b/images/emoji/role-firefighter-man-skintone-6-after.png new file mode 100644 index 0000000..bcc5946 Binary files /dev/null and b/images/emoji/role-firefighter-man-skintone-6-after.png differ diff --git a/images/emoji/role-pilot-woman-after.png b/images/emoji/role-pilot-woman-after.png new file mode 100644 index 0000000..140adad Binary files /dev/null and b/images/emoji/role-pilot-woman-after.png differ diff --git a/images/emoji/role-pilot-woman-skintone-2-after.png b/images/emoji/role-pilot-woman-skintone-2-after.png new file mode 100644 index 0000000..af75c5e Binary files /dev/null and b/images/emoji/role-pilot-woman-skintone-2-after.png differ diff --git a/images/emoji/role-sequence-firefighter-skintone-6.png b/images/emoji/role-sequence-firefighter-skintone-6.png new file mode 100644 index 0000000..1062392 Binary files /dev/null and b/images/emoji/role-sequence-firefighter-skintone-6.png differ diff --git a/images/emoji/role-sequence-firefighter.png b/images/emoji/role-sequence-firefighter.png new file mode 100644 index 0000000..7aada9e Binary files /dev/null and b/images/emoji/role-sequence-firefighter.png differ diff --git a/images/emoji/role-sequence-pilot-skintone-2.png b/images/emoji/role-sequence-pilot-skintone-2.png new file mode 100644 index 0000000..e7899e8 Binary files /dev/null and b/images/emoji/role-sequence-pilot-skintone-2.png differ diff --git a/images/emoji/role-sequence-pilot.png b/images/emoji/role-sequence-pilot.png new file mode 100644 index 0000000..378c01a Binary files /dev/null and b/images/emoji/role-sequence-pilot.png differ diff --git a/images/emoji/running-rightward.png b/images/emoji/running-rightward.png new file mode 100644 index 0000000..9656bca Binary files /dev/null and b/images/emoji/running-rightward.png differ diff --git a/images/emoji/running.png b/images/emoji/running.png new file mode 100644 index 0000000..27ce826 Binary files /dev/null and b/images/emoji/running.png differ diff --git a/images/emoji/s-isolate.png b/images/emoji/s-isolate.png new file mode 100644 index 0000000..d5cf9b5 Binary files /dev/null and b/images/emoji/s-isolate.png differ diff --git a/images/emoji/skintone-2-text-fallback.png b/images/emoji/skintone-2-text-fallback.png new file mode 100644 index 0000000..c045d76 Binary files /dev/null and b/images/emoji/skintone-2-text-fallback.png differ diff --git a/images/emoji/skintone-2.png b/images/emoji/skintone-2.png new file mode 100644 index 0000000..151873c Binary files /dev/null and b/images/emoji/skintone-2.png differ diff --git a/images/emoji/skintone-3-text-fallback.png b/images/emoji/skintone-3-text-fallback.png new file mode 100644 index 0000000..892ad47 Binary files /dev/null and b/images/emoji/skintone-3-text-fallback.png differ diff --git a/images/emoji/skintone-3.png b/images/emoji/skintone-3.png new file mode 100644 index 0000000..4a46592 Binary files /dev/null and b/images/emoji/skintone-3.png differ diff --git a/images/emoji/skintone-4-text-fallback.png b/images/emoji/skintone-4-text-fallback.png new file mode 100644 index 0000000..1db7ed8 Binary files /dev/null and b/images/emoji/skintone-4-text-fallback.png differ diff --git a/images/emoji/skintone-4.png b/images/emoji/skintone-4.png new file mode 100644 index 0000000..6d05a29 Binary files /dev/null and b/images/emoji/skintone-4.png differ diff --git a/images/emoji/skintone-5-text-fallback.png b/images/emoji/skintone-5-text-fallback.png new file mode 100644 index 0000000..4b9ab56 Binary files /dev/null and b/images/emoji/skintone-5-text-fallback.png differ diff --git a/images/emoji/skintone-5.png b/images/emoji/skintone-5.png new file mode 100644 index 0000000..2b100fb Binary files /dev/null and b/images/emoji/skintone-5.png differ diff --git a/images/emoji/skintone-6-text-fallback.png b/images/emoji/skintone-6-text-fallback.png new file mode 100644 index 0000000..b941d15 Binary files /dev/null and b/images/emoji/skintone-6-text-fallback.png differ diff --git a/images/emoji/skintone-6.png b/images/emoji/skintone-6.png new file mode 100644 index 0000000..acf6cfc Binary files /dev/null and b/images/emoji/skintone-6.png differ diff --git a/images/emoji/skintone-fallback-2.png b/images/emoji/skintone-fallback-2.png new file mode 100644 index 0000000..e419237 Binary files /dev/null and b/images/emoji/skintone-fallback-2.png differ diff --git a/images/emoji/skintone-fallback-3.png b/images/emoji/skintone-fallback-3.png new file mode 100644 index 0000000..6b52ed3 Binary files /dev/null and b/images/emoji/skintone-fallback-3.png differ diff --git a/images/emoji/skintone-fallback-4.png b/images/emoji/skintone-fallback-4.png new file mode 100644 index 0000000..c178f9b Binary files /dev/null and b/images/emoji/skintone-fallback-4.png differ diff --git a/images/emoji/skintone-fallback-5.png b/images/emoji/skintone-fallback-5.png new file mode 100644 index 0000000..3a63173 Binary files /dev/null and b/images/emoji/skintone-fallback-5.png differ diff --git a/images/emoji/skintone-fallback-6.png b/images/emoji/skintone-fallback-6.png new file mode 100644 index 0000000..81c1e9e Binary files /dev/null and b/images/emoji/skintone-fallback-6.png differ diff --git a/images/emoji/tag-b.png b/images/emoji/tag-b.png new file mode 100644 index 0000000..b295dc1 Binary files /dev/null and b/images/emoji/tag-b.png differ diff --git a/images/emoji/tag-end.png b/images/emoji/tag-end.png new file mode 100644 index 0000000..736ba4e Binary files /dev/null and b/images/emoji/tag-end.png differ diff --git a/images/emoji/tag-flag-black.png b/images/emoji/tag-flag-black.png new file mode 100644 index 0000000..18dffe8 Binary files /dev/null and b/images/emoji/tag-flag-black.png differ diff --git a/images/emoji/tag-flag-sequence-wales.png b/images/emoji/tag-flag-sequence-wales.png new file mode 100644 index 0000000..869e421 Binary files /dev/null and b/images/emoji/tag-flag-sequence-wales.png differ diff --git a/images/emoji/tag-flag-wales-after.png b/images/emoji/tag-flag-wales-after.png new file mode 100644 index 0000000..c3ac50f Binary files /dev/null and b/images/emoji/tag-flag-wales-after.png differ diff --git a/images/emoji/tag-flag-wales-before.png b/images/emoji/tag-flag-wales-before.png new file mode 100644 index 0000000..c624534 Binary files /dev/null and b/images/emoji/tag-flag-wales-before.png differ diff --git a/images/emoji/tag-g.png b/images/emoji/tag-g.png new file mode 100644 index 0000000..491a1dc Binary files /dev/null and b/images/emoji/tag-g.png differ diff --git a/images/emoji/tag-isolate-high.png b/images/emoji/tag-isolate-high.png new file mode 100644 index 0000000..b2802a5 Binary files /dev/null and b/images/emoji/tag-isolate-high.png differ diff --git a/images/emoji/tag-isolate-low.png b/images/emoji/tag-isolate-low.png new file mode 100644 index 0000000..f91829e Binary files /dev/null and b/images/emoji/tag-isolate-low.png differ diff --git a/images/emoji/tag-isolate.png b/images/emoji/tag-isolate.png new file mode 100644 index 0000000..b2802a5 Binary files /dev/null and b/images/emoji/tag-isolate.png differ diff --git a/images/emoji/tag-l.png b/images/emoji/tag-l.png new file mode 100644 index 0000000..7f45b16 Binary files /dev/null and b/images/emoji/tag-l.png differ diff --git a/images/emoji/tag-s.png b/images/emoji/tag-s.png new file mode 100644 index 0000000..1864d76 Binary files /dev/null and b/images/emoji/tag-s.png differ diff --git a/images/emoji/tag-w.png b/images/emoji/tag-w.png new file mode 100644 index 0000000..d02b673 Binary files /dev/null and b/images/emoji/tag-w.png differ diff --git a/images/emoji/text-pres-selector.png b/images/emoji/text-pres-selector.png new file mode 100644 index 0000000..7159e6f Binary files /dev/null and b/images/emoji/text-pres-selector.png differ diff --git a/images/emoji/text-pres-sequence.png b/images/emoji/text-pres-sequence.png new file mode 100644 index 0000000..6926dd2 Binary files /dev/null and b/images/emoji/text-pres-sequence.png differ diff --git a/images/emoji/text-presentation.png b/images/emoji/text-presentation.png new file mode 100644 index 0000000..b80f207 Binary files /dev/null and b/images/emoji/text-presentation.png differ diff --git a/images/emoji/vs15.png b/images/emoji/vs15.png new file mode 100644 index 0000000..fcd5481 Binary files /dev/null and b/images/emoji/vs15.png differ diff --git a/images/emoji/vs16.png b/images/emoji/vs16.png new file mode 100644 index 0000000..31b3b70 Binary files /dev/null and b/images/emoji/vs16.png differ diff --git a/images/emoji/w-isolate.png b/images/emoji/w-isolate.png new file mode 100644 index 0000000..0e7a5c8 Binary files /dev/null and b/images/emoji/w-isolate.png differ diff --git a/images/emoji/woman-white-hair.png b/images/emoji/woman-white-hair.png new file mode 100644 index 0000000..fa60741 Binary files /dev/null and b/images/emoji/woman-white-hair.png differ diff --git a/images/emoji/zwj-directionality-sequence.png b/images/emoji/zwj-directionality-sequence.png new file mode 100644 index 0000000..e33d674 Binary files /dev/null and b/images/emoji/zwj-directionality-sequence.png differ diff --git a/images/emoji/zwj-sequence-heart-on-fire.png b/images/emoji/zwj-sequence-heart-on-fire.png new file mode 100644 index 0000000..e4813cf Binary files /dev/null and b/images/emoji/zwj-sequence-heart-on-fire.png differ diff --git a/images/emoji/zwj.png b/images/emoji/zwj.png new file mode 100644 index 0000000..4908762 Binary files /dev/null and b/images/emoji/zwj.png differ diff --git a/images/emoji/zwnj.png b/images/emoji/zwnj.png new file mode 100644 index 0000000..16cba00 Binary files /dev/null and b/images/emoji/zwnj.png differ diff --git a/opentype-shaping-emoji.md b/opentype-shaping-emoji.md index 47b546e..7ab5b62 100644 --- a/opentype-shaping-emoji.md +++ b/opentype-shaping-emoji.md @@ -25,6 +25,7 @@ emoji sequences. - [ZWJ directionality sequences](#zwj-directionality-sequences) - [ZWJ additional sequences](#zwj-additional-sequences) - [Other sequences and ligatures](#other-sequences-and-ligatures) + - [Feature interaction in sequences](#feature-interaction-in-sequences) - [Emoji sets](#emoji-sets) - [The default shaping model](#the-default-shaping-model) @@ -141,6 +142,10 @@ codepoint's default. There are two presentation selectors: - `Variation Selector 16` (VS16, `U+FE0F`) requests emoji presentation style. +![Text presentation-style selector](/images/emoji/text-presentation.png) + +![Emoji presentation-style selector](/images/emoji/emoji-presentation.png) + An emoji codepoint might also be followed by an emoji **modifier**. This modifier requests an alternate version of the emoji glyph. Currently, there are five emoji modifiers defined, all of which @@ -282,6 +287,18 @@ _regionalindicator_ = ["U+1F1E6".."U+1F1FF"] _tagchar_ = `TAG_CHARACTER` _endtag_ = "U+E007F" ``` + The expressions below use state-machine syntax from the Ragel state-machine compiler. The operators represent: @@ -309,6 +326,10 @@ A presentation sequence is used to request a specific presentation style ("text" or "emoji"), potentially overriding the default presentation style defined for the codepoint by Unicode. +![Requesting emoji presentation style](/images/emoji/emoji-pres-sequence.png) + +![Requesting text presentation style](/images/emoji/text-pres-sequence.png) + The active emoji font, however, might not contain a glyph for the presentation style requested in the sequence. In particular, it is not common for emoji fonts to include text-presentation glyphs for @@ -335,29 +356,50 @@ presentation sequences also occur within longer emoji sequences. A modifier sequence is used to request an alternate glyph for an emoji codepoint. +Currently, there are five emoji-modifier codepoints defined by +Unicode. Each corresponds to a different human skin-tone based on the +Fitzpatrick scale. + +![Fitzpatrick 2](/images/emoji/fitzpatrick-2.png) + +![Fitzpatrick 3](/images/emoji/fitzpatrick-3.png) + +![Fitzpatrick 4](/images/emoji/fitzpatrick-4.png) + +![Fitzpatrick 5](/images/emoji/fitzpatrick-5.png) + +![Fitzpatrick 6](/images/emoji/fitzpatrick-6.png) + A modifier sequence must match: ```markdown -_emojimod_ = _emoji_ _modifier_ +_emojimodified_ = _emoji_ _modifier_ ``` -Currently, there are five emoji-modifier codepoints defined by -Unicode. Each corresponds to a different human skin-tone based on the -Fitzpatrick scale. Fonts are expected to implement modifier sequences -for emoji codepoints that depict a single human being, and are -expected not to implement modifier sequences for other emoji -codepoints. +Fonts are expected to implement modifier sequences for emoji +codepoints that depict a single human being, and are expected not to +implement modifier sequences for other emoji codepoints. -Emojis that depict multiple human beings are modified using the ZWJ -mechanisms described below. +> Note: Most emojis that, by default, depict multiple human beings are +> modified using the ZWJ mechanisms described later, and not via this +> mechanism. +> +> However, there are + +![Modifier sequence](/images/emoji/modifier-sequence.png) + +The fallback for a modifier sequence is the generic, unmodified +emoji followed by an emoji representing the skin-tone requested. + +![Modifier sequence fallback](/images/emoji/modifier-sequence-fallback.png) Modifier sequences use emoji presentation style by default, and cannot include a presentation selector. However, an implementation may choose to display text-presentation versions of sequences if emoji presentation style is not possible in the environment. -Although standalone modifier sequences can occur, note that -modifier sequences also occur within longer emoji sequences. +Although standalone modifier sequences occur, note that modifier +sequences can also occur within longer emoji sequences. @@ -379,16 +421,19 @@ the `unicode_region_subtag` field in the CLDR database. The typical emoji implementation of such a sequence in an image of a flag for the region. However, emoji fonts may choose to represent the -region through some other visual means. Similarly, where there is more -than one possible flag for a region, Unicode does not specify any -particular visual representation. +region through some other visual means (for example, a regional symbol +or map image). Similarly, where there is more than one possible flag +for a region, Unicode does not specify any particular visual +representation. Some historical region subtags have been designated as deprecated (for example, "East Germany" and "West Germany"). Emoji fonts are not expected to support these deprecated subtags. However, if they encountered in a text run and are supported in the active font, -shapign engines should deal with the situation gracefully, without -offering guarantees of support. +shaping engines should deal with the situation gracefully, without +offering guarantees of support. + +![Regional Indicator flag sequence](/images/emoji/regional-indicator-flag-sequence-un.png) Regional Indicator flag sequences use emoji presentation by default, and cannot include a presentation selector. However, an @@ -396,6 +441,8 @@ implementation may choose to display text-presentation versions of sequences if emoji presentation style is not possible in the environment. +![Regional Indicator flag sequence fallback](/images/emoji/regional-indicator-flag-sequence-un-fallback.png) + Regional Indicator flag sequences only occur in standalone form. > Note: The Regional Indicator flag sequences are defined to always be @@ -433,8 +480,9 @@ Tag sequences must end with "Cancel Tag" (`U+E007F`). > Note: Despite the official name "Cancel Tag", this codepoint > terminates valid tag sequences, rather than negating them. -Tag flag sequences only occur in standalone form. +![Tag flag sequence](/images/emoji/tag-flag-sequence-wales.png) +Tag flag sequences only occur in standalone form. ### Keycap sequences ### @@ -473,12 +521,21 @@ back to a set of individual-person emoji glyphs. A ZWJ hair sequence is used to request a specific hairstyle version of an emoji codepoint that depicts a single human being. +![Hairstyle sequence](/images/emoji/hairstyle-sequence.png) + A ZWJ hair sequence must match: ```markdown -(_emoji_ | _emojimod_) _zwj_ _hairstyle_ +(_emoji_ | _emojimodified_) _zwj_ _hairstyle_ ``` +Currently, four hairstyle modifier codepoints are defined: + + - `U+1F9B0` "Red or ginger hair" + - `U+1F9B1` "Curly hair" + - `U+1F9B2` "Bald" + - `U+1F9B3` "White hair" + The set of hairstyle sequences allowed has been chosen to enable depictions of distinct properties not easily represented by the defaults of the fallback glyphs. By default, the hairstyle and color @@ -499,15 +556,49 @@ Each ZWJ gendered person sequence is composed of an emoji that depicts a human by default, followed by `ZWJ`, followed by a gender symbol, followed by `_VS16_`. +![Gendered person sequence](/images/emoji/gendered-person-sequence.png) + The fallback for a ZWJ gendered person sequence is a generic "person" emoji followed by a gender symbol. +![Gendered person sequence fallback](/images/emoji/gendered-person-sequence-fallback.png) + A ZWJ gendered person sequence must match: ```markdown -(_emoji_ | _emojimod_) _zwj_ _gendersign_ _VS16_ +(_emoji_ | _emojimodified_) _zwj_ _gendersign_ _VS16_ ``` +A small number of emoji codepoints are defined to show a single human +being with a fixed gender. These codepoints cannot have their apparent +gender modified using the ZWJ gendered person mechanism. + +Currently, this list of codepoints includes those in the table below: + +| Emoji codepoint | Gender | +|:-------------------------------|:-------| +| `U+1F467` Girl | Female | +| `U+1F467` Boy | Male | +| `U+1F467` Woman | Female | +| `U+1F467` Man | Male | +| `U+1F467` Older woman | Female | +| `U+1F467` Older man | Male | +| `U+1F467` Mrs Claus | Female | +| `U+1F467` Santa Claus | Male | +| `U+1F467` Princess | Female | +| `U+1F467` Prince | Male | +| `U+1F467` Woman dancing | Female | +| `U+1F467` Man dancing | Male | +| `U+1F467` Pregnant woman | Female | +| `U+1F467` Breastfeeding | Female | +| `U+1F467` Woman with headscarf | Female | + +However, the list may be updated in subsequent revisions of Unicode. + +In addition, emoji codepoints that depict groups of two or more human +beings are handled by other mechanisms, such as the ZWJ multi-person +group mechanism, and are documented in the corresponding section. + > Note: The ZWJ gendered person sequence is not to be confused with > the ZWJ role sequence. > @@ -521,6 +612,8 @@ A ZWJ gendered person sequence must match: > human-being emoji and append a symbol or object emoji. + + #### ZWJ multi-person group sequences #### A ZWJ multi-person group sequence is used to request a multi-person @@ -530,21 +623,120 @@ sequence of individual-person emoji glyphs. A ZWJ multi-person group sequence must match: ```markdown -(_emoji_ | _emojimod_) (_zwj_ (_emoji_ | _emojimod_) ){1,3} +(_emoji_ | _emojimodified_) (_zwj_ (_emoji_ | _emojimodified_) _presentation_? ){1,3} ``` -The allowable configurations for multi-person group emoji sequences are: -- couple with heart -- couple in kiss -- couple holding hands -- family -- handshake +Only a fixed number of such multi-person group sequences is +defined. Some of the sequences make use of specific codepoints (such +as "Heavy Black Heart" or "Kiss Mark"). -> Note: the handshake ZWJ sequence does not involve the "Handshake" +The currently supported configurations for multi-person group emoji +sequences are: + + - Couple with heart + - Couple in kiss + - Couple holding hands + - Family + - Shaking hands + + +A potential source of confusion for these sequences is that some of +them appear to duplicate the content of an existing emoji codepoint, +but the existing emoji codepoint is typically not involved in forming +the corresponding ZWJ multi-person group sequence. + +Specifically, there are standalone emoji codepoints for "Kiss" +(`U+1F48F`), two people holding hands (in three permutations: +`U+1F46B`, `U+1F46C`, and `U+1F46D`), "Family" (`U+1F46A`), and +"Handshake" (`U+1F91D`). The details of each of these codepoints in +relation to the corresponding conceptually-similar ZWJ multi-person +group sequence are noted below. + +Each of the specific ZWJ multi-person group sequences has a precise +definition. + +The "Couple with heart" sequence is composed of +"Person,ZWJ,Heavy_Black_Heart,VS16,ZWJ,Person", and must match: +```markdown +(_emoji_ | _emojimodified_) _zwj_ `U+2764` _VS16_ _zwj_ (_emoji_ | _emojimodified_) +``` + +![Multi-person heart sequence](/images/emoji/multi-person-heart-sequence.png) + +![Multi-person heart skintone sequence](/images/emoji/multi-person-heart-skintone-sequence.png) + + +The "Couple in kiss" sequence is composed of +"Person,ZWJ,Heavy_Black_Heart,VS16,ZWJ,Kiss_Mark,ZWJ,Person", and must match: +```markdown +(_emoji_ | _emojimodified_) _zwj_ `U+2764` _VS16_ _zwj_ `U+1F48B` _zwj_ (_emoji_ | _emojimodified_) +``` + +![Multi-person kiss sequence](/images/emoji/multi-person-kiss-sequence.png) + +![Multi-person kiss skin-tone sequence](/images/emoji/multi-person-kiss-skintone-sequence.png) + +> Note: the kiss ZWJ sequence does not involve the "Kiss" codepoint +> (`U+1F48F`). + + +The "Couple holding hands" sequence is composed of +"Person,ZWJ,Handshake,ZWJ,Person", and must match: +```markdown +(_emoji_ | _emojimodified_) _zwj_ `U+1F91D` _zwj_ (_emoji_ | _emojimodified_) +``` + +![Multi-person holding-hands sequence](/images/emoji/multi-person-holding-hands-sequence.png) + +![Multi-person holding-hands skin-tone sequence](/images/emoji/multi-person-holding-hands-skintone-sequence.png) + +> Note: the couple-holding-hands ZWJ sequence does not involve any of +> the "Man and woman holding hands" (`U+1F46B`), "Two men holding +> hands" (`U+1F46C`), or "Two women holding hands" (`U+1F46D`) +> codepoints. + + +The "Family" sequence is composed of two-to-four individual "Person" +subsequences, each separated by a ZWJ. Furthermore, the "Person" +subsequences must be sorted so that all adult subsequences precede all +child subsequences. A "Family" subsequence must match: +```markdown +(_emoji_ | _emojimodified_) (_zwj_ (_emoji_ | _emojimodified_) ){1,3} +``` + +> Note: The ZWJ "Family" sequence is defined to support modifiers on +> each individual human-codepoint component of the sequence, but these +> modified "Family" sequences are not currently included in the +> Recommended For General Interchange (RGI) emoji set, due to the +> number of permutations that would be added to the RGI set as a result. + +![Multi-person family man, boy sequence](/images/emoji/multi-person-family-man-boy-sequence.png) + +![Multi-person family man, girl, girl sequence](/images/emoji/multi-person-family-man-girl-girl-sequence.png) + +![Multi-person family man, woman, girl sequence](/images/emoji/multi-person-family-man-woman-girl-sequence.png) + +![Multi-person family woman, woman, girl, boy sequence](/images/emoji/multi-person-family-woman-woman-girl-boy-sequence.png) + +> Note: the family ZWJ sequence does not involve the "Family" +> codepoint (`U+1F46A`). + +The "Shaking hands" sequence is composed of two "Hand" subsequences +separated by a ZWJ, and must match: +```markdown +`U+1FAF1` _modifier_ _zwj_ `U+1FAF2` _modifier_ +``` + +![Multi-person shaking-hands sequence](/images/emoji/multi-person-shaking-hands-sequence.png) + +> Note: the ZWJ "Shaking hands" sequence does not involve the "Handshake" > codepoint (`U+1F91D`), although the "Handshake" codepoint itself can > be followed by a single _modifier_ codepoint that, for legacy > reasons, serves to alter the skin tone of both of the hands depicted > in the handshake. +> +> However, the "Handshake" codepoint _is_ utilized in the multi-person +> group sequence for "Couple holding hands". #### ZWJ role sequences #### @@ -555,10 +747,12 @@ composed of a codepoint representing a human, followed by `ZWJ`, followed by an emoji depicting an object or symbol that references the desired profession or role. +![Role sequence firefighter](/images/emoji/role-sequence-firefighter.png) + Optionally, the sequence can be further updated by requesting a -skin-tone modifier appended to the `_genderperson_` element. Note that -this usage of the modifier differs from the default `_emojimod_` -sequence. +skin-tone modifier appended to the `_genderperson_` element. + +![Role sequence firefighter with modifier](/images/emoji/role-sequence-firefighter-skintone-6.png) In some cases, the object or symbol depicted by the standalone emoji will not be shown in the substituted emoji resulting from the @@ -571,13 +765,18 @@ In addition, some of the supported "role" codepoints do not use emoji presentation by default; for those codepoints, the emoji will be followed by a presentation selector. +![Role sequence pilot](/images/emoji/role-sequence-pilot.png) + +![Role sequence pilot with modifier](/images/emoji/role-sequence-pilot-skintone-2.png) + + The fallback for a ZWJ role sequence is a generic "person" emoji followed by the emoji symbolizing the task or job. A ZWJ role sequence must match: ```markdown -_genderperson_ _modifier_{,1} _zwj_ _emoji_ _presentation_{,1} +_genderperson_ _modifier_? _zwj_ _emoji_ _presentation_? ``` > Note: The ZWJ role sequence is not to be confused with the ZWJ @@ -605,10 +804,25 @@ A ZWJ color sequence must match: _emoji_ _zwj_ _color_ _presentation_ ``` -Nine color codepoints are defined, each of which (in isolation) -depicts a large square filled with the color in question. The fallback -for a ZWJ color sequence is the default emoji followed by the default -emoji for the color codepoint (that is, the color square). +Currently, nine codepoints are defined, each of which (in isolation) +depicts a large square filled with the color in question. + + - `U+2B1B` - "Black Large Square" + - `U+2B1C` - "White Large Square" + - `U+1F7E5` - "Large Red Square" + - `U+1F7E6` - "Large Blue Square" + - `U+1F7E7` - "Large Orange Square" + - `U+1F7E8` - "Large Yellow Square" + - `U+1F7E9` - "Large Green Square" + - `U+1F7EA` - "Large Purple Square" + - `U+1F7EB ` - "Large Brown Square" + + +![Color sequence](/images/emoji/color-sequence.png) + +The fallback for a ZWJ color sequence is the default emoji followed by +the default emoji for the color codepoint (that is, the color square). + #### ZWJ directionality sequences #### @@ -616,6 +830,9 @@ emoji for the color codepoint (that is, the color square). A ZWJ directionality sequence is used to request a version of an emoji codepoint facing a specific cardinal direction. + +![ZWJ directionality sequence](/images/emoji/zwj-directionality-sequence.png) + A ZWJ directionality sequence must match: ```markdown @@ -625,7 +842,34 @@ _emoji_ _zwj_ _direction_ _presentation_ #### ZWJ additional sequences #### In addition to the above ZWJ sequence categories, there are 13 -standalone ZWJ sequences defined in Unicode. +standalone, but uncategorized, ZWJ sequences defined in Unicode. + + - "Heart on fire" + - "Mending heart" + - "transgender flag" + - "Rainbow flag" + - "Pirate flag" + - "Service dog" + - "Polar bear" + - "Eye in speech bubble" + - "Face exhaling" + - "Face with spiral eyes" + - "Face in clouds" + - "Mx Claus" + - "Black cat" + + +![ZWJ heart-on-fire sequence](/images/emoji/zwj-sequence-heart-on-fire.png) + +These sequences currently match: + +```markdown +_emoji_ _presentation_? _zwj_ _emoji_ _presentation_? +``` + +Note that the "Black cat" sequence, although it appears on this list +of additional ZWJ sequences, has subsequently been generalized to the +[ZWJ color sequence mechanism](#zwj-color-sequences). ### Other sequences and ligatures ### @@ -638,15 +882,60 @@ numbers and symbols defined above. Emoji fonts may also include many-to-one emoji substitutions that do not fit into any of the above sequence varieties and, instead, behave more like ligatures. For example, the sequence "Ice Cream, Banana" -might be substituted with a "banana split" emoji. Such substitutions -are included by the emoji font vendor at their own discretion, with -the understanding that fallback behavior is unpredictable. +might be substituted with a "banana split" emoji. + +Any such substitutions are included by the emoji font vendor at their +own discretion, with the understanding that fallback behavior is +unpredictable. In all such cases, the shaping engine can make a best-effort attempt to support the sequences, but is not obligated to provide any guarantees as to their correctness. +## Feature interaction in sequences ## + +As is noted in the descriptions of ZWJ gendered-person sequences and +ZWJ multi-person group sequences, there is potential for confusion +wherever standalone emoji codepoints and emoji sequences overlap in +meaning. + +This potential for confusion is compounded by the fact that the +skin-tone modifier mechanism and the ZWJ gendered person mechanism +interact differently with standalone emoji codepoints and with emoji +sequences. + +In particular, for several of the standalone emoji codepoints, a +single skin-tone modifier is permitted, which is defined to modify both +of the human beings depicted in the emoji. For other standalone emoji +codepoints, only a single gender designator ZWJ gendered-person +subsequence is allowed to be appended to the codepoint, and the gender +designator is defined to modify both of the human beings depicted in +the emoji. + +The permitted combinations are summarized in the following table: + + +| Type | Emoji | Skin-tone-modifier | Gender depicted | +|:-----------|:----------------------------------------|:-------------------|:--------------------| +| Standalone | "Handshake" `U+1F91D` | only one supported | not supported | +| Standalone | "Woman with bunny ears" `U+1F46F` | not supported | only one supported | +| Standalone | "Wrestlers" `U+1F93C` | not supported | only one supported | +| Standalone | "Man and woman holding hands" `U+1F46B` | only one supported | not supported | +| Standalone | "Two men holding hands" `U+1F46C` | only one supported | not supported | +| Standalone | "Two women holding hands" `U+1F46D` | only one supported | not supported | +| Standalone | "Kiss" `U+1F48F` | only one supported | not supported | +| Standalone | "Couple with heart" `U+1F491` | only one supported | not supported | +| Standalone | "Family" `U+1F46A` | not supported | not supported | +| Sequence | "Couple with heart" ZWJ sequence | supported | supported | +| Sequence | "Couple in kiss" ZWJ sequence | supported | supported | +| Sequence | "Couple holding hands" ZWJ sequence | supported | supported | +| Sequence | "Family" ZWJ sequence | supported | supported | +| Sequence | "Shaking hands" ZWJ sequence | required | not supported | + + + + ## Emoji sets ##