Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : */
9 :
10 : #ifndef INCLUDED_VCL_OPENGL_OPENGLCONTEXT_HXX
11 : #define INCLUDED_VCL_OPENGL_OPENGLCONTEXT_HXX
12 :
13 : #include <string.h>
14 :
15 : #include <GL/glew.h>
16 :
17 : #if defined( MACOSX )
18 : #elif defined( IOS )
19 : #elif defined( ANDROID )
20 : #elif defined( UNX )
21 : # include <prex.h>
22 : # include "GL/glxew.h"
23 : # include <postx.h>
24 : #elif defined( _WIN32 )
25 : # include "prewin.h"
26 : # include "postwin.h"
27 : #endif
28 :
29 : #if defined( _WIN32 )
30 : #include <GL/glext.h>
31 : #include <GL/wglext.h>
32 : #elif defined( MACOSX )
33 : #include <OpenGL/OpenGL.h>
34 : #ifdef __OBJC__
35 : @class NSOpenGLView;
36 : #else
37 : class NSOpenGLView;
38 : #endif
39 : #elif defined( IOS )
40 : #elif defined( ANDROID )
41 : #elif defined( UNX )
42 : #include <GL/glext.h>
43 : #define GLX_GLXEXT_PROTOTYPES 1
44 : #include <GL/glx.h>
45 : #include <GL/glxext.h>
46 : #endif
47 :
48 : #include <vcl/vclopengl_dllapi.hxx>
49 : #include <boost/scoped_ptr.hpp>
50 : #include <vcl/window.hxx>
51 : #include <tools/gen.hxx>
52 : #include <vcl/syschild.hxx>
53 :
54 : /// Holds the information of our new child window
55 : struct GLWindow
56 : {
57 : // Copy of gluCheckExtension(), from the Apache-licensed
58 : // https://code.google.com/p/glues/source/browse/trunk/glues/source/glues_registry.c
59 0 : static GLboolean checkExtension(const GLubyte* extName, const GLubyte* extString)
60 : {
61 0 : GLboolean flag=GL_FALSE;
62 : char* word;
63 : char* lookHere;
64 : char* deleteThis;
65 :
66 0 : if (extString==NULL)
67 : {
68 0 : return GL_FALSE;
69 : }
70 :
71 0 : deleteThis=lookHere=(char*)malloc(strlen((const char*)extString)+1);
72 0 : if (lookHere==NULL)
73 : {
74 0 : return GL_FALSE;
75 : }
76 :
77 : /* strtok() will modify string, so copy it somewhere */
78 0 : strcpy(lookHere,(const char*)extString);
79 :
80 0 : while ((word=strtok(lookHere, " "))!=NULL)
81 : {
82 0 : if (strcmp(word,(const char*)extName)==0)
83 : {
84 0 : flag=GL_TRUE;
85 0 : break;
86 : }
87 0 : lookHere=NULL; /* get next token */
88 : }
89 0 : free((void*)deleteThis);
90 :
91 0 : return flag;
92 : }
93 :
94 : #if defined( _WIN32 )
95 : HWND hWnd;
96 : HDC hDC;
97 : HGLRC hRC;
98 : #elif defined( MACOSX )
99 : #elif defined( IOS )
100 : #elif defined( ANDROID )
101 : #elif defined( UNX )
102 : Display* dpy;
103 : int screen;
104 : Window win;
105 : #if defined( GLX_EXT_texture_from_pixmap )
106 : GLXFBConfig fbc;
107 : #endif
108 : XVisualInfo* vi;
109 : GLXContext ctx;
110 :
111 0 : bool HasGLXExtension( const char* name ) { return checkExtension( (const GLubyte*) name, (const GLubyte*) GLXExtensions ); }
112 : const char* GLXExtensions;
113 : #endif
114 : unsigned int bpp;
115 : unsigned int Width;
116 : unsigned int Height;
117 : const GLubyte* GLExtensions;
118 : bool bMultiSampleSupported;
119 :
120 : bool HasGLExtension( const char* name ) { return checkExtension( (const GLubyte*) name, GLExtensions ); }
121 :
122 34 : GLWindow()
123 : :
124 : #if defined( _WIN32 )
125 : #elif defined( MACOSX )
126 : #elif defined( IOS )
127 : #elif defined( ANDROID )
128 : #elif defined( UNX )
129 : dpy(NULL),
130 : screen(0),
131 : win(0),
132 : #if defined( GLX_EXT_texture_from_pixmap )
133 : fbc(0),
134 : #endif
135 : vi(NULL),
136 : ctx(0),
137 : GLXExtensions(NULL),
138 : #endif
139 : bpp(0),
140 : Width(0),
141 : Height(0),
142 : GLExtensions(NULL),
143 34 : bMultiSampleSupported(false)
144 : {
145 34 : }
146 :
147 : ~GLWindow();
148 : };
149 :
150 : class VCLOPENGL_DLLPUBLIC OpenGLContext
151 : {
152 : public:
153 : OpenGLContext();
154 : ~OpenGLContext();
155 :
156 : void requestLegacyContext();
157 :
158 : bool init(vcl::Window* pParent = 0);
159 : bool init(SystemChildWindow* pChildWindow);
160 :
161 : void makeCurrent();
162 : void resetCurrent();
163 : void swapBuffers();
164 : void sync();
165 : void show();
166 :
167 : void setWinPosAndSize(const Point &rPos, const Size& rSize);
168 : void setWinSize(const Size& rSize);
169 0 : GLWindow& getOpenGLWindow() { return m_aGLWin;}
170 :
171 : SystemChildWindow* getChildWindow();
172 : const SystemChildWindow* getChildWindow() const;
173 :
174 : void renderToFile();
175 :
176 0 : bool isInitialized()
177 : {
178 0 : return mbInitialized;
179 : }
180 :
181 : bool supportMultiSampling() const;
182 :
183 : static SystemWindowData generateWinData(vcl::Window* pParent, bool bRequestLegacyContext);
184 :
185 : private:
186 : SAL_DLLPRIVATE bool initWindow();
187 : SAL_DLLPRIVATE bool ImplInit();
188 :
189 : #if defined(MACOSX)
190 : NSOpenGLView* getOpenGLView();
191 : #endif
192 :
193 : GLWindow m_aGLWin;
194 : boost::scoped_ptr<vcl::Window> m_pWindow;
195 : vcl::Window* mpWindow; //points to m_pWindow or the parent window, don't delete it
196 : SystemChildWindow* m_pChildWindow;
197 : boost::scoped_ptr<SystemChildWindow> m_pChildWindowGC;
198 : bool mbInitialized;
199 : bool mbRequestLegacyContext;
200 : };
201 :
202 : #endif
203 :
204 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|