]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix font selection via :family on MS-Windows
authorEli Zaretskii <eliz@gnu.org>
Sat, 13 Nov 2021 13:22:12 +0000 (15:22 +0200)
committerEli Zaretskii <eliz@gnu.org>
Sat, 13 Nov 2021 13:22:12 +0000 (15:22 +0200)
* src/font.c (font_delete_unmatched) [HAVE_NTGUI]: Allow non-exact
matches of :weight when looking for a suitable font.  (Bug#51768)

src/font.c

index f70054ea4088b755d9ed7610b5c7ca2fa39bbff5..420a4f8e70e0c747c4ddac7cca5f873b73b12b0c 100644 (file)
@@ -2759,10 +2759,31 @@ font_delete_unmatched (Lisp_Object vec, Lisp_Object spec, int size)
          continue;
        }
       for (prop = FONT_WEIGHT_INDEX; prop < FONT_SIZE_INDEX; prop++)
-       if (FIXNUMP (AREF (spec, prop))
-           && ((XFIXNUM (AREF (spec, prop)) >> 8)
-               != (XFIXNUM (AREF (entity, prop)) >> 8)))
-         prop = FONT_SPEC_MAX;
+       {
+         if (FIXNUMP (AREF (spec, prop)))
+           {
+             int required = XFIXNUM (AREF (spec, prop)) >> 8;
+             int candidate = XFIXNUM (AREF (entity, prop)) >> 8;
+
+             if (candidate != required
+#ifdef HAVE_NTGUI
+                 /* A kludge for w32 font search, where listing a
+                    family returns only 4 standard weights: regular,
+                    italic, bold, bold-italic.  For other values one
+                    must specify the font, not just the family in the
+                    :family attribute of the face.  But specifying
+                    :family in the face attributes looks for regular
+                    weight, so if we require exact match, the
+                    non-regular font will be rejected.  So we relax
+                    the accuracy of the match here, and let
+                    font_sort_entities find the best match.  */
+                 && (prop != FONT_WEIGHT_INDEX
+                     || eabs (candidate - required) > 100)
+#endif
+                 )
+               prop = FONT_SPEC_MAX;
+           }
+       }
       if (prop < FONT_SPEC_MAX
          && size
          && XFIXNUM (AREF (entity, FONT_SIZE_INDEX)) > 0)