[PATCH 2/5] ddraw: Implement ddraw7_Initialize().

Henri Verbeet hverbeet at codeweavers.com
Sun Sep 18 14:05:28 CDT 2011


It turns out there are actually applications that use this. This fixes a
regression introduced by commit 5de020342cc039819b6fe11ee787d5a9a288f85a.
---
 dlls/ddraw/ddraw.c         |   19 +++++++++++++++----
 dlls/ddraw/ddraw_private.h |    1 +
 dlls/ddraw/main.c          |   17 +++++++++++++++++
 3 files changed, 33 insertions(+), 4 deletions(-)

diff --git a/dlls/ddraw/ddraw.c b/dlls/ddraw/ddraw.c
index 4708b8e..65afa90 100644
--- a/dlls/ddraw/ddraw.c
+++ b/dlls/ddraw/ddraw.c
@@ -1537,11 +1537,22 @@ static HRESULT WINAPI ddraw2_GetAvailableVidMem(IDirectDraw2 *iface,
  *  DDERR_ALREADYINITIALIZED on repeated calls
  *
  *****************************************************************************/
-static HRESULT WINAPI ddraw7_Initialize(IDirectDraw7 *iface, GUID *Guid)
+static HRESULT WINAPI ddraw7_Initialize(IDirectDraw7 *iface, GUID *guid)
 {
-    FIXME("iface %p, guid %s stub!\n", iface, debugstr_guid(Guid));
+    IDirectDrawImpl *This = impl_from_IDirectDraw7(iface);
 
-    return DDERR_ALREADYINITIALIZED;
+    TRACE("iface %p, guid %s.\n", iface, debugstr_guid(guid));
+
+    if (This->initialized)
+        return DDERR_ALREADYINITIALIZED;
+
+    /* FIXME: To properly take the GUID into account we should call
+     * ddraw_init() here instead of in DDRAW_Create(). */
+    if (guid)
+        FIXME("Ignoring guid %s.\n", debugstr_guid(guid));
+
+    This->initialized = TRUE;
+    return DD_OK;
 }
 
 static HRESULT WINAPI ddraw4_Initialize(IDirectDraw4 *iface, GUID *guid)
@@ -1575,7 +1586,7 @@ static HRESULT WINAPI d3d1_Initialize(IDirect3D *iface, REFIID riid)
 {
     TRACE("iface %p, riid %s.\n", iface, debugstr_guid(riid));
 
-    return D3D_OK;
+    return DDERR_ALREADYINITIALIZED;
 }
 
 /*****************************************************************************
diff --git a/dlls/ddraw/ddraw_private.h b/dlls/ddraw/ddraw_private.h
index 601797e..bc48ad1 100644
--- a/dlls/ddraw/ddraw_private.h
+++ b/dlls/ddraw/ddraw_private.h
@@ -81,6 +81,7 @@ struct IDirectDrawImpl
 
     /* See comment in IDirectDraw::AddRef */
     LONG                    ref7, ref4, ref2, ref3, ref1, numIfaces;
+    BOOL initialized;
 
     /* WineD3D linkage */
     struct wined3d *wineD3D;
diff --git a/dlls/ddraw/main.c b/dlls/ddraw/main.c
index e475914..2ab9eac 100644
--- a/dlls/ddraw/main.c
+++ b/dlls/ddraw/main.c
@@ -275,6 +275,14 @@ DirectDrawCreate(GUID *GUID,
     EnterCriticalSection(&ddraw_cs);
     hr = DDRAW_Create(GUID, (void **) DD, UnkOuter, &IID_IDirectDraw);
     LeaveCriticalSection(&ddraw_cs);
+
+    if (SUCCEEDED(hr))
+    {
+        hr = IDirectDraw_Initialize(*DD, GUID);
+        if (FAILED(hr))
+            IDirectDraw_Release(*DD);
+    }
+
     return hr;
 }
 
@@ -304,6 +312,15 @@ DirectDrawCreateEx(GUID *GUID,
     EnterCriticalSection(&ddraw_cs);
     hr = DDRAW_Create(GUID, DD, UnkOuter, iid);
     LeaveCriticalSection(&ddraw_cs);
+
+    if (SUCCEEDED(hr))
+    {
+        IDirectDraw7 *ddraw7 = *(IDirectDraw7 **)DD;
+        hr = IDirectDraw7_Initialize(ddraw7, GUID);
+        if (FAILED(hr))
+            IDirectDraw7_Release(ddraw7);
+    }
+
     return hr;
 }
 
-- 
1.7.3.4




More information about the wine-patches mailing list