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 static inline IDirectDrawClipperImpl
*impl_from_IDirectDrawClipper(IDirectDrawClipper
*iface
)
31 return CONTAINING_RECORD(iface
, IDirectDrawClipperImpl
, IDirectDrawClipper_iface
);
34 /*****************************************************************************
35 * IDirectDrawClipper::QueryInterface
37 * Can query the IUnknown and IDirectDrawClipper interface from a
38 * Clipper object. The IUnknown Interface is equal to the IDirectDrawClipper
39 * interface. Can't create other interfaces.
42 * riid: Interface id asked for
43 * ppvObj: Returns the pointer to the interface
47 * E_NOINTERFACE if the requested interface wasn't found.
49 *****************************************************************************/
50 static HRESULT WINAPI
IDirectDrawClipperImpl_QueryInterface(IDirectDrawClipper
*iface
, REFIID riid
,
54 TRACE("iface %p, riid %s, object %p.\n", iface
, debugstr_guid(riid
), ppvObj
);
56 if (IsEqualGUID(&IID_IDirectDrawClipper
, riid
)
57 || IsEqualGUID(&IID_IUnknown
, riid
))
59 IUnknown_AddRef(iface
);
67 /*****************************************************************************
68 * IDirectDrawClipper::AddRef
70 * Increases the reference count of the interface, returns the new count
72 *****************************************************************************/
73 static ULONG WINAPI
IDirectDrawClipperImpl_AddRef(IDirectDrawClipper
*iface
)
75 IDirectDrawClipperImpl
*This
= impl_from_IDirectDrawClipper(iface
);
76 ULONG ref
= InterlockedIncrement(&This
->ref
);
78 TRACE("%p increasing refcount to %u.\n", This
, ref
);
83 /*****************************************************************************
84 * IDirectDrawClipper::Release
86 * Decreases the reference count of the interface, returns the new count
87 * If the refcount is decreased to 0, the interface is destroyed.
89 *****************************************************************************/
90 static ULONG WINAPI
IDirectDrawClipperImpl_Release(IDirectDrawClipper
*iface
)
92 IDirectDrawClipperImpl
*This
= impl_from_IDirectDrawClipper(iface
);
93 ULONG ref
= InterlockedDecrement(&This
->ref
);
95 TRACE("%p decreasing refcount to %u.\n", This
, ref
);
100 wined3d_clipper_decref(This
->wineD3DClipper
);
101 wined3d_mutex_unlock();
102 HeapFree(GetProcessHeap(), 0, This
);
108 /*****************************************************************************
109 * IDirectDrawClipper::SetHWnd
111 * Assigns a hWnd to the clipper interface.
114 * Flags: Unsupported so far
115 * hWnd: The hWnd to set
119 * DDERR_INVALIDPARAMS if Flags was != 0
121 *****************************************************************************/
123 static HRESULT WINAPI
IDirectDrawClipperImpl_SetHWnd(IDirectDrawClipper
*iface
, DWORD dwFlags
,
126 IDirectDrawClipperImpl
*This
= impl_from_IDirectDrawClipper(iface
);
129 TRACE("iface %p, flags %#x, window %p.\n", iface
, dwFlags
, hWnd
);
131 wined3d_mutex_lock();
132 hr
= wined3d_clipper_set_window(This
->wineD3DClipper
, dwFlags
, hWnd
);
133 wined3d_mutex_unlock();
137 case WINED3DERR_INVALIDCALL
: return DDERR_INVALIDPARAMS
;
142 /*****************************************************************************
143 * IDirectDrawClipper::GetClipList
145 * Retrieve a copy of the clip list
148 * Rect: Rectangle to be used to clip the clip list or NULL for the
150 * ClipList: structure for the resulting copy of the clip list.
151 * If NULL, fills Size up to the number of bytes necessary to hold
153 * Size: Size of resulting clip list; size of the buffer at ClipList
154 * or, if ClipList is NULL, receives the required size of the buffer
158 * Either DD_OK or DDERR_*
159 ************************************************************************/
160 static HRESULT WINAPI
IDirectDrawClipperImpl_GetClipList(IDirectDrawClipper
*iface
, RECT
*lpRect
,
161 RGNDATA
*lpClipList
, DWORD
*lpdwSize
)
163 IDirectDrawClipperImpl
*This
= impl_from_IDirectDrawClipper(iface
);
166 TRACE("iface %p, rect %s, clip_list %p, clip_list_size %p.\n",
167 iface
, wine_dbgstr_rect(lpRect
), lpClipList
, lpdwSize
);
169 wined3d_mutex_lock();
170 hr
= wined3d_clipper_get_clip_list(This
->wineD3DClipper
, lpRect
, lpClipList
, lpdwSize
);
171 wined3d_mutex_unlock();
176 /*****************************************************************************
177 * IDirectDrawClipper::SetClipList
179 * Sets or deletes (if lprgn is NULL) the clip list
181 * This implementation is a stub and returns DD_OK always to make the app
185 * lprgn Pointer to a LRGNDATA structure or NULL
186 * dwFlags not used, must be 0
188 * Either DD_OK or DDERR_*
189 *****************************************************************************/
190 static HRESULT WINAPI
IDirectDrawClipperImpl_SetClipList(IDirectDrawClipper
*iface
, RGNDATA
*lprgn
,
193 IDirectDrawClipperImpl
*This
= impl_from_IDirectDrawClipper(iface
);
196 TRACE("iface %p, clip_list %p, flags %#x.\n", iface
, lprgn
, dwFlag
);
198 wined3d_mutex_lock();
199 hr
= wined3d_clipper_set_clip_list(This
->wineD3DClipper
, lprgn
, dwFlag
);
200 wined3d_mutex_unlock();
205 /*****************************************************************************
206 * IDirectDrawClipper::GetHWnd
208 * Returns the hwnd assigned with SetHWnd
211 * hWndPtr: Address to store the HWND at
214 * Always returns DD_OK;
215 *****************************************************************************/
216 static HRESULT WINAPI
IDirectDrawClipperImpl_GetHWnd(IDirectDrawClipper
*iface
, HWND
*hWndPtr
)
218 IDirectDrawClipperImpl
*This
= impl_from_IDirectDrawClipper(iface
);
221 TRACE("iface %p, window %p.\n", iface
, hWndPtr
);
223 wined3d_mutex_lock();
224 hr
= wined3d_clipper_get_window(This
->wineD3DClipper
, hWndPtr
);
225 wined3d_mutex_unlock();
230 /*****************************************************************************
231 * IDirectDrawClipper::Initialize
233 * Initializes the interface. Well, there isn't much to do for this
234 * implementation, but it stores the DirectDraw Interface.
237 * DD: Pointer to a IDirectDraw interface
238 * Flags: Unsupported by now
242 * DDERR_ALREADYINITIALIZED if this interface isn't initialized already
243 *****************************************************************************/
244 static HRESULT WINAPI
IDirectDrawClipperImpl_Initialize(IDirectDrawClipper
*iface
,
245 IDirectDraw
*ddraw
, DWORD dwFlags
)
247 IDirectDrawClipperImpl
*This
= impl_from_IDirectDrawClipper(iface
);
249 TRACE("iface %p, ddraw %p, flags %#x.\n", iface
, ddraw
, dwFlags
);
251 wined3d_mutex_lock();
252 if (This
->initialized
)
254 wined3d_mutex_unlock();
255 return DDERR_ALREADYINITIALIZED
;
258 This
->initialized
= TRUE
;
259 wined3d_mutex_unlock();
264 /*****************************************************************************
265 * IDirectDrawClipper::IsClipListChanged
267 * This function is a stub
273 * DD_OK, because it's a stub
274 *****************************************************************************/
275 static HRESULT WINAPI
IDirectDrawClipperImpl_IsClipListChanged(IDirectDrawClipper
*iface
,
278 FIXME("iface %p, changed %p stub!\n", iface
, lpbChanged
);
280 /* XXX What is safest? */
286 /*****************************************************************************
288 *****************************************************************************/
289 static const struct IDirectDrawClipperVtbl ddraw_clipper_vtbl
=
291 IDirectDrawClipperImpl_QueryInterface
,
292 IDirectDrawClipperImpl_AddRef
,
293 IDirectDrawClipperImpl_Release
,
294 IDirectDrawClipperImpl_GetClipList
,
295 IDirectDrawClipperImpl_GetHWnd
,
296 IDirectDrawClipperImpl_Initialize
,
297 IDirectDrawClipperImpl_IsClipListChanged
,
298 IDirectDrawClipperImpl_SetClipList
,
299 IDirectDrawClipperImpl_SetHWnd
302 HRESULT
ddraw_clipper_init(IDirectDrawClipperImpl
*clipper
)
304 clipper
->IDirectDrawClipper_iface
.lpVtbl
= &ddraw_clipper_vtbl
;
306 clipper
->wineD3DClipper
= wined3d_clipper_create();
307 if (!clipper
->wineD3DClipper
)
309 WARN("Failed to create wined3d clipper.\n");
310 return E_OUTOFMEMORY
;
316 IDirectDrawClipperImpl
*unsafe_impl_from_IDirectDrawClipper(IDirectDrawClipper
*iface
)
320 assert(iface
->lpVtbl
== &ddraw_clipper_vtbl
);
322 return impl_from_IDirectDrawClipper(iface
);