1 /****************************************************************************
3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
4 ** All rights reserved.
5 ** Contact: Nokia Corporation (qt-info@nokia.com)
7 ** This file is part of the QtOpenGL module of the Qt Toolkit.
9 ** $QT_BEGIN_LICENSE:LGPL$
10 ** No Commercial Usage
11 ** This file contains pre-release code and may not be distributed.
12 ** You may use this file in accordance with the terms and conditions
13 ** contained in the Technology Preview License Agreement accompanying
16 ** GNU Lesser General Public License Usage
17 ** Alternatively, this file may be used under the terms of the GNU Lesser
18 ** General Public License version 2.1 as published by the Free Software
19 ** Foundation and appearing in the file LICENSE.LGPL included in the
20 ** packaging of this file. Please review the following information to
21 ** ensure the GNU Lesser General Public License version 2.1 requirements
22 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
24 ** In addition, as a special exception, Nokia gives you certain additional
25 ** rights. These rights are described in the Nokia Qt LGPL Exception
26 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
28 ** If you have questions regarding the use of this file, please contact
29 ** Nokia at qt-info@nokia.com.
40 ****************************************************************************/
45 #include <QtGui/qwidget.h>
46 #include <QtGui/qpaintengine.h>
47 #include <QtOpenGL/qglcolormap.h>
48 #include <QtCore/qmap.h>
49 #include <QtCore/qscopedpointer.h>
54 # include <QtCore/qt_windows.h>
58 # include <OpenGL/gl.h>
59 # include <OpenGL/glu.h>
60 #elif defined(QT_OPENGL_ES_1) || defined(QT_OPENGL_ES_1_CL)
63 # define GL_DOUBLE GL_FLOAT
66 typedef GLfloat GLdouble
;
68 #elif defined(QT_OPENGL_ES_2)
69 # include <GLES2/gl2.h>
71 # define GL_DOUBLE GL_FLOAT
74 typedef GLfloat GLdouble
;
87 #if defined(Q_WS_MAC) && defined (QT_BUILD_OPENGL_LIB) && !defined(QT_MAC_USE_COCOA) && !defined(QDOC)
88 #define Q_MAC_COMPAT_GL_FUNCTIONS
91 struct QMacGLCompatTypes
93 typedef long CompatGLint
;
94 typedef unsigned long CompatGLuint
;
95 typedef unsigned long CompatGLenum
;
99 struct QMacGLCompatTypes
<long>
101 typedef int CompatGLint
;
102 typedef unsigned int CompatGLuint
;
103 typedef unsigned int CompatGLenum
;
106 typedef QMacGLCompatTypes
<GLint
>::CompatGLint QMacCompatGLint
;
107 typedef QMacGLCompatTypes
<GLint
>::CompatGLuint QMacCompatGLuint
;
108 typedef QMacGLCompatTypes
<GLint
>::CompatGLenum QMacCompatGLenum
;
113 #define QGL_VERSION 460
114 #define QGL_VERSION_STR "4.6"
115 inline QT3_SUPPORT
const char *qGLVersion() {
116 return QGL_VERSION_STR
;
120 #if defined(Q_WS_WIN) || defined(Q_WS_MAC)
125 #if defined(Q_WS_X11) && !defined(QT_OPENGL_ES)
126 class QGLOverlayWidget
;
128 class QGLWidgetPrivate
;
129 class QGLContextPrivate
;
134 Q_OPENGL_EXPORT
void setPreferredPaintEngine(QPaintEngine::Type engineType
);
137 DoubleBuffer
= 0x0001,
138 DepthBuffer
= 0x0002,
140 AlphaChannel
= 0x0008,
141 AccumBuffer
= 0x0010,
142 StencilBuffer
= 0x0020,
143 StereoBuffers
= 0x0040,
144 DirectRendering
= 0x0080,
146 SampleBuffers
= 0x0200,
147 SingleBuffer
= DoubleBuffer
<< 16,
148 NoDepthBuffer
= DepthBuffer
<< 16,
149 ColorIndex
= Rgba
<< 16,
150 NoAlphaChannel
= AlphaChannel
<< 16,
151 NoAccumBuffer
= AccumBuffer
<< 16,
152 NoStencilBuffer
= StencilBuffer
<< 16,
153 NoStereoBuffers
= StereoBuffers
<< 16,
154 IndirectRendering
= DirectRendering
<< 16,
155 NoOverlay
= HasOverlay
<< 16,
156 NoSampleBuffers
= SampleBuffers
<< 16
158 Q_DECLARE_FLAGS(FormatOptions
, FormatOption
)
161 Q_DECLARE_OPERATORS_FOR_FLAGS(QGL::FormatOptions
)
163 class QGLFormatPrivate
;
165 class Q_OPENGL_EXPORT QGLFormat
169 QGLFormat(QGL::FormatOptions options
, int plane
= 0);
170 QGLFormat(const QGLFormat
&other
);
171 QGLFormat
&operator=(const QGLFormat
&other
);
174 void setDepthBufferSize(int size
);
175 int depthBufferSize() const;
177 void setAccumBufferSize(int size
);
178 int accumBufferSize() const;
180 void setRedBufferSize(int size
);
181 int redBufferSize() const;
183 void setGreenBufferSize(int size
);
184 int greenBufferSize() const;
186 void setBlueBufferSize(int size
);
187 int blueBufferSize() const;
189 void setAlphaBufferSize(int size
);
190 int alphaBufferSize() const;
192 void setStencilBufferSize(int size
);
193 int stencilBufferSize() const;
195 void setSampleBuffers(bool enable
);
196 bool sampleBuffers() const;
198 void setSamples(int numSamples
);
201 void setSwapInterval(int interval
);
202 int swapInterval() const;
204 bool doubleBuffer() const;
205 void setDoubleBuffer(bool enable
);
207 void setDepth(bool enable
);
209 void setRgba(bool enable
);
211 void setAlpha(bool enable
);
213 void setAccum(bool enable
);
214 bool stencil() const;
215 void setStencil(bool enable
);
217 void setStereo(bool enable
);
218 bool directRendering() const;
219 void setDirectRendering(bool enable
);
220 bool hasOverlay() const;
221 void setOverlay(bool enable
);
224 void setPlane(int plane
);
226 void setOption(QGL::FormatOptions opt
);
227 bool testOption(QGL::FormatOptions opt
) const;
229 static QGLFormat
defaultFormat();
230 static void setDefaultFormat(const QGLFormat
& f
);
232 static QGLFormat
defaultOverlayFormat();
233 static void setDefaultOverlayFormat(const QGLFormat
& f
);
235 static bool hasOpenGL();
236 static bool hasOpenGLOverlays();
238 enum OpenGLVersionFlag
{
239 OpenGL_Version_None
= 0x00000000,
240 OpenGL_Version_1_1
= 0x00000001,
241 OpenGL_Version_1_2
= 0x00000002,
242 OpenGL_Version_1_3
= 0x00000004,
243 OpenGL_Version_1_4
= 0x00000008,
244 OpenGL_Version_1_5
= 0x00000010,
245 OpenGL_Version_2_0
= 0x00000020,
246 OpenGL_Version_2_1
= 0x00000040,
247 OpenGL_ES_Common_Version_1_0
= 0x00000080,
248 OpenGL_ES_CommonLite_Version_1_0
= 0x00000100,
249 OpenGL_ES_Common_Version_1_1
= 0x00000200,
250 OpenGL_ES_CommonLite_Version_1_1
= 0x00000400,
251 OpenGL_ES_Version_2_0
= 0x00000800,
252 OpenGL_Version_3_0
= 0x00001000
254 Q_DECLARE_FLAGS(OpenGLVersionFlags
, OpenGLVersionFlag
)
256 static OpenGLVersionFlags
openGLVersionFlags();
263 friend Q_OPENGL_EXPORT
bool operator==(const QGLFormat
&, const QGLFormat
&);
264 friend Q_OPENGL_EXPORT
bool operator!=(const QGLFormat
&, const QGLFormat
&);
267 Q_DECLARE_OPERATORS_FOR_FLAGS(QGLFormat::OpenGLVersionFlags
)
269 Q_OPENGL_EXPORT
bool operator==(const QGLFormat
&, const QGLFormat
&);
270 Q_OPENGL_EXPORT
bool operator!=(const QGLFormat
&, const QGLFormat
&);
272 class Q_OPENGL_EXPORT QGLContext
274 Q_DECLARE_PRIVATE(QGLContext
)
276 QGLContext(const QGLFormat
& format
, QPaintDevice
* device
);
277 QGLContext(const QGLFormat
& format
);
278 virtual ~QGLContext();
280 virtual bool create(const QGLContext
* shareContext
= 0);
281 bool isValid() const;
282 bool isSharing() const;
285 static bool areSharing(const QGLContext
*context1
, const QGLContext
*context2
);
287 QGLFormat
format() const;
288 QGLFormat
requestedFormat() const;
289 void setFormat(const QGLFormat
& format
);
291 // ### Qt 5: return bools + maybe remove virtuals
292 virtual void makeCurrent();
293 virtual void doneCurrent();
295 virtual void swapBuffers() const;
298 NoBindOption
= 0x0000,
299 InvertedYBindOption
= 0x0001,
300 MipmapBindOption
= 0x0002,
301 PremultipliedAlphaBindOption
= 0x0004,
302 LinearFilteringBindOption
= 0x0008,
304 MemoryManagedBindOption
= 0x0010, // internal flag
305 CanFlipNativePixmapBindOption
= 0x0020, // internal flag
307 DefaultBindOption
= LinearFilteringBindOption
308 | InvertedYBindOption
310 InternalBindOption
= MemoryManagedBindOption
311 | PremultipliedAlphaBindOption
313 Q_DECLARE_FLAGS(BindOptions
, BindOption
)
315 GLuint
bindTexture(const QImage
&image
, GLenum target
, GLint format
,
316 BindOptions options
);
317 GLuint
bindTexture(const QPixmap
&pixmap
, GLenum target
, GLint format
,
318 BindOptions options
);
320 GLuint
bindTexture(const QImage
&image
, GLenum target
= GL_TEXTURE_2D
,
321 GLint format
= GL_RGBA
);
322 GLuint
bindTexture(const QPixmap
&pixmap
, GLenum target
= GL_TEXTURE_2D
,
323 GLint format
= GL_RGBA
);
324 GLuint
bindTexture(const QString
&fileName
);
326 void deleteTexture(GLuint tx_id
);
328 void drawTexture(const QRectF
&target
, GLuint textureId
, GLenum textureTarget
= GL_TEXTURE_2D
);
329 void drawTexture(const QPointF
&point
, GLuint textureId
, GLenum textureTarget
= GL_TEXTURE_2D
);
331 #ifdef Q_MAC_COMPAT_GL_FUNCTIONS
332 GLuint
bindTexture(const QImage
&image
, QMacCompatGLenum
= GL_TEXTURE_2D
,
333 QMacCompatGLint format
= GL_RGBA
);
334 GLuint
bindTexture(const QPixmap
&pixmap
, QMacCompatGLenum
= GL_TEXTURE_2D
,
335 QMacCompatGLint format
= GL_RGBA
);
336 GLuint
bindTexture(const QImage
&image
, QMacCompatGLenum
, QMacCompatGLint format
,
338 GLuint
bindTexture(const QPixmap
&pixmap
, QMacCompatGLenum
, QMacCompatGLint format
,
341 void deleteTexture(QMacCompatGLuint tx_id
);
343 void drawTexture(const QRectF
&target
, QMacCompatGLuint textureId
, QMacCompatGLenum textureTarget
= GL_TEXTURE_2D
);
344 void drawTexture(const QPointF
&point
, QMacCompatGLuint textureId
, QMacCompatGLenum textureTarget
= GL_TEXTURE_2D
);
347 static void setTextureCacheLimit(int size
);
348 static int textureCacheLimit();
350 void *getProcAddress(const QString
&proc
) const;
351 QPaintDevice
* device() const;
352 QColor
overlayTransparentColor() const;
354 static const QGLContext
* currentContext();
357 virtual bool chooseContext(const QGLContext
* shareContext
= 0);
359 #if defined(Q_WS_WIN)
360 virtual int choosePixelFormat(void* pfd
, HDC pdc
);
362 #if defined(Q_WS_X11) && !defined(QT_OPENGL_ES)
363 virtual void* tryVisual(const QGLFormat
& f
, int bufDepth
= 1);
364 virtual void* chooseVisual();
366 #if defined(Q_WS_MAC)
367 virtual void* chooseMacVisual(GDHandle
);
370 bool deviceIsPixmap() const;
371 bool windowCreated() const;
372 void setWindowCreated(bool on
);
373 bool initialized() const;
374 void setInitialized(bool on
);
375 void generateFontDisplayLists(const QFont
& fnt
, int listBase
); // ### Qt 5: remove
377 uint
colorIndex(const QColor
& c
) const;
378 void setValid(bool valid
);
379 void setDevice(QPaintDevice
*pDev
);
382 static QGLContext
* currentCtx
;
385 QScopedPointer
<QGLContextPrivate
> d_ptr
;
387 friend class QGLPixelBuffer
;
388 friend class QGLPixelBufferPrivate
;
389 friend class QGLWidget
;
390 friend class QGLWidgetPrivate
;
391 friend class QGLGlyphCache
;
392 friend class QOpenGLPaintEngine
;
393 friend class QOpenGLPaintEnginePrivate
;
394 friend class QGL2PaintEngineEx
;
395 friend class QGL2PaintEngineExPrivate
;
396 friend class QGLWindowSurface
;
397 friend class QGLPixmapData
;
398 friend class QGLPixmapFilterBase
;
399 friend class QGLTextureGlyphCache
;
400 friend class QGLShareRegister
;
401 friend class QGLSharedResourceGuard
;
402 friend QGLFormat::OpenGLVersionFlags
QGLFormat::openGLVersionFlags();
405 void updatePaintDevice();
407 friend class QMacGLWindowChangeEvent
;
408 friend QGLContextPrivate
*qt_phonon_get_dptr(const QGLContext
*);
410 friend class QGLFramebufferObject
;
411 friend class QGLFramebufferObjectPrivate
;
412 friend class QGLFBOGLPaintDevice
;
413 friend class QGLPaintDevice
;
415 Q_DISABLE_COPY(QGLContext
)
418 Q_DECLARE_OPERATORS_FOR_FLAGS(QGLContext::BindOptions
)
420 class Q_OPENGL_EXPORT QGLWidget
: public QWidget
423 Q_DECLARE_PRIVATE(QGLWidget
)
425 explicit QGLWidget(QWidget
* parent
=0,
426 const QGLWidget
* shareWidget
= 0, Qt::WindowFlags f
=0);
427 explicit QGLWidget(QGLContext
*context
, QWidget
* parent
=0,
428 const QGLWidget
* shareWidget
= 0, Qt::WindowFlags f
=0);
429 explicit QGLWidget(const QGLFormat
& format
, QWidget
* parent
=0,
430 const QGLWidget
* shareWidget
= 0, Qt::WindowFlags f
=0);
432 QT3_SUPPORT_CONSTRUCTOR
QGLWidget(QWidget
* parent
, const char* name
,
433 const QGLWidget
* shareWidget
= 0, Qt::WindowFlags f
=0);
434 QT3_SUPPORT_CONSTRUCTOR
QGLWidget(QGLContext
*context
, QWidget
* parent
, const char* name
,
435 const QGLWidget
* shareWidget
= 0, Qt::WindowFlags f
=0);
436 QT3_SUPPORT_CONSTRUCTOR
QGLWidget(const QGLFormat
& format
, QWidget
* parent
, const char* name
,
437 const QGLWidget
* shareWidget
= 0, Qt::WindowFlags f
=0);
441 void qglColor(const QColor
& c
) const;
442 void qglClearColor(const QColor
& c
) const;
444 bool isValid() const;
445 bool isSharing() const;
447 // ### Qt 5: return bools
451 bool doubleBuffer() const;
454 QGLFormat
format() const;
455 void setFormat(const QGLFormat
& format
);
457 const QGLContext
* context() const;
458 void setContext(QGLContext
* context
, const QGLContext
* shareContext
= 0,
459 bool deleteOldContext
= true);
461 QPixmap
renderPixmap(int w
= 0, int h
= 0, bool useContext
= false);
462 QImage
grabFrameBuffer(bool withAlpha
= false);
464 void makeOverlayCurrent();
465 const QGLContext
* overlayContext() const;
467 static QImage
convertToGLFormat(const QImage
& img
);
469 void setMouseTracking(bool enable
);
471 const QGLColormap
& colormap() const;
472 void setColormap(const QGLColormap
& map
);
474 void renderText(int x
, int y
, const QString
& str
,
475 const QFont
& fnt
= QFont(), int listBase
= 2000);
476 void renderText(double x
, double y
, double z
, const QString
& str
,
477 const QFont
& fnt
= QFont(), int listBase
= 2000);
478 QPaintEngine
*paintEngine() const;
480 GLuint
bindTexture(const QImage
&image
, GLenum target
, GLint format
,
481 QGLContext::BindOptions options
);
482 GLuint
bindTexture(const QPixmap
&pixmap
, GLenum target
, GLint format
,
483 QGLContext::BindOptions options
);
485 GLuint
bindTexture(const QImage
&image
, GLenum target
= GL_TEXTURE_2D
,
486 GLint format
= GL_RGBA
);
487 GLuint
bindTexture(const QPixmap
&pixmap
, GLenum target
= GL_TEXTURE_2D
,
488 GLint format
= GL_RGBA
);
490 GLuint
bindTexture(const QString
&fileName
);
492 void deleteTexture(GLuint tx_id
);
494 void drawTexture(const QRectF
&target
, GLuint textureId
, GLenum textureTarget
= GL_TEXTURE_2D
);
495 void drawTexture(const QPointF
&point
, GLuint textureId
, GLenum textureTarget
= GL_TEXTURE_2D
);
497 #ifdef Q_MAC_COMPAT_GL_FUNCTIONS
498 GLuint
bindTexture(const QImage
&image
, QMacCompatGLenum
= GL_TEXTURE_2D
,
499 QMacCompatGLint format
= GL_RGBA
);
500 GLuint
bindTexture(const QPixmap
&pixmap
, QMacCompatGLenum
= GL_TEXTURE_2D
,
501 QMacCompatGLint format
= GL_RGBA
);
502 GLuint
bindTexture(const QImage
&image
, QMacCompatGLenum
, QMacCompatGLint format
,
503 QGLContext::BindOptions
);
504 GLuint
bindTexture(const QPixmap
&pixmap
, QMacCompatGLenum
, QMacCompatGLint format
,
505 QGLContext::BindOptions
);
507 void deleteTexture(QMacCompatGLuint tx_id
);
509 void drawTexture(const QRectF
&target
, QMacCompatGLuint textureId
, QMacCompatGLenum textureTarget
= GL_TEXTURE_2D
);
510 void drawTexture(const QPointF
&point
, QMacCompatGLuint textureId
, QMacCompatGLenum textureTarget
= GL_TEXTURE_2D
);
514 virtual void updateGL();
515 virtual void updateOverlayGL();
518 bool event(QEvent
*);
519 virtual void initializeGL();
520 virtual void resizeGL(int w
, int h
);
521 virtual void paintGL();
523 virtual void initializeOverlayGL();
524 virtual void resizeOverlayGL(int w
, int h
);
525 virtual void paintOverlayGL();
527 void setAutoBufferSwap(bool on
);
528 bool autoBufferSwap() const;
530 void paintEvent(QPaintEvent
*);
531 void resizeEvent(QResizeEvent
*);
533 virtual void glInit();
534 virtual void glDraw();
535 int fontDisplayListBase(const QFont
& fnt
, int listBase
= 2000); // ### Qt 5: remove
538 Q_DISABLE_COPY(QGLWidget
)
541 friend class QMacGLWindowChangeEvent
;
543 friend class QGLDrawable
;
544 friend class QGLPixelBuffer
;
545 friend class QGLPixelBufferPrivate
;
546 friend class QGLContext
;
547 friend class QGLOverlayWidget
;
548 friend class QOpenGLPaintEngine
;
549 friend class QGLPaintDevice
;
550 friend class QGLWidgetGLPaintDevice
;
555 // QGLFormat inline functions
558 inline bool QGLFormat::doubleBuffer() const
560 return testOption(QGL::DoubleBuffer
);
563 inline bool QGLFormat::depth() const
565 return testOption(QGL::DepthBuffer
);
568 inline bool QGLFormat::rgba() const
570 return testOption(QGL::Rgba
);
573 inline bool QGLFormat::alpha() const
575 return testOption(QGL::AlphaChannel
);
578 inline bool QGLFormat::accum() const
580 return testOption(QGL::AccumBuffer
);
583 inline bool QGLFormat::stencil() const
585 return testOption(QGL::StencilBuffer
);
588 inline bool QGLFormat::stereo() const
590 return testOption(QGL::StereoBuffers
);
593 inline bool QGLFormat::directRendering() const
595 return testOption(QGL::DirectRendering
);
598 inline bool QGLFormat::hasOverlay() const
600 return testOption(QGL::HasOverlay
);
603 inline bool QGLFormat::sampleBuffers() const
605 return testOption(QGL::SampleBuffers
);