Alexandre Julliard : winex11: Don' t allocate the glyph cache without Xrender, and cleanup initialization.

Alexandre Julliard julliard at winehq.org
Mon Nov 21 11:10:08 CST 2011


Module: wine
Branch: master
Commit: 9efb9d480d9b720a7a34353b9ecc2e17e5c646fe
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=9efb9d480d9b720a7a34353b9ecc2e17e5c646fe

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Thu Nov 17 20:44:26 2011 +0100

winex11: Don't allocate the glyph cache without Xrender, and cleanup initialization.

---

 dlls/winex11.drv/x11drv_main.c |    3 +-
 dlls/winex11.drv/xrender.c     |  118 ++++++++++++++++++----------------------
 2 files changed, 55 insertions(+), 66 deletions(-)

diff --git a/dlls/winex11.drv/x11drv_main.c b/dlls/winex11.drv/x11drv_main.c
index 8e2082d..ca03083 100644
--- a/dlls/winex11.drv/x11drv_main.c
+++ b/dlls/winex11.drv/x11drv_main.c
@@ -632,8 +632,7 @@ static void process_detach(void)
     /* cleanup XVidMode */
     X11DRV_XF86VM_Cleanup();
 #endif
-    if(using_client_side_fonts)
-        X11DRV_XRender_Finalize();
+    X11DRV_XRender_Finalize();
 
     /* cleanup GDI */
     X11DRV_GDI_Finalize();
diff --git a/dlls/winex11.drv/xrender.c b/dlls/winex11.drv/xrender.c
index a1b0581..f6b19ba 100644
--- a/dlls/winex11.drv/xrender.c
+++ b/dlls/winex11.drv/xrender.c
@@ -44,6 +44,8 @@ WINE_DEFAULT_DEBUG_CHANNEL(xrender);
 
 #ifdef SONAME_LIBXRENDER
 
+WINE_DECLARE_DEBUG_CHANNEL(winediag);
+
 static BOOL X11DRV_XRender_Installed = FALSE;
 
 #include <X11/Xlib.h>
