diff --git a/reactos/dll/directx/ddraw/Ddraw/ddraw_displaymode.c b/reactos/dll/directx/ddraw/Ddraw/ddraw_displaymode.c new file mode 100644 index 00000000000..cede67e2b5f --- /dev/null +++ b/reactos/dll/directx/ddraw/Ddraw/ddraw_displaymode.c @@ -0,0 +1,107 @@ +/* $Id$ + * + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS DirectX + * FILE: ddraw/ddraw/ddraw_displaymode.c + * PURPOSE: IDirectDraw7 Implementation + * PROGRAMMER: Maarten Bosma + * + */ + + +#include "rosdraw.h" + +HRESULT WINAPI +Main_DirectDraw_SetDisplayMode (LPDIRECTDRAW7 iface, DWORD dwWidth, DWORD dwHeight, + DWORD dwBPP, DWORD dwRefreshRate, DWORD dwFlags) +{ + LPDDRAWI_DIRECTDRAW_INT This = (LPDDRAWI_DIRECTDRAW_INT)iface; + DX_WINDBG_trace(); + + // FIXME: Check primary if surface is locked / busy etc. + + // Check Parameter + if(dwFlags != 0) + { + return DDERR_INVALIDPARAMS; + } + + if ((!dwHeight || This->lpLcl->lpGbl->vmiData.dwDisplayHeight == dwHeight) && + (!dwWidth || This->lpLcl->lpGbl->vmiData.dwDisplayWidth == dwWidth) && + (!dwBPP || This->lpLcl->lpGbl->vmiData.ddpfDisplay.dwRGBBitCount == dwBPP) && + (!dwRefreshRate || This->lpLcl->lpGbl->dwMonitorFrequency == dwRefreshRate)) + { + return DD_OK; // nothing to do here for us + } + + // Here we go + DEVMODE DevMode; + DevMode.dmFields = 0; + if(dwHeight) + DevMode.dmFields |= DM_PELSHEIGHT; + if(dwWidth) + DevMode.dmFields |= DM_PELSWIDTH; + if(dwBPP) + DevMode.dmFields |= DM_BITSPERPEL; + if(dwRefreshRate) + DevMode.dmFields |= DM_DISPLAYFREQUENCY; + + DevMode.dmPelsHeight = dwHeight; + DevMode.dmPelsWidth = dwWidth; + DevMode.dmBitsPerPel = dwBPP; + DevMode.dmDisplayFrequency = dwRefreshRate; + + LONG retval = ChangeDisplaySettings(&DevMode, CDS_FULLSCREEN); /* FIXME: Are we supposed to set CDS_SET_PRIMARY as well ? */ + + if(retval == DISP_CHANGE_BADMODE) + { + return DDERR_UNSUPPORTED; + } + else if(retval != DISP_CHANGE_SUCCESSFUL) + { + return DDERR_GENERIC; + } + + // Update Interals + BOOL ModeChanged; + DdReenableDirectDrawObject(This->lpLcl->lpGbl, &ModeChanged); + StartDirectDraw((LPDIRECTDRAW)iface, 0, TRUE); + + return DD_OK; +} + +HRESULT WINAPI +Main_DirectDraw_GetMonitorFrequency (LPDIRECTDRAW7 iface, LPDWORD lpFreq) +{ + LPDDRAWI_DIRECTDRAW_INT This = (LPDDRAWI_DIRECTDRAW_INT)iface; + DX_WINDBG_trace(); + + if (lpFreq == NULL) + return DDERR_INVALIDPARAMS; + + *lpFreq = This->lpLcl->lpGbl->dwMonitorFrequency; + + return DD_OK; +} + +HRESULT WINAPI +Main_DirectDraw_GetDisplayMode (LPDIRECTDRAW7 iface, LPDDSURFACEDESC2 pDDSD) +{ + LPDDRAWI_DIRECTDRAW_INT This = (LPDDRAWI_DIRECTDRAW_INT)iface; + DX_WINDBG_trace(); + + if (pDDSD == NULL) + return DDERR_INVALIDPARAMS; + + if (pDDSD->dwSize != sizeof(LPDDSURFACEDESC2)) + return DDERR_INVALIDPARAMS; + + pDDSD->dwFlags |= DDSD_HEIGHT | DDSD_WIDTH | DDSD_PIXELFORMAT | DDSD_PITCH | DDSD_REFRESHRATE; + pDDSD->dwHeight = This->lpLcl->lpGbl->vmiData.dwDisplayWidth; + pDDSD->dwWidth = This->lpLcl->lpGbl->vmiData.dwDisplayHeight; + pDDSD->ddpfPixelFormat = This->lpLcl->lpGbl->vmiData.ddpfDisplay; + pDDSD->dwRefreshRate = This->lpLcl->lpGbl->dwMonitorFrequency; + pDDSD->lPitch = This->lpLcl->lpGbl->vmiData.lDisplayPitch; + + return DD_OK; +} diff --git a/reactos/dll/directx/ddraw/Ddraw/ddraw_main.c b/reactos/dll/directx/ddraw/Ddraw/ddraw_main.c index 34c65d9909a..53f0128e3f8 100644 --- a/reactos/dll/directx/ddraw/Ddraw/ddraw_main.c +++ b/reactos/dll/directx/ddraw/Ddraw/ddraw_main.c @@ -11,8 +11,7 @@ #include "rosdraw.h" -HRESULT -WINAPI +HRESULT WINAPI Main_DirectDraw_QueryInterface (LPDIRECTDRAW7 iface, REFIID id, LPVOID *obj) @@ -21,8 +20,8 @@ Main_DirectDraw_QueryInterface (LPDIRECTDRAW7 iface, DX_WINDBG_trace(); - /* fixme - the D3D object cab be optain from here + /* FIXME + the D3D object can be optained from here Direct3D7 */ if (IsEqualGUID(&IID_IDirectDraw7, id)) @@ -44,12 +43,7 @@ Main_DirectDraw_QueryInterface (LPDIRECTDRAW7 iface, return DD_OK; } -/* - * IMPLEMENT - * Status ok - */ -ULONG -WINAPI +ULONG WINAPI Main_DirectDraw_AddRef (LPDIRECTDRAW7 iface) { LPDDRAWI_DIRECTDRAW_INT This = (LPDDRAWI_DIRECTDRAW_INT)iface; @@ -69,9 +63,7 @@ Main_DirectDraw_AddRef (LPDIRECTDRAW7 iface) return This->dwIntRefCnt; } - -ULONG -WINAPI +ULONG WINAPI Main_DirectDraw_Release (LPDIRECTDRAW7 iface) { LPDDRAWI_DIRECTDRAW_INT This = (LPDDRAWI_DIRECTDRAW_INT)iface; @@ -103,70 +95,16 @@ Main_DirectDraw_Release (LPDIRECTDRAW7 iface) return This->dwIntRefCnt; } -HRESULT -WINAPI -Main_DirectDraw_Compact(LPDIRECTDRAW7 iface) +HRESULT WINAPI +Main_DirectDraw_Initialize (LPDIRECTDRAW7 iface, LPGUID lpGUID) { - return DD_OK; // not implemented in ms ddraw + return DDERR_ALREADYINITIALIZED; } HRESULT WINAPI -Main_DirectDraw_SetDisplayMode (LPDIRECTDRAW7 iface, DWORD dwWidth, DWORD dwHeight, - DWORD dwBPP, DWORD dwRefreshRate, DWORD dwFlags) +Main_DirectDraw_Compact(LPDIRECTDRAW7 iface) { - LPDDRAWI_DIRECTDRAW_INT This = (LPDDRAWI_DIRECTDRAW_INT)iface; - DX_WINDBG_trace(); - - // FIXME: Check primary if surface is locked / busy etc. - - // Check Parameter - if(dwFlags != 0) - { - return DDERR_INVALIDPARAMS; - } - - if ((!dwHeight || This->lpLcl->lpGbl->vmiData.dwDisplayHeight == dwHeight) && - (!dwWidth || This->lpLcl->lpGbl->vmiData.dwDisplayWidth == dwWidth) && - (!dwBPP || This->lpLcl->lpGbl->vmiData.ddpfDisplay.dwRGBBitCount == dwBPP) && - (!dwRefreshRate || This->lpLcl->lpGbl->dwMonitorFrequency == dwRefreshRate)) - { - return DD_OK; // nothing to do here for us - } - - // Here we go - DEVMODE DevMode; - DevMode.dmFields = 0; - if(dwHeight) - DevMode.dmFields |= DM_PELSHEIGHT; - if(dwWidth) - DevMode.dmFields |= DM_PELSWIDTH; - if(dwBPP) - DevMode.dmFields |= DM_BITSPERPEL; - if(dwRefreshRate) - DevMode.dmFields |= DM_DISPLAYFREQUENCY; - - DevMode.dmPelsHeight = dwHeight; - DevMode.dmPelsWidth = dwWidth; - DevMode.dmBitsPerPel = dwBPP; - DevMode.dmDisplayFrequency = dwRefreshRate; - - LONG retval = ChangeDisplaySettings(&DevMode, CDS_FULLSCREEN); /* FIXME: Are we supposed to set CDS_SET_PRIMARY as well ? */ - - if(retval == DISP_CHANGE_BADMODE) - { - return DDERR_UNSUPPORTED; - } - else if(retval != DISP_CHANGE_SUCCESSFUL) - { - return DDERR_GENERIC; - } - - // Update Interals - BOOL ModeChanged; - DdReenableDirectDrawObject(This->lpLcl->lpGbl, &ModeChanged); - StartDirectDraw((LPDIRECTDRAW)iface, 0, TRUE); - - return DD_OK; + return DD_OK; // not implemented in ms ddraw either } HRESULT WINAPI @@ -204,8 +142,9 @@ Main_DirectDraw_GetAvailableVidMem(LPDIRECTDRAW7 iface, LPDDSCAPS2 ddscaps, return memdata.ddRVal; } -HRESULT WINAPI Main_DirectDraw_CreateSurface (LPDIRECTDRAW7 iface, LPDDSURFACEDESC2 pDDSD, - LPDIRECTDRAWSURFACE7 *ppSurf, IUnknown *pUnkOuter) +HRESULT WINAPI +Main_DirectDraw_CreateSurface (LPDIRECTDRAW7 iface, LPDDSURFACEDESC2 pDDSD, + LPDIRECTDRAWSURFACE7 *ppSurf, IUnknown *pUnkOuter) { HRESULT ret; DDSURFACEDESC2 dd_desc_v2; @@ -258,7 +197,7 @@ HRESULT WINAPI Main_DirectDraw_CreateSurface (LPDIRECTDRAW7 iface, LPDDSURFACEDE return DDERR_INVALIDPARAMS; } - /* check if this process belong to this ddraw */ + /* Check if this process belongs to this ddraw object */ if ( dd_int->lpLcl->dwProcessId != GetCurrentProcessId() ) { /* FIXME send back right return code */ @@ -272,7 +211,6 @@ HRESULT WINAPI Main_DirectDraw_CreateSurface (LPDIRECTDRAW7 iface, LPDDSURFACEDE } - IDirectDraw7Vtbl DirectDraw7_Vtable = { Main_DirectDraw_QueryInterface, diff --git a/reactos/dll/directx/ddraw/Ddraw/ddraw_stubs.c b/reactos/dll/directx/ddraw/Ddraw/ddraw_stubs.c index c561dbdbd60..27ce301fe79 100644 --- a/reactos/dll/directx/ddraw/Ddraw/ddraw_stubs.c +++ b/reactos/dll/directx/ddraw/Ddraw/ddraw_stubs.c @@ -78,15 +78,6 @@ Main_DirectDraw_GetCaps(LPDIRECTDRAW7 iface, LPDDCAPS pDriverCaps, DX_STUB; } -/* - * Status: Implentation removed due to rewrite - */ -HRESULT WINAPI Main_DirectDraw_GetDisplayMode(LPDIRECTDRAW7 iface, LPDDSURFACEDESC2 pDDSD) -{ - DX_WINDBG_trace(); - DX_STUB; -} - HRESULT WINAPI Main_DirectDraw_GetFourCCCodes(LPDIRECTDRAW7 iface, LPDWORD pNumCodes, LPDWORD pCodes) { @@ -102,13 +93,6 @@ Main_DirectDraw_GetGDISurface(LPDIRECTDRAW7 iface, DX_STUB; } -HRESULT WINAPI -Main_DirectDraw_GetMonitorFrequency(LPDIRECTDRAW7 iface,LPDWORD freq) -{ - DX_WINDBG_trace(); - DX_STUB; -} - HRESULT WINAPI Main_DirectDraw_GetScanLine(LPDIRECTDRAW7 iface, LPDWORD lpdwScanLine) { @@ -123,17 +107,6 @@ Main_DirectDraw_GetVerticalBlankStatus(LPDIRECTDRAW7 iface, LPBOOL lpbIsInVB) DX_STUB; } -/* - * Status: Implentation removed due to rewrite - */ -HRESULT -WINAPI -Main_DirectDraw_Initialize (LPDIRECTDRAW7 iface, LPGUID lpGUID) -{ - DX_WINDBG_trace(); - DX_STUB; -} - /* * Status: Implentation removed due to rewrite */ diff --git a/reactos/dll/directx/ddraw/ddraw.rbuild b/reactos/dll/directx/ddraw/ddraw.rbuild index 788a83f8053..ef1278aec01 100644 --- a/reactos/dll/directx/ddraw/ddraw.rbuild +++ b/reactos/dll/directx/ddraw/ddraw.rbuild @@ -23,9 +23,10 @@ cleanup.c - ddraw_stubs.c - ddraw_setcooperativelevel.c ddraw_main.c + ddraw_displaymode.c + ddraw_setcooperativelevel.c + ddraw_stubs.c callbacks_dd_hel.c