Nikolay Sivov : amstream: Create a surface if it wasn' t provided in CreateSample().
Alexandre Julliard
julliard at wine.codeweavers.com
Wed Jun 24 09:51:04 CDT 2015
Module: wine
Branch: master
Commit: ed06707bacece1dfe03338039738d453af11fa30
URL: http://source.winehq.org/git/wine.git/?a=commit;h=ed06707bacece1dfe03338039738d453af11fa30
Author: Nikolay Sivov <nsivov at codeweavers.com>
Date: Tue Jun 23 23:24:46 2015 +0300
amstream: Create a surface if it wasn't provided in CreateSample().
---
dlls/amstream/mediastream.c | 37 +++++++++++++++++++++++++++++++++++--
dlls/amstream/tests/amstream.c | 15 +++++++++++++--
2 files changed, 48 insertions(+), 4 deletions(-)
diff --git a/dlls/amstream/mediastream.c b/dlls/amstream/mediastream.c
index ca4f0ce..947be1e 100644
--- a/dlls/amstream/mediastream.c
+++ b/dlls/amstream/mediastream.c
@@ -364,6 +364,7 @@ static HRESULT WINAPI DirectDrawMediaStreamImpl_IDirectDrawMediaStream_GetDirect
HRESULT hr = DirectDrawCreateEx(NULL, (void**)&This->ddraw, &IID_IDirectDraw7, NULL);
if (FAILED(hr))
return hr;
+ IDirectDraw7_SetCooperativeLevel(This->ddraw, NULL, DDSCL_NORMAL);
}
return IDirectDraw7_QueryInterface(This->ddraw, &IID_IDirectDraw, (void**)ddraw);
@@ -979,7 +980,39 @@ static HRESULT ddrawstreamsample_create(IDirectDrawMediaStream *parent, IDirectD
IDirectDrawSurface_AddRef(surface);
}
else
- FIXME("create ddraw surface\n");
+ {
+ DDSURFACEDESC desc;
+ IDirectDraw *ddraw;
+
+ hr = IDirectDrawMediaStream_GetDirectDraw(parent, &ddraw);
+ if (FAILED(hr))
+ {
+ IDirectDrawStreamSample_Release(&object->IDirectDrawStreamSample_iface);
+ return hr;
+ }
+
+ desc.dwSize = sizeof(desc);
+ desc.dwFlags = DDSD_CAPS|DDSD_HEIGHT|DDSD_WIDTH|DDSD_PIXELFORMAT;
+ desc.dwHeight = 100;
+ desc.dwWidth = 100;
+ desc.ddpfPixelFormat.dwSize = sizeof(desc.ddpfPixelFormat);
+ desc.ddpfPixelFormat.dwFlags = DDPF_RGB;
+ desc.ddpfPixelFormat.dwRGBBitCount = 32;
+ desc.ddpfPixelFormat.dwRBitMask = 0xff0000;
+ desc.ddpfPixelFormat.dwGBitMask = 0x00ff00;
+ desc.ddpfPixelFormat.dwBBitMask = 0x0000ff;
+ desc.ddpfPixelFormat.dwRGBAlphaBitMask = 0;
+ desc.ddsCaps.dwCaps = DDSCAPS_SYSTEMMEMORY|DDSCAPS_OFFSCREENPLAIN;
+
+ hr = IDirectDraw_CreateSurface(ddraw, &desc, &object->surface, NULL);
+ IDirectDraw_Release(ddraw);
+ if (FAILED(hr))
+ {
+ ERR("failed to create surface, 0x%08x\n", hr);
+ IDirectDrawStreamSample_Release(&object->IDirectDrawStreamSample_iface);
+ return hr;
+ }
+ }
if (rect)
object->rect = *rect;
@@ -995,7 +1028,7 @@ static HRESULT ddrawstreamsample_create(IDirectDrawMediaStream *parent, IDirectD
}
}
- *ddraw_stream_sample = (IDirectDrawStreamSample*)&object->IDirectDrawStreamSample_iface;
+ *ddraw_stream_sample = &object->IDirectDrawStreamSample_iface;
return S_OK;
}
diff --git a/dlls/amstream/tests/amstream.c b/dlls/amstream/tests/amstream.c
index b961084..909a738 100644
--- a/dlls/amstream/tests/amstream.c
+++ b/dlls/amstream/tests/amstream.c
@@ -452,11 +452,13 @@ static void test_media_streams(void)
static void test_IDirectDrawStreamSample(void)
{
+ DDSURFACEDESC desc = { sizeof(desc) };
IAMMultiMediaStream *pams;
HRESULT hr;
IMediaStream *pvidstream = NULL;
IDirectDrawMediaStream *pddstream = NULL;
IDirectDrawStreamSample *pddsample = NULL;
+ IDirectDrawSurface7 *surface7;
IDirectDrawSurface *surface, *surface2;
IDirectDraw *ddraw, *ddraw2;
IDirectDraw7 *ddraw7;
@@ -504,9 +506,18 @@ static void test_IDirectDrawStreamSample(void)
surface = NULL;
hr = IDirectDrawStreamSample_GetSurface(pddsample, &surface, &rect);
ok(hr == S_OK, "got 0x%08x\n", hr);
-todo_wine
ok(surface != NULL, "got %p\n", surface);
-if (surface)
+
+ hr = IDirectDrawSurface_QueryInterface(surface, &IID_IDirectDrawSurface7, (void**)&surface7);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+ IDirectDrawSurface7_Release(surface7);
+
+ hr = IDirectDrawSurface_GetSurfaceDesc(surface, &desc);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+ ok(desc.dwWidth == 100, "width %d\n", desc.dwWidth);
+ ok(desc.dwHeight == 100, "height %d\n", desc.dwHeight);
+ ok(desc.ddpfPixelFormat.dwFlags == DDPF_RGB, "format flags %08x\n", desc.ddpfPixelFormat.dwFlags);
+ ok(desc.ddpfPixelFormat.dwRGBBitCount, "dwRGBBitCount %d\n", desc.ddpfPixelFormat.dwRGBBitCount);
IDirectDrawSurface_Release(surface);
IDirectDrawStreamSample_Release(pddsample);
More information about the wine-cvs
mailing list