emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

master f373b52ba9 1/2: Skip virtual FcPattern entries for variable weigh


From: Eli Zaretskii
Subject: master f373b52ba9 1/2: Skip virtual FcPattern entries for variable weight fonts
Date: Wed, 12 Jan 2022 09:55:31 -0500 (EST)

branch: master
commit f373b52ba91ff9b1e04578e6c42efd2414ddf1fa
Author: Sean Whitton <spwhitton@spwhitton.name>
Commit: Eli Zaretskii <eliz@gnu.org>

    Skip virtual FcPattern entries for variable weight fonts
    
    * src/ftfont.c (ftfont_list): Pass FC_VARIABLE to FcObjectSetBuild.
    * src/ftfont.c (ftfont_pattern_entity): Skip meta/virtual FcPattern
    entries for variable weight fonts (Bug#52888).
---
 src/ftfont.c | 21 +++++++++++++++++++++
 1 file changed, 21 insertions(+)

diff --git a/src/ftfont.c b/src/ftfont.c
index 2bdcce306b..5797300d23 100644
--- a/src/ftfont.c
+++ b/src/ftfont.c
@@ -189,6 +189,24 @@ ftfont_pattern_entity (FcPattern *p, Lisp_Object extra)
     return Qnil;
   if (FcPatternGetInteger (p, FC_INDEX, 0, &idx) != FcResultMatch)
     return Qnil;
+#ifdef FC_VARIABLE
+  /* This is a virtual/meta FcPattern for a variable weight font, from
+     which it is possible to extract an FcRange value specifying the
+     minimum and maximum weights available in this file.  We don't
+     need to know that information explicitly, so skip it.  We will be
+     called with an FcPattern for each actually available, non-virtual
+     weight.
+
+     Fontconfig started generating virtual/meta patterns for variable
+     weight fonts in the same release that FC_VARIABLE was added, so
+     we conditionalize on that constant.  This also ensures that
+     FcPatternGetRange is available.  */
+  FcRange *range;
+  if (FcPatternGetRange (p, FC_WEIGHT, 0, &range) == FcResultMatch
+      && FcPatternGetBool (p, FC_VARIABLE, 0, &b) == FcResultMatch
+      && b == FcTrue)
+    return Qnil;
+#endif /* FC_VARIABLE */
 
   file = (char *) str;
   key = Fcons (build_unibyte_string (file), make_fixnum (idx));
@@ -863,6 +881,9 @@ ftfont_list (struct frame *f, Lisp_Object spec)
 #if defined HAVE_XFT && defined FC_COLOR
                              FC_COLOR,
 #endif
+#ifdef FC_VARIABLE
+                            FC_VARIABLE,
+#endif /* FC_VARIABLE */
                             NULL);
   if (! objset)
     goto err;



reply via email to

[Prev in Thread] Current Thread [Next in Thread]