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

Alex Henrie alexhenrie24 at gmail.com
Thu May 8 11:38:24 CDT 2014


---
 dlls/gdi32/freetype.c   | 16 ++++++++++++----
 dlls/gdi32/tests/font.c | 23 +++++++++++++++++++++++
 2 files changed, 35 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..3d2c27b 100644
--- a/dlls/gdi32/tests/font.c
+++ b/dlls/gdi32/tests/font.c
@@ -4681,6 +4681,7 @@ static void test_EnumFonts(void)
     int ret;
     LOGFONTA lf;
     HDC hdc;
+    struct enum_fullname_data efnd;
 
     if (!is_truetype_font_installed("Arial"))
     {
@@ -4741,6 +4742,28 @@ 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 */
+    memset(&lf, 0, sizeof(lf));
+    lf.lfCharSet = DEFAULT_CHARSET;
+
+    memset(&efnd, 0, sizeof(efnd));
+    strcpy(lf.lfFaceName, "MS Shell Dlg");
+    ret = EnumFontFamiliesExA(hdc, &lf, enum_fullname_data_proc, (LPARAM)&efnd, 0);
+    ok(ret, "font MS Shell Dlg is not enumerated\n");
+    ret = strcmp((char*)efnd.elf[0].elfLogFont.lfFaceName, "MS Shell Dlg");
+    ok(!ret, "expected MS Shell Dlg got %s\n", efnd.elf[0].elfLogFont.lfFaceName);
+    ret = strcmp((char*)efnd.elf[0].elfFullName, "MS Shell Dlg");
+    ok(!ret, "expected MS Shell Dlg got %s\n", efnd.elf[0].elfFullName);
+
+    memset(&efnd, 0, sizeof(efnd));
+    strcpy(lf.lfFaceName, "MS Shell Dlg 2");
+    ret = EnumFontFamiliesExA(hdc, &lf, enum_fullname_data_proc, (LPARAM)&efnd, 0);
+    ok(ret, "font MS Shell Dlg 2 is not enumerated\n");
+    ret = strcmp((char*)efnd.elf[0].elfLogFont.lfFaceName, "MS Shell Dlg 2");
+    ok(!ret, "expected MS Shell Dlg 2 got %s\n", efnd.elf[0].elfLogFont.lfFaceName);
+    ret = strcmp((char*)efnd.elf[0].elfFullName, "MS Shell Dlg 2");
+    ok(!ret, "expected MS Shell Dlg 2 got %s\n", efnd.elf[0].elfFullName);
+
     DeleteDC(hdc);
 }
 
-- 
1.9.1



More information about the wine-patches mailing list