Something went wrong. Try again.
Reactos
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128typedef struct{ INT* passed; INT* failed; LPDIRECTDRAW7 DirectDraw;} ENUMCONTEXT;
BOOL Test_GetMonitorFrequency (INT* passed, INT* failed);
HRESULT CALLBACK DummyEnumDisplayModes( LPDDSURFACEDESC2 pDDSD, ENUMCONTEXT* Context ){ return DDENUMRET_OK;}
HRESULT CALLBACK EnumDisplayModes( LPDDSURFACEDESC2 pDDSD, ENUMCONTEXT* Context ){ static int setcout = 0; if(setcout >= 5) return DDENUMRET_OK;
DWORD lpdwFrequency = 0; INT* passed = Context->passed; INT* failed = Context->failed; DDSURFACEDESC2 DisplayMode = {0}; DisplayMode.dwSize = sizeof(DDSURFACEDESC2);
TEST ( pDDSD->dwFlags == (DDSD_HEIGHT | DDSD_WIDTH | DDSD_PITCH | DDSD_PIXELFORMAT | DDSD_REFRESHRATE)); TEST ( pDDSD->ddpfPixelFormat.dwFlags == (DDPF_RGB | DDPF_PALETTEINDEXED8) || pDDSD->ddpfPixelFormat.dwFlags == DDPF_RGB ); TEST ( Context->DirectDraw->SetDisplayMode (pDDSD->dwWidth, pDDSD->dwHeight, pDDSD->ddpfPixelFormat.dwRGBBitCount, pDDSD->dwRefreshRate, 0) == DD_OK); TEST ( Context->DirectDraw->GetMonitorFrequency (&lpdwFrequency) == DD_OK && lpdwFrequency == pDDSD->dwRefreshRate); TEST ( Context->DirectDraw->GetDisplayMode (&DisplayMode) == DD_OK && pDDSD->dwHeight == DisplayMode.dwHeight && pDDSD->dwWidth == DisplayMode.dwWidth && pDDSD->dwRefreshRate == DisplayMode.dwRefreshRate && pDDSD->ddpfPixelFormat.dwRGBBitCount == DisplayMode.ddpfPixelFormat.dwRGBBitCount && DisplayMode.dwFlags == (DDSD_HEIGHT | DDSD_WIDTH | DDSD_PITCH | DDSD_PIXELFORMAT | DDSD_REFRESHRATE) );
setcout++; return DDENUMRET_OK;}
BOOL Test_DisplayModes (INT* passed, INT* failed){ /*** FIXME: Also test with surface as parameter; try busy/locked surface as well ***/ LPDIRECTDRAW7 DirectDraw;
/* Preparations */ if (DirectDrawCreateEx(NULL, (VOID**)&DirectDraw, IID_IDirectDraw7, NULL) != DD_OK) { printf("ERROR: Failed to set up ddraw\n"); return FALSE; }
ENUMCONTEXT Context = {passed, failed, DirectDraw};
/* The Test */
Test_GetMonitorFrequency(passed, failed);
/* First try with some generic display modes */ TEST ( DirectDraw->SetDisplayMode (1586, 895, 0, 0, 0) == DDERR_UNSUPPORTED ); TEST ( DirectDraw->SetDisplayMode (0, 0, 0, 0, 0x123) == DDERR_INVALIDPARAMS );
// does this change the display mode to DDSCL_EXCLUSIVE ? TEST ( DirectDraw->SetDisplayMode (0, 0, 0, 0, 0) == DD_OK ); TEST ( DirectDraw->SetDisplayMode (800, 600, 0, 0, 0) == DD_OK ); TEST ( DirectDraw->SetDisplayMode (0, 0, 16, 0, 0) == DD_OK );
TEST ( DirectDraw->GetDisplayMode (NULL) == DDERR_INVALIDPARAMS ); DDSURFACEDESC2 DisplayMode = {0}; TEST ( DirectDraw->GetDisplayMode (&DisplayMode) == DDERR_INVALIDPARAMS );
//* Now try getting vaild modes from drive */ TEST (DirectDraw->EnumDisplayModes(DDEDM_STANDARDVGAMODES, NULL, (PVOID)&Context, NULL) == DDERR_INVALIDPARAMS); TEST (DirectDraw->EnumDisplayModes(0, NULL, (PVOID)&Context, (LPDDENUMMODESCALLBACK2)DummyEnumDisplayModes) == DD_OK ); TEST (DirectDraw->EnumDisplayModes(DDEDM_REFRESHRATES, NULL, (PVOID)&Context, (LPDDENUMMODESCALLBACK2)DummyEnumDisplayModes) == DD_OK ); TEST (DirectDraw->EnumDisplayModes(DDEDM_STANDARDVGAMODES, NULL, (PVOID)&Context, (LPDDENUMMODESCALLBACK2)DummyEnumDisplayModes) == DD_OK ); TEST (DirectDraw->EnumDisplayModes(DDEDM_STANDARDVGAMODES|DDEDM_REFRESHRATES, NULL, (PVOID)&Context, (LPDDENUMMODESCALLBACK2)EnumDisplayModes) == DD_OK);
TEST (DirectDraw->RestoreDisplayMode() == DD_OK);
DirectDraw->Release();
return TRUE;}
BOOL Test_GetMonitorFrequency (INT* passed, INT* failed){ LPDIRECTDRAW7 DirectDraw; LPDDRAWI_DIRECTDRAW_INT This;
/* Preparations */ if (DirectDrawCreateEx(NULL, (VOID**)&DirectDraw, IID_IDirectDraw7, NULL) != DD_OK) { printf("ERROR: Failed to set up ddraw\n"); return FALSE; } This = (LPDDRAWI_DIRECTDRAW_INT)DirectDraw;
/* Here we go */ DWORD lpFreq; DWORD temp; HRESULT retVal; TEST (DirectDraw->GetMonitorFrequency((PDWORD)0xdeadbeef) == DDERR_INVALIDPARAMS); TEST (DirectDraw->GetMonitorFrequency(NULL) == DDERR_INVALIDPARAMS);
// result depends on our graphices card retVal = DirectDraw->GetMonitorFrequency((PDWORD)&lpFreq); TEST ( retVal == DD_OK || retVal == DDERR_UNSUPPORTED);
/* Test by hacking interal structures */
// should return DDERR_UNSUPPORTED This->lpLcl->lpGbl->dwMonitorFrequency = 0; TEST (DirectDraw->GetMonitorFrequency(&temp) == DDERR_UNSUPPORTED);
// should return DD_OK This->lpLcl->lpGbl->dwMonitorFrequency = 85; TEST (DirectDraw->GetMonitorFrequency(&temp) == DD_OK);
/* Restore */ This->lpLcl->lpGbl->dwMonitorFrequency = lpFreq;
DirectDraw->Release();
return TRUE;}