Implement some COM-related functions.
Modified: trunk/reactos/lib/ddraw/main/clipper.c
Modified: trunk/reactos/lib/ddraw/main/color.c
Modified: trunk/reactos/lib/ddraw/main/ddraw.c
Modified: trunk/reactos/lib/ddraw/main/gamma.c
Modified: trunk/reactos/lib/ddraw/main/palette.c
Modified: trunk/reactos/lib/ddraw/main.c

Modified: trunk/reactos/lib/ddraw/main/clipper.c
--- trunk/reactos/lib/ddraw/main/clipper.c	2005-10-24 23:46:55 UTC (rev 18766)
+++ trunk/reactos/lib/ddraw/main/clipper.c	2005-10-25 14:03:20 UTC (rev 18767)
@@ -11,14 +11,34 @@
 #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 @@
    	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) 
 {

Modified: trunk/reactos/lib/ddraw/main/color.c
--- trunk/reactos/lib/ddraw/main/color.c	2005-10-24 23:46:55 UTC (rev 18766)
+++ trunk/reactos/lib/ddraw/main/color.c	2005-10-25 14:03:20 UTC (rev 18767)
@@ -10,22 +10,31 @@
 
 #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;
 }
 

Modified: trunk/reactos/lib/ddraw/main/ddraw.c
--- trunk/reactos/lib/ddraw/main/ddraw.c	2005-10-24 23:46:55 UTC (rev 18766)
+++ trunk/reactos/lib/ddraw/main/ddraw.c	2005-10-25 14:03:20 UTC (rev 18767)
@@ -125,33 +125,6 @@
 	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,24 +181,91 @@
     return S_OK;
 }
 
-/**** Stubs ****/
+HRESULT WINAPI Main_DirectDraw_CreateSurface (LPDIRECTDRAW7 iface, LPDDSURFACEDESC2 pDDSD,
+											LPDIRECTDRAWSURFACE7 *ppSurf, IUnknown *pUnkOuter) 
+{
+    if (pUnkOuter!=NULL) 
+		return DDERR_INVALIDPARAMS; 
 
-HRESULT WINAPI Main_DirectDraw_Compact(LPDIRECTDRAW7 iface) 
-{
-   	DX_STUB;
+	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);
 }
+
+// This function is exported by the dll
+HRESULT WINAPI DirectDrawCreateClipper (DWORD dwFlags, 
+										LPDIRECTDRAWCLIPPER* lplpDDClipper, LPUNKNOWN pUnkOuter)
+{
+    return Main_DirectDraw_CreateClipper(NULL, dwFlags, lplpDDClipper, pUnkOuter);
+}
+
 HRESULT WINAPI Main_DirectDraw_CreatePalette(LPDIRECTDRAW7 iface, DWORD dwFlags,
-			      LPPALETTEENTRY palent,LPDIRECTDRAWPALETTE* ppPalette,LPUNKNOWN pUnknown)
+			      LPPALETTEENTRY palent, LPDIRECTDRAWPALETTE* ppPalette, LPUNKNOWN pUnkOuter)
 {
-	DX_STUB;
+    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,
 				 LPDIRECTDRAWSURFACE7* dst) 
 {

Modified: trunk/reactos/lib/ddraw/main/gamma.c
--- trunk/reactos/lib/ddraw/main/gamma.c	2005-10-24 23:46:55 UTC (rev 18766)
+++ trunk/reactos/lib/ddraw/main/gamma.c	2005-10-25 14:03:20 UTC (rev 18767)
@@ -10,23 +10,31 @@
 
 #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;
 }
 

Modified: trunk/reactos/lib/ddraw/main/palette.c
--- trunk/reactos/lib/ddraw/main/palette.c	2005-10-24 23:46:55 UTC (rev 18766)
+++ trunk/reactos/lib/ddraw/main/palette.c	2005-10-25 14:03:20 UTC (rev 18767)
@@ -10,42 +10,49 @@
 
 #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_GetEntries(LPDIRECTDRAWPALETTE iface, DWORD dwFlags,
-				  DWORD dwStart, DWORD dwCount,
+Main_DirectDrawPalette_Initialize(LPDIRECTDRAWPALETTE iface,
+				  LPDIRECTDRAW ddraw, DWORD dwFlags,
 				  LPPALETTEENTRY palent)
 {
-    DX_STUB;
+    return DD_OK;
 }
 
 HRESULT WINAPI
-Main_DirectDrawPalette_SetEntries(LPDIRECTDRAWPALETTE iface, DWORD dwFlags,
+Main_DirectDrawPalette_GetEntries(LPDIRECTDRAWPALETTE iface, DWORD dwFlags,
 				  DWORD dwStart, DWORD dwCount,
 				  LPPALETTEENTRY palent)
 {
     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,
+Main_DirectDrawPalette_SetEntries(LPDIRECTDRAWPALETTE iface, DWORD dwFlags,
+				  DWORD dwStart, DWORD dwCount,
 				  LPPALETTEENTRY palent)
 {
     DX_STUB;
 }
-
 HRESULT WINAPI
 Main_DirectDrawPalette_GetCaps(LPDIRECTDRAWPALETTE iface, LPDWORD lpdwCaps)
 {

Modified: trunk/reactos/lib/ddraw/main.c
--- trunk/reactos/lib/ddraw/main.c	2005-10-24 23:46:55 UTC (rev 18766)
+++ trunk/reactos/lib/ddraw/main.c	2005-10-25 14:03:20 UTC (rev 18767)
@@ -101,11 +101,3 @@
      DX_STUB;
 }
  
-HRESULT WINAPI DirectDrawCreateClipper(
-  DWORD dwFlags, 
-  LPDIRECTDRAWCLIPPER* lplpDDClipper, 
-  LPUNKNOWN pUnkOuter
-)
-{
-     DX_STUB;
-}