mirror of
https://github.com/reactos/reactos.git
synced 2024-08-02 17:40:58 +00:00
adding more seh, everthing need warp around seh in ddraw.
svn path=/trunk/; revision=27032
This commit is contained in:
parent
9ad6d62b37
commit
8c5a2928ed
|
@ -4,84 +4,100 @@
|
||||||
* PROJECT: ReactOS DirectX
|
* PROJECT: ReactOS DirectX
|
||||||
* FILE: ddraw/ddraw/ddraw_displaymode.c
|
* FILE: ddraw/ddraw/ddraw_displaymode.c
|
||||||
* PURPOSE: IDirectDraw7 Implementation
|
* PURPOSE: IDirectDraw7 Implementation
|
||||||
* PROGRAMMER: Maarten Bosma
|
* PROGRAMMER: Maarten Bosma, Magnus Olsen (add seh support)
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#include "rosdraw.h"
|
#include "rosdraw.h"
|
||||||
|
|
||||||
|
/* PSEH for SEH Support */
|
||||||
|
#include <pseh/pseh.h>
|
||||||
|
|
||||||
HRESULT WINAPI
|
HRESULT WINAPI
|
||||||
Main_DirectDraw_EnumDisplayModes(LPDIRECTDRAW7 iface, DWORD dwFlags,
|
Main_DirectDraw_EnumDisplayModes(LPDIRECTDRAW7 iface, DWORD dwFlags,
|
||||||
LPDDSURFACEDESC2 pDDSD, LPVOID pContext, LPDDENUMMODESCALLBACK2 pCallback)
|
LPDDSURFACEDESC2 pDDSD, LPVOID pContext, LPDDENUMMODESCALLBACK2 pCallback)
|
||||||
{
|
{
|
||||||
|
HRESULT ret = DD_OK;
|
||||||
LPDDRAWI_DIRECTDRAW_INT This = (LPDDRAWI_DIRECTDRAW_INT)iface;
|
LPDDRAWI_DIRECTDRAW_INT This = (LPDDRAWI_DIRECTDRAW_INT)iface;
|
||||||
INT iMode = 0;
|
INT iMode = 0;
|
||||||
DEVMODE DevMode;
|
DEVMODE DevMode;
|
||||||
|
|
||||||
DX_WINDBG_trace();
|
DX_WINDBG_trace();
|
||||||
|
|
||||||
if(!pCallback)
|
_SEH_TRY
|
||||||
return DDERR_INVALIDPARAMS;
|
|
||||||
|
|
||||||
DevMode.dmSize = sizeof(DEVMODE);
|
|
||||||
DevMode.dmDriverExtra = 0;
|
|
||||||
|
|
||||||
while (EnumDisplaySettingsEx(NULL, iMode, &DevMode, 0) == TRUE)
|
|
||||||
{
|
{
|
||||||
DDSURFACEDESC2 SurfaceDesc;
|
if(!pCallback)
|
||||||
|
|
||||||
iMode++;
|
|
||||||
|
|
||||||
SurfaceDesc.dwSize = sizeof (DDSURFACEDESC2);
|
|
||||||
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 ?
|
ret = DDERR_INVALIDPARAMS;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
|
||||||
|
DevMode.dmSize = sizeof(DEVMODE);
|
||||||
|
DevMode.dmDriverExtra = 0;
|
||||||
|
|
||||||
|
while (EnumDisplaySettingsEx(NULL, iMode, &DevMode, 0) == TRUE)
|
||||||
|
{
|
||||||
|
DDSURFACEDESC2 SurfaceDesc;
|
||||||
|
|
||||||
|
iMode++;
|
||||||
|
|
||||||
|
SurfaceDesc.dwSize = sizeof (DDSURFACEDESC2);
|
||||||
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 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)
|
|
||||||
return DD_OK;
|
|
||||||
}
|
}
|
||||||
|
_SEH_HANDLE
|
||||||
return DD_OK;
|
{
|
||||||
|
}
|
||||||
|
_SEH_END;
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
HRESULT WINAPI
|
HRESULT WINAPI
|
||||||
|
|
|
@ -137,10 +137,17 @@ Main_DirectDraw_Compact(LPDIRECTDRAW7 iface)
|
||||||
DX_WINDBG_trace();
|
DX_WINDBG_trace();
|
||||||
// EnterCriticalSection(&ddcs);
|
// EnterCriticalSection(&ddcs);
|
||||||
|
|
||||||
if (This->lpLcl->lpGbl->lpExclusiveOwner == This->lpLcl)
|
_SEH_TRY
|
||||||
{
|
{
|
||||||
retVal = DDERR_NOEXCLUSIVEMODE;
|
if (This->lpLcl->lpGbl->lpExclusiveOwner == This->lpLcl)
|
||||||
|
{
|
||||||
|
retVal = DDERR_NOEXCLUSIVEMODE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
_SEH_HANDLE
|
||||||
|
{
|
||||||
|
}
|
||||||
|
_SEH_END;
|
||||||
// LeaveCriticalSection(&ddcs);
|
// LeaveCriticalSection(&ddcs);
|
||||||
return retVal;
|
return retVal;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue