winex11: Consider zero-size windows mapped even when they are positioned at 0,0.
[wine/multimedia.git] / dlls / d3drm / tests / d3drm.c
blobff2986b152e6d849b0b3fc18300d0779c47cf7e1
1 /*
2 * Copyright 2010 Christian Costa
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19 #define COBJMACROS
20 #include <d3drm.h>
21 #include <initguid.h>
23 #include "wine/test.h"
25 static HMODULE d3drm_handle = 0;
27 static HRESULT (WINAPI * pDirect3DRMCreate)(LPDIRECT3DRM* ppDirect3DRM);
29 #define CHECK_REFCOUNT(obj,rc) \
30 { \
31 int rc_new = rc; \
32 int count = get_refcount( (IUnknown *)obj ); \
33 ok(count == rc_new, "Invalid refcount. Expected %d got %d\n", rc_new, count); \
36 #define D3DRM_GET_PROC(func) \
37 p ## func = (void*)GetProcAddress(d3drm_handle, #func); \
38 if(!p ## func) { \
39 trace("GetProcAddress(%s) failed\n", #func); \
40 FreeLibrary(d3drm_handle); \
41 return FALSE; \
44 static BOOL InitFunctionPtrs(void)
46 d3drm_handle = LoadLibraryA("d3drm.dll");
48 if(!d3drm_handle)
50 skip("Could not load d3drm.dll\n");
51 return FALSE;
54 D3DRM_GET_PROC(Direct3DRMCreate)
56 return TRUE;
59 static int get_refcount(IUnknown *object)
61 IUnknown_AddRef( object );
62 return IUnknown_Release( object );
65 static char data_bad_version[] =
66 "xof 0302txt 0064\n"
67 "Header Object\n"
68 "{\n"
69 "1; 2; 3;\n"
70 "}\n";
72 static char data_no_mesh[] =
73 "xof 0302txt 0064\n"
74 "Header Object\n"
75 "{\n"
76 "1; 0; 1;\n"
77 "}\n";
79 static char data_ok[] =
80 "xof 0302txt 0064\n"
81 "Header Object\n"
82 "{\n"
83 "1; 0; 1;\n"
84 "}\n"
85 "Mesh Object\n"
86 "{\n"
87 "4;\n"
88 "1.0; 0.0; 0.0;,\n"
89 "0.0; 1.0; 0.0;,\n"
90 "0.0; 0.0; 1.0;,\n"
91 "1.0; 1.0; 1.0;;\n"
92 "3;\n"
93 "3; 0, 1, 2;,\n"
94 "3; 1, 2, 3;,\n"
95 "3; 3, 1, 2;;\n"
96 "}\n";
98 static void test_MeshBuilder(void)
100 HRESULT hr;
101 LPDIRECT3DRM pD3DRM;
102 LPDIRECT3DRMMESHBUILDER pMeshBuilder;
103 D3DRMLOADMEMORY info;
104 int val;
105 DWORD val1, val2, val3;
106 D3DVALUE valu, valv;
108 hr = pDirect3DRMCreate(&pD3DRM);
109 ok(hr == D3DRM_OK, "Cannot get IDirect3DRM interface (hr = %x)\n", hr);
111 hr = IDirect3DRM_CreateMeshBuilder(pD3DRM, &pMeshBuilder);
112 ok(hr == D3DRM_OK, "Cannot get IDirect3DRMMeshBuilder interface (hr = %x)\n", hr);
114 info.lpMemory = data_bad_version;
115 info.dSize = strlen(data_bad_version);
116 hr = IDirect3DRMMeshBuilder_Load(pMeshBuilder, &info, NULL, D3DRMLOAD_FROMMEMORY, NULL, NULL);
117 ok(hr == D3DRMERR_BADFILE, "Should have returned D3DRMERR_BADFILE (hr = %x)\n", hr);
119 info.lpMemory = data_no_mesh;
120 info.dSize = strlen(data_no_mesh);
121 hr = IDirect3DRMMeshBuilder_Load(pMeshBuilder, &info, NULL, D3DRMLOAD_FROMMEMORY, NULL, NULL);
122 ok(hr == D3DRMERR_NOTFOUND, "Should have returned D3DRMERR_NOTFOUND (hr = %x)\n", hr);
124 info.lpMemory = data_ok;
125 info.dSize = strlen(data_ok);
126 hr = IDirect3DRMMeshBuilder_Load(pMeshBuilder, &info, NULL, D3DRMLOAD_FROMMEMORY, NULL, NULL);
127 ok(hr == D3DRM_OK, "Cannot load mesh data (hr = %x)\n", hr);
129 val = IDirect3DRMMeshBuilder_GetVertexCount(pMeshBuilder);
130 ok(val == 4, "Wrong number of vertices %d (must be 4)\n", val);
132 val = IDirect3DRMMeshBuilder_GetFaceCount(pMeshBuilder);
133 ok(val == 3, "Wrong number of faces %d (must be 3)\n", val);
135 hr = IDirect3DRMMeshBuilder_GetVertices(pMeshBuilder, &val1, NULL, &val2, NULL, &val3, NULL);
136 ok(hr == D3DRM_OK, "Cannot get vertices information (hr = %x)\n", hr);
137 ok(val1 == 4, "Wrong number of vertices %d (must be 4)\n", val1);
138 todo_wine ok(val2 == 4, "Wrong number of normals %d (must be 4)\n", val2);
139 todo_wine ok(val3 == 22, "Wrong number of face data bytes %d (must be 22)\n", val3);
141 valu = 1.23f;
142 valv = 3.21f;
143 hr = IDirect3DRMMeshBuilder_GetTextureCoordinates(pMeshBuilder, 1, &valu, &valv);
144 todo_wine ok(hr == D3DRM_OK, "Cannot get texture coordinates (hr = %x)\n", hr);
145 todo_wine ok(valu == 0.0f, "Wrong coordinate %f (must be 0.0)\n", valu);
146 todo_wine ok(valv == 0.0f, "Wrong coordinate %f (must be 0.0)\n", valv);
148 valu = 1.23f;
149 valv = 3.21f;
150 hr = IDirect3DRMMeshBuilder_SetTextureCoordinates(pMeshBuilder, 1, valu, valv);
151 todo_wine ok(hr == D3DRM_OK, "Cannot set texture coordinates (hr = %x)\n", hr);
153 valu = 0.0f;
154 valv = 0.0f;
155 hr = IDirect3DRMMeshBuilder_GetTextureCoordinates(pMeshBuilder, 1, &valu, &valv);
156 todo_wine ok(hr == D3DRM_OK, "Cannot get texture coordinates (hr = %x)\n", hr);
157 todo_wine ok(valu == 1.23f, "Wrong coordinate %f (must be 1.23)\n", valu);
158 todo_wine ok(valv == 3.21f, "Wrong coordinate %f (must be 3.21)\n", valv);
160 IDirect3DRMMeshBuilder_Release(pMeshBuilder);
162 IDirect3DRM_Release(pD3DRM);
165 static void test_MeshBuilder3(void)
167 HRESULT hr;
168 LPDIRECT3DRM pD3DRM;
169 LPDIRECT3DRM3 pD3DRM3;
170 LPDIRECT3DRMMESHBUILDER3 pMeshBuilder3;
171 D3DRMLOADMEMORY info;
172 int val;
173 DWORD val1;
174 D3DVALUE valu, valv;
176 hr = pDirect3DRMCreate(&pD3DRM);
177 ok(hr == D3DRM_OK, "Cannot get IDirect3DRM interface (hr = %x)\n", hr);
179 hr = IDirect3DRM_QueryInterface(pD3DRM, &IID_IDirect3DRM3, (LPVOID*)&pD3DRM3);
180 if (FAILED(hr))
182 win_skip("Cannot get IDirect3DRM3 interface (hr = %x), skipping tests\n", hr);
183 IDirect3DRM_Release(pD3DRM);
184 return;
187 hr = IDirect3DRM3_CreateMeshBuilder(pD3DRM3, &pMeshBuilder3);
188 ok(hr == D3DRM_OK, "Cannot get IDirect3DRMMeshBuilder3 interface (hr = %x)\n", hr);
190 info.lpMemory = data_bad_version;
191 info.dSize = strlen(data_bad_version);
192 hr = IDirect3DRMMeshBuilder3_Load(pMeshBuilder3, &info, NULL, D3DRMLOAD_FROMMEMORY, NULL, NULL);
193 ok(hr == D3DRMERR_BADFILE, "Should have returned D3DRMERR_BADFILE (hr = %x)\n", hr);
195 info.lpMemory = data_no_mesh;
196 info.dSize = strlen(data_no_mesh);
197 hr = IDirect3DRMMeshBuilder3_Load(pMeshBuilder3, &info, NULL, D3DRMLOAD_FROMMEMORY, NULL, NULL);
198 ok(hr == D3DRMERR_NOTFOUND, "Should have returned D3DRMERR_NOTFOUND (hr = %x)\n", hr);
200 info.lpMemory = data_ok;
201 info.dSize = strlen(data_ok);
202 hr = IDirect3DRMMeshBuilder3_Load(pMeshBuilder3, &info, NULL, D3DRMLOAD_FROMMEMORY, NULL, NULL);
203 ok(hr == D3DRM_OK, "Cannot load mesh data (hr = %x)\n", hr);
205 val = IDirect3DRMMeshBuilder3_GetVertexCount(pMeshBuilder3);
206 ok(val == 4, "Wrong number of vertices %d (must be 4)\n", val);
208 val = IDirect3DRMMeshBuilder3_GetFaceCount(pMeshBuilder3);
209 ok(val == 3, "Wrong number of faces %d (must be 3)\n", val);
211 hr = IDirect3DRMMeshBuilder3_GetVertices(pMeshBuilder3, 0, &val1, NULL);
212 ok(hr == D3DRM_OK, "Cannot get vertices information (hr = %x)\n", hr);
213 ok(val1 == 4, "Wrong number of vertices %d (must be 4)\n", val1);
215 valu = 1.23f;
216 valv = 3.21f;
217 hr = IDirect3DRMMeshBuilder3_GetTextureCoordinates(pMeshBuilder3, 1, &valu, &valv);
218 todo_wine ok(hr == D3DRM_OK, "Cannot get texture coordinates (hr = %x)\n", hr);
219 todo_wine ok(valu == 0.0f, "Wrong coordinate %f (must be 0.0)\n", valu);
220 todo_wine ok(valv == 0.0f, "Wrong coordinate %f (must be 0.0)\n", valv);
222 valu = 1.23f;
223 valv = 3.21f;
224 hr = IDirect3DRMMeshBuilder3_SetTextureCoordinates(pMeshBuilder3, 1, valu, valv);
225 todo_wine ok(hr == D3DRM_OK, "Cannot set texture coordinates (hr = %x)\n", hr);
227 valu = 0.0f;
228 valv = 0.0f;
229 hr = IDirect3DRMMeshBuilder3_GetTextureCoordinates(pMeshBuilder3, 1, &valu, &valv);
230 todo_wine ok(hr == D3DRM_OK, "Cannot get texture coordinates (hr = %x)\n", hr);
231 todo_wine ok(valu == 1.23f, "Wrong coordinate %f (must be 1.23)\n", valu);
232 todo_wine ok(valv == 3.21f, "Wrong coordinate %f (must be 3.21)\n", valv);
234 IDirect3DRMMeshBuilder3_Release(pMeshBuilder3);
235 IDirect3DRM3_Release(pD3DRM3);
236 IDirect3DRM_Release(pD3DRM);
239 static void test_Frame(void)
241 HRESULT hr;
242 LPDIRECT3DRM pD3DRM;
243 LPDIRECT3DRMFRAME pFrameC;
244 LPDIRECT3DRMFRAME pFrameP1;
245 LPDIRECT3DRMFRAME pFrameP2;
246 LPDIRECT3DRMFRAME pFrameTmp;
247 LPDIRECT3DRMFRAMEARRAY pArray;
248 DWORD count;
250 hr = pDirect3DRMCreate(&pD3DRM);
251 ok(hr == D3DRM_OK, "Cannot get IDirect3DRM interface (hr = %x)\n", hr);
253 hr = IDirect3DRM_CreateFrame(pD3DRM, NULL, &pFrameC);
254 ok(hr == D3DRM_OK, "Cannot get IDirect3DRMFrame interface (hr = %x)\n", hr);
255 CHECK_REFCOUNT(pFrameC, 1);
257 pFrameTmp = (void*)0xdeadbeef;
258 hr = IDirect3DRMFrame_GetParent(pFrameC, &pFrameTmp);
259 todo_wine ok(hr == D3DRM_OK, "Cannot get parent frame (hr = %x)\n", hr);
260 todo_wine ok(pFrameTmp == NULL, "pFrameTmp = %p\n", pFrameTmp);
261 CHECK_REFCOUNT(pFrameC, 1);
263 pArray = NULL;
264 hr = IDirect3DRMFrame_GetChildren(pFrameC, &pArray);
265 todo_wine ok(hr == D3DRM_OK, "Cannot get children (hr = %x)\n", hr);
266 todo_wine ok(pArray != NULL, "pArray = %p\n", pArray);
267 if (pArray)
269 count = IDirect3DRMFrameArray_GetSize(pArray);
270 ok(count == 0, "count = %u\n", count);
271 IDirect3DRMFrameArray_Release(pArray);
274 hr = IDirect3DRM_CreateFrame(pD3DRM, NULL, &pFrameP1);
275 ok(hr == D3DRM_OK, "Cannot get IDirect3DRMFrame interface (hr = %x)\n", hr);
277 /* [Add/Delete]Child with NULL pointer */
278 hr = IDirect3DRMFrame_AddChild(pFrameP1, NULL);
279 todo_wine ok(hr == D3DRMERR_BADOBJECT, "Should have returned D3DRMERR_BADOBJECT (hr = %x)\n", hr);
280 CHECK_REFCOUNT(pFrameP1, 1);
282 hr = IDirect3DRMFrame_DeleteChild(pFrameP1, NULL);
283 todo_wine ok(hr == D3DRMERR_BADOBJECT, "Should have returned D3DRMERR_BADOBJECT (hr = %x)\n", hr);
284 CHECK_REFCOUNT(pFrameP1, 1);
286 /* Add child to first parent */
287 pFrameTmp = (void*)0xdeadbeef;
288 hr = IDirect3DRMFrame_GetParent(pFrameP1, &pFrameTmp);
289 todo_wine ok(hr == D3DRM_OK, "Cannot get parent frame (hr = %x)\n", hr);
290 todo_wine ok(pFrameTmp == NULL, "pFrameTmp = %p\n", pFrameTmp);
292 hr = IDirect3DRMFrame_AddChild(pFrameP1, pFrameC);
293 todo_wine ok(hr == D3DRM_OK, "Cannot add child frame (hr = %x)\n", hr);
294 CHECK_REFCOUNT(pFrameP1, 1);
295 todo_wine CHECK_REFCOUNT(pFrameC, 2);
297 pArray = NULL;
298 hr = IDirect3DRMFrame_GetChildren(pFrameP1, &pArray);
299 todo_wine ok(hr == D3DRM_OK, "Cannot get children (hr = %x)\n", hr);
300 if (pArray)
302 count = IDirect3DRMFrameArray_GetSize(pArray);
303 ok(count == 1, "count = %u\n", count);
304 IDirect3DRMFrameArray_Release(pArray);
307 pFrameTmp = (void*)0xdeadbeef;
308 hr = IDirect3DRMFrame_GetParent(pFrameC, &pFrameTmp);
309 todo_wine ok(hr == D3DRM_OK, "Cannot get parent frame (hr = %x)\n", hr);
310 todo_wine ok(pFrameTmp == pFrameP1, "pFrameTmp = %p\n", pFrameTmp);
311 todo_wine CHECK_REFCOUNT(pFrameP1, 2);
313 /* Add child to second parent */
314 hr = IDirect3DRM_CreateFrame(pD3DRM, NULL, &pFrameP2);
315 ok(hr == D3DRM_OK, "Cannot get IDirect3DRMFrame interface (hr = %x)\n", hr);
317 hr = IDirect3DRMFrame_AddChild(pFrameP2, pFrameC);
318 todo_wine ok(hr == D3DRM_OK, "Cannot add child frame (hr = %x)\n", hr);
319 todo_wine CHECK_REFCOUNT(pFrameC, 2);
321 pArray = NULL;
322 hr = IDirect3DRMFrame_GetChildren(pFrameP2, &pArray);
323 todo_wine ok(hr == D3DRM_OK, "Cannot get children (hr = %x)\n", hr);
324 if (pArray)
326 count = IDirect3DRMFrameArray_GetSize(pArray);
327 ok(count == 1, "count = %u\n", count);
328 IDirect3DRMFrameArray_Release(pArray);
331 pArray = NULL;
332 hr = IDirect3DRMFrame_GetChildren(pFrameP1, &pArray);
333 todo_wine ok(hr == D3DRM_OK, "Cannot get children (hr = %x)\n", hr);
334 if (pArray)
336 count = IDirect3DRMFrameArray_GetSize(pArray);
337 ok(count == 0, "count = %u\n", count);
338 IDirect3DRMFrameArray_Release(pArray);
341 pFrameTmp = (void*)0xdeadbeef;
342 hr = IDirect3DRMFrame_GetParent(pFrameC, &pFrameTmp);
343 todo_wine ok(hr == D3DRM_OK, "Cannot get parent frame (hr = %x)\n", hr);
344 todo_wine ok(pFrameTmp == pFrameP2, "pFrameTmp = %p\n", pFrameTmp);
345 todo_wine CHECK_REFCOUNT(pFrameP2, 2);
346 todo_wine CHECK_REFCOUNT(pFrameC, 2);
348 /* Add child again */
349 hr = IDirect3DRMFrame_AddChild(pFrameP2, pFrameC);
350 todo_wine ok(hr == D3DRM_OK, "Cannot add child frame (hr = %x)\n", hr);
351 todo_wine CHECK_REFCOUNT(pFrameC, 2);
353 pArray = NULL;
354 hr = IDirect3DRMFrame_GetChildren(pFrameP2, &pArray);
355 todo_wine ok(hr == D3DRM_OK, "Cannot get children (hr = %x)\n", hr);
356 if (pArray)
358 count = IDirect3DRMFrameArray_GetSize(pArray);
359 ok(count == 1, "count = %u\n", count);
360 IDirect3DRMFrameArray_Release(pArray);
363 /* Delete child */
364 hr = IDirect3DRMFrame_DeleteChild(pFrameP2, pFrameC);
365 todo_wine ok(hr == D3DRM_OK, "Cannot delete child frame (hr = %x)\n", hr);
366 CHECK_REFCOUNT(pFrameC, 1);
368 pArray = NULL;
369 hr = IDirect3DRMFrame_GetChildren(pFrameP2, &pArray);
370 todo_wine ok(hr == D3DRM_OK, "Cannot get children (hr = %x)\n", hr);
371 if (pArray)
373 count = IDirect3DRMFrameArray_GetSize(pArray);
374 ok(count == 0, "count = %u\n", count);
375 IDirect3DRMFrameArray_Release(pArray);
378 pFrameTmp = (void*)0xdeadbeef;
379 hr = IDirect3DRMFrame_GetParent(pFrameC, &pFrameTmp);
380 todo_wine ok(hr == D3DRM_OK, "Cannot get parent frame (hr = %x)\n", hr);
381 todo_wine ok(pFrameTmp == NULL, "pFrameTmp = %p\n", pFrameTmp);
383 /* Add two children */
384 hr = IDirect3DRMFrame_AddChild(pFrameP2, pFrameC);
385 todo_wine ok(hr == D3DRM_OK, "Cannot add child frame (hr = %x)\n", hr);
386 todo_wine CHECK_REFCOUNT(pFrameC, 2);
388 hr = IDirect3DRMFrame_AddChild(pFrameP2, pFrameP1);
389 todo_wine ok(hr == D3DRM_OK, "Cannot add child frame (hr = %x)\n", hr);
390 todo_wine CHECK_REFCOUNT(pFrameP1, 3);
392 pArray = NULL;
393 hr = IDirect3DRMFrame_GetChildren(pFrameP2, &pArray);
394 todo_wine ok(hr == D3DRM_OK, "Cannot get children (hr = %x)\n", hr);
395 if (pArray)
397 count = IDirect3DRMFrameArray_GetSize(pArray);
398 ok(count == 2, "count = %u\n", count);
399 IDirect3DRMFrameArray_Release(pArray);
402 IDirect3DRMMeshBuilder_Release(pFrameP2);
403 todo_wine CHECK_REFCOUNT(pFrameC, 2);
404 todo_wine CHECK_REFCOUNT(pFrameP1, 3);
406 IDirect3DRMMeshBuilder_Release(pFrameC);
407 IDirect3DRMMeshBuilder_Release(pFrameP1);
409 IDirect3DRM_Release(pD3DRM);
412 START_TEST(d3drm)
414 if (!InitFunctionPtrs())
415 return;
417 test_MeshBuilder();
418 test_MeshBuilder3();
419 test_Frame();
421 FreeLibrary(d3drm_handle);