diff options
author | Lars Knoll <lars.knoll@nokia.com> | 2009-03-23 09:18:55 (GMT) |
---|---|---|
committer | Simon Hausmann <simon.hausmann@nokia.com> | 2009-03-23 09:18:55 (GMT) |
commit | e5fcad302d86d316390c6b0f62759a067313e8a9 (patch) | |
tree | c2afbf6f1066b6ce261f14341cf6d310e5595bc1 /tests/auto/qdirectpainter | |
download | Qt-e5fcad302d86d316390c6b0f62759a067313e8a9.zip Qt-e5fcad302d86d316390c6b0f62759a067313e8a9.tar.gz Qt-e5fcad302d86d316390c6b0f62759a067313e8a9.tar.bz2 |
Long live Qt 4.5!
Diffstat (limited to 'tests/auto/qdirectpainter')
-rw-r--r-- | tests/auto/qdirectpainter/.gitignore | 2 | ||||
-rw-r--r-- | tests/auto/qdirectpainter/qdirectpainter.pro | 7 | ||||
-rw-r--r-- | tests/auto/qdirectpainter/runDirectPainter/main.cpp | 81 | ||||
-rw-r--r-- | tests/auto/qdirectpainter/runDirectPainter/runDirectPainter.pro | 5 | ||||
-rw-r--r-- | tests/auto/qdirectpainter/test/test.pro | 14 | ||||
-rw-r--r-- | tests/auto/qdirectpainter/tst_qdirectpainter.cpp | 247 |
6 files changed, 356 insertions, 0 deletions
diff --git a/tests/auto/qdirectpainter/.gitignore b/tests/auto/qdirectpainter/.gitignore new file mode 100644 index 0000000..615dfa8 --- /dev/null +++ b/tests/auto/qdirectpainter/.gitignore @@ -0,0 +1,2 @@ +tst_qdirectpainter +runDirectPainter/runDirectPainter diff --git a/tests/auto/qdirectpainter/qdirectpainter.pro b/tests/auto/qdirectpainter/qdirectpainter.pro new file mode 100644 index 0000000..8967194 --- /dev/null +++ b/tests/auto/qdirectpainter/qdirectpainter.pro @@ -0,0 +1,7 @@ +load(qttest_p4) +SOURCES += tst_qdirectpainter.cpp + +TEMPLATE = subdirs +SUBDIRS = test runDirectPainter + + diff --git a/tests/auto/qdirectpainter/runDirectPainter/main.cpp b/tests/auto/qdirectpainter/runDirectPainter/main.cpp new file mode 100644 index 0000000..3a806f5 --- /dev/null +++ b/tests/auto/qdirectpainter/runDirectPainter/main.cpp @@ -0,0 +1,81 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include <QApplication> +#include <QCopChannel> +#include <QDirectPainter> +#include <QImage> +#include <QScreen> +#include <QPainter> + +int main(int argc, char** argv) +{ +#ifdef Q_WS_QWS + QApplication app(argc, argv); + QDirectPainter dp; + QImage screenImage(dp.frameBuffer(), dp.screenWidth(), dp.screenHeight(), + dp.linestep(), QScreen::instance()->pixelFormat()); + QPainter p; + + QStringList args = app.arguments(); + + dp.setRegion(QRect(args.at(1).toInt(), + args.at(2).toInt(), + args.at(3).toInt(), + args.at(4).toInt())); + + for (;;) { + dp.startPainting(); + p.begin(&screenImage); + p.setPen(Qt::NoPen); + p.setBrush(Qt::blue); + p.drawRects(dp.allocatedRegion().rects()); + p.end(); + dp.endPainting(dp.allocatedRegion()); + app.processEvents(); + } +#else + Q_UNUSED(argc); + Q_UNUSED(argv); +#endif + + return 0; +} + diff --git a/tests/auto/qdirectpainter/runDirectPainter/runDirectPainter.pro b/tests/auto/qdirectpainter/runDirectPainter/runDirectPainter.pro new file mode 100644 index 0000000..9e5131c --- /dev/null +++ b/tests/auto/qdirectpainter/runDirectPainter/runDirectPainter.pro @@ -0,0 +1,5 @@ +load(qttest_p4) +SOURCES = main.cpp +TARGET = runDirectPainter + + diff --git a/tests/auto/qdirectpainter/test/test.pro b/tests/auto/qdirectpainter/test/test.pro new file mode 100644 index 0000000..98c74e4 --- /dev/null +++ b/tests/auto/qdirectpainter/test/test.pro @@ -0,0 +1,14 @@ +load(qttest_p4) + +SOURCES += ../tst_qdirectpainter.cpp +TARGET = ../tst_qdirectpainter + +win32 { + CONFIG(debug, debug|release) { + TARGET = ../../debug/tst_qdirectpainter +} else { + TARGET = ../../release/tst_qdirectpainter + } +} + + diff --git a/tests/auto/qdirectpainter/tst_qdirectpainter.cpp b/tests/auto/qdirectpainter/tst_qdirectpainter.cpp new file mode 100644 index 0000000..7767539 --- /dev/null +++ b/tests/auto/qdirectpainter/tst_qdirectpainter.cpp @@ -0,0 +1,247 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the either Technology Preview License Agreement or the +** Beta Release License Agreement. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain +** additional rights. These rights are described in the Nokia Qt LGPL +** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this +** package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** $QT_END_LICENSE$ +** +****************************************************************************/ + + +#include <QtTest/QtTest> + +#ifdef Q_WS_QWS + +//TESTED_CLASS= +//TESTED_FILES= + +#include <qwindowsystem_qws.h> +#include <qpainter.h> +#include <qdesktopwidget.h> +#include <qdirectpainter_qws.h> +#include <private/qwindowsurface_qws_p.h> +#include <private/qdrawhelper_p.h> + +class tst_QDirectPainter : public QObject +{ + Q_OBJECT + +public: + tst_QDirectPainter() {} + ~tst_QDirectPainter() {} + +private slots: + void initTestCase(); + void setGeometry_data(); + void setGeometry(); + void regionSynchronization(); + void reservedSynchronous(); + +private: + QWSWindow* getWindow(int windId); + QColor bgColor; +}; + +class ColorPainter : public QDirectPainter +{ +public: + ColorPainter(SurfaceFlag flag = NonReserved, + const QColor &color = QColor(Qt::red)) + : QDirectPainter(0, flag), c(color) {} + + QColor color() { return c; } + +protected: + void regionChanged(const QRegion ®ion) { + QScreen::instance()->solidFill(c, region); + } + +private: + QColor c; + QRegion r; +}; + +Q_DECLARE_METATYPE(QDirectPainter::SurfaceFlag) + +void tst_QDirectPainter::initTestCase() +{ + bgColor = QColor(Qt::green); + + QWSServer *server = QWSServer::instance(); + server->setBackground(bgColor); +} + +QWSWindow* tst_QDirectPainter::getWindow(int winId) +{ + QWSServer *server = QWSServer::instance(); + foreach (QWSWindow *w, server->clientWindows()) { + if (w->winId() == winId) + return w; + } + return 0; +} + +class ColorWidget : public QWidget +{ +public: + ColorWidget(QWidget *parent = 0, const QColor &c = QColor(Qt::red)) + : QWidget(parent, Qt::FramelessWindowHint), color(c) + { + QPalette opaquePalette = palette(); + opaquePalette.setColor(backgroundRole(), color); + setPalette(opaquePalette); + setAutoFillBackground(true); + } + + void paintEvent(QPaintEvent *e) { + r += e->region(); + } + + void reset() { + r = QRegion(); + } + + QColor color; + QRegion r; +}; + +#define VERIFY_COLOR(rect, color) { \ + const QPixmap pixmap = QPixmap::grabWindow(QDesktopWidget().winId(), \ + rect.left(), rect.top(), \ + rect.width(), rect.height()); \ + QCOMPARE(pixmap.size(), rect.size()); \ + QPixmap expectedPixmap(pixmap); /* ensure equal formats */ \ + expectedPixmap.fill(color); \ + QCOMPARE(pixmap, expectedPixmap); \ +} + +void tst_QDirectPainter::setGeometry_data() +{ + QTest::addColumn<QDirectPainter::SurfaceFlag>("flag"); + + QTest::newRow("NonReserved") << QDirectPainter::NonReserved; + QTest::newRow("Reserved") << QDirectPainter::Reserved; + QTest::newRow("ReservedSynchronous") << QDirectPainter::ReservedSynchronous; +} + +void tst_QDirectPainter::setGeometry() +{ + QFETCH(QDirectPainter::SurfaceFlag, flag); + + const QRect rect(100, 100, 100, 100); + { + ColorPainter w(flag); + + w.setGeometry(rect); + QApplication::processEvents(); + QCOMPARE(w.geometry(), rect); + VERIFY_COLOR(rect, w.color()); + } + QApplication::processEvents(); + VERIFY_COLOR(rect, bgColor); +} + +void tst_QDirectPainter::regionSynchronization() +{ + QRect dpRect(10, 10, 50, 50); + + // Start the direct painter in a different process + QProcess proc; + QStringList args; + args << QString::number(dpRect.x()) + << QString::number(dpRect.y()) + << QString::number(dpRect.width()) + << QString::number(dpRect.height()); + + proc.start("runDirectPainter/runDirectPainter", args); + QVERIFY(proc.waitForStarted(5 * 1000)); + QTest::qWait(1000); + QApplication::processEvents(); + VERIFY_COLOR(dpRect, Qt::blue); // blue hardcoded in runDirectPainter + + QTime t; + t.start(); + static int i = 0; + while (t.elapsed() < 10 * 1000) { + QApplication::processEvents(); + + ColorWidget w; + w.setGeometry(10, 10, 50, 50); + const QRect wRect = dpRect.translated(10, 0); + w.setGeometry(wRect); + w.show(); + + QApplication::processEvents(); + QApplication::processEvents(); //glib event loop workaround + VERIFY_COLOR(wRect, w.color); + ++i; + } + QVERIFY(i > 100); // sanity check + + proc.kill(); +} + +class MyObject : public QObject +{ +public: + MyObject(QObject *p = 0) : QObject(p), lastEvent(0) {} + + bool event(QEvent *e) { + lastEvent = e; + return true; + } + + QEvent *lastEvent; +}; + +void tst_QDirectPainter::reservedSynchronous() +{ + MyObject o; + QCoreApplication::postEvent(&o, new QEvent(QEvent::None)); + QDirectPainter p(0, QDirectPainter::ReservedSynchronous); + p.setRegion(QRect(5, 5, 50, 50)); + + // The event loop should not have been executed + QVERIFY(o.lastEvent == 0); + QCOMPARE(p.allocatedRegion(), QRegion(QRect(5, 5, 50, 50))); +} + +QTEST_MAIN(tst_QDirectPainter) + +#include "tst_qdirectpainter.moc" + +#else // Q_WS_QWS +QTEST_NOOP_MAIN +#endif |