# Visualization Library

A lightweight C++ OpenGL middleware for 2D/3D graphics

[Home] [Tutorials] [All Classes] [Grouped Classes]

- Main Page
- Related Pages
- Namespaces
- Classes
- Files

- File List
- File Members

# D:/VL/BuildSystem/VL_DISTRO/Visualization_Library_SDK/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 v2011.09.1162 Reference Documentation
Copyright 2005-2011 Michele Bosi. All rights reserved.
Updated on Thu Jan 26 2012 00:43:47.
Permission is granted to use this page to write and publish articles regarding Visualization Library.