From 32e78f4b6cc0e0ef710259ae73c39bf607cbb743 Mon Sep 17 00:00:00 2001
From: Gunnar Sletta <gunnar.sletta@digia.com>
Date: Fri, 24 May 2013 14:09:01 +0200
Subject: [PATCH] Manual test for window transparency

Change-Id: I8b9fdd14382904b5a0c2a1ecaabf01b209034b95
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@digia.com>
---
 tests/manual/manual.pro                       |   5 +-
 .../windowtransparency/windowtransparency.cpp | 200 ++++++++++++++++++
 .../windowtransparency/windowtransparency.pro |   6 +
 3 files changed, 209 insertions(+), 2 deletions(-)
 create mode 100644 tests/manual/windowtransparency/windowtransparency.cpp
 create mode 100644 tests/manual/windowtransparency/windowtransparency.pro

diff --git a/tests/manual/manual.pro b/tests/manual/manual.pro
index 4a466aa4728..d97c69025b5 100644
--- a/tests/manual/manual.pro
+++ b/tests/manual/manual.pro
@@ -38,7 +38,8 @@ windowmodality \
 widgetgrab \
 xembed-raster \
 xembed-widgets \
-dialogs
+dialogs \
+windowtransparency
 
 !contains(QT_CONFIG, openssl):!contains(QT_CONFIG, openssl-linked):SUBDIRS -= qssloptions
 
@@ -49,4 +50,4 @@ win32 {
 }
 
 lessThan(QT_MAJOR_VERSION, 5): SUBDIRS -= bearerex lance qnetworkaccessmanager/qget qnetworkreply \
