ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

ddtest.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 doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.