From bbfdfb2f1f0cd4e4b6cd1e906341f8a97a1bce0c Mon Sep 17 00:00:00 2001 From: Henri Verbeet Date: Mon, 15 Jun 2009 09:06:49 +0200 Subject: [PATCH] wined3d: Introduce surface_gdi_cleanup(). --- dlls/wined3d/surface_gdi.c | 50 +++++++++++++++++++++----------------- 1 file changed, 28 insertions(+), 22 deletions(-) diff --git a/dlls/wined3d/surface_gdi.c b/dlls/wined3d/surface_gdi.c index 0ad65e01a98..ca5c738f1d3 100644 --- a/dlls/wined3d/surface_gdi.c +++ b/dlls/wined3d/surface_gdi.c @@ -35,6 +35,29 @@ /* Use the d3d_surface debug channel to have one channel for all surfaces */ WINE_DEFAULT_DEBUG_CHANNEL(d3d_surface); +static void surface_gdi_cleanup(IWineD3DSurfaceImpl *This) +{ + TRACE("(%p) : Cleaning up.\n", This); + + if (This->Flags & SFLAG_DIBSECTION) + { + /* Release the DC. */ + SelectObject(This->hDC, This->dib.holdbitmap); + DeleteDC(This->hDC); + /* Release the DIB section. */ + DeleteObject(This->dib.DIBsection); + This->dib.bitmap_data = NULL; + This->resource.allocatedMemory = NULL; + } + + if (This->Flags & SFLAG_USERPTR) IWineD3DSurface_SetMem((IWineD3DSurface *)This, NULL); + if (This->overlay_dest) list_remove(&This->overlay_entry); + + HeapFree(GetProcessHeap(), 0, This->palette9); + + resource_cleanup((IWineD3DResource *)This); +} + /***************************************************************************** * IWineD3DSurface::Release, GDI version * @@ -46,32 +69,15 @@ static ULONG WINAPI IWineGDISurfaceImpl_Release(IWineD3DSurface *iface) { IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *)iface; ULONG ref = InterlockedDecrement(&This->resource.ref); TRACE("(%p) : Releasing from %d\n", This, ref + 1); - if (ref == 0) { - TRACE("(%p) : cleaning up\n", This); - if(This->Flags & SFLAG_DIBSECTION) { - /* Release the DC */ - SelectObject(This->hDC, This->dib.holdbitmap); - DeleteDC(This->hDC); - /* Release the DIB section */ - DeleteObject(This->dib.DIBsection); - This->dib.bitmap_data = NULL; - This->resource.allocatedMemory = NULL; - } - if(This->Flags & SFLAG_USERPTR) IWineD3DSurface_SetMem(iface, NULL); + if (!ref) + { + surface_gdi_cleanup(This); - HeapFree(GetProcessHeap(), 0, This->palette9); - - resource_cleanup((IWineD3DResource *)iface); - - if(This->overlay_dest) { - list_remove(&This->overlay_entry); - } - - TRACE("(%p) Released\n", This); + TRACE("(%p) Released.\n", This); HeapFree(GetProcessHeap(), 0, This); - } + return ref; }