(logfonts_match): Don't check adstyle here.
authorJason Rumney <jasonr@gnu.org>
Thu, 20 Dec 2007 14:28:53 +0000 (14:28 +0000)
committerJason Rumney <jasonr@gnu.org>
Thu, 20 Dec 2007 14:28:53 +0000 (14:28 +0000)
(font_matches_spec): Check here against physical font instead.
(add_font_entity_to_list): Avoid some substitutions.

src/w32font.c

index 64ecaf2..d8ef31a 100644 (file)
@@ -853,10 +853,6 @@ logfonts_match (font, pattern)
           || font->lfWeight > (pattern->lfWeight + 150)))
       return 0;
 
-  if (pattern->lfPitchAndFamily & 0xF0 != FF_DONTCARE
-      && pattern->lfPitchAndFamily & 0xF0 != font->lfPitchAndFamily & 0xF0)
-    return 0;
-
   /* Charset and face should be OK.  Italic has to be checked
      against the original spec, in case we don't have any preference.  */
   return 1;
@@ -881,6 +877,16 @@ font_matches_spec (type, font, spec)
         return 0;
     }
 
+  /* Check adstyle against generic family.  */
+  val = AREF (spec, FONT_ADSTYLE_INDEX);
+  if (!NILP (val))
+    {
+      BYTE family = w32_generic_family (val);
+      if (family != FF_DONTCARE
+          && family != (font->ntmTm.tmPitchAndFamily & 0xF0))
+        return 0;
+    }
+
   /* Check extra parameters.  */
   for (extra = AREF (spec, FONT_EXTRA_INDEX);
        CONSP (extra); extra = XCDR (extra))
@@ -1021,7 +1027,17 @@ add_font_entity_to_list (logical_font, physical_font, font_type, lParam)
        || (physical_font->ntmTm.ntmFlags & NTMFLAGS_OPENTYPE))
       && logfonts_match (&logical_font->elfLogFont, &match_data->pattern)
       && font_matches_spec (font_type, physical_font,
-                            match_data->orig_font_spec))
+                            match_data->orig_font_spec)
+      /* Avoid substitutions involving raster fonts (eg Helv -> MS Sans Serif)
+         We limit this to raster fonts, because the test can catch some
+         genuine fonts (eg the full name of DejaVu Sans Mono Light is actually
+         DejaVu Sans Mono ExtraLight). Helvetica -> Arial substitution will
+         therefore get through this test.  Since full names can be prefixed
+         by a foundry, we accept raster fonts if the font name is found
+         anywhere within the full name.  */
+      && (logical_font->elfLogFont.lfOutPrecision != OUT_STRING_PRECIS
+          || strstr (logical_font->elfFullName,
+                     logical_font->elfLogFont.lfFaceName)))
     {
       Lisp_Object entity
         = w32_enumfont_pattern_entity (match_data->frame, logical_font,