diff --git a/reactos/dll/directx/ddraw/Clipper/clipper.h b/reactos/dll/directx/ddraw/Clipper/clipper.h
new file mode 100644
index 00000000000..c19f72b19dd
--- /dev/null
+++ b/reactos/dll/directx/ddraw/Clipper/clipper.h
@@ -0,0 +1,10 @@
+HRESULT WINAPI DirectDrawClipper_QueryInterface (LPDIRECTDRAWCLIPPER, REFIID, LPVOID*);
+ULONG WINAPI DirectDrawClipper_Release(LPDIRECTDRAWCLIPPER);
+ULONG WINAPI DirectDrawClipper_AddRef (LPDIRECTDRAWCLIPPER);
+HRESULT WINAPI DirectDrawClipper_Initialize(LPDIRECTDRAWCLIPPER, LPDIRECTDRAW, DWORD);
+HRESULT WINAPI DirectDrawClipper_SetHwnd( LPDIRECTDRAWCLIPPER, DWORD, HWND);
+HRESULT WINAPI DirectDrawClipper_GetClipList(LPDIRECTDRAWCLIPPER, LPRECT, LPRGNDATA,LPDWORD);
+HRESULT WINAPI DirectDrawClipper_SetClipList(LPDIRECTDRAWCLIPPER,LPRGNDATA,DWORD);
+HRESULT WINAPI DirectDrawClipper_QueryInterface(LPDIRECTDRAWCLIPPER, REFIID, LPVOID*);
+HRESULT WINAPI DirectDrawClipper_GetHWnd(LPDIRECTDRAWCLIPPER, HWND*);
+HRESULT WINAPI DirectDrawClipper_IsClipListChanged(LPDIRECTDRAWCLIPPER, BOOL* lpbChanged);
diff --git a/reactos/dll/directx/ddraw/Clipper/clipper_main.c b/reactos/dll/directx/ddraw/Clipper/clipper_main.c
new file mode 100644
index 00000000000..0779c206d57
--- /dev/null
+++ b/reactos/dll/directx/ddraw/Clipper/clipper_main.c
@@ -0,0 +1,143 @@
+/* $Id$
+ *
+ * COPYRIGHT: See COPYING in the top level directory
+ * PROJECT: ReactOS DirectX
+ * FILE: ddraw/clipper/clipper_stubs.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(LPDDRAWI_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(LPDDRAWI_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
+};
diff --git a/reactos/dll/directx/ddraw/Clipper/clipper_stubs.c b/reactos/dll/directx/ddraw/Clipper/clipper_stubs.c
index 98e94c87afe..758971230bb 100644
--- a/reactos/dll/directx/ddraw/Clipper/clipper_stubs.c
+++ b/reactos/dll/directx/ddraw/Clipper/clipper_stubs.c
@@ -10,43 +10,6 @@
#include "rosdraw.h"
-
-ULONG WINAPI
-DirectDrawClipper_Release(LPDIRECTDRAWCLIPPER iface)
-{
- DX_WINDBG_trace();
-
- DX_STUB;
-}
-
-ULONG WINAPI
-DirectDrawClipper_AddRef (LPDIRECTDRAWCLIPPER iface)
-{
- DX_WINDBG_trace();
-
- DX_STUB;
-}
-
-HRESULT WINAPI
-DirectDrawClipper_Initialize( LPDIRECTDRAWCLIPPER iface,
- LPDIRECTDRAW lpDD,
- DWORD dwFlags)
-{
- /* FIXME not implment */
- DX_WINDBG_trace();
- DX_STUB_DD_OK;
-}
-
-HRESULT WINAPI
-DirectDrawClipper_SetHwnd( LPDIRECTDRAWCLIPPER iface,
- DWORD dwFlags,
- HWND hWnd)
-{
- /* FIXME not implment */
- DX_WINDBG_trace();
- DX_STUB_DD_OK;
-}
-
HRESULT WINAPI
DirectDrawClipper_GetClipList( LPDIRECTDRAWCLIPPER iface,
LPRECT lpRect,
@@ -66,23 +29,6 @@ DirectDrawClipper_SetClipList( LPDIRECTDRAWCLIPPER iface,
DX_STUB;
}
-HRESULT WINAPI
-DirectDrawClipper_QueryInterface( LPDIRECTDRAWCLIPPER iface,
- REFIID riid,
- LPVOID* ppvObj)
-{
- DX_WINDBG_trace();
- DX_STUB;
-}
-
-HRESULT WINAPI
-DirectDrawClipper_GetHWnd( LPDIRECTDRAWCLIPPER iface,
- HWND* hWndPtr)
-{
- DX_WINDBG_trace();
- DX_STUB;
-}
-
HRESULT WINAPI
DirectDrawClipper_IsClipListChanged( LPDIRECTDRAWCLIPPER iface,
BOOL* lpbChanged)
@@ -90,16 +36,3 @@ DirectDrawClipper_IsClipListChanged( LPDIRECTDRAWCLIPPER iface,
DX_WINDBG_trace();
DX_STUB;
}
-
-IDirectDrawClipperVtbl DirectDrawClipper_Vtable =
-{
- DirectDrawClipper_QueryInterface,
- DirectDrawClipper_AddRef,
- DirectDrawClipper_Release,
- DirectDrawClipper_GetClipList,
- DirectDrawClipper_GetHWnd,
- DirectDrawClipper_Initialize,
- DirectDrawClipper_IsClipListChanged,
- DirectDrawClipper_SetClipList,
- DirectDrawClipper_SetHwnd
-};
diff --git a/reactos/dll/directx/ddraw/Ddraw/ddraw_stubs.c b/reactos/dll/directx/ddraw/Ddraw/ddraw_stubs.c
index 3d55779c985..d2bea45cbb5 100644
--- a/reactos/dll/directx/ddraw/Ddraw/ddraw_stubs.c
+++ b/reactos/dll/directx/ddraw/Ddraw/ddraw_stubs.c
@@ -57,9 +57,6 @@ Main_DirectDraw_FlipToGDISurface(LPDIRECTDRAW7 iface)
DX_STUB;
}
-/*
- * Status: Implentation removed due to rewrite
- */
HRESULT WINAPI
Main_DirectDraw_GetCaps(LPDIRECTDRAW7 iface, LPDDCAPS pDriverCaps,
LPDDCAPS pHELCaps)
diff --git a/reactos/dll/directx/ddraw/Surface/surface_main.c b/reactos/dll/directx/ddraw/Surface/surface_main.c
index 1102de29b6b..6c402d8f9f5 100644
--- a/reactos/dll/directx/ddraw/Surface/surface_main.c
+++ b/reactos/dll/directx/ddraw/Surface/surface_main.c
@@ -354,6 +354,65 @@ Main_DDrawSurface_GetCaps(LPDIRECTDRAWSURFACE7 iface, LPDDSCAPS2 pCaps)
return DD_OK;
}
+HRESULT WINAPI
+Main_DDrawSurface_GetClipper(LPDIRECTDRAWSURFACE7 iface,
+ LPDIRECTDRAWCLIPPER* ppClipper)
+{
+ LPDDRAWI_DDRAWSURFACE_INT This = (LPDDRAWI_DDRAWSURFACE_INT)iface;
+
+ DX_WINDBG_trace();
+
+ if (This == NULL)
+ {
+ return DDERR_INVALIDOBJECT;
+ }
+
+ if (ppClipper == NULL)
+ {
+ return DDERR_INVALIDPARAMS;
+ }
+
+ if (This->lpLcl->lp16DDClipper == NULL)
+ {
+ return DDERR_NOCLIPPERATTACHED;
+ }
+
+ *ppClipper = (LPDIRECTDRAWCLIPPER)This->lpLcl->lp16DDClipper;
+
+ return DD_OK;
+}
+
+HRESULT WINAPI
+Main_DDrawSurface_SetClipper (LPDIRECTDRAWSURFACE7 iface,
+ LPDIRECTDRAWCLIPPER pDDClipper)
+{
+ LPDDRAWI_DDRAWSURFACE_INT This = (LPDDRAWI_DDRAWSURFACE_INT)iface;
+
+ DX_WINDBG_trace();
+
+ if (This == NULL)
+ {
+ return DDERR_INVALIDOBJECT;
+ }
+
+ if(pDDClipper == NULL)
+ {
+ if(!This->lpLcl->lp16DDClipper)
+ return DDERR_NOCLIPPERATTACHED;
+
+ DirectDrawClipper_Release((LPDIRECTDRAWCLIPPER)This->lpLcl->lp16DDClipper);
+ This->lpLcl->lp16DDClipper = NULL;
+ return DD_OK;
+ }
+
+ // FIXME: Check Surface type and return DDERR_INVALIDSURFACETYPE
+
+ DirectDrawClipper_AddRef((LPDIRECTDRAWCLIPPER)pDDClipper);
+ This->lpLcl->lp16DDClipper = (LPDDRAWI_DDRAWCLIPPER_INT)pDDClipper;
+
+ return DD_OK;
+}
+
HRESULT WINAPI
Main_DDrawSurface_GetDC(LPDIRECTDRAWSURFACE7 iface, HDC *phDC)
{
diff --git a/reactos/dll/directx/ddraw/Surface/surface_stubs.c b/reactos/dll/directx/ddraw/Surface/surface_stubs.c
index 094667cc086..912c5bf7efb 100644
--- a/reactos/dll/directx/ddraw/Surface/surface_stubs.c
+++ b/reactos/dll/directx/ddraw/Surface/surface_stubs.c
@@ -115,15 +115,6 @@ Main_DDrawSurface_FreePrivateData(LPDIRECTDRAWSURFACE7 iface, REFGUID tag)
DX_STUB;
}
-
-HRESULT WINAPI
-Main_DDrawSurface_GetClipper(LPDIRECTDRAWSURFACE7 iface,
- LPDIRECTDRAWCLIPPER* ppClipper)
-{
-
- DX_STUB;
-}
-
HRESULT WINAPI
Main_DDrawSurface_GetColorKey(LPDIRECTDRAWSURFACE7 iface, DWORD dwFlags,
LPDDCOLORKEY pCKey)
@@ -229,17 +220,6 @@ Main_DDrawSurface_PageUnlock(LPDIRECTDRAWSURFACE7 iface, DWORD dwFlags)
DX_STUB;
}
-
-HRESULT WINAPI
-Main_DDrawSurface_SetClipper (LPDIRECTDRAWSURFACE7 iface,
- LPDIRECTDRAWCLIPPER pDDClipper)
-{
- DX_WINDBG_trace();
-
- DX_STUB;
-}
-
-
HRESULT WINAPI
Main_DDrawSurface_SetPalette (LPDIRECTDRAWSURFACE7 iface,
LPDIRECTDRAWPALETTE pPalette)
diff --git a/reactos/dll/directx/ddraw/ddraw.rbuild b/reactos/dll/directx/ddraw/ddraw.rbuild
index ecd4f0bf0f9..d271369ba0b 100644
--- a/reactos/dll/directx/ddraw/ddraw.rbuild
+++ b/reactos/dll/directx/ddraw/ddraw.rbuild
@@ -37,7 +37,8 @@
createsurface.c
- clipper_stubs.c
+ clipper_stubs.c
+ clipper_main.c
color_stubs.c
diff --git a/reactos/dll/directx/ddraw/rosdraw.h b/reactos/dll/directx/ddraw/rosdraw.h
index 40742f6c612..5a3dfe71a37 100644
--- a/reactos/dll/directx/ddraw/rosdraw.h
+++ b/reactos/dll/directx/ddraw/rosdraw.h
@@ -11,6 +11,7 @@
#include "Ddraw/ddraw.h"
#include "Surface/surface.h"
+#include "Clipper/clipper.h"
/* DirectDraw startup code only internal use */
extern DDRAWI_DIRECTDRAW_GBL ddgbl;
diff --git a/reactos/dll/directx/ddraw/startup.c b/reactos/dll/directx/ddraw/startup.c
index 4438c05c03b..b717a27ea4f 100644
--- a/reactos/dll/directx/ddraw/startup.c
+++ b/reactos/dll/directx/ddraw/startup.c
@@ -8,9 +8,7 @@
*
*/
-#include
#include "rosdraw.h"
-#include "d3dhal.h"
#include "ddrawgdi.h"
DDRAWI_DIRECTDRAW_GBL ddgbl;
@@ -555,9 +553,8 @@ StartDirectDrawHal(LPDIRECTDRAW iface, BOOL reenable)
memcpy(&ddgbl.ddCaps, &mHALInfo.ddCaps,sizeof(DDCORECAPS));
- This->lpLcl->lpGbl->dwNumFourCC = mHALInfo.ddCaps.dwNumFourCCCodes;
- This->lpLcl->lpGbl->lpdwFourCC = mpFourCC;
-
+ This->lpLcl->lpGbl->dwNumFourCC = mHALInfo.ddCaps.dwNumFourCCCodes;
+ This->lpLcl->lpGbl->lpdwFourCC = mpFourCC;
This->lpLcl->lpGbl->dwMonitorFrequency = mHALInfo.dwMonitorFrequency;
This->lpLcl->lpGbl->dwModeIndex = mHALInfo.dwModeIndex;
This->lpLcl->lpGbl->dwNumModes = mHALInfo.dwNumModes;