From 4747fe3072c6fca0385203cef9b6e2661badaaba Mon Sep 17 00:00:00 2001 From: Sean Whitton Date: Tue, 4 Jan 2022 19:07:29 -0700 Subject: [PATCH] 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 | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/ftfont.c b/src/ftfont.c index cf592759ab..73276fdc86 100644 --- a/src/ftfont.c +++ b/src/ftfont.c @@ -184,11 +184,22 @@ ftfont_pattern_entity (FcPattern *p, Lisp_Object extra) int numeric; double dbl; FcBool b; + FcRange *range; if (FcPatternGetString (p, FC_FILE, 0, &str) != FcResultMatch) return Qnil; if (FcPatternGetInteger (p, FC_INDEX, 0, &idx) != FcResultMatch) return Qnil; + if (FcPatternGetRange (p, FC_WEIGHT, 0, &range) == FcResultMatch + && FcPatternGetBool (p, FC_VARIABLE, 0, &b) == FcResultMatch + && b == FcTrue) + /* 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. */ + return Qnil; file = (char *) str; key = Fcons (build_unibyte_string (file), make_fixnum (idx)); @@ -853,7 +864,7 @@ ftfont_list (struct frame *f, Lisp_Object spec) adstyle = Qnil; objset = FcObjectSetBuild (FC_FOUNDRY, FC_FAMILY, FC_WEIGHT, FC_SLANT, FC_WIDTH, FC_PIXEL_SIZE, FC_SPACING, FC_SCALABLE, - FC_STYLE, FC_FILE, FC_INDEX, + FC_STYLE, FC_FILE, FC_INDEX, FC_VARIABLE, #ifdef FC_CAPABILITY FC_CAPABILITY, #endif /* FC_CAPABILITY */ -- 2.30.2