1 /* DirectDrawClipper implementation
3 * Copyright 2000 (c) Marcus Meissner
4 * Copyright 2000 (c) TransGaming Technologies Inc.
5 * Copyright 2006 (c) Stefan Dösinger
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
34 #include "ddraw_private.h"
36 #include "wine/debug.h"
38 WINE_DEFAULT_DEBUG_CHANNEL(ddraw);
40 /*****************************************************************************
42 *****************************************************************************/
44 /*****************************************************************************
45 * IDirectDrawClipper::QueryInterface
47 * Can query the IUnknown and IDirectDrawClipper interface from a
48 * Clipper object. The IUnknown Interface is equal to the IDirectDrawClipper
49 * interface. Can't create other interfaces.
52 * riid: Interface id asked for
53 * ppvObj: Returns the pointer to the interface
57 * E_NOINTERFACE if the requested interface wasn't found.
59 *****************************************************************************/
60 static HRESULT WINAPI IDirectDrawClipperImpl_QueryInterface(
61 LPDIRECTDRAWCLIPPER iface, REFIID riid, LPVOID* ppvObj
63 IDirectDrawClipperImpl *This = (IDirectDrawClipperImpl *)iface;
65 if (IsEqualGUID(&IID_IUnknown, riid)
66 || IsEqualGUID(&IID_IDirectDrawClipper, riid))
68 *ppvObj = ICOM_INTERFACE(This, IDirectDrawClipper);
69 InterlockedIncrement(&This->ref);
78 /*****************************************************************************
79 * IDirectDrawClipper::AddRef
81 * Increases the reference count of the interface, returns the new count
83 *****************************************************************************/
84 static ULONG WINAPI IDirectDrawClipperImpl_AddRef( LPDIRECTDRAWCLIPPER iface )
86 IDirectDrawClipperImpl *This = (IDirectDrawClipperImpl *)iface;
87 ULONG ref = InterlockedIncrement(&This->ref);
89 TRACE("(%p)->() incrementing from %u.\n", This, ref - 1);
94 /*****************************************************************************
95 * IDirectDrawClipper::Release
97 * Decreases the reference count of the interface, returns the new count
98 * If the refcount is decreased to 0, the interface is destroyed.
100 *****************************************************************************/
101 static ULONG WINAPI IDirectDrawClipperImpl_Release(IDirectDrawClipper *iface) {
102 IDirectDrawClipperImpl *This = (IDirectDrawClipperImpl *)iface;
103 ULONG ref = InterlockedDecrement(&This->ref);
105 TRACE("(%p)->() decrementing from %u.\n", This, ref + 1);
109 IWineD3DClipper_Release(This->wineD3DClipper);
110 HeapFree(GetProcessHeap(), 0, This);
116 /*****************************************************************************
117 * IDirectDrawClipper::SetHwnd
119 * Assigns a hWnd to the clipper interface.
122 * Flags: Unsupported so far
123 * hWnd: The hWnd to set
127 * DDERR_INVALIDPARAMS if Flags was != 0
129 *****************************************************************************/
131 static HRESULT WINAPI IDirectDrawClipperImpl_SetHwnd(
132 LPDIRECTDRAWCLIPPER iface, DWORD dwFlags, HWND hWnd
134 IDirectDrawClipperImpl *This = (IDirectDrawClipperImpl *)iface;
136 TRACE("(%p)->(%08x,%p)\n", This, dwFlags, hWnd);
138 hr = IWineD3DClipper_SetHWnd(This->wineD3DClipper,
143 case WINED3DERR_INVALIDCALL: return DDERR_INVALIDPARAMS;
148 /*****************************************************************************
149 * IDirectDrawClipper::GetClipList
151 * Retrieve a copy of the clip list
154 * Rect: Rectangle to be used to clip the clip list or NULL for the
156 * ClipList: structure for the resulting copy of the clip list.
157 * If NULL, fills Size up to the number of bytes necessary to hold
159 * Size: Size of resulting clip list; size of the buffer at ClipList
160 * or, if ClipList is NULL, receives the required size of the buffer
164 * Either DD_OK or DDERR_*
165 ************************************************************************/
166 static HRESULT WINAPI IDirectDrawClipperImpl_GetClipList(
167 LPDIRECTDRAWCLIPPER iface, LPRECT lpRect, LPRGNDATA lpClipList,
170 IDirectDrawClipperImpl *This = (IDirectDrawClipperImpl *)iface;
171 TRACE("(%p,%p,%p,%p)\n", This, lpRect, lpClipList, lpdwSize);
173 return IWineD3DClipper_GetClipList(This->wineD3DClipper,
179 /*****************************************************************************
180 * IDirectDrawClipper::SetClipList
182 * Sets or deletes (if lprgn is NULL) the clip list
184 * This implementation is a stub and returns DD_OK always to make the app
188 * lprgn Pointer to a LRGNDATA structure or NULL
189 * dwFlags not used, must be 0
191 * Either DD_OK or DDERR_*
192 *****************************************************************************/
193 static HRESULT WINAPI IDirectDrawClipperImpl_SetClipList(
194 LPDIRECTDRAWCLIPPER iface,LPRGNDATA lprgn,DWORD dwFlag
196 IDirectDrawClipperImpl *This = (IDirectDrawClipperImpl *)iface;
198 return IWineD3DClipper_SetClipList(This->wineD3DClipper,
203 /*****************************************************************************
204 * IDirectDrawClipper::GetHwnd
206 * Returns the hwnd assigned with SetHwnd
209 * hWndPtr: Address to store the HWND at
212 * Always returns DD_OK;
213 *****************************************************************************/
214 static HRESULT WINAPI IDirectDrawClipperImpl_GetHWnd(
215 LPDIRECTDRAWCLIPPER iface, HWND* hWndPtr
217 IDirectDrawClipperImpl *This = (IDirectDrawClipperImpl *)iface;
218 TRACE("(%p)->(%p)\n", This, hWndPtr);
220 return IWineD3DClipper_GetHWnd(This->wineD3DClipper,
224 /*****************************************************************************
225 * IDirectDrawClipper::Initialize
227 * Initializes the interface. Well, there isn't much to do for this
228 * implementation, but it stores the DirectDraw Interface.
231 * DD: Pointer to a IDirectDraw interface
232 * Flags: Unsupported by now
236 * DDERR_ALREADYINITIALIZED if this interface isn't initialized already
237 *****************************************************************************/
238 static HRESULT WINAPI IDirectDrawClipperImpl_Initialize(
239 LPDIRECTDRAWCLIPPER iface, LPDIRECTDRAW lpDD, DWORD dwFlags
241 IDirectDrawImpl* pOwner;
242 IDirectDrawClipperImpl *This = (IDirectDrawClipperImpl *)iface;
243 TRACE("(%p)->(%p,0x%08x)\n", This, lpDD, dwFlags);
245 if (This->ddraw_owner != NULL) return DDERR_ALREADYINITIALIZED;
247 pOwner = ICOM_OBJECT(IDirectDrawImpl, IDirectDraw, lpDD);
248 This->ddraw_owner = pOwner;
253 /*****************************************************************************
254 * IDirectDrawClipper::IsClipListChanged
256 * This function is a stub
262 * DD_OK, because it's a stub
263 *****************************************************************************/
264 static HRESULT WINAPI IDirectDrawClipperImpl_IsClipListChanged(
265 LPDIRECTDRAWCLIPPER iface, BOOL* lpbChanged
267 IDirectDrawClipperImpl *This = (IDirectDrawClipperImpl *)iface;
268 FIXME("(%p)->(%p),stub!\n",This,lpbChanged);
270 /* XXX What is safest? */
276 /*****************************************************************************
278 *****************************************************************************/
279 const IDirectDrawClipperVtbl IDirectDrawClipper_Vtbl =
281 IDirectDrawClipperImpl_QueryInterface,
282 IDirectDrawClipperImpl_AddRef,
283 IDirectDrawClipperImpl_Release,
284 IDirectDrawClipperImpl_GetClipList,
285 IDirectDrawClipperImpl_GetHWnd,
286 IDirectDrawClipperImpl_Initialize,
287 IDirectDrawClipperImpl_IsClipListChanged,
288 IDirectDrawClipperImpl_SetClipList,
289 IDirectDrawClipperImpl_SetHwnd