diff options
author | Jaakko Keränen <jaakko.keranen@iki.fi> | 2020-12-08 19:14:54 +0200 |
---|---|---|
committer | Jaakko Keränen <jaakko.keranen@iki.fi> | 2020-12-08 19:14:54 +0200 |
commit | eae5e61bba99c97af3d8b27dab39d50aedeb3b04 (patch) | |
tree | b8c932a745f77845f79aea464d5195ce36109ee9 | |
parent | 6efe7e2916c2391538aa41d6c2226f8c1a9cafc3 (diff) |
Text: Ignore Unicode joiners and modifiers
The fonts bundled with Lagrange currently do not have all the latest Unicode symbols, so we'll ignore the joiners and modifiers for gender and skin color.
A better option would be to fall back to system-provided text rendering, if that is available.
IssueID #81
-rw-r--r-- | src/ui/text.c | 16 | ||||
-rw-r--r-- | src/ui/text.h | 16 |
2 files changed, 28 insertions, 4 deletions
diff --git a/src/ui/text.c b/src/ui/text.c index a8be33b6..ae4b1714 100644 --- a/src/ui/text.c +++ b/src/ui/text.c | |||
@@ -665,6 +665,17 @@ static iRect run_Font_(iFont *d, enum iRunMode mode, iRangecc text, size_t maxLe | |||
665 | } | 665 | } |
666 | } | 666 | } |
667 | iChar ch = nextChar_(&chPos, text.end); | 667 | iChar ch = nextChar_(&chPos, text.end); |
668 | if (ch == 0x200d) { /* zero-width joiner */ | ||
669 | /* We don't have the composited Emojis. */ | ||
670 | if (isEmoji_Char(prevCh)) { | ||
671 | /* skip */ | ||
672 | ch = nextChar_(&chPos, text.end); | ||
673 | ch = nextChar_(&chPos, text.end); | ||
674 | } | ||
675 | else { | ||
676 | printf("it's %x\n", prevCh); | ||
677 | } | ||
678 | } | ||
668 | if (isVariationSelector_Char(ch)) { | 679 | if (isVariationSelector_Char(ch)) { |
669 | /* TODO: VS15: Should peek ahead for this and prefer the Emoji font. */ | 680 | /* TODO: VS15: Should peek ahead for this and prefer the Emoji font. */ |
670 | ch = nextChar_(&chPos, text.end); /* just ignore */ | 681 | ch = nextChar_(&chPos, text.end); /* just ignore */ |
@@ -712,6 +723,9 @@ static iRect run_Font_(iFont *d, enum iRunMode mode, iRangecc text, size_t maxLe | |||
712 | prevCh = 0; | 723 | prevCh = 0; |
713 | continue; | 724 | continue; |
714 | } | 725 | } |
726 | if (isDefaultIgnorable_Char(ch) || isFitzpatrickType_Char(ch)) { | ||
727 | continue; | ||
728 | } | ||
715 | } | 729 | } |
716 | const iGlyph *glyph = glyph_Font_(d, ch); | 730 | const iGlyph *glyph = glyph_Font_(d, ch); |
717 | int x1 = xpos; | 731 | int x1 = xpos; |
@@ -1000,7 +1014,7 @@ iString *renderBlockChars_Text(const iBlock *fontData, int height, enum iTextBlo | |||
1000 | size_t strRemain = length_String(text); | 1014 | size_t strRemain = length_String(text); |
1001 | iConstForEach(String, i, text) { | 1015 | iConstForEach(String, i, text) { |
1002 | if (!strRemain) break; | 1016 | if (!strRemain) break; |
1003 | if (i.value == variationSelectorEmoji_Char) { | 1017 | if (isVariationSelector_Char(i.value) || isDefaultIgnorable_Char(i.value)) { |
1004 | strRemain--; | 1018 | strRemain--; |
1005 | continue; | 1019 | continue; |
1006 | } | 1020 | } |
diff --git a/src/ui/text.h b/src/ui/text.h index 5bae8e2a..a0b2dc1a 100644 --- a/src/ui/text.h +++ b/src/ui/text.h | |||
@@ -114,11 +114,21 @@ enum iFontId { | |||
114 | iLocalDef iBool isJapanese_FontId(enum iFontId id) { | 114 | iLocalDef iBool isJapanese_FontId(enum iFontId id) { |
115 | return id >= defaultJapanese_FontId && id <= hugeJapanese_FontId; | 115 | return id >= defaultJapanese_FontId && id <= hugeJapanese_FontId; |
116 | } | 116 | } |
117 | iLocalDef iBool isVariationSelector_Char(iChar ch) { | 117 | iLocalDef iBool isVariationSelector_Char(iChar c) { |
118 | return ch >= 0xfe00 && ch <= 0xfe0f; | 118 | return (c >= 0xfe00 && c <= 0xfe0f) || (c >= 0xe0100 && c <= 0xe0121); |
119 | } | ||
120 | iLocalDef iBool isFitzpatrickType_Char(iChar c) { | ||
121 | return c >= 0x1f3fb && c <= 0x1f3ff; | ||
122 | } | ||
123 | iLocalDef iBool isDefaultIgnorable_Char(iChar c) { | ||
124 | return c == 0x115f || (c >= 0x200b && c <= 0x200e) || c == 0x2060 || c == 0x2061 || | ||
125 | c == 0xfeff; | ||
126 | } | ||
127 | iLocalDef iBool isEmoji_Char(iChar c) { | ||
128 | return (c >= 0x1f300 && c < 0x1f700) || (c >= 0x1f900 && c <= 0x1f9ff); | ||
119 | } | 129 | } |
120 | 130 | ||
121 | #define variationSelectorEmoji_Char ((iChar) 0xfe0f) | 131 | #define emojiVariationSelector_Char ((iChar) 0xfe0f) |
122 | 132 | ||
123 | enum iTextFont { | 133 | enum iTextFont { |
124 | nunito_TextFont, | 134 | nunito_TextFont, |