FullScreen.cpp

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;           // DirectDraw object
00041 LPDIRECTDRAWSURFACE     lpDDSPrimary;   // DirectDraw primary surface
00042 LPDIRECTDRAWSURFACE     lpDDSBack;      // DirectDraw back surface
00043 LPDIRECTDRAWSURFACE     lpDDSOne;       // Offscreen surface 1
00044 LPDIRECTDRAWSURFACE     lpDDSTwo;       // Offscreen surface 2
00045 BOOL                    bActive;        // is application active?
00046 
00047 /*
00048  * finiObjects
00049  * finished with all objects we use; release them
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 } /* finiObjects */
00081 
00082 /*
00083  * restoreAll
00084  *
00085  * restore all lost objects
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 } /* restoreAll */
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 } /* WindowProc */
00253 
00254 /*
00255  * This function is called if the initialization function fails
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 } /* initFail */
00265 
00266 /*
00267  * doInit - do work required for every instance of the application:
00268  *                create the window, initialize data
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      * set up and register window class
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      * create a window
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      * create the main DirectDraw object
00322      */
00323     ddrval = DirectDrawCreate( NULL, &lpDD, NULL );
00324     if( ddrval != DD_OK ) return initFail(hwnd);
00325 
00326     // Get exclusive mode
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     // Create the primary surface with 1 back buffer
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     // Create a offscreen bitmap.
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     // Create another offscreen bitmap.
00371     ddrval = lpDD->CreateSurface( &ddsd, &lpDDSTwo, NULL );
00372     if( ddrval != DD_OK ) return initFail(hwnd);
00373 
00374     // Create a timer to flip the pages
00375     if( !SetTimer( hwnd, TIMER_ID, timerRate, NULL ) ) return initFail(hwnd);
00376 
00377     return TRUE;
00378 
00379 } /* doInit */
00380 
00381 /*
00382  * WinMain - initialization, message loop
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 } /* WinMain */
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     // dvcResetCamera(hDevice);
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     // Was a frame delivered ?
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         //xOffset += strlen(szText)*10+20 ;
00657         xOffset += strlen(szText)*tm.tmAveCharWidth + 20 ;
00658 
00659         sprintf(szText,"FPS: %5.2f",dvcGetFrameRate(hDevice));
00660         // sprintf(szText,"Frame: %d",dvcGetFrameCount(hDevice));
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     // Flip surfaces
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 }

©DVC Company, 2006. All rights reserved.    www.dvcco.com   Created Thu Nov 16 10:07:21 2006