Module: wine Branch: master Commit: bbfdfb2f1f0cd4e4b6cd1e906341f8a97a1bce0c URL: http://source.winehq.org/git/wine.git/?a=commit;h=bbfdfb2f1f0cd4e4b6cd1e9063...
Author: Henri Verbeet hverbeet@codeweavers.com Date: Mon Jun 15 09:06:49 2009 +0200
wined3d: Introduce surface_gdi_cleanup().
---
dlls/wined3d/surface_gdi.c | 50 ++++++++++++++++++++++++------------------- 1 files changed, 28 insertions(+), 22 deletions(-)
diff --git a/dlls/wined3d/surface_gdi.c b/dlls/wined3d/surface_gdi.c index 0ad65e0..ca5c738 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); - - HeapFree(GetProcessHeap(), 0, This->palette9); - - resource_cleanup((IWineD3DResource *)iface); - - if(This->overlay_dest) { - list_remove(&This->overlay_entry); - } + if (!ref) + { + surface_gdi_cleanup(This);
- TRACE("(%p) Released\n", This); + TRACE("(%p) Released.\n", This); HeapFree(GetProcessHeap(), 0, This); - } + return ref; }