[PATCH] gdi32: Report unsubstituted font face names. (try 3)

Alex Henrie alexhenrie24 at gmail.com
Wed May 7 20:14:56 CDT 2014


---
 dlls/gdi32/freetype.c   | 16 ++++++++++++----
 dlls/gdi32/tests/font.c | 13 +++++++++++++
 2 files changed, 25 insertions(+), 4 deletions(-)

diff --git a/dlls/gdi32/freetype.c b/dlls/gdi32/freetype.c
index fae9ffe..e497113 100644
--- a/dlls/gdi32/freetype.c
+++ b/dlls/gdi32/freetype.c
@@ -5731,7 +5731,7 @@ static BOOL face_matches(const WCHAR *family_name, Face *face, const WCHAR *face
 }
 
 static BOOL enum_face_charsets(const Family *family, Face *face, struct enum_charset_list *list,
-                               FONTENUMPROCW proc, LPARAM lparam)
+                               WCHAR *unsubstituted_face_name, FONTENUMPROCW proc, LPARAM lparam)
 {
     ENUMLOGFONTEXW elf;
     NEWTEXTMETRICEXW ntm;
@@ -5756,8 +5756,14 @@ static BOOL enum_face_charsets(const Family *family, Face *face, struct enum_cha
             if (!elf.elfScript[0])
                 FIXME("Unknown elfscript for bit %d\n", ffs(list->element[i].mask) - 1);
         }
+        /* Make sure that MS Shell Dlg says "MS Shell Dlg" and not "Tahoma" */
+        if (unsubstituted_face_name)
+        {
+            lstrcpynW(elf.elfLogFont.lfFaceName, unsubstituted_face_name, LF_FACESIZE);
+            lstrcpynW(elf.elfFullName, unsubstituted_face_name, LF_FULLFACESIZE);
+        }
         /* Font Replacement */
-        if (family != face->family)
+        else if (family != face->family)
         {
             strcpyW(elf.elfLogFont.lfFaceName, family->FamilyName);
             if (face->FullName)
@@ -5806,12 +5812,14 @@ static BOOL freetype_EnumFonts( PHYSDEV dev, LPLOGFONTW plf, FONTENUMPROCW proc,
     EnterCriticalSection( &freetype_cs );
     if(plf->lfFaceName[0]) {
         WCHAR *face_name = plf->lfFaceName;
+        WCHAR *unsubstituted_face_name = NULL;
         FontSubst *psub = get_font_subst(&font_subst_list, plf->lfFaceName, plf->lfCharSet);
 
         if(psub) {
             TRACE("substituting %s -> %s\n", debugstr_w(plf->lfFaceName),
                   debugstr_w(psub->to.name));
             face_name = psub->to.name;
+            unsubstituted_face_name = plf->lfFaceName;
         }
 
         LIST_FOR_EACH_ENTRY( family, &font_list, Family, entry ) {
@@ -5819,14 +5827,14 @@ static BOOL freetype_EnumFonts( PHYSDEV dev, LPLOGFONTW plf, FONTENUMPROCW proc,
             face_list = get_face_list_from_family(family);
             LIST_FOR_EACH_ENTRY( face, face_list, Face, entry ) {
                 if (!face_matches(family->FamilyName, face, face_name)) continue;
-                if (!enum_face_charsets(family, face, &enum_charsets, proc, lparam)) return FALSE;
+                if (!enum_face_charsets(family, face, &enum_charsets, unsubstituted_face_name, proc, lparam)) return FALSE;
 	    }
 	}
     } else {
         LIST_FOR_EACH_ENTRY( family, &font_list, Family, entry ) {
             face_list = get_face_list_from_family(family);
             face = LIST_ENTRY(list_head(face_list), Face, entry);
-            if (!enum_face_charsets(family, face, &enum_charsets, proc, lparam)) return FALSE;
+            if (!enum_face_charsets(family, face, &enum_charsets, NULL, proc, lparam)) return FALSE;
 	}
     }
     LeaveCriticalSection( &freetype_cs );
diff --git a/dlls/gdi32/tests/font.c b/dlls/gdi32/tests/font.c
index 255771a..c6f9122 100644
--- a/dlls/gdi32/tests/font.c
+++ b/dlls/gdi32/tests/font.c
@@ -4741,6 +4741,17 @@ static void test_EnumFonts(void)
     ret = EnumFontFamiliesA(hdc, NULL, enum_all_fonts_proc, (LPARAM)&lf);
     ok(ret, "font Arial Italic Bold should not be enumerated\n");
 
+    /* MS Shell Dlg and MS Shell Dlg 2 must exist */
+    ret = EnumFontFamiliesA(hdc, "MS Shell Dlg", enum_fonts_proc, (LPARAM)&lf);
+    ok(!ret, "font MS Shell Dlg is not enumerated\n");
+    ret = strcmp(lf.lfFaceName, "MS Shell Dlg");
+    ok(!ret, "expected MS Shell Dlg got %s\n", lf.lfFaceName);
+
+    ret = EnumFontFamiliesA(hdc, "MS Shell Dlg 2", enum_fonts_proc, (LPARAM)&lf);
+    ok(!ret, "font MS Shell Dlg 2 is not enumerated\n");
+    ret = strcmp(lf.lfFaceName, "MS Shell Dlg 2");
+    ok(!ret, "expected MS Shell Dlg 2 got %s\n", lf.lfFaceName);
+
     DeleteDC(hdc);
 }
 
@@ -6031,6 +6042,8 @@ START_TEST(font)
      * I'd like to avoid them in this test.
      */
     test_EnumFontFamilies("Arial Black", ANSI_CHARSET);
+    test_EnumFontFamilies("MS Shell Dlg", ANSI_CHARSET);
+    test_EnumFontFamilies("MS Shell Dlg 2", ANSI_CHARSET);
     test_EnumFontFamilies("Symbol", SYMBOL_CHARSET);
     if (is_truetype_font_installed("Arial Black") &&
         (is_truetype_font_installed("Symbol") || is_truetype_font_installed("Wingdings")))
-- 
1.9.1



More information about the wine-patches mailing list