From: Robert Pluim <rpluim@gmail.com>
To: Eli Zaretskii <eliz@gnu.org>
Cc: 63731@debbugs.gnu.org, steven@stebalien.com
Subject: bug#63731: [PATCH] Support Emoji Variation Sequence 16 (FE0F) where appropriate
Date: Mon, 05 Jun 2023 15:36:52 +0200 [thread overview]
Message-ID: <87wn0ihvyj.fsf@gmail.com> (raw)
In-Reply-To: <83fs763vez.fsf@gnu.org> (Eli Zaretskii's message of "Mon, 05 Jun 2023 16:12:20 +0300")
>>>>> On Mon, 05 Jun 2023 16:12:20 +0300, Eli Zaretskii <eliz@gnu.org> said:
>> From: Robert Pluim <rpluim@gmail.com>
>> Cc: 63731@debbugs.gnu.org, steven@stebalien.com
>> Date: Mon, 05 Jun 2023 15:08:08 +0200
>>
>> >>>>> On Sat, 03 Jun 2023 08:36:59 +0300, Eli Zaretskii <eliz@gnu.org> said:
>>
>> >> Sequence Font Result
>> >> 23e9 fe0e system black box
>> >> 23e9 fe0e Symbola correct text representation
>> >> 23e9 fe0e NotoEmoji correct text representation
>> >> 23e9 fe0e NotoColorEmoji blank
>> >>
>> >> And on emacs-29, Symbola and NotoEmoji compose that sequence
>> >> correctly. Now I just need to persuade emacs-30 to use one of them.
>>
Eli> So you are saying that, in our default fontset, we should specify that
Eli> #xFE0E should be displayed by Noto Emoji (with Symbola as fallback),
Eli> and then make sure that font_range uses the same font for the likes of
Eli> #x23E9? IOW, specify a different font for VS-15 even though is script
Eli> is 'emoji'?
>>
>> Yes, that works (and we can remove VS-15 and VS-16 from the emoji
>> script, so that theyʼll then be displayed via
>> `glyphless-char-display-control' when theyʼre on their own).
Eli> What about the rest of VS-nn? do they need to stay in 'emoji' script,
Eli> and if so, why?
They were never in the 'emoji' script anyway.
>> Thanks for the suggestion Eli, I was looking at it from the wrong
>> direction.
Eli> You are the one who did most of the footwork, so kudos to you.
Eli> This is simple enough to install on emacs-29, I think?
The main change is in font.c, and looks like this. I think itʼs too
big for emacs-29 (breaking composition is very easy, itʼs entirely
possible Iʼve missed a few cases :-) )
diff --git a/src/font.c b/src/font.c
index e586277a5d3..30b088c818e 100644
--- a/src/font.c
+++ b/src/font.c
@@ -3633,10 +3633,14 @@ font_at (int c, ptrdiff_t pos, struct face *face, struct window *w,
/* Check if CH is a codepoint for which we should attempt to use the
emoji font, even if the codepoint itself has Emoji_Presentation =
No. Vauto_composition_emoji_eligible_codepoints is filled in for
- us by admin/unidata/emoji-zwj.awk. */
+ us by admin/unidata/emoji-zwj.awk. We also check if there's a
+ VS-15 or VS-16 following CH, and select text/emoji presentation
+ respectively if so. */
static bool
-codepoint_is_emoji_eligible (int ch)
+codepoint_is_font_change_eligible (int ch, int next_c)
{
+ if (next_c == 0xFE0E || next_c == 0xFE0F)
+ return true;
if (EQ (CHAR_TABLE_REF (Vchar_script_table, ch), Qemoji))
return true;
@@ -3690,21 +3694,43 @@ font_range (ptrdiff_t pos, ptrdiff_t pos_byte, ptrdiff_t *limit,
}
face = FACE_FROM_ID (f, face_id);
}
-
- /* If the composition was triggered by an emoji, use a character
- from 'script-representative-chars', rather than the first
- character in the string, to determine the font to use. */
- if (codepoint_is_emoji_eligible (ch))
+ int next_c = 0;
+ {
+ ptrdiff_t p = pos;
+ ptrdiff_t p_b = pos_byte;
+ int c;
+ c = (NILP (string)
+ ? fetch_char_advance_no_check (&p, &p_b)
+ : fetch_string_char_advance_no_check (string, &p, &p_b));
+ if (p < *limit)
+ {
+ c = (NILP (string)
+ ? fetch_char_advance_no_check (&p, &p_b)
+ : fetch_string_char_advance_no_check (string, &p, &p_b));
+ next_c = c;
+ }
+ }
+ if (codepoint_is_font_change_eligible (ch, next_c))
{
- Lisp_Object val = assq_no_quit (Qemoji, Vscript_representative_chars);
- if (CONSP (val))
+ if (next_c == 0xFE0E)
{
- val = XCDR (val);
+ font_object = font_for_char (face, 0xFE0E, pos, string);
+ }
+ else
+ {
+ /* If the composition was triggered by an emoji, use a character
+ from 'script-representative-chars', rather than the first
+ character in the string, to determine the font to use. */
+ Lisp_Object val = assq_no_quit (Qemoji, Vscript_representative_chars);
if (CONSP (val))
- val = XCAR (val);
- else if (VECTORP (val))
- val = AREF (val, 0);
- font_object = font_for_char (face, XFIXNAT (val), pos, string);
+ {
+ val = XCDR (val);
+ if (CONSP (val))
+ val = XCAR (val);
+ else if (VECTORP (val))
+ val = AREF (val, 0);
+ font_object = font_for_char (face, XFIXNAT (val), pos, string);
+ }
}
}
Robert
--
next prev parent reply other threads:[~2023-06-05 13:36 UTC|newest]
Thread overview: 61+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-05-26 3:18 bug#63731: [PATCH] Support Emoji Variation Sequence 16 (FE0F) where appropriate Steven Allen
2023-05-26 6:41 ` Eli Zaretskii
2023-05-26 8:34 ` Robert Pluim
2023-05-26 8:46 ` Eli Zaretskii
2023-05-26 11:14 ` Robert Pluim
2023-05-26 12:06 ` Eli Zaretskii
2023-05-26 14:02 ` Robert Pluim
2023-05-26 14:55 ` Eli Zaretskii
2023-05-26 15:25 ` Robert Pluim
2023-05-26 15:52 ` Eli Zaretskii
2023-05-26 16:24 ` Robert Pluim
2023-05-26 17:27 ` Eli Zaretskii
2023-05-26 17:35 ` Robert Pluim
2023-05-26 18:05 ` Eli Zaretskii
2023-05-28 11:43 ` Robert Pluim
2023-05-28 12:44 ` Eli Zaretskii
2023-05-26 17:43 ` Eli Zaretskii
2023-05-28 10:29 ` Robert Pluim
2023-05-28 12:37 ` Eli Zaretskii
2023-05-28 11:57 ` Robert Pluim
2023-05-28 12:47 ` Eli Zaretskii
2023-05-29 10:44 ` Robert Pluim
2023-05-29 13:58 ` Eli Zaretskii
2023-05-29 14:43 ` Robert Pluim
2023-05-29 14:55 ` Eli Zaretskii
2023-05-29 16:13 ` Robert Pluim
2023-05-29 17:18 ` Eli Zaretskii
2023-05-30 7:25 ` Robert Pluim
2023-05-30 12:10 ` Eli Zaretskii
2023-05-30 13:30 ` Robert Pluim
2023-05-30 16:32 ` Eli Zaretskii
2023-05-31 16:11 ` Robert Pluim
2023-05-31 16:18 ` Eli Zaretskii
2023-06-01 12:43 ` Eli Zaretskii
2023-06-01 13:30 ` Robert Pluim
2023-06-01 16:10 ` Eli Zaretskii
2023-06-01 16:34 ` Robert Pluim
2023-06-02 8:15 ` Robert Pluim
2023-06-02 12:06 ` Eli Zaretskii
2023-06-02 12:25 ` Robert Pluim
2023-06-02 12:58 ` Eli Zaretskii
2023-06-02 13:58 ` Robert Pluim
2023-06-03 5:36 ` Eli Zaretskii
2023-06-05 13:08 ` Robert Pluim
2023-06-05 13:12 ` Eli Zaretskii
2023-06-05 13:31 ` Eli Zaretskii
2023-06-05 14:06 ` Robert Pluim
2023-06-05 13:36 ` Robert Pluim [this message]
2023-06-05 13:47 ` Eli Zaretskii
2023-06-05 14:27 ` Robert Pluim
2023-06-05 15:35 ` Eli Zaretskii
2023-06-05 15:57 ` Robert Pluim
2023-06-05 16:20 ` Robert Pluim
2023-06-05 16:41 ` Eli Zaretskii
2023-06-06 7:24 ` Robert Pluim
2023-06-05 16:39 ` Eli Zaretskii
2023-06-06 7:28 ` Robert Pluim
2023-06-06 11:53 ` Eli Zaretskii
2023-05-26 15:06 ` Steven Allen
2023-05-26 15:29 ` Robert Pluim
2023-05-26 16:03 ` Steven Allen
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://www.gnu.org/software/emacs/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87wn0ihvyj.fsf@gmail.com \
--to=rpluim@gmail.com \
--cc=63731@debbugs.gnu.org \
--cc=eliz@gnu.org \
--cc=steven@stebalien.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/emacs.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).