diff options
author | Lars Knoll <lars.knoll@nokia.com> | 2009-03-23 09:34:13 (GMT) |
---|---|---|
committer | Simon Hausmann <simon.hausmann@nokia.com> | 2009-03-23 09:34:13 (GMT) |
commit | 67ad0519fd165acee4a4d2a94fa502e9e4847bd0 (patch) | |
tree | 1dbf50b3dff8d5ca7e9344733968c72704eb15ff /tests/benchmarks/qgraphicsview | |
download | Qt-67ad0519fd165acee4a4d2a94fa502e9e4847bd0.zip Qt-67ad0519fd165acee4a4d2a94fa502e9e4847bd0.tar.gz Qt-67ad0519fd165acee4a4d2a94fa502e9e4847bd0.tar.bz2 |
Long live Qt!
Diffstat (limited to 'tests/benchmarks/qgraphicsview')
32 files changed, 2283 insertions, 0 deletions
diff --git a/tests/benchmarks/qgraphicsview/benchapps/chipTest/chip.cpp b/tests/benchmarks/qgraphicsview/benchapps/chipTest/chip.cpp new file mode 100644 index 0000000..6851696 --- /dev/null +++ b/tests/benchmarks/qgraphicsview/benchapps/chipTest/chip.cpp @@ -0,0 +1,176 @@ +/**************************************************************************** +** +** 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 "chip.h" + +#include <QtGui> + +Chip::Chip(const QColor &color, int x, int y) +{ + this->x = x; + this->y = y; + this->color = color; + setZValue((x + y) % 2); + + setFlags(ItemIsSelectable | ItemIsMovable); + setAcceptsHoverEvents(true); +} + +QRectF Chip::boundingRect() const +{ + return QRectF(0, 0, 110, 70); +} + +QPainterPath Chip::shape() const +{ + QPainterPath path; + path.addRect(14, 14, 82, 42); + return path; +} + +void Chip::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) +{ + Q_UNUSED(widget); + + QColor fillColor = (option->state & QStyle::State_Selected) ? color.dark(150) : color; + if (option->state & QStyle::State_MouseOver) + fillColor = fillColor.light(125); + + if (option->levelOfDetail < 0.2) { + if (option->levelOfDetail < 0.125) { + painter->fillRect(QRectF(0, 0, 110, 70), fillColor); + return; + } + + painter->setPen(QPen(Qt::black, 0)); + painter->setBrush(fillColor); + painter->drawRect(13, 13, 97, 57); + return; + } + + QPen oldPen = painter->pen(); + QPen pen = oldPen; + int width = 0; + if (option->state & QStyle::State_Selected) + width += 2; + + pen.setWidth(width); + painter->setBrush(QBrush(fillColor.dark(option->state & QStyle::State_Sunken ? 120 : 100))); + + painter->drawRect(QRect(14, 14, 79, 39)); + if (option->levelOfDetail >= 1) { + painter->setPen(QPen(Qt::gray, 1)); + painter->drawLine(15, 54, 94, 54); + painter->drawLine(94, 53, 94, 15); + painter->setPen(QPen(Qt::black, 0)); + } + + // Draw text + if (option->levelOfDetail >= 2) { + QFont font("Times", 10); + font.setStyleStrategy(QFont::ForceOutline); + painter->setFont(font); + painter->save(); + painter->scale(0.1, 0.1); + painter->drawText(170, 180, QString("Model: VSC-2000 (Very Small Chip) at %1x%2").arg(x).arg(y)); + painter->drawText(170, 200, QString("Serial number: DLWR-WEER-123L-ZZ33-SDSJ")); + painter->drawText(170, 220, QString("Manufacturer: Chip Manufacturer")); + painter->restore(); + } + + // Draw lines + QVarLengthArray<QLineF, 36> lines; + if (option->levelOfDetail >= 0.5) { + for (int i = 0; i <= 10; i += (option->levelOfDetail > 0.5 ? 1 : 2)) { + lines.append(QLineF(18 + 7 * i, 13, 18 + 7 * i, 5)); + lines.append(QLineF(18 + 7 * i, 54, 18 + 7 * i, 62)); + } + for (int i = 0; i <= 6; i += (option->levelOfDetail > 0.5 ? 1 : 2)) { + lines.append(QLineF(5, 18 + i * 5, 13, 18 + i * 5)); + lines.append(QLineF(94, 18 + i * 5, 102, 18 + i * 5)); + } + } + if (option->levelOfDetail >= 0.4) { + const QLineF lineData[] = { + QLineF(25, 35, 35, 35), + QLineF(35, 30, 35, 40), + QLineF(35, 30, 45, 35), + QLineF(35, 40, 45, 35), + QLineF(45, 30, 45, 40), + QLineF(45, 35, 55, 35) + }; + lines.append(lineData, 6); + } + painter->drawLines(lines.data(), lines.size()); + + // Draw red ink + if (stuff.size() > 1) { + painter->setPen(QPen(Qt::red, 1, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin)); + painter->setBrush(Qt::NoBrush); + QPainterPath path; + path.moveTo(stuff.first()); + for (int i = 1; i < stuff.size(); ++i) + path.lineTo(stuff.at(i)); + painter->drawPath(path); + } +} + +void Chip::mousePressEvent(QGraphicsSceneMouseEvent *event) +{ + QGraphicsItem::mousePressEvent(event); + update(); +} + +void Chip::mouseMoveEvent(QGraphicsSceneMouseEvent *event) +{ + if (event->modifiers() & Qt::ShiftModifier) { + stuff << event->pos(); + update(); + return; + } + QGraphicsItem::mouseMoveEvent(event); +} + +void Chip::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) +{ + QGraphicsItem::mouseReleaseEvent(event); + update(); +} diff --git a/tests/benchmarks/qgraphicsview/benchapps/chipTest/chip.debug b/tests/benchmarks/qgraphicsview/benchapps/chipTest/chip.debug Binary files differnew file mode 100644 index 0000000..8fe1e5b --- /dev/null +++ b/tests/benchmarks/qgraphicsview/benchapps/chipTest/chip.debug diff --git a/tests/benchmarks/qgraphicsview/benchapps/chipTest/chip.h b/tests/benchmarks/qgraphicsview/benchapps/chipTest/chip.h new file mode 100644 index 0000000..6fded63 --- /dev/null +++ b/tests/benchmarks/qgraphicsview/benchapps/chipTest/chip.h @@ -0,0 +1,68 @@ +/**************************************************************************** +** +** 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$ +** +****************************************************************************/ + +#ifndef CHIP_H +#define CHIP_H + +#include <QtGui/QColor> +#include <QtGui/QGraphicsItem> + +class Chip : public QGraphicsItem +{ +public: + Chip(const QColor &color, int x, int y); + + QRectF boundingRect() const; + QPainterPath shape() const; + void paint(QPainter *painter, const QStyleOptionGraphicsItem *item, QWidget *widget); + +protected: + void mousePressEvent(QGraphicsSceneMouseEvent *event); + void mouseMoveEvent(QGraphicsSceneMouseEvent *event); + void mouseReleaseEvent(QGraphicsSceneMouseEvent *event); + +private: + int x, y; + QColor color; + QList<QPointF> stuff; +}; + +#endif diff --git a/tests/benchmarks/qgraphicsview/benchapps/chipTest/chip.pro b/tests/benchmarks/qgraphicsview/benchapps/chipTest/chip.pro new file mode 100644 index 0000000..53fa23b --- /dev/null +++ b/tests/benchmarks/qgraphicsview/benchapps/chipTest/chip.pro @@ -0,0 +1,19 @@ +RESOURCES += images.qrc + +HEADERS += mainwindow.h view.h chip.h +SOURCES += main.cpp +SOURCES += mainwindow.cpp view.cpp chip.cpp + +contains(QT_CONFIG, opengl):QT += opengl + +build_all:!build_pass { + CONFIG -= build_all + CONFIG += release +} + +# install +target.path = $$[QT_INSTALL_DEMOS]/chip +sources.files = $$SOURCES $$HEADERS $$RESOURCES *.png *.pro *.html *.doc images +sources.path = $$[QT_INSTALL_DEMOS]/chip +INSTALLS += target sources + diff --git a/tests/benchmarks/qgraphicsview/benchapps/chipTest/fileprint.png b/tests/benchmarks/qgraphicsview/benchapps/chipTest/fileprint.png Binary files differnew file mode 100644 index 0000000..ba7c02d --- /dev/null +++ b/tests/benchmarks/qgraphicsview/benchapps/chipTest/fileprint.png diff --git a/tests/benchmarks/qgraphicsview/benchapps/chipTest/images.qrc b/tests/benchmarks/qgraphicsview/benchapps/chipTest/images.qrc new file mode 100644 index 0000000..c7cdf0c --- /dev/null +++ b/tests/benchmarks/qgraphicsview/benchapps/chipTest/images.qrc @@ -0,0 +1,10 @@ +<!DOCTYPE RCC><RCC version="1.0"> +<qresource> + <file>qt4logo.png</file> + <file>zoomin.png</file> + <file>zoomout.png</file> + <file>rotateleft.png</file> + <file>rotateright.png</file> + <file>fileprint.png</file> +</qresource> +</RCC> diff --git a/tests/benchmarks/qgraphicsview/benchapps/chipTest/main.cpp b/tests/benchmarks/qgraphicsview/benchapps/chipTest/main.cpp new file mode 100644 index 0000000..6762305 --- /dev/null +++ b/tests/benchmarks/qgraphicsview/benchapps/chipTest/main.cpp @@ -0,0 +1,57 @@ +/**************************************************************************** +** +** 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 "mainwindow.h" + +#include <QApplication> + +int main(int argc, char **argv) +{ + Q_INIT_RESOURCE(images); + + QApplication app(argc, argv); + app.setAttribute(Qt::AA_DontCreateNativeWidgetSiblings); + + MainWindow window; + window.show(); + + return app.exec(); +} diff --git a/tests/benchmarks/qgraphicsview/benchapps/chipTest/mainwindow.cpp b/tests/benchmarks/qgraphicsview/benchapps/chipTest/mainwindow.cpp new file mode 100644 index 0000000..bf4a2bb --- /dev/null +++ b/tests/benchmarks/qgraphicsview/benchapps/chipTest/mainwindow.cpp @@ -0,0 +1,87 @@ +/**************************************************************************** +** +** 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 "mainwindow.h" +#include "view.h" +#include "chip.h" + +#include <QtGui> + +MainWindow::MainWindow(QWidget *parent) + : QWidget(parent) +{ + populateScene(); + + View *view = new View("Top left view"); + view->view()->setScene(scene); + QHBoxLayout *layout = new QHBoxLayout; + layout->addWidget(view); + setLayout(layout); + + setWindowTitle(tr("Chip Demo")); +} + +void MainWindow::populateScene() +{ + scene = new QGraphicsScene; + + QImage image(":/qt4logo.png"); + + // Populate scene + int xx = 0; + int nitems = 0; + for (int i = -11000; i < 11000; i += 110) { + ++xx; + int yy = 0; + for (int j = -7000; j < 7000; j += 70) { + ++yy; + qreal x = (i + 11000) / 22000.0; + qreal y = (j + 7000) / 14000.0; + + QColor color(image.pixel(int(image.width() * x), int(image.height() * y))); + QGraphicsItem *item = new Chip(color, xx, yy); + item->setPos(QPointF(i, j)); + scene->addItem(item); + + ++nitems; + } + } +} diff --git a/tests/benchmarks/qgraphicsview/benchapps/chipTest/mainwindow.h b/tests/benchmarks/qgraphicsview/benchapps/chipTest/mainwindow.h new file mode 100644 index 0000000..4551f4f --- /dev/null +++ b/tests/benchmarks/qgraphicsview/benchapps/chipTest/mainwindow.h @@ -0,0 +1,66 @@ +/**************************************************************************** +** +** 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$ +** +****************************************************************************/ + +#ifndef MAINWINDOW_H +#define MAINWINDOW_H + +#include <QtGui/qwidget.h> + +QT_FORWARD_DECLARE_CLASS(QGraphicsScene) +QT_FORWARD_DECLARE_CLASS(QGraphicsView) +QT_FORWARD_DECLARE_CLASS(QLabel) +QT_FORWARD_DECLARE_CLASS(QSlider) +QT_FORWARD_DECLARE_CLASS(QSplitter) + +class MainWindow : public QWidget +{ + Q_OBJECT +public: + MainWindow(QWidget *parent = 0); + +private: + void setupMatrix(); + void populateScene(); + + QGraphicsScene *scene; +}; + +#endif diff --git a/tests/benchmarks/qgraphicsview/benchapps/chipTest/qt4logo.png b/tests/benchmarks/qgraphicsview/benchapps/chipTest/qt4logo.png Binary files differnew file mode 100644 index 0000000..157e86e --- /dev/null +++ b/tests/benchmarks/qgraphicsview/benchapps/chipTest/qt4logo.png diff --git a/tests/benchmarks/qgraphicsview/benchapps/chipTest/rotateleft.png b/tests/benchmarks/qgraphicsview/benchapps/chipTest/rotateleft.png Binary files differnew file mode 100644 index 0000000..8cfa931 --- /dev/null +++ b/tests/benchmarks/qgraphicsview/benchapps/chipTest/rotateleft.png diff --git a/tests/benchmarks/qgraphicsview/benchapps/chipTest/rotateright.png b/tests/benchmarks/qgraphicsview/benchapps/chipTest/rotateright.png Binary files differnew file mode 100644 index 0000000..ec5e866 --- /dev/null +++ b/tests/benchmarks/qgraphicsview/benchapps/chipTest/rotateright.png diff --git a/tests/benchmarks/qgraphicsview/benchapps/chipTest/view.cpp b/tests/benchmarks/qgraphicsview/benchapps/chipTest/view.cpp new file mode 100644 index 0000000..306045b --- /dev/null +++ b/tests/benchmarks/qgraphicsview/benchapps/chipTest/view.cpp @@ -0,0 +1,257 @@ +/**************************************************************************** +** +** 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 "view.h" + +#include <QtGui> +#include "valgrind/callgrind.h" +#ifndef QT_NO_OPENGL +#include <QtOpenGL> +#endif + +#include <qmath.h> + +class CountView : public QGraphicsView +{ +protected: + void paintEvent(QPaintEvent *event) + { + static int n = 0; + if (n) + CALLGRIND_START_INSTRUMENTATION + QGraphicsView::paintEvent(event); + if (n) + CALLGRIND_STOP_INSTRUMENTATION + if (++n == 500) + qApp->quit(); + } +}; + +View::View(const QString &name, QWidget *parent) + : QFrame(parent) +{ + setFrameStyle(Sunken | StyledPanel); + graphicsView = new CountView; + graphicsView->setRenderHint(QPainter::Antialiasing, false); + graphicsView->setDragMode(QGraphicsView::RubberBandDrag); + graphicsView->setViewportUpdateMode(QGraphicsView::SmartViewportUpdate); + + int size = style()->pixelMetric(QStyle::PM_ToolBarIconSize); + QSize iconSize(size, size); + + QToolButton *zoomInIcon = new QToolButton; + zoomInIcon->setAutoRepeat(true); + zoomInIcon->setAutoRepeatInterval(33); + zoomInIcon->setAutoRepeatDelay(0); + zoomInIcon->setIcon(QPixmap(":/zoomin.png")); + zoomInIcon->setIconSize(iconSize); + QToolButton *zoomOutIcon = new QToolButton; + zoomOutIcon->setAutoRepeat(true); + zoomOutIcon->setAutoRepeatInterval(33); + zoomOutIcon->setAutoRepeatDelay(0); + zoomOutIcon->setIcon(QPixmap(":/zoomout.png")); + zoomOutIcon->setIconSize(iconSize); + zoomSlider = new QSlider; + zoomSlider->setMinimum(0); + zoomSlider->setMaximum(500); + zoomSlider->setValue(250); + zoomSlider->setTickPosition(QSlider::TicksRight); + + // Zoom slider layout + QVBoxLayout *zoomSliderLayout = new QVBoxLayout; + zoomSliderLayout->addWidget(zoomInIcon); + zoomSliderLayout->addWidget(zoomSlider); + zoomSliderLayout->addWidget(zoomOutIcon); + + QToolButton *rotateLeftIcon = new QToolButton; + rotateLeftIcon->setIcon(QPixmap(":/rotateleft.png")); + rotateLeftIcon->setIconSize(iconSize); + QToolButton *rotateRightIcon = new QToolButton; + rotateRightIcon->setIcon(QPixmap(":/rotateright.png")); + rotateRightIcon->setIconSize(iconSize); + rotateSlider = new QSlider; + rotateSlider->setOrientation(Qt::Horizontal); + rotateSlider->setMinimum(-360); + rotateSlider->setMaximum(360); + rotateSlider->setValue(0); + rotateSlider->setTickPosition(QSlider::TicksBelow); + + // Rotate slider layout + QHBoxLayout *rotateSliderLayout = new QHBoxLayout; + rotateSliderLayout->addWidget(rotateLeftIcon); + rotateSliderLayout->addWidget(rotateSlider); + rotateSliderLayout->addWidget(rotateRightIcon); + + resetButton = new QToolButton; + resetButton->setText(tr("0")); + resetButton->setEnabled(false); + + // Label layout + QHBoxLayout *labelLayout = new QHBoxLayout; + label = new QLabel(name); + antialiasButton = new QToolButton; + antialiasButton->setText(tr("Antialiasing")); + antialiasButton->setCheckable(true); + antialiasButton->setChecked(false); + openGlButton = new QToolButton; + openGlButton->setText(tr("OpenGL")); + openGlButton->setCheckable(true); +#ifndef QT_NO_OPENGL + openGlButton->setEnabled(QGLFormat::hasOpenGL()); +#else + openGlButton->setEnabled(false); +#endif + printButton = new QToolButton; + printButton->setIcon(QIcon(QPixmap(":/fileprint.png"))); + + labelLayout->addWidget(label); + labelLayout->addStretch(); + labelLayout->addWidget(antialiasButton); + labelLayout->addWidget(openGlButton); + labelLayout->addWidget(printButton); + + QGridLayout *topLayout = new QGridLayout; + topLayout->addLayout(labelLayout, 0, 0); + topLayout->addWidget(graphicsView, 1, 0); + topLayout->addLayout(zoomSliderLayout, 1, 1); + topLayout->addLayout(rotateSliderLayout, 2, 0); + topLayout->addWidget(resetButton, 2, 1); + setLayout(topLayout); + + connect(resetButton, SIGNAL(clicked()), this, SLOT(resetView())); + connect(zoomSlider, SIGNAL(valueChanged(int)), this, SLOT(setupMatrix())); + connect(rotateSlider, SIGNAL(valueChanged(int)), this, SLOT(setupMatrix())); + connect(graphicsView->verticalScrollBar(), SIGNAL(valueChanged(int)), this, SLOT(setResetButtonEnabled())); + connect(graphicsView->horizontalScrollBar(), SIGNAL(valueChanged(int)), this, SLOT(setResetButtonEnabled())); + connect(antialiasButton, SIGNAL(toggled(bool)), this, SLOT(toggleAntialiasing())); + connect(openGlButton, SIGNAL(toggled(bool)), this, SLOT(toggleOpenGL())); + connect(rotateLeftIcon, SIGNAL(clicked()), this, SLOT(rotateLeft())); + connect(rotateRightIcon, SIGNAL(clicked()), this, SLOT(rotateRight())); + connect(zoomInIcon, SIGNAL(clicked()), this, SLOT(zoomIn())); + connect(zoomOutIcon, SIGNAL(clicked()), this, SLOT(zoomOut())); + connect(printButton, SIGNAL(clicked()), this, SLOT(print())); + + setupMatrix(); + + startTimer(0); +} + +QGraphicsView *View::view() const +{ + return graphicsView; +} + +void View::resetView() +{ + zoomSlider->setValue(250); + rotateSlider->setValue(0); + setupMatrix(); + graphicsView->ensureVisible(QRectF(0, 0, 0, 0)); + + resetButton->setEnabled(false); +} + +void View::setResetButtonEnabled() +{ + resetButton->setEnabled(true); +} + +void View::setupMatrix() +{ + qreal scale = qPow(qreal(2), (zoomSlider->value() - 250) / qreal(50)); + + QMatrix matrix; + matrix.scale(scale, scale); + matrix.rotate(rotateSlider->value()); + + graphicsView->setMatrix(matrix); + setResetButtonEnabled(); +} + +void View::toggleOpenGL() +{ +#ifndef QT_NO_OPENGL + graphicsView->setViewport(openGlButton->isChecked() ? new QGLWidget(QGLFormat(QGL::SampleBuffers)) : new QWidget); +#endif +} + +void View::toggleAntialiasing() +{ + graphicsView->setRenderHint(QPainter::Antialiasing, antialiasButton->isChecked()); +} + +void View::print() +{ +#ifndef QT_NO_PRINTER + QPrinter printer; + QPrintDialog dialog(&printer, this); + if (dialog.exec() == QDialog::Accepted) { + QPainter painter(&printer); + graphicsView->render(&painter); + } +#endif +} + +void View::zoomIn() +{ + zoomSlider->setValue(zoomSlider->value() + 1); +} + +void View::zoomOut() +{ + zoomSlider->setValue(zoomSlider->value() - 1); +} + +void View::rotateLeft() +{ + rotateSlider->setValue(rotateSlider->value() - 10); +} + +void View::rotateRight() +{ + rotateSlider->setValue(rotateSlider->value() + 10); +} + +void View::timerEvent(QTimerEvent *) +{ + graphicsView->horizontalScrollBar()->setValue(graphicsView->horizontalScrollBar()->value() + 1); +} + diff --git a/tests/benchmarks/qgraphicsview/benchapps/chipTest/view.h b/tests/benchmarks/qgraphicsview/benchapps/chipTest/view.h new file mode 100644 index 0000000..af0e02b --- /dev/null +++ b/tests/benchmarks/qgraphicsview/benchapps/chipTest/view.h @@ -0,0 +1,86 @@ +/**************************************************************************** +** +** 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$ +** +****************************************************************************/ + +#ifndef VIEW_H +#define VIEW_H + +#include <QFrame> + +QT_FORWARD_DECLARE_CLASS(QGraphicsView) +QT_FORWARD_DECLARE_CLASS(QLabel) +QT_FORWARD_DECLARE_CLASS(QSlider) +QT_FORWARD_DECLARE_CLASS(QToolButton) + +class View : public QFrame +{ + Q_OBJECT +public: + View(const QString &name, QWidget *parent = 0); + + QGraphicsView *view() const; + +private slots: + void resetView(); + void setResetButtonEnabled(); + void setupMatrix(); + void toggleOpenGL(); + void toggleAntialiasing(); + void print(); + + void zoomIn(); + void zoomOut(); + void rotateLeft(); + void rotateRight(); + + void timerEvent(QTimerEvent *); + +private: + QGraphicsView *graphicsView; + QLabel *label; + QToolButton *openGlButton; + QToolButton *antialiasButton; + QToolButton *printButton; + QToolButton *resetButton; + QSlider *zoomSlider; + QSlider *rotateSlider; +}; + +#endif diff --git a/tests/benchmarks/qgraphicsview/benchapps/chipTest/zoomin.png b/tests/benchmarks/qgraphicsview/benchapps/chipTest/zoomin.png Binary files differnew file mode 100644 index 0000000..8b0daee --- /dev/null +++ b/tests/benchmarks/qgraphicsview/benchapps/chipTest/zoomin.png diff --git a/tests/benchmarks/qgraphicsview/benchapps/chipTest/zoomout.png b/tests/benchmarks/qgraphicsview/benchapps/chipTest/zoomout.png Binary files differnew file mode 100644 index 0000000..1575dd2 --- /dev/null +++ b/tests/benchmarks/qgraphicsview/benchapps/chipTest/zoomout.png diff --git a/tests/benchmarks/qgraphicsview/benchapps/moveItems/main.cpp b/tests/benchmarks/qgraphicsview/benchapps/moveItems/main.cpp new file mode 100644 index 0000000..dde8b6a --- /dev/null +++ b/tests/benchmarks/qgraphicsview/benchapps/moveItems/main.cpp @@ -0,0 +1,106 @@ +/**************************************************************************** +** +** 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 <QtGui> +#include "valgrind/callgrind.h" + +#ifdef Q_WS_X11 +extern void qt_x11_wait_for_window_manager(QWidget *); +#endif + +class View : public QGraphicsView +{ + Q_OBJECT +public: + View(QGraphicsScene *scene, QGraphicsItem *item) + : QGraphicsView(scene), _item(item) + { + } + +protected: + void paintEvent(QPaintEvent *event) + { + static int n = 0; + if (n) + CALLGRIND_START_INSTRUMENTATION + QGraphicsView::paintEvent(event); + _item->moveBy(1, 1); + if (n) + CALLGRIND_STOP_INSTRUMENTATION + if (++n == 200) + qApp->quit(); + } + +private: + QGraphicsItem *_item; +}; + +int main(int argc, char *argv[]) +{ + QApplication app(argc, argv); + + if (argc < 2) { + qDebug("usage: ./%s <numItems>", argv[0]); + return 1; + } + + QGraphicsScene scene(-150, -150, 300, 300); + scene.setItemIndexMethod(QGraphicsScene::NoIndex); + + QGraphicsRectItem *item = scene.addRect(-50, -50, 100, 100, QPen(Qt::NoPen), QBrush(Qt::blue)); + item->setFlag(QGraphicsItem::ItemIsMovable); + + for (int i = 0; i < atoi(argv[1]); ++i) { + QGraphicsRectItem *child = scene.addRect(-5, -5, 10, 10, QPen(Qt::NoPen), QBrush(Qt::blue)); + child->setPos(-50 + qrand() % 100, -50 + qrand() % 100); + child->setParentItem(item); + } + + View view(&scene, item); + view.resize(300, 300); + view.show(); +#ifdef Q_WS_X11 + qt_x11_wait_for_window_manager(&view); +#endif + + return app.exec(); +} + +#include "main.moc" diff --git a/tests/benchmarks/qgraphicsview/benchapps/moveItems/moveItems.pro b/tests/benchmarks/qgraphicsview/benchapps/moveItems/moveItems.pro new file mode 100644 index 0000000..28dcadc --- /dev/null +++ b/tests/benchmarks/qgraphicsview/benchapps/moveItems/moveItems.pro @@ -0,0 +1 @@ +SOURCES += main.cpp diff --git a/tests/benchmarks/qgraphicsview/benchapps/scrolltest/main.cpp b/tests/benchmarks/qgraphicsview/benchapps/scrolltest/main.cpp new file mode 100644 index 0000000..669d2cf --- /dev/null +++ b/tests/benchmarks/qgraphicsview/benchapps/scrolltest/main.cpp @@ -0,0 +1,146 @@ +/**************************************************************************** +** +** 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 <QtGui> +#include "valgrind/callgrind.h" + +class ItemMover : public QObject +{ + Q_OBJECT +public: + ItemMover(QGraphicsItem *item) + : _item(item) + { + startTimer(0); + } + +protected: + void timerEvent(QTimerEvent *event) + { + _item->moveBy(-1, 0); + } + +private: + QGraphicsItem *_item; +}; + +class ClipItem : public QGraphicsRectItem +{ +public: + ClipItem(qreal x, qreal y, qreal w, qreal h, const QPen &pen, const QBrush &brush) + : QGraphicsRectItem(x, y, w, h) + { + setPen(pen); + setBrush(brush); + } + + QPainterPath shape() const + { + QPainterPath path; + path.addRect(rect()); + return path; + } +}; + +class CountView : public QGraphicsView +{ +protected: + void paintEvent(QPaintEvent *event) + { + static int n = 0; + if (n) + CALLGRIND_START_INSTRUMENTATION + QGraphicsView::paintEvent(event); + if (n) + CALLGRIND_STOP_INSTRUMENTATION + if (++n == 500) + qApp->quit(); + } +}; + +int main(int argc, char *argv[]) +{ + QApplication app(argc, argv); + + QGraphicsScene scene; + scene.setItemIndexMethod(QGraphicsScene::NoIndex); + + ClipItem *clipItem = new ClipItem(0, 0, 100, 100, QPen(), QBrush(Qt::blue)); + clipItem->setFlag(QGraphicsItem::ItemClipsChildrenToShape); + clipItem->setData(0, "clipItem"); + scene.addItem(clipItem); + + QGraphicsRectItem *scrollItem = scene.addRect(0, 0, 10, 10, QPen(Qt::NoPen), QBrush(Qt::NoBrush)); + scrollItem->setParentItem(clipItem); + scrollItem->setFlag(QGraphicsItem::ItemIsMovable); + scrollItem->setData(0, "scrollItem"); + + for (int y = 0; y < 25; ++y) { + for (int x = 0; x < 25; ++x) { + ClipItem *rect = new ClipItem(0, 0, 90, 20, QPen(Qt::NoPen), QBrush(Qt::green)); + rect->setParentItem(scrollItem); + rect->setPos(x * 95, y * 25); + rect->setData(0, qPrintable(QString("rect %1 %2").arg(x).arg(y))); + rect->setFlag(QGraphicsItem::ItemClipsChildrenToShape); + + QGraphicsEllipseItem *ellipse = new QGraphicsEllipseItem(-5, -5, 10, 10); + ellipse->setPen(QPen(Qt::NoPen)); + ellipse->setBrush(QBrush(Qt::yellow)); + ellipse->setParentItem(rect); + ellipse->setData(0, qPrintable(QString("ellipse %1 %2").arg(x).arg(y))); + } + } + + scrollItem->setRect(scrollItem->childrenBoundingRect()); + +#if 0 + ItemMover mover(scrollItem); +#endif + + CountView view; + view.setScene(&scene); + view.setSceneRect(-25, -25, 150, 150); + view.resize(300, 300); + view.show(); + + return app.exec(); +} + +#include "main.moc" diff --git a/tests/benchmarks/qgraphicsview/benchapps/scrolltest/scrolltest.pro b/tests/benchmarks/qgraphicsview/benchapps/scrolltest/scrolltest.pro new file mode 100644 index 0000000..28dcadc --- /dev/null +++ b/tests/benchmarks/qgraphicsview/benchapps/scrolltest/scrolltest.pro @@ -0,0 +1 @@ +SOURCES += main.cpp diff --git a/tests/benchmarks/qgraphicsview/chiptester/chip.cpp b/tests/benchmarks/qgraphicsview/chiptester/chip.cpp new file mode 100644 index 0000000..e563059 --- /dev/null +++ b/tests/benchmarks/qgraphicsview/chiptester/chip.cpp @@ -0,0 +1,182 @@ +/**************************************************************************** +** +** 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 "chip.h" + +#include <QtGui> + +Chip::Chip(const QColor &color, int x, int y) +{ + this->x = x; + this->y = y; + this->color = color; + setZValue((x + y) % 2); + + setFlags(ItemIsSelectable | ItemIsMovable); + setAcceptsHoverEvents(true); +} + +QRectF Chip::boundingRect() const +{ + return QRectF(0, 0, 110, 70); +} + +QPainterPath Chip::shape() const +{ + QPainterPath path; + path.addRect(14, 14, 82, 42); + return path; +} + +void Chip::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) +{ + Q_UNUSED(widget); + + QColor fillColor = (option->state & QStyle::State_Selected) ? color.dark(150) : color; + if (option->state & QStyle::State_MouseOver) + fillColor = fillColor.light(125); + + if (option->levelOfDetail < 0.2) { + if (option->levelOfDetail < 0.125) { + painter->fillRect(QRectF(0, 0, 110, 70), fillColor); + return; + } + + QBrush b = painter->brush(); + painter->setBrush(fillColor); + painter->drawRect(13, 13, 97, 57); + painter->setBrush(b); + return; + } + + QPen oldPen = painter->pen(); + QPen pen = oldPen; + int width = 0; + if (option->state & QStyle::State_Selected) + width += 2; + + pen.setWidth(width); + QBrush b = painter->brush(); + painter->setBrush(QBrush(fillColor.dark(option->state & QStyle::State_Sunken ? 120 : 100))); + + painter->drawRect(QRect(14, 14, 79, 39)); + painter->setBrush(b); + + if (option->levelOfDetail >= 1) { + painter->setPen(QPen(Qt::gray, 1)); + painter->drawLine(15, 54, 94, 54); + painter->drawLine(94, 53, 94, 15); + painter->setPen(QPen(Qt::black, 0)); + } + + // Draw text + if (option->levelOfDetail >= 2) { + QFont font("Times", 10); + font.setStyleStrategy(QFont::ForceOutline); + painter->setFont(font); + painter->save(); + painter->scale(0.1, 0.1); + painter->drawText(170, 180, QString("Model: VSC-2000 (Very Small Chip) at %1x%2").arg(x).arg(y)); + painter->drawText(170, 200, QString("Serial number: DLWR-WEER-123L-ZZ33-SDSJ")); + painter->drawText(170, 220, QString("Manufacturer: Chip Manufacturer")); + painter->restore(); + } + + // Draw lines + QVarLengthArray<QLineF, 36> lines; + if (option->levelOfDetail >= 0.5) { + for (int i = 0; i <= 10; i += (option->levelOfDetail > 0.5 ? 1 : 2)) { + lines.append(QLineF(18 + 7 * i, 13, 18 + 7 * i, 5)); + lines.append(QLineF(18 + 7 * i, 54, 18 + 7 * i, 62)); + } + for (int i = 0; i <= 6; i += (option->levelOfDetail > 0.5 ? 1 : 2)) { + lines.append(QLineF(5, 18 + i * 5, 13, 18 + i * 5)); + lines.append(QLineF(94, 18 + i * 5, 102, 18 + i * 5)); + } + } + if (option->levelOfDetail >= 0.4) { + const QLineF lineData[] = { + QLineF(25, 35, 35, 35), + QLineF(35, 30, 35, 40), + QLineF(35, 30, 45, 35), + QLineF(35, 40, 45, 35), + QLineF(45, 30, 45, 40), + QLineF(45, 35, 55, 35) + }; + lines.append(lineData, 6); + } + painter->drawLines(lines.data(), lines.size()); + + // Draw red ink + if (stuff.size() > 1) { + QPen p = painter->pen(); + painter->setPen(QPen(Qt::red, 1, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin)); + painter->setBrush(Qt::NoBrush); + QPainterPath path; + path.moveTo(stuff.first()); + for (int i = 1; i < stuff.size(); ++i) + path.lineTo(stuff.at(i)); + painter->drawPath(path); + painter->setPen(p); + } +} + +void Chip::mousePressEvent(QGraphicsSceneMouseEvent *event) +{ + QGraphicsItem::mousePressEvent(event); + update(); +} + +void Chip::mouseMoveEvent(QGraphicsSceneMouseEvent *event) +{ + if (event->modifiers() & Qt::ShiftModifier) { + stuff << event->pos(); + update(); + return; + } + QGraphicsItem::mouseMoveEvent(event); +} + +void Chip::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) +{ + QGraphicsItem::mouseReleaseEvent(event); + update(); +} diff --git a/tests/benchmarks/qgraphicsview/chiptester/chip.h b/tests/benchmarks/qgraphicsview/chiptester/chip.h new file mode 100644 index 0000000..6fded63 --- /dev/null +++ b/tests/benchmarks/qgraphicsview/chiptester/chip.h @@ -0,0 +1,68 @@ +/**************************************************************************** +** +** 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$ +** +****************************************************************************/ + +#ifndef CHIP_H +#define CHIP_H + +#include <QtGui/QColor> +#include <QtGui/QGraphicsItem> + +class Chip : public QGraphicsItem +{ +public: + Chip(const QColor &color, int x, int y); + + QRectF boundingRect() const; + QPainterPath shape() const; + void paint(QPainter *painter, const QStyleOptionGraphicsItem *item, QWidget *widget); + +protected: + void mousePressEvent(QGraphicsSceneMouseEvent *event); + void mouseMoveEvent(QGraphicsSceneMouseEvent *event); + void mouseReleaseEvent(QGraphicsSceneMouseEvent *event); + +private: + int x, y; + QColor color; + QList<QPointF> stuff; +}; + +#endif diff --git a/tests/benchmarks/qgraphicsview/chiptester/chiptester.cpp b/tests/benchmarks/qgraphicsview/chiptester/chiptester.cpp new file mode 100644 index 0000000..0418fcd --- /dev/null +++ b/tests/benchmarks/qgraphicsview/chiptester/chiptester.cpp @@ -0,0 +1,144 @@ +/**************************************************************************** +** +** 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 "chiptester.h" +#include "chip.h" + +#include <QtGui> +#ifndef QT_NO_OPENGL +#include <QtOpenGL> +#endif + +ChipTester::ChipTester(QWidget *parent) + : QGraphicsView(parent), + npaints(0) +{ + resize(400, 300); + setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + setFrameStyle(0); + setTransformationAnchor(NoAnchor); + + populateScene(); + setScene(scene); + + setWindowTitle(tr("Chip Demo")); +} + +void ChipTester::setAntialias(bool enabled) +{ + setRenderHint(QPainter::Antialiasing, enabled); +} + +void ChipTester::setOpenGL(bool enabled) +{ +#ifndef QT_NO_OPENGL + setViewport(enabled ? new QGLWidget(QGLFormat(QGL::SampleBuffers)) : 0); +#endif +} + +void ChipTester::setOperation(Operation operation) +{ + this->operation = operation; +} + +void ChipTester::runBenchmark() +{ + npaints = 0; + timerId = startTimer(0); + stopWatch.start(); + eventLoop.exec(); + killTimer(timerId); +} + +void ChipTester::paintEvent(QPaintEvent *event) +{ + QGraphicsView::paintEvent(event); + if (++npaints == 50) + eventLoop.quit(); +} + +void ChipTester::timerEvent(QTimerEvent *) +{ + switch (operation) { + case Rotate360: + rotate(1); + break; + case ZoomInOut: { + qreal s = 0.05 + (npaints / 20.0); + setTransform(QTransform().scale(s, s)); + break; + } + case Translate: { + int offset = horizontalScrollBar()->minimum() + + (npaints % (horizontalScrollBar()->maximum() - horizontalScrollBar()->minimum())); + horizontalScrollBar()->setValue(offset); + break; + } + } +} + +void ChipTester::populateScene() +{ + scene = new QGraphicsScene; + + QImage image(":/qt4logo.png"); + + // Populate scene + int xx = 0; + int nitems = 0; + for (int i = -1100; i < 1100; i += 110) { + ++xx; + int yy = 0; + for (int j = -700; j < 700; j += 70) { + ++yy; + qreal x = (i + 1100) / 2200.0; + qreal y = (j + 700) / 1400.0; + + QColor color(image.pixel(int(image.width() * x), int(image.height() * y))); + QGraphicsItem *item = new Chip(color, xx, yy); + item->setPos(QPointF(i, j)); + scene->addItem(item); + + ++nitems; + } + } +} diff --git a/tests/benchmarks/qgraphicsview/chiptester/chiptester.h b/tests/benchmarks/qgraphicsview/chiptester/chiptester.h new file mode 100644 index 0000000..357d761 --- /dev/null +++ b/tests/benchmarks/qgraphicsview/chiptester/chiptester.h @@ -0,0 +1,85 @@ +/**************************************************************************** +** +** 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$ +** +****************************************************************************/ + +#ifndef CHIPTESTER_H +#define CHIPTESTER_H + +#include <QtGui> + +QT_FORWARD_DECLARE_CLASS(QGraphicsScene) +QT_FORWARD_DECLARE_CLASS(QGraphicsView) +QT_FORWARD_DECLARE_CLASS(QLabel) +QT_FORWARD_DECLARE_CLASS(QSlider) +QT_FORWARD_DECLARE_CLASS(QSplitter) + +class ChipTester : public QGraphicsView +{ + Q_OBJECT +public: + enum Operation { + Rotate360, + ZoomInOut, + Translate + }; + ChipTester(QWidget *parent = 0); + + void setAntialias(bool enabled); + void setOpenGL(bool enabled); + void runBenchmark(); + void setOperation(Operation operation); + +protected: + void paintEvent(QPaintEvent *event); + void timerEvent(QTimerEvent *event); + +private: + void populateScene(); + + QGraphicsView *view; + QGraphicsScene *scene; + int npaints; + int timerId; + QEventLoop eventLoop; + QTime stopWatch; + Operation operation; +}; + +#endif diff --git a/tests/benchmarks/qgraphicsview/chiptester/chiptester.pri b/tests/benchmarks/qgraphicsview/chiptester/chiptester.pri new file mode 100644 index 0000000..a9e0bf8 --- /dev/null +++ b/tests/benchmarks/qgraphicsview/chiptester/chiptester.pri @@ -0,0 +1,12 @@ +SOURCES += \ + chiptester/chiptester.cpp \ + chiptester/chip.cpp + +HEADERS += \ + chiptester/chiptester.h \ + chiptester/chip.h + +RESOURCES += \ + chiptester/images.qrc + +contains(QT_CONFIG, opengl) QT += opengl diff --git a/tests/benchmarks/qgraphicsview/chiptester/images.qrc b/tests/benchmarks/qgraphicsview/chiptester/images.qrc new file mode 100644 index 0000000..73e8620 --- /dev/null +++ b/tests/benchmarks/qgraphicsview/chiptester/images.qrc @@ -0,0 +1,5 @@ +<!DOCTYPE RCC><RCC version="1.0"> +<qresource> + <file>qt4logo.png</file> +</qresource> +</RCC> diff --git a/tests/benchmarks/qgraphicsview/chiptester/qt4logo.png b/tests/benchmarks/qgraphicsview/chiptester/qt4logo.png Binary files differnew file mode 100644 index 0000000..157e86e --- /dev/null +++ b/tests/benchmarks/qgraphicsview/chiptester/qt4logo.png diff --git a/tests/benchmarks/qgraphicsview/images/designer.png b/tests/benchmarks/qgraphicsview/images/designer.png Binary files differnew file mode 100644 index 0000000..0988fce --- /dev/null +++ b/tests/benchmarks/qgraphicsview/images/designer.png diff --git a/tests/benchmarks/qgraphicsview/qgraphicsview.pro b/tests/benchmarks/qgraphicsview/qgraphicsview.pro new file mode 100644 index 0000000..d9db8c9 --- /dev/null +++ b/tests/benchmarks/qgraphicsview/qgraphicsview.pro @@ -0,0 +1,8 @@ +load(qttest_p4) +TEMPLATE = app +TARGET = tst_qgraphicsview + +SOURCES += tst_qgraphicsview.cpp +RESOURCES += qgraphicsview.qrc + +include(chiptester/chiptester.pri) diff --git a/tests/benchmarks/qgraphicsview/qgraphicsview.qrc b/tests/benchmarks/qgraphicsview/qgraphicsview.qrc new file mode 100644 index 0000000..9f280dd --- /dev/null +++ b/tests/benchmarks/qgraphicsview/qgraphicsview.qrc @@ -0,0 +1,7 @@ +<!DOCTYPE RCC><RCC version="1.0"> +<qresource> + <file>images/designer.png</file> + <file>random.data</file> +</qresource> +</RCC> + diff --git a/tests/benchmarks/qgraphicsview/random.data b/tests/benchmarks/qgraphicsview/random.data Binary files differnew file mode 100644 index 0000000..190a36c --- /dev/null +++ b/tests/benchmarks/qgraphicsview/random.data diff --git a/tests/benchmarks/qgraphicsview/tst_qgraphicsview.cpp b/tests/benchmarks/qgraphicsview/tst_qgraphicsview.cpp new file mode 100644 index 0000000..d2213f4 --- /dev/null +++ b/tests/benchmarks/qgraphicsview/tst_qgraphicsview.cpp @@ -0,0 +1,692 @@ +/**************************************************************************** +** +** 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 <qtest.h> +#include <QDebug> +#include <QGraphicsItem> +#include <QGraphicsScene> +#include <QGraphicsView> +#include <QImage> +#ifdef Q_WS_X11 +QT_BEGIN_NAMESPACE +extern void qt_x11_wait_for_window_manager(QWidget *); +QT_END_NAMESPACE +#endif +#include "chiptester/chiptester.h" +//#define CALLGRIND_DEBUG +#ifdef CALLGRIND_DEBUG +#include "valgrind/callgrind.h" +#endif + +//TESTED_FILES= + +class QEventWaiter : public QEventLoop +{ +public: + QEventWaiter(QObject *receiver, QEvent::Type type) + : waiting(false), t(type) + { + receiver->installEventFilter(this); + } + + void wait() + { + waiting = true; + exec(); + } + + bool eventFilter(QObject *receiver, QEvent *event) + { + Q_UNUSED(receiver); + if (waiting && event->type() == t) { + waiting = false; + exit(); + } + return false; + } + +private: + bool waiting; + QEvent::Type t; +}; + +class tst_QGraphicsView : public QObject +{ + Q_OBJECT + +public: + tst_QGraphicsView(); + virtual ~tst_QGraphicsView(); + +public slots: + void init(); + void cleanup(); + +private slots: + void construct(); + void paintSingleItem(); + void paintDeepStackingItems(); + void paintDeepStackingItems_clipped(); + void moveSingleItem(); + void mapPointToScene_data(); + void mapPointToScene(); + void mapPointFromScene_data(); + void mapPointFromScene(); + void mapRectToScene_data(); + void mapRectToScene(); + void mapRectFromScene_data(); + void mapRectFromScene(); + void chipTester_data(); + void chipTester(); + void deepNesting_data(); + void deepNesting(); + void imageRiver_data(); + void imageRiver(); + void textRiver_data(); + void textRiver(); +}; + +tst_QGraphicsView::tst_QGraphicsView() +{ +} + +tst_QGraphicsView::~tst_QGraphicsView() +{ +} + +void tst_QGraphicsView::init() +{ +} + +void tst_QGraphicsView::cleanup() +{ +} + +void tst_QGraphicsView::construct() +{ + QBENCHMARK { + QGraphicsView view; + } +} + +void tst_QGraphicsView::paintSingleItem() +{ + QGraphicsScene scene(0, 0, 100, 100); + scene.addRect(0, 0, 10, 10); + + QGraphicsView view(&scene); + view.show(); + view.resize(100, 100); +#ifdef Q_WS_X11 + qt_x11_wait_for_window_manager(&view); +#endif + + QImage image(100, 100, QImage::Format_ARGB32_Premultiplied); + QPainter painter(&image); + QBENCHMARK { + view.viewport()->render(&painter); + } +} + +void tst_QGraphicsView::paintDeepStackingItems() +{ + QGraphicsScene scene(0, 0, 100, 100); + QGraphicsRectItem *item = scene.addRect(0, 0, 10, 10); + QGraphicsRectItem *lastRect = item; + for (int i = 0; i < 1000; ++i) { + QGraphicsRectItem *rect = scene.addRect(0, 0, 10, 10); + rect->setPos(1, 1); + rect->setParentItem(lastRect); + lastRect = rect; + } + + QGraphicsView view(&scene); + view.show(); + view.resize(100, 100); +#ifdef Q_WS_X11 + qt_x11_wait_for_window_manager(&view); +#endif + + QImage image(100, 100, QImage::Format_ARGB32_Premultiplied); + QPainter painter(&image); + QBENCHMARK { + view.viewport()->render(&painter); + } +} + +void tst_QGraphicsView::paintDeepStackingItems_clipped() +{ + QGraphicsScene scene(0, 0, 100, 100); + QGraphicsRectItem *item = scene.addRect(0, 0, 10, 10); + item->setFlag(QGraphicsItem::ItemClipsChildrenToShape); + QGraphicsRectItem *lastRect = item; + for (int i = 0; i < 1000; ++i) { + QGraphicsRectItem *rect = scene.addRect(0, 0, 10, 10); + rect->setPos(1, 1); + rect->setParentItem(lastRect); + lastRect = rect; + } + + QGraphicsView view(&scene); + view.show(); + view.resize(100, 100); +#ifdef Q_WS_X11 + qt_x11_wait_for_window_manager(&view); +#endif + + QImage image(100, 100, QImage::Format_ARGB32_Premultiplied); + QPainter painter(&image); + QBENCHMARK { + view.viewport()->render(&painter); + } +} + +void tst_QGraphicsView::moveSingleItem() +{ + QGraphicsScene scene(0, 0, 100, 100); + QGraphicsRectItem *item = scene.addRect(0, 0, 10, 10); + + QGraphicsView view(&scene); + view.show(); + view.resize(100, 100); +#ifdef Q_WS_X11 + qt_x11_wait_for_window_manager(&view); +#endif + + QEventWaiter waiter(view.viewport(), QEvent::Paint); + int n = 1; + QBENCHMARK { + item->setPos(25 * n, 25 * n); + waiter.wait(); + n = n ? 0 : 1; + } +} + +void tst_QGraphicsView::mapPointToScene_data() +{ + QTest::addColumn<QTransform>("transform"); + QTest::addColumn<QPoint>("point"); + + QTest::newRow("null") << QTransform() << QPoint(); + QTest::newRow("identity QPoint(100, 100)") << QTransform() << QPoint(100, 100); + QTest::newRow("rotate QPoint(100, 100)") << QTransform().rotate(90) << QPoint(100, 100); + QTest::newRow("scale QPoint(100, 100)") << QTransform().scale(5, 5) << QPoint(100, 100); + QTest::newRow("translate QPoint(100, 100)") << QTransform().translate(5, 5) << QPoint(100, 100); + QTest::newRow("shear QPoint(100, 100)") << QTransform().shear(1.5, 1.5) << QPoint(100, 100); + QTest::newRow("perspect QPoint(100, 100)") << QTransform().rotate(45, Qt::XAxis) << QPoint(100, 100); +} + +void tst_QGraphicsView::mapPointToScene() +{ + QFETCH(QTransform, transform); + QFETCH(QPoint, point); + + QGraphicsView view; + view.setTransform(transform); + QBENCHMARK { + view.mapToScene(point); + } +} + +void tst_QGraphicsView::mapPointFromScene_data() +{ + QTest::addColumn<QTransform>("transform"); + QTest::addColumn<QPointF>("point"); + + QTest::newRow("null") << QTransform() << QPointF(); + QTest::newRow("identity QPointF(100, 100)") << QTransform() << QPointF(100, 100); + QTest::newRow("rotate QPointF(100, 100)") << QTransform().rotate(90) << QPointF(100, 100); + QTest::newRow("scale QPointF(100, 100)") << QTransform().scale(5, 5) << QPointF(100, 100); + QTest::newRow("translate QPointF(100, 100)") << QTransform().translate(5, 5) << QPointF(100, 100); + QTest::newRow("shear QPointF(100, 100)") << QTransform().shear(1.5, 1.5) << QPointF(100, 100); + QTest::newRow("perspect QPointF(100, 100)") << QTransform().rotate(45, Qt::XAxis) << QPointF(100, 100); +} + +void tst_QGraphicsView::mapPointFromScene() +{ + QFETCH(QTransform, transform); + QFETCH(QPointF, point); + + QGraphicsView view; + view.setTransform(transform); + QBENCHMARK { + view.mapFromScene(point); + } +} + +void tst_QGraphicsView::mapRectToScene_data() +{ + QTest::addColumn<QTransform>("transform"); + QTest::addColumn<QRect>("rect"); + + QTest::newRow("null") << QTransform() << QRect(); + QTest::newRow("identity QRect(0, 0, 100, 100)") << QTransform() << QRect(0, 0, 100, 100); + QTest::newRow("rotate QRect(0, 0, 100, 100)") << QTransform().rotate(90) << QRect(0, 0, 100, 100); + QTest::newRow("scale QRect(0, 0, 100, 100)") << QTransform().scale(5, 5) << QRect(0, 0, 100, 100); + QTest::newRow("translate QRect(0, 0, 100, 100)") << QTransform().translate(5, 5) << QRect(0, 0, 100, 100); + QTest::newRow("shear QRect(0, 0, 100, 100)") << QTransform().shear(1.5, 1.5) << QRect(0, 0, 100, 100); + QTest::newRow("perspect QRect(0, 0, 100, 100)") << QTransform().rotate(45, Qt::XAxis) << QRect(0, 0, 100, 100); +} + +void tst_QGraphicsView::mapRectToScene() +{ + QFETCH(QTransform, transform); + QFETCH(QRect, rect); + + QGraphicsView view; + view.setTransform(transform); + QBENCHMARK { + view.mapToScene(rect); + } +} + +void tst_QGraphicsView::mapRectFromScene_data() +{ + QTest::addColumn<QTransform>("transform"); + QTest::addColumn<QRectF>("rect"); + + QTest::newRow("null") << QTransform() << QRectF(); + QTest::newRow("identity QRectF(0, 0, 100, 100)") << QTransform() << QRectF(0, 0, 100, 100); + QTest::newRow("rotate QRectF(0, 0, 100, 100)") << QTransform().rotate(90) << QRectF(0, 0, 100, 100); + QTest::newRow("scale QRectF(0, 0, 100, 100)") << QTransform().scale(5, 5) << QRectF(0, 0, 100, 100); + QTest::newRow("translate QRectF(0, 0, 100, 100)") << QTransform().translate(5, 5) << QRectF(0, 0, 100, 100); + QTest::newRow("shear QRectF(0, 0, 100, 100)") << QTransform().shear(1.5, 1.5) << QRectF(0, 0, 100, 100); + QTest::newRow("perspect QRectF(0, 0, 100, 100)") << QTransform().rotate(45, Qt::XAxis) << QRectF(0, 0, 100, 100); +} + +void tst_QGraphicsView::mapRectFromScene() +{ + QFETCH(QTransform, transform); + QFETCH(QRectF, rect); + + QGraphicsView view; + view.setTransform(transform); + QBENCHMARK { + view.mapFromScene(rect); + } +} + +void tst_QGraphicsView::chipTester_data() +{ + QTest::addColumn<bool>("antialias"); + QTest::addColumn<bool>("opengl"); + QTest::addColumn<int>("operation"); + QTest::newRow("rotate, normal") << false << false << 0; + QTest::newRow("rotate, normal, antialias") << true << false << 0; + QTest::newRow("rotate, opengl") << false << true << 0; + QTest::newRow("rotate, opengl, antialias") << true << true << 0; + QTest::newRow("zoom, normal") << false << false << 1; + QTest::newRow("zoom, normal, antialias") << true << false << 1; + QTest::newRow("zoom, opengl") << false << true << 1; + QTest::newRow("zoom, opengl, antialias") << true << true << 1; + QTest::newRow("translate, normal") << false << false << 2; + QTest::newRow("translate, normal, antialias") << true << false << 2; + QTest::newRow("translate, opengl") << false << true << 2; + QTest::newRow("translate, opengl, antialias") << true << true << 2; +} + +void tst_QGraphicsView::chipTester() +{ + QFETCH(bool, antialias); + QFETCH(bool, opengl); + QFETCH(int, operation); + + ChipTester tester; + tester.show(); +#ifdef Q_WS_X11 + qt_x11_wait_for_window_manager(&tester); +#endif + tester.setAntialias(antialias); + tester.setOpenGL(opengl); + tester.setOperation(ChipTester::Operation(operation)); + QBENCHMARK { + tester.runBenchmark(); + } +} + +static void addChildHelper(QGraphicsItem *parent, int n, bool rotate) +{ + if (!n) + return; + QGraphicsRectItem *item = new QGraphicsRectItem(QRectF(0, 0, 50, 50), parent); + item->setPos(10, 10); + if (rotate) + item->rotate(10); + addChildHelper(item, n - 1, rotate); +} + +void tst_QGraphicsView::deepNesting_data() +{ + QTest::addColumn<bool>("rotate"); + QTest::addColumn<bool>("sortCache"); + QTest::addColumn<bool>("bsp"); + + QTest::newRow("bsp, no transform") << false << false << true; + QTest::newRow("bsp, rotation") << true << false << true; + QTest::newRow("bsp, no transform, sort cache") << false << true << true; + QTest::newRow("bsp, rotation, sort cache") << true << true << true; + QTest::newRow("no transform") << false << false << false; + QTest::newRow("rotation") << true << false << false; + QTest::newRow("no transform, sort cache") << false << true << false; + QTest::newRow("rotation, sort cache") << true << true << false; +} + +void tst_QGraphicsView::deepNesting() +{ + QFETCH(bool, rotate); + QFETCH(bool, sortCache); + QFETCH(bool, bsp); + + QGraphicsScene scene; + for (int y = 0; y < 15; ++y) { + for (int x = 0; x < 15; ++x) { + QGraphicsItem *item1 = scene.addRect(QRectF(0, 0, 50, 50)); + if (rotate) item1->rotate(10); + item1->setPos(x * 25, y * 25); + addChildHelper(item1, 30, rotate); + } + } + scene.setItemIndexMethod(bsp ? QGraphicsScene::BspTreeIndex : QGraphicsScene::NoIndex); + scene.setSortCacheEnabled(sortCache); + + QGraphicsView view(&scene); + view.setRenderHint(QPainter::Antialiasing); + view.show(); +#ifdef Q_WS_X11 + qt_x11_wait_for_window_manager(&view); +#endif + QTest::qWait(250); + + QBENCHMARK { +#ifdef CALLGRIND_DEBUG + CALLGRIND_START_INSTRUMENTATION +#endif + view.viewport()->repaint(); +#ifdef CALLGRIND_DEBUG + CALLGRIND_STOP_INSTRUMENTATION +#endif + } +} + +class AnimatedPixmapItem : public QGraphicsPixmapItem +{ +public: + AnimatedPixmapItem(int x, int y, bool rot, bool scal, QGraphicsItem *parent = 0) + : QGraphicsPixmapItem(parent), rotateFactor(0), scaleFactor(0) + { + rotate = rot; + scale = scal; + xspeed = x; + yspeed = y; + } + +protected: + void advance(int i) + { + if (!i) + return; + int x = int(pos().x()) + pixmap().width(); + x += xspeed; + x = (x % (300 + pixmap().width() * 2)) - pixmap().width(); + int y = int(pos().y()) + pixmap().width(); + y += yspeed; + y = (y % (300 + pixmap().width() * 2)) - pixmap().width(); + setPos(x, y); + + int rot = rotateFactor; + int sca = scaleFactor; + if (rotate) + rotateFactor = 1 + (rot + xspeed) % 360; + if (scale) + scaleFactor = 1 + (sca + yspeed) % 50; + + if (rotate || scale) { + qreal s = 0.5 + scaleFactor / 50.0; + setTransform(QTransform().rotate(rotateFactor).scale(s, s)); + } + } + +private: + int xspeed; + int yspeed; + int rotateFactor; + int scaleFactor; + bool rotate; + bool scale; +}; + +class CountPaintEventView : public QGraphicsView +{ +public: + CountPaintEventView(QGraphicsScene *scene = 0) + : QGraphicsView(scene), count(0) + { } + + int count; + +protected: + void paintEvent(QPaintEvent *event) + { + ++count; + QGraphicsView::paintEvent(event); + }; +}; + +void tst_QGraphicsView::imageRiver_data() +{ + QTest::addColumn<int>("direction"); + QTest::addColumn<bool>("rotation"); + QTest::addColumn<bool>("scale"); + QTest::newRow("horizontal") << 0 << false << false; + QTest::newRow("vertical") << 1 << false << false; + QTest::newRow("both") << 2 << false << false; + QTest::newRow("horizontal rot") << 0 << true << false; + QTest::newRow("horizontal scale") << 0 << false << true; + QTest::newRow("horizontal rot + scale") << 0 << true << true; +} + +void tst_QGraphicsView::imageRiver() +{ + QFETCH(int, direction); + QFETCH(bool, rotation); + QFETCH(bool, scale); + + QGraphicsScene scene(0, 0, 300, 300); + + CountPaintEventView view(&scene); + view.resize(300, 300); + view.setFrameStyle(0); + view.setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + view.setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + view.show(); + + QPixmap pix(":/images/designer.png"); + QVERIFY(!pix.isNull()); + + QList<QGraphicsItem *> items; + QFile file(":/random.data"); + QVERIFY(file.open(QIODevice::ReadOnly)); + QDataStream str(&file); + for (int i = 0; i < 100; ++i) { + AnimatedPixmapItem *item; + if (direction == 0) item = new AnimatedPixmapItem((i % 4) + 1, 0, rotation, scale); + if (direction == 1) item = new AnimatedPixmapItem(0, (i % 4) + 1, rotation, scale); + if (direction == 2) item = new AnimatedPixmapItem((i % 4) + 1, (i % 4) + 1, rotation, scale); + item->setPixmap(pix); + int rnd1, rnd2; + str >> rnd1 >> rnd2; + item->setPos(-pix.width() + rnd1 % (view.width() + pix.width()), + -pix.height() + rnd2 % (view.height() + pix.height())); + scene.addItem(item); + } + + view.count = 0; + + QBENCHMARK { +#ifdef CALLGRIND_DEBUG + CALLGRIND_START_INSTRUMENTATION +#endif + for (int i = 0; i < 100; ++i) { + scene.advance(); + while (view.count < (i+1)) + qApp->processEvents(); + } +#ifdef CALLGRIND_DEBUG + CALLGRIND_STOP_INSTRUMENTATION +#endif + } +} + +class AnimatedTextItem : public QGraphicsSimpleTextItem +{ +public: + AnimatedTextItem(int x, int y, bool rot, bool scal, QGraphicsItem *parent = 0) + : QGraphicsSimpleTextItem(parent), rotateFactor(0), scaleFactor(25) + { + setText("River of text"); + rotate = rot; + scale = scal; + xspeed = x; + yspeed = y; + } + +protected: + void advance(int i) + { + if (!i) + return; + QRect r = boundingRect().toRect(); + int x = int(pos().x()) + r.width(); + x += xspeed; + x = (x % (300 + r.width() * 2)) - r.width(); + int y = int(pos().y()) + r.width(); + y += yspeed; + y = (y % (300 + r.width() * 2)) - r.width(); + setPos(x, y); + + int rot = rotateFactor; + int sca = scaleFactor; + if (rotate) + rotateFactor = 1 + (rot + xspeed) % 360; + if (scale) + scaleFactor = 1 + (sca + yspeed) % 50; + + if (rotate || scale) { + qreal s = 0.5 + scaleFactor / 50.0; + setTransform(QTransform().rotate(rotateFactor).scale(s, s)); + } + } + +private: + int xspeed; + int yspeed; + int rotateFactor; + int scaleFactor; + bool rotate; + bool scale; +}; + +void tst_QGraphicsView::textRiver_data() +{ + QTest::addColumn<int>("direction"); + QTest::addColumn<bool>("rotation"); + QTest::addColumn<bool>("scale"); + QTest::newRow("horizontal") << 0 << false << false; + QTest::newRow("vertical") << 1 << false << false; + QTest::newRow("both") << 2 << false << false; + QTest::newRow("horizontal rot") << 0 << true << false; + QTest::newRow("horizontal scale") << 0 << false << true; + QTest::newRow("horizontal rot + scale") << 0 << true << true; +} + +void tst_QGraphicsView::textRiver() +{ + QFETCH(int, direction); + QFETCH(bool, rotation); + QFETCH(bool, scale); + + QGraphicsScene scene(0, 0, 300, 300); + + CountPaintEventView view(&scene); + view.resize(300, 300); + view.setFrameStyle(0); + view.setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + view.setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + view.show(); + + QPixmap pix(":/images/designer.png"); + QVERIFY(!pix.isNull()); + + QList<QGraphicsItem *> items; + QFile file(":/random.data"); + QVERIFY(file.open(QIODevice::ReadOnly)); + QDataStream str(&file); + for (int i = 0; i < 100; ++i) { + AnimatedTextItem *item; + if (direction == 0) item = new AnimatedTextItem((i % 4) + 1, 0, rotation, scale); + if (direction == 1) item = new AnimatedTextItem(0, (i % 4) + 1, rotation, scale); + if (direction == 2) item = new AnimatedTextItem((i % 4) + 1, (i % 4) + 1, rotation, scale); + int rnd1, rnd2; + str >> rnd1 >> rnd2; + item->setPos(-pix.width() + rnd1 % (view.width() + pix.width()), + -pix.height() + rnd2 % (view.height() + pix.height())); + scene.addItem(item); + } + + view.count = 0; + + QBENCHMARK { +#ifdef CALLGRIND_DEBUG + CALLGRIND_START_INSTRUMENTATION +#endif + for (int i = 0; i < 100; ++i) { + scene.advance(); + while (view.count < (i+1)) + qApp->processEvents(); + } +#ifdef CALLGRIND_DEBUG + CALLGRIND_STOP_INSTRUMENTATION +#endif + } +} + +QTEST_MAIN(tst_QGraphicsView) +#include "tst_qgraphicsview.moc" |