From 17d103cf91314e964086ca45e34a0d66378deeea Mon Sep 17 00:00:00 2001 From: Munira Tursunova Date: Fri, 12 Apr 2024 15:25:44 +0200 Subject: [PATCH] Add test for variation sequences cluster matching --- .../MPLUS1-Regular_without-cmap14-subset.ttf | Bin 0 -> 1280 bytes .../vs/NotoColorEmoji-Regular_subset.ttf | Bin 0 -> 31728 bytes .../resources/vs/NotoEmoji-Regular_subset.ttf | Bin 0 -> 1776 bytes ...otoEmoji-Regular_without-cmap14-subset.ttf | Bin 0 -> 1736 bytes .../NotoSansJP-Regular_with-cmap14-subset.ttf | Bin 0 -> 1688 bytes ...SansMath-Regular_without-cmap14-subset.ttf | Bin 0 -> 5308 bytes ...STIXTwoMath-Regular_with-cmap14-subset.ttf | Bin 0 -> 5984 bytes .../support/css/variation-sequences.css | 38 ++++++ .../support/js/variation-sequences.js | 125 ++++++++++++++++++ css/css-fonts/variation-sequences-ref.html | 11 ++ css/css-fonts/variation-sequences.html | 18 +++ 11 files changed, 192 insertions(+) create mode 100644 css/css-fonts/resources/vs/MPLUS1-Regular_without-cmap14-subset.ttf create mode 100644 css/css-fonts/resources/vs/NotoColorEmoji-Regular_subset.ttf create mode 100644 css/css-fonts/resources/vs/NotoEmoji-Regular_subset.ttf create mode 100644 css/css-fonts/resources/vs/NotoEmoji-Regular_without-cmap14-subset.ttf create mode 100644 css/css-fonts/resources/vs/NotoSansJP-Regular_with-cmap14-subset.ttf create mode 100644 css/css-fonts/resources/vs/NotoSansMath-Regular_without-cmap14-subset.ttf create mode 100644 css/css-fonts/resources/vs/STIXTwoMath-Regular_with-cmap14-subset.ttf create mode 100644 css/css-fonts/support/css/variation-sequences.css create mode 100644 css/css-fonts/support/js/variation-sequences.js create mode 100644 css/css-fonts/variation-sequences-ref.html create mode 100644 css/css-fonts/variation-sequences.html diff --git a/css/css-fonts/resources/vs/MPLUS1-Regular_without-cmap14-subset.ttf b/css/css-fonts/resources/vs/MPLUS1-Regular_without-cmap14-subset.ttf new file mode 100644 index 0000000000000000000000000000000000000000..b77096690df1b4136cb7907708c778d716433c59 GIT binary patch literal 1280 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 V^LPd`wxo(urraUyHJtl1z(2#fT)O}O literal 0 HcmV?d00001 diff --git a/css/css-fonts/resources/vs/NotoEmoji-Regular_without-cmap14-subset.ttf b/css/css-fonts/resources/vs/NotoEmoji-Regular_without-cmap14-subset.ttf new file mode 100644 index 0000000000000000000000000000000000000000..3d00ef81dea38d7de7b95538a1217126b897f8c9 GIT binary patch literal 1736 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 F{{;_-Egk>> literal 0 HcmV?d00001 diff --git a/css/css-fonts/resources/vs/STIXTwoMath-Regular_with-cmap14-subset.ttf b/css/css-fonts/resources/vs/STIXTwoMath-Regular_with-cmap14-subset.ttf new file mode 100644 index 0000000000000000000000000000000000000000..c9720cf9ce712da3631a327e1ee00d399e28613b GIT binary patch literal 5984 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 literal 0 HcmV?d00001 diff --git a/css/css-fonts/support/css/variation-sequences.css b/css/css-fonts/support/css/variation-sequences.css new file mode 100644 index 00000000000000..5977f17b678c28 --- /dev/null +++ b/css/css-fonts/support/css/variation-sequences.css @@ -0,0 +1,38 @@ +@font-face { + font-family: "MonoEmojiFont"; + src: url(../../resources/vs/NotoEmoji-Regular_subset.ttf); +} + +@font-face { + font-family: "ColorEmojiFont"; + src: url(../../resources/vs/NotoColorEmoji-Regular_subset.ttf); +} + +@font-face { + font-family: "EmojiFontWithBaseCharOnly"; + src: url(../../resources/vs/NotoEmoji-Regular_without-cmap14-subset.ttf); +} + +@font-face { + font-family: "CJKFontWithVS"; + src: url(../../resources/vs/NotoSansJP-Regular_with-cmap14-subset.ttf); +} + +@font-face { + font-family: "CJKFontWithBaseCharOnly"; + src: url(../../resources/vs/MPLUS1-Regular_without-cmap14-subset.ttf); +} + +@font-face { + font-family: "MathFontWithVS"; + src: url(../../resources/vs/STIXTwoMath-Regular_with-cmap14-subset.ttf); +} + +@font-face { + font-family: "MathFontWithBaseCharOnly"; + src: url(../../resources/vs/NotoSansMath-Regular_without-cmap14-subset.ttf); +} + +body { + font-size: 24px; +} \ No newline at end of file diff --git a/css/css-fonts/support/js/variation-sequences.js b/css/css-fonts/support/js/variation-sequences.js new file mode 100644 index 00000000000000..84c5a1a9c77932 --- /dev/null +++ b/css/css-fonts/support/js/variation-sequences.js @@ -0,0 +1,125 @@ +var baseChars = { + "emoji": "\u{1fae8}", + "cjk": "\u{8279}", + "math": "\u{2205}" +}; + +var variationSelectors = { + "emoji": ["\u{fe0e}", "\u{fe0f}"], + "cjk": ["", "\u{FE00}", "\u{FE01}", "\u{e0100}", "\u{e0101}", + "\u{e0102}" + ], + "math": ["", "\u{FE00}"] +}; + +var families = { + "emoji": ["ColorEmojiFont", "MonoEmojiFont", + "EmojiFontWithBaseCharOnly", + "sans-serif" + ], + "cjk": ["CJKFontWithVS", "CJKFontWithBaseCharOnly", + "sans-serif" + ], + "math": ["MathFontWithVS", "MathFontWithBaseCharOnly", + "sans-serif" + ] +}; + +var variationSequenceFamilies = new Map([ + ["\u{1fae8}\u{fe0e}", "MonoEmojiFont"], + ["\u{1fae8}\u{fe0f}", "ColorEmojiFont"], + ["\u{8279}\u{fe00}", "CJKFontWithVS"], + ["\u{8279}\u{fe01}", "CJKFontWithVS"], + ["\u{8279}\u{e0100}", "CJKFontWithVS"], + ["\u{8279}\u{e0101}", "CJKFontWithVS"], + ["\u{8279}\u{e0102}", "CJKFontWithVS"], + ["\u{2205}\u{FE00}", "MathFontWithVS"] +]); + +var baseCharFamilies = new Map([ + ["\u{1fae8}", new Set(["MonoEmojiFont", "ColorEmojiFont", + "EmojiFontWithBaseCharOnly" + ])], + ["\u{8279}", new Set(["CJKFontWithVS", + "CJKFontWithBaseCharOnly" + ])], + ["\u{2205}", new Set(["MathFontWithVS", + "MathFontWithBaseCharOnly" + ])] +]); + +const range = function*(l) { + for (let i = 0; i < l; i += 1) yield i; +} +const isEmpty = arr => + arr.length === 0; + +const permutations = + function*(a) { + const r = arguments[1] || []; + if (isEmpty(a)) + yield r; + for (let i of range(a.length)) { + const aa = [...a]; + const rr = [...r, ...aa.splice(i, 1)]; + yield* permutations(aa, rr); + } +} + +function getMatchedFamilyForVariationSequence( + familyList, baseCharacter, variationSelector) { + const variationSequence = baseCharacter + variationSelector; + // First try to find a match for the whole variation sequence. + if (variationSequenceFamilies.has(variationSequence)) { + const matchedFamily = variationSequenceFamilies.get(variationSequence); + if (familyList.includes(matchedFamily)) { + return matchedFamily; + } + } + // If failed, try to match only the base character from the + // variation sequence. + if (baseCharFamilies.has(baseCharacter)) { + const eligibleFamilies = baseCharFamilies.get(baseCharacter); + const matchedFamilies = + familyList.filter(value => eligibleFamilies.has(value)); + if (matchedFamilies.length) { + return matchedFamilies[0]; + } + } + // We should not reach here, we should always match one of the + // specified web fonts in the tests. + return ""; +} + +function generateContent( + families, baseChar, variationSelectors, getFontFamilyValue) { + var rootElem = document.createElement('div'); + // We want to test all possible combinations of variation + // selectors and font-family list values. For the refs, + // we explicitly specify the font that we expect to be + // matched from the maps at the beginning of the files. + const allFamiliesLists = permutations(families); + for (const familyList of allFamiliesLists) { + for (const variationSelector of variationSelectors) { + const contentSpan = document.createElement("span"); + contentSpan.textContent = baseChar + variationSelector; + contentSpan.style.fontFamily = + getFontFamilyValue(familyList, baseChar, variationSelector); + rootElem.appendChild(contentSpan); + } + } + document.body.appendChild(rootElem); +} + +function generateVariationSequenceTests(type) { + var getFontFamilyValue = (familyList, baseChar, variationSelector) => { + return familyList.join(', '); + } + generateContent(families[type], baseChars[type], variationSelectors[type], getFontFamilyValue); +} + +function generateVariationSequenceRefs(type) { + generateContent( + families[type], baseChars[type], variationSelectors[type], + getMatchedFamilyForVariationSequence); +} diff --git a/css/css-fonts/variation-sequences-ref.html b/css/css-fonts/variation-sequences-ref.html new file mode 100644 index 00000000000000..a44f18bb3e1f35 --- /dev/null +++ b/css/css-fonts/variation-sequences-ref.html @@ -0,0 +1,11 @@ + + +CSS Test: Cluster Matching Variation Sequences + + + + \ No newline at end of file diff --git a/css/css-fonts/variation-sequences.html b/css/css-fonts/variation-sequences.html new file mode 100644 index 00000000000000..91e46a84d71cc8 --- /dev/null +++ b/css/css-fonts/variation-sequences.html @@ -0,0 +1,18 @@ + + +CSS Test: Cluster Matching Variation Sequences + + + + + + + + + + + \ No newline at end of file