[PATCH 2/2] gdi32: Enumerate one charset per font for EnumFontFamilies.

Myah Caron qsniyg at protonmail.com
Fri Jul 24 07:31:53 CDT 2020


Wine-bug: https://bugs.winehq.org/show_bug.cgi?id=47726
Signed-off-by: Myah Caron <qsniyg at protonmail.com>
---
 dlls/gdi32/font.c       | 32 ++++++++++++++++++++++++--------
 dlls/gdi32/tests/font.c |  2 +-
 2 files changed, 25 insertions(+), 9 deletions(-)

diff --git a/dlls/gdi32/font.c b/dlls/gdi32/font.c
index e099bec5e8..395141e575 100644
--- a/dlls/gdi32/font.c
+++ b/dlls/gdi32/font.c
@@ -117,6 +117,8 @@ struct font_enum
   FONTENUMPROCW       lpEnumFunc;
   LPARAM              lpData;
   BOOL                unicode;
+  BOOL                singleCharset;
+  WCHAR               lastFaceName[LF_FACESIZE];
   HDC                 hdc;
   INT                 retval;
 };
@@ -927,6 +929,14 @@ static INT CALLBACK FONT_EnumInstance( const LOGFONTW *plf, const TEXTMETRICW *p
         ENUMLOGFONTEXA logfont;
         NEWTEXTMETRICEXA tmA;

+        if (pfe->singleCharset) {
+            if (!strncmpW(plf->lfFaceName, pfe->lastFaceName, LF_FACESIZE)) {
+                return ret;
+            }
+
+            lstrcpynW(pfe->lastFaceName, plf->lfFaceName, LF_FACESIZE);
+        }
+
         if (!pfe->unicode)
         {
             FONT_EnumLogFontExWToA( (const ENUMLOGFONTEXW *)plf, &logfont);
@@ -944,7 +954,7 @@ static INT CALLBACK FONT_EnumInstance( const LOGFONTW *plf, const TEXTMETRICW *p
  *		FONT_EnumFontFamiliesEx
  */
 static INT FONT_EnumFontFamiliesEx( HDC hDC, LPLOGFONTW plf, FONTENUMPROCW efproc,
-                                    LPARAM lParam, BOOL unicode )
+                                    LPARAM lParam, BOOL unicode, BOOL singleCharset )
 {
     INT ret = 0;
     DC *dc = get_dc_ptr( hDC );
@@ -959,6 +969,8 @@ static INT FONT_EnumFontFamiliesEx( HDC hDC, LPLOGFONTW plf, FONTENUMPROCW efpro
         fe.lpEnumFunc = efproc;
         fe.lpData = lParam;
         fe.unicode = unicode;
+        fe.lastFaceName[0] = 0;
+        fe.singleCharset = singleCharset;
         fe.hdc = hDC;
         fe.retval = 1;
         ret = physdev->funcs->pEnumFonts( physdev, plf, FONT_EnumInstance, (LPARAM)&fe );
@@ -974,7 +986,7 @@ INT WINAPI EnumFontFamiliesExW( HDC hDC, LPLOGFONTW plf,
                                     FONTENUMPROCW efproc,
                                     LPARAM lParam, DWORD dwFlags )
 {
-    return FONT_EnumFontFamiliesEx( hDC, plf, efproc, lParam, TRUE );
+    return FONT_EnumFontFamiliesEx( hDC, plf, efproc, lParam, TRUE, FALSE );
 }

 /***********************************************************************
@@ -993,7 +1005,7 @@ INT WINAPI EnumFontFamiliesExA( HDC hDC, LPLOGFONTA plf,
     }
     else plfW = NULL;

-    return FONT_EnumFontFamiliesEx( hDC, plfW, (FONTENUMPROCW)efproc, lParam, FALSE );
+    return FONT_EnumFontFamiliesEx( hDC, plfW, (FONTENUMPROCW)efproc, lParam, FALSE, FALSE );
 }

 /***********************************************************************
@@ -1003,6 +1015,7 @@ INT WINAPI EnumFontFamiliesA( HDC hDC, LPCSTR lpFamily,
                                   FONTENUMPROCA efproc, LPARAM lpData )
 {
     LOGFONTA lf, *plf;
+    LOGFONTW lfW, *plfW;

     if (lpFamily)
     {
@@ -1011,10 +1024,13 @@ INT WINAPI EnumFontFamiliesA( HDC hDC, LPCSTR lpFamily,
         lf.lfCharSet = DEFAULT_CHARSET;
         lf.lfPitchAndFamily = 0;
         plf = &lf;
+
+        FONT_LogFontAToW( plf, &lfW );
+        plfW = &lfW;
     }
-    else plf = NULL;
+    else plfW = NULL;

-    return EnumFontFamiliesExA( hDC, plf, efproc, lpData, 0 );
+    return FONT_EnumFontFamiliesEx( hDC, plfW, (FONTENUMPROCW)efproc, lpData, FALSE, TRUE );
 }

 /***********************************************************************
@@ -1035,7 +1051,7 @@ INT WINAPI EnumFontFamiliesW( HDC hDC, LPCWSTR lpFamily,
     }
     else plf = NULL;

-    return EnumFontFamiliesExW( hDC, plf, efproc, lpData, 0 );
+    return FONT_EnumFontFamiliesEx( hDC, plf, efproc, lpData, TRUE, TRUE );
 }

 /***********************************************************************
@@ -2207,8 +2223,8 @@ static inline int get_line_width( DC *dc, int metric_size )
  *           ExtTextOutW    (GDI32.@)
  *
  * Draws text using the currently selected font, background color, and text color.
- *
- *
+ *
+ *
  * PARAMS
  *    x,y    [I] coordinates of string
  *    flags  [I]
diff --git a/dlls/gdi32/tests/font.c b/dlls/gdi32/tests/font.c
index 9949abdfe4..5f6bf4d6e6 100644
--- a/dlls/gdi32/tests/font.c
+++ b/dlls/gdi32/tests/font.c
@@ -2907,7 +2907,7 @@ static void test_EnumFontFamilies(const char *font_name, INT font_charset)
             /* EnumFontFamilies should only enumerate a single charset (the first one found) for a font face */
             for (i = 1; i < efdw.total; i++) {
                 ret = lstrcmpW(efdw.lf[i - 1].lfFaceName, efdw.lf[i].lfFaceName);
-                todo_wine ok(ret != 0, "old font family (%s) == new font family(%s)\n",
+                ok(ret != 0, "old font family (%s) == new font family(%s)\n",
                    wine_dbgstr_w(efdw.lf[i - 1].lfFaceName), wine_dbgstr_w(efdw.lf[i].lfFaceName));
             }
         }
--
2.27.0





More information about the wine-devel mailing list