d3drm: Implement width and height handling in device interfaces.
[wine] / dlls / d3drm / device.c
1 /*
2  * Implementation of IDirect3DRMDevice Interface
3  *
4  * Copyright 2011, 2012 AndrĂ© Hentschel
5  *
6  * This file contains the (internal) driver registration functions,
7  * driver enumeration APIs and DirectDraw creation functions.
8  *
9  * This library is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU Lesser General Public
11  * License as published by the Free Software Foundation; either
12  * version 2.1 of the License, or (at your option) any later version.
13  *
14  * This library is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17  * Lesser General Public License for more details.
18  *
19  * You should have received a copy of the GNU Lesser General Public
20  * License along with this library; if not, write to the Free Software
21  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
22  */
23
24 #include "wine/debug.h"
25
26 #define COBJMACROS
27
28 #include "winbase.h"
29 #include "wingdi.h"
30
31 #include "d3drm_private.h"
32 #include "initguid.h"
33 #include "d3drmwin.h"
34
35 WINE_DEFAULT_DEBUG_CHANNEL(d3drm);
36
37 typedef struct {
38     IDirect3DRMDevice2 IDirect3DRMDevice2_iface;
39     IDirect3DRMDevice3 IDirect3DRMDevice3_iface;
40     IDirect3DRMWinDevice IDirect3DRMWinDevice_iface;
41     LONG ref;
42     BOOL dither;
43     D3DRMRENDERQUALITY quality;
44     DWORD rendermode;
45     DWORD height;
46     DWORD width;
47 } IDirect3DRMDeviceImpl;
48
49 static inline IDirect3DRMDeviceImpl *impl_from_IDirect3DRMDevice2(IDirect3DRMDevice2 *iface)
50 {
51     return CONTAINING_RECORD(iface, IDirect3DRMDeviceImpl, IDirect3DRMDevice2_iface);
52 }
53
54 static inline IDirect3DRMDeviceImpl *impl_from_IDirect3DRMDevice3(IDirect3DRMDevice3 *iface)
55 {
56     return CONTAINING_RECORD(iface, IDirect3DRMDeviceImpl, IDirect3DRMDevice3_iface);
57 }
58
59 static inline IDirect3DRMDeviceImpl *impl_from_IDirect3DRMWinDevice(IDirect3DRMWinDevice *iface)
60 {
61     return CONTAINING_RECORD(iface, IDirect3DRMDeviceImpl, IDirect3DRMWinDevice_iface);
62 }
63
64 /*** IUnknown methods ***/
65 static HRESULT WINAPI IDirect3DRMDevice2Impl_QueryInterface(IDirect3DRMDevice2* iface,
66                                                             REFIID riid, void** object)
67 {
68     IDirect3DRMDeviceImpl *This = impl_from_IDirect3DRMDevice2(iface);
69
70     TRACE("(%p/%p)->(%s, %p)\n", iface, This, debugstr_guid(riid), object);
71
72     *object = NULL;
73
74     if (IsEqualGUID(riid, &IID_IUnknown) ||
75         IsEqualGUID(riid, &IID_IDirect3DRMDevice) ||
76         IsEqualGUID(riid, &IID_IDirect3DRMDevice2))
77     {
78         *object = &This->IDirect3DRMDevice2_iface;
79     }
80     else if(IsEqualGUID(riid, &IID_IDirect3DRMDevice3))
81     {
82         *object = &This->IDirect3DRMDevice3_iface;
83     }
84     else if(IsEqualGUID(riid, &IID_IDirect3DRMWinDevice))
85     {
86         *object = &This->IDirect3DRMWinDevice_iface;
87     }
88     else
89     {
90         FIXME("interface %s not implemented\n", debugstr_guid(riid));
91         return E_NOINTERFACE;
92     }
93
94     IDirect3DRMDevice2_AddRef(iface);
95     return S_OK;
96 }
97
98 static ULONG WINAPI IDirect3DRMDevice2Impl_AddRef(IDirect3DRMDevice2* iface)
99 {
100     IDirect3DRMDeviceImpl *This = impl_from_IDirect3DRMDevice2(iface);
101     ULONG ref = InterlockedIncrement(&This->ref);
102
103     TRACE("(%p)->(): new ref = %d\n", iface, ref);
104
105     return ref;
106 }
107
108 static ULONG WINAPI IDirect3DRMDevice2Impl_Release(IDirect3DRMDevice2* iface)
109 {
110     IDirect3DRMDeviceImpl *This = impl_from_IDirect3DRMDevice2(iface);
111     ULONG ref = InterlockedDecrement(&This->ref);
112
113     TRACE("(%p)->(): new ref = %d\n", iface, ref);
114
115     if (!ref)
116         HeapFree(GetProcessHeap(), 0, This);
117
118     return ref;
119 }
120
121 /*** IDirect3DRMObject methods ***/
122 static HRESULT WINAPI IDirect3DRMDevice2Impl_Clone(IDirect3DRMDevice2* iface,
123                                                         LPUNKNOWN unkwn, REFIID riid,
124                                                         LPVOID* object)
125 {
126     IDirect3DRMDeviceImpl *This = impl_from_IDirect3DRMDevice2(iface);
127
128     FIXME("(%p/%p)->(%p, %s, %p): stub\n", iface, This, unkwn, debugstr_guid(riid), object);
129
130     return E_NOTIMPL;
131 }
132
133 static HRESULT WINAPI IDirect3DRMDevice2Impl_AddDestroyCallback(IDirect3DRMDevice2* iface,
134                                                                      D3DRMOBJECTCALLBACK cb,
135                                                                      LPVOID argument)
136 {
137     IDirect3DRMDeviceImpl *This = impl_from_IDirect3DRMDevice2(iface);
138
139     FIXME("(%p/%p)->(%p, %p): stub\n", iface, This, cb, argument);
140
141     return E_NOTIMPL;
142 }
143
144 static HRESULT WINAPI IDirect3DRMDevice2Impl_DeleteDestroyCallback(IDirect3DRMDevice2* iface,
145                                                                         D3DRMOBJECTCALLBACK cb,
146                                                                         LPVOID argument)
147 {
148     IDirect3DRMDeviceImpl *This = impl_from_IDirect3DRMDevice2(iface);
149
150     FIXME("(%p/%p)->(%p, %p): stub\n", iface, This, cb, argument);
151
152     return E_NOTIMPL;
153 }
154
155 static HRESULT WINAPI IDirect3DRMDevice2Impl_SetAppData(IDirect3DRMDevice2* iface,
156                                                              DWORD data)
157 {
158     IDirect3DRMDeviceImpl *This = impl_from_IDirect3DRMDevice2(iface);
159
160     FIXME("(%p/%p)->(%u): stub\n", iface, This, data);
161
162     return E_NOTIMPL;
163 }
164
165 static DWORD WINAPI IDirect3DRMDevice2Impl_GetAppData(IDirect3DRMDevice2* iface)
166 {
167     IDirect3DRMDeviceImpl *This = impl_from_IDirect3DRMDevice2(iface);
168
169     FIXME("(%p/%p)->(): stub\n", iface, This);
170
171     return 0;
172 }
173
174 static HRESULT WINAPI IDirect3DRMDevice2Impl_SetName(IDirect3DRMDevice2* iface, LPCSTR name)
175 {
176     IDirect3DRMDeviceImpl *This = impl_from_IDirect3DRMDevice2(iface);
177
178     FIXME("(%p/%p)->(%s): stub\n", iface, This, name);
179
180     return E_NOTIMPL;
181 }
182
183 static HRESULT WINAPI IDirect3DRMDevice2Impl_GetName(IDirect3DRMDevice2* iface,
184                                                           LPDWORD size, LPSTR name)
185 {
186     IDirect3DRMDeviceImpl *This = impl_from_IDirect3DRMDevice2(iface);
187
188     FIXME("(%p/%p)->(%p, %p): stub\n", iface, This, size, name);
189
190     return E_NOTIMPL;
191 }
192
193 static HRESULT WINAPI IDirect3DRMDevice2Impl_GetClassName(IDirect3DRMDevice2* iface,
194                                                                LPDWORD size, LPSTR name)
195 {
196     IDirect3DRMDeviceImpl *This = impl_from_IDirect3DRMDevice2(iface);
197
198     FIXME("(%p/%p)->(%p, %p): stub\n", iface, This, size, name);
199
200     return E_NOTIMPL;
201 }
202
203 /*** IDirect3DRMDevice methods ***/
204 static HRESULT WINAPI IDirect3DRMDevice2Impl_Init(IDirect3DRMDevice2* iface, ULONG width,
205                                                   ULONG height)
206 {
207     IDirect3DRMDeviceImpl *This = impl_from_IDirect3DRMDevice2(iface);
208
209     TRACE("(%p/%p)->(%u, %u)\n", iface, This, width, height);
210
211     return IDirect3DRMDevice3_Init(&This->IDirect3DRMDevice3_iface, width, height);
212 }
213
214 /*** IDirect3DRMDevice2 methods ***/
215 static HRESULT WINAPI IDirect3DRMDevice2Impl_InitFromD3D(IDirect3DRMDevice2* iface,
216                                                          LPDIRECT3D lpD3D,
217                                                          LPDIRECT3DDEVICE lpD3DDev)
218 {
219     IDirect3DRMDeviceImpl *This = impl_from_IDirect3DRMDevice2(iface);
220
221     FIXME("(%p/%p)->(%p, %p): stub\n", iface, This, lpD3D, lpD3DDev);
222
223     return E_NOTIMPL;
224 }
225
226 static HRESULT WINAPI IDirect3DRMDevice2Impl_InitFromClipper(IDirect3DRMDevice2* iface,
227                                                              LPDIRECTDRAWCLIPPER lpDDClipper,
228                                                              LPGUID lpGUID, int width, int height)
229 {
230     IDirect3DRMDeviceImpl *This = impl_from_IDirect3DRMDevice2(iface);
231
232     TRACE("(%p/%p)->(%p, %p, %u, %u)\n", iface, This, lpDDClipper, lpGUID, width, height);
233
234     return IDirect3DRMDevice3_InitFromClipper(&This->IDirect3DRMDevice3_iface, lpDDClipper, lpGUID,
235                                               width, height);
236 }
237
238 static HRESULT WINAPI IDirect3DRMDevice2Impl_Update(IDirect3DRMDevice2* iface)
239 {
240     IDirect3DRMDeviceImpl *This = impl_from_IDirect3DRMDevice2(iface);
241
242     FIXME("(%p/%p)->(): stub\n", iface, This);
243
244     return E_NOTIMPL;
245 }
246
247 static HRESULT WINAPI IDirect3DRMDevice2Impl_AddUpdateCallback(IDirect3DRMDevice2* iface,
248                                                                D3DRMUPDATECALLBACK cb, LPVOID arg)
249 {
250     IDirect3DRMDeviceImpl *This = impl_from_IDirect3DRMDevice2(iface);
251
252     FIXME("(%p/%p)->(%p, %p): stub\n", iface, This, cb, arg);
253
254     return E_NOTIMPL;
255 }
256
257 static HRESULT WINAPI IDirect3DRMDevice2Impl_DeleteUpdateCallback(IDirect3DRMDevice2* iface,
258                                                                   D3DRMUPDATECALLBACK cb,
259                                                                   LPVOID arg)
260 {
261     IDirect3DRMDeviceImpl *This = impl_from_IDirect3DRMDevice2(iface);
262
263     FIXME("(%p/%p)->(%p, %p): stub\n", iface, This, cb, arg);
264
265     return E_NOTIMPL;
266 }
267
268 static HRESULT WINAPI IDirect3DRMDevice2Impl_SetBufferCount(IDirect3DRMDevice2* iface, DWORD count)
269 {
270     IDirect3DRMDeviceImpl *This = impl_from_IDirect3DRMDevice2(iface);
271
272     FIXME("(%p/%p)->(%u): stub\n", iface, This, count);
273
274     return E_NOTIMPL;
275 }
276
277 static DWORD WINAPI IDirect3DRMDevice2Impl_GetBufferCount(IDirect3DRMDevice2* iface)
278 {
279     IDirect3DRMDeviceImpl *This = impl_from_IDirect3DRMDevice2(iface);
280
281     FIXME("(%p/%p)->(): stub\n", iface, This);
282
283     return E_NOTIMPL;
284 }
285
286 static HRESULT WINAPI IDirect3DRMDevice2Impl_SetDither(IDirect3DRMDevice2* iface, BOOL enable)
287 {
288     IDirect3DRMDeviceImpl *This = impl_from_IDirect3DRMDevice2(iface);
289
290     TRACE("(%p/%p)->(%d)\n", iface, This, enable);
291
292     return IDirect3DRMDevice3_SetDither(&This->IDirect3DRMDevice3_iface, enable);
293 }
294
295 static HRESULT WINAPI IDirect3DRMDevice2Impl_SetShades(IDirect3DRMDevice2* iface, DWORD count)
296 {
297     IDirect3DRMDeviceImpl *This = impl_from_IDirect3DRMDevice2(iface);
298
299     FIXME("(%p/%p)->(%u): stub\n", iface, This, count);
300
301     return E_NOTIMPL;
302 }
303
304 static HRESULT WINAPI IDirect3DRMDevice2Impl_SetQuality(IDirect3DRMDevice2* iface,
305                                                         D3DRMRENDERQUALITY quality)
306 {
307     IDirect3DRMDeviceImpl *This = impl_from_IDirect3DRMDevice2(iface);
308
309     TRACE("(%p/%p)->(%u)\n", iface, This, quality);
310
311     return IDirect3DRMDevice3_SetQuality(&This->IDirect3DRMDevice3_iface, quality);
312 }
313
314 static HRESULT WINAPI IDirect3DRMDevice2Impl_SetTextureQuality(IDirect3DRMDevice2* iface,
315                                                                D3DRMTEXTUREQUALITY quality)
316 {
317     IDirect3DRMDeviceImpl *This = impl_from_IDirect3DRMDevice2(iface);
318
319     FIXME("(%p/%p)->(%u): stub\n", iface, This, quality);
320
321     return E_NOTIMPL;
322 }
323
324 static HRESULT WINAPI IDirect3DRMDevice2Impl_GetViewports(IDirect3DRMDevice2* iface,
325                                                           LPDIRECT3DRMVIEWPORTARRAY *return_views)
326 {
327     IDirect3DRMDeviceImpl *This = impl_from_IDirect3DRMDevice2(iface);
328
329     FIXME("(%p/%p)->(%p): stub\n", iface, This, return_views);
330
331     return E_NOTIMPL;
332 }
333
334 static BOOL WINAPI IDirect3DRMDevice2Impl_GetDither(IDirect3DRMDevice2* iface)
335 {
336     IDirect3DRMDeviceImpl *This = impl_from_IDirect3DRMDevice2(iface);
337
338     TRACE("(%p/%p)->()\n", iface, This);
339
340     return IDirect3DRMDevice3_GetDither(&This->IDirect3DRMDevice3_iface);
341 }
342
343 static DWORD WINAPI IDirect3DRMDevice2Impl_GetShades(IDirect3DRMDevice2* iface)
344 {
345     IDirect3DRMDeviceImpl *This = impl_from_IDirect3DRMDevice2(iface);
346
347     FIXME("(%p/%p)->(): stub\n", iface, This);
348
349     return E_NOTIMPL;
350 }
351
352 static DWORD WINAPI IDirect3DRMDevice2Impl_GetHeight(IDirect3DRMDevice2* iface)
353 {
354     IDirect3DRMDeviceImpl *This = impl_from_IDirect3DRMDevice2(iface);
355
356     TRACE("(%p/%p)->()\n", iface, This);
357
358     return IDirect3DRMDevice3_GetHeight(&This->IDirect3DRMDevice3_iface);
359 }
360
361 static DWORD WINAPI IDirect3DRMDevice2Impl_GetWidth(IDirect3DRMDevice2* iface)
362 {
363     IDirect3DRMDeviceImpl *This = impl_from_IDirect3DRMDevice2(iface);
364
365     TRACE("(%p/%p)->()\n", iface, This);
366
367     return IDirect3DRMDevice3_GetWidth(&This->IDirect3DRMDevice3_iface);
368 }
369
370 static DWORD WINAPI IDirect3DRMDevice2Impl_GetTrianglesDrawn(IDirect3DRMDevice2* iface)
371 {
372     IDirect3DRMDeviceImpl *This = impl_from_IDirect3DRMDevice2(iface);
373
374     FIXME("(%p/%p)->(): stub\n", iface, This);
375
376     return E_NOTIMPL;
377 }
378
379 static DWORD WINAPI IDirect3DRMDevice2Impl_GetWireframeOptions(IDirect3DRMDevice2* iface)
380 {
381     IDirect3DRMDeviceImpl *This = impl_from_IDirect3DRMDevice2(iface);
382
383     FIXME("(%p/%p)->(): stub\n", iface, This);
384
385     return E_NOTIMPL;
386 }
387
388 static D3DRMRENDERQUALITY WINAPI IDirect3DRMDevice2Impl_GetQuality(IDirect3DRMDevice2* iface)
389 {
390     IDirect3DRMDeviceImpl *This = impl_from_IDirect3DRMDevice2(iface);
391
392     TRACE("(%p/%p)->()\n", iface, This);
393
394     return IDirect3DRMDevice3_GetQuality(&This->IDirect3DRMDevice3_iface);
395 }
396
397 static D3DCOLORMODEL WINAPI IDirect3DRMDevice2Impl_GetColorModel(IDirect3DRMDevice2* iface)
398 {
399     IDirect3DRMDeviceImpl *This = impl_from_IDirect3DRMDevice2(iface);
400
401     FIXME("(%p/%p)->(): stub\n", iface, This);
402
403     return E_NOTIMPL;
404 }
405
406 static D3DRMTEXTUREQUALITY WINAPI IDirect3DRMDevice2Impl_GetTextureQuality(IDirect3DRMDevice2* iface)
407 {
408     IDirect3DRMDeviceImpl *This = impl_from_IDirect3DRMDevice2(iface);
409
410     FIXME("(%p/%p)->(): stub\n", iface, This);
411
412     return E_NOTIMPL;
413 }
414
415 static HRESULT WINAPI IDirect3DRMDevice2Impl_GetDirect3DDevice(IDirect3DRMDevice2* iface,
416                                                                LPDIRECT3DDEVICE * dev)
417 {
418     IDirect3DRMDeviceImpl *This = impl_from_IDirect3DRMDevice2(iface);
419
420     FIXME("(%p/%p)->(%p): stub\n", iface, This, dev);
421
422     return E_NOTIMPL;
423 }
424
425 static HRESULT WINAPI IDirect3DRMDevice2Impl_InitFromD3D2(IDirect3DRMDevice2* iface,
426                                                           LPDIRECT3D2 lpD3D,
427                                                           LPDIRECT3DDEVICE2 lpD3DDev)
428 {
429     IDirect3DRMDeviceImpl *This = impl_from_IDirect3DRMDevice2(iface);
430
431     FIXME("(%p/%p)->(%p, %p): stub\n", iface, This, lpD3D, lpD3DDev);
432
433     return E_NOTIMPL;
434 }
435
436 static HRESULT WINAPI IDirect3DRMDevice2Impl_InitFromSurface(IDirect3DRMDevice2* iface,
437                                                              LPGUID lpGUID, LPDIRECTDRAW lpDD,
438                                                              LPDIRECTDRAWSURFACE lpDDSBack)
439 {
440     IDirect3DRMDeviceImpl *This = impl_from_IDirect3DRMDevice2(iface);
441
442     FIXME("(%p/%p)->(%p, %p, %p): stub\n", iface, This, lpGUID, lpDD, lpDDSBack);
443
444     return E_NOTIMPL;
445 }
446
447 static HRESULT WINAPI IDirect3DRMDevice2Impl_SetRenderMode(IDirect3DRMDevice2* iface, DWORD dwFlags)
448 {
449     IDirect3DRMDeviceImpl *This = impl_from_IDirect3DRMDevice2(iface);
450
451     TRACE("(%p/%p)->(%u)\n", iface, This, dwFlags);
452
453     return IDirect3DRMDevice3_SetRenderMode(&This->IDirect3DRMDevice3_iface, dwFlags);
454 }
455
456 static DWORD WINAPI IDirect3DRMDevice2Impl_GetRenderMode(IDirect3DRMDevice2* iface)
457 {
458     IDirect3DRMDeviceImpl *This = impl_from_IDirect3DRMDevice2(iface);
459
460     TRACE("(%p/%p)->()\n", iface, This);
461
462     return IDirect3DRMDevice3_GetRenderMode(&This->IDirect3DRMDevice3_iface);
463 }
464
465 static HRESULT WINAPI IDirect3DRMDevice2Impl_GetDirect3DDevice2(IDirect3DRMDevice2* iface,
466                                                                 LPDIRECT3DDEVICE2 * dev)
467 {
468     IDirect3DRMDeviceImpl *This = impl_from_IDirect3DRMDevice2(iface);
469
470     FIXME("(%p/%p)->(%p): stub\n", iface, This, dev);
471
472     return E_NOTIMPL;
473 }
474
475 static const struct IDirect3DRMDevice2Vtbl Direct3DRMDevice2_Vtbl =
476 {
477     /*** IUnknown methods ***/
478     IDirect3DRMDevice2Impl_QueryInterface,
479     IDirect3DRMDevice2Impl_AddRef,
480     IDirect3DRMDevice2Impl_Release,
481     /*** IDirect3DRMObject methods ***/
482     IDirect3DRMDevice2Impl_Clone,
483     IDirect3DRMDevice2Impl_AddDestroyCallback,
484     IDirect3DRMDevice2Impl_DeleteDestroyCallback,
485     IDirect3DRMDevice2Impl_SetAppData,
486     IDirect3DRMDevice2Impl_GetAppData,
487     IDirect3DRMDevice2Impl_SetName,
488     IDirect3DRMDevice2Impl_GetName,
489     IDirect3DRMDevice2Impl_GetClassName,
490     /*** IDirect3DRMDevice methods ***/
491     IDirect3DRMDevice2Impl_Init,
492     IDirect3DRMDevice2Impl_InitFromD3D,
493     IDirect3DRMDevice2Impl_InitFromClipper,
494     IDirect3DRMDevice2Impl_Update,
495     IDirect3DRMDevice2Impl_AddUpdateCallback,
496     IDirect3DRMDevice2Impl_DeleteUpdateCallback,
497     IDirect3DRMDevice2Impl_SetBufferCount,
498     IDirect3DRMDevice2Impl_GetBufferCount,
499     IDirect3DRMDevice2Impl_SetDither,
500     IDirect3DRMDevice2Impl_SetShades,
501     IDirect3DRMDevice2Impl_SetQuality,
502     IDirect3DRMDevice2Impl_SetTextureQuality,
503     IDirect3DRMDevice2Impl_GetViewports,
504     IDirect3DRMDevice2Impl_GetDither,
505     IDirect3DRMDevice2Impl_GetShades,
506     IDirect3DRMDevice2Impl_GetHeight,
507     IDirect3DRMDevice2Impl_GetWidth,
508     IDirect3DRMDevice2Impl_GetTrianglesDrawn,
509     IDirect3DRMDevice2Impl_GetWireframeOptions,
510     IDirect3DRMDevice2Impl_GetQuality,
511     IDirect3DRMDevice2Impl_GetColorModel,
512     IDirect3DRMDevice2Impl_GetTextureQuality,
513     IDirect3DRMDevice2Impl_GetDirect3DDevice,
514     /*** IDirect3DRMDevice2 methods ***/
515     IDirect3DRMDevice2Impl_InitFromD3D2,
516     IDirect3DRMDevice2Impl_InitFromSurface,
517     IDirect3DRMDevice2Impl_SetRenderMode,
518     IDirect3DRMDevice2Impl_GetRenderMode,
519     IDirect3DRMDevice2Impl_GetDirect3DDevice2
520 };
521
522
523 /*** IUnknown methods ***/
524 static HRESULT WINAPI IDirect3DRMDevice3Impl_QueryInterface(IDirect3DRMDevice3* iface,
525                                                             REFIID riid, void** object)
526 {
527     IDirect3DRMDeviceImpl *This = impl_from_IDirect3DRMDevice3(iface);
528     return IDirect3DRMDevice2_QueryInterface(&This->IDirect3DRMDevice2_iface, riid, object);
529 }
530
531 static ULONG WINAPI IDirect3DRMDevice3Impl_AddRef(IDirect3DRMDevice3* iface)
532 {
533     IDirect3DRMDeviceImpl *This = impl_from_IDirect3DRMDevice3(iface);
534     return IDirect3DRMDevice2_AddRef(&This->IDirect3DRMDevice2_iface);
535 }
536
537 static ULONG WINAPI IDirect3DRMDevice3Impl_Release(IDirect3DRMDevice3* iface)
538 {
539     IDirect3DRMDeviceImpl *This = impl_from_IDirect3DRMDevice3(iface);
540     return IDirect3DRMDevice2_Release(&This->IDirect3DRMDevice2_iface);
541 }
542
543 /*** IDirect3DRMObject methods ***/
544 static HRESULT WINAPI IDirect3DRMDevice3Impl_Clone(IDirect3DRMDevice3* iface,
545                                                         LPUNKNOWN unkwn, REFIID riid,
546                                                         LPVOID* object)
547 {
548     IDirect3DRMDeviceImpl *This = impl_from_IDirect3DRMDevice3(iface);
549
550     FIXME("(%p/%p)->(%p, %s, %p): stub\n", iface, This, unkwn, debugstr_guid(riid), object);
551
552     return E_NOTIMPL;
553 }
554
555 static HRESULT WINAPI IDirect3DRMDevice3Impl_AddDestroyCallback(IDirect3DRMDevice3* iface,
556                                                                      D3DRMOBJECTCALLBACK cb,
557                                                                      LPVOID argument)
558 {
559     IDirect3DRMDeviceImpl *This = impl_from_IDirect3DRMDevice3(iface);
560
561     FIXME("(%p/%p)->(%p, %p): stub\n", iface, This, cb, argument);
562
563     return E_NOTIMPL;
564 }
565
566 static HRESULT WINAPI IDirect3DRMDevice3Impl_DeleteDestroyCallback(IDirect3DRMDevice3* iface,
567                                                                         D3DRMOBJECTCALLBACK cb,
568                                                                         LPVOID argument)
569 {
570     IDirect3DRMDeviceImpl *This = impl_from_IDirect3DRMDevice3(iface);
571
572     FIXME("(%p/%p)->(%p, %p): stub\n", iface, This, cb, argument);
573
574     return E_NOTIMPL;
575 }
576
577 static HRESULT WINAPI IDirect3DRMDevice3Impl_SetAppData(IDirect3DRMDevice3* iface,
578                                                              DWORD data)
579 {
580     IDirect3DRMDeviceImpl *This = impl_from_IDirect3DRMDevice3(iface);
581
582     FIXME("(%p/%p)->(%u): stub\n", iface, This, data);
583
584     return E_NOTIMPL;
585 }
586
587 static DWORD WINAPI IDirect3DRMDevice3Impl_GetAppData(IDirect3DRMDevice3* iface)
588 {
589     IDirect3DRMDeviceImpl *This = impl_from_IDirect3DRMDevice3(iface);
590
591     FIXME("(%p/%p)->(): stub\n", iface, This);
592
593     return 0;
594 }
595
596 static HRESULT WINAPI IDirect3DRMDevice3Impl_SetName(IDirect3DRMDevice3* iface, LPCSTR name)
597 {
598     IDirect3DRMDeviceImpl *This = impl_from_IDirect3DRMDevice3(iface);
599
600     FIXME("(%p/%p)->(%s): stub\n", iface, This, name);
601
602     return E_NOTIMPL;
603 }
604
605 static HRESULT WINAPI IDirect3DRMDevice3Impl_GetName(IDirect3DRMDevice3* iface,
606                                                           LPDWORD size, LPSTR name)
607 {
608     IDirect3DRMDeviceImpl *This = impl_from_IDirect3DRMDevice3(iface);
609
610     FIXME("(%p/%p)->(%p, %p): stub\n", iface, This, size, name);
611
612     return E_NOTIMPL;
613 }
614
615 static HRESULT WINAPI IDirect3DRMDevice3Impl_GetClassName(IDirect3DRMDevice3* iface,
616                                                                LPDWORD size, LPSTR name)
617 {
618     IDirect3DRMDeviceImpl *This = impl_from_IDirect3DRMDevice3(iface);
619
620     FIXME("(%p/%p)->(%p, %p): stub\n", iface, This, size, name);
621
622     return E_NOTIMPL;
623 }
624
625 /*** IDirect3DRMDevice methods ***/
626 static HRESULT WINAPI IDirect3DRMDevice3Impl_Init(IDirect3DRMDevice3* iface, ULONG width,
627                                                   ULONG height)
628 {
629     IDirect3DRMDeviceImpl *This = impl_from_IDirect3DRMDevice3(iface);
630
631     FIXME("(%p/%p)->(%u, %u): stub\n", iface, This, width, height);
632
633     This->height = height;
634     This->width = width;
635
636     return D3DRM_OK;
637 }
638
639 static HRESULT WINAPI IDirect3DRMDevice3Impl_InitFromD3D(IDirect3DRMDevice3* iface,
640                                                          LPDIRECT3D lpD3D,
641                                                          LPDIRECT3DDEVICE lpD3DDev)
642 {
643     IDirect3DRMDeviceImpl *This = impl_from_IDirect3DRMDevice3(iface);
644
645     FIXME("(%p/%p)->(%p, %p): stub\n", iface, This, lpD3D, lpD3DDev);
646
647     return E_NOTIMPL;
648 }
649
650 static HRESULT WINAPI IDirect3DRMDevice3Impl_InitFromClipper(IDirect3DRMDevice3* iface,
651                                                              LPDIRECTDRAWCLIPPER lpDDClipper,
652                                                              LPGUID lpGUID, int width, int height)
653 {
654     IDirect3DRMDeviceImpl *This = impl_from_IDirect3DRMDevice3(iface);
655
656     FIXME("(%p/%p)->(%p, %p, %u, %u): stub\n", iface, This, lpDDClipper, lpGUID, width, height);
657
658     This->height = height;
659     This->width = width;
660
661     return D3DRM_OK;
662 }
663
664 static HRESULT WINAPI IDirect3DRMDevice3Impl_Update(IDirect3DRMDevice3* iface)
665 {
666     IDirect3DRMDeviceImpl *This = impl_from_IDirect3DRMDevice3(iface);
667
668     FIXME("(%p/%p)->(): stub\n", iface, This);
669
670     return E_NOTIMPL;
671 }
672
673 static HRESULT WINAPI IDirect3DRMDevice3Impl_AddUpdateCallback(IDirect3DRMDevice3* iface,
674                                                                D3DRMUPDATECALLBACK cb, LPVOID arg)
675 {
676     IDirect3DRMDeviceImpl *This = impl_from_IDirect3DRMDevice3(iface);
677
678     FIXME("(%p/%p)->(%p, %p): stub\n", iface, This, cb, arg);
679
680     return E_NOTIMPL;
681 }
682
683 static HRESULT WINAPI IDirect3DRMDevice3Impl_DeleteUpdateCallback(IDirect3DRMDevice3* iface,
684                                                                   D3DRMUPDATECALLBACK cb,
685                                                                   LPVOID arg)
686 {
687     IDirect3DRMDeviceImpl *This = impl_from_IDirect3DRMDevice3(iface);
688
689     FIXME("(%p/%p)->(%p, %p): stub\n", iface, This, cb, arg);
690
691     return E_NOTIMPL;
692 }
693
694 static HRESULT WINAPI IDirect3DRMDevice3Impl_SetBufferCount(IDirect3DRMDevice3* iface, DWORD count)
695 {
696     IDirect3DRMDeviceImpl *This = impl_from_IDirect3DRMDevice3(iface);
697
698     FIXME("(%p/%p)->(%u): stub\n", iface, This, count);
699
700     return E_NOTIMPL;
701 }
702
703 static DWORD WINAPI IDirect3DRMDevice3Impl_GetBufferCount(IDirect3DRMDevice3* iface)
704 {
705     IDirect3DRMDeviceImpl *This = impl_from_IDirect3DRMDevice3(iface);
706
707     FIXME("(%p/%p)->(): stub\n", iface, This);
708
709     return E_NOTIMPL;
710 }
711
712 static HRESULT WINAPI IDirect3DRMDevice3Impl_SetDither(IDirect3DRMDevice3* iface, BOOL enable)
713 {
714     IDirect3DRMDeviceImpl *This = impl_from_IDirect3DRMDevice3(iface);
715
716     TRACE("(%p/%p)->(%d)\n", iface, This, enable);
717
718     This->dither = enable;
719
720     return D3DRM_OK;
721 }
722
723 static HRESULT WINAPI IDirect3DRMDevice3Impl_SetShades(IDirect3DRMDevice3* iface, DWORD count)
724 {
725     IDirect3DRMDeviceImpl *This = impl_from_IDirect3DRMDevice3(iface);
726
727     FIXME("(%p/%p)->(%u): stub\n", iface, This, count);
728
729     return E_NOTIMPL;
730 }
731
732 static HRESULT WINAPI IDirect3DRMDevice3Impl_SetQuality(IDirect3DRMDevice3* iface,
733                                                         D3DRMRENDERQUALITY quality)
734 {
735     IDirect3DRMDeviceImpl *This = impl_from_IDirect3DRMDevice3(iface);
736
737     TRACE("(%p/%p)->(%u)\n", iface, This, quality);
738
739     This->quality = quality;
740
741     return D3DRM_OK;
742 }
743
744 static HRESULT WINAPI IDirect3DRMDevice3Impl_SetTextureQuality(IDirect3DRMDevice3* iface,
745                                                                D3DRMTEXTUREQUALITY quality)
746 {
747     IDirect3DRMDeviceImpl *This = impl_from_IDirect3DRMDevice3(iface);
748
749     FIXME("(%p/%p)->(%u): stub\n", iface, This, quality);
750
751     return E_NOTIMPL;
752 }
753
754 static HRESULT WINAPI IDirect3DRMDevice3Impl_GetViewports(IDirect3DRMDevice3* iface,
755                                                           LPDIRECT3DRMVIEWPORTARRAY *return_views)
756 {
757     IDirect3DRMDeviceImpl *This = impl_from_IDirect3DRMDevice3(iface);
758
759     FIXME("(%p/%p)->(%p): stub\n", iface, This, return_views);
760
761     return E_NOTIMPL;
762 }
763
764 static BOOL WINAPI IDirect3DRMDevice3Impl_GetDither(IDirect3DRMDevice3* iface)
765 {
766     IDirect3DRMDeviceImpl *This = impl_from_IDirect3DRMDevice3(iface);
767
768     TRACE("(%p/%p)->()\n", iface, This);
769
770     return This->dither;
771 }
772
773 static DWORD WINAPI IDirect3DRMDevice3Impl_GetShades(IDirect3DRMDevice3* iface)
774 {
775     IDirect3DRMDeviceImpl *This = impl_from_IDirect3DRMDevice3(iface);
776
777     FIXME("(%p/%p)->(): stub\n", iface, This);
778
779     return E_NOTIMPL;
780 }
781
782 static DWORD WINAPI IDirect3DRMDevice3Impl_GetHeight(IDirect3DRMDevice3* iface)
783 {
784     IDirect3DRMDeviceImpl *This = impl_from_IDirect3DRMDevice3(iface);
785
786     TRACE("(%p/%p)->()\n", iface, This);
787
788     return This->height;
789 }
790
791 static DWORD WINAPI IDirect3DRMDevice3Impl_GetWidth(IDirect3DRMDevice3* iface)
792 {
793     IDirect3DRMDeviceImpl *This = impl_from_IDirect3DRMDevice3(iface);
794
795     TRACE("(%p/%p)->()\n", iface, This);
796
797     return This->width;
798 }
799
800 static DWORD WINAPI IDirect3DRMDevice3Impl_GetTrianglesDrawn(IDirect3DRMDevice3* iface)
801 {
802     IDirect3DRMDeviceImpl *This = impl_from_IDirect3DRMDevice3(iface);
803
804     FIXME("(%p/%p)->(): stub\n", iface, This);
805
806     return E_NOTIMPL;
807 }
808
809 static DWORD WINAPI IDirect3DRMDevice3Impl_GetWireframeOptions(IDirect3DRMDevice3* iface)
810 {
811     IDirect3DRMDeviceImpl *This = impl_from_IDirect3DRMDevice3(iface);
812
813     FIXME("(%p/%p)->(): stub\n", iface, This);
814
815     return E_NOTIMPL;
816 }
817
818 static D3DRMRENDERQUALITY WINAPI IDirect3DRMDevice3Impl_GetQuality(IDirect3DRMDevice3* iface)
819 {
820     IDirect3DRMDeviceImpl *This = impl_from_IDirect3DRMDevice3(iface);
821
822     TRACE("(%p/%p)->()\n", iface, This);
823
824     return This->quality;
825 }
826
827 static D3DCOLORMODEL WINAPI IDirect3DRMDevice3Impl_GetColorModel(IDirect3DRMDevice3* iface)
828 {
829     IDirect3DRMDeviceImpl *This = impl_from_IDirect3DRMDevice3(iface);
830
831     FIXME("(%p/%p)->(): stub\n", iface, This);
832
833     return E_NOTIMPL;
834 }
835
836 static D3DRMTEXTUREQUALITY WINAPI IDirect3DRMDevice3Impl_GetTextureQuality(IDirect3DRMDevice3* iface)
837 {
838     IDirect3DRMDeviceImpl *This = impl_from_IDirect3DRMDevice3(iface);
839
840     FIXME("(%p/%p)->(): stub\n", iface, This);
841
842     return E_NOTIMPL;
843 }
844
845 static HRESULT WINAPI IDirect3DRMDevice3Impl_GetDirect3DDevice(IDirect3DRMDevice3* iface,
846                                                                LPDIRECT3DDEVICE * dev)
847 {
848     IDirect3DRMDeviceImpl *This = impl_from_IDirect3DRMDevice3(iface);
849
850     FIXME("(%p/%p)->(%p): stub\n", iface, This, dev);
851
852     return E_NOTIMPL;
853 }
854
855 /*** IDirect3DRMDevice2 methods ***/
856 static HRESULT WINAPI IDirect3DRMDevice3Impl_InitFromD3D2(IDirect3DRMDevice3* iface,
857                                                           LPDIRECT3D2 lpD3D,
858                                                           LPDIRECT3DDEVICE2 lpD3DDev)
859 {
860     IDirect3DRMDeviceImpl *This = impl_from_IDirect3DRMDevice3(iface);
861
862     FIXME("(%p/%p)->(%p, %p): stub\n", iface, This, lpD3D, lpD3DDev);
863
864     return E_NOTIMPL;
865 }
866
867 static HRESULT WINAPI IDirect3DRMDevice3Impl_InitFromSurface(IDirect3DRMDevice3* iface,
868                                                              LPGUID lpGUID, LPDIRECTDRAW lpDD,
869                                                              LPDIRECTDRAWSURFACE lpDDSBack)
870 {
871     IDirect3DRMDeviceImpl *This = impl_from_IDirect3DRMDevice3(iface);
872
873     FIXME("(%p/%p)->(%p, %p, %p): stub\n", iface, This, lpGUID, lpDD, lpDDSBack);
874
875     return E_NOTIMPL;
876 }
877
878 static HRESULT WINAPI IDirect3DRMDevice3Impl_SetRenderMode(IDirect3DRMDevice3* iface, DWORD dwFlags)
879 {
880     IDirect3DRMDeviceImpl *This = impl_from_IDirect3DRMDevice3(iface);
881
882     TRACE("(%p/%p)->(%u)\n", iface, This, dwFlags);
883
884     This->rendermode = dwFlags;
885
886     return D3DRM_OK;
887 }
888
889 static DWORD WINAPI IDirect3DRMDevice3Impl_GetRenderMode(IDirect3DRMDevice3* iface)
890 {
891     IDirect3DRMDeviceImpl *This = impl_from_IDirect3DRMDevice3(iface);
892
893     TRACE("(%p/%p)->()\n", iface, This);
894
895     return This->rendermode;
896 }
897
898 static HRESULT WINAPI IDirect3DRMDevice3Impl_GetDirect3DDevice2(IDirect3DRMDevice3* iface,
899                                                                 LPDIRECT3DDEVICE2 * dev)
900 {
901     IDirect3DRMDeviceImpl *This = impl_from_IDirect3DRMDevice3(iface);
902
903     FIXME("(%p/%p)->(%p): stub\n", iface, This, dev);
904
905     return E_NOTIMPL;
906 }
907
908 /*** IDirect3DRMDevice3 methods ***/
909 static HRESULT WINAPI IDirect3DRMDevice3Impl_FindPreferredTextureFormat(IDirect3DRMDevice3* iface,
910                                                                         DWORD bitdepths,
911                                                                         DWORD flags,
912                                                                         LPDDPIXELFORMAT lpDDPF)
913 {
914     IDirect3DRMDeviceImpl *This = impl_from_IDirect3DRMDevice3(iface);
915
916     FIXME("(%p/%p)->(%u, %u, %p): stub\n", iface, This, bitdepths, flags, lpDDPF);
917
918     return E_NOTIMPL;
919 }
920
921 static HRESULT WINAPI IDirect3DRMDevice3Impl_RenderStateChange(IDirect3DRMDevice3* iface,
922                                                                D3DRENDERSTATETYPE type, DWORD val,
923                                                                DWORD flags)
924 {
925     IDirect3DRMDeviceImpl *This = impl_from_IDirect3DRMDevice3(iface);
926
927     FIXME("(%p/%p)->(%u, %u, %u): stub\n", iface, This, type, val, flags);
928
929     return E_NOTIMPL;
930 }
931
932 static HRESULT WINAPI IDirect3DRMDevice3Impl_LightStateChange(IDirect3DRMDevice3* iface,
933                                                               D3DLIGHTSTATETYPE type, DWORD val,
934                                                               DWORD flags)
935 {
936     IDirect3DRMDeviceImpl *This = impl_from_IDirect3DRMDevice3(iface);
937
938     FIXME("(%p/%p)->(%u, %u, %u): stub\n", iface, This, type, val, flags);
939
940     return E_NOTIMPL;
941 }
942
943 static HRESULT WINAPI IDirect3DRMDevice3Impl_GetStateChangeOptions(IDirect3DRMDevice3* iface,
944                                                                    DWORD stateclass, DWORD statenum,
945                                                                    LPDWORD flags)
946 {
947     IDirect3DRMDeviceImpl *This = impl_from_IDirect3DRMDevice3(iface);
948
949     FIXME("(%p/%p)->(%u, %u, %p): stub\n", iface, This, stateclass, statenum, flags);
950
951     return E_NOTIMPL;
952 }
953
954 static HRESULT WINAPI IDirect3DRMDevice3Impl_SetStateChangeOptions(IDirect3DRMDevice3* iface,
955                                                                    DWORD stateclass, DWORD statenum,
956                                                                    DWORD flags)
957 {
958     IDirect3DRMDeviceImpl *This = impl_from_IDirect3DRMDevice3(iface);
959
960     FIXME("(%p/%p)->(%u, %u, %u): stub\n", iface, This, stateclass, statenum, flags);
961
962     return E_NOTIMPL;
963 }
964
965 static const struct IDirect3DRMDevice3Vtbl Direct3DRMDevice3_Vtbl =
966 {
967     /*** IUnknown methods ***/
968     IDirect3DRMDevice3Impl_QueryInterface,
969     IDirect3DRMDevice3Impl_AddRef,
970     IDirect3DRMDevice3Impl_Release,
971     /*** IDirect3DRMObject methods ***/
972     IDirect3DRMDevice3Impl_Clone,
973     IDirect3DRMDevice3Impl_AddDestroyCallback,
974     IDirect3DRMDevice3Impl_DeleteDestroyCallback,
975     IDirect3DRMDevice3Impl_SetAppData,
976     IDirect3DRMDevice3Impl_GetAppData,
977     IDirect3DRMDevice3Impl_SetName,
978     IDirect3DRMDevice3Impl_GetName,
979     IDirect3DRMDevice3Impl_GetClassName,
980     /*** IDirect3DRMDevice methods ***/
981     IDirect3DRMDevice3Impl_Init,
982     IDirect3DRMDevice3Impl_InitFromD3D,
983     IDirect3DRMDevice3Impl_InitFromClipper,
984     IDirect3DRMDevice3Impl_Update,
985     IDirect3DRMDevice3Impl_AddUpdateCallback,
986     IDirect3DRMDevice3Impl_DeleteUpdateCallback,
987     IDirect3DRMDevice3Impl_SetBufferCount,
988     IDirect3DRMDevice3Impl_GetBufferCount,
989     IDirect3DRMDevice3Impl_SetDither,
990     IDirect3DRMDevice3Impl_SetShades,
991     IDirect3DRMDevice3Impl_SetQuality,
992     IDirect3DRMDevice3Impl_SetTextureQuality,
993     IDirect3DRMDevice3Impl_GetViewports,
994     IDirect3DRMDevice3Impl_GetDither,
995     IDirect3DRMDevice3Impl_GetShades,
996     IDirect3DRMDevice3Impl_GetHeight,
997     IDirect3DRMDevice3Impl_GetWidth,
998     IDirect3DRMDevice3Impl_GetTrianglesDrawn,
999     IDirect3DRMDevice3Impl_GetWireframeOptions,
1000     IDirect3DRMDevice3Impl_GetQuality,
1001     IDirect3DRMDevice3Impl_GetColorModel,
1002     IDirect3DRMDevice3Impl_GetTextureQuality,
1003     IDirect3DRMDevice3Impl_GetDirect3DDevice,
1004     /*** IDirect3DRMDevice2 methods ***/
1005     IDirect3DRMDevice3Impl_InitFromD3D2,
1006     IDirect3DRMDevice3Impl_InitFromSurface,
1007     IDirect3DRMDevice3Impl_SetRenderMode,
1008     IDirect3DRMDevice3Impl_GetRenderMode,
1009     IDirect3DRMDevice3Impl_GetDirect3DDevice2,
1010     /*** IDirect3DRMDevice3 methods ***/
1011     IDirect3DRMDevice3Impl_FindPreferredTextureFormat,
1012     IDirect3DRMDevice3Impl_RenderStateChange,
1013     IDirect3DRMDevice3Impl_LightStateChange,
1014     IDirect3DRMDevice3Impl_GetStateChangeOptions,
1015     IDirect3DRMDevice3Impl_SetStateChangeOptions
1016 };
1017
1018
1019 /*** IUnknown methods ***/
1020 static HRESULT WINAPI IDirect3DRMWinDeviceImpl_QueryInterface(IDirect3DRMWinDevice* iface,
1021                                                               REFIID riid, void** object)
1022 {
1023     IDirect3DRMDeviceImpl *This = impl_from_IDirect3DRMWinDevice(iface);
1024     return IDirect3DRMDevice2_QueryInterface(&This->IDirect3DRMDevice2_iface, riid, object);
1025 }
1026
1027 static ULONG WINAPI IDirect3DRMWinDeviceImpl_AddRef(IDirect3DRMWinDevice* iface)
1028 {
1029     IDirect3DRMDeviceImpl *This = impl_from_IDirect3DRMWinDevice(iface);
1030     return IDirect3DRMDevice2_AddRef(&This->IDirect3DRMDevice2_iface);
1031 }
1032
1033 static ULONG WINAPI IDirect3DRMWinDeviceImpl_Release(IDirect3DRMWinDevice* iface)
1034 {
1035     IDirect3DRMDeviceImpl *This = impl_from_IDirect3DRMWinDevice(iface);
1036     return IDirect3DRMDevice2_Release(&This->IDirect3DRMDevice2_iface);
1037 }
1038
1039 /*** IDirect3DRMObject methods ***/
1040 static HRESULT WINAPI IDirect3DRMWinDeviceImpl_Clone(IDirect3DRMWinDevice* iface,
1041                                                         LPUNKNOWN unkwn, REFIID riid,
1042                                                         LPVOID* object)
1043 {
1044     IDirect3DRMDeviceImpl *This = impl_from_IDirect3DRMWinDevice(iface);
1045
1046     FIXME("(%p/%p)->(%p, %s, %p): stub\n", iface, This, unkwn, debugstr_guid(riid), object);
1047
1048     return E_NOTIMPL;
1049 }
1050
1051 static HRESULT WINAPI IDirect3DRMWinDeviceImpl_AddDestroyCallback(IDirect3DRMWinDevice* iface,
1052                                                                      D3DRMOBJECTCALLBACK cb,
1053                                                                      LPVOID argument)
1054 {
1055     IDirect3DRMDeviceImpl *This = impl_from_IDirect3DRMWinDevice(iface);
1056
1057     FIXME("(%p/%p)->(%p, %p): stub\n", iface, This, cb, argument);
1058
1059     return E_NOTIMPL;
1060 }
1061
1062 static HRESULT WINAPI IDirect3DRMWinDeviceImpl_DeleteDestroyCallback(IDirect3DRMWinDevice* iface,
1063                                                                         D3DRMOBJECTCALLBACK cb,
1064                                                                         LPVOID argument)
1065 {
1066     IDirect3DRMDeviceImpl *This = impl_from_IDirect3DRMWinDevice(iface);
1067
1068     FIXME("(%p/%p)->(%p, %p): stub\n", iface, This, cb, argument);
1069
1070     return E_NOTIMPL;
1071 }
1072
1073 static HRESULT WINAPI IDirect3DRMWinDeviceImpl_SetAppData(IDirect3DRMWinDevice* iface,
1074                                                              DWORD data)
1075 {
1076     IDirect3DRMDeviceImpl *This = impl_from_IDirect3DRMWinDevice(iface);
1077
1078     FIXME("(%p/%p)->(%u): stub\n", iface, This, data);
1079
1080     return E_NOTIMPL;
1081 }
1082
1083 static DWORD WINAPI IDirect3DRMWinDeviceImpl_GetAppData(IDirect3DRMWinDevice* iface)
1084 {
1085     IDirect3DRMDeviceImpl *This = impl_from_IDirect3DRMWinDevice(iface);
1086
1087     FIXME("(%p/%p)->(): stub\n", iface, This);
1088
1089     return 0;
1090 }
1091
1092 static HRESULT WINAPI IDirect3DRMWinDeviceImpl_SetName(IDirect3DRMWinDevice* iface, LPCSTR name)
1093 {
1094     IDirect3DRMDeviceImpl *This = impl_from_IDirect3DRMWinDevice(iface);
1095
1096     FIXME("(%p/%p)->(%s): stub\n", iface, This, name);
1097
1098     return E_NOTIMPL;
1099 }
1100
1101 static HRESULT WINAPI IDirect3DRMWinDeviceImpl_GetName(IDirect3DRMWinDevice* iface,
1102                                                           LPDWORD size, LPSTR name)
1103 {
1104     IDirect3DRMDeviceImpl *This = impl_from_IDirect3DRMWinDevice(iface);
1105
1106     FIXME("(%p/%p)->(%p, %p): stub\n", iface, This, size, name);
1107
1108     return E_NOTIMPL;
1109 }
1110
1111 static HRESULT WINAPI IDirect3DRMWinDeviceImpl_GetClassName(IDirect3DRMWinDevice* iface,
1112                                                                LPDWORD size, LPSTR name)
1113 {
1114     IDirect3DRMDeviceImpl *This = impl_from_IDirect3DRMWinDevice(iface);
1115
1116     FIXME("(%p/%p)->(%p, %p): stub\n", iface, This, size, name);
1117
1118     return E_NOTIMPL;
1119 }
1120
1121 /*** IDirect3DRMWinDevice methods ***/
1122 static HRESULT WINAPI IDirect3DRMWinDeviceImpl_HandlePaint(IDirect3DRMWinDevice* iface, HDC hdc)
1123 {
1124     IDirect3DRMDeviceImpl *This = impl_from_IDirect3DRMWinDevice(iface);
1125
1126     FIXME("(%p/%p)->(%p): stub\n", iface, This, hdc);
1127
1128     return E_NOTIMPL;
1129 }
1130
1131 static HRESULT WINAPI IDirect3DRMWinDeviceImpl_HandleActivate(IDirect3DRMWinDevice* iface, WORD wparam)
1132 {
1133     IDirect3DRMDeviceImpl *This = impl_from_IDirect3DRMWinDevice(iface);
1134
1135     FIXME("(%p/%p)->(%u): stub\n", iface, This, wparam);
1136
1137     return E_NOTIMPL;
1138 }
1139
1140 static const struct IDirect3DRMWinDeviceVtbl Direct3DRMWinDevice_Vtbl =
1141 {
1142     /*** IUnknown methods ***/
1143     IDirect3DRMWinDeviceImpl_QueryInterface,
1144     IDirect3DRMWinDeviceImpl_AddRef,
1145     IDirect3DRMWinDeviceImpl_Release,
1146     /*** IDirect3DRMObject methods ***/
1147     IDirect3DRMWinDeviceImpl_Clone,
1148     IDirect3DRMWinDeviceImpl_AddDestroyCallback,
1149     IDirect3DRMWinDeviceImpl_DeleteDestroyCallback,
1150     IDirect3DRMWinDeviceImpl_SetAppData,
1151     IDirect3DRMWinDeviceImpl_GetAppData,
1152     IDirect3DRMWinDeviceImpl_SetName,
1153     IDirect3DRMWinDeviceImpl_GetName,
1154     IDirect3DRMWinDeviceImpl_GetClassName,
1155     /*** IDirect3DRMWinDevice methods ***/
1156     IDirect3DRMWinDeviceImpl_HandlePaint,
1157     IDirect3DRMWinDeviceImpl_HandleActivate
1158 };
1159
1160 HRESULT Direct3DRMDevice_create(REFIID riid, IUnknown** ppObj)
1161 {
1162     IDirect3DRMDeviceImpl* object;
1163
1164     TRACE("(%p)\n", ppObj);
1165
1166     object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DRMDeviceImpl));
1167     if (!object)
1168     {
1169         ERR("Out of memory\n");
1170         return E_OUTOFMEMORY;
1171     }
1172
1173     object->IDirect3DRMDevice2_iface.lpVtbl = &Direct3DRMDevice2_Vtbl;
1174     object->IDirect3DRMDevice3_iface.lpVtbl = &Direct3DRMDevice3_Vtbl;
1175     object->IDirect3DRMWinDevice_iface.lpVtbl = &Direct3DRMWinDevice_Vtbl;
1176     object->ref = 1;
1177
1178     if (IsEqualGUID(riid, &IID_IDirect3DRMFrame3))
1179         *ppObj = (IUnknown*)&object->IDirect3DRMDevice3_iface;
1180     else
1181         *ppObj = (IUnknown*)&object->IDirect3DRMDevice2_iface;
1182
1183     return S_OK;
1184 }