00001
00003 #include "stdafx.h"
00004
00005 #define SCREEN_WIDTH 1280
00006 #define SCREEN_HEIGHT 1024
00007 #define SCREEN_DEPTH 32
00008
00009 #define WIN32_LEAN_AND_MEAN
00010 #include <windows.h>
00011 #include <windowsx.h>
00012 #include <ddraw.h>
00013 #include <stdlib.h>
00014 #include <stdarg.h>
00015 #include "dvcAPI.h"
00016 #include "dvcImage.h"
00017 #include <stdio.h>
00018
00019 BOOL InitCamera( void );
00020 BOOL GetBitMaskInfo( DWORD dwBitMask, DWORD* pdwShift, DWORD* pdwBits );
00021 BOOL UpdateDisplay( void ) ;
00022
00023 HANDLE hDevice = INVALID_HANDLE_VALUE ;
00024 HANDLE hReadEvent = INVALID_HANDLE_VALUE ;
00025 CDVCImage m_Image ;
00026 ULONG screenWidth = SCREEN_WIDTH ;
00027 ULONG screenHeight = SCREEN_WIDTH ;
00028 ULONG screenDepth = SCREEN_DEPTH ;
00029 BOOL bShowHelp = FALSE ;
00030 BOOL bScaleLuts = FALSE ;
00031 BOOL bPauseVideo = FALSE ;
00032 BOOL bShowStats = TRUE ;
00033 BOOL bChangeDisplay = FALSE ;
00034
00035 #define TIMER_ID 1
00036 #define TIMER_RATE 100
00037
00038 ULONG timerRate = TIMER_RATE ;
00039
00040 LPDIRECTDRAW lpDD;
00041 LPDIRECTDRAWSURFACE lpDDSPrimary;
00042 LPDIRECTDRAWSURFACE lpDDSBack;
00043 LPDIRECTDRAWSURFACE lpDDSOne;
00044 LPDIRECTDRAWSURFACE lpDDSTwo;
00045 BOOL bActive;
00046
00047
00048
00049
00050
00051 static void finiObjects( void )
00052 {
00053 if( lpDD != NULL )
00054 {
00055 if( lpDDSPrimary != NULL )
00056 {
00057 lpDDSPrimary->Release();
00058 lpDDSPrimary = NULL;
00059 }
00060 if( lpDDSOne != NULL )
00061 {
00062 lpDDSOne->Release();
00063 lpDDSOne = NULL;
00064 }
00065 if( lpDDSTwo != NULL )
00066 {
00067 lpDDSTwo->Release();
00068 lpDDSTwo = NULL;
00069 }
00070
00071 lpDD->Release();
00072 lpDD = NULL;
00073 }
00074
00075 dvcStopSequence(hDevice);
00076 dvcSetReadCompleteEvent(hDevice, NULL);
00077 CloseHandle(hReadEvent);
00078 dvcCloseCamera(hDevice);
00079
00080 }
00081
00082
00083
00084
00085
00086
00087 HRESULT restoreAll( void )
00088 {
00089 HRESULT ddrval;
00090
00091 ddrval = lpDDSPrimary->Restore();
00092 if( ddrval == DD_OK )
00093 {
00094 ddrval = lpDDSOne->Restore();
00095 if( ddrval == DD_OK )
00096 {
00097 ddrval = lpDDSTwo->Restore();
00098 }
00099 }
00100 return ddrval;
00101
00102 }
00103
00104 long FAR PASCAL WindowProc( HWND hWnd, UINT message,
00105 WPARAM wParam, LPARAM lParam )
00106 {
00107
00108 switch( message )
00109 {
00110 case WM_ACTIVATEAPP:
00111 bActive = wParam;
00112 break;
00113
00114 case WM_CREATE:
00115 break;
00116
00117 case WM_SETCURSOR:
00118 SetCursor(NULL);
00119 return TRUE;
00120
00121 case WM_TIMER:
00122 UpdateDisplay() ;
00123 break;
00124
00125 case WM_KEYDOWN:
00126 switch( wParam )
00127 {
00128 case VK_ESCAPE:
00129 PostMessage(hWnd, WM_CLOSE, 0, 0);
00130 break ;
00131
00132 case VK_F1:
00133 bShowHelp = !bShowHelp ;
00134 break;
00135
00136 case VK_F2:
00137 bScaleLuts = TRUE ;
00138 break;
00139
00140 case VK_TAB:
00141 bShowStats = !bShowStats ;
00142 break ;
00143
00144 case VK_UP:
00145 {
00146 int nGain ;
00147 int maxGain ;
00148 dvcGetGain(hDevice, &nGain);
00149 dvcGetParmRange(hDevice, aGain, NULL, &maxGain, NULL, NULL) ;
00150 nGain += 1 ;
00151 if(nGain > maxGain) nGain = maxGain ;
00152 dvcSetGain(hDevice, nGain);
00153 }
00154 break;
00155
00156 case VK_DOWN:
00157 {
00158 int nGain ;
00159 dvcGetGain(hDevice, &nGain);
00160 nGain -= 1 ;
00161 if(nGain < 0) nGain = 0 ;
00162 dvcSetGain(hDevice, nGain);
00163 }
00164 break;
00165
00166 case VK_PRIOR:
00167 {
00168 double dExpose = dvcGetExposeMsec(hDevice) ;
00169 double dExposeInterval ;
00170 dvcGetExposeInterval(hDevice,-1,-1,-1, &dExposeInterval) ;
00171 double dNew = dvcSetExposeMsec(hDevice,dExpose+dExposeInterval);
00172 int itt = 0 ;
00173 while(dNew == dExpose && itt++ < 10)
00174 {
00175 dExposeInterval += 10.0 ;
00176 dNew = dvcSetExposeMsec(hDevice,dExpose+dExposeInterval);
00177 }
00178 }
00179 break ;
00180
00181 case VK_NEXT:
00182 {
00183 double dExpose = dvcGetExposeMsec(hDevice) ;
00184 double dExposeInterval ;
00185 dvcGetExposeInterval(hDevice,-1,-1,-1, &dExposeInterval) ;
00186 if(dExposeInterval == dExpose) dExposeInterval = 10.0 ;
00187 double dNew = dvcSetExposeMsec(hDevice,dExpose-dExposeInterval);
00188 int itt = 0 ;
00189 while(dNew == dExpose && itt++ < 10)
00190 {
00191 dExposeInterval -= 10.0 ;
00192 dNew = dvcSetExposeMsec(hDevice,dExpose+dExposeInterval);
00193 }
00194 }
00195 break ;
00196
00197 case VK_LEFT:
00198 {
00199 int nOffset ;
00200 dvcGetOffset(hDevice, &nOffset);
00201 nOffset -= 1 ;
00202 if(nOffset < 0) nOffset = 0 ;
00203 dvcSetOffset(hDevice, nOffset);
00204 }
00205 break ;
00206
00207 case VK_RIGHT:
00208 {
00209 int nOffset ;
00210 int maxOffset ;
00211 dvcGetOffset(hDevice, &nOffset);
00212 dvcGetParmRange(hDevice,aOffset,NULL,&maxOffset,NULL,NULL) ;
00213 nOffset += 1 ;
00214 if(nOffset > maxOffset) nOffset = maxOffset ;
00215 dvcSetOffset(hDevice, nOffset);
00216 }
00217 break ;
00218
00219 case VK_HOME:
00220 {
00221 int nDefault ;
00222 dvcGetParmRange(hDevice,aGain,NULL,NULL,NULL, &nDefault);
00223 dvcSetGain(hDevice,nDefault);
00224 dvcGetParmRange(hDevice,aOffset,NULL,NULL,NULL, &nDefault);
00225 dvcSetOffset(hDevice,nDefault);
00226 dvcGetParmRange(hDevice,aExposureMode,NULL,NULL,NULL,&nDefault);
00227 dvcSetExposureMode(hDevice,nDefault);
00228 dvcGetParmRange(hDevice,aExposureDuration,
00229 NULL,NULL,NULL,&nDefault);
00230 dvcSetExposureDuration(hDevice,nDefault);
00231 }
00232 break ;
00233
00234 case VK_SPACE:
00235 {
00236 bPauseVideo = !bPauseVideo ;
00237 if(bPauseVideo) dvcStopSequence(hDevice);
00238 else dvcStartSequence(hDevice, 0) ;
00239 }
00240 break ;
00241 }
00242 break;
00243
00244 case WM_DESTROY:
00245 finiObjects();
00246 PostQuitMessage( 0 );
00247 break;
00248 }
00249
00250 return DefWindowProc(hWnd, message, wParam, lParam);
00251
00252 }
00253
00254
00255
00256
00257 BOOL initFail( HWND hwnd )
00258 {
00259 finiObjects();
00260 MessageBox( hwnd, "FullScreen Init FAILED", "DVCVideo", MB_OK );
00261 DestroyWindow( hwnd );
00262 return FALSE;
00263
00264 }
00265
00266
00267
00268
00269
00270 static BOOL doInit( HINSTANCE hInstance, int nCmdShow )
00271 {
00272 HWND hwnd;
00273 WNDCLASS wc;
00274 DDSURFACEDESC ddsd;
00275 DDSCAPS ddscaps;
00276 HRESULT ddrval;
00277
00278
00279
00280
00281 wc.style = CS_HREDRAW | CS_VREDRAW;
00282 wc.lpfnWndProc = WindowProc;
00283 wc.cbClsExtra = 0;
00284 wc.cbWndExtra = 0;
00285 wc.hInstance = hInstance;
00286 wc.hIcon = LoadIcon( hInstance, IDI_APPLICATION );
00287 wc.hCursor = LoadCursor( NULL, IDC_CROSS );
00288 wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
00289 wc.lpszMenuName = "DVCVideo";
00290 wc.lpszClassName = "DVCVideo";
00291 RegisterClass( &wc );
00292
00293 screenWidth = GetSystemMetrics(SM_CXSCREEN);
00294 screenHeight = GetSystemMetrics(SM_CYSCREEN);
00295
00296
00297
00298
00299 hwnd = CreateWindowEx(
00300 0,
00301 "DVCVideo",
00302 "FullScreen",
00303 WS_POPUP,
00304 0,
00305 0,
00306 screenWidth,
00307 screenHeight,
00308 NULL,
00309 NULL,
00310 hInstance,
00311 NULL );
00312
00313 if( !hwnd ) return FALSE;
00314
00315 if(!InitCamera()) return initFail(hwnd);
00316
00317 ShowWindow( hwnd, nCmdShow );
00318 UpdateWindow( hwnd );
00319
00320
00321
00322
00323 ddrval = DirectDrawCreate( NULL, &lpDD, NULL );
00324 if( ddrval != DD_OK ) return initFail(hwnd);
00325
00326
00327 ddrval = lpDD->SetCooperativeLevel(
00328 hwnd, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN
00329 );
00330 if( ddrval != DD_OK ) return initFail(hwnd);
00331
00332 if(bChangeDisplay)
00333 {
00334 ddrval = lpDD->SetDisplayMode( screenWidth, screenHeight, screenDepth);
00335 if( ddrval != DD_OK )
00336 {
00337 screenDepth = 24 ;
00338 ddrval = lpDD->SetDisplayMode(screenWidth,screenHeight,screenDepth);
00339 }
00340 if( ddrval != DD_OK )
00341 {
00342 screenDepth = 16 ;
00343 ddrval = lpDD->SetDisplayMode(screenWidth,screenHeight,screenDepth);
00344 }
00345 if( ddrval != DD_OK ) return initFail(hwnd);
00346 }
00347
00348
00349 ddsd.dwSize = sizeof( ddsd );
00350 ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
00351 ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE |
00352 DDSCAPS_FLIP |
00353 DDSCAPS_COMPLEX;
00354 ddsd.dwBackBufferCount = 1;
00355 ddrval = lpDD->CreateSurface( &ddsd, &lpDDSPrimary, NULL );
00356 if( ddrval != DD_OK ) return initFail(hwnd);
00357
00358 ddscaps.dwCaps = DDSCAPS_BACKBUFFER;
00359 ddrval = lpDDSPrimary->GetAttachedSurface(&ddscaps, &lpDDSBack);
00360 if( ddrval != DD_OK ) return initFail(hwnd);
00361
00362
00363 ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH;
00364 ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
00365 ddsd.dwHeight = screenHeight;
00366 ddsd.dwWidth = screenWidth;
00367 ddrval = lpDD->CreateSurface( &ddsd, &lpDDSOne, NULL );
00368 if( ddrval != DD_OK ) return initFail(hwnd);
00369
00370
00371 ddrval = lpDD->CreateSurface( &ddsd, &lpDDSTwo, NULL );
00372 if( ddrval != DD_OK ) return initFail(hwnd);
00373
00374
00375 if( !SetTimer( hwnd, TIMER_ID, timerRate, NULL ) ) return initFail(hwnd);
00376
00377 return TRUE;
00378
00379 }
00380
00381
00382
00383
00384 int PASCAL WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
00385 LPSTR lpCmdLine, int nCmdShow)
00386 {
00387 MSG msg;
00388
00389 lpCmdLine = lpCmdLine;
00390 hPrevInstance = hPrevInstance;
00391
00392 if( !doInit( hInstance, nCmdShow ) ) return FALSE;
00393
00394 while( GetMessage( &msg, NULL, 0, 0 ) )
00395 {
00396 TranslateMessage(&msg);
00397 DispatchMessage(&msg);
00398 }
00399
00400 return msg.wParam;
00401
00402 }
00403
00404
00405 BOOL InitCamera( void )
00406 {
00407 ULONG camWidth, camHeight ;
00408
00409 hDevice = dvcOpenCamera(1);
00410 if(hDevice == INVALID_HANDLE_VALUE) return FALSE ;
00411 hReadEvent = CreateEvent(NULL,FALSE,FALSE,NULL);
00412
00413 dvcSetReadCompleteEvent(hDevice, hReadEvent);
00414 if(!dvcStartSequence(hDevice,0)) return FALSE ;
00415
00416 camWidth = dvcGetXDim(hDevice);
00417 camHeight = dvcGetYDim(hDevice);
00418
00419 if(bChangeDisplay)
00420 {
00421 if(camWidth >= 1280){
00422 screenWidth = 1280 ;
00423 screenHeight = 1024 ;
00424 } else if(camWidth >= 1024){
00425 screenWidth = 1024 ;
00426 screenHeight = 768 ;
00427 } else if(camWidth >= 800){
00428 screenWidth = 800 ;
00429 screenHeight = 600 ;
00430 } else {
00431 screenWidth = 640 ;
00432 screenHeight = 480 ;
00433 }
00434 }
00435
00436 timerRate = (ULONG)dvcGetTimeToReadImage(hDevice) ;
00437 if(timerRate < 10) timerRate = 10 ;
00438 dvcRenderControl_t rs ;
00439 memset(&rs,0, sizeof(dvcRenderControl_t));
00440
00441 m_Image.GetRenderMethod(&rs);
00442 int nLutSize = dvcGetNBits(hDevice) == 10 ? 1024 : 4096 ;
00443 if(!rs.nLutSize != nLutSize) {
00444 rs.nLutSize = nLutSize ;
00445 rs.pRedLut = new BYTE[rs.nLutSize] ;
00446 rs.pGreenLut = new BYTE[rs.nLutSize] ;
00447 rs.pBlueLut = new BYTE[rs.nLutSize] ;
00448 int shift = dvcGetNBits(hDevice) == 10 ? 2 : 4 ;
00449 for(int i = 0 ; i < rs.nLutSize ;i++ )
00450 {
00451 rs.pRedLut[i] =
00452 rs.pGreenLut[i] =
00453 rs.pBlueLut[i] = i >> shift ;
00454 }
00455 dvcSetRGBLuts(hDevice, rs.pRedLut, rs.pGreenLut,rs.pBlueLut, rs.nLutSize);
00456 m_Image.SetRenderMethod(&rs);
00457 delete rs.pRedLut ;
00458 delete rs.pGreenLut ;
00459 delete rs.pBlueLut;
00460 }
00461 return TRUE ;
00462 }
00463
00464 BOOL
00465 GetBitMaskInfo( DWORD dwBitMask, DWORD* pdwShift, DWORD* pdwBits )
00466 {
00467 DWORD dwShift = 0;
00468 DWORD dwBits = 0;
00469
00470 if( pdwShift == NULL || pdwBits == NULL ) return FALSE;
00471
00472 if( dwBitMask )
00473 {
00474 while( (dwBitMask & 1) == 0 )
00475 {
00476 dwShift++;
00477 dwBitMask >>= 1;
00478 }
00479 }
00480
00481 while( (dwBitMask & 1) != 0 )
00482 {
00483 dwBits++;
00484 dwBitMask >>= 1;
00485 }
00486
00487 *pdwShift = dwShift;
00488 *pdwBits = dwBits;
00489
00490 return TRUE;
00491 }
00492
00493 BOOL UpdateDisplay()
00494 {
00495 static int phase = 0;
00496 static BOOL bFirst = TRUE ;
00497 RECT rcRect;
00498 HRESULT ddrval;
00499 LPDIRECTDRAWSURFACE pdds;
00500 rcRect.left = 0;
00501 rcRect.top = 0;
00502 rcRect.right = screenWidth;
00503 rcRect.bottom = screenHeight;
00504 if(phase)
00505 {
00506 pdds = lpDDSTwo;
00507 phase = 0;
00508 }
00509 else
00510 {
00511 pdds = lpDDSOne;
00512 phase = 1;
00513 }
00514
00515 BOOL bDraw = FALSE ;
00516
00517
00518 if(WaitForSingleObject(hReadEvent,100) == WAIT_OBJECT_0)
00519 {
00520 bDraw = TRUE ;
00521 ULONG xOffset = 0, yOffset = 0, uWidth, uHeight ;
00522 ULONG xDisplayOffset = 0, yDisplayOffset = 0 ;
00523 uWidth = dvcGetImageWidth(hDevice);
00524 uHeight = dvcGetImageHeight(hDevice);
00525 if(uWidth > screenWidth)
00526 {
00527 xOffset = (uWidth - screenWidth)/2 ;
00528 uWidth = screenWidth ;
00529 }
00530 else if(screenWidth > uWidth )
00531 {
00532 xDisplayOffset = (screenWidth - uWidth) / 2 ;
00533 }
00534
00535 if(uHeight > screenHeight)
00536 {
00537 yOffset = (uHeight - screenHeight)/2 ;
00538 uHeight = screenHeight ;
00539 }
00540 else if(screenHeight > uHeight )
00541 {
00542 yDisplayOffset = (screenHeight - uHeight) / 2 ;
00543 }
00544 m_Image.ReadCamera(hDevice, xOffset, yOffset, uWidth, uHeight);
00545 DDSURFACEDESC ddsd;
00546 ZeroMemory( &ddsd,sizeof(ddsd) );
00547 ddsd.dwSize = sizeof(ddsd);
00548
00549 ddrval = pdds->Lock(NULL,&ddsd,DDLOCK_WAIT,NULL) ;
00550 if(ddrval != DD_OK) return FALSE ;
00551 DWORD rgbBits = ddsd.ddpfPixelFormat.dwRGBBitCount ;
00552
00553 BYTE* pDDSColor = (BYTE*) ddsd.lpSurface;
00554 ZeroMemory( pDDSColor, screenWidth*screenHeight*rgbBits/8 );
00555 if(xDisplayOffset > 0 || yDisplayOffset > 0)
00556 {
00557 BYTE *pOffset = &pDDSColor[yDisplayOffset * ddsd.lPitch
00558 + xDisplayOffset * rgbBits / 8 ] ;
00559 pDDSColor = pOffset ;
00560 }
00561 if(bFirst)
00562 {
00563 bFirst = FALSE ;
00564 dvcRenderControl_t rs ;
00565 memset(&rs,0, sizeof(dvcRenderControl_t));
00566 m_Image.GetRenderMethod(&rs);
00567 if(rs.nLutSize) {
00568 rs.pRedLut = new BYTE[rs.nLutSize] ;
00569 rs.pGreenLut = new BYTE[rs.nLutSize] ;
00570 rs.pBlueLut = new BYTE[rs.nLutSize] ;
00571 m_Image.GetRenderMethod(&rs);
00572 }
00573 DWORD rbits, rshift, gbits, gshift, bbits, bshift;
00574 rs.redMask = (USHORT)ddsd.ddpfPixelFormat.dwRBitMask ;
00575 rs.greenMask = (USHORT)ddsd.ddpfPixelFormat.dwGBitMask ;
00576 rs.blueMask = (USHORT)ddsd.ddpfPixelFormat.dwBBitMask ;
00577
00578 GetBitMaskInfo(ddsd.ddpfPixelFormat.dwRBitMask,&rshift,&rbits);
00579 GetBitMaskInfo(ddsd.ddpfPixelFormat.dwGBitMask,&gshift,&gbits);
00580 GetBitMaskInfo(ddsd.ddpfPixelFormat.dwBBitMask,&bshift,&bbits);
00581
00582 rs.redBits = (USHORT)rbits ; rs.redShift = (USHORT)rshift ;
00583 rs.greenBits = (USHORT)gbits ; rs.greenShift = (USHORT)gshift ;
00584 rs.blueBits = (USHORT)bbits ; rs.blueShift = (USHORT)bshift ;
00585 rs.eMethod = DVC_RENDER_RGB ;
00586
00587 m_Image.SetRenderMethod(&rs);
00588 if(rs.nLutSize) {
00589 delete rs.pRedLut ;
00590 delete rs.pGreenLut ;
00591 delete rs.pBlueLut ;
00592 }
00593 }
00594
00595 if(bScaleLuts)
00596 {
00597 bScaleLuts = FALSE ;
00598 m_Image.ScaleLuts(-1,-1);
00599 }
00600
00601 m_Image.Render((PVOID)pDDSColor,NULL,ddsd.lPitch,(BYTE)rgbBits);
00602 pdds->Unlock(NULL);
00603
00604 }
00605
00606 char szText[80] ;
00607 HDC hdc ;
00608 pdds->GetDC(&hdc) ;
00609 SetBkMode(hdc, TRANSPARENT);
00610 SetTextColor(hdc, RGB(255,255,255));
00611
00612 if(bShowHelp)
00613 {
00614 sprintf(szText,"F1: Toggle Help menu");
00615 TextOut( hdc, 20, 40, szText, strlen(szText) );
00616
00617 sprintf(szText,"Esc: Exit Application");
00618 TextOut( hdc, 20, 60, szText, strlen(szText) );
00619
00620 int nGain ;
00621 dvcGetGain(hDevice, &nGain);
00622 sprintf(szText,"Up/Dn: Gain [%d]", nGain);
00623 TextOut( hdc, 20, 80, szText, strlen(szText) );
00624
00625 int nOffset;
00626 dvcGetOffset(hDevice, &nOffset);
00627 sprintf(szText,"Left/Right: Offset [%d]", nOffset);
00628 TextOut( hdc, 20, 100, szText, strlen(szText) );
00629
00630 sprintf(szText,"Page Up/Dn: Exposure %6.2f ms",
00631 dvcGetExposeMsec(hDevice) );
00632 TextOut( hdc, 20, 120, szText, strlen(szText) );
00633 sprintf(szText,"Home: Reset");
00634 TextOut( hdc, 20, 140, szText, strlen(szText) );
00635
00636 sprintf(szText,"Tab: Toggle status line");
00637 TextOut( hdc, 20, 160, szText, strlen(szText) );
00638
00639 sprintf(szText,"Space: Toggle Pause/Live video");
00640 TextOut( hdc, 20, 180, szText, strlen(szText) );
00641
00642 if(bPauseVideo) bDraw = TRUE ;
00643
00644 }
00645
00646 if(bShowStats)
00647 {
00648 ULONG xOffset = 20, xEnd ;
00649 ULONG yOffset = screenHeight-20 ;
00650 TEXTMETRIC tm ;
00651 GetTextMetrics(hdc,&tm);
00652
00653 sprintf(szText,"ESC:exit F1:Help");
00654 TextOut( hdc, xOffset, yOffset, szText, strlen(szText) );
00655
00656
00657 xOffset += strlen(szText)*tm.tmAveCharWidth + 20 ;
00658
00659 sprintf(szText,"FPS: %5.2f",dvcGetFrameRate(hDevice));
00660
00661 xEnd = xOffset + strlen(szText)*tm.tmAveCharWidth + 20 ;
00662 if(xEnd < screenWidth)
00663 {
00664 TextOut( hdc, xOffset, yOffset, szText, strlen(szText) );
00665 xOffset = xEnd ;
00666 }
00667
00668 int nValue ;
00669 dvcGetGain(hDevice,&nValue);
00670 sprintf(szText,"Gain: %d", nValue);
00671 xEnd = xOffset + strlen(szText)*tm.tmAveCharWidth + 20 ;
00672 if(xEnd < screenWidth)
00673 {
00674 TextOut( hdc, xOffset, yOffset, szText, strlen(szText) );
00675 xOffset = xEnd ;
00676 }
00677
00678 dvcGetOffset(hDevice,&nValue);
00679 sprintf(szText,"Offset: %d", nValue);
00680 xEnd = xOffset + strlen(szText)*tm.tmAveCharWidth + 20 ;
00681 if(xEnd < screenWidth)
00682 {
00683 TextOut( hdc, xOffset, yOffset, szText, strlen(szText) );
00684 xOffset = xEnd ;
00685 }
00686
00687 double dExpose = dvcGetExposeMsec(hDevice);
00688 sprintf(szText,"Exposure: %6.2f ms", dExpose);
00689 xEnd = xOffset + strlen(szText)*tm.tmAveCharWidth + 20 ;
00690 if(xEnd < screenWidth)
00691 {
00692 TextOut( hdc, xOffset, yOffset, szText, strlen(szText) );
00693 xOffset = xEnd ;
00694 }
00695
00696 double dMean, dSd ;
00697 ULONG lMin, lMax ;
00698
00699 m_Image.HistogramStats(&dMean,&dSd,&lMin,&lMax);
00700 sprintf(szText,"Mean: %6.2f +/- %6.2f", dMean, dSd);
00701 xEnd = xOffset + strlen(szText)*tm.tmAveCharWidth + 20 ;
00702 if(xEnd < screenWidth)
00703 {
00704 TextOut( hdc, xOffset, yOffset, szText, strlen(szText) );
00705 xOffset = xEnd ;
00706 }
00707
00708 sprintf(szText,"Range: %d - %d", lMin, lMax);
00709 xEnd = xOffset + strlen(szText)*tm.tmAveCharWidth + 20 ;
00710 if(xEnd < screenWidth)
00711 {
00712 TextOut( hdc, xOffset, yOffset, szText, strlen(szText) );
00713 xOffset = xEnd ;
00714 }
00715 }
00716
00717 pdds->ReleaseDC(hdc);
00718
00719 while( bDraw )
00720 {
00721 ddrval = lpDDSBack->BltFast( 0, 0, pdds, &rcRect, FALSE );
00722 if( ddrval == DD_OK ) break;
00723 if( ddrval == DDERR_SURFACELOST )
00724 {
00725 ddrval = restoreAll();
00726 if( ddrval != DD_OK ) break;
00727 }
00728 if( ddrval != DDERR_WASSTILLDRAWING ) break;
00729 }
00730
00731
00732 while( bDraw )
00733 {
00734 ddrval = lpDDSPrimary->Flip( NULL, 0 );
00735 if( ddrval == DD_OK ) break;
00736 if( ddrval == DDERR_SURFACELOST )
00737 {
00738 ddrval = restoreAll();
00739 if( ddrval != DD_OK ) break;
00740 }
00741 if( ddrval != DDERR_WASSTILLDRAWING ) break;
00742 }
00743
00744 return TRUE ;
00745
00746 }