Release 1.5.29.
[wine] / dlls / d3drm / viewport.c
1 /*
2  * Implementation of IDirect3DRMViewport Interface
3  *
4  * Copyright 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
33 WINE_DEFAULT_DEBUG_CHANNEL(d3drm);
34
35 typedef struct {
36     IDirect3DRMViewport IDirect3DRMViewport_iface;
37     IDirect3DRMViewport2 IDirect3DRMViewport2_iface;
38     LONG ref;
39     D3DVALUE back;
40     D3DVALUE front;
41     D3DVALUE field;
42     D3DRMPROJECTIONTYPE projection;
43 } IDirect3DRMViewportImpl;
44
45 static inline IDirect3DRMViewportImpl *impl_from_IDirect3DRMViewport(IDirect3DRMViewport *iface)
46 {
47     return CONTAINING_RECORD(iface, IDirect3DRMViewportImpl, IDirect3DRMViewport_iface);
48 }
49
50 static inline IDirect3DRMViewportImpl *impl_from_IDirect3DRMViewport2(IDirect3DRMViewport2 *iface)
51 {
52     return CONTAINING_RECORD(iface, IDirect3DRMViewportImpl, IDirect3DRMViewport2_iface);
53 }
54
55 /*** IUnknown methods ***/
56 static HRESULT WINAPI IDirect3DRMViewportImpl_QueryInterface(IDirect3DRMViewport* iface,
57                                                              REFIID riid, void** object)
58 {
59     IDirect3DRMViewportImpl *This = impl_from_IDirect3DRMViewport(iface);
60
61     TRACE("(%p/%p)->(%s, %p)\n", iface, This, debugstr_guid(riid), object);
62
63     *object = NULL;
64
65     if (IsEqualGUID(riid, &IID_IUnknown) ||
66         IsEqualGUID(riid, &IID_IDirect3DRMViewport))
67     {
68         *object = &This->IDirect3DRMViewport_iface;
69     }
70     else if(IsEqualGUID(riid, &IID_IDirect3DRMViewport2))
71     {
72         *object = &This->IDirect3DRMViewport2_iface;
73     }
74     else
75     {
76         FIXME("interface %s not implemented\n", debugstr_guid(riid));
77         return E_NOINTERFACE;
78     }
79
80     IDirect3DRMViewport_AddRef(iface);
81     return S_OK;
82 }
83
84 static ULONG WINAPI IDirect3DRMViewportImpl_AddRef(IDirect3DRMViewport* iface)
85 {
86     IDirect3DRMViewportImpl *This = impl_from_IDirect3DRMViewport(iface);
87     ULONG ref = InterlockedIncrement(&This->ref);
88
89     TRACE("(%p)->(): new ref = %d\n", This, ref);
90
91     return ref;
92 }
93
94 static ULONG WINAPI IDirect3DRMViewportImpl_Release(IDirect3DRMViewport* iface)
95 {
96     IDirect3DRMViewportImpl *This = impl_from_IDirect3DRMViewport(iface);
97     ULONG ref = InterlockedDecrement(&This->ref);
98
99     TRACE("(%p)->(): new ref = %d\n", This, ref);
100
101     if (!ref)
102         HeapFree(GetProcessHeap(), 0, This);
103
104     return ref;
105 }
106
107 /*** IDirect3DRMObject methods ***/
108 static HRESULT WINAPI IDirect3DRMViewportImpl_Clone(IDirect3DRMViewport* iface,
109                                                         LPUNKNOWN unkwn, REFIID riid,
110                                                         LPVOID* object)
111 {
112     IDirect3DRMViewportImpl *This = impl_from_IDirect3DRMViewport(iface);
113
114     FIXME("(%p/%p)->(%p, %s, %p): stub\n", iface, This, unkwn, debugstr_guid(riid), object);
115
116     return E_NOTIMPL;
117 }
118
119 static HRESULT WINAPI IDirect3DRMViewportImpl_AddDestroyCallback(IDirect3DRMViewport* iface,
120                                                                      D3DRMOBJECTCALLBACK cb,
121                                                                      LPVOID argument)
122 {
123     IDirect3DRMViewportImpl *This = impl_from_IDirect3DRMViewport(iface);
124
125     FIXME("(%p/%p)->(%p, %p): stub\n", iface, This, cb, argument);
126
127     return E_NOTIMPL;
128 }
129
130 static HRESULT WINAPI IDirect3DRMViewportImpl_DeleteDestroyCallback(IDirect3DRMViewport* iface,
131                                                                         D3DRMOBJECTCALLBACK cb,
132                                                                         LPVOID argument)
133 {
134     IDirect3DRMViewportImpl *This = impl_from_IDirect3DRMViewport(iface);
135
136     FIXME("(%p/%p)->(%p, %p): stub\n", iface, This, cb, argument);
137
138     return E_NOTIMPL;
139 }
140
141 static HRESULT WINAPI IDirect3DRMViewportImpl_SetAppData(IDirect3DRMViewport* iface,
142                                                              DWORD data)
143 {
144     IDirect3DRMViewportImpl *This = impl_from_IDirect3DRMViewport(iface);
145
146     FIXME("(%p/%p)->(%u): stub\n", iface, This, data);
147
148     return E_NOTIMPL;
149 }
150
151 static DWORD WINAPI IDirect3DRMViewportImpl_GetAppData(IDirect3DRMViewport* iface)
152 {
153     IDirect3DRMViewportImpl *This = impl_from_IDirect3DRMViewport(iface);
154
155     FIXME("(%p/%p)->(): stub\n", iface, This);
156
157     return 0;
158 }
159
160 static HRESULT WINAPI IDirect3DRMViewportImpl_SetName(IDirect3DRMViewport* iface, LPCSTR name)
161 {
162     IDirect3DRMViewportImpl *This = impl_from_IDirect3DRMViewport(iface);
163
164     FIXME("(%p/%p)->(%s): stub\n", iface, This, name);
165
166     return E_NOTIMPL;
167 }
168
169 static HRESULT WINAPI IDirect3DRMViewportImpl_GetName(IDirect3DRMViewport* iface,
170                                                           LPDWORD size, LPSTR name)
171 {
172     IDirect3DRMViewportImpl *This = impl_from_IDirect3DRMViewport(iface);
173
174     FIXME("(%p/%p)->(%p, %p): stub\n", iface, This, size, name);
175
176     return E_NOTIMPL;
177 }
178
179 static HRESULT WINAPI IDirect3DRMViewportImpl_GetClassName(IDirect3DRMViewport* iface,
180                                                            LPDWORD size, LPSTR name)
181 {
182     IDirect3DRMViewportImpl *This = impl_from_IDirect3DRMViewport(iface);
183
184     TRACE("(%p/%p)->(%p, %p)\n", iface, This, size, name);
185
186     return IDirect3DRMViewport2_GetClassName(&This->IDirect3DRMViewport2_iface, size, name);
187 }
188
189 /*** IDirect3DRMViewport methods ***/
190 static HRESULT WINAPI IDirect3DRMViewportImpl_Init(IDirect3DRMViewport *iface, IDirect3DRMDevice *device,
191         IDirect3DRMFrame *camera, DWORD x, DWORD y, DWORD width, DWORD height)
192 {
193     FIXME("iface %p, device %p, camera %p, x %u, y %u, width %u, height %u stub!\n",
194             iface, device, camera, x, y, width, height);
195
196     return E_NOTIMPL;
197 }
198
199 static HRESULT WINAPI IDirect3DRMViewportImpl_Clear(IDirect3DRMViewport* iface)
200 {
201     IDirect3DRMViewportImpl *This = impl_from_IDirect3DRMViewport(iface);
202
203     FIXME("(%p/%p)->(): stub\n", iface, This);
204
205     return D3DRM_OK;
206 }
207
208 static HRESULT WINAPI IDirect3DRMViewportImpl_Render(IDirect3DRMViewport *iface, IDirect3DRMFrame *frame)
209 {
210     FIXME("iface %p, frame %p stub!\n", iface, frame);
211
212     return D3DRM_OK;
213 }
214
215 static HRESULT WINAPI IDirect3DRMViewportImpl_SetFront(IDirect3DRMViewport* iface, D3DVALUE front)
216 {
217     IDirect3DRMViewportImpl *This = impl_from_IDirect3DRMViewport(iface);
218
219     TRACE("(%p/%p)->(%f)\n", iface, This, front);
220
221     return IDirect3DRMViewport2_SetFront(&This->IDirect3DRMViewport2_iface, front);
222 }
223
224 static HRESULT WINAPI IDirect3DRMViewportImpl_SetBack(IDirect3DRMViewport* iface, D3DVALUE back)
225 {
226     IDirect3DRMViewportImpl *This = impl_from_IDirect3DRMViewport(iface);
227
228     TRACE("(%p/%p)->(%f)\n", iface, This, back);
229
230     return IDirect3DRMViewport2_SetBack(&This->IDirect3DRMViewport2_iface, back);
231 }
232
233 static HRESULT WINAPI IDirect3DRMViewportImpl_SetField(IDirect3DRMViewport* iface, D3DVALUE field)
234 {
235     IDirect3DRMViewportImpl *This = impl_from_IDirect3DRMViewport(iface);
236
237     TRACE("(%p/%p)->(%f)\n", iface, This, field);
238
239     return IDirect3DRMViewport2_SetField(&This->IDirect3DRMViewport2_iface, field);
240 }
241
242 static HRESULT WINAPI IDirect3DRMViewportImpl_SetUniformScaling(IDirect3DRMViewport* iface, BOOL b)
243 {
244     IDirect3DRMViewportImpl *This = impl_from_IDirect3DRMViewport(iface);
245
246     FIXME("(%p/%p)->(%d): stub\n", iface, This, b);
247
248     return E_NOTIMPL;
249 }
250
251 static HRESULT WINAPI IDirect3DRMViewportImpl_SetCamera(IDirect3DRMViewport *iface, IDirect3DRMFrame *camera)
252 {
253     FIXME("iface %p, camera %p stub!\n", iface, camera);
254
255     return E_NOTIMPL;
256 }
257
258 static HRESULT WINAPI IDirect3DRMViewportImpl_SetProjection(IDirect3DRMViewport* iface,
259                                                             D3DRMPROJECTIONTYPE type)
260 {
261     IDirect3DRMViewportImpl *This = impl_from_IDirect3DRMViewport(iface);
262
263     TRACE("(%p/%p)->(%u)\n", iface, This, type);
264
265     return IDirect3DRMViewport2_SetProjection(&This->IDirect3DRMViewport2_iface, type);
266 }
267
268 static HRESULT WINAPI IDirect3DRMViewportImpl_Transform(IDirect3DRMViewport* iface,
269                                                         D3DRMVECTOR4D *d, D3DVECTOR *s)
270 {
271     IDirect3DRMViewportImpl *This = impl_from_IDirect3DRMViewport(iface);
272
273     FIXME("(%p/%p)->(%p, %p): stub\n", iface, This, d, s);
274
275     return E_NOTIMPL;
276 }
277
278 static HRESULT WINAPI IDirect3DRMViewportImpl_InverseTransform(IDirect3DRMViewport* iface,
279                                                                D3DVECTOR *d, D3DRMVECTOR4D *s)
280 {
281     IDirect3DRMViewportImpl *This = impl_from_IDirect3DRMViewport(iface);
282
283     FIXME("(%p/%p)->(%p, %p): stub\n", iface, This, d, s);
284
285     return E_NOTIMPL;
286 }
287
288 static HRESULT WINAPI IDirect3DRMViewportImpl_Configure(IDirect3DRMViewport* iface, LONG x, LONG y,
289                                                         DWORD width, DWORD height)
290 {
291     IDirect3DRMViewportImpl *This = impl_from_IDirect3DRMViewport(iface);
292
293     FIXME("(%p/%p)->(%u, %u, %u, %u): stub\n", iface, This, x, y, width, height);
294
295     return E_NOTIMPL;
296 }
297
298 static HRESULT WINAPI IDirect3DRMViewportImpl_ForceUpdate(IDirect3DRMViewport* iface,
299                                                           DWORD x1, DWORD y1, DWORD x2, DWORD y2)
300 {
301     IDirect3DRMViewportImpl *This = impl_from_IDirect3DRMViewport(iface);
302
303     FIXME("(%p/%p)->(%u, %u, %u, %u): stub\n", iface, This, x1, y1, x2, y2);
304
305     return E_NOTIMPL;
306 }
307
308 static HRESULT WINAPI IDirect3DRMViewportImpl_SetPlane(IDirect3DRMViewport* iface,
309                                                        D3DVALUE left, D3DVALUE right,
310                                                        D3DVALUE bottom, D3DVALUE top)
311 {
312     IDirect3DRMViewportImpl *This = impl_from_IDirect3DRMViewport(iface);
313
314     FIXME("(%p/%p)->(%f, %f, %f, %f): stub\n", iface, This, left, right, bottom, top);
315
316     return E_NOTIMPL;
317 }
318
319 static HRESULT WINAPI IDirect3DRMViewportImpl_GetCamera(IDirect3DRMViewport *iface, IDirect3DRMFrame **camera)
320 {
321     FIXME("iface %p, camera %p stub!\n", iface, camera);
322
323     return E_NOTIMPL;
324 }
325
326 static HRESULT WINAPI IDirect3DRMViewportImpl_GetDevice(IDirect3DRMViewport *iface, IDirect3DRMDevice **device)
327 {
328     FIXME("iface %p, device %p stub!\n", iface, device);
329
330     return E_NOTIMPL;
331 }
332
333 static HRESULT WINAPI IDirect3DRMViewportImpl_GetPlane(IDirect3DRMViewport* iface,
334                                                        D3DVALUE *left, D3DVALUE *right,
335                                                        D3DVALUE *bottom, D3DVALUE *top)
336 {
337     IDirect3DRMViewportImpl *This = impl_from_IDirect3DRMViewport(iface);
338
339     FIXME("(%p/%p)->(%p, %p, %p, %p): stub\n", iface, This, left, right, bottom, top);
340
341     return E_NOTIMPL;
342 }
343
344 static HRESULT WINAPI IDirect3DRMViewportImpl_Pick(IDirect3DRMViewport* iface, LONG x, LONG y,
345                                                    LPDIRECT3DRMPICKEDARRAY *return_visuals)
346 {
347     IDirect3DRMViewportImpl *This = impl_from_IDirect3DRMViewport(iface);
348
349     FIXME("(%p/%p)->(%u, %u, %p): stub\n", iface, This, x, y, return_visuals);
350
351     return E_NOTIMPL;
352 }
353
354 static BOOL WINAPI IDirect3DRMViewportImpl_GetUniformScaling(IDirect3DRMViewport* iface)
355 {
356     IDirect3DRMViewportImpl *This = impl_from_IDirect3DRMViewport(iface);
357
358     FIXME("(%p/%p)->(): stub\n", iface, This);
359
360     return E_NOTIMPL;
361 }
362
363 static LONG WINAPI IDirect3DRMViewportImpl_GetX(IDirect3DRMViewport* iface)
364 {
365     IDirect3DRMViewportImpl *This = impl_from_IDirect3DRMViewport(iface);
366
367     FIXME("(%p/%p)->(): stub\n", iface, This);
368
369     return E_NOTIMPL;
370 }
371
372 static LONG WINAPI IDirect3DRMViewportImpl_GetY(IDirect3DRMViewport* iface)
373 {
374     IDirect3DRMViewportImpl *This = impl_from_IDirect3DRMViewport(iface);
375
376     FIXME("(%p/%p)->(): stub\n", iface, This);
377
378     return E_NOTIMPL;
379 }
380
381 static DWORD WINAPI IDirect3DRMViewportImpl_GetWidth(IDirect3DRMViewport* iface)
382 {
383     IDirect3DRMViewportImpl *This = impl_from_IDirect3DRMViewport(iface);
384
385     FIXME("(%p/%p)->(): stub\n", iface, This);
386
387     return E_NOTIMPL;
388 }
389
390 static DWORD WINAPI IDirect3DRMViewportImpl_GetHeight(IDirect3DRMViewport* iface)
391 {
392     IDirect3DRMViewportImpl *This = impl_from_IDirect3DRMViewport(iface);
393
394     FIXME("(%p/%p)->(): stub\n", iface, This);
395
396     return E_NOTIMPL;
397 }
398
399 static D3DVALUE WINAPI IDirect3DRMViewportImpl_GetField(IDirect3DRMViewport* iface)
400 {
401     IDirect3DRMViewportImpl *This = impl_from_IDirect3DRMViewport(iface);
402
403     TRACE("(%p/%p)->()\n", iface, This);
404
405     return IDirect3DRMViewport2_GetField(&This->IDirect3DRMViewport2_iface);
406 }
407
408 static D3DVALUE WINAPI IDirect3DRMViewportImpl_GetBack(IDirect3DRMViewport* iface)
409 {
410     IDirect3DRMViewportImpl *This = impl_from_IDirect3DRMViewport(iface);
411
412     TRACE("(%p/%p)->()\n", iface, This);
413
414     return IDirect3DRMViewport2_GetBack(&This->IDirect3DRMViewport2_iface);
415 }
416
417 static D3DVALUE WINAPI IDirect3DRMViewportImpl_GetFront(IDirect3DRMViewport* iface)
418 {
419     IDirect3DRMViewportImpl *This = impl_from_IDirect3DRMViewport(iface);
420
421     TRACE("(%p/%p)->()\n", iface, This);
422
423     return IDirect3DRMViewport2_GetFront(&This->IDirect3DRMViewport2_iface);
424 }
425
426 static D3DRMPROJECTIONTYPE WINAPI IDirect3DRMViewportImpl_GetProjection(IDirect3DRMViewport* iface)
427 {
428     IDirect3DRMViewportImpl *This = impl_from_IDirect3DRMViewport(iface);
429
430     TRACE("(%p/%p)->()\n", iface, This);
431
432     return IDirect3DRMViewport2_GetProjection(&This->IDirect3DRMViewport2_iface);
433 }
434
435 static HRESULT WINAPI IDirect3DRMViewportImpl_GetDirect3DViewport(IDirect3DRMViewport *iface,
436         IDirect3DViewport **viewport)
437 {
438     IDirect3DRMViewportImpl *This = impl_from_IDirect3DRMViewport(iface);
439
440     FIXME("(%p/%p)->(%p): stub\n", iface, This, This);
441
442     return E_NOTIMPL;
443 }
444
445 static const struct IDirect3DRMViewportVtbl Direct3DRMViewport_Vtbl =
446 {
447     /*** IUnknown methods ***/
448     IDirect3DRMViewportImpl_QueryInterface,
449     IDirect3DRMViewportImpl_AddRef,
450     IDirect3DRMViewportImpl_Release,
451     /*** IDirect3DRMObject methods ***/
452     IDirect3DRMViewportImpl_Clone,
453     IDirect3DRMViewportImpl_AddDestroyCallback,
454     IDirect3DRMViewportImpl_DeleteDestroyCallback,
455     IDirect3DRMViewportImpl_SetAppData,
456     IDirect3DRMViewportImpl_GetAppData,
457     IDirect3DRMViewportImpl_SetName,
458     IDirect3DRMViewportImpl_GetName,
459     IDirect3DRMViewportImpl_GetClassName,
460     /*** IDirect3DRMViewport methods ***/
461     IDirect3DRMViewportImpl_Init,
462     IDirect3DRMViewportImpl_Clear,
463     IDirect3DRMViewportImpl_Render,
464     IDirect3DRMViewportImpl_SetFront,
465     IDirect3DRMViewportImpl_SetBack,
466     IDirect3DRMViewportImpl_SetField,
467     IDirect3DRMViewportImpl_SetUniformScaling,
468     IDirect3DRMViewportImpl_SetCamera,
469     IDirect3DRMViewportImpl_SetProjection,
470     IDirect3DRMViewportImpl_Transform,
471     IDirect3DRMViewportImpl_InverseTransform,
472     IDirect3DRMViewportImpl_Configure,
473     IDirect3DRMViewportImpl_ForceUpdate,
474     IDirect3DRMViewportImpl_SetPlane,
475     IDirect3DRMViewportImpl_GetCamera,
476     IDirect3DRMViewportImpl_GetDevice,
477     IDirect3DRMViewportImpl_GetPlane,
478     IDirect3DRMViewportImpl_Pick,
479     IDirect3DRMViewportImpl_GetUniformScaling,
480     IDirect3DRMViewportImpl_GetX,
481     IDirect3DRMViewportImpl_GetY,
482     IDirect3DRMViewportImpl_GetWidth,
483     IDirect3DRMViewportImpl_GetHeight,
484     IDirect3DRMViewportImpl_GetField,
485     IDirect3DRMViewportImpl_GetBack,
486     IDirect3DRMViewportImpl_GetFront,
487     IDirect3DRMViewportImpl_GetProjection,
488     IDirect3DRMViewportImpl_GetDirect3DViewport
489 };
490
491
492 /*** IUnknown methods ***/
493 static HRESULT WINAPI IDirect3DRMViewport2Impl_QueryInterface(IDirect3DRMViewport2* iface,
494                                                              REFIID riid, void** object)
495 {
496     IDirect3DRMViewportImpl *This = impl_from_IDirect3DRMViewport2(iface);
497     return IDirect3DRMViewport_QueryInterface(&This->IDirect3DRMViewport_iface, riid, object);
498 }
499
500 static ULONG WINAPI IDirect3DRMViewport2Impl_AddRef(IDirect3DRMViewport2* iface)
501 {
502     IDirect3DRMViewportImpl *This = impl_from_IDirect3DRMViewport2(iface);
503     return IDirect3DRMViewport_AddRef(&This->IDirect3DRMViewport_iface);
504 }
505
506 static ULONG WINAPI IDirect3DRMViewport2Impl_Release(IDirect3DRMViewport2* iface)
507 {
508     IDirect3DRMViewportImpl *This = impl_from_IDirect3DRMViewport2(iface);
509     return IDirect3DRMViewport_Release(&This->IDirect3DRMViewport_iface);
510 }
511
512 /*** IDirect3DRMObject methods ***/
513 static HRESULT WINAPI IDirect3DRMViewport2Impl_Clone(IDirect3DRMViewport2* iface,
514                                                         LPUNKNOWN unkwn, REFIID riid,
515                                                         LPVOID* object)
516 {
517     IDirect3DRMViewportImpl *This = impl_from_IDirect3DRMViewport2(iface);
518
519     FIXME("(%p/%p)->(%p, %s, %p): stub\n", iface, This, unkwn, debugstr_guid(riid), object);
520
521     return E_NOTIMPL;
522 }
523
524 static HRESULT WINAPI IDirect3DRMViewport2Impl_AddDestroyCallback(IDirect3DRMViewport2* iface,
525                                                                      D3DRMOBJECTCALLBACK cb,
526                                                                      LPVOID argument)
527 {
528     IDirect3DRMViewportImpl *This = impl_from_IDirect3DRMViewport2(iface);
529
530     FIXME("(%p/%p)->(%p, %p): stub\n", iface, This, cb, argument);
531
532     return E_NOTIMPL;
533 }
534
535 static HRESULT WINAPI IDirect3DRMViewport2Impl_DeleteDestroyCallback(IDirect3DRMViewport2* iface,
536                                                                         D3DRMOBJECTCALLBACK cb,
537                                                                         LPVOID argument)
538 {
539     IDirect3DRMViewportImpl *This = impl_from_IDirect3DRMViewport2(iface);
540
541     FIXME("(%p/%p)->(%p, %p): stub\n", iface, This, cb, argument);
542
543     return E_NOTIMPL;
544 }
545
546 static HRESULT WINAPI IDirect3DRMViewport2Impl_SetAppData(IDirect3DRMViewport2* iface,
547                                                              DWORD data)
548 {
549     IDirect3DRMViewportImpl *This = impl_from_IDirect3DRMViewport2(iface);
550
551     FIXME("(%p/%p)->(%u): stub\n", iface, This, data);
552
553     return E_NOTIMPL;
554 }
555
556 static DWORD WINAPI IDirect3DRMViewport2Impl_GetAppData(IDirect3DRMViewport2* iface)
557 {
558     IDirect3DRMViewportImpl *This = impl_from_IDirect3DRMViewport2(iface);
559
560     FIXME("(%p/%p)->(): stub\n", iface, This);
561
562     return 0;
563 }
564
565 static HRESULT WINAPI IDirect3DRMViewport2Impl_SetName(IDirect3DRMViewport2* iface, LPCSTR name)
566 {
567     IDirect3DRMViewportImpl *This = impl_from_IDirect3DRMViewport2(iface);
568
569     FIXME("(%p/%p)->(%s): stub\n", iface, This, name);
570
571     return E_NOTIMPL;
572 }
573
574 static HRESULT WINAPI IDirect3DRMViewport2Impl_GetName(IDirect3DRMViewport2* iface,
575                                                           LPDWORD size, LPSTR name)
576 {
577     IDirect3DRMViewportImpl *This = impl_from_IDirect3DRMViewport2(iface);
578
579     FIXME("(%p/%p)->(%p, %p): stub\n", iface, This, size, name);
580
581     return E_NOTIMPL;
582 }
583
584 static HRESULT WINAPI IDirect3DRMViewport2Impl_GetClassName(IDirect3DRMViewport2* iface,
585                                                             LPDWORD size, LPSTR name)
586 {
587     IDirect3DRMViewportImpl *This = impl_from_IDirect3DRMViewport2(iface);
588
589     TRACE("(%p/%p)->(%p, %p)\n", iface, This, size, name);
590
591     if (!size || *size < strlen("Viewport") || !name)
592         return E_INVALIDARG;
593
594     strcpy(name, "Viewport");
595     *size = sizeof("Viewport");
596
597     return D3DRM_OK;
598 }
599
600 /*** IDirect3DRMViewport methods ***/
601 static HRESULT WINAPI IDirect3DRMViewport2Impl_Init(IDirect3DRMViewport2 *iface, IDirect3DRMDevice3 *device,
602         IDirect3DRMFrame3 *camera, DWORD x, DWORD y, DWORD width, DWORD height)
603 {
604     FIXME("iface %p, device %p, camera %p, x %u, y %u, width %u, height %u stub!\n",
605             iface, device, camera, x, y, width, height);
606
607     return E_NOTIMPL;
608 }
609
610 static HRESULT WINAPI IDirect3DRMViewport2Impl_Clear(IDirect3DRMViewport2* iface, DWORD flags)
611 {
612     IDirect3DRMViewportImpl *This = impl_from_IDirect3DRMViewport2(iface);
613
614     FIXME("(%p/%p)->(): stub\n", iface, This);
615
616     return D3DRM_OK;
617 }
618
619 static HRESULT WINAPI IDirect3DRMViewport2Impl_Render(IDirect3DRMViewport2 *iface, IDirect3DRMFrame3 *frame)
620 {
621     FIXME("iface %p, frame %p stub!\n", iface, frame);
622
623     return D3DRM_OK;
624 }
625
626 static HRESULT WINAPI IDirect3DRMViewport2Impl_SetFront(IDirect3DRMViewport2* iface, D3DVALUE front)
627 {
628     IDirect3DRMViewportImpl *This = impl_from_IDirect3DRMViewport2(iface);
629
630     TRACE("(%p/%p)->(%f):\n", iface, This, front);
631
632     This->front = front;
633
634     return D3DRM_OK;
635 }
636
637 static HRESULT WINAPI IDirect3DRMViewport2Impl_SetBack(IDirect3DRMViewport2* iface, D3DVALUE back)
638 {
639     IDirect3DRMViewportImpl *This = impl_from_IDirect3DRMViewport2(iface);
640
641     TRACE("(%p/%p)->(%f)\n", iface, This, back);
642
643     This->back = back;
644
645     return D3DRM_OK;
646 }
647
648 static HRESULT WINAPI IDirect3DRMViewport2Impl_SetField(IDirect3DRMViewport2* iface, D3DVALUE field)
649 {
650     IDirect3DRMViewportImpl *This = impl_from_IDirect3DRMViewport2(iface);
651
652     TRACE("(%p/%p)->(%f)\n", iface, This, field);
653
654     This->field = field;
655
656     return D3DRM_OK;
657 }
658
659 static HRESULT WINAPI IDirect3DRMViewport2Impl_SetUniformScaling(IDirect3DRMViewport2* iface, BOOL b)
660 {
661     IDirect3DRMViewportImpl *This = impl_from_IDirect3DRMViewport2(iface);
662
663     FIXME("(%p/%p)->(%d): stub\n", iface, This, b);
664
665     return E_NOTIMPL;
666 }
667
668 static HRESULT WINAPI IDirect3DRMViewport2Impl_SetCamera(IDirect3DRMViewport2 *iface, IDirect3DRMFrame3 *camera)
669 {
670     FIXME("iface %p, camera %p stub!\n", iface, camera);
671
672     return E_NOTIMPL;
673 }
674
675 static HRESULT WINAPI IDirect3DRMViewport2Impl_SetProjection(IDirect3DRMViewport2* iface,
676                                                             D3DRMPROJECTIONTYPE type)
677 {
678     IDirect3DRMViewportImpl *This = impl_from_IDirect3DRMViewport2(iface);
679
680     TRACE("(%p/%p)->(%u)\n", iface, This, type);
681
682     This->projection = type;
683
684     return D3DRM_OK;
685 }
686
687 static HRESULT WINAPI IDirect3DRMViewport2Impl_Transform(IDirect3DRMViewport2* iface,
688                                                         D3DRMVECTOR4D *d, D3DVECTOR *s)
689 {
690     IDirect3DRMViewportImpl *This = impl_from_IDirect3DRMViewport2(iface);
691
692     FIXME("(%p/%p)->(%p, %p): stub\n", iface, This, d, s);
693
694     return E_NOTIMPL;
695 }
696
697 static HRESULT WINAPI IDirect3DRMViewport2Impl_InverseTransform(IDirect3DRMViewport2* iface,
698                                                                D3DVECTOR *d, D3DRMVECTOR4D *s)
699 {
700     IDirect3DRMViewportImpl *This = impl_from_IDirect3DRMViewport2(iface);
701
702     FIXME("(%p/%p)->(%p, %p): stub\n", iface, This, d, s);
703
704     return E_NOTIMPL;
705 }
706
707 static HRESULT WINAPI IDirect3DRMViewport2Impl_Configure(IDirect3DRMViewport2* iface, LONG x, LONG y,
708                                                         DWORD width, DWORD height)
709 {
710     IDirect3DRMViewportImpl *This = impl_from_IDirect3DRMViewport2(iface);
711
712     FIXME("(%p/%p)->(%u, %u, %u, %u): stub\n", iface, This, x, y, width, height);
713
714     return E_NOTIMPL;
715 }
716
717 static HRESULT WINAPI IDirect3DRMViewport2Impl_ForceUpdate(IDirect3DRMViewport2* iface,
718                                                           DWORD x1, DWORD y1, DWORD x2, DWORD y2)
719 {
720     IDirect3DRMViewportImpl *This = impl_from_IDirect3DRMViewport2(iface);
721
722     FIXME("(%p/%p)->(%u, %u, %u, %u): stub\n", iface, This, x1, y1, x2, y2);
723
724     return E_NOTIMPL;
725 }
726
727 static HRESULT WINAPI IDirect3DRMViewport2Impl_SetPlane(IDirect3DRMViewport2* iface,
728                                                        D3DVALUE left, D3DVALUE right,
729                                                        D3DVALUE bottom, D3DVALUE top)
730 {
731     IDirect3DRMViewportImpl *This = impl_from_IDirect3DRMViewport2(iface);
732
733     FIXME("(%p/%p)->(%f, %f, %f, %f): stub\n", iface, This, left, right, bottom, top);
734
735     return E_NOTIMPL;
736 }
737
738 static HRESULT WINAPI IDirect3DRMViewport2Impl_GetCamera(IDirect3DRMViewport2 *iface, IDirect3DRMFrame3 **camera)
739 {
740     FIXME("iface %p, camera %p stub!\n", iface, camera);
741
742     return E_NOTIMPL;
743 }
744
745 static HRESULT WINAPI IDirect3DRMViewport2Impl_GetDevice(IDirect3DRMViewport2 *iface, IDirect3DRMDevice3 **device)
746 {
747     FIXME("iface %p, device %p stub!\n", iface, device);
748
749     return E_NOTIMPL;
750 }
751
752 static HRESULT WINAPI IDirect3DRMViewport2Impl_GetPlane(IDirect3DRMViewport2* iface,
753                                                        D3DVALUE *left, D3DVALUE *right,
754                                                        D3DVALUE *bottom, D3DVALUE *top)
755 {
756     IDirect3DRMViewportImpl *This = impl_from_IDirect3DRMViewport2(iface);
757
758     FIXME("(%p/%p)->(%p, %p, %p, %p): stub\n", iface, This, left, right, bottom, top);
759
760     return E_NOTIMPL;
761 }
762
763 static HRESULT WINAPI IDirect3DRMViewport2Impl_Pick(IDirect3DRMViewport2* iface, LONG x, LONG y,
764                                                    LPDIRECT3DRMPICKEDARRAY *return_visuals)
765 {
766     IDirect3DRMViewportImpl *This = impl_from_IDirect3DRMViewport2(iface);
767
768     FIXME("(%p/%p)->(%u, %u, %p): stub\n", iface, This, x, y, return_visuals);
769
770     return E_NOTIMPL;
771 }
772
773 static BOOL WINAPI IDirect3DRMViewport2Impl_GetUniformScaling(IDirect3DRMViewport2* iface)
774 {
775     IDirect3DRMViewportImpl *This = impl_from_IDirect3DRMViewport2(iface);
776
777     FIXME("(%p/%p)->(): stub\n", iface, This);
778
779     return E_NOTIMPL;
780 }
781
782 static LONG WINAPI IDirect3DRMViewport2Impl_GetX(IDirect3DRMViewport2* iface)
783 {
784     IDirect3DRMViewportImpl *This = impl_from_IDirect3DRMViewport2(iface);
785
786     FIXME("(%p/%p)->(): stub\n", iface, This);
787
788     return E_NOTIMPL;
789 }
790
791 static LONG WINAPI IDirect3DRMViewport2Impl_GetY(IDirect3DRMViewport2* iface)
792 {
793     IDirect3DRMViewportImpl *This = impl_from_IDirect3DRMViewport2(iface);
794
795     FIXME("(%p/%p)->(): stub\n", iface, This);
796
797     return E_NOTIMPL;
798 }
799
800 static DWORD WINAPI IDirect3DRMViewport2Impl_GetWidth(IDirect3DRMViewport2* iface)
801 {
802     IDirect3DRMViewportImpl *This = impl_from_IDirect3DRMViewport2(iface);
803
804     FIXME("(%p/%p)->(): stub\n", iface, This);
805
806     return E_NOTIMPL;
807 }
808
809 static DWORD WINAPI IDirect3DRMViewport2Impl_GetHeight(IDirect3DRMViewport2* iface)
810 {
811     IDirect3DRMViewportImpl *This = impl_from_IDirect3DRMViewport2(iface);
812
813     FIXME("(%p/%p)->(): stub\n", iface, This);
814
815     return E_NOTIMPL;
816 }
817
818 static D3DVALUE WINAPI IDirect3DRMViewport2Impl_GetField(IDirect3DRMViewport2* iface)
819 {
820     IDirect3DRMViewportImpl *This = impl_from_IDirect3DRMViewport2(iface);
821
822     TRACE("(%p/%p)->()\n", iface, This);
823
824     return This->field;
825 }
826
827 static D3DVALUE WINAPI IDirect3DRMViewport2Impl_GetBack(IDirect3DRMViewport2* iface)
828 {
829     IDirect3DRMViewportImpl *This = impl_from_IDirect3DRMViewport2(iface);
830
831     TRACE("(%p/%p)->()\n", iface, This);
832
833     return This->back;
834 }
835
836 static D3DVALUE WINAPI IDirect3DRMViewport2Impl_GetFront(IDirect3DRMViewport2* iface)
837 {
838     IDirect3DRMViewportImpl *This = impl_from_IDirect3DRMViewport2(iface);
839
840     TRACE("(%p/%p)->()\n", iface, This);
841
842     return This->front;
843 }
844
845 static D3DRMPROJECTIONTYPE WINAPI IDirect3DRMViewport2Impl_GetProjection(IDirect3DRMViewport2* iface)
846 {
847     IDirect3DRMViewportImpl *This = impl_from_IDirect3DRMViewport2(iface);
848
849     TRACE("(%p/%p)->()\n", iface, This);
850
851     return This->projection;
852 }
853
854 static HRESULT WINAPI IDirect3DRMViewport2Impl_GetDirect3DViewport(IDirect3DRMViewport2 *iface,
855         IDirect3DViewport **viewport)
856 {
857     IDirect3DRMViewportImpl *This = impl_from_IDirect3DRMViewport2(iface);
858
859     FIXME("(%p/%p)->(%p): stub\n", iface, This, This);
860
861     return E_NOTIMPL;
862 }
863
864 /*** IDirect3DRMViewport2 methods ***/
865 static HRESULT WINAPI IDirect3DRMViewport2Impl_TransformVectors(IDirect3DRMViewport2 *iface,
866         DWORD numvectors, D3DRMVECTOR4D *dstvectors, D3DVECTOR *srcvectors)
867 {
868     IDirect3DRMViewportImpl *This = impl_from_IDirect3DRMViewport2(iface);
869
870     FIXME("(%p/%p)->(%u, %p, %p): stub\n", iface, This, numvectors, dstvectors, srcvectors);
871
872     return E_NOTIMPL;
873 }
874
875 static HRESULT WINAPI IDirect3DRMViewport2Impl_InverseTransformVectors(IDirect3DRMViewport2 *iface,
876         DWORD numvectors, D3DVECTOR *dstvectors, D3DRMVECTOR4D *srcvectors)
877 {
878     IDirect3DRMViewportImpl *This = impl_from_IDirect3DRMViewport2(iface);
879
880     FIXME("(%p/%p)->(%u, %p, %p): stub\n", iface, This, numvectors, dstvectors, srcvectors);
881
882     return E_NOTIMPL;
883 }
884
885 static const struct IDirect3DRMViewport2Vtbl Direct3DRMViewport2_Vtbl =
886 {
887     /*** IUnknown methods ***/
888     IDirect3DRMViewport2Impl_QueryInterface,
889     IDirect3DRMViewport2Impl_AddRef,
890     IDirect3DRMViewport2Impl_Release,
891     /*** IDirect3DRMObject methods ***/
892     IDirect3DRMViewport2Impl_Clone,
893     IDirect3DRMViewport2Impl_AddDestroyCallback,
894     IDirect3DRMViewport2Impl_DeleteDestroyCallback,
895     IDirect3DRMViewport2Impl_SetAppData,
896     IDirect3DRMViewport2Impl_GetAppData,
897     IDirect3DRMViewport2Impl_SetName,
898     IDirect3DRMViewport2Impl_GetName,
899     IDirect3DRMViewport2Impl_GetClassName,
900     /*** IDirect3DRMViewport methods ***/
901     IDirect3DRMViewport2Impl_Init,
902     IDirect3DRMViewport2Impl_Clear,
903     IDirect3DRMViewport2Impl_Render,
904     IDirect3DRMViewport2Impl_SetFront,
905     IDirect3DRMViewport2Impl_SetBack,
906     IDirect3DRMViewport2Impl_SetField,
907     IDirect3DRMViewport2Impl_SetUniformScaling,
908     IDirect3DRMViewport2Impl_SetCamera,
909     IDirect3DRMViewport2Impl_SetProjection,
910     IDirect3DRMViewport2Impl_Transform,
911     IDirect3DRMViewport2Impl_InverseTransform,
912     IDirect3DRMViewport2Impl_Configure,
913     IDirect3DRMViewport2Impl_ForceUpdate,
914     IDirect3DRMViewport2Impl_SetPlane,
915     IDirect3DRMViewport2Impl_GetCamera,
916     IDirect3DRMViewport2Impl_GetDevice,
917     IDirect3DRMViewport2Impl_GetPlane,
918     IDirect3DRMViewport2Impl_Pick,
919     IDirect3DRMViewport2Impl_GetUniformScaling,
920     IDirect3DRMViewport2Impl_GetX,
921     IDirect3DRMViewport2Impl_GetY,
922     IDirect3DRMViewport2Impl_GetWidth,
923     IDirect3DRMViewport2Impl_GetHeight,
924     IDirect3DRMViewport2Impl_GetField,
925     IDirect3DRMViewport2Impl_GetBack,
926     IDirect3DRMViewport2Impl_GetFront,
927     IDirect3DRMViewport2Impl_GetProjection,
928     IDirect3DRMViewport2Impl_GetDirect3DViewport,
929     /*** IDirect3DRMViewport2 methods ***/
930     IDirect3DRMViewport2Impl_TransformVectors,
931     IDirect3DRMViewport2Impl_InverseTransformVectors
932 };
933
934 HRESULT Direct3DRMViewport_create(REFIID riid, IUnknown** ppObj)
935 {
936     IDirect3DRMViewportImpl* object;
937
938     TRACE("(%p)\n", ppObj);
939
940     object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DRMViewportImpl));
941     if (!object)
942         return E_OUTOFMEMORY;
943
944     object->IDirect3DRMViewport_iface.lpVtbl = &Direct3DRMViewport_Vtbl;
945     object->IDirect3DRMViewport2_iface.lpVtbl = &Direct3DRMViewport2_Vtbl;
946     object->ref = 1;
947
948     if (IsEqualGUID(riid, &IID_IDirect3DRMViewport2))
949         *ppObj = (IUnknown*)&object->IDirect3DRMViewport2_iface;
950     else
951         *ppObj = (IUnknown*)&object->IDirect3DRMViewport_iface;
952
953     return S_OK;
954 }