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