[D3DRM] Sync with Wine Staging 2.16. CORE-13762
[reactos.git] / reactos / dll / directx / wine / 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 "d3drm_private.h"
22
23 static inline struct d3drm_texture *impl_from_IDirect3DRMTexture(IDirect3DRMTexture *iface)
24 {
25 return CONTAINING_RECORD(iface, struct d3drm_texture, IDirect3DRMTexture_iface);
26 }
27
28 static inline struct d3drm_texture *impl_from_IDirect3DRMTexture2(IDirect3DRMTexture2 *iface)
29 {
30 return CONTAINING_RECORD(iface, struct d3drm_texture, IDirect3DRMTexture2_iface);
31 }
32
33 static inline struct d3drm_texture *impl_from_IDirect3DRMTexture3(IDirect3DRMTexture3 *iface)
34 {
35 return CONTAINING_RECORD(iface, struct d3drm_texture, IDirect3DRMTexture3_iface);
36 }
37
38 static void d3drm_texture_destroy(struct d3drm_texture *texture)
39 {
40 TRACE("texture %p is being destroyed.\n", texture);
41
42 d3drm_object_cleanup((IDirect3DRMObject*)&texture->IDirect3DRMTexture_iface, &texture->obj);
43 if (texture->image || texture->surface)
44 IDirect3DRM_Release(texture->d3drm);
45 if (texture->surface)
46 IDirectDrawSurface_Release(texture->surface);
47 HeapFree(GetProcessHeap(), 0, texture);
48 }
49
50 static BOOL d3drm_validate_image(D3DRMIMAGE *image)
51 {
52 if (!image
53 || !image->red_mask
54 || !image->green_mask
55 || !image->blue_mask
56 || !image->buffer1
57 || !(image->rgb || (image->palette && image->palette_size)))
58 {
59 return FALSE;
60 }
61
62 return TRUE;
63 }
64
65 static HRESULT WINAPI d3drm_texture1_QueryInterface(IDirect3DRMTexture *iface, REFIID riid, void **out)
66 {
67 struct d3drm_texture *texture = impl_from_IDirect3DRMTexture(iface);
68
69 TRACE("iface %p, riid %s, out %p.\n", iface, debugstr_guid(riid), out);
70
71 return IDirect3DRMTexture3_QueryInterface(&texture->IDirect3DRMTexture3_iface, riid, out);
72 }
73
74 static ULONG WINAPI d3drm_texture1_AddRef(IDirect3DRMTexture *iface)
75 {
76 struct d3drm_texture *texture = impl_from_IDirect3DRMTexture(iface);
77
78 TRACE("iface %p.\n", iface);
79
80 return IDirect3DRMTexture3_AddRef(&texture->IDirect3DRMTexture3_iface);
81 }
82
83 static ULONG WINAPI d3drm_texture1_Release(IDirect3DRMTexture *iface)
84 {
85 struct d3drm_texture *texture = impl_from_IDirect3DRMTexture(iface);
86
87 TRACE("iface %p.\n", iface);
88
89 return IDirect3DRMTexture3_Release(&texture->IDirect3DRMTexture3_iface);
90 }
91
92 static HRESULT WINAPI d3drm_texture1_Clone(IDirect3DRMTexture *iface,
93 IUnknown *outer, REFIID iid, void **out)
94 {
95 struct d3drm_texture *texture = impl_from_IDirect3DRMTexture(iface);
96
97 TRACE("iface %p, outer %p, iid %s, out %p.\n", iface, outer, debugstr_guid(iid), out);
98
99 return IDirect3DRMTexture3_Clone(&texture->IDirect3DRMTexture3_iface, outer, iid, out);
100 }
101
102 static HRESULT WINAPI d3drm_texture1_AddDestroyCallback(IDirect3DRMTexture *iface,
103 D3DRMOBJECTCALLBACK cb, void *ctx)
104 {
105 struct d3drm_texture *texture = impl_from_IDirect3DRMTexture(iface);
106
107 TRACE("iface %p, cb %p, ctx %p\n", iface, cb, ctx);
108
109 return IDirect3DRMTexture3_AddDestroyCallback(&texture->IDirect3DRMTexture3_iface, cb, ctx);
110 }
111
112 static HRESULT WINAPI d3drm_texture1_DeleteDestroyCallback(IDirect3DRMTexture *iface,
113 D3DRMOBJECTCALLBACK cb, void *ctx)
114 {
115 struct d3drm_texture *texture = impl_from_IDirect3DRMTexture(iface);
116
117 TRACE("iface %p, cb %p, ctx %p\n", iface, cb, ctx);
118
119 return IDirect3DRMTexture3_DeleteDestroyCallback(&texture->IDirect3DRMTexture3_iface, cb, ctx);
120 }
121
122 static HRESULT WINAPI d3drm_texture1_SetAppData(IDirect3DRMTexture *iface, DWORD data)
123 {
124 struct d3drm_texture *texture = impl_from_IDirect3DRMTexture(iface);
125
126 TRACE("iface %p, data %#x.\n", iface, data);
127
128 return IDirect3DRMTexture3_SetAppData(&texture->IDirect3DRMTexture3_iface, data);
129 }
130
131 static DWORD WINAPI d3drm_texture1_GetAppData(IDirect3DRMTexture *iface)
132 {
133 struct d3drm_texture *texture = impl_from_IDirect3DRMTexture(iface);
134
135 TRACE("iface %p.\n", iface);
136
137 return IDirect3DRMTexture3_GetAppData(&texture->IDirect3DRMTexture3_iface);
138 }
139
140 static HRESULT WINAPI d3drm_texture1_SetName(IDirect3DRMTexture *iface, const char *name)
141 {
142 struct d3drm_texture *texture = impl_from_IDirect3DRMTexture(iface);
143
144 TRACE("iface %p, name %s.\n", iface, debugstr_a(name));
145
146 return IDirect3DRMTexture3_SetName(&texture->IDirect3DRMTexture3_iface, name);
147 }
148
149 static HRESULT WINAPI d3drm_texture1_GetName(IDirect3DRMTexture *iface, DWORD *size, char *name)
150 {
151 struct d3drm_texture *texture = impl_from_IDirect3DRMTexture(iface);
152
153 TRACE("iface %p, size %p, name %p.\n", iface, size, name);
154
155 return IDirect3DRMTexture3_GetName(&texture->IDirect3DRMTexture3_iface, size, name);
156 }
157
158 static HRESULT WINAPI d3drm_texture1_GetClassName(IDirect3DRMTexture *iface, DWORD *size, char *name)
159 {
160 struct d3drm_texture *texture = impl_from_IDirect3DRMTexture(iface);
161
162 TRACE("iface %p, size %p, name %p.\n", iface, size, name);
163
164 return IDirect3DRMTexture3_GetClassName(&texture->IDirect3DRMTexture3_iface, size, name);
165 }
166
167 static HRESULT WINAPI d3drm_texture1_InitFromFile(IDirect3DRMTexture *iface, const char *filename)
168 {
169 FIXME("iface %p, filename %s stub!\n", iface, debugstr_a(filename));
170
171 return E_NOTIMPL;
172 }
173
174 static HRESULT WINAPI d3drm_texture1_InitFromSurface(IDirect3DRMTexture *iface,
175 IDirectDrawSurface *surface)
176 {
177 struct d3drm_texture *texture = impl_from_IDirect3DRMTexture(iface);
178
179 TRACE("iface %p, surface %p.\n", iface, surface);
180
181 return IDirect3DRMTexture3_InitFromSurface(&texture->IDirect3DRMTexture3_iface, surface);
182 }
183
184 static HRESULT WINAPI d3drm_texture1_InitFromResource(IDirect3DRMTexture *iface, HRSRC resource)
185 {
186 FIXME("iface %p, resource %p stub!\n", iface, resource);
187
188 return E_NOTIMPL;
189 }
190
191 static HRESULT WINAPI d3drm_texture1_Changed(IDirect3DRMTexture *iface, BOOL pixels, BOOL palette)
192 {
193 FIXME("iface %p, pixels %#x, palette %#x stub!\n", iface, pixels, palette);
194
195 return E_NOTIMPL;
196 }
197
198 static HRESULT WINAPI d3drm_texture1_SetColors(IDirect3DRMTexture *iface, DWORD max_colors)
199 {
200 struct d3drm_texture *texture = impl_from_IDirect3DRMTexture(iface);
201
202 TRACE("iface %p, max_colors %u.\n", iface, max_colors);
203
204 return IDirect3DRMTexture3_SetColors(&texture->IDirect3DRMTexture3_iface, max_colors);
205 }
206
207 static HRESULT WINAPI d3drm_texture1_SetShades(IDirect3DRMTexture *iface, DWORD max_shades)
208 {
209 struct d3drm_texture *texture = impl_from_IDirect3DRMTexture(iface);
210
211 TRACE("iface %p, max_shades %u.\n", iface, max_shades);
212
213 return IDirect3DRMTexture3_SetShades(&texture->IDirect3DRMTexture3_iface, max_shades);
214 }
215
216 static HRESULT WINAPI d3drm_texture1_SetDecalSize(IDirect3DRMTexture *iface, D3DVALUE width, D3DVALUE height)
217 {
218 struct d3drm_texture *texture = impl_from_IDirect3DRMTexture(iface);
219
220 TRACE("iface %p, width %.8e, height %.8e.\n", iface, width, height);
221
222 return IDirect3DRMTexture3_SetDecalSize(&texture->IDirect3DRMTexture3_iface, width, height);
223 }
224
225 static HRESULT WINAPI d3drm_texture1_SetDecalOrigin(IDirect3DRMTexture *iface, LONG x, LONG y)
226 {
227 struct d3drm_texture *texture = impl_from_IDirect3DRMTexture(iface);
228
229 TRACE("iface %p, x %d, y %d.\n", iface, x, y);
230
231 return IDirect3DRMTexture3_SetDecalOrigin(&texture->IDirect3DRMTexture3_iface, x, y);
232 }
233
234 static HRESULT WINAPI d3drm_texture1_SetDecalScale(IDirect3DRMTexture *iface, DWORD scale)
235 {
236 struct d3drm_texture *texture = impl_from_IDirect3DRMTexture(iface);
237
238 TRACE("iface %p, scale %u.\n", iface, scale);
239
240 return IDirect3DRMTexture3_SetDecalScale(&texture->IDirect3DRMTexture3_iface, scale);
241 }
242
243 static HRESULT WINAPI d3drm_texture1_SetDecalTransparency(IDirect3DRMTexture *iface, BOOL transparency)
244 {
245 struct d3drm_texture *texture = impl_from_IDirect3DRMTexture(iface);
246
247 TRACE("iface %p, transparency %#x.\n", iface, transparency);
248
249 return IDirect3DRMTexture3_SetDecalTransparency(&texture->IDirect3DRMTexture3_iface, transparency);
250 }
251
252 static HRESULT WINAPI d3drm_texture1_SetDecalTransparentColor(IDirect3DRMTexture *iface, D3DCOLOR color)
253 {
254 struct d3drm_texture *texture = impl_from_IDirect3DRMTexture(iface);
255
256 TRACE("iface %p, color 0x%08x.\n", iface, color);
257
258 return IDirect3DRMTexture3_SetDecalTransparentColor(&texture->IDirect3DRMTexture3_iface, color);
259 }
260
261 static HRESULT WINAPI d3drm_texture1_GetDecalSize(IDirect3DRMTexture *iface, D3DVALUE *width, D3DVALUE *height)
262 {
263 struct d3drm_texture *texture = impl_from_IDirect3DRMTexture(iface);
264
265 TRACE("iface %p, width %p, height %p.\n", iface, width, height);
266
267 return IDirect3DRMTexture3_GetDecalSize(&texture->IDirect3DRMTexture3_iface, width, height);
268 }
269
270 static HRESULT WINAPI d3drm_texture1_GetDecalOrigin(IDirect3DRMTexture *iface, LONG *x, LONG *y)
271 {
272 struct d3drm_texture *texture = impl_from_IDirect3DRMTexture(iface);
273
274 TRACE("iface %p, x %p, y %p.\n", iface, x, y);
275
276 return IDirect3DRMTexture3_GetDecalOrigin(&texture->IDirect3DRMTexture3_iface, x, y);
277 }
278
279 static D3DRMIMAGE * WINAPI d3drm_texture1_GetImage(IDirect3DRMTexture *iface)
280 {
281 struct d3drm_texture *texture = impl_from_IDirect3DRMTexture(iface);
282
283 TRACE("iface %p.\n", iface);
284
285 return IDirect3DRMTexture3_GetImage(&texture->IDirect3DRMTexture3_iface);
286 }
287
288 static DWORD WINAPI d3drm_texture1_GetShades(IDirect3DRMTexture *iface)
289 {
290 struct d3drm_texture *texture = impl_from_IDirect3DRMTexture(iface);
291
292 TRACE("iface %p.\n", iface);
293
294 return IDirect3DRMTexture3_GetShades(&texture->IDirect3DRMTexture3_iface);
295 }
296
297 static DWORD WINAPI d3drm_texture1_GetColors(IDirect3DRMTexture *iface)
298 {
299 struct d3drm_texture *texture = impl_from_IDirect3DRMTexture(iface);
300
301 TRACE("iface %p.\n", iface);
302
303 return IDirect3DRMTexture3_GetColors(&texture->IDirect3DRMTexture3_iface);
304 }
305
306 static DWORD WINAPI d3drm_texture1_GetDecalScale(IDirect3DRMTexture *iface)
307 {
308 struct d3drm_texture *texture = impl_from_IDirect3DRMTexture(iface);
309
310 TRACE("iface %p.\n", iface);
311
312 return IDirect3DRMTexture3_GetDecalScale(&texture->IDirect3DRMTexture3_iface);
313 }
314
315 static BOOL WINAPI d3drm_texture1_GetDecalTransparency(IDirect3DRMTexture *iface)
316 {
317 struct d3drm_texture *texture = impl_from_IDirect3DRMTexture(iface);
318
319 TRACE("iface %p.\n", iface);
320
321 return IDirect3DRMTexture3_GetDecalTransparency(&texture->IDirect3DRMTexture3_iface);
322 }
323
324 static D3DCOLOR WINAPI d3drm_texture1_GetDecalTransparentColor(IDirect3DRMTexture *iface)
325 {
326 struct d3drm_texture *texture = impl_from_IDirect3DRMTexture(iface);
327
328 TRACE("iface %p.\n", iface);
329
330 return IDirect3DRMTexture3_GetDecalTransparentColor(&texture->IDirect3DRMTexture3_iface);
331 }
332
333 static const struct IDirect3DRMTextureVtbl d3drm_texture1_vtbl =
334 {
335 d3drm_texture1_QueryInterface,
336 d3drm_texture1_AddRef,
337 d3drm_texture1_Release,
338 d3drm_texture1_Clone,
339 d3drm_texture1_AddDestroyCallback,
340 d3drm_texture1_DeleteDestroyCallback,
341 d3drm_texture1_SetAppData,
342 d3drm_texture1_GetAppData,
343 d3drm_texture1_SetName,
344 d3drm_texture1_GetName,
345 d3drm_texture1_GetClassName,
346 d3drm_texture1_InitFromFile,
347 d3drm_texture1_InitFromSurface,
348 d3drm_texture1_InitFromResource,
349 d3drm_texture1_Changed,
350 d3drm_texture1_SetColors,
351 d3drm_texture1_SetShades,
352 d3drm_texture1_SetDecalSize,
353 d3drm_texture1_SetDecalOrigin,
354 d3drm_texture1_SetDecalScale,
355 d3drm_texture1_SetDecalTransparency,
356 d3drm_texture1_SetDecalTransparentColor,
357 d3drm_texture1_GetDecalSize,
358 d3drm_texture1_GetDecalOrigin,
359 d3drm_texture1_GetImage,
360 d3drm_texture1_GetShades,
361 d3drm_texture1_GetColors,
362 d3drm_texture1_GetDecalScale,
363 d3drm_texture1_GetDecalTransparency,
364 d3drm_texture1_GetDecalTransparentColor,
365 };
366
367 static HRESULT WINAPI d3drm_texture2_QueryInterface(IDirect3DRMTexture2 *iface, REFIID riid, void **out)
368 {
369 struct d3drm_texture *texture = impl_from_IDirect3DRMTexture2(iface);
370
371 TRACE("iface %p, riid %s, out %p.\n", iface, debugstr_guid(riid), out);
372
373 return IDirect3DRMTexture3_QueryInterface(&texture->IDirect3DRMTexture3_iface, riid, out);
374 }
375
376 static ULONG WINAPI d3drm_texture2_AddRef(IDirect3DRMTexture2 *iface)
377 {
378 struct d3drm_texture *texture = impl_from_IDirect3DRMTexture2(iface);
379
380 TRACE("iface %p.\n", iface);
381
382 return IDirect3DRMTexture3_AddRef(&texture->IDirect3DRMTexture3_iface);
383 }
384
385 static ULONG WINAPI d3drm_texture2_Release(IDirect3DRMTexture2 *iface)
386 {
387 struct d3drm_texture *texture = impl_from_IDirect3DRMTexture2(iface);
388
389 TRACE("iface %p.\n", iface);
390
391 return IDirect3DRMTexture3_Release(&texture->IDirect3DRMTexture3_iface);
392 }
393
394 static HRESULT WINAPI d3drm_texture2_Clone(IDirect3DRMTexture2 *iface,
395 IUnknown *outer, REFIID iid, void **out)
396 {
397 struct d3drm_texture *texture = impl_from_IDirect3DRMTexture2(iface);
398
399 TRACE("iface %p, outer %p, iid %s, out %p.\n", iface, outer, debugstr_guid(iid), out);
400
401 return IDirect3DRMTexture3_Clone(&texture->IDirect3DRMTexture3_iface, outer, iid, out);
402 }
403
404 static HRESULT WINAPI d3drm_texture2_AddDestroyCallback(IDirect3DRMTexture2 *iface,
405 D3DRMOBJECTCALLBACK cb, void *ctx)
406 {
407 struct d3drm_texture *texture = impl_from_IDirect3DRMTexture2(iface);
408
409 TRACE("iface %p, cb %p, ctx %p\n", iface, cb, ctx);
410
411 return IDirect3DRMTexture3_AddDestroyCallback(&texture->IDirect3DRMTexture3_iface, cb, ctx);
412 }
413
414 static HRESULT WINAPI d3drm_texture2_DeleteDestroyCallback(IDirect3DRMTexture2 *iface,
415 D3DRMOBJECTCALLBACK cb, void *ctx)
416 {
417 struct d3drm_texture *texture = impl_from_IDirect3DRMTexture2(iface);
418
419 TRACE("iface %p, cb %p, ctx %p\n", iface, cb, ctx);
420
421 return IDirect3DRMTexture3_DeleteDestroyCallback(&texture->IDirect3DRMTexture3_iface, cb, ctx);
422 }
423
424 static HRESULT WINAPI d3drm_texture2_SetAppData(IDirect3DRMTexture2 *iface, DWORD data)
425 {
426 struct d3drm_texture *texture = impl_from_IDirect3DRMTexture2(iface);
427
428 TRACE("iface %p, data %#x.\n", iface, data);
429
430 return IDirect3DRMTexture3_SetAppData(&texture->IDirect3DRMTexture3_iface, data);
431 }
432
433 static DWORD WINAPI d3drm_texture2_GetAppData(IDirect3DRMTexture2 *iface)
434 {
435 struct d3drm_texture *texture = impl_from_IDirect3DRMTexture2(iface);
436
437 TRACE("iface %p.\n", iface);
438
439 return IDirect3DRMTexture3_GetAppData(&texture->IDirect3DRMTexture3_iface);
440 }
441
442 static HRESULT WINAPI d3drm_texture2_SetName(IDirect3DRMTexture2 *iface, const char *name)
443 {
444 struct d3drm_texture *texture = impl_from_IDirect3DRMTexture2(iface);
445
446 TRACE("iface %p, name %s.\n", iface, debugstr_a(name));
447
448 return IDirect3DRMTexture3_SetName(&texture->IDirect3DRMTexture3_iface, name);
449 }
450
451 static HRESULT WINAPI d3drm_texture2_GetName(IDirect3DRMTexture2 *iface, DWORD *size, char *name)
452 {
453 struct d3drm_texture *texture = impl_from_IDirect3DRMTexture2(iface);
454
455 TRACE("iface %p, size %p, name %p.\n", iface, size, name);
456
457 return IDirect3DRMTexture3_GetName(&texture->IDirect3DRMTexture3_iface, size, name);
458 }
459
460 static HRESULT WINAPI d3drm_texture2_GetClassName(IDirect3DRMTexture2 *iface, DWORD *size, char *name)
461 {
462 struct d3drm_texture *texture = impl_from_IDirect3DRMTexture2(iface);
463
464 TRACE("iface %p, size %p, name %p.\n", iface, size, name);
465
466 return IDirect3DRMTexture3_GetClassName(&texture->IDirect3DRMTexture3_iface, size, name);
467 }
468
469 static HRESULT WINAPI d3drm_texture2_InitFromFile(IDirect3DRMTexture2 *iface, const char *filename)
470 {
471 FIXME("iface %p, filename %s stub!\n", iface, debugstr_a(filename));
472
473 return E_NOTIMPL;
474 }
475
476 static HRESULT WINAPI d3drm_texture2_InitFromSurface(IDirect3DRMTexture2 *iface,
477 IDirectDrawSurface *surface)
478 {
479 struct d3drm_texture *texture = impl_from_IDirect3DRMTexture2(iface);
480
481 TRACE("iface %p, surface %p.\n", iface, surface);
482
483 return IDirect3DRMTexture3_InitFromSurface(&texture->IDirect3DRMTexture3_iface, surface);
484 }
485
486 static HRESULT WINAPI d3drm_texture2_InitFromResource(IDirect3DRMTexture2 *iface, HRSRC resource)
487 {
488 FIXME("iface %p, resource %p stub!\n", iface, resource);
489
490 return E_NOTIMPL;
491 }
492
493 static HRESULT WINAPI d3drm_texture2_Changed(IDirect3DRMTexture2 *iface, BOOL pixels, BOOL palette)
494 {
495 FIXME("iface %p, pixels %#x, palette %#x stub!\n", iface, pixels, palette);
496
497 return E_NOTIMPL;
498 }
499
500 static HRESULT WINAPI d3drm_texture2_SetColors(IDirect3DRMTexture2 *iface, DWORD max_colors)
501 {
502 struct d3drm_texture *texture = impl_from_IDirect3DRMTexture2(iface);
503
504 TRACE("iface %p, max_colors %u.\n", iface, max_colors);
505
506 return IDirect3DRMTexture3_SetColors(&texture->IDirect3DRMTexture3_iface, max_colors);
507 }
508
509 static HRESULT WINAPI d3drm_texture2_SetShades(IDirect3DRMTexture2 *iface, DWORD max_shades)
510 {
511 struct d3drm_texture *texture = impl_from_IDirect3DRMTexture2(iface);
512
513 TRACE("iface %p, max_shades %u.\n", iface, max_shades);
514
515 return IDirect3DRMTexture3_SetShades(&texture->IDirect3DRMTexture3_iface, max_shades);
516 }
517
518 static HRESULT WINAPI d3drm_texture2_SetDecalSize(IDirect3DRMTexture2 *iface, D3DVALUE width, D3DVALUE height)
519 {
520 struct d3drm_texture *texture = impl_from_IDirect3DRMTexture2(iface);
521
522 TRACE("iface %p, width %.8e, height %.8e.\n", iface, width, height);
523
524 return IDirect3DRMTexture3_SetDecalSize(&texture->IDirect3DRMTexture3_iface, width, height);
525 }
526
527 static HRESULT WINAPI d3drm_texture2_SetDecalOrigin(IDirect3DRMTexture2 *iface, LONG x, LONG y)
528 {
529 struct d3drm_texture *texture = impl_from_IDirect3DRMTexture2(iface);
530
531 TRACE("iface %p, x %d, y %d.\n", iface, x, y);
532
533 return IDirect3DRMTexture3_SetDecalOrigin(&texture->IDirect3DRMTexture3_iface, x, y);
534 }
535
536 static HRESULT WINAPI d3drm_texture2_SetDecalScale(IDirect3DRMTexture2 *iface, DWORD scale)
537 {
538 struct d3drm_texture *texture = impl_from_IDirect3DRMTexture2(iface);
539
540 TRACE("iface %p, scale %u.\n", iface, scale);
541
542 return IDirect3DRMTexture3_SetDecalScale(&texture->IDirect3DRMTexture3_iface, scale);
543 }
544
545 static HRESULT WINAPI d3drm_texture2_SetDecalTransparency(IDirect3DRMTexture2 *iface, BOOL transparency)
546 {
547 struct d3drm_texture *texture = impl_from_IDirect3DRMTexture2(iface);
548
549 TRACE("iface %p, transparency %#x.\n", iface, transparency);
550
551 return IDirect3DRMTexture3_SetDecalTransparency(&texture->IDirect3DRMTexture3_iface, transparency);
552 }
553
554 static HRESULT WINAPI d3drm_texture2_SetDecalTransparentColor(IDirect3DRMTexture2 *iface, D3DCOLOR color)
555 {
556 struct d3drm_texture *texture = impl_from_IDirect3DRMTexture2(iface);
557
558 TRACE("iface %p, color 0x%08x.\n", iface, color);
559
560 return IDirect3DRMTexture3_SetDecalTransparentColor(&texture->IDirect3DRMTexture3_iface, color);
561 }
562
563 static HRESULT WINAPI d3drm_texture2_GetDecalSize(IDirect3DRMTexture2 *iface, D3DVALUE *width, D3DVALUE *height)
564 {
565 struct d3drm_texture *texture = impl_from_IDirect3DRMTexture2(iface);
566
567 TRACE("iface %p, width %p, height %p.\n", iface, width, height);
568
569 return IDirect3DRMTexture3_GetDecalSize(&texture->IDirect3DRMTexture3_iface, width, height);
570 }
571
572 static HRESULT WINAPI d3drm_texture2_GetDecalOrigin(IDirect3DRMTexture2 *iface, LONG *x, LONG *y)
573 {
574 struct d3drm_texture *texture = impl_from_IDirect3DRMTexture2(iface);
575
576 TRACE("iface %p, x %p, y %p.\n", iface, x, y);
577
578 return IDirect3DRMTexture3_GetDecalOrigin(&texture->IDirect3DRMTexture3_iface, x, y);
579 }
580
581 static D3DRMIMAGE * WINAPI d3drm_texture2_GetImage(IDirect3DRMTexture2 *iface)
582 {
583 struct d3drm_texture *texture = impl_from_IDirect3DRMTexture2(iface);
584
585 TRACE("iface %p.\n", iface);
586
587 return IDirect3DRMTexture3_GetImage(&texture->IDirect3DRMTexture3_iface);
588 }
589
590 static DWORD WINAPI d3drm_texture2_GetShades(IDirect3DRMTexture2 *iface)
591 {
592 struct d3drm_texture *texture = impl_from_IDirect3DRMTexture2(iface);
593
594 TRACE("iface %p.\n", iface);
595
596 return IDirect3DRMTexture3_GetShades(&texture->IDirect3DRMTexture3_iface);
597 }
598
599 static DWORD WINAPI d3drm_texture2_GetColors(IDirect3DRMTexture2 *iface)
600 {
601 struct d3drm_texture *texture = impl_from_IDirect3DRMTexture2(iface);
602
603 TRACE("iface %p.\n", iface);
604
605 return IDirect3DRMTexture3_GetColors(&texture->IDirect3DRMTexture3_iface);
606 }
607
608 static DWORD WINAPI d3drm_texture2_GetDecalScale(IDirect3DRMTexture2 *iface)
609 {
610 struct d3drm_texture *texture = impl_from_IDirect3DRMTexture2(iface);
611
612 TRACE("iface %p.\n", iface);
613
614 return IDirect3DRMTexture3_GetDecalScale(&texture->IDirect3DRMTexture3_iface);
615 }
616
617 static BOOL WINAPI d3drm_texture2_GetDecalTransparency(IDirect3DRMTexture2 *iface)
618 {
619 struct d3drm_texture *texture = impl_from_IDirect3DRMTexture2(iface);
620
621 TRACE("iface %p.\n", iface);
622
623 return IDirect3DRMTexture3_GetDecalTransparency(&texture->IDirect3DRMTexture3_iface);
624 }
625
626 static D3DCOLOR WINAPI d3drm_texture2_GetDecalTransparentColor(IDirect3DRMTexture2 *iface)
627 {
628 struct d3drm_texture *texture = impl_from_IDirect3DRMTexture2(iface);
629
630 TRACE("iface %p.\n", iface);
631
632 return IDirect3DRMTexture3_GetDecalTransparentColor(&texture->IDirect3DRMTexture3_iface);
633 }
634
635 static HRESULT WINAPI d3drm_texture2_InitFromImage(IDirect3DRMTexture2 *iface, D3DRMIMAGE *image)
636 {
637 struct d3drm_texture *texture = impl_from_IDirect3DRMTexture2(iface);
638
639 TRACE("iface %p, image %p.\n", iface, image);
640
641 return IDirect3DRMTexture3_InitFromImage(&texture->IDirect3DRMTexture3_iface, image);
642 }
643
644 static HRESULT WINAPI d3drm_texture2_InitFromResource2(IDirect3DRMTexture2 *iface,
645 HMODULE module, const char *name, const char *type)
646 {
647 FIXME("iface %p, module %p, name %s, type %s stub!\n",
648 iface, module, debugstr_a(name), debugstr_a(type));
649
650 return E_NOTIMPL;
651 }
652
653 static HRESULT WINAPI d3drm_texture2_GenerateMIPMap(IDirect3DRMTexture2 *iface, DWORD flags)
654 {
655 struct d3drm_texture *texture = impl_from_IDirect3DRMTexture2(iface);
656
657 TRACE("iface %p, flags %#x.\n", iface, flags);
658
659 return IDirect3DRMTexture3_GenerateMIPMap(&texture->IDirect3DRMTexture3_iface, flags);
660 }
661
662 static const struct IDirect3DRMTexture2Vtbl d3drm_texture2_vtbl =
663 {
664 d3drm_texture2_QueryInterface,
665 d3drm_texture2_AddRef,
666 d3drm_texture2_Release,
667 d3drm_texture2_Clone,
668 d3drm_texture2_AddDestroyCallback,
669 d3drm_texture2_DeleteDestroyCallback,
670 d3drm_texture2_SetAppData,
671 d3drm_texture2_GetAppData,
672 d3drm_texture2_SetName,
673 d3drm_texture2_GetName,
674 d3drm_texture2_GetClassName,
675 d3drm_texture2_InitFromFile,
676 d3drm_texture2_InitFromSurface,
677 d3drm_texture2_InitFromResource,
678 d3drm_texture2_Changed,
679 d3drm_texture2_SetColors,
680 d3drm_texture2_SetShades,
681 d3drm_texture2_SetDecalSize,
682 d3drm_texture2_SetDecalOrigin,
683 d3drm_texture2_SetDecalScale,
684 d3drm_texture2_SetDecalTransparency,
685 d3drm_texture2_SetDecalTransparentColor,
686 d3drm_texture2_GetDecalSize,
687 d3drm_texture2_GetDecalOrigin,
688 d3drm_texture2_GetImage,
689 d3drm_texture2_GetShades,
690 d3drm_texture2_GetColors,
691 d3drm_texture2_GetDecalScale,
692 d3drm_texture2_GetDecalTransparency,
693 d3drm_texture2_GetDecalTransparentColor,
694 d3drm_texture2_InitFromImage,
695 d3drm_texture2_InitFromResource2,
696 d3drm_texture2_GenerateMIPMap,
697 };
698
699 static HRESULT WINAPI d3drm_texture3_QueryInterface(IDirect3DRMTexture3 *iface, REFIID riid, void **out)
700 {
701 struct d3drm_texture *texture = impl_from_IDirect3DRMTexture3(iface);
702
703 TRACE("iface %p, riid %s, out %p.\n", iface, debugstr_guid(riid), out);
704
705 if (IsEqualGUID(riid, &IID_IDirect3DRMTexture)
706 || IsEqualGUID(riid, &IID_IDirect3DRMVisual)
707 || IsEqualGUID(riid, &IID_IDirect3DRMObject)
708 || IsEqualGUID(riid, &IID_IUnknown))
709 {
710 *out = &texture->IDirect3DRMTexture_iface;
711 }
712 else if (IsEqualGUID(riid, &IID_IDirect3DRMTexture2))
713 {
714 *out = &texture->IDirect3DRMTexture2_iface;
715 }
716 else if (IsEqualGUID(riid, &IID_IDirect3DRMTexture3))
717 {
718 *out = &texture->IDirect3DRMTexture3_iface;
719 }
720 else
721 {
722 *out = NULL;
723 WARN("%s not implemented, returning CLASS_E_CLASSNOTAVAILABLE.\n", debugstr_guid(riid));
724 return CLASS_E_CLASSNOTAVAILABLE;
725 }
726
727 IUnknown_AddRef((IUnknown *)*out);
728 return S_OK;
729 }
730
731 static ULONG WINAPI d3drm_texture3_AddRef(IDirect3DRMTexture3 *iface)
732 {
733 struct d3drm_texture *texture = impl_from_IDirect3DRMTexture3(iface);
734 ULONG refcount = InterlockedIncrement(&texture->obj.ref);
735
736 TRACE("%p increasing refcount to %u.\n", iface, refcount);
737
738 return refcount;
739 }
740
741 static ULONG WINAPI d3drm_texture3_Release(IDirect3DRMTexture3 *iface)
742 {
743 struct d3drm_texture *texture = impl_from_IDirect3DRMTexture3(iface);
744 ULONG refcount = InterlockedDecrement(&texture->obj.ref);
745
746 TRACE("%p decreasing refcount to %u.\n", iface, refcount);
747
748 if (!refcount)
749 d3drm_texture_destroy(texture);
750
751 return refcount;
752 }
753
754 static HRESULT WINAPI d3drm_texture3_Clone(IDirect3DRMTexture3 *iface,
755 IUnknown *outer, REFIID iid, void **out)
756 {
757 FIXME("iface %p, outer %p, iid %s, out %p stub!\n", iface, outer, debugstr_guid(iid), out);
758
759 return E_NOTIMPL;
760 }
761
762 static HRESULT WINAPI d3drm_texture3_AddDestroyCallback(IDirect3DRMTexture3 *iface,
763 D3DRMOBJECTCALLBACK cb, void *ctx)
764 {
765 struct d3drm_texture *texture = impl_from_IDirect3DRMTexture3(iface);
766
767 TRACE("iface %p, cb %p, ctx %p\n", iface, cb, ctx);
768
769 return d3drm_object_add_destroy_callback(&texture->obj, cb, ctx);
770 }
771
772 static HRESULT WINAPI d3drm_texture3_DeleteDestroyCallback(IDirect3DRMTexture3 *iface,
773 D3DRMOBJECTCALLBACK cb, void *ctx)
774 {
775 struct d3drm_texture *texture = impl_from_IDirect3DRMTexture3(iface);
776
777 TRACE("iface %p, cb %p, ctx %p\n", iface, cb, ctx);
778
779 return d3drm_object_delete_destroy_callback(&texture->obj, cb, ctx);
780 }
781
782 static HRESULT WINAPI d3drm_texture3_SetAppData(IDirect3DRMTexture3 *iface, DWORD data)
783 {
784 struct d3drm_texture *texture = impl_from_IDirect3DRMTexture3(iface);
785
786 TRACE("iface %p, data %#x.\n", iface, data);
787
788 texture->obj.appdata = data;
789
790 return D3DRM_OK;
791 }
792
793 static DWORD WINAPI d3drm_texture3_GetAppData(IDirect3DRMTexture3 *iface)
794 {
795 struct d3drm_texture *texture = impl_from_IDirect3DRMTexture3(iface);
796
797 TRACE("iface %p.\n", iface);
798
799 return texture->obj.appdata;
800 }
801
802 static HRESULT WINAPI d3drm_texture3_SetName(IDirect3DRMTexture3 *iface, const char *name)
803 {
804 struct d3drm_texture *texture = impl_from_IDirect3DRMTexture3(iface);
805
806 TRACE("iface %p, name %s.\n", iface, debugstr_a(name));
807
808 return d3drm_object_set_name(&texture->obj, name);
809 }
810
811 static HRESULT WINAPI d3drm_texture3_GetName(IDirect3DRMTexture3 *iface, DWORD *size, char *name)
812 {
813 struct d3drm_texture *texture = impl_from_IDirect3DRMTexture3(iface);
814
815 TRACE("iface %p, size %p, name %p.\n", iface, size, name);
816
817 return d3drm_object_get_name(&texture->obj, size, name);
818 }
819
820 static HRESULT WINAPI d3drm_texture3_GetClassName(IDirect3DRMTexture3 *iface, DWORD *size, char *name)
821 {
822 struct d3drm_texture *texture = impl_from_IDirect3DRMTexture3(iface);
823
824 TRACE("iface %p, size %p, name %p.\n", iface, size, name);
825
826 return d3drm_object_get_class_name(&texture->obj, size, name);
827 }
828
829 static HRESULT WINAPI d3drm_texture3_InitFromFile(IDirect3DRMTexture3 *iface, const char *filename)
830 {
831 FIXME("iface %p, filename %s stub!\n", iface, debugstr_a(filename));
832
833 return E_NOTIMPL;
834 }
835
836 static HRESULT WINAPI d3drm_texture3_InitFromSurface(IDirect3DRMTexture3 *iface,
837 IDirectDrawSurface *surface)
838 {
839 struct d3drm_texture *texture = impl_from_IDirect3DRMTexture3(iface);
840
841 TRACE("iface %p, surface %p.\n", iface, surface);
842
843 if (!surface)
844 return D3DRMERR_BADOBJECT;
845
846 /* d3drm intentionally leaks a reference to IDirect3DRM here if texture has already been initialized. */
847 IDirect3DRM_AddRef(texture->d3drm);
848
849 if (texture->image || texture->surface)
850 return D3DRMERR_BADOBJECT;
851
852 texture->surface = surface;
853 IDirectDrawSurface_AddRef(texture->surface);
854 return D3DRM_OK;
855 }
856
857 static HRESULT WINAPI d3drm_texture3_InitFromResource(IDirect3DRMTexture3 *iface, HRSRC resource)
858 {
859 FIXME("iface %p, resource %p stub!\n", iface, resource);
860
861 return E_NOTIMPL;
862 }
863
864 static HRESULT WINAPI d3drm_texture3_Changed(IDirect3DRMTexture3 *iface,
865 DWORD flags, DWORD rect_count, RECT *rects)
866 {
867 FIXME("iface %p, flags %#x, rect_count %u, rects %p stub!\n", iface, flags, rect_count, rects);
868
869 return E_NOTIMPL;
870 }
871
872 static HRESULT WINAPI d3drm_texture3_SetColors(IDirect3DRMTexture3 *iface, DWORD max_colors)
873 {
874 FIXME("iface %p, max_colors %u stub!\n", iface, max_colors);
875
876 return E_NOTIMPL;
877 }
878
879 static HRESULT WINAPI d3drm_texture3_SetShades(IDirect3DRMTexture3 *iface, DWORD max_shades)
880 {
881 FIXME("iface %p, max_shades %u stub!\n", iface, max_shades);
882
883 return E_NOTIMPL;
884 }
885
886 static HRESULT WINAPI d3drm_texture3_SetDecalSize(IDirect3DRMTexture3 *iface, D3DVALUE width, D3DVALUE height)
887 {
888 FIXME("iface %p, width %.8e, height %.8e stub!\n", iface, width, height);
889
890 return E_NOTIMPL;
891 }
892
893 static HRESULT WINAPI d3drm_texture3_SetDecalOrigin(IDirect3DRMTexture3 *iface, LONG x, LONG y)
894 {
895 FIXME("iface %p, x %d, y %d stub!\n", iface, x, y);
896
897 return E_NOTIMPL;
898 }
899
900 static HRESULT WINAPI d3drm_texture3_SetDecalScale(IDirect3DRMTexture3 *iface, DWORD scale)
901 {
902 FIXME("iface %p, scale %u stub!\n", iface, scale);
903
904 return E_NOTIMPL;
905 }
906
907 static HRESULT WINAPI d3drm_texture3_SetDecalTransparency(IDirect3DRMTexture3 *iface, BOOL transparency)
908 {
909 FIXME("iface %p, transparency %#x stub!\n", iface, transparency);
910
911 return E_NOTIMPL;
912 }
913
914 static HRESULT WINAPI d3drm_texture3_SetDecalTransparentColor(IDirect3DRMTexture3 *iface, D3DCOLOR color)
915 {
916 FIXME("iface %p, color 0x%08x stub!\n", iface, color);
917
918 return E_NOTIMPL;
919 }
920
921 static HRESULT WINAPI d3drm_texture3_GetDecalSize(IDirect3DRMTexture3 *iface, D3DVALUE *width, D3DVALUE *height)
922 {
923 FIXME("iface %p, width %p, height %p stub!\n", iface, width, height);
924
925 return E_NOTIMPL;
926 }
927
928 static HRESULT WINAPI d3drm_texture3_GetDecalOrigin(IDirect3DRMTexture3 *iface, LONG *x, LONG *y)
929 {
930 FIXME("iface %p, x %p, y %p stub!\n", iface, x, y);
931
932 return E_NOTIMPL;
933 }
934
935 static D3DRMIMAGE * WINAPI d3drm_texture3_GetImage(IDirect3DRMTexture3 *iface)
936 {
937 struct d3drm_texture *texture = impl_from_IDirect3DRMTexture3(iface);
938
939 TRACE("iface %p.\n", iface);
940
941 return texture->image;
942 }
943
944 static DWORD WINAPI d3drm_texture3_GetShades(IDirect3DRMTexture3 *iface)
945 {
946 FIXME("iface %p stub!\n", iface);
947
948 return 0;
949 }
950
951 static DWORD WINAPI d3drm_texture3_GetColors(IDirect3DRMTexture3 *iface)
952 {
953 FIXME("iface %p stub!\n", iface);
954
955 return 0;
956 }
957
958 static DWORD WINAPI d3drm_texture3_GetDecalScale(IDirect3DRMTexture3 *iface)
959 {
960 FIXME("iface %p stub!\n", iface);
961
962 return 0;
963 }
964
965 static BOOL WINAPI d3drm_texture3_GetDecalTransparency(IDirect3DRMTexture3 *iface)
966 {
967 FIXME("iface %p stub!\n", iface);
968
969 return FALSE;
970 }
971
972 static D3DCOLOR WINAPI d3drm_texture3_GetDecalTransparentColor(IDirect3DRMTexture3 *iface)
973 {
974 FIXME("iface %p stub!\n", iface);
975
976 return 0;
977 }
978
979 static HRESULT WINAPI d3drm_texture3_InitFromImage(IDirect3DRMTexture3 *iface, D3DRMIMAGE *image)
980 {
981 struct d3drm_texture *texture = impl_from_IDirect3DRMTexture3(iface);
982
983 TRACE("iface %p, image %p.\n", iface, image);
984
985 if (!d3drm_validate_image(image))
986 return D3DRMERR_BADOBJECT;
987
988 /* d3drm intentionally leaks a reference to IDirect3DRM here if texture has already been initialized. */
989 IDirect3DRM_AddRef(texture->d3drm);
990
991 if (texture->image || texture->surface)
992 return D3DRMERR_BADOBJECT;
993
994 texture->image = image;
995
996 return D3DRM_OK;
997 }
998
999 static HRESULT WINAPI d3drm_texture3_InitFromResource2(IDirect3DRMTexture3 *iface,
1000 HMODULE module, const char *name, const char *type)
1001 {
1002 FIXME("iface %p, module %p, name %s, type %s stub!\n",
1003 iface, module, debugstr_a(name), debugstr_a(type));
1004
1005 return E_NOTIMPL;
1006 }
1007
1008 static HRESULT WINAPI d3drm_texture3_GenerateMIPMap(IDirect3DRMTexture3 *iface, DWORD flags)
1009 {
1010 FIXME("iface %p, flags %#x stub!\n", iface, flags);
1011
1012 return E_NOTIMPL;
1013 }
1014
1015 static HRESULT WINAPI d3drm_texture3_GetSurface(IDirect3DRMTexture3 *iface,
1016 DWORD flags, IDirectDrawSurface **surface)
1017 {
1018 struct d3drm_texture *texture = impl_from_IDirect3DRMTexture3(iface);
1019
1020 TRACE("iface %p, flags %#x, surface %p.\n", iface, flags, surface);
1021
1022 if (flags)
1023 FIXME("unexpected flags %#x.\n", flags);
1024
1025 if (!surface)
1026 return D3DRMERR_BADVALUE;
1027
1028 if (texture->image)
1029 return D3DRMERR_NOTCREATEDFROMDDS;
1030
1031 *surface = texture->surface;
1032 IDirectDrawSurface_AddRef(*surface);
1033
1034 return D3DRM_OK;
1035 }
1036
1037 static HRESULT WINAPI d3drm_texture3_SetCacheOptions(IDirect3DRMTexture3 *iface, LONG importance, DWORD flags)
1038 {
1039 FIXME("iface %p, importance %d, flags %#x stub!\n", iface, importance, flags);
1040
1041 return E_NOTIMPL;
1042 }
1043
1044 static HRESULT WINAPI d3drm_texture3_GetCacheOptions(IDirect3DRMTexture3 *iface,
1045 LONG *importance, DWORD *flags)
1046 {
1047 FIXME("iface %p, importance %p, flags %p stub!\n", iface, importance, flags);
1048
1049 return E_NOTIMPL;
1050 }
1051
1052 static HRESULT WINAPI d3drm_texture3_SetDownsampleCallback(IDirect3DRMTexture3 *iface,
1053 D3DRMDOWNSAMPLECALLBACK cb, void *ctx)
1054 {
1055 FIXME("iface %p, cb %p, ctx %p stub!\n", iface, cb, ctx);
1056
1057 return E_NOTIMPL;
1058 }
1059
1060 static HRESULT WINAPI d3drm_texture3_SetValidationCallback(IDirect3DRMTexture3 *iface,
1061 D3DRMVALIDATIONCALLBACK cb, void *ctx)
1062 {
1063 FIXME("iface %p, cb %p, ctx %p stub!\n", iface, cb, ctx);
1064
1065 return E_NOTIMPL;
1066 }
1067
1068 static const struct IDirect3DRMTexture3Vtbl d3drm_texture3_vtbl =
1069 {
1070 d3drm_texture3_QueryInterface,
1071 d3drm_texture3_AddRef,
1072 d3drm_texture3_Release,
1073 d3drm_texture3_Clone,
1074 d3drm_texture3_AddDestroyCallback,
1075 d3drm_texture3_DeleteDestroyCallback,
1076 d3drm_texture3_SetAppData,
1077 d3drm_texture3_GetAppData,
1078 d3drm_texture3_SetName,
1079 d3drm_texture3_GetName,
1080 d3drm_texture3_GetClassName,
1081 d3drm_texture3_InitFromFile,
1082 d3drm_texture3_InitFromSurface,
1083 d3drm_texture3_InitFromResource,
1084 d3drm_texture3_Changed,
1085 d3drm_texture3_SetColors,
1086 d3drm_texture3_SetShades,
1087 d3drm_texture3_SetDecalSize,
1088 d3drm_texture3_SetDecalOrigin,
1089 d3drm_texture3_SetDecalScale,
1090 d3drm_texture3_SetDecalTransparency,
1091 d3drm_texture3_SetDecalTransparentColor,
1092 d3drm_texture3_GetDecalSize,
1093 d3drm_texture3_GetDecalOrigin,
1094 d3drm_texture3_GetImage,
1095 d3drm_texture3_GetShades,
1096 d3drm_texture3_GetColors,
1097 d3drm_texture3_GetDecalScale,
1098 d3drm_texture3_GetDecalTransparency,
1099 d3drm_texture3_GetDecalTransparentColor,
1100 d3drm_texture3_InitFromImage,
1101 d3drm_texture3_InitFromResource2,
1102 d3drm_texture3_GenerateMIPMap,
1103 d3drm_texture3_GetSurface,
1104 d3drm_texture3_SetCacheOptions,
1105 d3drm_texture3_GetCacheOptions,
1106 d3drm_texture3_SetDownsampleCallback,
1107 d3drm_texture3_SetValidationCallback,
1108 };
1109
1110 HRESULT d3drm_texture_create(struct d3drm_texture **texture, IDirect3DRM *d3drm)
1111 {
1112 static const char classname[] = "Texture";
1113 struct d3drm_texture *object;
1114
1115 TRACE("texture %p.\n", texture);
1116
1117 if (!(object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object))))
1118 return E_OUTOFMEMORY;
1119
1120 object->IDirect3DRMTexture_iface.lpVtbl = &d3drm_texture1_vtbl;
1121 object->IDirect3DRMTexture2_iface.lpVtbl = &d3drm_texture2_vtbl;
1122 object->IDirect3DRMTexture3_iface.lpVtbl = &d3drm_texture3_vtbl;
1123 object->d3drm = d3drm;
1124
1125 d3drm_object_init(&object->obj, classname);
1126
1127 *texture = object;
1128
1129 return D3DRM_OK;
1130 }