Stefan Dösinger : ddraw: Creating surfaces with old interfaces doesn't addref.
Alexandre Julliard
julliard at wine.codeweavers.com
Mon Feb 19 07:02:20 CST 2007
Module: wine
Branch: master
Commit: 1036ca0df66d4b286448ff474601b7896debce44
URL: http://source.winehq.org/git/wine.git/?a=commit;h=1036ca0df66d4b286448ff474601b7896debce44
Author: Stefan Dösinger <stefan at codeweavers.com>
Date: Fri Feb 16 19:08:09 2007 +0100
ddraw: Creating surfaces with old interfaces doesn't addref.
---
dlls/ddraw/ddraw_thunks.c | 6 ++----
dlls/ddraw/surface.c | 2 +-
dlls/ddraw/tests/refcount.c | 26 ++++++++++++++++++++++++--
3 files changed, 27 insertions(+), 7 deletions(-)
diff --git a/dlls/ddraw/ddraw_thunks.c b/dlls/ddraw/ddraw_thunks.c
index ce61f18..964466d 100644
--- a/dlls/ddraw/ddraw_thunks.c
+++ b/dlls/ddraw/ddraw_thunks.c
@@ -410,8 +410,7 @@ IDirectDrawImpl_CreateSurface(LPDIRECTDRAW This, LPDDSURFACEDESC pSDesc,
IDirectDraw,
IDirectDraw7,
This));
- IDirectDraw_AddRef(This);
- impl->ifaceToRelease = (IUnknown *) This;
+ impl->ifaceToRelease = NULL;
}
return hr;
@@ -446,8 +445,7 @@ IDirectDraw2Impl_CreateSurface(LPDIRECTDRAW2 This, LPDDSURFACEDESC pSDesc,
IDirectDraw2,
IDirectDraw7,
This));
- IDirectDraw2_AddRef(This);
- impl->ifaceToRelease = (IUnknown *) This;
+ impl->ifaceToRelease = NULL;
}
return hr;
diff --git a/dlls/ddraw/surface.c b/dlls/ddraw/surface.c
index cd35832..c41d08f 100644
--- a/dlls/ddraw/surface.c
+++ b/dlls/ddraw/surface.c
@@ -376,7 +376,7 @@ IDirectDrawSurfaceImpl_Release(IDirectDrawSurface7 *iface)
IDirectDrawSurfaceImpl_Destroy(This);
/* Reduce the ddraw refcount */
- IUnknown_Release(ifaceToRelease);
+ if(ifaceToRelease) IUnknown_Release(ifaceToRelease);
}
return ref;
diff --git a/dlls/ddraw/tests/refcount.c b/dlls/ddraw/tests/refcount.c
index b79612f..11301d3 100644
--- a/dlls/ddraw/tests/refcount.c
+++ b/dlls/ddraw/tests/refcount.c
@@ -49,10 +49,12 @@ static void test_ddraw_objects(void)
unsigned long ref;
IDirectDraw7 *DDraw7;
IDirectDraw4 *DDraw4;
- IDirectDraw4 *DDraw2;
- IDirectDraw4 *DDraw1;
+ IDirectDraw2 *DDraw2;
+ IDirectDraw *DDraw1;
IDirectDrawPalette *palette;
IDirectDrawSurface7 *surface;
+ IDirectDrawSurface *surface1;
+ IDirectDrawSurface4 *surface4;
PALETTEENTRY Table[256];
DDSURFACEDESC2 ddsd;
@@ -163,6 +165,26 @@ static void test_ddraw_objects(void)
ok(ref == 1, "Got refcount %ld, expected 1\n", ref);
IDirectDrawPalette_Release(palette);
+ /* Simmilar for surfaces */
+ hr = IDirectDraw4_CreateSurface(DDraw4, &ddsd, &surface4, NULL);
+ ok(hr == DD_OK, "CreateSurface returned %08x\n", hr);
+ ref = getRefcount( (IUnknown *) DDraw4);
+ ok(ref == 2, "Got refcount %ld, expected 2\n", ref);
+ IDirectDrawSurface4_Release(surface4);
+
+ ddsd.dwSize = sizeof(DDSURFACEDESC);
+ hr = IDirectDraw2_CreateSurface(DDraw2, (DDSURFACEDESC *) &ddsd, &surface1, NULL);
+ ok(hr == DD_OK, "CreateSurface returned %08x\n", hr);
+ ref = getRefcount( (IUnknown *) DDraw2);
+ ok(ref == 1, "Got refcount %ld, expected 1\n", ref);
+ IDirectDrawSurface_Release(surface1);
+
+ hr = IDirectDraw_CreateSurface(DDraw1, (DDSURFACEDESC *) &ddsd, &surface1, NULL);
+ ok(hr == DD_OK, "CreateSurface returned %08x\n", hr);
+ ref = getRefcount( (IUnknown *) DDraw1);
+ ok(ref == 1, "Got refcount %ld, expected 1\n", ref);
+ IDirectDrawSurface_Release(surface1);
+
IDirectDraw7_Release(DDraw7);
IDirectDraw4_Release(DDraw4);
IDirectDraw2_Release(DDraw2);
More information about the wine-cvs
mailing list