Index: ddraw.rbuild
===================================================================
--- ddraw.rbuild (revision 43525)
+++ ddraw.rbuild (working copy)
@@ -9,7 +9,7 @@
d3d8thk
dxguid
ole32
- user32
+ uuid
advapi32
pseh
@@ -50,7 +50,8 @@
kernel_stubs.c
- palette_stubs.c
+ palette.c
+ createpalette.c
videoport_stubs.c
Index: Ddraw/callbacks_dd_hel.c
===================================================================
--- Ddraw/callbacks_dd_hel.c (revision 43525)
+++ Ddraw/callbacks_dd_hel.c (working copy)
@@ -75,9 +75,46 @@
DX_STUB;
}
-DWORD CALLBACK HelDdCreatePalette(LPDDHAL_CREATEPALETTEDATA lpCreatePalette)
+DWORD CALLBACK HelDdCreatePalette(LPDDHAL_CREATEPALETTEDATA lpCreatePalette)
{
- DX_STUB;
+ DDRAWI_DDRAWPALETTE_GBL* ddPalGbl = lpCreatePalette->lpDDPalette;
+ LOGPALETTE* logPal ;
+ WORD size=1;
+
+ if(ddPalGbl->dwFlags & DDRAWIPAL_2)
+ size = 2;
+ else if(ddPalGbl->dwFlags & DDRAWIPAL_4)
+ size = 4;
+ else if(ddPalGbl->dwFlags & DDRAWIPAL_16)
+ size = 16;
+ else if(ddPalGbl->dwFlags & DDRAWIPAL_256)
+ size = 256;
+
+ DxHeapMemAlloc(logPal, sizeof(LOGPALETTE) + size*sizeof(PALETTEENTRY));
+ if(logPal == NULL)
+ {
+ lpCreatePalette->ddRVal = DDERR_OUTOFMEMORY;
+ return DDHAL_DRIVER_HANDLED;
+ }
+
+ logPal->palVersion = 0x300;
+ logPal->palNumEntries = size;
+ CopyMemory(&logPal->palPalEntry[0], lpCreatePalette->lpColorTable, size*sizeof(PALETTEENTRY));
+
+ ddPalGbl->hHELGDIPalette = CreatePalette(logPal);
+
+ if (ddPalGbl->hHELGDIPalette == NULL)
+ {
+ DxHeapMemFree(logPal);
+ lpCreatePalette->ddRVal = DDERR_INVALIDOBJECT;
+ return DDHAL_DRIVER_HANDLED;
+ }
+
+ DxHeapMemFree(logPal);
+ ddPalGbl->lpColorTable = lpCreatePalette->lpColorTable;
+ ddPalGbl->dwFlags |= DDRAWIPAL_INHEL | DDRAWIPAL_GDI ;
+ lpCreatePalette->ddRVal = DD_OK;
+ return DDHAL_DRIVER_HANDLED;
}
DWORD CALLBACK HelDdGetScanLine(LPDDHAL_GETSCANLINEDATA lpGetScanLine)
Index: Ddraw/ddraw_main.c
===================================================================
--- Ddraw/ddraw_main.c (revision 43525)
+++ Ddraw/ddraw_main.c (working copy)
@@ -485,6 +485,9 @@
}
_SEH2_END;
+ if(*ppSurf != NULL)
+ Main_DirectDraw_AddRef(This);
+
LeaveCriticalSection(&ddcs);
return ret;
}
@@ -492,11 +495,36 @@
/* 5 of 31 DirectDraw7_Vtable api are working simluare to windows */
/* 8 of 31 DirectDraw7_Vtable api are under devloping / testing */
+HRESULT WINAPI Main_DirectDraw_CreatePalette(LPDDRAWI_DIRECTDRAW_INT This, DWORD dwFlags,
+ LPPALETTEENTRY palent, LPDIRECTDRAWPALETTE* ppPalette, LPUNKNOWN pUnkOuter)
+{
+ HRESULT ret = DD_OK;
+ DX_WINDBG_trace();
+ EnterCriticalSection(&ddcs);
+ *ppPalette = NULL;
+ _SEH2_TRY
+ {
+ ret = Internal_CreatePalette(This, dwFlags, palent, ppPalette, pUnkOuter);
+ }
+ _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+ {
+ ret = DDERR_INVALIDPARAMS;
+ }
+ _SEH2_END;
+ //Versions 7 and 4 are addref'ed
+ if((This->lpVtbl == &DirectDraw7_Vtable || This->lpVtbl == &DirectDraw4_Vtable) && *ppPalette != NULL)
+ Main_DirectDraw_AddRef(This) ;
+ LeaveCriticalSection(&ddcs);
+ return ret;
+}
+
+
+
Index: Ddraw/ddraw_stubs.c
===================================================================
--- Ddraw/ddraw_stubs.c (revision 43525)
+++ Ddraw/ddraw_stubs.c (working copy)
@@ -24,13 +24,6 @@
DX_STUB;
}
-HRESULT WINAPI Main_DirectDraw_CreatePalette(LPDDRAWI_DIRECTDRAW_INT This, DWORD dwFlags,
- LPPALETTEENTRY palent, LPDIRECTDRAWPALETTE* ppPalette, LPUNKNOWN pUnkOuter)
-{
- DX_WINDBG_trace();
- DX_STUB;
-}
-
HRESULT WINAPI Main_DirectDraw_DuplicateSurface(LPDDRAWI_DIRECTDRAW_INT This, LPDIRECTDRAWSURFACE7 src,
LPDIRECTDRAWSURFACE7* dst)
{
Index: Palette/palette.c
===================================================================
--- Palette/palette.c (revision 0)
+++ Palette/palette.c (revision 0)
@@ -0,0 +1,157 @@
+/* $Id: palette.c $
+ *
+ * COPYRIGHT: See COPYING in the top level directory
+ * PROJECT: ReactOS DirectX
+ * FILE: ddraw/Palette/palette.c
+ * PURPOSE: IDirectDrawPalette Implementation
+ * PROGRAMMER: Jérôme Gardou
+ *
+ */
+
+#include "rosdraw.h"
+
+/*****************************************************************************
+ * IDirectDrawPalette::QueryInterface
+ *
+ * A usual QueryInterface implementation. Can only Query IUnknown and
+ * IDirectDrawPalette
+ *
+ * Params:
+ * refiid: The interface id queried for
+ * obj: Address to return the interface pointer at
+ *
+ * Returns:
+ * S_OK on success
+ * E_NOINTERFACE if the requested interface wasn't found
+ *****************************************************************************/
+static HRESULT WINAPI
+DirectDrawPalette_QueryInterface(IDirectDrawPalette *iface,
+ REFIID refiid,
+ void **obj)
+{
+ if (IsEqualGUID(refiid, &IID_IUnknown)
+ || IsEqualGUID(refiid, &IID_IDirectDrawPalette))
+ {
+ *obj = iface;
+ IDirectDrawPalette_AddRef(iface);
+ return S_OK;
+ }
+ else
+ {
+ *obj = NULL;
+ return E_NOINTERFACE;
+ }
+}
+
+/*****************************************************************************
+ * IDirectDrawPaletteImpl::AddRef
+ *
+ * Increases the refcount.
+ *
+ * Returns:
+ * The new refcount
+ *
+ *****************************************************************************/
+static ULONG WINAPI
+DirectDrawPalette_AddRef(IDirectDrawPalette *iface)
+{
+ LPDDRAWI_DDRAWPALETTE_INT This = (LPDDRAWI_DDRAWPALETTE_INT)iface;
+ ULONG ref = 0;
+
+ _SEH2_TRY
+ {
+ ref = ++This->dwIntRefCnt;
+ }
+ _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+ {
+ }
+ _SEH2_END
+
+ return ref;
+}
+
+/*****************************************************************************
+ * IDirectDrawPaletteImpl::Release
+ *
+ * Reduces the refcount. If the refcount falls to 0, the object is destroyed
+ *
+ * Returns:
+ * The new refcount
+ *
+ *****************************************************************************/
+static ULONG WINAPI
+DirectDrawPalette_Release(IDirectDrawPalette *iface)
+{
+ LPDDRAWI_DDRAWPALETTE_INT This = (LPDDRAWI_DDRAWPALETTE_INT)iface;
+ ULONG ref = 0;
+
+ _SEH2_TRY
+ {
+ ref = --This->dwIntRefCnt;
+ if(ref == 0)
+ {
+ AcquireDDThreadLock();
+ if(((LPDDRAWI_DIRECTDRAW_INT)This->lpLcl->dwReserved1)->lpVtbl == &DirectDraw7_Vtable
+ || ((LPDDRAWI_DIRECTDRAW_INT)This->lpLcl->dwReserved1)->lpVtbl == &DirectDraw4_Vtable)
+ Main_DirectDraw_Release((LPDDRAWI_DIRECTDRAW_INT)This->lpLcl->dwReserved1) ;
+ DxHeapMemFree(This); //HUGE FIXME!!!
+ ReleaseDDThreadLock();
+ }
+ }
+ _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+ {
+ }
+ _SEH2_END
+
+ return ref;
+}
+
+static HRESULT WINAPI
+DirectDrawPalette_Initialize( LPDIRECTDRAWPALETTE iface,
+ LPDIRECTDRAW ddraw,
+ DWORD dwFlags,
+ LPPALETTEENTRY palent)
+{
+ DX_WINDBG_trace();
+ DX_STUB;
+}
+
+static HRESULT WINAPI
+DirectDrawPalette_GetEntries( LPDIRECTDRAWPALETTE iface,
+ DWORD dwFlags,
+ DWORD dwStart, DWORD dwCount,
+ LPPALETTEENTRY palent)
+{
+ DX_WINDBG_trace();
+ DX_STUB;
+}
+
+static HRESULT WINAPI
+DirectDrawPalette_SetEntries( LPDIRECTDRAWPALETTE iface,
+ DWORD dwFlags,
+ DWORD dwStart,
+ DWORD dwCount,
+ LPPALETTEENTRY palent)
+{
+ DX_WINDBG_trace();
+ DX_STUB;
+}
+
+static HRESULT WINAPI
+DirectDrawPalette_GetCaps( LPDIRECTDRAWPALETTE iface,
+ LPDWORD lpdwCaps)
+{
+ DX_WINDBG_trace();
+ DX_STUB;
+}
+
+const IDirectDrawPaletteVtbl DirectDrawPalette_Vtable =
+{
+ DirectDrawPalette_QueryInterface,
+ DirectDrawPalette_AddRef,
+ DirectDrawPalette_Release,
+ DirectDrawPalette_GetCaps,
+ DirectDrawPalette_GetEntries,
+ DirectDrawPalette_Initialize,
+ DirectDrawPalette_SetEntries
+};
Index: Palette/palette_stubs.c
===================================================================
--- Palette/palette_stubs.c (revision 43525)
+++ Palette/palette_stubs.c (working copy)
@@ -1,85 +0,0 @@
-/* $Id: palette.c 24690 2006-11-05 21:19:53Z greatlrd $
- *
- * COPYRIGHT: See COPYING in the top level directory
- * PROJECT: ReactOS DirectX
- * FILE: ddraw/palette/palette_stubs.c
- * PURPOSE: IDirectDrawPalette Implementation
- * PROGRAMMER: Maarten Bosma
- *
- */
-
-#include "rosdraw.h"
-
-ULONG WINAPI
-DirectDrawPalette_Release( LPDIRECTDRAWPALETTE iface)
-{
- DX_WINDBG_trace();
-
- DX_STUB;
-}
-
-ULONG WINAPI
-DirectDrawPalette_AddRef( LPDIRECTDRAWPALETTE iface)
-{
- DX_WINDBG_trace();
-
- DX_STUB;
-}
-
-HRESULT WINAPI
-DirectDrawPalette_Initialize( LPDIRECTDRAWPALETTE iface,
- LPDIRECTDRAW ddraw,
- DWORD dwFlags,
- LPPALETTEENTRY palent)
-{
- DX_WINDBG_trace();
- DX_STUB;
-}
-
-HRESULT WINAPI
-DirectDrawPalette_GetEntries( LPDIRECTDRAWPALETTE iface,
- DWORD dwFlags,
- DWORD dwStart, DWORD dwCount,
- LPPALETTEENTRY palent)
-{
- DX_WINDBG_trace();
- DX_STUB;
-}
-
-HRESULT WINAPI
-DirectDrawPalette_SetEntries( LPDIRECTDRAWPALETTE iface,
- DWORD dwFlags,
- DWORD dwStart,
- DWORD dwCount,
- LPPALETTEENTRY palent)
-{
- DX_WINDBG_trace();
- DX_STUB;
-}
-HRESULT WINAPI
-DirectDrawPalette_GetCaps( LPDIRECTDRAWPALETTE iface,
- LPDWORD lpdwCaps)
-{
- DX_WINDBG_trace();
- DX_STUB;
-}
-
-HRESULT WINAPI
-DirectDrawPalette_QueryInterface( LPDIRECTDRAWPALETTE iface,
- REFIID refiid,
- LPVOID *obj)
-{
- DX_WINDBG_trace();
- DX_STUB;
-}
-
-IDirectDrawPaletteVtbl DirectDrawPalette_Vtable =
-{
- DirectDrawPalette_QueryInterface,
- DirectDrawPalette_AddRef,
- DirectDrawPalette_Release,
- DirectDrawPalette_GetCaps,
- DirectDrawPalette_GetEntries,
- DirectDrawPalette_Initialize,
- DirectDrawPalette_SetEntries
-};
Index: rosdraw.h
===================================================================
--- rosdraw.h (revision 43525)
+++ rosdraw.h (working copy)
@@ -34,7 +34,7 @@
extern IDirectDrawSurface3Vtbl DirectDrawSurface3_Vtable;
extern IDirectDrawSurface2Vtbl DirectDrawSurface2_Vtable;
extern IDirectDrawSurfaceVtbl DirectDrawSurface_Vtable;
-extern IDirectDrawPaletteVtbl DirectDrawPalette_Vtable;
+extern const IDirectDrawPaletteVtbl DirectDrawPalette_Vtable;
extern IDirectDrawClipperVtbl DirectDrawClipper_Vtable;
extern IDirectDrawColorControlVtbl DirectDrawColorControl_Vtable;
extern IDirectDrawGammaControlVtbl DirectDrawGammaControl_Vtable;
@@ -93,6 +93,10 @@
LPDDRAWI_DDRAWSURFACE_INT *ppSurf,
IUnknown *pUnkOuter);
+HRESULT
+Internal_CreatePalette( LPDDRAWI_DIRECTDRAW_INT pDDraw, DWORD dwFlags,
+ LPPALETTEENTRY palent, LPDIRECTDRAWPALETTE* ppPalette, LPUNKNOWN pUnkOuter);
+
/* convert DDSURFACEDESC to DDSURFACEDESC2 */
void CopyDDSurfDescToDDSurfDesc2(LPDDSURFACEDESC2 dst_pDesc, LPDDSURFACEDESC src_pDesc);
Index: startup.c
===================================================================
--- startup.c (revision 43525)
+++ startup.c (working copy)
@@ -24,17 +24,29 @@
LPDDRAWI_DIRECTDRAW_INT This;
DX_WINDBG_trace();
+ BOOL linking = FALSE;
- if ((IsBadReadPtr(pIface,sizeof(LPDIRECTDRAW))) ||
- (IsBadWritePtr(pIface,sizeof(LPDIRECTDRAW))))
+ if (pIface == NULL)
{
return DDERR_INVALIDPARAMS;
}
This = (LPDDRAWI_DIRECTDRAW_INT)*pIface;
+ DX_STUB_str("Linking?\n")
+
+ _SEH2_TRY
+ {
+ linking = This->lpLcl ? TRUE:FALSE;
+ }
+ _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+ {
+ linking = FALSE;
+ }
+ _SEH2_END;
+
/* fixme linking too second link when we shall not doing it */
- if (IsBadReadPtr(This,sizeof(LPDIRECTDRAW)))
+ if (!linking)
{
/* We do not have a DirectDraw interface, we need alloc it*/
LPDDRAWI_DIRECTDRAW_INT memThis;
@@ -315,6 +327,7 @@
return DDERR_NODIRECTDRAWSUPPORT;
}
dwFlags |= DDRAWI_NOHARDWARE;
+ DX_STUB_str("No hardware support\n");
}
if (hel_ret!=DD_OK)
Index: Surface/createsurface.c
===================================================================
--- Surface/createsurface.c (revision 43525)
+++ Surface/createsurface.c (working copy)
@@ -35,7 +35,7 @@
DWORD count;
HRESULT ret;
- if(pDDraw->lpLcl->dwLocalFlags != DDRAWILCL_SETCOOPCALLED)
+ if(!(pDDraw->lpLcl->dwLocalFlags & DDRAWILCL_SETCOOPCALLED))
{
return DDERR_NOCOOPERATIVELEVELSET;
}
@@ -60,13 +60,13 @@
return DDERR_INVALIDCAPS;
}
- if(!(pDDSD->dwFlags & DDSD_HEIGHT) && !(pDDSD->dwFlags & DDSD_HEIGHT)
+ if(!(pDDSD->dwFlags & DDSD_HEIGHT) && !(pDDSD->dwFlags & DDSD_WIDTH)
&& !(pDDSD->ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE))
{
return DDERR_INVALIDPARAMS;
}
- else if(pDDSD->dwFlags & DDSD_HEIGHT && pDDSD->dwFlags & DDSD_HEIGHT
+ else if(pDDSD->dwFlags & DDSD_HEIGHT && pDDSD->dwFlags & DDSD_WIDTH
&& pDDSD->ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE)
{
return DDERR_INVALIDPARAMS;
@@ -182,7 +182,6 @@
/* FIXME ThisSurfaceMore->dmiDDrawReserved7.wMonitorsAttachedToDesktop */
ThisSurfMore->dmiDDrawReserved7.wMonitorsAttachedToDesktop = 1;
pDDraw->lpLcl->lpPrimary = ThisSurfInt;
- Main_DirectDraw_AddRef(pDDraw);
}
else
{
Index: Surface/surface_main.c
===================================================================
--- Surface/surface_main.c (revision 43525)
+++ Surface/surface_main.c (working copy)
@@ -268,10 +267,26 @@
/* FIXME
This is not right exiame how it should be done
*/
- DX_STUB_str("FIXME This is not right exiame how it should be done\n");
- return This->dwIntRefCnt;
+ ULONG ret = --This->dwIntRefCnt;
+ if(!ret)
+ {
+ DX_STUB_str("Release is a bit simplistic right now\n");
+ AcquireDDThreadLock();
+ DxHeapMemFree(This);
+ ReleaseDDThreadLock();
+ }
+ return ret;
}
+ULONG WINAPI Main_DDrawSurface_Release4(LPDDRAWI_DDRAWSURFACE_INT This)
+{
+ ULONG ref = Main_DDrawSurface_Release(This) ;
+
+ if(ref == 0) Main_DirectDraw_Release(This->lpLcl->lpSurfMore->lpDD_int);
+
+ return ref;
+}
+
HRESULT WINAPI Main_DDrawSurface_Blt(LPDDRAWI_DDRAWSURFACE_INT ThisDest, LPRECT rdst,
LPDDRAWI_DDRAWSURFACE_INT ThisSrc, LPRECT rsrc, DWORD dwFlags, LPDDBLTFX lpbltfx)
{
Index: Vtable/DirectDrawSurface4_Vtable.c
===================================================================
--- Vtable/DirectDrawSurface4_Vtable.c (revision 43525)
+++ Vtable/DirectDrawSurface4_Vtable.c (working copy)
@@ -16,7 +16,7 @@
#endif
ULONG WINAPI Main_DDrawSurface_AddRef(LPDIRECTDRAWSURFACE4);
-ULONG WINAPI Main_DDrawSurface_Release(LPDIRECTDRAWSURFACE4);
+ULONG WINAPI Main_DDrawSurface_Release4(LPDIRECTDRAWSURFACE4);
HRESULT WINAPI Main_DDrawSurface_QueryInterface(LPDIRECTDRAWSURFACE4, REFIID, LPVOID*);
HRESULT WINAPI Main_DDrawSurface_ReleaseDC(LPDIRECTDRAWSURFACE4, HDC);
HRESULT WINAPI Main_DDrawSurface_Blt(LPDIRECTDRAWSURFACE4, LPRECT, LPDIRECTDRAWSURFACE4, LPRECT, DWORD, LPDDBLTFX);
@@ -68,7 +68,7 @@
{
Main_DDrawSurface_QueryInterface,
Main_DDrawSurface_AddRef, /* (Compact done) */
- Main_DDrawSurface_Release,
+ Main_DDrawSurface_Release4,
Main_DDrawSurface_AddAttachedSurface,
Main_DDrawSurface_AddOverlayDirtyRect,
Main_DDrawSurface_Blt,
Index: Vtable/DirectDrawSurface7_Vtable.c
===================================================================
--- Vtable/DirectDrawSurface7_Vtable.c (revision 43525)
+++ Vtable/DirectDrawSurface7_Vtable.c (working copy)
@@ -16,7 +16,7 @@
#endif
ULONG WINAPI Main_DDrawSurface_AddRef(LPDIRECTDRAWSURFACE7);
-ULONG WINAPI Main_DDrawSurface_Release(LPDIRECTDRAWSURFACE7);
+ULONG WINAPI Main_DDrawSurface_Release4(LPDIRECTDRAWSURFACE7);
HRESULT WINAPI Main_DDrawSurface_QueryInterface(LPDIRECTDRAWSURFACE7, REFIID, LPVOID*);
HRESULT WINAPI Main_DDrawSurface_ReleaseDC(LPDIRECTDRAWSURFACE7, HDC);
HRESULT WINAPI Main_DDrawSurface_Blt(LPDIRECTDRAWSURFACE7, LPRECT, LPDIRECTDRAWSURFACE7, LPRECT, DWORD, LPDDBLTFX);
@@ -72,7 +72,7 @@
{
Main_DDrawSurface_QueryInterface,
Main_DDrawSurface_AddRef, /* (Compact done) */
- Main_DDrawSurface_Release,
+ Main_DDrawSurface_Release4,
Main_DDrawSurface_AddAttachedSurface,
Main_DDrawSurface_AddOverlayDirtyRect,
Main_DDrawSurface_Blt,