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,