Visualization Library

A lightweight C++ OpenGL middleware for 2D/3D graphics
[Home] [Tutorials] [All Classes] [Grouped Classes]

X:/dropbox/visualizationlibrary/src/vlWin32/Win32Context.cpp

Go to the documentation of this file.
00001 /**************************************************************************************/
00002 /*                                                                                    */
00003 /*  Visualization Library                                                             */
00004 /*  http://www.visualizationlibrary.org                                               */
00005 /*                                                                                    */
00006 /*  Copyright (c) 2005-2010, Michele Bosi                                             */
00007 /*  All rights reserved.                                                              */
00008 /*                                                                                    */
00009 /*  Redistribution and use in source and binary forms, with or without modification,  */
00010 /*  are permitted provided that the following conditions are met:                     */
00011 /*                                                                                    */
00012 /*  - Redistributions of source code must retain the above copyright notice, this     */
00013 /*  list of conditions and the following disclaimer.                                  */
00014 /*                                                                                    */
00015 /*  - Redistributions in binary form must reproduce the above copyright notice, this  */
00016 /*  list of conditions and the following disclaimer in the documentation and/or       */
00017 /*  other materials provided with the distribution.                                   */
00018 /*                                                                                    */
00019 /*  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND   */
00020 /*  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED     */
00021 /*  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE            */
00022 /*  DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR  */
00023 /*  ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES    */
00024 /*  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;      */
00025 /*  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON    */
00026 /*  ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT           */
00027 /*  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS     */
00028 /*  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.                      */
00029 /*                                                                                    */
00030 /**************************************************************************************/
00031 
00032 #include <vlWin32/Win32Context.hpp>
00033 #include <vlCore/Log.hpp>
00034 #include <vlCore/Say.hpp>
00035 
00036 using namespace vl;
00037 using namespace vlWin32;
00038 
00039 //-----------------------------------------------------------------------------
00040 Win32Context::~Win32Context()
00041 {
00042 }
00043 //-----------------------------------------------------------------------------
00044 void Win32Context::shareOpenGLResources(HGLRC hGLRC)
00045 {
00046   if (hwnd() && mHDC && mHGLRC)
00047     wglShareLists(hglrc(), hGLRC);
00048 }
00049 //-----------------------------------------------------------------------------
00050 void Win32Context::makeCurrent()
00051 {
00052   if (mHDC && mHGLRC)
00053     wglMakeCurrent(mHDC, mHGLRC);
00054 }
00055 //-----------------------------------------------------------------------------
00056 void Win32Context::update()
00057 {
00058   if (hwnd())
00059     PostMessage(hwnd(), WM_PAINT, 0, 0);
00060 }
00061 //-----------------------------------------------------------------------------
00062 void Win32Context::quitApplication()
00063 {
00064   PostQuitMessage(0);
00065 }
00066 //-----------------------------------------------------------------------------
00067 void Win32Context::setMouseVisible(bool visible)
00068 {
00069   mMouseVisible = visible;
00070   if (visible)
00071     while(ShowCursor(TRUE ) <  0) {}
00072   else
00073     while(ShowCursor(FALSE) >= 0) {}
00074 }
00075 //-----------------------------------------------------------------------------
00076 void Win32Context::setPosition(int x, int y)
00077 {
00078   if (hwnd())
00079       SetWindowPos(hwnd(), 0, x, y, 0, 0, SWP_NOSIZE );
00080 }
00081 //-----------------------------------------------------------------------------
00082 void Win32Context::setSize(int w, int h)
00083 {
00084   if (hwnd())
00085   {
00086     RECT windowRect = { 0, 0, w, h };
00087     AdjustWindowRectEx(&windowRect, (DWORD)GetWindowLongPtr(hwnd(), GWL_STYLE), 0, (DWORD)GetWindowLongPtr(hwnd(), GWL_EXSTYLE) );
00088     // computes the actual window based on the client dimensions
00089     int cx = windowRect.right  - windowRect.left;
00090     int cy = windowRect.bottom - windowRect.top;
00091     SetWindowPos(hwnd(), 0, 0, 0, cx, cy, SWP_NOMOVE );
00092   }
00093 }
00094 //-----------------------------------------------------------------------------
00095 void Win32Context::setWindowSize(int w, int h)
00096 {
00097   // this are set by WM_SIZE event handler
00098   // mFramebuffer->setWidth(w);
00099   // mFramebuffer->setHeight(h);
00100     SetWindowPos(hwnd(), 0, 0, 0, w, h, SWP_NOMOVE);
00101 }
00102 //-----------------------------------------------------------------------------
00103 vl::ivec2 Win32Context::position() const
00104 {
00105   RECT r = {0,0,0,0};
00106   if (hwnd())
00107       GetWindowRect(hwnd(), &r);
00108   return vl::ivec2(r.left,r.top);
00109 }
00110 //-----------------------------------------------------------------------------
00111 vl::ivec2 Win32Context::windowSize() const
00112 {
00113   RECT r = {0,0,0,0};
00114   if (hwnd())
00115       GetWindowRect(hwnd(), &r);
00116   return vl::ivec2(r.right - r.left, r.bottom - r.top);
00117 }
00118 //-----------------------------------------------------------------------------
00119 vl::ivec2 Win32Context::size() const
00120 {
00121   RECT r = {0,0,0,0};
00122   if (hwnd())
00123       GetClientRect(hwnd(), &r);
00124   return vl::ivec2(r.right - r.left, r.bottom - r.top);
00125 //  return vl::ivec2(width(), height());
00126 }
00127 //-----------------------------------------------------------------------------
00128 void Win32Context::setWindowTitle(const String& title)
00129 {
00130   if (hwnd())
00131     SetWindowText(hwnd(), (wchar_t*)title.ptr());
00132 }
00133 //-----------------------------------------------------------------------------
00134 void Win32Context::show()
00135 {
00136   if (hwnd())
00137     ShowWindow(hwnd(), SW_SHOW);
00138 }
00139 //-----------------------------------------------------------------------------
00140 void Win32Context::hide()
00141 {
00142   if (hwnd())
00143     ShowWindow(hwnd(), SW_HIDE);
00144 }
00145 //-----------------------------------------------------------------------------
00146 void Win32Context::getFocus()
00147 {
00148   if (hwnd())
00149     SetFocus(hwnd());
00150 }
00151 //-----------------------------------------------------------------------------
00152 void Win32Context::setMousePosition(int x, int y)
00153 {
00154   if (hwnd())
00155   {
00156     POINT pt = {x, y};
00157     ClientToScreen( hwnd(), &pt );
00158     SetCursorPos(pt.x, pt.y);
00159   }
00160 }
00161 //-----------------------------------------------------------------------------
00162 void Win32Context::swapBuffers()
00163 {
00164   if(hwnd() && hdc())
00165     SwapBuffers(hdc());
00166 }
00167 //-----------------------------------------------------------------------------
00168 bool Win32Context::setFullscreen(bool fullscreen_on)
00169 {
00170   if (!hwnd())
00171     return false;
00172 
00173   if (fullscreen_on == fullscreen())
00174     return true;
00175 
00176   if (!fullscreen_on)
00177   {
00178     SetWindowLongPtr(hwnd(), GWL_STYLE, mNormFlags/*swl_style*/);
00179 
00180     if (!((mNormFlags & WS_MAXIMIZE) || (mNormFlags & WS_MINIMIZE)))
00181     {
00182       setPosition(mNormPosit.x(),mNormPosit.y());
00183       setSize(mNormSize.x(), mNormSize.y());
00184     }
00185 
00186     SetWindowPos(hwnd(), 0, 0, 0, 0, 0, SWP_FRAMECHANGED | SWP_NOZORDER | SWP_NOSIZE | SWP_NOMOVE);
00187 
00188     // restores display settings
00189     ChangeDisplaySettings(NULL, 0);
00190   }
00191   else
00192   {
00193     DEVMODE devmode;
00194     EnumDisplaySettings(NULL,ENUM_CURRENT_SETTINGS,&devmode);
00195 
00196     // devmode.dmPelsWidth  = ... leave current width
00197     // devmode.dmPelsHeight = ... leave current height
00198     // change color depth
00199     devmode.dmBitsPerPel = openglContextInfo().bitsPerPixel();                    
00200       devmode.dmFields       |= DM_BITSPERPEL;
00201 
00202     mNormFlags = (unsigned int)GetWindowLongPtr(hwnd(), GWL_STYLE);
00203     mNormPosit = position();
00204     mNormSize  = size();
00205 
00206     switch( ChangeDisplaySettings(&devmode, CDS_FULLSCREEN) )
00207     {
00208       case DISP_CHANGE_SUCCESSFUL:
00209       {
00210         RECT windowRect = { 0, 0, devmode.dmPelsWidth, devmode.dmPelsHeight };
00211         /*mStyle = */SetWindowLongPtr(hwnd(), GWL_STYLE, WS_POPUP | WS_VISIBLE );
00212         AdjustWindowRectEx(&windowRect, (DWORD)GetWindowLongPtr(hwnd(), GWL_STYLE), 0, (DWORD)GetWindowLongPtr(hwnd(), GWL_EXSTYLE) );
00213         SetWindowPos(hwnd(), HWND_TOP, windowRect.left, windowRect.top, windowRect.right - windowRect.left, windowRect.bottom - windowRect.top, SWP_FRAMECHANGED );
00214         break;
00215       }
00216       #if(_WIN32_WINNT >= 0x0501)
00217         case DISP_CHANGE_BADDUALVIEW:
00218           MessageBox(NULL, L"Full-screen mode switch failed: DISP_CHANGE_BADDUALVIEW", L"Win32Context::setFullscreen() error!", MB_OK | MB_ICONEXCLAMATION);
00219           return false;
00220       #endif
00221       case DISP_CHANGE_BADFLAGS:
00222         MessageBox(NULL, L"Full-screen mode switch failed: DISP_CHANGE_BADFLAGS", L"Win32Context::setFullscreen() error!", MB_OK | MB_ICONEXCLAMATION);
00223         return false;
00224       case DISP_CHANGE_BADMODE:
00225         MessageBox(NULL, L"Full-screen mode switch failed: DISP_CHANGE_BADMODE", L"Win32Context::setFullscreen() error!", MB_OK | MB_ICONEXCLAMATION);
00226         return false;
00227       case DISP_CHANGE_BADPARAM:
00228         MessageBox(NULL, L"Full-screen mode switch failed: DISP_CHANGE_BADPARAM", L"Win32Context::setFullscreen() error!", MB_OK | MB_ICONEXCLAMATION);
00229         return false;
00230       case DISP_CHANGE_FAILED:
00231         MessageBox(NULL, L"Full-screen mode switch failed: DISP_CHANGE_FAILED", L"Win32Context::setFullscreen() error!", MB_OK | MB_ICONEXCLAMATION);
00232         return false;
00233       case DISP_CHANGE_NOTUPDATED:
00234         MessageBox(NULL, L"Full-screen mode switch failed: DISP_CHANGE_NOTUPDATED", L"Win32Context::setFullscreen() error!", MB_OK | MB_ICONEXCLAMATION);
00235         return false;
00236       case DISP_CHANGE_RESTART:
00237         MessageBox(NULL, L"Full-screen mode switch failed: DISP_CHANGE_RESTART", L"Win32Context::setFullscreen() error!", MB_OK | MB_ICONEXCLAMATION);
00238         return false;
00239       default:
00240         return false;
00241     }
00242   }
00243 
00244   mFullscreen = fullscreen_on;
00245   update();
00246   return true;
00247 }
00248 //-----------------------------------------------------------------------------
00249 bool Win32Context::initWin32GLContext(HGLRC share_context, const vl::String& title, const vl::OpenGLContextFormat& fmt, int x, int y, int width, int height)
00250 {
00251   class InOutContract
00252   {
00253     Win32Context* mContext;
00254 
00255   public:
00256     bool mOK;
00257 
00258     InOutContract(Win32Context* context): mContext(context), mOK(true)
00259     {
00260       cleanup();
00261     }
00262     
00263     ~InOutContract()
00264     {
00265       if (!mOK)
00266         cleanup();
00267     }
00268 
00269     void cleanup()
00270     {
00271       // delete HDC
00272       if (mContext->mHDC)
00273       {
00274         DeleteDC(mContext->mHDC);
00275         mContext->mHDC = NULL;
00276       }
00277 
00278       // delete HGLRC
00279       if (mContext->mHGLRC)
00280       {
00281         if ( wglDeleteContext(mContext->mHGLRC) == FALSE )
00282         {
00283           MessageBox(NULL, L"OpenGL context cleanup failed.\n"
00284            L"The handle either doesn't specify a valid context or the context is being used by another thread.", 
00285            L"Win32Context::init() error!", MB_OK);
00286           mOK = false;
00287         }
00288         mContext->mHGLRC = NULL;
00289       }
00290     }
00291   } contract(this);
00292 
00293   if (!contract.mOK)
00294     return false;
00295 
00296   framebuffer()->setWidth(width);
00297   framebuffer()->setHeight(height);
00298 
00299   if (!hwnd())
00300   {
00301     MessageBox(NULL, L"Cannot create OpenGL context: null HWND.", L"Win32Context::init() error!", MB_OK);
00302     return contract.mOK = false;
00303   }
00304 
00305   setWindowTitle(title);
00306 
00307   VL_CHECK(mHDC == NULL);
00308   mHDC = ::GetDC(hwnd());
00309   if (!mHDC)
00310   {
00311     MessageBox(NULL, L"Device context acquisition failed.", L"Win32Context::init() error!", MB_OK); 
00312     return contract.mOK = false;
00313   }
00314 
00315   int pixel_format_index = vlWin32::choosePixelFormat(fmt);
00316   if (pixel_format_index == -1)
00317   {
00318     MessageBox(NULL, L"No suitable pixel fmt found.", L"Win32Context::init() error!", MB_OK); 
00319     return contract.mOK = false;
00320   }
00321 
00322   if (SetPixelFormat(mHDC, pixel_format_index, NULL) == FALSE)
00323   {
00324     MessageBox(NULL, L"Pixel fmt setup failed.", L"Win32Context::init() error!", MB_OK);
00325     return contract.mOK = false;
00326   }
00327 
00328   // OpenGL rendering context creation
00329 
00330   if (wglCreateContextAttribsARB && mContextAttribs.size() > 1)
00331   {
00332     // must be 0-terminated list
00333     VL_CHECK(mContextAttribs.back() == 0);
00334     // Creates an OpenGL 3.x / 4.x context with the specified attributes.
00335     mHGLRC = wglCreateContextAttribsARB(mHDC, 0, &mContextAttribs[0]);
00336   }
00337   else
00338   {
00339     // Creates default OpenGL context
00340     mHGLRC = wglCreateContext(mHDC);
00341   }
00342 
00343   if (!mHGLRC)
00344   {
00345     MessageBox(NULL, L"OpenGL rendering context creation failed.", L"Win32Context::init() error!", MB_OK);
00346     return contract.mOK = false;
00347   }
00348 
00349   // init GL context and makes it current
00350   // mic fixme: check this also on all the other GUI bindings.
00351   if( !initGLContext() )
00352     return contract.mOK = false;
00353 
00354   if (fmt.multisample() && !Has_GL_ARB_multisample)
00355     vl::Log::error("WGL_ARB_multisample not supported.\n");
00356 
00357   dispatchInitEvent();
00358 
00359   setPosition(x, y);
00360 
00361   setSize(width, height);
00362 
00363   if (Has_GL_EXT_swap_control)
00364     wglSwapIntervalEXT( fmt.vSync() ? 1 : 0 );
00365 
00366   if (share_context)
00367     shareOpenGLResources(share_context);
00368 
00369   if (fmt.fullscreen())
00370     setFullscreen(true);
00371   
00372   return contract.mOK = true;
00373 }
00374 //-----------------------------------------------------------------------------
00375 void Win32Context::setContextAttribs(const int* attribs, int size)
00376 {
00377   mContextAttribs.resize(size);
00378   for(int i = 0; i < size; ++i)
00379     mContextAttribs[ i ] = attribs[ i ];
00380 }
00381 //-----------------------------------------------------------------------------
00382 namespace vlWin32
00383 { 
00384   extern bool registerClass(); 
00385   extern const wchar_t* gWin32WindowClassName;
00386 }
00387 //-----------------------------------------------------------------------------
00388 int vlWin32::choosePixelFormat(const vl::OpenGLContextFormat& fmt, bool verbose)
00389 {
00390   if (!registerClass())
00391     return false;
00392 
00393   // this is true only under Win32
00394   // VL_CHECK( sizeof(wchar_t) == sizeof(short int) )
00395 
00396   HWND hWnd = CreateWindowEx(
00397     WS_EX_APPWINDOW | WS_EX_ACCEPTFILES,
00398     gWin32WindowClassName,
00399     L"Temp GL Window",
00400     WS_OVERLAPPEDWINDOW | WS_CLIPSIBLINGS | WS_CLIPCHILDREN,
00401     CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 
00402     NULL, NULL, GetModuleHandle(NULL), NULL);
00403 
00404   if (!hWnd)
00405   {
00406     if (verbose) MessageBox(NULL, L"choosePixelFormat() critical failure: could not create window.", L"Visualization Library error", MB_OK);
00407     return -1;
00408   }
00409 
00410   HDC hDC = GetDC(hWnd);
00411   if (!hDC)
00412   {
00413     if (verbose) MessageBox(NULL, L"choosePixelFormat() critical failure: could not create HDC.", L"Visualization Library error", MB_OK);
00414     DestroyWindow(hWnd);
00415     return -1;
00416   }
00417 
00418   PIXELFORMATDESCRIPTOR pfd;
00419   memset(&pfd, 0, sizeof(pfd));
00420   pfd.nSize           = sizeof(pfd);
00421   pfd.nVersion        = 1;
00422   pfd.dwFlags         = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL;
00423   pfd.dwFlags         |= fmt.doubleBuffer() ? PFD_DOUBLEBUFFER : 0;
00424   pfd.dwFlags         |= fmt.stereo() ? PFD_STEREO : 0;
00425   pfd.iPixelType      = PFD_TYPE_RGBA;
00426   pfd.cColorBits      = 0;
00427   pfd.cRedBits        = (BYTE)fmt.rgbaBits().r();
00428   pfd.cGreenBits      = (BYTE)fmt.rgbaBits().g();
00429   pfd.cBlueBits       = (BYTE)fmt.rgbaBits().b();
00430   pfd.cAlphaBits      = (BYTE)fmt.rgbaBits().a();
00431   pfd.cAccumRedBits   = (BYTE)fmt.accumRGBABits().r();
00432   pfd.cAccumGreenBits = (BYTE)fmt.accumRGBABits().g();
00433   pfd.cAccumBlueBits  = (BYTE)fmt.accumRGBABits().b();
00434   pfd.cAccumAlphaBits = (BYTE)fmt.accumRGBABits().a();
00435   pfd.cDepthBits      = (BYTE)fmt.depthBufferBits();
00436   pfd.cStencilBits    = (BYTE)fmt.stencilBufferBits();
00437   pfd.iLayerType      = PFD_MAIN_PLANE;
00438 
00439   int pixel_format_index = ChoosePixelFormat(hDC, &pfd);
00440 
00441   if (pixel_format_index == 0)
00442   {
00443     if (verbose) MessageBox(NULL, L"choosePixelFormat() critical failure: could not choose temporary format.", L"Visualization Library error", MB_OK);
00444     DeleteDC(hDC);
00445     DestroyWindow(hWnd);
00446     return -1;
00447   }
00448 
00449   if (SetPixelFormat(hDC, pixel_format_index, &pfd) == FALSE)
00450   {
00451     if (verbose) MessageBox(NULL, L"choosePixelFormat() critical failure: could not set temporary format.", L"Visualization Library error", MB_OK);
00452     DeleteDC(hDC);
00453     DestroyWindow(hWnd);
00454     return -1;
00455   }
00456 
00457   // OpenGL Rendering Context
00458   HGLRC hGLRC = wglCreateContext(hDC);
00459   if (!hGLRC)
00460   {
00461     if (verbose) MessageBox(NULL, L"choosePixelFormat() critical failure: could not create temporary OpenGL context.", L"Visualization Library error", MB_OK);
00462     DeleteDC(hDC);
00463     DestroyWindow(hWnd);
00464     return -1;
00465   }
00466 
00467   wglMakeCurrent(hDC, hGLRC);
00468 
00469   if (!initializeOpenGL())
00470   {
00471     fprintf(stderr, "Error initializing OpenGL!\n");
00472     DeleteDC(hDC);
00473     DestroyWindow(hWnd);
00474     return -1;
00475   }
00476 
00477   // if this is not supported we use the current 'pixel_format_index' returned by ChoosePixelFormat above.
00478 
00479   int samples = 0;
00480   if(Has_WGL_ARB_pixel_format && fmt.multisample())
00481   {
00482     float fAttributes[] = { 0, 0 };
00483     int iAttributes[] =
00484     {
00485       // multi sampling
00486         WGL_SAMPLE_BUFFERS_ARB, GL_TRUE,
00487       WGL_SAMPLES_ARB,        -1, // this is set below
00488       // generic
00489         WGL_DRAW_TO_WINDOW_ARB, GL_TRUE,
00490         WGL_SUPPORT_OPENGL_ARB, GL_TRUE,
00491         WGL_ACCELERATION_ARB,   WGL_FULL_ACCELERATION_ARB,
00492       // color buffer
00493       WGL_RED_BITS_ARB,         pfd.cRedBits,
00494       WGL_GREEN_BITS_ARB,       pfd.cGreenBits,
00495       WGL_BLUE_BITS_ARB,        pfd.cBlueBits,
00496       WGL_ALPHA_BITS_ARB,       pfd.cAlphaBits,
00497       // accumulation buffer
00498       WGL_ACCUM_RED_BITS_ARB,   pfd.cAccumRedBits,
00499       WGL_ACCUM_GREEN_BITS_ARB, pfd.cAccumGreenBits,
00500       WGL_ACCUM_BLUE_BITS_ARB,  pfd.cAccumBlueBits,
00501       WGL_ACCUM_ALPHA_BITS_ARB, pfd.cAccumAlphaBits,
00502       // depth buffer
00503       WGL_DEPTH_BITS_ARB,       pfd.cDepthBits,
00504       WGL_DOUBLE_BUFFER_ARB,    fmt.doubleBuffer() ? GL_TRUE : GL_FALSE,
00505       // stencil buffer
00506       WGL_STENCIL_BITS_ARB,     pfd.cStencilBits,
00507       // stereo
00508       WGL_STEREO_ARB,           fmt.stereo() ? GL_TRUE : GL_FALSE,
00509         0,0
00510     };
00511 
00512     for(samples = fmt.multisampleSamples(); samples > 1; samples/=2)
00513     {
00514       // sets WGL_SAMPLES_ARB value
00515       iAttributes[3] = samples;
00516       pixel_format_index = -1;
00517       UINT num_formats  = 0;
00518       if ( wglChoosePixelFormatARB(hDC,iAttributes,fAttributes,1,&pixel_format_index,&num_formats) && num_formats >= 1 )
00519         break;
00520       else
00521         pixel_format_index = -1;
00522     }
00523   }
00524 
00525   // destroy temporary HWND, HDC, HGLRC
00526   if ( wglDeleteContext(hGLRC) == FALSE )
00527     if (verbose) MessageBox(NULL, L"Error deleting temporary OpenGL context, wglDeleteContext(hGLRC) failed.", L"Visualization Library error", MB_OK);
00528   DeleteDC(hDC);
00529   DestroyWindow(hWnd);
00530 
00531   if (verbose)
00532   {
00533     if(pixel_format_index == -1)
00534       vl::Log::error("No suitable pixel format found.\n");
00535     else
00536     {
00537       // check the returned pixel format
00538       #if defined(DEBUG) || !defined(NDEBUG)
00539         DescribePixelFormat(hDC, pixel_format_index, sizeof(PIXELFORMATDESCRIPTOR), &pfd);
00540         vl::Log::debug(" --- vlWin32::choosePixelFormat() ---\n");
00541         // This one returns "not supported" even when its supported...
00542         // vl::Log::print( vl::Say("  OpenGL        = %s\n") << (pfd.dwFlags & PFD_SUPPORT_OPENGL ? "Supported" : "Not supported") );
00543         vl::Log::debug( vl::Say("RGBA Bits     = %n %n %n %n\n") << pfd.cRedBits << pfd.cGreenBits << pfd.cBlueBits << pfd.cAlphaBits);
00544         vl::Log::debug( vl::Say("Depth Bits    = %n\n")  << pfd.cDepthBits );
00545         vl::Log::debug( vl::Say("Stencil Bits  = %n \n") << pfd.cStencilBits);
00546         vl::Log::debug( vl::Say("Double Buffer = %s\n")  << (pfd.dwFlags & PFD_DOUBLEBUFFER ? "Yes" : "No") );
00547         vl::Log::debug( vl::Say("Stereo        = %s\n")  << (pfd.dwFlags & PFD_STEREO ? "Yes" : "No") );
00548         vl::Log::debug( vl::Say("Samples       = %n\n")  << samples );
00549         vl::Log::debug("\n");
00550       #endif
00551     }
00552   }
00553 
00554   return pixel_format_index;
00555 }
00556 //-----------------------------------------------------------------------------

Visualization Library 2011.09.1160 Reference Documentation
Copyright 2005-2011 Michele Bosi. All rights reserved.
Updated on Thu May 2 2013 13:40:44.
Permission is granted to use this page to write and publish articles regarding Visualization Library.