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