diff options
author | Po Lu <luangruo@yahoo.com> | 2022-05-19 20:10:19 +0800 |
---|---|---|
committer | Po Lu <luangruo@yahoo.com> | 2022-05-19 20:10:19 +0800 |
commit | c15430997679fced7ef6adc23cbc59d0cfa3d625 (patch) | |
tree | 43b014a1790c32856e815d5d516b050a442aade7 /src/ftfont.c | |
parent | 0a4d9f26ee9b24ecf0a8b1fb14d4b4bab5daa3ae (diff) | |
download | emacs-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'.
Diffstat (limited to 'src/ftfont.c')
-rw-r--r-- | src/ftfont.c | 30 |
1 files changed, 29 insertions, 1 deletions
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; |