text: /////////////////////////////////////////////////////////////////////////////
  // Name:        wx/msw/glcanvas.h
  // Purpose:     wxGLCanvas, for using OpenGL with wxWidgets under Windows
  // Author:      Julian Smart
  // Modified by:
  // Created:     04/01/98
  // Copyright:   (c) Julian Smart
  // Licence:     wxWindows licence
  /////////////////////////////////////////////////////////////////////////////
  
  #ifndef _WX_GLCANVAS_H_
  #define _WX_GLCANVAS_H_
  
  #include "wx/palette.h"
  
  #include "wx/msw/wrapwin.h"
  
  #include <GL/gl.h>
  
  // ----------------------------------------------------------------------------
  // wxGLContext: OpenGL rendering context
  // ----------------------------------------------------------------------------
  
  class WXDLLIMPEXP_GL wxGLContext : public wxGLContextBase
  {
  public:
      wxGLContext(wxGLCanvas *win,
                  const wxGLContext *other = NULL,
                  const wxGLContextAttrs *ctxAttrs = NULL);
      virtual ~wxGLContext();
  
      virtual bool SetCurrent(const wxGLCanvas& win) const wxOVERRIDE;
  
      HGLRC GetGLRC() const { return m_glContext; }
  
  protected:
      HGLRC m_glContext;
  
  private:
      wxDECLARE_CLASS(wxGLContext);
  };
  
  // ----------------------------------------------------------------------------
  // wxGLCanvas: OpenGL output window
  // ----------------------------------------------------------------------------
  
  class WXDLLIMPEXP_GL wxGLCanvas : public wxGLCanvasBase
  {
  public:
      explicit // avoid implicitly converting a wxWindow* to wxGLCanvas
      wxGLCanvas(wxWindow *parent,
                 const wxGLAttributes& dispAttrs,
                 wxWindowID id = wxID_ANY,
                 const wxPoint& pos = wxDefaultPosition,
                 const wxSize& size = wxDefaultSize,
                 long style = 0,
                 const wxString& name = wxGLCanvasName,
                 const wxPalette& palette = wxNullPalette);
  
      explicit
      wxGLCanvas(wxWindow *parent,
                 wxWindowID id = wxID_ANY,
                 const int *attribList = NULL,
                 const wxPoint& pos = wxDefaultPosition,
                 const wxSize& size = wxDefaultSize,
                 long style = 0,
                 const wxString& name = wxGLCanvasName,
                 const wxPalette& palette = wxNullPalette);
  
      bool Create(wxWindow *parent,
                  const wxGLAttributes& dispAttrs,
                  wxWindowID id = wxID_ANY,
                  const wxPoint& pos = wxDefaultPosition,
                  const wxSize& size = wxDefaultSize,
                  long style = 0,
                  const wxString& name = wxGLCanvasName,
                  const wxPalette& palette = wxNullPalette);
  
      bool Create(wxWindow *parent,
                  wxWindowID id = wxID_ANY,
                  const wxPoint& pos = wxDefaultPosition,
                  const wxSize& size = wxDefaultSize,
                  long style = 0,
                  const wxString& name = wxGLCanvasName,
                  const int *attribList = NULL,
                  const wxPalette& palette = wxNullPalette);
  
      virtual ~wxGLCanvas();
  
      // implement wxGLCanvasBase methods
      virtual bool SwapBuffers() wxOVERRIDE;
  
  
      // MSW-specific helpers
      // --------------------
  
      // get the HDC used for OpenGL rendering
      HDC GetHDC() const { return m_hDC; }
  
      // Try to find pixel format matching the given attributes list for the
      // specified HDC, return 0 on error, otherwise ppfd is filled in with the
      // information from dispAttrs
      static int FindMatchingPixelFormat(const wxGLAttributes& dispAttrs,
                                         PIXELFORMATDESCRIPTOR* ppfd = NULL);
      // Same as FindMatchingPixelFormat
      static int ChooseMatchingPixelFormat(HDC hdc, const int *attribList,
                                           PIXELFORMATDESCRIPTOR *pfd = NULL);
  
  #if wxUSE_PALETTE
      // palette stuff
      bool SetupPalette(const wxPalette& palette);
      virtual wxPalette CreateDefaultPalette() wxOVERRIDE;
      void OnQueryNewPalette(wxQueryNewPaletteEvent& event);
      void OnPaletteChanged(wxPaletteChangedEvent& event);
  #endif // wxUSE_PALETTE
  
      // deprecated methods using the implicit wxGLContext, associate the context
      // explicitly with the window instead
  #if WXWIN_COMPATIBILITY_2_8
      wxDEPRECATED(
      wxGLCanvas(wxWindow *parent,
                 wxWindowID id = wxID_ANY,
                 const wxPoint& pos = wxDefaultPosition,
                 const wxSize& size = wxDefaultSize,
                 long style = 0,
                 const wxString& name = wxGLCanvasName,
                 const int *attribList = NULL,
                 const wxPalette& palette = wxNullPalette)
      );
  
      wxDEPRECATED(
      wxGLCanvas(wxWindow *parent,
                 const wxGLContext *shared,
                 wxWindowID id = wxID_ANY,
                 const wxPoint& pos = wxDefaultPosition,
                 const wxSize& size = wxDefaultSize,
                 long style = 0,
                 const wxString& name = wxGLCanvasName,
                 const int *attribList = NULL,
                 const wxPalette& palette = wxNullPalette)
      );
  
      wxDEPRECATED(
      wxGLCanvas(wxWindow *parent,
                 const wxGLCanvas *shared,
                 wxWindowID id = wxID_ANY,
                 const wxPoint& pos = wxDefaultPosition,
                 const wxSize& size = wxDefaultSize,
                 long style = 0,
                 const wxString& name = wxGLCanvasName,
                 const int *attribList = NULL,
                 const wxPalette& palette = wxNullPalette)
      );
  #endif // WXWIN_COMPATIBILITY_2_8
  
  protected:
      // common part of all ctors
      void Init();
  
      // the real window creation function, Create() may reuse it twice as we may
      // need to create an OpenGL window to query the available extensions and
      // then potentially delete and recreate it with another pixel format
      bool CreateWindow(wxWindow *parent,
                        wxWindowID id = wxID_ANY,
                        const wxPoint& pos = wxDefaultPosition,
                        const wxSize& size = wxDefaultSize,
                        long style = 0,
                        const wxString& name = wxGLCanvasName);
  
      // set up the pixel format using the given attributes and palette
      int DoSetup(PIXELFORMATDESCRIPTOR &pfd, const int *attribList);
  
  
      // HDC for this window, we keep it all the time
      HDC m_hDC;
  
  private:
      wxDECLARE_EVENT_TABLE();
      wxDECLARE_CLASS(wxGLCanvas);
  };
  
  #endif // _WX_GLCANVAS_H_
  