strmbase: do not lock in BaseOutputPinImpl_GetDeliveryBuffer the MemInputPin will...
[wine] / dlls / d3drm / light.c
1 /*
2  * Implementation of IDirect3DRMLight Interface
3  *
4  * Copyright 2012 AndrĂ© Hentschel
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     IDirect3DRMLight IDirect3DRMLight_iface;
34     LONG ref;
35 } IDirect3DRMLightImpl;
36
37 static inline IDirect3DRMLightImpl *impl_from_IDirect3DRMLight(IDirect3DRMLight *iface)
38 {
39     return CONTAINING_RECORD(iface, IDirect3DRMLightImpl, IDirect3DRMLight_iface);
40 }
41
42 /*** IUnknown methods ***/
43 static HRESULT WINAPI IDirect3DRMLightImpl_QueryInterface(IDirect3DRMLight* iface,
44                                                            REFIID riid, void** object)
45 {
46     IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface);
47
48     TRACE("(%p/%p)->(%s, %p)\n", iface, This, debugstr_guid(riid), object);
49
50     *object = NULL;
51
52     if(IsEqualGUID(riid, &IID_IUnknown) ||
53        IsEqualGUID(riid, &IID_IDirect3DRMLight))
54     {
55         *object = &This->IDirect3DRMLight_iface;
56     }
57     else
58     {
59         FIXME("interface %s not implemented\n", debugstr_guid(riid));
60         return E_NOINTERFACE;
61     }
62
63     IDirect3DRMLight_AddRef(iface);
64     return S_OK;
65 }
66
67 static ULONG WINAPI IDirect3DRMLightImpl_AddRef(IDirect3DRMLight* iface)
68 {
69     IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface);
70
71     TRACE("(%p)\n", This);
72
73     return InterlockedIncrement(&This->ref);
74 }
75
76 static ULONG WINAPI IDirect3DRMLightImpl_Release(IDirect3DRMLight* iface)
77 {
78     IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface);
79     ULONG ref = InterlockedDecrement(&This->ref);
80
81     TRACE("(%p)\n", This);
82
83     if (!ref)
84         HeapFree(GetProcessHeap(), 0, This);
85
86     return ref;
87 }
88
89 /*** IDirect3DRMObject methods ***/
90 static HRESULT WINAPI IDirect3DRMLightImpl_Clone(IDirect3DRMLight* iface,
91                                                   LPUNKNOWN unkwn, REFIID riid,
92                                                   LPVOID* object)
93 {
94     IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface);
95
96     FIXME("(%p/%p)->(%p, %s, %p): stub\n", iface, This, unkwn, debugstr_guid(riid), object);
97
98     return E_NOTIMPL;
99 }
100
101 static HRESULT WINAPI IDirect3DRMLightImpl_AddDestroyCallback(IDirect3DRMLight* iface,
102                                                                D3DRMOBJECTCALLBACK cb,
103                                                                LPVOID argument)
104 {
105     IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface);
106
107     FIXME("(%p/%p)->(%p, %p): stub\n", iface, This, cb, argument);
108
109     return E_NOTIMPL;
110 }
111
112 static HRESULT WINAPI IDirect3DRMLightImpl_DeleteDestroyCallback(IDirect3DRMLight* iface,
113                                                                   D3DRMOBJECTCALLBACK cb,
114                                                                   LPVOID argument)
115 {
116     IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface);
117
118     FIXME("(%p/%p)->(%p, %p): stub\n", iface, This, cb, argument);
119
120     return E_NOTIMPL;
121 }
122
123 static HRESULT WINAPI IDirect3DRMLightImpl_SetAppData(IDirect3DRMLight* iface,
124                                                        DWORD data)
125 {
126     IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface);
127
128     FIXME("(%p/%p)->(%u): stub\n", iface, This, data);
129
130     return E_NOTIMPL;
131 }
132
133 static DWORD WINAPI IDirect3DRMLightImpl_GetAppData(IDirect3DRMLight* iface)
134 {
135     IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface);
136
137     FIXME("(%p/%p)->(): stub\n", iface, This);
138
139     return 0;
140 }
141
142 static HRESULT WINAPI IDirect3DRMLightImpl_SetName(IDirect3DRMLight* iface, LPCSTR name)
143 {
144     IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface);
145
146     FIXME("(%p/%p)->(%s): stub\n", iface, This, name);
147
148     return E_NOTIMPL;
149 }
150
151 static HRESULT WINAPI IDirect3DRMLightImpl_GetName(IDirect3DRMLight* iface,
152                                                     LPDWORD size, LPSTR name)
153 {
154     IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface);
155
156     FIXME("(%p/%p)->(%p, %p): stub\n", iface, This, size, name);
157
158     return E_NOTIMPL;
159 }
160
161 static HRESULT WINAPI IDirect3DRMLightImpl_GetClassName(IDirect3DRMLight* iface,
162                                                          LPDWORD size, LPSTR name)
163 {
164     IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface);
165
166     FIXME("(%p/%p)->(%p, %p): stub\n", iface, This, size, name);
167
168     return E_NOTIMPL;
169 }
170
171 /*** IDirect3DRMLight methods ***/
172 static HRESULT WINAPI IDirect3DRMLightImpl_SetType(IDirect3DRMLight* iface, D3DRMLIGHTTYPE type)
173 {
174     IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface);
175
176     FIXME("(%p/%p)->(%u): stub\n", iface, This, type);
177
178     return E_NOTIMPL;
179 }
180
181 static HRESULT WINAPI IDirect3DRMLightImpl_SetColor(IDirect3DRMLight* iface, D3DCOLOR color)
182 {
183     IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface);
184
185     FIXME("(%p/%p)->(%u): stub\n", iface, This, color);
186
187     return E_NOTIMPL;
188 }
189
190 static HRESULT WINAPI IDirect3DRMLightImpl_SetColorRGB(IDirect3DRMLight* iface,
191                                                          D3DVALUE red, D3DVALUE green, D3DVALUE blue)
192 {
193     IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface);
194
195     FIXME("(%p/%p)->(%f,%f,%f): stub\n", iface, This, red, green, blue);
196
197     return E_NOTIMPL;
198 }
199
200 static HRESULT WINAPI IDirect3DRMLightImpl_SetRange(IDirect3DRMLight* iface, D3DVALUE range)
201 {
202     IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface);
203
204     FIXME("(%p/%p)->(%f): stub\n", iface, This, range);
205
206     return E_NOTIMPL;
207 }
208
209 static HRESULT WINAPI IDirect3DRMLightImpl_SetUmbra(IDirect3DRMLight* iface, D3DVALUE umbra)
210 {
211     IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface);
212
213     FIXME("(%p/%p)->(%f): stub\n", iface, This, umbra);
214
215     return E_NOTIMPL;
216 }
217
218 static HRESULT WINAPI IDirect3DRMLightImpl_SetPenumbra(IDirect3DRMLight* iface, D3DVALUE penumbra)
219 {
220     IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface);
221
222     FIXME("(%p/%p)->(%f): stub\n", iface, This, penumbra);
223
224     return E_NOTIMPL;
225 }
226
227 static HRESULT WINAPI IDirect3DRMLightImpl_SetConstantAttenuation(IDirect3DRMLight* iface,
228                                                                     D3DVALUE cattenuation)
229 {
230     IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface);
231
232     FIXME("(%p/%p)->(%f): stub\n", iface, This, cattenuation);
233
234     return E_NOTIMPL;
235 }
236
237 static HRESULT WINAPI IDirect3DRMLightImpl_SetLinearAttenuation(IDirect3DRMLight* iface,
238                                                                   D3DVALUE lattenuation)
239 {
240     IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface);
241
242     FIXME("(%p/%p)->(%f): stub\n", iface, This, lattenuation);
243
244     return E_NOTIMPL;
245 }
246
247 static HRESULT WINAPI IDirect3DRMLightImpl_SetQuadraticAttenuation(IDirect3DRMLight* iface,
248                                                                      D3DVALUE qattenuation)
249 {
250     IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface);
251
252     FIXME("(%p/%p)->(%f): stub\n", iface, This, qattenuation);
253
254     return E_NOTIMPL;
255 }
256
257 static D3DVALUE WINAPI IDirect3DRMLightImpl_GetRange(IDirect3DRMLight* iface)
258 {
259     IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface);
260
261     FIXME("(%p/%p)->(): stub\n", iface, This);
262
263     return 0;
264 }
265
266 static D3DVALUE WINAPI IDirect3DRMLightImpl_GetUmbra(IDirect3DRMLight* iface)
267 {
268     IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface);
269
270     FIXME("(%p/%p)->(): stub\n", iface, This);
271
272     return 0;
273 }
274
275 static D3DVALUE WINAPI IDirect3DRMLightImpl_GetPenumbra(IDirect3DRMLight* iface)
276 {
277     IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface);
278
279     FIXME("(%p/%p)->(): stub\n", iface, This);
280
281     return 0;
282 }
283
284 static D3DVALUE WINAPI IDirect3DRMLightImpl_GetConstantAttenuation(IDirect3DRMLight* iface)
285 {
286     IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface);
287
288     FIXME("(%p/%p)->(): stub\n", iface, This);
289
290     return 0;
291 }
292
293 static D3DVALUE WINAPI IDirect3DRMLightImpl_GetLinearAttenuation(IDirect3DRMLight* iface)
294 {
295     IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface);
296
297     FIXME("(%p/%p)->(): stub\n", iface, This);
298
299     return 0;
300 }
301
302 static D3DVALUE WINAPI IDirect3DRMLightImpl_GetQuadraticAttenuation(IDirect3DRMLight* iface)
303 {
304     IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface);
305
306     FIXME("(%p/%p)->(): stub\n", iface, This);
307
308     return 0;
309 }
310
311 static D3DCOLOR WINAPI IDirect3DRMLightImpl_GetColor(IDirect3DRMLight* iface)
312 {
313     IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface);
314
315     FIXME("(%p/%p)->(): stub\n", iface, This);
316
317     return 0;
318 }
319
320 static D3DRMLIGHTTYPE WINAPI IDirect3DRMLightImpl_GetType(IDirect3DRMLight* iface)
321 {
322     IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface);
323
324     FIXME("(%p/%p)->(): stub\n", iface, This);
325
326     return D3DRMLIGHT_AMBIENT;
327 }
328
329 static HRESULT WINAPI IDirect3DRMLightImpl_SetEnableFrame(IDirect3DRMLight* iface,
330                                                             LPDIRECT3DRMFRAME frame)
331 {
332     IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface);
333
334     FIXME("(%p/%p)->(%p): stub\n", iface, This, frame);
335
336     return E_NOTIMPL;
337 }
338
339 static HRESULT WINAPI IDirect3DRMLightImpl_GetEnableFrame(IDirect3DRMLight* iface,
340                                                             LPDIRECT3DRMFRAME* frame)
341 {
342     IDirect3DRMLightImpl *This = impl_from_IDirect3DRMLight(iface);
343
344     FIXME("(%p/%p)->(%p): stub\n", iface, This, frame);
345
346     return E_NOTIMPL;
347 }
348
349 static const struct IDirect3DRMLightVtbl Direct3DRMLight_Vtbl =
350 {
351     /*** IUnknown methods ***/
352     IDirect3DRMLightImpl_QueryInterface,
353     IDirect3DRMLightImpl_AddRef,
354     IDirect3DRMLightImpl_Release,
355     /*** IDirect3DRMObject methods ***/
356     IDirect3DRMLightImpl_Clone,
357     IDirect3DRMLightImpl_AddDestroyCallback,
358     IDirect3DRMLightImpl_DeleteDestroyCallback,
359     IDirect3DRMLightImpl_SetAppData,
360     IDirect3DRMLightImpl_GetAppData,
361     IDirect3DRMLightImpl_SetName,
362     IDirect3DRMLightImpl_GetName,
363     IDirect3DRMLightImpl_GetClassName,
364     /*** IDirect3DRMLight methods ***/
365     IDirect3DRMLightImpl_SetType,
366     IDirect3DRMLightImpl_SetColor,
367     IDirect3DRMLightImpl_SetColorRGB,
368     IDirect3DRMLightImpl_SetRange,
369     IDirect3DRMLightImpl_SetUmbra,
370     IDirect3DRMLightImpl_SetPenumbra,
371     IDirect3DRMLightImpl_SetConstantAttenuation,
372     IDirect3DRMLightImpl_SetLinearAttenuation,
373     IDirect3DRMLightImpl_SetQuadraticAttenuation,
374     IDirect3DRMLightImpl_GetRange,
375     IDirect3DRMLightImpl_GetUmbra,
376     IDirect3DRMLightImpl_GetPenumbra,
377     IDirect3DRMLightImpl_GetConstantAttenuation,
378     IDirect3DRMLightImpl_GetLinearAttenuation,
379     IDirect3DRMLightImpl_GetQuadraticAttenuation,
380     IDirect3DRMLightImpl_GetColor,
381     IDirect3DRMLightImpl_GetType,
382     IDirect3DRMLightImpl_SetEnableFrame,
383     IDirect3DRMLightImpl_GetEnableFrame
384 };
385
386 HRESULT Direct3DRMLight_create(IUnknown** ppObj)
387 {
388     IDirect3DRMLightImpl* object;
389
390     TRACE("(%p)\n", ppObj);
391
392     object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DRMLightImpl));
393     if (!object)
394     {
395         ERR("Out of memory\n");
396         return E_OUTOFMEMORY;
397     }
398
399     object->IDirect3DRMLight_iface.lpVtbl = &Direct3DRMLight_Vtbl;
400     object->ref = 1;
401
402     *ppObj = (IUnknown*)&object->IDirect3DRMLight_iface;
403
404     return S_OK;
405 }