@@ -359,51 +361,51 @@ const struct gdi_dc_funcs *X11DRV_XRender_Init(void)
 {
     int event_base, i;
 
-    if (client_side_with_render &&
-	(xrender_handle = wine_dlopen(SONAME_LIBXRENDER, RTLD_NOW, NULL, 0)))
-    {
-
-#define LOAD_FUNCPTR(f) if((p##f = wine_dlsym(xrender_handle, #f, NULL, 0)) == NULL) goto sym_not_found;
-LOAD_FUNCPTR(XRenderAddGlyphs)
-LOAD_FUNCPTR(XRenderComposite)
-LOAD_FUNCPTR(XRenderCompositeText16)
-LOAD_FUNCPTR(XRenderCreateGlyphSet)
-LOAD_FUNCPTR(XRenderCreatePicture)
-LOAD_FUNCPTR(XRenderFillRectangle)
-LOAD_FUNCPTR(XRenderFindFormat)
-LOAD_FUNCPTR(XRenderFindVisualFormat)
-LOAD_FUNCPTR(XRenderFreeGlyphSet)
-LOAD_FUNCPTR(XRenderFreePicture)
-LOAD_FUNCPTR(XRenderSetPictureClipRectangles)
-LOAD_FUNCPTR(XRenderQueryExtension)
+    using_client_side_fonts = client_side_with_render || client_side_with_core;
+
+    if (!client_side_with_render) return NULL;
+    if (!(xrender_handle = wine_dlopen(SONAME_LIBXRENDER, RTLD_NOW, NULL, 0))) return NULL;
+
+#define LOAD_FUNCPTR(f) if((p##f = wine_dlsym(xrender_handle, #f, NULL, 0)) == NULL) return NULL
+    LOAD_FUNCPTR(XRenderAddGlyphs);
+    LOAD_FUNCPTR(XRenderComposite);
+    LOAD_FUNCPTR(XRenderCompositeText16);
+    LOAD_FUNCPTR(XRenderCreateGlyphSet);
+    LOAD_FUNCPTR(XRenderCreatePicture);
+    LOAD_FUNCPTR(XRenderFillRectangle);
+    LOAD_FUNCPTR(XRenderFindFormat);
+    LOAD_FUNCPTR(XRenderFindVisualFormat);
+    LOAD_FUNCPTR(XRenderFreeGlyphSet);
+    LOAD_FUNCPTR(XRenderFreePicture);
+    LOAD_FUNCPTR(XRenderSetPictureClipRectangles);
+    LOAD_FUNCPTR(XRenderQueryExtension);
 #undef LOAD_FUNCPTR
 #ifdef HAVE_XRENDERSETPICTURETRANSFORM
-#define LOAD_OPTIONAL_FUNCPTR(f) p##f = wine_dlsym(xrender_handle, #f, NULL, 0);
-LOAD_OPTIONAL_FUNCPTR(XRenderSetPictureTransform)
+#define LOAD_OPTIONAL_FUNCPTR(f) p##f = wine_dlsym(xrender_handle, #f, NULL, 0)
+    LOAD_OPTIONAL_FUNCPTR(XRenderSetPictureTransform);
 #undef LOAD_OPTIONAL_FUNCPTR
 #endif
 
-        wine_tsx11_lock();
-        X11DRV_XRender_Installed = pXRenderQueryExtension(gdi_display, &event_base, &xrender_error_base);
-        wine_tsx11_unlock();
-        if(X11DRV_XRender_Installed) {
-            TRACE("Xrender is up and running error_base = %d\n", xrender_error_base);
-            if(!load_xrender_formats()) /* This fails in buggy versions of libXrender.so */
-            {
-                wine_tsx11_unlock();
-                WINE_MESSAGE(
-                    "Wine has detected that you probably have a buggy version\n"
-                    "of libXrender.so .  Because of this client side font rendering\n"
-                    "will be disabled.  Please upgrade this library.\n");
-                X11DRV_XRender_Installed = FALSE;
-                return NULL;
-            }
+    wine_tsx11_lock();
+    X11DRV_XRender_Installed = pXRenderQueryExtension(gdi_display, &event_base, &xrender_error_base);
+    wine_tsx11_unlock();
+    if (!X11DRV_XRender_Installed) return NULL;
 
-            if (!visual->red_mask || !visual->green_mask || !visual->blue_mask) {
-                WARN("one or more of the colour masks are 0, disabling XRENDER. Try running in 16-bit mode or higher.\n");
-                X11DRV_XRender_Installed = FALSE;
-            }
-        }
+    TRACE("Xrender is up and running error_base = %d\n", xrender_error_base);
+    if(!load_xrender_formats()) /* This fails in buggy versions of libXrender.so */
+    {
+        ERR_(winediag)("Wine has detected that you probably have a buggy version "
+                       "of libXrender.  Because of this client side font rendering "
+                       "will be disabled.  Please upgrade this library.\n");
+        X11DRV_XRender_Installed = FALSE;
+        return NULL;
+    }
+
+    if (!visual->red_mask || !visual->green_mask || !visual->blue_mask)
+    {
+        WARN("one or more of the colour masks are 0, disabling XRENDER. Try running in 16-bit mode or higher.\n");
+        X11DRV_XRender_Installed = FALSE;
+        return NULL;
     }
 
 #ifdef SONAME_LIBFONTCONFIG
@@ -428,32 +430,20 @@ LOAD_OPTIONAL_FUNCPTR(XRenderSetPictureTransform)
 #endif
 
 sym_not_found:
-    if(X11DRV_XRender_Installed || client_side_with_core)
-    {
-	glyphsetCache = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
-				  sizeof(*glyphsetCache) * INIT_CACHE_SIZE);
-
-	glyphsetCacheSize = INIT_CACHE_SIZE;
-	lastfree = 0;
-	for(i = 0; i < INIT_CACHE_SIZE; i++) {
-	  glyphsetCache[i].next = i + 1;
-	  glyphsetCache[i].count = -1;
-	}
-	glyphsetCache[i-1].next = -1;
-	using_client_side_fonts = 1;
+    glyphsetCache = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
+                              sizeof(*glyphsetCache) * INIT_CACHE_SIZE);
 
-	if(!X11DRV_XRender_Installed) {
-	    TRACE("Xrender is not available on your XServer, client side rendering with the core protocol instead.\n");
-	    if(screen_depth <= 8 || !client_side_antialias_with_core)
-	        antialias = 0;
-	} else {
-	    if(screen_depth <= 8 || !client_side_antialias_with_render)
-	        antialias = 0;
-	}
-        return &xrender_funcs;
+    glyphsetCacheSize = INIT_CACHE_SIZE;
+    lastfree = 0;
+    for(i = 0; i < INIT_CACHE_SIZE; i++) {
+        glyphsetCache[i].next = i + 1;
+        glyphsetCache[i].count = -1;
     }
-    TRACE("Using X11 core fonts\n");
-    return NULL;
+    glyphsetCache[i-1].next = -1;
+
+    if(screen_depth <= 8 || !client_side_antialias_with_render) antialias = 0;
+
+    return &xrender_funcs;
 }
 
 /* Helper function to convert from a color packed in a 32-bit integer to a XRenderColor */




More information about the wine-cvs mailing list