/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* * This file is part of the LibreOffice project. * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef INCLUDED_VCL_OPENGL_OPENGLCONTEXT_HXX #define INCLUDED_VCL_OPENGL_OPENGLCONTEXT_HXX #include #include #if defined( MACOSX ) #elif defined( IOS ) #elif defined( ANDROID ) #elif defined( UNX ) # include # include "GL/glxew.h" # include #elif defined( _WIN32 ) #ifndef INCLUDED_PRE_POST_WIN_H #define INCLUDED_PRE_POST_WIN_H # include "prewin.h" # include "postwin.h" #endif #endif #if defined( _WIN32 ) #include #include #include #elif defined( MACOSX ) #include #ifdef __OBJC__ @class NSOpenGLView; #else class NSOpenGLView; #endif #elif defined( IOS ) #elif defined( ANDROID ) #elif defined( UNX ) #include #define GLX_GLXEXT_PROTOTYPES 1 #include #include #endif #include #include #include #include #include /// Holds the information of our new child window struct GLWindow { // Copy of gluCheckExtension(), from the Apache-licensed // https://code.google.com/p/glues/source/browse/trunk/glues/source/glues_registry.c static GLboolean checkExtension(const GLubyte* extName, const GLubyte* extString) { GLboolean flag=GL_FALSE; char* word; char* lookHere; char* deleteThis; if (extString==NULL) { return GL_FALSE; } deleteThis=lookHere=(char*)malloc(strlen((const char*)extString)+1); if (lookHere==NULL) { return GL_FALSE; } /* strtok() will modify string, so copy it somewhere */ strcpy(lookHere,(const char*)extString); while ((word=strtok(lookHere, " "))!=NULL) { if (strcmp(word,(const char*)extName)==0) { flag=GL_TRUE; break; } lookHere=NULL; /* get next token */ } free((void*)deleteThis); return flag; } #if defined( _WIN32 ) HWND hWnd; HDC hDC; HGLRC hRC; #elif defined( MACOSX ) #elif defined( IOS ) #elif defined( ANDROID ) #elif defined( UNX ) Display* dpy; int screen; Window win; Pixmap pix; #if defined( GLX_EXT_texture_from_pixmap ) GLXFBConfig fbc; #endif XVisualInfo* vi; GLXContext ctx; GLXPixmap glPix; bool HasGLXExtension( const char* name ) { return checkExtension( (const GLubyte*) name, (const GLubyte*) GLXExtensions ); } const char* GLXExtensions; #endif unsigned int bpp; unsigned int Width; unsigned int Height; const GLubyte* GLExtensions; bool bMultiSampleSupported; GLWindow() : #if defined( _WIN32 ) #elif defined( MACOSX ) #elif defined( IOS ) #elif defined( ANDROID ) #elif defined( UNX ) dpy(NULL), screen(0), win(0), #if defined( GLX_EXT_texture_from_pixmap ) fbc(0), #endif vi(NULL), ctx(0), glPix(0), GLXExtensions(NULL), #endif bpp(0), Width(0), Height(0), GLExtensions(NULL), bMultiSampleSupported(false) { } ~GLWindow(); }; class VCLOPENGL_DLLPUBLIC OpenGLContext { public: OpenGLContext(); ~OpenGLContext(); void requestLegacyContext(); void requestSingleBufferedRendering(); void requestVirtualDevice(); bool init(vcl::Window* pParent = 0); bool init(SystemChildWindow* pChildWindow); // these methods are for the deep platform layer, don't use them in normal code // only in vcl's platform code #if defined( UNX ) && !defined MACOSX && !defined IOS && !defined ANDROID bool init(Display* dpy, Window win, int screen); bool init(Display* dpy, Pixmap pix, unsigned int width, unsigned int height, int nScreen); #elif defined( _WIN32 ) bool init( HDC hDC, HWND hWnd ); #endif void makeCurrent(); void resetCurrent(); void swapBuffers(); void sync(); void show(); void setWinPosAndSize(const Point &rPos, const Size& rSize); void setWinSize(const Size& rSize); const GLWindow& getOpenGLWindow() const { return m_aGLWin;} SystemChildWindow* getChildWindow(); const SystemChildWindow* getChildWindow() const; void renderToFile(); bool isInitialized() { return mbInitialized; } bool supportMultiSampling() const; static SystemWindowData generateWinData(vcl::Window* pParent, bool bRequestLegacyContext); private: SAL_DLLPRIVATE bool InitGLEW(); SAL_DLLPRIVATE bool initWindow(); SAL_DLLPRIVATE bool ImplInit(); #if defined( UNX ) && !defined MACOSX && !defined IOS && !defined ANDROID SAL_DLLPRIVATE void initGLWindow(Visual* pVisual); #endif #if defined(MACOSX) NSOpenGLView* getOpenGLView(); #endif GLWindow m_aGLWin; boost::scoped_ptr m_pWindow; vcl::Window* mpWindow; //points to m_pWindow or the parent window, don't delete it SystemChildWindow* m_pChildWindow; boost::scoped_ptr m_pChildWindowGC; bool mbInitialized; bool mbRequestLegacyContext; bool mbUseDoubleBufferedRendering; bool mbRequestVirtualDevice; #if defined( UNX ) && !defined MACOSX && !defined IOS && !defined ANDROID bool mbPixmap; // is a pixmap instead of a window #endif }; #endif /* vim:set shiftwidth=4 softtabstop=4 expandtab: */