Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenddtest.c
Go to the documentation of this file.
00001 /* 00002 * PROJECT: ReactX Diagnosis Application 00003 * LICENSE: LGPL - See COPYING in the top level directory 00004 * FILE: base/applications/dxdiag/ddtest.c 00005 * PURPOSE: ReactX DirectDraw tests 00006 * COPYRIGHT: Copyright 2008 Kamil Hornicek 00007 * 00008 */ 00009 00010 #include "precomp.h" 00011 00012 BOOL DDPrimarySurfaceTest(HWND hWnd); 00013 BOOL DDOffscreenBufferTest(HWND hWnd, BOOL Fullscreen); 00014 VOID DDRedrawFrame(LPDIRECTDRAWSURFACE lpDDSurface); 00015 VOID DDUpdateFrame(LPDIRECTDRAWSURFACE lpDDPrimarySurface ,LPDIRECTDRAWSURFACE lpDDBackBuffer, BOOL Fullscreen, INT *posX, INT *posY, INT *gainX, INT *gainY, RECT *rectDD); 00016 static LRESULT CALLBACK WindowProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); 00017 00018 #define TEST_DURATION 10000 00019 #define WIDTH 640 00020 #define HEIGHT 480 00021 #define DD_TEST_STEP 5 00022 #define DD_SQUARE_SIZE 100 00023 #define DD_SQUARE_STEP 2 00024 00025 00026 BOOL StartDDTest(HWND hWnd, HINSTANCE hInstance, INT resTestDescription, INT resResult, INT TestNr) 00027 { 00028 WCHAR szTestDescription[256]; 00029 WCHAR szCaption[256]; 00030 WCHAR szResult[256]; 00031 WCHAR szError[256]; 00032 BOOL Result; 00033 00034 LoadStringW(hInstance, IDS_DDTEST_TITLE, szCaption, sizeof(szCaption) / sizeof(WCHAR)); 00035 LoadStringW(hInstance, IDS_DDTEST_ERROR, szError, sizeof(szError) / sizeof(WCHAR)); 00036 LoadStringW(hInstance, resTestDescription, szTestDescription, sizeof(szTestDescription) / sizeof(WCHAR)); 00037 LoadStringW(hInstance, resResult, szResult, sizeof(szResult) / sizeof(WCHAR)); 00038 00039 if(MessageBox(NULL, szTestDescription, szCaption, MB_YESNO | MB_ICONQUESTION) == IDNO) 00040 return FALSE; 00041 00042 ShowWindow(hWnd, SW_SHOW); 00043 00044 switch(TestNr){ 00045 case 1: 00046 Result = DDPrimarySurfaceTest(hWnd); 00047 break; 00048 case 2: 00049 Result = DDOffscreenBufferTest(hWnd, FALSE); 00050 break; 00051 case 3: 00052 Result = DDOffscreenBufferTest(hWnd, TRUE); 00053 break; 00054 default: 00055 Result = FALSE; 00056 } 00057 00058 ShowWindow(hWnd, SW_HIDE); 00059 00060 if(!Result) 00061 { 00062 MessageBox(NULL, szError, szCaption, MB_OK | MB_ICONERROR); 00063 return FALSE; 00064 } 00065 00066 if(MessageBox(NULL, szResult, szCaption, MB_YESNO | MB_ICONQUESTION) == IDYES) 00067 return TRUE; 00068 00069 return FALSE; 00070 } 00071 00072 VOID DDTests() 00073 { 00074 WNDCLASSEX winClass; 00075 HWND hWnd; 00076 HINSTANCE hInstance = NULL; 00077 WCHAR szDescription[256]; 00078 WCHAR szCaption[256]; 00079 00080 winClass.cbSize = sizeof(WNDCLASSEX); 00081 winClass.style = CS_DBLCLKS | CS_OWNDC | CS_HREDRAW | CS_VREDRAW; 00082 winClass.lpfnWndProc = WindowProc; 00083 winClass.cbClsExtra = 0; 00084 winClass.cbWndExtra = 0; 00085 winClass.hInstance = hInstance; 00086 winClass.hIcon = 0; 00087 winClass.hCursor = 0; 00088 winClass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); 00089 winClass.lpszMenuName = NULL; 00090 winClass.lpszClassName = L"ddtest"; 00091 winClass.hIconSm = LoadIcon(NULL, IDI_APPLICATION); 00092 00093 if (!RegisterClassEx(&winClass)) 00094 return; 00095 00096 hWnd = CreateWindowEx(0, winClass.lpszClassName, NULL,WS_POPUP, 00097 (GetSystemMetrics(SM_CXSCREEN) - WIDTH)/2, 00098 (GetSystemMetrics(SM_CYSCREEN) - HEIGHT)/2, 00099 WIDTH, HEIGHT, NULL, NULL, hInstance, NULL); 00100 00101 if (!hWnd){ 00102 return; 00103 } 00104 00105 LoadStringW(hInstance, IDS_DDTEST_DESCRIPTION, szDescription, sizeof(szDescription) / sizeof(WCHAR)); 00106 LoadStringW(hInstance, IDS_DDTEST_DESCRIPTION, szCaption, sizeof(szCaption) / sizeof(WCHAR)); 00107 if(MessageBox(NULL, szDescription, szCaption, MB_YESNO | MB_ICONQUESTION) == IDNO) 00108 return; 00109 00110 StartDDTest(hWnd, hInstance, IDS_DDPRIMARY_DESCRIPTION, IDS_DDPRIMARY_RESULT, 1); 00111 StartDDTest(hWnd, hInstance, IDS_DDOFFSCREEN_DESCRIPTION, IDS_DDOFFSCREEN_RESULT, 2); 00112 StartDDTest(hWnd, hInstance, IDS_DDFULLSCREEN_DESCRIPTION, IDS_DDFULLSCREEN_RESULT, 3); 00113 00114 DestroyWindow(hWnd); 00115 UnregisterClass(winClass.lpszClassName, hInstance); 00116 } 00117 00118 BOOL DDPrimarySurfaceTest(HWND hWnd){ 00119 UINT TimerID; 00120 MSG msg; 00121 00122 LPDIRECTDRAW lpDD = NULL; 00123 LPDIRECTDRAWSURFACE lpDDSurface = NULL; 00124 DDSURFACEDESC DDSurfaceDesc; 00125 00126 if(DirectDrawCreate(NULL, &lpDD, NULL) != DD_OK) 00127 return FALSE; 00128 00129 if(lpDD->lpVtbl->SetCooperativeLevel(lpDD, hWnd, DDSCL_NORMAL) != DD_OK) 00130 { 00131 lpDD->lpVtbl->Release(lpDD); 00132 return FALSE; 00133 } 00134 00135 /* create our primary surface */ 00136 ZeroMemory(&DDSurfaceDesc, sizeof(DDSurfaceDesc)); 00137 DDSurfaceDesc.dwSize = sizeof(DDSurfaceDesc); 00138 DDSurfaceDesc.dwFlags = DDSD_CAPS; 00139 DDSurfaceDesc.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_3DDEVICE; 00140 DDSurfaceDesc.dwBackBufferCount = 0; 00141 00142 if(lpDD->lpVtbl->CreateSurface(lpDD, &DDSurfaceDesc, &lpDDSurface, NULL) != DD_OK) 00143 { 00144 lpDD->lpVtbl->Release(lpDD); 00145 return FALSE; 00146 } 00147 00148 TimerID = SetTimer(hWnd, -1, (UINT)TEST_DURATION, NULL); 00149 00150 while (TRUE) 00151 { 00152 if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) 00153 { 00154 if (msg.message == WM_TIMER && TimerID == msg.wParam) 00155 break; 00156 TranslateMessage(&msg); 00157 DispatchMessage(&msg); 00158 if (msg.message == WM_PAINT) 00159 DDRedrawFrame(lpDDSurface); 00160 } 00161 } 00162 KillTimer(hWnd, TimerID); 00163 lpDDSurface->lpVtbl->Release(lpDDSurface); 00164 lpDD->lpVtbl->Release(lpDD); 00165 00166 return TRUE; 00167 } 00168 00169 VOID DDRedrawFrame(LPDIRECTDRAWSURFACE lpDDSurface) 00170 { 00171 HDC hdc; 00172 00173 if (lpDDSurface->lpVtbl->GetDC(lpDDSurface, &hdc) == DD_OK) 00174 { 00175 RECT rct; 00176 HBRUSH BlackBrush, WhiteBrush; 00177 BOOL Colour = FALSE; 00178 00179 rct.left = (GetSystemMetrics(SM_CXSCREEN) - WIDTH)/2; 00180 rct.right = (GetSystemMetrics(SM_CXSCREEN) - WIDTH)/2 + WIDTH; 00181 rct.top = (GetSystemMetrics(SM_CYSCREEN) - HEIGHT)/2; 00182 rct.bottom = (GetSystemMetrics(SM_CYSCREEN) - HEIGHT)/2 + HEIGHT; 00183 00184 BlackBrush = CreateSolidBrush(RGB(0,0,0)); 00185 WhiteBrush = CreateSolidBrush(RGB(255,255,255)); 00186 00187 while((rct.bottom - rct.top) > DD_TEST_STEP){ 00188 (Colour)? FillRect(hdc, &rct, WhiteBrush) : FillRect(hdc, &rct, BlackBrush); 00189 rct.top += DD_TEST_STEP; 00190 rct.bottom -= DD_TEST_STEP; 00191 rct.left += DD_TEST_STEP; 00192 rct.right -= DD_TEST_STEP; 00193 Colour = !Colour; 00194 } 00195 DeleteObject((HGDIOBJ)BlackBrush); 00196 DeleteObject((HGDIOBJ)WhiteBrush); 00197 lpDDSurface->lpVtbl->ReleaseDC(lpDDSurface, hdc); 00198 } 00199 } 00200 00201 00202 BOOL DDOffscreenBufferTest(HWND hWnd, BOOL Fullscreen){ 00203 UINT_PTR TimerID, TimerIDUpdate; 00204 LPDIRECTDRAW lpDD; 00205 LPDIRECTDRAWSURFACE lpDDPrimarySurface; 00206 LPDIRECTDRAWSURFACE lpDDBackBuffer; 00207 DDSURFACEDESC DDSurfaceDesc; 00208 DDSURFACEDESC DDBBSurfaceDesc; 00209 DDSCAPS DDSCaps; 00210 MSG msg; 00211 RECT rectDD; 00212 POINT wndPoint; 00213 INT posX = 0, posY = 10, xGain = DD_SQUARE_STEP, yGain = DD_SQUARE_STEP; 00214 00215 if(DirectDrawCreate(NULL, &lpDD, NULL) != DD_OK) 00216 return FALSE; 00217 00218 ZeroMemory(&DDSurfaceDesc, sizeof(DDSurfaceDesc)); 00219 DDSurfaceDesc.dwSize = sizeof(DDSurfaceDesc); 00220 00221 if(Fullscreen) 00222 { 00223 if(lpDD->lpVtbl->SetCooperativeLevel(lpDD, hWnd, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN) != DD_OK) 00224 { 00225 lpDD->lpVtbl->Release(lpDD); 00226 return FALSE; 00227 } 00228 if(lpDD->lpVtbl->SetDisplayMode(lpDD, WIDTH, HEIGHT, 32) != DD_OK) 00229 { 00230 lpDD->lpVtbl->Release(lpDD); 00231 return FALSE; 00232 } 00233 DDSurfaceDesc.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT; 00234 DDSurfaceDesc.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_FLIP | DDSCAPS_COMPLEX; 00235 DDSurfaceDesc.dwBackBufferCount = 1; 00236 } 00237 else 00238 { 00239 if(lpDD->lpVtbl->SetCooperativeLevel(lpDD, hWnd, DDSCL_NORMAL) != DD_OK) 00240 { 00241 lpDD->lpVtbl->Release(lpDD); 00242 return FALSE; 00243 } 00244 DDSurfaceDesc.dwFlags = DDSD_CAPS; 00245 DDSurfaceDesc.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE; 00246 } 00247 00248 00249 if(lpDD->lpVtbl->CreateSurface(lpDD, &DDSurfaceDesc, &lpDDPrimarySurface, NULL) != DD_OK) 00250 { 00251 lpDD->lpVtbl->Release(lpDD); 00252 return FALSE; 00253 } 00254 00255 if(Fullscreen) 00256 { 00257 DDSCaps.dwCaps = DDSCAPS_BACKBUFFER; 00258 if (lpDDPrimarySurface->lpVtbl->GetAttachedSurface(lpDDPrimarySurface, &DDSCaps,&lpDDBackBuffer) != DD_OK) 00259 { 00260 lpDDPrimarySurface->lpVtbl->Release(lpDDPrimarySurface); 00261 lpDD->lpVtbl->Release(lpDD); 00262 return FALSE; 00263 } 00264 } 00265 else 00266 { 00267 /* create our offscreen back buffer */ 00268 ZeroMemory(&DDBBSurfaceDesc,sizeof(DDBBSurfaceDesc)); 00269 DDBBSurfaceDesc.dwSize = sizeof(DDBBSurfaceDesc); 00270 DDBBSurfaceDesc.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT; 00271 DDBBSurfaceDesc.dwHeight = HEIGHT; 00272 DDBBSurfaceDesc.dwWidth = WIDTH; 00273 DDBBSurfaceDesc.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN; 00274 00275 if(lpDD->lpVtbl->CreateSurface(lpDD, &DDBBSurfaceDesc, &lpDDBackBuffer, NULL) != DD_OK) 00276 { 00277 lpDD->lpVtbl->Release(lpDD); 00278 lpDDPrimarySurface->lpVtbl->Release(lpDDPrimarySurface); 00279 return FALSE; 00280 } 00281 wndPoint.x = 0; 00282 wndPoint.y = 0; 00283 ClientToScreen(hWnd, &wndPoint); 00284 GetClientRect(hWnd, &rectDD); 00285 OffsetRect(&rectDD, wndPoint.x, wndPoint.y); 00286 } 00287 00288 /* set our timers, TimerID - for test timeout, TimerIDUpdate - for frame updating */ 00289 TimerID = SetTimer(hWnd, -1, (UINT)TEST_DURATION, NULL); 00290 TimerIDUpdate = SetTimer(hWnd, 2, (UINT)10, NULL); 00291 (void)TimerIDUpdate; 00292 00293 while (TRUE) 00294 { 00295 if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) 00296 { 00297 if (msg.message == WM_TIMER) 00298 { 00299 if(msg.wParam == TimerID) 00300 { 00301 break; 00302 } 00303 else 00304 { 00305 DDUpdateFrame(lpDDPrimarySurface,lpDDBackBuffer, Fullscreen,&posX, &posY, &xGain, &yGain, &rectDD); 00306 } 00307 } 00308 TranslateMessage(&msg); 00309 DispatchMessage(&msg); 00310 } 00311 } 00312 00313 lpDDPrimarySurface->lpVtbl->Release(lpDDPrimarySurface); 00314 /* backbuffer is released automatically when in fullscreen */ 00315 if(!Fullscreen) 00316 lpDDBackBuffer->lpVtbl->Release(lpDDBackBuffer); 00317 lpDD->lpVtbl->Release(lpDD); 00318 00319 return TRUE; 00320 } 00321 00322 00323 VOID DDUpdateFrame(LPDIRECTDRAWSURFACE lpDDPrimarySurface ,LPDIRECTDRAWSURFACE lpDDBackBuffer, BOOL Fullscreen, INT *posX, INT *posY, INT *gainX, INT *gainY, RECT *rectDD) 00324 { 00325 HDC hdc; 00326 DDBLTFX DDBlitFx; 00327 00328 /* clear back buffer and paint it black */ 00329 ZeroMemory(&DDBlitFx, sizeof(DDBlitFx)); 00330 DDBlitFx.dwSize = sizeof(DDBlitFx); 00331 DDBlitFx.dwFillColor = 0; 00332 00333 lpDDBackBuffer->lpVtbl->Blt(lpDDBackBuffer, NULL, NULL, NULL, DDBLT_COLORFILL | DDBLT_WAIT, &DDBlitFx); 00334 00335 if (lpDDBackBuffer->lpVtbl->GetDC(lpDDBackBuffer, &hdc) == DD_OK) 00336 { 00337 RECT rct; 00338 HBRUSH WhiteBrush; 00339 00340 rct.left = *posX; 00341 rct.right = *posX+DD_SQUARE_SIZE; 00342 rct.top = *posY; 00343 rct.bottom = *posY+DD_SQUARE_SIZE; 00344 00345 WhiteBrush = CreateSolidBrush(RGB(255,255,255)); 00346 FillRect(hdc, &rct, WhiteBrush); 00347 00348 if(*posX >= (WIDTH - DD_SQUARE_SIZE)) *gainX = -(*gainX); 00349 if(*posY >= (HEIGHT - DD_SQUARE_SIZE)) *gainY = -(*gainY); 00350 if(*posX < 0) *gainX = -1*(*gainX); 00351 if(*posY < 0) *gainY = -1*(*gainY); 00352 00353 *posX += *gainX; 00354 *posY += *gainY; 00355 00356 lpDDBackBuffer->lpVtbl->ReleaseDC(lpDDBackBuffer, hdc); 00357 00358 if(Fullscreen) 00359 { 00360 lpDDPrimarySurface->lpVtbl->Flip(lpDDPrimarySurface, NULL, DDFLIP_WAIT); 00361 } 00362 else 00363 { 00364 lpDDPrimarySurface->lpVtbl->Blt(lpDDPrimarySurface, rectDD, lpDDBackBuffer, NULL, DDBLT_WAIT, NULL); 00365 } 00366 } 00367 } 00368 00369 static LRESULT CALLBACK WindowProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) 00370 { 00371 return DefWindowProc(hWnd, msg, wParam, lParam); 00372 } Generated on Sun May 27 2012 04:16:34 for ReactOS by
1.7.6.1
|