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