diff --git a/reactos/dll/directx/ddraw/Ddraw/ddraw.h b/reactos/dll/directx/ddraw/Ddraw/ddraw.h index 6f4a4154d9f..1e3172c76ba 100644 --- a/reactos/dll/directx/ddraw/Ddraw/ddraw.h +++ b/reactos/dll/directx/ddraw/Ddraw/ddraw.h @@ -45,6 +45,14 @@ Main_DirectDraw_DuplicateSurface( HRESULT WINAPI Main_DirectDraw_EnumDisplayModes( + LPDDRAWI_DIRECTDRAW_INT This, + DWORD dwFlags, + LPDDSURFACEDESC pDDSD, + LPVOID pContext, + LPDDENUMMODESCALLBACK pCallback); + +HRESULT WINAPI +Main_DirectDraw_EnumDisplayModes4( LPDDRAWI_DIRECTDRAW_INT This, DWORD dwFlags, LPDDSURFACEDESC2 pDDSD, diff --git a/reactos/dll/directx/ddraw/Ddraw/ddraw_displaymode.c b/reactos/dll/directx/ddraw/Ddraw/ddraw_displaymode.c index 6b7ffdbea01..8fe11dd30e3 100644 --- a/reactos/dll/directx/ddraw/Ddraw/ddraw_displaymode.c +++ b/reactos/dll/directx/ddraw/Ddraw/ddraw_displaymode.c @@ -16,6 +16,100 @@ HRESULT WINAPI Main_DirectDraw_EnumDisplayModes(LPDDRAWI_DIRECTDRAW_INT This, DWORD dwFlags, + LPDDSURFACEDESC pDDSD, LPVOID pContext, LPDDENUMMODESCALLBACK pCallback) +{ + HRESULT ret = DD_OK; + INT iMode = 0; + DEVMODE DevMode; + + DX_WINDBG_trace(); + + ZeroMemory(&DevMode, sizeof(DEVMODE)); + + _SEH_TRY + { + + if + ((!IsBadReadPtr(pCallback,sizeof(LPDDENUMMODESCALLBACK))) || + (!IsBadWritePtr(pCallback,sizeof(LPDDENUMMODESCALLBACK))) || + (!IsBadReadPtr(pDDSD,sizeof(DDSURFACEDESC))) || + (!IsBadWritePtr(pDDSD,sizeof(DDSURFACEDESC)))) + { + ret = DDERR_INVALIDPARAMS; + } + else + { + + DevMode.dmSize = sizeof(DEVMODE); + + while (EnumDisplaySettingsEx(NULL, iMode, &DevMode, 0) == TRUE) + { + DDSURFACEDESC SurfaceDesc; + + ZeroMemory(&SurfaceDesc, sizeof(DDSURFACEDESC)); + + iMode++; + + SurfaceDesc.dwSize = sizeof (DDSURFACEDESC); + SurfaceDesc.dwFlags = DDSD_HEIGHT | DDSD_WIDTH | DDSD_REFRESHRATE | DDSD_WIDTH | DDSD_PIXELFORMAT; + SurfaceDesc.dwHeight = DevMode.dmPelsHeight; + SurfaceDesc.dwWidth = DevMode.dmPelsWidth; + SurfaceDesc.lPitch = DevMode.dmPelsWidth * DevMode.dmBitsPerPel / 8; + SurfaceDesc.dwRefreshRate = DevMode.dmDisplayFrequency; + + SurfaceDesc.ddpfPixelFormat.dwSize = sizeof (DDPIXELFORMAT); + SurfaceDesc.ddpfPixelFormat.dwFlags = DDPF_RGB; + // FIXME: get these + /* + SurfaceDesc.ddpfPixelFormat.dwRBitMask = + SurfaceDesc.ddpfPixelFormat.dwGBitMask = + SurfaceDesc.ddpfPixelFormat.dwBBitMask = + SurfaceDesc.ddpfPixelFormat.dwRGBAlphaBitMask = + */ + SurfaceDesc.ddpfPixelFormat.dwRGBBitCount = DevMode.dmBitsPerPel; + + // FIXME1: This->lpLcl->lpGbl->dwMonitorFrequency is not set ! + if(dwFlags & DDEDM_REFRESHRATES && SurfaceDesc.dwRefreshRate != This->lpLcl->lpGbl->dwMonitorFrequency) + { + //continue; // FIXME2: what is SurfaceDesc.dwRefreshRate supposed to be set to ? + } + + // FIXME: Take case when DDEDM_STANDARDVGAMODES flag is not set in account + + if(pDDSD) + { + if(pDDSD->dwFlags & DDSD_HEIGHT && pDDSD->dwHeight != SurfaceDesc.dwHeight) + continue; + + else if(pDDSD->dwFlags & DDSD_WIDTH && pDDSD->dwWidth != SurfaceDesc.dwWidth) + continue; + + else if(pDDSD->dwFlags & DDSD_PITCH && pDDSD->lPitch != SurfaceDesc.lPitch) + continue; + + else if(pDDSD->dwFlags & DDSD_REFRESHRATE && pDDSD->dwRefreshRate != SurfaceDesc.dwRefreshRate) + continue; + + else if(pDDSD->dwFlags & DDSD_PIXELFORMAT && pDDSD->ddpfPixelFormat.dwRGBBitCount != SurfaceDesc.ddpfPixelFormat.dwRGBBitCount) + continue; // FIXME: test for the other members of ddpfPixelFormat as well + } + + if((*pCallback)(&SurfaceDesc, pContext) == DDENUMRET_CANCEL) + break; + } + } + + } + _SEH_HANDLE + { + } + _SEH_END; + + return ret; +} + +HRESULT WINAPI +Main_DirectDraw_EnumDisplayModes4(LPDDRAWI_DIRECTDRAW_INT This, DWORD dwFlags, LPDDSURFACEDESC2 pDDSD, LPVOID pContext, LPDDENUMMODESCALLBACK2 pCallback) { HRESULT ret = DD_OK; diff --git a/reactos/dll/directx/ddraw/Vtable/DirectDraw2_Vtable.c b/reactos/dll/directx/ddraw/Vtable/DirectDraw2_Vtable.c index 28300eca80e..acff16df12b 100644 --- a/reactos/dll/directx/ddraw/Vtable/DirectDraw2_Vtable.c +++ b/reactos/dll/directx/ddraw/Vtable/DirectDraw2_Vtable.c @@ -70,7 +70,7 @@ HRESULT WINAPI Main_DirectDraw_EnumSurfaces( LPDIRECTDRAW2 iface, DWORD dwFlags, - LPDDSURFACEDESC2 lpDDSD, + LPDDSURFACEDESC lpDDSD, LPVOID context, LPDDENUMSURFACESCALLBACK callback); diff --git a/reactos/dll/directx/ddraw/Vtable/DirectDraw4_Vtable.c b/reactos/dll/directx/ddraw/Vtable/DirectDraw4_Vtable.c index 5fad5a6c7d3..8d939811aea 100644 --- a/reactos/dll/directx/ddraw/Vtable/DirectDraw4_Vtable.c +++ b/reactos/dll/directx/ddraw/Vtable/DirectDraw4_Vtable.c @@ -59,7 +59,7 @@ Main_DirectDraw_DuplicateSurface( LPDIRECTDRAWSURFACE4* dst); HRESULT WINAPI -Main_DirectDraw_EnumDisplayModes( +Main_DirectDraw_EnumDisplayModes4( LPDIRECTDRAW4 iface, DWORD dwFlags, LPDDSURFACEDESC2 pDDSD, @@ -182,7 +182,7 @@ IDirectDraw4Vtbl DirectDraw4_Vtable = Main_DirectDraw_CreatePalette, Main_DirectDraw_CreateSurface4, Main_DirectDraw_DuplicateSurface, - Main_DirectDraw_EnumDisplayModes, + Main_DirectDraw_EnumDisplayModes4, Main_DirectDraw_EnumSurfaces, Main_DirectDraw_FlipToGDISurface, Main_DirectDraw_GetCaps, diff --git a/reactos/dll/directx/ddraw/Vtable/DirectDraw7_Vtable.c b/reactos/dll/directx/ddraw/Vtable/DirectDraw7_Vtable.c index 13440b0718c..d9e71249966 100644 --- a/reactos/dll/directx/ddraw/Vtable/DirectDraw7_Vtable.c +++ b/reactos/dll/directx/ddraw/Vtable/DirectDraw7_Vtable.c @@ -63,7 +63,7 @@ Main_DirectDraw_DuplicateSurface( LPDIRECTDRAWSURFACE7* dst); HRESULT WINAPI -Main_DirectDraw_EnumDisplayModes( +Main_DirectDraw_EnumDisplayModes4( LPDIRECTDRAW7 iface, DWORD dwFlags, LPDDSURFACEDESC2 pDDSD, @@ -197,7 +197,7 @@ IDirectDraw7Vtbl DirectDraw7_Vtable = Main_DirectDraw_CreatePalette, Main_DirectDraw_CreateSurface4, /* (CreateSurface4 testing / devloping) */ Main_DirectDraw_DuplicateSurface, - Main_DirectDraw_EnumDisplayModes, /* (EnumDisplayModes testing / devloping) */ + Main_DirectDraw_EnumDisplayModes4, /* (EnumDisplayModes testing / devloping) */ Main_DirectDraw_EnumSurfaces, Main_DirectDraw_FlipToGDISurface, Main_DirectDraw_GetCaps, /* (GetCaps done) */ diff --git a/reactos/dll/directx/ddraw/Vtable/DirectDraw_Vtable.c b/reactos/dll/directx/ddraw/Vtable/DirectDraw_Vtable.c index c5e4ae3634f..bc23e0d766b 100644 --- a/reactos/dll/directx/ddraw/Vtable/DirectDraw_Vtable.c +++ b/reactos/dll/directx/ddraw/Vtable/DirectDraw_Vtable.c @@ -70,9 +70,9 @@ HRESULT WINAPI Main_DirectDraw_EnumSurfaces( LPDIRECTDRAW iface, DWORD dwFlags, - LPDDSURFACEDESC2 lpDDSD2, + LPDDSURFACEDESC lpDDSD2, LPVOID context, - LPDDENUMSURFACESCALLBACK7 callback); + LPDDENUMSURFACESCALLBACK callback); HRESULT WINAPI Main_DirectDraw_FlipToGDISurface(LPDIRECTDRAW iface);