Alexandre Julliard : winex11: Store the XRender info structure inside the XRender physdev object.
Alexandre Julliard
julliard at winehq.org
Mon Sep 12 11:42:59 CDT 2011
Module: wine
Branch: master
Commit: b74a33d9b3393c3396a1a17b8fbf650a082e3f5c
URL: http://source.winehq.org/git/wine.git/?a=commit;h=b74a33d9b3393c3396a1a17b8fbf650a082e3f5c
Author: Alexandre Julliard <julliard at winehq.org>
Date: Mon Sep 12 11:39:56 2011 +0200
winex11: Store the XRender info structure inside the XRender physdev object.
---
dlls/winex11.drv/init.c | 2 -
dlls/winex11.drv/x11drv.h | 1 -
dlls/winex11.drv/xrender.c | 82 +++++++++++++++++++++++++------------------
3 files changed, 48 insertions(+), 37 deletions(-)
diff --git a/dlls/winex11.drv/init.c b/dlls/winex11.drv/init.c
index 94e6830..b0592fa 100644
--- a/dlls/winex11.drv/init.c
+++ b/dlls/winex11.drv/init.c
@@ -193,8 +193,6 @@ static BOOL X11DRV_DeleteDC( PHYSDEV dev )
{
X11DRV_PDEVICE *physDev = get_x11drv_dev( dev );
- if(physDev->xrender)
- X11DRV_XRender_DeleteDC( physDev );
DeleteObject( physDev->region );
wine_tsx11_lock();
XFreeGC( gdi_display, physDev->gc );
diff --git a/dlls/winex11.drv/x11drv.h b/dlls/winex11.drv/x11drv.h
index 4793916..55b4f22 100644
--- a/dlls/winex11.drv/x11drv.h
+++ b/dlls/winex11.drv/x11drv.h
@@ -305,7 +305,6 @@ extern const struct gdi_dc_funcs *X11DRV_XRender_Init(void) DECLSPEC_HIDDEN;
extern void X11DRV_XRender_Finalize(void) DECLSPEC_HIDDEN;
extern BOOL X11DRV_XRender_SelectFont(X11DRV_PDEVICE*, HFONT) DECLSPEC_HIDDEN;
extern void X11DRV_XRender_SetDeviceClipping(X11DRV_PDEVICE *physDev, const RGNDATA *data) DECLSPEC_HIDDEN;
-extern void X11DRV_XRender_DeleteDC(X11DRV_PDEVICE*) DECLSPEC_HIDDEN;
extern void X11DRV_XRender_CopyBrush(X11DRV_PDEVICE *physDev, X_PHYSBITMAP *physBitmap, int width, int height) DECLSPEC_HIDDEN;
extern BOOL X11DRV_XRender_ExtTextOut(X11DRV_PDEVICE *physDev, INT x, INT y, UINT flags,
const RECT *lprect, LPCWSTR wstr,
diff --git a/dlls/winex11.drv/xrender.c b/dlls/winex11.drv/xrender.c
index 75ff44e..f5c37fe 100644
--- a/dlls/winex11.drv/xrender.c
+++ b/dlls/winex11.drv/xrender.c
@@ -156,6 +156,7 @@ struct xrender_physdev
{
struct gdi_physdev dev;
X11DRV_PDEVICE *x11dev;
+ struct xrender_info info;
};
static inline struct xrender_physdev *get_xrender_dev( PHYSDEV dev )
@@ -622,6 +623,29 @@ static Picture get_xrender_picture_source(X11DRV_PDEVICE *physDev, BOOL repeat)
return info->pict_src;
}
+static void free_xrender_picture( struct xrender_physdev *dev )
+{
+ if (dev->info.pict || dev->info.pict_src)
+ {
+ wine_tsx11_lock();
+ XFlush( gdi_display );
+ if (dev->info.pict)
+ {
+ TRACE("freeing pict = %lx dc = %p\n", dev->info.pict, dev->dev.hdc);
+ pXRenderFreePicture(gdi_display, dev->info.pict);
+ dev->info.pict = 0;
+ }
+ if(dev->info.pict_src)
+ {
+ TRACE("freeing pict = %lx dc = %p\n", dev->info.pict_src, dev->dev.hdc);
+ pXRenderFreePicture(gdi_display, dev->info.pict_src);
+ dev->info.pict_src = 0;
+ }
+ wine_tsx11_unlock();
+ }
+ dev->info.format = NULL;
+}
+
/* return a mask picture used to force alpha to 0 */
static Picture get_no_alpha_mask(void)
{
@@ -1112,18 +1136,28 @@ void X11DRV_XRender_SetDeviceClipping(X11DRV_PDEVICE *physDev, const RGNDATA *da
}
}
+
+static BOOL create_xrender_dc( PHYSDEV *pdev )
+{
+ X11DRV_PDEVICE *x11dev = get_x11drv_dev( *pdev );
+ struct xrender_physdev *physdev = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*physdev) );
+
+ if (!physdev) return FALSE;
+ physdev->x11dev = x11dev;
+ physdev->info.cache_index = -1;
+ physdev->info.format = get_xrender_format_from_color_shifts( x11dev->depth, x11dev->color_shifts );
+ x11dev->xrender = &physdev->info;
+ push_dc_driver( pdev, &physdev->dev, &xrender_funcs );
+ return TRUE;
+}
+
/**********************************************************************
* xrenderdrv_CreateDC
*/
static BOOL xrenderdrv_CreateDC( PHYSDEV *pdev, LPCWSTR driver, LPCWSTR device,
LPCWSTR output, const DEVMODEW* initData )
{
- struct xrender_physdev *physdev = HeapAlloc( GetProcessHeap(), 0, sizeof(*physdev) );
-
- if (!physdev) return FALSE;
- physdev->x11dev = get_x11drv_dev( *pdev );
- push_dc_driver( pdev, &physdev->dev, &xrender_funcs );
- return TRUE;
+ return create_xrender_dc( pdev );
}
/**********************************************************************
@@ -1131,8 +1165,6 @@ static BOOL xrenderdrv_CreateDC( PHYSDEV *pdev, LPCWSTR driver, LPCWSTR device,
*/
static BOOL xrenderdrv_CreateCompatibleDC( PHYSDEV orig, PHYSDEV *pdev )
{
- struct xrender_physdev *physdev;
-
if (orig) /* chain to x11drv first */
{
orig = GET_NEXT_PHYSDEV( orig, pCreateCompatibleDC );
@@ -1140,10 +1172,7 @@ static BOOL xrenderdrv_CreateCompatibleDC( PHYSDEV orig, PHYSDEV *pdev )
}
/* otherwise we have been called by x11drv */
- if (!(physdev = HeapAlloc( GetProcessHeap(), 0, sizeof(*physdev) ))) return FALSE;
- physdev->x11dev = get_x11drv_dev( *pdev );
- push_dc_driver( pdev, &physdev->dev, &xrender_funcs );
- return TRUE;
+ return create_xrender_dc( pdev );
}
/**********************************************************************
@@ -1152,25 +1181,16 @@ static BOOL xrenderdrv_CreateCompatibleDC( PHYSDEV orig, PHYSDEV *pdev )
static BOOL xrenderdrv_DeleteDC( PHYSDEV dev )
{
struct xrender_physdev *physdev = get_xrender_dev( dev );
- HeapFree( GetProcessHeap(), 0, physdev );
- return TRUE;
-}
-/***********************************************************************
- * X11DRV_XRender_DeleteDC
- */
-void X11DRV_XRender_DeleteDC(X11DRV_PDEVICE *physDev)
-{
- X11DRV_XRender_UpdateDrawable(physDev);
+ free_xrender_picture( physdev );
- EnterCriticalSection(&xrender_cs);
- if(physDev->xrender->cache_index != -1)
- dec_ref_cache(physDev->xrender->cache_index);
- LeaveCriticalSection(&xrender_cs);
+ EnterCriticalSection( &xrender_cs );
+ if (physdev->info.cache_index != -1) dec_ref_cache( physdev->info.cache_index );
+ LeaveCriticalSection( &xrender_cs );
- HeapFree(GetProcessHeap(), 0, physDev->xrender);
- physDev->xrender = NULL;
- return;
+ physdev->x11dev->xrender = NULL;
+ HeapFree( GetProcessHeap(), 0, physdev );
+ return TRUE;
}
BOOL X11DRV_XRender_SetPhysBitmapDepth(X_PHYSBITMAP *physBitmap, int bits_pixel, const DIBSECTION *dib)
@@ -2596,12 +2616,6 @@ BOOL X11DRV_XRender_SelectFont(X11DRV_PDEVICE *physDev, HFONT hfont)
return FALSE;
}
-void X11DRV_XRender_DeleteDC(X11DRV_PDEVICE *physDev)
-{
- assert(0);
- return;
-}
-
void X11DRV_XRender_SetDeviceClipping(X11DRV_PDEVICE *physDev, const RGNDATA *data)
{
assert(0);
More information about the wine-cvs
mailing list