mshtml: Don't crash in QueryInterface if uri is NULL.
[wine] / dlls / ddraw / gamma.c
1 /* DirectDrawGammaControl implementation
2  *
3  * Copyright 2001 TransGaming Technologies Inc.
4  * Copyright 2006 Stefan Dösinger
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 "config.h"
22 #include "wine/port.h"
23 #include "wine/debug.h"
24
25 #include <assert.h>
26 #include <stdarg.h>
27 #include <string.h>
28 #include <stdlib.h>
29
30 #define COBJMACROS
31
32 #include "windef.h"
33 #include "winbase.h"
34 #include "winnls.h"
35 #include "winerror.h"
36 #include "wingdi.h"
37 #include "wine/exception.h"
38 #include "excpt.h"
39
40 #include "ddraw.h"
41 #include "d3d.h"
42
43 #include "ddraw_private.h"
44
45 WINE_DEFAULT_DEBUG_CHANNEL(ddraw);
46 WINE_DECLARE_DEBUG_CHANNEL(ddraw_thunk);
47
48 /**********************************************************
49  * IUnknown parts follow
50  **********************************************************/
51
52 /**********************************************************
53  * IDirectDrawGammaControl::QueryInterface
54  *
55  * QueryInterface, thunks to IDirectDrawSurface
56  *
57  * Params:
58  *  riid: Interface id queried for
59  *  obj: Returns the interface pointer
60  *
61  * Returns:
62  *  S_OK or E_NOINTERFACE: See IDirectDrawSurface7::QueryInterface
63  *
64  **********************************************************/
65 static HRESULT WINAPI
66 IDirectDrawGammaControlImpl_QueryInterface(IDirectDrawGammaControl *iface, REFIID riid,
67                                            void **obj)
68 {
69     ICOM_THIS_FROM(IDirectDrawSurfaceImpl, IDirectDrawGammaControl, iface);
70     TRACE_(ddraw_thunk)("(%p)->(%s,%p): Thunking to IDirectDrawSurface7\n", This, debugstr_guid(riid), obj);
71
72     return IDirectDrawSurface7_QueryInterface(ICOM_INTERFACE(This, IDirectDrawSurface7),
73                                               riid,
74                                               obj);
75 }
76
77 /**********************************************************
78  * IDirectDrawGammaControl::AddRef
79  *
80  * Addref, thunks to IDirectDrawSurface
81  *
82  * Returns:
83  *  The new refcount
84  *
85  **********************************************************/
86 static ULONG WINAPI
87 IDirectDrawGammaControlImpl_AddRef(IDirectDrawGammaControl *iface)
88 {
89     ICOM_THIS_FROM(IDirectDrawSurfaceImpl, IDirectDrawGammaControl, iface);
90     TRACE_(ddraw_thunk)("(%p)->() Thunking to IDirectDrawSurface7\n", This);
91
92     return IDirectDrawSurface7_AddRef(ICOM_INTERFACE(This, IDirectDrawSurface7));
93 }
94
95 /**********************************************************
96  * IDirectDrawGammaControl::Release
97  *
98  * Release, thunks to IDirectDrawSurface
99  *
100  * Returns:
101  *  The new refcount
102  *
103  **********************************************************/
104 static ULONG WINAPI
105 IDirectDrawGammaControlImpl_Release(IDirectDrawGammaControl *iface)
106 {
107     ICOM_THIS_FROM(IDirectDrawSurfaceImpl, IDirectDrawGammaControl, iface);
108     TRACE_(ddraw_thunk)("(%p)->() Thunking to IDirectDrawSurface7\n", This);
109
110     return IDirectDrawSurface7_Release(ICOM_INTERFACE(This, IDirectDrawSurface7));
111 }
112
113 /**********************************************************
114  * IDirectDrawGammaControl
115  **********************************************************/
116
117 /**********************************************************
118  * IDirectDrawGammaControl::GetGammaRamp
119  *
120  * Returns the current gamma ramp for a surface
121  *
122  * Params:
123  *  Flags: Ignored
124  *  GammaRamp: Address to write the ramp to
125  *
126  * Returns:
127  *  DD_OK on success
128  *  DDERR_INVALIDPARAMS if GammaRamp is NULL
129  *
130  **********************************************************/
131 static HRESULT WINAPI
132 IDirectDrawGammaControlImpl_GetGammaRamp(IDirectDrawGammaControl *iface,
133                                          DWORD Flags,
134                                          DDGAMMARAMP *GammaRamp)
135 {
136     ICOM_THIS_FROM(IDirectDrawSurfaceImpl, IDirectDrawGammaControl, iface);
137     TRACE("(%p)->(%08lx,%p)\n", This,Flags,GammaRamp);
138
139     /* This looks sane */
140     if(!GammaRamp)
141     {
142         ERR("(%p) GammaRamp is NULL, returning DDERR_INVALIDPARAMS\n", This);
143         return DDERR_INVALIDPARAMS;
144     }
145
146     if(This->surface_desc.ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE)
147     {
148         /* This returns a void */
149         IWineD3DDevice_GetGammaRamp(This->ddraw->wineD3DDevice,
150                                     0 /* Swapchain */,
151                                     (WINED3DGAMMARAMP *) GammaRamp);
152     }
153     else
154     {
155         ERR("(%p) Unimplemented for non-primary surfaces\n", This);
156     }
157
158     return DD_OK;
159 }
160
161 /**********************************************************
162  * IDirectDrawGammaControl::SetGammaRamp
163  *
164  * Sets the red, green and blue gamma ramps for
165  *
166  * Params:
167  *  Flags: Can be DDSGR_CALIBRATE to request calibration
168  *  GammaRamp: Structure containing the new gamma ramp
169  *
170  * Returns:
171  *  DD_OK on success
172  *  DDERR_INVALIDPARAMS if GammaRamp is NULL
173  *
174  **********************************************************/
175 static HRESULT WINAPI
176 IDirectDrawGammaControlImpl_SetGammaRamp(IDirectDrawGammaControl *iface,
177                                          DWORD Flags,
178                                          DDGAMMARAMP *GammaRamp)
179 {
180     ICOM_THIS_FROM(IDirectDrawSurfaceImpl, IDirectDrawGammaControl, iface);
181     TRACE("(%p)->(%08lx,%p)\n", This,Flags,GammaRamp);
182
183     /* This looks sane */
184     if(!GammaRamp)
185     {
186         ERR("(%p) GammaRamp is NULL, returning DDERR_INVALIDPARAMS\n", This);
187         return DDERR_INVALIDPARAMS;
188     }
189
190     if(This->surface_desc.ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE)
191     {
192         /* This returns a void */
193         IWineD3DDevice_SetGammaRamp(This->ddraw->wineD3DDevice,
194                                     0 /* Swapchain */,
195                                     Flags,
196                                     (WINED3DGAMMARAMP *) GammaRamp);
197     }
198     else
199     {
200         ERR("(%p) Unimplemented for non-primary surfaces\n", This);
201     }
202
203     return DD_OK;
204 }
205
206 const IDirectDrawGammaControlVtbl IDirectDrawGammaControl_Vtbl =
207 {
208     IDirectDrawGammaControlImpl_QueryInterface,
209     IDirectDrawGammaControlImpl_AddRef,
210     IDirectDrawGammaControlImpl_Release,
211     IDirectDrawGammaControlImpl_GetGammaRamp,
212     IDirectDrawGammaControlImpl_SetGammaRamp
213 };