Synchronize with trunk's revision r57599.
[reactos.git] / dll / directx / ddraw / Clipper / clipper_main.c
1 /* $Id$
2 *
3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS DirectX
5 * FILE: ddraw/clipper/clipper_stubs.c
6 * PURPOSE: IDirectDrawClipper Implementation
7 * PROGRAMMER: Maarten Bosma
8 *
9 */
10
11 #include "rosdraw.h"
12
13 HRESULT WINAPI
14 DirectDrawClipper_QueryInterface (LPDIRECTDRAWCLIPPER iface,
15 REFIID id, LPVOID *obj)
16 {
17 if(!iface)
18 return DDERR_INVALIDOBJECT;
19
20 return E_NOINTERFACE;
21 }
22
23 HRESULT WINAPI
24 DirectDrawClipper_Initialize (LPDIRECTDRAWCLIPPER iface,
25 LPDIRECTDRAW lpDD, DWORD dwFlags)
26 {
27 LPDDRAWI_DDRAWCLIPPER_INT This = (LPDDRAWI_DDRAWCLIPPER_INT)iface;
28 LPDDRAWI_DIRECTDRAW_INT DDraw = (LPDDRAWI_DIRECTDRAW_INT)lpDD;
29
30 DX_WINDBG_trace();
31
32 if(!This)
33 return DDERR_INVALIDOBJECT;
34
35 if(This->dwIntRefCnt)
36 return DDERR_ALREADYINITIALIZED;
37
38 This->lpVtbl = (LPVOID)&DirectDrawClipper_Vtable;
39 This->dwIntRefCnt = 1;
40
41 DxHeapMemAlloc(This->lpLcl, sizeof(DDRAWI_DDRAWCLIPPER_LCL));
42 //This->lpLcl->lpClipMore
43 This->lpLcl->lpDD_int = DDraw;
44 This->lpLcl->lpGbl->dwRefCnt = 1;
45 This->lpLcl->pAddrefedThisOwner = (IUnknown*)DDraw;
46
47 // FIXME: Implement Linking and share global object
48 DxHeapMemAlloc(This->lpLcl->lpGbl, sizeof(DDRAWI_DDRAWCLIPPER_GBL));
49 This->lpLcl->lpGbl->dwProcessId = GetCurrentProcessId();
50
51 return DD_OK;
52 }
53
54 ULONG WINAPI
55 DirectDrawClipper_Release(LPDIRECTDRAWCLIPPER iface)
56 {
57 LPDDRAWI_DDRAWCLIPPER_INT This = (LPDDRAWI_DDRAWCLIPPER_INT)iface;
58 if(!This)
59 return DDERR_INVALIDOBJECT;
60
61 DX_WINDBG_trace();
62
63 if (iface!=NULL)
64 {
65 This->lpLcl->dwLocalRefCnt--;
66 This->dwIntRefCnt--;
67
68 if (This->lpLcl->lpGbl)
69 This->lpLcl->lpGbl->dwRefCnt--;
70 }
71
72 return This->dwIntRefCnt;
73 }
74
75 ULONG WINAPI
76 DirectDrawClipper_AddRef (LPDIRECTDRAWCLIPPER iface)
77 {
78 LPDDRAWI_DDRAWCLIPPER_INT This = (LPDDRAWI_DDRAWCLIPPER_INT)iface;
79 if(!This)
80 return DDERR_INVALIDOBJECT;
81
82 DX_WINDBG_trace();
83
84 if (iface!=NULL)
85 {
86 This->dwIntRefCnt++;
87 This->lpLcl->dwLocalRefCnt++;
88 if (This->lpLcl->lpGbl)
89 This->lpLcl->lpGbl->dwRefCnt++;
90 }
91 return This->dwIntRefCnt;
92 }
93
94 HRESULT WINAPI
95 DirectDrawClipper_SetHwnd( LPDIRECTDRAWCLIPPER iface,
96 DWORD dwFlags,
97 HWND hWnd)
98 {
99 LPDDRAWI_DDRAWCLIPPER_INT This = (LPDDRAWI_DDRAWCLIPPER_INT)iface;
100
101 if(!This)
102 return DDERR_INVALIDOBJECT;
103
104 if(!IsWindow(hWnd))
105 return DDERR_INVALIDPARAMS;
106
107 // TODO: check flags
108
109 This->lpLcl->lpGbl->hWnd = (ULONG_PTR)hWnd;
110 This->lpLcl->lpGbl->dwFlags = dwFlags;
111
112 return DD_OK;
113 }
114
115 HRESULT WINAPI
116 DirectDrawClipper_GetHWnd( LPDIRECTDRAWCLIPPER iface,
117 HWND* hWndPtr)
118 {
119 LPDDRAWI_DDRAWCLIPPER_INT This = (LPDDRAWI_DDRAWCLIPPER_INT)iface;
120
121 if(!This)
122 return DDERR_INVALIDOBJECT;
123
124 if(!hWndPtr)
125 return DDERR_INVALIDPARAMS;
126
127 *hWndPtr = (HWND)This->lpLcl->lpGbl->hWnd;
128
129 return DD_OK;
130 }
131
132 IDirectDrawClipperVtbl DirectDrawClipper_Vtable =
133 {
134 DirectDrawClipper_QueryInterface,
135 DirectDrawClipper_AddRef,
136 DirectDrawClipper_Release,
137 DirectDrawClipper_GetClipList,
138 DirectDrawClipper_GetHWnd,
139 DirectDrawClipper_Initialize,
140 DirectDrawClipper_IsClipListChanged,
141 DirectDrawClipper_SetClipList,
142 DirectDrawClipper_SetHwnd
143 };