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;