-qpainfo qscreen  socketengine xembed-raster xembed-widgets
+qpainfo qscreen  socketengine xembed-raster xembed-widgets windowtransparency
diff --git a/tests/manual/windowtransparency/windowtransparency.cpp b/tests/manual/windowtransparency/windowtransparency.cpp
new file mode 100644
index 00000000000..e90fee82f6d
--- /dev/null
+++ b/tests/manual/windowtransparency/windowtransparency.cpp
@@ -0,0 +1,200 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the examples of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+**   * Redistributions of source code must retain the above copyright
+**     notice, this list of conditions and the following disclaimer.
+**   * Redistributions in binary form must reproduce the above copyright
+**     notice, this list of conditions and the following disclaimer in
+**     the documentation and/or other materials provided with the
+**     distribution.
+**   * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names
+**     of its contributors may be used to endorse or promote products derived
+**     from this software without specific prior written permission.
+**
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QtGui>
+#include <QtWidgets>
+
+class GLWindow : public QWindow
+{
+public:
+    GLWindow(Qt::WindowFlags flags)
+        : gl(0)
+    {
+        setFlags(flags);
+        setSurfaceType(OpenGLSurface);
+
+        QSurfaceFormat format;
+        format.setAlphaBufferSize(8);
+        format.setSamples(16);
+        setFormat(format);
+    }
+
+    void exposeEvent(QExposeEvent *)
+    {
+        if (!isExposed())
+            return;
+
+        if (!gl) {
+            gl = new QOpenGLContext();
+            gl->setFormat(requestedFormat());
+            gl->create();
+        }
+
+        gl->makeCurrent(this);
+
+        QOpenGLShaderProgram prog;
+        prog.addShaderFromSourceCode(QOpenGLShader::Vertex,
+                                     "attribute highp vec4 a_Pos;"
+                                     "attribute lowp vec4 a_Color;"
+                                     "varying lowp vec4 v_Color;"
+                                     "void main() {"
+                                     "    gl_Position = a_Pos;"
+                                     "    v_Color = a_Color;"
+                                     "}");
+        prog.addShaderFromSourceCode(QOpenGLShader::Fragment,
+                                     "varying lowp vec4 v_Color;"
+                                     "void main() {"
+                                     "    gl_FragColor = v_Color;"
+                                     "}");
+        prog.bind();
+
+        glClearColor(0, 0, 0, 1);
+        glClear(GL_COLOR_BUFFER_BIT);
+        glViewport(0, 0, width(), height());
+
+        prog.enableAttributeArray("a_Pos");
+        prog.enableAttributeArray("a_Color");
+
+        float coords[] = { -0.7f,  0.7f,
+                            0.8f,  0.8f,
+                           -0.8f, -0.8f,
+                            0.7f, -0.7f };
+        float colors[] = { 1, 0, 0, 1,
+                           0, 1, 0, 1,
+                           0, 0, 1, 1,
+                           0, 0, 0, 0 };
+
+        prog.setAttributeArray("a_Pos", GL_FLOAT, coords, 2, 0);
+        prog.setAttributeArray("a_Color", GL_FLOAT, colors, 4, 0);
+
+        glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
+
+        prog.disableAttributeArray("a_Pos");
+        prog.disableAttributeArray("a_Color");
+
+        gl->swapBuffers(this);
+    }
+
+    void mousePressEvent(QMouseEvent *)
+    {
+        QCoreApplication::quit();
+    }
+
+private:
+    QOpenGLContext *gl;
+};
+
+class Widget : public QWidget
+{
+public:
+    Widget(Qt::WindowFlags flags)
+        : QWidget(0, flags)
+    {
+        setAttribute(Qt::WA_TranslucentBackground);
+    }
+
+    void paintEvent(QPaintEvent *)
+    {
+        QPainter p(this);
+
+        p.setRenderHint(QPainter::Antialiasing);
+
+        p.fillRect(rect(), QColor("steelblue"));
+
+        int w = width();
+        int h = height();
+        int w2 = width() / 2;
+        int h2 = height() / 2;
+
+        QPainterPath path;
+        path.moveTo(0, 0);
+        path.cubicTo(w2, 0,  w2, h2, w, h);
+        path.cubicTo(w2, h, w2, h2, 0, 0);
+
+        QLinearGradient lg(0, 0, w, h);
+        lg.setColorAt(0.0, Qt::transparent);
+        lg.setColorAt(0.5, QColor("palegreen"));
+        lg.setColorAt(1.0, Qt::transparent);
+
+        p.setCompositionMode(QPainter::CompositionMode_Source);
+        p.fillPath(path, lg);
+    }
+
+    void mousePressEvent(QMouseEvent *)
+    {
+        QCoreApplication::quit();
+    }
+
+};
+
+int main(int argc, char **argv)
+{
+    QApplication app(argc, argv);
+
+    // mask: on/off
+    // opacity: on/off
+
+    for (int i=0; i<4; ++i) {
+        bool mask = i & 0x1;
+        bool opacity = i & 0x2;
+
+        Qt::WindowFlags flags = Qt::FramelessWindowHint;
+
+        Widget *widget = new Widget(flags);
+        GLWindow *window = new GLWindow(flags);
+
+        widget->setGeometry(100 + 100 * i, 100, 80, 80);
+        window->setGeometry(100 + 100 * i, 200, 80, 80);
+        if (mask) {
+            QRegion region(0, 0, 80, 80, QRegion::Ellipse);
+            widget->setMask(region);
+            window->setMask(region);
+        }
+        if (opacity) {
+            widget->setWindowOpacity(0.5);
+            window->setOpacity(0.5);
+        }
+
+        widget->show();
+        window->show();
+    }
+
+    return app.exec();
+}
diff --git a/tests/manual/windowtransparency/windowtransparency.pro b/tests/manual/windowtransparency/windowtransparency.pro
new file mode 100644
index 00000000000..0de5c6feb54
--- /dev/null
+++ b/tests/manual/windowtransparency/windowtransparency.pro
@@ -0,0 +1,6 @@
+QT += widgets
+
+SOURCES += \
+    windowtransparency.cpp
+
+CONFIG += console
-- 
GitLab