EnumFont16 fix

Huw D M Davies h.davies1 at physics.ox.ac.uk
Wed Nov 27 11:37:58 CST 2002


        EnumFont16 should enumerate gdi fonts too.
-------------- next part --------------
Index: objects/font.c
===================================================================
RCS file: /home/wine/wine/objects/font.c,v
retrieving revision 1.93
diff -u -r1.93 font.c
--- objects/font.c	25 Nov 2002 21:09:49 -0000	1.93
+++ objects/font.c	26 Nov 2002 20:11:51 -0000
@@ -71,6 +71,7 @@
   LPENUMLOGFONTEX16     lpLogFont;
   SEGPTR                segTextMetric;
   SEGPTR                segLogFont;
+  DWORD                 dwFlags;
   HDC                   hdc;
   DC                   *dc;
   PHYSDEV               physDev;
@@ -524,6 +525,7 @@
     {
         FONT_EnumLogFontExWTo16(plf, pfe->lpLogFont);
 	FONT_NewTextMetricExWTo16(ptm, pfe->lpTextMetric);
+        pfe->dwFlags |= ENUM_CALLED;
         GDI_ReleaseObj( pfe->hdc );  /* release the GDI lock */
 
         ret = FONT_CallTo16_word_llwl( pfe->lpEnumFunc, pfe->segLogFont, pfe->segTextMetric,
@@ -590,36 +592,49 @@
                                    DWORD dwFlags)
 {
     fontEnum16 fe16;
-    INT16	retVal = 0;
+    INT16	ret = 1, ret2;
     DC* 	dc = DC_GetDCPtr( HDC_32(hDC) );
+    NEWTEXTMETRICEX16 tm16;
+    ENUMLOGFONTEX16 lf16;
+    LOGFONTW lfW;
+    BOOL enum_gdi_fonts;
 
     if (!dc) return 0;
+    FONT_LogFont16ToW(plf, &lfW);
+
     fe16.hdc = HDC_32(hDC);
     fe16.dc = dc;
     fe16.physDev = dc->physDev;
+    fe16.lpLogFontParam = plf;
+    fe16.lpEnumFunc = efproc;
+    fe16.lpData = lParam;
+    fe16.lpTextMetric = &tm16;
+    fe16.lpLogFont = &lf16;
+    fe16.segTextMetric = MapLS( &tm16 );
+    fe16.segLogFont = MapLS( &lf16 );
+    fe16.dwFlags = 0;
+
+    enum_gdi_fonts = GetDeviceCaps16(hDC, TEXTCAPS) & TC_VA_ABLE;
 
-    if (dc->funcs->pEnumDeviceFonts)
+    if (!dc->funcs->pEnumDeviceFonts && !enum_gdi_fonts)
     {
-        NEWTEXTMETRICEX16 tm16;
-        ENUMLOGFONTEX16 lf16;
-        LOGFONTW lfW;
-        FONT_LogFont16ToW(plf, &lfW);
-
-        fe16.lpLogFontParam = plf;
-        fe16.lpEnumFunc = efproc;
-        fe16.lpData = lParam;
-        fe16.lpTextMetric = &tm16;
-        fe16.lpLogFont = &lf16;
-        fe16.segTextMetric = MapLS( &tm16 );
-        fe16.segLogFont = MapLS( &lf16 );
-
-        retVal = dc->funcs->pEnumDeviceFonts( dc->physDev, &lfW,
-                                              FONT_EnumInstance16, (LPARAM)&fe16 );
-        UnMapLS( fe16.segTextMetric );
-        UnMapLS( fe16.segLogFont );
+        ret = 0;
+        goto done;
     }
+
+    if (enum_gdi_fonts)
+        ret = WineEngEnumFonts( &lfW, FONT_EnumInstance16, (LPARAM)&fe16 );
+    fe16.dwFlags &= ~ENUM_CALLED;
+    if (ret && dc->funcs->pEnumDeviceFonts) {
+	ret2 = dc->funcs->pEnumDeviceFonts( dc->physDev, &lfW, FONT_EnumInstance16, (LPARAM)&fe16 );
+	if(fe16.dwFlags & ENUM_CALLED) /* update ret iff a font gets enumed */
+	    ret = ret2;
+    }
+done:
+    UnMapLS( fe16.segTextMetric );
+    UnMapLS( fe16.segLogFont );
     if (fe16.hdc) GDI_ReleaseObj( fe16.hdc );
-    return retVal;
+    return ret;
 }
 
 /***********************************************************************


More information about the wine-patches mailing list