PATCH: [Bug 19] - font enumeration problems for aliased gdi fonts

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This patch fixes the "Invalid Property Value" message box that pops up 
in older visual basic programs on startup when they try to call 
ENUMFONTS on the default "MS Sans Serif" font for example.

(reference: http://www.winehq.com/hypermail/wine-bugs/2002/05/0116.html)

License: LGPL, X11

Changelog:
     Rafael Kitover <caelum@debian.org>
     Fix ENUMFONTS on aliased gdi fonts

-- 
plur
Name: Bug19_FontEnumAliasFix
ChangeLog: fixes bug #19, "invalid property" error from visual basic programs that try to call ENUMFONTS on fonts like MS Sans Serif, which now works if the font is aliased using properties like DefaultSansSerif
GenDate: 2002/07/23 19:42:51 UTC
ModifiedFiles: graphics/x11drv/xfont.c
AddedFiles: 
===================================================================
RCS file: /home/wine/wine/graphics/x11drv/xfont.c,v
retrieving revision 1.104
diff -u -r1.104 xfont.c
--- graphics/x11drv/xfont.c	20 Jun 2002 23:21:27 -0000	1.104
+++ graphics/x11drv/xfont.c	23 Jul 2002 19:43:18 -0000
@@ -3229,22 +3229,29 @@
     LOGFONTW logfont;
     LOGFONT16 lf;
     DC *dc = physDev->dc;
+	HFONT retval = TRUE; /* Assuming that a device font will be used */
+
+    EnterCriticalSection( &crtsc_fonts_X11 );
 
     TRACE("dc=%p, hfont=%04x\n", dc, hfont);
 
-    if (!GetObjectW( hfont, sizeof(logfont), &logfont )) return GDI_ERROR;
+    if (!GetObjectW( hfont, sizeof(logfont), &logfont ))
+	{
+		retval = GDI_ERROR;
+		goto end;
+	}
+
+	/* Initialize font metrics now because gdi fonts can be aliases. */
+    if(fontList == NULL) X11DRV_FONT_InitX11Metrics();
 
     TRACE("dc->gdiFont = %p\n", dc->gdiFont);
 
     if(dc->gdiFont && X11DRV_XRender_Installed) {
         X11DRV_XRender_SelectFont(physDev, hfont);
-	return FALSE;
+		retval = FALSE;
+		goto end;
     }
 
-    EnterCriticalSection( &crtsc_fonts_X11 );
-
-    if(fontList == NULL) X11DRV_FONT_InitX11Metrics();
-
     if( CHECK_PFONT(physDev->font) )
         XFONT_ReleaseCacheEntry( __PFONT(physDev->font) );
 
@@ -3305,9 +3312,10 @@
 	logfont.lfCharSet = charsetMatched;
     }
 
+end:
     LeaveCriticalSection( &crtsc_fonts_X11 );
 
-    return TRUE; /* Use a device font */
+    return retval;
 }
 
 
@@ -3323,16 +3331,34 @@
     fontResource*	pfr = fontList;
     BOOL	  	b, bRet = 0;
     LOGFONT16           lf16;
-
-    /* don't enumerate x11 fonts if we're using client side fonts */
-    if (physDev->dc->gdiFont) return FALSE;
+	fontAlias* pfa;
+	char* faceName;
 
     FONT_LogFontWTo16(plf, &lf16);
+	faceName = lf16.lfFaceName;
+
+    /* don't enumerate x11 fonts if we're using client side fonts, unless it's
+	 * an alias for an x11 font. */
+    if (physDev->dc->gdiFont)
+	{
+		b = FALSE;
+
+		for (pfa = aliasTable; pfa; pfa = pfa->next)
+		{
+			if (strcmp(faceName, pfa->faAlias) == 0)
+			{
+				faceName = pfa->faTypeFace;
+				b = TRUE;
+			}
+		}
+
+		if (!b) return FALSE;
+	}
 
-    if( lf16.lfFaceName[0] )
+    if( faceName[0] )
     {
 	/* enum all entries in this resource */
-	pfr = XFONT_FindFIList( pfr, lf16.lfFaceName );
+	pfr = XFONT_FindFIList( pfr, faceName );
 	if( pfr )
 	{
 	    fontInfo*	pfi;

[Index of Archives]     [Gimp for Windows]     [Red Hat]     [Samba]     [Yosemite Camping]     [Graphics Cards]     [Wine Home]

  Powered by Linux