typedef struct { INT* passed; INT* failed; LPDIRECTDRAW7 DirectDraw; } ENUMCONTEXT; 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 */ /* 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->GetMonitorFrequency (NULL) == DDERR_INVALIDPARAMS ); 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); /* This test depns on which graphice card you have */ retVal = DirectDraw->GetMonitorFrequency((PDWORD)&lpFreq); if ( retVal == DDERR_UNSUPPORTED) { retVal = DD_OK; } TEST ( retVal == DD_OK); /* hacking testing */ /* shall return DDERR_UNSUPPORTED */ This->lpLcl->lpGbl->dwMonitorFrequency = 0; TEST (DirectDraw->GetMonitorFrequency(&temp) == DDERR_UNSUPPORTED); /* shall return DD_OK */ This->lpLcl->lpGbl->dwMonitorFrequency = 85; TEST (DirectDraw->GetMonitorFrequency(&temp) == DD_OK); /* restore */ This->lpLcl->lpGbl->dwMonitorFrequency = lpFreq; DirectDraw->Release(); return TRUE; }