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
23 #include "wine/port.h"
25 #include "ddraw_private.h"
27 WINE_DEFAULT_DEBUG_CHANNEL(ddraw);
29 /*****************************************************************************
31 *****************************************************************************/
33 /*****************************************************************************
34 * IDirectDrawClipper::QueryInterface
36 * Can query the IUnknown and IDirectDrawClipper interface from a
37 * Clipper object. The IUnknown Interface is equal to the IDirectDrawClipper
38 * interface. Can't create other interfaces.
41 * riid: Interface id asked for
42 * ppvObj: Returns the pointer to the interface
46 * E_NOINTERFACE if the requested interface wasn't found.
48 *****************************************************************************/
49 static HRESULT WINAPI IDirectDrawClipperImpl_QueryInterface(
50 LPDIRECTDRAWCLIPPER iface, REFIID riid, LPVOID* ppvObj
53 TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), ppvObj);
55 if (IsEqualGUID(&IID_IDirectDrawClipper, riid)
56 || IsEqualGUID(&IID_IUnknown, riid))
58 IUnknown_AddRef(iface);
66 /*****************************************************************************
67 * IDirectDrawClipper::AddRef
69 * Increases the reference count of the interface, returns the new count
71 *****************************************************************************/
72 static ULONG WINAPI IDirectDrawClipperImpl_AddRef( LPDIRECTDRAWCLIPPER iface )
74 IDirectDrawClipperImpl *This = (IDirectDrawClipperImpl *)iface;
75 ULONG ref = InterlockedIncrement(&This->ref);
77 TRACE("%p increasing refcount to %u.\n", This, ref);
82 /*****************************************************************************
83 * IDirectDrawClipper::Release
85 * Decreases the reference count of the interface, returns the new count
86 * If the refcount is decreased to 0, the interface is destroyed.
88 *****************************************************************************/
89 static ULONG WINAPI IDirectDrawClipperImpl_Release(IDirectDrawClipper *iface) {
90 IDirectDrawClipperImpl *This = (IDirectDrawClipperImpl *)iface;
91 ULONG ref = InterlockedDecrement(&This->ref);
93 TRACE("%p decreasing refcount to %u.\n", This, ref);
97 EnterCriticalSection(&ddraw_cs);
98 IWineD3DClipper_Release(This->wineD3DClipper);
99 HeapFree(GetProcessHeap(), 0, This);
100 LeaveCriticalSection(&ddraw_cs);
106 /*****************************************************************************
107 * IDirectDrawClipper::SetHwnd
109 * Assigns a hWnd to the clipper interface.
112 * Flags: Unsupported so far
113 * hWnd: The hWnd to set
117 * DDERR_INVALIDPARAMS if Flags was != 0
119 *****************************************************************************/
121 static HRESULT WINAPI IDirectDrawClipperImpl_SetHwnd(
122 LPDIRECTDRAWCLIPPER iface, DWORD dwFlags, HWND hWnd
124 IDirectDrawClipperImpl *This = (IDirectDrawClipperImpl *)iface;
127 TRACE("iface %p, flags %#x, window %p.\n", iface, dwFlags, hWnd);
129 EnterCriticalSection(&ddraw_cs);
130 hr = IWineD3DClipper_SetHWnd(This->wineD3DClipper,
133 LeaveCriticalSection(&ddraw_cs);
136 case WINED3DERR_INVALIDCALL: return DDERR_INVALIDPARAMS;
141 /*****************************************************************************
142 * IDirectDrawClipper::GetClipList
144 * Retrieve a copy of the clip list
147 * Rect: Rectangle to be used to clip the clip list or NULL for the
149 * ClipList: structure for the resulting copy of the clip list.
150 * If NULL, fills Size up to the number of bytes necessary to hold
152 * Size: Size of resulting clip list; size of the buffer at ClipList
153 * or, if ClipList is NULL, receives the required size of the buffer
157 * Either DD_OK or DDERR_*
158 ************************************************************************/
159 static HRESULT WINAPI IDirectDrawClipperImpl_GetClipList(
160 LPDIRECTDRAWCLIPPER iface, LPRECT lpRect, LPRGNDATA lpClipList,
163 IDirectDrawClipperImpl *This = (IDirectDrawClipperImpl *)iface;
166 TRACE("iface %p, rect %s, clip_list %p, clip_list_size %p.\n",
167 iface, wine_dbgstr_rect(lpRect), lpClipList, lpdwSize);
169 EnterCriticalSection(&ddraw_cs);
170 hr = IWineD3DClipper_GetClipList(This->wineD3DClipper,
174 LeaveCriticalSection(&ddraw_cs);
178 /*****************************************************************************
179 * IDirectDrawClipper::SetClipList
181 * Sets or deletes (if lprgn is NULL) the clip list
183 * This implementation is a stub and returns DD_OK always to make the app
187 * lprgn Pointer to a LRGNDATA structure or NULL
188 * dwFlags not used, must be 0
190 * Either DD_OK or DDERR_*
191 *****************************************************************************/
192 static HRESULT WINAPI IDirectDrawClipperImpl_SetClipList(
193 LPDIRECTDRAWCLIPPER iface,LPRGNDATA lprgn,DWORD dwFlag
195 IDirectDrawClipperImpl *This = (IDirectDrawClipperImpl *)iface;
198 TRACE("iface %p, clip_list %p, flags %#x.\n", iface, lprgn, dwFlag);
200 EnterCriticalSection(&ddraw_cs);
201 hr = IWineD3DClipper_SetClipList(This->wineD3DClipper,
204 LeaveCriticalSection(&ddraw_cs);
208 /*****************************************************************************
209 * IDirectDrawClipper::GetHwnd
211 * Returns the hwnd assigned with SetHwnd
214 * hWndPtr: Address to store the HWND at
217 * Always returns DD_OK;
218 *****************************************************************************/
219 static HRESULT WINAPI IDirectDrawClipperImpl_GetHWnd(
220 LPDIRECTDRAWCLIPPER iface, HWND* hWndPtr
222 IDirectDrawClipperImpl *This = (IDirectDrawClipperImpl *)iface;
225 TRACE("iface %p, window %p.\n", iface, hWndPtr);
227 EnterCriticalSection(&ddraw_cs);
228 hr = IWineD3DClipper_GetHWnd(This->wineD3DClipper,
230 LeaveCriticalSection(&ddraw_cs);
234 /*****************************************************************************
235 * IDirectDrawClipper::Initialize
237 * Initializes the interface. Well, there isn't much to do for this
238 * implementation, but it stores the DirectDraw Interface.
241 * DD: Pointer to a IDirectDraw interface
242 * Flags: Unsupported by now
246 * DDERR_ALREADYINITIALIZED if this interface isn't initialized already
247 *****************************************************************************/
248 static HRESULT WINAPI IDirectDrawClipperImpl_Initialize(
249 LPDIRECTDRAWCLIPPER iface, LPDIRECTDRAW lpDD, DWORD dwFlags
251 IDirectDrawClipperImpl *This = (IDirectDrawClipperImpl *)iface;
253 TRACE("iface %p, ddraw %p, flags %#x.\n", iface, lpDD, dwFlags);
255 EnterCriticalSection(&ddraw_cs);
256 if (This->initialized)
258 LeaveCriticalSection(&ddraw_cs);
259 return DDERR_ALREADYINITIALIZED;
262 This->initialized = TRUE;
264 LeaveCriticalSection(&ddraw_cs);
268 /*****************************************************************************
269 * IDirectDrawClipper::IsClipListChanged
271 * This function is a stub
277 * DD_OK, because it's a stub
278 *****************************************************************************/
279 static HRESULT WINAPI IDirectDrawClipperImpl_IsClipListChanged(
280 LPDIRECTDRAWCLIPPER iface, BOOL* lpbChanged
282 FIXME("iface %p, changed %p stub!\n", iface, lpbChanged);
284 /* XXX What is safest? */
290 /*****************************************************************************
292 *****************************************************************************/
293 static const struct IDirectDrawClipperVtbl ddraw_clipper_vtbl =
295 IDirectDrawClipperImpl_QueryInterface,
296 IDirectDrawClipperImpl_AddRef,
297 IDirectDrawClipperImpl_Release,
298 IDirectDrawClipperImpl_GetClipList,
299 IDirectDrawClipperImpl_GetHWnd,
300 IDirectDrawClipperImpl_Initialize,
301 IDirectDrawClipperImpl_IsClipListChanged,
302 IDirectDrawClipperImpl_SetClipList,
303 IDirectDrawClipperImpl_SetHwnd
306 HRESULT ddraw_clipper_init(IDirectDrawClipperImpl *clipper)
308 clipper->lpVtbl = &ddraw_clipper_vtbl;
310 clipper->wineD3DClipper = pWineDirect3DCreateClipper();
311 if (!clipper->wineD3DClipper)
313 WARN("Failed to create wined3d clipper.\n");
314 return E_OUTOFMEMORY;