aboutsummaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorKim Motoyoshi Kalland <kim.kalland@nokia.com>2012-01-17 16:49:13 +0100
committerQt by Nokia <qt-info@nokia.com>2012-02-07 11:49:20 +0100
commita6eb09137247a880c58995464a35c1ad5c3f0c20 (patch)
treeb5d8b2444cf93f9f25ff90d9b6c65bbb2a492553 /tests
parent54a2a4ee656134874990d5657dfe921d98c6c028 (diff)
Fixed some Item.layer bugs and added auto-tests.
Change-Id: I3f66f911d1c499c37a66904f8ddab6951ba85e60 Reviewed-by: Gunnar Sletta <gunnar.sletta@nokia.com>
Diffstat (limited to 'tests')
-rw-r--r--tests/auto/qtquick2/qquickitemlayer/data/DisableLayer.qml18
-rw-r--r--tests/auto/qtquick2/qquickitemlayer/data/SamplerNameChange.qml18
-rw-r--r--tests/auto/qtquick2/qquickitemlayer/data/ToggleLayerAndEffect.qml23
-rw-r--r--tests/auto/qtquick2/qquickitemlayer/data/ZOrderChange.qml50
-rw-r--r--tests/auto/qtquick2/qquickitemlayer/qquickitemlayer.pro6
-rw-r--r--tests/auto/qtquick2/qquickitemlayer/tst_qquickitemlayer.cpp147
-rw-r--r--tests/auto/qtquick2/qtquick2.pro1
7 files changed, 259 insertions, 4 deletions
diff --git a/tests/auto/qtquick2/qquickitemlayer/data/DisableLayer.qml b/tests/auto/qtquick2/qquickitemlayer/data/DisableLayer.qml
new file mode 100644
index 0000000000..70fc05e937
--- /dev/null
+++ b/tests/auto/qtquick2/qquickitemlayer/data/DisableLayer.qml
@@ -0,0 +1,18 @@
+import QtQuick 2.0
+
+Item {
+ width: 200
+ height: 200
+ Rectangle {
+ width: 100
+ height: 100
+ color: "red"
+ layer.enabled: true
+ Component.onCompleted: {
+ layer.enabled = false
+ visible = false
+ width = 120
+ x = 10
+ }
+ }
+}
diff --git a/tests/auto/qtquick2/qquickitemlayer/data/SamplerNameChange.qml b/tests/auto/qtquick2/qquickitemlayer/data/SamplerNameChange.qml
new file mode 100644
index 0000000000..a4c2ebff6b
--- /dev/null
+++ b/tests/auto/qtquick2/qquickitemlayer/data/SamplerNameChange.qml
@@ -0,0 +1,18 @@
+import QtQuick 2.0
+
+Rectangle {
+ width: 200
+ height: 200
+ color: "blue"
+ layer.enabled: true
+ layer.effect: ShaderEffect {
+ fragmentShader: "
+ uniform sampler2D foo;
+ uniform lowp float qt_Opacity;
+ varying highp vec2 qt_TexCoord0;
+ void main() {
+ gl_FragColor = texture2D(foo, qt_TexCoord0) * qt_Opacity;
+ }"
+ }
+ Component.onCompleted: layer.samplerName = "foo"
+}
diff --git a/tests/auto/qtquick2/qquickitemlayer/data/ToggleLayerAndEffect.qml b/tests/auto/qtquick2/qquickitemlayer/data/ToggleLayerAndEffect.qml
new file mode 100644
index 0000000000..174b669b6c
--- /dev/null
+++ b/tests/auto/qtquick2/qquickitemlayer/data/ToggleLayerAndEffect.qml
@@ -0,0 +1,23 @@
+import QtQuick 2.0
+
+Item {
+ width: 200
+ height: 200
+ Rectangle {
+ width: 100
+ height: 100
+ color: "red"
+ Component.onCompleted: {
+ layer.enabled = true
+ layer.effect = effectComponent
+ layer.enabled = false
+ visible = false
+ width = 120
+ x = 10
+ }
+ }
+ Component {
+ id: effectComponent
+ ShaderEffect { }
+ }
+}
diff --git a/tests/auto/qtquick2/qquickitemlayer/data/ZOrderChange.qml b/tests/auto/qtquick2/qquickitemlayer/data/ZOrderChange.qml
new file mode 100644
index 0000000000..ebbd3b7e15
--- /dev/null
+++ b/tests/auto/qtquick2/qquickitemlayer/data/ZOrderChange.qml
@@ -0,0 +1,50 @@
+import QtQuick 2.0
+
+Item {
+ width: 200
+ height: 200
+ property bool layerEffect: false
+ property bool layerEnabled: false
+ property real layerZ: 0
+ Rectangle {
+ anchors.fill: parent
+ color: "#00ffff"
+ }
+ Rectangle {
+ id: foo
+ anchors.fill: parent
+ color: "#ffff00"
+ Rectangle {
+ width: 100
+ height: 100
+ color: "#00ffff"
+ }
+ layer.enabled: parent.layerEnabled
+ layer.effect: parent.layerEffect ? effectComponent : null
+ opacity: 0.5
+ z: layerZ
+ }
+ Rectangle {
+ width: 100
+ height: 100
+ x: 100
+ color: "#ff0000"
+ }
+ Rectangle {
+ width: 100
+ height: 100
+ y: 100
+ color: "#0000ff"
+ z: 1
+ }
+ Component {
+ id: effectComponent
+ ShaderEffect {
+ fragmentShader: "
+ uniform sampler2D source;
+ uniform lowp float qt_Opacity;
+ varying highp vec2 qt_TexCoord0;
+ void main() { gl_FragColor = texture2D(source, qt_TexCoord0).xzyw * qt_Opacity; }"
+ }
+ }
+}
diff --git a/tests/auto/qtquick2/qquickitemlayer/qquickitemlayer.pro b/tests/auto/qtquick2/qquickitemlayer/qquickitemlayer.pro
index bf22d04f23..5c34decdcd 100644
--- a/tests/auto/qtquick2/qquickitemlayer/qquickitemlayer.pro
+++ b/tests/auto/qtquick2/qquickitemlayer/qquickitemlayer.pro
@@ -21,7 +21,11 @@ OTHER_FILES += \
data/SourceRect.qml \
data/TextureProvider.qml \
data/Visible.qml \
- data/ZOrder.qml
+ data/ZOrder.qml \
+ data/ZOrderChange.qml \
+ data/ToggleLayerAndEffect.qml \
+ data/DisableLayer.qml \
+ data/SamplerNameChange.qml
diff --git a/tests/auto/qtquick2/qquickitemlayer/tst_qquickitemlayer.cpp b/tests/auto/qtquick2/qquickitemlayer/tst_qquickitemlayer.cpp
index 09c92f6202..1e55924f86 100644
--- a/tests/auto/qtquick2/qquickitemlayer/tst_qquickitemlayer.cpp
+++ b/tests/auto/qtquick2/qquickitemlayer/tst_qquickitemlayer.cpp
@@ -43,6 +43,7 @@
#include <QtQuick/qquickitem.h>
#include <QtQuick/qquickview.h>
+#include <QtGui/qopenglcontext.h>
#include "../../shared/util.h"
@@ -74,25 +75,64 @@ private slots:
void layerSourceRect();
-
void layerZOrder_data();
void layerZOrder();
void layerIsTextureProvider();
+
+ void changeZOrder_data();
+ void changeZOrder();
+
+ void toggleLayerAndEffect();
+ void disableLayer();
+ void changeSamplerName();
+
+private:
+ bool m_isMesaSoftwareRasterizer;
+ int m_mesaVersion;
};
tst_QQuickItemLayer::tst_QQuickItemLayer()
+ : m_mesaVersion(0)
{
+ QWindow window;
+ QOpenGLContext context;
+ window.setSurfaceType(QWindow::OpenGLSurface);
+ window.create();
+ context.create();
+ context.makeCurrent(&window);
+ const char *vendor = (const char *)glGetString(GL_VENDOR);
+ const char *renderer = (const char *)glGetString(GL_RENDERER);
+ m_isMesaSoftwareRasterizer = strcmp(vendor, "Mesa Project") == 0
+ && strcmp(renderer, "Software Rasterizer") == 0;
+ if (m_isMesaSoftwareRasterizer) {
+ // Expects format: <OpenGL version> Mesa <Mesa version>[-devel] [...]
+ const char *version = (const char *)glGetString(GL_VERSION);
+ QList<QByteArray> list = QByteArray(version).split(' ');
+ if (list.size() >= 3) {
+ list = list.at(2).split('-').at(0).split('.');
+ int major = 0;
+ int minor = 0;
+ int patch = 0;
+ if (list.size() >= 1)
+ major = list.at(0).toInt();
+ if (list.size() >= 2)
+ minor = list.at(1).toInt();
+ if (list.size() >= 3)
+ patch = list.at(2).toInt();
+ m_mesaVersion = QT_VERSION_CHECK(major, minor, patch);
+ }
+ }
}
-
-
// The test draws a red and a blue box next to each other and tests that the
// output is still red and blue on the left and right and a combination of
// the two in the middle.
void tst_QQuickItemLayer::layerSmooth()
{
+ if (m_isMesaSoftwareRasterizer && m_mesaVersion < QT_VERSION_CHECK(7, 11, 0))
+ QSKIP("Mesa Software Rasterizer below version 7.11 does not render this test correctly.");
QImage fb = runTest(testFile("Smooth.qml"));
QCOMPARE(fb.pixel(0, 0), qRgb(0xff, 0, 0));
QCOMPARE(fb.pixel(fb.width() - 1, 0), qRgb(0, 0, 0xff));
@@ -110,6 +150,8 @@ void tst_QQuickItemLayer::layerSmooth()
void tst_QQuickItemLayer::layerEnabled()
{
+ if (m_isMesaSoftwareRasterizer && m_mesaVersion < QT_VERSION_CHECK(7, 11, 0))
+ QSKIP("Mesa Software Rasterizer below version 7.11 does not render this test correctly.");
QImage fb = runTest(testFile("Enabled.qml"));
// Verify the banding
QCOMPARE(fb.pixel(0, 0), fb.pixel(0, 1));
@@ -124,6 +166,8 @@ void tst_QQuickItemLayer::layerEnabled()
void tst_QQuickItemLayer::layerMipmap()
{
+ if (m_isMesaSoftwareRasterizer)
+ QSKIP("Mipmapping does not work with the Mesa Software Rasterizer.");
QImage fb = runTest(testFile("Mipmap.qml"));
QVERIFY(fb.pixel(0, 0) != 0xff000000);
QVERIFY(fb.pixel(0, 0) != 0xffffffff);
@@ -136,6 +180,8 @@ void tst_QQuickItemLayer::layerMipmap()
void tst_QQuickItemLayer::layerEffect()
{
+ if (m_isMesaSoftwareRasterizer && m_mesaVersion < QT_VERSION_CHECK(7, 11, 0))
+ QSKIP("Mesa Software Rasterizer below version 7.11 does not render this test correctly.");
QImage fb = runTest(testFile("Effect.qml"));
QCOMPARE(fb.pixel(0, 0), qRgb(0xff, 0, 0));
QCOMPARE(fb.pixel(fb.width() - 1, 0), qRgb(0, 0xff, 0));
@@ -148,6 +194,9 @@ void tst_QQuickItemLayer::layerEffect()
// a shader that pads transparent to blue. Everything else is red.
void tst_QQuickItemLayer::layerSourceRect()
{
+ if (m_isMesaSoftwareRasterizer && m_mesaVersion < QT_VERSION_CHECK(7, 11, 0))
+ QSKIP("Mesa Software Rasterizer below version 7.11 does not render this test correctly.");
+
QImage fb = runTest(testFile("SourceRect.qml"));
// Check that the edges are converted to blue
@@ -166,6 +215,8 @@ void tst_QQuickItemLayer::layerSourceRect()
// directly in a stand alone ShaderEffect
void tst_QQuickItemLayer::layerIsTextureProvider()
{
+ if (m_isMesaSoftwareRasterizer && m_mesaVersion < QT_VERSION_CHECK(7, 11, 0))
+ QSKIP("Mesa Software Rasterizer below version 7.11 does not render this test correctly.");
QImage fb = runTest(testFile("TextureProvider.qml"));
QCOMPARE(fb.pixel(0, 0), qRgb(0xff, 0, 0));
QCOMPARE(fb.pixel(fb.width() - 1, 0), qRgb(0, 0xff, 0));
@@ -196,6 +247,9 @@ void tst_QQuickItemLayer::layerVisibility_data()
void tst_QQuickItemLayer::layerVisibility()
{
+ if (m_isMesaSoftwareRasterizer && m_mesaVersion < QT_VERSION_CHECK(7, 11, 0))
+ QSKIP("Mesa Software Rasterizer below version 7.11 does not render this test correctly.");
+
QFETCH(bool, visible);
QFETCH(bool, effect);
QFETCH(qreal, opacity);
@@ -241,6 +295,9 @@ void tst_QQuickItemLayer::layerZOrder_data()
void tst_QQuickItemLayer::layerZOrder()
{
+ if (m_isMesaSoftwareRasterizer && m_mesaVersion < QT_VERSION_CHECK(7, 11, 0))
+ QSKIP("Mesa Software Rasterizer below version 7.11 does not render this test correctly.");
+
QFETCH(bool, effect);
QQuickView view;
@@ -260,7 +317,91 @@ void tst_QQuickItemLayer::layerZOrder()
}
+void tst_QQuickItemLayer::changeZOrder_data()
+{
+ QTest::addColumn<bool>("layered");
+ QTest::addColumn<bool>("effect");
+
+ QTest::newRow("layered, effect") << true << true;
+ QTest::newRow("layered, !effect") << true << false;
+ QTest::newRow("!layered") << false << false;
+}
+
+void tst_QQuickItemLayer::changeZOrder()
+{
+ if (m_isMesaSoftwareRasterizer && m_mesaVersion < QT_VERSION_CHECK(7, 11, 0))
+ QSKIP("Mesa Software Rasterizer below version 7.11 does not render this test correctly.");
+
+ QFETCH(bool, layered);
+ QFETCH(bool, effect);
+
+ QQuickView view;
+ view.setSource(testFile("ZOrderChange.qml"));
+
+ QQuickItem *child = view.rootItem()->childItems().at(0);
+ child->setProperty("layerEnabled", layered);
+ child->setProperty("layerEffect", effect);
+ child->setProperty("layerZ", 1);
+ view.show();
+
+ QTest::qWaitForWindowShown(&view);
+
+ QImage fb = view.grabFrameBuffer();
+
+ QRgb topLeft = fb.pixel(50, 50);
+ QRgb topRight = fb.pixel(150, 50);
+ QRgb bottomLeft = fb.pixel(50, 150);
+ QRgb bottomRight = fb.pixel(150, 150);
+
+ QCOMPARE(bottomLeft, qRgb(0, 0, 0xff));
+
+ if (layered) {
+ QCOMPARE(topLeft, qRgb(0, 0xff, 0xff));
+ } else {
+ QCOMPARE(qGreen(topLeft), 0xff);
+ QVERIFY(qAbs(qRed(topLeft) - 0x3f) < 4);
+ QVERIFY(qAbs(qBlue(topLeft) - 0xbf) < 4);
+ }
+
+ if (layered && effect) {
+ QCOMPARE(qRed(topRight), 0xff);
+ QCOMPARE(qGreen(topRight), 0x00);
+ QVERIFY(qAbs(qBlue(topRight) - 0x7f) < 4);
+
+ QVERIFY(qAbs(qRed(bottomRight) - 0x7f) < 4);
+ QCOMPARE(qBlue(bottomRight), 0xff);
+ QVERIFY(qAbs(qGreen(bottomRight) - 0x7f) < 4);
+ } else {
+ QCOMPARE(qRed(topRight), 0xff);
+ QCOMPARE(qBlue(topRight), 0x00);
+ QVERIFY(qAbs(qGreen(topRight) - 0x7f) < 4);
+
+ QVERIFY(qAbs(qRed(bottomRight) - 0x7f) < 4);
+ QCOMPARE(qGreen(bottomRight), 0xff);
+ QVERIFY(qAbs(qBlue(bottomRight) - 0x7f) < 4);
+ }
+}
+
+void tst_QQuickItemLayer::toggleLayerAndEffect()
+{
+ // This test passes if it doesn't crash.
+ runTest(testFile("ToggleLayerAndEffect.qml"));
+}
+
+void tst_QQuickItemLayer::disableLayer()
+{
+ // This test passes if it doesn't crash.
+ runTest(testFile("DisableLayer.qml"));
+}
+
+void tst_QQuickItemLayer::changeSamplerName()
+{
+ if (m_isMesaSoftwareRasterizer && m_mesaVersion < QT_VERSION_CHECK(7, 11, 0))
+ QSKIP("Mesa Software Rasterizer below version 7.11 does not render this test correctly.");
+ QImage fb = runTest(testFile("SamplerNameChange.qml"));
+ QCOMPARE(fb.pixel(0, 0), qRgb(0, 0, 0xff));
+}
QTEST_MAIN(tst_QQuickItemLayer)
diff --git a/tests/auto/qtquick2/qtquick2.pro b/tests/auto/qtquick2/qtquick2.pro
index 0722fd3c0c..7066446cb1 100644
--- a/tests/auto/qtquick2/qtquick2.pro
+++ b/tests/auto/qtquick2/qtquick2.pro
@@ -41,6 +41,7 @@ QUICKTESTS = \
qquickimage \
qquickitem \
qquickitem2 \
+ qquickitemlayer \
qquicklistview \
qquickloader \
qquickmousearea \