reactos/dll/directx/ddraw/Clipper/clipper_main.c

143 lines
3.4 KiB
C

/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS DirectX
* FILE: dll/directx/ddraw/Clipper/clipper_main.c
* PURPOSE: IDirectDrawClipper Implementation
* PROGRAMMER: Maarten Bosma
*
*/
#include "rosdraw.h"
HRESULT WINAPI
DirectDrawClipper_QueryInterface (LPDIRECTDRAWCLIPPER iface,
REFIID id, LPVOID *obj)
{
if(!iface)
return DDERR_INVALIDOBJECT;
return E_NOINTERFACE;
}
HRESULT WINAPI
DirectDrawClipper_Initialize (LPDIRECTDRAWCLIPPER iface,
LPDIRECTDRAW lpDD, DWORD dwFlags)
{
LPDDRAWI_DDRAWCLIPPER_INT This = (LPDDRAWI_DDRAWCLIPPER_INT)iface;
LPDDRAWI_DIRECTDRAW_INT DDraw = (LPDDRAWI_DIRECTDRAW_INT)lpDD;
DX_WINDBG_trace();
if(!This)
return DDERR_INVALIDOBJECT;
if(This->dwIntRefCnt)
return DDERR_ALREADYINITIALIZED;
This->lpVtbl = (LPVOID)&DirectDrawClipper_Vtable;
This->dwIntRefCnt = 1;
DxHeapMemAlloc(This->lpLcl, sizeof(DDRAWI_DDRAWCLIPPER_LCL));
//This->lpLcl->lpClipMore
This->lpLcl->lpDD_int = DDraw;
This->lpLcl->lpGbl->dwRefCnt = 1;
This->lpLcl->pAddrefedThisOwner = (IUnknown*)DDraw;
// FIXME: Implement Linking and share global object
DxHeapMemAlloc(This->lpLcl->lpGbl, sizeof(DDRAWI_DDRAWCLIPPER_GBL));
This->lpLcl->lpGbl->dwProcessId = GetCurrentProcessId();
return DD_OK;
}
ULONG WINAPI
DirectDrawClipper_Release(LPDIRECTDRAWCLIPPER iface)
{
LPDDRAWI_DDRAWCLIPPER_INT This = (LPDDRAWI_DDRAWCLIPPER_INT)iface;
if(!This)
return DDERR_INVALIDOBJECT;
DX_WINDBG_trace();
if (iface!=NULL)
{
This->lpLcl->dwLocalRefCnt--;
This->dwIntRefCnt--;
if (This->lpLcl->lpGbl)
This->lpLcl->lpGbl->dwRefCnt--;
}
return This->dwIntRefCnt;
}
ULONG WINAPI
DirectDrawClipper_AddRef (LPDIRECTDRAWCLIPPER iface)
{
LPDDRAWI_DDRAWCLIPPER_INT This = (LPDDRAWI_DDRAWCLIPPER_INT)iface;
if(!This)
return DDERR_INVALIDOBJECT;
DX_WINDBG_trace();
if (iface!=NULL)
{
This->dwIntRefCnt++;
This->lpLcl->dwLocalRefCnt++;
if (This->lpLcl->lpGbl)
This->lpLcl->lpGbl->dwRefCnt++;
}
return This->dwIntRefCnt;
}
HRESULT WINAPI
DirectDrawClipper_SetHwnd( LPDIRECTDRAWCLIPPER iface,
DWORD dwFlags,
HWND hWnd)
{
LPDDRAWI_DDRAWCLIPPER_INT This = (LPDDRAWI_DDRAWCLIPPER_INT)iface;
if(!This)
return DDERR_INVALIDOBJECT;
if(!IsWindow(hWnd))
return DDERR_INVALIDPARAMS;
// TODO: check flags
This->lpLcl->lpGbl->hWnd = (ULONG_PTR)hWnd;
This->lpLcl->lpGbl->dwFlags = dwFlags;
return DD_OK;
}
HRESULT WINAPI
DirectDrawClipper_GetHWnd( LPDIRECTDRAWCLIPPER iface,
HWND* hWndPtr)
{
LPDDRAWI_DDRAWCLIPPER_INT This = (LPDDRAWI_DDRAWCLIPPER_INT)iface;
if(!This)
return DDERR_INVALIDOBJECT;
if(!hWndPtr)
return DDERR_INVALIDPARAMS;
*hWndPtr = (HWND)This->lpLcl->lpGbl->hWnd;
return DD_OK;
}
IDirectDrawClipperVtbl DirectDrawClipper_Vtable =
{
DirectDrawClipper_QueryInterface,
DirectDrawClipper_AddRef,
DirectDrawClipper_Release,
DirectDrawClipper_GetClipList,
DirectDrawClipper_GetHWnd,
DirectDrawClipper_Initialize,
DirectDrawClipper_IsClipListChanged,
DirectDrawClipper_SetClipList,
DirectDrawClipper_SetHwnd
};