Added QQuickWindow::setDefaultAlphaBuffer()
authorShawn Rutledge <shawn.rutledge@digia.com>
Wed, 29 May 2013 08:29:08 +0000 (10:29 +0200)
committerThe Qt Project <gerrit-noreply@qt-project.org>
Thu, 30 May 2013 12:19:02 +0000 (14:19 +0200)
All QQuickWindows will render using the same OpenGL context, so
for a window to support transparency, the OpenGL context needs
to be created with support for transparency from the very start.
Therefore the application needs to call setDefaultAlphaBuffer()
before creating windows.  There are some relevant comments in
QTBUG-20768 although the bug itself is not the same use case
(it was already OK as long as the first window had a translucent
color, because of setAlphaBufferSize in QQuickWindow::setColor()).

Change-Id: I92e111c1a62c0d510821b646fd334e52254f8f57
Reviewed-by: Gunnar Sletta <gunnar.sletta@digia.com>
examples/quick/window/main.cpp
src/quick/items/qquickwindow.cpp
src/quick/items/qquickwindow.h
src/quick/items/qquickwindow_p.h
src/quick/scenegraph/qsgcontext.cpp

index 2223c60..7872c71 100644 (file)
@@ -41,6 +41,7 @@
 #include <QtGui/QGuiApplication>
 #include <QtQml/QQmlEngine>
 #include <QtQml/QQmlComponent>
+#include <QtQuick/QQuickWindow>
 #include <QtCore/QUrl>
 #include <QDebug>
 
@@ -49,6 +50,7 @@ int main(int argc, char* argv[])
     QGuiApplication app(argc, argv);
     QQmlEngine engine;
     QQmlComponent component(&engine);
+    QQuickWindow::setDefaultAlphaBuffer(true);
     component.loadUrl(QUrl("qrc:///window/window.qml"));
     if ( component.isReady() )
         component.create();
index 4a34ada..7137bb1 100644 (file)
@@ -74,6 +74,8 @@ QT_BEGIN_NAMESPACE
 
 extern Q_GUI_EXPORT QImage qt_gl_read_framebuffer(const QSize &size, bool alpha_format, bool include_alpha);
 
+bool QQuickWindowPrivate::defaultAlphaBuffer(0);
+
 void QQuickWindowPrivate::updateFocusItemTransform()
 {
     Q_Q(QQuickWindow);
@@ -2969,7 +2971,7 @@ QSGTexture *QQuickWindow::createTextureFromId(uint id, const QSize &size, Create
     Setting the clear color has no effect when clearing is disabled.
     By default, the clear color is white.
 
-    \sa setClearBeforeRendering()
+    \sa setClearBeforeRendering(), setDefaultAlphaBuffer()
  */
 
 void QQuickWindow::setColor(const QColor &color)
@@ -2979,7 +2981,7 @@ void QQuickWindow::setColor(const QColor &color)
         return;
 
     if (color.alpha() != d->clearColor.alpha()) {
-        QSurfaceFormat fmt = format();
+        QSurfaceFormat fmt = requestedFormat();
         if (color.alpha() < 255)
             fmt.setAlphaBufferSize(8);
         else
@@ -2997,6 +2999,31 @@ QColor QQuickWindow::color() const
 }
 
 /*!
+    \brief Returns whether to use alpha transparency on newly created windows.
+
+    \since Qt 5.1
+    \sa setDefaultAlphaBuffer()
+ */
+bool QQuickWindow::hasDefaultAlphaBuffer()
+{
+    return QQuickWindowPrivate::defaultAlphaBuffer;
+}
+
+/*!
+    \brief \a useAlpha specifies whether to use alpha transparency on newly created windows.
+    \since Qt 5.1
+
+    In any application which expects to create translucent windows, it's
+    necessary to set this to true before creating the first QQuickWindow,
+    because all windows will share the same \l QOpenGLContext. The default
+    value is false.
+ */
+void QQuickWindow::setDefaultAlphaBuffer(bool useAlpha)
+{
+    QQuickWindowPrivate::defaultAlphaBuffer = useAlpha;
+}
+
+/*!
     \qmlproperty string QtQuick.Window2::Window::title
 
     The window's title in the windowing system.
index fc148aa..a0bc832 100644 (file)
@@ -115,6 +115,9 @@ public:
     void setColor(const QColor &color);
     QColor color() const;
 
+    static bool hasDefaultAlphaBuffer();
+    static void setDefaultAlphaBuffer(bool useAlpha);
+
     void setPersistentOpenGLContext(bool persistent);
     bool isPersistentOpenGLContext() const;
 
index 9e3251b..2465629 100644 (file)
@@ -219,6 +219,8 @@ public:
 
     mutable QQuickWindowIncubationController *incubationController;
 
+    static bool defaultAlphaBuffer;
+
     static bool dragOverThreshold(qreal d, Qt::Axis axis, QMouseEvent *event);
 
     // data property
index d3710c7..4ebae38 100644 (file)
@@ -54,6 +54,7 @@
 
 #include <QGuiApplication>
 #include <QOpenGLContext>
+#include <QQuickWindow>
 #include <QtGui/qopenglframebufferobject.h>
 
 #include <private/qqmlglobal_p.h>
@@ -398,6 +399,8 @@ QSurfaceFormat QSGContext::defaultSurfaceFormat() const
     QSurfaceFormat format;
     format.setDepthBufferSize(24);
     format.setStencilBufferSize(8);
+    if (QQuickWindow::hasDefaultAlphaBuffer())
+        format.setAlphaBufferSize(8);
     format.setSwapBehavior(QSurfaceFormat::DoubleBuffer);
     return format;
 }