source: trunk/src/opengl/qgl.h@ 729

Last change on this file since 729 was 651, checked in by Dmitry A. Kuminov, 15 years ago

trunk: Merged in qt 4.6.2 sources.

File size: 19.4 KB
Line 
1/****************************************************************************
2**
3** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
4** All rights reserved.
5** Contact: Nokia Corporation ([email protected])
6**
7** This file is part of the QtOpenGL module of the Qt Toolkit.
8**
9** $QT_BEGIN_LICENSE:LGPL$
10** Commercial Usage
11** Licensees holding valid Qt Commercial licenses may use this file in
12** accordance with the Qt Commercial License Agreement provided with the
13** Software or, alternatively, in accordance with the terms contained in
14** a written agreement between you and Nokia.
15**
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.
23**
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.
27**
28** GNU General Public License Usage
29** Alternatively, this file may be used under the terms of the GNU
30** General Public License version 3.0 as published by the Free Software
31** Foundation and appearing in the file LICENSE.GPL included in the
32** packaging of this file. Please review the following information to
33** ensure the GNU General Public License version 3.0 requirements will be
34** met: http://www.gnu.org/copyleft/gpl.html.
35**
36** If you have questions regarding the use of this file, please contact
37** Nokia at [email protected].
38** $QT_END_LICENSE$
39**
40****************************************************************************/
41
42#ifndef QGL_H
43#define QGL_H
44
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>
50
51QT_BEGIN_HEADER
52
53#if defined(Q_WS_WIN)
54# include <QtCore/qt_windows.h>
55#endif
56
57#if defined(Q_WS_MAC)
58# include <OpenGL/gl.h>
59# include <OpenGL/glu.h>
60#elif defined(QT_OPENGL_ES_1) || defined(QT_OPENGL_ES_1_CL)
61# include <GLES/gl.h>
62#ifndef GL_DOUBLE
63# define GL_DOUBLE GL_FLOAT
64#endif
65#ifndef GLdouble
66typedef GLfloat GLdouble;
67#endif
68#elif defined(QT_OPENGL_ES_2)
69# include <GLES2/gl2.h>
70#ifndef GL_DOUBLE
71# define GL_DOUBLE GL_FLOAT
72#endif
73#ifndef GLdouble
74typedef GLfloat GLdouble;
75#endif
76#else
77# include <GL/gl.h>
78# ifndef QT_LINUXBASE
79# include <GL/glu.h>
80# endif
81#endif
82
83QT_BEGIN_NAMESPACE
84
85QT_MODULE(OpenGL)
86
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
89
90template <typename T>
91struct QMacGLCompatTypes
92{
93 typedef long CompatGLint;
94 typedef unsigned long CompatGLuint;
95 typedef unsigned long CompatGLenum;
96};
97
98template <>
99struct QMacGLCompatTypes<long>
100{
101 typedef int CompatGLint;
102 typedef unsigned int CompatGLuint;
103 typedef unsigned int CompatGLenum;
104};
105
106typedef QMacGLCompatTypes<GLint>::CompatGLint QMacCompatGLint;
107typedef QMacGLCompatTypes<GLint>::CompatGLuint QMacCompatGLuint;
108typedef QMacGLCompatTypes<GLint>::CompatGLenum QMacCompatGLenum;
109
110#endif
111
112#ifdef QT3_SUPPORT
113#define QGL_VERSION 460
114#define QGL_VERSION_STR "4.6"
115inline QT3_SUPPORT const char *qGLVersion() {
116 return QGL_VERSION_STR;
117}
118#endif
119
120#if defined(Q_WS_WIN) || defined(Q_WS_MAC)
121class QGLCmap;
122#endif
123
124class QPixmap;
125#if defined(Q_WS_X11) && !defined(QT_OPENGL_ES)
126class QGLOverlayWidget;
127#endif
128class QGLWidgetPrivate;
129class QGLContextPrivate;
130
131// Namespace class:
132namespace QGL
133{
134 Q_OPENGL_EXPORT void setPreferredPaintEngine(QPaintEngine::Type engineType);
135
136 enum FormatOption {
137 DoubleBuffer = 0x0001,
138 DepthBuffer = 0x0002,
139 Rgba = 0x0004,
140 AlphaChannel = 0x0008,
141 AccumBuffer = 0x0010,
142 StencilBuffer = 0x0020,
143 StereoBuffers = 0x0040,
144 DirectRendering = 0x0080,
145 HasOverlay = 0x0100,
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
157 };
158 Q_DECLARE_FLAGS(FormatOptions, FormatOption)
159}
160
161Q_DECLARE_OPERATORS_FOR_FLAGS(QGL::FormatOptions)
162
163class QGLFormatPrivate;
164
165class Q_OPENGL_EXPORT QGLFormat
166{
167public:
168 QGLFormat();
169 QGLFormat(QGL::FormatOptions options, int plane = 0);
170 QGLFormat(const QGLFormat &other);
171 QGLFormat &operator=(const QGLFormat &other);
172 ~QGLFormat();
173
174 void setDepthBufferSize(int size);
175 int depthBufferSize() const;
176
177 void setAccumBufferSize(int size);
178 int accumBufferSize() const;
179
180 void setRedBufferSize(int size);
181 int redBufferSize() const;
182
183 void setGreenBufferSize(int size);
184 int greenBufferSize() const;
185
186 void setBlueBufferSize(int size);
187 int blueBufferSize() const;
188
189 void setAlphaBufferSize(int size);
190 int alphaBufferSize() const;
191
192 void setStencilBufferSize(int size);
193 int stencilBufferSize() const;
194
195 void setSampleBuffers(bool enable);
196 bool sampleBuffers() const;
197
198 void setSamples(int numSamples);
199 int samples() const;
200
201 void setSwapInterval(int interval);
202 int swapInterval() const;
203
204 bool doubleBuffer() const;
205 void setDoubleBuffer(bool enable);
206 bool depth() const;
207 void setDepth(bool enable);
208 bool rgba() const;
209 void setRgba(bool enable);
210 bool alpha() const;
211 void setAlpha(bool enable);
212 bool accum() const;
213 void setAccum(bool enable);
214 bool stencil() const;
215 void setStencil(bool enable);
216 bool stereo() const;
217 void setStereo(bool enable);
218 bool directRendering() const;
219 void setDirectRendering(bool enable);
220 bool hasOverlay() const;
221 void setOverlay(bool enable);
222
223 int plane() const;
224 void setPlane(int plane);
225
226 void setOption(QGL::FormatOptions opt);
227 bool testOption(QGL::FormatOptions opt) const;
228
229 static QGLFormat defaultFormat();
230 static void setDefaultFormat(const QGLFormat& f);
231
232 static QGLFormat defaultOverlayFormat();
233 static void setDefaultOverlayFormat(const QGLFormat& f);
234
235 static bool hasOpenGL();
236 static bool hasOpenGLOverlays();
237
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
253 };
254 Q_DECLARE_FLAGS(OpenGLVersionFlags, OpenGLVersionFlag)
255
256 static OpenGLVersionFlags openGLVersionFlags();
257
258private:
259 QGLFormatPrivate *d;
260
261 void detach();
262
263 friend Q_OPENGL_EXPORT bool operator==(const QGLFormat&, const QGLFormat&);
264 friend Q_OPENGL_EXPORT bool operator!=(const QGLFormat&, const QGLFormat&);
265};
266
267Q_DECLARE_OPERATORS_FOR_FLAGS(QGLFormat::OpenGLVersionFlags)
268
269Q_OPENGL_EXPORT bool operator==(const QGLFormat&, const QGLFormat&);
270Q_OPENGL_EXPORT bool operator!=(const QGLFormat&, const QGLFormat&);
271
272class Q_OPENGL_EXPORT QGLContext
273{
274 Q_DECLARE_PRIVATE(QGLContext)
275public:
276 QGLContext(const QGLFormat& format, QPaintDevice* device);
277 QGLContext(const QGLFormat& format);
278 virtual ~QGLContext();
279
280 virtual bool create(const QGLContext* shareContext = 0);
281 bool isValid() const;
282 bool isSharing() const;
283 void reset();
284
285 static bool areSharing(const QGLContext *context1, const QGLContext *context2);
286
287 QGLFormat format() const;
288 QGLFormat requestedFormat() const;
289 void setFormat(const QGLFormat& format);
290
291 // ### Qt 5: return bools + maybe remove virtuals
292 virtual void makeCurrent();
293 virtual void doneCurrent();
294
295 virtual void swapBuffers() const;
296
297 enum BindOption {
298 NoBindOption = 0x0000,
299 InvertedYBindOption = 0x0001,
300 MipmapBindOption = 0x0002,
301 PremultipliedAlphaBindOption = 0x0004,
302 LinearFilteringBindOption = 0x0008,
303
304 MemoryManagedBindOption = 0x0010, // internal flag
305 CanFlipNativePixmapBindOption = 0x0020, // internal flag
306
307 DefaultBindOption = LinearFilteringBindOption
308 | InvertedYBindOption
309 | MipmapBindOption,
310 InternalBindOption = MemoryManagedBindOption
311 | PremultipliedAlphaBindOption
312 };
313 Q_DECLARE_FLAGS(BindOptions, BindOption)
314
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);
319
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);
325
326 void deleteTexture(GLuint tx_id);
327
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);
330
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,
337 BindOptions);
338 GLuint bindTexture(const QPixmap &pixmap, QMacCompatGLenum, QMacCompatGLint format,
339 BindOptions);
340
341 void deleteTexture(QMacCompatGLuint tx_id);
342
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);
345#endif
346
347 static void setTextureCacheLimit(int size);
348 static int textureCacheLimit();
349
350 void *getProcAddress(const QString &proc) const;
351 QPaintDevice* device() const;
352 QColor overlayTransparentColor() const;
353
354 static const QGLContext* currentContext();
355
356protected:
357 virtual bool chooseContext(const QGLContext* shareContext = 0);
358
359#if defined(Q_WS_WIN)
360 virtual int choosePixelFormat(void* pfd, HDC pdc);
361#endif
362#if defined(Q_WS_X11) && !defined(QT_OPENGL_ES)
363 virtual void* tryVisual(const QGLFormat& f, int bufDepth = 1);
364 virtual void* chooseVisual();
365#endif
366#if defined(Q_WS_MAC)
367 virtual void* chooseMacVisual(GDHandle);
368#endif
369
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
376
377 uint colorIndex(const QColor& c) const;
378 void setValid(bool valid);
379 void setDevice(QPaintDevice *pDev);
380
381protected:
382 static QGLContext* currentCtx;
383
384private:
385 QScopedPointer<QGLContextPrivate> d_ptr;
386
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 QGLEngineShaderManager;
397 friend class QGLWindowSurface;
398 friend class QGLPixmapData;
399 friend class QGLPixmapFilterBase;
400 friend class QGLTextureGlyphCache;
401 friend class QGLContextGroup;
402 friend class QGLSharedResourceGuard;
403 friend class QGLPixmapBlurFilter;
404 friend class QGLExtensions;
405 friend QGLFormat::OpenGLVersionFlags QGLFormat::openGLVersionFlags();
406#ifdef Q_WS_MAC
407public:
408 void updatePaintDevice();
409private:
410 friend class QMacGLWindowChangeEvent;
411 friend QGLContextPrivate *qt_phonon_get_dptr(const QGLContext *);
412#endif
413 friend class QGLFramebufferObject;
414 friend class QGLFramebufferObjectPrivate;
415 friend class QGLFBOGLPaintDevice;
416 friend class QGLPaintDevice;
417 friend class QX11GLPixmapData;
418private:
419 Q_DISABLE_COPY(QGLContext)
420};
421
422Q_DECLARE_OPERATORS_FOR_FLAGS(QGLContext::BindOptions)
423
424class Q_OPENGL_EXPORT QGLWidget : public QWidget
425{
426 Q_OBJECT
427 Q_DECLARE_PRIVATE(QGLWidget)
428public:
429 explicit QGLWidget(QWidget* parent=0,
430 const QGLWidget* shareWidget = 0, Qt::WindowFlags f=0);
431 explicit QGLWidget(QGLContext *context, QWidget* parent=0,
432 const QGLWidget* shareWidget = 0, Qt::WindowFlags f=0);
433 explicit QGLWidget(const QGLFormat& format, QWidget* parent=0,
434 const QGLWidget* shareWidget = 0, Qt::WindowFlags f=0);
435#ifdef QT3_SUPPORT
436 QT3_SUPPORT_CONSTRUCTOR QGLWidget(QWidget* parent, const char* name,
437 const QGLWidget* shareWidget = 0, Qt::WindowFlags f=0);
438 QT3_SUPPORT_CONSTRUCTOR QGLWidget(QGLContext *context, QWidget* parent, const char* name,
439 const QGLWidget* shareWidget = 0, Qt::WindowFlags f=0);
440 QT3_SUPPORT_CONSTRUCTOR QGLWidget(const QGLFormat& format, QWidget* parent, const char* name,
441 const QGLWidget* shareWidget = 0, Qt::WindowFlags f=0);
442#endif
443 ~QGLWidget();
444
445 void qglColor(const QColor& c) const;
446 void qglClearColor(const QColor& c) const;
447
448 bool isValid() const;
449 bool isSharing() const;
450
451 // ### Qt 5: return bools
452 void makeCurrent();
453 void doneCurrent();
454
455 bool doubleBuffer() const;
456 void swapBuffers();
457
458 QGLFormat format() const;
459 void setFormat(const QGLFormat& format);
460
461 const QGLContext* context() const;
462 void setContext(QGLContext* context, const QGLContext* shareContext = 0,
463 bool deleteOldContext = true);
464
465 QPixmap renderPixmap(int w = 0, int h = 0, bool useContext = false);
466 QImage grabFrameBuffer(bool withAlpha = false);
467
468 void makeOverlayCurrent();
469 const QGLContext* overlayContext() const;
470
471 static QImage convertToGLFormat(const QImage& img);
472
473 void setMouseTracking(bool enable);
474
475 const QGLColormap & colormap() const;
476 void setColormap(const QGLColormap & map);
477
478 void renderText(int x, int y, const QString & str,
479 const QFont & fnt = QFont(), int listBase = 2000);
480 void renderText(double x, double y, double z, const QString & str,
481 const QFont & fnt = QFont(), int listBase = 2000);
482 QPaintEngine *paintEngine() const;
483
484 GLuint bindTexture(const QImage &image, GLenum target, GLint format,
485 QGLContext::BindOptions options);
486 GLuint bindTexture(const QPixmap &pixmap, GLenum target, GLint format,
487 QGLContext::BindOptions options);
488
489 GLuint bindTexture(const QImage &image, GLenum target = GL_TEXTURE_2D,
490 GLint format = GL_RGBA);
491 GLuint bindTexture(const QPixmap &pixmap, GLenum target = GL_TEXTURE_2D,
492 GLint format = GL_RGBA);
493
494 GLuint bindTexture(const QString &fileName);
495
496 void deleteTexture(GLuint tx_id);
497
498 void drawTexture(const QRectF &target, GLuint textureId, GLenum textureTarget = GL_TEXTURE_2D);
499 void drawTexture(const QPointF &point, GLuint textureId, GLenum textureTarget = GL_TEXTURE_2D);
500
501#ifdef Q_MAC_COMPAT_GL_FUNCTIONS
502 GLuint bindTexture(const QImage &image, QMacCompatGLenum = GL_TEXTURE_2D,
503 QMacCompatGLint format = GL_RGBA);
504 GLuint bindTexture(const QPixmap &pixmap, QMacCompatGLenum = GL_TEXTURE_2D,
505 QMacCompatGLint format = GL_RGBA);
506 GLuint bindTexture(const QImage &image, QMacCompatGLenum, QMacCompatGLint format,
507 QGLContext::BindOptions);
508 GLuint bindTexture(const QPixmap &pixmap, QMacCompatGLenum, QMacCompatGLint format,
509 QGLContext::BindOptions);
510
511 void deleteTexture(QMacCompatGLuint tx_id);
512
513 void drawTexture(const QRectF &target, QMacCompatGLuint textureId, QMacCompatGLenum textureTarget = GL_TEXTURE_2D);
514 void drawTexture(const QPointF &point, QMacCompatGLuint textureId, QMacCompatGLenum textureTarget = GL_TEXTURE_2D);
515#endif
516
517public Q_SLOTS:
518 virtual void updateGL();
519 virtual void updateOverlayGL();
520
521protected:
522 bool event(QEvent *);
523 virtual void initializeGL();
524 virtual void resizeGL(int w, int h);
525 virtual void paintGL();
526
527 virtual void initializeOverlayGL();
528 virtual void resizeOverlayGL(int w, int h);
529 virtual void paintOverlayGL();
530
531 void setAutoBufferSwap(bool on);
532 bool autoBufferSwap() const;
533
534 void paintEvent(QPaintEvent*);
535 void resizeEvent(QResizeEvent*);
536
537 virtual void glInit();
538 virtual void glDraw();
539 int fontDisplayListBase(const QFont & fnt, int listBase = 2000); // ### Qt 5: remove
540
541private:
542 Q_DISABLE_COPY(QGLWidget)
543
544#ifdef Q_WS_MAC
545 friend class QMacGLWindowChangeEvent;
546#endif
547 friend class QGLDrawable;
548 friend class QGLPixelBuffer;
549 friend class QGLPixelBufferPrivate;
550 friend class QGLContext;
551 friend class QGLContextPrivate;
552 friend class QGLOverlayWidget;
553 friend class QOpenGLPaintEngine;
554 friend class QGLPaintDevice;
555 friend class QGLWidgetGLPaintDevice;
556};
557
558
559//
560// QGLFormat inline functions
561//
562
563inline bool QGLFormat::doubleBuffer() const
564{
565 return testOption(QGL::DoubleBuffer);
566}
567
568inline bool QGLFormat::depth() const
569{
570 return testOption(QGL::DepthBuffer);
571}
572
573inline bool QGLFormat::rgba() const
574{
575 return testOption(QGL::Rgba);
576}
577
578inline bool QGLFormat::alpha() const
579{
580 return testOption(QGL::AlphaChannel);
581}
582
583inline bool QGLFormat::accum() const
584{
585 return testOption(QGL::AccumBuffer);
586}
587
588inline bool QGLFormat::stencil() const
589{
590 return testOption(QGL::StencilBuffer);
591}
592
593inline bool QGLFormat::stereo() const
594{
595 return testOption(QGL::StereoBuffers);
596}
597
598inline bool QGLFormat::directRendering() const
599{
600 return testOption(QGL::DirectRendering);
601}
602
603inline bool QGLFormat::hasOverlay() const
604{
605 return testOption(QGL::HasOverlay);
606}
607
608inline bool QGLFormat::sampleBuffers() const
609{
610 return testOption(QGL::SampleBuffers);
611}
612
613QT_END_NAMESPACE
614
615QT_END_HEADER
616
617#endif // QGL_H
Note: See TracBrowser for help on using the repository browser.