summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPo Lu <luangruo@yahoo.com>2022-05-19 20:10:19 +0800
committerPo Lu <luangruo@yahoo.com>2022-05-19 20:10:19 +0800
commitc15430997679fced7ef6adc23cbc59d0cfa3d625 (patch)
tree43b014a1790c32856e815d5d516b050a442aade7
parent0a4d9f26ee9b24ecf0a8b1fb14d4b4bab5daa3ae (diff)
downloademacs-c15430997679fced7ef6adc23cbc59d0cfa3d625.tar.gz
Whitelist some incorrectly labeled "color" fonts under Xft
* etc/PROBLEMS: Document problem with fonts incorrectly labeled as color fonts under Xft. * src/ftfont.c (xft_color_font_whitelisted_p): New function. (ftfont_spec_pattern, ftfont_list): Respect whitelisting of "color" fonts under Xft. * src/xftfont.c (syms_of_xftfont): New variable `xft-color-font-whitelist'.
-rw-r--r--etc/PROBLEMS16
-rw-r--r--src/ftfont.c30
-rw-r--r--src/xftfont.c9
3 files changed, 54 insertions, 1 deletions
diff --git a/etc/PROBLEMS b/etc/PROBLEMS
index 3e0b73a4d59..4224171298e 100644
--- a/etc/PROBLEMS
+++ b/etc/PROBLEMS
@@ -805,6 +805,22 @@ to take advantage of.
* Runtime problems related to font handling
+** Some fonts are detected but not usable under Xft.
+
+Some fonts might not be usable under Emacs even though they show up in
+the font family list when Emacs is built with Xft. This is because
+Emacs prevents fonts that have color glyphs (such as color Emoji) from
+being used, since they typically cause Xft crashes.
+
+On some GNU/Linux systems, fonts (such as Source Code Pro) that do not
+have color glyphs are reported as color fonts, causing them to be
+unavailable when using Xft. This is known to happen under Fedora
+GNU/Linux 36 or later, and possibly other distributions as well.
+
+If you encounter a such a font, you can enable it while ignoring other
+fonts that actually have color glyphs by adding its family name to the
+list `xft-color-font-whitelist'.
+
** Characters are displayed as empty boxes or with wrong font under X.
*** This may be due to your local fontconfig customization.
diff --git a/src/ftfont.c b/src/ftfont.c
index 5797300d231..301a145b7ac 100644
--- a/src/ftfont.c
+++ b/src/ftfont.c
@@ -645,8 +645,29 @@ ftfont_get_open_type_spec (Lisp_Object otf_spec)
return spec;
}
+#if defined HAVE_XFT && defined FC_COLOR
+static bool
+xft_color_font_whitelisted_p (const char *family)
+{
+ Lisp_Object tem, name;
+
+ tem = Vxft_color_font_whitelist;
+
+ FOR_EACH_TAIL_SAFE (tem)
+ {
+ name = XCAR (tem);
+
+ if (STRINGP (name) && !strcmp (family, SSDATA (name)))
+ return true;
+ }
+
+ return false;
+}
+#endif
+
static FcPattern *
-ftfont_spec_pattern (Lisp_Object spec, char *otlayout, struct OpenTypeSpec **otspec, const char **langname)
+ftfont_spec_pattern (Lisp_Object spec, char *otlayout,
+ struct OpenTypeSpec **otspec, const char **langname)
{
Lisp_Object tmp, extra;
FcPattern *pattern = NULL;
@@ -785,6 +806,8 @@ ftfont_spec_pattern (Lisp_Object spec, char *otlayout, struct OpenTypeSpec **ots
/* We really don't like color fonts, they cause Xft crashes. See
Bug#30874. */
if (xft_ignore_color_fonts
+ && (NILP (AREF (spec, FONT_FAMILY_INDEX))
+ || NILP (Vxft_color_font_whitelist))
&& ! FcPatternAddBool (pattern, FC_COLOR, FcFalse))
goto err;
#endif
@@ -930,7 +953,12 @@ ftfont_list (struct frame *f, Lisp_Object spec)
returns them even when it shouldn't really do so, so we
need to manually skip them here (Bug#37786). */
FcBool b;
+ FcChar8 *str;
+
if (xft_ignore_color_fonts
+ && (FcPatternGetString (fontset->fonts[i], FC_FAMILY,
+ 0, &str) != FcResultMatch
+ || !xft_color_font_whitelisted_p ((char *) str))
&& FcPatternGetBool (fontset->fonts[i], FC_COLOR, 0, &b)
== FcResultMatch && b != FcFalse)
continue;
diff --git a/src/xftfont.c b/src/xftfont.c
index 31fb877c35b..6043ef9f94f 100644
--- a/src/xftfont.c
+++ b/src/xftfont.c
@@ -797,6 +797,15 @@ syms_of_xftfont (void)
This is needed with some fonts to correct vertical overlap of glyphs. */);
xft_font_ascent_descent_override = 0;
+ DEFVAR_LISP ("xft-color-font-whitelist", Vxft_color_font_whitelist,
+ doc: /* List of "color" font families that don't actually have color glyphs.
+Some fonts (such as Source Code Pro) are reported as color fonts, but
+do not actually have glyphs with colors that can cause Xft crashes.
+
+The font families in this list will not be ignored when
+`xft-ignore-color-fonts' is non-nil. */);
+ Vxft_color_font_whitelist = list1 (build_pure_c_string ("Source Code Pro"));
+
pdumper_do_now_and_after_load (syms_of_xftfont_for_pdumper);
}