-
Notifications
You must be signed in to change notification settings - Fork 516
Open
Description
Expected Behavior
There are a handful of emoji substitutions that are not found, even after #688 landed.
❤️🩹 should render as one glyph. (1433)
Current Behavior
❤️🩹 is rendering as 3 glyphs, ([ 169, 18, 1345 ])
Possible Solution
I can make a PR with failing test cases, if that's helpful.
Steps to Reproduce (for bugs)
#️⃣ found sub [ 4, 22 ] 1520
*️⃣ found sub [ 5, 22 ] 1521
0️⃣ found sub [ 6, 22 ] 1531
1️⃣ found sub [ 7, 22 ] 1522
⛹️♀️ found sub [ 140, 18, 81 ] 140
⛹️♂️ found sub [ 140, 18, 82 ] 140
❤️🔥 found sub [ 169, 18, 794 ] 1432
❤️🩹 found sub [ 169, 18, 1345 ] 1433
I'm manually looking for substitutions to find these, like this...
const substitutions = font.substitution.getFeature("ccmp");
let opentypeOptions = {
kerning: true,
language: "dflt",
features: [{ script: "DFLT", tags: ["ccmp", "liga"] }],
};
for (const emoji of emojiData) {
const { unicode } = emoji;
const glyphs = font.stringToGlyphs(unicode, opentypeOptions);
let glyph;
if (glyphs.length === 1) {
glyph = glyphs[0];
} else {
const indexes = glyphs.map((glyph) => glyph.index);
const sub = substitutions.find((substitution) => equals(substitution.sub, indexes));
if (sub) {
glyph = font.glyphs.get(sub.by);
console.log(unicode, "found sub", indexes, sub.by);
} else {
console.log(unicode, "no ccmp sub", indexes);
}
}
}
/** Custom equals function that can also check lists. */
function equals(a, b) {
if (a === b) {
return true;
} else if (Array.isArray(a) && Array.isArray(b)) {
if (a.length !== b.length) {
return false;
}
for (let i = 0; i < a.length; i += 1) {
if (!equals(a[i], b[i])) {
return false;
}
}
return true;
} else {
return false;
}
}
Context
Using noto-emoji in our CAD app, https://cuttle.xyz
Your Environment
- Version used: be0d441
- Font used: noto-emoji v47
- Browser Name and version: Node
- Operating System and version (desktop or mobile):
- Link to your project: