1 /* IWineD3DClipper 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
27 #include "wined3d_private.h"
29 WINE_DEFAULT_DEBUG_CHANNEL(d3d
);
31 static HRESULT WINAPI
IWineD3DClipperImpl_QueryInterface(IWineD3DClipper
*iface
, REFIID riid
, void **Obj
)
33 IWineD3DClipperImpl
*This
= (IWineD3DClipperImpl
*)iface
;
35 TRACE("(%p)->(%p,%p)\n", This
, riid
, Obj
);
36 if (IsEqualGUID(&IID_IUnknown
, riid
)
37 || IsEqualGUID(&IID_IWineD3DClipper
, riid
))
40 IWineD3DClipper_AddRef(iface
);
49 static ULONG WINAPI
IWineD3DClipperImpl_AddRef(IWineD3DClipper
*iface
)
51 IWineD3DClipperImpl
*This
= (IWineD3DClipperImpl
*)iface
;
52 ULONG ref
= InterlockedIncrement(&This
->ref
);
54 TRACE("(%p)->() incrementing from %u.\n", This
, ref
- 1);
59 static ULONG WINAPI
IWineD3DClipperImpl_Release(IWineD3DClipper
*iface
)
61 IWineD3DClipperImpl
*This
= (IWineD3DClipperImpl
*)iface
;
62 ULONG ref
= InterlockedDecrement(&This
->ref
);
64 TRACE("(%p)->() decrementing from %u.\n", This
, ref
+ 1);
68 HeapFree(GetProcessHeap(), 0, This
);
74 static HRESULT WINAPI
IWineD3DClipperImpl_GetParent(IWineD3DClipper
*iface
, IUnknown
**Parent
)
76 IWineD3DClipperImpl
*This
= (IWineD3DClipperImpl
*)iface
;
77 TRACE("(%p)->(%p)\n", This
, Parent
);
79 *Parent
= This
->Parent
;
80 IUnknown_AddRef(*Parent
);
84 static HRESULT WINAPI
IWineD3DClipperImpl_SetHwnd(IWineD3DClipper
*iface
, DWORD Flags
, HWND hWnd
)
86 IWineD3DClipperImpl
*This
= (IWineD3DClipperImpl
*)iface
;
88 TRACE("(%p)->(0x%08x,%p)\n", This
, Flags
, hWnd
);
91 FIXME("Flags = 0x%08x, not supported.\n",Flags
);
92 return WINED3DERR_INVALIDCALL
;
99 static HRESULT WINAPI
IWineD3DClipperImpl_GetClipList(IWineD3DClipper
*iface
, const RECT
*Rect
,
100 RGNDATA
*ClipList
, DWORD
*Size
)
102 IWineD3DClipperImpl
*This
= (IWineD3DClipperImpl
*)iface
;
103 TRACE("(%p,%p,%p,%p)\n", This
, Rect
, ClipList
, Size
);
107 HDC hDC
= GetDCEx(This
->hWnd
, NULL
, DCX_WINDOW
);
110 HRGN hRgn
= CreateRectRgn(0,0,0,0);
111 if (GetRandomRgn(hDC
, hRgn
, SYSRGN
))
113 if (GetVersion() & 0x80000000)
115 /* map region to screen coordinates */
117 GetDCOrgEx( hDC
, &org
);
118 OffsetRgn( hRgn
, org
.x
, org
.y
);
122 HRGN hRgnClip
= CreateRectRgn(Rect
->left
, Rect
->top
,
123 Rect
->right
, Rect
->bottom
);
124 CombineRgn(hRgn
, hRgn
, hRgnClip
, RGN_AND
);
125 DeleteObject(hRgnClip
);
127 *Size
= GetRegionData(hRgn
, *Size
, ClipList
);
130 ReleaseDC(This
->hWnd
, hDC
);
136 static int warned
= 0;
138 FIXME("(%p,%p,%p,%p),stub!\n",This
,Rect
,ClipList
,Size
);
140 return WINEDDERR_NOCLIPLIST
;
144 static HRESULT WINAPI
IWineD3DClipperImpl_SetClipList(IWineD3DClipper
*iface
, const RGNDATA
*rgn
, DWORD Flags
)
146 IWineD3DClipperImpl
*This
= (IWineD3DClipperImpl
*)iface
;
147 static int warned
= 0;
149 if (warned
++ < 10 || rgn
== NULL
)
150 FIXME("(%p,%p,%d),stub!\n",This
,rgn
,Flags
);
154 static HRESULT WINAPI
IWineD3DClipperImpl_GetHwnd(IWineD3DClipper
*iface
, HWND
*hwnd
)
156 IWineD3DClipperImpl
*This
= (IWineD3DClipperImpl
*)iface
;
157 TRACE("(%p)->(%p)\n", This
, hwnd
);
163 static HRESULT WINAPI
IWineD3DClipperImpl_IsClipListChanged(IWineD3DClipper
*iface
, BOOL
*changed
)
165 IWineD3DClipperImpl
*This
= (IWineD3DClipperImpl
*)iface
;
166 FIXME("(%p)->(%p),stub!\n",This
,changed
);
168 /* XXX What is safest? */
174 static const IWineD3DClipperVtbl IWineD3DClipper_Vtbl
=
176 IWineD3DClipperImpl_QueryInterface
,
177 IWineD3DClipperImpl_AddRef
,
178 IWineD3DClipperImpl_Release
,
179 IWineD3DClipperImpl_GetParent
,
180 IWineD3DClipperImpl_GetClipList
,
181 IWineD3DClipperImpl_GetHwnd
,
182 IWineD3DClipperImpl_IsClipListChanged
,
183 IWineD3DClipperImpl_SetClipList
,
184 IWineD3DClipperImpl_SetHwnd
187 IWineD3DClipper
* WINAPI
WineDirect3DCreateClipper(IUnknown
*Parent
)
189 IWineD3DClipperImpl
*obj
;
191 TRACE("Creating clipper, parent %p\n", Parent
);
192 obj
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(*obj
));
195 ERR("Out of memory when trying to allocate a WineD3D Clipper\n");
199 obj
->lpVtbl
= &IWineD3DClipper_Vtbl
;
200 obj
->Parent
= Parent
;
202 IWineD3DClipper_AddRef((IWineD3DClipper
*)obj
);
203 return (IWineD3DClipper
*) obj
;