From 441ebe91cd18ce9f49aedc04417e11f162f0fce8 Mon Sep 17 00:00:00 2001 From: Maarten Bosma Date: Tue, 25 Oct 2005 14:03:20 +0000 Subject: [PATCH] Implement some COM-related functions. svn path=/trunk/; revision=18767 --- reactos/lib/ddraw/main.c | 8 --- reactos/lib/ddraw/main/clipper.c | 39 ++++++----- reactos/lib/ddraw/main/color.c | 25 ++++--- reactos/lib/ddraw/main/ddraw.c | 110 +++++++++++++++++++++---------- reactos/lib/ddraw/main/gamma.c | 26 +++++--- reactos/lib/ddraw/main/palette.c | 47 +++++++------ 6 files changed, 160 insertions(+), 95 deletions(-) diff --git a/reactos/lib/ddraw/main.c b/reactos/lib/ddraw/main.c index c4b236f62a1..3ed037fd2ba 100644 --- a/reactos/lib/ddraw/main.c +++ b/reactos/lib/ddraw/main.c @@ -101,11 +101,3 @@ HRESULT WINAPI DirectDrawEnumerateExW( DX_STUB; } -HRESULT WINAPI DirectDrawCreateClipper( - DWORD dwFlags, - LPDIRECTDRAWCLIPPER* lplpDDClipper, - LPUNKNOWN pUnkOuter -) -{ - DX_STUB; -} diff --git a/reactos/lib/ddraw/main/clipper.c b/reactos/lib/ddraw/main/clipper.c index 1a278d40355..f4de6de11fc 100644 --- a/reactos/lib/ddraw/main/clipper.c +++ b/reactos/lib/ddraw/main/clipper.c @@ -11,13 +11,33 @@ #include "rosdraw.h" -HRESULT WINAPI Main_DirectDrawClipper_SetHwnd( - LPDIRECTDRAWCLIPPER iface, DWORD dwFlags, HWND hWnd) +ULONG WINAPI Main_DirectDrawClipper_Release(LPDIRECTDRAWCLIPPER iface) { - DX_STUB; + IDirectDrawSurfaceImpl* This = (IDirectDrawSurfaceImpl*)iface; + ULONG ref = InterlockedDecrement(&This->ref); + + if (ref == 0) + HeapFree(GetProcessHeap(), 0, This); + + return ref; } -ULONG WINAPI Main_DirectDrawClipper_Release(LPDIRECTDRAWCLIPPER iface) +ULONG WINAPI Main_DirectDrawClipper_AddRef (LPDIRECTDRAWCLIPPER iface) +{ + IDirectDrawImpl* This = (IDirectDrawImpl*)iface; + ULONG ref = InterlockedIncrement((PLONG)&This->DirectDrawGlobal.dwRefCnt); + + return ref; +} + +HRESULT WINAPI Main_DirectDrawClipper_Initialize( + LPDIRECTDRAWCLIPPER iface, LPDIRECTDRAW lpDD, DWORD dwFlags) +{ + return DD_OK; +} + +HRESULT WINAPI Main_DirectDrawClipper_SetHwnd( + LPDIRECTDRAWCLIPPER iface, DWORD dwFlags, HWND hWnd) { DX_STUB; } @@ -41,23 +61,12 @@ HRESULT WINAPI Main_DirectDrawClipper_QueryInterface( DX_STUB; } -ULONG WINAPI Main_DirectDrawClipper_AddRef (LPDIRECTDRAWCLIPPER iface) -{ - DX_STUB; -} - HRESULT WINAPI Main_DirectDrawClipper_GetHWnd( LPDIRECTDRAWCLIPPER iface, HWND* hWndPtr) { DX_STUB; } -HRESULT WINAPI Main_DirectDrawClipper_Initialize( - LPDIRECTDRAWCLIPPER iface, LPDIRECTDRAW lpDD, DWORD dwFlags) -{ - DX_STUB; -} - HRESULT WINAPI Main_DirectDrawClipper_IsClipListChanged( LPDIRECTDRAWCLIPPER iface, BOOL* lpbChanged) { diff --git a/reactos/lib/ddraw/main/color.c b/reactos/lib/ddraw/main/color.c index 9e362478db6..e544af90025 100644 --- a/reactos/lib/ddraw/main/color.c +++ b/reactos/lib/ddraw/main/color.c @@ -10,21 +10,30 @@ #include "rosdraw.h" -HRESULT WINAPI -Main_DirectDrawColorControl_QueryInterface(LPDIRECTDRAWCOLORCONTROL iface, - REFIID riid, LPVOID* ppvObj) -{ - DX_STUB; -} - ULONG WINAPI Main_DirectDrawColorControl_AddRef(LPDIRECTDRAWCOLORCONTROL iface) { - DX_STUB; + IDirectDrawImpl* This = (IDirectDrawImpl*)iface; + ULONG ref = InterlockedIncrement((PLONG)&This->DirectDrawGlobal.dwRefCnt); + + return ref; } ULONG WINAPI Main_DirectDrawColorControl_Release(LPDIRECTDRAWCOLORCONTROL iface) +{ + IDirectDrawSurfaceImpl* This = (IDirectDrawSurfaceImpl*)iface; + ULONG ref = InterlockedDecrement(&This->ref); + + if (ref == 0) + HeapFree(GetProcessHeap(), 0, This); + + return ref; +} + +HRESULT WINAPI +Main_DirectDrawColorControl_QueryInterface(LPDIRECTDRAWCOLORCONTROL iface, + REFIID riid, LPVOID* ppvObj) { DX_STUB; } diff --git a/reactos/lib/ddraw/main/ddraw.c b/reactos/lib/ddraw/main/ddraw.c index ccdeab9b7c7..db4a4a15d96 100644 --- a/reactos/lib/ddraw/main/ddraw.c +++ b/reactos/lib/ddraw/main/ddraw.c @@ -125,33 +125,6 @@ HRESULT WINAPI Main_DirectDraw_SetDisplayMode (LPDIRECTDRAW7 iface, DWORD dwWidt return DD_OK; } -HRESULT WINAPI Main_DirectDraw_CreateSurface (LPDIRECTDRAW7 iface, LPDDSURFACEDESC2 pDDSD, - LPDIRECTDRAWSURFACE7 *ppSurf, IUnknown *pUnkOuter) -{ - if (pUnkOuter!=NULL) - return DDERR_INVALIDPARAMS; - - if(sizeof(DDSURFACEDESC2)!=pDDSD->dwSize) - return DDERR_UNSUPPORTED; - - // the nasty com stuff - IDirectDrawSurfaceImpl* That; - - That = (IDirectDrawSurfaceImpl*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectDrawSurfaceImpl)); - - if (That == NULL) - return E_OUTOFMEMORY; - - That->lpVtbl = &DirectDrawSurface7_Vtable; - That->lpVtbl_v3 = &DDRAW_IDDS3_Thunk_VTable; - - That->ref = 1; - *ppSurf = (LPDIRECTDRAWSURFACE7)That; - - // the real surface object creation - return That->lpVtbl->Initialize (*ppSurf, (LPDIRECTDRAW)iface, pDDSD); -} - ULONG WINAPI Main_DirectDraw_AddRef (LPDIRECTDRAW7 iface) { IDirectDrawImpl* This = (IDirectDrawImpl*)iface; @@ -208,22 +181,89 @@ HRESULT WINAPI Main_DirectDraw_QueryInterface ( return S_OK; } -/**** Stubs ****/ - -HRESULT WINAPI Main_DirectDraw_Compact(LPDIRECTDRAW7 iface) +HRESULT WINAPI Main_DirectDraw_CreateSurface (LPDIRECTDRAW7 iface, LPDDSURFACEDESC2 pDDSD, + LPDIRECTDRAWSURFACE7 *ppSurf, IUnknown *pUnkOuter) { - DX_STUB; + if (pUnkOuter!=NULL) + return DDERR_INVALIDPARAMS; + + if(sizeof(DDSURFACEDESC2)!=pDDSD->dwSize) + return DDERR_UNSUPPORTED; + + // the nasty com stuff + IDirectDrawSurfaceImpl* That; + + That = (IDirectDrawSurfaceImpl*)HeapAlloc(GetProcessHeap(), 0, sizeof(IDirectDrawSurfaceImpl)); + + if (That == NULL) + return E_OUTOFMEMORY; + + ZeroMemory(That, sizeof(IDirectDrawSurfaceImpl)); + + That->lpVtbl = &DirectDrawSurface7_Vtable; + That->lpVtbl_v3 = &DDRAW_IDDS3_Thunk_VTable; + That->ref = 1; + + *ppSurf = (LPDIRECTDRAWSURFACE7)That; + + // the real surface object creation + return That->lpVtbl->Initialize (*ppSurf, (LPDIRECTDRAW)iface, pDDSD); } HRESULT WINAPI Main_DirectDraw_CreateClipper(LPDIRECTDRAW7 iface, DWORD dwFlags, LPDIRECTDRAWCLIPPER *ppClipper, IUnknown *pUnkOuter) { - DX_STUB; + if (pUnkOuter!=NULL) + return DDERR_INVALIDPARAMS; + + IDirectDrawClipperImpl* That; + That = (IDirectDrawClipperImpl*)HeapAlloc(GetProcessHeap(), 0, sizeof(IDirectDrawClipperImpl)); + + if (That == NULL) + return E_OUTOFMEMORY; + + ZeroMemory(That, sizeof(IDirectDrawClipperImpl)); + + That->lpVtbl = &DirectDrawClipper_Vtable; + That->ref = 1; + *ppClipper = (LPDIRECTDRAWCLIPPER)That; + + return That->lpVtbl->Initialize (*ppClipper, (LPDIRECTDRAW)iface, dwFlags); } -HRESULT WINAPI Main_DirectDraw_CreatePalette(LPDIRECTDRAW7 iface, DWORD dwFlags, - LPPALETTEENTRY palent,LPDIRECTDRAWPALETTE* ppPalette,LPUNKNOWN pUnknown) + +// This function is exported by the dll +HRESULT WINAPI DirectDrawCreateClipper (DWORD dwFlags, + LPDIRECTDRAWCLIPPER* lplpDDClipper, LPUNKNOWN pUnkOuter) { - DX_STUB; + return Main_DirectDraw_CreateClipper(NULL, dwFlags, lplpDDClipper, pUnkOuter); +} + +HRESULT WINAPI Main_DirectDraw_CreatePalette(LPDIRECTDRAW7 iface, DWORD dwFlags, + LPPALETTEENTRY palent, LPDIRECTDRAWPALETTE* ppPalette, LPUNKNOWN pUnkOuter) +{ + if (pUnkOuter!=NULL) + return DDERR_INVALIDPARAMS; + + IDirectDrawPaletteImpl* That; + That = (IDirectDrawPaletteImpl*)HeapAlloc(GetProcessHeap(), 0, sizeof(IDirectDrawPaletteImpl)); + + if (That == NULL) + return E_OUTOFMEMORY; + + ZeroMemory(That, sizeof(IDirectDrawPaletteImpl)); + + That->lpVtbl = &DirectDrawPalette_Vtable; + That->ref = 1; + *ppPalette = (LPDIRECTDRAWPALETTE)That; + + return That->lpVtbl->Initialize (*ppPalette, (LPDIRECTDRAW)iface, dwFlags, palent); +} + +/**** Stubs ****/ + +HRESULT WINAPI Main_DirectDraw_Compact(LPDIRECTDRAW7 iface) +{ + DX_STUB; } HRESULT WINAPI Main_DirectDraw_DuplicateSurface(LPDIRECTDRAW7 iface, LPDIRECTDRAWSURFACE7 src, diff --git a/reactos/lib/ddraw/main/gamma.c b/reactos/lib/ddraw/main/gamma.c index 58dfc0dfe35..4ad1a3288ad 100644 --- a/reactos/lib/ddraw/main/gamma.c +++ b/reactos/lib/ddraw/main/gamma.c @@ -10,22 +10,30 @@ #include "rosdraw.h" - -HRESULT WINAPI -Main_DirectDrawGammaControl_QueryInterface(LPDIRECTDRAWGAMMACONTROL iface, REFIID riid, - LPVOID *ppObj) -{ - DX_STUB; -} - ULONG WINAPI Main_DirectDrawGammaControl_AddRef(LPDIRECTDRAWGAMMACONTROL iface) { - DX_STUB; + IDirectDrawImpl* This = (IDirectDrawImpl*)iface; + ULONG ref = InterlockedIncrement((PLONG)&This->DirectDrawGlobal.dwRefCnt); + + return ref; } ULONG WINAPI Main_DirectDrawGammaControl_Release(LPDIRECTDRAWGAMMACONTROL iface) +{ + IDirectDrawSurfaceImpl* This = (IDirectDrawSurfaceImpl*)iface; + ULONG ref = InterlockedDecrement(&This->ref); + + if (ref == 0) + HeapFree(GetProcessHeap(), 0, This); + + return ref; +} + +HRESULT WINAPI +Main_DirectDrawGammaControl_QueryInterface(LPDIRECTDRAWGAMMACONTROL iface, REFIID riid, + LPVOID *ppObj) { DX_STUB; } diff --git a/reactos/lib/ddraw/main/palette.c b/reactos/lib/ddraw/main/palette.c index e3ec8e575ad..7fa14f49621 100644 --- a/reactos/lib/ddraw/main/palette.c +++ b/reactos/lib/ddraw/main/palette.c @@ -10,6 +10,33 @@ #include "rosdraw.h" +ULONG WINAPI +Main_DirectDrawPalette_Release(LPDIRECTDRAWPALETTE iface) +{ + IDirectDrawImpl* This = (IDirectDrawImpl*)iface; + ULONG ref = InterlockedIncrement((PLONG)&This->DirectDrawGlobal.dwRefCnt); + + return ref; +} + +ULONG WINAPI Main_DirectDrawPalette_AddRef(LPDIRECTDRAWPALETTE iface) +{ + IDirectDrawSurfaceImpl* This = (IDirectDrawSurfaceImpl*)iface; + ULONG ref = InterlockedDecrement(&This->ref); + + if (ref == 0) + HeapFree(GetProcessHeap(), 0, This); + + return ref; +} + +HRESULT WINAPI +Main_DirectDrawPalette_Initialize(LPDIRECTDRAWPALETTE iface, + LPDIRECTDRAW ddraw, DWORD dwFlags, + LPPALETTEENTRY palent) +{ + return DD_OK; +} HRESULT WINAPI Main_DirectDrawPalette_GetEntries(LPDIRECTDRAWPALETTE iface, DWORD dwFlags, @@ -26,26 +53,6 @@ Main_DirectDrawPalette_SetEntries(LPDIRECTDRAWPALETTE iface, DWORD dwFlags, { DX_STUB; } - -ULONG WINAPI -Main_DirectDrawPalette_Release(LPDIRECTDRAWPALETTE iface) -{ - DX_STUB; -} - -ULONG WINAPI Main_DirectDrawPalette_AddRef(LPDIRECTDRAWPALETTE iface) -{ - DX_STUB; -} - -HRESULT WINAPI -Main_DirectDrawPalette_Initialize(LPDIRECTDRAWPALETTE iface, - LPDIRECTDRAW ddraw, DWORD dwFlags, - LPPALETTEENTRY palent) -{ - DX_STUB; -} - HRESULT WINAPI Main_DirectDrawPalette_GetCaps(LPDIRECTDRAWPALETTE iface, LPDWORD lpdwCaps) {