diff options
author | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2017-05-05 15:23:47 +0200 |
---|---|---|
committer | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2017-05-19 08:46:08 +0000 |
commit | 9afec115644bb63a4ea579be6c8351870c694894 (patch) | |
tree | 64a8e551509be5d384aa2796d5134882fec11fb2 | |
parent | 3f45ae1bb3ad3ed433780731e87b0bf66558116d (diff) |
QtGui: Add basic OpenGL-related classes
Exclude functions taking arrays for the moment.
Task-number: PYSIDE-487
Task-number: PYSIDE-516
Change-Id: If95d7dddf597021d8c4e731fcc46f8b38ac512db
Reviewed-by: Christian Tismer <tismer@stackless.com>
-rw-r--r-- | PySide2/QtGui/CMakeLists.txt | 18 | ||||
-rw-r--r-- | PySide2/QtGui/typesystem_gui_common.xml | 118 | ||||
-rw-r--r-- | PySide2/global.h.in | 9 | ||||
-rw-r--r-- | tests/QtGui/CMakeLists.txt | 1 | ||||
-rw-r--r-- | tests/QtGui/qopenglwindow_test.py | 105 |
5 files changed, 243 insertions, 8 deletions
diff --git a/PySide2/QtGui/CMakeLists.txt b/PySide2/QtGui/CMakeLists.txt index a6a8c104..b0973deb 100644 --- a/PySide2/QtGui/CMakeLists.txt +++ b/PySide2/QtGui/CMakeLists.txt @@ -3,6 +3,7 @@ project(QtGui) qt5_wrap_cpp(QPYTEXTOBJECT_MOC "${pyside2_SOURCE_DIR}/qpytextobject.h") set(QtGui_SRC +${QtGui_GEN_DIR}/qabstractopenglfunctions_wrapper.cpp ${QtGui_GEN_DIR}/qabstracttextdocumentlayout_paintcontext_wrapper.cpp ${QtGui_GEN_DIR}/qabstracttextdocumentlayout_selection_wrapper.cpp ${QtGui_GEN_DIR}/qabstracttextdocumentlayout_wrapper.cpp @@ -66,6 +67,23 @@ ${QtGui_GEN_DIR}/qmatrix4x4_wrapper.cpp ${QtGui_GEN_DIR}/qmouseevent_wrapper.cpp ${QtGui_GEN_DIR}/qmoveevent_wrapper.cpp ${QtGui_GEN_DIR}/qmovie_wrapper.cpp +${QtGui_GEN_DIR}/qoffscreensurface_wrapper.cpp +${QtGui_GEN_DIR}/qopenglcontextgroup_wrapper.cpp +${QtGui_GEN_DIR}/qopengldebuglogger_wrapper.cpp +${QtGui_GEN_DIR}/qopengldebugmessage_wrapper.cpp +${QtGui_GEN_DIR}/qopenglextrafunctions_wrapper.cpp +${QtGui_GEN_DIR}/qopenglframebufferobjectformat_wrapper.cpp +${QtGui_GEN_DIR}/qopenglfunctions_wrapper.cpp +# Compile error on Windows: ${QtGui_GEN_DIR}/qopenglpaintdevice_wrapper.cpp +${QtGui_GEN_DIR}/qopenglpixeltransferoptions_wrapper.cpp +${QtGui_GEN_DIR}/qopenglshaderprogram_wrapper.cpp +${QtGui_GEN_DIR}/qopengltexture_wrapper.cpp +${QtGui_GEN_DIR}/qopengltimemonitor_wrapper.cpp +${QtGui_GEN_DIR}/qopengltimerquery_wrapper.cpp +${QtGui_GEN_DIR}/qopenglversionprofile_wrapper.cpp +${QtGui_GEN_DIR}/qopenglvertexarrayobject_wrapper.cpp +${QtGui_GEN_DIR}/qopenglvertexarrayobject_binder_wrapper.cpp +${QtGui_GEN_DIR}/qopenglwindow_wrapper.cpp ${QtGui_GEN_DIR}/qpagedpaintdevice_margins_wrapper.cpp ${QtGui_GEN_DIR}/qpagedpaintdevice_wrapper.cpp ${QtGui_GEN_DIR}/qpagelayout_wrapper.cpp diff --git a/PySide2/QtGui/typesystem_gui_common.xml b/PySide2/QtGui/typesystem_gui_common.xml index 7a0db8a4..bf28b2a1 100644 --- a/PySide2/QtGui/typesystem_gui_common.xml +++ b/PySide2/QtGui/typesystem_gui_common.xml @@ -96,6 +96,27 @@ <rejection class="*" function-name="d_func"/> <rejection class="*" field-name="d_ptr"/> <rejection class="*" field-name="d"/> + <rejection class="^QOpenGL.*$" argument-type="^GLboolean( const)?\*$"/> + <rejection class="^QOpenGL.*$" argument-type="^GLchar( const)?\*$"/> + <rejection class="^QOpenGL.*$" argument-type="GLchar *const const*"/> + <rejection class="^QOpenGL.*$" argument-type="^GLenum( const)?\*$"/> + <rejection class="^QOpenGL.*$" argument-type="^GLfloat( const)?\*$"/> + <rejection class="^QOpenGL.*$" argument-type="^GLfloat( const)?\[.*$"/> + <rejection class="^QOpenGL.*$" argument-type="^GLdouble( const)?\*$"/> + <rejection class="^QOpenGL.*$" argument-type="GLintptr"/> + <rejection class="^QOpenGL.*$" argument-type="^GLint64( const)?\*$"/> + <rejection class="^QOpenGL.*$" argument-type="^GLsizei( const)?\*$"/> + <rejection class="^QOpenGL.*$" argument-type="GLsizeiptr"/> + <rejection class="^QOpenGL.*$" argument-type="GLsync"/> + <rejection class="^QOpenGL.*$" argument-type="^GLubyte( const)?\*$"/> + <rejection class="^QOpenGL.*$" return-type="^GLubyte( const)?\*$"/> + <rejection class="^QOpenGL.*$" argument-type="^GLu?int( const)?\*$"/> + <rejection class="^QOpenGL.*$" argument-type="^QMatrix.x.( const)?\*$"/> + <rejection class="^QOpenGL.*$" argument-type="qopengl_GLintptr"/> + <rejection class="^QOpenGL.*$" argument-type="qopengl_GLsizeiptr"/> + <rejection class="^QOpenGL.*$" argument-type="QOpenGLTextureHelper*"/> + <rejection class="^QOpenGL.*$" argument-type="^QVector.D( const)?\*$"/> + <rejection class="^QOpenGL.*$" argument-type="^void( const)?\*\*?$"/> <!-- Event classes have a lot of non-documented protected fields, those fields @@ -3207,6 +3228,7 @@ <enum-type name="RenderableType"/> <enum-type name="SwapBehavior"/> </value-type> + <object-type name="QOffscreenSurface" since="5.1"/> <primitive-type name="QPlatformSurface"> <extra-includes> <include file-name="QtGui/qpa/qplatformsurface.h" location="global"/> @@ -3263,19 +3285,99 @@ <object-type name="QOpenGLContext"> <enum-type name="OpenGLModuleType" /> </object-type> - <object-type name="QOpenGLFramebufferObject"> + <object-type name="QOpenGLContextGroup" since="5.0"/> + <object-type name="QOpenGLDebugLogger" since="5.1"> + <enum-type name="LoggingMode"/> + </object-type> + <value-type name="QOpenGLDebugMessage" since="5.1"> + <enum-type name="Source" flags="Sources"/> + <enum-type name="Type" flags="Types"/> + <enum-type name="Severity" flags="Severities"/> + </value-type> + <object-type name="QOpenGLFramebufferObject" since="5.0"> <enum-type name="Attachment" /> <enum-type name="FramebufferRestorePolicy" since="5.7"/> </object-type> - <object-type name="QOpenGLShader" > - <enum-type name="ShaderTypeBit" flags="ShaderType" /> + <value-type name="QOpenGLFramebufferObjectFormat"/> + <!-- Compile error on Windows: QOpenGLPaintDevice::QOpenGLPaintDevice(const QOpenGLPaintDevice &)': attempting to reference a deleted function + <object-type name="QOpenGLPaintDevice" since="5.0"/> + --> + <object-type name="QOpenGLExtraFunctions" since="5.6"> + <!-- Exlusions due to compile errors --> + <modify-function signature="glEndTransformFeedback()" remove="all"/> + <modify-function signature="glPauseTransformFeedback()" remove="all"/> + <modify-function signature="glResumeTransformFeedback()" remove="all"/> + </object-type> + <object-type name="QOpenGLFunctions" since="5.0"> + <enum-type name="OpenGLFeature" flags="OpenGLFeatures"/> </object-type> - <!-- Temporarily disable type, because it causes segfault on Linux due to incorrect parsing - of the void setUniformValue(const char *name, const GLfloat value[2][2]); method. - The float[][] ends up with an "Array" cpp signature, which obviously can't be found in the - typesystem. - <object-type name="QOpenGLShaderProgram" /> + <object-type name="QAbstractOpenGLFunctions" since="5.1"/> + <!-- Classes are result of a macro expansion in src/gui/opengl/qopenglversionfunctions.h + <object-type name="QOpenGLFunctions_1_0" since="5.1"/> + <object-type name="QOpenGLFunctions_1_1" since="5.1"/> + <object-type name="QOpenGLFunctions_1_2" since="5.1"/> + <object-type name="QOpenGLFunctions_1_3" since="5.1"/> + <object-type name="QOpenGLFunctions_1_4" since="5.1"/> + <object-type name="QOpenGLFunctions_1_5" since="5.1"/> + <object-type name="QOpenGLFunctions_2_0" since="5.1"> + <object-type name="QOpenGLFunctions_2_1" since="5.1"/> + <object-type name="QOpenGLFunctions_3_0" since="5.1"/> + <object-type name="QOpenGLFunctions_3_1" since="5.1"/> + <object-type name="QOpenGLFunctions_3_2_Compatibility" since="5.1"/> + <object-type name="QOpenGLFunctions_3_2_Core" since="5.1"/> + <object-type name="QOpenGLFunctions_3_3_Compatibility" since="5.1"/> + <object-type name="QOpenGLFunctions_3_3_Core" since="5.1"/> + <object-type name="QOpenGLFunctions_4_0_Compatibility" since="5.1"/> + <object-type name="QOpenGLFunctions_4_0_Core" since="5.1"/> + <object-type name="QOpenGLFunctions_4_1_Compatibility" since="5.1"/> + <object-type name="QOpenGLFunctions_4_1_Core" since="5.1"/> + <object-type name="QOpenGLFunctions_4_2_Compatibility" since="5.1"/> + <object-type name="QOpenGLFunctions_4_2_Core" since="5.1"/> + <object-type name="QOpenGLFunctions_4_3_Compatibility" since="5.1"/> + <object-type name="QOpenGLFunctions_4_3_Core" since="5.1"/> + <object-type name="QOpenGLFunctions_4_4_Compatibility" since="5.5/> + <object-type name="QOpenGLFunctions_4_4_Core" since="5.5"/> + <object-type name="QOpenGLFunctions_4_5_Compatibility since="5.5""/> + <object-type name="QOpenGLFunctions_4_5_Core" since="5.5"/> + <object-type name="QOpenGLFunctions_ES2" since="5.1"/> --> + <value-type name="QOpenGLPixelTransferOptions"/> + <object-type name="QOpenGLShader" since="5.0"> + <enum-type name="ShaderTypeBit" flags="ShaderType" /> + </object-type> + <object-type name="QOpenGLShaderProgram" since="5.0"/> + <object-type name="QOpenGLTexture" since="5.2"> + <enum-type name="BindingTarget"/> + <enum-type name="CoordinateDirection"/> + <enum-type name="ComparisonFunction"/> + <enum-type name="ComparisonMode"/> + <enum-type name="CubeMapFace"/> + <enum-type name="DepthStencilMode"/> + <enum-type name="Feature" flags="Features"/> + <enum-type name="Filter"/> + <enum-type name="MipMapGeneration"/> + <enum-type name="PixelFormat"/> + <enum-type name="PixelType"/> + <enum-type name="SwizzleComponent"/> + <enum-type name="SwizzleValue"/> + <enum-type name="Target"/> + <enum-type name="TextureFormat"/> + <enum-type name="TextureFormatClass"/> + <enum-type name="TextureUnitReset"/> + <enum-type name="WrapMode"/> + <modify-function signature="borderColor(unsigned int*)const" remove="all"/> + <modify-function signature="borderColor(int*)const" remove="all"/> + <modify-function signature="borderColor(float*)const" remove="all"/> + </object-type> + <object-type name="QOpenGLTimeMonitor" since="5.1"/> + <object-type name="QOpenGLTimerQuery" since="5.1"/> + <object-type name="QOpenGLWindow" since="5.4"> + <enum-type name="UpdateBehavior"/> + </object-type> + <value-type name="QOpenGLVersionProfile" since="5.1"/> + <object-type name="QOpenGLVertexArrayObject"> + <object-type name="Binder"/> + </object-type> <value-type name="QPageLayout"> <enum-type name="Mode"/> <enum-type name="Orientation"/> diff --git a/PySide2/global.h.in b/PySide2/global.h.in index 0c7e2114..3422f0d6 100644 --- a/PySide2/global.h.in +++ b/PySide2/global.h.in @@ -71,6 +71,15 @@ #endif #ifndef QT_NO_OPENGL +// Define export macros for Windows' gl.h +# ifdef Q_OS_WIN +# ifndef APIENTRY +# define APIENTRY +# endif +# ifndef WINGDIAPI +# define WINGDIAPI +# endif +# endif // Q_OS_WIN # include <@GL_H@> #endif // QT_NO_OPENGL diff --git a/tests/QtGui/CMakeLists.txt b/tests/QtGui/CMakeLists.txt index 63cf3c35..eeb7c7e3 100644 --- a/tests/QtGui/CMakeLists.txt +++ b/tests/QtGui/CMakeLists.txt @@ -37,6 +37,7 @@ PYSIDE_TEST(qpolygonf_test.py) PYSIDE_TEST(qkeysequence_test.py) PYSIDE_TEST(qradialgradient_test.py) PYSIDE_TEST(qrasterwindow_test.py) +PYSIDE_TEST(qopenglwindow_test.py) PYSIDE_TEST(qregion_test.py) PYSIDE_TEST(qstylehints_test.py) PYSIDE_TEST(qtextdocument_undoredo_test.py) diff --git a/tests/QtGui/qopenglwindow_test.py b/tests/QtGui/qopenglwindow_test.py new file mode 100644 index 00000000..0eb57728 --- /dev/null +++ b/tests/QtGui/qopenglwindow_test.py @@ -0,0 +1,105 @@ +############################################################################# +## +## Copyright (C) 2017 The Qt Company Ltd. +## Contact: https://www.qt.io/licensing/ +## +## This file is part of the test suite of PySide2. +## +## $QT_BEGIN_LICENSE:GPL-EXCEPT$ +## Commercial License Usage +## Licensees holding valid commercial Qt licenses may use this file in +## accordance with the commercial license agreement provided with the +## Software or, alternatively, in accordance with the terms contained in +## a written agreement between you and The Qt Company. For licensing terms +## and conditions see https://www.qt.io/terms-conditions. For further +## information use the contact form at https://www.qt.io/contact-us. +## +## GNU General Public License Usage +## Alternatively, this file may be used under the terms of the GNU +## General Public License version 3 as published by the Free Software +## Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +## included in the packaging of this file. Please review the following +## information to ensure the GNU General Public License requirements will +## be met: https://www.gnu.org/licenses/gpl-3.0.html. +## +## $QT_END_LICENSE$ +## +############################################################################# + +'''Unit test for QOpenGLContext, QOpenGLTexture, QOpenGLWindow and related classes''' + +import sys +import unittest + +from helper import UsesQApplication + +from PySide2.QtCore import QSize, QTimer, Qt +from PySide2.QtGui import (QColor, QGuiApplication, QImage, QOpenGLContext, + QOpenGLTexture, QSurfaceFormat, QOpenGLWindow) + +try: + from OpenGL import GL +except ImportError: + print("Skipping test due to missing OpenGL module") + sys.exit(0) + +class OpenGLWindow(QOpenGLWindow): + def __init__(self): + super(OpenGLWindow, self).__init__() + + self.m_functions = None + self.m_texture = None + self.visibleChanged.connect(self.slotVisibleChanged) + + def slotVisibleChanged(self, visible): + if not visible and self.m_texture is not None and self.context().makeCurrent(self): + self.m_texture = None + self.context().doneCurrent() + + def initializeGL(self): + self.m_functions = self.context().functions() + self.m_functions.initializeOpenGLFunctions() + image = QImage(QSize(200, 200), QImage.Format_RGBA8888) + image.fill(QColor(Qt.red)) + self.m_texture = QOpenGLTexture(image) + + def paintGL(self): + GL.glMatrixMode(GL.GL_MODELVIEW); + GL.glLoadIdentity(); + + GL.glMatrixMode(GL.GL_PROJECTION); + GL.glLoadIdentity(); + GL.glOrtho(0, 1, 1, 0, -1, 1); + + self.m_functions.glClear(GL.GL_COLOR_BUFFER_BIT) + self.m_functions.glEnable(GL.GL_TEXTURE_2D); + self.m_texture.bind() + + d = 0.5 + GL.glBegin(GL.GL_QUADS) + GL.glTexCoord2f(0, 0) + GL.glVertex2f(0, 0) + GL.glTexCoord2f(d, 0) + GL.glVertex2f(d, 0) + GL.glTexCoord2f(d, d) + GL.glVertex2f(d, d) + GL.glTexCoord2f(0, d) + GL.glVertex2f(0, d) + GL.glEnd() + self.m_texture.release() + + def resizeGL(self, w, h): + self.m_functions.glViewport(0, 0, self.width(), self.height()) + +class QOpenGLWindowTest(UsesQApplication): + # On macOS, glClear(), glViewport() are rejected due to GLbitfield/GLint not being resolved properly + @unittest.skipIf(sys.platform == 'darwin', "unsupported platform") + def test(self): + openGlWindow = OpenGLWindow() + openGlWindow.resize(640, 480) + openGlWindow.show() + QTimer.singleShot(100, openGlWindow.close) + self.app.exec_() + +if __name__ == '__main__': + unittest.main() |