| /* DirectDrawClipper implementation |
| * |
| * Copyright 2000 (c) Marcus Meissner |
| * Copyright 2000 (c) TransGaming Technologies Inc. |
| * Copyright 2006 (c) Stefan Dösinger |
| * |
| * This library is free software; you can redistribute it and/or |
| * modify it under the terms of the GNU Lesser General Public |
| * License as published by the Free Software Foundation; either |
| * version 2.1 of the License, or (at your option) any later version. |
| * |
| * This library is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| * Lesser General Public License for more details. |
| * |
| * You should have received a copy of the GNU Lesser General Public |
| * License along with this library; if not, write to the Free Software |
| * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA |
| */ |
| |
| #include "config.h" |
| |
| #include <stdarg.h> |
| #include <stdlib.h> |
| #include <string.h> |
| |
| #define COBJMACROS |
| |
| #include "windef.h" |
| #include "winbase.h" |
| #include "wingdi.h" |
| #include "ddraw.h" |
| #include "winerror.h" |
| |
| #include "ddraw_private.h" |
| |
| #include "wine/debug.h" |
| |
| WINE_DEFAULT_DEBUG_CHANNEL(ddraw); |
| |
| /***************************************************************************** |
| * IUnknown methods |
| *****************************************************************************/ |
| |
| /***************************************************************************** |
| * IDirectDrawClipper::QueryInterface |
| * |
| * Can query the IUnknown and IDirectDrawClipper interface from a |
| * Clipper object. The IUnknown Interface is equal to the IDirectDrawClipper |
| * interface. Can't create other interfaces. |
| * |
| * Arguments: |
| * riid: Interface id asked for |
| * ppvObj: Returns the pointer to the interface |
| * |
| * Return values: |
| * DD_OK on success |
| * E_NOINTERFACE if the requested interface wasn't found. |
| * |
| *****************************************************************************/ |
| static HRESULT WINAPI IDirectDrawClipperImpl_QueryInterface( |
| LPDIRECTDRAWCLIPPER iface, REFIID riid, LPVOID* ppvObj |
| ) { |
| IDirectDrawClipperImpl *This = (IDirectDrawClipperImpl *)iface; |
| |
| if (IsEqualGUID(&IID_IUnknown, riid) |
| || IsEqualGUID(&IID_IDirectDrawClipper, riid)) |
| { |
| *ppvObj = ICOM_INTERFACE(This, IDirectDrawClipper); |
| InterlockedIncrement(&This->ref); |
| return S_OK; |
| } |
| else |
| { |
| return E_NOINTERFACE; |
| } |
| } |
| |
| /***************************************************************************** |
| * IDirectDrawClipper::AddRef |
| * |
| * Increases the reference count of the interface, returns the new count |
| * |
| *****************************************************************************/ |
| static ULONG WINAPI IDirectDrawClipperImpl_AddRef( LPDIRECTDRAWCLIPPER iface ) |
| { |
| IDirectDrawClipperImpl *This = (IDirectDrawClipperImpl *)iface; |
| ULONG ref = InterlockedIncrement(&This->ref); |
| |
| TRACE("(%p)->() incrementing from %u.\n", This, ref - 1); |
| |
| return ref; |
| } |
| |
| /***************************************************************************** |
| * IDirectDrawClipper::Release |
| * |
| * Decreases the reference count of the interface, returns the new count |
| * If the refcount is decreased to 0, the interface is destroyed. |
| * |
| *****************************************************************************/ |
| static ULONG WINAPI IDirectDrawClipperImpl_Release(IDirectDrawClipper *iface) { |
| IDirectDrawClipperImpl *This = (IDirectDrawClipperImpl *)iface; |
| ULONG ref = InterlockedDecrement(&This->ref); |
| |
| TRACE("(%p)->() decrementing from %u.\n", This, ref + 1); |
| |
| if (ref == 0) |
| { |
| EnterCriticalSection(&ddraw_cs); |
| IWineD3DClipper_Release(This->wineD3DClipper); |
| HeapFree(GetProcessHeap(), 0, This); |
| LeaveCriticalSection(&ddraw_cs); |
| return 0; |
| } |
| else return ref; |
| } |
| |
| /***************************************************************************** |
| * IDirectDrawClipper::SetHwnd |
| * |
| * Assigns a hWnd to the clipper interface. |
| * |
| * Arguments: |
| * Flags: Unsupported so far |
| * hWnd: The hWnd to set |
| * |
| * Return values: |
| * DD_OK on success |
| * DDERR_INVALIDPARAMS if Flags was != 0 |
| * |
| *****************************************************************************/ |
| |
| static HRESULT WINAPI IDirectDrawClipperImpl_SetHwnd( |
| LPDIRECTDRAWCLIPPER iface, DWORD dwFlags, HWND hWnd |
| ) { |
| IDirectDrawClipperImpl *This = (IDirectDrawClipperImpl *)iface; |
| HRESULT hr; |
| TRACE("(%p)->(%08x,%p)\n", This, dwFlags, hWnd); |
| |
| EnterCriticalSection(&ddraw_cs); |
| hr = IWineD3DClipper_SetHWnd(This->wineD3DClipper, |
| dwFlags, |
| hWnd); |
| LeaveCriticalSection(&ddraw_cs); |
| switch(hr) |
| { |
| case WINED3DERR_INVALIDCALL: return DDERR_INVALIDPARAMS; |
| default: return hr; |
| } |
| } |
| |
| /***************************************************************************** |
| * IDirectDrawClipper::GetClipList |
| * |
| * Retrieve a copy of the clip list |
| * |
| * Arguments: |
| * Rect: Rectangle to be used to clip the clip list or NULL for the |
| * entire clip list |
| * ClipList: structure for the resulting copy of the clip list. |
| * If NULL, fills Size up to the number of bytes necessary to hold |
| * the entire clip. |
| * Size: Size of resulting clip list; size of the buffer at ClipList |
| * or, if ClipList is NULL, receives the required size of the buffer |
| * in bytes |
| * |
| * RETURNS |
| * Either DD_OK or DDERR_* |
| ************************************************************************/ |
| static HRESULT WINAPI IDirectDrawClipperImpl_GetClipList( |
| LPDIRECTDRAWCLIPPER iface, LPRECT lpRect, LPRGNDATA lpClipList, |
| LPDWORD lpdwSize) |
| { |
| IDirectDrawClipperImpl *This = (IDirectDrawClipperImpl *)iface; |
| HRESULT hr; |
| TRACE("(%p,%p,%p,%p)\n", This, lpRect, lpClipList, lpdwSize); |
| |
| EnterCriticalSection(&ddraw_cs); |
| hr = IWineD3DClipper_GetClipList(This->wineD3DClipper, |
| lpRect, |
| lpClipList, |
| lpdwSize); |
| LeaveCriticalSection(&ddraw_cs); |
| return hr; |
| } |
| |
| /***************************************************************************** |
| * IDirectDrawClipper::SetClipList |
| * |
| * Sets or deletes (if lprgn is NULL) the clip list |
| * |
| * This implementation is a stub and returns DD_OK always to make the app |
| * happy. |
| * |
| * PARAMS |
| * lprgn Pointer to a LRGNDATA structure or NULL |
| * dwFlags not used, must be 0 |
| * RETURNS |
| * Either DD_OK or DDERR_* |
| *****************************************************************************/ |
| static HRESULT WINAPI IDirectDrawClipperImpl_SetClipList( |
| LPDIRECTDRAWCLIPPER iface,LPRGNDATA lprgn,DWORD dwFlag |
| ) { |
| IDirectDrawClipperImpl *This = (IDirectDrawClipperImpl *)iface; |
| HRESULT hr; |
| |
| EnterCriticalSection(&ddraw_cs); |
| hr = IWineD3DClipper_SetClipList(This->wineD3DClipper, |
| lprgn, |
| dwFlag); |
| LeaveCriticalSection(&ddraw_cs); |
| return hr; |
| } |
| |
| /***************************************************************************** |
| * IDirectDrawClipper::GetHwnd |
| * |
| * Returns the hwnd assigned with SetHwnd |
| * |
| * Arguments: |
| * hWndPtr: Address to store the HWND at |
| * |
| * Return values: |
| * Always returns DD_OK; |
| *****************************************************************************/ |
| static HRESULT WINAPI IDirectDrawClipperImpl_GetHWnd( |
| LPDIRECTDRAWCLIPPER iface, HWND* hWndPtr |
| ) { |
| IDirectDrawClipperImpl *This = (IDirectDrawClipperImpl *)iface; |
| HRESULT hr; |
| TRACE("(%p)->(%p)\n", This, hWndPtr); |
| |
| EnterCriticalSection(&ddraw_cs); |
| hr = IWineD3DClipper_GetHWnd(This->wineD3DClipper, |
| hWndPtr); |
| LeaveCriticalSection(&ddraw_cs); |
| return hr; |
| } |
| |
| /***************************************************************************** |
| * IDirectDrawClipper::Initialize |
| * |
| * Initializes the interface. Well, there isn't much to do for this |
| * implementation, but it stores the DirectDraw Interface. |
| * |
| * Arguments: |
| * DD: Pointer to a IDirectDraw interface |
| * Flags: Unsupported by now |
| * |
| * Return values: |
| * DD_OK on success |
| * DDERR_ALREADYINITIALIZED if this interface isn't initialized already |
| *****************************************************************************/ |
| static HRESULT WINAPI IDirectDrawClipperImpl_Initialize( |
| LPDIRECTDRAWCLIPPER iface, LPDIRECTDRAW lpDD, DWORD dwFlags |
| ) { |
| IDirectDrawImpl* pOwner; |
| IDirectDrawClipperImpl *This = (IDirectDrawClipperImpl *)iface; |
| TRACE("(%p)->(%p,0x%08x)\n", This, lpDD, dwFlags); |
| |
| EnterCriticalSection(&ddraw_cs); |
| if (This->ddraw_owner != NULL) |
| { |
| LeaveCriticalSection(&ddraw_cs); |
| return DDERR_ALREADYINITIALIZED; |
| } |
| |
| pOwner = ICOM_OBJECT(IDirectDrawImpl, IDirectDraw, lpDD); |
| This->ddraw_owner = pOwner; |
| |
| LeaveCriticalSection(&ddraw_cs); |
| return DD_OK; |
| } |
| |
| /***************************************************************************** |
| * IDirectDrawClipper::IsClipListChanged |
| * |
| * This function is a stub |
| * |
| * Arguments: |
| * Changed: |
| * |
| * Return values: |
| * DD_OK, because it's a stub |
| *****************************************************************************/ |
| static HRESULT WINAPI IDirectDrawClipperImpl_IsClipListChanged( |
| LPDIRECTDRAWCLIPPER iface, BOOL* lpbChanged |
| ) { |
| IDirectDrawClipperImpl *This = (IDirectDrawClipperImpl *)iface; |
| FIXME("(%p)->(%p),stub!\n",This,lpbChanged); |
| |
| /* XXX What is safest? */ |
| *lpbChanged = FALSE; |
| |
| return DD_OK; |
| } |
| |
| /***************************************************************************** |
| * The VTable |
| *****************************************************************************/ |
| const IDirectDrawClipperVtbl IDirectDrawClipper_Vtbl = |
| { |
| IDirectDrawClipperImpl_QueryInterface, |
| IDirectDrawClipperImpl_AddRef, |
| IDirectDrawClipperImpl_Release, |
| IDirectDrawClipperImpl_GetClipList, |
| IDirectDrawClipperImpl_GetHWnd, |
| IDirectDrawClipperImpl_Initialize, |
| IDirectDrawClipperImpl_IsClipListChanged, |
| IDirectDrawClipperImpl_SetClipList, |
| IDirectDrawClipperImpl_SetHwnd |
| }; |