[PATCH] ddraw: Enable GetViewport to retreive data set by SetViewport2 and vice-verca + tests
Christian Costa
titan.costa at wanadoo.fr
Mon Feb 15 02:49:16 CST 2010
---
dlls/ddraw/tests/d3d.c | 167 ++++++++++++++++++++++++++++++++++++++++++++++++
dlls/ddraw/viewport.c | 46 ++++++++++---
2 files changed, 201 insertions(+), 12 deletions(-)
-------------- next part --------------
diff --git a/dlls/ddraw/tests/d3d.c b/dlls/ddraw/tests/d3d.c
index 134db9f..e922f5d 100644
--- a/dlls/ddraw/tests/d3d.c
+++ b/dlls/ddraw/tests/d3d.c
@@ -1028,6 +1028,172 @@ static void D3D1_releaseObjects(void)
if (DirectDraw1) IDirectDraw_Release(DirectDraw1);
}
+static void ViewportTest(void)
+{
+ HRESULT hr;
+ LPDIRECT3DVIEWPORT2 Viewport2;
+ D3DVIEWPORT vp1_data, ret_vp1_data;
+ D3DVIEWPORT2 vp2_data, ret_vp2_data;
+ float infinity;
+
+ *(DWORD*)&infinity = 0x7f800000;
+
+ hr = IDirect3DDevice_AddViewport(Direct3DDevice1, Viewport);
+ ok(hr == D3D_OK, "IDirect3DDevice_AddViewport returned %08x\n", hr);
+
+ hr = IDirect3DViewport_QueryInterface(Viewport, &IID_IDirect3DViewport2, (void**) &Viewport2);
+ ok(hr==D3D_OK, "QueryInterface returned: %x\n", hr);
+
+ vp1_data.dwSize = sizeof(vp1_data);
+ vp1_data.dwX = 0;
+ vp1_data.dwY = 1;
+ vp1_data.dwWidth = 256;
+ vp1_data.dwHeight = 257;
+ vp1_data.dvMaxX = 0;
+ vp1_data.dvMaxY = 0;
+ vp1_data.dvScaleX = 0;
+ vp1_data.dvScaleY = 0;
+ vp1_data.dvMinZ = 0.25;
+ vp1_data.dvMaxZ = 0.75;
+
+ vp2_data.dwSize = sizeof(vp2_data);
+ vp2_data.dwX = 2;
+ vp2_data.dwY = 3;
+ vp2_data.dwWidth = 258;
+ vp2_data.dwHeight = 259;
+ vp2_data.dvClipX = 0;
+ vp2_data.dvClipY = 0;
+ vp2_data.dvClipWidth = 0;
+ vp2_data.dvClipHeight = 0;
+ vp2_data.dvMinZ = 0.1;
+ vp2_data.dvMaxZ = 0.9;
+
+ hr = IDirect3DViewport2_SetViewport(Viewport2, &vp1_data);
+ ok(hr == D3D_OK, "IDirect3DViewport2_SetViewport returned %08x\n", hr);
+
+ memset(&ret_vp1_data, 0xff, sizeof(ret_vp1_data));
+ ret_vp1_data.dwSize = sizeof(vp1_data);
+
+ hr = IDirect3DViewport2_GetViewport(Viewport2, &ret_vp1_data);
+ ok(hr == D3D_OK, "IDirect3DViewport2_GetViewport returned %08x\n", hr);
+
+ ok(ret_vp1_data.dwX == vp1_data.dwX, "dwX is %u, expected %u\n", ret_vp1_data.dwX, vp1_data.dwX);
+ ok(ret_vp1_data.dwY == vp1_data.dwY, "dwY is %u, expected %u\n", ret_vp1_data.dwY, vp1_data.dwY);
+ ok(ret_vp1_data.dwWidth == vp1_data.dwWidth, "dwWidth is %u, expected %u\n", ret_vp1_data.dwWidth, vp1_data.dwWidth);
+ ok(ret_vp1_data.dwHeight == vp1_data.dwHeight, "dwHeight is %u, expected %u\n", ret_vp1_data.dwHeight, vp1_data.dwHeight);
+ ok(ret_vp1_data.dvMaxX == vp1_data.dvMaxX, "dvMaxX is %f, expected %f\n", ret_vp1_data.dvMaxX, vp1_data.dvMaxX);
+ ok(ret_vp1_data.dvMaxY == vp1_data.dvMaxY, "dvMaxY is %f, expected %f\n", ret_vp1_data.dvMaxY, vp1_data.dvMaxY);
+ todo_wine ok(ret_vp1_data.dvScaleX == infinity, "dvScaleX is %f, expected %f\n", ret_vp1_data.dvScaleX, infinity);
+ todo_wine ok(ret_vp1_data.dvScaleY == infinity, "dvScaleY is %f, expected %f\n", ret_vp1_data.dvScaleY, infinity);
+ ok(ret_vp1_data.dvMinZ == 0.0, "dvMinZ is %f, expected 0.0\n", ret_vp1_data.dvMinZ);
+ ok(ret_vp1_data.dvMaxZ == 1.0, "dvMaxZ is %f, expected 1.0\n", ret_vp1_data.dvMaxZ);
+
+ hr = IDirect3DViewport2_SetViewport2(Viewport2, &vp2_data);
+ ok(hr == D3D_OK, "IDirect3DViewport2_SetViewport2 returned %08x\n", hr);
+
+ memset(&ret_vp2_data, 0xff, sizeof(ret_vp2_data));
+ ret_vp2_data.dwSize = sizeof(vp2_data);
+
+ hr = IDirect3DViewport2_GetViewport2(Viewport2, &ret_vp2_data);
+ ok(hr == D3D_OK, "IDirect3DViewport2_GetViewport2 returned %08x\n", hr);
+
+ ok(ret_vp2_data.dwX == vp2_data.dwX, "dwX is %u, expected %u\n", ret_vp2_data.dwX, vp2_data.dwX);
+ ok(ret_vp2_data.dwY == vp2_data.dwY, "dwY is %u, expected %u\n", ret_vp2_data.dwY, vp2_data.dwY);
+ ok(ret_vp2_data.dwWidth == vp2_data.dwWidth, "dwWidth is %u, expected %u\n", ret_vp2_data.dwWidth, vp2_data.dwWidth);
+ ok(ret_vp2_data.dwHeight == vp2_data.dwHeight, "dwHeight is %u, expected %u\n", ret_vp2_data.dwHeight, vp2_data.dwHeight);
+ ok(ret_vp2_data.dvClipX == vp2_data.dvClipX, "dvClipX is %f, expected %f\n", ret_vp2_data.dvClipX, vp2_data.dvClipX);
+ ok(ret_vp2_data.dvClipY == vp2_data.dvClipY, "dvClipY is %f, expected %f\n", ret_vp2_data.dvClipY, vp2_data.dvClipY);
+ ok(ret_vp2_data.dvClipWidth == vp2_data.dvClipWidth, "dvClipWidth is %f, expected %f\n",
+ ret_vp2_data.dvClipWidth, vp2_data.dvClipWidth);
+ ok(ret_vp2_data.dvClipHeight == vp2_data.dvClipHeight, "dvClipHeight is %f, expected %f\n",
+ ret_vp2_data.dvClipHeight, vp2_data.dvClipHeight);
+ ok(ret_vp2_data.dvMinZ == vp2_data.dvMinZ, "dvMinZ is %f, expected %f\n", ret_vp2_data.dvMinZ, vp2_data.dvMinZ);
+ ok(ret_vp2_data.dvMaxZ == vp2_data.dvMaxZ, "dvMaxZ is %f, expected %f\n", ret_vp2_data.dvMaxZ, vp2_data.dvMaxZ);
+
+ memset(&ret_vp1_data, 0xff, sizeof(ret_vp1_data));
+ ret_vp1_data.dwSize = sizeof(vp1_data);
+
+ hr = IDirect3DViewport2_GetViewport(Viewport2, &ret_vp1_data);
+ ok(hr == D3D_OK, "IDirect3DViewport2_GetViewport returned %08x\n", hr);
+
+ ok(ret_vp1_data.dwX == vp2_data.dwX, "dwX is %u, expected %u\n", ret_vp1_data.dwX, vp2_data.dwX);
+ ok(ret_vp1_data.dwY == vp2_data.dwY, "dwY is %u, expected %u\n", ret_vp1_data.dwY, vp2_data.dwY);
+ ok(ret_vp1_data.dwWidth == vp2_data.dwWidth, "dwWidth is %u, expected %u\n", ret_vp1_data.dwWidth, vp2_data.dwWidth);
+ ok(ret_vp1_data.dwHeight == vp2_data.dwHeight, "dwHeight is %u, expected %u\n", ret_vp1_data.dwHeight, vp2_data.dwHeight);
+ ok(ret_vp1_data.dvMaxX == vp1_data.dvMaxX, "dvMaxX is %f, expected %f\n", ret_vp1_data.dvMaxX, vp1_data.dvMaxX);
+ ok(ret_vp1_data.dvMaxY == vp1_data.dvMaxY, "dvMaxY is %f, expected %f\n", ret_vp1_data.dvMaxY, vp1_data.dvMaxY);
+ todo_wine ok(ret_vp1_data.dvScaleX == infinity, "dvScaleX is %f, expected %f\n", ret_vp1_data.dvScaleX, infinity);
+ todo_wine ok(ret_vp1_data.dvScaleY == infinity, "dvScaleY is %f, expected %f\n", ret_vp1_data.dvScaleY, infinity);
+ todo_wine ok(ret_vp1_data.dvMinZ == 0.0, "dvMinZ is %f, expected 0.0\n", ret_vp1_data.dvMinZ);
+ todo_wine ok(ret_vp1_data.dvMaxZ == 1.0, "dvMaxZ is %f, expected 1.0\n", ret_vp1_data.dvMaxZ);
+
+ hr = IDirect3DViewport2_SetViewport2(Viewport2, &vp2_data);
+ ok(hr == D3D_OK, "IDirect3DViewport2_SetViewport2 returned %08x\n", hr);
+
+ memset(&ret_vp2_data, 0xff, sizeof(ret_vp2_data));
+ ret_vp2_data.dwSize = sizeof(vp2_data);
+
+ hr = IDirect3DViewport2_GetViewport2(Viewport2, &ret_vp2_data);
+ ok(hr == D3D_OK, "IDirect3DViewport2_GetViewport2 returned %08x\n", hr);
+
+ ok(ret_vp2_data.dwX == vp2_data.dwX, "dwX is %u, expected %u\n", ret_vp2_data.dwX, vp2_data.dwX);
+ ok(ret_vp2_data.dwY == vp2_data.dwY, "dwY is %u, expected %u\n", ret_vp2_data.dwY, vp2_data.dwY);
+ ok(ret_vp2_data.dwWidth == vp2_data.dwWidth, "dwWidth is %u, expected %u\n", ret_vp2_data.dwWidth, vp2_data.dwWidth);
+ ok(ret_vp2_data.dwHeight == vp2_data.dwHeight, "dwHeight is %u, expected %u\n", ret_vp2_data.dwHeight, vp2_data.dwHeight);
+ ok(ret_vp2_data.dvClipX == vp2_data.dvClipX, "dvClipX is %f, expected %f\n", ret_vp2_data.dvClipX, vp2_data.dvClipX);
+ ok(ret_vp2_data.dvClipY == vp2_data.dvClipY, "dvClipY is %f, expected %f\n", ret_vp2_data.dvClipY, vp2_data.dvClipY);
+ ok(ret_vp2_data.dvClipWidth == vp2_data.dvClipWidth, "dvClipWidth is %f, expected %f\n",
+ ret_vp2_data.dvClipWidth, vp2_data.dvClipWidth);
+ ok(ret_vp2_data.dvClipHeight == vp2_data.dvClipHeight, "dvClipHeight is %f, expected %f\n",
+ ret_vp2_data.dvClipHeight, vp2_data.dvClipHeight);
+ ok(ret_vp2_data.dvMinZ == vp2_data.dvMinZ, "dvMinZ is %f, expected %f\n", ret_vp2_data.dvMinZ, vp2_data.dvMinZ);
+ ok(ret_vp2_data.dvMaxZ == vp2_data.dvMaxZ, "dvMaxZ is %f, expected %f\n", ret_vp2_data.dvMaxZ, vp2_data.dvMaxZ);
+
+ hr = IDirect3DViewport2_SetViewport(Viewport2, &vp1_data);
+ ok(hr == D3D_OK, "IDirect3DViewport2_SetViewport returned %08x\n", hr);
+
+ memset(&ret_vp1_data, 0xff, sizeof(ret_vp1_data));
+ ret_vp1_data.dwSize = sizeof(vp1_data);
+
+ hr = IDirect3DViewport2_GetViewport(Viewport2, &ret_vp1_data);
+ ok(hr == D3D_OK, "IDirect3DViewport2_GetViewport returned %08x\n", hr);
+
+ ok(ret_vp1_data.dwX == vp1_data.dwX, "dwX is %u, expected %u\n", ret_vp1_data.dwX, vp1_data.dwX);
+ ok(ret_vp1_data.dwY == vp1_data.dwY, "dwY is %u, expected %u\n", ret_vp1_data.dwY, vp1_data.dwY);
+ ok(ret_vp1_data.dwWidth == vp1_data.dwWidth, "dwWidth is %u, expected %u\n", ret_vp1_data.dwWidth, vp1_data.dwWidth);
+ ok(ret_vp1_data.dwHeight == vp1_data.dwHeight, "dwHeight is %u, expected %u\n", ret_vp1_data.dwHeight, vp1_data.dwHeight);
+ ok(ret_vp1_data.dvMaxX == vp1_data.dvMaxX, "dvMaxX is %f, expected %f\n", ret_vp1_data.dvMaxX, vp1_data.dvMaxX);
+ ok(ret_vp1_data.dvMaxY == vp1_data.dvMaxY, "dvMaxY is %f, expected %f\n", ret_vp1_data.dvMaxY, vp1_data.dvMaxY);
+ todo_wine ok(ret_vp1_data.dvScaleX == infinity, "dvScaleX is %f, expected %f\n", ret_vp1_data.dvScaleX, infinity);
+ todo_wine ok(ret_vp1_data.dvScaleY == infinity, "dvScaleY is %f, expected %f\n", ret_vp1_data.dvScaleY, infinity);
+ ok(ret_vp1_data.dvMinZ == 0.0, "dvMinZ is %f, expected 0.0\n", ret_vp1_data.dvMinZ);
+ ok(ret_vp1_data.dvMaxZ == 1.0, "dvMaxZ is %f, expected 1.0\n", ret_vp1_data.dvMaxZ);
+
+ memset(&ret_vp2_data, 0xff, sizeof(ret_vp2_data));
+ ret_vp2_data.dwSize = sizeof(vp2_data);
+
+ hr = IDirect3DViewport2_GetViewport2(Viewport2, &ret_vp2_data);
+ ok(hr == D3D_OK, "IDirect3DViewport2_GetViewport2 returned %08x\n", hr);
+
+ ok(ret_vp2_data.dwX == vp1_data.dwX, "dwX is %u, expected %u\n", ret_vp2_data.dwX, vp1_data.dwX);
+ ok(ret_vp2_data.dwY == vp1_data.dwY, "dwY is %u, expected %u\n", ret_vp2_data.dwY, vp1_data.dwY);
+ ok(ret_vp2_data.dwWidth == vp1_data.dwWidth, "dwWidth is %u, expected %u\n", ret_vp2_data.dwWidth, vp1_data.dwWidth);
+ ok(ret_vp2_data.dwHeight == vp1_data.dwHeight, "dwHeight is %u, expected %u\n", ret_vp2_data.dwHeight, vp1_data.dwHeight);
+ ok(ret_vp2_data.dvClipX == vp2_data.dvClipX, "dvClipX is %f, expected %f\n", ret_vp2_data.dvClipX, vp2_data.dvClipX);
+ ok(ret_vp2_data.dvClipY == vp2_data.dvClipY, "dvClipY is %f, expected %f\n", ret_vp2_data.dvClipY, vp2_data.dvClipY);
+ ok(ret_vp2_data.dvClipWidth == vp2_data.dvClipWidth, "dvClipWidth is %f, expected %f\n",
+ ret_vp2_data.dvClipWidth, vp2_data.dvClipWidth);
+ ok(ret_vp2_data.dvClipHeight == vp2_data.dvClipHeight, "dvClipHeight is %f, expected %f\n",
+ ret_vp2_data.dvClipHeight, vp2_data.dvClipHeight);
+ ok(ret_vp2_data.dvMinZ == 0.0, "dvMinZ is %f, expected 0.0\n", ret_vp2_data.dvMinZ);
+ ok(ret_vp2_data.dvMaxZ == 1.0, "dvMaxZ is %f, expected 1.0\n", ret_vp2_data.dvMaxZ);
+
+ IDirect3DViewport2_Release(Viewport2);
+
+ hr = IDirect3DDevice_DeleteViewport(Direct3DDevice1, Viewport);
+ ok(hr == D3D_OK, "IDirect3DDevice_DeleteViewport returned %08x\n", hr);
+}
+
#define SET_VP_DATA(vp_data) \
vp_data.dwSize = sizeof(vp_data); \
vp_data.dwX = 0; \
@@ -3258,6 +3424,7 @@ START_TEST(d3d)
} else {
Direct3D1Test();
TextureLoadTest();
+ ViewportTest();
D3D1_releaseObjects();
}
diff --git a/dlls/ddraw/viewport.c b/dlls/ddraw/viewport.c
index 9b06989..b637df1 100644
--- a/dlls/ddraw/viewport.c
+++ b/dlls/ddraw/viewport.c
@@ -255,14 +255,25 @@ IDirect3DViewportImpl_GetViewport(IDirect3DViewport3 *iface,
TRACE("(%p/%p)->(%p)\n", This, iface, lpData);
EnterCriticalSection(&ddraw_cs);
- if (This->use_vp2 != 0) {
- ERR(" Requesting to get a D3DVIEWPORT struct where a D3DVIEWPORT2 was set !\n");
- LeaveCriticalSection(&ddraw_cs);
- return DDERR_INVALIDPARAMS;
- }
dwSize = lpData->dwSize;
memset(lpData, 0, dwSize);
- memcpy(lpData, &(This->viewports.vp1), dwSize);
+ if (!This->use_vp2)
+ memcpy(lpData, &(This->viewports.vp1), dwSize);
+ else {
+ D3DVIEWPORT vp1;
+ vp1.dwSize = sizeof(vp1);
+ vp1.dwX = This->viewports.vp2.dwX;
+ vp1.dwY = This->viewports.vp2.dwY;
+ vp1.dwWidth = This->viewports.vp2.dwWidth;
+ vp1.dwHeight = This->viewports.vp2.dwHeight;
+ vp1.dvMaxX = 0.0;
+ vp1.dvMaxY = 0.0;
+ vp1.dvScaleX = 0.0;
+ vp1.dvScaleY = 0.0;
+ vp1.dvMinZ = This->viewports.vp2.dvMinZ;
+ vp1.dvMaxZ = This->viewports.vp2.dvMaxZ;
+ memcpy(lpData, &vp1, dwSize);
+ }
if (TRACE_ON(d3d7)) {
TRACE(" returning D3DVIEWPORT :\n");
@@ -908,14 +919,25 @@ IDirect3DViewportImpl_GetViewport2(IDirect3DViewport3 *iface,
TRACE("(%p)->(%p)\n", This, lpData);
EnterCriticalSection(&ddraw_cs);
- if (This->use_vp2 != 1) {
- ERR(" Requesting to get a D3DVIEWPORT2 struct where a D3DVIEWPORT was set !\n");
- LeaveCriticalSection(&ddraw_cs);
- return DDERR_INVALIDPARAMS;
- }
dwSize = lpData->dwSize;
memset(lpData, 0, dwSize);
- memcpy(lpData, &(This->viewports.vp2), dwSize);
+ if (This->use_vp2)
+ memcpy(lpData, &(This->viewports.vp2), dwSize);
+ else {
+ D3DVIEWPORT2 vp2;
+ vp2.dwSize = sizeof(vp2);
+ vp2.dwX = This->viewports.vp1.dwX;
+ vp2.dwY = This->viewports.vp1.dwY;
+ vp2.dwWidth = This->viewports.vp1.dwWidth;
+ vp2.dwHeight = This->viewports.vp1.dwHeight;
+ vp2.dvClipX = 0.0;
+ vp2.dvClipY = 0.0;
+ vp2.dvClipWidth = 0.0;
+ vp2.dvClipHeight = 0.0;
+ vp2.dvMinZ = This->viewports.vp1.dvMinZ;
+ vp2.dvMaxZ = This->viewports.vp1.dvMaxZ;
+ memcpy(lpData, &vp2, dwSize);
+ }
if (TRACE_ON(d3d7)) {
TRACE(" returning D3DVIEWPORT2 :\n");
More information about the wine-patches
mailing list