Nikolay Sivov : amstream: Implement GetDirectDraw().

Alexandre Julliard julliard at wine.codeweavers.com
Tue Jun 23 09:17:14 CDT 2015


Module: wine
Branch: master
Commit: eb0b1d55e41f24f0159ed0582b182bb415e0c23a
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=eb0b1d55e41f24f0159ed0582b182bb415e0c23a

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Mon Jun 22 23:52:08 2015 +0300

amstream: Implement GetDirectDraw().

---

 dlls/amstream/Makefile.in      |  2 +-
 dlls/amstream/mediastream.c    | 21 ++++++++++++++++++---
 dlls/amstream/tests/amstream.c | 16 ++++++++++++++++
 3 files changed, 35 insertions(+), 4 deletions(-)

diff --git a/dlls/amstream/Makefile.in b/dlls/amstream/Makefile.in
index 1107223..c00822b 100644
--- a/dlls/amstream/Makefile.in
+++ b/dlls/amstream/Makefile.in
@@ -1,5 +1,5 @@
 MODULE    = amstream.dll
-IMPORTS   = strmiids strmbase uuid ole32 advapi32
+IMPORTS   = strmiids strmbase uuid ole32 advapi32 ddraw
 
 C_SRCS = \
 	amstream.c \
diff --git a/dlls/amstream/mediastream.c b/dlls/amstream/mediastream.c
index 4a8c19b..1a31706 100644
--- a/dlls/amstream/mediastream.c
+++ b/dlls/amstream/mediastream.c
@@ -42,6 +42,7 @@ typedef struct {
     IMultiMediaStream* parent;
     MSPID purpose_id;
     STREAM_TYPE stream_type;
+    IDirectDraw7 *ddraw;
 } DirectDrawMediaStreamImpl;
 
 static inline DirectDrawMediaStreamImpl *impl_from_DirectDrawMediaStream_IAMMediaStream(IAMMediaStream *iface)
@@ -94,7 +95,11 @@ static ULONG WINAPI DirectDrawMediaStreamImpl_IAMMediaStream_Release(IAMMediaStr
     TRACE("(%p/%p)->(): new ref = %u\n", iface, This, ref);
 
     if (!ref)
+    {
+        if (This->ddraw)
+            IDirectDraw7_Release(This->ddraw);
         HeapFree(GetProcessHeap(), 0, This);
+    }
 
     return ref;
 }
@@ -373,11 +378,21 @@ static HRESULT WINAPI DirectDrawMediaStreamImpl_IDirectDrawMediaStream_SetFormat
 }
 
 static HRESULT WINAPI DirectDrawMediaStreamImpl_IDirectDrawMediaStream_GetDirectDraw(IDirectDrawMediaStream *iface,
-        IDirectDraw **ppDirectDraw)
+        IDirectDraw **ddraw)
 {
-    FIXME("(%p)->(%p) stub!\n", iface, ppDirectDraw);
+    DirectDrawMediaStreamImpl *This = impl_from_IDirectDrawMediaStream(iface);
 
-    return E_NOTIMPL;
+    TRACE("(%p)->(%p)\n", iface, ddraw);
+
+    *ddraw = NULL;
+    if (!This->ddraw)
+    {
+        HRESULT hr = DirectDrawCreateEx(NULL, (void**)&This->ddraw, &IID_IDirectDraw7, NULL);
+        if (FAILED(hr))
+            return hr;
+    }
+
+    return IDirectDraw7_QueryInterface(This->ddraw, &IID_IDirectDraw, (void**)ddraw);
 }
 
 static HRESULT WINAPI DirectDrawMediaStreamImpl_IDirectDrawMediaStream_SetDirectDraw(IDirectDrawMediaStream *iface,
diff --git a/dlls/amstream/tests/amstream.c b/dlls/amstream/tests/amstream.c
index a8986a6..b961084 100644
--- a/dlls/amstream/tests/amstream.c
+++ b/dlls/amstream/tests/amstream.c
@@ -458,6 +458,8 @@ static void test_IDirectDrawStreamSample(void)
     IDirectDrawMediaStream *pddstream = NULL;
     IDirectDrawStreamSample *pddsample = NULL;
     IDirectDrawSurface *surface, *surface2;
+    IDirectDraw *ddraw, *ddraw2;
+    IDirectDraw7 *ddraw7;
     RECT rect;
 
     if (!(pams = create_ammultimediastream()))
@@ -482,6 +484,20 @@ static void test_IDirectDrawStreamSample(void)
     ok(hr == S_OK, "got 0x%08x\n", hr);
     if (FAILED(hr)) goto error;
 
+    hr = IDirectDrawMediaStream_GetDirectDraw(pddstream, &ddraw);
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+
+    hr = IDirectDrawMediaStream_GetDirectDraw(pddstream, &ddraw2);
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+    ok(ddraw == ddraw2, "got %p, %p\n", ddraw, ddraw2);
+
+    hr = IDirectDraw_QueryInterface(ddraw, &IID_IDirectDraw7, (void**)&ddraw7);
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+    IDirectDraw7_Release(ddraw7);
+
+    IDirectDraw_Release(ddraw2);
+    IDirectDraw_Release(ddraw);
+
     hr = IDirectDrawMediaStream_CreateSample(pddstream, NULL, NULL, 0, &pddsample);
     ok(hr == S_OK, "got 0x%08x\n", hr);
 




More information about the wine-cvs mailing list