user32: Define a global list of parameter registry keys and store an index in the...
[wine] / dlls / d3drm / texture.c
1 /*
2  * Implementation of IDirect3DRMTextureX interfaces
3  *
4  * Copyright 2012 Christian Costa
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19  */
20
21 #include "wine/debug.h"
22
23 #define COBJMACROS
24
25 #include "winbase.h"
26 #include "wingdi.h"
27
28 #include "d3drm_private.h"
29
30 WINE_DEFAULT_DEBUG_CHANNEL(d3drm);
31
32 typedef struct {
33     IDirect3DRMTexture2 IDirect3DRMTexture2_iface;
34     IDirect3DRMTexture3 IDirect3DRMTexture3_iface;
35     LONG ref;
36     DWORD app_data;
37 } IDirect3DRMTextureImpl;
38
39 static inline IDirect3DRMTextureImpl *impl_from_IDirect3DRMTexture2(IDirect3DRMTexture2 *iface)
40 {
41     return CONTAINING_RECORD(iface, IDirect3DRMTextureImpl, IDirect3DRMTexture2_iface);
42 }
43
44 static inline IDirect3DRMTextureImpl *impl_from_IDirect3DRMTexture3(IDirect3DRMTexture3 *iface)
45 {
46     return CONTAINING_RECORD(iface, IDirect3DRMTextureImpl, IDirect3DRMTexture3_iface);
47 }
48
49 /*** IUnknown methods ***/
50 static HRESULT WINAPI IDirect3DRMTexture2Impl_QueryInterface(IDirect3DRMTexture2* iface,
51                                                              REFIID riid, void** object)
52 {
53     IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture2(iface);
54
55     TRACE("(%p)->(%s, %p)\n", iface, debugstr_guid(riid), object);
56
57     *object = NULL;
58
59     if (IsEqualGUID(riid, &IID_IUnknown) ||
60         IsEqualGUID(riid, &IID_IDirect3DRMTexture) ||
61         IsEqualGUID(riid, &IID_IDirect3DRMTexture2))
62     {
63         *object = &This->IDirect3DRMTexture2_iface;
64     }
65     else if IsEqualGUID(riid, &IID_IDirect3DRMTexture3)
66     {
67         *object = &This->IDirect3DRMTexture3_iface;
68     }
69     else
70     {
71         FIXME("Interface %s not implemented\n", debugstr_guid(riid));
72         return E_NOINTERFACE;
73     }
74
75     IDirect3DRMTexture3_AddRef(iface);
76
77     return S_OK;
78 }
79
80 static ULONG WINAPI IDirect3DRMTexture2Impl_AddRef(IDirect3DRMTexture2* iface)
81 {
82     IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture2(iface);
83     ULONG ref = InterlockedIncrement(&This->ref);
84
85     TRACE("(%p)->(): new ref = %d\n", iface, ref);
86
87     return ref;
88 }
89
90 static ULONG WINAPI IDirect3DRMTexture2Impl_Release(IDirect3DRMTexture2* iface)
91 {
92     IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture2(iface);
93     ULONG ref = InterlockedDecrement(&This->ref);
94
95     TRACE("(%p)->(): new ref = %d\n", iface, ref);
96
97     if (!ref)
98         HeapFree(GetProcessHeap(), 0, This);
99
100     return ref;
101 }
102
103 /*** IDirect3DRMObject methods ***/
104 static HRESULT WINAPI IDirect3DRMTexture2Impl_Clone(IDirect3DRMTexture2* iface,
105                                                     LPUNKNOWN unknown, REFIID riid,
106                                                     LPVOID* object)
107 {
108     FIXME("(%p)->(%p, %s, %p): stub\n", iface, unknown, debugstr_guid(riid), object);
109
110     return E_NOTIMPL;
111 }
112
113 static HRESULT WINAPI IDirect3DRMTexture2Impl_AddDestroyCallback(IDirect3DRMTexture2* iface,
114                                                                  D3DRMOBJECTCALLBACK cb,
115                                                                  LPVOID argument)
116 {
117     FIXME("(%p)->(%p, %p): stub\n", iface, cb, argument);
118
119     return E_NOTIMPL;
120 }
121
122 static HRESULT WINAPI IDirect3DRMTexture2Impl_DeleteDestroyCallback(IDirect3DRMTexture2* iface,
123                                                                     D3DRMOBJECTCALLBACK cb,
124                                                                     LPVOID argument)
125 {
126     FIXME("(%p)->(%p, %p): stub\n", iface, cb, argument);
127
128     return E_NOTIMPL;
129 }
130
131 static HRESULT WINAPI IDirect3DRMTexture2Impl_SetAppData(IDirect3DRMTexture2* iface,
132                                                          DWORD data)
133 {
134     IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture2(iface);
135
136     TRACE("(%p)->(%u)\n", iface, data);
137
138     return IDirect3DRMTexture3_SetAppData(&This->IDirect3DRMTexture3_iface, data);
139 }
140
141 static DWORD WINAPI IDirect3DRMTexture2Impl_GetAppData(IDirect3DRMTexture2* iface)
142 {
143     IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture2(iface);
144
145     TRACE("(%p)->()\n", iface);
146
147     return IDirect3DRMTexture3_GetAppData(&This->IDirect3DRMTexture3_iface);
148 }
149
150 static HRESULT WINAPI IDirect3DRMTexture2Impl_SetName(IDirect3DRMTexture2* iface, LPCSTR name)
151 {
152     FIXME("(%p)->(%s): stub\n", iface, name);
153
154     return E_NOTIMPL;
155 }
156
157 static HRESULT WINAPI IDirect3DRMTexture2Impl_GetName(IDirect3DRMTexture2* iface,
158                                                       LPDWORD size, LPSTR name)
159 {
160     FIXME("(%p)->(%p, %p): stub\n", iface, size, name);
161
162     return E_NOTIMPL;
163 }
164
165 static HRESULT WINAPI IDirect3DRMTexture2Impl_GetClassName(IDirect3DRMTexture2* iface,
166                                                            LPDWORD size, LPSTR name)
167 {
168     IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture2(iface);
169
170     TRACE("(%p/%p)->(%p, %p)\n", iface, This, size, name);
171
172     return IDirect3DRMTexture3_GetClassName(&This->IDirect3DRMTexture3_iface, size, name);
173 }
174
175 /*** IDirect3DRMTexture3 methods ***/
176 static HRESULT WINAPI IDirect3DRMTexture2Impl_InitFromFile(IDirect3DRMTexture2* iface, const char *filename)
177 {
178     IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture2(iface);
179
180     FIXME("(%p/%p)->(%s): stub\n", iface, This, debugstr_a(filename));
181
182     return E_NOTIMPL;
183 }
184
185 static HRESULT WINAPI IDirect3DRMTexture2Impl_InitFromSurface(IDirect3DRMTexture2* iface, LPDIRECTDRAWSURFACE surface)
186 {
187     IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture2(iface);
188
189     FIXME("(%p/%p)->(%p): stub\n", iface, This, surface);
190
191     return E_NOTIMPL;
192 }
193
194 static HRESULT WINAPI IDirect3DRMTexture2Impl_InitFromResource(IDirect3DRMTexture2* iface, HRSRC resource)
195 {
196     IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture2(iface);
197
198     FIXME("(%p/%p)->(%p): stub\n", iface, This, resource);
199
200     return E_NOTIMPL;
201 }
202
203 static HRESULT WINAPI IDirect3DRMTexture2Impl_Changed(IDirect3DRMTexture2* iface, BOOL pixels, BOOL palette)
204 {
205     IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture2(iface);
206
207     FIXME("(%p/%p)->(%u, %u): stub\n", iface, This, pixels, palette);
208
209     return E_NOTIMPL;
210 }
211
212 static HRESULT WINAPI IDirect3DRMTexture2Impl_SetColors(IDirect3DRMTexture2* iface, DWORD max_colors)
213 {
214     IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture2(iface);
215
216     FIXME("(%p/%p)->(%u): stub\n", iface, This, max_colors);
217
218     return E_NOTIMPL;
219 }
220
221 static HRESULT WINAPI IDirect3DRMTexture2Impl_SetShades(IDirect3DRMTexture2* iface, DWORD max_shades)
222 {
223     IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture2(iface);
224
225     FIXME("(%p/%p)->(%u): stub\n", iface, This, max_shades);
226
227     return E_NOTIMPL;
228 }
229
230 static HRESULT WINAPI IDirect3DRMTexture2Impl_SetDecalSize(IDirect3DRMTexture2* iface, D3DVALUE width, D3DVALUE height)
231 {
232     IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture2(iface);
233
234     FIXME("(%p/%p)->(%f, %f): stub\n", iface, This, width, height);
235
236     return E_NOTIMPL;
237 }
238
239 static HRESULT WINAPI IDirect3DRMTexture2Impl_SetDecalOrigin(IDirect3DRMTexture2* iface, LONG x, LONG y)
240 {
241     IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture2(iface);
242
243     FIXME("(%p/%p)->(%d, %d): stub\n", iface, This, x, y);
244
245     return E_NOTIMPL;
246 }
247
248 static HRESULT WINAPI IDirect3DRMTexture2Impl_SetDecalScale(IDirect3DRMTexture2* iface, DWORD scale)
249 {
250     IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture2(iface);
251
252     FIXME("(%p/%p)->(%u): stub\n", iface, This, scale);
253
254     return E_NOTIMPL;
255 }
256
257 static HRESULT WINAPI IDirect3DRMTexture2Impl_SetDecalTransparency(IDirect3DRMTexture2* iface, BOOL transparency)
258 {
259     IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture2(iface);
260
261     FIXME("(%p/%p)->(%u): stub\n", iface, This, transparency);
262
263     return E_NOTIMPL;
264 }
265
266 static HRESULT WINAPI IDirect3DRMTexture2Impl_SetDecalTransparentColor(IDirect3DRMTexture2* iface, D3DCOLOR color)
267 {
268     IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture2(iface);
269
270     FIXME("(%p/%p)->(%x): stub\n", iface, This, color);
271
272     return E_NOTIMPL;
273 }
274
275 static HRESULT WINAPI IDirect3DRMTexture2Impl_GetDecalSize(IDirect3DRMTexture2* iface, D3DVALUE* width, D3DVALUE* height)
276 {
277     IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture2(iface);
278
279     FIXME("(%p/%p)->(%p, %p): stub\n", iface, This, height, width);
280
281     return E_NOTIMPL;
282 }
283
284 static HRESULT WINAPI IDirect3DRMTexture2Impl_GetDecalOrigin(IDirect3DRMTexture2* iface, LONG* x, LONG* y)
285 {
286     IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture2(iface);
287
288     FIXME("(%p/%p)->(%p, %p): stub\n", iface, This, x, y);
289
290     return E_NOTIMPL;
291 }
292
293 static D3DRMIMAGE* WINAPI IDirect3DRMTexture2Impl_GetImage(IDirect3DRMTexture2* iface)
294 {
295     IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture2(iface);
296
297     FIXME("(%p/%p)->(): stub\n", iface, This);
298
299     return NULL;
300 }
301
302 static DWORD WINAPI IDirect3DRMTexture2Impl_GetShades(IDirect3DRMTexture2* iface)
303 {
304     IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture2(iface);
305
306     FIXME("(%p/%p)->(): stub\n", iface, This);
307
308     return 0;
309 }
310
311 static DWORD WINAPI IDirect3DRMTexture2Impl_GetColors(IDirect3DRMTexture2* iface)
312 {
313     IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture2(iface);
314
315     FIXME("(%p/%p)->(): stub\n", iface, This);
316
317     return 0;
318 }
319
320 static DWORD WINAPI IDirect3DRMTexture2Impl_GetDecalScale(IDirect3DRMTexture2* iface)
321 {
322     IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture2(iface);
323
324     FIXME("(%p/%p)->(): stub\n", iface, This);
325
326     return 0;
327 }
328
329 static BOOL WINAPI IDirect3DRMTexture2Impl_GetDecalTransparency(IDirect3DRMTexture2* iface)
330 {
331     IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture2(iface);
332
333     FIXME("(%p/%p)->(): stub\n", iface, This);
334
335     return FALSE;
336 }
337
338 static D3DCOLOR WINAPI IDirect3DRMTexture2Impl_GetDecalTransparentColor(IDirect3DRMTexture2* iface)
339 {
340     IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture2(iface);
341
342     FIXME("(%p/%p)->(): stub\n", iface, This);
343
344     return 0;
345 }
346
347 /*** IDirect3DRMTexture2 methods ***/
348 static HRESULT WINAPI IDirect3DRMTexture2Impl_InitFromImage(IDirect3DRMTexture2* iface, LPD3DRMIMAGE image)
349 {
350     IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture2(iface);
351
352     FIXME("(%p/%p)->(%p): stub\n", iface, This, image);
353
354     return E_NOTIMPL;
355 }
356
357 static HRESULT WINAPI IDirect3DRMTexture2Impl_InitFromResource2(IDirect3DRMTexture2* iface, HMODULE module,
358                                                                LPCSTR /* LPCTSTR */ name, LPCSTR /* LPCTSTR */ type)
359 {
360     IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture2(iface);
361
362     FIXME("(%p/%p)->(%p, %s, %s): stub\n", iface, This, module, debugstr_a(name), debugstr_a(type));
363
364     return E_NOTIMPL;
365 }
366
367 static HRESULT WINAPI IDirect3DRMTexture2Impl_GenerateMIPMap(IDirect3DRMTexture2* iface, DWORD flags)
368 {
369     IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture2(iface);
370
371     FIXME("(%p/%p)->(%x): stub\n", iface, This, flags);
372
373     return E_NOTIMPL;
374 }
375
376 static const struct IDirect3DRMTexture2Vtbl Direct3DRMTexture2_Vtbl =
377 {
378     /*** IUnknown methods ***/
379     IDirect3DRMTexture2Impl_QueryInterface,
380     IDirect3DRMTexture2Impl_AddRef,
381     IDirect3DRMTexture2Impl_Release,
382     /*** IDirect3DRMObject methods ***/
383     IDirect3DRMTexture2Impl_Clone,
384     IDirect3DRMTexture2Impl_AddDestroyCallback,
385     IDirect3DRMTexture2Impl_DeleteDestroyCallback,
386     IDirect3DRMTexture2Impl_SetAppData,
387     IDirect3DRMTexture2Impl_GetAppData,
388     IDirect3DRMTexture2Impl_SetName,
389     IDirect3DRMTexture2Impl_GetName,
390     IDirect3DRMTexture2Impl_GetClassName,
391     /*** IDirect3DRMTexture methods ***/
392     IDirect3DRMTexture2Impl_InitFromFile,
393     IDirect3DRMTexture2Impl_InitFromSurface,
394     IDirect3DRMTexture2Impl_InitFromResource,
395     IDirect3DRMTexture2Impl_Changed,
396     IDirect3DRMTexture2Impl_SetColors,
397     IDirect3DRMTexture2Impl_SetShades,
398     IDirect3DRMTexture2Impl_SetDecalSize,
399     IDirect3DRMTexture2Impl_SetDecalOrigin,
400     IDirect3DRMTexture2Impl_SetDecalScale,
401     IDirect3DRMTexture2Impl_SetDecalTransparency,
402     IDirect3DRMTexture2Impl_SetDecalTransparentColor,
403     IDirect3DRMTexture2Impl_GetDecalSize,
404     IDirect3DRMTexture2Impl_GetDecalOrigin,
405     IDirect3DRMTexture2Impl_GetImage,
406     IDirect3DRMTexture2Impl_GetShades,
407     IDirect3DRMTexture2Impl_GetColors,
408     IDirect3DRMTexture2Impl_GetDecalScale,
409     IDirect3DRMTexture2Impl_GetDecalTransparency,
410     IDirect3DRMTexture2Impl_GetDecalTransparentColor,
411     /*** IDirect3DRMTexture2 methods ***/
412     IDirect3DRMTexture2Impl_InitFromImage,
413     IDirect3DRMTexture2Impl_InitFromResource2,
414     IDirect3DRMTexture2Impl_GenerateMIPMap
415 };
416
417 /*** IUnknown methods ***/
418 static HRESULT WINAPI IDirect3DRMTexture3Impl_QueryInterface(IDirect3DRMTexture3* iface,
419                                                            REFIID riid, void** object)
420 {
421     IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture3(iface);
422
423     TRACE("(%p)->(%s, %p)\n", iface, debugstr_guid(riid), object);
424
425     *object = NULL;
426
427     if (IsEqualGUID(riid, &IID_IUnknown) ||
428         IsEqualGUID(riid, &IID_IDirect3DRMTexture) ||
429         IsEqualGUID(riid, &IID_IDirect3DRMTexture2))
430     {
431         *object = &This->IDirect3DRMTexture2_iface;
432     }
433     else if IsEqualGUID(riid, &IID_IDirect3DRMTexture3)
434     {
435         *object = &This->IDirect3DRMTexture3_iface;
436     }
437     else
438     {
439         FIXME("Interface %s not implemented\n", debugstr_guid(riid));
440         return E_NOINTERFACE;
441     }
442
443     IDirect3DRMTexture3_AddRef(iface);
444
445     return S_OK;
446 }
447
448 static ULONG WINAPI IDirect3DRMTexture3Impl_AddRef(IDirect3DRMTexture3* iface)
449 {
450     IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture3(iface);
451     ULONG ref = InterlockedIncrement(&This->ref);
452
453     TRACE("(%p)->(): new ref = %d\n", iface, ref);
454
455     return ref;
456 }
457
458 static ULONG WINAPI IDirect3DRMTexture3Impl_Release(IDirect3DRMTexture3* iface)
459 {
460     IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture3(iface);
461     ULONG ref = InterlockedDecrement(&This->ref);
462
463     TRACE("(%p)->(): new ref = %d\n", iface, ref);
464
465     if (!ref)
466         HeapFree(GetProcessHeap(), 0, This);
467
468     return ref;
469 }
470
471 /*** IDirect3DRMObject methods ***/
472 static HRESULT WINAPI IDirect3DRMTexture3Impl_Clone(IDirect3DRMTexture3* iface,
473                                                      LPUNKNOWN unknown, REFIID riid,
474                                                      LPVOID* object)
475 {
476     FIXME("(%p)->(%p, %s, %p): stub\n", iface, unknown, debugstr_guid(riid), object);
477
478     return E_NOTIMPL;
479 }
480
481 static HRESULT WINAPI IDirect3DRMTexture3Impl_AddDestroyCallback(IDirect3DRMTexture3* iface,
482                                                                   D3DRMOBJECTCALLBACK cb,
483                                                                   LPVOID argument)
484 {
485     FIXME("(%p)->(%p, %p): stub\n", iface, cb, argument);
486
487     return E_NOTIMPL;
488 }
489
490 static HRESULT WINAPI IDirect3DRMTexture3Impl_DeleteDestroyCallback(IDirect3DRMTexture3* iface,
491                                                                      D3DRMOBJECTCALLBACK cb,
492                                                                      LPVOID argument)
493 {
494     FIXME("(%p)->(%p, %p): stub\n", iface, cb, argument);
495
496     return E_NOTIMPL;
497 }
498
499 static HRESULT WINAPI IDirect3DRMTexture3Impl_SetAppData(IDirect3DRMTexture3* iface,
500                                                          DWORD data)
501 {
502     IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture3(iface);
503
504     TRACE("(%p)->(%u)\n", iface, data);
505
506     This->app_data = data;
507
508     return D3DRM_OK;
509 }
510
511 static DWORD WINAPI IDirect3DRMTexture3Impl_GetAppData(IDirect3DRMTexture3* iface)
512 {
513     IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture3(iface);
514
515     TRACE("(%p)->()\n", iface);
516
517     return This->app_data;
518 }
519
520 static HRESULT WINAPI IDirect3DRMTexture3Impl_SetName(IDirect3DRMTexture3* iface, LPCSTR name)
521 {
522     FIXME("(%p)->(%s): stub\n", iface, name);
523
524     return E_NOTIMPL;
525 }
526
527 static HRESULT WINAPI IDirect3DRMTexture3Impl_GetName(IDirect3DRMTexture3* iface,
528                                                        LPDWORD size, LPSTR name)
529 {
530     FIXME("(%p)->(%p, %p): stub\n", iface, size, name);
531
532     return E_NOTIMPL;
533 }
534
535 static HRESULT WINAPI IDirect3DRMTexture3Impl_GetClassName(IDirect3DRMTexture3* iface,
536                                                            LPDWORD size, LPSTR name)
537 {
538     IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture3(iface);
539
540     TRACE("(%p/%p)->(%p, %p)\n", iface, This, size, name);
541
542     if (!size || *size < strlen("Texture") || !name)
543         return E_INVALIDARG;
544
545     strcpy(name, "Texture");
546     *size = sizeof("Texture");
547
548     return D3DRM_OK;
549 }
550
551 /*** IDirect3DRMTexture3 methods ***/
552 static HRESULT WINAPI IDirect3DRMTexture3Impl_InitFromFile(IDirect3DRMTexture3* iface, const char *filename)
553 {
554     IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture3(iface);
555
556     FIXME("(%p/%p)->(%s): stub\n", iface, This, debugstr_a(filename));
557
558     return E_NOTIMPL;
559 }
560
561 static HRESULT WINAPI IDirect3DRMTexture3Impl_InitFromSurface(IDirect3DRMTexture3* iface, LPDIRECTDRAWSURFACE surface)
562 {
563     IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture3(iface);
564
565     FIXME("(%p/%p)->(%p): stub\n", iface, This, surface);
566
567     return E_NOTIMPL;
568 }
569
570 static HRESULT WINAPI IDirect3DRMTexture3Impl_InitFromResource(IDirect3DRMTexture3* iface, HRSRC resource)
571 {
572     IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture3(iface);
573
574     FIXME("(%p/%p)->(%p): stub\n", iface, This, resource);
575
576     return E_NOTIMPL;
577 }
578
579 static HRESULT WINAPI IDirect3DRMTexture3Impl_Changed(IDirect3DRMTexture3* iface, DWORD flags, DWORD nb_rects, LPRECT rects)
580 {
581     IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture3(iface);
582
583     FIXME("(%p/%p)->(%x, %u, %p): stub\n", iface, This, flags, nb_rects, rects);
584
585     return E_NOTIMPL;
586 }
587
588 static HRESULT WINAPI IDirect3DRMTexture3Impl_SetColors(IDirect3DRMTexture3* iface, DWORD max_colors)
589 {
590     IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture3(iface);
591
592     FIXME("(%p/%p)->(%u): stub\n", iface, This, max_colors);
593
594     return E_NOTIMPL;
595 }
596
597 static HRESULT WINAPI IDirect3DRMTexture3Impl_SetShades(IDirect3DRMTexture3* iface, DWORD max_shades)
598 {
599     IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture3(iface);
600
601     FIXME("(%p/%p)->(%u): stub\n", iface, This, max_shades);
602
603     return E_NOTIMPL;
604 }
605
606 static HRESULT WINAPI IDirect3DRMTexture3Impl_SetDecalSize(IDirect3DRMTexture3* iface, D3DVALUE width, D3DVALUE height)
607 {
608     IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture3(iface);
609
610     FIXME("(%p/%p)->(%f, %f): stub\n", iface, This, width, height);
611
612     return E_NOTIMPL;
613 }
614
615 static HRESULT WINAPI IDirect3DRMTexture3Impl_SetDecalOrigin(IDirect3DRMTexture3* iface, LONG x, LONG y)
616 {
617     IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture3(iface);
618
619     FIXME("(%p/%p)->(%d, %d): stub\n", iface, This, x, y);
620
621     return E_NOTIMPL;
622 }
623
624 static HRESULT WINAPI IDirect3DRMTexture3Impl_SetDecalScale(IDirect3DRMTexture3* iface, DWORD scale)
625 {
626     IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture3(iface);
627
628     FIXME("(%p/%p)->(%u): stub\n", iface, This, scale);
629
630     return E_NOTIMPL;
631 }
632
633 static HRESULT WINAPI IDirect3DRMTexture3Impl_SetDecalTransparency(IDirect3DRMTexture3* iface, BOOL transparency)
634 {
635     IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture3(iface);
636
637     FIXME("(%p/%p)->(%u): stub\n", iface, This, transparency);
638
639     return E_NOTIMPL;
640 }
641
642 static HRESULT WINAPI IDirect3DRMTexture3Impl_SetDecalTransparentColor(IDirect3DRMTexture3* iface, D3DCOLOR color)
643 {
644     IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture3(iface);
645
646     FIXME("(%p/%p)->(%x): stub\n", iface, This, color);
647
648     return E_NOTIMPL;
649 }
650
651 static HRESULT WINAPI IDirect3DRMTexture3Impl_GetDecalSize(IDirect3DRMTexture3* iface, D3DVALUE* width, D3DVALUE* height)
652 {
653     IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture3(iface);
654
655     FIXME("(%p/%p)->(%p, %p): stub\n", iface, This, height, width);
656
657     return E_NOTIMPL;
658 }
659
660 static HRESULT WINAPI IDirect3DRMTexture3Impl_GetDecalOrigin(IDirect3DRMTexture3* iface, LONG* x, LONG* y)
661 {
662     IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture3(iface);
663
664     FIXME("(%p/%p)->(%p, %p): stub\n", iface, This, x, y);
665
666     return E_NOTIMPL;
667 }
668
669 static D3DRMIMAGE* WINAPI IDirect3DRMTexture3Impl_GetImage(IDirect3DRMTexture3* iface)
670 {
671     IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture3(iface);
672
673     FIXME("(%p/%p)->(): stub\n", iface, This);
674
675     return NULL;
676 }
677
678 static DWORD WINAPI IDirect3DRMTexture3Impl_GetShades(IDirect3DRMTexture3* iface)
679 {
680     IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture3(iface);
681
682     FIXME("(%p/%p)->(): stub\n", iface, This);
683
684     return 0;
685 }
686
687 static DWORD WINAPI IDirect3DRMTexture3Impl_GetColors(IDirect3DRMTexture3* iface)
688 {
689     IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture3(iface);
690
691     FIXME("(%p/%p)->(): stub\n", iface, This);
692
693     return 0;
694 }
695
696 static DWORD WINAPI IDirect3DRMTexture3Impl_GetDecalScale(IDirect3DRMTexture3* iface)
697 {
698     IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture3(iface);
699
700     FIXME("(%p/%p)->(): stub\n", iface, This);
701
702     return 0;
703 }
704
705 static BOOL WINAPI IDirect3DRMTexture3Impl_GetDecalTransparency(IDirect3DRMTexture3* iface)
706 {
707     IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture3(iface);
708
709     FIXME("(%p/%p)->(): stub\n", iface, This);
710
711     return FALSE;
712 }
713
714 static D3DCOLOR WINAPI IDirect3DRMTexture3Impl_GetDecalTransparentColor(IDirect3DRMTexture3* iface)
715 {
716     IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture3(iface);
717
718     FIXME("(%p/%p)->(): stub\n", iface, This);
719
720     return 0;
721 }
722
723 static HRESULT WINAPI IDirect3DRMTexture3Impl_InitFromImage(IDirect3DRMTexture3* iface, LPD3DRMIMAGE image)
724 {
725     IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture3(iface);
726
727     FIXME("(%p/%p)->(%p): stub\n", iface, This, image);
728
729     return E_NOTIMPL;
730 }
731
732 static HRESULT WINAPI IDirect3DRMTexture3Impl_InitFromResource2(IDirect3DRMTexture3* iface, HMODULE module,
733                                                                LPCSTR /* LPCTSTR */ name, LPCSTR /* LPCTSTR */ type)
734 {
735     IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture3(iface);
736
737     FIXME("(%p/%p)->(%p, %s, %s): stub\n", iface, This, module, debugstr_a(name), debugstr_a(type));
738
739     return E_NOTIMPL;
740 }
741
742 static HRESULT WINAPI IDirect3DRMTexture3Impl_GenerateMIPMap(IDirect3DRMTexture3* iface, DWORD flags)
743 {
744     IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture3(iface);
745
746     FIXME("(%p/%p)->(%x): stub\n", iface, This, flags);
747
748     return E_NOTIMPL;
749 }
750
751 static HRESULT WINAPI IDirect3DRMTexture3Impl_GetSurface(IDirect3DRMTexture3* iface, DWORD flags, LPDIRECTDRAWSURFACE* surface)
752 {
753     IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture3(iface);
754
755     FIXME("(%p/%p)->(%x, %p): stub\n", iface, This, flags, surface);
756
757     return E_NOTIMPL;
758 }
759
760 static HRESULT WINAPI IDirect3DRMTexture3Impl_SetCacheOptions(IDirect3DRMTexture3* iface, LONG importance, DWORD flags)
761 {
762     IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture3(iface);
763
764     FIXME("(%p/%p)->(%d, %x): stub\n", iface, This, importance, flags);
765
766     return E_NOTIMPL;
767 }
768
769 static HRESULT WINAPI IDirect3DRMTexture3Impl_GetCacheOptions(IDirect3DRMTexture3* iface, LPLONG importance, LPDWORD flags)
770 {
771     IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture3(iface);
772
773     FIXME("(%p/%p)->(%p, %p): stub\n", iface, This, importance, flags);
774
775     return E_NOTIMPL;
776 }
777
778 static HRESULT WINAPI IDirect3DRMTexture3Impl_SetDownsampleCallback(IDirect3DRMTexture3* iface, D3DRMDOWNSAMPLECALLBACK callback, LPVOID arg)
779 {
780     IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture3(iface);
781
782     FIXME("(%p/%p)->(%p, %p): stub\n", iface, This, callback, arg);
783
784     return E_NOTIMPL;
785 }
786
787 static HRESULT WINAPI IDirect3DRMTexture3Impl_SetValidationCallback(IDirect3DRMTexture3* iface, D3DRMVALIDATIONCALLBACK callback, LPVOID arg)
788 {
789     IDirect3DRMTextureImpl *This = impl_from_IDirect3DRMTexture3(iface);
790
791     FIXME("(%p/%p)->(%p, %p): stub\n", iface, This, callback, arg);
792
793     return E_NOTIMPL;
794 }
795
796 static const struct IDirect3DRMTexture3Vtbl Direct3DRMTexture3_Vtbl =
797 {
798     /*** IUnknown methods ***/
799     IDirect3DRMTexture3Impl_QueryInterface,
800     IDirect3DRMTexture3Impl_AddRef,
801     IDirect3DRMTexture3Impl_Release,
802     /*** IDirect3DRMObject methods ***/
803     IDirect3DRMTexture3Impl_Clone,
804     IDirect3DRMTexture3Impl_AddDestroyCallback,
805     IDirect3DRMTexture3Impl_DeleteDestroyCallback,
806     IDirect3DRMTexture3Impl_SetAppData,
807     IDirect3DRMTexture3Impl_GetAppData,
808     IDirect3DRMTexture3Impl_SetName,
809     IDirect3DRMTexture3Impl_GetName,
810     IDirect3DRMTexture3Impl_GetClassName,
811     /*** IDirect3DRMTexture3 methods ***/
812     IDirect3DRMTexture3Impl_InitFromFile,
813     IDirect3DRMTexture3Impl_InitFromSurface,
814     IDirect3DRMTexture3Impl_InitFromResource,
815     IDirect3DRMTexture3Impl_Changed,
816     IDirect3DRMTexture3Impl_SetColors,
817     IDirect3DRMTexture3Impl_SetShades,
818     IDirect3DRMTexture3Impl_SetDecalSize,
819     IDirect3DRMTexture3Impl_SetDecalOrigin,
820     IDirect3DRMTexture3Impl_SetDecalScale,
821     IDirect3DRMTexture3Impl_SetDecalTransparency,
822     IDirect3DRMTexture3Impl_SetDecalTransparentColor,
823     IDirect3DRMTexture3Impl_GetDecalSize,
824     IDirect3DRMTexture3Impl_GetDecalOrigin,
825     IDirect3DRMTexture3Impl_GetImage,
826     IDirect3DRMTexture3Impl_GetShades,
827     IDirect3DRMTexture3Impl_GetColors,
828     IDirect3DRMTexture3Impl_GetDecalScale,
829     IDirect3DRMTexture3Impl_GetDecalTransparency,
830     IDirect3DRMTexture3Impl_GetDecalTransparentColor,
831     IDirect3DRMTexture3Impl_InitFromImage,
832     IDirect3DRMTexture3Impl_InitFromResource2,
833     IDirect3DRMTexture3Impl_GenerateMIPMap,
834     IDirect3DRMTexture3Impl_GetSurface,
835     IDirect3DRMTexture3Impl_SetCacheOptions,
836     IDirect3DRMTexture3Impl_GetCacheOptions,
837     IDirect3DRMTexture3Impl_SetDownsampleCallback,
838     IDirect3DRMTexture3Impl_SetValidationCallback
839 };
840
841 HRESULT Direct3DRMTexture_create(REFIID riid, IUnknown** ret_iface)
842 {
843     IDirect3DRMTextureImpl* object;
844
845     TRACE("(%p)\n", ret_iface);
846
847     object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DRMTextureImpl));
848     if (!object)
849     {
850         ERR("Out of memory\n");
851         return E_OUTOFMEMORY;
852     }
853
854     object->IDirect3DRMTexture2_iface.lpVtbl = &Direct3DRMTexture2_Vtbl;
855     object->IDirect3DRMTexture3_iface.lpVtbl = &Direct3DRMTexture3_Vtbl;
856     object->ref = 1;
857
858     if (IsEqualGUID(riid, &IID_IDirect3DRMTexture3))
859         *ret_iface = (IUnknown*)&object->IDirect3DRMTexture3_iface;
860     else
861         *ret_iface = (IUnknown*)&object->IDirect3DRMTexture2_iface;
862
863     return S_OK;
864 }