diff options
author | Bea Lam <bea.lam@nokia.com> | 2010-02-23 05:46:14 (GMT) |
---|---|---|
committer | Bea Lam <bea.lam@nokia.com> | 2010-02-23 06:29:52 (GMT) |
commit | eefe993a4241b48f14991c44baa2c074b10bc194 (patch) | |
tree | a1a6ecdeb90c17707839c9c5e9cb8776ec4ff97f /tests | |
parent | f8eee22dcdd9b6b530c0e5c346e16552352ec03b (diff) | |
parent | e988763395625171bed001b5916d4da003d39aee (diff) | |
download | Qt-eefe993a4241b48f14991c44baa2c074b10bc194.zip Qt-eefe993a4241b48f14991c44baa2c074b10bc194.tar.gz Qt-eefe993a4241b48f14991c44baa2c074b10bc194.tar.bz2 |
Merge branch 'master' of scm.dev.nokia.troll.no:qt/qt-qml
Diffstat (limited to 'tests')
552 files changed, 33685 insertions, 2005 deletions
diff --git a/tests/auto/auto.pro b/tests/auto/auto.pro index 9c4b4f0..7ba6243 100644 --- a/tests/auto/auto.pro +++ b/tests/auto/auto.pro @@ -171,6 +171,7 @@ SUBDIRS += \ qgraphicsscene \ qgraphicssceneindex \ qgraphicstransform \ + qgraphicsvideoitem \ qgraphicsview \ qgraphicswidget \ qgridlayout \ @@ -299,6 +300,19 @@ SUBDIRS += \ qaudioformat \ qaudiooutput \ qaudioinput \ + qmediacontent \ + qmediaobject \ + qmediaplayer \ + qmediaplaylist \ + qmediaplaylistnavigator \ + qmediapluginloader \ + qmediaresource \ + qmediaservice \ + qmediaserviceprovider \ + qmediatimerange \ + qvideowidget \ + qmlaudio \ + qmlgraphicsvideo \ qspinbox \ qsplitter \ qsql \ @@ -322,6 +336,7 @@ SUBDIRS += \ qstandarditemmodel \ qstate \ qstatemachine \ + qstatictext \ qstatusbar \ qstl \ qstring \ @@ -445,24 +460,23 @@ SUBDIRS += \ qplugin \ qpluginloader \ qscrollbar \ - qsharedmemory \ qsidebar \ qsizegrip \ qsqldriver \ - qsystemsemaphore \ qtconcurrentfilter \ qtconcurrentiteratekernel \ qtconcurrentmap \ qtconcurrentrun \ qtconcurrentthreadengine \ qthreadpool \ + qtipc \ qtokenautomaton \ qtouchevent \ qwidget_window \ rcc \ windowsmobile -contains(QT_CONFIG,opengl):SUBDIRS += qgl qglbuffer +contains(QT_CONFIG,opengl):SUBDIRS += qgl qglbuffer qgl_threads contains(QT_CONFIG,qt3support):!wince*:SUBDIRS += $$Q3SUBDIRS @@ -519,15 +533,16 @@ SUBDIRS += checkxmlfiles \ xmlpatternsdiagnosticsts \ xmlpatternsschema \ xmlpatternsschemats \ + xmlpatternssdk \ xmlpatternsvalidator \ xmlpatternsview \ xmlpatternsxqts \ xmlpatternsxslts -xmlpatternsdiagnosticsts.depends = xmlpatternsxqts -xmlpatternsview.depends = xmlpatternsxqts -xmlpatternsxslts.depends = xmlpatternsxqts -xmlpatternsschemats.depends = xmlpatternsxqts +xmlpatternsdiagnosticsts.depends = xmlpatternssdk +xmlpatternsview.depends = xmlpatternssdk +xmlpatternsxslts.depends = xmlpatternssdk +xmlpatternsschemats.depends = xmlpatternssdk } unix:!embedded:contains(QT_CONFIG, dbus):SUBDIRS += \ diff --git a/tests/auto/compilerwarnings/compilerwarnings.qrc b/tests/auto/compilerwarnings/compilerwarnings.qrc index 40fa8f1..3fa313c 100644 --- a/tests/auto/compilerwarnings/compilerwarnings.qrc +++ b/tests/auto/compilerwarnings/compilerwarnings.qrc @@ -1,5 +1,5 @@ <!DOCTYPE RCC><RCC version="1.0"> <qresource> - <file>test.cpp</file> + <file>test_cpp.txt</file> </qresource> </RCC> diff --git a/tests/auto/compilerwarnings/test.cpp b/tests/auto/compilerwarnings/test_cpp.txt index 62b35eb..62b35eb 100644 --- a/tests/auto/compilerwarnings/test.cpp +++ b/tests/auto/compilerwarnings/test_cpp.txt diff --git a/tests/auto/compilerwarnings/tst_compilerwarnings.cpp b/tests/auto/compilerwarnings/tst_compilerwarnings.cpp index 27624e9..f910a18 100644 --- a/tests/auto/compilerwarnings/tst_compilerwarnings.cpp +++ b/tests/auto/compilerwarnings/tst_compilerwarnings.cpp @@ -148,7 +148,7 @@ void tst_CompilerWarnings::warnings() if (tmpSourceFile.isEmpty()) { tmpQSourceFile.open(QIODevice::ReadWrite | QIODevice::Truncate); tmpSourceFile = tmpQSourceFile.fileName(); - QFile cppSource(":/test.cpp"); + QFile cppSource(":/test_cpp.txt"); bool openResult = cppSource.open(QIODevice::ReadOnly); if (openResult) { @@ -158,7 +158,7 @@ void tst_CompilerWarnings::warnings() } } tmpQSourceFile.close(); - QVERIFY2(openResult, "Need resource temporary \"test.cpp\""); + QVERIFY2(openResult, "Need resource temporary \"test_cpp.txt\""); QStringList args; QString compilerName; diff --git a/tests/auto/declarative/declarative.pro b/tests/auto/declarative/declarative.pro index 9ef10b0..870c92b 100644 --- a/tests/auto/declarative/declarative.pro +++ b/tests/auto/declarative/declarative.pro @@ -29,6 +29,7 @@ SUBDIRS += \ qmlgraphicsitem \ # Cover qmlgraphicslistview \ # Cover qmlgraphicsloader \ # Cover + qmlgraphicsmousearea \ # Cover qmlgraphicsparticles \ # Cover qmlgraphicspathview \ # Cover qmlgraphicspositioners \ # Cover @@ -38,11 +39,11 @@ SUBDIRS += \ qmlinfo \ # Cover qmlinstruction \ # Cover qmllanguage \ # Cover - qmllist \ # Cover - qmllistaccessor \ # Cover + qmllistreference \ # Cover qmllistmodel \ # Cover qmlmetaproperty \ # Cover qmlmetatype \ # Cover + qmlmoduleplugin \ # Cover qmlnumberformatter \ # Cover qmlpixmapcache \ # Cover qmlpropertymap \ # Cover diff --git a/tests/auto/declarative/examples/tst_examples.cpp b/tests/auto/declarative/examples/tst_examples.cpp index fa4526a1..104c2d3 100644 --- a/tests/auto/declarative/examples/tst_examples.cpp +++ b/tests/auto/declarative/examples/tst_examples.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** diff --git a/tests/auto/declarative/graphicswidgets/tst_graphicswidgets.cpp b/tests/auto/declarative/graphicswidgets/tst_graphicswidgets.cpp index 1bb8c14..cb618c6 100644 --- a/tests/auto/declarative/graphicswidgets/tst_graphicswidgets.cpp +++ b/tests/auto/declarative/graphicswidgets/tst_graphicswidgets.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** diff --git a/tests/auto/declarative/layouts/tst_layouts.cpp b/tests/auto/declarative/layouts/tst_layouts.cpp index 0f832bf..ee05574 100644 --- a/tests/auto/declarative/layouts/tst_layouts.cpp +++ b/tests/auto/declarative/layouts/tst_layouts.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** @@ -69,10 +69,10 @@ void tst_QmlGraphicsLayouts::test_qml() canvas->execute(); qApp->processEvents(); - QmlGraphicsLayoutItem *left = static_cast<QmlGraphicsLayoutItem*>(canvas->root()->findChild<QmlGraphicsItem*>("left")); + QmlGraphicsLayoutItem *left = static_cast<QmlGraphicsLayoutItem*>(canvas->rootObject()->findChild<QmlGraphicsItem*>("left")); QVERIFY(left != 0); - QmlGraphicsLayoutItem *right = static_cast<QmlGraphicsLayoutItem*>(canvas->root()->findChild<QmlGraphicsItem*>("right")); + QmlGraphicsLayoutItem *right = static_cast<QmlGraphicsLayoutItem*>(canvas->rootObject()->findChild<QmlGraphicsItem*>("right")); QVERIFY(right != 0); qreal l = QApplication::style()->pixelMetric(QStyle::PM_LayoutLeftMargin); @@ -81,9 +81,13 @@ void tst_QmlGraphicsLayouts::test_qml() qreal b = QApplication::style()->pixelMetric(QStyle::PM_LayoutBottomMargin); QVERIFY2(l == r && r == t && t == b, "Test assumes equal margins."); qreal gvMargin = l; + + QmlGraphicsItem *rootItem = qobject_cast<QmlGraphicsItem*>(canvas->rootObject()); + QVERIFY(rootItem != 0); + //Preferred Size - canvas->root()->setWidth(300 + 2*gvMargin); - canvas->root()->setHeight(300 + 2*gvMargin); + rootItem->setWidth(300 + 2*gvMargin); + rootItem->setHeight(300 + 2*gvMargin); QCOMPARE(left->x(), gvMargin); QCOMPARE(left->y(), gvMargin); @@ -96,8 +100,8 @@ void tst_QmlGraphicsLayouts::test_qml() QCOMPARE(right->height(), 300.0); //Minimum Size - canvas->root()->setWidth(10+2*gvMargin); - canvas->root()->setHeight(10+2*gvMargin); + rootItem->setWidth(10+2*gvMargin); + rootItem->setHeight(10+2*gvMargin); QCOMPARE(left->x(), gvMargin); QCOMPARE(left->width(), 100.0); @@ -111,8 +115,8 @@ void tst_QmlGraphicsLayouts::test_qml() /*Note that if set to maximum size (or above) GraphicsLinearLayout behavior is to shrink them down to preferred size. So the exact maximum size can't be used*/ - canvas->root()->setWidth(670 + 2*gvMargin); - canvas->root()->setHeight(300 + 2*gvMargin); + rootItem->setWidth(670 + 2*gvMargin); + rootItem->setHeight(300 + 2*gvMargin); QCOMPARE(left->x(), gvMargin); QCOMPARE(left->width(), 270.0); @@ -133,11 +137,7 @@ void tst_QmlGraphicsLayouts::test_cpp() QmlView *tst_QmlGraphicsLayouts::createView(const QString &filename) { QmlView *canvas = new QmlView(0); - - QFile file(filename); - file.open(QFile::ReadOnly); - QString qml = file.readAll(); - canvas->setQml(qml, filename); + canvas->setSource(QUrl::fromLocalFile(filename)); return canvas; } diff --git a/tests/auto/declarative/parserstress/tst_parserstress.cpp b/tests/auto/declarative/parserstress/tst_parserstress.cpp index a607bb3..8af1b12 100644 --- a/tests/auto/declarative/parserstress/tst_parserstress.cpp +++ b/tests/auto/declarative/parserstress/tst_parserstress.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** diff --git a/tests/auto/declarative/qmetaobjectbuilder/tst_qmetaobjectbuilder.cpp b/tests/auto/declarative/qmetaobjectbuilder/tst_qmetaobjectbuilder.cpp index b82372a..c1dc924 100644 --- a/tests/auto/declarative/qmetaobjectbuilder/tst_qmetaobjectbuilder.cpp +++ b/tests/auto/declarative/qmetaobjectbuilder/tst_qmetaobjectbuilder.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** diff --git a/tests/auto/declarative/qmlanimations/data/badtype4.qml b/tests/auto/declarative/qmlanimations/data/badtype4.qml index a4cf265..e80762f 100644 --- a/tests/auto/declarative/qmlanimations/data/badtype4.qml +++ b/tests/auto/declarative/qmlanimations/data/badtype4.qml @@ -10,7 +10,7 @@ Rectangle { color: "red" width: 50; height: 50 x: 100; y: 100 - MouseRegion { + MouseArea { anchors.fill: parent onClicked: if (wrapper.state == "state1") wrapper.state = ""; else wrapper.state = "state1"; } @@ -21,7 +21,7 @@ Rectangle { } transitions: Transition { //comment out each in turn to make sure each only animates the relevant property - ColorAnimation { matchProperties: "x,color"; duration: 1000 } //x is real, color is color - NumberAnimation { matchProperties: "x,color"; duration: 1000 } //x is real, color is color + ColorAnimation { properties: "x,color"; duration: 1000 } //x is real, color is color + NumberAnimation { properties: "x,color"; duration: 1000 } //x is real, color is color } } diff --git a/tests/auto/declarative/qmlanimations/data/dontAutoStart.qml b/tests/auto/declarative/qmlanimations/data/dontAutoStart.qml new file mode 100644 index 0000000..d9660b6 --- /dev/null +++ b/tests/auto/declarative/qmlanimations/data/dontAutoStart.qml @@ -0,0 +1,18 @@ +import Qt 4.6 + +Rectangle { + id: wrapper + width: 600 + height: 400 + + Rectangle { + id: redRect + width: 100; height: 100 + color: Qt.rgba(1,0,0) + x: Behavior { + NumberAnimation { objectName: "MyAnim"; target: redRect; property: "y"; to: 300; repeat: true} + } + + } + +} diff --git a/tests/auto/declarative/qmlanimations/data/dontStart.qml b/tests/auto/declarative/qmlanimations/data/dontStart.qml new file mode 100644 index 0000000..36417db --- /dev/null +++ b/tests/auto/declarative/qmlanimations/data/dontStart.qml @@ -0,0 +1,19 @@ +import Qt 4.6 + +Rectangle { + id: wrapper + width: 600 + height: 400 + + Rectangle { + id: redRect + width: 100; height: 100 + color: Qt.rgba(1,0,0) + x: SequentialAnimation { + running: false + NumberAnimation { objectName: "MyAnim"; running: true } + } + + } + +} diff --git a/tests/auto/declarative/qmlanimations/data/dontStart2.qml b/tests/auto/declarative/qmlanimations/data/dontStart2.qml new file mode 100644 index 0000000..1a6540f --- /dev/null +++ b/tests/auto/declarative/qmlanimations/data/dontStart2.qml @@ -0,0 +1,19 @@ +import Qt 4.6 + +Rectangle { + id: wrapper + width: 600 + height: 400 + + Rectangle { + id: redRect + width: 100; height: 100 + color: Qt.rgba(1,0,0) + + transitions: Transition { + SequentialAnimation { + NumberAnimation { id: myAnim; objectName: "MyAnim"; running: true } + } + } + } +} diff --git a/tests/auto/declarative/qmlanimations/data/dotproperty.qml b/tests/auto/declarative/qmlanimations/data/dotproperty.qml index 369491f..9f0e699 100644 --- a/tests/auto/declarative/qmlanimations/data/dotproperty.qml +++ b/tests/auto/declarative/qmlanimations/data/dotproperty.qml @@ -9,7 +9,7 @@ Rectangle { color: "red" width: 50; height: 50 x: 100; y: 100 - MouseRegion { + MouseArea { anchors.fill: parent onClicked: if (wrapper.state == "state1") wrapper.state = ""; else wrapper.state = "state1"; } @@ -19,6 +19,6 @@ Rectangle { PropertyChanges { target: myRect; border.color: "blue" } } transitions: Transition { - ColorAnimation { matchProperties: "border.color"; duration: 1000 } + ColorAnimation { properties: "border.color"; duration: 1000 } } } diff --git a/tests/auto/declarative/qmlanimations/data/mixedtype1.qml b/tests/auto/declarative/qmlanimations/data/mixedtype1.qml index 87f4f16..6770366 100644 --- a/tests/auto/declarative/qmlanimations/data/mixedtype1.qml +++ b/tests/auto/declarative/qmlanimations/data/mixedtype1.qml @@ -10,7 +10,7 @@ Rectangle { color: "red" width: 50; height: 50 x: 100; y: 100 - MouseRegion { + MouseArea { anchors.fill: parent onClicked: if (wrapper.state == "state1") wrapper.state = ""; else wrapper.state = "state1"; } @@ -20,6 +20,6 @@ Rectangle { PropertyChanges { target: myRect; x: 200; border.width: 10 } } transitions: Transition { - PropertyAnimation { matchProperties: "x,border.width"; duration: 1000 } //x is real, border.width is int + PropertyAnimation { properties: "x,border.width"; duration: 1000 } //x is real, border.width is int } } diff --git a/tests/auto/declarative/qmlanimations/data/mixedtype2.qml b/tests/auto/declarative/qmlanimations/data/mixedtype2.qml index d555abd..80c9473 100644 --- a/tests/auto/declarative/qmlanimations/data/mixedtype2.qml +++ b/tests/auto/declarative/qmlanimations/data/mixedtype2.qml @@ -10,7 +10,7 @@ Rectangle { color: "red" width: 50; height: 50 x: 100; y: 100 - MouseRegion { + MouseArea { anchors.fill: parent onClicked: if (wrapper.state == "state1") wrapper.state = ""; else wrapper.state = "state1"; } @@ -20,6 +20,6 @@ Rectangle { PropertyChanges { target: myRect; x: 200; color: "blue" } } transitions: Transition { - PropertyAnimation { matchProperties: "x,color"; duration: 1000 } //x is real, color is color + PropertyAnimation { properties: "x,color"; duration: 1000 } //x is real, color is color } } diff --git a/tests/auto/declarative/qmlanimations/data/properties2.qml b/tests/auto/declarative/qmlanimations/data/properties2.qml index 86568ca..6c96155 100644 --- a/tests/auto/declarative/qmlanimations/data/properties2.qml +++ b/tests/auto/declarative/qmlanimations/data/properties2.qml @@ -9,6 +9,6 @@ Rectangle { color: "red" width: 50; height: 50 x: 100; y: 100 - x: NumberAnimation { matchTargets: theRect; matchProperties: "x"; to: 200; } + x: NumberAnimation { targets: theRect; properties: "x"; to: 200; } } } diff --git a/tests/auto/declarative/qmlanimations/data/properties5.qml b/tests/auto/declarative/qmlanimations/data/properties5.qml index 56e0be8..38396b1 100644 --- a/tests/auto/declarative/qmlanimations/data/properties5.qml +++ b/tests/auto/declarative/qmlanimations/data/properties5.qml @@ -9,6 +9,6 @@ Rectangle { color: "red" width: 50; height: 50 x: 100; y: 100 - x: NumberAnimation { matchTargets: theRect; matchProperties: "y"; to: 200; } + x: NumberAnimation { targets: theRect; properties: "y"; to: 200; } } } diff --git a/tests/auto/declarative/qmlanimations/data/propertiesTransition.qml b/tests/auto/declarative/qmlanimations/data/propertiesTransition.qml index 75603b9..b13b94b 100644 --- a/tests/auto/declarative/qmlanimations/data/propertiesTransition.qml +++ b/tests/auto/declarative/qmlanimations/data/propertiesTransition.qml @@ -19,10 +19,10 @@ Rectangle { } } transitions: Transition { - NumberAnimation { matchTargets: theRect; matchProperties: "x" } + NumberAnimation { targets: theRect; properties: "x" } } - MouseRegion { + MouseArea { anchors.fill: parent onClicked: parent.state = "moved" } diff --git a/tests/auto/declarative/qmlanimations/data/propertiesTransition2.qml b/tests/auto/declarative/qmlanimations/data/propertiesTransition2.qml index ae59157..033c5c1 100644 --- a/tests/auto/declarative/qmlanimations/data/propertiesTransition2.qml +++ b/tests/auto/declarative/qmlanimations/data/propertiesTransition2.qml @@ -22,7 +22,7 @@ Rectangle { NumberAnimation { target: theRect; property: "y"; to: 200 } } - MouseRegion { + MouseArea { anchors.fill: parent onClicked: parent.state = "moved" } diff --git a/tests/auto/declarative/qmlanimations/data/propertiesTransition3.qml b/tests/auto/declarative/qmlanimations/data/propertiesTransition3.qml index eedba7b..d0704c9 100644 --- a/tests/auto/declarative/qmlanimations/data/propertiesTransition3.qml +++ b/tests/auto/declarative/qmlanimations/data/propertiesTransition3.qml @@ -19,10 +19,10 @@ Rectangle { } } transitions: Transition { - NumberAnimation { matchTargets: theRect; matchProperties: "y" } + NumberAnimation { targets: theRect; properties: "y" } } - MouseRegion { + MouseArea { anchors.fill: parent onClicked: parent.state = "moved" } diff --git a/tests/auto/declarative/qmlanimations/data/propertiesTransition4.qml b/tests/auto/declarative/qmlanimations/data/propertiesTransition4.qml index 301f796..e70c95c 100644 --- a/tests/auto/declarative/qmlanimations/data/propertiesTransition4.qml +++ b/tests/auto/declarative/qmlanimations/data/propertiesTransition4.qml @@ -19,10 +19,10 @@ Rectangle { } } transitions: Transition { - NumberAnimation { target: theRect; matchProperties: "x" } + NumberAnimation { target: theRect; properties: "x" } } - MouseRegion { + MouseArea { anchors.fill: parent onClicked: parent.state = "moved" } diff --git a/tests/auto/declarative/qmlanimations/data/propertiesTransition5.qml b/tests/auto/declarative/qmlanimations/data/propertiesTransition5.qml index 565c519..b9e27da 100644 --- a/tests/auto/declarative/qmlanimations/data/propertiesTransition5.qml +++ b/tests/auto/declarative/qmlanimations/data/propertiesTransition5.qml @@ -19,10 +19,10 @@ Rectangle { } } transitions: Transition { - NumberAnimation { matchTargets: theRect; property: "x" } + NumberAnimation { targets: theRect; property: "x" } } - MouseRegion { + MouseArea { anchors.fill: parent onClicked: parent.state = "moved" } diff --git a/tests/auto/declarative/qmlanimations/data/propertiesTransition6.qml b/tests/auto/declarative/qmlanimations/data/propertiesTransition6.qml index b541dab..7417ed1 100644 --- a/tests/auto/declarative/qmlanimations/data/propertiesTransition6.qml +++ b/tests/auto/declarative/qmlanimations/data/propertiesTransition6.qml @@ -19,10 +19,10 @@ Rectangle { } } transitions: Transition { - NumberAnimation { matchTargets: theItem; matchProperties: "x" } + NumberAnimation { targets: theItem; properties: "x" } } - MouseRegion { + MouseArea { anchors.fill: parent onClicked: parent.state = "moved" } diff --git a/tests/auto/declarative/qmlanimations/tst_qmlanimations.cpp b/tests/auto/declarative/qmlanimations/tst_qmlanimations.cpp index b2653df..9eae308 100644 --- a/tests/auto/declarative/qmlanimations/tst_qmlanimations.cpp +++ b/tests/auto/declarative/qmlanimations/tst_qmlanimations.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** @@ -71,6 +71,7 @@ private slots: void invalidDuration(); void attached(); void propertyValueSourceDefaultStart(); + void dontStart(); }; #define QTIMED_COMPARE(lhs, rhs) do { \ @@ -219,7 +220,7 @@ void tst_qmlanimations::resume() QVERIFY(animation.from() == 10); animation.start(); - QTest::qWait(50); + QTest::qWait(100); animation.pause(); qreal x = rect.x(); QVERIFY(x != qreal(200)); @@ -229,7 +230,7 @@ void tst_qmlanimations::resume() animation.resume(); QVERIFY(animation.isRunning()); QVERIFY(!animation.isPaused()); - QTest::qWait(50); + QTest::qWait(100); animation.stop(); QVERIFY(rect.x() > x); } @@ -258,7 +259,7 @@ void tst_qmlanimations::badTypes() //don't crash { QmlView *view = new QmlView; - view->setUrl(QUrl::fromLocalFile(SRCDIR "/data/badtype1.qml")); + view->setSource(QUrl::fromLocalFile(SRCDIR "/data/badtype1.qml")); view->execute(); qApp->processEvents(); @@ -310,16 +311,14 @@ void tst_qmlanimations::badProperties() QmlEngine engine; QmlComponent c1(&engine, QUrl::fromLocalFile(SRCDIR "/data/badproperty1.qml")); - QByteArray message = "QML ColorAnimation (" + QUrl::fromLocalFile(SRCDIR "/data/badproperty1.qml").toString().toUtf8() + ":18:9) Cannot animate non-existant property \"border.colr\""; + QByteArray message = "QML ColorAnimation (" + QUrl::fromLocalFile(SRCDIR "/data/badproperty1.qml").toString().toUtf8() + ":18:9) Cannot animate non-existent property \"border.colr\""; QTest::ignoreMessage(QtWarningMsg, message); - QTest::ignoreMessage(QtWarningMsg, message); // why twice? QmlGraphicsRectangle *rect = qobject_cast<QmlGraphicsRectangle*>(c1.create()); QVERIFY(rect); QmlComponent c2(&engine, QUrl::fromLocalFile(SRCDIR "/data/badproperty2.qml")); message = "QML ColorAnimation (" + QUrl::fromLocalFile(SRCDIR "/data/badproperty2.qml").toString().toUtf8() + ":18:9) Cannot animate read-only property \"border\""; QTest::ignoreMessage(QtWarningMsg, message); - QTest::ignoreMessage(QtWarningMsg, message); // why twice? rect = qobject_cast<QmlGraphicsRectangle*>(c2.create()); QVERIFY(rect); @@ -332,7 +331,7 @@ void tst_qmlanimations::badProperties() //for example, int + real; color + real; etc void tst_qmlanimations::mixedTypes() { - //assumes border.width stats a real -- not real robust + //assumes border.width stays a real -- not real robust { QmlEngine engine; QmlComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/mixedtype1.qml")); @@ -427,9 +426,8 @@ void tst_qmlanimations::properties() QmlGraphicsRectangle *myRect = rect->findChild<QmlGraphicsRectangle*>("TheRect"); QVERIFY(myRect); QTest::qWait(waitDuration); - QEXPECT_FAIL("", "QTBUG-8072", Continue); QTIMED_COMPARE(myRect->x(),qreal(100)); - QTIMED_COMPARE(myRect->y(),qreal(100)); + QTIMED_COMPARE(myRect->y(),qreal(200)); } } @@ -472,9 +470,9 @@ void tst_qmlanimations::propertiesTransition() QmlGraphicsRectangle *myRect = rect->findChild<QmlGraphicsRectangle*>("TheRect"); QVERIFY(myRect); - QTest::ignoreMessage(QtWarningMsg, "QML NumberAnimation (" + QUrl::fromLocalFile(SRCDIR "/data/propertiesTransition4.qml").toString().toUtf8() + ":22:9) matchTargets/matchProperties/exclude and target/property are mutually exclusive."); rect->setState("moved"); QCOMPARE(myRect->x(),qreal(200)); + QCOMPARE(myRect->y(),qreal(100)); } { @@ -485,9 +483,10 @@ void tst_qmlanimations::propertiesTransition() QmlGraphicsRectangle *myRect = rect->findChild<QmlGraphicsRectangle*>("TheRect"); QVERIFY(myRect); - QTest::ignoreMessage(QtWarningMsg, "QML NumberAnimation (" + QUrl::fromLocalFile(SRCDIR "/data/propertiesTransition5.qml").toString().toUtf8() + ":22:9) matchTargets/matchProperties/exclude and target/property are mutually exclusive."); rect->setState("moved"); - QCOMPARE(myRect->x(),qreal(200)); + QCOMPARE(myRect->x(),qreal(100)); + QTest::qWait(waitDuration); + QTIMED_COMPARE(myRect->x(),qreal(200)); } { @@ -496,12 +495,27 @@ void tst_qmlanimations::propertiesTransition() QmlGraphicsRectangle *rect = qobject_cast<QmlGraphicsRectangle*>(c.create()); QVERIFY(rect); - //### should output warning at some point -- theItem doesn't exist QmlGraphicsRectangle *myRect = rect->findChild<QmlGraphicsRectangle*>("TheRect"); QVERIFY(myRect); rect->setState("moved"); - QCOMPARE(myRect->x(),qreal(200)); + QCOMPARE(myRect->x(),qreal(100)); + QTest::qWait(waitDuration); + QTIMED_COMPARE(myRect->x(),qreal(200)); } + + /*{ + QmlEngine engine; + QmlComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/propertiesTransition6.qml")); + QmlGraphicsRectangle *rect = qobject_cast<QmlGraphicsRectangle*>(c.create()); + QVERIFY(rect); + + QmlGraphicsRectangle *myRect = rect->findChild<QmlGraphicsRectangle*>("TheRect"); + QVERIFY(myRect); + rect->setState("moved"); + QCOMPARE(myRect->x(),qreal(100)); + QTest::qWait(waitDuration); + QTIMED_COMPARE(myRect->x(),qreal(100)); + }*/ } void tst_qmlanimations::easingStringConversion() @@ -548,8 +562,8 @@ void tst_qmlanimations::easingStringConversion() QCOMPARE(static_cast<QVariantAnimation*>(((QmlAbstractAnimation*)animation)->qtAnimation())->easingCurve().type(), QEasingCurve::InOutElastic); QVERIFY(static_cast<QVariantAnimation*>(((QmlAbstractAnimation*)animation)->qtAnimation())->easingCurve().amplitude() != qreal(5)); - QTest::ignoreMessage(QtWarningMsg, "QML NumberAnimation (unknown location) Unknown easing parameter \"nonexistantproperty\""); - animation->setEasing("easeOutQuad(nonexistantproperty: 12)"); + QTest::ignoreMessage(QtWarningMsg, "QML NumberAnimation (unknown location) Unknown easing parameter \"nonexistentproperty\""); + animation->setEasing("easeOutQuad(nonexistentproperty: 12)"); QCOMPARE(static_cast<QVariantAnimation*>(((QmlAbstractAnimation*)animation)->qtAnimation())->easingCurve().type(), QEasingCurve::OutQuad); delete animation; @@ -606,6 +620,51 @@ void tst_qmlanimations::propertyValueSourceDefaultStart() QVERIFY(myAnim); QVERIFY(myAnim->isRunning() == false); } + + { + QmlEngine engine; + + QmlComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/dontAutoStart.qml")); + + QmlGraphicsRectangle *rect = qobject_cast<QmlGraphicsRectangle*>(c.create()); + QVERIFY(rect); + + QmlAbstractAnimation *myAnim = rect->findChild<QmlAbstractAnimation*>("MyAnim"); + QVERIFY(myAnim && myAnim->qtAnimation()); + QVERIFY(myAnim->qtAnimation()->state() == QAbstractAnimation::Stopped); + } +} + + +void tst_qmlanimations::dontStart() +{ + { + QmlEngine engine; + + QmlComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/dontStart.qml")); + + QTest::ignoreMessage(QtWarningMsg, "QmlAbstractAnimation: setRunning() cannot be used on non-root animation nodes"); + QmlGraphicsRectangle *rect = qobject_cast<QmlGraphicsRectangle*>(c.create()); + QVERIFY(rect); + + QmlAbstractAnimation *myAnim = rect->findChild<QmlAbstractAnimation*>("MyAnim"); + QVERIFY(myAnim && myAnim->qtAnimation()); + QVERIFY(myAnim->qtAnimation()->state() == QAbstractAnimation::Stopped); + } + + { + QmlEngine engine; + + QmlComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/dontStart2.qml")); + + QTest::ignoreMessage(QtWarningMsg, "QmlAbstractAnimation: setRunning() cannot be used on non-root animation nodes"); + QmlGraphicsRectangle *rect = qobject_cast<QmlGraphicsRectangle*>(c.create()); + QVERIFY(rect); + + QmlAbstractAnimation *myAnim = rect->findChild<QmlAbstractAnimation*>("MyAnim"); + QVERIFY(myAnim && myAnim->qtAnimation()); + QVERIFY(myAnim->qtAnimation()->state() == QAbstractAnimation::Stopped); + } } QTEST_MAIN(tst_qmlanimations) diff --git a/tests/auto/declarative/qmlbehaviors/data/binding.qml b/tests/auto/declarative/qmlbehaviors/data/binding.qml index e0c3321..201da37 100644 --- a/tests/auto/declarative/qmlbehaviors/data/binding.qml +++ b/tests/auto/declarative/qmlbehaviors/data/binding.qml @@ -9,9 +9,9 @@ Rectangle { objectName: "MyRect" width: 100; height: 100; color: "green" x: basex - x: Behavior { NumberAnimation { duration: 200; } } + x: Behavior { NumberAnimation { duration: 500; } } } - MouseRegion { + MouseArea { id: clicker anchors.fill: parent } diff --git a/tests/auto/declarative/qmlbehaviors/data/color.qml b/tests/auto/declarative/qmlbehaviors/data/color.qml index 6598703..91dbbd1 100644 --- a/tests/auto/declarative/qmlbehaviors/data/color.qml +++ b/tests/auto/declarative/qmlbehaviors/data/color.qml @@ -7,9 +7,9 @@ Rectangle { objectName: "MyRect" width: 100; height: 100; color: "green" - color: Behavior { ColorAnimation { duration: 200; } } + color: Behavior { ColorAnimation { duration: 500; } } } - MouseRegion { + MouseArea { id: clicker anchors.fill: parent } diff --git a/tests/auto/declarative/qmlbehaviors/data/cpptrigger.qml b/tests/auto/declarative/qmlbehaviors/data/cpptrigger.qml index ba507c4..8d032f0 100644 --- a/tests/auto/declarative/qmlbehaviors/data/cpptrigger.qml +++ b/tests/auto/declarative/qmlbehaviors/data/cpptrigger.qml @@ -6,6 +6,6 @@ Rectangle { id: rect objectName: "MyRect" width: 100; height: 100; color: "green" - x: Behavior { NumberAnimation { duration: 200; } } + x: Behavior { NumberAnimation { duration: 500; } } } } diff --git a/tests/auto/declarative/qmlbehaviors/data/disabled.qml b/tests/auto/declarative/qmlbehaviors/data/disabled.qml index e7b8d51..3c7078a 100644 --- a/tests/auto/declarative/qmlbehaviors/data/disabled.qml +++ b/tests/auto/declarative/qmlbehaviors/data/disabled.qml @@ -12,7 +12,7 @@ Rectangle { NumberAnimation { duration: 200; } } } - MouseRegion { + MouseArea { id: clicker anchors.fill: parent } diff --git a/tests/auto/declarative/qmlbehaviors/data/dontStart.qml b/tests/auto/declarative/qmlbehaviors/data/dontStart.qml new file mode 100644 index 0000000..ba7cc9c --- /dev/null +++ b/tests/auto/declarative/qmlbehaviors/data/dontStart.qml @@ -0,0 +1,18 @@ +import Qt 4.6 + +Rectangle { + id: wrapper + width: 600 + height: 400 + + Rectangle { + id: redRect + width: 100; height: 100 + color: Qt.rgba(1,0,0) + x: Behavior { + NumberAnimation { objectName: "MyAnim"; running: true } + } + + } + +} diff --git a/tests/auto/declarative/qmlbehaviors/data/empty.qml b/tests/auto/declarative/qmlbehaviors/data/empty.qml index 412e26c..95d934a 100644 --- a/tests/auto/declarative/qmlbehaviors/data/empty.qml +++ b/tests/auto/declarative/qmlbehaviors/data/empty.qml @@ -8,7 +8,7 @@ Rectangle { width: 100; height: 100; color: "green" x: Behavior {} } - MouseRegion { + MouseArea { id: clicker anchors.fill: parent } diff --git a/tests/auto/declarative/qmlbehaviors/data/nonSelecting.qml b/tests/auto/declarative/qmlbehaviors/data/explicit.qml index ba36d93..1b2025a 100644 --- a/tests/auto/declarative/qmlbehaviors/data/nonSelecting.qml +++ b/tests/auto/declarative/qmlbehaviors/data/explicit.qml @@ -8,10 +8,10 @@ Rectangle { width: 100; height: 100; color: "green" x: Behavior { objectName: "MyBehavior"; - NumberAnimation { target: rect; property: "x"; duration: 200; } + NumberAnimation { target: rect; property: "x"; duration: 500; } } } - MouseRegion { + MouseArea { id: clicker anchors.fill: parent } diff --git a/tests/auto/declarative/qmlbehaviors/data/groupProperty.qml b/tests/auto/declarative/qmlbehaviors/data/groupProperty.qml index 4f127c1..14883d4 100644 --- a/tests/auto/declarative/qmlbehaviors/data/groupProperty.qml +++ b/tests/auto/declarative/qmlbehaviors/data/groupProperty.qml @@ -6,9 +6,9 @@ Rectangle { id: rect objectName: "MyRect" width: 100; height: 100; color: "green" - pos: Behavior { PropertyAnimation { duration: 200; } } + pos: Behavior { PropertyAnimation { duration: 500; } } } - MouseRegion { + MouseArea { id: clicker anchors.fill: parent } diff --git a/tests/auto/declarative/qmlbehaviors/data/groupProperty2.qml b/tests/auto/declarative/qmlbehaviors/data/groupProperty2.qml index 19d70b6..b43ddbc 100644 --- a/tests/auto/declarative/qmlbehaviors/data/groupProperty2.qml +++ b/tests/auto/declarative/qmlbehaviors/data/groupProperty2.qml @@ -6,9 +6,9 @@ Rectangle { id: rect objectName: "MyRect" width: 100; height: 100; color: "green" - pos.x: Behavior { NumberAnimation { duration: 200; } } + pos.x: Behavior { NumberAnimation { duration: 500; } } } - MouseRegion { + MouseArea { id: clicker anchors.fill: parent } diff --git a/tests/auto/declarative/qmlbehaviors/data/nonSelecting2.qml b/tests/auto/declarative/qmlbehaviors/data/nonSelecting2.qml index e9849eb..f267a05 100644 --- a/tests/auto/declarative/qmlbehaviors/data/nonSelecting2.qml +++ b/tests/auto/declarative/qmlbehaviors/data/nonSelecting2.qml @@ -8,10 +8,10 @@ Rectangle { width: 100; height: 100; color: "green" x: Behavior { objectName: "MyBehavior"; - NumberAnimation { matchTargets: rect; matchProperties: "y"; duration: 200; } + NumberAnimation { targets: rect; properties: "y"; duration: 200; } } } - MouseRegion { + MouseArea { id: clicker anchors.fill: parent } diff --git a/tests/auto/declarative/qmlbehaviors/data/parent.qml b/tests/auto/declarative/qmlbehaviors/data/parent.qml index 4f4911b..7c7fdcb 100644 --- a/tests/auto/declarative/qmlbehaviors/data/parent.qml +++ b/tests/auto/declarative/qmlbehaviors/data/parent.qml @@ -8,7 +8,7 @@ Rectangle { width: 100; height: 100; color: "green" parent: Behavior { SequentialAnimation { - PauseAnimation { duration: 200 } + PauseAnimation { duration: 500 } PropertyAction {} } } diff --git a/tests/auto/declarative/qmlbehaviors/data/reassignedAnimation.qml b/tests/auto/declarative/qmlbehaviors/data/reassignedAnimation.qml index 693a595..ba744b1 100644 --- a/tests/auto/declarative/qmlbehaviors/data/reassignedAnimation.qml +++ b/tests/auto/declarative/qmlbehaviors/data/reassignedAnimation.qml @@ -12,7 +12,7 @@ Rectangle { NumberAnimation { duration: 1000 } } } - MouseRegion { + MouseArea { id: clicker anchors.fill: parent } diff --git a/tests/auto/declarative/qmlbehaviors/data/scripttrigger.qml b/tests/auto/declarative/qmlbehaviors/data/scripttrigger.qml index 4383a0b..a91ca88 100644 --- a/tests/auto/declarative/qmlbehaviors/data/scripttrigger.qml +++ b/tests/auto/declarative/qmlbehaviors/data/scripttrigger.qml @@ -11,6 +11,6 @@ Rectangle { id: rect objectName: "MyRect" width: 100; height: 100; color: "green" - x: Behavior { NumberAnimation { duration: 200; } } + x: Behavior { NumberAnimation { duration: 500; } } } } diff --git a/tests/auto/declarative/qmlbehaviors/data/simple.qml b/tests/auto/declarative/qmlbehaviors/data/simple.qml index 37c3915..ac98ed0 100644 --- a/tests/auto/declarative/qmlbehaviors/data/simple.qml +++ b/tests/auto/declarative/qmlbehaviors/data/simple.qml @@ -8,10 +8,10 @@ Rectangle { width: 100; height: 100; color: "green" x: Behavior { objectName: "MyBehavior"; - NumberAnimation { duration: 200; } + NumberAnimation { duration: 500; } } } - MouseRegion { + MouseArea { id: clicker anchors.fill: parent } diff --git a/tests/auto/declarative/qmlbehaviors/tst_qmlbehaviors.cpp b/tests/auto/declarative/qmlbehaviors/tst_qmlbehaviors.cpp index 5663237..e31b600 100644 --- a/tests/auto/declarative/qmlbehaviors/tst_qmlbehaviors.cpp +++ b/tests/auto/declarative/qmlbehaviors/tst_qmlbehaviors.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** @@ -63,9 +63,11 @@ private slots: //void transitionOverrides(); void group(); void emptyBehavior(); + void explicitSelection(); void nonSelectingBehavior(); void reassignedAnimation(); void disabled(); + void dontStart(); }; void tst_qmlbehaviors::simpleBehavior() @@ -77,7 +79,7 @@ void tst_qmlbehaviors::simpleBehavior() QVERIFY(qobject_cast<QmlBehavior*>(rect->findChild<QmlBehavior*>("MyBehavior"))->animation()); rect->setState("moved"); - QTest::qWait(100); + QTest::qWait(200); qreal x = qobject_cast<QmlGraphicsRectangle*>(rect->findChild<QmlGraphicsRectangle*>("MyRect"))->x(); QVERIFY(x > 0 && x < 200); //i.e. the behavior has been triggered } @@ -90,7 +92,7 @@ void tst_qmlbehaviors::scriptTriggered() QVERIFY(rect); rect->setColor(QColor("red")); - QTest::qWait(100); + QTest::qWait(200); qreal x = qobject_cast<QmlGraphicsRectangle*>(rect->findChild<QmlGraphicsRectangle*>("MyRect"))->x(); QVERIFY(x > 0 && x < 200); //i.e. the behavior has been triggered } @@ -106,7 +108,7 @@ void tst_qmlbehaviors::cppTriggered() QVERIFY(innerRect); innerRect->setProperty("x", 200); - QTest::qWait(100); + QTest::qWait(200); qreal x = innerRect->x(); QVERIFY(x > 0 && x < 200); //i.e. the behavior has been triggered } @@ -130,7 +132,7 @@ void tst_qmlbehaviors::colorBehavior() QVERIFY(rect); rect->setState("red"); - QTest::qWait(100); + QTest::qWait(200); QColor color = qobject_cast<QmlGraphicsRectangle*>(rect->findChild<QmlGraphicsRectangle*>("MyRect"))->color(); QVERIFY(color != QColor("red") && color != QColor("green")); //i.e. the behavior has been triggered } @@ -143,11 +145,11 @@ void tst_qmlbehaviors::parentBehavior() QVERIFY(rect); rect->setState("reparented"); - QTest::qWait(100); + QTest::qWait(200); QmlGraphicsItem *newParent = rect->findChild<QmlGraphicsItem*>("NewParent"); QmlGraphicsItem *parent = rect->findChild<QmlGraphicsRectangle*>("MyRect")->parentItem(); QVERIFY(parent != newParent); - QTest::qWait(300); + QTest::qWait(600); parent = rect->findChild<QmlGraphicsRectangle*>("MyRect")->parentItem(); QVERIFY(parent == newParent); } @@ -160,29 +162,29 @@ void tst_qmlbehaviors::replaceBinding() QVERIFY(rect); rect->setState("moved"); - QTest::qWait(100); + QTest::qWait(200); QmlGraphicsRectangle *innerRect = qobject_cast<QmlGraphicsRectangle*>(rect->findChild<QmlGraphicsRectangle*>("MyRect")); QVERIFY(innerRect); qreal x = innerRect->x(); QVERIFY(x > 0 && x < 200); //i.e. the behavior has been triggered - QTest::qWait(300); + QTest::qWait(600); QCOMPARE(innerRect->x(), (qreal)200); rect->setProperty("basex", 10); QCOMPARE(innerRect->x(), (qreal)200); rect->setProperty("movedx", 210); - QTest::qWait(300); + QTest::qWait(600); QCOMPARE(innerRect->x(), (qreal)210); rect->setState(""); - QTest::qWait(100); + QTest::qWait(200); x = innerRect->x(); QVERIFY(x > 10 && x < 210); //i.e. the behavior has been triggered - QTest::qWait(300); + QTest::qWait(600); QCOMPARE(innerRect->x(), (qreal)10); rect->setProperty("movedx", 200); QCOMPARE(innerRect->x(), (qreal)10); rect->setProperty("basex", 20); - QTest::qWait(300); + QTest::qWait(600); QCOMPARE(innerRect->x(), (qreal)20); } @@ -195,7 +197,7 @@ void tst_qmlbehaviors::group() QVERIFY(rect); rect->setState("moved"); - QTest::qWait(100); + QTest::qWait(200); qreal x = qobject_cast<QmlGraphicsRectangle*>(rect->findChild<QmlGraphicsRectangle*>("MyRect"))->x(); QVERIFY(x > 0 && x < 200); //i.e. the behavior has been triggered } @@ -207,7 +209,7 @@ void tst_qmlbehaviors::group() QVERIFY(rect); rect->setState("moved"); - QTest::qWait(100); + QTest::qWait(200); qreal x = qobject_cast<QmlGraphicsRectangle*>(rect->findChild<QmlGraphicsRectangle*>("MyRect"))->x(); QVERIFY(x > 0 && x < 200); //i.e. the behavior has been triggered } @@ -225,19 +227,23 @@ void tst_qmlbehaviors::emptyBehavior() QCOMPARE(x, qreal(200)); //should change immediately } -void tst_qmlbehaviors::nonSelectingBehavior() +void tst_qmlbehaviors::explicitSelection() { { QmlEngine engine; - QmlComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/nonSelecting.qml")); + QmlComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/explicit.qml")); QmlGraphicsRectangle *rect = qobject_cast<QmlGraphicsRectangle*>(c.create()); QVERIFY(rect); rect->setState("moved"); + QTest::qWait(200); qreal x = qobject_cast<QmlGraphicsRectangle*>(rect->findChild<QmlGraphicsRectangle*>("MyRect"))->x(); - QCOMPARE(x, qreal(200)); //should change immediately + QVERIFY(x > 0 && x < 200); //i.e. the behavior has been triggered } +} +void tst_qmlbehaviors::nonSelectingBehavior() +{ { QmlEngine engine; QmlComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/nonSelecting2.qml")); @@ -254,7 +260,7 @@ void tst_qmlbehaviors::reassignedAnimation() { QmlEngine engine; QmlComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/reassignedAnimation.qml")); - QTest::ignoreMessage(QtWarningMsg, QString("QML Behavior (" + QUrl::fromLocalFile(SRCDIR "/data/reassignedAnimation.qml").toString() + ":9:12) Can't change the animation assigned to a Behavior.").toUtf8().constData()); + QTest::ignoreMessage(QtWarningMsg, QString("QML Behavior (" + QUrl::fromLocalFile(SRCDIR "/data/reassignedAnimation.qml").toString() + ":9:12) Cannot change the animation assigned to a Behavior.").toUtf8().constData()); QmlGraphicsRectangle *rect = qobject_cast<QmlGraphicsRectangle*>(c.create()); QVERIFY(rect); QCOMPARE(qobject_cast<QmlNumberAnimation*>( @@ -273,7 +279,21 @@ void tst_qmlbehaviors::disabled() rect->setState("moved"); qreal x = qobject_cast<QmlGraphicsRectangle*>(rect->findChild<QmlGraphicsRectangle*>("MyRect"))->x(); QCOMPARE(x, qreal(200)); //should change immediately +} + +void tst_qmlbehaviors::dontStart() +{ + QmlEngine engine; + + QmlComponent c(&engine, QUrl::fromLocalFile(SRCDIR "/data/dontStart.qml")); + + QTest::ignoreMessage(QtWarningMsg, "QmlAbstractAnimation: setRunning() cannot be used on non-root animation nodes"); + QmlGraphicsRectangle *rect = qobject_cast<QmlGraphicsRectangle*>(c.create()); + QVERIFY(rect); + QmlAbstractAnimation *myAnim = rect->findChild<QmlAbstractAnimation*>("MyAnim"); + QVERIFY(myAnim && myAnim->qtAnimation()); + QVERIFY(myAnim->qtAnimation()->state() == QAbstractAnimation::Stopped); } QTEST_MAIN(tst_qmlbehaviors) diff --git a/tests/auto/declarative/qmlbinding/tst_qmlbinding.cpp b/tests/auto/declarative/qmlbinding/tst_qmlbinding.cpp index 19f4d77..92d1b69 100644 --- a/tests/auto/declarative/qmlbinding/tst_qmlbinding.cpp +++ b/tests/auto/declarative/qmlbinding/tst_qmlbinding.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** diff --git a/tests/auto/declarative/qmlconnection/tst_qmlconnection.cpp b/tests/auto/declarative/qmlconnection/tst_qmlconnection.cpp index b3c04f1..2aba7b5 100644 --- a/tests/auto/declarative/qmlconnection/tst_qmlconnection.cpp +++ b/tests/auto/declarative/qmlconnection/tst_qmlconnection.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** diff --git a/tests/auto/declarative/qmlcontext/tst_qmlcontext.cpp b/tests/auto/declarative/qmlcontext/tst_qmlcontext.cpp index f82f202..7ff7af2 100644 --- a/tests/auto/declarative/qmlcontext/tst_qmlcontext.cpp +++ b/tests/auto/declarative/qmlcontext/tst_qmlcontext.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** diff --git a/tests/auto/declarative/qmldatetimeformatter/tst_qmldatetimeformatter.cpp b/tests/auto/declarative/qmldatetimeformatter/tst_qmldatetimeformatter.cpp index b21a4f0..4b5dc1d 100644 --- a/tests/auto/declarative/qmldatetimeformatter/tst_qmldatetimeformatter.cpp +++ b/tests/auto/declarative/qmldatetimeformatter/tst_qmldatetimeformatter.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** diff --git a/tests/auto/declarative/qmldebug/tst_qmldebug.cpp b/tests/auto/declarative/qmldebug/tst_qmldebug.cpp index a51fd29..ba07331 100644 --- a/tests/auto/declarative/qmldebug/tst_qmldebug.cpp +++ b/tests/auto/declarative/qmldebug/tst_qmldebug.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** @@ -825,7 +825,7 @@ int main(int argc, char *argv[]) "width: 10; height: 20; scale: blueRect.scale;" "Rectangle { id: blueRect; width: 500; height: 600; color: \"blue\"; }" "Text { color: blueRect.color; }" - "MouseRegion {" + "MouseArea {" "onEntered: { console.log('hello') }" "}" "}"; diff --git a/tests/auto/declarative/qmldebugclient/tst_qmldebugclient.cpp b/tests/auto/declarative/qmldebugclient/tst_qmldebugclient.cpp index 4ee0837..3c87d71 100644 --- a/tests/auto/declarative/qmldebugclient/tst_qmldebugclient.cpp +++ b/tests/auto/declarative/qmldebugclient/tst_qmldebugclient.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** diff --git a/tests/auto/declarative/qmldebugservice/tst_qmldebugservice.cpp b/tests/auto/declarative/qmldebugservice/tst_qmldebugservice.cpp index 9abc5a5..e9e31ca 100644 --- a/tests/auto/declarative/qmldebugservice/tst_qmldebugservice.cpp +++ b/tests/auto/declarative/qmldebugservice/tst_qmldebugservice.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** diff --git a/tests/auto/declarative/qmldom/tst_qmldom.cpp b/tests/auto/declarative/qmldom/tst_qmldom.cpp index ce35130..16cdef0 100644 --- a/tests/auto/declarative/qmldom/tst_qmldom.cpp +++ b/tests/auto/declarative/qmldom/tst_qmldom.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** @@ -41,7 +41,7 @@ #include <qtest.h> #include <QtDeclarative/qmlengine.h> #include <QtDeclarative/qmlcomponent.h> -#include <QtDeclarative/qmldom.h> +#include <QtDeclarative/private/qmldom_p.h> #include <QtCore/QDebug> #include <QtCore/QFile> @@ -394,7 +394,7 @@ void tst_qmldom::loadErrors() QCOMPARE(error.url(), QUrl()); QCOMPARE(error.line(), 3); QCOMPARE(error.column(), 3); - QCOMPARE(error.description(), QString("Cannot assign to non-existant property \"foo\"")); + QCOMPARE(error.description(), QString("Cannot assign to non-existent property \"foo\"")); } // Test loading a file with syntax errors diff --git a/tests/auto/declarative/qmleasefollow/tst_qmleasefollow.cpp b/tests/auto/declarative/qmleasefollow/tst_qmleasefollow.cpp index 384ce25b..f28311f 100644 --- a/tests/auto/declarative/qmleasefollow/tst_qmleasefollow.cpp +++ b/tests/auto/declarative/qmleasefollow/tst_qmleasefollow.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** diff --git a/tests/auto/declarative/qmlecmascript/data/listProperties.qml b/tests/auto/declarative/qmlecmascript/data/listProperties.qml index cae1721..810f9b6 100644 --- a/tests/auto/declarative/qmlecmascript/data/listProperties.qml +++ b/tests/auto/declarative/qmlecmascript/data/listProperties.qml @@ -9,12 +9,6 @@ MyQmlObject { QtObject { property int a: 11 } ] - objectQmlListProperty: [ - QtObject { property int a: 10 }, - QtObject { property int a: 1 }, - QtObject { property int a: 39 } - ] - Script { function calcTest1() { var rv = 0; @@ -24,21 +18,10 @@ MyQmlObject { return rv; } - function calcTest2() { - var rv = 0; - for (var ii = 0; ii < root.objectQmlListProperty.length; ++ii) { - rv += root.objectQmlListProperty[ii].a; - } - return rv; - } } property int test1: calcTest1(); property int test2: root.objectListProperty.length - property int test3: calcTest2(); - property int test4: root.objectQmlListProperty.length - property bool test5: root.objectQmlListProperty[1] != undefined - property bool test6: root.objectQmlListProperty[100] == undefined - property bool test7: root.objectListProperty[1] != undefined - property bool test8: root.objectListProperty[100] == undefined + property bool test3: root.objectListProperty[1] != undefined + property bool test4: root.objectListProperty[100] == undefined } diff --git a/tests/auto/declarative/qmlecmascript/testtypes.cpp b/tests/auto/declarative/qmlecmascript/testtypes.cpp index df0cb18..3c6b256 100644 --- a/tests/auto/declarative/qmlecmascript/testtypes.cpp +++ b/tests/auto/declarative/qmlecmascript/testtypes.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** diff --git a/tests/auto/declarative/qmlecmascript/testtypes.h b/tests/auto/declarative/qmlecmascript/testtypes.h index b307d9c..0af72cb 100644 --- a/tests/auto/declarative/qmlecmascript/testtypes.h +++ b/tests/auto/declarative/qmlecmascript/testtypes.h @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** @@ -77,7 +77,6 @@ class MyQmlObject : public QObject Q_PROPERTY(int value READ value WRITE setValue) Q_PROPERTY(QString stringProperty READ stringProperty WRITE setStringProperty NOTIFY stringChanged) Q_PROPERTY(QObject *objectProperty READ objectProperty WRITE setObjectProperty NOTIFY objectChanged) - Q_PROPERTY(QmlList<QObject *> *objectQmlListProperty READ objectQmlListProperty CONSTANT) Q_PROPERTY(QmlListProperty<QObject> objectListProperty READ objectListProperty CONSTANT) Q_PROPERTY(int resettableProperty READ resettableProperty WRITE setResettableProperty RESET resetProperty) @@ -107,7 +106,6 @@ public: emit objectChanged(); } - QmlList<QObject *> *objectQmlListProperty() { return &m_objectQmlList; } QmlListProperty<QObject> objectListProperty() { return QmlListProperty<QObject>(this, m_objectQList); } bool methodCalled() const { return m_methodCalled; } @@ -150,7 +148,6 @@ private: QObject *m_object; QString m_string; - QmlConcreteList<QObject *> m_objectQmlList; QList<QObject *> m_objectQList; int m_value; int m_resetProperty; diff --git a/tests/auto/declarative/qmlecmascript/tst_qmlecmascript.cpp b/tests/auto/declarative/qmlecmascript/tst_qmlecmascript.cpp index f8a4f5a..b30ad1c 100644 --- a/tests/auto/declarative/qmlecmascript/tst_qmlecmascript.cpp +++ b/tests/auto/declarative/qmlecmascript/tst_qmlecmascript.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** @@ -365,7 +365,6 @@ void tst_qmlecmascript::basicExpressions() QCOMPARE(expr.value(), result); } -Q_DECLARE_METATYPE(QList<QObject *>); void tst_qmlecmascript::arrayExpressions() { QObject obj1; @@ -572,7 +571,7 @@ void tst_qmlecmascript::enums() QCOMPARE(object->property("i").toInt(), 19); QCOMPARE(object->property("j").toInt(), 19); } - // Non-existant enums + // Non-existent enums { QmlComponent component(&engine, TEST_FILE("enums.2.qml")); @@ -680,7 +679,7 @@ void tst_qmlecmascript::outerBindingOverridesInnerBinding() } /* -Access a non-existant attached object. +Access a non-existent attached object. Tests for a regression where this used to crash. */ @@ -927,7 +926,7 @@ void tst_qmlecmascript::scriptErrors() QString warning5 = url + ":10: TypeError: Result of expression 'a' [undefined] is not an object."; QString warning6 = url + ":9: Unable to assign [undefined] to int"; QString warning7 = url + ":14: Error: Cannot assign to read-only property \"trueProperty\""; - QString warning8 = url + ":15: Error: Cannot assign to non-existant property \"fakeProperty\""; + QString warning8 = url + ":15: Error: Cannot assign to non-existent property \"fakeProperty\""; QTest::ignoreMessage(QtWarningMsg, warning1.toLatin1().constData()); QTest::ignoreMessage(QtWarningMsg, warning2.toLatin1().constData()); @@ -985,12 +984,8 @@ void tst_qmlecmascript::listProperties() QCOMPARE(object->property("test1").toInt(), 21); QCOMPARE(object->property("test2").toInt(), 2); - QCOMPARE(object->property("test3").toInt(), 50); - QCOMPARE(object->property("test4").toInt(), 3); - QCOMPARE(object->property("test5").toBool(), true); - QCOMPARE(object->property("test6").toBool(), true); - QCOMPARE(object->property("test7").toBool(), true); - QCOMPARE(object->property("test8").toBool(), true); + QCOMPARE(object->property("test3").toBool(), true); + QCOMPARE(object->property("test4").toBool(), true); } void tst_qmlecmascript::exceptionClearsOnReeval() @@ -1206,15 +1201,15 @@ void tst_qmlecmascript::callQtInvokables() QScriptEngine *engine = &ep->scriptEngine; ep->globalClass->explicitSetProperty("object", ep->objectClass->newQObject(&o)); - // Non-existant methods + // Non-existent methods o.reset(); - QCOMPARE(engine->evaluate("object.method_nonexistant()").isError(), true); + QCOMPARE(engine->evaluate("object.method_nonexistent()").isError(), true); QCOMPARE(o.error(), false); QCOMPARE(o.invoked(), -1); QCOMPARE(o.actuals().count(), 0); o.reset(); - QCOMPARE(engine->evaluate("object.method_nonexistant(10, 11)").isError(), true); + QCOMPARE(engine->evaluate("object.method_nonexistent(10, 11)").isError(), true); QCOMPARE(o.error(), false); QCOMPARE(o.invoked(), -1); QCOMPARE(o.actuals().count(), 0); @@ -1612,7 +1607,9 @@ void tst_qmlecmascript::listToVariant() QObject *object = component.create(&context); QVERIFY(object != 0); - QVERIFY(qvariant_cast<QmlListProperty<MyQmlObject> >(object->property("test")) == container.children()); + QVariant v = object->property("test"); + QCOMPARE(v.userType(), qMetaTypeId<QmlListReference>()); + QVERIFY(qvariant_cast<QmlListReference>(v).object() == &container); delete object; } diff --git a/tests/auto/declarative/qmlengine/tst_qmlengine.cpp b/tests/auto/declarative/qmlengine/tst_qmlengine.cpp index af8e44f..6504d03 100644 --- a/tests/auto/declarative/qmlengine/tst_qmlengine.cpp +++ b/tests/auto/declarative/qmlengine/tst_qmlengine.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** diff --git a/tests/auto/declarative/qmlerror/tst_qmlerror.cpp b/tests/auto/declarative/qmlerror/tst_qmlerror.cpp index 70fef1d..12dde57 100644 --- a/tests/auto/declarative/qmlerror/tst_qmlerror.cpp +++ b/tests/auto/declarative/qmlerror/tst_qmlerror.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** diff --git a/tests/auto/declarative/qmlfontloader/tst_qmlfontloader.cpp b/tests/auto/declarative/qmlfontloader/tst_qmlfontloader.cpp index 19372a0..41b5359 100644 --- a/tests/auto/declarative/qmlfontloader/tst_qmlfontloader.cpp +++ b/tests/auto/declarative/qmlfontloader/tst_qmlfontloader.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** diff --git a/tests/auto/declarative/qmlgraphicsanchors/tst_qmlgraphicsanchors.cpp b/tests/auto/declarative/qmlgraphicsanchors/tst_qmlgraphicsanchors.cpp index 1187038..aa6b56a 100644 --- a/tests/auto/declarative/qmlgraphicsanchors/tst_qmlgraphicsanchors.cpp +++ b/tests/auto/declarative/qmlgraphicsanchors/tst_qmlgraphicsanchors.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** @@ -58,7 +58,7 @@ public: tst_qmlgraphicsanchors() {} template<typename T> - T *findItem(QmlGraphicsItem *parent, const QString &id); + T *findItem(QGraphicsObject *parent, const QString &id); private slots: void basicAnchors(); @@ -80,7 +80,7 @@ private slots: Find an item with the specified id. */ template<typename T> -T *tst_qmlgraphicsanchors::findItem(QmlGraphicsItem *parent, const QString &objectName) +T *tst_qmlgraphicsanchors::findItem(QGraphicsObject *parent, const QString &objectName) { const QMetaObject &mo = T::staticMetaObject; QList<QGraphicsItem *> children = parent->childItems(); @@ -102,66 +102,66 @@ T *tst_qmlgraphicsanchors::findItem(QmlGraphicsItem *parent, const QString &obje void tst_qmlgraphicsanchors::basicAnchors() { QmlView *view = new QmlView; - view->setUrl(QUrl::fromLocalFile(SRCDIR "/data/anchors.qml")); + view->setSource(QUrl::fromLocalFile(SRCDIR "/data/anchors.qml")); view->execute(); qApp->processEvents(); //sibling horizontal - QCOMPARE(findItem<QmlGraphicsRectangle>(view->root(), QLatin1String("rect1"))->x(), 26.0); - QCOMPARE(findItem<QmlGraphicsRectangle>(view->root(), QLatin1String("rect2"))->x(), 122.0); - QCOMPARE(findItem<QmlGraphicsRectangle>(view->root(), QLatin1String("rect3"))->x(), 74.0); - QCOMPARE(findItem<QmlGraphicsRectangle>(view->root(), QLatin1String("rect4"))->x(), 16.0); - QCOMPARE(findItem<QmlGraphicsRectangle>(view->root(), QLatin1String("rect5"))->x(), 112.0); - QCOMPARE(findItem<QmlGraphicsRectangle>(view->root(), QLatin1String("rect6"))->x(), 64.0); + QCOMPARE(findItem<QmlGraphicsRectangle>(view->rootObject(), QLatin1String("rect1"))->x(), 26.0); + QCOMPARE(findItem<QmlGraphicsRectangle>(view->rootObject(), QLatin1String("rect2"))->x(), 122.0); + QCOMPARE(findItem<QmlGraphicsRectangle>(view->rootObject(), QLatin1String("rect3"))->x(), 74.0); + QCOMPARE(findItem<QmlGraphicsRectangle>(view->rootObject(), QLatin1String("rect4"))->x(), 16.0); + QCOMPARE(findItem<QmlGraphicsRectangle>(view->rootObject(), QLatin1String("rect5"))->x(), 112.0); + QCOMPARE(findItem<QmlGraphicsRectangle>(view->rootObject(), QLatin1String("rect6"))->x(), 64.0); //parent horizontal - QCOMPARE(findItem<QmlGraphicsRectangle>(view->root(), QLatin1String("rect7"))->x(), 0.0); - QCOMPARE(findItem<QmlGraphicsRectangle>(view->root(), QLatin1String("rect8"))->x(), 240.0); - QCOMPARE(findItem<QmlGraphicsRectangle>(view->root(), QLatin1String("rect9"))->x(), 120.0); - QCOMPARE(findItem<QmlGraphicsRectangle>(view->root(), QLatin1String("rect10"))->x(), -10.0); - QCOMPARE(findItem<QmlGraphicsRectangle>(view->root(), QLatin1String("rect11"))->x(), 230.0); - QCOMPARE(findItem<QmlGraphicsRectangle>(view->root(), QLatin1String("rect12"))->x(), 110.0); + QCOMPARE(findItem<QmlGraphicsRectangle>(view->rootObject(), QLatin1String("rect7"))->x(), 0.0); + QCOMPARE(findItem<QmlGraphicsRectangle>(view->rootObject(), QLatin1String("rect8"))->x(), 240.0); + QCOMPARE(findItem<QmlGraphicsRectangle>(view->rootObject(), QLatin1String("rect9"))->x(), 120.0); + QCOMPARE(findItem<QmlGraphicsRectangle>(view->rootObject(), QLatin1String("rect10"))->x(), -10.0); + QCOMPARE(findItem<QmlGraphicsRectangle>(view->rootObject(), QLatin1String("rect11"))->x(), 230.0); + QCOMPARE(findItem<QmlGraphicsRectangle>(view->rootObject(), QLatin1String("rect12"))->x(), 110.0); //vertical - QCOMPARE(findItem<QmlGraphicsRectangle>(view->root(), QLatin1String("rect13"))->y(), 20.0); - QCOMPARE(findItem<QmlGraphicsRectangle>(view->root(), QLatin1String("rect14"))->y(), 155.0); + QCOMPARE(findItem<QmlGraphicsRectangle>(view->rootObject(), QLatin1String("rect13"))->y(), 20.0); + QCOMPARE(findItem<QmlGraphicsRectangle>(view->rootObject(), QLatin1String("rect14"))->y(), 155.0); //stretch - QCOMPARE(findItem<QmlGraphicsRectangle>(view->root(), QLatin1String("rect15"))->x(), 26.0); - QCOMPARE(findItem<QmlGraphicsRectangle>(view->root(), QLatin1String("rect15"))->width(), 96.0); - QCOMPARE(findItem<QmlGraphicsRectangle>(view->root(), QLatin1String("rect16"))->x(), 26.0); - QCOMPARE(findItem<QmlGraphicsRectangle>(view->root(), QLatin1String("rect16"))->width(), 192.0); - QCOMPARE(findItem<QmlGraphicsRectangle>(view->root(), QLatin1String("rect17"))->x(), -70.0); - QCOMPARE(findItem<QmlGraphicsRectangle>(view->root(), QLatin1String("rect17"))->width(), 192.0); + QCOMPARE(findItem<QmlGraphicsRectangle>(view->rootObject(), QLatin1String("rect15"))->x(), 26.0); + QCOMPARE(findItem<QmlGraphicsRectangle>(view->rootObject(), QLatin1String("rect15"))->width(), 96.0); + QCOMPARE(findItem<QmlGraphicsRectangle>(view->rootObject(), QLatin1String("rect16"))->x(), 26.0); + QCOMPARE(findItem<QmlGraphicsRectangle>(view->rootObject(), QLatin1String("rect16"))->width(), 192.0); + QCOMPARE(findItem<QmlGraphicsRectangle>(view->rootObject(), QLatin1String("rect17"))->x(), -70.0); + QCOMPARE(findItem<QmlGraphicsRectangle>(view->rootObject(), QLatin1String("rect17"))->width(), 192.0); //vertical stretch - QCOMPARE(findItem<QmlGraphicsRectangle>(view->root(), QLatin1String("rect18"))->y(), 20.0); - QCOMPARE(findItem<QmlGraphicsRectangle>(view->root(), QLatin1String("rect18"))->height(), 40.0); + QCOMPARE(findItem<QmlGraphicsRectangle>(view->rootObject(), QLatin1String("rect18"))->y(), 20.0); + QCOMPARE(findItem<QmlGraphicsRectangle>(view->rootObject(), QLatin1String("rect18"))->height(), 40.0); //more parent horizontal - QCOMPARE(findItem<QmlGraphicsRectangle>(view->root(), QLatin1String("rect19"))->x(), 115.0); - QCOMPARE(findItem<QmlGraphicsRectangle>(view->root(), QLatin1String("rect20"))->x(), 235.0); - QCOMPARE(findItem<QmlGraphicsRectangle>(view->root(), QLatin1String("rect21"))->x(), -5.0); + QCOMPARE(findItem<QmlGraphicsRectangle>(view->rootObject(), QLatin1String("rect19"))->x(), 115.0); + QCOMPARE(findItem<QmlGraphicsRectangle>(view->rootObject(), QLatin1String("rect20"))->x(), 235.0); + QCOMPARE(findItem<QmlGraphicsRectangle>(view->rootObject(), QLatin1String("rect21"))->x(), -5.0); //centerIn - QCOMPARE(findItem<QmlGraphicsRectangle>(view->root(), QLatin1String("rect22"))->x(), 69.0); - QCOMPARE(findItem<QmlGraphicsRectangle>(view->root(), QLatin1String("rect22"))->y(), 5.0); + QCOMPARE(findItem<QmlGraphicsRectangle>(view->rootObject(), QLatin1String("rect22"))->x(), 69.0); + QCOMPARE(findItem<QmlGraphicsRectangle>(view->rootObject(), QLatin1String("rect22"))->y(), 5.0); //margins - QCOMPARE(findItem<QmlGraphicsRectangle>(view->root(), QLatin1String("rect23"))->x(), 31.0); - QCOMPARE(findItem<QmlGraphicsRectangle>(view->root(), QLatin1String("rect23"))->y(), 5.0); - QCOMPARE(findItem<QmlGraphicsRectangle>(view->root(), QLatin1String("rect23"))->width(), 86.0); - QCOMPARE(findItem<QmlGraphicsRectangle>(view->root(), QLatin1String("rect23"))->height(), 10.0); + QCOMPARE(findItem<QmlGraphicsRectangle>(view->rootObject(), QLatin1String("rect23"))->x(), 31.0); + QCOMPARE(findItem<QmlGraphicsRectangle>(view->rootObject(), QLatin1String("rect23"))->y(), 5.0); + QCOMPARE(findItem<QmlGraphicsRectangle>(view->rootObject(), QLatin1String("rect23"))->width(), 86.0); + QCOMPARE(findItem<QmlGraphicsRectangle>(view->rootObject(), QLatin1String("rect23"))->height(), 10.0); // offsets - QCOMPARE(findItem<QmlGraphicsRectangle>(view->root(), QLatin1String("rect24"))->x(), 26.0); - QCOMPARE(findItem<QmlGraphicsRectangle>(view->root(), QLatin1String("rect25"))->y(), 60.0); - QCOMPARE(findItem<QmlGraphicsRectangle>(view->root(), QLatin1String("rect26"))->y(), 5.0); + QCOMPARE(findItem<QmlGraphicsRectangle>(view->rootObject(), QLatin1String("rect24"))->x(), 26.0); + QCOMPARE(findItem<QmlGraphicsRectangle>(view->rootObject(), QLatin1String("rect25"))->y(), 60.0); + QCOMPARE(findItem<QmlGraphicsRectangle>(view->rootObject(), QLatin1String("rect26"))->y(), 5.0); //baseline - QmlGraphicsText *text1 = findItem<QmlGraphicsText>(view->root(), QLatin1String("text1")); - QmlGraphicsText *text2 = findItem<QmlGraphicsText>(view->root(), QLatin1String("text2")); + QmlGraphicsText *text1 = findItem<QmlGraphicsText>(view->rootObject(), QLatin1String("text1")); + QmlGraphicsText *text2 = findItem<QmlGraphicsText>(view->rootObject(), QLatin1String("text2")); QCOMPARE(text1->y(), text2->y()); delete view; @@ -173,9 +173,9 @@ void tst_qmlgraphicsanchors::loops() { QmlView *view = new QmlView; - view->setUrl(QUrl::fromLocalFile(SRCDIR "/data/loop1.qml")); + view->setSource(QUrl::fromLocalFile(SRCDIR "/data/loop1.qml")); - QString expect = "QML Text (" + view->url().toString() + ":6:5" + ") Possible anchor loop detected on horizontal anchor."; + QString expect = "QML Text (" + view->source().toString() + ":6:5" + ") Possible anchor loop detected on horizontal anchor."; QTest::ignoreMessage(QtWarningMsg, expect.toLatin1()); QTest::ignoreMessage(QtWarningMsg, expect.toLatin1()); QTest::ignoreMessage(QtWarningMsg, expect.toLatin1()); @@ -188,9 +188,9 @@ void tst_qmlgraphicsanchors::loops() { QmlView *view = new QmlView; - view->setUrl(QUrl::fromLocalFile(SRCDIR "/data/loop2.qml")); + view->setSource(QUrl::fromLocalFile(SRCDIR "/data/loop2.qml")); - QString expect = "QML Image (" + view->url().toString() + ":8:3" + ") Possible anchor loop detected on horizontal anchor."; + QString expect = "QML Image (" + view->source().toString() + ":8:3" + ") Possible anchor loop detected on horizontal anchor."; QTest::ignoreMessage(QtWarningMsg, expect.toLatin1()); view->execute(); qApp->processEvents(); @@ -223,55 +223,55 @@ void tst_qmlgraphicsanchors::illegalSets_data() QTest::newRow("H - too many anchors") << "Rectangle { id: rect; Rectangle { anchors.left: rect.left; anchors.right: rect.right; anchors.horizontalCenter: rect.horizontalCenter } }" - << "QML Rectangle (file::2:23) Can't specify left, right, and hcenter anchors."; + << "QML Rectangle (file::2:23) Cannot specify left, right, and hcenter anchors."; foreach (const QString &side, QStringList() << "left" << "right") { QTest::newRow("H - anchor to V") << QString("Rectangle { Rectangle { anchors.%1: parent.top } }").arg(side) - << "QML Rectangle (file::2:13) Can't anchor a horizontal edge to a vertical edge."; + << "QML Rectangle (file::2:13) Cannot anchor a horizontal edge to a vertical edge."; QTest::newRow("H - anchor to non parent/sibling") << QString("Rectangle { Item { Rectangle { id: rect } } Rectangle { anchors.%1: rect.%1 } }").arg(side) - << "QML Rectangle (file::2:45) Can't anchor to an item that isn't a parent or sibling."; + << "QML Rectangle (file::2:45) Cannot anchor to an item that isn't a parent or sibling."; QTest::newRow("H - anchor to self") << QString("Rectangle { id: rect; anchors.%1: rect.%1 }").arg(side) - << "QML Rectangle (file::2:1) Can't anchor item to self."; + << "QML Rectangle (file::2:1) Cannot anchor item to self."; } QTest::newRow("V - too many anchors") << "Rectangle { id: rect; Rectangle { anchors.top: rect.top; anchors.bottom: rect.bottom; anchors.verticalCenter: rect.verticalCenter } }" - << "QML Rectangle (file::2:23) Can't specify top, bottom, and vcenter anchors."; + << "QML Rectangle (file::2:23) Cannot specify top, bottom, and vcenter anchors."; QTest::newRow("V - too many anchors with baseline") << "Rectangle { Text { id: text1; text: \"Hello\" } Text { anchors.baseline: text1.baseline; anchors.top: text1.top; } }" - << "QML Text (file::2:47) Baseline anchor can't be used in conjunction with top, bottom, or vcenter anchors."; + << "QML Text (file::2:47) Baseline anchor cannot be used in conjunction with top, bottom, or vcenter anchors."; foreach (const QString &side, QStringList() << "top" << "bottom" << "baseline") { QTest::newRow("V - anchor to H") << QString("Rectangle { Rectangle { anchors.%1: parent.left } }").arg(side) - << "QML Rectangle (file::2:13) Can't anchor a vertical edge to a horizontal edge."; + << "QML Rectangle (file::2:13) Cannot anchor a vertical edge to a horizontal edge."; QTest::newRow("V - anchor to non parent/sibling") << QString("Rectangle { Item { Rectangle { id: rect } } Rectangle { anchors.%1: rect.%1 } }").arg(side) - << "QML Rectangle (file::2:45) Can't anchor to an item that isn't a parent or sibling."; + << "QML Rectangle (file::2:45) Cannot anchor to an item that isn't a parent or sibling."; QTest::newRow("V - anchor to self") << QString("Rectangle { id: rect; anchors.%1: rect.%1 }").arg(side) - << "QML Rectangle (file::2:1) Can't anchor item to self."; + << "QML Rectangle (file::2:1) Cannot anchor item to self."; } QTest::newRow("centerIn - anchor to non parent/sibling") << "Rectangle { Item { Rectangle { id: rect } } Rectangle { anchors.centerIn: rect} }" - << "QML Rectangle (file::2:45) Can't anchor to an item that isn't a parent or sibling."; + << "QML Rectangle (file::2:45) Cannot anchor to an item that isn't a parent or sibling."; QTest::newRow("fill - anchor to non parent/sibling") << "Rectangle { Item { Rectangle { id: rect } } Rectangle { anchors.fill: rect} }" - << "QML Rectangle (file::2:45) Can't anchor to an item that isn't a parent or sibling."; + << "QML Rectangle (file::2:45) Cannot anchor to an item that isn't a parent or sibling."; } void tst_qmlgraphicsanchors::reset() @@ -348,7 +348,7 @@ void tst_qmlgraphicsanchors::nullItem() const QMetaObject *meta = item->anchors()->metaObject(); QMetaProperty p = meta->property(meta->indexOfProperty(side.toUtf8().constData())); - QTest::ignoreMessage(QtWarningMsg, "QML Item (unknown location) Can't anchor to a null item."); + QTest::ignoreMessage(QtWarningMsg, "QML Item (unknown location) Cannot anchor to a null item."); QVERIFY(p.write(item->anchors(), qVariantFromValue(anchor))); delete item; @@ -372,9 +372,9 @@ void tst_qmlgraphicsanchors::crash1() { QmlView *view = new QmlView; - view->setUrl(QUrl::fromLocalFile(SRCDIR "/data/crash1.qml")); + view->setSource(QUrl::fromLocalFile(SRCDIR "/data/crash1.qml")); - QString expect = "QML Text (" + view->url().toString() + ":4:5" + ") Possible anchor loop detected on fill."; + QString expect = "QML Text (" + view->source().toString() + ":4:5" + ") Possible anchor loop detected on fill."; QTest::ignoreMessage(QtWarningMsg, expect.toLatin1()); QTest::ignoreMessage(QtWarningMsg, expect.toLatin1()); // XXX ideally, should be one message view->execute(); @@ -387,11 +387,11 @@ void tst_qmlgraphicsanchors::fill() { QmlView *view = new QmlView; - view->setUrl(QUrl::fromLocalFile(SRCDIR "/data/fill.qml")); + view->setSource(QUrl::fromLocalFile(SRCDIR "/data/fill.qml")); view->execute(); qApp->processEvents(); - QmlGraphicsRectangle* rect = findItem<QmlGraphicsRectangle>(view->root(), QLatin1String("filler")); + QmlGraphicsRectangle* rect = findItem<QmlGraphicsRectangle>(view->rootObject(), QLatin1String("filler")); QCOMPARE(rect->x(), 0.0 + 10.0); QCOMPARE(rect->y(), 0.0 + 30.0); QCOMPARE(rect->width(), 200.0 - 10.0 - 20.0); @@ -413,11 +413,11 @@ void tst_qmlgraphicsanchors::centerIn() { QmlView *view = new QmlView; - view->setUrl(QUrl::fromLocalFile(SRCDIR "/data/centerin.qml")); + view->setSource(QUrl::fromLocalFile(SRCDIR "/data/centerin.qml")); view->execute(); qApp->processEvents(); - QmlGraphicsRectangle* rect = findItem<QmlGraphicsRectangle>(view->root(), QLatin1String("centered")); + QmlGraphicsRectangle* rect = findItem<QmlGraphicsRectangle>(view->rootObject(), QLatin1String("centered")); QCOMPARE(rect->x(), 75.0 + 10); QCOMPARE(rect->y(), 75.0 + 30); //Alter Offsets (QTBUG-6631) @@ -433,11 +433,11 @@ void tst_qmlgraphicsanchors::margins() { QmlView *view = new QmlView; - view->setUrl(QUrl::fromLocalFile(SRCDIR "/data/margins.qml")); + view->setSource(QUrl::fromLocalFile(SRCDIR "/data/margins.qml")); view->execute(); qApp->processEvents(); - QmlGraphicsRectangle* rect = findItem<QmlGraphicsRectangle>(view->root(), QLatin1String("filler")); + QmlGraphicsRectangle* rect = findItem<QmlGraphicsRectangle>(view->rootObject(), QLatin1String("filler")); QCOMPARE(rect->x(), 5.0); QCOMPARE(rect->y(), 6.0); QCOMPARE(rect->width(), 200.0 - 5.0 - 10.0); diff --git a/tests/auto/declarative/qmlgraphicsanimatedimage/tst_qmlgraphicsanimatedimage.cpp b/tests/auto/declarative/qmlgraphicsanimatedimage/tst_qmlgraphicsanimatedimage.cpp index 1703c01..2342f25 100644 --- a/tests/auto/declarative/qmlgraphicsanimatedimage/tst_qmlgraphicsanimatedimage.cpp +++ b/tests/auto/declarative/qmlgraphicsanimatedimage/tst_qmlgraphicsanimatedimage.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** diff --git a/tests/auto/declarative/qmlgraphicsborderimage/tst_qmlgraphicsborderimage.cpp b/tests/auto/declarative/qmlgraphicsborderimage/tst_qmlgraphicsborderimage.cpp index 1ae0227..183f7e4 100644 --- a/tests/auto/declarative/qmlgraphicsborderimage/tst_qmlgraphicsborderimage.cpp +++ b/tests/auto/declarative/qmlgraphicsborderimage/tst_qmlgraphicsborderimage.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** diff --git a/tests/auto/declarative/qmlgraphicsflickable/tst_qmlgraphicsflickable.cpp b/tests/auto/declarative/qmlgraphicsflickable/tst_qmlgraphicsflickable.cpp index c0ffeb7..b503571 100644 --- a/tests/auto/declarative/qmlgraphicsflickable/tst_qmlgraphicsflickable.cpp +++ b/tests/auto/declarative/qmlgraphicsflickable/tst_qmlgraphicsflickable.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** @@ -39,6 +39,7 @@ ** ****************************************************************************/ #include <qtest.h> +#include <QtTest/QSignalSpy> #include <QtDeclarative/qmlengine.h> #include <QtDeclarative/qmlcomponent.h> #include <private/qmlgraphicsflickable_p.h> @@ -56,6 +57,10 @@ private slots: void horizontalViewportSize(); void verticalViewportSize(); void properties(); + void overShoot(); + void maximumFlickVelocity(); + void flickDeceleration(); + void pressDelay(); private: QmlEngine engine; @@ -140,6 +145,80 @@ void tst_qmlgraphicsflickable::properties() delete obj; } +void tst_qmlgraphicsflickable::overShoot() +{ + QmlComponent component(&engine); + component.setData("import Qt 4.6; Flickable { overShoot: false; }", QUrl::fromLocalFile("")); + QmlGraphicsFlickable *flickable = qobject_cast<QmlGraphicsFlickable*>(component.create()); + QSignalSpy spy(flickable, SIGNAL(overShootChanged())); + + QVERIFY(flickable); + QVERIFY(!flickable->overShoot()); + + flickable->setOverShoot(true); + QVERIFY(flickable->overShoot()); + QCOMPARE(spy.count(),1); + flickable->setOverShoot(true); + QCOMPARE(spy.count(),1); + + flickable->setOverShoot(false); + QVERIFY(!flickable->overShoot()); + QCOMPARE(spy.count(),2); + flickable->setOverShoot(false); + QCOMPARE(spy.count(),2); +} + +void tst_qmlgraphicsflickable::maximumFlickVelocity() +{ + QmlComponent component(&engine); + component.setData("import Qt 4.6; Flickable { maximumFlickVelocity: 1.0; }", QUrl::fromLocalFile("")); + QmlGraphicsFlickable *flickable = qobject_cast<QmlGraphicsFlickable*>(component.create()); + QSignalSpy spy(flickable, SIGNAL(maximumFlickVelocityChanged())); + + QVERIFY(flickable); + QCOMPARE(flickable->maximumFlickVelocity(), 1.0); + + flickable->setMaximumFlickVelocity(2.0); + QCOMPARE(flickable->maximumFlickVelocity(), 2.0); + QCOMPARE(spy.count(),1); + flickable->setMaximumFlickVelocity(2.0); + QCOMPARE(spy.count(),1); +} + +void tst_qmlgraphicsflickable::flickDeceleration() +{ + QmlComponent component(&engine); + component.setData("import Qt 4.6; Flickable { flickDeceleration: 1.0; }", QUrl::fromLocalFile("")); + QmlGraphicsFlickable *flickable = qobject_cast<QmlGraphicsFlickable*>(component.create()); + QSignalSpy spy(flickable, SIGNAL(flickDecelerationChanged())); + + QVERIFY(flickable); + QCOMPARE(flickable->flickDeceleration(), 1.0); + + flickable->setFlickDeceleration(2.0); + QCOMPARE(flickable->flickDeceleration(), 2.0); + QCOMPARE(spy.count(),1); + flickable->setFlickDeceleration(2.0); + QCOMPARE(spy.count(),1); +} + +void tst_qmlgraphicsflickable::pressDelay() +{ + QmlComponent component(&engine); + component.setData("import Qt 4.6; Flickable { pressDelay: 100; }", QUrl::fromLocalFile("")); + QmlGraphicsFlickable *flickable = qobject_cast<QmlGraphicsFlickable*>(component.create()); + QSignalSpy spy(flickable, SIGNAL(pressDelayChanged())); + + QVERIFY(flickable); + QCOMPARE(flickable->pressDelay(), 100); + + flickable->setPressDelay(200); + QCOMPARE(flickable->pressDelay(), 200); + QCOMPARE(spy.count(),1); + flickable->setPressDelay(200); + QCOMPARE(spy.count(),1); +} + QTEST_MAIN(tst_qmlgraphicsflickable) #include "tst_qmlgraphicsflickable.moc" diff --git a/tests/auto/declarative/qmlgraphicsflipable/tst_qmlgraphicsflipable.cpp b/tests/auto/declarative/qmlgraphicsflipable/tst_qmlgraphicsflipable.cpp index e571e4e..24dc2e8 100644 --- a/tests/auto/declarative/qmlgraphicsflipable/tst_qmlgraphicsflipable.cpp +++ b/tests/auto/declarative/qmlgraphicsflipable/tst_qmlgraphicsflipable.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** diff --git a/tests/auto/declarative/qmlgraphicsgridview/tst_qmlgraphicsgridview.cpp b/tests/auto/declarative/qmlgraphicsgridview/tst_qmlgraphicsgridview.cpp index c157e62..2520d4a 100644 --- a/tests/auto/declarative/qmlgraphicsgridview/tst_qmlgraphicsgridview.cpp +++ b/tests/auto/declarative/qmlgraphicsgridview/tst_qmlgraphicsgridview.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** @@ -70,9 +70,9 @@ private slots: private: QmlView *createView(const QString &filename); template<typename T> - T *findItem(QmlGraphicsItem *parent, const QString &id, int index=-1); + T *findItem(QGraphicsObject *parent, const QString &id, int index=-1); template<typename T> - QList<T*> findItems(QmlGraphicsItem *parent, const QString &objectName); + QList<T*> findItems(QGraphicsObject *parent, const QString &objectName); void dumpTree(QmlGraphicsItem *parent, int depth = 0); }; @@ -160,7 +160,7 @@ void tst_QmlGraphicsGridView::items() canvas->execute(); qApp->processEvents(); - QmlGraphicsGridView *gridview = findItem<QmlGraphicsGridView>(canvas->root(), "grid"); + QmlGraphicsGridView *gridview = findItem<QmlGraphicsGridView>(canvas->rootObject(), "grid"); QVERIFY(gridview != 0); QmlGraphicsItem *viewport = gridview->viewport(); @@ -208,7 +208,7 @@ void tst_QmlGraphicsGridView::changed() canvas->execute(); qApp->processEvents(); - QmlGraphicsFlickable *gridview = findItem<QmlGraphicsFlickable>(canvas->root(), "grid"); + QmlGraphicsFlickable *gridview = findItem<QmlGraphicsFlickable>(canvas->rootObject(), "grid"); QVERIFY(gridview != 0); QmlGraphicsItem *viewport = gridview->viewport(); @@ -241,7 +241,7 @@ void tst_QmlGraphicsGridView::inserted() canvas->execute(); qApp->processEvents(); - QmlGraphicsGridView *gridview = findItem<QmlGraphicsGridView>(canvas->root(), "grid"); + QmlGraphicsGridView *gridview = findItem<QmlGraphicsGridView>(canvas->rootObject(), "grid"); QVERIFY(gridview != 0); QmlGraphicsItem *viewport = gridview->viewport(); @@ -322,7 +322,7 @@ void tst_QmlGraphicsGridView::removed() canvas->execute(); qApp->processEvents(); - QmlGraphicsGridView *gridview = findItem<QmlGraphicsGridView>(canvas->root(), "grid"); + QmlGraphicsGridView *gridview = findItem<QmlGraphicsGridView>(canvas->rootObject(), "grid"); QVERIFY(gridview != 0); QmlGraphicsItem *viewport = gridview->viewport(); @@ -482,7 +482,7 @@ void tst_QmlGraphicsGridView::moved() canvas->execute(); qApp->processEvents(); - QmlGraphicsGridView *gridview = findItem<QmlGraphicsGridView>(canvas->root(), "grid"); + QmlGraphicsGridView *gridview = findItem<QmlGraphicsGridView>(canvas->rootObject(), "grid"); QVERIFY(gridview != 0); QmlGraphicsItem *viewport = gridview->viewport(); @@ -578,15 +578,12 @@ void tst_QmlGraphicsGridView::currentIndex() ctxt->setContextProperty("testModel", &model); QString filename(SRCDIR "/data/gridview-initCurrent.qml"); - QFile file(filename); - file.open(QFile::ReadOnly); - QString qml = file.readAll(); - canvas->setQml(qml, filename); + canvas->setSource(QUrl::fromLocalFile(filename)); canvas->execute(); qApp->processEvents(); - QmlGraphicsGridView *gridview = findItem<QmlGraphicsGridView>(canvas->root(), "grid"); + QmlGraphicsGridView *gridview = findItem<QmlGraphicsGridView>(canvas->rootObject(), "grid"); QVERIFY(gridview != 0); QmlGraphicsItem *viewport = gridview->viewport(); @@ -648,45 +645,29 @@ void tst_QmlGraphicsGridView::currentIndex() QCOMPARE(gridview->viewportY(), 0.0); // Test keys + qApp->setActiveWindow(canvas); canvas->show(); canvas->setFocus(); qApp->processEvents(); - QEvent wa(QEvent::WindowActivate); - QApplication::sendEvent(canvas, &wa); - QFocusEvent fe(QEvent::FocusIn); - QApplication::sendEvent(canvas, &fe); - - QKeyEvent key(QEvent::KeyPress, Qt::Key_Down, Qt::NoModifier, "", false, 1); - QApplication::sendEvent(canvas, &key); - QVERIFY(key.isAccepted()); + QTest::keyClick(canvas, Qt::Key_Down); QCOMPARE(gridview->currentIndex(), 3); - key = QKeyEvent(QEvent::KeyPress, Qt::Key_Up, Qt::NoModifier, "", false, 1); - QApplication::sendEvent(canvas, &key); - QVERIFY(key.isAccepted()); + QTest::keyClick(canvas, Qt::Key_Up); QCOMPARE(gridview->currentIndex(), 0); gridview->setFlow(QmlGraphicsGridView::TopToBottom); - key = QKeyEvent(QEvent::KeyPress, Qt::Key_Right, Qt::NoModifier, "", false, 1); - QApplication::sendEvent(canvas, &key); - QVERIFY(key.isAccepted()); + QTest::keyClick(canvas, Qt::Key_Right); QCOMPARE(gridview->currentIndex(), 5); - key = QKeyEvent(QEvent::KeyPress, Qt::Key_Left, Qt::NoModifier, "", false, 1); - QApplication::sendEvent(canvas, &key); - QVERIFY(key.isAccepted()); + QTest::keyClick(canvas, Qt::Key_Left); QCOMPARE(gridview->currentIndex(), 0); - key = QKeyEvent(QEvent::KeyPress, Qt::Key_Down, Qt::NoModifier, "", false, 1); - QApplication::sendEvent(canvas, &key); - QVERIFY(key.isAccepted()); + QTest::keyClick(canvas, Qt::Key_Down); QCOMPARE(gridview->currentIndex(), 1); - key = QKeyEvent(QEvent::KeyPress, Qt::Key_Up, Qt::NoModifier, "", false, 1); - QApplication::sendEvent(canvas, &key); - QVERIFY(key.isAccepted()); + QTest::keyClick(canvas, Qt::Key_Up); QCOMPARE(gridview->currentIndex(), 0); @@ -722,7 +703,7 @@ void tst_QmlGraphicsGridView::changeFlow() canvas->execute(); qApp->processEvents(); - QmlGraphicsGridView *gridview = findItem<QmlGraphicsGridView>(canvas->root(), "grid"); + QmlGraphicsGridView *gridview = findItem<QmlGraphicsGridView>(canvas->rootObject(), "grid"); QVERIFY(gridview != 0); QmlGraphicsItem *viewport = gridview->viewport(); @@ -827,7 +808,7 @@ void tst_QmlGraphicsGridView::positionViewAtIndex() canvas->execute(); qApp->processEvents(); - QmlGraphicsGridView *gridview = findItem<QmlGraphicsGridView>(canvas->root(), "grid"); + QmlGraphicsGridView *gridview = findItem<QmlGraphicsGridView>(canvas->rootObject(), "grid"); QVERIFY(gridview != 0); QmlGraphicsItem *viewport = gridview->viewport(); @@ -907,10 +888,7 @@ QmlView *tst_QmlGraphicsGridView::createView(const QString &filename) QmlView *canvas = new QmlView(0); canvas->setFixedSize(240,320); - QFile file(filename); - file.open(QFile::ReadOnly); - QString qml = file.readAll(); - canvas->setQml(qml, filename); + canvas->setSource(QUrl::fromLocalFile(filename)); return canvas; } @@ -920,10 +898,10 @@ QmlView *tst_QmlGraphicsGridView::createView(const QString &filename) item must also evaluate the {index} expression equal to index */ template<typename T> -T *tst_QmlGraphicsGridView::findItem(QmlGraphicsItem *parent, const QString &objectName, int index) +T *tst_QmlGraphicsGridView::findItem(QGraphicsObject *parent, const QString &objectName, int index) { const QMetaObject &mo = T::staticMetaObject; - //qDebug() << parent->QGraphicsObject::children().count() << "children"; + //qDebug() << parent->childItems().count() << "children"; for (int i = 0; i < parent->childItems().count(); ++i) { QmlGraphicsItem *item = qobject_cast<QmlGraphicsItem*>(parent->childItems().at(i)); if(!item) @@ -950,11 +928,11 @@ T *tst_QmlGraphicsGridView::findItem(QmlGraphicsItem *parent, const QString &obj } template<typename T> -QList<T*> tst_QmlGraphicsGridView::findItems(QmlGraphicsItem *parent, const QString &objectName) +QList<T*> tst_QmlGraphicsGridView::findItems(QGraphicsObject *parent, const QString &objectName) { QList<T*> items; const QMetaObject &mo = T::staticMetaObject; - //qDebug() << parent->QGraphicsObject::children().count() << "children"; + //qDebug() << parent->childItems().count() << "children"; for (int i = 0; i < parent->childItems().count(); ++i) { QmlGraphicsItem *item = qobject_cast<QmlGraphicsItem*>(parent->childItems().at(i)); if(!item) diff --git a/tests/auto/declarative/qmlgraphicsimage/tst_qmlgraphicsimage.cpp b/tests/auto/declarative/qmlgraphicsimage/tst_qmlgraphicsimage.cpp index 79dc290..503b05e 100644 --- a/tests/auto/declarative/qmlgraphicsimage/tst_qmlgraphicsimage.cpp +++ b/tests/auto/declarative/qmlgraphicsimage/tst_qmlgraphicsimage.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** diff --git a/tests/auto/declarative/qmlgraphicsitem/tst_qmlgraphicsitem.cpp b/tests/auto/declarative/qmlgraphicsitem/tst_qmlgraphicsitem.cpp index c671dae..820a6de 100644 --- a/tests/auto/declarative/qmlgraphicsitem/tst_qmlgraphicsitem.cpp +++ b/tests/auto/declarative/qmlgraphicsitem/tst_qmlgraphicsitem.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** @@ -39,11 +39,12 @@ ** ****************************************************************************/ #include <qtest.h> +#include <QtTest/QSignalSpy> #include <QtDeclarative/qmlengine.h> #include <QtDeclarative/qmlcomponent.h> #include <QtDeclarative/qmlcontext.h> #include <QtDeclarative/qmlview.h> -#include <qmlgraphicsitem.h> +#include <QtDeclarative/qmlgraphicsitem.h> class tst_QmlGraphicsItem : public QObject @@ -55,10 +56,13 @@ public: private slots: void keys(); void keyNavigation(); + void smooth(); + void clip(); private: template<typename T> - T *findItem(QmlGraphicsItem *parent, const QString &objectName); + T *findItem(QGraphicsObject *parent, const QString &objectName); + QmlEngine engine; }; class KeysTestObject : public QObject @@ -108,7 +112,7 @@ void tst_QmlGraphicsItem::keys() QmlView *canvas = new QmlView(0); canvas->setFixedSize(240,320); - canvas->setUrl(QUrl::fromLocalFile(SRCDIR "/data/keys.qml")); + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/keys.qml")); KeysTestObject *testObject = new KeysTestObject; canvas->rootContext()->setContextProperty("keysTestObject", testObject); @@ -190,7 +194,7 @@ void tst_QmlGraphicsItem::keyNavigation() QmlView *canvas = new QmlView(0); canvas->setFixedSize(240,320); - canvas->setUrl(QUrl::fromLocalFile(SRCDIR "/data/keynavigation.qml")); + canvas->setSource(QUrl::fromLocalFile(SRCDIR "/data/keynavigation.qml")); canvas->execute(); canvas->show(); qApp->processEvents(); @@ -200,7 +204,7 @@ void tst_QmlGraphicsItem::keyNavigation() QFocusEvent fe(QEvent::FocusIn); QApplication::sendEvent(canvas, &fe); - QmlGraphicsItem *item = findItem<QmlGraphicsItem>(canvas->root(), "item1"); + QmlGraphicsItem *item = findItem<QmlGraphicsItem>(canvas->rootObject(), "item1"); QVERIFY(item); QVERIFY(item->hasFocus()); @@ -209,7 +213,7 @@ void tst_QmlGraphicsItem::keyNavigation() QApplication::sendEvent(canvas, &key); QVERIFY(key.isAccepted()); - item = findItem<QmlGraphicsItem>(canvas->root(), "item2"); + item = findItem<QmlGraphicsItem>(canvas->rootObject(), "item2"); QVERIFY(item); QVERIFY(item->hasFocus()); @@ -218,7 +222,7 @@ void tst_QmlGraphicsItem::keyNavigation() QApplication::sendEvent(canvas, &key); QVERIFY(key.isAccepted()); - item = findItem<QmlGraphicsItem>(canvas->root(), "item4"); + item = findItem<QmlGraphicsItem>(canvas->rootObject(), "item4"); QVERIFY(item); QVERIFY(item->hasFocus()); @@ -227,7 +231,7 @@ void tst_QmlGraphicsItem::keyNavigation() QApplication::sendEvent(canvas, &key); QVERIFY(key.isAccepted()); - item = findItem<QmlGraphicsItem>(canvas->root(), "item3"); + item = findItem<QmlGraphicsItem>(canvas->rootObject(), "item3"); QVERIFY(item); QVERIFY(item->hasFocus()); @@ -236,21 +240,67 @@ void tst_QmlGraphicsItem::keyNavigation() QApplication::sendEvent(canvas, &key); QVERIFY(key.isAccepted()); - item = findItem<QmlGraphicsItem>(canvas->root(), "item1"); + item = findItem<QmlGraphicsItem>(canvas->rootObject(), "item1"); QVERIFY(item); QVERIFY(item->hasFocus()); } +void tst_QmlGraphicsItem::smooth() +{ + QmlComponent component(&engine); + component.setData("import Qt 4.6; Item { smooth: false; }", QUrl::fromLocalFile("")); + QmlGraphicsItem *item = qobject_cast<QmlGraphicsItem*>(component.create()); + QSignalSpy spy(item, SIGNAL(smoothChanged())); + + QVERIFY(item); + QVERIFY(!item->smooth()); + + item->setSmooth(true); + QVERIFY(item->smooth()); + QCOMPARE(spy.count(),1); + item->setSmooth(true); + QCOMPARE(spy.count(),1); + + item->setSmooth(false); + QVERIFY(!item->smooth()); + QCOMPARE(spy.count(),2); + item->setSmooth(false); + QCOMPARE(spy.count(),2); +} + +void tst_QmlGraphicsItem::clip() +{ + QmlComponent component(&engine); + component.setData("import Qt 4.6\nItem { clip: false\n }", QUrl::fromLocalFile("")); + QmlGraphicsItem *item = qobject_cast<QmlGraphicsItem*>(component.create()); + QSignalSpy spy(item, SIGNAL(clipChanged())); + + QVERIFY(item); + QVERIFY(!item->clip()); + + item->setClip(true); + QVERIFY(item->clip()); + QCOMPARE(spy.count(),1); + item->setClip(true); + QCOMPARE(spy.count(),1); + + item->setClip(false); + QVERIFY(!item->clip()); + QCOMPARE(spy.count(),2); + item->setClip(false); + QCOMPARE(spy.count(),2); +} + template<typename T> -T *tst_QmlGraphicsItem::findItem(QmlGraphicsItem *parent, const QString &objectName) +T *tst_QmlGraphicsItem::findItem(QGraphicsObject *parent, const QString &objectName) { if (!parent) return 0; const QMetaObject &mo = T::staticMetaObject; //qDebug() << parent->QGraphicsObject::children().count() << "children"; - for (int i = 0; i < parent->QGraphicsObject::children().count(); ++i) { - QmlGraphicsItem *item = qobject_cast<QmlGraphicsItem*>(parent->QGraphicsObject::children().at(i)); + for (int i = 0; i < parent->childItems().count(); ++i) { + QmlGraphicsItem *item = qobject_cast<QmlGraphicsItem*>(parent->childItems().at(i)); if(!item) continue; //qDebug() << "try" << item; diff --git a/tests/auto/declarative/qmlgraphicslistview/tst_qmlgraphicslistview.cpp b/tests/auto/declarative/qmlgraphicslistview/tst_qmlgraphicslistview.cpp index 6f97030..13ed41d 100644 --- a/tests/auto/declarative/qmlgraphicslistview/tst_qmlgraphicslistview.cpp +++ b/tests/auto/declarative/qmlgraphicslistview/tst_qmlgraphicslistview.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** @@ -90,9 +90,9 @@ private: template <class T> void clear(); QmlView *createView(const QString &filename); template<typename T> - T *findItem(QmlGraphicsItem *parent, const QString &id, int index=-1); + T *findItem(QGraphicsObject *parent, const QString &id, int index=-1); template<typename T> - QList<T*> findItems(QmlGraphicsItem *parent, const QString &objectName); + QList<T*> findItems(QGraphicsObject *parent, const QString &objectName); void dumpTree(QmlGraphicsItem *parent, int depth = 0); }; @@ -316,13 +316,13 @@ void tst_QmlGraphicsListView::items() canvas->execute(); qApp->processEvents(); - QmlGraphicsListView *listview = findItem<QmlGraphicsListView>(canvas->root(), "list"); + QmlGraphicsListView *listview = findItem<QmlGraphicsListView>(canvas->rootObject(), "list"); QVERIFY(listview != 0); QmlGraphicsItem *viewport = listview->viewport(); QVERIFY(viewport != 0); - QMetaObject::invokeMethod(canvas->root(), "checkProperties"); + QMetaObject::invokeMethod(canvas->rootObject(), "checkProperties"); QVERIFY(testObject->error() == false); QVERIFY(listview->highlightItem() != 0); @@ -343,20 +343,20 @@ void tst_QmlGraphicsListView::items() // switch to other delegate testObject->setAnimate(true); - QMetaObject::invokeMethod(canvas->root(), "checkProperties"); + QMetaObject::invokeMethod(canvas->rootObject(), "checkProperties"); QVERIFY(testObject->error() == false); QVERIFY(listview->currentItem()); // set invalid highlight testObject->setInvalidHighlight(true); - QMetaObject::invokeMethod(canvas->root(), "checkProperties"); + QMetaObject::invokeMethod(canvas->rootObject(), "checkProperties"); QVERIFY(testObject->error() == false); QVERIFY(listview->currentItem()); QVERIFY(listview->highlightItem() == 0); // back to normal highlight testObject->setInvalidHighlight(false); - QMetaObject::invokeMethod(canvas->root(), "checkProperties"); + QMetaObject::invokeMethod(canvas->rootObject(), "checkProperties"); QVERIFY(testObject->error() == false); QVERIFY(listview->currentItem()); QVERIFY(listview->highlightItem() != 0); @@ -396,7 +396,7 @@ void tst_QmlGraphicsListView::changed() canvas->execute(); qApp->processEvents(); - QmlGraphicsFlickable *listview = findItem<QmlGraphicsFlickable>(canvas->root(), "list"); + QmlGraphicsFlickable *listview = findItem<QmlGraphicsFlickable>(canvas->rootObject(), "list"); QVERIFY(listview != 0); QmlGraphicsItem *viewport = listview->viewport(); @@ -432,7 +432,7 @@ void tst_QmlGraphicsListView::inserted() canvas->execute(); qApp->processEvents(); - QmlGraphicsListView *listview = findItem<QmlGraphicsListView>(canvas->root(), "list"); + QmlGraphicsListView *listview = findItem<QmlGraphicsListView>(canvas->rootObject(), "list"); QVERIFY(listview != 0); QmlGraphicsItem *viewport = listview->viewport(); @@ -501,6 +501,8 @@ void tst_QmlGraphicsListView::inserted() QCOMPARE(item->y(), i*20.0 - 20.0); } +// QCOMPARE(listview->viewportHeight(), model.count() * 20.0); + delete canvas; } @@ -523,7 +525,7 @@ void tst_QmlGraphicsListView::removed(bool animated) canvas->execute(); qApp->processEvents(); - QmlGraphicsListView *listview = findItem<QmlGraphicsListView>(canvas->root(), "list"); + QmlGraphicsListView *listview = findItem<QmlGraphicsListView>(canvas->rootObject(), "list"); QVERIFY(listview != 0); QmlGraphicsItem *viewport = listview->viewport(); @@ -665,7 +667,7 @@ void tst_QmlGraphicsListView::clear() canvas->execute(); qApp->processEvents(); - QmlGraphicsListView *listview = findItem<QmlGraphicsListView>(canvas->root(), "list"); + QmlGraphicsListView *listview = findItem<QmlGraphicsListView>(canvas->rootObject(), "list"); QVERIFY(listview != 0); QmlGraphicsItem *viewport = listview->viewport(); @@ -702,7 +704,7 @@ void tst_QmlGraphicsListView::moved() canvas->execute(); qApp->processEvents(); - QmlGraphicsListView *listview = findItem<QmlGraphicsListView>(canvas->root(), "list"); + QmlGraphicsListView *listview = findItem<QmlGraphicsListView>(canvas->rootObject(), "list"); QVERIFY(listview != 0); QmlGraphicsItem *viewport = listview->viewport(); @@ -795,7 +797,7 @@ void tst_QmlGraphicsListView::enforceRange() canvas->execute(); qApp->processEvents(); - QmlGraphicsListView *listview = findItem<QmlGraphicsListView>(canvas->root(), "list"); + QmlGraphicsListView *listview = findItem<QmlGraphicsListView>(canvas->rootObject(), "list"); QVERIFY(listview != 0); QCOMPARE(listview->preferredHighlightBegin(), 100.0); @@ -843,7 +845,7 @@ void tst_QmlGraphicsListView::spacing() canvas->execute(); qApp->processEvents(); - QmlGraphicsListView *listview = findItem<QmlGraphicsListView>(canvas->root(), "list"); + QmlGraphicsListView *listview = findItem<QmlGraphicsListView>(canvas->rootObject(), "list"); QVERIFY(listview != 0); QmlGraphicsItem *viewport = listview->viewport(); @@ -898,7 +900,7 @@ void tst_QmlGraphicsListView::sections() canvas->execute(); qApp->processEvents(); - QmlGraphicsListView *listview = findItem<QmlGraphicsListView>(canvas->root(), "list"); + QmlGraphicsListView *listview = findItem<QmlGraphicsListView>(canvas->rootObject(), "list"); QVERIFY(listview != 0); QmlGraphicsItem *viewport = listview->viewport(); @@ -971,15 +973,12 @@ void tst_QmlGraphicsListView::currentIndex() ctxt->setContextProperty("testWrap", QVariant(false)); QString filename(SRCDIR "/data/listview-initCurrent.qml"); - QFile file(filename); - file.open(QFile::ReadOnly); - QString qml = file.readAll(); - canvas->setQml(qml, filename); + canvas->setSource(QUrl::fromLocalFile(filename)); canvas->execute(); qApp->processEvents(); - QmlGraphicsListView *listview = findItem<QmlGraphicsListView>(canvas->root(), "list"); + QmlGraphicsListView *listview = findItem<QmlGraphicsListView>(canvas->rootObject(), "list"); QVERIFY(listview != 0); QmlGraphicsItem *viewport = listview->viewport(); @@ -1061,13 +1060,13 @@ void tst_QmlGraphicsListView::itemList() canvas->execute(); qApp->processEvents(); - QmlGraphicsListView *listview = findItem<QmlGraphicsListView>(canvas->root(), "view"); + QmlGraphicsListView *listview = findItem<QmlGraphicsListView>(canvas->rootObject(), "view"); QVERIFY(listview != 0); QmlGraphicsItem *viewport = listview->viewport(); QVERIFY(viewport != 0); - QmlGraphicsVisualItemModel *model = canvas->root()->findChild<QmlGraphicsVisualItemModel*>("itemModel"); + QmlGraphicsVisualItemModel *model = canvas->rootObject()->findChild<QmlGraphicsVisualItemModel*>("itemModel"); QVERIFY(model != 0); QVERIFY(model->count() == 3); @@ -1112,7 +1111,7 @@ void tst_QmlGraphicsListView::cacheBuffer() canvas->execute(); qApp->processEvents(); - QmlGraphicsListView *listview = findItem<QmlGraphicsListView>(canvas->root(), "list"); + QmlGraphicsListView *listview = findItem<QmlGraphicsListView>(canvas->rootObject(), "list"); QVERIFY(listview != 0); QmlGraphicsItem *viewport = listview->viewport(); @@ -1164,7 +1163,7 @@ void tst_QmlGraphicsListView::positionViewAtIndex() canvas->execute(); qApp->processEvents(); - QmlGraphicsListView *listview = findItem<QmlGraphicsListView>(canvas->root(), "list"); + QmlGraphicsListView *listview = findItem<QmlGraphicsListView>(canvas->rootObject(), "list"); QVERIFY(listview != 0); QmlGraphicsItem *viewport = listview->viewport(); @@ -1301,10 +1300,7 @@ QmlView *tst_QmlGraphicsListView::createView(const QString &filename) QmlView *canvas = new QmlView(0); canvas->setFixedSize(240,320); - QFile file(filename); - file.open(QFile::ReadOnly); - QString qml = file.readAll(); - canvas->setQml(qml, filename); + canvas->setSource(QUrl::fromLocalFile(filename)); return canvas; } @@ -1314,10 +1310,10 @@ QmlView *tst_QmlGraphicsListView::createView(const QString &filename) item must also evaluate the {index} expression equal to index */ template<typename T> -T *tst_QmlGraphicsListView::findItem(QmlGraphicsItem *parent, const QString &objectName, int index) +T *tst_QmlGraphicsListView::findItem(QGraphicsObject *parent, const QString &objectName, int index) { const QMetaObject &mo = T::staticMetaObject; - //qDebug() << parent->QGraphicsObject::children().count() << "children"; + //qDebug() << parent->childItems().count() << "children"; for (int i = 0; i < parent->childItems().count(); ++i) { QmlGraphicsItem *item = qobject_cast<QmlGraphicsItem*>(parent->childItems().at(i)); if(!item) @@ -1342,11 +1338,11 @@ T *tst_QmlGraphicsListView::findItem(QmlGraphicsItem *parent, const QString &obj } template<typename T> -QList<T*> tst_QmlGraphicsListView::findItems(QmlGraphicsItem *parent, const QString &objectName) +QList<T*> tst_QmlGraphicsListView::findItems(QGraphicsObject *parent, const QString &objectName) { QList<T*> items; const QMetaObject &mo = T::staticMetaObject; - //qDebug() << parent->QGraphicsObject::children().count() << "children"; + //qDebug() << parent->childItems().count() << "children"; for (int i = 0; i < parent->childItems().count(); ++i) { QmlGraphicsItem *item = qobject_cast<QmlGraphicsItem*>(parent->childItems().at(i)); if(!item) diff --git a/tests/auto/declarative/qmlgraphicsloader/data/NoResizeGraphicsWidget.qml b/tests/auto/declarative/qmlgraphicsloader/data/NoResizeGraphicsWidget.qml index 0704e18..5eab965 100644 --- a/tests/auto/declarative/qmlgraphicsloader/data/NoResizeGraphicsWidget.qml +++ b/tests/auto/declarative/qmlgraphicsloader/data/NoResizeGraphicsWidget.qml @@ -1,8 +1,8 @@ -import Qt 4.6
-
-Loader {
- resizeMode: Loader.NoResize
- source: "GraphicsWidget250x250.qml"
- width: 200
- height: 80
-}
+import Qt 4.6 + +Loader { + resizeMode: Loader.NoResize + source: "GraphicsWidget250x250.qml" + width: 200 + height: 80 +} diff --git a/tests/auto/declarative/qmlgraphicsloader/data/SizeGraphicsWidgetToLoader.qml b/tests/auto/declarative/qmlgraphicsloader/data/SizeGraphicsWidgetToLoader.qml index 97c72f4..568a136 100644 --- a/tests/auto/declarative/qmlgraphicsloader/data/SizeGraphicsWidgetToLoader.qml +++ b/tests/auto/declarative/qmlgraphicsloader/data/SizeGraphicsWidgetToLoader.qml @@ -1,8 +1,8 @@ -import Qt 4.6
-
-Loader {
- resizeMode: Loader.SizeItemToLoader
- width: 200
- height: 80
- source: "GraphicsWidget250x250.qml"
-}
+import Qt 4.6 + +Loader { + resizeMode: Loader.SizeItemToLoader + width: 200 + height: 80 + source: "GraphicsWidget250x250.qml" +} diff --git a/tests/auto/declarative/qmlgraphicsloader/data/SizeLoaderToGraphicsWidget.qml b/tests/auto/declarative/qmlgraphicsloader/data/SizeLoaderToGraphicsWidget.qml index cb72f05..a710803 100644 --- a/tests/auto/declarative/qmlgraphicsloader/data/SizeLoaderToGraphicsWidget.qml +++ b/tests/auto/declarative/qmlgraphicsloader/data/SizeLoaderToGraphicsWidget.qml @@ -1,6 +1,6 @@ -import Qt 4.6
-
-Loader {
- resizeMode: Loader.SizeLoaderToItem
- source: "GraphicsWidget250x250.qml"
-}
+import Qt 4.6 + +Loader { + resizeMode: Loader.SizeLoaderToItem + source: "GraphicsWidget250x250.qml" +} diff --git a/tests/auto/declarative/qmlgraphicsloader/tst_qmlgraphicsloader.cpp b/tests/auto/declarative/qmlgraphicsloader/tst_qmlgraphicsloader.cpp index 43f58c1..2d3d5ee 100644 --- a/tests/auto/declarative/qmlgraphicsloader/tst_qmlgraphicsloader.cpp +++ b/tests/auto/declarative/qmlgraphicsloader/tst_qmlgraphicsloader.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** @@ -42,6 +42,7 @@ #include <QtGui/QGraphicsWidget> #include <QtGui/QGraphicsScene> +#include <QSignalSpy> #include <QtDeclarative/qmlengine.h> #include <QtDeclarative/qmlcomponent.h> #include <private/qmlgraphicsloader_p.h> @@ -259,6 +260,13 @@ void tst_QmlGraphicsLoader::sizeLoaderToItem() loader->setHeight(30); QCOMPARE(rect->width(), 180.0); QCOMPARE(rect->height(), 30.0); + + // notify + QSignalSpy spy(loader, SIGNAL(resizeModeChanged())); + loader->setResizeMode(QmlGraphicsLoader::NoResize); + QCOMPARE(spy.count(),1); + loader->setResizeMode(QmlGraphicsLoader::NoResize); + QCOMPARE(spy.count(),1); } void tst_QmlGraphicsLoader::sizeItemToLoader() @@ -381,7 +389,7 @@ void tst_QmlGraphicsLoader::networkRequestUrl() { TestHTTPServer server(SERVER_PORT); QVERIFY(server.isValid()); - server.serveDirectory("data"); + server.serveDirectory(SRCDIR "/data"); QmlComponent component(&engine); component.setData(QByteArray("import Qt 4.6\nLoader { source: \"http://127.0.0.1:14445/Rect120x60.qml\" }"), TEST_FILE("")); @@ -433,7 +441,7 @@ void tst_QmlGraphicsLoader::failNetworkRequest() { TestHTTPServer server(SERVER_PORT); QVERIFY(server.isValid()); - server.serveDirectory("data"); + server.serveDirectory(SRCDIR "/data"); QTest::ignoreMessage(QtWarningMsg, "(:-1: Network error for URL http://127.0.0.1:14445/IDontExist.qml) "); diff --git a/tests/auto/declarative/qmlgraphicsmousearea/data/dragproperties.qml b/tests/auto/declarative/qmlgraphicsmousearea/data/dragproperties.qml new file mode 100644 index 0000000..4cd78da --- /dev/null +++ b/tests/auto/declarative/qmlgraphicsmousearea/data/dragproperties.qml @@ -0,0 +1,28 @@ +import Qt 4.6 +Rectangle { + id: whiteRect + width: 200 + height: 200 + color: "white" + Rectangle { + id: blackRect + objectName: "blackrect" + color: "black" + y: 50 + x: 50 + width: 100 + height: 100 + opacity: (whiteRect.width-blackRect.x+whiteRect.height-blackRect.y-199)/200 + Text { text: blackRect.opacity} + MouseArea { + objectName: "mouseregion" + anchors.fill: parent + drag.target: blackRect + drag.axis: Drag.XandYAxis + drag.minimumX: 0 + drag.maximumX: whiteRect.width-blackRect.width + drag.minimumY: 0 + drag.maximumY: whiteRect.height-blackRect.height + } + } + } diff --git a/tests/auto/declarative/qmlgraphicsmousearea/qmlgraphicsmousearea.pro b/tests/auto/declarative/qmlgraphicsmousearea/qmlgraphicsmousearea.pro new file mode 100644 index 0000000..f85bf0f --- /dev/null +++ b/tests/auto/declarative/qmlgraphicsmousearea/qmlgraphicsmousearea.pro @@ -0,0 +1,9 @@ +load(qttest_p4) +contains(QT_CONFIG,declarative): QT += declarative gui network +macx:CONFIG -= app_bundle + +HEADERS += ../shared/testhttpserver.h +SOURCES += tst_qmlgraphicsmousearea.cpp ../shared/testhttpserver.cpp + +# Define SRCDIR equal to test's source directory +DEFINES += SRCDIR=\\\"$$PWD\\\" diff --git a/tests/auto/declarative/qmlgraphicsmousearea/tst_qmlgraphicsmousearea.cpp b/tests/auto/declarative/qmlgraphicsmousearea/tst_qmlgraphicsmousearea.cpp new file mode 100644 index 0000000..869a7bd --- /dev/null +++ b/tests/auto/declarative/qmlgraphicsmousearea/tst_qmlgraphicsmousearea.cpp @@ -0,0 +1,139 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (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 Technology Preview License Agreement accompanying +** this package. +** +** 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.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <QtTest/QtTest> +#include <QtTest/QSignalSpy> +#include <private/qmlgraphicsmousearea_p.h> +#include <QtDeclarative/qmlview.h> + +class tst_QmlGraphicsMouseArea: public QObject +{ + Q_OBJECT +private slots: + void dragProperties(); +private: + QmlView *createView(const QString &filename); +}; + +void tst_QmlGraphicsMouseArea::dragProperties() +{ + QmlView *canvas = createView(SRCDIR "/data/dragproperties.qml"); + canvas->execute(); + canvas->show(); + canvas->setFocus(); + QVERIFY(canvas->rootObject() != 0); + + QmlGraphicsMouseArea *mouseRegion = canvas->rootObject()->findChild<QmlGraphicsMouseArea*>("mouseregion"); + QmlGraphicsDrag *drag = mouseRegion->drag(); + QVERIFY(mouseRegion != 0); + QVERIFY(drag != 0); + + // target + QmlGraphicsItem *blackRect = canvas->rootObject()->findChild<QmlGraphicsItem*>("blackrect"); + QVERIFY(blackRect != 0); + QVERIFY(blackRect == drag->target()); + QmlGraphicsItem *rootItem = qobject_cast<QmlGraphicsItem*>(canvas->rootObject()); + QVERIFY(rootItem != 0); + QSignalSpy targetSpy(drag, SIGNAL(targetChanged())); + drag->setTarget(rootItem); + QCOMPARE(targetSpy.count(),1); + drag->setTarget(rootItem); + QCOMPARE(targetSpy.count(),1); + + // axis + QCOMPARE(drag->axis(), QmlGraphicsDrag::XandYAxis); + QSignalSpy axisSpy(drag, SIGNAL(axisChanged())); + drag->setAxis(QmlGraphicsDrag::XAxis); + QCOMPARE(drag->axis(), QmlGraphicsDrag::XAxis); + QCOMPARE(axisSpy.count(),1); + drag->setAxis(QmlGraphicsDrag::XAxis); + QCOMPARE(axisSpy.count(),1); + + // minimum and maximum properties + QSignalSpy xminSpy(drag, SIGNAL(minimumXChanged())); + QSignalSpy xmaxSpy(drag, SIGNAL(maximumXChanged())); + QSignalSpy yminSpy(drag, SIGNAL(minimumYChanged())); + QSignalSpy ymaxSpy(drag, SIGNAL(maximumYChanged())); + + QCOMPARE(drag->xmin(), 0.0); + QCOMPARE(drag->xmax(), rootItem->width()-blackRect->width()); + QCOMPARE(drag->ymin(), 0.0); + QCOMPARE(drag->ymax(), rootItem->height()-blackRect->height()); + + drag->setXmin(10); + drag->setXmax(10); + drag->setYmin(10); + drag->setYmax(10); + + QCOMPARE(drag->xmin(), 10.0); + QCOMPARE(drag->xmax(), 10.0); + QCOMPARE(drag->ymin(), 10.0); + QCOMPARE(drag->ymax(), 10.0); + + QCOMPARE(xminSpy.count(),1); + QCOMPARE(xmaxSpy.count(),1); + QCOMPARE(yminSpy.count(),1); + QCOMPARE(ymaxSpy.count(),1); + + drag->setXmin(10); + drag->setXmax(10); + drag->setYmin(10); + drag->setYmax(10); + + QCOMPARE(xminSpy.count(),1); + QCOMPARE(xmaxSpy.count(),1); + QCOMPARE(yminSpy.count(),1); + QCOMPARE(ymaxSpy.count(),1); +} + +QmlView *tst_QmlGraphicsMouseArea::createView(const QString &filename) +{ + QmlView *canvas = new QmlView(0); + canvas->setFixedSize(240,320); + + canvas->setSource(QUrl::fromLocalFile(filename)); + + return canvas; +} + +QTEST_MAIN(tst_QmlGraphicsMouseArea) + +#include "tst_qmlgraphicsmousearea.moc" diff --git a/tests/auto/declarative/qmlgraphicsparticles/tst_qmlgraphicsparticles.cpp b/tests/auto/declarative/qmlgraphicsparticles/tst_qmlgraphicsparticles.cpp index 5458d68..a5c0b78 100644 --- a/tests/auto/declarative/qmlgraphicsparticles/tst_qmlgraphicsparticles.cpp +++ b/tests/auto/declarative/qmlgraphicsparticles/tst_qmlgraphicsparticles.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** @@ -63,8 +63,8 @@ tst_QmlGraphicsParticles::tst_QmlGraphicsParticles() void tst_QmlGraphicsParticles::properties() { QmlView *canvas = createView(SRCDIR "/data/particles.qml"); - QVERIFY(canvas->root()); - QmlGraphicsParticles* particles = canvas->root()->findChild<QmlGraphicsParticles*>("particles"); + QVERIFY(canvas->rootObject()); + QmlGraphicsParticles* particles = canvas->rootObject()->findChild<QmlGraphicsParticles*>("particles"); QVERIFY(particles); particles->setSource(QUrl::fromLocalFile(SRCDIR "/data/particle.png")); @@ -101,8 +101,8 @@ void tst_QmlGraphicsParticles::properties() void tst_QmlGraphicsParticles::runs() { QmlView *canvas = createView(SRCDIR "/data/particles.qml"); - QVERIFY(canvas->root()); - QmlGraphicsParticles* particles = canvas->root()->findChild<QmlGraphicsParticles*>("particles"); + QVERIFY(canvas->rootObject()); + QmlGraphicsParticles* particles = canvas->rootObject()->findChild<QmlGraphicsParticles*>("particles"); QVERIFY(particles); QTest::qWait(1000);//Run for one second. Test passes if it doesn't crash. } @@ -112,10 +112,7 @@ QmlView *tst_QmlGraphicsParticles::createView(const QString &filename) QmlView *canvas = new QmlView(0); canvas->setFixedSize(240,320); - QFile file(filename); - file.open(QFile::ReadOnly); - QString qml = file.readAll(); - canvas->setQml(qml, filename); + canvas->setSource(QUrl::fromLocalFile(filename)); canvas->execute(); return canvas; diff --git a/tests/auto/declarative/qmlgraphicspathview/tst_qmlgraphicspathview.cpp b/tests/auto/declarative/qmlgraphicspathview/tst_qmlgraphicspathview.cpp index 4c2ecbd..b986a64 100644 --- a/tests/auto/declarative/qmlgraphicspathview/tst_qmlgraphicspathview.cpp +++ b/tests/auto/declarative/qmlgraphicspathview/tst_qmlgraphicspathview.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** @@ -71,9 +71,9 @@ private slots: private: QmlView *createView(const QString &filename); template<typename T> - T *findItem(QmlGraphicsItem *parent, const QString &objectName, int index=-1); + T *findItem(QGraphicsObject *parent, const QString &objectName, int index=-1); template<typename T> - QList<T*> findItems(QmlGraphicsItem *parent, const QString &objectName); + QList<T*> findItems(QGraphicsObject *parent, const QString &objectName); }; class TestObject : public QObject @@ -204,7 +204,7 @@ void tst_QmlGraphicsPathView::items() canvas->execute(); qApp->processEvents(); - QmlGraphicsPathView *pathview = findItem<QmlGraphicsPathView>(canvas->root(), "view"); + QmlGraphicsPathView *pathview = findItem<QmlGraphicsPathView>(canvas->rootObject(), "view"); QVERIFY(pathview != 0); QCOMPARE(pathview->childItems().count(), model.count()); // assumes all are visible @@ -268,31 +268,31 @@ void tst_QmlGraphicsPathView::path() QCOMPARE(obj->startY(), 100.); QVERIFY(obj->path() != QPainterPath()); - QList<QmlGraphicsPathElement*> *list = obj->pathElements(); - QCOMPARE(list->count(), 5); + QmlListReference list(obj, "pathElements"); + QCOMPARE(list.count(), 5); - QmlGraphicsPathAttribute* attr = qobject_cast<QmlGraphicsPathAttribute*>(list->at(0)); + QmlGraphicsPathAttribute* attr = qobject_cast<QmlGraphicsPathAttribute*>(list.at(0)); QVERIFY(attr != 0); QCOMPARE(attr->name(), QString("scale")); QCOMPARE(attr->value(), 1.0); - QmlGraphicsPathQuad* quad = qobject_cast<QmlGraphicsPathQuad*>(list->at(1)); + QmlGraphicsPathQuad* quad = qobject_cast<QmlGraphicsPathQuad*>(list.at(1)); QVERIFY(quad != 0); QCOMPARE(quad->x(), 120.); QCOMPARE(quad->y(), 25.); QCOMPARE(quad->controlX(), 260.); QCOMPARE(quad->controlY(), 75.); - QmlGraphicsPathPercent* perc = qobject_cast<QmlGraphicsPathPercent*>(list->at(2)); + QmlGraphicsPathPercent* perc = qobject_cast<QmlGraphicsPathPercent*>(list.at(2)); QVERIFY(perc != 0); QCOMPARE(perc->value(), 0.3); - QmlGraphicsPathLine* line = qobject_cast<QmlGraphicsPathLine*>(list->at(3)); + QmlGraphicsPathLine* line = qobject_cast<QmlGraphicsPathLine*>(list.at(3)); QVERIFY(line != 0); QCOMPARE(line->x(), 120.); QCOMPARE(line->y(), 100.); - QmlGraphicsPathCubic* cubic = qobject_cast<QmlGraphicsPathCubic*>(list->at(4)); + QmlGraphicsPathCubic* cubic = qobject_cast<QmlGraphicsPathCubic*>(list.at(4)); QVERIFY(cubic != 0); QCOMPARE(cubic->x(), 180.); QCOMPARE(cubic->y(), 0.); @@ -326,10 +326,10 @@ void tst_QmlGraphicsPathView::dataModel() canvas->execute(); qApp->processEvents(); - QmlGraphicsPathView *pathview = qobject_cast<QmlGraphicsPathView*>(canvas->root()); + QmlGraphicsPathView *pathview = qobject_cast<QmlGraphicsPathView*>(canvas->rootObject()); QVERIFY(pathview != 0); - QMetaObject::invokeMethod(canvas->root(), "checkProperties"); + QMetaObject::invokeMethod(canvas->rootObject(), "checkProperties"); QVERIFY(testObject->error() == false); QmlGraphicsItem *item = findItem<QmlGraphicsItem>(pathview, "wrapper", 0); @@ -352,7 +352,7 @@ void tst_QmlGraphicsPathView::dataModel() QCOMPARE(text->text(), model.name(2)); testObject->setPathItemCount(5); - QMetaObject::invokeMethod(canvas->root(), "checkProperties"); + QMetaObject::invokeMethod(canvas->rootObject(), "checkProperties"); QVERIFY(testObject->error() == false); itemCount = findItems<QmlGraphicsItem>(pathview, "wrapper").count(); @@ -398,7 +398,7 @@ void tst_QmlGraphicsPathView::pathMoved() canvas->execute(); qApp->processEvents(); - QmlGraphicsPathView *pathview = findItem<QmlGraphicsPathView>(canvas->root(), "view"); + QmlGraphicsPathView *pathview = findItem<QmlGraphicsPathView>(canvas->rootObject(), "view"); QVERIFY(pathview != 0); QmlGraphicsRectangle *firstItem = findItem<QmlGraphicsRectangle>(pathview, "wrapper", 0); @@ -430,10 +430,7 @@ QmlView *tst_QmlGraphicsPathView::createView(const QString &filename) QmlView *canvas = new QmlView(0); canvas->setFixedSize(240,320); - QFile file(filename); - file.open(QFile::ReadOnly); - QString qml = file.readAll(); - canvas->setQml(qml, filename); + canvas->setSource(QUrl::fromLocalFile(filename)); return canvas; } @@ -443,7 +440,7 @@ QmlView *tst_QmlGraphicsPathView::createView(const QString &filename) item must also evaluate the {index} expression equal to index */ template<typename T> -T *tst_QmlGraphicsPathView::findItem(QmlGraphicsItem *parent, const QString &objectName, int index) +T *tst_QmlGraphicsPathView::findItem(QGraphicsObject *parent, const QString &objectName, int index) { const QMetaObject &mo = T::staticMetaObject; //qDebug() << parent->childItems().count() << "children"; @@ -471,7 +468,7 @@ T *tst_QmlGraphicsPathView::findItem(QmlGraphicsItem *parent, const QString &obj } template<typename T> -QList<T*> tst_QmlGraphicsPathView::findItems(QmlGraphicsItem *parent, const QString &objectName) +QList<T*> tst_QmlGraphicsPathView::findItems(QGraphicsObject *parent, const QString &objectName) { QList<T*> items; const QMetaObject &mo = T::staticMetaObject; diff --git a/tests/auto/declarative/qmlgraphicspositioners/data/grid-animated.qml b/tests/auto/declarative/qmlgraphicspositioners/data/grid-animated.qml index 022019c..f6376a1 100644 --- a/tests/auto/declarative/qmlgraphicspositioners/data/grid-animated.qml +++ b/tests/auto/declarative/qmlgraphicspositioners/data/grid-animated.qml @@ -7,12 +7,12 @@ Item { columns: 3 add: Transition { NumberAnimation { - matchProperties: "x,y"; + properties: "x,y"; } } move: Transition { NumberAnimation { - matchProperties: "x,y"; + properties: "x,y"; } } Rectangle { diff --git a/tests/auto/declarative/qmlgraphicspositioners/data/horizontal-animated.qml b/tests/auto/declarative/qmlgraphicspositioners/data/horizontal-animated.qml index eba165c..c113a36 100644 --- a/tests/auto/declarative/qmlgraphicspositioners/data/horizontal-animated.qml +++ b/tests/auto/declarative/qmlgraphicspositioners/data/horizontal-animated.qml @@ -6,12 +6,12 @@ Item { Row { add: Transition { NumberAnimation { - matchProperties: "x"; + properties: "x"; } } move: Transition { NumberAnimation { - matchProperties: "x"; + properties: "x"; } } Rectangle { diff --git a/tests/auto/declarative/qmlgraphicspositioners/data/vertical-animated.qml b/tests/auto/declarative/qmlgraphicspositioners/data/vertical-animated.qml index 8e3abbd..10f6cbb 100644 --- a/tests/auto/declarative/qmlgraphicspositioners/data/vertical-animated.qml +++ b/tests/auto/declarative/qmlgraphicspositioners/data/vertical-animated.qml @@ -6,12 +6,12 @@ Item { Column { add: Transition { NumberAnimation { - matchProperties: "y"; + properties: "y"; } } move: Transition { NumberAnimation { - matchProperties: "y"; + properties: "y"; } } Rectangle { diff --git a/tests/auto/declarative/qmlgraphicspositioners/tst_qmlgraphicspositioners.cpp b/tests/auto/declarative/qmlgraphicspositioners/tst_qmlgraphicspositioners.cpp index 42d6da9..b51266a 100644 --- a/tests/auto/declarative/qmlgraphicspositioners/tst_qmlgraphicspositioners.cpp +++ b/tests/auto/declarative/qmlgraphicspositioners/tst_qmlgraphicspositioners.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** @@ -77,13 +77,13 @@ void tst_QmlGraphicsPositioners::test_horizontal() canvas->execute(); - QmlGraphicsRectangle *one = canvas->root()->findChild<QmlGraphicsRectangle*>("one"); + QmlGraphicsRectangle *one = canvas->rootObject()->findChild<QmlGraphicsRectangle*>("one"); QVERIFY(one != 0); - QmlGraphicsRectangle *two = canvas->root()->findChild<QmlGraphicsRectangle*>("two"); + QmlGraphicsRectangle *two = canvas->rootObject()->findChild<QmlGraphicsRectangle*>("two"); QVERIFY(two != 0); - QmlGraphicsRectangle *three = canvas->root()->findChild<QmlGraphicsRectangle*>("three"); + QmlGraphicsRectangle *three = canvas->rootObject()->findChild<QmlGraphicsRectangle*>("three"); QVERIFY(three != 0); QCOMPARE(one->x(), 0.0); @@ -100,13 +100,13 @@ void tst_QmlGraphicsPositioners::test_horizontal_spacing() canvas->execute(); - QmlGraphicsRectangle *one = canvas->root()->findChild<QmlGraphicsRectangle*>("one"); + QmlGraphicsRectangle *one = canvas->rootObject()->findChild<QmlGraphicsRectangle*>("one"); QVERIFY(one != 0); - QmlGraphicsRectangle *two = canvas->root()->findChild<QmlGraphicsRectangle*>("two"); + QmlGraphicsRectangle *two = canvas->rootObject()->findChild<QmlGraphicsRectangle*>("two"); QVERIFY(two != 0); - QmlGraphicsRectangle *three = canvas->root()->findChild<QmlGraphicsRectangle*>("three"); + QmlGraphicsRectangle *three = canvas->rootObject()->findChild<QmlGraphicsRectangle*>("three"); QVERIFY(three != 0); QCOMPARE(one->x(), 0.0); @@ -123,13 +123,13 @@ void tst_QmlGraphicsPositioners::test_horizontal_animated() canvas->execute(); - QmlGraphicsRectangle *one = canvas->root()->findChild<QmlGraphicsRectangle*>("one"); + QmlGraphicsRectangle *one = canvas->rootObject()->findChild<QmlGraphicsRectangle*>("one"); QVERIFY(one != 0); - QmlGraphicsRectangle *two = canvas->root()->findChild<QmlGraphicsRectangle*>("two"); + QmlGraphicsRectangle *two = canvas->rootObject()->findChild<QmlGraphicsRectangle*>("two"); QVERIFY(two != 0); - QmlGraphicsRectangle *three = canvas->root()->findChild<QmlGraphicsRectangle*>("three"); + QmlGraphicsRectangle *three = canvas->rootObject()->findChild<QmlGraphicsRectangle*>("three"); QVERIFY(three != 0); //Note that they animate in @@ -165,13 +165,13 @@ void tst_QmlGraphicsPositioners::test_vertical() canvas->execute(); - QmlGraphicsRectangle *one = canvas->root()->findChild<QmlGraphicsRectangle*>("one"); + QmlGraphicsRectangle *one = canvas->rootObject()->findChild<QmlGraphicsRectangle*>("one"); QVERIFY(one != 0); - QmlGraphicsRectangle *two = canvas->root()->findChild<QmlGraphicsRectangle*>("two"); + QmlGraphicsRectangle *two = canvas->rootObject()->findChild<QmlGraphicsRectangle*>("two"); QVERIFY(two != 0); - QmlGraphicsRectangle *three = canvas->root()->findChild<QmlGraphicsRectangle*>("three"); + QmlGraphicsRectangle *three = canvas->rootObject()->findChild<QmlGraphicsRectangle*>("three"); QVERIFY(three != 0); QCOMPARE(one->x(), 0.0); @@ -188,13 +188,13 @@ void tst_QmlGraphicsPositioners::test_vertical_spacing() canvas->execute(); - QmlGraphicsRectangle *one = canvas->root()->findChild<QmlGraphicsRectangle*>("one"); + QmlGraphicsRectangle *one = canvas->rootObject()->findChild<QmlGraphicsRectangle*>("one"); QVERIFY(one != 0); - QmlGraphicsRectangle *two = canvas->root()->findChild<QmlGraphicsRectangle*>("two"); + QmlGraphicsRectangle *two = canvas->rootObject()->findChild<QmlGraphicsRectangle*>("two"); QVERIFY(two != 0); - QmlGraphicsRectangle *three = canvas->root()->findChild<QmlGraphicsRectangle*>("three"); + QmlGraphicsRectangle *three = canvas->rootObject()->findChild<QmlGraphicsRectangle*>("three"); QVERIFY(three != 0); QCOMPARE(one->x(), 0.0); @@ -212,15 +212,15 @@ void tst_QmlGraphicsPositioners::test_vertical_animated() canvas->execute(); //Note that they animate in - QmlGraphicsRectangle *one = canvas->root()->findChild<QmlGraphicsRectangle*>("one"); + QmlGraphicsRectangle *one = canvas->rootObject()->findChild<QmlGraphicsRectangle*>("one"); QVERIFY(one != 0); QCOMPARE(one->y(), -100.0); - QmlGraphicsRectangle *two = canvas->root()->findChild<QmlGraphicsRectangle*>("two"); + QmlGraphicsRectangle *two = canvas->rootObject()->findChild<QmlGraphicsRectangle*>("two"); QVERIFY(two != 0); QCOMPARE(two->y(), -100.0); - QmlGraphicsRectangle *three = canvas->root()->findChild<QmlGraphicsRectangle*>("three"); + QmlGraphicsRectangle *three = canvas->rootObject()->findChild<QmlGraphicsRectangle*>("three"); QVERIFY(three != 0); QCOMPARE(three->y(), -100.0); @@ -253,15 +253,15 @@ void tst_QmlGraphicsPositioners::test_grid() canvas->execute(); - QmlGraphicsRectangle *one = canvas->root()->findChild<QmlGraphicsRectangle*>("one"); + QmlGraphicsRectangle *one = canvas->rootObject()->findChild<QmlGraphicsRectangle*>("one"); QVERIFY(one != 0); - QmlGraphicsRectangle *two = canvas->root()->findChild<QmlGraphicsRectangle*>("two"); + QmlGraphicsRectangle *two = canvas->rootObject()->findChild<QmlGraphicsRectangle*>("two"); QVERIFY(two != 0); - QmlGraphicsRectangle *three = canvas->root()->findChild<QmlGraphicsRectangle*>("three"); + QmlGraphicsRectangle *three = canvas->rootObject()->findChild<QmlGraphicsRectangle*>("three"); QVERIFY(three != 0); - QmlGraphicsRectangle *four = canvas->root()->findChild<QmlGraphicsRectangle*>("four"); + QmlGraphicsRectangle *four = canvas->rootObject()->findChild<QmlGraphicsRectangle*>("four"); QVERIFY(four != 0); - QmlGraphicsRectangle *five = canvas->root()->findChild<QmlGraphicsRectangle*>("five"); + QmlGraphicsRectangle *five = canvas->rootObject()->findChild<QmlGraphicsRectangle*>("five"); QVERIFY(five != 0); QCOMPARE(one->x(), 0.0); @@ -282,15 +282,15 @@ void tst_QmlGraphicsPositioners::test_grid_spacing() canvas->execute(); - QmlGraphicsRectangle *one = canvas->root()->findChild<QmlGraphicsRectangle*>("one"); + QmlGraphicsRectangle *one = canvas->rootObject()->findChild<QmlGraphicsRectangle*>("one"); QVERIFY(one != 0); - QmlGraphicsRectangle *two = canvas->root()->findChild<QmlGraphicsRectangle*>("two"); + QmlGraphicsRectangle *two = canvas->rootObject()->findChild<QmlGraphicsRectangle*>("two"); QVERIFY(two != 0); - QmlGraphicsRectangle *three = canvas->root()->findChild<QmlGraphicsRectangle*>("three"); + QmlGraphicsRectangle *three = canvas->rootObject()->findChild<QmlGraphicsRectangle*>("three"); QVERIFY(three != 0); - QmlGraphicsRectangle *four = canvas->root()->findChild<QmlGraphicsRectangle*>("four"); + QmlGraphicsRectangle *four = canvas->rootObject()->findChild<QmlGraphicsRectangle*>("four"); QVERIFY(four != 0); - QmlGraphicsRectangle *five = canvas->root()->findChild<QmlGraphicsRectangle*>("five"); + QmlGraphicsRectangle *five = canvas->rootObject()->findChild<QmlGraphicsRectangle*>("five"); QVERIFY(five != 0); QCOMPARE(one->x(), 0.0); @@ -311,27 +311,27 @@ void tst_QmlGraphicsPositioners::test_grid_animated() canvas->execute(); //Note that all animate in - QmlGraphicsRectangle *one = canvas->root()->findChild<QmlGraphicsRectangle*>("one"); + QmlGraphicsRectangle *one = canvas->rootObject()->findChild<QmlGraphicsRectangle*>("one"); QVERIFY(one != 0); QCOMPARE(one->x(), -100.0); QCOMPARE(one->y(), -100.0); - QmlGraphicsRectangle *two = canvas->root()->findChild<QmlGraphicsRectangle*>("two"); + QmlGraphicsRectangle *two = canvas->rootObject()->findChild<QmlGraphicsRectangle*>("two"); QVERIFY(two != 0); QCOMPARE(two->x(), -100.0); QCOMPARE(two->y(), -100.0); - QmlGraphicsRectangle *three = canvas->root()->findChild<QmlGraphicsRectangle*>("three"); + QmlGraphicsRectangle *three = canvas->rootObject()->findChild<QmlGraphicsRectangle*>("three"); QVERIFY(three != 0); QCOMPARE(three->x(), -100.0); QCOMPARE(three->y(), -100.0); - QmlGraphicsRectangle *four = canvas->root()->findChild<QmlGraphicsRectangle*>("four"); + QmlGraphicsRectangle *four = canvas->rootObject()->findChild<QmlGraphicsRectangle*>("four"); QVERIFY(four != 0); QCOMPARE(four->x(), -100.0); QCOMPARE(four->y(), -100.0); - QmlGraphicsRectangle *five = canvas->root()->findChild<QmlGraphicsRectangle*>("five"); + QmlGraphicsRectangle *five = canvas->rootObject()->findChild<QmlGraphicsRectangle*>("five"); QVERIFY(five != 0); QCOMPARE(five->x(), -100.0); QCOMPARE(five->y(), -100.0); @@ -385,13 +385,13 @@ void tst_QmlGraphicsPositioners::test_repeater() canvas->execute(); - QmlGraphicsRectangle *one = canvas->root()->findChild<QmlGraphicsRectangle*>("one"); + QmlGraphicsRectangle *one = canvas->rootObject()->findChild<QmlGraphicsRectangle*>("one"); QVERIFY(one != 0); - QmlGraphicsRectangle *two = canvas->root()->findChild<QmlGraphicsRectangle*>("two"); + QmlGraphicsRectangle *two = canvas->rootObject()->findChild<QmlGraphicsRectangle*>("two"); QVERIFY(two != 0); - QmlGraphicsRectangle *three = canvas->root()->findChild<QmlGraphicsRectangle*>("three"); + QmlGraphicsRectangle *three = canvas->rootObject()->findChild<QmlGraphicsRectangle*>("three"); QVERIFY(three != 0); QCOMPARE(one->x(), 0.0); @@ -406,10 +406,7 @@ QmlView *tst_QmlGraphicsPositioners::createView(const QString &filename) { QmlView *canvas = new QmlView(0); - QFile file(filename); - file.open(QFile::ReadOnly); - QString xml = file.readAll(); - canvas->setQml(xml, filename); + canvas->setSource(QUrl::fromLocalFile(filename)); return canvas; } diff --git a/tests/auto/declarative/qmlgraphicsrepeater/data/properties.qml b/tests/auto/declarative/qmlgraphicsrepeater/data/properties.qml new file mode 100644 index 0000000..550ce8d --- /dev/null +++ b/tests/auto/declarative/qmlgraphicsrepeater/data/properties.qml @@ -0,0 +1,11 @@ +import Qt 4.6 + +Row { + Repeater { + objectName: "repeater" + model: 5 + Text { + text: "I'm item " + index + } + } +}
\ No newline at end of file diff --git a/tests/auto/declarative/qmlgraphicsrepeater/tst_qmlgraphicsrepeater.cpp b/tests/auto/declarative/qmlgraphicsrepeater/tst_qmlgraphicsrepeater.cpp index 4297901..c971840 100644 --- a/tests/auto/declarative/qmlgraphicsrepeater/tst_qmlgraphicsrepeater.cpp +++ b/tests/auto/declarative/qmlgraphicsrepeater/tst_qmlgraphicsrepeater.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** @@ -38,12 +38,20 @@ ** $QT_END_LICENSE$ ** ****************************************************************************/ + #include <QtTest/QtTest> +#include <QtTest/QSignalSpy> #include <private/qlistmodelinterface_p.h> -#include <qmlview.h> +#include <QtDeclarative/qmlengine.h> +#include <QtDeclarative/qmlview.h> +#include <QtDeclarative/qmlcontext.h> #include <private/qmlgraphicsrepeater_p.h> #include <private/qmlgraphicstext_p.h> -#include <qmlcontext.h> + +inline QUrl TEST_FILE(const QString &filename) +{ + return QUrl::fromLocalFile(QLatin1String(SRCDIR) + QLatin1String("/data/") + filename); +} class tst_QmlGraphicsRepeater : public QObject { @@ -57,11 +65,12 @@ private slots: void stringList(); void dataModel(); void itemModel(); + void properties(); private: QmlView *createView(const QString &filename); template<typename T> - T *findItem(QmlGraphicsItem *parent, const QString &id); + T *findItem(QGraphicsObject *parent, const QString &id); }; class TestObject : public QObject @@ -165,11 +174,11 @@ void tst_QmlGraphicsRepeater::numberModel() canvas->execute(); qApp->processEvents(); - QmlGraphicsRepeater *repeater = findItem<QmlGraphicsRepeater>(canvas->root(), "repeater"); + QmlGraphicsRepeater *repeater = findItem<QmlGraphicsRepeater>(canvas->rootObject(), "repeater"); QVERIFY(repeater != 0); QCOMPARE(repeater->parentItem()->childItems().count(), 5+1); - QMetaObject::invokeMethod(canvas->root(), "checkProperties"); + QMetaObject::invokeMethod(canvas->rootObject(), "checkProperties"); QVERIFY(testObject->error() == false); delete canvas; @@ -179,19 +188,19 @@ void tst_QmlGraphicsRepeater::objectList() { QmlView *canvas = createView(SRCDIR "/data/objlist.qml"); - QObjectList* data = new QObjectList; + QObjectList data; for(int i=0; i<100; i++){ - *data << new QObject(); - data->back()->setProperty("idx", i); + data << new QObject(); + data.back()->setProperty("idx", i); } QmlContext *ctxt = canvas->rootContext(); - ctxt->setContextProperty("testData", QVariant::fromValue<QObjectList*>(data)); + ctxt->setContextProperty("testData", QVariant::fromValue(data)); canvas->execute(); qApp->processEvents(); - QmlGraphicsRepeater *repeater = findItem<QmlGraphicsRepeater>(canvas->root(), "repeater"); + QmlGraphicsRepeater *repeater = findItem<QmlGraphicsRepeater>(canvas->rootObject(), "repeater"); QVERIFY(repeater != 0); QCOMPARE(repeater->property("errors").toInt(), 0);//If this fails either they are out of order or can't find the object's data QCOMPARE(repeater->property("instantiated").toInt(), 100); @@ -218,10 +227,10 @@ void tst_QmlGraphicsRepeater::stringList() canvas->execute(); qApp->processEvents(); - QmlGraphicsRepeater *repeater = findItem<QmlGraphicsRepeater>(canvas->root(), "repeater"); + QmlGraphicsRepeater *repeater = findItem<QmlGraphicsRepeater>(canvas->rootObject(), "repeater"); QVERIFY(repeater != 0); - QmlGraphicsItem *container = findItem<QmlGraphicsItem>(canvas->root(), "container"); + QmlGraphicsItem *container = findItem<QmlGraphicsItem>(canvas->rootObject(), "container"); QVERIFY(container != 0); QCOMPARE(container->childItems().count(), data.count() + 3); @@ -271,10 +280,10 @@ void tst_QmlGraphicsRepeater::dataModel() canvas->execute(); qApp->processEvents(); - QmlGraphicsRepeater *repeater = findItem<QmlGraphicsRepeater>(canvas->root(), "repeater"); + QmlGraphicsRepeater *repeater = findItem<QmlGraphicsRepeater>(canvas->rootObject(), "repeater"); QVERIFY(repeater != 0); - QmlGraphicsItem *container = findItem<QmlGraphicsItem>(canvas->root(), "container"); + QmlGraphicsItem *container = findItem<QmlGraphicsItem>(canvas->rootObject(), "container"); QVERIFY(container != 0); QCOMPARE(container->childItems().count(), 4); @@ -296,16 +305,16 @@ void tst_QmlGraphicsRepeater::itemModel() canvas->execute(); qApp->processEvents(); - QmlGraphicsRepeater *repeater = findItem<QmlGraphicsRepeater>(canvas->root(), "repeater"); + QmlGraphicsRepeater *repeater = findItem<QmlGraphicsRepeater>(canvas->rootObject(), "repeater"); QVERIFY(repeater != 0); - QmlGraphicsItem *container = findItem<QmlGraphicsItem>(canvas->root(), "container"); + QmlGraphicsItem *container = findItem<QmlGraphicsItem>(canvas->rootObject(), "container"); QVERIFY(container != 0); QCOMPARE(container->childItems().count(), 1); testObject->setUseModel(true); - QMetaObject::invokeMethod(canvas->root(), "checkProperties"); + QMetaObject::invokeMethod(canvas->rootObject(), "checkProperties"); QVERIFY(testObject->error() == false); QCOMPARE(container->childItems().count(), 4); @@ -317,22 +326,46 @@ void tst_QmlGraphicsRepeater::itemModel() delete canvas; } +void tst_QmlGraphicsRepeater::properties() +{ + QmlEngine engine; + QmlComponent component(&engine, TEST_FILE("/properties.qml")); + + QmlGraphicsItem *rootObject = qobject_cast<QmlGraphicsItem*>(component.create()); + QVERIFY(rootObject); + + QmlGraphicsRepeater *repeater = findItem<QmlGraphicsRepeater>(rootObject, "repeater"); + QVERIFY(repeater); + + QSignalSpy modelSpy(repeater, SIGNAL(modelChanged())); + repeater->setModel(3); + QCOMPARE(modelSpy.count(),1); + repeater->setModel(3); + QCOMPARE(modelSpy.count(),1); + + QSignalSpy delegateSpy(repeater, SIGNAL(delegateChanged())); + + QmlComponent rectComponent(&engine); + rectComponent.setData("import Qt 4.6; Rectangle {}", QUrl::fromLocalFile("")); + + repeater->setDelegate(&rectComponent); + QCOMPARE(delegateSpy.count(),1); + repeater->setDelegate(&rectComponent); + QCOMPARE(delegateSpy.count(),1); +} QmlView *tst_QmlGraphicsRepeater::createView(const QString &filename) { QmlView *canvas = new QmlView(0); canvas->setFixedSize(240,320); - QFile file(filename); - file.open(QFile::ReadOnly); - QString qml = file.readAll(); - canvas->setQml(qml, filename); + canvas->setSource(QUrl::fromLocalFile(filename)); return canvas; } template<typename T> -T *tst_QmlGraphicsRepeater::findItem(QmlGraphicsItem *parent, const QString &objectName) +T *tst_QmlGraphicsRepeater::findItem(QGraphicsObject *parent, const QString &objectName) { const QMetaObject &mo = T::staticMetaObject; if (mo.cast(parent) && (objectName.isEmpty() || parent->objectName() == objectName)) diff --git a/tests/auto/declarative/qmlgraphicstext/tst_qmlgraphicstext.cpp b/tests/auto/declarative/qmlgraphicstext/tst_qmlgraphicstext.cpp index 4626fe6..2c1e09b 100644 --- a/tests/auto/declarative/qmlgraphicstext/tst_qmlgraphicstext.cpp +++ b/tests/auto/declarative/qmlgraphicstext/tst_qmlgraphicstext.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** diff --git a/tests/auto/declarative/qmlgraphicstextedit/tst_qmlgraphicstextedit.cpp b/tests/auto/declarative/qmlgraphicstextedit/tst_qmlgraphicstextedit.cpp index a197ced..cc2f929 100644 --- a/tests/auto/declarative/qmlgraphicstextedit/tst_qmlgraphicstextedit.cpp +++ b/tests/auto/declarative/qmlgraphicstextedit/tst_qmlgraphicstextedit.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** @@ -608,8 +608,8 @@ void tst_qmlgraphicstextedit::inputMethodHints() canvas->show(); canvas->setFocus(); - QVERIFY(canvas->root() != 0); - QmlGraphicsTextEdit *textEditObject = qobject_cast<QmlGraphicsTextEdit *>(canvas->root()); + QVERIFY(canvas->rootObject() != 0); + QmlGraphicsTextEdit *textEditObject = qobject_cast<QmlGraphicsTextEdit *>(canvas->rootObject()); QVERIFY(textEditObject != 0); QVERIFY(textEditObject->inputMethodHints() & Qt::ImhNoPredictiveText); textEditObject->setInputMethodHints(Qt::ImhUppercaseOnly); @@ -622,7 +622,7 @@ void tst_qmlgraphicstextedit::cursorDelegate() view->execute(); view->show(); view->setFocus(); - QmlGraphicsTextEdit *textEditObject = view->root()->findChild<QmlGraphicsTextEdit*>("textEditObject"); + QmlGraphicsTextEdit *textEditObject = view->rootObject()->findChild<QmlGraphicsTextEdit*>("textEditObject"); QVERIFY(textEditObject != 0); QVERIFY(textEditObject->findChild<QmlGraphicsItem*>("cursorInstance")); //Test Delegate gets created @@ -650,40 +650,34 @@ void tst_qmlgraphicstextedit::delegateLoading() server.serveDirectory(SRCDIR "/data/httpslow", TestHTTPServer::Delay); server.serveDirectory(SRCDIR "/data/http"); QmlView* view = new QmlView(0); - view->setUrl(QUrl("http://localhost:42332/cursorHttpTestPass.qml")); + view->setSource(QUrl("http://localhost:42332/cursorHttpTestPass.qml")); view->execute(); view->show(); view->setFocus(); - QTRY_VERIFY(view->root());//Wait for loading to finish. - QmlGraphicsTextEdit *textEditObject = view->root()->findChild<QmlGraphicsTextEdit*>("textEditObject"); - // view->root()->dumpObjectTree(); + QTRY_VERIFY(view->rootObject());//Wait for loading to finish. + QmlGraphicsTextEdit *textEditObject = view->rootObject()->findChild<QmlGraphicsTextEdit*>("textEditObject"); + // view->rootObject()->dumpObjectTree(); QVERIFY(textEditObject != 0); textEditObject->setFocus(true); QmlGraphicsItem *delegate; - delegate = view->root()->findChild<QmlGraphicsItem*>("delegateOkay"); + delegate = view->rootObject()->findChild<QmlGraphicsItem*>("delegateOkay"); QVERIFY(delegate); - delegate = view->root()->findChild<QmlGraphicsItem*>("delegateSlow"); + delegate = view->rootObject()->findChild<QmlGraphicsItem*>("delegateSlow"); QVERIFY(delegate); - view->setUrl(QUrl("http://localhost:42332/cursorHttpTestFail1.qml")); + view->setSource(QUrl("http://localhost:42332/cursorHttpTestFail1.qml")); view->execute(); view->show(); view->setFocus(); - delegate = view->root()->findChild<QmlGraphicsItem*>("delegateOkay"); - QVERIFY(delegate); - delegate = view->root()->findChild<QmlGraphicsItem*>("delegateFail"); - QVERIFY(!delegate); - view->setUrl(QUrl("http://localhost:42332/cursorHttpTestFail2.qml")); + QTRY_VERIFY(!view->rootObject()); // there is fail item inside this test + view->setSource(QUrl("http://localhost:42332/cursorHttpTestFail2.qml")); view->execute(); view->show(); view->setFocus(); - delegate = view->root()->findChild<QmlGraphicsItem*>("delegateOkay"); - QVERIFY(delegate); - delegate = view->root()->findChild<QmlGraphicsItem*>("delegateErrorA"); - QVERIFY(!delegate); + QTRY_VERIFY(!view->rootObject()); // there is fail item inside this test //ErrorB should get a component which is ready but component.create() returns null //Not sure how to accomplish this with QmlGraphicsTextEdits cursor delegate //###This could be a case of overzealous defensive programming - //delegate = view->root()->findChild<QmlGraphicsItem*>("delegateErrorB"); + //delegate = view->rootObject()->findChild<QmlGraphicsItem*>("delegateErrorB"); //QVERIFY(!delegate); } @@ -698,9 +692,9 @@ void tst_qmlgraphicstextedit::navigation() canvas->show(); canvas->setFocus(); - QVERIFY(canvas->root() != 0); + QVERIFY(canvas->rootObject() != 0); - QmlGraphicsItem *input = qobject_cast<QmlGraphicsItem *>(qvariant_cast<QObject *>(canvas->root()->property("myInput"))); + QmlGraphicsItem *input = qobject_cast<QmlGraphicsItem *>(qvariant_cast<QObject *>(canvas->rootObject()->property("myInput"))); QVERIFY(input != 0); QTRY_VERIFY(input->hasFocus() == true); @@ -721,9 +715,9 @@ void tst_qmlgraphicstextedit::readOnly() canvas->show(); canvas->setFocus(); - QVERIFY(canvas->root() != 0); + QVERIFY(canvas->rootObject() != 0); - QmlGraphicsTextEdit *edit = qobject_cast<QmlGraphicsTextEdit *>(qvariant_cast<QObject *>(canvas->root()->property("myInput"))); + QmlGraphicsTextEdit *edit = qobject_cast<QmlGraphicsTextEdit *>(qvariant_cast<QObject *>(canvas->rootObject()->property("myInput"))); QVERIFY(edit != 0); QTRY_VERIFY(edit->hasFocus() == true); @@ -750,10 +744,7 @@ QmlView *tst_qmlgraphicstextedit::createView(const QString &filename) { QmlView *canvas = new QmlView(0); - QFile file(filename); - file.open(QFile::ReadOnly); - QString xml = file.readAll(); - canvas->setQml(xml, filename); + canvas->setSource(QUrl::fromLocalFile(filename)); return canvas; } diff --git a/tests/auto/declarative/qmlgraphicstextinput/tst_qmlgraphicstextinput.cpp b/tests/auto/declarative/qmlgraphicstextinput/tst_qmlgraphicstextinput.cpp index b7ae4a2..8b45fc7 100644 --- a/tests/auto/declarative/qmlgraphicstextinput/tst_qmlgraphicstextinput.cpp +++ b/tests/auto/declarative/qmlgraphicstextinput/tst_qmlgraphicstextinput.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** @@ -352,8 +352,8 @@ void tst_qmlgraphicstextinput::maxLength() canvas->execute(); canvas->show(); canvas->setFocus(); - QVERIFY(canvas->root() != 0); - QmlGraphicsTextInput *textinputObject = qobject_cast<QmlGraphicsTextInput *>(canvas->root()); + QVERIFY(canvas->rootObject() != 0); + QmlGraphicsTextInput *textinputObject = qobject_cast<QmlGraphicsTextInput *>(canvas->rootObject()); QVERIFY(textinputObject != 0); QVERIFY(textinputObject->text().isEmpty()); QVERIFY(textinputObject->maxLength() == 10); @@ -381,8 +381,8 @@ void tst_qmlgraphicstextinput::masks() canvas->execute(); canvas->show(); canvas->setFocus(); - QVERIFY(canvas->root() != 0); - QmlGraphicsTextInput *textinputObject = qobject_cast<QmlGraphicsTextInput *>(canvas->root()); + QVERIFY(canvas->rootObject() != 0); + QmlGraphicsTextInput *textinputObject = qobject_cast<QmlGraphicsTextInput *>(canvas->rootObject()); QVERIFY(textinputObject != 0); QTRY_VERIFY(textinputObject->hasFocus() == true); QVERIFY(textinputObject->text().length() == 0); @@ -407,9 +407,9 @@ void tst_qmlgraphicstextinput::validators() canvas->show(); canvas->setFocus(); - QVERIFY(canvas->root() != 0); + QVERIFY(canvas->rootObject() != 0); - QmlGraphicsTextInput *intInput = qobject_cast<QmlGraphicsTextInput *>(qvariant_cast<QObject *>(canvas->root()->property("intInput"))); + QmlGraphicsTextInput *intInput = qobject_cast<QmlGraphicsTextInput *>(qvariant_cast<QObject *>(canvas->rootObject()->property("intInput"))); QVERIFY(intInput); intInput->setFocus(true); QTRY_VERIFY(intInput->hasFocus()); @@ -430,7 +430,7 @@ void tst_qmlgraphicstextinput::validators() QCOMPARE(intInput->text(), QLatin1String("11")); QCOMPARE(intInput->hasAcceptableInput(), true); - QmlGraphicsTextInput *dblInput = qobject_cast<QmlGraphicsTextInput *>(qvariant_cast<QObject *>(canvas->root()->property("dblInput"))); + QmlGraphicsTextInput *dblInput = qobject_cast<QmlGraphicsTextInput *>(qvariant_cast<QObject *>(canvas->rootObject()->property("dblInput"))); QTRY_VERIFY(dblInput); dblInput->setFocus(true); QVERIFY(dblInput->hasFocus() == true); @@ -459,7 +459,7 @@ void tst_qmlgraphicstextinput::validators() QCOMPARE(dblInput->text(), QLatin1String("12.11")); QCOMPARE(dblInput->hasAcceptableInput(), true); - QmlGraphicsTextInput *strInput = qobject_cast<QmlGraphicsTextInput *>(qvariant_cast<QObject *>(canvas->root()->property("strInput"))); + QmlGraphicsTextInput *strInput = qobject_cast<QmlGraphicsTextInput *>(qvariant_cast<QObject *>(canvas->rootObject()->property("strInput"))); QTRY_VERIFY(strInput); strInput->setFocus(true); QVERIFY(strInput->hasFocus() == true); @@ -497,8 +497,8 @@ void tst_qmlgraphicstextinput::inputMethodHints() canvas->show(); canvas->setFocus(); - QVERIFY(canvas->root() != 0); - QmlGraphicsTextInput *textinputObject = qobject_cast<QmlGraphicsTextInput *>(canvas->root()); + QVERIFY(canvas->rootObject() != 0); + QmlGraphicsTextInput *textinputObject = qobject_cast<QmlGraphicsTextInput *>(canvas->rootObject()); QVERIFY(textinputObject != 0); QVERIFY(textinputObject->inputMethodHints() & Qt::ImhNoPredictiveText); textinputObject->setInputMethodHints(Qt::ImhUppercaseOnly); @@ -517,9 +517,9 @@ void tst_qmlgraphicstextinput::navigation() canvas->show(); canvas->setFocus(); - QVERIFY(canvas->root() != 0); + QVERIFY(canvas->rootObject() != 0); - QmlGraphicsTextInput *input = qobject_cast<QmlGraphicsTextInput *>(qvariant_cast<QObject *>(canvas->root()->property("myInput"))); + QmlGraphicsTextInput *input = qobject_cast<QmlGraphicsTextInput *>(qvariant_cast<QObject *>(canvas->rootObject()->property("myInput"))); QVERIFY(input != 0); input->setCursorPosition(0); @@ -549,7 +549,7 @@ void tst_qmlgraphicstextinput::cursorDelegate() view->execute(); view->show(); view->setFocus(); - QmlGraphicsTextInput *textInputObject = view->root()->findChild<QmlGraphicsTextInput*>("textInputObject"); + QmlGraphicsTextInput *textInputObject = view->rootObject()->findChild<QmlGraphicsTextInput*>("textInputObject"); QVERIFY(textInputObject != 0); QVERIFY(textInputObject->findChild<QmlGraphicsItem*>("cursorInstance")); //Test Delegate gets created @@ -578,9 +578,9 @@ void tst_qmlgraphicstextinput::readOnly() canvas->show(); canvas->setFocus(); - QVERIFY(canvas->root() != 0); + QVERIFY(canvas->rootObject() != 0); - QmlGraphicsTextInput *input = qobject_cast<QmlGraphicsTextInput *>(qvariant_cast<QObject *>(canvas->root()->property("myInput"))); + QmlGraphicsTextInput *input = qobject_cast<QmlGraphicsTextInput *>(qvariant_cast<QObject *>(canvas->rootObject()->property("myInput"))); QVERIFY(input != 0); QTRY_VERIFY(input->hasFocus() == true); @@ -607,10 +607,7 @@ QmlView *tst_qmlgraphicstextinput::createView(const QString &filename) { QmlView *canvas = new QmlView(0); - QFile file(filename); - file.open(QFile::ReadOnly); - QString xml = file.readAll(); - canvas->setQml(xml, filename); + canvas->setSource(QUrl::fromLocalFile(filename)); return canvas; } diff --git a/tests/auto/declarative/qmlgraphicswebview/testtypes.cpp b/tests/auto/declarative/qmlgraphicswebview/testtypes.cpp index e21f286..00c1b67 100644 --- a/tests/auto/declarative/qmlgraphicswebview/testtypes.cpp +++ b/tests/auto/declarative/qmlgraphicswebview/testtypes.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** diff --git a/tests/auto/declarative/qmlgraphicswebview/testtypes.h b/tests/auto/declarative/qmlgraphicswebview/testtypes.h index 7ab7c78..0b3176d 100644 --- a/tests/auto/declarative/qmlgraphicswebview/testtypes.h +++ b/tests/auto/declarative/qmlgraphicswebview/testtypes.h @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** diff --git a/tests/auto/declarative/qmlgraphicswebview/tst_qmlgraphicswebview.cpp b/tests/auto/declarative/qmlgraphicswebview/tst_qmlgraphicswebview.cpp index d48f11d..f3c39f8 100644 --- a/tests/auto/declarative/qmlgraphicswebview/tst_qmlgraphicswebview.cpp +++ b/tests/auto/declarative/qmlgraphicswebview/tst_qmlgraphicswebview.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** diff --git a/tests/auto/declarative/qmlimageprovider/tst_qmlimageprovider.cpp b/tests/auto/declarative/qmlimageprovider/tst_qmlimageprovider.cpp index 475cb7a..d07558a 100644 --- a/tests/auto/declarative/qmlimageprovider/tst_qmlimageprovider.cpp +++ b/tests/auto/declarative/qmlimageprovider/tst_qmlimageprovider.cpp @@ -44,11 +44,13 @@ #include <QtDeclarative/qmlimageprovider.h> #include <private/qmlgraphicsimage_p.h> +// QmlImageProvider::request() is run in an idle thread where possible +// Be generous in our timeout. #define TRY_WAIT(expr) \ do { \ - for (int ii = 0; ii < 6; ++ii) { \ + for (int ii = 0; ii < 10; ++ii) { \ if ((expr)) break; \ - QTest::qWait(50); \ + QTest::qWait(100); \ } \ QVERIFY((expr)); \ } while (false) diff --git a/tests/auto/declarative/qmlinfo/tst_qmlinfo.cpp b/tests/auto/declarative/qmlinfo/tst_qmlinfo.cpp index 880f7b8..e4da993 100644 --- a/tests/auto/declarative/qmlinfo/tst_qmlinfo.cpp +++ b/tests/auto/declarative/qmlinfo/tst_qmlinfo.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** diff --git a/tests/auto/declarative/qmlinstruction/tst_qmlinstruction.cpp b/tests/auto/declarative/qmlinstruction/tst_qmlinstruction.cpp index ea99a9e..38d024a 100644 --- a/tests/auto/declarative/qmlinstruction/tst_qmlinstruction.cpp +++ b/tests/auto/declarative/qmlinstruction/tst_qmlinstruction.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** @@ -421,13 +421,6 @@ void tst_qmlinstruction::dump() { QmlInstruction i; - i.line = 37; - i.type = QmlInstruction::StoreObjectQmlList; - data->bytecode << i; - } - - { - QmlInstruction i; i.line = 38; i.type = QmlInstruction::StoreObjectQList; data->bytecode << i; @@ -450,15 +443,6 @@ void tst_qmlinstruction::dump() { QmlInstruction i; - i.line = 41; - i.type = QmlInstruction::FetchQmlList; - i.fetchQmlList.property = 31; - i.fetchQmlList.type = 3; - data->bytecode << i; - } - - { - QmlInstruction i; i.line = 42; i.type = QmlInstruction::FetchQList; i.fetch.property = 32; @@ -569,20 +553,18 @@ void tst_qmlinstruction::dump() << "34\t\t34\tSTORE_VALUE_SOURCE\t29\t4" << "35\t\t35\tSTORE_VALUE_INTERCEPTOR\t30\t-4" << "36\t\t36\tBEGIN\t\t\t4" - << "37\t\t37\tSTORE_OBJECT_QMLLIST" - << "38\t\t38\tSTORE_OBJECT_QLIST" - << "39\t\t39\tASSIGN_OBJECT_LIST" - << "40\t\t40\tFETCH_ATTACHED\t\t23" - << "41\t\t41\tFETCH_QMLLIST\t\t31\t3" - << "42\t\t42\tFETCH_QLIST\t\t32" - << "43\t\t43\tFETCH\t\t\t33" - << "44\t\t44\tFETCH_VALUE\t\t34\t6" - << "45\t\t45\tPOP" - << "46\t\t46\tPOP_QLIST" - << "47\t\t47\tPOP_VALUE\t\t35\t8" - << "48\t\t48\tDEFER\t\t\t7" - << "49\t\tNA\tDEFER\t\t\t7" - << "50\t\t50\tXXX UNKOWN INSTRUCTION\t49" + << "37\t\t38\tSTORE_OBJECT_QLIST" + << "38\t\t39\tASSIGN_OBJECT_LIST" + << "39\t\t40\tFETCH_ATTACHED\t\t23" + << "40\t\t42\tFETCH_QLIST\t\t32" + << "41\t\t43\tFETCH\t\t\t33" + << "42\t\t44\tFETCH_VALUE\t\t34\t6" + << "43\t\t45\tPOP" + << "44\t\t46\tPOP_QLIST" + << "45\t\t47\tPOP_VALUE\t\t35\t8" + << "46\t\t48\tDEFER\t\t\t7" + << "47\t\tNA\tDEFER\t\t\t7" + << "48\t\t50\tXXX UNKOWN INSTRUCTION\t47" << "-------------------------------------------------------------------------------"; messages = QStringList(); diff --git a/tests/auto/declarative/qmllanguage/data/interfaceQmlList.qml b/tests/auto/declarative/qmllanguage/data/interfaceQmlList.qml deleted file mode 100644 index 8392bea..0000000 --- a/tests/auto/declarative/qmllanguage/data/interfaceQmlList.qml +++ /dev/null @@ -1,7 +0,0 @@ -import Test 1.0 -MyContainer { - qmllistInterfaces: [ - MyQmlObject {}, - MyQmlObject {} - ] -} diff --git a/tests/auto/declarative/qmllanguage/data/invalidAttachedProperty.1.errors.txt b/tests/auto/declarative/qmllanguage/data/invalidAttachedProperty.1.errors.txt index 68fe671..492bbb4 100644 --- a/tests/auto/declarative/qmllanguage/data/invalidAttachedProperty.1.errors.txt +++ b/tests/auto/declarative/qmllanguage/data/invalidAttachedProperty.1.errors.txt @@ -1 +1 @@ -5:17:Cannot assign to non-existant property "foo" +5:17:Cannot assign to non-existent property "foo" diff --git a/tests/auto/declarative/qmllanguage/data/invalidAttachedProperty.10.errors.txt b/tests/auto/declarative/qmllanguage/data/invalidAttachedProperty.10.errors.txt index 7f630f4..ff2409b 100644 --- a/tests/auto/declarative/qmllanguage/data/invalidAttachedProperty.10.errors.txt +++ b/tests/auto/declarative/qmllanguage/data/invalidAttachedProperty.10.errors.txt @@ -1 +1 @@ -5:15:Non-existant attached object +5:15:Non-existent attached object diff --git a/tests/auto/declarative/qmllanguage/data/invalidAttachedProperty.2.errors.txt b/tests/auto/declarative/qmllanguage/data/invalidAttachedProperty.2.errors.txt index 9f06e07..34de769 100644 --- a/tests/auto/declarative/qmllanguage/data/invalidAttachedProperty.2.errors.txt +++ b/tests/auto/declarative/qmllanguage/data/invalidAttachedProperty.2.errors.txt @@ -1 +1 @@ -5:27:Cannot assign to non-existant property "foo" +5:27:Cannot assign to non-existent property "foo" diff --git a/tests/auto/declarative/qmllanguage/data/invalidAttachedProperty.6.errors.txt b/tests/auto/declarative/qmllanguage/data/invalidAttachedProperty.6.errors.txt index e232b23..6770e1f 100644 --- a/tests/auto/declarative/qmllanguage/data/invalidAttachedProperty.6.errors.txt +++ b/tests/auto/declarative/qmllanguage/data/invalidAttachedProperty.6.errors.txt @@ -1 +1 @@ -5:5:Non-existant attached object +5:5:Non-existent attached object diff --git a/tests/auto/declarative/qmllanguage/data/invalidAttachedProperty.7.errors.txt b/tests/auto/declarative/qmllanguage/data/invalidAttachedProperty.7.errors.txt index e232b23..6770e1f 100644 --- a/tests/auto/declarative/qmllanguage/data/invalidAttachedProperty.7.errors.txt +++ b/tests/auto/declarative/qmllanguage/data/invalidAttachedProperty.7.errors.txt @@ -1 +1 @@ -5:5:Non-existant attached object +5:5:Non-existent attached object diff --git a/tests/auto/declarative/qmllanguage/data/invalidAttachedProperty.8.errors.txt b/tests/auto/declarative/qmllanguage/data/invalidAttachedProperty.8.errors.txt index 7f630f4..ff2409b 100644 --- a/tests/auto/declarative/qmllanguage/data/invalidAttachedProperty.8.errors.txt +++ b/tests/auto/declarative/qmllanguage/data/invalidAttachedProperty.8.errors.txt @@ -1 +1 @@ -5:15:Non-existant attached object +5:15:Non-existent attached object diff --git a/tests/auto/declarative/qmllanguage/data/invalidAttachedProperty.9.errors.txt b/tests/auto/declarative/qmllanguage/data/invalidAttachedProperty.9.errors.txt index e232b23..6770e1f 100644 --- a/tests/auto/declarative/qmllanguage/data/invalidAttachedProperty.9.errors.txt +++ b/tests/auto/declarative/qmllanguage/data/invalidAttachedProperty.9.errors.txt @@ -1 +1 @@ -5:5:Non-existant attached object +5:5:Non-existent attached object diff --git a/tests/auto/declarative/qmllanguage/data/invalidGroupedProperty.4.errors.txt b/tests/auto/declarative/qmllanguage/data/invalidGroupedProperty.4.errors.txt index 19934fa..69c6871 100644 --- a/tests/auto/declarative/qmllanguage/data/invalidGroupedProperty.4.errors.txt +++ b/tests/auto/declarative/qmllanguage/data/invalidGroupedProperty.4.errors.txt @@ -1 +1 @@ -4:5:Cannot assign to non-existant property "foo" +4:5:Cannot assign to non-existent property "foo" diff --git a/tests/auto/declarative/qmllanguage/data/listAssignment.1.errors.txt b/tests/auto/declarative/qmllanguage/data/listAssignment.1.errors.txt deleted file mode 100644 index d68d487..0000000 --- a/tests/auto/declarative/qmllanguage/data/listAssignment.1.errors.txt +++ /dev/null @@ -1 +0,0 @@ -3:24:Cannot assign primitives to lists diff --git a/tests/auto/declarative/qmllanguage/data/listAssignment.1.qml b/tests/auto/declarative/qmllanguage/data/listAssignment.1.qml deleted file mode 100644 index 4240425..0000000 --- a/tests/auto/declarative/qmllanguage/data/listAssignment.1.qml +++ /dev/null @@ -1,4 +0,0 @@ -import Test 1.0 -MyContainer { - qmllistInterfaces: 1 -} diff --git a/tests/auto/declarative/qmllanguage/data/listItemDeleteSelf.qml b/tests/auto/declarative/qmllanguage/data/listItemDeleteSelf.qml index 779c6d4..32b5b6c 100644 --- a/tests/auto/declarative/qmllanguage/data/listItemDeleteSelf.qml +++ b/tests/auto/declarative/qmllanguage/data/listItemDeleteSelf.qml @@ -23,7 +23,7 @@ Item { width: 200; height: 50 Text { text: name } Text { text: '$'+cost; anchors.right: parent.right } - MouseRegion { + MouseArea { anchors.fill: parent onClicked: fruitModel.remove(index) } diff --git a/tests/auto/declarative/qmllanguage/data/missingSignal.errors.txt b/tests/auto/declarative/qmllanguage/data/missingSignal.errors.txt index e243ae5..f562246 100644 --- a/tests/auto/declarative/qmllanguage/data/missingSignal.errors.txt +++ b/tests/auto/declarative/qmllanguage/data/missingSignal.errors.txt @@ -1 +1 @@ -4:5:Cannot assign to non-existant property "onClicked" +4:5:Cannot assign to non-existent property "onClicked" diff --git a/tests/auto/declarative/qmllanguage/data/missingValueTypeProperty.errors.txt b/tests/auto/declarative/qmllanguage/data/missingValueTypeProperty.errors.txt index dfaa218..caf7e55 100644 --- a/tests/auto/declarative/qmllanguage/data/missingValueTypeProperty.errors.txt +++ b/tests/auto/declarative/qmllanguage/data/missingValueTypeProperty.errors.txt @@ -1 +1 @@ -4:18:Cannot assign to non-existant property "foo" +4:18:Cannot assign to non-existent property "foo" diff --git a/tests/auto/declarative/qmllanguage/data/nonexistantProperty.1.errors.txt b/tests/auto/declarative/qmllanguage/data/nonexistantProperty.1.errors.txt index cfc6fc8..6bfce9a 100644 --- a/tests/auto/declarative/qmllanguage/data/nonexistantProperty.1.errors.txt +++ b/tests/auto/declarative/qmllanguage/data/nonexistantProperty.1.errors.txt @@ -1 +1 @@ -2:15:Cannot assign to non-existant property "something" +2:15:Cannot assign to non-existent property "something" diff --git a/tests/auto/declarative/qmllanguage/data/nonexistantProperty.2.errors.txt b/tests/auto/declarative/qmllanguage/data/nonexistantProperty.2.errors.txt index 8b13585..4b30056 100644 --- a/tests/auto/declarative/qmllanguage/data/nonexistantProperty.2.errors.txt +++ b/tests/auto/declarative/qmllanguage/data/nonexistantProperty.2.errors.txt @@ -1 +1 @@ -3:5:Cannot assign to non-existant property "something" +3:5:Cannot assign to non-existent property "something" diff --git a/tests/auto/declarative/qmllanguage/data/nonexistantProperty.3.errors.txt b/tests/auto/declarative/qmllanguage/data/nonexistantProperty.3.errors.txt index 8b13585..4b30056 100644 --- a/tests/auto/declarative/qmllanguage/data/nonexistantProperty.3.errors.txt +++ b/tests/auto/declarative/qmllanguage/data/nonexistantProperty.3.errors.txt @@ -1 +1 @@ -3:5:Cannot assign to non-existant property "something" +3:5:Cannot assign to non-existent property "something" diff --git a/tests/auto/declarative/qmllanguage/data/nonexistantProperty.4.errors.txt b/tests/auto/declarative/qmllanguage/data/nonexistantProperty.4.errors.txt index 8b13585..4b30056 100644 --- a/tests/auto/declarative/qmllanguage/data/nonexistantProperty.4.errors.txt +++ b/tests/auto/declarative/qmllanguage/data/nonexistantProperty.4.errors.txt @@ -1 +1 @@ -3:5:Cannot assign to non-existant property "something" +3:5:Cannot assign to non-existent property "something" diff --git a/tests/auto/declarative/qmllanguage/data/nonexistantProperty.6.errors.txt b/tests/auto/declarative/qmllanguage/data/nonexistantProperty.6.errors.txt index c02d7bd..89925b7 100644 --- a/tests/auto/declarative/qmllanguage/data/nonexistantProperty.6.errors.txt +++ b/tests/auto/declarative/qmllanguage/data/nonexistantProperty.6.errors.txt @@ -1 +1 @@ -3:5:Cannot assign to non-existant default property +3:5:Cannot assign to non-existent default property diff --git a/tests/auto/declarative/qmllanguage/testtypes.cpp b/tests/auto/declarative/qmllanguage/testtypes.cpp index f30f47e..a295054 100644 --- a/tests/auto/declarative/qmllanguage/testtypes.cpp +++ b/tests/auto/declarative/qmllanguage/testtypes.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** diff --git a/tests/auto/declarative/qmllanguage/testtypes.h b/tests/auto/declarative/qmllanguage/testtypes.h index 6cd4cb5..27b45e4 100644 --- a/tests/auto/declarative/qmllanguage/testtypes.h +++ b/tests/auto/declarative/qmllanguage/testtypes.h @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** @@ -449,7 +449,6 @@ class MyContainer : public QObject Q_OBJECT Q_PROPERTY(QmlListProperty<QObject> children READ children) Q_PROPERTY(QmlListProperty<MyInterface> qlistInterfaces READ qlistInterfaces) - Q_PROPERTY(QmlList<MyInterface*>* qmllistInterfaces READ qmllistInterfaces) Q_CLASSINFO("DefaultProperty", "children"); public: MyContainer() {} @@ -458,12 +457,9 @@ public: QList<QObject *> *getChildren() { return &m_children; } QmlListProperty<MyInterface> qlistInterfaces() { return QmlListProperty<MyInterface>(this, m_interfaces); } QList<MyInterface *> *getQListInterfaces() { return &m_interfaces; } - QmlList<MyInterface *> *qmllistInterfaces() { return &m_qmlinterfaces; } - const QmlConcreteList<MyInterface *> &qmllistAccessor() const { return m_qmlinterfaces; } QList<QObject*> m_children; QList<MyInterface *> m_interfaces; - QmlConcreteList<MyInterface *> m_qmlinterfaces; }; QML_DECLARE_TYPE(MyContainer); @@ -535,12 +531,12 @@ namespace MyNamespace { class MySecondNamespacedType : public QObject { Q_OBJECT - Q_PROPERTY(QmlList<MyNamespace::MyNamespacedType *> *list READ list); + Q_PROPERTY(QmlListProperty<MyNamespace::MyNamespacedType> list READ list); public: - QmlList<MyNamespacedType *> *list() { return &m_list; } + QmlListProperty<MyNamespacedType> list() { return QmlListProperty<MyNamespacedType>(this, m_list); } private: - QmlConcreteList<MyNamespacedType *> m_list; + QList<MyNamespacedType *> m_list; }; } QML_DECLARE_TYPE(MyNamespace::MyNamespacedType); diff --git a/tests/auto/declarative/qmllanguage/tst_qmllanguage.cpp b/tests/auto/declarative/qmllanguage/tst_qmllanguage.cpp index 1e68f5a..4090e1d 100644 --- a/tests/auto/declarative/qmllanguage/tst_qmllanguage.cpp +++ b/tests/auto/declarative/qmllanguage/tst_qmllanguage.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** @@ -76,7 +76,6 @@ private slots: void simpleObject(); void simpleContainer(); void interfaceProperty(); - void interfaceQmlList(); void interfaceQList(); void assignObjectToSignal(); void assignObjectToVariant(); @@ -233,7 +232,6 @@ void tst_qmllanguage::errors_data() QTest::newRow("readOnly.2") << "readOnly.2.qml" << "readOnly.2.errors.txt" << false; QTest::newRow("readOnly.3") << "readOnly.3.qml" << "readOnly.3.errors.txt" << false; - QTest::newRow("listAssignment.1") << "listAssignment.1.qml" << "listAssignment.1.errors.txt" << false; QTest::newRow("listAssignment.2") << "listAssignment.2.qml" << "listAssignment.2.errors.txt" << false; QTest::newRow("listAssignment.3") << "listAssignment.3.qml" << "listAssignment.3.errors.txt" << false; @@ -367,17 +365,6 @@ void tst_qmllanguage::interfaceProperty() QVERIFY(object->interface()->id == 913); } -void tst_qmllanguage::interfaceQmlList() -{ - QmlComponent component(&engine, TEST_FILE("interfaceQmlList.qml")); - VERIFY_ERRORS(0); - MyContainer *container= qobject_cast<MyContainer*>(component.create()); - QVERIFY(container != 0); - QVERIFY(container->qmllistAccessor().count() == 2); - for(int ii = 0; ii < 2; ++ii) - QVERIFY(container->qmllistAccessor().at(ii)->id == 913); -} - void tst_qmllanguage::interfaceQList() { QmlComponent component(&engine, TEST_FILE("interfaceQList.qml")); diff --git a/tests/auto/declarative/qmllist/tst_qmllist.cpp b/tests/auto/declarative/qmllist/tst_qmllist.cpp deleted file mode 100644 index c59ff1d..0000000 --- a/tests/auto/declarative/qmllist/tst_qmllist.cpp +++ /dev/null @@ -1,78 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (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 Technology Preview License Agreement accompanying -** this package. -** -** 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.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** If you have questions regarding the use of this file, please contact -** Nokia at qt-info@nokia.com. -** -** -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#include <qtest.h> -#include <QtDeclarative/qml.h> -#include <QtDeclarative/qmlprivate.h> - -class tst_QmlList : public QObject -{ - Q_OBJECT -public: - tst_QmlList() {} - -private slots: - void interface(); -}; - -void tst_QmlList::interface() -{ - QmlConcreteList<QObject*> list; - QObject *obj = new QObject; - obj->setObjectName("foo"); - list.append(obj); - QVERIFY(list.count() == 1); - QCOMPARE(list.at(0), obj); - - QmlPrivate::ListInterface *li = (QmlPrivate::ListInterface*)&list; - - void *ptr[1]; - li->at(0, ptr); - QVERIFY(li->count() == 1); - QCOMPARE(ptr[0], obj); - - li->removeAt(0); - QVERIFY(li->count() == 0); - QVERIFY(list.count() == 0); -} - -QTEST_MAIN(tst_QmlList) - -#include "tst_qmllist.moc" diff --git a/tests/auto/declarative/qmllistaccessor/qmllistaccessor.pro b/tests/auto/declarative/qmllistaccessor/qmllistaccessor.pro deleted file mode 100644 index ce2915e..0000000 --- a/tests/auto/declarative/qmllistaccessor/qmllistaccessor.pro +++ /dev/null @@ -1,5 +0,0 @@ -load(qttest_p4) -contains(QT_CONFIG,declarative): QT += declarative -macx:CONFIG -= app_bundle - -SOURCES += tst_qmllistaccessor.cpp diff --git a/tests/auto/declarative/qmllistaccessor/tst_qmllistaccessor.cpp b/tests/auto/declarative/qmllistaccessor/tst_qmllistaccessor.cpp deleted file mode 100644 index 9bf47b6..0000000 --- a/tests/auto/declarative/qmllistaccessor/tst_qmllistaccessor.cpp +++ /dev/null @@ -1,452 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (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 Technology Preview License Agreement accompanying -** this package. -** -** 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.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** If you have questions regarding the use of this file, please contact -** Nokia at qt-info@nokia.com. -** -** -** -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#include <qtest.h> -#include <QtDeclarative/qml.h> -#include <private/qmllistaccessor_p.h> -#include <QDebug> - -class tst_QmlListAccessor : public QObject -{ - Q_OBJECT -public: - tst_QmlListAccessor() {} - -private slots: - void invalid(); - void qmllist(); - void listproperty(); - void qstringlist(); - void qvariantlist(); - void qobject(); - void instance(); - void integer(); -}; - -void tst_QmlListAccessor::invalid() -{ - QmlListAccessor accessor; - - QCOMPARE(accessor.list(), QVariant()); - QVERIFY(!accessor.isValid()); - QCOMPARE(accessor.type(), QmlListAccessor::Invalid); - - QCOMPARE(accessor.count(), 0); - QVERIFY(!accessor.append(QVariant(10))); - QVERIFY(!accessor.insert(0, QVariant(10))); - QVERIFY(!accessor.removeAt(0)); - QVERIFY(!accessor.clear()); - - accessor.setList(QVariant()); - - QCOMPARE(accessor.list(), QVariant()); - QVERIFY(!accessor.isValid()); - QCOMPARE(accessor.type(), QmlListAccessor::Invalid); - - QCOMPARE(accessor.count(), 0); - QVERIFY(!accessor.append(QVariant(10))); - QVERIFY(!accessor.insert(0, QVariant(10))); - QVERIFY(!accessor.removeAt(0)); - QVERIFY(!accessor.clear()); -} - -void tst_QmlListAccessor::qmllist() -{ - QmlConcreteList<QObject*> list; - QObject *obj = new QObject(this); - QObject *obj2 = new QObject(this); - QObject *obj3 = new QObject(this); - - list.append(obj); - QVERIFY(list.count() == 1); - QCOMPARE(list.at(0), obj); - - QmlListAccessor accessor; - accessor.setList(qVariantFromValue((QmlList<QObject*>*)&list)); - QCOMPARE(accessor.list(), qVariantFromValue((QmlList<QObject*>*)&list)); - - // type - QCOMPARE(accessor.type(), QmlListAccessor::QmlList); - - // isValid - QVERIFY(accessor.isValid()); - - // count - QCOMPARE(accessor.count(), 1); - - // at - QCOMPARE(qvariant_cast<QObject*>(accessor.at(0)), obj); - - // append - accessor.append(qVariantFromValue(obj2)); - QVERIFY(accessor.isValid()); - QCOMPARE(accessor.count(), 2); - QCOMPARE(qvariant_cast<QObject*>(accessor.at(1)), obj2); - QCOMPARE(list.count(), 2); - QCOMPARE(list.at(0), obj); - QCOMPARE(list.at(1), obj2); - - // insert - accessor.insert(1, qVariantFromValue(obj3)); - QVERIFY(accessor.isValid()); - QCOMPARE(accessor.count(), 3); - QCOMPARE(qvariant_cast<QObject*>(accessor.at(1)), obj3); - QCOMPARE(list.count(), 3); - QCOMPARE(list.at(0), obj); - QCOMPARE(list.at(1), obj3); - QCOMPARE(list.at(2), obj2); - - // removeAt - accessor.removeAt(1); - QVERIFY(accessor.isValid()); - QCOMPARE(accessor.count(), 2); - QCOMPARE(qvariant_cast<QObject*>(accessor.at(1)), obj2); - QCOMPARE(list.count(), 2); - QCOMPARE(list.at(0), obj); - QCOMPARE(list.at(1), obj2); - - // clear - accessor.clear(); - QVERIFY(accessor.isValid()); - QCOMPARE(accessor.count(), 0); - QCOMPARE(list.count(), 0); -} - -void tst_QmlListAccessor::listproperty() -{ - QList<QObject*> list; - QObject *obj = new QObject(this); - QObject *obj2 = new QObject(this); - QObject *obj3 = new QObject(this); - - list.append(obj); - QVERIFY(list.count() == 1); - QCOMPARE(list.at(0), obj); - - QmlListAccessor accessor; - accessor.setList(qVariantFromValue(QmlListProperty<QObject>(this, list))); - QVERIFY(qvariant_cast<QmlListProperty<QObject> >(accessor.list()) == QmlListProperty<QObject>(this, list)); - - // type - QCOMPARE(accessor.type(), QmlListAccessor::ListProperty); - - // isValid - QVERIFY(accessor.isValid()); - - // count - QCOMPARE(accessor.count(), 1); - - // at - QCOMPARE(qvariant_cast<QObject*>(accessor.at(0)), obj); - - // append - accessor.append(qVariantFromValue(obj2)); - QVERIFY(accessor.isValid()); - QCOMPARE(accessor.count(), 2); - QCOMPARE(qvariant_cast<QObject*>(accessor.at(1)), obj2); - QCOMPARE(list.count(), 2); - QCOMPARE(list.at(0), obj); - QCOMPARE(list.at(1), obj2); - - // insert - accessor.insert(1, qVariantFromValue(obj3)); - QVERIFY(accessor.isValid()); - QCOMPARE(accessor.count(), 3); - QCOMPARE(qvariant_cast<QObject*>(accessor.at(1)), obj3); - QCOMPARE(list.count(), 3); - QCOMPARE(list.at(0), obj); - QCOMPARE(list.at(1), obj3); - QCOMPARE(list.at(2), obj2); - - // removeAt - accessor.removeAt(1); - QVERIFY(accessor.isValid()); - QCOMPARE(accessor.count(), 2); - QCOMPARE(qvariant_cast<QObject*>(accessor.at(1)), obj2); - QCOMPARE(list.count(), 2); - QCOMPARE(list.at(0), obj); - QCOMPARE(list.at(1), obj2); - - // clear - accessor.clear(); - QVERIFY(accessor.isValid()); - QCOMPARE(accessor.count(), 0); - QCOMPARE(list.count(), 0); -} - -void tst_QmlListAccessor::qstringlist() -{ - QStringList list; - list.append(QLatin1String("Item1")); - list.append(QLatin1String("Item2")); - QVERIFY(list.count() == 2); - - QmlListAccessor accessor; - accessor.setList(list); - - // type - QCOMPARE(accessor.type(), QmlListAccessor::StringList); - - // isValid - QVERIFY(accessor.isValid()); - - // count - QVERIFY(accessor.count() == 2); - - // at - QCOMPARE(qvariant_cast<QString>(accessor.at(0)), QLatin1String("Item1")); - QCOMPARE(qvariant_cast<QString>(accessor.at(1)), QLatin1String("Item2")); - - // append - QVERIFY(!accessor.append(QVariant("Item3"))); - QVERIFY(accessor.isValid()); - QVERIFY(accessor.count() == 2); - QCOMPARE(qvariant_cast<QString>(accessor.at(0)), QLatin1String("Item1")); - QCOMPARE(qvariant_cast<QString>(accessor.at(1)), QLatin1String("Item2")); - - // insert - QVERIFY(!accessor.insert(1, QVariant("MiddleItem"))); - QVERIFY(accessor.isValid()); - QVERIFY(accessor.count() == 2); - QCOMPARE(qvariant_cast<QString>(accessor.at(0)), QLatin1String("Item1")); - QCOMPARE(qvariant_cast<QString>(accessor.at(1)), QLatin1String("Item2")); - - // removeAt - QVERIFY(!accessor.removeAt(1)); - QVERIFY(accessor.isValid()); - QVERIFY(accessor.count() == 2); - QCOMPARE(qvariant_cast<QString>(accessor.at(0)), QLatin1String("Item1")); - QCOMPARE(qvariant_cast<QString>(accessor.at(1)), QLatin1String("Item2")); - - // clear - QVERIFY(!accessor.clear()); - QVERIFY(accessor.isValid()); - QVERIFY(accessor.count() == 2); - QCOMPARE(qvariant_cast<QString>(accessor.at(0)), QLatin1String("Item1")); - QCOMPARE(qvariant_cast<QString>(accessor.at(1)), QLatin1String("Item2")); -} - -void tst_QmlListAccessor::qvariantlist() -{ - QVariantList list; - list.append(QLatin1String("Item1")); - list.append(QLatin1String("Item2")); - QVERIFY(list.count() == 2); - - QmlListAccessor accessor; - accessor.setList(list); - - // type - QCOMPARE(accessor.type(), QmlListAccessor::VariantList); - - // isValid - QVERIFY(accessor.isValid()); - - // count - QVERIFY(accessor.count() == 2); - - // at - QCOMPARE(qvariant_cast<QString>(accessor.at(0)), QLatin1String("Item1")); - QCOMPARE(qvariant_cast<QString>(accessor.at(1)), QLatin1String("Item2")); - - // append - QVERIFY(!accessor.append(QVariant("Item3"))); - QVERIFY(accessor.isValid()); - QVERIFY(accessor.count() == 2); - QCOMPARE(qvariant_cast<QString>(accessor.at(0)), QLatin1String("Item1")); - QCOMPARE(qvariant_cast<QString>(accessor.at(1)), QLatin1String("Item2")); - - // insert - QVERIFY(!accessor.insert(1, QVariant("MiddleItem"))); - QVERIFY(accessor.isValid()); - QVERIFY(accessor.count() == 2); - QCOMPARE(qvariant_cast<QString>(accessor.at(0)), QLatin1String("Item1")); - QCOMPARE(qvariant_cast<QString>(accessor.at(1)), QLatin1String("Item2")); - - // removeAt - QVERIFY(!accessor.removeAt(1)); - QVERIFY(accessor.isValid()); - QVERIFY(accessor.count() == 2); - QCOMPARE(qvariant_cast<QString>(accessor.at(0)), QLatin1String("Item1")); - QCOMPARE(qvariant_cast<QString>(accessor.at(1)), QLatin1String("Item2")); - - // clear - QVERIFY(!accessor.clear()); - QVERIFY(accessor.isValid()); - QVERIFY(accessor.count() == 2); - QCOMPARE(qvariant_cast<QString>(accessor.at(0)), QLatin1String("Item1")); - QCOMPARE(qvariant_cast<QString>(accessor.at(1)), QLatin1String("Item2")); -} - -void tst_QmlListAccessor::qobject() -{ - QObject *obj = new QObject(this); - - QmlListAccessor accessor; - accessor.setList(qVariantFromValue(obj)); - - // type - QCOMPARE(accessor.type(), QmlListAccessor::Instance); - - // isValid - QVERIFY(accessor.isValid()); - - // count - QVERIFY(accessor.count() == 1); - - // at - QCOMPARE(accessor.at(0), qVariantFromValue(obj)); - - // append - QVERIFY(!accessor.append(qVariantFromValue((QObject *)0))); - QVERIFY(accessor.isValid()); - QVERIFY(accessor.count() == 1); - QCOMPARE(accessor.at(0), qVariantFromValue(obj)); - - // insert - QVERIFY(!accessor.insert(0, qVariantFromValue((QObject *)0))); - QVERIFY(accessor.isValid()); - QVERIFY(accessor.count() == 1); - QCOMPARE(accessor.at(0), qVariantFromValue(obj)); - - // removeAt - QVERIFY(!accessor.removeAt(0)); - QVERIFY(accessor.isValid()); - QVERIFY(accessor.count() == 1); - QCOMPARE(accessor.at(0), qVariantFromValue(obj)); - - // clear - QVERIFY(!accessor.clear()); - QVERIFY(accessor.isValid()); - QVERIFY(accessor.count() == 1); - QCOMPARE(accessor.at(0), qVariantFromValue(obj)); -} - -void tst_QmlListAccessor::instance() -{ - QRect r; - - QmlListAccessor accessor; - accessor.setList(r); - - // type - QCOMPARE(accessor.type(), QmlListAccessor::Instance); - - // isValid - QVERIFY(accessor.isValid()); - - // count - QVERIFY(accessor.count() == 1); - - // at - QCOMPARE(accessor.at(0), qVariantFromValue(r)); - - // append - QVERIFY(!accessor.append(qVariantFromValue(r))); - QVERIFY(accessor.isValid()); - QVERIFY(accessor.count() == 1); - QCOMPARE(accessor.at(0), qVariantFromValue(r)); - - // insert - QVERIFY(!accessor.insert(0, qVariantFromValue(r))); - QVERIFY(accessor.isValid()); - QVERIFY(accessor.count() == 1); - QCOMPARE(accessor.at(0), qVariantFromValue(r)); - - // removeAt - QVERIFY(!accessor.removeAt(0)); - QVERIFY(accessor.isValid()); - QVERIFY(accessor.count() == 1); - QCOMPARE(accessor.at(0), qVariantFromValue(r)); - - // clear - QVERIFY(!accessor.clear()); - QVERIFY(accessor.isValid()); - QVERIFY(accessor.count() == 1); - QCOMPARE(accessor.at(0), qVariantFromValue(r)); -} - -void tst_QmlListAccessor::integer() -{ - int r = 13; - - QmlListAccessor accessor; - accessor.setList(r); - - // type - QCOMPARE(accessor.type(), QmlListAccessor::Integer); - - // isValid - QVERIFY(accessor.isValid()); - - // count - QVERIFY(accessor.count() == 13); - - // at - QCOMPARE(accessor.at(4), qVariantFromValue(4)); - - // append - QVERIFY(!accessor.append(qVariantFromValue(r))); - QVERIFY(accessor.isValid()); - QVERIFY(accessor.count() == 13); - QCOMPARE(accessor.at(4), qVariantFromValue(4)); - - // insert - QVERIFY(!accessor.insert(0, qVariantFromValue(r))); - QVERIFY(accessor.isValid()); - QVERIFY(accessor.count() == 13); - QCOMPARE(accessor.at(4), qVariantFromValue(4)); - - // removeAt - QVERIFY(!accessor.removeAt(0)); - QVERIFY(accessor.isValid()); - QVERIFY(accessor.count() == 13); - QCOMPARE(accessor.at(4), qVariantFromValue(4)); - - // clear - QVERIFY(!accessor.clear()); - QVERIFY(accessor.isValid()); - QVERIFY(accessor.count() == 13); - QCOMPARE(accessor.at(4), qVariantFromValue(4)); -} - -QTEST_MAIN(tst_QmlListAccessor) - -#include "tst_qmllistaccessor.moc" diff --git a/tests/auto/declarative/qmllistmodel/tst_qmllistmodel.cpp b/tests/auto/declarative/qmllistmodel/tst_qmllistmodel.cpp index 9d072dd..8513a3b 100644 --- a/tests/auto/declarative/qmllistmodel/tst_qmllistmodel.cpp +++ b/tests/auto/declarative/qmllistmodel/tst_qmllistmodel.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** @@ -51,6 +51,8 @@ public: tst_QmlListModel() {} private slots: + void static_types(); + void static_types_data(); void static_i18n(); void static_nestedElements(); void static_nestedElements_data(); @@ -223,6 +225,67 @@ void tst_QmlListModel::dynamic() QCOMPARE(actual,result); } +void tst_QmlListModel::static_types_data() +{ + QTest::addColumn<QString>("qml"); + QTest::addColumn<QVariant>("value"); + + QTest::newRow("string") + << "ListElement { foo: \"bar\" }" + << QVariant(QString("bar")); + + QTest::newRow("real") + << "ListElement { foo: 10.5 }" + << QVariant(10.5); + + QTest::newRow("real0") + << "ListElement { foo: 0 }" + << QVariant(double(0)); + + QTest::newRow("bool") + << "ListElement { foo: false }" + << QVariant(false); + + QTest::newRow("bool") + << "ListElement { foo: true }" + << QVariant(true); + + QTest::newRow("enum") + << "ListElement { foo: Text.AlignHCenter }" + << QVariant("QTBUG-5974:ListElement: constant script support for property value"); +} + +void tst_QmlListModel::static_types() +{ + QFETCH(QString, qml); + QFETCH(QVariant, value); + + qml = "import Qt 4.6\nListModel { " + qml + " }"; + + QmlEngine engine; + QmlComponent component(&engine); + component.setData(qml.toUtf8(), + QUrl::fromLocalFile(QString("dummy.qml"))); + + if (value.toString().startsWith("QTBUG-")) + QEXPECT_FAIL("",value.toString().toLatin1(),Abort); + + QVERIFY(!component.isError()); + + QmlListModel *obj = qobject_cast<QmlListModel*>(component.create()); + QVERIFY(obj != 0); + + QScriptValue actual = obj->get(0).property(QLatin1String("foo")); + + QCOMPARE(actual.isString(), value.type() == QVariant::String); + QCOMPARE(actual.isBoolean(), value.type() == QVariant::Bool); + QCOMPARE(actual.isNumber(), value.type() == QVariant::Double); + + QCOMPARE(actual.toString(), value.toString()); + + delete obj; +} + void tst_QmlListModel::error_data() { QTest::addColumn<QString>("qml"); @@ -246,7 +309,7 @@ void tst_QmlListModel::error_data() QTest::newRow("bindings not allowed in ListElement") << "import Qt 4.6\nRectangle { id: rect; ListModel { ListElement { foo: rect.color } } }" - << "QTBUG-6203 ListElement should not allow binding its data to something"; + << "ListElement: cannot use script for property value"; // but note QTBUG-5974 QTest::newRow("random object list properties allowed in ListElement") << "import Qt 4.6\nListModel { ListElement { foo: [ ListElement { bar: 123 } ] } }" diff --git a/tests/auto/declarative/qmllistreference/data/MyType.qml b/tests/auto/declarative/qmllistreference/data/MyType.qml new file mode 100644 index 0000000..d08f35b --- /dev/null +++ b/tests/auto/declarative/qmllistreference/data/MyType.qml @@ -0,0 +1,5 @@ +import Qt 4.6 + +QtObject { + property int a +} diff --git a/tests/auto/declarative/qmllistreference/data/engineTypes.qml b/tests/auto/declarative/qmllistreference/data/engineTypes.qml new file mode 100644 index 0000000..670aee4 --- /dev/null +++ b/tests/auto/declarative/qmllistreference/data/engineTypes.qml @@ -0,0 +1,9 @@ +import Qt 4.6 + +QtObject { + property list<MyType> myList + + myList: [ MyType { a: 1 }, + MyType { a: 9 } ] + +} diff --git a/tests/auto/declarative/qmllistreference/data/variantToList.qml b/tests/auto/declarative/qmllistreference/data/variantToList.qml new file mode 100644 index 0000000..0c2d0aa --- /dev/null +++ b/tests/auto/declarative/qmllistreference/data/variantToList.qml @@ -0,0 +1,10 @@ +import Qt 4.6 + +QtObject { + property list<QtObject> myList; + myList: QtObject {} + + property var value: myList + property int test: value.length +} + diff --git a/tests/auto/declarative/qmllist/qmllist.pro b/tests/auto/declarative/qmllistreference/qmllistreference.pro index b2145ed..fa49d5a 100644 --- a/tests/auto/declarative/qmllist/qmllist.pro +++ b/tests/auto/declarative/qmllistreference/qmllistreference.pro @@ -2,4 +2,4 @@ load(qttest_p4) contains(QT_CONFIG,declarative): QT += declarative macx:CONFIG -= app_bundle -SOURCES += tst_qmllist.cpp +SOURCES += tst_qmllistreference.cpp diff --git a/tests/auto/declarative/qmllistreference/tst_qmllistreference.cpp b/tests/auto/declarative/qmllistreference/tst_qmllistreference.cpp new file mode 100644 index 0000000..6122f1e --- /dev/null +++ b/tests/auto/declarative/qmllistreference/tst_qmllistreference.cpp @@ -0,0 +1,574 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (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 Technology Preview License Agreement accompanying +** this package. +** +** 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.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <qtest.h> +#include <QUrl> +#include <QFileInfo> +#include <QDir> +#include <QmlEngine> +#include <QmlComponent> +#include <QtDeclarative/qml.h> +#include <QtDeclarative/qmlprivate.h> +#include <QDebug> + +inline QUrl TEST_FILE(const QString &filename) +{ + QFileInfo fileInfo(__FILE__); + return QUrl::fromLocalFile(fileInfo.absoluteDir().filePath("data/" + filename)); +} + +inline QUrl TEST_FILE(const char *filename) +{ + return TEST_FILE(QLatin1String(filename)); +} + +class tst_qmllistreference : public QObject +{ + Q_OBJECT +public: + tst_qmllistreference() {} + +private slots: + void qmllistreference(); + void qmllistreference_invalid(); + void isValid(); + void object(); + void listElementType(); + void canAppend(); + void canAt(); + void canClear(); + void canCount(); + void append(); + void at(); + void clear(); + void count(); + void copy(); + void qmlmetaproperty(); + void engineTypes(); + void variantToList(); +}; + +class TestType : public QObject +{ + Q_OBJECT + Q_PROPERTY(QmlListProperty<TestType> data READ dataProperty); + Q_PROPERTY(int intProperty READ intProperty); + +public: + TestType() : property(this, data) {} + QmlListProperty<TestType> dataProperty() { return property; } + int intProperty() const { return 10; } + + QList<TestType *> data; + QmlListProperty<TestType> property; +}; +QML_DECLARE_TYPE(TestType); +QML_DEFINE_NOCREATE_TYPE(TestType); + +void tst_qmllistreference::qmllistreference() +{ + TestType tt; + + QmlListReference r(&tt, "data"); + QVERIFY(r.isValid() == true); + QCOMPARE(r.count(), 0); + + tt.data.append(&tt); + QCOMPARE(r.count(), 1); +} + +void tst_qmllistreference::qmllistreference_invalid() +{ + TestType tt; + + // Invalid + { + QmlListReference r; + QVERIFY(r.isValid() == false); + QVERIFY(r.object() == 0); + QVERIFY(r.listElementType() == 0); + QVERIFY(r.canAt() == false); + QVERIFY(r.canClear() == false); + QVERIFY(r.canCount() == false); + QVERIFY(r.append(0) == false); + QVERIFY(r.at(10) == 0); + QVERIFY(r.clear() == false); + QVERIFY(r.count() == 0); + } + + // Non-property + { + QmlListReference r(&tt, "blah"); + QVERIFY(r.isValid() == false); + QVERIFY(r.object() == 0); + QVERIFY(r.listElementType() == 0); + QVERIFY(r.canAt() == false); + QVERIFY(r.canClear() == false); + QVERIFY(r.canCount() == false); + QVERIFY(r.append(0) == false); + QVERIFY(r.at(10) == 0); + QVERIFY(r.clear() == false); + QVERIFY(r.count() == 0); + } + + // Non-list property + { + QmlListReference r(&tt, "intProperty"); + QVERIFY(r.isValid() == false); + QVERIFY(r.object() == 0); + QVERIFY(r.listElementType() == 0); + QVERIFY(r.canAt() == false); + QVERIFY(r.canClear() == false); + QVERIFY(r.canCount() == false); + QVERIFY(r.append(0) == false); + QVERIFY(r.at(10) == 0); + QVERIFY(r.clear() == false); + QVERIFY(r.count() == 0); + } +} + +void tst_qmllistreference::isValid() +{ + TestType *tt = new TestType; + + { + QmlListReference ref; + QVERIFY(ref.isValid() == false); + } + + { + QmlListReference ref(tt, "blah"); + QVERIFY(ref.isValid() == false); + } + + { + QmlListReference ref(tt, "data"); + QVERIFY(ref.isValid() == true); + delete tt; + QVERIFY(ref.isValid() == false); + } +} + +void tst_qmllistreference::object() +{ + TestType *tt = new TestType; + + { + QmlListReference ref; + QVERIFY(ref.object() == 0); + } + + { + QmlListReference ref(tt, "blah"); + QVERIFY(ref.object() == 0); + } + + { + QmlListReference ref(tt, "data"); + QVERIFY(ref.object() == tt); + delete tt; + QVERIFY(ref.object() == 0); + } +} + +void tst_qmllistreference::listElementType() +{ + TestType *tt = new TestType; + + { + QmlListReference ref; + QVERIFY(ref.listElementType() == 0); + } + + { + QmlListReference ref(tt, "blah"); + QVERIFY(ref.listElementType() == 0); + } + + { + QmlListReference ref(tt, "data"); + QVERIFY(ref.listElementType() == &TestType::staticMetaObject); + delete tt; + QVERIFY(ref.listElementType() == 0); + } +} + +void tst_qmllistreference::canAppend() +{ + TestType *tt = new TestType; + + { + QmlListReference ref; + QVERIFY(ref.canAppend() == false); + } + + { + QmlListReference ref(tt, "blah"); + QVERIFY(ref.canAppend() == false); + } + + { + QmlListReference ref(tt, "data"); + QVERIFY(ref.canAppend() == true); + delete tt; + QVERIFY(ref.canAppend() == false); + } + + { + TestType tt; + tt.property.append = 0; + QmlListReference ref(&tt, "data"); + QVERIFY(ref.canAppend() == false); + } +} + +void tst_qmllistreference::canAt() +{ + TestType *tt = new TestType; + + { + QmlListReference ref; + QVERIFY(ref.canAt() == false); + } + + { + QmlListReference ref(tt, "blah"); + QVERIFY(ref.canAt() == false); + } + + { + QmlListReference ref(tt, "data"); + QVERIFY(ref.canAt() == true); + delete tt; + QVERIFY(ref.canAt() == false); + } + + { + TestType tt; + tt.property.at = 0; + QmlListReference ref(&tt, "data"); + QVERIFY(ref.canAt() == false); + } +} + +void tst_qmllistreference::canClear() +{ + TestType *tt = new TestType; + + { + QmlListReference ref; + QVERIFY(ref.canClear() == false); + } + + { + QmlListReference ref(tt, "blah"); + QVERIFY(ref.canClear() == false); + } + + { + QmlListReference ref(tt, "data"); + QVERIFY(ref.canClear() == true); + delete tt; + QVERIFY(ref.canClear() == false); + } + + { + TestType tt; + tt.property.clear = 0; + QmlListReference ref(&tt, "data"); + QVERIFY(ref.canClear() == false); + } +} + +void tst_qmllistreference::canCount() +{ + TestType *tt = new TestType; + + { + QmlListReference ref; + QVERIFY(ref.canCount() == false); + } + + { + QmlListReference ref(tt, "blah"); + QVERIFY(ref.canCount() == false); + } + + { + QmlListReference ref(tt, "data"); + QVERIFY(ref.canCount() == true); + delete tt; + QVERIFY(ref.canCount() == false); + } + + { + TestType tt; + tt.property.count = 0; + QmlListReference ref(&tt, "data"); + QVERIFY(ref.canCount() == false); + } +} + +void tst_qmllistreference::append() +{ + TestType *tt = new TestType; + QObject object; + + { + QmlListReference ref; + QVERIFY(ref.append(tt) == false); + } + + { + QmlListReference ref(tt, "blah"); + QVERIFY(ref.append(tt) == false); + } + + { + QmlListReference ref(tt, "data"); + QVERIFY(ref.append(tt) == true); + QVERIFY(tt->data.count() == 1); + QVERIFY(tt->data.at(0) == tt); + QVERIFY(ref.append(&object) == false); + QVERIFY(tt->data.count() == 1); + QVERIFY(tt->data.at(0) == tt); + QVERIFY(ref.append(0) == true); + QVERIFY(tt->data.count() == 2); + QVERIFY(tt->data.at(0) == tt); + QVERIFY(tt->data.at(1) == 0); + delete tt; + QVERIFY(ref.append(0) == false); + } + + { + TestType tt; + tt.property.append = 0; + QmlListReference ref(&tt, "data"); + QVERIFY(ref.append(&tt) == false); + } +} + +void tst_qmllistreference::at() +{ + TestType *tt = new TestType; + tt->data.append(tt); + tt->data.append(0); + tt->data.append(tt); + + { + QmlListReference ref; + QVERIFY(ref.at(0) == 0); + } + + { + QmlListReference ref(tt, "blah"); + QVERIFY(ref.at(0) == 0); + } + + { + QmlListReference ref(tt, "data"); + QVERIFY(ref.at(0) == tt); + QVERIFY(ref.at(1) == 0); + QVERIFY(ref.at(2) == tt); + delete tt; + QVERIFY(ref.at(0) == 0); + } + + { + TestType tt; + tt.data.append(&tt); + tt.property.at = 0; + QmlListReference ref(&tt, "data"); + QVERIFY(ref.at(0) == 0); + } +} + +void tst_qmllistreference::clear() +{ + TestType *tt = new TestType; + tt->data.append(tt); + tt->data.append(0); + tt->data.append(tt); + + { + QmlListReference ref; + QVERIFY(ref.clear() == false); + } + + { + QmlListReference ref(tt, "blah"); + QVERIFY(ref.clear() == false); + } + + { + QmlListReference ref(tt, "data"); + QVERIFY(ref.clear() == true); + QVERIFY(tt->data.count() == 0); + delete tt; + QVERIFY(ref.clear() == false); + } + + { + TestType tt; + tt.property.clear = 0; + QmlListReference ref(&tt, "data"); + QVERIFY(ref.clear() == false); + } +} + +void tst_qmllistreference::count() +{ + TestType *tt = new TestType; + tt->data.append(tt); + tt->data.append(0); + tt->data.append(tt); + + { + QmlListReference ref; + QVERIFY(ref.count() == 0); + } + + { + QmlListReference ref(tt, "blah"); + QVERIFY(ref.count() == 0); + } + + { + QmlListReference ref(tt, "data"); + QVERIFY(ref.count() == 3); + tt->data.removeAt(1); + QVERIFY(ref.count() == 2); + delete tt; + QVERIFY(ref.count() == 0); + } + + { + TestType tt; + tt.data.append(&tt); + tt.property.count = 0; + QmlListReference ref(&tt, "data"); + QVERIFY(ref.count() == 0); + } +} + +void tst_qmllistreference::copy() +{ + TestType tt; + tt.data.append(&tt); + tt.data.append(0); + tt.data.append(&tt); + + QmlListReference *r1 = new QmlListReference(&tt, "data"); + QVERIFY(r1->count() == 3); + + QmlListReference r2(*r1); + QmlListReference r3; + r3 = *r1; + + QVERIFY(r2.count() == 3); + QVERIFY(r3.count() == 3); + + delete r1; + + QVERIFY(r2.count() == 3); + QVERIFY(r3.count() == 3); + + tt.data.removeAt(2); + + QVERIFY(r2.count() == 2); + QVERIFY(r3.count() == 2); +} + +void tst_qmllistreference::qmlmetaproperty() +{ + TestType tt; + tt.data.append(&tt); + tt.data.append(0); + tt.data.append(&tt); + + QmlMetaProperty prop(&tt, QLatin1String("data")); + QVariant v = prop.read(); + QVERIFY(v.userType() == qMetaTypeId<QmlListReference>()); + QmlListReference ref = qvariant_cast<QmlListReference>(v); + QVERIFY(ref.count() == 3); + QVERIFY(ref.listElementType() == &TestType::staticMetaObject); +} + +void tst_qmllistreference::engineTypes() +{ + QmlEngine engine; + QmlComponent component(&engine, TEST_FILE("engineTypes.qml")); + + QObject *o = component.create(); + QVERIFY(o); + + QmlMetaProperty p1(o, QLatin1String("myList")); + QVERIFY(p1.propertyCategory() == QmlMetaProperty::Normal); + + QmlMetaProperty p2(o, QLatin1String("myList"), engine.rootContext()); + QVERIFY(p2.propertyCategory() == QmlMetaProperty::List); + QVariant v = p2.read(); + QVERIFY(v.userType() == qMetaTypeId<QmlListReference>()); + QmlListReference ref = qvariant_cast<QmlListReference>(v); + QVERIFY(ref.count() == 2); + QVERIFY(ref.listElementType()); + QVERIFY(ref.listElementType() != &QObject::staticMetaObject); + + delete o; +} + +void tst_qmllistreference::variantToList() +{ + QmlEngine engine; + QmlComponent component(&engine, TEST_FILE("variantToList.qml")); + + QObject *o = component.create(); + QVERIFY(o); + + QVERIFY(o->property("value").userType() == qMetaTypeId<QmlListReference>()); + QCOMPARE(o->property("test").toInt(), 1); + + delete o; +} + +QTEST_MAIN(tst_qmllistreference) + +#include "tst_qmllistreference.moc" diff --git a/tests/auto/declarative/qmlmetaproperty/tst_qmlmetaproperty.cpp b/tests/auto/declarative/qmlmetaproperty/tst_qmlmetaproperty.cpp index 5c8178f..c289641 100644 --- a/tests/auto/declarative/qmlmetaproperty/tst_qmlmetaproperty.cpp +++ b/tests/auto/declarative/qmlmetaproperty/tst_qmlmetaproperty.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** @@ -73,13 +73,11 @@ private: class MyContainer : public QObject { Q_OBJECT - Q_PROPERTY(QList<MyQmlObject*>* children READ children) - Q_PROPERTY(QmlList<MyQmlObject*>* qmlChildren READ qmlChildren) + Q_PROPERTY(QmlListProperty<MyQmlObject> children READ children) public: MyContainer() {} - QList<MyQmlObject*> *children() { return &m_children; } - QmlConcreteList<MyQmlObject *> *qmlChildren() { return &m_qmlChildren; } + QmlListProperty<MyQmlObject> children() { return QmlListProperty<MyQmlObject>(this, m_children); } static MyAttached *qmlAttachedProperties(QObject *o) { return new MyAttached(o); @@ -87,7 +85,6 @@ public: private: QList<MyQmlObject*> m_children; - QmlConcreteList<MyQmlObject *> m_qmlChildren; }; QML_DECLARE_TYPE(MyContainer); @@ -118,13 +115,13 @@ private slots: // Functionality void writeObjectToList(); void writeListToList(); - void writeObjectToQmlList(); //writeToReadOnly(); // Bugs void crashOnValueProperty(); + void copy(); private: QmlEngine engine; }; @@ -133,7 +130,7 @@ void tst_qmlmetaproperty::qmlmetaproperty() { QmlMetaProperty prop; - QGuard<QmlBinding> binding(new QmlBinding(QString(), 0, 0)); + QGuard<QmlBinding> binding(new QmlBinding(QLatin1String("null"), 0, engine.rootContext())); QVERIFY(binding != 0); QGuard<QmlExpression> expression(new QmlExpression()); QVERIFY(expression != 0); @@ -222,7 +219,7 @@ void tst_qmlmetaproperty::qmlmetaproperty_object() { QmlMetaProperty prop(&object); - QGuard<QmlBinding> binding(new QmlBinding(QString(), 0, 0)); + QGuard<QmlBinding> binding(new QmlBinding(QLatin1String("null"), 0, engine.rootContext())); QVERIFY(binding != 0); QGuard<QmlExpression> expression(new QmlExpression()); QVERIFY(expression != 0); @@ -268,7 +265,7 @@ void tst_qmlmetaproperty::qmlmetaproperty_object() { QmlMetaProperty prop(&dobject); - QGuard<QmlBinding> binding(new QmlBinding(QString(), 0, 0)); + QGuard<QmlBinding> binding(new QmlBinding(QLatin1String("null"), 0, engine.rootContext())); binding->setTarget(prop); QVERIFY(binding != 0); QGuard<QmlExpression> expression(new QmlExpression()); @@ -323,7 +320,7 @@ void tst_qmlmetaproperty::qmlmetaproperty_object_string() { QmlMetaProperty prop(&object, QString("defaultProperty")); - QGuard<QmlBinding> binding(new QmlBinding(QString(), 0, 0)); + QGuard<QmlBinding> binding(new QmlBinding(QLatin1String("null"), 0, engine.rootContext())); QVERIFY(binding != 0); QGuard<QmlExpression> expression(new QmlExpression()); QVERIFY(expression != 0); @@ -369,7 +366,7 @@ void tst_qmlmetaproperty::qmlmetaproperty_object_string() { QmlMetaProperty prop(&dobject, QString("defaultProperty")); - QGuard<QmlBinding> binding(new QmlBinding(QString(), 0, 0)); + QGuard<QmlBinding> binding(new QmlBinding(QLatin1String("null"), 0, engine.rootContext())); binding->setTarget(prop); QVERIFY(binding != 0); QGuard<QmlExpression> expression(new QmlExpression()); @@ -418,7 +415,7 @@ void tst_qmlmetaproperty::qmlmetaproperty_object_string() { QmlMetaProperty prop(&dobject, QString("onClicked")); - QGuard<QmlBinding> binding(new QmlBinding(QString(), 0, 0)); + QGuard<QmlBinding> binding(new QmlBinding(QLatin1String("null"), 0, engine.rootContext())); binding->setTarget(prop); QVERIFY(binding != 0); QGuard<QmlExpression> expression(new QmlExpression()); @@ -472,7 +469,7 @@ void tst_qmlmetaproperty::qmlmetaproperty_object_context() { QmlMetaProperty prop(&object, engine.rootContext()); - QGuard<QmlBinding> binding(new QmlBinding(QString(), 0, 0)); + QGuard<QmlBinding> binding(new QmlBinding(QLatin1String("null"), 0, engine.rootContext())); QVERIFY(binding != 0); QGuard<QmlExpression> expression(new QmlExpression()); QVERIFY(expression != 0); @@ -518,7 +515,7 @@ void tst_qmlmetaproperty::qmlmetaproperty_object_context() { QmlMetaProperty prop(&dobject, engine.rootContext()); - QGuard<QmlBinding> binding(new QmlBinding(QString(), 0, 0)); + QGuard<QmlBinding> binding(new QmlBinding(QLatin1String("null"), 0, engine.rootContext())); binding->setTarget(prop); QVERIFY(binding != 0); QGuard<QmlExpression> expression(new QmlExpression()); @@ -573,7 +570,7 @@ void tst_qmlmetaproperty::qmlmetaproperty_object_string_context() { QmlMetaProperty prop(&object, QString("defaultProperty"), engine.rootContext()); - QGuard<QmlBinding> binding(new QmlBinding(QString(), 0, 0)); + QGuard<QmlBinding> binding(new QmlBinding(QLatin1String("null"), 0, engine.rootContext())); QVERIFY(binding != 0); QGuard<QmlExpression> expression(new QmlExpression()); QVERIFY(expression != 0); @@ -619,7 +616,7 @@ void tst_qmlmetaproperty::qmlmetaproperty_object_string_context() { QmlMetaProperty prop(&dobject, QString("defaultProperty"), engine.rootContext()); - QGuard<QmlBinding> binding(new QmlBinding(QString(), 0, 0)); + QGuard<QmlBinding> binding(new QmlBinding(QLatin1String("null"), 0, engine.rootContext())); binding->setTarget(prop); QVERIFY(binding != 0); QGuard<QmlExpression> expression(new QmlExpression()); @@ -668,7 +665,7 @@ void tst_qmlmetaproperty::qmlmetaproperty_object_string_context() { QmlMetaProperty prop(&dobject, QString("onClicked"), engine.rootContext()); - QGuard<QmlBinding> binding(new QmlBinding(QString(), 0, 0)); + QGuard<QmlBinding> binding(new QmlBinding(QLatin1String("null"), 0, engine.rootContext())); binding->setTarget(prop); QVERIFY(binding != 0); QGuard<QmlExpression> expression(new QmlExpression()); @@ -1078,13 +1075,14 @@ void tst_qmlmetaproperty::writeObjectToList() containerComponent.setData("import Test 1.0\nMyContainer { children: MyQmlObject {} }", QUrl()); MyContainer *container = qobject_cast<MyContainer*>(containerComponent.create()); QVERIFY(container != 0); - QVERIFY(container->children()->size() == 1); + QmlListReference list(container, "children"); + QVERIFY(list.count() == 1); MyQmlObject *object = new MyQmlObject; QmlMetaProperty prop(container, "children"); prop.write(qVariantFromValue(object)); - QCOMPARE(container->children()->size(), 2); - QCOMPARE(container->children()->at(1), object); + QCOMPARE(list.count(), 1); + QCOMPARE(list.at(0), object); } Q_DECLARE_METATYPE(QList<QObject *>); @@ -1094,13 +1092,14 @@ void tst_qmlmetaproperty::writeListToList() containerComponent.setData("import Test 1.0\nMyContainer { children: MyQmlObject {} }", QUrl()); MyContainer *container = qobject_cast<MyContainer*>(containerComponent.create()); QVERIFY(container != 0); - QVERIFY(container->children()->size() == 1); + QmlListReference list(container, "children"); + QVERIFY(list.count() == 1); QList<QObject*> objList; objList << new MyQmlObject() << new MyQmlObject() << new MyQmlObject() << new MyQmlObject(); QmlMetaProperty prop(container, "children"); prop.write(qVariantFromValue(objList)); - QCOMPARE(container->children()->size(), 4); + QCOMPARE(list.count(), 4); //XXX need to try this with read/write prop (for read-only it correctly doesn't write) /*QList<MyQmlObject*> typedObjList; @@ -1109,21 +1108,6 @@ void tst_qmlmetaproperty::writeListToList() QCOMPARE(container->children()->size(), 1);*/ } -void tst_qmlmetaproperty::writeObjectToQmlList() -{ - QmlComponent containerComponent(&engine); - containerComponent.setData("import Test 1.0\nMyContainer { qmlChildren: MyQmlObject {} }", QUrl()); - MyContainer *container = qobject_cast<MyContainer*>(containerComponent.create()); - QVERIFY(container != 0); - QVERIFY(container->qmlChildren()->size() == 1); - - MyQmlObject *object = new MyQmlObject; - QmlMetaProperty prop(container, "qmlChildren"); - prop.write(qVariantFromValue(object)); - QCOMPARE(container->qmlChildren()->size(), 2); - QCOMPARE(container->qmlChildren()->at(1), object); -} - void tst_qmlmetaproperty::crashOnValueProperty() { QmlEngine *engine = new QmlEngine; @@ -1148,6 +1132,48 @@ void tst_qmlmetaproperty::crashOnValueProperty() QCOMPARE(p.read(), QVariant(20)); } +void tst_qmlmetaproperty::copy() +{ + PropertyObject object; + + QmlMetaProperty *property = new QmlMetaProperty(&object, QLatin1String("defaultProperty")); + QCOMPARE(property->name(), QString("defaultProperty")); + QCOMPARE(property->read(), QVariant(10)); + QCOMPARE(property->type(), QmlMetaProperty::Property); + QCOMPARE(property->propertyCategory(), QmlMetaProperty::Normal); + QCOMPARE(property->propertyType(), (int)QVariant::Int); + + QmlMetaProperty p1(*property); + QCOMPARE(p1.name(), QString("defaultProperty")); + QCOMPARE(p1.read(), QVariant(10)); + QCOMPARE(p1.type(), QmlMetaProperty::Property); + QCOMPARE(p1.propertyCategory(), QmlMetaProperty::Normal); + QCOMPARE(p1.propertyType(), (int)QVariant::Int); + + QmlMetaProperty p2(&object, QLatin1String("url")); + QCOMPARE(p2.name(), QString("url")); + p2 = *property; + QCOMPARE(p2.name(), QString("defaultProperty")); + QCOMPARE(p2.read(), QVariant(10)); + QCOMPARE(p2.type(), QmlMetaProperty::Property); + QCOMPARE(p2.propertyCategory(), QmlMetaProperty::Normal); + QCOMPARE(p2.propertyType(), (int)QVariant::Int); + + delete property; property = 0; + + QCOMPARE(p1.name(), QString("defaultProperty")); + QCOMPARE(p1.read(), QVariant(10)); + QCOMPARE(p1.type(), QmlMetaProperty::Property); + QCOMPARE(p1.propertyCategory(), QmlMetaProperty::Normal); + QCOMPARE(p1.propertyType(), (int)QVariant::Int); + + QCOMPARE(p2.name(), QString("defaultProperty")); + QCOMPARE(p2.read(), QVariant(10)); + QCOMPARE(p2.type(), QmlMetaProperty::Property); + QCOMPARE(p2.propertyCategory(), QmlMetaProperty::Normal); + QCOMPARE(p2.propertyType(), (int)QVariant::Int); +} + QTEST_MAIN(tst_qmlmetaproperty) #include "tst_qmlmetaproperty.moc" diff --git a/tests/auto/declarative/qmlmetatype/tst_qmlmetatype.cpp b/tests/auto/declarative/qmlmetatype/tst_qmlmetatype.cpp index c336226..750ccf8 100644 --- a/tests/auto/declarative/qmlmetatype/tst_qmlmetatype.cpp +++ b/tests/auto/declarative/qmlmetatype/tst_qmlmetatype.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** @@ -67,10 +67,6 @@ private slots: void qmlPropertyValueInterceptorCast(); void isList(); - void isQmlList(); - - void listCount(); - void listAt(); void defaultObject(); }; @@ -346,85 +342,12 @@ void tst_qmlmetatype::qmlPropertyValueInterceptorCast() void tst_qmlmetatype::isList() { - QCOMPARE(QmlMetaType::isList(QVariant()), false); QCOMPARE(QmlMetaType::isList(QVariant::Invalid), false); QCOMPARE(QmlMetaType::isList(QVariant::Int), false); - QCOMPARE(QmlMetaType::isList(QVariant(10)), false); - - QList<TestType *> list; - QmlConcreteList<TestType *> qmllist; - - QCOMPARE(QmlMetaType::isList(qMetaTypeId<QList<TestType *>*>()), true); - QCOMPARE(QmlMetaType::isList(QVariant::fromValue(&list)), true); - QCOMPARE(QmlMetaType::isList(qMetaTypeId<QmlList<TestType *>*>()), false); - QCOMPARE(QmlMetaType::isList(QVariant::fromValue((QmlList<TestType *>*)&qmllist)), false); -} -void tst_qmlmetatype::isQmlList() -{ - QCOMPARE(QmlMetaType::isQmlList(QVariant::Invalid), false); - QCOMPARE(QmlMetaType::isQmlList(QVariant::Int), false); - - QCOMPARE(QmlMetaType::isQmlList(qMetaTypeId<QList<TestType *>*>()), false); - QCOMPARE(QmlMetaType::isQmlList(qMetaTypeId<QmlList<TestType *>*>()), true); -} + QmlListProperty<TestType> list; -void tst_qmlmetatype::listCount() -{ - QCOMPARE(QmlMetaType::listCount(QVariant()), 0); - QCOMPARE(QmlMetaType::listCount(QVariant(10)), 0); - - QList<TestType *> list; - QVariant listVar = QVariant::fromValue(&list); - QmlConcreteList<TestType *> qmllist; - QVariant qmllistVar = QVariant::fromValue((QmlList<TestType *>*)&qmllist); - - QCOMPARE(QmlMetaType::listCount(listVar), 0); - QCOMPARE(QmlMetaType::listCount(qmllistVar), 0); - - list.append(0); list.append(0); list.append(0); - qmllist.append(0); qmllist.append(0); qmllist.append(0); - - QCOMPARE(QmlMetaType::listCount(listVar), 3); - QCOMPARE(QmlMetaType::listCount(qmllistVar), 0); -} - -void tst_qmlmetatype::listAt() -{ - QCOMPARE(QmlMetaType::listAt(QVariant(), 0), QVariant()); - QCOMPARE(QmlMetaType::listAt(QVariant(10), 0), QVariant()); - QCOMPARE(QmlMetaType::listAt(QVariant(), 10), QVariant()); - QCOMPARE(QmlMetaType::listAt(QVariant(10), 10), QVariant()); - QCOMPARE(QmlMetaType::listAt(QVariant(), -10), QVariant()); - QCOMPARE(QmlMetaType::listAt(QVariant(10), -10), QVariant()); - - QList<TestType *> list; - QVariant listVar = QVariant::fromValue(&list); - QmlConcreteList<TestType *> qmllist; - QVariant qmllistVar = QVariant::fromValue((QmlList<TestType *>*)&qmllist); - - QCOMPARE(QmlMetaType::listAt(listVar, 0), QVariant()); - QCOMPARE(QmlMetaType::listAt(listVar, 2), QVariant()); - QCOMPARE(QmlMetaType::listAt(listVar, -1), QVariant()); - - QCOMPARE(QmlMetaType::listAt(qmllistVar, 0), QVariant()); - QCOMPARE(QmlMetaType::listAt(qmllistVar, 2), QVariant()); - QCOMPARE(QmlMetaType::listAt(qmllistVar, -1), QVariant()); - - TestType ttype; - QVariant ttypeVar = QVariant::fromValue(&ttype); - QVariant nullttypeVar = QVariant::fromValue((TestType *)0); - - list.append(0); list.append(&ttype); list.append(0); - qmllist.append(0); qmllist.append(&ttype); qmllist.append(0); - - QCOMPARE(QmlMetaType::listAt(listVar, 0), nullttypeVar); - QCOMPARE(QmlMetaType::listAt(listVar, 1), ttypeVar); - QCOMPARE(QmlMetaType::listAt(listVar, -1), QVariant()); - - QCOMPARE(QmlMetaType::listAt(qmllistVar, 0), QVariant()); - QCOMPARE(QmlMetaType::listAt(qmllistVar, 2), QVariant()); - QCOMPARE(QmlMetaType::listAt(qmllistVar, -1), QVariant()); + QCOMPARE(QmlMetaType::isList(qMetaTypeId<QmlListProperty<TestType> >()), true); } void tst_qmlmetatype::defaultObject() diff --git a/tests/auto/declarative/qmlmoduleplugin/plugin/plugin.cpp b/tests/auto/declarative/qmlmoduleplugin/plugin/plugin.cpp index 10adda0..ddd1e5e 100644 --- a/tests/auto/declarative/qmlmoduleplugin/plugin/plugin.cpp +++ b/tests/auto/declarative/qmlmoduleplugin/plugin/plugin.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** @@ -77,6 +77,11 @@ public: { return QStringList() << QLatin1String("com.nokia.AutoTestQmlPluginType"); } + + void defineModule(const QString& uri) + { + Q_ASSERT(uri == "com.nokia.AutoTestQmlPluginType"); + } }; #include "plugin.moc" diff --git a/tests/auto/declarative/qmlmoduleplugin/tst_qmlmoduleplugin.cpp b/tests/auto/declarative/qmlmoduleplugin/tst_qmlmoduleplugin.cpp index 3f97abd..87125fc 100644 --- a/tests/auto/declarative/qmlmoduleplugin/tst_qmlmoduleplugin.cpp +++ b/tests/auto/declarative/qmlmoduleplugin/tst_qmlmoduleplugin.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** diff --git a/tests/auto/declarative/qmlnumberformatter/tst_qmlnumberformatter.cpp b/tests/auto/declarative/qmlnumberformatter/tst_qmlnumberformatter.cpp index f8ac76c..30f2fea 100644 --- a/tests/auto/declarative/qmlnumberformatter/tst_qmlnumberformatter.cpp +++ b/tests/auto/declarative/qmlnumberformatter/tst_qmlnumberformatter.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** diff --git a/tests/auto/declarative/qmlpixmapcache/tst_qmlpixmapcache.cpp b/tests/auto/declarative/qmlpixmapcache/tst_qmlpixmapcache.cpp index 50de8d5..019fc2a 100644 --- a/tests/auto/declarative/qmlpixmapcache/tst_qmlpixmapcache.cpp +++ b/tests/auto/declarative/qmlpixmapcache/tst_qmlpixmapcache.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** diff --git a/tests/auto/declarative/qmlpropertymap/tst_qmlpropertymap.cpp b/tests/auto/declarative/qmlpropertymap/tst_qmlpropertymap.cpp index 8c457e6..26b89a6 100644 --- a/tests/auto/declarative/qmlpropertymap/tst_qmlpropertymap.cpp +++ b/tests/auto/declarative/qmlpropertymap/tst_qmlpropertymap.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** diff --git a/tests/auto/declarative/qmlqt/tst_qmlqt.cpp b/tests/auto/declarative/qmlqt/tst_qmlqt.cpp index 78f39be..c3c2521 100644 --- a/tests/auto/declarative/qmlqt/tst_qmlqt.cpp +++ b/tests/auto/declarative/qmlqt/tst_qmlqt.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** diff --git a/tests/auto/declarative/qmlspringfollow/tst_qmlspringfollow.cpp b/tests/auto/declarative/qmlspringfollow/tst_qmlspringfollow.cpp index f17b5d4..393b351 100644 --- a/tests/auto/declarative/qmlspringfollow/tst_qmlspringfollow.cpp +++ b/tests/auto/declarative/qmlspringfollow/tst_qmlspringfollow.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** diff --git a/tests/auto/declarative/qmlstates/data/illegalTempState.qml b/tests/auto/declarative/qmlstates/data/illegalTempState.qml index 2702be4..0dc39ae 100644 --- a/tests/auto/declarative/qmlstates/data/illegalTempState.qml +++ b/tests/auto/declarative/qmlstates/data/illegalTempState.qml @@ -14,7 +14,7 @@ Rectangle { } ] - MouseRegion { + MouseArea { anchors.fill: parent onClicked: card.state = "placed" } diff --git a/tests/auto/declarative/qmlstates/data/legalTempState.qml b/tests/auto/declarative/qmlstates/data/legalTempState.qml index 54c97b9..9be984c 100644 --- a/tests/auto/declarative/qmlstates/data/legalTempState.qml +++ b/tests/auto/declarative/qmlstates/data/legalTempState.qml @@ -16,7 +16,7 @@ Rectangle { } ] - MouseRegion { + MouseArea { anchors.fill: parent onClicked: card.state = "placed" } diff --git a/tests/auto/declarative/qmlstates/data/parentChange.qml b/tests/auto/declarative/qmlstates/data/parentChange.qml index 087da6b..b8c7818 100644 --- a/tests/auto/declarative/qmlstates/data/parentChange.qml +++ b/tests/auto/declarative/qmlstates/data/parentChange.qml @@ -12,7 +12,7 @@ Rectangle { color: "red" } } - MouseRegion { + MouseArea { id: clickable anchors.fill: parent } diff --git a/tests/auto/declarative/qmlstates/data/parentChange2.qml b/tests/auto/declarative/qmlstates/data/parentChange2.qml index f0b00f5..8b23591 100644 --- a/tests/auto/declarative/qmlstates/data/parentChange2.qml +++ b/tests/auto/declarative/qmlstates/data/parentChange2.qml @@ -15,7 +15,7 @@ Rectangle { color: "red" } } - MouseRegion { + MouseArea { id: clickable anchors.fill: parent } diff --git a/tests/auto/declarative/qmlstates/data/parentChange3.qml b/tests/auto/declarative/qmlstates/data/parentChange3.qml index 2aa507c..ddf9268 100644 --- a/tests/auto/declarative/qmlstates/data/parentChange3.qml +++ b/tests/auto/declarative/qmlstates/data/parentChange3.qml @@ -16,7 +16,7 @@ Rectangle { color: "red" } } - MouseRegion { + MouseArea { id: clickable anchors.fill: parent } diff --git a/tests/auto/declarative/qmlstates/data/parentChange4.qml b/tests/auto/declarative/qmlstates/data/parentChange4.qml index d00274b..34d667a 100644 --- a/tests/auto/declarative/qmlstates/data/parentChange4.qml +++ b/tests/auto/declarative/qmlstates/data/parentChange4.qml @@ -9,7 +9,7 @@ Rectangle { width: 100; height: 100 color: "red" } - MouseRegion { + MouseArea { id: clickable anchors.fill: parent } diff --git a/tests/auto/declarative/qmlstates/data/parentChange5.qml b/tests/auto/declarative/qmlstates/data/parentChange5.qml index f75e2a3..56bdd89 100644 --- a/tests/auto/declarative/qmlstates/data/parentChange5.qml +++ b/tests/auto/declarative/qmlstates/data/parentChange5.qml @@ -9,7 +9,7 @@ Rectangle { width: 100; height: 100 color: "red" } - MouseRegion { + MouseArea { id: clickable anchors.fill: parent } diff --git a/tests/auto/declarative/qmlstates/tst_qmlstates.cpp b/tests/auto/declarative/qmlstates/tst_qmlstates.cpp index 2274889..b910c85 100644 --- a/tests/auto/declarative/qmlstates/tst_qmlstates.cpp +++ b/tests/auto/declarative/qmlstates/tst_qmlstates.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** @@ -407,8 +407,12 @@ void tst_qmlstates::parentChange() QmlGraphicsRectangle *innerRect = qobject_cast<QmlGraphicsRectangle*>(rect->findChild<QmlGraphicsRectangle*>("MyRect")); QVERIFY(innerRect != 0); - qmlExecuteDeferred(rect->states()->at(0)); - QmlParentChange *pChange = qobject_cast<QmlParentChange*>(rect->states()->at(0)->changes()->at(0)); + QmlListReference list(rect, "states"); + QmlState *state = qobject_cast<QmlState*>(list.at(0)); + QVERIFY(state != 0); + + qmlExecuteDeferred(state); + QmlParentChange *pChange = qobject_cast<QmlParentChange*>(state->operationAt(0)); QVERIFY(pChange != 0); QmlGraphicsItem *nParent = qobject_cast<QmlGraphicsItem*>(rect->findChild<QmlGraphicsItem*>("NewParent")); QVERIFY(nParent != 0); @@ -510,8 +514,12 @@ void tst_qmlstates::anchorChanges() QmlGraphicsRectangle *innerRect = qobject_cast<QmlGraphicsRectangle*>(rect->findChild<QmlGraphicsRectangle*>("MyRect")); QVERIFY(innerRect != 0); - qmlExecuteDeferred(rect->states()->at(0)); - QmlAnchorChanges *aChanges = qobject_cast<QmlAnchorChanges*>(rect->states()->at(0)->changes()->at(0)); + QmlListReference list(rect, "states"); + QmlState *state = qobject_cast<QmlState*>(list.at(0)); + QVERIFY(state != 0); + + qmlExecuteDeferred(state); + QmlAnchorChanges *aChanges = qobject_cast<QmlAnchorChanges*>(state->operationAt(0)); QVERIFY(aChanges != 0); rect->setState("right"); @@ -565,8 +573,12 @@ void tst_qmlstates::anchorChanges3() QmlGraphicsItem *bottomGuideline = qobject_cast<QmlGraphicsItem*>(rect->findChild<QmlGraphicsItem*>("BottomGuideline")); QVERIFY(bottomGuideline != 0); - qmlExecuteDeferred(rect->states()->at(0)); - QmlAnchorChanges *aChanges = qobject_cast<QmlAnchorChanges*>(rect->states()->at(0)->changes()->at(0)); + QmlListReference list(rect, "states"); + QmlState *state = qobject_cast<QmlState*>(list.at(0)); + QVERIFY(state != 0); + + qmlExecuteDeferred(state); + QmlAnchorChanges *aChanges = qobject_cast<QmlAnchorChanges*>(state->operationAt(0)); QVERIFY(aChanges != 0); rect->setState("reanchored"); @@ -611,8 +623,12 @@ void tst_qmlstates::anchorChanges4() QmlGraphicsItem *bottomGuideline = qobject_cast<QmlGraphicsItem*>(rect->findChild<QmlGraphicsItem*>("BottomGuideline")); QVERIFY(bottomGuideline != 0); - qmlExecuteDeferred(rect->states()->at(0)); - QmlAnchorChanges *aChanges = qobject_cast<QmlAnchorChanges*>(rect->states()->at(0)->changes()->at(0)); + QmlListReference list(rect, "states"); + QmlState *state = qobject_cast<QmlState*>(list.at(0)); + QVERIFY(state != 0); + + qmlExecuteDeferred(state); + QmlAnchorChanges *aChanges = qobject_cast<QmlAnchorChanges*>(state->operationAt(0)); QVERIFY(aChanges != 0); rect->setState("reanchored"); @@ -642,8 +658,12 @@ void tst_qmlstates::anchorChanges5() QmlGraphicsItem *bottomGuideline = qobject_cast<QmlGraphicsItem*>(rect->findChild<QmlGraphicsItem*>("BottomGuideline")); QVERIFY(bottomGuideline != 0); - qmlExecuteDeferred(rect->states()->at(0)); - QmlAnchorChanges *aChanges = qobject_cast<QmlAnchorChanges*>(rect->states()->at(0)->changes()->at(0)); + QmlListReference list(rect, "states"); + QmlState *state = qobject_cast<QmlState*>(list.at(0)); + QVERIFY(state != 0); + + qmlExecuteDeferred(state); + QmlAnchorChanges *aChanges = qobject_cast<QmlAnchorChanges*>(state->operationAt(0)); QVERIFY(aChanges != 0); rect->setState("reanchored"); @@ -700,7 +720,11 @@ void tst_qmlstates::explicitChanges() QmlGraphicsRectangle *rect = qobject_cast<QmlGraphicsRectangle*>(rectComponent.create()); QVERIFY(rect != 0); - qmlExecuteDeferred(rect->states()->at(0)); + QmlListReference list(rect, "states"); + QmlState *state = qobject_cast<QmlState*>(list.at(0)); + QVERIFY(state != 0); + + qmlExecuteDeferred(state); QmlPropertyChanges *changes = qobject_cast<QmlPropertyChanges*>(rect->findChild<QmlPropertyChanges*>("changes")); QVERIFY(changes != 0); QVERIFY(changes->isExplicit()); @@ -731,7 +755,7 @@ void tst_qmlstates::propertyErrors() QCOMPARE(rect->color(),QColor("red")); - QTest::ignoreMessage(QtWarningMsg, QByteArray("QML PropertyChanges (" + fullDataPath("/data/propertyErrors.qml") + ":8:9) Cannot assign to non-existant property \"colr\"").constData()); + QTest::ignoreMessage(QtWarningMsg, QByteArray("QML PropertyChanges (" + fullDataPath("/data/propertyErrors.qml") + ":8:9) Cannot assign to non-existent property \"colr\"").constData()); QTest::ignoreMessage(QtWarningMsg, QByteArray("QML PropertyChanges (" + fullDataPath("/data/propertyErrors.qml") + ":8:9) Cannot assign to read-only property \"wantsFocus\"").constData()); rect->setState("blue"); } @@ -802,7 +826,7 @@ void tst_qmlstates::deletingChange() QmlState *state = rect->findChild<QmlState*>(); QVERIFY(state != 0); qmlExecuteDeferred(state); - QCOMPARE(state->changes()->count(), 1); + QCOMPARE(state->operationCount(), 1); rect->setState("blue"); QCOMPARE(rect->color(),QColor("red")); @@ -877,7 +901,7 @@ void tst_qmlstates::nonExistantProperty() QmlGraphicsRectangle *rect = qobject_cast<QmlGraphicsRectangle*>(rectComponent.create()); QVERIFY(rect != 0); - QTest::ignoreMessage(QtWarningMsg, QByteArray("QML PropertyChanges (" + fullDataPath("/data/nonExistantProp.qml") + ":9:9) Cannot assign to non-existant property \"colr\"").constData()); + QTest::ignoreMessage(QtWarningMsg, QByteArray("QML PropertyChanges (" + fullDataPath("/data/nonExistantProp.qml") + ":9:9) Cannot assign to non-existent property \"colr\"").constData()); rect->setState("blue"); QCOMPARE(rect->state(), QLatin1String("blue")); } diff --git a/tests/auto/declarative/qmlsystempalette/tst_qmlsystempalette.cpp b/tests/auto/declarative/qmlsystempalette/tst_qmlsystempalette.cpp index 7da7f68..06e4d1c 100644 --- a/tests/auto/declarative/qmlsystempalette/tst_qmlsystempalette.cpp +++ b/tests/auto/declarative/qmlsystempalette/tst_qmlsystempalette.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** diff --git a/tests/auto/declarative/qmltimer/tst_qmltimer.cpp b/tests/auto/declarative/qmltimer/tst_qmltimer.cpp index 83094d2..b8b5e62 100644 --- a/tests/auto/declarative/qmltimer/tst_qmltimer.cpp +++ b/tests/auto/declarative/qmltimer/tst_qmltimer.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** diff --git a/tests/auto/declarative/qmlvaluetypes/testtypes.cpp b/tests/auto/declarative/qmlvaluetypes/testtypes.cpp index 565eb1c..c51b777 100644 --- a/tests/auto/declarative/qmlvaluetypes/testtypes.cpp +++ b/tests/auto/declarative/qmlvaluetypes/testtypes.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** diff --git a/tests/auto/declarative/qmlvaluetypes/testtypes.h b/tests/auto/declarative/qmlvaluetypes/testtypes.h index 67e32f5..b57fbff 100644 --- a/tests/auto/declarative/qmlvaluetypes/testtypes.h +++ b/tests/auto/declarative/qmlvaluetypes/testtypes.h @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** diff --git a/tests/auto/declarative/qmlvaluetypes/tst_qmlvaluetypes.cpp b/tests/auto/declarative/qmlvaluetypes/tst_qmlvaluetypes.cpp index 61ac93d..f99d3ce 100644 --- a/tests/auto/declarative/qmlvaluetypes/tst_qmlvaluetypes.cpp +++ b/tests/auto/declarative/qmlvaluetypes/tst_qmlvaluetypes.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** diff --git a/tests/auto/declarative/qmlxmlhttprequest/tst_qmlxmlhttprequest.cpp b/tests/auto/declarative/qmlxmlhttprequest/tst_qmlxmlhttprequest.cpp index 96f9ec6..e675566 100644 --- a/tests/auto/declarative/qmlxmlhttprequest/tst_qmlxmlhttprequest.cpp +++ b/tests/auto/declarative/qmlxmlhttprequest/tst_qmlxmlhttprequest.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** diff --git a/tests/auto/declarative/qmlxmllistmodel/tst_qmlxmllistmodel.cpp b/tests/auto/declarative/qmlxmllistmodel/tst_qmlxmllistmodel.cpp index 5d4682b..477b661 100644 --- a/tests/auto/declarative/qmlxmllistmodel/tst_qmlxmllistmodel.cpp +++ b/tests/auto/declarative/qmlxmllistmodel/tst_qmlxmllistmodel.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** diff --git a/tests/auto/declarative/qpacketprotocol/tst_qpacketprotocol.cpp b/tests/auto/declarative/qpacketprotocol/tst_qpacketprotocol.cpp index 60631d2..45947e3 100644 --- a/tests/auto/declarative/qpacketprotocol/tst_qpacketprotocol.cpp +++ b/tests/auto/declarative/qpacketprotocol/tst_qpacketprotocol.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** diff --git a/tests/auto/declarative/runall.sh b/tests/auto/declarative/runall.sh index d9eddf9..39485d3 100755 --- a/tests/auto/declarative/runall.sh +++ b/tests/auto/declarative/runall.sh @@ -1,4 +1,45 @@ #!/bin/sh +# +############################################################################# +## +## Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +## All rights reserved. +## Contact: Nokia Corporation (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 Technology Preview License Agreement accompanying +## this package. +## +## 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.1, included in the file LGPL_EXCEPTION.txt in this package. +## +## If you have questions regarding the use of this file, please contact +## Nokia at qt-info@nokia.com. +## +## +## +## +## +## +## +## +## $QT_END_LICENSE$ +## +############################################################################/ Xnest :7 2>/dev/null & sleep 1 diff --git a/tests/auto/declarative/shared/debugutil.cpp b/tests/auto/declarative/shared/debugutil.cpp index 0010508..864bb63 100644 --- a/tests/auto/declarative/shared/debugutil.cpp +++ b/tests/auto/declarative/shared/debugutil.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** diff --git a/tests/auto/declarative/shared/debugutil_p.h b/tests/auto/declarative/shared/debugutil_p.h index 6f23899..6815b3c 100644 --- a/tests/auto/declarative/shared/debugutil_p.h +++ b/tests/auto/declarative/shared/debugutil_p.h @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** diff --git a/tests/auto/declarative/shared/testhttpserver.cpp b/tests/auto/declarative/shared/testhttpserver.cpp index 5740925..5d56327 100644 --- a/tests/auto/declarative/shared/testhttpserver.cpp +++ b/tests/auto/declarative/shared/testhttpserver.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** diff --git a/tests/auto/declarative/shared/testhttpserver.h b/tests/auto/declarative/shared/testhttpserver.h index 178122d..638237d 100644 --- a/tests/auto/declarative/shared/testhttpserver.h +++ b/tests/auto/declarative/shared/testhttpserver.h @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** diff --git a/tests/auto/declarative/sql/tst_sql.cpp b/tests/auto/declarative/sql/tst_sql.cpp index 9bc667d..2384101 100644 --- a/tests/auto/declarative/sql/tst_sql.cpp +++ b/tests/auto/declarative/sql/tst_sql.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** diff --git a/tests/auto/declarative/visual/Package_Views/packageviews.qml b/tests/auto/declarative/visual/Package_Views/packageviews.qml index c8016b6..b577e45 100644 --- a/tests/auto/declarative/visual/Package_Views/packageviews.qml +++ b/tests/auto/declarative/visual/Package_Views/packageviews.qml @@ -29,14 +29,14 @@ Rectangle { delegate: Package { Rectangle { id: listItem; Package.name: "list"; width:root.width/2; height: 50; color: "transparent"; border.color: "white" - MouseRegion { + MouseArea { anchors.fill: parent onClicked: myState.state = myState.state == "list" ? "grid" : "list" } } Rectangle { id: gridItem; Package.name: "grid"; width:50; height: 50; color: "transparent"; border.color: "white" - MouseRegion { + MouseArea { anchors.fill: parent onClicked: myState.state = myState.state == "list" ? "grid" : "list" } @@ -64,7 +64,7 @@ Rectangle { from: "*"; to: "*" SequentialAnimation { ParentAction{} - NumberAnimation { matchProperties: "x,y,width"; easing: "easeInOutQuad" } + NumberAnimation { properties: "x,y,width"; easing: "easeInOutQuad" } } } ] diff --git a/tests/auto/declarative/visual/animation/bindinganimation/bindinganimation.qml b/tests/auto/declarative/visual/animation/bindinganimation/bindinganimation.qml index 732eb59..70c14cf 100644 --- a/tests/auto/declarative/visual/animation/bindinganimation/bindinganimation.qml +++ b/tests/auto/declarative/visual/animation/bindinganimation/bindinganimation.qml @@ -20,7 +20,7 @@ Rectangle { x: 50 + 50 } PropertyChanges { - target: myMouseRegion + target: myMouseArea onClicked: page.state = '' } } @@ -28,12 +28,12 @@ Rectangle { transitions: [ Transition { NumberAnimation { - matchProperties: "x" + properties: "x" } } ] - MouseRegion { - id: myMouseRegion + MouseArea { + id: myMouseArea anchors.fill: parent onClicked: { page.state= 'hello' } } diff --git a/tests/auto/declarative/visual/animation/colorAnimation/colorAnimation.qml b/tests/auto/declarative/visual/animation/colorAnimation/colorAnimation.qml index 0e98d7e..f205ae8 100644 --- a/tests/auto/declarative/visual/animation/colorAnimation/colorAnimation.qml +++ b/tests/auto/declarative/visual/animation/colorAnimation/colorAnimation.qml @@ -34,7 +34,7 @@ Rectangle { } } ] - MouseRegion { + MouseArea { anchors.fill: parent onClicked: { mainrect.state = 'second' } } diff --git a/tests/auto/declarative/visual/animation/easing/easing.qml b/tests/auto/declarative/visual/animation/easing/easing.qml index 1e8e907..9c814eb 100644 --- a/tests/auto/declarative/visual/animation/easing/easing.qml +++ b/tests/auto/declarative/visual/animation/easing/easing.qml @@ -176,7 +176,7 @@ Rectangle { to: "to" reversible: true NumberAnimation { - matchProperties: "x" + properties: "x" easing: type duration: 1000 } @@ -186,7 +186,7 @@ Rectangle { } } } - MouseRegion { + MouseArea { id: mouse anchors.fill: layout } diff --git a/tests/auto/declarative/visual/animation/loop/data/loop.0.png b/tests/auto/declarative/visual/animation/loop/data/loop.0.png Binary files differnew file mode 100644 index 0000000..f4301d3 --- /dev/null +++ b/tests/auto/declarative/visual/animation/loop/data/loop.0.png diff --git a/tests/auto/declarative/visual/animation/loop/data/loop.1.png b/tests/auto/declarative/visual/animation/loop/data/loop.1.png Binary files differnew file mode 100644 index 0000000..ceb0e20 --- /dev/null +++ b/tests/auto/declarative/visual/animation/loop/data/loop.1.png diff --git a/tests/auto/declarative/visual/animation/loop/data/loop.2.png b/tests/auto/declarative/visual/animation/loop/data/loop.2.png Binary files differnew file mode 100644 index 0000000..197c8c0 --- /dev/null +++ b/tests/auto/declarative/visual/animation/loop/data/loop.2.png diff --git a/tests/auto/declarative/visual/animation/loop/data/loop.3.png b/tests/auto/declarative/visual/animation/loop/data/loop.3.png Binary files differnew file mode 100644 index 0000000..3a4327e --- /dev/null +++ b/tests/auto/declarative/visual/animation/loop/data/loop.3.png diff --git a/tests/auto/declarative/visual/animation/loop/data/loop.4.png b/tests/auto/declarative/visual/animation/loop/data/loop.4.png Binary files differnew file mode 100644 index 0000000..2397719 --- /dev/null +++ b/tests/auto/declarative/visual/animation/loop/data/loop.4.png diff --git a/tests/auto/declarative/visual/animation/loop/data/loop.5.png b/tests/auto/declarative/visual/animation/loop/data/loop.5.png Binary files differnew file mode 100644 index 0000000..70d91a2 --- /dev/null +++ b/tests/auto/declarative/visual/animation/loop/data/loop.5.png diff --git a/tests/auto/declarative/visual/animation/loop/data/loop.qml b/tests/auto/declarative/visual/animation/loop/data/loop.qml new file mode 100644 index 0000000..8804d44 --- /dev/null +++ b/tests/auto/declarative/visual/animation/loop/data/loop.qml @@ -0,0 +1,1471 @@ +import Qt.VisualTest 4.6 + +VisualTest { + Frame { + msec: 0 + } + Frame { + msec: 16 + hash: "eff7cc4b163dceb6084270cc589393f1" + } + Frame { + msec: 32 + hash: "1012b52727ae98522061945e32a6269a" + } + Frame { + msec: 48 + hash: "06c3f3c1fa014b0eb7341e0a45ca16e4" + } + Frame { + msec: 64 + hash: "71ecb0af25649c056310d3b865d4144d" + } + Frame { + msec: 80 + hash: "e249fe5b113797433f96a2f84d47e42b" + } + Frame { + msec: 96 + hash: "2a7256921c25c79c22263f2b48d4e98c" + } + Frame { + msec: 112 + hash: "8657944b456402622f2991a0c9acc2fb" + } + Frame { + msec: 128 + hash: "c919a94cd7afb1fbad4c88537af00869" + } + Frame { + msec: 144 + hash: "303b5057d94e328f9447a01d54eea93d" + } + Frame { + msec: 160 + hash: "72eb974dc008c9454935b18b47d4d9e6" + } + Frame { + msec: 176 + hash: "545f258cb0ec7f5d951b74cc7d3f4f0d" + } + Frame { + msec: 192 + hash: "3b3d6046fb01adf7c8a7f67bbc46d28e" + } + Frame { + msec: 208 + hash: "12f7556076cf7a4c2f029dab80e666e7" + } + Frame { + msec: 224 + hash: "fab272c7dce2bbee4042764d38c7ceb5" + } + Frame { + msec: 240 + hash: "ff8addee408527bbaed1819bae07c23f" + } + Frame { + msec: 256 + hash: "53eb6f575db2af3635139e5ddbd7b2f9" + } + Frame { + msec: 272 + hash: "a2fa1cf169acb8ff26a2c5ec1f1d5c81" + } + Frame { + msec: 288 + hash: "ab8d5d6d146ed11b92bc93e78f28e50c" + } + Frame { + msec: 304 + hash: "0fbfc6609b082008e44592067b18ab63" + } + Frame { + msec: 320 + hash: "7fbeda19c19c62a0af5f7f98e633993f" + } + Frame { + msec: 336 + hash: "1882b591bc9d4e79d69d0baecb78b700" + } + Frame { + msec: 352 + hash: "dde429007f876206f3ec0c68d239983e" + } + Frame { + msec: 368 + hash: "b656bdba2978a9a1af511cc2bb0cb59a" + } + Frame { + msec: 384 + hash: "1f6573bf67b2893c94f0c2d40213dc73" + } + Frame { + msec: 400 + hash: "f5786fb532300a1b2f820251fc17c775" + } + Frame { + msec: 416 + hash: "a0e9c4bd3b6c4cdadd40bdf3ca5e2986" + } + Frame { + msec: 432 + hash: "073f74ab23a1173025b3c63424ce2697" + } + Frame { + msec: 448 + hash: "1ac1367d21e346c6c652a88b9ea25bfc" + } + Frame { + msec: 464 + hash: "f62720308dc9ae67c3856bc3afb32b75" + } + Frame { + msec: 480 + hash: "066476a57efba802d2497bc3731a3583" + } + Frame { + msec: 496 + hash: "fb965028a760e8d0a4d81fd982a18ff3" + } + Frame { + msec: 512 + hash: "ba008abd1a7a73c750b909d57c043649" + } + Frame { + msec: 528 + hash: "4c974470953f74d1ee7bcd0f4a4c48cf" + } + Frame { + msec: 544 + hash: "ea233f3476da26c90d67b7775b718aa2" + } + Frame { + msec: 560 + hash: "e12c3b810c0aa628d7a3827453bea9f3" + } + Frame { + msec: 576 + hash: "7451954ca0465c430fc4bae84f6d97cb" + } + Frame { + msec: 592 + hash: "503e40f193a8b099daa4013eddc2f664" + } + Frame { + msec: 608 + hash: "1f81acf94f325a51faa7aa61e73f8a25" + } + Frame { + msec: 624 + hash: "0257d7d53eda8afe182a9f97ef451679" + } + Frame { + msec: 640 + hash: "cfc260bdc977ef16311840022cc85378" + } + Frame { + msec: 656 + hash: "27483f0b89d727b32722ea153fad30ad" + } + Frame { + msec: 672 + hash: "355afa11b8e7b24a353d1aa79daf7564" + } + Frame { + msec: 688 + hash: "bbc1d55f346719476f471a2294227bda" + } + Frame { + msec: 704 + hash: "9bbab5ff75219d8bd65022c6d061e57a" + } + Frame { + msec: 720 + hash: "ff0699f02845f3c5cf5aabb19198c346" + } + Frame { + msec: 736 + hash: "26768e09270ade4c5b484154e7042f43" + } + Frame { + msec: 752 + hash: "31c9ae63071de3fb2f7e1836a22515cb" + } + Frame { + msec: 768 + hash: "783ce2acdae8d87883151532c9293336" + } + Frame { + msec: 784 + hash: "86b9fd739f437127e0cc4d7dcd4284bd" + } + Frame { + msec: 800 + hash: "5e1d6e164dd184cc197d514e5ff60a4c" + } + Frame { + msec: 816 + hash: "13063a8d73704165d64dd2a95803ec0f" + } + Frame { + msec: 832 + hash: "c244e0c0d60f4be2e017bba21a17ab3f" + } + Frame { + msec: 848 + hash: "b3bd657873f1b49c888b9b98d8c0e23f" + } + Frame { + msec: 864 + hash: "65a011e4f62ecddd820bdbdeb0084b65" + } + Frame { + msec: 880 + hash: "86018de7b4a93b267fe94c4de9e61bab" + } + Frame { + msec: 896 + hash: "44827055c99ae3ed924c101c9d1be5c5" + } + Frame { + msec: 912 + hash: "1c31fcb20ec1abc7ea815b703ae05363" + } + Frame { + msec: 928 + hash: "9d7825b7b05ca696846a4116ab27f966" + } + Frame { + msec: 944 + hash: "61b6690dd14fc76dbac4d785bbddb8ee" + } + Frame { + msec: 960 + image: "loop.0.png" + } + Frame { + msec: 976 + hash: "2cc40e1119060483ae067f3881af0391" + } + Frame { + msec: 992 + hash: "9747fdff3429f7a2dbc9e3173ad43a67" + } + Frame { + msec: 1008 + hash: "e68058b9565138f2d7f0f96b74c38dec" + } + Frame { + msec: 1024 + hash: "f32aceabb929471dffd73bf0290e75a2" + } + Frame { + msec: 1040 + hash: "9112838cc8f9a0cfb94e0ef6ca7eca71" + } + Frame { + msec: 1056 + hash: "53bd2c46e3a11db0ee151a6a0311b3a8" + } + Frame { + msec: 1072 + hash: "d5105f958a592324e53aae4a83beb049" + } + Frame { + msec: 1088 + hash: "862249432e6fc6114b63284ad9c97cb6" + } + Frame { + msec: 1104 + hash: "3e6a6f505aa146a6789434d265ad4d3b" + } + Frame { + msec: 1120 + hash: "0f5b2b05f72b86bd2b0a6d0ea2b6bf37" + } + Frame { + msec: 1136 + hash: "922520f7ec954d6d1061208cbd63877e" + } + Frame { + msec: 1152 + hash: "d1c02f3ce4bcc96e0c3d2503a0e9aa48" + } + Frame { + msec: 1168 + hash: "ebb41112b687ecb062dedc3b49cb93fc" + } + Frame { + msec: 1184 + hash: "7bc87d71d532aa52abc26ac9c1cbb665" + } + Frame { + msec: 1200 + hash: "1a7a81f851c8817cac3cc0cb7ac07971" + } + Frame { + msec: 1216 + hash: "ca17c870c55f2947bb5f85d28f30ee7c" + } + Frame { + msec: 1232 + hash: "48b123cfd6d2ea1c2bc9f2ba822ec7bf" + } + Frame { + msec: 1248 + hash: "2a6b8aecef26793e200993dc1e25fd95" + } + Frame { + msec: 1264 + hash: "f10a0a11ed54a910fe434311f67343a4" + } + Frame { + msec: 1280 + hash: "47b6e1beabdcd3cd3d21d77c62e5bed8" + } + Frame { + msec: 1296 + hash: "1eea7eb2853a9e7a1a69738667457b7a" + } + Frame { + msec: 1312 + hash: "9e018f9e7a5ba22bbb9be3049373124a" + } + Frame { + msec: 1328 + hash: "d63069a8e7b0eb5611cc34caaecef2fb" + } + Frame { + msec: 1344 + hash: "def9383a090e4454343725f1a7c4fb3d" + } + Frame { + msec: 1360 + hash: "fd3036e559fd31eeadb0032666a95864" + } + Frame { + msec: 1376 + hash: "cf9f82b9e2a03f63f75b6ac113b3d4e5" + } + Frame { + msec: 1392 + hash: "346e7f597cfb4fc51d5393e705deddd5" + } + Frame { + msec: 1408 + hash: "0d6d6cb2ca808f5a57acfa32e10fc335" + } + Frame { + msec: 1424 + hash: "9a660a0fed41211a37d3ac82be40f81a" + } + Frame { + msec: 1440 + hash: "df3fd60ecbd517879e00e8112c49bed4" + } + Frame { + msec: 1456 + hash: "cd86fe5894e5d061f7ffe37913f00ce6" + } + Frame { + msec: 1472 + hash: "a5fdb825c18d43f3ae18f5c28e715174" + } + Frame { + msec: 1488 + hash: "0fdfb5f9463def560da6c19acf96bafb" + } + Frame { + msec: 1504 + hash: "8849a36af064503dbccad69a35b6ab03" + } + Frame { + msec: 1520 + hash: "baeb4f90b0e2efc09225dbb5dd003e9e" + } + Frame { + msec: 1536 + hash: "86922e71c80976ef3aa2cab18f86c010" + } + Frame { + msec: 1552 + hash: "10d166d7da9949370a66251415522186" + } + Frame { + msec: 1568 + hash: "ada1608055b221dc9f1f7650a9764930" + } + Frame { + msec: 1584 + hash: "dd25ffb9a6bf009139b2942f9cc1f8e7" + } + Frame { + msec: 1600 + hash: "dc4a1c44d08328965b53ff079a8fa57b" + } + Frame { + msec: 1616 + hash: "d3d88cf635ba38e5035732cb36014417" + } + Frame { + msec: 1632 + hash: "be5e44f6b9978ba3b9ae878ae5758a96" + } + Frame { + msec: 1648 + hash: "34f193daf199ab45310be2b407499e57" + } + Frame { + msec: 1664 + hash: "d87c854e1c16642dba0d87e25f0e416f" + } + Frame { + msec: 1680 + hash: "08c404f4efd27695071ad52fbfa57c0b" + } + Frame { + msec: 1696 + hash: "84828f8e0cace1a39d9b7f19b6e4cbaa" + } + Frame { + msec: 1712 + hash: "8a0c6e1f597e699c3e2be816ae4e1dd4" + } + Frame { + msec: 1728 + hash: "9aecb0c464fb140725f34ad94ede367a" + } + Frame { + msec: 1744 + hash: "a298b3ab2939819ced7e7f903ec63be4" + } + Frame { + msec: 1760 + hash: "99789b6e168355a3960986c7d1f21f82" + } + Frame { + msec: 1776 + hash: "ebd37ee719ca460480521fd4ec284a3f" + } + Frame { + msec: 1792 + hash: "9c9b3fb5b623d3deaf9920c99279d71b" + } + Frame { + msec: 1808 + hash: "8f0be6d4d6fd7f66a43fd604e17717dd" + } + Frame { + msec: 1824 + hash: "854defd35cf3315e4501583756814ff6" + } + Frame { + msec: 1840 + hash: "fd7157aef6dfb303472cd33b176f91d8" + } + Frame { + msec: 1856 + hash: "e6521a3c74c190c193af2c913e5326e2" + } + Frame { + msec: 1872 + hash: "19862dcb88fcbbb2c4ecdc42821c7fef" + } + Frame { + msec: 1888 + hash: "5e29a9f9c6c4131c5b71f84d24503ad2" + } + Frame { + msec: 1904 + hash: "140e63c071ef77d26034d0bb6a5d5b7a" + } + Frame { + msec: 1920 + image: "loop.1.png" + } + Frame { + msec: 1936 + hash: "7f79dd50a0af8e8871191ee80afcad0f" + } + Frame { + msec: 1952 + hash: "a5eb3334044999f56c759ce8727d627f" + } + Frame { + msec: 1968 + hash: "3fb70a7591b6decfa44f7cad18f73855" + } + Frame { + msec: 1984 + hash: "3fab99be73f7f12b9463dea359fc86d2" + } + Frame { + msec: 2000 + hash: "50ce6b869e42c949b84cf2dd0cca3af9" + } + Frame { + msec: 2016 + hash: "5369125b23e2f954c18f2fd4e0ba6f6a" + } + Frame { + msec: 2032 + hash: "a76f624be0db97ec4450b10f748065df" + } + Frame { + msec: 2048 + hash: "3fb70a7591b6decfa44f7cad18f73855" + } + Frame { + msec: 2064 + hash: "dada267799b6e57acfcc5de3b8822c7c" + } + Frame { + msec: 2080 + hash: "72c0bf8225504e86ff023242b84513a8" + } + Frame { + msec: 2096 + hash: "1e8b095c39bd359637b1b9c975ee514c" + } + Frame { + msec: 2112 + hash: "19862dcb88fcbbb2c4ecdc42821c7fef" + } + Frame { + msec: 2128 + hash: "60c95993a894e1c6e2d476db365b7746" + } + Frame { + msec: 2144 + hash: "854defd35cf3315e4501583756814ff6" + } + Frame { + msec: 2160 + hash: "15e8959bfa4d206b2f0607322b21cba6" + } + Frame { + msec: 2176 + hash: "ebd37ee719ca460480521fd4ec284a3f" + } + Frame { + msec: 2192 + hash: "6d278926822d044fff04c3f182dcb058" + } + Frame { + msec: 2208 + hash: "9aecb0c464fb140725f34ad94ede367a" + } + Frame { + msec: 2224 + hash: "b36f70f138e6deecf5b105bcd89d1a15" + } + Frame { + msec: 2240 + hash: "08c404f4efd27695071ad52fbfa57c0b" + } + Frame { + msec: 2256 + hash: "6469d0bee7ab280639b565ebf174f251" + } + Frame { + msec: 2272 + hash: "be5e44f6b9978ba3b9ae878ae5758a96" + } + Frame { + msec: 2288 + hash: "5214e578bc78b729ddf35c140093c0da" + } + Frame { + msec: 2304 + hash: "dd25ffb9a6bf009139b2942f9cc1f8e7" + } + Frame { + msec: 2320 + hash: "2ddf31aeac4815be56848703a9b5aa14" + } + Frame { + msec: 2336 + hash: "86922e71c80976ef3aa2cab18f86c010" + } + Frame { + msec: 2352 + hash: "d8415ba4fb19b62b838ef2e09ae7607a" + } + Frame { + msec: 2368 + hash: "0fdfb5f9463def560da6c19acf96bafb" + } + Frame { + msec: 2384 + hash: "68fac60713af7cb130e92fa381be411c" + } + Frame { + msec: 2400 + hash: "df3fd60ecbd517879e00e8112c49bed4" + } + Frame { + msec: 2416 + hash: "64e49282d97ba864d2f6be632ae048e4" + } + Frame { + msec: 2432 + hash: "346e7f597cfb4fc51d5393e705deddd5" + } + Frame { + msec: 2448 + hash: "f302a9ce45187ff1001c967a4c753b2b" + } + Frame { + msec: 2464 + hash: "def9383a090e4454343725f1a7c4fb3d" + } + Frame { + msec: 2480 + hash: "fd177a7ae3b5b9205fd38e955be327e0" + } + Frame { + msec: 2496 + hash: "1eea7eb2853a9e7a1a69738667457b7a" + } + Frame { + msec: 2512 + hash: "32b16dd62ccf06e44be38fd5885f297e" + } + Frame { + msec: 2528 + hash: "2a6b8aecef26793e200993dc1e25fd95" + } + Frame { + msec: 2544 + hash: "8637606843905d6ae3f95fcb745f2a6e" + } + Frame { + msec: 2560 + hash: "1a7a81f851c8817cac3cc0cb7ac07971" + } + Frame { + msec: 2576 + hash: "704ca30ddc0a637f3d1cd4926a6f7983" + } + Frame { + msec: 2592 + hash: "d1c02f3ce4bcc96e0c3d2503a0e9aa48" + } + Frame { + msec: 2608 + hash: "7759418b4fe412857ab8e7294f5a3206" + } + Frame { + msec: 2624 + hash: "3e6a6f505aa146a6789434d265ad4d3b" + } + Frame { + msec: 2640 + hash: "3e6089b47573cd53b0a220275202c80b" + } + Frame { + msec: 2656 + hash: "53bd2c46e3a11db0ee151a6a0311b3a8" + } + Frame { + msec: 2672 + hash: "f30202ae354a587c5949a16c1f8b95c3" + } + Frame { + msec: 2688 + hash: "66f78a34fe9d297af1ae8e98f84ead55" + } + Frame { + msec: 2704 + hash: "3e2fc29876812fe57ea008a71db299a4" + } + Frame { + msec: 2720 + hash: "7234b6df2220e418ef8ebe8f1c82bf26" + } + Frame { + msec: 2736 + hash: "82dd491c3b34e702a24ece8e55761a6f" + } + Frame { + msec: 2752 + hash: "d7f1065f5c42088dfc5ce36687fd8010" + } + Frame { + msec: 2768 + hash: "15bfbb0261b66ccbe3b34d0ac807165c" + } + Frame { + msec: 2784 + hash: "69963ce07eb434d787588b21fd020fa3" + } + Frame { + msec: 2800 + hash: "2fb9e078573ebd1a5cf0f615c97f1d20" + } + Frame { + msec: 2816 + hash: "31fa31ed47ea16390be8ea9d41f483e7" + } + Frame { + msec: 2832 + hash: "0f9ed8cd5cfbdab03bcb05cf6dd92620" + } + Frame { + msec: 2848 + hash: "a0e737132ae642c465e991e770ab3e34" + } + Frame { + msec: 2864 + hash: "d57cc5045f01ab4e7eb72575aef22a10" + } + Frame { + msec: 2880 + image: "loop.2.png" + } + Frame { + msec: 2896 + hash: "df41be1fa564353ceb2088af209610d3" + } + Frame { + msec: 2912 + hash: "2d294613ed10dfdbca829b43b6990574" + } + Frame { + msec: 2928 + hash: "0a278a4ec3626442c94ef2da30771171" + } + Frame { + msec: 2944 + hash: "7071526c830fdfde9d520ad1578d27a8" + } + Frame { + msec: 2960 + hash: "ad02e7b90f223d3fc5a433bc4ffbee9e" + } + Frame { + msec: 2976 + hash: "e7ef412697c7df3887980ed1b079ffd5" + } + Frame { + msec: 2992 + hash: "ebda21f95079b37f4862b42523bbc1c0" + } + Frame { + msec: 3008 + hash: "6e8889e9b44ff8ed44e228d97fb5034c" + } + Frame { + msec: 3024 + hash: "f32aceabb929471dffd73bf0290e75a2" + } + Frame { + msec: 3040 + hash: "9112838cc8f9a0cfb94e0ef6ca7eca71" + } + Frame { + msec: 3056 + hash: "53bd2c46e3a11db0ee151a6a0311b3a8" + } + Frame { + msec: 3072 + hash: "d5105f958a592324e53aae4a83beb049" + } + Frame { + msec: 3088 + hash: "862249432e6fc6114b63284ad9c97cb6" + } + Frame { + msec: 3104 + hash: "3e6a6f505aa146a6789434d265ad4d3b" + } + Frame { + msec: 3120 + hash: "0f5b2b05f72b86bd2b0a6d0ea2b6bf37" + } + Frame { + msec: 3136 + hash: "922520f7ec954d6d1061208cbd63877e" + } + Frame { + msec: 3152 + hash: "d1c02f3ce4bcc96e0c3d2503a0e9aa48" + } + Frame { + msec: 3168 + hash: "ebb41112b687ecb062dedc3b49cb93fc" + } + Frame { + msec: 3184 + hash: "7bc87d71d532aa52abc26ac9c1cbb665" + } + Frame { + msec: 3200 + hash: "1a7a81f851c8817cac3cc0cb7ac07971" + } + Frame { + msec: 3216 + hash: "ca17c870c55f2947bb5f85d28f30ee7c" + } + Frame { + msec: 3232 + hash: "48b123cfd6d2ea1c2bc9f2ba822ec7bf" + } + Frame { + msec: 3248 + hash: "2a6b8aecef26793e200993dc1e25fd95" + } + Frame { + msec: 3264 + hash: "f10a0a11ed54a910fe434311f67343a4" + } + Frame { + msec: 3280 + hash: "47b6e1beabdcd3cd3d21d77c62e5bed8" + } + Frame { + msec: 3296 + hash: "1eea7eb2853a9e7a1a69738667457b7a" + } + Frame { + msec: 3312 + hash: "9e018f9e7a5ba22bbb9be3049373124a" + } + Frame { + msec: 3328 + hash: "d63069a8e7b0eb5611cc34caaecef2fb" + } + Frame { + msec: 3344 + hash: "def9383a090e4454343725f1a7c4fb3d" + } + Frame { + msec: 3360 + hash: "fd3036e559fd31eeadb0032666a95864" + } + Frame { + msec: 3376 + hash: "cf9f82b9e2a03f63f75b6ac113b3d4e5" + } + Frame { + msec: 3392 + hash: "346e7f597cfb4fc51d5393e705deddd5" + } + Frame { + msec: 3408 + hash: "0d6d6cb2ca808f5a57acfa32e10fc335" + } + Frame { + msec: 3424 + hash: "9a660a0fed41211a37d3ac82be40f81a" + } + Frame { + msec: 3440 + hash: "df3fd60ecbd517879e00e8112c49bed4" + } + Frame { + msec: 3456 + hash: "cd86fe5894e5d061f7ffe37913f00ce6" + } + Frame { + msec: 3472 + hash: "a5fdb825c18d43f3ae18f5c28e715174" + } + Frame { + msec: 3488 + hash: "0fdfb5f9463def560da6c19acf96bafb" + } + Frame { + msec: 3504 + hash: "8849a36af064503dbccad69a35b6ab03" + } + Frame { + msec: 3520 + hash: "baeb4f90b0e2efc09225dbb5dd003e9e" + } + Frame { + msec: 3536 + hash: "86922e71c80976ef3aa2cab18f86c010" + } + Frame { + msec: 3552 + hash: "10d166d7da9949370a66251415522186" + } + Frame { + msec: 3568 + hash: "ada1608055b221dc9f1f7650a9764930" + } + Frame { + msec: 3584 + hash: "dd25ffb9a6bf009139b2942f9cc1f8e7" + } + Frame { + msec: 3600 + hash: "dc4a1c44d08328965b53ff079a8fa57b" + } + Frame { + msec: 3616 + hash: "d3d88cf635ba38e5035732cb36014417" + } + Frame { + msec: 3632 + hash: "be5e44f6b9978ba3b9ae878ae5758a96" + } + Frame { + msec: 3648 + hash: "34f193daf199ab45310be2b407499e57" + } + Frame { + msec: 3664 + hash: "d87c854e1c16642dba0d87e25f0e416f" + } + Frame { + msec: 3680 + hash: "08c404f4efd27695071ad52fbfa57c0b" + } + Frame { + msec: 3696 + hash: "84828f8e0cace1a39d9b7f19b6e4cbaa" + } + Frame { + msec: 3712 + hash: "8a0c6e1f597e699c3e2be816ae4e1dd4" + } + Frame { + msec: 3728 + hash: "9aecb0c464fb140725f34ad94ede367a" + } + Frame { + msec: 3744 + hash: "a298b3ab2939819ced7e7f903ec63be4" + } + Frame { + msec: 3760 + hash: "99789b6e168355a3960986c7d1f21f82" + } + Frame { + msec: 3776 + hash: "ebd37ee719ca460480521fd4ec284a3f" + } + Frame { + msec: 3792 + hash: "9c9b3fb5b623d3deaf9920c99279d71b" + } + Frame { + msec: 3808 + hash: "8f0be6d4d6fd7f66a43fd604e17717dd" + } + Frame { + msec: 3824 + hash: "854defd35cf3315e4501583756814ff6" + } + Frame { + msec: 3840 + image: "loop.3.png" + } + Frame { + msec: 3856 + hash: "e6521a3c74c190c193af2c913e5326e2" + } + Frame { + msec: 3872 + hash: "19862dcb88fcbbb2c4ecdc42821c7fef" + } + Frame { + msec: 3888 + hash: "5e29a9f9c6c4131c5b71f84d24503ad2" + } + Frame { + msec: 3904 + hash: "140e63c071ef77d26034d0bb6a5d5b7a" + } + Frame { + msec: 3920 + hash: "72c0bf8225504e86ff023242b84513a8" + } + Frame { + msec: 3936 + hash: "7f79dd50a0af8e8871191ee80afcad0f" + } + Frame { + msec: 3952 + hash: "a5eb3334044999f56c759ce8727d627f" + } + Frame { + msec: 3968 + hash: "3fb70a7591b6decfa44f7cad18f73855" + } + Frame { + msec: 3984 + hash: "3fab99be73f7f12b9463dea359fc86d2" + } + Frame { + msec: 4000 + hash: "50ce6b869e42c949b84cf2dd0cca3af9" + } + Frame { + msec: 4016 + hash: "5369125b23e2f954c18f2fd4e0ba6f6a" + } + Frame { + msec: 4032 + hash: "a76f624be0db97ec4450b10f748065df" + } + Frame { + msec: 4048 + hash: "3fb70a7591b6decfa44f7cad18f73855" + } + Frame { + msec: 4064 + hash: "dada267799b6e57acfcc5de3b8822c7c" + } + Frame { + msec: 4080 + hash: "72c0bf8225504e86ff023242b84513a8" + } + Frame { + msec: 4096 + hash: "1e8b095c39bd359637b1b9c975ee514c" + } + Frame { + msec: 4112 + hash: "19862dcb88fcbbb2c4ecdc42821c7fef" + } + Frame { + msec: 4128 + hash: "60c95993a894e1c6e2d476db365b7746" + } + Frame { + msec: 4144 + hash: "854defd35cf3315e4501583756814ff6" + } + Frame { + msec: 4160 + hash: "15e8959bfa4d206b2f0607322b21cba6" + } + Frame { + msec: 4176 + hash: "ebd37ee719ca460480521fd4ec284a3f" + } + Frame { + msec: 4192 + hash: "6d278926822d044fff04c3f182dcb058" + } + Frame { + msec: 4208 + hash: "9aecb0c464fb140725f34ad94ede367a" + } + Frame { + msec: 4224 + hash: "b36f70f138e6deecf5b105bcd89d1a15" + } + Frame { + msec: 4240 + hash: "08c404f4efd27695071ad52fbfa57c0b" + } + Frame { + msec: 4256 + hash: "6469d0bee7ab280639b565ebf174f251" + } + Frame { + msec: 4272 + hash: "be5e44f6b9978ba3b9ae878ae5758a96" + } + Frame { + msec: 4288 + hash: "5214e578bc78b729ddf35c140093c0da" + } + Frame { + msec: 4304 + hash: "dd25ffb9a6bf009139b2942f9cc1f8e7" + } + Frame { + msec: 4320 + hash: "2ddf31aeac4815be56848703a9b5aa14" + } + Frame { + msec: 4336 + hash: "86922e71c80976ef3aa2cab18f86c010" + } + Frame { + msec: 4352 + hash: "d8415ba4fb19b62b838ef2e09ae7607a" + } + Frame { + msec: 4368 + hash: "0fdfb5f9463def560da6c19acf96bafb" + } + Frame { + msec: 4384 + hash: "68fac60713af7cb130e92fa381be411c" + } + Frame { + msec: 4400 + hash: "df3fd60ecbd517879e00e8112c49bed4" + } + Frame { + msec: 4416 + hash: "64e49282d97ba864d2f6be632ae048e4" + } + Frame { + msec: 4432 + hash: "346e7f597cfb4fc51d5393e705deddd5" + } + Frame { + msec: 4448 + hash: "f302a9ce45187ff1001c967a4c753b2b" + } + Frame { + msec: 4464 + hash: "def9383a090e4454343725f1a7c4fb3d" + } + Frame { + msec: 4480 + hash: "fd177a7ae3b5b9205fd38e955be327e0" + } + Frame { + msec: 4496 + hash: "1eea7eb2853a9e7a1a69738667457b7a" + } + Frame { + msec: 4512 + hash: "32b16dd62ccf06e44be38fd5885f297e" + } + Frame { + msec: 4528 + hash: "2a6b8aecef26793e200993dc1e25fd95" + } + Frame { + msec: 4544 + hash: "8637606843905d6ae3f95fcb745f2a6e" + } + Frame { + msec: 4560 + hash: "1a7a81f851c8817cac3cc0cb7ac07971" + } + Frame { + msec: 4576 + hash: "704ca30ddc0a637f3d1cd4926a6f7983" + } + Frame { + msec: 4592 + hash: "d1c02f3ce4bcc96e0c3d2503a0e9aa48" + } + Frame { + msec: 4608 + hash: "7759418b4fe412857ab8e7294f5a3206" + } + Frame { + msec: 4624 + hash: "3e6a6f505aa146a6789434d265ad4d3b" + } + Frame { + msec: 4640 + hash: "3e6089b47573cd53b0a220275202c80b" + } + Frame { + msec: 4656 + hash: "53bd2c46e3a11db0ee151a6a0311b3a8" + } + Frame { + msec: 4672 + hash: "f30202ae354a587c5949a16c1f8b95c3" + } + Frame { + msec: 4688 + hash: "66f78a34fe9d297af1ae8e98f84ead55" + } + Frame { + msec: 4704 + hash: "3e2fc29876812fe57ea008a71db299a4" + } + Frame { + msec: 4720 + hash: "7234b6df2220e418ef8ebe8f1c82bf26" + } + Frame { + msec: 4736 + hash: "82dd491c3b34e702a24ece8e55761a6f" + } + Frame { + msec: 4752 + hash: "d7f1065f5c42088dfc5ce36687fd8010" + } + Frame { + msec: 4768 + hash: "15bfbb0261b66ccbe3b34d0ac807165c" + } + Frame { + msec: 4784 + hash: "69963ce07eb434d787588b21fd020fa3" + } + Frame { + msec: 4800 + image: "loop.4.png" + } + Frame { + msec: 4816 + hash: "31fa31ed47ea16390be8ea9d41f483e7" + } + Frame { + msec: 4832 + hash: "0f9ed8cd5cfbdab03bcb05cf6dd92620" + } + Frame { + msec: 4848 + hash: "a0e737132ae642c465e991e770ab3e34" + } + Frame { + msec: 4864 + hash: "d57cc5045f01ab4e7eb72575aef22a10" + } + Frame { + msec: 4880 + hash: "d57e1a10e48938e1f7fc219220fe1204" + } + Frame { + msec: 4896 + hash: "df41be1fa564353ceb2088af209610d3" + } + Frame { + msec: 4912 + hash: "2d294613ed10dfdbca829b43b6990574" + } + Frame { + msec: 4928 + hash: "0a278a4ec3626442c94ef2da30771171" + } + Frame { + msec: 4944 + hash: "7071526c830fdfde9d520ad1578d27a8" + } + Frame { + msec: 4960 + hash: "ad02e7b90f223d3fc5a433bc4ffbee9e" + } + Frame { + msec: 4976 + hash: "e7ef412697c7df3887980ed1b079ffd5" + } + Frame { + msec: 4992 + hash: "ebda21f95079b37f4862b42523bbc1c0" + } + Frame { + msec: 5008 + hash: "6e8889e9b44ff8ed44e228d97fb5034c" + } + Frame { + msec: 5024 + hash: "f32aceabb929471dffd73bf0290e75a2" + } + Frame { + msec: 5040 + hash: "9112838cc8f9a0cfb94e0ef6ca7eca71" + } + Frame { + msec: 5056 + hash: "53bd2c46e3a11db0ee151a6a0311b3a8" + } + Frame { + msec: 5072 + hash: "d5105f958a592324e53aae4a83beb049" + } + Frame { + msec: 5088 + hash: "862249432e6fc6114b63284ad9c97cb6" + } + Frame { + msec: 5104 + hash: "3e6a6f505aa146a6789434d265ad4d3b" + } + Frame { + msec: 5120 + hash: "0f5b2b05f72b86bd2b0a6d0ea2b6bf37" + } + Frame { + msec: 5136 + hash: "922520f7ec954d6d1061208cbd63877e" + } + Frame { + msec: 5152 + hash: "d1c02f3ce4bcc96e0c3d2503a0e9aa48" + } + Frame { + msec: 5168 + hash: "ebb41112b687ecb062dedc3b49cb93fc" + } + Frame { + msec: 5184 + hash: "7bc87d71d532aa52abc26ac9c1cbb665" + } + Frame { + msec: 5200 + hash: "1a7a81f851c8817cac3cc0cb7ac07971" + } + Frame { + msec: 5216 + hash: "ca17c870c55f2947bb5f85d28f30ee7c" + } + Frame { + msec: 5232 + hash: "48b123cfd6d2ea1c2bc9f2ba822ec7bf" + } + Frame { + msec: 5248 + hash: "2a6b8aecef26793e200993dc1e25fd95" + } + Frame { + msec: 5264 + hash: "f10a0a11ed54a910fe434311f67343a4" + } + Frame { + msec: 5280 + hash: "47b6e1beabdcd3cd3d21d77c62e5bed8" + } + Frame { + msec: 5296 + hash: "1eea7eb2853a9e7a1a69738667457b7a" + } + Frame { + msec: 5312 + hash: "9e018f9e7a5ba22bbb9be3049373124a" + } + Frame { + msec: 5328 + hash: "d63069a8e7b0eb5611cc34caaecef2fb" + } + Frame { + msec: 5344 + hash: "def9383a090e4454343725f1a7c4fb3d" + } + Frame { + msec: 5360 + hash: "fd3036e559fd31eeadb0032666a95864" + } + Frame { + msec: 5376 + hash: "cf9f82b9e2a03f63f75b6ac113b3d4e5" + } + Frame { + msec: 5392 + hash: "346e7f597cfb4fc51d5393e705deddd5" + } + Frame { + msec: 5408 + hash: "0d6d6cb2ca808f5a57acfa32e10fc335" + } + Frame { + msec: 5424 + hash: "9a660a0fed41211a37d3ac82be40f81a" + } + Frame { + msec: 5440 + hash: "df3fd60ecbd517879e00e8112c49bed4" + } + Frame { + msec: 5456 + hash: "cd86fe5894e5d061f7ffe37913f00ce6" + } + Frame { + msec: 5472 + hash: "a5fdb825c18d43f3ae18f5c28e715174" + } + Frame { + msec: 5488 + hash: "0fdfb5f9463def560da6c19acf96bafb" + } + Frame { + msec: 5504 + hash: "8849a36af064503dbccad69a35b6ab03" + } + Frame { + msec: 5520 + hash: "baeb4f90b0e2efc09225dbb5dd003e9e" + } + Frame { + msec: 5536 + hash: "86922e71c80976ef3aa2cab18f86c010" + } + Frame { + msec: 5552 + hash: "10d166d7da9949370a66251415522186" + } + Frame { + msec: 5568 + hash: "ada1608055b221dc9f1f7650a9764930" + } + Frame { + msec: 5584 + hash: "dd25ffb9a6bf009139b2942f9cc1f8e7" + } + Frame { + msec: 5600 + hash: "dc4a1c44d08328965b53ff079a8fa57b" + } + Frame { + msec: 5616 + hash: "d3d88cf635ba38e5035732cb36014417" + } + Frame { + msec: 5632 + hash: "be5e44f6b9978ba3b9ae878ae5758a96" + } + Frame { + msec: 5648 + hash: "34f193daf199ab45310be2b407499e57" + } + Frame { + msec: 5664 + hash: "d87c854e1c16642dba0d87e25f0e416f" + } + Frame { + msec: 5680 + hash: "08c404f4efd27695071ad52fbfa57c0b" + } + Frame { + msec: 5696 + hash: "84828f8e0cace1a39d9b7f19b6e4cbaa" + } + Frame { + msec: 5712 + hash: "8a0c6e1f597e699c3e2be816ae4e1dd4" + } + Frame { + msec: 5728 + hash: "9aecb0c464fb140725f34ad94ede367a" + } + Frame { + msec: 5744 + hash: "a298b3ab2939819ced7e7f903ec63be4" + } + Frame { + msec: 5760 + image: "loop.5.png" + } + Frame { + msec: 5776 + hash: "ebd37ee719ca460480521fd4ec284a3f" + } + Frame { + msec: 5792 + hash: "9c9b3fb5b623d3deaf9920c99279d71b" + } + Frame { + msec: 5808 + hash: "8f0be6d4d6fd7f66a43fd604e17717dd" + } + Frame { + msec: 5824 + hash: "854defd35cf3315e4501583756814ff6" + } + Frame { + msec: 5840 + hash: "fd7157aef6dfb303472cd33b176f91d8" + } + Frame { + msec: 5856 + hash: "e6521a3c74c190c193af2c913e5326e2" + } +} diff --git a/tests/auto/declarative/visual/animation/loop/loop.qml b/tests/auto/declarative/visual/animation/loop/loop.qml new file mode 100644 index 0000000..f6049ae --- /dev/null +++ b/tests/auto/declarative/visual/animation/loop/loop.qml @@ -0,0 +1,24 @@ +import Qt 4.6 + +Rectangle { + id: wrapper + width: 600 + height: 100 + + Rectangle { + id: redRect + width: 100; height: 100 + color: Qt.rgba(1,0,0) + /* This should produce an animation that starts at 0, animates smoothly + to 100, jumps to 200, animates smoothly to 400, animates smoothly + back to 100, jumps to 200, and so on. + */ + x: SequentialAnimation { + repeat: true + NumberAnimation { to: 100; duration: 1000 } + NumberAnimation { from: 200; to: 400; duration: 1000 } + } + + } + +} diff --git a/tests/auto/declarative/visual/animation/parallelAnimation/parallelAnimation.qml b/tests/auto/declarative/visual/animation/parallelAnimation/parallelAnimation.qml index 9e0422f..1980b91 100644 --- a/tests/auto/declarative/visual/animation/parallelAnimation/parallelAnimation.qml +++ b/tests/auto/declarative/visual/animation/parallelAnimation/parallelAnimation.qml @@ -14,7 +14,7 @@ Rectangle { color: "red" } - MouseRegion { + MouseArea { anchors.fill: parent onClicked: parent.state = "state1" } @@ -34,10 +34,10 @@ Rectangle { } transitions: Transition { - PropertyAnimation { matchTargets: redRect; matchProperties: "x,color"; duration: 300 } + PropertyAnimation { targets: redRect; properties: "x,color"; duration: 300 } ParallelAnimation { - NumberAnimation { matchTargets: redRect2; matchProperties: "x"; duration: 300 } - ColorAnimation { matchTargets: redRect2; matchProperties: "color"; duration: 300 } + NumberAnimation { targets: redRect2; properties: "x"; duration: 300 } + ColorAnimation { targets: redRect2; properties: "color"; duration: 300 } } } } diff --git a/tests/auto/declarative/visual/animation/parentAction/parentAction.qml b/tests/auto/declarative/visual/animation/parentAction/parentAction.qml index 1e3f402..eb3103e 100644 --- a/tests/auto/declarative/visual/animation/parentAction/parentAction.qml +++ b/tests/auto/declarative/visual/animation/parentAction/parentAction.qml @@ -15,7 +15,7 @@ Rectangle { color: "red" } } - MouseRegion { + MouseArea { id: clickable anchors.fill: parent } @@ -49,7 +49,7 @@ Rectangle { SequentialAnimation { ColorAnimation { duration: 500} ParentAction {} - NumberAnimation { matchProperties: "rotation, scale"; duration: 1000 } + NumberAnimation { properties: "rotation, scale"; duration: 1000 } } } } diff --git a/tests/auto/declarative/visual/animation/propertyAction/propertyAction.qml b/tests/auto/declarative/visual/animation/propertyAction/propertyAction.qml index b670166..593f495 100644 --- a/tests/auto/declarative/visual/animation/propertyAction/propertyAction.qml +++ b/tests/auto/declarative/visual/animation/propertyAction/propertyAction.qml @@ -7,7 +7,7 @@ Rectangle { width: 100; height: 100 color: "red" } - MouseRegion { + MouseArea { id: clickable anchors.fill: parent } @@ -27,8 +27,8 @@ Rectangle { reversible: true SequentialAnimation { ColorAnimation {} - PropertyAction { matchProperties: "x" } - NumberAnimation { matchProperties: "y"; easing: "InOutQuad" } + PropertyAction { properties: "x" } + NumberAnimation { properties: "y"; easing: "InOutQuad" } } } } diff --git a/tests/auto/declarative/visual/animation/reanchor/reanchor.qml b/tests/auto/declarative/visual/animation/reanchor/reanchor.qml index 1cc68a9..d80631f 100644 --- a/tests/auto/declarative/visual/animation/reanchor/reanchor.qml +++ b/tests/auto/declarative/visual/animation/reanchor/reanchor.qml @@ -19,7 +19,7 @@ Rectangle { Item { id: topGuideline2; y: 50 } Item { id: bottomGuideline2; y: 175 } - MouseRegion { + MouseArea { id: wholeArea anchors.fill: parent onClicked: { @@ -52,10 +52,10 @@ Rectangle { }] transitions: Transition { - NumberAnimation { matchProperties: "x,y,width,height" } + NumberAnimation { properties: "x,y,width,height" } } - MouseRegion { + MouseArea { width: 50; height: 50 anchors.right: parent.right anchors.bottom: parent.bottom diff --git a/tests/auto/declarative/visual/animation/scriptAction/scriptAction.qml b/tests/auto/declarative/visual/animation/scriptAction/scriptAction.qml index 872701b..30d587a 100644 --- a/tests/auto/declarative/visual/animation/scriptAction/scriptAction.qml +++ b/tests/auto/declarative/visual/animation/scriptAction/scriptAction.qml @@ -7,7 +7,7 @@ Rectangle { width: 100; height: 100 color: "red" } - MouseRegion { + MouseArea { id: clickable anchors.fill: parent } @@ -27,9 +27,9 @@ Rectangle { transitions: Transition { SequentialAnimation { - NumberAnimation { matchProperties: "x"; easing: "InOutQuad" } + NumberAnimation { properties: "x"; easing: "InOutQuad" } ScriptAction { stateChangeScriptName: "setColor" } - NumberAnimation { matchProperties: "y"; easing: "InOutQuad" } + NumberAnimation { properties: "y"; easing: "InOutQuad" } } } } diff --git a/tests/auto/declarative/visual/qmlgraphicsflickable/data/flickable-vertical.qml b/tests/auto/declarative/visual/qmlgraphicsflickable/data/flickable-vertical.qml index c376e39..db70298 100644 --- a/tests/auto/declarative/visual/qmlgraphicsflickable/data/flickable-vertical.qml +++ b/tests/auto/declarative/visual/qmlgraphicsflickable/data/flickable-vertical.qml @@ -7034,4 +7034,4 @@ VisualTest { } Frame { msec: 23264 - hash: "8443c45791c906a9fe23831844f48a1c
\ No newline at end of file + hash: "8443c45791c906a9fe23831844f48a1c diff --git a/tests/auto/declarative/visual/qmlgraphicsflickable/flickable-vertical.qml b/tests/auto/declarative/visual/qmlgraphicsflickable/flickable-vertical.qml index cc15755..6204aa9 100644 --- a/tests/auto/declarative/visual/qmlgraphicsflickable/flickable-vertical.qml +++ b/tests/auto/declarative/visual/qmlgraphicsflickable/flickable-vertical.qml @@ -25,7 +25,7 @@ Rectangle { Repeater { model: list Rectangle { width: 300; height: 200; color: mr.pressed ? "black" : dayColor - MouseRegion { + MouseArea { id: mr anchors.fill: parent } @@ -49,7 +49,7 @@ Rectangle { height: 48 y: parent.height - 50 color: "red" - MouseRegion { + MouseArea { anchors.fill: parent onClicked: flick.interactive = flick.interactive ? false : true } @@ -62,7 +62,7 @@ Rectangle { x: 66 y: parent.height - 50 color: "green" - MouseRegion { + MouseArea { anchors.fill: parent onClicked: flick.pressDelay = flick.pressDelay > 0 ? 0 : 500 } @@ -75,7 +75,7 @@ Rectangle { x: 130 y: parent.height - 50 color: "yellow" - MouseRegion { + MouseArea { anchors.fill: parent onClicked: flick.overShoot = flick.overShoot > 0 ? 0 : 30 } diff --git a/tests/auto/declarative/visual/qmlgraphicsflipable/test-flipable.qml b/tests/auto/declarative/visual/qmlgraphicsflipable/test-flipable.qml index 64adb61..c33a319 100644 --- a/tests/auto/declarative/visual/qmlgraphicsflipable/test-flipable.qml +++ b/tests/auto/declarative/visual/qmlgraphicsflipable/test-flipable.qml @@ -36,7 +36,7 @@ Rectangle { } transitions: Transition { - NumberAnimation { easing: "easeInOutQuad"; matchProperties: "angle"; duration: 3000 } + NumberAnimation { easing: "easeInOutQuad"; properties: "angle"; duration: 3000 } } } @@ -64,7 +64,7 @@ Rectangle { } transitions: Transition { - NumberAnimation { easing: "easeInOutQuad"; matchProperties: "angle"; duration: 3000 } + NumberAnimation { easing: "easeInOutQuad"; properties: "angle"; duration: 3000 } } } diff --git a/tests/auto/declarative/visual/qmlgraphicspathview/test-pathview.qml b/tests/auto/declarative/visual/qmlgraphicspathview/test-pathview.qml index 70018b6..0adfa02 100644 --- a/tests/auto/declarative/visual/qmlgraphicspathview/test-pathview.qml +++ b/tests/auto/declarative/visual/qmlgraphicspathview/test-pathview.qml @@ -22,7 +22,7 @@ Rectangle { width: 85; height: 85; color: lColor scale: wrapper.PathView.scale - MouseRegion { anchors.fill: parent } + MouseArea { anchors.fill: parent } transform: Rotation { id: itemRotation; origin.x: wrapper.width/2; origin.y: wrapper.height/2 diff --git a/tests/auto/declarative/visual/qmlgraphicspositioners/dynamic.qml b/tests/auto/declarative/visual/qmlgraphicspositioners/dynamic.qml index 4b03749..f45e9a4 100644 --- a/tests/auto/declarative/visual/qmlgraphicspositioners/dynamic.qml +++ b/tests/auto/declarative/visual/qmlgraphicspositioners/dynamic.qml @@ -37,7 +37,7 @@ Item { Row{ y:20 id: row2 - move: Transition{NumberAnimation{matchProperties:"x"}} + move: Transition{NumberAnimation{properties:"x"}} Repeater{ id: repeater model: 0; @@ -48,7 +48,7 @@ Item { Rectangle{id: r2c; width:20; height:20; color: "blue"} } Row{ - move: Transition{NumberAnimation{matchProperties:"x"}} + move: Transition{NumberAnimation{properties:"x"}} y:40 id: row3 Rectangle{id: r3a; width:20; height:20; color: "red"} diff --git a/tests/auto/declarative/visual/qmlgraphicstextedit/cursorDelegate.qml b/tests/auto/declarative/visual/qmlgraphicstextedit/cursorDelegate.qml index 2faefc1..e0c5db4 100644 --- a/tests/auto/declarative/visual/qmlgraphicstextedit/cursorDelegate.qml +++ b/tests/auto/declarative/visual/qmlgraphicstextedit/cursorDelegate.qml @@ -11,8 +11,8 @@ import Qt 4.6 Rectangle { id:bottom; color: "black"; width: 3; height: 1; x: -1; anchors.bottom: parent.bottom;} opacity: 1 opacity: SequentialAnimation { running: cPage.parent.focus == true; repeat: true; - NumberAnimation { matchProperties: "opacity"; to: 1; duration: 500; easing: "easeInQuad"} - NumberAnimation { matchProperties: "opacity"; to: 0; duration: 500; easing: "easeOutQuad"} + NumberAnimation { properties: "opacity"; to: 1; duration: 500; easing: "easeInQuad"} + NumberAnimation { properties: "opacity"; to: 0; duration: 500; easing: "easeOutQuad"} } } width: 1; diff --git a/tests/auto/declarative/visual/qmlgraphicstextinput/cursorDelegate.qml b/tests/auto/declarative/visual/qmlgraphicstextinput/cursorDelegate.qml index d10755c..0038664 100644 --- a/tests/auto/declarative/visual/qmlgraphicstextinput/cursorDelegate.qml +++ b/tests/auto/declarative/visual/qmlgraphicstextinput/cursorDelegate.qml @@ -11,8 +11,8 @@ import Qt 4.6 Rectangle { id:bottom; color: "black"; width: 3; height: 1; x: -1; anchors.bottom: parent.bottom;} opacity: 1 opacity: SequentialAnimation { running: cPage.parent.focus == true; repeat: true; - NumberAnimation { matchProperties: "opacity"; to: 1; duration: 500; easing: "easeInQuad"} - NumberAnimation { matchProperties: "opacity"; to: 0; duration: 500; easing: "easeOutQuad"} + NumberAnimation { properties: "opacity"; to: 1; duration: 500; easing: "easeInQuad"} + NumberAnimation { properties: "opacity"; to: 0; duration: 500; easing: "easeOutQuad"} } } width: 1; diff --git a/tests/auto/declarative/visual/qmlmouseregion/drag.qml b/tests/auto/declarative/visual/qmlmouseregion/drag.qml index ab4c280..dbb2a24 100644 --- a/tests/auto/declarative/visual/qmlmouseregion/drag.qml +++ b/tests/auto/declarative/visual/qmlmouseregion/drag.qml @@ -8,7 +8,7 @@ Rectangle{ id: draggable width:40; height:40; color: "lightsteelblue" y:20 - MouseRegion{ + MouseArea{ anchors.fill: parent drag.target: draggable drag.axis: "XandYAxis" diff --git a/tests/auto/declarative/visual/qmlmouseregion/mouseregion.qml b/tests/auto/declarative/visual/qmlmouseregion/mouseregion.qml index ab4223d..3c722d0 100644 --- a/tests/auto/declarative/visual/qmlmouseregion/mouseregion.qml +++ b/tests/auto/declarative/visual/qmlmouseregion/mouseregion.qml @@ -9,7 +9,7 @@ Rectangle { Rectangle { width: 98; height: 48 color: "red" - MouseRegion { + MouseArea { id: mr1 anchors.fill: parent enabled: false @@ -22,7 +22,7 @@ Rectangle { x: 100 width: 98; height: 48 color: "red" - MouseRegion { + MouseArea { id: mr2 anchors.fill: parent acceptedButtons: Qt.RightButton @@ -42,7 +42,7 @@ Rectangle { x: 200 width: 98; height: 48 color: "red" - MouseRegion { + MouseArea { id: mr3 anchors.fill: parent onPressAndHold: { @@ -56,7 +56,7 @@ Rectangle { x: 300 width: 98; height: 48 color: "red" - MouseRegion { + MouseArea { id: mr4 anchors.fill: parent onPressed: { @@ -74,7 +74,7 @@ Rectangle { y: 50 width: 98; height: 48 color: "red" - MouseRegion { + MouseArea { id: mr5 anchors.fill: parent hoverEnabled: true @@ -93,7 +93,7 @@ Rectangle { y: 50 width: 98; height: 48 color: "red" - MouseRegion { + MouseArea { id: mr6 anchors.fill: parent onClicked: { @@ -111,7 +111,7 @@ Rectangle { y: 50 width: 98; height: 48 color: "red" - MouseRegion { + MouseArea { id: mr7 anchors.fill: parent enabled: false diff --git a/tests/auto/declarative/visual/qmlspringfollow/follow.qml b/tests/auto/declarative/visual/qmlspringfollow/follow.qml index 8a713a2..a85a778 100644 --- a/tests/auto/declarative/visual/qmlspringfollow/follow.qml +++ b/tests/auto/declarative/visual/qmlspringfollow/follow.qml @@ -44,7 +44,7 @@ Rectangle { } // Follow mouse - MouseRegion { + MouseArea { id: mouseRegion anchors.fill: parent Rectangle { diff --git a/tests/auto/declarative/visual/selftest_noimages/selftest_noimages.qml b/tests/auto/declarative/visual/selftest_noimages/selftest_noimages.qml index 21a19bc..da7f9b6 100644 --- a/tests/auto/declarative/visual/selftest_noimages/selftest_noimages.qml +++ b/tests/auto/declarative/visual/selftest_noimages/selftest_noimages.qml @@ -2,7 +2,7 @@ import Qt 4.6 Text { property string error: "not pressed" text: (new Date()).valueOf() - MouseRegion { + MouseArea { anchors.fill: parent onPressed: error="" } diff --git a/tests/auto/declarative/visual/tst_visual.cpp b/tests/auto/declarative/visual/tst_visual.cpp index 5a5318a..8f41bef 100644 --- a/tests/auto/declarative/visual/tst_visual.cpp +++ b/tests/auto/declarative/visual/tst_visual.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** diff --git a/tests/auto/declarative/visual/webview/settings/noAutoLoadImages.qml b/tests/auto/declarative/visual/webview/settings/noAutoLoadImages.qml index 2478932..72e672d 100644 --- a/tests/auto/declarative/visual/webview/settings/noAutoLoadImages.qml +++ b/tests/auto/declarative/visual/webview/settings/noAutoLoadImages.qml @@ -11,7 +11,7 @@ Grid { anchors.fill: parent settings.autoLoadImages: false url: "test-img.html" - MouseRegion { + MouseArea { anchors.fill: parent onClicked: { parent.settings.autoLoadImages=true; label.text=""; parent.reload.trigger() } } diff --git a/tests/auto/gestures/tst_gestures.cpp b/tests/auto/gestures/tst_gestures.cpp index 952136b..24391c0 100644 --- a/tests/auto/gestures/tst_gestures.cpp +++ b/tests/auto/gestures/tst_gestures.cpp @@ -333,6 +333,9 @@ private slots: void unregisterRecognizer(); void autoCancelGestures(); void autoCancelGestures2(); + void graphicsViewParentPropagation(); + void panelPropagation(); + void panelStacksBehindParent(); }; tst_Gestures::tst_Gestures() @@ -698,6 +701,9 @@ public: bool acceptGestureOverride; QSet<Qt::GestureType> ignoredGestures; + QSet<Qt::GestureType> ignoredStartedGestures; + QSet<Qt::GestureType> ignoredUpdatedGestures; + QSet<Qt::GestureType> ignoredFinishedGestures; QRectF size; int instanceNumber; @@ -710,6 +716,9 @@ public: events.clear(); overrideEvents.clear(); ignoredGestures.clear(); + ignoredStartedGestures.clear(); + ignoredUpdatedGestures.clear(); + ignoredFinishedGestures.clear(); } protected: @@ -732,6 +741,24 @@ protected: QGestureEvent *e = static_cast<QGestureEvent *>(event); foreach(Qt::GestureType type, ignoredGestures) e->ignore(e->gesture(type)); + foreach(QGesture *g, e->gestures()) { + switch (g->state()) { + case Qt::GestureStarted: + if (ignoredStartedGestures.contains(g->gestureType())) + e->ignore(g); + break; + case Qt::GestureUpdated: + if (ignoredUpdatedGestures.contains(g->gestureType())) + e->ignore(g); + break; + case Qt::GestureFinished: + if (ignoredFinishedGestures.contains(g->gestureType())) + e->ignore(g); + break; + default: + break; + } + } } else if (event->type() == QEvent::GestureOverride) { ++gestureOverrideEventsReceived; eventsPtr = &overrideEvents; @@ -1457,9 +1484,7 @@ void tst_Gestures::autoCancelGestures2() event.serial = CustomGesture::SerialStartedThreshold; event.hasHotSpot = true; event.hotSpot = mapToGlobal(QPointF(5, 5), child, &view); - // qDebug() << event.hotSpot; scene.sendEvent(child, &event); - //QEventLoop().exec(); QCOMPARE(parent->events.all.count(), 1); QCOMPARE(child->events.started.count(), 1); QCOMPARE(child->events.canceled.count(), 1); @@ -1471,5 +1496,233 @@ void tst_Gestures::autoCancelGestures2() QCOMPARE(parent->events.all.count(), 2); } +void tst_Gestures::graphicsViewParentPropagation() +{ + QGraphicsScene scene; + QGraphicsView view(&scene); + view.setWindowFlags(Qt::X11BypassWindowManagerHint); + + GestureItem *item0 = new GestureItem("item0"); + scene.addItem(item0); + item0->setPos(0, 0); + item0->grabGesture(CustomGesture::GestureType); + item0->setZValue(1); + + GestureItem *item1 = new GestureItem("item1"); + scene.addItem(item1); + item1->setPos(0, 0); + item1->setZValue(5); + + GestureItem *item1_c1 = new GestureItem("item1_child1"); + item1_c1->setParentItem(item1); + item1_c1->setPos(0, 0); + + GestureItem *item1_c1_c1 = new GestureItem("item1_child1_child1"); + item1_c1_c1->setParentItem(item1_c1); + item1_c1_c1->setPos(0, 0); + + view.show(); + QTest::qWaitForWindowShown(&view); + view.ensureVisible(scene.sceneRect()); + + view.viewport()->grabGesture(CustomGesture::GestureType, Qt::DontStartGestureOnChildren); + item0->grabGesture(CustomGesture::GestureType, Qt::ReceivePartialGestures | Qt::IgnoredGesturesPropagateToParent); + item1->grabGesture(CustomGesture::GestureType, Qt::ReceivePartialGestures | Qt::IgnoredGesturesPropagateToParent); + item1_c1->grabGesture(CustomGesture::GestureType, Qt::IgnoredGesturesPropagateToParent); + item1_c1_c1->grabGesture(CustomGesture::GestureType, Qt::ReceivePartialGestures | Qt::IgnoredGesturesPropagateToParent); + + item0->ignoredUpdatedGestures << CustomGesture::GestureType; + item0->ignoredFinishedGestures << CustomGesture::GestureType; + item1->ignoredUpdatedGestures << CustomGesture::GestureType; + item1->ignoredFinishedGestures << CustomGesture::GestureType; + item1_c1->ignoredUpdatedGestures << CustomGesture::GestureType; + item1_c1->ignoredFinishedGestures << CustomGesture::GestureType; + item1_c1_c1->ignoredUpdatedGestures << CustomGesture::GestureType; + item1_c1_c1->ignoredFinishedGestures << CustomGesture::GestureType; + + static const int TotalGestureEventsCount = CustomGesture::SerialFinishedThreshold - CustomGesture::SerialStartedThreshold + 1; + + CustomEvent event; + event.hotSpot = mapToGlobal(QPointF(10, 10), item1_c1, &view); + event.hasHotSpot = true; + sendCustomGesture(&event, item0, &scene); + + QCOMPARE(item1_c1_c1->gestureEventsReceived, TotalGestureEventsCount); + QCOMPARE(item1_c1_c1->gestureOverrideEventsReceived, 1); + QCOMPARE(item1_c1->gestureEventsReceived, 0); + QCOMPARE(item1_c1->gestureOverrideEventsReceived, 1); + QCOMPARE(item1->gestureEventsReceived, TotalGestureEventsCount-1); + QCOMPARE(item1->gestureOverrideEventsReceived, 1); + QCOMPARE(item0->gestureEventsReceived, 0); + QCOMPARE(item0->gestureOverrideEventsReceived, 1); +} + +void tst_Gestures::panelPropagation() +{ + QGraphicsScene scene; + QGraphicsView view(&scene); + view.setWindowFlags(Qt::X11BypassWindowManagerHint); + + GestureItem *item0 = new GestureItem("item0"); + scene.addItem(item0); + item0->setPos(0, 0); + item0->size = QRectF(0, 0, 200, 200); + item0->grabGesture(CustomGesture::GestureType); + item0->setZValue(1); + + GestureItem *item1 = new GestureItem("item1"); + item1->grabGesture(CustomGesture::GestureType); + scene.addItem(item1); + item1->setPos(10, 10); + item1->size = QRectF(0, 0, 180, 180); + item1->setZValue(2); + + GestureItem *item1_child1 = new GestureItem("item1_child1[panel]"); + item1_child1->setFlags(QGraphicsItem::ItemIsPanel); + item1_child1->setParentItem(item1); + item1_child1->grabGesture(CustomGesture::GestureType); + item1_child1->setPos(10, 10); + item1_child1->size = QRectF(0, 0, 160, 160); + item1_child1->setZValue(5); + + GestureItem *item1_child1_child1 = new GestureItem("item1_child1_child1"); + item1_child1_child1->setParentItem(item1_child1); + item1_child1_child1->grabGesture(CustomGesture::GestureType); + item1_child1_child1->setPos(10, 10); + item1_child1_child1->size = QRectF(0, 0, 140, 140); + item1_child1_child1->setZValue(10); + + view.show(); + QTest::qWaitForWindowShown(&view); + view.ensureVisible(scene.sceneRect()); + + view.viewport()->grabGesture(CustomGesture::GestureType, Qt::DontStartGestureOnChildren); + + static const int TotalGestureEventsCount = CustomGesture::SerialFinishedThreshold - CustomGesture::SerialStartedThreshold + 1; + static const int TotalCustomEventsCount = CustomGesture::SerialFinishedThreshold - CustomGesture::SerialMaybeThreshold + 1; + + CustomEvent event; + event.hotSpot = mapToGlobal(QPointF(5, 5), item1_child1_child1, &view); + event.hasHotSpot = true; + sendCustomGesture(&event, item0, &scene); + + QCOMPARE(item0->customEventsReceived, TotalCustomEventsCount); + QCOMPARE(item1_child1_child1->gestureEventsReceived, TotalGestureEventsCount); + QCOMPARE(item1_child1_child1->gestureOverrideEventsReceived, 1); + QCOMPARE(item1_child1->gestureOverrideEventsReceived, 1); + QCOMPARE(item1->gestureEventsReceived, 0); + QCOMPARE(item1->gestureOverrideEventsReceived, 0); + QCOMPARE(item0->gestureEventsReceived, 0); + QCOMPARE(item0->gestureOverrideEventsReceived, 0); + + item0->reset(); item1->reset(); item1_child1->reset(); item1_child1_child1->reset(); + + event.hotSpot = mapToGlobal(QPointF(5, 5), item1, &view); + event.hasHotSpot = true; + sendCustomGesture(&event, item1, &scene); + + QCOMPARE(item1_child1_child1->gestureEventsReceived, 0); + QCOMPARE(item1_child1_child1->gestureOverrideEventsReceived, 0); + QCOMPARE(item1_child1->gestureEventsReceived, 0); + QCOMPARE(item1_child1->gestureOverrideEventsReceived, 0); + QCOMPARE(item1->gestureEventsReceived, TotalGestureEventsCount); + QCOMPARE(item1->gestureOverrideEventsReceived, 1); + QCOMPARE(item0->gestureEventsReceived, 0); + QCOMPARE(item0->gestureOverrideEventsReceived, 1); + + item0->reset(); item1->reset(); item1_child1->reset(); item1_child1_child1->reset(); + // try with a modal panel + item1_child1->setPanelModality(QGraphicsItem::PanelModal); + + event.hotSpot = mapToGlobal(QPointF(5, 5), item1, &view); + event.hasHotSpot = true; + sendCustomGesture(&event, item1, &scene); + + QCOMPARE(item1_child1_child1->gestureEventsReceived, 0); + QCOMPARE(item1_child1_child1->gestureOverrideEventsReceived, 0); + QCOMPARE(item1_child1->gestureEventsReceived, TotalGestureEventsCount); + QCOMPARE(item1_child1->gestureOverrideEventsReceived, 0); + QCOMPARE(item1->gestureEventsReceived, 0); + QCOMPARE(item1->gestureOverrideEventsReceived, 0); + QCOMPARE(item0->gestureEventsReceived, 0); + QCOMPARE(item0->gestureOverrideEventsReceived, 0); + + item0->reset(); item1->reset(); item1_child1->reset(); item1_child1_child1->reset(); + // try with a modal panel, however set the hotspot to be outside of the + // panel and its parent + item1_child1->setPanelModality(QGraphicsItem::PanelModal); + + event.hotSpot = mapToGlobal(QPointF(5, 5), item0, &view); + event.hasHotSpot = true; + sendCustomGesture(&event, item1, &scene); + + QCOMPARE(item1_child1_child1->gestureEventsReceived, 0); + QCOMPARE(item1_child1_child1->gestureOverrideEventsReceived, 0); + QCOMPARE(item1_child1->gestureEventsReceived, 0); + QCOMPARE(item1_child1->gestureOverrideEventsReceived, 0); + QCOMPARE(item1->gestureEventsReceived, 0); + QCOMPARE(item1->gestureOverrideEventsReceived, 0); + QCOMPARE(item0->gestureEventsReceived, TotalGestureEventsCount); + QCOMPARE(item0->gestureOverrideEventsReceived, 0); + + item0->reset(); item1->reset(); item1_child1->reset(); item1_child1_child1->reset(); + // try with a scene modal panel + item1_child1->setPanelModality(QGraphicsItem::SceneModal); + + event.hotSpot = mapToGlobal(QPointF(5, 5), item0, &view); + event.hasHotSpot = true; + sendCustomGesture(&event, item0, &scene); + + QCOMPARE(item1_child1_child1->gestureEventsReceived, 0); + QCOMPARE(item1_child1_child1->gestureOverrideEventsReceived, 0); + QCOMPARE(item1_child1->gestureEventsReceived, TotalGestureEventsCount); + QCOMPARE(item1_child1->gestureOverrideEventsReceived, 0); + QCOMPARE(item1->gestureEventsReceived, 0); + QCOMPARE(item1->gestureOverrideEventsReceived, 0); + QCOMPARE(item0->gestureEventsReceived, 0); + QCOMPARE(item0->gestureOverrideEventsReceived, 0); +} + +void tst_Gestures::panelStacksBehindParent() +{ + QGraphicsScene scene; + QGraphicsView view(&scene); + view.setWindowFlags(Qt::X11BypassWindowManagerHint); + + GestureItem *item1 = new GestureItem("item1"); + item1->grabGesture(CustomGesture::GestureType); + scene.addItem(item1); + item1->setPos(10, 10); + item1->size = QRectF(0, 0, 180, 180); + item1->setZValue(2); + + GestureItem *panel = new GestureItem("panel"); + panel->setFlags(QGraphicsItem::ItemIsPanel | QGraphicsItem::ItemStacksBehindParent); + panel->setPanelModality(QGraphicsItem::PanelModal); + panel->setParentItem(item1); + panel->grabGesture(CustomGesture::GestureType); + panel->setPos(-10, -10); + panel->size = QRectF(0, 0, 200, 200); + panel->setZValue(5); + + view.show(); + QTest::qWaitForWindowShown(&view); + view.ensureVisible(scene.sceneRect()); + + view.viewport()->grabGesture(CustomGesture::GestureType, Qt::DontStartGestureOnChildren); + + static const int TotalGestureEventsCount = CustomGesture::SerialFinishedThreshold - CustomGesture::SerialStartedThreshold + 1; + + CustomEvent event; + event.hotSpot = mapToGlobal(QPointF(5, 5), item1, &view); + event.hasHotSpot = true; + sendCustomGesture(&event, item1, &scene); + + QCOMPARE(item1->gestureEventsReceived, 0); + QCOMPARE(item1->gestureOverrideEventsReceived, 0); + QCOMPARE(panel->gestureEventsReceived, TotalGestureEventsCount); + QCOMPARE(panel->gestureOverrideEventsReceived, 0); +} + QTEST_MAIN(tst_Gestures) #include "tst_gestures.moc" diff --git a/tests/auto/headers/tst_headers.cpp b/tests/auto/headers/tst_headers.cpp index 5f79923..3745767 100644 --- a/tests/auto/headers/tst_headers.cpp +++ b/tests/auto/headers/tst_headers.cpp @@ -65,6 +65,7 @@ private: const QRegExp &exclude); static QStringList getHeaders(const QString &path); static QStringList getSourceFiles(const QString &path); + static QStringList getQDocFiles(const QString &path); void allSourceFilesData(); void allHeadersData(); @@ -111,6 +112,11 @@ QStringList tst_Headers::getSourceFiles(const QString &path) return getFiles(path, QStringList("*.cpp"), QRegExp("^(?!(moc_|qrc_))")); } +QStringList tst_Headers::getQDocFiles(const QString &path) +{ + return getFiles(path, QStringList("*.qdoc"), QRegExp(".")); +} + void tst_Headers::initTestCase() { qtSrcDir = QString::fromLocal8Bit(qgetenv("QTSRCDIR").isEmpty() @@ -149,6 +155,7 @@ void tst_Headers::allSourceFilesData() for (int i = 0; i < sizeof(subdirs) / sizeof(subdirs[0]); ++i) { sourceFiles << getSourceFiles(qtSrcDir + subdirs[i]); sourceFiles << getHeaders(qtSrcDir + subdirs[i]); + sourceFiles << getQDocFiles(qtSrcDir + subdirs[i]); } foreach (QString sourceFile, sourceFiles) { @@ -192,22 +199,28 @@ void tst_Headers::licenseCheck() QByteArray data = f.readAll(); data.replace("\r\n", "\n"); // Windows data.replace('\r', '\n'); // Mac OS9 - QStringList content = QString::fromLocal8Bit(data).split("\n"); + QStringList content = QString::fromLocal8Bit(data).split("\n", QString::SkipEmptyParts); + + if (content.count() <= 2) // likely a #include line and empty line only. Not a copyright issue. + return; if (content.first().contains("generated")) { content.takeFirst(); - if (content.first().isEmpty()) - content.takeFirst(); } if (sourceFile.endsWith("/tests/auto/linguist/lupdate/testdata/good/merge_ordering/foo.cpp") || sourceFile.endsWith("/tests/auto/linguist/lupdate/testdata/good/mergecpp/finddialog.cpp")) { // These files are meant to start with empty lines. - while (content.first().isEmpty() || content.first().startsWith("//")) + while (content.first().startsWith("//")) content.takeFirst(); } + if (sourceFile.endsWith("/doc/src/classes/phonon-api.qdoc")) { + // This is an external file + return; + } + QVERIFY(licensePattern.exactMatch(content.value(8)) || licensePattern.exactMatch(content.value(5))); QString licenseType = licensePattern.cap(1); diff --git a/tests/auto/linguist/lupdate/testdata/good/respfile/source1.cpp b/tests/auto/linguist/lupdate/testdata/good/respfile/source1.cpp index 33642c4..3327d1e 100644 --- a/tests/auto/linguist/lupdate/testdata/good/respfile/source1.cpp +++ b/tests/auto/linguist/lupdate/testdata/good/respfile/source1.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** diff --git a/tests/auto/maketestselftest/tst_maketestselftest.cpp b/tests/auto/maketestselftest/tst_maketestselftest.cpp index ef92c56..1dde44b 100644 --- a/tests/auto/maketestselftest/tst_maketestselftest.cpp +++ b/tests/auto/maketestselftest/tst_maketestselftest.cpp @@ -92,7 +92,9 @@ void tst_MakeTestSelfTest::auto_dot_pro_data() QStringList subdirs = dir.entryList(QDir::AllDirs|QDir::NoDotAndDotDot); foreach (const QString& subdir, subdirs) { - if (subdir == QString::fromLatin1("tmp")) { + if (subdir == QString::fromLatin1("tmp") + || subdir.startsWith(".")) + { continue; } QTest::newRow(qPrintable(subdir)) << subdir; diff --git a/tests/auto/mediaobject/dummy/dummy.pro b/tests/auto/mediaobject/dummy/dummy.pro index 2f27c4a..cf1010e 100644 --- a/tests/auto/mediaobject/dummy/dummy.pro +++ b/tests/auto/mediaobject/dummy/dummy.pro @@ -1,7 +1,7 @@ TEMPLATE = lib isEmpty(QT_MAJOR_VERSION) { - VERSION=4.6.2 + VERSION=4.6.3 } else { VERSION=$${QT_MAJOR_VERSION}.$${QT_MINOR_VERSION}.$${QT_PATCH_VERSION} } diff --git a/tests/auto/modeltest/dynamictreemodel.h b/tests/auto/modeltest/dynamictreemodel.h index 3f0d90d..9633755 100644 --- a/tests/auto/modeltest/dynamictreemodel.h +++ b/tests/auto/modeltest/dynamictreemodel.h @@ -48,8 +48,6 @@ #include <QtCore/QList> -template<typename T> class QList; - class DynamicTreeModel : public QAbstractItemModel { Q_OBJECT diff --git a/tests/auto/qcontiguouscache/tst_qcontiguouscache.cpp b/tests/auto/qcontiguouscache/tst_qcontiguouscache.cpp index 5a23274..f64e815 100644 --- a/tests/auto/qcontiguouscache/tst_qcontiguouscache.cpp +++ b/tests/auto/qcontiguouscache/tst_qcontiguouscache.cpp @@ -71,6 +71,8 @@ private slots: void contiguousCacheBenchmark(); void setCapacity(); + + void zeroCapacity(); }; QTEST_MAIN(tst_QContiguousCache) @@ -476,4 +478,14 @@ void tst_QContiguousCache::setCapacity() } } +void tst_QContiguousCache::zeroCapacity() +{ + QContiguousCache<int> contiguousCache; + QCOMPARE(contiguousCache.capacity(),0); + contiguousCache.setCapacity(10); + QCOMPARE(contiguousCache.capacity(),10); + contiguousCache.setCapacity(0); + QCOMPARE(contiguousCache.capacity(),0); +} + #include "tst_qcontiguouscache.moc" diff --git a/tests/auto/qdbusconnection/tst_qdbusconnection.cpp b/tests/auto/qdbusconnection/tst_qdbusconnection.cpp index 5e2f3a9..96209b1 100644 --- a/tests/auto/qdbusconnection/tst_qdbusconnection.cpp +++ b/tests/auto/qdbusconnection/tst_qdbusconnection.cpp @@ -80,6 +80,8 @@ class tst_QDBusConnection: public QObject int signalsReceived; public slots: void oneSlot() { ++signalsReceived; } + void exitLoop() { ++signalsReceived; QTestEventLoop::instance().exitLoop(); } + void secondCallWithCallback(); private slots: void noConnection(); @@ -102,6 +104,7 @@ private slots: void multipleInterfacesInQObject(); void slotsWithLessParameters(); + void nestedCallWithCallback(); public: QString serviceName() const { return "com.trolltech.Qt.Autotests.QDBusConnection"; } @@ -618,6 +621,32 @@ void tst_QDBusConnection::slotsWithLessParameters() QCOMPARE(signalsReceived, 1); } +void tst_QDBusConnection::secondCallWithCallback() +{ + qDebug("Hello"); + QDBusConnection con = QDBusConnection::sessionBus(); + QDBusMessage msg = QDBusMessage::createMethodCall(con.baseService(), "/test", QString(), + "test0"); + con.callWithCallback(msg, this, SLOT(exitLoop()), SLOT(secondCallWithCallback())); +} + +void tst_QDBusConnection::nestedCallWithCallback() +{ + TestObject testObject; + QDBusConnection connection = QDBusConnection::sessionBus(); + QVERIFY(connection.registerObject("/test", &testObject, + QDBusConnection::ExportAllContents)); + + QDBusMessage msg = QDBusMessage::createMethodCall(connection.baseService(), "/test", QString(), + "ThisFunctionDoesntExist"); + signalsReceived = 0; + + connection.callWithCallback(msg, this, SLOT(exitLoop()), SLOT(secondCallWithCallback()), 10); + QTestEventLoop::instance().enterLoop(15); + QVERIFY(!QTestEventLoop::instance().timeout()); + QCOMPARE(signalsReceived, 1); +} + QString MyObject::path; QTEST_MAIN(tst_QDBusConnection) diff --git a/tests/auto/qgl/tst_qgl.cpp b/tests/auto/qgl/tst_qgl.cpp index eeccc9a..1bf7850 100644 --- a/tests/auto/qgl/tst_qgl.cpp +++ b/tests/auto/qgl/tst_qgl.cpp @@ -57,6 +57,8 @@ #ifdef QT_BUILD_INTERNAL #include <QtOpenGL/private/qgl_p.h> #include <QtGui/private/qpixmapdata_p.h> +#include <QtGui/private/qimage_p.h> +#include <QtGui/private/qimagepixmapcleanuphooks_p.h> #endif //TESTED_CLASS= @@ -1986,7 +1988,6 @@ void tst_QGL::qglContextDefaultBindTexture() #ifdef QT_BUILD_INTERNAL QGLWidget w; w.makeCurrent(); - QGLContext *ctx = const_cast<QGLContext*>(w.context()); QImage *boundImage = new QImage(256, 256, QImage::Format_RGB32); @@ -1994,29 +1995,36 @@ void tst_QGL::qglContextDefaultBindTexture() QPixmap *boundPixmap = new QPixmap(256, 256); boundPixmap->fill(Qt::red); - // Check that calling QGLContext::bindTexture with default args adds textures to cache int startCacheItemCount = QGLTextureCache::instance()->size(); + GLuint boundImageTextureId = ctx->bindTexture(*boundImage); GLuint boundPixmapTextureId = ctx->bindTexture(*boundPixmap); + + // Make sure the image & pixmap have been added to the cache: QCOMPARE(QGLTextureCache::instance()->size(), startCacheItemCount+2); + // Make sure the image & pixmap have the is_cached flag set: + QVERIFY(QImagePixmapCleanupHooks::isImageCached(*boundImage)); + QVERIFY(QImagePixmapCleanupHooks::isPixmapCached(*boundPixmap)); + // Make sure the texture IDs returned are valid: QCOMPARE((bool)glIsTexture(boundImageTextureId), GL_TRUE); QCOMPARE((bool)glIsTexture(boundPixmapTextureId), GL_TRUE); - // Make sure the textures are still there after we delete the image/pixmap: + // Make sure the textures are still valid after we delete the image/pixmap: + // Also check that although the textures are left intact, the cache entries are removed: delete boundImage; boundImage = 0; + QCOMPARE((bool)glIsTexture(boundImageTextureId), GL_TRUE); + QCOMPARE(QGLTextureCache::instance()->size(), startCacheItemCount+1); delete boundPixmap; boundPixmap = 0; - QCOMPARE(QGLTextureCache::instance()->size(), startCacheItemCount+2); + QCOMPARE((bool)glIsTexture(boundPixmapTextureId), GL_TRUE); + QCOMPARE(QGLTextureCache::instance()->size(), startCacheItemCount); - // Make sure the textures are deleted from the cache after calling QGLContext::deleteTexture() + // Finally, make sure QGLContext::deleteTexture deletes the texture IDs: ctx->deleteTexture(boundImageTextureId); ctx->deleteTexture(boundPixmapTextureId); - QCOMPARE(QGLTextureCache::instance()->size(), startCacheItemCount); - - // Finally, make sure QGLContext::deleteTexture also deleted the texture IDs: QCOMPARE((bool)glIsTexture(boundImageTextureId), GL_FALSE); QCOMPARE((bool)glIsTexture(boundPixmapTextureId), GL_FALSE); #endif diff --git a/tests/auto/qgl_threads/qgl_threads.pro b/tests/auto/qgl_threads/qgl_threads.pro new file mode 100644 index 0000000..9312c05 --- /dev/null +++ b/tests/auto/qgl_threads/qgl_threads.pro @@ -0,0 +1,11 @@ +############################################################ +# Project file for autotest for file qgl.h +############################################################ + +load(qttest_p4) +requires(contains(QT_CONFIG,opengl)) +QT += opengl + +HEADERS += tst_openglthreading.h +SOURCES += tst_openglthreading.cpp + diff --git a/tests/auto/qgl_threads/tst_openglthreading.cpp b/tests/auto/qgl_threads/tst_openglthreading.cpp new file mode 100644 index 0000000..cf100cb --- /dev/null +++ b/tests/auto/qgl_threads/tst_openglthreading.cpp @@ -0,0 +1,480 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (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 Technology Preview License Agreement accompanying +** this package. +** +** 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.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <QtTest/QtTest> +#include <QtCore/QtCore> +#include <QtGui/QtGui> +#include <QtOpenGL/QtOpenGL> +#include "tst_openglthreading.h" + +#ifdef Q_WS_X11 +#include <private/qt_x11_p.h> +#endif + +#define RUNNING_TIME 5000 + +tst_OpenGLThreading::tst_OpenGLThreading(QObject *parent) + : QObject(parent) +{ +} + + + +/* + + swapInThread + + The purpose of this testcase is to verify that it is possible to do rendering into + a GL context from the GUI thread, then swap the contents in from a background thread. + + The usecase for this is to have the background thread do the waiting for vertical + sync while the GUI thread is idle. + + Currently the locking is handled directly in the paintEvent(). For the actual usecase + in Qt, the locking is done in the windowsurface before starting any drawing while + unlocking is done after all drawing has been done. + */ + + +class SwapThread : public QThread +{ + Q_OBJECT +public: + SwapThread(QGLWidget *widget) + : m_widget(widget) + { + moveToThread(this); + } + + void run() { + QTime time; + time.start(); + while (time.elapsed() < RUNNING_TIME) { + lock(); + wait(); + + m_widget->makeCurrent(); + m_widget->swapBuffers(); + m_widget->doneCurrent(); + unlock(); + } + } + + void lock() { m_mutex.lock(); } + void unlock() { m_mutex.unlock(); } + + void wait() { m_wait_condition.wait(&m_mutex); } + void notify() { m_wait_condition.wakeAll(); } + +private: + QGLWidget *m_widget; + QMutex m_mutex; + QWaitCondition m_wait_condition; +}; + +class ForegroundWidget : public QGLWidget +{ +public: + ForegroundWidget(const QGLFormat &format) + : QGLWidget(format), m_thread(0) + { + setAutoBufferSwap(false); + } + + void paintEvent(QPaintEvent *) + { + m_thread->lock(); + makeCurrent(); + QPainter p(this); + p.fillRect(rect(), QColor(rand() % 256, rand() % 256, rand() % 256)); + p.setPen(Qt::red); + p.setFont(QFont("SansSerif", 24)); + p.drawText(rect(), Qt::AlignCenter, "This is an autotest"); + p.end(); + doneCurrent(); + m_thread->notify(); + m_thread->unlock(); + + update(); + } + + void setThread(SwapThread *thread) { + m_thread = thread; + } + + SwapThread *m_thread; +}; + +void tst_OpenGLThreading::swapInThread() +{ +#ifdef Q_OS_MAC + QSKIP("OpenGL threading tests are currently disabled on mac as they were causing reboots", SkipAll); +#endif + + QGLFormat format; + format.setSwapInterval(1); + ForegroundWidget widget(format); + SwapThread thread(&widget); + widget.setThread(&thread); + widget.show(); + + QTest::qWaitForWindowShown(&widget); + thread.start(); + + while (thread.isRunning()) { + qApp->processEvents(); + } + + widget.hide(); + + QVERIFY(true); +} + + + + + + + +/* + textureUploadInThread + + The purpose of this testcase is to verify that doing texture uploads in a background + thread is possible and that it works. + */ + +class CreateAndUploadThread : public QThread +{ + Q_OBJECT +public: + CreateAndUploadThread(QGLWidget *shareWidget) + { + m_gl = new QGLWidget(0, shareWidget); + moveToThread(this); + } + + ~CreateAndUploadThread() + { + delete m_gl; + } + + void run() { + m_gl->makeCurrent(); + QTime time; + time.start(); + while (time.elapsed() < RUNNING_TIME) { + QImage image(400, 300, QImage::Format_RGB32); + QPainter p(&image); + p.fillRect(image.rect(), QColor(rand() % 256, rand() % 256, rand() % 256)); + p.setPen(Qt::red); + p.setFont(QFont("SansSerif", 24)); + p.drawText(image.rect(), Qt::AlignCenter, "This is an autotest"); + p.end(); + m_gl->bindTexture(image, GL_TEXTURE_2D, GL_RGBA, QGLContext::InternalBindOption); + createdAndUploaded(image); + } + } + +signals: + void createdAndUploaded(const QImage &image); + +private: + QGLWidget *m_gl; +}; + +class TextureDisplay : public QGLWidget +{ + Q_OBJECT +public: + void paintEvent(QPaintEvent *) { + QPainter p(this); + for (int i=0; i<m_images.size(); ++i) { + p.drawImage(m_positions.at(i), m_images.at(i)); + m_positions[i] += QPoint(1, 1); + } + update(); + } + +public slots: + void receiveImage(const QImage &image) { + m_images << image; + m_positions << QPoint(-rand() % width() / 2, -rand() % height() / 2); + + if (m_images.size() > 100) { + m_images.takeFirst(); + m_positions.takeFirst(); + } + } + +private: + QList <QImage> m_images; + QList <QPoint> m_positions; +}; + +void tst_OpenGLThreading::textureUploadInThread() +{ +#ifdef Q_OS_MAC + QSKIP("OpenGL threading tests are currently disabled on mac as they were causing reboots", SkipAll); +#endif + + TextureDisplay display; + CreateAndUploadThread thread(&display); + + connect(&thread, SIGNAL(createdAndUploaded(QImage)), &display, SLOT(receiveImage(QImage))); + + display.show(); + QTest::qWaitForWindowShown(&display); + + thread.start(); + + while (thread.isRunning()) { + qApp->processEvents(); + } + + QVERIFY(true); +} + + + + + + +/* + renderInThread + + This test sets up a scene and renders it in a different thread. + For simplicity, the scene is simply a bunch of rectangles, but + if that works, we're in good shape.. + */ + +static inline float qrandom() { return (rand() % 100) / 100.f; } + +void renderAScene(int w, int h) +{ +#ifdef QT_OPENGL_ES_2 + QGLShaderProgram program; + program.addShaderFromSourceCode(QGLShader::Vertex, "attribute highp vec2 pos; void main() { gl_Position = vec4(pos.xy, 1.0, 1.0); }"); + program.addShaderFromSourceCode(QGLShader::Fragment, "uniform lowp vec4 color; void main() { gl_FragColor = color; }"); + program.bindAttributeLocation("pos", 0); + program.bind(); + int colorId = program.uniformLocation("color"); + + glEnableVertexAttribArray(0); + + for (int i=0; i<1000; ++i) { + GLfloat pos[] = { + (rand() % 100) / 100., + (rand() % 100) / 100., + (rand() % 100) / 100., + (rand() % 100) / 100., + (rand() % 100) / 100., + (rand() % 100) / 100. + }; + + glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, pos); + glDrawArrays(GL_TRIANGLE_STRIP, 0, 3); + } +#else + glViewport(0, 0, w, h); + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + glFrustum(0, w, h, 0, 1, 100); + glTranslated(0, 0, -1); + + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + + for (int i=0;i<1000; ++i) { + glBegin(GL_TRIANGLES); + glColor3f(qrandom(), qrandom(), qrandom()); + glVertex2f(qrandom() * w, qrandom() * h); + glColor3f(qrandom(), qrandom(), qrandom()); + glVertex2f(qrandom() * w, qrandom() * h); + glColor3f(qrandom(), qrandom(), qrandom()); + glVertex2f(qrandom() * w, qrandom() * h); + glEnd(); + } +#endif +} + +class ThreadSafeGLWidget : public QGLWidget +{ +public: + void paintEvent(QPaintEvent *) + { + // ignored as we're anyway swapping as fast as we can + }; + + void resizeEvent(QResizeEvent *e) + { + mutex.lock(); + newSize = e->size(); + mutex.unlock(); + }; + + QMutex mutex; + QSize newSize; +}; + +class SceneRenderingThread : public QThread +{ + Q_OBJECT +public: + SceneRenderingThread(ThreadSafeGLWidget *widget) + : m_widget(widget) + { + moveToThread(this); + m_size = widget->size(); + } + + void run() { + QTime time; + time.start(); + failure = false; + + m_widget->makeCurrent(); + + while (time.elapsed() < RUNNING_TIME && !failure) { + + + m_widget->mutex.lock(); + QSize s = m_widget->newSize; + m_widget->mutex.unlock(); + + if (s != m_size) { + glViewport(0, 0, s.width(), s.height()); + } + + if (QGLContext::currentContext() != m_widget->context()) { + failure = true; + break; + } + + glClear(GL_COLOR_BUFFER_BIT); + + int w = m_widget->width(); + int h = m_widget->height(); + + renderAScene(w, h); + + int color; + glReadPixels(w / 2, h / 2, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, &color); + + m_widget->swapBuffers(); + } + + m_widget->doneCurrent(); + } + + bool failure; + +private: + ThreadSafeGLWidget *m_widget; + QSize m_size; +}; + +void tst_OpenGLThreading::renderInThread_data() +{ + QTest::addColumn<bool>("resize"); + QTest::addColumn<bool>("update"); + + QTest::newRow("basic") << false << false; + QTest::newRow("with-resize") << true << false; + QTest::newRow("with-update") << false << true; + QTest::newRow("with-resize-and-update") << true << true; +} + +void tst_OpenGLThreading::renderInThread() +{ +#ifdef Q_OS_MAC + QSKIP("OpenGL threading tests are currently disabled on mac as they were causing reboots", SkipAll); +#endif + + QFETCH(bool, resize); + QFETCH(bool, update); + + ThreadSafeGLWidget widget; + widget.resize(200, 200); + SceneRenderingThread thread(&widget); + + widget.show(); + QTest::qWaitForWindowShown(&widget); + widget.doneCurrent(); + + thread.start(); + + int value = 10; + while (thread.isRunning()) { + if (resize) + widget.resize(200 + value, 200 + value); + if (update) + widget.update(100 + value, 100 + value, 20, 20); + qApp->processEvents(); + value = -value; + +#ifdef Q_WS_WIN + Sleep(100); +#else + usleep(100 * 1000); +#endif + } + + QVERIFY(!thread.failure); +} + + + + +int main(int argc, char **argv) +{ +#ifdef Q_WS_X11 + XInitThreads(); +#endif + + QApplication app(argc, argv); + QTEST_DISABLE_KEYPAD_NAVIGATION \ + + tst_OpenGLThreading tc; + return QTest::qExec(&tc, argc, argv); +} + +#include "tst_openglthreading.moc" diff --git a/tests/auto/qgl_threads/tst_openglthreading.h b/tests/auto/qgl_threads/tst_openglthreading.h new file mode 100644 index 0000000..c4b55cd --- /dev/null +++ b/tests/auto/qgl_threads/tst_openglthreading.h @@ -0,0 +1,61 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (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 Technology Preview License Agreement accompanying +** this package. +** +** 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.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef TST_OPENGLTHREADING_H +#define TST_OPENGLTHREADING_H + +#include <QObject> + +class tst_OpenGLThreading : public QObject +{ +Q_OBJECT +public: + explicit tst_OpenGLThreading(QObject *parent = 0); + +private slots: + void swapInThread(); + void textureUploadInThread(); + + void renderInThread_data(); + void renderInThread(); +}; + +#endif // TST_OPENGLTHREADING_H diff --git a/tests/auto/qgraphicsitem/tst_qgraphicsitem.cpp b/tests/auto/qgraphicsitem/tst_qgraphicsitem.cpp index 7c1b97e..269ec24 100644 --- a/tests/auto/qgraphicsitem/tst_qgraphicsitem.cpp +++ b/tests/auto/qgraphicsitem/tst_qgraphicsitem.cpp @@ -438,6 +438,7 @@ private slots: void QTBUG_6738_missingUpdateWithSetParent(); void QTBUG_7714_fullUpdateDiscardingOpacityUpdate2(); void QT_2653_fullUpdateDiscardingOpacityUpdate(); + void QT_2649_focusScope(); private: QList<QGraphicsItem *> paintedItems; @@ -10002,5 +10003,61 @@ void tst_QGraphicsItem::QTBUG_7714_fullUpdateDiscardingOpacityUpdate2() QTRY_COMPARE(view.repaints, 1); } +void tst_QGraphicsItem::QT_2649_focusScope() +{ + QGraphicsScene *scene = new QGraphicsScene; + + QGraphicsRectItem *subFocusItem = new QGraphicsRectItem; + subFocusItem->setFlags(QGraphicsItem::ItemIsFocusable); + subFocusItem->setFocus(); + QCOMPARE(subFocusItem->focusItem(), (QGraphicsItem *)subFocusItem); + + QGraphicsRectItem *scope = new QGraphicsRectItem; + scope->setFlags(QGraphicsItem::ItemIsFocusable | QGraphicsItem::ItemIsFocusScope); + scope->setFocus(); + subFocusItem->setParentItem(scope); + QCOMPARE(subFocusItem->focusItem(), (QGraphicsItem *)subFocusItem); + QCOMPARE(subFocusItem->focusScopeItem(), (QGraphicsItem *)0); + QCOMPARE(scope->focusItem(), (QGraphicsItem *)subFocusItem); + QCOMPARE(scope->focusScopeItem(), (QGraphicsItem *)subFocusItem); + + QGraphicsRectItem *rootItem = new QGraphicsRectItem; + rootItem->setFlags(QGraphicsItem::ItemIsFocusable); + scope->setParentItem(rootItem); + QCOMPARE(rootItem->focusItem(), (QGraphicsItem *)subFocusItem); + QCOMPARE(rootItem->focusScopeItem(), (QGraphicsItem *)0); + QCOMPARE(subFocusItem->focusItem(), (QGraphicsItem *)subFocusItem); + QCOMPARE(subFocusItem->focusScopeItem(), (QGraphicsItem *)0); + QCOMPARE(scope->focusItem(), (QGraphicsItem *)subFocusItem); + QCOMPARE(scope->focusScopeItem(), (QGraphicsItem *)subFocusItem); + + scene->addItem(rootItem); + + QEvent windowActivate(QEvent::WindowActivate); + qApp->sendEvent(scene, &windowActivate); + scene->setFocus(); + + QCOMPARE(rootItem->focusItem(), (QGraphicsItem *)subFocusItem); + QCOMPARE(scope->focusItem(), (QGraphicsItem *)subFocusItem); + QCOMPARE(subFocusItem->focusItem(), (QGraphicsItem *)subFocusItem); + QCOMPARE(rootItem->focusScopeItem(), (QGraphicsItem *)0); + QCOMPARE(scope->focusScopeItem(), (QGraphicsItem *)subFocusItem); + QCOMPARE(subFocusItem->focusScopeItem(), (QGraphicsItem *)0); + QVERIFY(subFocusItem->hasFocus()); + + //If we hide the focusScope, the entire subFocus chain should be cleared + scope->hide(); + + QCOMPARE(rootItem->focusItem(), (QGraphicsItem *)0); + QCOMPARE(scope->focusItem(), (QGraphicsItem *)0); + QCOMPARE(subFocusItem->focusItem(), (QGraphicsItem *)0); + QCOMPARE(rootItem->focusScopeItem(), (QGraphicsItem *)0); + QCOMPARE(scope->focusScopeItem(), (QGraphicsItem *)subFocusItem); + QCOMPARE(subFocusItem->focusScopeItem(), (QGraphicsItem *)0); + QVERIFY(!subFocusItem->hasFocus()); + + delete scene; +} + QTEST_MAIN(tst_QGraphicsItem) #include "tst_qgraphicsitem.moc" diff --git a/tests/auto/qgraphicsscene/tst_qgraphicsscene.cpp b/tests/auto/qgraphicsscene/tst_qgraphicsscene.cpp index 469ded0..2ef0419 100644 --- a/tests/auto/qgraphicsscene/tst_qgraphicsscene.cpp +++ b/tests/auto/qgraphicsscene/tst_qgraphicsscene.cpp @@ -50,6 +50,7 @@ #include <private/qgraphicssceneindex_p.h> #include <math.h> #include "../../shared/util.h" +#include "../qpathclipper/pathcompare.h" #if defined(Q_OS_WIN) && !defined(Q_OS_WINCE) #include <windows.h> @@ -3560,7 +3561,7 @@ void tst_QGraphicsScene::task250680_childClip() QPainterPath path; path.addRect(-25, -25, 50, 50); - QCOMPARE(rect->clipPath(), path); + QVERIFY(QPathCompare::comparePaths(rect->clipPath().simplified(), path)); QCOMPARE(scene.items(QRectF(320, 240, 5, 5)).size(), 2); rect->rotate(45); diff --git a/tests/auto/qgraphicsvideoitem/qgraphicsvideoitem.pro b/tests/auto/qgraphicsvideoitem/qgraphicsvideoitem.pro new file mode 100644 index 0000000..da00baf --- /dev/null +++ b/tests/auto/qgraphicsvideoitem/qgraphicsvideoitem.pro @@ -0,0 +1,5 @@ +load(qttest_p4) +SOURCES += tst_qgraphicsvideoitem.cpp + +QT += multimedia +requires(contains(QT_CONFIG, multimedia)) diff --git a/tests/auto/qgraphicsvideoitem/tst_qgraphicsvideoitem.cpp b/tests/auto/qgraphicsvideoitem/tst_qgraphicsvideoitem.cpp new file mode 100644 index 0000000..7fb6005 --- /dev/null +++ b/tests/auto/qgraphicsvideoitem/tst_qgraphicsvideoitem.cpp @@ -0,0 +1,670 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (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 Technology Preview License Agreement accompanying +** this package. +** +** 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.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <QtTest/QtTest> + +#include <QtMultimedia/qgraphicsvideoitem.h> + +#include <QtGui/qapplication.h> +#include <QtGui/qgraphicsscene.h> +#include <QtGui/qgraphicsview.h> +#include <QtMultimedia/qabstractvideosurface.h> +#include <QtMultimedia/qmediaobject.h> +#include <QtMultimedia/qmediaservice.h> +#include <QtMultimedia/qvideooutputcontrol.h> +#include <QtMultimedia/qvideorenderercontrol.h> +#include <QtMultimedia/qvideosurfaceformat.h> + +#include <QtMultimedia/private/qpaintervideosurface_p.h> + +class tst_QGraphicsVideoItem : public QObject +{ + Q_OBJECT +public slots: + void initTestCase(); + +private slots: + void nullObject(); + void nullService(); + void nullOutputControl(); + void noOutputs(); + void serviceDestroyed(); + void mediaObjectDestroyed(); + void setMediaObject(); + + void show(); + + void aspectRatioMode(); + void offset(); + void size(); + void nativeSize_data(); + void nativeSize(); + + void boundingRect_data(); + void boundingRect(); + + void paint(); +}; + +Q_DECLARE_METATYPE(const uchar *) +Q_DECLARE_METATYPE(Qt::AspectRatioMode) + +class QtTestOutputControl : public QVideoOutputControl +{ +public: + QtTestOutputControl() : m_output(NoOutput) {} + + QList<Output> availableOutputs() const { return m_outputs; } + void setAvailableOutputs(const QList<Output> outputs) { m_outputs = outputs; } + + Output output() const { return m_output; } + virtual void setOutput(Output output) { m_output = output; } + +private: + Output m_output; + QList<Output> m_outputs; +}; + +class QtTestRendererControl : public QVideoRendererControl +{ +public: + QtTestRendererControl() + : m_surface(0) + { + } + + QAbstractVideoSurface *surface() const { return m_surface; } + void setSurface(QAbstractVideoSurface *surface) { m_surface = surface; } + +private: + QAbstractVideoSurface *m_surface; +}; + +class QtTestVideoService : public QMediaService +{ + Q_OBJECT +public: + QtTestVideoService( + QtTestOutputControl *output, + QtTestRendererControl *renderer) + : QMediaService(0) + , outputControl(output) + , rendererControl(renderer) + { + } + + ~QtTestVideoService() + { + delete outputControl; + delete rendererControl; + } + + QMediaControl *control(const char *name) const + { + if (qstrcmp(name, QVideoOutputControl_iid) == 0) + return outputControl; + else if (qstrcmp(name, QVideoRendererControl_iid) == 0) + return rendererControl; + else + return 0; + } + + QtTestOutputControl *outputControl; + QtTestRendererControl *rendererControl; +}; + +class QtTestVideoObject : public QMediaObject +{ + Q_OBJECT +public: + QtTestVideoObject(QtTestRendererControl *renderer): + QMediaObject(0, new QtTestVideoService(new QtTestOutputControl, renderer)) + { + testService = qobject_cast<QtTestVideoService*>(service()); + QList<QVideoOutputControl::Output> outputs; + + if (renderer) + outputs.append(QVideoOutputControl::RendererOutput); + + testService->outputControl->setAvailableOutputs(outputs); + } + + QtTestVideoObject(QtTestVideoService *service): + QMediaObject(0, service), + testService(service) + { + } + + ~QtTestVideoObject() + { + delete testService; + } + + QtTestVideoService *testService; +}; + +class QtTestGraphicsVideoItem : public QGraphicsVideoItem +{ +public: + QtTestGraphicsVideoItem(QGraphicsItem *parent = 0) + : QGraphicsVideoItem(parent) + , m_paintCount(0) + { + } + + void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) + { + ++m_paintCount; + + QTestEventLoop::instance().exitLoop(); + + QGraphicsVideoItem::paint(painter, option, widget); + } + + bool waitForPaint(int secs) + { + const int paintCount = m_paintCount; + + QTestEventLoop::instance().enterLoop(secs); + + return m_paintCount != paintCount; + } + + int paintCount() const + { + return m_paintCount; + } + +private: + int m_paintCount; +}; + +void tst_QGraphicsVideoItem::initTestCase() +{ + qRegisterMetaType<Qt::AspectRatioMode>(); +} + +void tst_QGraphicsVideoItem::nullObject() +{ + QGraphicsVideoItem item(0); + + QVERIFY(item.boundingRect().isEmpty()); +} + +void tst_QGraphicsVideoItem::nullService() +{ + QtTestVideoService *service = 0; + + QtTestVideoObject object(service); + + QtTestGraphicsVideoItem *item = new QtTestGraphicsVideoItem; + item->setMediaObject(&object); + + QVERIFY(item->boundingRect().isEmpty()); + + item->hide(); + item->show(); + + QGraphicsScene graphicsScene; + graphicsScene.addItem(item); + QGraphicsView graphicsView(&graphicsScene); + graphicsView.show(); +} + +void tst_QGraphicsVideoItem::nullOutputControl() +{ + QtTestVideoObject object(new QtTestVideoService(0, 0)); + + QtTestGraphicsVideoItem *item = new QtTestGraphicsVideoItem; + item->setMediaObject(&object); + + QVERIFY(item->boundingRect().isEmpty()); + + item->hide(); + item->show(); + + QGraphicsScene graphicsScene; + graphicsScene.addItem(item); + QGraphicsView graphicsView(&graphicsScene); + graphicsView.show(); +} + +void tst_QGraphicsVideoItem::noOutputs() +{ + QtTestRendererControl *control = 0; + QtTestVideoObject object(control); + + QtTestGraphicsVideoItem *item = new QtTestGraphicsVideoItem; + item->setMediaObject(&object); + + QVERIFY(item->boundingRect().isEmpty()); + + item->hide(); + QCOMPARE(object.testService->outputControl->output(), QVideoOutputControl::NoOutput); + item->show(); + QCOMPARE(object.testService->outputControl->output(), QVideoOutputControl::NoOutput); + + QGraphicsScene graphicsScene; + graphicsScene.addItem(item); + QGraphicsView graphicsView(&graphicsScene); + graphicsView.show(); +} + +void tst_QGraphicsVideoItem::serviceDestroyed() +{ + QtTestVideoObject object(new QtTestRendererControl); + + QGraphicsVideoItem item; + item.setMediaObject(&object); + + QtTestVideoService *service = object.testService; + object.testService = 0; + + delete service; + + QCOMPARE(item.mediaObject(), static_cast<QMediaObject *>(&object)); + QVERIFY(item.boundingRect().isEmpty()); +} + +void tst_QGraphicsVideoItem::mediaObjectDestroyed() +{ + QtTestVideoObject *object = new QtTestVideoObject(new QtTestRendererControl); + + QGraphicsVideoItem item; + item.setMediaObject(object); + + delete object; + object = 0; + + QCOMPARE(item.mediaObject(), static_cast<QMediaObject *>(object)); + QVERIFY(item.boundingRect().isEmpty()); +} + +void tst_QGraphicsVideoItem::setMediaObject() +{ + QMediaObject *nullObject = 0; + QtTestVideoObject object(new QtTestRendererControl); + + QGraphicsVideoItem item; + + QCOMPARE(item.mediaObject(), nullObject); + QCOMPARE(object.testService->outputControl->output(), QVideoOutputControl::NoOutput); + + item.setMediaObject(&object); + QCOMPARE(item.mediaObject(), static_cast<QMediaObject *>(&object)); + QCOMPARE(object.testService->outputControl->output(), QVideoOutputControl::RendererOutput); + QVERIFY(object.testService->rendererControl->surface() != 0); + + item.setMediaObject(0); + QCOMPARE(item.mediaObject(), nullObject); + + QCOMPARE(object.testService->outputControl->output(), QVideoOutputControl::NoOutput); + + item.setVisible(false); + + item.setMediaObject(&object); + QCOMPARE(item.mediaObject(), static_cast<QMediaObject *>(&object)); + QCOMPARE(object.testService->outputControl->output(), QVideoOutputControl::NoOutput); + QVERIFY(object.testService->rendererControl->surface() != 0); +} + +void tst_QGraphicsVideoItem::show() +{ + QtTestVideoObject object(new QtTestRendererControl); + QtTestGraphicsVideoItem *item = new QtTestGraphicsVideoItem; + item->setMediaObject(&object); + + // Graphics items are visible by default + QCOMPARE(object.testService->outputControl->output(), QVideoOutputControl::RendererOutput); + QVERIFY(object.testService->rendererControl->surface() != 0); + + item->hide(); + QCOMPARE(object.testService->outputControl->output(), QVideoOutputControl::RendererOutput); + + item->show(); + QCOMPARE(object.testService->outputControl->output(), QVideoOutputControl::RendererOutput); + QVERIFY(object.testService->rendererControl->surface() != 0); + + QVERIFY(item->boundingRect().isEmpty()); + + QVideoSurfaceFormat format(QSize(320,240),QVideoFrame::Format_RGB32); + QVERIFY(object.testService->rendererControl->surface()->start(format)); + + QVERIFY(!item->boundingRect().isEmpty()); + + QGraphicsScene graphicsScene; + graphicsScene.addItem(item); + QGraphicsView graphicsView(&graphicsScene); + graphicsView.show(); + + QVERIFY(item->paintCount() || item->waitForPaint(1)); +} + +void tst_QGraphicsVideoItem::aspectRatioMode() +{ + QGraphicsVideoItem item; + + QCOMPARE(item.aspectRatioMode(), Qt::KeepAspectRatio); + + item.setAspectRatioMode(Qt::IgnoreAspectRatio); + QCOMPARE(item.aspectRatioMode(), Qt::IgnoreAspectRatio); + + item.setAspectRatioMode(Qt::KeepAspectRatioByExpanding); + QCOMPARE(item.aspectRatioMode(), Qt::KeepAspectRatioByExpanding); + + item.setAspectRatioMode(Qt::KeepAspectRatio); + QCOMPARE(item.aspectRatioMode(), Qt::KeepAspectRatio); +} + +void tst_QGraphicsVideoItem::offset() +{ + QGraphicsVideoItem item; + + QCOMPARE(item.offset(), QPointF(0, 0)); + + item.setOffset(QPointF(-32.4, 43.0)); + QCOMPARE(item.offset(), QPointF(-32.4, 43.0)); + + item.setOffset(QPointF(1, 1)); + QCOMPARE(item.offset(), QPointF(1, 1)); + + item.setOffset(QPointF(12, -30.4)); + QCOMPARE(item.offset(), QPointF(12, -30.4)); + + item.setOffset(QPointF(-90.4, -75)); + QCOMPARE(item.offset(), QPointF(-90.4, -75)); +} + +void tst_QGraphicsVideoItem::size() +{ + QGraphicsVideoItem item; + + QCOMPARE(item.size(), QSizeF(320, 240)); + + item.setSize(QSizeF(542.5, 436.3)); + QCOMPARE(item.size(), QSizeF(542.5, 436.3)); + + item.setSize(QSizeF(-43, 12)); + QCOMPARE(item.size(), QSizeF(0, 0)); + + item.setSize(QSizeF(54, -9)); + QCOMPARE(item.size(), QSizeF(0, 0)); + + item.setSize(QSizeF(-90, -65)); + QCOMPARE(item.size(), QSizeF(0, 0)); + + item.setSize(QSizeF(1000, 1000)); + QCOMPARE(item.size(), QSizeF(1000, 1000)); +} + +void tst_QGraphicsVideoItem::nativeSize_data() +{ + QTest::addColumn<QSize>("frameSize"); + QTest::addColumn<QRect>("viewport"); + QTest::addColumn<QSize>("pixelAspectRatio"); + QTest::addColumn<QSizeF>("nativeSize"); + + QTest::newRow("640x480") + << QSize(640, 480) + << QRect(0, 0, 640, 480) + << QSize(1, 1) + << QSizeF(640, 480); + + QTest::newRow("800x600, (80,60, 640x480) viewport") + << QSize(800, 600) + << QRect(80, 60, 640, 480) + << QSize(1, 1) + << QSizeF(640, 480); + + QTest::newRow("800x600, (80,60, 640x480) viewport, 4:3") + << QSize(800, 600) + << QRect(80, 60, 640, 480) + << QSize(4, 3) + << QSizeF(853, 480); +} + +void tst_QGraphicsVideoItem::nativeSize() +{ + QFETCH(QSize, frameSize); + QFETCH(QRect, viewport); + QFETCH(QSize, pixelAspectRatio); + QFETCH(QSizeF, nativeSize); + + QtTestVideoObject object(new QtTestRendererControl); + QGraphicsVideoItem item; + item.setMediaObject(&object); + + QCOMPARE(item.nativeSize(), QSizeF()); + + QSignalSpy spy(&item, SIGNAL(nativeSizeChanged(QSizeF))); + + QVideoSurfaceFormat format(frameSize, QVideoFrame::Format_ARGB32); + format.setViewport(viewport); + format.setPixelAspectRatio(pixelAspectRatio); + + QVERIFY(object.testService->rendererControl->surface()->start(format)); + + QCOMPARE(item.nativeSize(), nativeSize); + QCOMPARE(spy.count(), 1); + QCOMPARE(spy.last().first().toSizeF(), nativeSize); + + object.testService->rendererControl->surface()->stop(); + + QCOMPARE(item.nativeSize(), QSizeF(0, 0)); + QCOMPARE(spy.count(), 2); + QCOMPARE(spy.last().first().toSizeF(), QSizeF(0, 0)); +} + +void tst_QGraphicsVideoItem::boundingRect_data() +{ + QTest::addColumn<QSize>("frameSize"); + QTest::addColumn<QPointF>("offset"); + QTest::addColumn<QSizeF>("size"); + QTest::addColumn<Qt::AspectRatioMode>("aspectRatioMode"); + QTest::addColumn<QRectF>("expectedRect"); + + + QTest::newRow("640x480: (0,0 640x480), Keep") + << QSize(640, 480) + << QPointF(0, 0) + << QSizeF(640, 480) + << Qt::KeepAspectRatio + << QRectF(0, 0, 640, 480); + + QTest::newRow("800x600, (0,0, 640x480), Keep") + << QSize(800, 600) + << QPointF(0, 0) + << QSizeF(640, 480) + << Qt::KeepAspectRatio + << QRectF(0, 0, 640, 480); + + QTest::newRow("800x600, (0,0, 640x480), KeepByExpanding") + << QSize(800, 600) + << QPointF(0, 0) + << QSizeF(640, 480) + << Qt::KeepAspectRatioByExpanding + << QRectF(0, 0, 640, 480); + + QTest::newRow("800x600, (0,0, 640x480), Ignore") + << QSize(800, 600) + << QPointF(0, 0) + << QSizeF(640, 480) + << Qt::IgnoreAspectRatio + << QRectF(0, 0, 640, 480); + + QTest::newRow("800x600, (100,100, 640x480), Keep") + << QSize(800, 600) + << QPointF(100, 100) + << QSizeF(640, 480) + << Qt::KeepAspectRatio + << QRectF(100, 100, 640, 480); + + QTest::newRow("800x600, (100,-100, 640x480), KeepByExpanding") + << QSize(800, 600) + << QPointF(100, -100) + << QSizeF(640, 480) + << Qt::KeepAspectRatioByExpanding + << QRectF(100, -100, 640, 480); + + QTest::newRow("800x600, (-100,-100, 640x480), Ignore") + << QSize(800, 600) + << QPointF(-100, -100) + << QSizeF(640, 480) + << Qt::IgnoreAspectRatio + << QRectF(-100, -100, 640, 480); + + QTest::newRow("800x600, (0,0, 1920x1024), Keep") + << QSize(800, 600) + << QPointF(0, 0) + << QSizeF(1920, 1024) + << Qt::KeepAspectRatio + << QRectF(832.0 / 3, 0, 4096.0 / 3, 1024); + + QTest::newRow("800x600, (0,0, 1920x1024), KeepByExpanding") + << QSize(800, 600) + << QPointF(0, 0) + << QSizeF(1920, 1024) + << Qt::KeepAspectRatioByExpanding + << QRectF(0, 0, 1920, 1024); + + QTest::newRow("800x600, (0,0, 1920x1024), Ignore") + << QSize(800, 600) + << QPointF(0, 0) + << QSizeF(1920, 1024) + << Qt::IgnoreAspectRatio + << QRectF(0, 0, 1920, 1024); + + QTest::newRow("800x600, (100,100, 1920x1024), Keep") + << QSize(800, 600) + << QPointF(100, 100) + << QSizeF(1920, 1024) + << Qt::KeepAspectRatio + << QRectF(100 + 832.0 / 3, 100, 4096.0 / 3, 1024); + + QTest::newRow("800x600, (100,-100, 1920x1024), KeepByExpanding") + << QSize(800, 600) + << QPointF(100, -100) + << QSizeF(1920, 1024) + << Qt::KeepAspectRatioByExpanding + << QRectF(100, -100, 1920, 1024); + + QTest::newRow("800x600, (-100,-100, 1920x1024), Ignore") + << QSize(800, 600) + << QPointF(-100, -100) + << QSizeF(1920, 1024) + << Qt::IgnoreAspectRatio + << QRectF(-100, -100, 1920, 1024); +} + +void tst_QGraphicsVideoItem::boundingRect() +{ + QFETCH(QSize, frameSize); + QFETCH(QPointF, offset); + QFETCH(QSizeF, size); + QFETCH(Qt::AspectRatioMode, aspectRatioMode); + QFETCH(QRectF, expectedRect); + + QtTestVideoObject object(new QtTestRendererControl); + QGraphicsVideoItem item; + item.setMediaObject(&object); + + item.setOffset(offset); + item.setSize(size); + item.setAspectRatioMode(aspectRatioMode); + + QVideoSurfaceFormat format(frameSize, QVideoFrame::Format_ARGB32); + + QVERIFY(object.testService->rendererControl->surface()->start(format)); + + QCOMPARE(item.boundingRect(), expectedRect); +} + +static const uchar rgb32ImageData[] = +{ + 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, + 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00 +}; + +void tst_QGraphicsVideoItem::paint() +{ + QtTestVideoObject object(new QtTestRendererControl); + QtTestGraphicsVideoItem *item = new QtTestGraphicsVideoItem; + item->setMediaObject(&object); + + QGraphicsScene graphicsScene; + graphicsScene.addItem(item); + QGraphicsView graphicsView(&graphicsScene); + graphicsView.show(); + + QPainterVideoSurface *surface = qobject_cast<QPainterVideoSurface *>( + object.testService->rendererControl->surface()); + + QVideoSurfaceFormat format(QSize(2, 2), QVideoFrame::Format_RGB32); + + QVERIFY(surface->start(format)); + QCOMPARE(surface->isActive(), true); + QCOMPARE(surface->isReady(), true); + + QVERIFY(item->waitForPaint(1)); + + QCOMPARE(surface->isActive(), true); + QCOMPARE(surface->isReady(), true); + + QVideoFrame frame(sizeof(rgb32ImageData), QSize(2, 2), 8, QVideoFrame::Format_RGB32); + + frame.map(QAbstractVideoBuffer::WriteOnly); + memcpy(frame.bits(), rgb32ImageData, frame.mappedBytes()); + frame.unmap(); + + QVERIFY(surface->present(frame)); + QCOMPARE(surface->isActive(), true); + QCOMPARE(surface->isReady(), false); + + QVERIFY(item->waitForPaint(1)); + + QCOMPARE(surface->isActive(), true); + QCOMPARE(surface->isReady(), true); +} + + +QTEST_MAIN(tst_QGraphicsVideoItem) + +#include "tst_qgraphicsvideoitem.moc" diff --git a/tests/auto/qhelpcontentmodel/qhelpcontentmodel.pro b/tests/auto/qhelpcontentmodel/qhelpcontentmodel.pro index 79bb44c..889aac9 100644 --- a/tests/auto/qhelpcontentmodel/qhelpcontentmodel.pro +++ b/tests/auto/qhelpcontentmodel/qhelpcontentmodel.pro @@ -1,10 +1,22 @@ -TEMPLATE = subdirs -CONFIG += ordered +load(qttest_p4) +SOURCES += tst_qhelpcontentmodel.cpp -contains(QT_BUILD_PARTS, tools): { - SUBDIRS += ../../../tools/assistant/lib/fulltextsearch \ - ../../../tools/assistant/lib -} +CONFIG += help -SUBDIRS += tst_qhelpcontentmodel.pro +DEFINES += QT_USE_USING_NAMESPACE +!contains(QT_BUILD_PARTS, tools): DEFINES += QT_NO_BUILD_TOOLS +wince*: { + DEFINES += SRCDIR=\\\"./\\\" + QT += network + addFiles.sources = $$PWD/data/*.* + addFiles.path = data + clucene.sources = $$QT_BUILD_TREE/lib/QtCLucene*.dll + + DEPLOYMENT += addFiles + DEPLOYMENT += clucene + + DEPLOYMENT_PLUGIN += qsqlite +} else { + DEFINES += SRCDIR=\\\"$$PWD\\\" +}
\ No newline at end of file diff --git a/tests/auto/qhelpcontentmodel/tst_qhelpcontentmodel.pro b/tests/auto/qhelpcontentmodel/tst_qhelpcontentmodel.pro deleted file mode 100644 index 889aac9..0000000 --- a/tests/auto/qhelpcontentmodel/tst_qhelpcontentmodel.pro +++ /dev/null @@ -1,22 +0,0 @@ -load(qttest_p4) -SOURCES += tst_qhelpcontentmodel.cpp - -CONFIG += help - -DEFINES += QT_USE_USING_NAMESPACE -!contains(QT_BUILD_PARTS, tools): DEFINES += QT_NO_BUILD_TOOLS - -wince*: { - DEFINES += SRCDIR=\\\"./\\\" - QT += network - addFiles.sources = $$PWD/data/*.* - addFiles.path = data - clucene.sources = $$QT_BUILD_TREE/lib/QtCLucene*.dll - - DEPLOYMENT += addFiles - DEPLOYMENT += clucene - - DEPLOYMENT_PLUGIN += qsqlite -} else { - DEFINES += SRCDIR=\\\"$$PWD\\\" -}
\ No newline at end of file diff --git a/tests/auto/qhelpenginecore/qhelpenginecore.pro b/tests/auto/qhelpenginecore/qhelpenginecore.pro index ee9b0c4..27ebd0f 100644 --- a/tests/auto/qhelpenginecore/qhelpenginecore.pro +++ b/tests/auto/qhelpenginecore/qhelpenginecore.pro @@ -1,10 +1,23 @@ -TEMPLATE = subdirs -CONFIG += ordered +load(qttest_p4) +SOURCES += tst_qhelpenginecore.cpp +CONFIG += help +QT += sql -contains(QT_BUILD_PARTS, tools): { - SUBDIRS += ../../../tools/assistant/lib/fulltextsearch \ - ../../../tools/assistant/lib -} -SUBDIRS += tst_qhelpenginecore.pro +DEFINES += QT_USE_USING_NAMESPACE +!contains(QT_BUILD_PARTS, tools): DEFINES += QT_NO_BUILD_TOOLS + +wince*: { + DEFINES += SRCDIR=\\\"./\\\" + QT += network + addFiles.sources = $$PWD/data/*.* + addFiles.path = data + clucene.sources = $$QT_BUILD_TREE/lib/QtCLucene*.dll + DEPLOYMENT += addFiles + DEPLOYMENT += clucene + + DEPLOYMENT_PLUGIN += qsqlite +} else { + DEFINES += SRCDIR=\\\"$$PWD\\\" +} diff --git a/tests/auto/qhelpenginecore/tst_qhelpenginecore.pro b/tests/auto/qhelpenginecore/tst_qhelpenginecore.pro deleted file mode 100644 index 27ebd0f..0000000 --- a/tests/auto/qhelpenginecore/tst_qhelpenginecore.pro +++ /dev/null @@ -1,23 +0,0 @@ -load(qttest_p4) -SOURCES += tst_qhelpenginecore.cpp -CONFIG += help -QT += sql - - -DEFINES += QT_USE_USING_NAMESPACE -!contains(QT_BUILD_PARTS, tools): DEFINES += QT_NO_BUILD_TOOLS - -wince*: { - DEFINES += SRCDIR=\\\"./\\\" - QT += network - addFiles.sources = $$PWD/data/*.* - addFiles.path = data - clucene.sources = $$QT_BUILD_TREE/lib/QtCLucene*.dll - - DEPLOYMENT += addFiles - DEPLOYMENT += clucene - - DEPLOYMENT_PLUGIN += qsqlite -} else { - DEFINES += SRCDIR=\\\"$$PWD\\\" -} diff --git a/tests/auto/qhelpgenerator/qhelpgenerator.pro b/tests/auto/qhelpgenerator/qhelpgenerator.pro index efa1ef5..b4b07dd 100644 --- a/tests/auto/qhelpgenerator/qhelpgenerator.pro +++ b/tests/auto/qhelpgenerator/qhelpgenerator.pro @@ -1,10 +1,9 @@ -TEMPLATE = subdirs -CONFIG += ordered +load(qttest_p4) -contains(QT_BUILD_PARTS, tools): { - SUBDIRS += ../../../tools/assistant/lib/fulltextsearch \ - ../../../tools/assistant/lib -} - -SUBDIRS += tst_qhelpgenerator.pro +SOURCES += tst_qhelpgenerator.cpp +CONFIG += help +QT += sql +DEFINES += SRCDIR=\\\"$$PWD\\\" +DEFINES += QT_USE_USING_NAMESPACE +!contains(QT_BUILD_PARTS, tools): DEFINES += QT_NO_BUILD_TOOLS diff --git a/tests/auto/qhelpgenerator/tst_qhelpgenerator.pro b/tests/auto/qhelpgenerator/tst_qhelpgenerator.pro deleted file mode 100644 index b4b07dd..0000000 --- a/tests/auto/qhelpgenerator/tst_qhelpgenerator.pro +++ /dev/null @@ -1,9 +0,0 @@ -load(qttest_p4) - -SOURCES += tst_qhelpgenerator.cpp -CONFIG += help -QT += sql - -DEFINES += SRCDIR=\\\"$$PWD\\\" -DEFINES += QT_USE_USING_NAMESPACE -!contains(QT_BUILD_PARTS, tools): DEFINES += QT_NO_BUILD_TOOLS diff --git a/tests/auto/qhelpindexmodel/qhelpindexmodel.pro b/tests/auto/qhelpindexmodel/qhelpindexmodel.pro index 1325e09..927c2e1 100644 --- a/tests/auto/qhelpindexmodel/qhelpindexmodel.pro +++ b/tests/auto/qhelpindexmodel/qhelpindexmodel.pro @@ -1,10 +1,9 @@ -TEMPLATE = subdirs -CONFIG += ordered +load(qttest_p4) -contains(QT_BUILD_PARTS, tools): { - SUBDIRS += ../../../tools/assistant/lib/fulltextsearch \ - ../../../tools/assistant/lib -} - -SUBDIRS += tst_qhelpindexmodel.pro +SOURCES += tst_qhelpindexmodel.cpp +CONFIG += help +QT += sql +DEFINES += SRCDIR=\\\"$$PWD\\\" +DEFINES += QT_USE_USING_NAMESPACE +!contains(QT_BUILD_PARTS, tools): DEFINES += QT_NO_BUILD_TOOLS diff --git a/tests/auto/qhelpindexmodel/tst_qhelpindexmodel.pro b/tests/auto/qhelpindexmodel/tst_qhelpindexmodel.pro deleted file mode 100644 index 927c2e1..0000000 --- a/tests/auto/qhelpindexmodel/tst_qhelpindexmodel.pro +++ /dev/null @@ -1,9 +0,0 @@ -load(qttest_p4) - -SOURCES += tst_qhelpindexmodel.cpp -CONFIG += help -QT += sql - -DEFINES += SRCDIR=\\\"$$PWD\\\" -DEFINES += QT_USE_USING_NAMESPACE -!contains(QT_BUILD_PARTS, tools): DEFINES += QT_NO_BUILD_TOOLS diff --git a/tests/auto/qhelpprojectdata/qhelpprojectdata.pro b/tests/auto/qhelpprojectdata/qhelpprojectdata.pro index 9617416..92dc620 100644 --- a/tests/auto/qhelpprojectdata/qhelpprojectdata.pro +++ b/tests/auto/qhelpprojectdata/qhelpprojectdata.pro @@ -1,10 +1,9 @@ -TEMPLATE = subdirs -CONFIG += ordered +load(qttest_p4) -contains(QT_BUILD_PARTS, tools): { - SUBDIRS += ../../../tools/assistant/lib/fulltextsearch \ - ../../../tools/assistant/lib -} +SOURCES += tst_qhelpprojectdata.cpp +CONFIG += help -SUBDIRS += tst_qhelpprojectdata.pro +DEFINES += SRCDIR=\\\"$$PWD\\\" +DEFINES += QT_USE_USING_NAMESPACE +!contains(QT_BUILD_PARTS, tools): DEFINES += QT_NO_BUILD_TOOLS diff --git a/tests/auto/qhelpprojectdata/tst_qhelpprojectdata.pro b/tests/auto/qhelpprojectdata/tst_qhelpprojectdata.pro deleted file mode 100644 index 92dc620..0000000 --- a/tests/auto/qhelpprojectdata/tst_qhelpprojectdata.pro +++ /dev/null @@ -1,9 +0,0 @@ -load(qttest_p4) - -SOURCES += tst_qhelpprojectdata.cpp -CONFIG += help - -DEFINES += SRCDIR=\\\"$$PWD\\\" -DEFINES += QT_USE_USING_NAMESPACE -!contains(QT_BUILD_PARTS, tools): DEFINES += QT_NO_BUILD_TOOLS - diff --git a/tests/auto/qlibrary/lib2/lib2.pro b/tests/auto/qlibrary/lib2/lib2.pro index da30a2d..4654f4d 100644 --- a/tests/auto/qlibrary/lib2/lib2.pro +++ b/tests/auto/qlibrary/lib2/lib2.pro @@ -16,14 +16,19 @@ win32-borland: DEFINES += WIN32_BORLAND !symbian { win32 { - src = $(DESTDIR_TARGET) + # vcproj and Makefile generators refer to target differently + contains(TEMPLATE,vc.*) { + src = $(TargetPath) + } else { + src = $(DESTDIR_TARGET) + } files = mylib.dl2 system.trolltech.test.mylib.dll } else { src = $(DESTDIR)$(TARGET) files = libmylib.so2 system.trolltech.test.mylib.so } for(file, files) { - QMAKE_POST_LINK += $(COPY) $$src ..$$QMAKE_DIR_SEP$$file && + QMAKE_POST_LINK += $$QMAKE_COPY $$src ..$$QMAKE_DIR_SEP$$file && CLEAN_FILES += ../$$file } QMAKE_POST_LINK = $$member(QMAKE_POST_LINK, 0, -2) diff --git a/tests/auto/qlineedit/tst_qlineedit.cpp b/tests/auto/qlineedit/tst_qlineedit.cpp index 3b6400a..6dc2c82 100644 --- a/tests/auto/qlineedit/tst_qlineedit.cpp +++ b/tests/auto/qlineedit/tst_qlineedit.cpp @@ -3640,6 +3640,26 @@ void tst_QLineEdit::taskQTBUG_4679_selectToStartEndOfBlock() #endif // Q_OS_MAC } +#ifndef QT_NO_CONTEXTMENU +void tst_QLineEdit::taskQTBUG_7902_contextMenuCrash() +{ + // Would pass before the associated commit, but left as a guard. + QLineEdit *w = new QLineEdit; + w->show(); + QTest::qWaitForWindowShown(w); + + QTimer ti; + w->connect(&ti, SIGNAL(timeout()), w, SLOT(deleteLater())); + ti.start(200); + + QContextMenuEvent *cme = new QContextMenuEvent(QContextMenuEvent::Mouse, w->rect().center()); + qApp->postEvent(w, cme); + + QTest::qWait(300); + // No crash, it's allright. +} +#endif + void tst_QLineEdit::taskQTBUG_7395_readOnlyShortcut() { //ReadOnly QLineEdit should not intercept shortcut. @@ -3661,25 +3681,5 @@ void tst_QLineEdit::taskQTBUG_7395_readOnlyShortcut() QCOMPARE(spy.count(), 1); } -#ifndef QT_NO_CONTEXTMENU -void tst_QLineEdit::taskQTBUG_7902_contextMenuCrash() -{ - // Would pass before the associated commit, but left as a guard. - QLineEdit *w = new QLineEdit; - w->show(); - QTest::qWaitForWindowShown(w); - - QTimer ti; - w->connect(&ti, SIGNAL(timeout()), w, SLOT(deleteLater())); - ti.start(200); - - QContextMenuEvent *cme = new QContextMenuEvent(QContextMenuEvent::Mouse, w->rect().center()); - qApp->postEvent(w, cme); - - QTest::qWait(300); - // No crash, it's allright. -} -#endif - QTEST_MAIN(tst_QLineEdit) #include "tst_qlineedit.moc" diff --git a/tests/auto/qlist/tst_qlist.cpp b/tests/auto/qlist/tst_qlist.cpp index 59b2c7b..a590fca 100644 --- a/tests/auto/qlist/tst_qlist.cpp +++ b/tests/auto/qlist/tst_qlist.cpp @@ -60,6 +60,7 @@ private slots: void length() const; void lengthSignature() const; void append() const; + void mid() const; }; void tst_QList::length() const @@ -129,5 +130,14 @@ void tst_QList::append() const } +void tst_QList::mid() const +{ + QList<QString> list; + list << "foo" << "bar" << "baz" << "bak" << "buck" << "hello" << "kitty"; + + QCOMPARE(list.mid(3, 3), + QList<QString>() << "bak" << "buck" << "hello"); +} + QTEST_APPLESS_MAIN(tst_QList) #include "tst_qlist.moc" diff --git a/tests/auto/qlocale/tst_qlocale.cpp b/tests/auto/qlocale/tst_qlocale.cpp index 3dc4dad..5a87154 100644 --- a/tests/auto/qlocale/tst_qlocale.cpp +++ b/tests/auto/qlocale/tst_qlocale.cpp @@ -1017,6 +1017,9 @@ void tst_QLocale::toDateTime_data() QTest::newRow("RFC-1123") << "C" << QDateTime(QDate(2007, 11, 1), QTime(18, 8, 30)) << "ddd, dd MMM yyyy hh:mm:ss 'GMT'" << "Thu, 01 Nov 2007 18:08:30 GMT"; + + QTest::newRow("longFormat") << "en_US" << QDateTime(QDate(2009, 1, 5), QTime(11, 48, 32)) + << "dddd, MMMM d, yyyy h:mm:ss AP " << "Monday, January 5, 2009 11:48:32 AM "; } void tst_QLocale::toDateTime() @@ -1028,6 +1031,8 @@ void tst_QLocale::toDateTime() QLocale l(localeName); QCOMPARE(l.toDateTime(string, format), result); + if (l.dateTimeFormat(QLocale::LongFormat) == format) + QCOMPARE(l.toDateTime(string, QLocale::LongFormat), result); } void tst_QLocale::macDefaultLocale() diff --git a/tests/auto/qlocalsocket/lackey/main.cpp b/tests/auto/qlocalsocket/lackey/main.cpp index 0f1930c..1bba4f8 100644 --- a/tests/auto/qlocalsocket/lackey/main.cpp +++ b/tests/auto/qlocalsocket/lackey/main.cpp @@ -172,8 +172,10 @@ static int _q_ScriptRegisterQObjectMetaType(QScriptEngine *engine, const QScript return qScriptRegisterMetaType<T*>(engine, _q_ScriptValueFromQObject<T>, _q_ScriptValueToQObject<T>, prototype); } +QT_BEGIN_NAMESPACE Q_SCRIPT_DECLARE_QMETAOBJECT(QScriptLocalSocket, QObject*); Q_SCRIPT_DECLARE_QMETAOBJECT(QScriptLocalServer, QObject*); +QT_END_NAMESPACE static void interactive(QScriptEngine &eng) { diff --git a/tests/auto/qmediacontent/qmediacontent.pro b/tests/auto/qmediacontent/qmediacontent.pro new file mode 100644 index 0000000..f7884f6 --- /dev/null +++ b/tests/auto/qmediacontent/qmediacontent.pro @@ -0,0 +1,6 @@ +load(qttest_p4) + +SOURCES += tst_qmediacontent.cpp + +QT = core multimedia + diff --git a/tests/auto/qmediacontent/tst_qmediacontent.cpp b/tests/auto/qmediacontent/tst_qmediacontent.cpp new file mode 100644 index 0000000..35dd0a9 --- /dev/null +++ b/tests/auto/qmediacontent/tst_qmediacontent.cpp @@ -0,0 +1,160 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (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 Technology Preview License Agreement accompanying +** this package. +** +** 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.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <QtTest/QtTest> + +#include <QtMultimedia/qmediacontent.h> + + +class tst_QMediaContent : public QObject +{ + Q_OBJECT + +private slots: + void testNull(); + void testUrlCtor(); + void testResourceCtor(); + void testResourceListCtor(); + void testCopy(); + void testAssignment(); + void testEquality(); + void testResources(); +}; + +void tst_QMediaContent::testNull() +{ + QMediaContent media; + + QCOMPARE(media.isNull(), true); + QCOMPARE(media.canonicalUrl(), QUrl()); + QCOMPARE(media.canonicalResource(), QMediaResource()); + QCOMPARE(media.resources(), QMediaResourceList()); +} + +void tst_QMediaContent::testUrlCtor() +{ + QMediaContent media(QUrl("http://example.com/movie.mov")); + + QCOMPARE(media.canonicalUrl(), QUrl("http://example.com/movie.mov")); + QCOMPARE(media.canonicalResource().url(), QUrl("http://example.com/movie.mov")); +} + +void tst_QMediaContent::testResourceCtor() +{ + QMediaContent media(QMediaResource(QUrl("http://example.com/movie.mov"))); + + QCOMPARE(media.canonicalResource(), QMediaResource(QUrl("http://example.com/movie.mov"))); +} + +void tst_QMediaContent::testResourceListCtor() +{ + QMediaResourceList resourceList; + resourceList << QMediaResource(QUrl("http://example.com/movie.mov")); + + QMediaContent media(resourceList); + + QCOMPARE(media.canonicalUrl(), QUrl("http://example.com/movie.mov")); + QCOMPARE(media.canonicalResource().url(), QUrl("http://example.com/movie.mov")); +} + +void tst_QMediaContent::testCopy() +{ + QMediaContent media1(QMediaResource(QUrl("http://example.com/movie.mov"))); + QMediaContent media2(media1); + + QVERIFY(media1 == media2); +} + +void tst_QMediaContent::testAssignment() +{ + QMediaContent media1(QMediaResource(QUrl("http://example.com/movie.mov"))); + QMediaContent media2; + QMediaContent media3; + + media2 = media1; + QVERIFY(media2 == media1); + + media2 = media3; + QVERIFY(media2 == media3); +} + +void tst_QMediaContent::testEquality() +{ + QMediaContent media1; + QMediaContent media2; + QMediaContent media3(QMediaResource(QUrl("http://example.com/movie.mov"))); + QMediaContent media4(QMediaResource(QUrl("http://example.com/movie.mov"))); + QMediaContent media5(QMediaResource(QUrl("file:///some/where/over/the/rainbow.mp3"))); + + // null == null + QCOMPARE(media1 == media2, true); + QCOMPARE(media1 != media2, false); + + // null != something + QCOMPARE(media1 == media3, false); + QCOMPARE(media1 != media3, true); + + // equiv + QCOMPARE(media3 == media4, true); + QCOMPARE(media3 != media4, false); + + // not equiv + QCOMPARE(media4 == media5, false); + QCOMPARE(media4 != media5, true); +} + +void tst_QMediaContent::testResources() +{ + QMediaResourceList resourceList; + + resourceList << QMediaResource(QUrl("http://example.com/movie-main.mov")); + resourceList << QMediaResource(QUrl("http://example.com/movie-big.mov")); + QMediaContent media(resourceList); + + QMediaResourceList res = media.resources(); + QCOMPARE(res.size(), 2); + QCOMPARE(res[0], QMediaResource(QUrl("http://example.com/movie-main.mov"))); + QCOMPARE(res[1], QMediaResource(QUrl("http://example.com/movie-big.mov"))); +} + +QTEST_MAIN(tst_QMediaContent) + +#include "tst_qmediacontent.moc" diff --git a/tests/auto/qmediaobject/qmediaobject.pro b/tests/auto/qmediaobject/qmediaobject.pro new file mode 100644 index 0000000..e59bfdc --- /dev/null +++ b/tests/auto/qmediaobject/qmediaobject.pro @@ -0,0 +1,4 @@ +load(qttest_p4) + +SOURCES += tst_qmediaobject.cpp +QT = core multimedia diff --git a/tests/auto/qmediaobject/tst_qmediaobject.cpp b/tests/auto/qmediaobject/tst_qmediaobject.cpp new file mode 100644 index 0000000..2128b35 --- /dev/null +++ b/tests/auto/qmediaobject/tst_qmediaobject.cpp @@ -0,0 +1,549 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (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 Technology Preview License Agreement accompanying +** this package. +** +** 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.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <QtTest/QtTest> + +#include <QtCore/qtimer.h> + +#include <QtMultimedia/qmediaobject.h> +#include <QtMultimedia/qmediaservice.h> +#include <QtMultimedia/qmetadatacontrol.h> + + +class tst_QMediaObject : public QObject +{ + Q_OBJECT + +private slots: + void propertyWatch(); + void notifySignals_data(); + void notifySignals(); + void notifyInterval_data(); + void notifyInterval(); + + void nullMetaDataControl(); + void isMetaDataAvailable(); + void isWritable(); + void metaDataChanged(); + void metaData_data(); + void metaData(); + void setMetaData_data(); + void setMetaData(); + void extendedMetaData_data() { metaData_data(); } + void extendedMetaData(); + void setExtendedMetaData_data() { extendedMetaData_data(); } + void setExtendedMetaData(); + + +private: + void setupNotifyTests(); +}; + +class QtTestMetaDataProvider : public QMetaDataControl +{ + Q_OBJECT +public: + QtTestMetaDataProvider(QObject *parent = 0) + : QMetaDataControl(parent) + , m_available(false) + , m_writable(false) + { + } + + bool isMetaDataAvailable() const { return m_available; } + void setMetaDataAvailable(bool available) { + if (m_available != available) + emit metaDataAvailableChanged(m_available = available); + } + QList<QtMultimedia::MetaData> availableMetaData() const { return m_data.keys(); } + + bool isWritable() const { return m_writable; } + void setWritable(bool writable) { emit writableChanged(m_writable = writable); } + + QVariant metaData(QtMultimedia::MetaData key) const { return m_data.value(key); } + void setMetaData(QtMultimedia::MetaData key, const QVariant &value) { + m_data.insert(key, value); } + + QVariant extendedMetaData(const QString &key) const { return m_extendedData.value(key); } + void setExtendedMetaData(const QString &key, const QVariant &value) { + m_extendedData.insert(key, value); } + + QStringList availableExtendedMetaData() const { return m_extendedData.keys(); } + + using QMetaDataControl::metaDataChanged; + + void populateMetaData() + { + m_available = true; + } + + bool m_available; + bool m_writable; + QMap<QtMultimedia::MetaData, QVariant> m_data; + QMap<QString, QVariant> m_extendedData; +}; + +class QtTestMetaDataService : public QMediaService +{ + Q_OBJECT +public: + QtTestMetaDataService(QObject *parent = 0):QMediaService(parent), hasMetaData(true) + { + } + + QMediaControl *control(const char *iid) const + { + if (hasMetaData && qstrcmp(iid, QMetaDataControl_iid) == 0) + return const_cast<QtTestMetaDataProvider *>(&metaData); + else + return 0; + } + + QtTestMetaDataProvider metaData; + bool hasMetaData; +}; + + +class QtTestMediaObject : public QMediaObject +{ + Q_OBJECT + Q_PROPERTY(int a READ a WRITE setA NOTIFY aChanged) + Q_PROPERTY(int b READ b WRITE setB NOTIFY bChanged) + Q_PROPERTY(int c READ c WRITE setC NOTIFY cChanged) + Q_PROPERTY(int d READ d WRITE setD) +public: + QtTestMediaObject(QMediaService *service = 0): QMediaObject(0, service), m_a(0), m_b(0), m_c(0), m_d(0) {} + + using QMediaObject::addPropertyWatch; + using QMediaObject::removePropertyWatch; + + int a() const { return m_a; } + void setA(int a) { m_a = a; } + + int b() const { return m_b; } + void setB(int b) { m_b = b; } + + int c() const { return m_c; } + void setC(int c) { m_c = c; } + + int d() const { return m_d; } + void setD(int d) { m_d = d; } + +Q_SIGNALS: + void aChanged(int a); + void bChanged(int b); + void cChanged(int c); + +private: + int m_a; + int m_b; + int m_c; + int m_d; +}; + +void tst_QMediaObject::propertyWatch() +{ + QtTestMediaObject object; + object.setNotifyInterval(0); + + QEventLoop loop; + connect(&object, SIGNAL(aChanged(int)), &QTestEventLoop::instance(), SLOT(exitLoop())); + connect(&object, SIGNAL(bChanged(int)), &QTestEventLoop::instance(), SLOT(exitLoop())); + connect(&object, SIGNAL(cChanged(int)), &QTestEventLoop::instance(), SLOT(exitLoop())); + + QSignalSpy aSpy(&object, SIGNAL(aChanged(int))); + QSignalSpy bSpy(&object, SIGNAL(bChanged(int))); + QSignalSpy cSpy(&object, SIGNAL(cChanged(int))); + + QTestEventLoop::instance().enterLoop(1); + + QCOMPARE(aSpy.count(), 0); + QCOMPARE(bSpy.count(), 0); + QCOMPARE(cSpy.count(), 0); + + int aCount = 0; + int bCount = 0; + int cCount = 0; + + object.addPropertyWatch("a"); + + QTestEventLoop::instance().enterLoop(1); + + QVERIFY(aSpy.count() > aCount); + QCOMPARE(bSpy.count(), 0); + QCOMPARE(cSpy.count(), 0); + QCOMPARE(aSpy.last().value(0).toInt(), 0); + + aCount = aSpy.count(); + + object.setA(54); + object.setB(342); + object.setC(233); + + QTestEventLoop::instance().enterLoop(1); + + QVERIFY(aSpy.count() > aCount); + QCOMPARE(bSpy.count(), 0); + QCOMPARE(cSpy.count(), 0); + QCOMPARE(aSpy.last().value(0).toInt(), 54); + + aCount = aSpy.count(); + + object.addPropertyWatch("b"); + object.addPropertyWatch("d"); + object.removePropertyWatch("e"); + object.setA(43); + object.setB(235); + object.setC(90); + + QTestEventLoop::instance().enterLoop(1); + + QVERIFY(aSpy.count() > aCount); + QVERIFY(bSpy.count() > bCount); + QCOMPARE(cSpy.count(), 0); + QCOMPARE(aSpy.last().value(0).toInt(), 43); + QCOMPARE(bSpy.last().value(0).toInt(), 235); + + aCount = aSpy.count(); + bCount = bSpy.count(); + + object.removePropertyWatch("a"); + object.addPropertyWatch("c"); + object.addPropertyWatch("e"); + + QTestEventLoop::instance().enterLoop(1); + + QCOMPARE(aSpy.count(), aCount); + QVERIFY(bSpy.count() > bCount); + QVERIFY(cSpy.count() > cCount); + QCOMPARE(bSpy.last().value(0).toInt(), 235); + QCOMPARE(cSpy.last().value(0).toInt(), 90); + + bCount = bSpy.count(); + cCount = cSpy.count(); + + object.setA(435); + object.setC(9845); + + QTestEventLoop::instance().enterLoop(1); + + QCOMPARE(aSpy.count(), aCount); + QVERIFY(bSpy.count() > bCount); + QVERIFY(cSpy.count() > cCount); + QCOMPARE(bSpy.last().value(0).toInt(), 235); + QCOMPARE(cSpy.last().value(0).toInt(), 9845); + + bCount = bSpy.count(); + cCount = cSpy.count(); + + object.setA(8432); + object.setB(324); + object.setC(443); + object.removePropertyWatch("c"); + object.removePropertyWatch("d"); + + QTestEventLoop::instance().enterLoop(1); + + QCOMPARE(aSpy.count(), aCount); + QVERIFY(bSpy.count() > bCount); + QCOMPARE(cSpy.count(), cCount); + QCOMPARE(bSpy.last().value(0).toInt(), 324); + QCOMPARE(cSpy.last().value(0).toInt(), 9845); + + bCount = bSpy.count(); + + object.removePropertyWatch("b"); + + QTestEventLoop::instance().enterLoop(1); + + QCOMPARE(aSpy.count(), aCount); + QCOMPARE(bSpy.count(), bCount); + QCOMPARE(cSpy.count(), cCount); +} + +void tst_QMediaObject::setupNotifyTests() +{ + QTest::addColumn<int>("interval"); + QTest::addColumn<int>("count"); + + QTest::newRow("single 750ms") + << 750 + << 1; + QTest::newRow("single 600ms") + << 600 + << 1; + QTest::newRow("x3 300ms") + << 300 + << 3; + QTest::newRow("x5 180ms") + << 180 + << 5; +} + +void tst_QMediaObject::notifySignals_data() +{ + setupNotifyTests(); +} + +void tst_QMediaObject::notifySignals() +{ + QFETCH(int, interval); + QFETCH(int, count); + + QtTestMediaObject object; + object.setNotifyInterval(interval); + object.addPropertyWatch("a"); + + QSignalSpy spy(&object, SIGNAL(aChanged(int))); + + QTestEventLoop::instance().enterLoop(1); + + QCOMPARE(spy.count(), count); +} + +void tst_QMediaObject::notifyInterval_data() +{ + setupNotifyTests(); +} + +void tst_QMediaObject::notifyInterval() +{ + QFETCH(int, interval); + + QtTestMediaObject object; + QSignalSpy spy(&object, SIGNAL(notifyIntervalChanged(int))); + + object.setNotifyInterval(interval); + QCOMPARE(object.notifyInterval(), interval); + QCOMPARE(spy.count(), 1); + QCOMPARE(spy.last().value(0).toInt(), interval); + + object.setNotifyInterval(interval); + QCOMPARE(object.notifyInterval(), interval); + QCOMPARE(spy.count(), 1); +} + +void tst_QMediaObject::nullMetaDataControl() +{ + const QString titleKey(QLatin1String("Title")); + const QString title(QLatin1String("Host of Seraphim")); + + QtTestMetaDataService service; + service.hasMetaData = false; + + QtTestMediaObject object(&service); + + QSignalSpy spy(&object, SIGNAL(metaDataChanged())); + + QCOMPARE(object.isMetaDataAvailable(), false); + QCOMPARE(object.isMetaDataWritable(), false); + + object.setMetaData(QtMultimedia::Title, title); + object.setExtendedMetaData(titleKey, title); + + QCOMPARE(object.metaData(QtMultimedia::Title).toString(), QString()); + QCOMPARE(object.extendedMetaData(titleKey).toString(), QString()); + QCOMPARE(object.availableMetaData(), QList<QtMultimedia::MetaData>()); + QCOMPARE(object.availableExtendedMetaData(), QStringList()); + QCOMPARE(spy.count(), 0); +} + +void tst_QMediaObject::isMetaDataAvailable() +{ + QtTestMetaDataService service; + service.metaData.setMetaDataAvailable(false); + + QtTestMediaObject object(&service); + QCOMPARE(object.isMetaDataAvailable(), false); + + QSignalSpy spy(&object, SIGNAL(metaDataAvailableChanged(bool))); + service.metaData.setMetaDataAvailable(true); + + QCOMPARE(object.isMetaDataAvailable(), true); + QCOMPARE(spy.count(), 1); + QCOMPARE(spy.at(0).at(0).toBool(), true); + + service.metaData.setMetaDataAvailable(false); + + QCOMPARE(object.isMetaDataAvailable(), false); + QCOMPARE(spy.count(), 2); + QCOMPARE(spy.at(1).at(0).toBool(), false); +} + +void tst_QMediaObject::isWritable() +{ + QtTestMetaDataService service; + service.metaData.setWritable(false); + + QtTestMediaObject object(&service); + + QSignalSpy spy(&object, SIGNAL(metaDataWritableChanged(bool))); + + QCOMPARE(object.isMetaDataWritable(), false); + + service.metaData.setWritable(true); + + QCOMPARE(object.isMetaDataWritable(), true); + QCOMPARE(spy.count(), 1); + QCOMPARE(spy.at(0).at(0).toBool(), true); + + service.metaData.setWritable(false); + + QCOMPARE(object.isMetaDataWritable(), false); + QCOMPARE(spy.count(), 2); + QCOMPARE(spy.at(1).at(0).toBool(), false); +} + +void tst_QMediaObject::metaDataChanged() +{ + QtTestMetaDataService service; + QtTestMediaObject object(&service); + + QSignalSpy spy(&object, SIGNAL(metaDataChanged())); + + service.metaData.metaDataChanged(); + QCOMPARE(spy.count(), 1); + + service.metaData.metaDataChanged(); + QCOMPARE(spy.count(), 2); +} + +void tst_QMediaObject::metaData_data() +{ + QTest::addColumn<QString>("artist"); + QTest::addColumn<QString>("title"); + QTest::addColumn<QString>("genre"); + + QTest::newRow("") + << QString::fromLatin1("Dead Can Dance") + << QString::fromLatin1("Host of Seraphim") + << QString::fromLatin1("Awesome"); +} + +void tst_QMediaObject::metaData() +{ + QFETCH(QString, artist); + QFETCH(QString, title); + QFETCH(QString, genre); + + QtTestMetaDataService service; + service.metaData.populateMetaData(); + + QtTestMediaObject object(&service); + QVERIFY(object.availableMetaData().isEmpty()); + + service.metaData.m_data.insert(QtMultimedia::AlbumArtist, artist); + service.metaData.m_data.insert(QtMultimedia::Title, title); + service.metaData.m_data.insert(QtMultimedia::Genre, genre); + + QCOMPARE(object.metaData(QtMultimedia::AlbumArtist).toString(), artist); + QCOMPARE(object.metaData(QtMultimedia::Title).toString(), title); + + QList<QtMultimedia::MetaData> metaDataKeys = object.availableMetaData(); + QCOMPARE(metaDataKeys.size(), 3); + QVERIFY(metaDataKeys.contains(QtMultimedia::AlbumArtist)); + QVERIFY(metaDataKeys.contains(QtMultimedia::Title)); + QVERIFY(metaDataKeys.contains(QtMultimedia::Genre)); +} + +void tst_QMediaObject::setMetaData_data() +{ + QTest::addColumn<QString>("title"); + + QTest::newRow("") + << QString::fromLatin1("In the Kingdom of the Blind the One eyed are Kings"); +} + +void tst_QMediaObject::setMetaData() +{ + QFETCH(QString, title); + + QtTestMetaDataService service; + service.metaData.populateMetaData(); + + QtTestMediaObject object(&service); + + object.setMetaData(QtMultimedia::Title, title); + QCOMPARE(object.metaData(QtMultimedia::Title).toString(), title); + QCOMPARE(service.metaData.m_data.value(QtMultimedia::Title).toString(), title); +} + +void tst_QMediaObject::extendedMetaData() +{ + QFETCH(QString, artist); + QFETCH(QString, title); + QFETCH(QString, genre); + + QtTestMetaDataService service; + QtTestMediaObject object(&service); + QVERIFY(object.availableExtendedMetaData().isEmpty()); + + service.metaData.m_extendedData.insert(QLatin1String("Artist"), artist); + service.metaData.m_extendedData.insert(QLatin1String("Title"), title); + service.metaData.m_extendedData.insert(QLatin1String("Genre"), genre); + + QCOMPARE(object.extendedMetaData(QLatin1String("Artist")).toString(), artist); + QCOMPARE(object.extendedMetaData(QLatin1String("Title")).toString(), title); + + QStringList extendedKeys = object.availableExtendedMetaData(); + QCOMPARE(extendedKeys.size(), 3); + QVERIFY(extendedKeys.contains(QLatin1String("Artist"))); + QVERIFY(extendedKeys.contains(QLatin1String("Title"))); + QVERIFY(extendedKeys.contains(QLatin1String("Genre"))); +} + +void tst_QMediaObject::setExtendedMetaData() +{ + QtTestMetaDataService service; + service.metaData.populateMetaData(); + + QtTestMediaObject object(&service); + + QString title(QLatin1String("In the Kingdom of the Blind the One eyed are Kings")); + + object.setExtendedMetaData(QLatin1String("Title"), title); + QCOMPARE(object.extendedMetaData(QLatin1String("Title")).toString(), title); + QCOMPARE(service.metaData.m_extendedData.value(QLatin1String("Title")).toString(), title); +} + +QTEST_MAIN(tst_QMediaObject) + +#include "tst_qmediaobject.moc" diff --git a/tests/auto/qmediaplayer/qmediaplayer.pro b/tests/auto/qmediaplayer/qmediaplayer.pro new file mode 100644 index 0000000..21008f9 --- /dev/null +++ b/tests/auto/qmediaplayer/qmediaplayer.pro @@ -0,0 +1,6 @@ +load(qttest_p4) + +SOURCES += tst_qmediaplayer.cpp + +QT = core multimedia + diff --git a/tests/auto/qmediaplayer/tst_qmediaplayer.cpp b/tests/auto/qmediaplayer/tst_qmediaplayer.cpp new file mode 100644 index 0000000..a96e08d --- /dev/null +++ b/tests/auto/qmediaplayer/tst_qmediaplayer.cpp @@ -0,0 +1,986 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (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 Technology Preview License Agreement accompanying +** this package. +** +** 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.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <QtTest/QtTest> +#include <QtCore/qdebug.h> +#include <QtCore/qbuffer.h> + +#include <QtMultimedia/qmediaplayer.h> +#include <QtMultimedia/qmediaplayercontrol.h> +#include <QtMultimedia/qmediaplaylist.h> +#include <QtMultimedia/qmediaservice.h> + + + +class AutoConnection +{ +public: + AutoConnection(QObject *sender, const char *signal, QObject *receiver, const char *method) + : sender(sender), signal(signal), receiver(receiver), method(method) + { + QObject::connect(sender, signal, receiver, method); + } + + ~AutoConnection() + { + QObject::disconnect(sender, signal, receiver, method); + } + +private: + QObject *sender; + const char *signal; + QObject *receiver; + const char *method; +}; + + +class MockPlayerControl : public QMediaPlayerControl +{ + friend class MockPlayerService; + +public: + MockPlayerControl():QMediaPlayerControl(0) {} + + QMediaPlayer::State state() const { return _state; } + QMediaPlayer::MediaStatus mediaStatus() const { return _mediaStatus; } + + qint64 duration() const { return _duration; } + + qint64 position() const { return _position; } + + void setPosition(qint64 position) { if (position != _position) emit positionChanged(_position = position); } + + int volume() const { return _volume; } + void setVolume(int volume) { emit volumeChanged(_volume = volume); } + + bool isMuted() const { return _muted; } + void setMuted(bool muted) { if (muted != _muted) emit mutedChanged(_muted = muted); } + + int bufferStatus() const { return _bufferStatus; } + + bool isAudioAvailable() const { return _audioAvailable; } + bool isVideoAvailable() const { return _videoAvailable; } + + bool isSeekable() const { return _isSeekable; } + QMediaTimeRange availablePlaybackRanges() const { return QMediaTimeRange(_seekRange.first, _seekRange.second); } + void setSeekRange(qint64 minimum, qint64 maximum) { _seekRange = qMakePair(minimum, maximum); } + + qreal playbackRate() const { return _playbackRate; } + void setPlaybackRate(qreal rate) { if (rate != _playbackRate) emit playbackRateChanged(_playbackRate = rate); } + + QMediaContent media() const { return _media; } + void setMedia(const QMediaContent &content, QIODevice *stream) + { + _stream = stream; + _media = content; + if (_state != QMediaPlayer::StoppedState) { + _mediaStatus = _media.isNull() ? QMediaPlayer::NoMedia : QMediaPlayer::LoadingMedia; + emit stateChanged(_state = QMediaPlayer::StoppedState); + emit mediaStatusChanged(_mediaStatus); + } + emit mediaChanged(_media = content); + } + QIODevice *mediaStream() const { return _stream; } + + void play() { if (_isValid && !_media.isNull() && _state != QMediaPlayer::PlayingState) emit stateChanged(_state = QMediaPlayer::PlayingState); } + void pause() { if (_isValid && !_media.isNull() && _state != QMediaPlayer::PausedState) emit stateChanged(_state = QMediaPlayer::PausedState); } + void stop() { if (_state != QMediaPlayer::StoppedState) emit stateChanged(_state = QMediaPlayer::StoppedState); } + + QMediaPlayer::State _state; + QMediaPlayer::MediaStatus _mediaStatus; + QMediaPlayer::Error _error; + qint64 _duration; + qint64 _position; + int _volume; + bool _muted; + int _bufferStatus; + bool _audioAvailable; + bool _videoAvailable; + bool _isSeekable; + QPair<qint64, qint64> _seekRange; + qreal _playbackRate; + QMediaContent _media; + QIODevice *_stream; + bool _isValid; + QString _errorString; +}; + + +class MockPlayerService : public QMediaService +{ + Q_OBJECT + +public: + MockPlayerService():QMediaService(0) + { + mockControl = new MockPlayerControl; + } + + ~MockPlayerService() + { + delete mockControl; + } + + QMediaControl* control(const char *iid) const + { + if (qstrcmp(iid, QMediaPlayerControl_iid) == 0) + return mockControl; + + return 0; + } + + void setState(QMediaPlayer::State state) { emit mockControl->stateChanged(mockControl->_state = state); } + void setState(QMediaPlayer::State state, QMediaPlayer::MediaStatus status) { + mockControl->_state = state; + mockControl->_mediaStatus = status; + emit mockControl->mediaStatusChanged(status); + emit mockControl->stateChanged(state); + } + void setMediaStatus(QMediaPlayer::MediaStatus status) { emit mockControl->mediaStatusChanged(mockControl->_mediaStatus = status); } + void setIsValid(bool isValid) { mockControl->_isValid = isValid; } + void setMedia(QMediaContent media) { mockControl->_media = media; } + void setDuration(qint64 duration) { mockControl->_duration = duration; } + void setPosition(qint64 position) { mockControl->_position = position; } + void setSeekable(bool seekable) { mockControl->_isSeekable = seekable; } + void setVolume(int volume) { mockControl->_volume = volume; } + void setMuted(bool muted) { mockControl->_muted = muted; } + void setVideoAvailable(bool videoAvailable) { mockControl->_videoAvailable = videoAvailable; } + void setBufferStatus(int bufferStatus) { mockControl->_bufferStatus = bufferStatus; } + void setPlaybackRate(qreal playbackRate) { mockControl->_playbackRate = playbackRate; } + void setError(QMediaPlayer::Error error) { mockControl->_error = error; emit mockControl->error(mockControl->_error, mockControl->_errorString); } + void setErrorString(QString errorString) { mockControl->_errorString = errorString; emit mockControl->error(mockControl->_error, mockControl->_errorString); } + + void reset() + { + mockControl->_state = QMediaPlayer::StoppedState; + mockControl->_mediaStatus = QMediaPlayer::UnknownMediaStatus; + mockControl->_error = QMediaPlayer::NoError; + mockControl->_duration = 0; + mockControl->_position = 0; + mockControl->_volume = 0; + mockControl->_muted = false; + mockControl->_bufferStatus = 0; + mockControl->_videoAvailable = false; + mockControl->_isSeekable = false; + mockControl->_playbackRate = 0.0; + mockControl->_media = QMediaContent(); + mockControl->_stream = 0; + mockControl->_isValid = false; + mockControl->_errorString = QString(); + } + + MockPlayerControl *mockControl; +}; + +class MockProvider : public QMediaServiceProvider +{ +public: + MockProvider(MockPlayerService *service):mockService(service) {} + QMediaService *requestService(const QByteArray &, const QMediaServiceProviderHint &) + { + return mockService; + } + + void releaseService(QMediaService *service) { delete service; } + + MockPlayerService *mockService; +}; + +class tst_QMediaPlayer: public QObject +{ + Q_OBJECT + +public slots: + void initTestCase_data(); + void initTestCase(); + void cleanupTestCase(); + void init(); + void cleanup(); + +private slots: + void testNullService(); + void testValid(); + void testMedia(); + void testDuration(); + void testPosition(); + void testVolume(); + void testMuted(); + void testVideoAvailable(); + void testBufferStatus(); + void testSeekable(); + void testPlaybackRate(); + void testError(); + void testErrorString(); + void testService(); + void testPlay(); + void testPause(); + void testStop(); + void testMediaStatus(); + void testPlaylist(); + +private: + MockProvider *mockProvider; + MockPlayerService *mockService; + QMediaPlayer *player; +}; + +void tst_QMediaPlayer::initTestCase_data() +{ + QTest::addColumn<bool>("valid"); + QTest::addColumn<QMediaPlayer::State>("state"); + QTest::addColumn<QMediaPlayer::MediaStatus>("status"); + QTest::addColumn<QMediaContent>("mediaContent"); + QTest::addColumn<qint64>("duration"); + QTest::addColumn<qint64>("position"); + QTest::addColumn<bool>("seekable"); + QTest::addColumn<int>("volume"); + QTest::addColumn<bool>("muted"); + QTest::addColumn<bool>("videoAvailable"); + QTest::addColumn<int>("bufferStatus"); + QTest::addColumn<qreal>("playbackRate"); + QTest::addColumn<QMediaPlayer::Error>("error"); + QTest::addColumn<QString>("errorString"); + + QTest::newRow("invalid") << false << QMediaPlayer::StoppedState << QMediaPlayer::UnknownMediaStatus << + QMediaContent() << qint64(0) << qint64(0) << false << 0 << false << false << 0 << + qreal(0) << QMediaPlayer::NoError << QString(); + QTest::newRow("valid+null") << true << QMediaPlayer::StoppedState << QMediaPlayer::UnknownMediaStatus << + QMediaContent() << qint64(0) << qint64(0) << false << 0 << false << false << 50 << + qreal(0) << QMediaPlayer::NoError << QString(); + QTest::newRow("valid+content+stopped") << true << QMediaPlayer::StoppedState << QMediaPlayer::UnknownMediaStatus << + QMediaContent(QUrl("file:///some.mp3")) << qint64(0) << qint64(0) << false << 50 << false << false << 0 << + qreal(1) << QMediaPlayer::NoError << QString(); + QTest::newRow("valid+content+playing") << true << QMediaPlayer::PlayingState << QMediaPlayer::LoadedMedia << + QMediaContent(QUrl("file:///some.mp3")) << qint64(10000) << qint64(10) << true << 50 << true << false << 0 << + qreal(1) << QMediaPlayer::NoError << QString(); + QTest::newRow("valid+content+paused") << true << QMediaPlayer::PausedState << QMediaPlayer::LoadedMedia << + QMediaContent(QUrl("file:///some.mp3")) << qint64(10000) << qint64(10) << true << 50 << true << false << 0 << + qreal(1) << QMediaPlayer::NoError << QString(); + QTest::newRow("valud+streaming") << true << QMediaPlayer::PlayingState << QMediaPlayer::LoadedMedia << + QMediaContent(QUrl("http://example.com/stream")) << qint64(10000) << qint64(10000) << false << 50 << false << true << 0 << + qreal(1) << QMediaPlayer::NoError << QString(); + QTest::newRow("valid+error") << true << QMediaPlayer::StoppedState << QMediaPlayer::UnknownMediaStatus << + QMediaContent(QUrl("http://example.com/stream")) << qint64(0) << qint64(0) << false << 50 << false << false << 0 << + qreal(0) << QMediaPlayer::ResourceError << QString("Resource unavailable"); +} + +void tst_QMediaPlayer::initTestCase() +{ + qRegisterMetaType<QMediaContent>(); + + mockService = new MockPlayerService; + mockProvider = new MockProvider(mockService); + player = new QMediaPlayer(0, 0, mockProvider); +} + +void tst_QMediaPlayer::cleanupTestCase() +{ + delete player; +} + +void tst_QMediaPlayer::init() +{ + mockService->reset(); +} + +void tst_QMediaPlayer::cleanup() +{ +} + +void tst_QMediaPlayer::testNullService() +{ + MockProvider provider(0); + QMediaPlayer player(0, 0, &provider); + + const QIODevice *nullDevice = 0; + + QCOMPARE(player.media(), QMediaContent()); + QCOMPARE(player.mediaStream(), nullDevice); + QCOMPARE(player.state(), QMediaPlayer::StoppedState); + QCOMPARE(player.mediaStatus(), QMediaPlayer::UnknownMediaStatus); + QCOMPARE(player.duration(), qint64(-1)); + QCOMPARE(player.position(), qint64(0)); + QCOMPARE(player.volume(), 0); + QCOMPARE(player.isMuted(), false); + QCOMPARE(player.isVideoAvailable(), false); + QCOMPARE(player.bufferStatus(), 0); + QCOMPARE(player.isSeekable(), false); + QCOMPARE(player.playbackRate(), qreal(0)); + QCOMPARE(player.error(), QMediaPlayer::ServiceMissingError); + + { + QFETCH_GLOBAL(QMediaContent, mediaContent); + + QSignalSpy spy(&player, SIGNAL(mediaChanged(QMediaContent))); + QFile file; + + player.setMedia(mediaContent, &file); + QCOMPARE(player.media(), QMediaContent()); + QCOMPARE(player.mediaStream(), nullDevice); + QCOMPARE(spy.count(), 0); + } { + QSignalSpy stateSpy(&player, SIGNAL(stateChanged(QMediaPlayer::State))); + QSignalSpy statusSpy(&player, SIGNAL(mediaStatusChanged(QMediaPlayer::MediaStatus))); + + player.play(); + QCOMPARE(player.state(), QMediaPlayer::StoppedState); + QCOMPARE(player.mediaStatus(), QMediaPlayer::UnknownMediaStatus); + QCOMPARE(stateSpy.count(), 0); + QCOMPARE(statusSpy.count(), 0); + + player.pause(); + QCOMPARE(player.state(), QMediaPlayer::StoppedState); + QCOMPARE(player.mediaStatus(), QMediaPlayer::UnknownMediaStatus); + QCOMPARE(stateSpy.count(), 0); + QCOMPARE(statusSpy.count(), 0); + + player.stop(); + QCOMPARE(player.state(), QMediaPlayer::StoppedState); + QCOMPARE(player.mediaStatus(), QMediaPlayer::UnknownMediaStatus); + QCOMPARE(stateSpy.count(), 0); + QCOMPARE(statusSpy.count(), 0); + } { + QFETCH_GLOBAL(int, volume); + QFETCH_GLOBAL(bool, muted); + + QSignalSpy volumeSpy(&player, SIGNAL(volumeChanged(int))); + QSignalSpy mutingSpy(&player, SIGNAL(mutedChanged(bool))); + + player.setVolume(volume); + QCOMPARE(player.volume(), 0); + QCOMPARE(volumeSpy.count(), 0); + + player.setMuted(muted); + QCOMPARE(player.isMuted(), false); + QCOMPARE(mutingSpy.count(), 0); + } { + QFETCH_GLOBAL(qint64, position); + + QSignalSpy spy(&player, SIGNAL(positionChanged(qint64))); + + player.setPosition(position); + QCOMPARE(player.position(), qint64(0)); + QCOMPARE(spy.count(), 0); + } { + QFETCH_GLOBAL(qreal, playbackRate); + + QSignalSpy spy(&player, SIGNAL(playbackRateChanged(qreal))); + + player.setPlaybackRate(playbackRate); + QCOMPARE(player.playbackRate(), qreal(0)); + QCOMPARE(spy.count(), 0); + } { + QMediaPlaylist playlist; + playlist.setMediaObject(&player); + + QSignalSpy mediaSpy(&player, SIGNAL(mediaChanged(QMediaContent))); + QSignalSpy statusSpy(&player, SIGNAL(mediaStatusChanged(QMediaPlayer::MediaStatus))); + + playlist.addMedia(QUrl("http://example.com/stream")); + playlist.addMedia(QUrl("file:///some.mp3")); + + playlist.setCurrentIndex(0); + QCOMPARE(playlist.currentIndex(), 0); + QCOMPARE(player.media(), QMediaContent()); + QCOMPARE(mediaSpy.count(), 0); + QCOMPARE(statusSpy.count(), 0); + + playlist.next(); + QCOMPARE(playlist.currentIndex(), 1); + QCOMPARE(player.media(), QMediaContent()); + QCOMPARE(mediaSpy.count(), 0); + QCOMPARE(statusSpy.count(), 0); + } +} + +void tst_QMediaPlayer::testValid() +{ + /* + QFETCH_GLOBAL(bool, valid); + + mockService->setIsValid(valid); + QCOMPARE(player->isValid(), valid); + */ +} + +void tst_QMediaPlayer::testMedia() +{ + QFETCH_GLOBAL(QMediaContent, mediaContent); + + mockService->setMedia(mediaContent); + QCOMPARE(player->media(), mediaContent); + + QBuffer stream; + player->setMedia(mediaContent, &stream); + QCOMPARE(player->media(), mediaContent); + QCOMPARE((QBuffer*)player->mediaStream(), &stream); +} + +void tst_QMediaPlayer::testDuration() +{ + QFETCH_GLOBAL(qint64, duration); + + mockService->setDuration(duration); + QVERIFY(player->duration() == duration); +} + +void tst_QMediaPlayer::testPosition() +{ + QFETCH_GLOBAL(bool, valid); + QFETCH_GLOBAL(bool, seekable); + QFETCH_GLOBAL(qint64, position); + QFETCH_GLOBAL(qint64, duration); + + mockService->setIsValid(valid); + mockService->setSeekable(seekable); + mockService->setPosition(position); + mockService->setDuration(duration); + QVERIFY(player->isSeekable() == seekable); + QVERIFY(player->position() == position); + QVERIFY(player->duration() == duration); + + if (seekable) { + { QSignalSpy spy(player, SIGNAL(positionChanged(qint64))); + player->setPosition(position); + QCOMPARE(player->position(), position); + QCOMPARE(spy.count(), 0); } + + mockService->setPosition(position); + { QSignalSpy spy(player, SIGNAL(positionChanged(qint64))); + player->setPosition(0); + QCOMPARE(player->position(), qint64(0)); + QCOMPARE(spy.count(), position == 0 ? 0 : 1); } + + mockService->setPosition(position); + { QSignalSpy spy(player, SIGNAL(positionChanged(qint64))); + player->setPosition(duration); + QCOMPARE(player->position(), duration); + QCOMPARE(spy.count(), position == duration ? 0 : 1); } + + mockService->setPosition(position); + { QSignalSpy spy(player, SIGNAL(positionChanged(qint64))); + player->setPosition(-1); + QCOMPARE(player->position(), qint64(0)); + QCOMPARE(spy.count(), position == 0 ? 0 : 1); } + + mockService->setPosition(position); + { QSignalSpy spy(player, SIGNAL(positionChanged(qint64))); + player->setPosition(duration + 1); + QCOMPARE(player->position(), duration); + QCOMPARE(spy.count(), position == duration ? 0 : 1); } + } + else { + QSignalSpy spy(player, SIGNAL(positionChanged(qint64))); + player->setPosition(position); + + QCOMPARE(player->position(), position); + QCOMPARE(spy.count(), 0); + } +} + +void tst_QMediaPlayer::testVolume() +{ + QFETCH_GLOBAL(bool, valid); + QFETCH_GLOBAL(int, volume); + + mockService->setVolume(volume); + QVERIFY(player->volume() == volume); + + if (valid) { + { QSignalSpy spy(player, SIGNAL(volumeChanged(int))); + player->setVolume(10); + QCOMPARE(player->volume(), 10); + QCOMPARE(spy.count(), 1); } + + { QSignalSpy spy(player, SIGNAL(volumeChanged(int))); + player->setVolume(-1000); + QCOMPARE(player->volume(), 0); + QCOMPARE(spy.count(), 1); } + + { QSignalSpy spy(player, SIGNAL(volumeChanged(int))); + player->setVolume(100); + QCOMPARE(player->volume(), 100); + QCOMPARE(spy.count(), 1); } + + { QSignalSpy spy(player, SIGNAL(volumeChanged(int))); + player->setVolume(1000); + QCOMPARE(player->volume(), 100); + QCOMPARE(spy.count(), 0); } + } +} + +void tst_QMediaPlayer::testMuted() +{ + QFETCH_GLOBAL(bool, valid); + QFETCH_GLOBAL(bool, muted); + QFETCH_GLOBAL(int, volume); + + if (valid) { + mockService->setMuted(muted); + mockService->setVolume(volume); + QVERIFY(player->isMuted() == muted); + + QSignalSpy spy(player, SIGNAL(mutedChanged(bool))); + player->setMuted(!muted); + QCOMPARE(player->isMuted(), !muted); + QCOMPARE(player->volume(), volume); + QCOMPARE(spy.count(), 1); + } +} + +void tst_QMediaPlayer::testVideoAvailable() +{ + QFETCH_GLOBAL(bool, videoAvailable); + + mockService->setVideoAvailable(videoAvailable); + QVERIFY(player->isVideoAvailable() == videoAvailable); +} + +void tst_QMediaPlayer::testBufferStatus() +{ + QFETCH_GLOBAL(int, bufferStatus); + + mockService->setBufferStatus(bufferStatus); + QVERIFY(player->bufferStatus() == bufferStatus); +} + +void tst_QMediaPlayer::testSeekable() +{ + QFETCH_GLOBAL(bool, seekable); + + mockService->setSeekable(seekable); + QVERIFY(player->isSeekable() == seekable); +} + +void tst_QMediaPlayer::testPlaybackRate() +{ + QFETCH_GLOBAL(bool, valid); + QFETCH_GLOBAL(qreal, playbackRate); + + if (valid) { + mockService->setPlaybackRate(playbackRate); + QVERIFY(player->playbackRate() == playbackRate); + + QSignalSpy spy(player, SIGNAL(playbackRateChanged(qreal))); + player->setPlaybackRate(playbackRate + 0.5f); + QCOMPARE(player->playbackRate(), playbackRate + 0.5f); + QCOMPARE(spy.count(), 1); + } +} + +void tst_QMediaPlayer::testError() +{ + QFETCH_GLOBAL(QMediaPlayer::Error, error); + + mockService->setError(error); + QVERIFY(player->error() == error); +} + +void tst_QMediaPlayer::testErrorString() +{ + QFETCH_GLOBAL(QString, errorString); + + mockService->setErrorString(errorString); + QVERIFY(player->errorString() == errorString); +} + +void tst_QMediaPlayer::testService() +{ + /* + QFETCH_GLOBAL(bool, valid); + + mockService->setIsValid(valid); + + if (valid) + QVERIFY(player->service() != 0); + else + QVERIFY(player->service() == 0); + */ +} + +void tst_QMediaPlayer::testPlay() +{ + QFETCH_GLOBAL(bool, valid); + QFETCH_GLOBAL(QMediaContent, mediaContent); + QFETCH_GLOBAL(QMediaPlayer::State, state); + + mockService->setIsValid(valid); + mockService->setState(state); + mockService->setMedia(mediaContent); + QVERIFY(player->state() == state); + QVERIFY(player->media() == mediaContent); + + QSignalSpy spy(player, SIGNAL(stateChanged(QMediaPlayer::State))); + + player->play(); + + if (!valid || mediaContent.isNull()) { + QCOMPARE(player->state(), QMediaPlayer::StoppedState); + QCOMPARE(spy.count(), 0); + } + else { + QCOMPARE(player->state(), QMediaPlayer::PlayingState); + QCOMPARE(spy.count(), state == QMediaPlayer::PlayingState ? 0 : 1); + } +} + +void tst_QMediaPlayer::testPause() +{ + QFETCH_GLOBAL(bool, valid); + QFETCH_GLOBAL(QMediaContent, mediaContent); + QFETCH_GLOBAL(QMediaPlayer::State, state); + + mockService->setIsValid(valid); + mockService->setState(state); + mockService->setMedia(mediaContent); + QVERIFY(player->state() == state); + QVERIFY(player->media() == mediaContent); + + QSignalSpy spy(player, SIGNAL(stateChanged(QMediaPlayer::State))); + + player->pause(); + + if (!valid || mediaContent.isNull()) { + QCOMPARE(player->state(), QMediaPlayer::StoppedState); + QCOMPARE(spy.count(), 0); + } + else { + QCOMPARE(player->state(), QMediaPlayer::PausedState); + QCOMPARE(spy.count(), state == QMediaPlayer::PausedState ? 0 : 1); + } +} + +void tst_QMediaPlayer::testStop() +{ + QFETCH_GLOBAL(QMediaContent, mediaContent); + QFETCH_GLOBAL(QMediaPlayer::State, state); + + mockService->setState(state); + mockService->setMedia(mediaContent); + QVERIFY(player->state() == state); + QVERIFY(player->media() == mediaContent); + + QSignalSpy spy(player, SIGNAL(stateChanged(QMediaPlayer::State))); + + player->stop(); + + if (mediaContent.isNull() || state == QMediaPlayer::StoppedState) { + QCOMPARE(player->state(), QMediaPlayer::StoppedState); + QCOMPARE(spy.count(), 0); + } + else { + QCOMPARE(player->state(), QMediaPlayer::StoppedState); + QCOMPARE(spy.count(), 1); + } +} + +void tst_QMediaPlayer::testMediaStatus() +{ + QFETCH_GLOBAL(int, bufferStatus); + int bufferSignals = 0; + + player->setNotifyInterval(10); + + mockService->setMediaStatus(QMediaPlayer::NoMedia); + mockService->setBufferStatus(bufferStatus); + + AutoConnection connection( + player, SIGNAL(bufferStatusChanged(int)), + &QTestEventLoop::instance(), SLOT(exitLoop())); + + QSignalSpy statusSpy(player, SIGNAL(mediaStatusChanged(QMediaPlayer::MediaStatus))); + QSignalSpy bufferSpy(player, SIGNAL(bufferStatusChanged(int))); + + QCOMPARE(player->mediaStatus(), QMediaPlayer::NoMedia); + + mockService->setMediaStatus(QMediaPlayer::LoadingMedia); + QCOMPARE(player->mediaStatus(), QMediaPlayer::LoadingMedia); + QCOMPARE(statusSpy.count(), 1); + + QCOMPARE(qvariant_cast<QMediaPlayer::MediaStatus>(statusSpy.last().value(0)), + QMediaPlayer::LoadingMedia); + + mockService->setMediaStatus(QMediaPlayer::LoadedMedia); + QCOMPARE(player->mediaStatus(), QMediaPlayer::LoadedMedia); + QCOMPARE(statusSpy.count(), 2); + + QCOMPARE(qvariant_cast<QMediaPlayer::MediaStatus>(statusSpy.last().value(0)), + QMediaPlayer::LoadedMedia); + + // Verify the bufferStatusChanged() signal isn't being emitted. + QTestEventLoop::instance().enterLoop(1); + QCOMPARE(bufferSpy.count(), 0); + + mockService->setMediaStatus(QMediaPlayer::StalledMedia); + QCOMPARE(player->mediaStatus(), QMediaPlayer::StalledMedia); + QCOMPARE(statusSpy.count(), 3); + + QCOMPARE(qvariant_cast<QMediaPlayer::MediaStatus>(statusSpy.last().value(0)), + QMediaPlayer::StalledMedia); + + // Verify the bufferStatusChanged() signal is being emitted. + QTestEventLoop::instance().enterLoop(1); + QVERIFY(bufferSpy.count() > bufferSignals); + QCOMPARE(bufferSpy.last().value(0).toInt(), bufferStatus); + bufferSignals = bufferSpy.count(); + + mockService->setMediaStatus(QMediaPlayer::BufferingMedia); + QCOMPARE(player->mediaStatus(), QMediaPlayer::BufferingMedia); + QCOMPARE(statusSpy.count(), 4); + + QCOMPARE(qvariant_cast<QMediaPlayer::MediaStatus>(statusSpy.last().value(0)), + QMediaPlayer::BufferingMedia); + + // Verify the bufferStatusChanged() signal is being emitted. + QTestEventLoop::instance().enterLoop(1); + QVERIFY(bufferSpy.count() > bufferSignals); + QCOMPARE(bufferSpy.last().value(0).toInt(), bufferStatus); + bufferSignals = bufferSpy.count(); + + mockService->setMediaStatus(QMediaPlayer::BufferedMedia); + QCOMPARE(player->mediaStatus(), QMediaPlayer::BufferedMedia); + QCOMPARE(statusSpy.count(), 5); + + QCOMPARE(qvariant_cast<QMediaPlayer::MediaStatus>(statusSpy.last().value(0)), + QMediaPlayer::BufferedMedia); + + // Verify the bufferStatusChanged() signal isn't being emitted. + QTestEventLoop::instance().enterLoop(1); + QCOMPARE(bufferSpy.count(), bufferSignals); + + mockService->setMediaStatus(QMediaPlayer::EndOfMedia); + QCOMPARE(player->mediaStatus(), QMediaPlayer::EndOfMedia); + QCOMPARE(statusSpy.count(), 6); + + QCOMPARE(qvariant_cast<QMediaPlayer::MediaStatus>(statusSpy.last().value(0)), + QMediaPlayer::EndOfMedia); +} + +void tst_QMediaPlayer::testPlaylist() +{ + QMediaContent content0(QUrl(QLatin1String("test://audio/song1.mp3"))); + QMediaContent content1(QUrl(QLatin1String("test://audio/song2.mp3"))); + QMediaContent content2(QUrl(QLatin1String("test://video/movie1.mp4"))); + QMediaContent content3(QUrl(QLatin1String("test://video/movie2.mp4"))); + QMediaContent content4(QUrl(QLatin1String("test://image/photo.jpg"))); + + mockService->setIsValid(true); + mockService->setState(QMediaPlayer::StoppedState, QMediaPlayer::NoMedia); + + QMediaPlaylist *playlist = new QMediaPlaylist; + playlist->setMediaObject(player); + + QSignalSpy stateSpy(player, SIGNAL(stateChanged(QMediaPlayer::State))); + QSignalSpy mediaSpy(player, SIGNAL(mediaChanged(QMediaContent))); + + // Test the player does nothing with an empty playlist attached. + player->play(); + QCOMPARE(player->state(), QMediaPlayer::StoppedState); + QCOMPARE(player->media(), QMediaContent()); + QCOMPARE(stateSpy.count(), 0); + QCOMPARE(mediaSpy.count(), 0); + + playlist->addMedia(content0); + playlist->addMedia(content1); + playlist->addMedia(content2); + playlist->addMedia(content3); + + // Test changing the playlist position, changes the current media, but not the playing state. + playlist->setCurrentIndex(1); + QCOMPARE(player->media(), content1); + QCOMPARE(player->state(), QMediaPlayer::StoppedState); + QCOMPARE(stateSpy.count(), 0); + QCOMPARE(mediaSpy.count(), 1); + + // Test playing starts with the current media. + player->play(); + QCOMPARE(player->media(), content1); + QCOMPARE(player->state(), QMediaPlayer::PlayingState); + QCOMPARE(stateSpy.count(), 1); + QCOMPARE(mediaSpy.count(), 1); + + // Test pausing doesn't change the current media. + player->pause(); + QCOMPARE(player->media(), content1); + QCOMPARE(player->state(), QMediaPlayer::PausedState); + QCOMPARE(stateSpy.count(), 2); + QCOMPARE(mediaSpy.count(), 1); + + // Test stopping doesn't change the current media. + player->stop(); + QCOMPARE(player->media(), content1); + QCOMPARE(player->state(), QMediaPlayer::StoppedState); + QCOMPARE(stateSpy.count(), 3); + QCOMPARE(mediaSpy.count(), 1); + + // Test when the player service reaches the end of the current media, the player moves onto + // the next item without stopping. + player->play(); + QCOMPARE(player->media(), content1); + QCOMPARE(player->state(), QMediaPlayer::PlayingState); + QCOMPARE(stateSpy.count(), 4); + QCOMPARE(mediaSpy.count(), 1); + + mockService->setState(QMediaPlayer::StoppedState, QMediaPlayer::EndOfMedia); + QCOMPARE(player->media(), content2); + QCOMPARE(player->state(), QMediaPlayer::PlayingState); + QCOMPARE(stateSpy.count(), 4); + QCOMPARE(mediaSpy.count(), 2); + + // Test skipping the current media doesn't change the state. + playlist->next(); + QCOMPARE(player->media(), content3); + QCOMPARE(player->state(), QMediaPlayer::PlayingState); + QCOMPARE(stateSpy.count(), 4); + QCOMPARE(mediaSpy.count(), 3); + + // Test changing the current media while paused doesn't change the state. + player->pause(); + mockService->setMediaStatus(QMediaPlayer::BufferedMedia); + QCOMPARE(player->media(), content3); + QCOMPARE(player->state(), QMediaPlayer::PausedState); + QCOMPARE(stateSpy.count(), 5); + QCOMPARE(mediaSpy.count(), 3); + + playlist->previous(); + QCOMPARE(player->media(), content2); + QCOMPARE(player->state(), QMediaPlayer::PausedState); + QCOMPARE(stateSpy.count(), 5); + QCOMPARE(mediaSpy.count(), 4); + + // Test changing the current media while stopped doesn't change the state. + player->stop(); + mockService->setMediaStatus(QMediaPlayer::LoadedMedia); + QCOMPARE(player->media(), content2); + QCOMPARE(player->state(), QMediaPlayer::StoppedState); + QCOMPARE(stateSpy.count(), 6); + QCOMPARE(mediaSpy.count(), 4); + + playlist->next(); + QCOMPARE(player->media(), content3); + QCOMPARE(player->state(), QMediaPlayer::StoppedState); + QCOMPARE(stateSpy.count(), 6); + QCOMPARE(mediaSpy.count(), 5); + + // Test the player is stopped and the current media cleared when it reaches the end of the last + // item in the playlist. + player->play(); + QCOMPARE(player->media(), content3); + QCOMPARE(player->state(), QMediaPlayer::PlayingState); + QCOMPARE(stateSpy.count(), 7); + QCOMPARE(mediaSpy.count(), 5); + + // Double up the signals to ensure some noise doesn't destabalize things. + mockService->setState(QMediaPlayer::StoppedState, QMediaPlayer::EndOfMedia); + mockService->setState(QMediaPlayer::StoppedState, QMediaPlayer::EndOfMedia); + QCOMPARE(player->media(), QMediaContent()); + QCOMPARE(player->state(), QMediaPlayer::StoppedState); + QCOMPARE(stateSpy.count(), 8); + QCOMPARE(mediaSpy.count(), 6); + + // Test starts playing from the start of the playlist if there is no current media selected. + player->play(); + QCOMPARE(player->media(), content0); + QCOMPARE(player->state(), QMediaPlayer::PlayingState); + QCOMPARE(stateSpy.count(), 9); + QCOMPARE(mediaSpy.count(), 7); + + // Test deleting the playlist stops the player and clears the media it set. + delete playlist; + QCOMPARE(player->media(), QMediaContent()); + QCOMPARE(player->state(), QMediaPlayer::StoppedState); + QCOMPARE(stateSpy.count(), 10); + QCOMPARE(mediaSpy.count(), 8); + + // Test the player works as normal with the playlist removed. + player->play(); + QCOMPARE(player->media(), QMediaContent()); + QCOMPARE(player->state(), QMediaPlayer::StoppedState); + QCOMPARE(stateSpy.count(), 10); + QCOMPARE(mediaSpy.count(), 8); + + player->setMedia(content1); + player->play(); + + QCOMPARE(player->media(), content1); + QCOMPARE(player->state(), QMediaPlayer::PlayingState); + QCOMPARE(stateSpy.count(), 11); + QCOMPARE(mediaSpy.count(), 9); + + // Test the player can bind to playlist again + playlist = new QMediaPlaylist; + playlist->setMediaObject(player); + QCOMPARE(playlist->mediaObject(), qobject_cast<QMediaObject*>(player)); + + QCOMPARE(player->media(), QMediaContent()); + QCOMPARE(player->state(), QMediaPlayer::StoppedState); + + playlist->addMedia(content0); + playlist->addMedia(content1); + playlist->addMedia(content2); + playlist->addMedia(content3); + + playlist->setCurrentIndex(1); + QCOMPARE(player->media(), content1); + QCOMPARE(player->state(), QMediaPlayer::StoppedState); + + // Test attaching the new playlist, + // player should detach the current one + QMediaPlaylist *playlist2 = new QMediaPlaylist; + playlist2->addMedia(content1); + playlist2->addMedia(content2); + playlist2->addMedia(content3); + playlist2->setCurrentIndex(2); + + player->play(); + playlist2->setMediaObject(player); + QCOMPARE(playlist2->mediaObject(), qobject_cast<QMediaObject*>(player)); + QVERIFY(playlist->mediaObject() == 0); + QCOMPARE(player->media(), playlist2->currentMedia()); + QCOMPARE(player->state(), QMediaPlayer::StoppedState); + + playlist2->setCurrentIndex(1); + QCOMPARE(player->media(), playlist2->currentMedia()); +} + +QTEST_MAIN(tst_QMediaPlayer) + +#include "tst_qmediaplayer.moc" diff --git a/tests/auto/qmediaplaylist/qmediaplaylist.pro b/tests/auto/qmediaplaylist/qmediaplaylist.pro new file mode 100644 index 0000000..b114bda --- /dev/null +++ b/tests/auto/qmediaplaylist/qmediaplaylist.pro @@ -0,0 +1,6 @@ +load(qttest_p4) + +SOURCES = tst_qmediaplaylist.cpp + +QT = core multimedia + diff --git a/tests/auto/qmediaplaylist/tmp.unsupported_format b/tests/auto/qmediaplaylist/tmp.unsupported_format new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/tests/auto/qmediaplaylist/tmp.unsupported_format diff --git a/tests/auto/qmediaplaylist/tst_qmediaplaylist.cpp b/tests/auto/qmediaplaylist/tst_qmediaplaylist.cpp new file mode 100644 index 0000000..383a407 --- /dev/null +++ b/tests/auto/qmediaplaylist/tst_qmediaplaylist.cpp @@ -0,0 +1,593 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (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 Technology Preview License Agreement accompanying +** this package. +** +** 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.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <QtTest/QtTest> +#include <QDebug> +#include <QtMultimedia/qmediaservice.h> +#include <QtMultimedia/qmediaplaylist.h> +#include <QtMultimedia/qmediaplaylistcontrol.h> +#include <QtMultimedia/qmediaplaylistnavigator.h> +#include <QtMultimedia/private/qmediapluginloader_p.h> + + +class MockReadOnlyPlaylistProvider : public QMediaPlaylistProvider +{ + Q_OBJECT +public: + MockReadOnlyPlaylistProvider(QObject *parent) + :QMediaPlaylistProvider(parent) + { + m_items.append(QMediaContent(QUrl(QLatin1String("file:///1")))); + m_items.append(QMediaContent(QUrl(QLatin1String("file:///2")))); + m_items.append(QMediaContent(QUrl(QLatin1String("file:///3")))); + } + + int mediaCount() const { return m_items.size(); } + QMediaContent media(int index) const + { + return index >=0 && index < mediaCount() ? m_items.at(index) : QMediaContent(); + } + +private: + QList<QMediaContent> m_items; +}; + +class MockPlaylistControl : public QMediaPlaylistControl +{ + Q_OBJECT +public: + MockPlaylistControl(QObject *parent) : QMediaPlaylistControl(parent) + { + m_navigator = new QMediaPlaylistNavigator(new MockReadOnlyPlaylistProvider(this), this); + } + + ~MockPlaylistControl() + { + } + + QMediaPlaylistProvider* playlistProvider() const { return m_navigator->playlist(); } + bool setPlaylistProvider(QMediaPlaylistProvider *playlist) { m_navigator->setPlaylist(playlist); return true; } + + int currentIndex() const { return m_navigator->currentIndex(); } + void setCurrentIndex(int position) { m_navigator->jump(position); } + int nextIndex(int steps) const { return m_navigator->nextIndex(steps); } + int previousIndex(int steps) const { return m_navigator->previousIndex(steps); } + + void next() { m_navigator->next(); } + void previous() { m_navigator->previous(); } + + QMediaPlaylist::PlaybackMode playbackMode() const { return m_navigator->playbackMode(); } + void setPlaybackMode(QMediaPlaylist::PlaybackMode mode) { m_navigator->setPlaybackMode(mode); } + +private: + QMediaPlaylistNavigator *m_navigator; +}; + +class MockPlaylistService : public QMediaService +{ + Q_OBJECT + +public: + MockPlaylistService():QMediaService(0) + { + mockControl = new MockPlaylistControl(this); + } + + ~MockPlaylistService() + { + } + + QMediaControl* control(const char *iid) const + { + if (qstrcmp(iid, QMediaPlaylistControl_iid) == 0) + return mockControl; + return 0; + } + + MockPlaylistControl *mockControl; +}; + +class MockReadOnlyPlaylistObject : public QMediaObject +{ + Q_OBJECT +public: + MockReadOnlyPlaylistObject(QObject *parent = 0) + :QMediaObject(parent, new MockPlaylistService) + { + } +}; + + +class tst_QMediaPlaylist : public QObject +{ + Q_OBJECT +public slots: + void init(); + void cleanup(); + void initTestCase(); + +private slots: + void construction(); + void append(); + void insert(); + void clear(); + void removeMedia(); + void currentItem(); + void saveAndLoad(); + void playbackMode(); + void playbackMode_data(); + void shuffle(); + void readOnlyPlaylist(); + void setMediaObject(); + +private: + QMediaContent content1; + QMediaContent content2; + QMediaContent content3; +}; + +void tst_QMediaPlaylist::init() +{ +} + +void tst_QMediaPlaylist::initTestCase() +{ + content1 = QMediaContent(QUrl(QLatin1String("file:///1"))); + content2 = QMediaContent(QUrl(QLatin1String("file:///2"))); + content3 = QMediaContent(QUrl(QLatin1String("file:///3"))); +} + +void tst_QMediaPlaylist::cleanup() +{ +} + +void tst_QMediaPlaylist::construction() +{ + QMediaPlaylist playlist; + QCOMPARE(playlist.mediaCount(), 0); + QVERIFY(playlist.isEmpty()); +} + +void tst_QMediaPlaylist::append() +{ + QMediaPlaylist playlist; + QVERIFY(!playlist.isReadOnly()); + + playlist.addMedia(content1); + QCOMPARE(playlist.mediaCount(), 1); + QCOMPARE(playlist.media(0), content1); + + QSignalSpy aboutToBeInsertedSignalSpy(&playlist, SIGNAL(mediaAboutToBeInserted(int,int))); + QSignalSpy insertedSignalSpy(&playlist, SIGNAL(mediaInserted(int,int))); + playlist.addMedia(content2); + QCOMPARE(playlist.mediaCount(), 2); + QCOMPARE(playlist.media(1), content2); + + QCOMPARE(aboutToBeInsertedSignalSpy.count(), 1); + QCOMPARE(aboutToBeInsertedSignalSpy.first()[0].toInt(), 1); + QCOMPARE(aboutToBeInsertedSignalSpy.first()[1].toInt(), 1); + + QCOMPARE(insertedSignalSpy.count(), 1); + QCOMPARE(insertedSignalSpy.first()[0].toInt(), 1); + QCOMPARE(insertedSignalSpy.first()[1].toInt(), 1); + + aboutToBeInsertedSignalSpy.clear(); + insertedSignalSpy.clear(); + + QMediaContent content4(QUrl(QLatin1String("file:///4"))); + QMediaContent content5(QUrl(QLatin1String("file:///5"))); + playlist.addMedia(QList<QMediaContent>() << content3 << content4 << content5); + QCOMPARE(playlist.mediaCount(), 5); + QCOMPARE(playlist.media(2), content3); + QCOMPARE(playlist.media(3), content4); + QCOMPARE(playlist.media(4), content5); + + QCOMPARE(aboutToBeInsertedSignalSpy.count(), 1); + QCOMPARE(aboutToBeInsertedSignalSpy[0][0].toInt(), 2); + QCOMPARE(aboutToBeInsertedSignalSpy[0][1].toInt(), 4); + + QCOMPARE(insertedSignalSpy.count(), 1); + QCOMPARE(insertedSignalSpy[0][0].toInt(), 2); + QCOMPARE(insertedSignalSpy[0][1].toInt(), 4); + + aboutToBeInsertedSignalSpy.clear(); + insertedSignalSpy.clear(); + + playlist.addMedia(QList<QMediaContent>()); + QCOMPARE(aboutToBeInsertedSignalSpy.count(), 0); + QCOMPARE(insertedSignalSpy.count(), 0); +} + +void tst_QMediaPlaylist::insert() +{ + QMediaPlaylist playlist; + QVERIFY(!playlist.isReadOnly()); + + playlist.addMedia(content1); + QCOMPARE(playlist.mediaCount(), 1); + QCOMPARE(playlist.media(0), content1); + + playlist.addMedia(content2); + QCOMPARE(playlist.mediaCount(), 2); + QCOMPARE(playlist.media(1), content2); + + QSignalSpy aboutToBeInsertedSignalSpy(&playlist, SIGNAL(mediaAboutToBeInserted(int,int))); + QSignalSpy insertedSignalSpy(&playlist, SIGNAL(mediaInserted(int,int))); + + playlist.insertMedia(1, content3); + QCOMPARE(playlist.mediaCount(), 3); + QCOMPARE(playlist.media(0), content1); + QCOMPARE(playlist.media(1), content3); + QCOMPARE(playlist.media(2), content2); + + QCOMPARE(aboutToBeInsertedSignalSpy.count(), 1); + QCOMPARE(aboutToBeInsertedSignalSpy.first()[0].toInt(), 1); + QCOMPARE(aboutToBeInsertedSignalSpy.first()[1].toInt(), 1); + + QCOMPARE(insertedSignalSpy.count(), 1); + QCOMPARE(insertedSignalSpy.first()[0].toInt(), 1); + QCOMPARE(insertedSignalSpy.first()[1].toInt(), 1); + + aboutToBeInsertedSignalSpy.clear(); + insertedSignalSpy.clear(); + + QMediaContent content4(QUrl(QLatin1String("file:///4"))); + QMediaContent content5(QUrl(QLatin1String("file:///5"))); + playlist.insertMedia(1, QList<QMediaContent>() << content4 << content5); + + QCOMPARE(playlist.media(0), content1); + QCOMPARE(playlist.media(1), content4); + QCOMPARE(playlist.media(2), content5); + QCOMPARE(playlist.media(3), content3); + QCOMPARE(playlist.media(4), content2); + QCOMPARE(aboutToBeInsertedSignalSpy.count(), 1); + QCOMPARE(aboutToBeInsertedSignalSpy[0][0].toInt(), 1); + QCOMPARE(aboutToBeInsertedSignalSpy[0][1].toInt(), 2); + + QCOMPARE(insertedSignalSpy.count(), 1); + QCOMPARE(insertedSignalSpy[0][0].toInt(), 1); + QCOMPARE(insertedSignalSpy[0][1].toInt(), 2); + + aboutToBeInsertedSignalSpy.clear(); + insertedSignalSpy.clear(); + + playlist.insertMedia(1, QList<QMediaContent>()); + QCOMPARE(aboutToBeInsertedSignalSpy.count(), 0); + QCOMPARE(insertedSignalSpy.count(), 0); +} + + +void tst_QMediaPlaylist::currentItem() +{ + QMediaPlaylist playlist; + playlist.addMedia(content1); + playlist.addMedia(content2); + + QCOMPARE(playlist.currentIndex(), -1); + QCOMPARE(playlist.currentMedia(), QMediaContent()); + + QCOMPARE(playlist.nextIndex(), 0); + QCOMPARE(playlist.nextIndex(2), 1); + QCOMPARE(playlist.previousIndex(), 1); + QCOMPARE(playlist.previousIndex(2), 0); + + playlist.setCurrentIndex(0); + QCOMPARE(playlist.currentIndex(), 0); + QCOMPARE(playlist.currentMedia(), content1); + + QCOMPARE(playlist.nextIndex(), 1); + QCOMPARE(playlist.nextIndex(2), -1); + QCOMPARE(playlist.previousIndex(), -1); + QCOMPARE(playlist.previousIndex(2), -1); + + playlist.setCurrentIndex(1); + QCOMPARE(playlist.currentIndex(), 1); + QCOMPARE(playlist.currentMedia(), content2); + + QCOMPARE(playlist.nextIndex(), -1); + QCOMPARE(playlist.nextIndex(2), -1); + QCOMPARE(playlist.previousIndex(), 0); + QCOMPARE(playlist.previousIndex(2), -1); + + QTest::ignoreMessage(QtWarningMsg, "QMediaPlaylistNavigator: Jump outside playlist range "); + playlist.setCurrentIndex(2); + + QCOMPARE(playlist.currentIndex(), -1); + QCOMPARE(playlist.currentMedia(), QMediaContent()); +} + +void tst_QMediaPlaylist::clear() +{ + QMediaPlaylist playlist; + playlist.addMedia(content1); + playlist.addMedia(content2); + + playlist.clear(); + QVERIFY(playlist.isEmpty()); + QCOMPARE(playlist.mediaCount(), 0); +} + +void tst_QMediaPlaylist::removeMedia() +{ + QMediaPlaylist playlist; + playlist.addMedia(content1); + playlist.addMedia(content2); + playlist.addMedia(content3); + + QSignalSpy aboutToBeRemovedSignalSpy(&playlist, SIGNAL(mediaAboutToBeRemoved(int,int))); + QSignalSpy removedSignalSpy(&playlist, SIGNAL(mediaRemoved(int,int))); + playlist.removeMedia(1); + QCOMPARE(playlist.mediaCount(), 2); + QCOMPARE(playlist.media(1), content3); + + QCOMPARE(aboutToBeRemovedSignalSpy.count(), 1); + QCOMPARE(aboutToBeRemovedSignalSpy.first()[0].toInt(), 1); + QCOMPARE(aboutToBeRemovedSignalSpy.first()[1].toInt(), 1); + + QCOMPARE(removedSignalSpy.count(), 1); + QCOMPARE(removedSignalSpy.first()[0].toInt(), 1); + QCOMPARE(removedSignalSpy.first()[1].toInt(), 1); + + aboutToBeRemovedSignalSpy.clear(); + removedSignalSpy.clear(); + + playlist.removeMedia(0,1); + QVERIFY(playlist.isEmpty()); + + QCOMPARE(aboutToBeRemovedSignalSpy.count(), 1); + QCOMPARE(aboutToBeRemovedSignalSpy.first()[0].toInt(), 0); + QCOMPARE(aboutToBeRemovedSignalSpy.first()[1].toInt(), 1); + + QCOMPARE(removedSignalSpy.count(), 1); + QCOMPARE(removedSignalSpy.first()[0].toInt(), 0); + QCOMPARE(removedSignalSpy.first()[1].toInt(), 1); + + + playlist.addMedia(content1); + playlist.addMedia(content2); + playlist.addMedia(content3); + + playlist.removeMedia(0,1); + QCOMPARE(playlist.mediaCount(), 1); + QCOMPARE(playlist.media(0), content3); +} + +void tst_QMediaPlaylist::saveAndLoad() +{ + QMediaPlaylist playlist; + playlist.addMedia(content1); + playlist.addMedia(content2); + playlist.addMedia(content3); + + QCOMPARE(playlist.error(), QMediaPlaylist::NoError); + QVERIFY(playlist.errorString().isEmpty()); + + QBuffer buffer; + buffer.open(QBuffer::ReadWrite); + + bool res = playlist.save(&buffer, "unsupported_format"); + QVERIFY(!res); + QVERIFY(playlist.error() != QMediaPlaylist::NoError); + QVERIFY(!playlist.errorString().isEmpty()); + + QSignalSpy errorSignal(&playlist, SIGNAL(loadFailed())); + playlist.load(&buffer, "unsupported_format"); + QCOMPARE(errorSignal.size(), 1); + QVERIFY(playlist.error() != QMediaPlaylist::NoError); + QVERIFY(!playlist.errorString().isEmpty()); + + res = playlist.save(QUrl(QLatin1String("tmp.unsupported_format")), "unsupported_format"); + QVERIFY(!res); + QVERIFY(playlist.error() != QMediaPlaylist::NoError); + QVERIFY(!playlist.errorString().isEmpty()); + + errorSignal.clear(); + playlist.load(QUrl(QLatin1String("tmp.unsupported_format")), "unsupported_format"); + QCOMPARE(errorSignal.size(), 1); + QVERIFY(playlist.error() != QMediaPlaylist::NoError); + QVERIFY(!playlist.errorString().isEmpty()); +} + +void tst_QMediaPlaylist::playbackMode_data() +{ + QTest::addColumn<QMediaPlaylist::PlaybackMode>("playbackMode"); + QTest::addColumn<int>("expectedPrevious"); + QTest::addColumn<int>("pos"); + QTest::addColumn<int>("expectedNext"); + + QTest::newRow("Linear, 0") << QMediaPlaylist::Linear << -1 << 0 << 1; + QTest::newRow("Linear, 1") << QMediaPlaylist::Linear << 0 << 1 << 2; + QTest::newRow("Linear, 2") << QMediaPlaylist::Linear << 1 << 2 << -1; + + QTest::newRow("Loop, 0") << QMediaPlaylist::Loop << 2 << 0 << 1; + QTest::newRow("Loop, 1") << QMediaPlaylist::Loop << 0 << 1 << 2; + QTest::newRow("Lopp, 2") << QMediaPlaylist::Loop << 1 << 2 << 0; + + QTest::newRow("ItemOnce, 1") << QMediaPlaylist::CurrentItemOnce << -1 << 1 << -1; + QTest::newRow("ItemInLoop, 1") << QMediaPlaylist::CurrentItemInLoop << 1 << 1 << 1; + +} + +void tst_QMediaPlaylist::playbackMode() +{ + QFETCH(QMediaPlaylist::PlaybackMode, playbackMode); + QFETCH(int, expectedPrevious); + QFETCH(int, pos); + QFETCH(int, expectedNext); + + QMediaPlaylist playlist; + playlist.addMedia(content1); + playlist.addMedia(content2); + playlist.addMedia(content3); + + QCOMPARE(playlist.playbackMode(), QMediaPlaylist::Linear); + QCOMPARE(playlist.currentIndex(), -1); + + playlist.setPlaybackMode(playbackMode); + QCOMPARE(playlist.playbackMode(), playbackMode); + + playlist.setCurrentIndex(pos); + QCOMPARE(playlist.currentIndex(), pos); + QCOMPARE(playlist.nextIndex(), expectedNext); + QCOMPARE(playlist.previousIndex(), expectedPrevious); + + playlist.next(); + QCOMPARE(playlist.currentIndex(), expectedNext); + + playlist.setCurrentIndex(pos); + playlist.previous(); + QCOMPARE(playlist.currentIndex(), expectedPrevious); +} + +void tst_QMediaPlaylist::shuffle() +{ + QMediaPlaylist playlist; + QList<QMediaContent> contentList; + + for (int i=0; i<100; i++) { + QMediaContent content(QUrl(QString::number(i))); + contentList.append(content); + playlist.addMedia(content); + } + + playlist.shuffle(); + + QList<QMediaContent> shuffledContentList; + for (int i=0; i<playlist.mediaCount(); i++) + shuffledContentList.append(playlist.media(i)); + + QVERIFY(contentList != shuffledContentList); + +} + +void tst_QMediaPlaylist::readOnlyPlaylist() +{ + MockReadOnlyPlaylistObject mediaObject; + QMediaPlaylist playlist; + playlist.setMediaObject(&mediaObject); + + QVERIFY(playlist.isReadOnly()); + QVERIFY(!playlist.isEmpty()); + QCOMPARE(playlist.mediaCount(), 3); + + QCOMPARE(playlist.media(0), content1); + QCOMPARE(playlist.media(1), content2); + QCOMPARE(playlist.media(2), content3); + QCOMPARE(playlist.media(3), QMediaContent()); + + //it's a read only playlist, so all the modification should fail + QVERIFY(!playlist.addMedia(content1)); + QCOMPARE(playlist.mediaCount(), 3); + QVERIFY(!playlist.addMedia(QList<QMediaContent>() << content1 << content2)); + QCOMPARE(playlist.mediaCount(), 3); + QVERIFY(!playlist.insertMedia(1, content1)); + QCOMPARE(playlist.mediaCount(), 3); + QVERIFY(!playlist.insertMedia(1, QList<QMediaContent>() << content1 << content2)); + QCOMPARE(playlist.mediaCount(), 3); + QVERIFY(!playlist.removeMedia(1)); + QCOMPARE(playlist.mediaCount(), 3); + QVERIFY(!playlist.removeMedia(0,2)); + QCOMPARE(playlist.mediaCount(), 3); + QVERIFY(!playlist.clear()); + QCOMPARE(playlist.mediaCount(), 3); + + //but it is still allowed to append/insert an empty list + QVERIFY(playlist.addMedia(QList<QMediaContent>())); + QVERIFY(playlist.insertMedia(1, QList<QMediaContent>())); + + playlist.shuffle(); + //it's still the same + QCOMPARE(playlist.media(0), content1); + QCOMPARE(playlist.media(1), content2); + QCOMPARE(playlist.media(2), content3); + QCOMPARE(playlist.media(3), QMediaContent()); + + + //load to read only playlist should fail, + //unless underlaying provider supports it + QBuffer buffer; + buffer.open(QBuffer::ReadWrite); + buffer.write(QByteArray("file:///1\nfile:///2")); + buffer.seek(0); + + QSignalSpy errorSignal(&playlist, SIGNAL(loadFailed())); + playlist.load(&buffer, "m3u"); + QCOMPARE(errorSignal.size(), 1); + QCOMPARE(playlist.error(), QMediaPlaylist::AccessDeniedError); + QVERIFY(!playlist.errorString().isEmpty()); + QCOMPARE(playlist.mediaCount(), 3); + + errorSignal.clear(); + playlist.load(QUrl(QLatin1String("tmp.m3u")), "m3u"); + + QCOMPARE(errorSignal.size(), 1); + QCOMPARE(playlist.error(), QMediaPlaylist::AccessDeniedError); + QVERIFY(!playlist.errorString().isEmpty()); + QCOMPARE(playlist.mediaCount(), 3); +} + +void tst_QMediaPlaylist::setMediaObject() +{ + MockReadOnlyPlaylistObject mediaObject; + + QMediaPlaylist playlist; + QVERIFY(playlist.mediaObject() == 0); + QVERIFY(!playlist.isReadOnly()); + + playlist.setMediaObject(&mediaObject); + QCOMPARE(playlist.mediaObject(), qobject_cast<QMediaObject*>(&mediaObject)); + QCOMPARE(playlist.mediaCount(), 3); + QVERIFY(playlist.isReadOnly()); + + playlist.setMediaObject(0); + QVERIFY(playlist.mediaObject() == 0); + QCOMPARE(playlist.mediaCount(), 0); + QVERIFY(!playlist.isReadOnly()); + + playlist.setMediaObject(&mediaObject); + QCOMPARE(playlist.mediaObject(), qobject_cast<QMediaObject*>(&mediaObject)); + QCOMPARE(playlist.mediaCount(), 3); + QVERIFY(playlist.isReadOnly()); +} + +QTEST_MAIN(tst_QMediaPlaylist) +#include "tst_qmediaplaylist.moc" + diff --git a/tests/auto/qmediaplaylistnavigator/qmediaplaylistnavigator.pro b/tests/auto/qmediaplaylistnavigator/qmediaplaylistnavigator.pro new file mode 100644 index 0000000..ea9bc0f --- /dev/null +++ b/tests/auto/qmediaplaylistnavigator/qmediaplaylistnavigator.pro @@ -0,0 +1,6 @@ +load(qttest_p4) + +SOURCES = tst_qmediaplaylistnavigator.cpp + +QT = core multimedia + diff --git a/tests/auto/qmediaplaylistnavigator/tst_qmediaplaylistnavigator.cpp b/tests/auto/qmediaplaylistnavigator/tst_qmediaplaylistnavigator.cpp new file mode 100644 index 0000000..9130db0 --- /dev/null +++ b/tests/auto/qmediaplaylistnavigator/tst_qmediaplaylistnavigator.cpp @@ -0,0 +1,316 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (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 Technology Preview License Agreement accompanying +** this package. +** +** 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.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <QtTest/QtTest> +#include <QDebug> +#include <QtMultimedia/qlocalmediaplaylistprovider.h> +#include <QtMultimedia/qmediaplaylistnavigator.h> + + +class tst_QMediaPlaylistNavigator : public QObject +{ + Q_OBJECT +public slots: + void init(); + void cleanup(); + +private slots: + void construction(); + void setPlaylist(); + void linearPlayback(); + void loopPlayback(); + void currentItemOnce(); + void currentItemInLoop(); + void randomPlayback(); +}; + +void tst_QMediaPlaylistNavigator::init() +{ +} + +void tst_QMediaPlaylistNavigator::cleanup() +{ +} + +void tst_QMediaPlaylistNavigator::construction() +{ + QLocalMediaPlaylistProvider playlist; + QCOMPARE(playlist.mediaCount(), 0); + + QMediaPlaylistNavigator navigator(&playlist); + QVERIFY(navigator.currentItem().isNull()); + QCOMPARE(navigator.currentIndex(), -1); +} + +void tst_QMediaPlaylistNavigator::setPlaylist() +{ + QMediaPlaylistNavigator navigator(0); + QVERIFY(navigator.playlist() != 0); + QCOMPARE(navigator.playlist()->mediaCount(), 0); + QCOMPARE(navigator.playlist()->media(0), QMediaContent()); + QVERIFY(navigator.playlist()->isReadOnly() ); + + QLocalMediaPlaylistProvider playlist; + QCOMPARE(playlist.mediaCount(), 0); + + navigator.setPlaylist(&playlist); + QCOMPARE(navigator.playlist(), (QMediaPlaylistProvider*)&playlist); + QCOMPARE(navigator.playlist()->mediaCount(), 0); + QVERIFY(!navigator.playlist()->isReadOnly() ); +} + +void tst_QMediaPlaylistNavigator::linearPlayback() +{ + QLocalMediaPlaylistProvider playlist; + QMediaPlaylistNavigator navigator(&playlist); + + navigator.setPlaybackMode(QMediaPlaylist::Linear); + QTest::ignoreMessage(QtWarningMsg, "QMediaPlaylistNavigator: Jump outside playlist range "); + navigator.jump(0);//it's ok to have warning here + QVERIFY(navigator.currentItem().isNull()); + QCOMPARE(navigator.currentIndex(), -1); + + QMediaContent content1(QUrl(QLatin1String("file:///1"))); + playlist.addMedia(content1); + navigator.jump(0); + QVERIFY(!navigator.currentItem().isNull()); + + QCOMPARE(navigator.currentIndex(), 0); + QCOMPARE(navigator.currentItem(), content1); + QCOMPARE(navigator.nextItem(), QMediaContent()); + QCOMPARE(navigator.nextItem(2), QMediaContent()); + QCOMPARE(navigator.previousItem(), QMediaContent()); + QCOMPARE(navigator.previousItem(2), QMediaContent()); + + QMediaContent content2(QUrl(QLatin1String("file:///2"))); + playlist.addMedia(content2); + QCOMPARE(navigator.currentIndex(), 0); + QCOMPARE(navigator.currentItem(), content1); + QCOMPARE(navigator.nextItem(), content2); + QCOMPARE(navigator.nextItem(2), QMediaContent()); + QCOMPARE(navigator.previousItem(), QMediaContent()); + QCOMPARE(navigator.previousItem(2), QMediaContent()); + + navigator.jump(1); + QCOMPARE(navigator.currentIndex(), 1); + QCOMPARE(navigator.currentItem(), content2); + QCOMPARE(navigator.nextItem(), QMediaContent()); + QCOMPARE(navigator.nextItem(2), QMediaContent()); + QCOMPARE(navigator.previousItem(), content1); + QCOMPARE(navigator.previousItem(2), QMediaContent()); + + navigator.jump(0); + navigator.next(); + QCOMPARE(navigator.currentIndex(), 1); + navigator.next(); + QCOMPARE(navigator.currentIndex(), -1); + navigator.next();//jump to the first item + QCOMPARE(navigator.currentIndex(), 0); + + navigator.previous(); + QCOMPARE(navigator.currentIndex(), -1); + navigator.previous();//jump to the last item + QCOMPARE(navigator.currentIndex(), 1); +} + +void tst_QMediaPlaylistNavigator::loopPlayback() +{ + QLocalMediaPlaylistProvider playlist; + QMediaPlaylistNavigator navigator(&playlist); + + navigator.setPlaybackMode(QMediaPlaylist::Loop); + QTest::ignoreMessage(QtWarningMsg, "QMediaPlaylistNavigator: Jump outside playlist range "); + navigator.jump(0); + QVERIFY(navigator.currentItem().isNull()); + QCOMPARE(navigator.currentIndex(), -1); + + QMediaContent content1(QUrl(QLatin1String("file:///1"))); + playlist.addMedia(content1); + navigator.jump(0); + QVERIFY(!navigator.currentItem().isNull()); + + QCOMPARE(navigator.currentIndex(), 0); + QCOMPARE(navigator.currentItem(), content1); + QCOMPARE(navigator.nextItem(), content1); + QCOMPARE(navigator.nextItem(2), content1); + QCOMPARE(navigator.previousItem(), content1); + QCOMPARE(navigator.previousItem(2), content1); + + QMediaContent content2(QUrl(QLatin1String("file:///2"))); + playlist.addMedia(content2); + QCOMPARE(navigator.currentIndex(), 0); + QCOMPARE(navigator.currentItem(), content1); + QCOMPARE(navigator.nextItem(), content2); + QCOMPARE(navigator.nextItem(2), content1); //loop over end of the list + QCOMPARE(navigator.previousItem(), content2); + QCOMPARE(navigator.previousItem(2), content1); + + navigator.jump(1); + QCOMPARE(navigator.currentIndex(), 1); + QCOMPARE(navigator.currentItem(), content2); + QCOMPARE(navigator.nextItem(), content1); + QCOMPARE(navigator.nextItem(2), content2); + QCOMPARE(navigator.previousItem(), content1); + QCOMPARE(navigator.previousItem(2), content2); + + navigator.jump(0); + navigator.next(); + QCOMPARE(navigator.currentIndex(), 1); + navigator.next(); + QCOMPARE(navigator.currentIndex(), 0); + navigator.previous(); + QCOMPARE(navigator.currentIndex(), 1); + navigator.previous(); + QCOMPARE(navigator.currentIndex(), 0); +} + +void tst_QMediaPlaylistNavigator::currentItemOnce() +{ + QLocalMediaPlaylistProvider playlist; + QMediaPlaylistNavigator navigator(&playlist); + + navigator.setPlaybackMode(QMediaPlaylist::CurrentItemOnce); + + QCOMPARE(navigator.playbackMode(), QMediaPlaylist::CurrentItemOnce); + QCOMPARE(navigator.currentIndex(), -1); + + playlist.addMedia(QMediaContent(QUrl(QLatin1String("file:///1")))); + playlist.addMedia(QMediaContent(QUrl(QLatin1String("file:///2")))); + playlist.addMedia(QMediaContent(QUrl(QLatin1String("file:///3")))); + + QCOMPARE(navigator.currentIndex(), -1); + navigator.next(); + QCOMPARE(navigator.currentIndex(), -1); + + navigator.jump(1); + QCOMPARE(navigator.currentIndex(), 1); + navigator.next(); + QCOMPARE(navigator.currentIndex(), -1); + navigator.next(); + QCOMPARE(navigator.currentIndex(), -1); + navigator.previous(); + QCOMPARE(navigator.currentIndex(), -1); + navigator.jump(1); + navigator.previous(); + QCOMPARE(navigator.currentIndex(), -1); +} + +void tst_QMediaPlaylistNavigator::currentItemInLoop() +{ + QLocalMediaPlaylistProvider playlist; + QMediaPlaylistNavigator navigator(&playlist); + + navigator.setPlaybackMode(QMediaPlaylist::CurrentItemInLoop); + + QCOMPARE(navigator.playbackMode(), QMediaPlaylist::CurrentItemInLoop); + QCOMPARE(navigator.currentIndex(), -1); + + playlist.addMedia(QMediaContent(QUrl(QLatin1String("file:///1")))); + playlist.addMedia(QMediaContent(QUrl(QLatin1String("file:///2")))); + playlist.addMedia(QMediaContent(QUrl(QLatin1String("file:///3")))); + + QCOMPARE(navigator.currentIndex(), -1); + navigator.next(); + QCOMPARE(navigator.currentIndex(), -1); + navigator.jump(1); + navigator.next(); + QCOMPARE(navigator.currentIndex(), 1); + navigator.next(); + QCOMPARE(navigator.currentIndex(), 1); + navigator.previous(); + QCOMPARE(navigator.currentIndex(), 1); + navigator.previous(); + QCOMPARE(navigator.currentIndex(), 1); +} + +void tst_QMediaPlaylistNavigator::randomPlayback() +{ + QLocalMediaPlaylistProvider playlist; + QMediaPlaylistNavigator navigator(&playlist); + + navigator.setPlaybackMode(QMediaPlaylist::Random); + + QCOMPARE(navigator.playbackMode(), QMediaPlaylist::Random); + QCOMPARE(navigator.currentIndex(), -1); + + playlist.addMedia(QMediaContent(QUrl(QLatin1String("file:///1")))); + playlist.addMedia(QMediaContent(QUrl(QLatin1String("file:///2")))); + playlist.addMedia(QMediaContent(QUrl(QLatin1String("file:///3")))); + + playlist.shuffle(); + + QCOMPARE(navigator.currentIndex(), -1); + navigator.next(); + int pos1 = navigator.currentIndex(); + navigator.next(); + int pos2 = navigator.currentIndex(); + navigator.next(); + int pos3 = navigator.currentIndex(); + + QVERIFY(pos1 != -1); + QVERIFY(pos2 != -1); + QVERIFY(pos3 != -1); + + navigator.previous(); + QCOMPARE(navigator.currentIndex(), pos2); + navigator.next(); + QCOMPARE(navigator.currentIndex(), pos3); + navigator.next(); + int pos4 = navigator.currentIndex(); + navigator.previous(); + QCOMPARE(navigator.currentIndex(), pos3); + navigator.previous(); + QCOMPARE(navigator.currentIndex(), pos2); + navigator.previous(); + QCOMPARE(navigator.currentIndex(), pos1); + navigator.previous(); + int pos0 = navigator.currentIndex(); + QVERIFY(pos0 != -1); + navigator.next(); + navigator.next(); + navigator.next(); + navigator.next(); + QCOMPARE(navigator.currentIndex(), pos4); + +} + +QTEST_MAIN(tst_QMediaPlaylistNavigator) +#include "tst_qmediaplaylistnavigator.moc" diff --git a/tests/auto/qmediapluginloader/qmediapluginloader.pro b/tests/auto/qmediapluginloader/qmediapluginloader.pro new file mode 100644 index 0000000..66950e9 --- /dev/null +++ b/tests/auto/qmediapluginloader/qmediapluginloader.pro @@ -0,0 +1,6 @@ +load(qttest_p4) + +SOURCES = tst_qmediapluginloader.cpp + +QT = core multimedia + diff --git a/tests/auto/qmediapluginloader/tst_qmediapluginloader.cpp b/tests/auto/qmediapluginloader/tst_qmediapluginloader.cpp new file mode 100644 index 0000000..0d35b05 --- /dev/null +++ b/tests/auto/qmediapluginloader/tst_qmediapluginloader.cpp @@ -0,0 +1,121 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (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 Technology Preview License Agreement accompanying +** this package. +** +** 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.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <QtTest/QtTest> +#include <QDebug> + +#include <QtMultimedia/private/qmediapluginloader_p.h> +#include <QtMultimedia/qmediaserviceproviderplugin.h> + + + +class tst_QMediaPluginLoader : public QObject +{ + Q_OBJECT + +public slots: + void initTestCase(); + void cleanupTestCase(); + +private slots: + void testInstance(); + void testInstances(); + void testInvalidKey(); + +private: + QMediaPluginLoader *loader; +}; + +void tst_QMediaPluginLoader::initTestCase() +{ + loader = new QMediaPluginLoader(QMediaServiceProviderFactoryInterface_iid, + QLatin1String("/mediaservice"), + Qt::CaseInsensitive); +} + +void tst_QMediaPluginLoader::cleanupTestCase() +{ + delete loader; +} + +void tst_QMediaPluginLoader::testInstance() +{ + const QStringList keys = loader->keys(); + + if (keys.isEmpty()) // Test is invalidated, skip. + QSKIP("No plug-ins available", SkipAll); + + foreach (const QString &key, keys) + QVERIFY(loader->instance(key) != 0); +} + +void tst_QMediaPluginLoader::testInstances() +{ + const QStringList keys = loader->keys(); + + if (keys.isEmpty()) // Test is invalidated, skip. + QSKIP("No plug-ins available", SkipAll); + + foreach (const QString &key, keys) + QVERIFY(loader->instances(key).size() > 0); +} + +// Last so as to not interfere with the other tests if there is a failure. +void tst_QMediaPluginLoader::testInvalidKey() +{ + const QString key(QLatin1String("invalid-key")); + + // This test assumes there is no 'invalid-key' in the key list, verify that. + if (loader->keys().contains(key)) + QSKIP("a plug-in includes the invalid key", SkipAll); + + QVERIFY(loader->instance(key) == 0); + + // Test looking up the key hasn't inserted it into the list. See QMap::operator[]. + QVERIFY(!loader->keys().contains(key)); + + QVERIFY(loader->instances(key).isEmpty()); + QVERIFY(!loader->keys().contains(key)); +} + +QTEST_MAIN(tst_QMediaPluginLoader) + +#include "tst_qmediapluginloader.moc" diff --git a/tests/auto/qmediaresource/qmediaresource.pro b/tests/auto/qmediaresource/qmediaresource.pro new file mode 100644 index 0000000..c8e3d9c --- /dev/null +++ b/tests/auto/qmediaresource/qmediaresource.pro @@ -0,0 +1,6 @@ +load(qttest_p4) + +SOURCES = tst_qmediaresource.cpp + +QT = core multimedia network + diff --git a/tests/auto/qmediaresource/tst_qmediaresource.cpp b/tests/auto/qmediaresource/tst_qmediaresource.cpp new file mode 100644 index 0000000..546c415 --- /dev/null +++ b/tests/auto/qmediaresource/tst_qmediaresource.cpp @@ -0,0 +1,516 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (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 Technology Preview License Agreement accompanying +** this package. +** +** 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.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <QtTest/QtTest> + +#include <QtMultimedia/qmediaresource.h> + + +class tst_QMediaResource : public QObject +{ + Q_OBJECT +private slots: + void constructNull(); + void construct_data(); + void construct(); + void setResolution(); + void equality(); + void copy(); + void assign(); +}; + +void tst_QMediaResource::constructNull() +{ + QMediaResource resource; + + QCOMPARE(resource.isNull(), true); + QCOMPARE(resource.url(), QUrl()); + QCOMPARE(resource.request(), QNetworkRequest()); + QCOMPARE(resource.mimeType(), QString()); + QCOMPARE(resource.language(), QString()); + QCOMPARE(resource.audioCodec(), QString()); + QCOMPARE(resource.videoCodec(), QString()); + QCOMPARE(resource.dataSize(), qint64(0)); + QCOMPARE(resource.audioBitRate(), 0); + QCOMPARE(resource.sampleRate(), 0); + QCOMPARE(resource.channelCount(), 0); + QCOMPARE(resource.videoBitRate(), 0); + QCOMPARE(resource.resolution(), QSize()); +} + +void tst_QMediaResource::construct_data() +{ + QTest::addColumn<QUrl>("url"); + QTest::addColumn<QNetworkRequest>("request"); + QTest::addColumn<QString>("mimeType"); + QTest::addColumn<QString>("language"); + QTest::addColumn<QString>("audioCodec"); + QTest::addColumn<QString>("videoCodec"); + QTest::addColumn<qint64>("dataSize"); + QTest::addColumn<int>("audioBitRate"); + QTest::addColumn<int>("sampleRate"); + QTest::addColumn<int>("channelCount"); + QTest::addColumn<int>("videoBitRate"); + QTest::addColumn<QSize>("resolution"); + + QTest::newRow("audio content") + << QUrl(QString::fromLatin1("http:://test.com/test.mp3")) + << QNetworkRequest(QUrl(QString::fromLatin1("http:://test.com/test.mp3"))) + << QString::fromLatin1("audio/mpeg") + << QString::fromLatin1("eng") + << QString::fromLatin1("mp3") + << QString() + << qint64(5465433) + << 128000 + << 44100 + << 2 + << 0 + << QSize(); + QTest::newRow("image content") + << QUrl(QString::fromLatin1("http:://test.com/test.jpg")) + << QNetworkRequest(QUrl(QString::fromLatin1("http:://test.com/test.jpg"))) + << QString::fromLatin1("image/jpeg") + << QString() + << QString() + << QString() + << qint64(23600) + << 0 + << 0 + << 0 + << 0 + << QSize(640, 480); + QTest::newRow("video content") + << QUrl(QString::fromLatin1("http:://test.com/test.mp4")) + << QNetworkRequest(QUrl(QString::fromLatin1("http:://test.com/test.mp4"))) + << QString::fromLatin1("video/mp4") + << QString() + << QString::fromLatin1("aac") + << QString::fromLatin1("h264") + << qint64(36245851) + << 96000 + << 44000 + << 5 + << 750000 + << QSize(720, 576); + QTest::newRow("thumbnail") + << QUrl(QString::fromLatin1("file::///thumbs/test.png")) + << QNetworkRequest(QUrl(QString::fromLatin1("file::///thumbs/test.png"))) + << QString::fromLatin1("image/png") + << QString() + << QString() + << QString() + << qint64(2360) + << 0 + << 0 + << 0 + << 0 + << QSize(128, 128); +} + +void tst_QMediaResource::construct() +{ + QFETCH(QUrl, url); + QFETCH(QNetworkRequest, request); + QFETCH(QString, mimeType); + QFETCH(QString, language); + QFETCH(QString, audioCodec); + QFETCH(QString, videoCodec); + QFETCH(qint64, dataSize); + QFETCH(int, audioBitRate); + QFETCH(int, sampleRate); + QFETCH(int, channelCount); + QFETCH(int, videoBitRate); + QFETCH(QSize, resolution); + + { + QMediaResource resource(url); + + QCOMPARE(resource.isNull(), false); + QCOMPARE(resource.url(), url); + QCOMPARE(resource.mimeType(), QString()); + QCOMPARE(resource.language(), QString()); + QCOMPARE(resource.audioCodec(), QString()); + QCOMPARE(resource.videoCodec(), QString()); + QCOMPARE(resource.dataSize(), qint64(0)); + QCOMPARE(resource.audioBitRate(), 0); + QCOMPARE(resource.sampleRate(), 0); + QCOMPARE(resource.channelCount(), 0); + QCOMPARE(resource.videoBitRate(), 0); + QCOMPARE(resource.resolution(), QSize()); + } + { + QMediaResource resource(url, mimeType); + + QCOMPARE(resource.isNull(), false); + QCOMPARE(resource.url(), url); + QCOMPARE(resource.request(), request); + QCOMPARE(resource.mimeType(), mimeType); + QCOMPARE(resource.language(), QString()); + QCOMPARE(resource.audioCodec(), QString()); + QCOMPARE(resource.videoCodec(), QString()); + QCOMPARE(resource.dataSize(), qint64(0)); + QCOMPARE(resource.audioBitRate(), 0); + QCOMPARE(resource.sampleRate(), 0); + QCOMPARE(resource.channelCount(), 0); + QCOMPARE(resource.videoBitRate(), 0); + QCOMPARE(resource.resolution(), QSize()); + + resource.setLanguage(language); + resource.setAudioCodec(audioCodec); + resource.setVideoCodec(videoCodec); + resource.setDataSize(dataSize); + resource.setAudioBitRate(audioBitRate); + resource.setSampleRate(sampleRate); + resource.setChannelCount(channelCount); + resource.setVideoBitRate(videoBitRate); + resource.setResolution(resolution); + + QCOMPARE(resource.language(), language); + QCOMPARE(resource.audioCodec(), audioCodec); + QCOMPARE(resource.videoCodec(), videoCodec); + QCOMPARE(resource.dataSize(), dataSize); + QCOMPARE(resource.audioBitRate(), audioBitRate); + QCOMPARE(resource.sampleRate(), sampleRate); + QCOMPARE(resource.channelCount(), channelCount); + QCOMPARE(resource.videoBitRate(), videoBitRate); + QCOMPARE(resource.resolution(), resolution); + } + { + QMediaResource resource(request, mimeType); + + QCOMPARE(resource.isNull(), false); + QCOMPARE(resource.url(), url); + QCOMPARE(resource.request(), request); + QCOMPARE(resource.mimeType(), mimeType); + QCOMPARE(resource.language(), QString()); + QCOMPARE(resource.audioCodec(), QString()); + QCOMPARE(resource.videoCodec(), QString()); + QCOMPARE(resource.dataSize(), qint64(0)); + QCOMPARE(resource.audioBitRate(), 0); + QCOMPARE(resource.sampleRate(), 0); + QCOMPARE(resource.channelCount(), 0); + QCOMPARE(resource.videoBitRate(), 0); + QCOMPARE(resource.resolution(), QSize()); + + resource.setLanguage(language); + resource.setAudioCodec(audioCodec); + resource.setVideoCodec(videoCodec); + resource.setDataSize(dataSize); + resource.setAudioBitRate(audioBitRate); + resource.setSampleRate(sampleRate); + resource.setChannelCount(channelCount); + resource.setVideoBitRate(videoBitRate); + resource.setResolution(resolution); + + QCOMPARE(resource.language(), language); + QCOMPARE(resource.audioCodec(), audioCodec); + QCOMPARE(resource.videoCodec(), videoCodec); + QCOMPARE(resource.dataSize(), dataSize); + QCOMPARE(resource.audioBitRate(), audioBitRate); + QCOMPARE(resource.sampleRate(), sampleRate); + QCOMPARE(resource.channelCount(), channelCount); + QCOMPARE(resource.videoBitRate(), videoBitRate); + QCOMPARE(resource.resolution(), resolution); + } +} + +void tst_QMediaResource::setResolution() +{ + QMediaResource resource( + QUrl(QString::fromLatin1("file::///thumbs/test.png")), + QString::fromLatin1("image/png")); + + QCOMPARE(resource.resolution(), QSize()); + + resource.setResolution(QSize(120, 80)); + QCOMPARE(resource.resolution(), QSize(120, 80)); + + resource.setResolution(QSize(-1, 23)); + QCOMPARE(resource.resolution(), QSize(-1, 23)); + + resource.setResolution(QSize(-43, 34)); + QCOMPARE(resource.resolution(), QSize(-43, 34)); + + resource.setResolution(QSize(64, -1)); + QCOMPARE(resource.resolution(), QSize(64, -1)); + + resource.setResolution(QSize(64, -83)); + QCOMPARE(resource.resolution(), QSize(64, -83)); + + resource.setResolution(QSize(-12, -83)); + QCOMPARE(resource.resolution(), QSize(-12, -83)); + + resource.setResolution(QSize()); + QCOMPARE(resource.resolution(), QSize(-1, -1)); + + resource.setResolution(120, 80); + QCOMPARE(resource.resolution(), QSize(120, 80)); + + resource.setResolution(-1, 23); + QCOMPARE(resource.resolution(), QSize(-1, 23)); + + resource.setResolution(-43, 34); + QCOMPARE(resource.resolution(), QSize(-43, 34)); + + resource.setResolution(64, -1); + QCOMPARE(resource.resolution(), QSize(64, -1)); + + resource.setResolution(64, -83); + QCOMPARE(resource.resolution(), QSize(64, -83)); + + resource.setResolution(-12, -83); + QCOMPARE(resource.resolution(), QSize(-12, -83)); + + resource.setResolution(-1, -1); + QCOMPARE(resource.resolution(), QSize()); +} + +void tst_QMediaResource::equality() +{ + QMediaResource resource1( + QUrl(QString::fromLatin1("http://test.com/test.mp4")), + QString::fromLatin1("video/mp4")); + QMediaResource resource2( + QUrl(QString::fromLatin1("http://test.com/test.mp4")), + QString::fromLatin1("video/mp4")); + QMediaResource resource3( + QUrl(QString::fromLatin1("file:///thumbs/test.jpg"))); + QMediaResource resource4( + QUrl(QString::fromLatin1("file:///thumbs/test.jpg"))); + QMediaResource resource5( + QUrl(QString::fromLatin1("http://test.com/test.mp3")), + QString::fromLatin1("audio/mpeg")); + + QCOMPARE(resource1 == resource2, true); + QCOMPARE(resource1 != resource2, false); + + QCOMPARE(resource3 == resource4, true); + QCOMPARE(resource3 != resource4, false); + + QCOMPARE(resource1 == resource3, false); + QCOMPARE(resource1 != resource3, true); + + QCOMPARE(resource1 == resource5, false); + QCOMPARE(resource1 != resource5, true); + + resource1.setAudioCodec(QString::fromLatin1("mp3")); + resource2.setAudioCodec(QString::fromLatin1("aac")); + + // Not equal differing audio codecs. + QCOMPARE(resource1 == resource2, false); + QCOMPARE(resource1 != resource2, true); + + resource1.setAudioCodec(QString::fromLatin1("aac")); + + // Equal. + QCOMPARE(resource1 == resource2, true); + QCOMPARE(resource1 != resource2, false); + + resource1.setVideoCodec(QString()); + + // Equal. + QCOMPARE(resource1 == resource2, true); + QCOMPARE(resource1 != resource2, false); + + resource1.setVideoCodec(QString::fromLatin1("h264")); + + // Not equal differing video codecs. + QCOMPARE(resource1 == resource2, false); + QCOMPARE(resource1 != resource2, true); + + resource2.setVideoCodec(QString::fromLatin1("h264")); + + // Equal. + QCOMPARE(resource1 == resource2, true); + QCOMPARE(resource1 != resource2, false); + + resource2.setDataSize(0); + + // Equal. + QCOMPARE(resource1 == resource2, true); + QCOMPARE(resource1 != resource2, false); + + resource1.setDataSize(546423); + + // Not equal differing video codecs. + QCOMPARE(resource1 == resource2, false); + QCOMPARE(resource1 != resource2, true); + + resource2.setDataSize(546423); + + // Equal. + QCOMPARE(resource1 == resource2, true); + QCOMPARE(resource1 != resource2, false); + + resource1.setAudioBitRate(96000); + resource1.setSampleRate(48000); + resource2.setSampleRate(44100); + resource1.setChannelCount(0); + resource1.setVideoBitRate(900000); + resource2.setLanguage(QString::fromLatin1("eng")); + + // Not equal, audio bit rate, sample rate, video bit rate, and + // language. + QCOMPARE(resource1 == resource2, false); + QCOMPARE(resource1 != resource2, true); + + resource2.setAudioBitRate(96000); + resource1.setSampleRate(44100); + + // Not equal, differing video bit rate, and language. + QCOMPARE(resource1 == resource2, false); + QCOMPARE(resource1 != resource2, true); + + resource2.setVideoBitRate(900000); + resource1.setLanguage(QString::fromLatin1("eng")); + + // Equal + QCOMPARE(resource1 == resource2, true); + QCOMPARE(resource1 != resource2, false); + + resource1.setResolution(QSize()); + + // Equal + QCOMPARE(resource1 == resource2, true); + QCOMPARE(resource1 != resource2, false); + + resource2.setResolution(-1, -1); + + // Equal + QCOMPARE(resource1 == resource2, true); + QCOMPARE(resource1 != resource2, false); + + resource1.setResolution(QSize(-640, -480)); + + // Not equal, differing resolution. + QCOMPARE(resource1 == resource2, false); + QCOMPARE(resource1 != resource2, true); + resource1.setResolution(QSize(640, 480)); + resource2.setResolution(QSize(800, 600)); + + // Not equal, differing resolution. + QCOMPARE(resource1 == resource2, false); + QCOMPARE(resource1 != resource2, true); + + resource1.setResolution(800, 600); + + // Equal + QCOMPARE(resource1 == resource2, true); + QCOMPARE(resource1 != resource2, false); +} + +void tst_QMediaResource::copy() +{ + const QUrl url(QString::fromLatin1("http://test.com/test.mp4")); + const QString mimeType(QLatin1String("video/mp4")); + const QString amrCodec(QLatin1String("amr")); + const QString mp3Codec(QLatin1String("mp3")); + const QString aacCodec(QLatin1String("aac")); + const QString h264Codec(QLatin1String("h264")); + + QMediaResource original(url, mimeType); + original.setAudioCodec(amrCodec); + + QMediaResource copy(original); + + QCOMPARE(copy.url(), url); + QCOMPARE(copy.mimeType(), mimeType); + QCOMPARE(copy.audioCodec(), amrCodec); + + QCOMPARE(original == copy, true); + QCOMPARE(original != copy, false); + + original.setAudioCodec(mp3Codec); + + QCOMPARE(copy.audioCodec(), amrCodec); + QCOMPARE(original == copy, false); + QCOMPARE(original != copy, true); + + copy.setAudioCodec(aacCodec); + copy.setVideoCodec(h264Codec); + + QCOMPARE(copy.url(), url); + QCOMPARE(copy.mimeType(), mimeType); + + QCOMPARE(original.audioCodec(), mp3Codec); +} + +void tst_QMediaResource::assign() +{ + const QUrl url(QString::fromLatin1("http://test.com/test.mp4")); + const QString mimeType(QLatin1String("video/mp4")); + const QString amrCodec(QLatin1String("amr")); + const QString mp3Codec(QLatin1String("mp3")); + const QString aacCodec(QLatin1String("aac")); + const QString h264Codec(QLatin1String("h264")); + + QMediaResource copy(QUrl(QString::fromLatin1("file:///thumbs/test.jpg"))); + + QMediaResource original(url, mimeType); + original.setAudioCodec(amrCodec); + + copy = original; + + QCOMPARE(copy.url(), url); + QCOMPARE(copy.mimeType(), mimeType); + QCOMPARE(copy.audioCodec(), amrCodec); + + QCOMPARE(original == copy, true); + QCOMPARE(original != copy, false); + + original.setAudioCodec(mp3Codec); + + QCOMPARE(copy.audioCodec(), amrCodec); + QCOMPARE(original == copy, false); + QCOMPARE(original != copy, true); + + copy.setAudioCodec(aacCodec); + copy.setVideoCodec(h264Codec); + + QCOMPARE(copy.url(), url); + QCOMPARE(copy.mimeType(), mimeType); + + QCOMPARE(original.audioCodec(), mp3Codec); +} + +QTEST_MAIN(tst_QMediaResource) + +#include "tst_qmediaresource.moc" diff --git a/tests/auto/qmediaservice/qmediaservice.pro b/tests/auto/qmediaservice/qmediaservice.pro new file mode 100644 index 0000000..f877665 --- /dev/null +++ b/tests/auto/qmediaservice/qmediaservice.pro @@ -0,0 +1,6 @@ +load(qttest_p4) + +SOURCES = tst_qmediaservice.cpp + +QT = core gui multimedia + diff --git a/tests/auto/qmediaservice/tst_qmediaservice.cpp b/tests/auto/qmediaservice/tst_qmediaservice.cpp new file mode 100644 index 0000000..35f661d --- /dev/null +++ b/tests/auto/qmediaservice/tst_qmediaservice.cpp @@ -0,0 +1,211 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (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 Technology Preview License Agreement accompanying +** this package. +** +** 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.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <QtTest/QtTest> + +#include <QtMultimedia/qvideodevicecontrol.h> +#include <QtMultimedia/qmediacontrol.h> +#include <QtMultimedia/qmediaservice.h> + +#include <QtGui/qapplication.h> +#include <QtGui/qstyle.h> + +class QtTestMediaService; + + +class tst_QMediaService : public QObject +{ + Q_OBJECT +private slots: + void initTestCase(); + + void control_iid(); + void control(); +}; + + +class QtTestMediaControlA : public QMediaControl +{ + Q_OBJECT +}; + + +#define QtTestMediaControlA_iid "com.nokia.QtTestMediaControlA" +Q_MEDIA_DECLARE_CONTROL(QtTestMediaControlA, QtTestMediaControlA_iid) + + +class QtTestMediaControlB : public QMediaControl +{ + Q_OBJECT +}; + +#define QtTestMediaControlB_iid "com.nokia.QtTestMediaControlB" +Q_MEDIA_DECLARE_CONTROL(QtTestMediaControlB, QtTestMediaControlB_iid) + + +class QtTestMediaControlC : public QMediaControl +{ + Q_OBJECT +}; + +#define QtTestMediaControlC_iid "com.nokia.QtTestMediaControlC" +Q_MEDIA_DECLARE_CONTROL(QtTestMediaControlC, QtTestMediaControlA_iid) // Yes A. + +class QtTestMediaControlD : public QMediaControl +{ + Q_OBJECT +}; + +#define QtTestMediaControlD_iid "com.nokia.QtTestMediaControlD" +Q_MEDIA_DECLARE_CONTROL(QtTestMediaControlD, QtTestMediaControlD_iid) + +class QtTestMediaControlE : public QMediaControl +{ + Q_OBJECT +}; + +struct QtTestDevice +{ + QtTestDevice() {} + QtTestDevice(const QString &name, const QString &description, const QIcon &icon) + : name(name), description(description), icon(icon) + { + } + + QString name; + QString description; + QIcon icon; +}; + +class QtTestVideoDeviceControl : public QVideoDeviceControl +{ +public: + QtTestVideoDeviceControl(QObject *parent = 0) + : QVideoDeviceControl(parent) + , m_selectedDevice(-1) + , m_defaultDevice(-1) + { + } + + int deviceCount() const { return devices.count(); } + + QString deviceName(int index) const { return devices.value(index).name; } + QString deviceDescription(int index) const { return devices.value(index).description; } + QIcon deviceIcon(int index) const { return devices.value(index).icon; } + + int defaultDevice() const { return m_defaultDevice; } + void setDefaultDevice(int index) { m_defaultDevice = index; } + + int selectedDevice() const { return m_selectedDevice; } + void setSelectedDevice(int index) + { + emit selectedDeviceChanged(m_selectedDevice = index); + emit selectedDeviceChanged(devices.value(index).name); + } + + QList<QtTestDevice> devices; + +private: + int m_selectedDevice; + int m_defaultDevice; +}; + +class QtTestMediaService : public QMediaService +{ + Q_OBJECT +public: + QtTestMediaService() + : QMediaService(0) + , hasDeviceControls(false) + { + } + + QMediaControl* control(const char *name) const + { + if (strcmp(name, QtTestMediaControlA_iid) == 0) + return const_cast<QtTestMediaControlA *>(&controlA); + else if (strcmp(name, QtTestMediaControlB_iid) == 0) + return const_cast<QtTestMediaControlB *>(&controlB); + else if (strcmp(name, QtTestMediaControlC_iid) == 0) + return const_cast<QtTestMediaControlC *>(&controlC); + else if (hasDeviceControls && strcmp(name, QVideoDeviceControl_iid) == 0) + return const_cast<QtTestVideoDeviceControl *>(&videoDeviceControl); + else + return 0; + } + + using QMediaService::control; + + QtTestMediaControlA controlA; + QtTestMediaControlB controlB; + QtTestMediaControlC controlC; + QtTestVideoDeviceControl videoDeviceControl; + bool hasDeviceControls; +}; + +void tst_QMediaService::initTestCase() +{ +} + +void tst_QMediaService::control_iid() +{ + const char *nullString = 0; + + // Default implementation. + QCOMPARE(qmediacontrol_iid<QtTestMediaControlE *>(), nullString); + + // Partial template. + QVERIFY(qstrcmp(qmediacontrol_iid<QtTestMediaControlA *>(), QtTestMediaControlA_iid) == 0); +} + +void tst_QMediaService::control() +{ + QtTestMediaService service; + + QCOMPARE(service.control<QtTestMediaControlA *>(), &service.controlA); + QCOMPARE(service.control<QtTestMediaControlB *>(), &service.controlB); + QVERIFY(!service.control<QtTestMediaControlC *>()); // Faulty implementation returns A. + QVERIFY(!service.control<QtTestMediaControlD *>()); // No control of that type. +} + +QTEST_MAIN(tst_QMediaService) + +#include "tst_qmediaservice.moc" diff --git a/tests/auto/qmediaserviceprovider/qmediaserviceprovider.pro b/tests/auto/qmediaserviceprovider/qmediaserviceprovider.pro new file mode 100644 index 0000000..9aaa9e5 --- /dev/null +++ b/tests/auto/qmediaserviceprovider/qmediaserviceprovider.pro @@ -0,0 +1,6 @@ +load(qttest_p4) + +SOURCES = tst_qmediaserviceprovider.cpp + +QT = core gui multimedia + diff --git a/tests/auto/qmediaserviceprovider/tst_qmediaserviceprovider.cpp b/tests/auto/qmediaserviceprovider/tst_qmediaserviceprovider.cpp new file mode 100644 index 0000000..9bca189 --- /dev/null +++ b/tests/auto/qmediaserviceprovider/tst_qmediaserviceprovider.cpp @@ -0,0 +1,409 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (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 Technology Preview License Agreement accompanying +** this package. +** +** 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.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <QtTest/QtTest> +#include <QDebug> +#include <QStringList> + +#include <QtMultimedia/qmediaserviceprovider.h> +#include <QtMultimedia/qmediaserviceproviderplugin.h> +#include <QtMultimedia/private/qmediapluginloader_p.h> +#include <QtMultimedia/qmediaobject.h> +#include <QtMultimedia/qmediaservice.h> +#include <QtMultimedia/qmediaplayer.h> + +class MockMediaService : public QMediaService +{ + Q_OBJECT +public: + MockMediaService(const QString& name, QObject *parent = 0) : QMediaService(parent) + { setObjectName(name); } + ~MockMediaService() {} + + QMediaControl* control(const char *) const {return 0;} +}; + +class MockServicePlugin1 : public QMediaServiceProviderPlugin, + public QMediaServiceSupportedFormatsInterface, + public QMediaServiceSupportedDevicesInterface +{ + Q_OBJECT + Q_INTERFACES(QMediaServiceSupportedFormatsInterface) + Q_INTERFACES(QMediaServiceSupportedDevicesInterface) +public: + QStringList keys() const + { + return QStringList() << + QLatin1String(Q_MEDIASERVICE_MEDIAPLAYER); + } + + QMediaService* create(QString const& key) + { + if (keys().contains(key)) + return new MockMediaService("MockServicePlugin1"); + else + return 0; + } + + void release(QMediaService *service) + { + delete service; + } + + QtMultimedia::SupportEstimate hasSupport(const QString &mimeType, const QStringList& codecs) const + { + if (codecs.contains(QLatin1String("mpeg4"))) + return QtMultimedia::NotSupported; + + if (mimeType == "audio/ogg") { + return QtMultimedia::ProbablySupported; + } + + return QtMultimedia::MaybeSupported; + } + + QStringList supportedMimeTypes() const + { + return QStringList("audio/ogg"); + } + + QList<QByteArray> devices(const QByteArray &service) const + { + Q_UNUSED(service); + QList<QByteArray> res; + return res; + } + + QString deviceDescription(const QByteArray &service, const QByteArray &device) + { + if (devices(service).contains(device)) + return QString(device)+" description"; + else + return QString(); + } +}; + +class MockServicePlugin2 : public QMediaServiceProviderPlugin, + public QMediaServiceSupportedFormatsInterface, + public QMediaServiceFeaturesInterface +{ + Q_OBJECT + Q_INTERFACES(QMediaServiceSupportedFormatsInterface) + Q_INTERFACES(QMediaServiceFeaturesInterface) +public: + QStringList keys() const + { + return QStringList() << QLatin1String(Q_MEDIASERVICE_MEDIAPLAYER); + } + + QMediaService* create(QString const& key) + { + if (keys().contains(key)) + return new MockMediaService("MockServicePlugin2"); + else + return 0; + } + + void release(QMediaService *service) + { + delete service; + } + + QtMultimedia::SupportEstimate hasSupport(const QString &mimeType, const QStringList& codecs) const + { + Q_UNUSED(codecs); + + if (mimeType == "audio/wav") + return QtMultimedia::PreferedService; + + return QtMultimedia::NotSupported; + } + + QStringList supportedMimeTypes() const + { + return QStringList("audio/wav"); + } + + QMediaServiceProviderHint::Features supportedFeatures(const QByteArray &service) const + { + if (service == QByteArray(Q_MEDIASERVICE_MEDIAPLAYER)) + return QMediaServiceProviderHint::LowLatencyPlayback; + else + return 0; + } +}; + + +class MockServicePlugin3 : public QMediaServiceProviderPlugin, + public QMediaServiceSupportedDevicesInterface +{ + Q_OBJECT + Q_INTERFACES(QMediaServiceSupportedDevicesInterface) +public: + QStringList keys() const + { + return QStringList() << + QLatin1String(Q_MEDIASERVICE_MEDIAPLAYER); + } + + QMediaService* create(QString const& key) + { + if (keys().contains(key)) + return new MockMediaService("MockServicePlugin3"); + else + return 0; + } + + void release(QMediaService *service) + { + delete service; + } + + QList<QByteArray> devices(const QByteArray &service) const + { + Q_UNUSED(service); + QList<QByteArray> res; + return res; + } + + QString deviceDescription(const QByteArray &service, const QByteArray &device) + { + if (devices(service).contains(device)) + return QString(device)+" description"; + else + return QString(); + } +}; + + + +class MockMediaServiceProvider : public QMediaServiceProvider +{ + QMediaService* requestService(const QByteArray &type, const QMediaServiceProviderHint &) + { + Q_UNUSED(type); + return 0; + } + + void releaseService(QMediaService *service) + { + Q_UNUSED(service); + } +}; + + +class tst_QMediaServiceProvider : public QObject +{ + Q_OBJECT + +public slots: + void initTestCase(); + +private slots: + void testDefaultProviderAvailable(); + void testObtainService(); + void testHasSupport(); + void testSupportedMimeTypes(); + void testProviderHints(); + +private: + QObjectList plugins; +}; + +void tst_QMediaServiceProvider::initTestCase() +{ + plugins << new MockServicePlugin1; + plugins << new MockServicePlugin2; + plugins << new MockServicePlugin3; + + QMediaPluginLoader::setStaticPlugins(QLatin1String("/mediaservices"), plugins); +} + +void tst_QMediaServiceProvider::testDefaultProviderAvailable() +{ + // Must always be a default provider available + QVERIFY(QMediaServiceProvider::defaultServiceProvider() != 0); +} + +void tst_QMediaServiceProvider::testObtainService() +{ + QMediaServiceProvider *provider = QMediaServiceProvider::defaultServiceProvider(); + + if (provider == 0) + QSKIP("No default provider", SkipSingle); + + QMediaService *service = 0; + + // Player + service = provider->requestService(Q_MEDIASERVICE_MEDIAPLAYER); + QVERIFY(service != 0); + provider->releaseService(service); +} + +void tst_QMediaServiceProvider::testHasSupport() +{ + MockMediaServiceProvider mockProvider; + QCOMPARE(mockProvider.hasSupport(QByteArray(Q_MEDIASERVICE_MEDIAPLAYER), "video/ogv", QStringList()), + QtMultimedia::MaybeSupported); + + QMediaServiceProvider *provider = QMediaServiceProvider::defaultServiceProvider(); + + if (provider == 0) + QSKIP("No default provider", SkipSingle); + + QCOMPARE(provider->hasSupport(QByteArray(Q_MEDIASERVICE_MEDIAPLAYER), "video/ogv", QStringList()), + QtMultimedia::MaybeSupported); + + QCOMPARE(provider->hasSupport(QByteArray(Q_MEDIASERVICE_MEDIAPLAYER), "audio/ogg", QStringList()), + QtMultimedia::ProbablySupported); + + //while the service returns PreferredService, provider should return ProbablySupported + QCOMPARE(provider->hasSupport(QByteArray(Q_MEDIASERVICE_MEDIAPLAYER), "audio/wav", QStringList()), + QtMultimedia::ProbablySupported); + + //even while all the plugins with "hasSupport" returned NotSupported, + //MockServicePlugin3 has no "hasSupport" interface, so MaybeSupported + QCOMPARE(provider->hasSupport(QByteArray(Q_MEDIASERVICE_MEDIAPLAYER), "video/avi", + QStringList() << "mpeg4"), + QtMultimedia::MaybeSupported); + + QCOMPARE(provider->hasSupport(QByteArray("non existing service"), "video/ogv", QStringList()), + QtMultimedia::NotSupported); + + QCOMPARE(QMediaPlayer::hasSupport("video/ogv"), QtMultimedia::MaybeSupported); + QCOMPARE(QMediaPlayer::hasSupport("audio/ogg"), QtMultimedia::ProbablySupported); + QCOMPARE(QMediaPlayer::hasSupport("audio/wav"), QtMultimedia::ProbablySupported); + + //ensure the correct media player plugin is choosen for mime type + QMediaPlayer simplePlayer(0, QMediaPlayer::LowLatency); + QCOMPARE(simplePlayer.service()->objectName(), QLatin1String("MockServicePlugin2")); + + QMediaPlayer mediaPlayer; + QVERIFY(mediaPlayer.service()->objectName() != QLatin1String("MockServicePlugin2")); +} + +void tst_QMediaServiceProvider::testSupportedMimeTypes() +{ + QMediaServiceProvider *provider = QMediaServiceProvider::defaultServiceProvider(); + + if (provider == 0) + QSKIP("No default provider", SkipSingle); + + QVERIFY(provider->supportedMimeTypes(QByteArray(Q_MEDIASERVICE_MEDIAPLAYER)).contains("audio/ogg")); + QVERIFY(!provider->supportedMimeTypes(QByteArray(Q_MEDIASERVICE_MEDIAPLAYER)).contains("audio/mp3")); +} + +void tst_QMediaServiceProvider::testProviderHints() +{ + { + QMediaServiceProviderHint hint; + QVERIFY(hint.isNull()); + QCOMPARE(hint.type(), QMediaServiceProviderHint::Null); + QVERIFY(hint.device().isEmpty()); + QVERIFY(hint.mimeType().isEmpty()); + QVERIFY(hint.codecs().isEmpty()); + QCOMPARE(hint.features(), 0); + } + + { + QByteArray deviceName(QByteArray("testDevice")); + QMediaServiceProviderHint hint(deviceName); + QVERIFY(!hint.isNull()); + QCOMPARE(hint.type(), QMediaServiceProviderHint::Device); + QCOMPARE(hint.device(), deviceName); + QVERIFY(hint.mimeType().isEmpty()); + QVERIFY(hint.codecs().isEmpty()); + QCOMPARE(hint.features(), 0); + } + + { + QMediaServiceProviderHint hint(QMediaServiceProviderHint::LowLatencyPlayback); + QVERIFY(!hint.isNull()); + QCOMPARE(hint.type(), QMediaServiceProviderHint::SupportedFeatures); + QVERIFY(hint.device().isEmpty()); + QVERIFY(hint.mimeType().isEmpty()); + QVERIFY(hint.codecs().isEmpty()); + QCOMPARE(hint.features(), QMediaServiceProviderHint::LowLatencyPlayback); + } + + { + QString mimeType(QLatin1String("video/ogg")); + QStringList codecs; + codecs << "theora" << "vorbis"; + + QMediaServiceProviderHint hint(mimeType,codecs); + QVERIFY(!hint.isNull()); + QCOMPARE(hint.type(), QMediaServiceProviderHint::ContentType); + QVERIFY(hint.device().isEmpty()); + QCOMPARE(hint.mimeType(), mimeType); + QCOMPARE(hint.codecs(), codecs); + + QMediaServiceProviderHint hint2(hint); + + QVERIFY(!hint2.isNull()); + QCOMPARE(hint2.type(), QMediaServiceProviderHint::ContentType); + QVERIFY(hint2.device().isEmpty()); + QCOMPARE(hint2.mimeType(), mimeType); + QCOMPARE(hint2.codecs(), codecs); + + QMediaServiceProviderHint hint3; + QVERIFY(hint3.isNull()); + hint3 = hint; + QVERIFY(!hint3.isNull()); + QCOMPARE(hint3.type(), QMediaServiceProviderHint::ContentType); + QVERIFY(hint3.device().isEmpty()); + QCOMPARE(hint3.mimeType(), mimeType); + QCOMPARE(hint3.codecs(), codecs); + + QCOMPARE(hint, hint2); + QCOMPARE(hint3, hint2); + + QMediaServiceProviderHint hint4(mimeType,codecs); + QCOMPARE(hint, hint4); + + QMediaServiceProviderHint hint5(mimeType,QStringList()); + QVERIFY(hint != hint5); + } +} + +QTEST_MAIN(tst_QMediaServiceProvider) + +#include "tst_qmediaserviceprovider.moc" diff --git a/tests/auto/qmediatimerange/qmediatimerange.pro b/tests/auto/qmediatimerange/qmediatimerange.pro new file mode 100644 index 0000000..b1b436e --- /dev/null +++ b/tests/auto/qmediatimerange/qmediatimerange.pro @@ -0,0 +1,6 @@ +load(qttest_p4) + +SOURCES = tst_qmediatimerange.cpp + +QT = core multimedia + diff --git a/tests/auto/qmediatimerange/tst_qmediatimerange.cpp b/tests/auto/qmediatimerange/tst_qmediatimerange.cpp new file mode 100644 index 0000000..54de3f1 --- /dev/null +++ b/tests/auto/qmediatimerange/tst_qmediatimerange.cpp @@ -0,0 +1,735 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (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 Technology Preview License Agreement accompanying +** this package. +** +** 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.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <QtTest/QtTest> +#include <QtCore/qdebug.h> + +#include <QtMultimedia/qmediatimerange.h> + +class tst_QMediaTimeRange: public QObject +{ + Q_OBJECT + +public slots: + +private slots: + void testCtor(); + void testGetters(); + void testAssignment(); + void testNormalize(); + void testTranslated(); + void testEarliestLatest(); + void testContains(); + void testAddInterval(); + void testAddTimeRange(); + void testRemoveInterval(); + void testRemoveTimeRange(); + void testClear(); + void testComparisons(); + void testArithmetic(); +}; + +void tst_QMediaTimeRange::testCtor() +{ + // Default Ctor + QMediaTimeRange a; + QVERIFY(a.isEmpty()); + + // (qint, qint) Ctor + QMediaTimeRange b(10, 20); + + QVERIFY(!b.isEmpty()); + QVERIFY(b.isContinuous()); + QVERIFY(b.earliestTime() == 10); + QVERIFY(b.latestTime() == 20); + + // Interval Ctor + QMediaTimeRange c(QMediaTimeInterval(30, 40)); + + QVERIFY(!c.isEmpty()); + QVERIFY(c.isContinuous()); + QVERIFY(c.earliestTime() == 30); + QVERIFY(c.latestTime() == 40); + + // Abnormal Interval Ctor + QMediaTimeRange d(QMediaTimeInterval(20, 10)); + + QVERIFY(d.isEmpty()); + + // Copy Ctor + QMediaTimeRange e(b); + + QVERIFY(!e.isEmpty()); + QVERIFY(e.isContinuous()); + QVERIFY(e.earliestTime() == 10); + QVERIFY(e.latestTime() == 20); +} + +void tst_QMediaTimeRange::testGetters() +{ + QMediaTimeRange x; + + // isEmpty + QVERIFY(x.isEmpty()); + + x.addInterval(10, 20); + + // isEmpty + isContinuous + QVERIFY(!x.isEmpty()); + QVERIFY(x.isContinuous()); + + x.addInterval(30, 40); + + // isEmpty + isContinuous + intervals + start + end + QVERIFY(!x.isEmpty()); + QVERIFY(!x.isContinuous()); + QVERIFY(x.intervals().count() == 2); + QVERIFY(x.intervals()[0].start() == 10); + QVERIFY(x.intervals()[0].end() == 20); + QVERIFY(x.intervals()[1].start() == 30); + QVERIFY(x.intervals()[1].end() == 40); +} + +void tst_QMediaTimeRange::testAssignment() +{ + QMediaTimeRange x; + + // Range Assignment + x = QMediaTimeRange(10, 20); + + QVERIFY(!x.isEmpty()); + QVERIFY(x.isContinuous()); + QVERIFY(x.earliestTime() == 10); + QVERIFY(x.latestTime() == 20); + + // Interval Assignment + x = QMediaTimeInterval(30, 40); + + QVERIFY(!x.isEmpty()); + QVERIFY(x.isContinuous()); + QVERIFY(x.earliestTime() == 30); + QVERIFY(x.latestTime() == 40); + + // Shared Data Check + QMediaTimeRange y; + + y = x; + y.addInterval(10, 20); + + QVERIFY(!x.isEmpty()); + QVERIFY(x.isContinuous()); + QVERIFY(x.earliestTime() == 30); + QVERIFY(x.latestTime() == 40); +} + +void tst_QMediaTimeRange::testNormalize() +{ + QMediaTimeInterval x(20, 10); + + QVERIFY(!x.isNormal()); + + x = x.normalized(); + + QVERIFY(x.isNormal()); + QVERIFY(x.start() == 10); + QVERIFY(x.end() == 20); +} + +void tst_QMediaTimeRange::testTranslated() +{ + QMediaTimeInterval x(10, 20); + x = x.translated(10); + + QVERIFY(x.start() == 20); + QVERIFY(x.end() == 30); +} + +void tst_QMediaTimeRange::testEarliestLatest() +{ + // Test over a single interval + QMediaTimeRange x(30, 40); + + QVERIFY(x.earliestTime() == 30); + QVERIFY(x.latestTime() == 40); + + // Test over multiple intervals + x.addInterval(50, 60); + + QVERIFY(x.earliestTime() == 30); + QVERIFY(x.latestTime() == 60); +} + +void tst_QMediaTimeRange::testContains() +{ + // Test over a single interval + QMediaTimeRange x(10, 20); + + QVERIFY(!x.isEmpty()); + QVERIFY(x.isContinuous()); + QVERIFY(x.contains(15)); + QVERIFY(x.contains(10)); + QVERIFY(x.contains(20)); + QVERIFY(!x.contains(25)); + + // Test over multiple intervals + x.addInterval(40, 50); + + QVERIFY(!x.isEmpty()); + QVERIFY(!x.isContinuous()); + QVERIFY(x.contains(15)); + QVERIFY(x.contains(45)); + QVERIFY(!x.contains(30)); + + // Test over a concrete interval + QMediaTimeInterval y(10, 20); + QVERIFY(y.contains(15)); + QVERIFY(y.contains(10)); + QVERIFY(y.contains(20)); + QVERIFY(!y.contains(25)); +} + +void tst_QMediaTimeRange::testAddInterval() +{ + // All intervals Overlap + QMediaTimeRange x; + x.addInterval(10, 40); + x.addInterval(30, 50); + x.addInterval(20, 60); + + QVERIFY(!x.isEmpty()); + QVERIFY(x.isContinuous()); + QVERIFY(x.earliestTime() == 10); + QVERIFY(x.latestTime() == 60); + + // 1 adjacent interval, 1 encompassed interval + x = QMediaTimeRange(); + x.addInterval(10, 40); + x.addInterval(20, 30); + x.addInterval(41, 50); + + QVERIFY(!x.isEmpty()); + QVERIFY(x.isContinuous()); + QVERIFY(x.earliestTime() == 10); + QVERIFY(x.latestTime() == 50); + + // 1 overlapping interval, 1 disjoint interval + x = QMediaTimeRange(); + x.addInterval(10, 30); + x.addInterval(20, 40); + x.addInterval(50, 60); + + QVERIFY(!x.isEmpty()); + QVERIFY(!x.isContinuous()); + QVERIFY(x.intervals().count() == 2); + QVERIFY(x.intervals()[0].start() == 10); + QVERIFY(x.intervals()[0].end() == 40); + QVERIFY(x.intervals()[1].start() == 50); + QVERIFY(x.intervals()[1].end() == 60); + + // Identical Add + x = QMediaTimeRange(); + x.addInterval(10, 20); + x.addInterval(10, 20); + + QVERIFY(!x.isEmpty()); + QVERIFY(x.isContinuous()); + QVERIFY(x.earliestTime() == 10); + QVERIFY(x.latestTime() == 20); + + // Multi-Merge + x = QMediaTimeRange(); + x.addInterval(10, 20); + x.addInterval(30, 40); + x.addInterval(50, 60); + x.addInterval(15, 55); + + QVERIFY(!x.isEmpty()); + QVERIFY(x.isContinuous()); + QVERIFY(x.earliestTime() == 10); + QVERIFY(x.latestTime() == 60); + + // Interval Parameter - All intervals Overlap + x = QMediaTimeRange(); + x.addInterval(QMediaTimeInterval(10, 40)); + x.addInterval(QMediaTimeInterval(30, 50)); + x.addInterval(QMediaTimeInterval(20, 60)); + + QVERIFY(!x.isEmpty()); + QVERIFY(x.isContinuous()); + QVERIFY(x.earliestTime() == 10); + QVERIFY(x.latestTime() == 60); + + // Interval Parameter - Abnormal Interval + x = QMediaTimeRange(); + x.addInterval(QMediaTimeInterval(20, 10)); + + QVERIFY(x.isEmpty()); +} + +void tst_QMediaTimeRange::testAddTimeRange() +{ + // Add Time Range uses Add Interval internally, + // so in this test the focus is on combinations of number + // of intervals added, rather than the different types of + // merges which can occur. + QMediaTimeRange a, b; + + // Add Single into Single + a = QMediaTimeRange(10, 30); + b = QMediaTimeRange(20, 40); + + b.addTimeRange(a); + + QVERIFY(!b.isEmpty()); + QVERIFY(b.isContinuous()); + QVERIFY(b.earliestTime() == 10); + QVERIFY(b.latestTime() == 40); + + // Add Multiple into Single + a = QMediaTimeRange(); + a.addInterval(10, 30); + a.addInterval(40, 60); + + b = QMediaTimeRange(20, 50); + + b.addTimeRange(a); + + QVERIFY(!b.isEmpty()); + QVERIFY(b.isContinuous()); + QVERIFY(b.earliestTime() == 10); + QVERIFY(b.latestTime() == 60); + + // Add Single into Multiple + a = QMediaTimeRange(20, 50); + + b = QMediaTimeRange(); + b.addInterval(10, 30); + b.addInterval(40, 60); + + b.addTimeRange(a); + + QVERIFY(!b.isEmpty()); + QVERIFY(b.isContinuous()); + QVERIFY(b.earliestTime() == 10); + QVERIFY(b.latestTime() == 60); + + // Add Multiple into Multiple + a = QMediaTimeRange(); + a.addInterval(10, 30); + a.addInterval(40, 70); + a.addInterval(80, 100); + + b = QMediaTimeRange(); + b.addInterval(20, 50); + b.addInterval(60, 90); + + b.addTimeRange(a); + + QVERIFY(!b.isEmpty()); + QVERIFY(b.isContinuous()); + QVERIFY(b.earliestTime() == 10); + QVERIFY(b.latestTime() == 100); + + // Add Nothing to Single + a = QMediaTimeRange(); + b = QMediaTimeRange(10, 20); + + b.addTimeRange(a); + + QVERIFY(!b.isEmpty()); + QVERIFY(b.isContinuous()); + QVERIFY(b.earliestTime() == 10); + QVERIFY(b.latestTime() == 20); + + // Add Single to Nothing + a = QMediaTimeRange(10, 20); + b = QMediaTimeRange(); + + b.addTimeRange(a); + + QVERIFY(!b.isEmpty()); + QVERIFY(b.isContinuous()); + QVERIFY(b.earliestTime() == 10); + QVERIFY(b.latestTime() == 20); + + // Add Nothing to Nothing + a = QMediaTimeRange(); + b = QMediaTimeRange(); + + b.addTimeRange(a); + + QVERIFY(b.isEmpty()); +} + +void tst_QMediaTimeRange::testRemoveInterval() +{ + // Removing an interval, causing a split + QMediaTimeRange x; + x.addInterval(10, 50); + x.removeInterval(20, 40); + + QVERIFY(!x.isEmpty()); + QVERIFY(!x.isContinuous()); + QVERIFY(x.intervals().count() == 2); + QVERIFY(x.intervals()[0].start() == 10); + QVERIFY(x.intervals()[0].end() == 19); + QVERIFY(x.intervals()[1].start() == 41); + QVERIFY(x.intervals()[1].end() == 50); + + // Removing an interval, causing a deletion + x = QMediaTimeRange(); + x.addInterval(20, 30); + x.removeInterval(10, 40); + + QVERIFY(x.isEmpty()); + + // Removing an interval, causing a tail trim + x = QMediaTimeRange(); + x.addInterval(20, 40); + x.removeInterval(30, 50); + + QVERIFY(!x.isEmpty()); + QVERIFY(x.isContinuous()); + QVERIFY(x.earliestTime() == 20); + QVERIFY(x.latestTime() == 29); + + // Removing an interval, causing a head trim + x = QMediaTimeRange(); + x.addInterval(20, 40); + x.removeInterval(10, 30); + + QVERIFY(!x.isEmpty()); + QVERIFY(x.isContinuous()); + QVERIFY(x.earliestTime() == 31); + QVERIFY(x.latestTime() == 40); + + // Identical Remove + x = QMediaTimeRange(); + x.addInterval(10, 20); + x.removeInterval(10, 20); + + QVERIFY(x.isEmpty()); + + // Multi-Trim + x = QMediaTimeRange(); + x.addInterval(10, 20); + x.addInterval(30, 40); + x.removeInterval(15, 35); + + QVERIFY(!x.isEmpty()); + QVERIFY(!x.isContinuous()); + QVERIFY(x.intervals().count() == 2); + QVERIFY(x.intervals()[0].start() == 10); + QVERIFY(x.intervals()[0].end() == 14); + QVERIFY(x.intervals()[1].start() == 36); + QVERIFY(x.intervals()[1].end() == 40); + + // Multi-Delete + x = QMediaTimeRange(); + x.addInterval(10, 20); + x.addInterval(30, 40); + x.addInterval(50, 60); + x.removeInterval(10, 60); + + QVERIFY(x.isEmpty()); + + // Interval Parameter - Removing an interval, causing a split + x = QMediaTimeRange(); + x.addInterval(10, 50); + x.removeInterval(QMediaTimeInterval(20, 40)); + + QVERIFY(!x.isEmpty()); + QVERIFY(!x.isContinuous()); + QVERIFY(x.intervals().count() == 2); + QVERIFY(x.intervals()[0].start() == 10); + QVERIFY(x.intervals()[0].end() == 19); + QVERIFY(x.intervals()[1].start() == 41); + QVERIFY(x.intervals()[1].end() == 50); + + // Interval Parameter - Abnormal Interval + x = QMediaTimeRange(); + x.addInterval(10, 40); + x.removeInterval(QMediaTimeInterval(30, 20)); + + QVERIFY(!x.isEmpty()); + QVERIFY(x.isContinuous()); + QVERIFY(x.earliestTime() == 10); + QVERIFY(x.latestTime() == 40); +} + +void tst_QMediaTimeRange::testRemoveTimeRange() +{ + // Remove Time Range uses Remove Interval internally, + // so in this test the focus is on combinations of number + // of intervals removed, rather than the different types of + // deletions which can occur. + QMediaTimeRange a, b; + + // Remove Single from Single + a = QMediaTimeRange(10, 30); + b = QMediaTimeRange(20, 40); + + b.removeTimeRange(a); + + QVERIFY(!b.isEmpty()); + QVERIFY(b.isContinuous()); + QVERIFY(b.earliestTime() == 31); + QVERIFY(b.latestTime() == 40); + + // Remove Multiple from Single + a = QMediaTimeRange(); + a.addInterval(10, 30); + a.addInterval(40, 60); + + b = QMediaTimeRange(20, 50); + + b.removeTimeRange(a); + + QVERIFY(!b.isEmpty()); + QVERIFY(b.isContinuous()); + QVERIFY(b.earliestTime() == 31); + QVERIFY(b.latestTime() == 39); + + // Remove Single from Multiple + a = QMediaTimeRange(20, 50); + + b = QMediaTimeRange(); + b.addInterval(10, 30); + b.addInterval(40, 60); + + b.removeTimeRange(a); + + QVERIFY(!b.isEmpty()); + QVERIFY(!b.isContinuous()); + QVERIFY(b.intervals().count() == 2); + QVERIFY(b.intervals()[0].start() == 10); + QVERIFY(b.intervals()[0].end() == 19); + QVERIFY(b.intervals()[1].start() == 51); + QVERIFY(b.intervals()[1].end() == 60); + + // Remove Multiple from Multiple + a = QMediaTimeRange(); + a.addInterval(20, 50); + a.addInterval(50, 90); + + + b = QMediaTimeRange(); + b.addInterval(10, 30); + b.addInterval(40, 70); + b.addInterval(80, 100); + + b.removeTimeRange(a); + + QVERIFY(!b.isEmpty()); + QVERIFY(!b.isContinuous()); + QVERIFY(b.intervals().count() == 2); + QVERIFY(b.intervals()[0].start() == 10); + QVERIFY(b.intervals()[0].end() == 19); + QVERIFY(b.intervals()[1].start() == 91); + QVERIFY(b.intervals()[1].end() == 100); + + // Remove Nothing from Single + a = QMediaTimeRange(); + b = QMediaTimeRange(10, 20); + + b.removeTimeRange(a); + + QVERIFY(!b.isEmpty()); + QVERIFY(b.isContinuous()); + QVERIFY(b.earliestTime() == 10); + QVERIFY(b.latestTime() == 20); + + // Remove Single from Nothing + a = QMediaTimeRange(10, 20); + b = QMediaTimeRange(); + + b.removeTimeRange(a); + + QVERIFY(b.isEmpty()); + + // Remove Nothing from Nothing + a = QMediaTimeRange(); + b = QMediaTimeRange(); + + b.removeTimeRange(a); + + QVERIFY(b.isEmpty()); +} + +void tst_QMediaTimeRange::testClear() +{ + QMediaTimeRange x; + + // Clear Nothing + x.clear(); + + QVERIFY(x.isEmpty()); + + // Clear Single + x = QMediaTimeRange(10, 20); + x.clear(); + + QVERIFY(x.isEmpty()); + + // Clear Multiple + x = QMediaTimeRange(); + x.addInterval(10, 20); + x.addInterval(30, 40); + x.clear(); + + QVERIFY(x.isEmpty()); +} + +void tst_QMediaTimeRange::testComparisons() +{ + // Interval equality + QVERIFY(QMediaTimeInterval(10, 20) == QMediaTimeInterval(10, 20)); + QVERIFY(QMediaTimeInterval(10, 20) != QMediaTimeInterval(10, 30)); + QVERIFY(!(QMediaTimeInterval(10, 20) != QMediaTimeInterval(10, 20))); + QVERIFY(!(QMediaTimeInterval(10, 20) == QMediaTimeInterval(10, 30))); + + // Time range equality - Single Interval + QMediaTimeRange a(10, 20), b(20, 30), c(10, 20); + + QVERIFY(a == c); + QVERIFY(!(a == b)); + QVERIFY(a != b); + QVERIFY(!(a != c)); + + // Time Range Equality - Multiple Intervals + QMediaTimeRange x, y, z; + + x.addInterval(10, 20); + x.addInterval(30, 40); + x.addInterval(50, 60); + + y.addInterval(10, 20); + y.addInterval(35, 45); + y.addInterval(50, 60); + + z.addInterval(10, 20); + z.addInterval(30, 40); + z.addInterval(50, 60); + + QVERIFY(x == z); + QVERIFY(!(x == y)); + QVERIFY(x != y); + QVERIFY(!(x != z)); +} + +void tst_QMediaTimeRange::testArithmetic() +{ + QMediaTimeRange a(10, 20), b(20, 30); + + // Test += + a += b; + + QVERIFY(a.isContinuous()); + QVERIFY(a.earliestTime() == 10); + QVERIFY(a.latestTime() == 30); + + // Test -= + a -= b; + + QVERIFY(a.isContinuous()); + QVERIFY(a.earliestTime() == 10); + QVERIFY(a.latestTime() == 19); + + // Test += and -= on intervals + a -= QMediaTimeInterval(10, 20); + a += QMediaTimeInterval(40, 50); + + QVERIFY(a.isContinuous()); + QVERIFY(a.earliestTime() == 40); + QVERIFY(a.latestTime() == 50); + + // Test Interval + Interval + a = QMediaTimeInterval(10, 20) + QMediaTimeInterval(20, 30); + QVERIFY(a.isContinuous()); + QVERIFY(a.earliestTime() == 10); + QVERIFY(a.latestTime() == 30); + + // Test Range + Interval + a = a + QMediaTimeInterval(30, 40); + QVERIFY(a.isContinuous()); + QVERIFY(a.earliestTime() == 10); + QVERIFY(a.latestTime() == 40); + + // Test Interval + Range + a = QMediaTimeInterval(40, 50) + a; + QVERIFY(a.isContinuous()); + QVERIFY(a.earliestTime() == 10); + QVERIFY(a.latestTime() == 50); + + // Test Range + Range + a = a + QMediaTimeRange(50, 60); + QVERIFY(a.isContinuous()); + QVERIFY(a.earliestTime() == 10); + QVERIFY(a.latestTime() == 60); + + // Test Range - Interval + a = a - QMediaTimeInterval(50, 60); + QVERIFY(a.isContinuous()); + QVERIFY(a.earliestTime() == 10); + QVERIFY(a.latestTime() == 49); + + // Test Range - Range + a = a - QMediaTimeRange(40, 50); + QVERIFY(a.isContinuous()); + QVERIFY(a.earliestTime() == 10); + QVERIFY(a.latestTime() == 39); + + // Test Interval - Range + b = QMediaTimeInterval(0, 20) - a; + QVERIFY(b.isContinuous()); + QVERIFY(b.earliestTime() == 0); + QVERIFY(b.latestTime() == 9); + + // Test Interval - Interval + a = QMediaTimeInterval(10, 20) - QMediaTimeInterval(15, 30); + QVERIFY(a.isContinuous()); + QVERIFY(a.earliestTime() == 10); + QVERIFY(a.latestTime() == 14); +} + +QTEST_MAIN(tst_QMediaTimeRange) + +#include "tst_qmediatimerange.moc" diff --git a/tests/auto/qmlaudio/qmlaudio.pro b/tests/auto/qmlaudio/qmlaudio.pro new file mode 100644 index 0000000..fe18761 --- /dev/null +++ b/tests/auto/qmlaudio/qmlaudio.pro @@ -0,0 +1,6 @@ +load(qttest_p4) +SOURCES += tst_qmlaudio.cpp + +QT += multimedia declarative +requires(contains(QT_CONFIG, multimedia)) +requires(contains(QT_CONFIG, declarative)) diff --git a/tests/auto/qmlaudio/tst_qmlaudio.cpp b/tests/auto/qmlaudio/tst_qmlaudio.cpp new file mode 100644 index 0000000..068317f --- /dev/null +++ b/tests/auto/qmlaudio/tst_qmlaudio.cpp @@ -0,0 +1,1200 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (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 Technology Preview License Agreement accompanying +** this package. +** +** 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.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <QtTest/QtTest> + +#include <QtMultimedia/private/qmlaudio_p.h> + +#include <QtGui/qapplication.h> +#include <QtMultimedia/qmediaplayercontrol.h> +#include <QtMultimedia/qmediaservice.h> +#include <QtMultimedia/qmetadatacontrol.h> + + +class tst_QmlAudio : public QObject +{ + Q_OBJECT +public slots: + void initTestCase(); + +private slots: + void nullPlayerControl(); + void nullMetaDataControl(); + void nullService(); + + void source(); + void playing(); + void paused(); + void duration(); + void position(); + void volume(); + void muted(); + void bufferProgress(); + void seekable(); + void playbackRate(); + void status(); + void metaData_data(); + void metaData(); + void error(); +}; + +Q_DECLARE_METATYPE(QtMultimedia::MetaData); +Q_DECLARE_METATYPE(QmlAudio::Error); + +class QtTestMediaPlayerControl : public QMediaPlayerControl +{ + Q_OBJECT +public: + QtTestMediaPlayerControl(QObject *parent = 0) + : QMediaPlayerControl(parent) + , m_state(QMediaPlayer::StoppedState) + , m_mediaStatus(QMediaPlayer::NoMedia) + , m_duration(0) + , m_position(0) + , m_playbackRate(1.0) + , m_volume(50) + , m_bufferStatus(0) + , m_muted(false) + , m_audioAvailable(false) + , m_videoAvailable(false) + , m_seekable(false) + { + } + + QMediaPlayer::State state() const { return m_state; } + void updateState(QMediaPlayer::State state) { emit stateChanged(m_state = state); } + + QMediaPlayer::MediaStatus mediaStatus() const { return m_mediaStatus; } + void updateMediaStatus(QMediaPlayer::MediaStatus status) { + emit mediaStatusChanged(m_mediaStatus = status); } + void updateMediaStatus(QMediaPlayer::MediaStatus status, QMediaPlayer::State state) + { + m_mediaStatus = status; + m_state = state; + + emit mediaStatusChanged(m_mediaStatus); + emit stateChanged(m_state); + } + + qint64 duration() const { return m_duration; } + void setDuration(qint64 duration) { emit durationChanged(m_duration = duration); } + + qint64 position() const { return m_position; } + void setPosition(qint64 position) { emit positionChanged(m_position = position); } + + int volume() const { return m_volume; } + void setVolume(int volume) { emit volumeChanged(m_volume = volume); } + + bool isMuted() const { return m_muted; } + void setMuted(bool muted) { emit mutedChanged(m_muted = muted); } + + int bufferStatus() const { return m_bufferStatus; } + void setBufferStatus(int status) { emit bufferStatusChanged(m_bufferStatus = status); } + + bool isAudioAvailable() const { return m_audioAvailable; } + void setAudioAvailable(bool available) { + emit audioAvailableChanged(m_audioAvailable = available); } + bool isVideoAvailable() const { return m_videoAvailable; } + void setVideoAvailable(bool available) { + emit videoAvailableChanged(m_videoAvailable = available); } + + bool isSeekable() const { return m_seekable; } + void setSeekable(bool seekable) { emit seekableChanged(m_seekable = seekable); } + + QMediaTimeRange availablePlaybackRanges() const { return QMediaTimeRange(); } + + qreal playbackRate() const { return m_playbackRate; } + void setPlaybackRate(qreal rate) { emit playbackRateChanged(m_playbackRate = rate); } + + QMediaContent media() const { return m_media; } + const QIODevice *mediaStream() const { return 0; } + void setMedia(const QMediaContent &media, QIODevice *) + { + m_media = media; + + m_mediaStatus = m_media.isNull() + ? QMediaPlayer::NoMedia + : QMediaPlayer::LoadingMedia; + + emit mediaChanged(m_media); + emit mediaStatusChanged(m_mediaStatus); + } + + void play() { emit stateChanged(m_state = QMediaPlayer::PlayingState); } + void pause() { emit stateChanged(m_state = QMediaPlayer::PausedState); } + void stop() { emit stateChanged(m_state = QMediaPlayer::StoppedState); } + + void emitError(QMediaPlayer::Error err, const QString &errorString) { + emit error(err, errorString); } + +private: + QMediaPlayer::State m_state; + QMediaPlayer::MediaStatus m_mediaStatus; + qint64 m_duration; + qint64 m_position; + qreal m_playbackRate; + int m_volume; + int m_bufferStatus; + bool m_muted; + bool m_audioAvailable; + bool m_videoAvailable; + bool m_seekable; + QMediaContent m_media; +}; + +class QtTestMetaDataControl : public QMetaDataControl +{ + Q_OBJECT +public: + QtTestMetaDataControl(QObject *parent = 0) + : QMetaDataControl(parent) + { + } + + bool isWritable() const { return true; } + bool isMetaDataAvailable() const { return true; } + + QVariant metaData(QtMultimedia::MetaData key) const { return m_metaData.value(key); } + void setMetaData(QtMultimedia::MetaData key, const QVariant &value) { + m_metaData.insert(key, value); emit metaDataChanged(); } + void setMetaData(const QMap<QtMultimedia::MetaData, QVariant> &metaData) { + m_metaData = metaData; emit metaDataChanged(); } + + QList<QtMultimedia::MetaData> availableMetaData() const { return m_metaData.keys(); } + + QVariant extendedMetaData(const QString &) const { return QVariant(); } + void setExtendedMetaData(const QString &, const QVariant &) {} + QStringList availableExtendedMetaData() const { return QStringList(); } + +private: + QMap<QtMultimedia::MetaData, QVariant> m_metaData; +}; + +class QtTestMediaService : public QMediaService +{ + Q_OBJECT +public: + QtTestMediaService( + QtTestMediaPlayerControl *playerControl, + QtTestMetaDataControl *metaDataControl, + QObject *parent) + : QMediaService(parent) + , playerControl(playerControl) + , metaDataControl(metaDataControl) + { + } + + QMediaControl *control(const char *name) const + { + if (qstrcmp(name, QMediaPlayerControl_iid) == 0) + return playerControl; + else if (qstrcmp(name, QMetaDataControl_iid) == 0) + return metaDataControl; + else + return 0; + } + + QtTestMediaPlayerControl *playerControl; + QtTestMetaDataControl *metaDataControl; +}; + +class QtTestMediaServiceProvider : public QMediaServiceProvider +{ + Q_OBJECT +public: + QtTestMediaServiceProvider() + : service(new QtTestMediaService( + new QtTestMediaPlayerControl(this), new QtTestMetaDataControl(this), this)) + { + setDefaultServiceProvider(this); + } + + QtTestMediaServiceProvider(QtTestMediaService *service) + : service(service) + { + setDefaultServiceProvider(this); + } + + QtTestMediaServiceProvider( + QtTestMediaPlayerControl *playerControl, QtTestMetaDataControl *metaDataControl) + : service(new QtTestMediaService(playerControl, metaDataControl, this)) + { + setDefaultServiceProvider(this); + } + + ~QtTestMediaServiceProvider() + { + setDefaultServiceProvider(0); + } + + QMediaService *requestService( + const QByteArray &type, + const QMediaServiceProviderHint & = QMediaServiceProviderHint()) + { + requestedService = type; + + return service; + } + + void releaseService(QMediaService *) {} + + inline QtTestMediaPlayerControl *playerControl() { return service->playerControl; } + inline QtTestMetaDataControl *metaDataControl() { return service->metaDataControl; } + + QtTestMediaService *service; + QByteArray requestedService; +}; + + +void tst_QmlAudio::initTestCase() +{ + qRegisterMetaType<QmlAudio::Error>(); +} + +void tst_QmlAudio::nullPlayerControl() +{ + QtTestMetaDataControl metaDataControl; + QtTestMediaServiceProvider provider(0, &metaDataControl); + + QmlAudio audio; + + QCOMPARE(audio.source(), QUrl()); + audio.setSource(QUrl("http://example.com")); + QCOMPARE(audio.source(), QUrl()); + + QCOMPARE(audio.isPlaying(), false); + audio.setPlaying(true); + QCOMPARE(audio.isPlaying(), false); + audio.play(); + QCOMPARE(audio.isPlaying(), false); + + QCOMPARE(audio.isPaused(), false); + audio.pause(); + QCOMPARE(audio.isPaused(), false); + audio.setPaused(true); + QCOMPARE(audio.isPaused(), true); + + QCOMPARE(audio.duration(), 0); + + QCOMPARE(audio.position(), 0); + audio.setPosition(10000); + QCOMPARE(audio.position(), 0); + + QCOMPARE(audio.volume(), qreal(0)); + audio.setVolume(50); + QCOMPARE(audio.volume(), qreal(0)); + + QCOMPARE(audio.isMuted(), false); + audio.setMuted(true); + QCOMPARE(audio.isMuted(), false); + + QCOMPARE(audio.bufferProgress(), qreal(0)); + + QCOMPARE(audio.isSeekable(), false); + + QCOMPARE(audio.playbackRate(), qreal(1.0)); + + QCOMPARE(audio.status(), QmlAudio::NoMedia); + + QCOMPARE(audio.error(), QmlAudio::ServiceMissing); +} + +void tst_QmlAudio::nullMetaDataControl() +{ + QtTestMediaPlayerControl playerControl; + QtTestMediaServiceProvider provider(&playerControl, 0); + + QmlAudio audio; + + QCOMPARE(audio.metaObject()->indexOfProperty("title"), -1); + QCOMPARE(audio.metaObject()->indexOfProperty("genre"), -1); + QCOMPARE(audio.metaObject()->indexOfProperty("description"), -1); +} + +void tst_QmlAudio::nullService() +{ + QtTestMediaServiceProvider provider(0); + + QmlAudio audio; + + QCOMPARE(audio.source(), QUrl()); + audio.setSource(QUrl("http://example.com")); + QCOMPARE(audio.source(), QUrl()); + + QCOMPARE(audio.isPlaying(), false); + audio.setPlaying(true); + QCOMPARE(audio.isPlaying(), false); + audio.play(); + QCOMPARE(audio.isPlaying(), false); + + QCOMPARE(audio.isPaused(), false); + audio.pause(); + QCOMPARE(audio.isPaused(), false); + audio.setPaused(true); + QCOMPARE(audio.isPaused(), true); + + QCOMPARE(audio.duration(), 0); + + QCOMPARE(audio.position(), 0); + audio.setPosition(10000); + QCOMPARE(audio.position(), 0); + + QCOMPARE(audio.volume(), qreal(0)); + audio.setVolume(50); + QCOMPARE(audio.volume(), qreal(0)); + + QCOMPARE(audio.isMuted(), false); + audio.setMuted(true); + QCOMPARE(audio.isMuted(), false); + + QCOMPARE(audio.bufferProgress(), qreal(0)); + + QCOMPARE(audio.isSeekable(), false); + + QCOMPARE(audio.playbackRate(), qreal(1.0)); + + QCOMPARE(audio.status(), QmlAudio::NoMedia); + + QCOMPARE(audio.error(), QmlAudio::ServiceMissing); + + QCOMPARE(audio.metaObject()->indexOfProperty("title"), -1); + QCOMPARE(audio.metaObject()->indexOfProperty("genre"), -1); + QCOMPARE(audio.metaObject()->indexOfProperty("description"), -1); +} + +void tst_QmlAudio::source() +{ + const QUrl url1("http://example.com"); + const QUrl url2("file:///local/path"); + const QUrl url3; + + QtTestMediaServiceProvider provider; + QmlAudio audio; + + QSignalSpy spy(&audio, SIGNAL(sourceChanged())); + + audio.setSource(url1); + QCOMPARE(audio.source(), url1); + QCOMPARE(provider.playerControl()->media().canonicalUrl(), url1); + QCOMPARE(spy.count(), 1); + + audio.setSource(url2); + QCOMPARE(audio.source(), url2); + QCOMPARE(provider.playerControl()->media().canonicalUrl(), url2); + QCOMPARE(spy.count(), 2); + + audio.setSource(url3); + QCOMPARE(audio.source(), url3); + QCOMPARE(provider.playerControl()->media().canonicalUrl(), url3); + QCOMPARE(spy.count(), 3); +} + +void tst_QmlAudio::playing() +{ + QtTestMediaServiceProvider provider; + QmlAudio audio; + + QSignalSpy playingChangedSpy(&audio, SIGNAL(playingChanged())); + QSignalSpy startedSpy(&audio, SIGNAL(started())); + QSignalSpy stoppedSpy(&audio, SIGNAL(stopped())); + + int playingChanged = 0; + int started = 0; + int stopped = 0; + + QCOMPARE(audio.isPlaying(), false); + + // setPlaying(true) when stopped. + audio.setPlaying(true); + QCOMPARE(audio.isPlaying(), true); + QCOMPARE(provider.playerControl()->state(), QMediaPlayer::PlayingState); + QCOMPARE(playingChangedSpy.count(), ++playingChanged); + QCOMPARE(startedSpy.count(), ++started); + QCOMPARE(stoppedSpy.count(), stopped); + + // setPlaying(false) when playing. + audio.setPlaying(false); + QCOMPARE(audio.isPlaying(), false); + QCOMPARE(provider.playerControl()->state(), QMediaPlayer::StoppedState); + QCOMPARE(playingChangedSpy.count(), ++playingChanged); + QCOMPARE(startedSpy.count(), started); + QCOMPARE(stoppedSpy.count(), ++stopped); + + // play() when stopped. + audio.play(); + QCOMPARE(audio.isPlaying(), true); + QCOMPARE(provider.playerControl()->state(), QMediaPlayer::PlayingState); + QCOMPARE(playingChangedSpy.count(), ++playingChanged); + QCOMPARE(startedSpy.count(), ++started); + QCOMPARE(stoppedSpy.count(), stopped); + + // stop() when playing. + audio.stop(); + QCOMPARE(audio.isPlaying(), false); + QCOMPARE(provider.playerControl()->state(), QMediaPlayer::StoppedState); + QCOMPARE(playingChangedSpy.count(), ++playingChanged); + QCOMPARE(startedSpy.count(), started); + QCOMPARE(stoppedSpy.count(), ++stopped); + + // stop() when stopped. + audio.stop(); + QCOMPARE(audio.isPlaying(), false); + QCOMPARE(provider.playerControl()->state(), QMediaPlayer::StoppedState); + QCOMPARE(playingChangedSpy.count(), playingChanged); + QCOMPARE(startedSpy.count(), started); + QCOMPARE(stoppedSpy.count(), stopped); + + // setPlaying(false) when stopped. + audio.setPlaying(false); + QCOMPARE(audio.isPlaying(), false); + QCOMPARE(provider.playerControl()->state(), QMediaPlayer::StoppedState); + QCOMPARE(playingChangedSpy.count(), playingChanged); + QCOMPARE(startedSpy.count(), started); + QCOMPARE(stoppedSpy.count(), stopped); + + audio.setPlaying(true); + QCOMPARE(audio.isPlaying(), true); + QCOMPARE(provider.playerControl()->state(), QMediaPlayer::PlayingState); + QCOMPARE(playingChangedSpy.count(), ++playingChanged); + QCOMPARE(startedSpy.count(), ++started); + QCOMPARE(stoppedSpy.count(), stopped); + + // setPlaying(true) when playing. + audio.setPlaying(true); + QCOMPARE(audio.isPlaying(), true); + QCOMPARE(provider.playerControl()->state(), QMediaPlayer::PlayingState); + QCOMPARE(playingChangedSpy.count(), playingChanged); + QCOMPARE(startedSpy.count(), started); + QCOMPARE(stoppedSpy.count(), stopped); + + // play() when playing. + audio.play(); + QCOMPARE(audio.isPlaying(), true); + QCOMPARE(provider.playerControl()->state(), QMediaPlayer::PlayingState); + QCOMPARE(playingChangedSpy.count(), playingChanged); + QCOMPARE(startedSpy.count(), started); + QCOMPARE(stoppedSpy.count(), stopped); +} + +void tst_QmlAudio::paused() +{ + QtTestMediaServiceProvider provider; + QmlAudio audio; + + QSignalSpy playingChangedSpy(&audio, SIGNAL(playingChanged())); + QSignalSpy pausedChangedSpy(&audio, SIGNAL(pausedChanged())); + QSignalSpy startedSpy(&audio, SIGNAL(started())); + QSignalSpy pausedSpy(&audio, SIGNAL(paused())); + QSignalSpy resumedSpy(&audio, SIGNAL(resumed())); + QSignalSpy stoppedSpy(&audio, SIGNAL(stopped())); + + int playingChanged = 0; + int pausedChanged = 0; + int started = 0; + int paused = 0; + int resumed = 0; + int stopped = 0; + + QCOMPARE(audio.isPlaying(), false); + QCOMPARE(audio.isPaused(), false); + + // setPlaying(true) when stopped. + audio.setPlaying(true); + QCOMPARE(audio.isPlaying(), true); + QCOMPARE(audio.isPaused(), false); + QCOMPARE(provider.playerControl()->state(), QMediaPlayer::PlayingState); + QCOMPARE(playingChangedSpy.count(), ++playingChanged); + QCOMPARE(pausedChangedSpy.count(), pausedChanged); + QCOMPARE(startedSpy.count(), ++started); + QCOMPARE(pausedSpy.count(), paused); + QCOMPARE(resumedSpy.count(), resumed); + QCOMPARE(stoppedSpy.count(), stopped); + + // setPaused(true) when playing. + audio.setPaused(true); + QCOMPARE(audio.isPlaying(), true); + QCOMPARE(audio.isPaused(), true); + QCOMPARE(provider.playerControl()->state(), QMediaPlayer::PausedState); + QCOMPARE(playingChangedSpy.count(), playingChanged); + QCOMPARE(pausedChangedSpy.count(), ++pausedChanged); + QCOMPARE(startedSpy.count(), started); + QCOMPARE(pausedSpy.count(), ++paused); + QCOMPARE(resumedSpy.count(), resumed); + QCOMPARE(stoppedSpy.count(), stopped); + + // setPaused(true) when paused. + audio.setPaused(true); + QCOMPARE(audio.isPlaying(), true); + QCOMPARE(audio.isPaused(), true); + QCOMPARE(provider.playerControl()->state(), QMediaPlayer::PausedState); + QCOMPARE(playingChangedSpy.count(), playingChanged); + QCOMPARE(pausedChangedSpy.count(), pausedChanged); + QCOMPARE(startedSpy.count(), started); + QCOMPARE(pausedSpy.count(), paused); + QCOMPARE(resumedSpy.count(), resumed); + QCOMPARE(stoppedSpy.count(), stopped); + + // pause() when paused. + audio.pause(); + QCOMPARE(audio.isPlaying(), true); + QCOMPARE(audio.isPaused(), true); + QCOMPARE(provider.playerControl()->state(), QMediaPlayer::PausedState); + QCOMPARE(playingChangedSpy.count(), playingChanged); + QCOMPARE(pausedChangedSpy.count(), pausedChanged); + QCOMPARE(startedSpy.count(), started); + QCOMPARE(pausedSpy.count(), paused); + QCOMPARE(resumedSpy.count(), resumed); + QCOMPARE(stoppedSpy.count(), stopped); + + // setPaused(false) when paused. + audio.setPaused(false); + QCOMPARE(audio.isPlaying(), true); + QCOMPARE(audio.isPaused(), false); + QCOMPARE(provider.playerControl()->state(), QMediaPlayer::PlayingState); + QCOMPARE(playingChangedSpy.count(), playingChanged); + QCOMPARE(pausedChangedSpy.count(), ++pausedChanged); + QCOMPARE(startedSpy.count(), started); + QCOMPARE(pausedSpy.count(), paused); + QCOMPARE(resumedSpy.count(), ++resumed); + QCOMPARE(stoppedSpy.count(), stopped); + + // setPaused(false) when playing. + audio.setPaused(false); + QCOMPARE(audio.isPlaying(), true); + QCOMPARE(audio.isPaused(), false); + QCOMPARE(provider.playerControl()->state(), QMediaPlayer::PlayingState); + QCOMPARE(playingChangedSpy.count(), playingChanged); + QCOMPARE(pausedChangedSpy.count(), pausedChanged); + QCOMPARE(startedSpy.count(), started); + QCOMPARE(pausedSpy.count(), paused); + QCOMPARE(resumedSpy.count(), resumed); + QCOMPARE(stoppedSpy.count(), stopped); + + // pause() when playing. + audio.pause(); + QCOMPARE(audio.isPlaying(), true); + QCOMPARE(audio.isPaused(), true); + QCOMPARE(provider.playerControl()->state(), QMediaPlayer::PausedState); + QCOMPARE(playingChangedSpy.count(), playingChanged); + QCOMPARE(pausedChangedSpy.count(), ++pausedChanged); + QCOMPARE(startedSpy.count(), started); + QCOMPARE(pausedSpy.count(), ++paused); + QCOMPARE(resumedSpy.count(), resumed); + QCOMPARE(stoppedSpy.count(), stopped); + + // setPlaying(false) when paused. + audio.setPlaying(false); + QCOMPARE(audio.isPlaying(), false); + QCOMPARE(audio.isPaused(), true); + QCOMPARE(provider.playerControl()->state(), QMediaPlayer::StoppedState); + QCOMPARE(playingChangedSpy.count(), ++playingChanged); + QCOMPARE(pausedChangedSpy.count(), pausedChanged); + QCOMPARE(startedSpy.count(), started); + QCOMPARE(pausedSpy.count(), paused); + QCOMPARE(resumedSpy.count(), resumed); + QCOMPARE(stoppedSpy.count(), ++stopped); + + // setPaused(true) when stopped and paused. + audio.setPaused(true); + QCOMPARE(audio.isPlaying(), false); + QCOMPARE(audio.isPaused(), true); + QCOMPARE(provider.playerControl()->state(), QMediaPlayer::StoppedState); + QCOMPARE(playingChangedSpy.count(), playingChanged); + QCOMPARE(pausedChangedSpy.count(), pausedChanged); + QCOMPARE(startedSpy.count(), started); + QCOMPARE(pausedSpy.count(), paused); + QCOMPARE(resumedSpy.count(), resumed); + QCOMPARE(stoppedSpy.count(), stopped); + + // setPaused(false) when stopped and paused. + audio.setPaused(false); + QCOMPARE(audio.isPlaying(), false); + QCOMPARE(audio.isPaused(), false); + QCOMPARE(provider.playerControl()->state(), QMediaPlayer::StoppedState); + QCOMPARE(playingChangedSpy.count(), playingChanged); + QCOMPARE(pausedChangedSpy.count(), ++pausedChanged); + QCOMPARE(startedSpy.count(), started); + QCOMPARE(pausedSpy.count(), paused); + QCOMPARE(resumedSpy.count(), resumed); + QCOMPARE(stoppedSpy.count(), stopped); + + // setPaused(true) when stopped. + audio.setPaused(true); + QCOMPARE(audio.isPlaying(), false); + QCOMPARE(audio.isPaused(), true); + QCOMPARE(provider.playerControl()->state(), QMediaPlayer::StoppedState); + QCOMPARE(playingChangedSpy.count(), playingChanged); + QCOMPARE(pausedChangedSpy.count(), ++pausedChanged); + QCOMPARE(startedSpy.count(), started); + QCOMPARE(pausedSpy.count(), paused); + QCOMPARE(resumedSpy.count(), resumed); + QCOMPARE(stoppedSpy.count(), stopped); + + // setPlaying(true) when stopped and paused. + audio.setPlaying(true); + QCOMPARE(audio.isPlaying(), true); + QCOMPARE(audio.isPaused(), true); + QCOMPARE(provider.playerControl()->state(), QMediaPlayer::PausedState); + QCOMPARE(playingChangedSpy.count(), ++playingChanged); + QCOMPARE(pausedChangedSpy.count(), pausedChanged); + QCOMPARE(startedSpy.count(), ++started); + QCOMPARE(pausedSpy.count(), ++paused); + QCOMPARE(resumedSpy.count(), resumed); + QCOMPARE(stoppedSpy.count(), stopped); + + // play() when paused. + audio.play(); + QCOMPARE(audio.isPlaying(), true); + QCOMPARE(audio.isPaused(), false); + QCOMPARE(provider.playerControl()->state(), QMediaPlayer::PlayingState); + QCOMPARE(playingChangedSpy.count(), playingChanged); + QCOMPARE(pausedChangedSpy.count(), ++pausedChanged); + QCOMPARE(startedSpy.count(), started); + QCOMPARE(pausedSpy.count(), paused); + QCOMPARE(resumedSpy.count(), ++resumed); + QCOMPARE(stoppedSpy.count(), stopped); + + // setPaused(true) when playing. + audio.setPaused(true); + QCOMPARE(audio.isPlaying(), true); + QCOMPARE(audio.isPaused(), true); + QCOMPARE(provider.playerControl()->state(), QMediaPlayer::PausedState); + QCOMPARE(playingChangedSpy.count(), playingChanged); + QCOMPARE(pausedChangedSpy.count(), ++pausedChanged); + QCOMPARE(startedSpy.count(), started); + QCOMPARE(pausedSpy.count(), ++paused); + QCOMPARE(resumedSpy.count(), resumed); + QCOMPARE(stoppedSpy.count(), stopped); + + // stop() when paused. + audio.stop(); + QCOMPARE(audio.isPlaying(), false); + QCOMPARE(audio.isPaused(), false); + QCOMPARE(provider.playerControl()->state(), QMediaPlayer::StoppedState); + QCOMPARE(playingChangedSpy.count(), ++playingChanged); + QCOMPARE(pausedChangedSpy.count(), ++pausedChanged); + QCOMPARE(startedSpy.count(), started); + QCOMPARE(pausedSpy.count(), paused); + QCOMPARE(resumedSpy.count(), resumed); + QCOMPARE(stoppedSpy.count(), ++stopped); + + // setPaused(true) when stopped. + audio.setPaused(true); + QCOMPARE(audio.isPlaying(), false); + QCOMPARE(audio.isPaused(), true); + QCOMPARE(provider.playerControl()->state(), QMediaPlayer::StoppedState); + QCOMPARE(playingChangedSpy.count(), playingChanged); + QCOMPARE(pausedChangedSpy.count(), ++pausedChanged); + QCOMPARE(startedSpy.count(), started); + QCOMPARE(pausedSpy.count(), paused); + QCOMPARE(resumedSpy.count(), resumed); + QCOMPARE(stoppedSpy.count(), stopped); + + // stop() when stopped and paused. + audio.stop(); + QCOMPARE(audio.isPlaying(), false); + QCOMPARE(audio.isPaused(), false); + QCOMPARE(provider.playerControl()->state(), QMediaPlayer::StoppedState); + QCOMPARE(playingChangedSpy.count(), playingChanged); + QCOMPARE(pausedChangedSpy.count(), ++pausedChanged); + QCOMPARE(startedSpy.count(), started); + QCOMPARE(pausedSpy.count(), paused); + QCOMPARE(resumedSpy.count(), resumed); + QCOMPARE(stoppedSpy.count(), stopped); + + // pause() when stopped. + audio.pause(); + QCOMPARE(audio.isPlaying(), true); + QCOMPARE(audio.isPaused(), true); + QCOMPARE(provider.playerControl()->state(), QMediaPlayer::PausedState); + QCOMPARE(playingChangedSpy.count(), ++playingChanged); + QCOMPARE(pausedChangedSpy.count(), ++pausedChanged); + QCOMPARE(startedSpy.count(), ++started); + QCOMPARE(pausedSpy.count(), ++paused); + QCOMPARE(resumedSpy.count(), resumed); + QCOMPARE(stoppedSpy.count(), stopped); + + // setPlaying(false) when paused. + audio.setPlaying(false); + QCOMPARE(audio.isPlaying(), false); + QCOMPARE(audio.isPaused(), true); + QCOMPARE(provider.playerControl()->state(), QMediaPlayer::StoppedState); + QCOMPARE(playingChangedSpy.count(), ++playingChanged); + QCOMPARE(pausedChangedSpy.count(), pausedChanged); + QCOMPARE(startedSpy.count(), started); + QCOMPARE(pausedSpy.count(), paused); + QCOMPARE(resumedSpy.count(), resumed); + QCOMPARE(stoppedSpy.count(), ++stopped); + + // pause() when stopped and paused. + audio.pause(); + QCOMPARE(audio.isPlaying(), true); + QCOMPARE(audio.isPaused(), true); + QCOMPARE(provider.playerControl()->state(), QMediaPlayer::PausedState); + QCOMPARE(playingChangedSpy.count(), ++playingChanged); + QCOMPARE(pausedChangedSpy.count(), pausedChanged); + QCOMPARE(startedSpy.count(), ++started); + QCOMPARE(pausedSpy.count(), ++paused); + QCOMPARE(resumedSpy.count(), resumed); + QCOMPARE(stoppedSpy.count(), stopped); + + // setPlaying(false) when paused. + audio.setPlaying(false); + QCOMPARE(audio.isPlaying(), false); + QCOMPARE(audio.isPaused(), true); + QCOMPARE(provider.playerControl()->state(), QMediaPlayer::StoppedState); + QCOMPARE(playingChangedSpy.count(), ++playingChanged); + QCOMPARE(pausedChangedSpy.count(), pausedChanged); + QCOMPARE(startedSpy.count(), started); + QCOMPARE(pausedSpy.count(), paused); + QCOMPARE(resumedSpy.count(), resumed); + QCOMPARE(stoppedSpy.count(), ++stopped); + + // play() when stopped and paused. + audio.play(); + QCOMPARE(audio.isPlaying(), true); + QCOMPARE(audio.isPaused(), false); + QCOMPARE(provider.playerControl()->state(), QMediaPlayer::PlayingState); + QCOMPARE(playingChangedSpy.count(), ++playingChanged); + QCOMPARE(pausedChangedSpy.count(), ++pausedChanged); + QCOMPARE(startedSpy.count(), ++started); + QCOMPARE(pausedSpy.count(), paused); + QCOMPARE(resumedSpy.count(), resumed); + QCOMPARE(stoppedSpy.count(), stopped); +} + +void tst_QmlAudio::duration() +{ + QtTestMediaServiceProvider provider; + QmlAudio audio; + + QSignalSpy spy(&audio, SIGNAL(durationChanged())); + + QCOMPARE(audio.duration(), 0); + + provider.playerControl()->setDuration(4040); + QCOMPARE(audio.duration(), 4040); + QCOMPARE(spy.count(), 1); + + provider.playerControl()->setDuration(-129); + QCOMPARE(audio.duration(), -129); + QCOMPARE(spy.count(), 2); + + provider.playerControl()->setDuration(0); + QCOMPARE(audio.duration(), 0); + QCOMPARE(spy.count(), 3); + + // Unnecessary duration changed signals aren't filtered. + provider.playerControl()->setDuration(0); + QCOMPARE(audio.duration(), 0); + QCOMPARE(spy.count(), 4); +} + +void tst_QmlAudio::position() +{ + QtTestMediaServiceProvider provider; + QmlAudio audio; + + QSignalSpy spy(&audio, SIGNAL(positionChanged())); + + QCOMPARE(audio.position(), 0); + + // QmlAudio won't bound set positions to the duration. A media service may though. + QCOMPARE(audio.duration(), 0); + + audio.setPosition(450); + QCOMPARE(audio.position(), 450); + QCOMPARE(provider.playerControl()->position(), qint64(450)); + QCOMPARE(spy.count(), 1); + + audio.setPosition(-5403); + QCOMPARE(audio.position(), -5403); + QCOMPARE(provider.playerControl()->position(), qint64(-5403)); + QCOMPARE(spy.count(), 2); + + audio.setPosition(-5403); + QCOMPARE(audio.position(), -5403); + QCOMPARE(provider.playerControl()->position(), qint64(-5403)); + QCOMPARE(spy.count(), 3); + + // Check the signal change signal is emitted if the change originates from the media service. + provider.playerControl()->setPosition(0); + QCOMPARE(audio.position(), 0); + QCOMPARE(spy.count(), 4); + + connect(&audio, SIGNAL(positionChanged()), &QTestEventLoop::instance(), SLOT(exitLoop())); + + provider.playerControl()->updateState(QMediaPlayer::PlayingState); + QTestEventLoop::instance().enterLoop(1); + QVERIFY(spy.count() > 4 && spy.count() < 7); // 5 or 6 + + provider.playerControl()->updateState(QMediaPlayer::PausedState); + QTestEventLoop::instance().enterLoop(1); + QVERIFY(spy.count() < 7); +} + +void tst_QmlAudio::volume() +{ + QtTestMediaServiceProvider provider; + QmlAudio audio; + + QSignalSpy spy(&audio, SIGNAL(volumeChanged())); + + QCOMPARE(audio.volume(), qreal(0.5)); + + audio.setVolume(0.7); + QCOMPARE(audio.volume(), qreal(0.7)); + QCOMPARE(provider.playerControl()->volume(), 70); + QCOMPARE(spy.count(), 1); + + audio.setVolume(0.7); + QCOMPARE(audio.volume(), qreal(0.7)); + QCOMPARE(provider.playerControl()->volume(), 70); + QCOMPARE(spy.count(), 2); + + provider.playerControl()->setVolume(30); + QCOMPARE(audio.volume(), qreal(0.3)); + QCOMPARE(spy.count(), 3); +} + +void tst_QmlAudio::muted() +{ + QtTestMediaServiceProvider provider; + QmlAudio audio; + + QSignalSpy spy(&audio, SIGNAL(mutedChanged())); + + QCOMPARE(audio.isMuted(), false); + + audio.setMuted(true); + QCOMPARE(audio.isMuted(), true); + QCOMPARE(provider.playerControl()->isMuted(), true); + QCOMPARE(spy.count(), 1); + + provider.playerControl()->setMuted(false); + QCOMPARE(audio.isMuted(), false); + QCOMPARE(spy.count(), 2); + + audio.setMuted(false); + QCOMPARE(audio.isMuted(), false); + QCOMPARE(provider.playerControl()->isMuted(), false); + QCOMPARE(spy.count(), 3); +} + +void tst_QmlAudio::bufferProgress() +{ + QtTestMediaServiceProvider provider; + QmlAudio audio; + + QSignalSpy spy(&audio, SIGNAL(bufferProgressChanged())); + + QCOMPARE(audio.bufferProgress(), qreal(0.0)); + + provider.playerControl()->setBufferStatus(20); + QCOMPARE(audio.bufferProgress(), qreal(0.2)); + QCOMPARE(spy.count(), 1); + + provider.playerControl()->setBufferStatus(20); + QCOMPARE(audio.bufferProgress(), qreal(0.2)); + QCOMPARE(spy.count(), 2); + + provider.playerControl()->setBufferStatus(40); + QCOMPARE(audio.bufferProgress(), qreal(0.4)); + QCOMPARE(spy.count(), 3); + + connect(&audio, SIGNAL(positionChanged()), &QTestEventLoop::instance(), SLOT(exitLoop())); + + provider.playerControl()->updateMediaStatus( + QMediaPlayer::BufferingMedia, QMediaPlayer::PlayingState); + QTestEventLoop::instance().enterLoop(1); + QVERIFY(spy.count() > 3 && spy.count() < 6); // 4 or 5 + + provider.playerControl()->updateMediaStatus(QMediaPlayer::BufferedMedia); + QTestEventLoop::instance().enterLoop(1); + QVERIFY(spy.count() < 6); +} + +void tst_QmlAudio::seekable() +{ + QtTestMediaServiceProvider provider; + QmlAudio audio; + + QSignalSpy spy(&audio, SIGNAL(seekableChanged())); + + QCOMPARE(audio.isSeekable(), false); + + provider.playerControl()->setSeekable(true); + QCOMPARE(audio.isSeekable(), true); + QCOMPARE(spy.count(), 1); + + provider.playerControl()->setSeekable(true); + QCOMPARE(audio.isSeekable(), true); + QCOMPARE(spy.count(), 2); + + provider.playerControl()->setSeekable(false); + QCOMPARE(audio.isSeekable(), false); + QCOMPARE(spy.count(), 3); +} + +void tst_QmlAudio::playbackRate() +{ + QtTestMediaServiceProvider provider; + QmlAudio audio; + + QSignalSpy spy(&audio, SIGNAL(playbackRateChanged())); + + QCOMPARE(audio.playbackRate(), qreal(1.0)); + + audio.setPlaybackRate(0.5); + QCOMPARE(audio.playbackRate(), qreal(0.5)); + QCOMPARE(provider.playerControl()->playbackRate(), qreal(0.5)); + QCOMPARE(spy.count(), 1); + + provider.playerControl()->setPlaybackRate(2.0); + QCOMPARE(provider.playerControl()->playbackRate(), qreal(2.0)); + QCOMPARE(spy.count(), 2); + + audio.setPlaybackRate(2.0); + QCOMPARE(audio.playbackRate(), qreal(2.0)); + QCOMPARE(provider.playerControl()->playbackRate(), qreal(2.0)); + QCOMPARE(spy.count(), 3); +} + +void tst_QmlAudio::status() +{ + QtTestMediaServiceProvider provider; + QmlAudio audio; + + QSignalSpy statusChangedSpy(&audio, SIGNAL(statusChanged())); + QSignalSpy loadedSpy(&audio, SIGNAL(loaded())); + QSignalSpy bufferingSpy(&audio, SIGNAL(buffering())); + QSignalSpy stalledSpy(&audio, SIGNAL(stalled())); + QSignalSpy bufferedSpy(&audio, SIGNAL(buffered())); + QSignalSpy endOfMediaSpy(&audio, SIGNAL(endOfMedia())); + + QCOMPARE(audio.status(), QmlAudio::NoMedia); + + // Set media, start loading. + provider.playerControl()->updateMediaStatus(QMediaPlayer::LoadingMedia); + QCOMPARE(audio.status(), QmlAudio::Loading); + QCOMPARE(statusChangedSpy.count(), 1); + QCOMPARE(loadedSpy.count(), 0); + QCOMPARE(bufferingSpy.count(), 0); + QCOMPARE(stalledSpy.count(), 0); + QCOMPARE(bufferedSpy.count(), 0); + QCOMPARE(endOfMediaSpy.count(), 0); + + // Finish loading. + provider.playerControl()->updateMediaStatus(QMediaPlayer::LoadedMedia); + QCOMPARE(audio.status(), QmlAudio::Loaded); + QCOMPARE(statusChangedSpy.count(), 2); + QCOMPARE(loadedSpy.count(), 1); + QCOMPARE(bufferingSpy.count(), 0); + QCOMPARE(stalledSpy.count(), 0); + QCOMPARE(bufferedSpy.count(), 0); + QCOMPARE(endOfMediaSpy.count(), 0); + + // Play, start buffering. + provider.playerControl()->updateMediaStatus( + QMediaPlayer::StalledMedia, QMediaPlayer::PlayingState); + QCOMPARE(audio.status(), QmlAudio::Stalled); + QCOMPARE(statusChangedSpy.count(), 3); + QCOMPARE(loadedSpy.count(), 1); + QCOMPARE(bufferingSpy.count(), 0); + QCOMPARE(stalledSpy.count(), 1); + QCOMPARE(bufferedSpy.count(), 0); + QCOMPARE(endOfMediaSpy.count(), 0); + + // Enough data buffered to proceed. + provider.playerControl()->updateMediaStatus(QMediaPlayer::BufferingMedia); + QCOMPARE(audio.status(), QmlAudio::Buffering); + QCOMPARE(statusChangedSpy.count(), 4); + QCOMPARE(loadedSpy.count(), 1); + QCOMPARE(bufferingSpy.count(), 1); + QCOMPARE(stalledSpy.count(), 1); + QCOMPARE(bufferedSpy.count(), 0); + QCOMPARE(endOfMediaSpy.count(), 0); + + // Errant second buffering status changed. + provider.playerControl()->updateMediaStatus(QMediaPlayer::BufferingMedia); + QCOMPARE(audio.status(), QmlAudio::Buffering); + QCOMPARE(statusChangedSpy.count(), 4); + QCOMPARE(loadedSpy.count(), 1); + QCOMPARE(bufferingSpy.count(), 1); + QCOMPARE(stalledSpy.count(), 1); + QCOMPARE(bufferedSpy.count(), 0); + QCOMPARE(endOfMediaSpy.count(), 0); + + // Buffer full. + provider.playerControl()->updateMediaStatus(QMediaPlayer::BufferedMedia); + QCOMPARE(audio.status(), QmlAudio::Buffered); + QCOMPARE(statusChangedSpy.count(), 5); + QCOMPARE(loadedSpy.count(), 1); + QCOMPARE(bufferingSpy.count(), 1); + QCOMPARE(stalledSpy.count(), 1); + QCOMPARE(bufferedSpy.count(), 1); + QCOMPARE(endOfMediaSpy.count(), 0); + + // Buffer getting low. + provider.playerControl()->updateMediaStatus(QMediaPlayer::BufferingMedia); + QCOMPARE(audio.status(), QmlAudio::Buffering); + QCOMPARE(statusChangedSpy.count(), 6); + QCOMPARE(loadedSpy.count(), 1); + QCOMPARE(bufferingSpy.count(), 2); + QCOMPARE(stalledSpy.count(), 1); + QCOMPARE(bufferedSpy.count(), 1); + QCOMPARE(endOfMediaSpy.count(), 0); + + // Buffer full. + provider.playerControl()->updateMediaStatus(QMediaPlayer::BufferedMedia); + QCOMPARE(audio.status(), QmlAudio::Buffered); + QCOMPARE(statusChangedSpy.count(), 7); + QCOMPARE(loadedSpy.count(), 1); + QCOMPARE(bufferingSpy.count(), 2); + QCOMPARE(stalledSpy.count(), 1); + QCOMPARE(bufferedSpy.count(), 2); + QCOMPARE(endOfMediaSpy.count(), 0); + + // Finished. + provider.playerControl()->updateMediaStatus( + QMediaPlayer::EndOfMedia, QMediaPlayer::StoppedState); + QCOMPARE(audio.status(), QmlAudio::EndOfMedia); + QCOMPARE(statusChangedSpy.count(), 8); + QCOMPARE(loadedSpy.count(), 1); + QCOMPARE(bufferingSpy.count(), 2); + QCOMPARE(stalledSpy.count(), 1); + QCOMPARE(bufferedSpy.count(), 2); + QCOMPARE(endOfMediaSpy.count(), 1); +} + +void tst_QmlAudio::metaData_data() +{ + QTest::addColumn<QByteArray>("propertyName"); + QTest::addColumn<QtMultimedia::MetaData>("propertyKey"); + QTest::addColumn<QVariant>("value1"); + QTest::addColumn<QVariant>("value2"); + + QTest::newRow("title") + << QByteArray("title") + << QtMultimedia::Title + << QVariant(QString::fromLatin1("This is a title")) + << QVariant(QString::fromLatin1("This is another title")); + + QTest::newRow("genre") + << QByteArray("genre") + << QtMultimedia::Genre + << QVariant(QString::fromLatin1("rock")) + << QVariant(QString::fromLatin1("pop")); + + QTest::newRow("trackNumber") + << QByteArray("trackNumber") + << QtMultimedia::TrackNumber + << QVariant(8) + << QVariant(12); +} + +void tst_QmlAudio::metaData() +{ + QFETCH(QByteArray, propertyName); + QFETCH(QtMultimedia::MetaData, propertyKey); + QFETCH(QVariant, value1); + QFETCH(QVariant, value2); + + QtTestMediaServiceProvider provider; + QmlAudio audio; + + QSignalSpy spy(&audio, SIGNAL(__metaDataChanged())); + + const int index = audio.metaObject()->indexOfProperty(propertyName.constData()); + QVERIFY(index != -1); + + QMetaProperty property = audio.metaObject()->property(index); + QCOMPARE(property.read(&audio), QVariant()); + + property.write(&audio, value1); + QCOMPARE(property.read(&audio), value1); + QCOMPARE(provider.metaDataControl()->metaData(propertyKey), value1); + QCOMPARE(spy.count(), 1); + + provider.metaDataControl()->setMetaData(propertyKey, value2); + QCOMPARE(property.read(&audio), value2); + QCOMPARE(spy.count(), 2); +} + +void tst_QmlAudio::error() +{ + const QString errorString = QLatin1String("Failed to open device."); + + QtTestMediaServiceProvider provider; + QmlAudio audio; + + QSignalSpy errorSpy(&audio, SIGNAL(error(QmlAudio::Error,QString))); + QSignalSpy errorChangedSpy(&audio, SIGNAL(errorChanged())); + + QCOMPARE(audio.error(), QmlAudio::NoError); + QCOMPARE(audio.errorString(), QString()); + + provider.playerControl()->emitError(QMediaPlayer::ResourceError, errorString); + + QCOMPARE(audio.error(), QmlAudio::ResourceError); + QCOMPARE(audio.errorString(), errorString); + QCOMPARE(errorSpy.count(), 1); + QCOMPARE(errorChangedSpy.count(), 1); + + // Changing the source resets the error properties. + audio.setSource(QUrl("http://example.com")); + QCOMPARE(audio.error(), QmlAudio::NoError); + QCOMPARE(audio.errorString(), QString()); + QCOMPARE(errorSpy.count(), 1); + QCOMPARE(errorChangedSpy.count(), 2); + + // But isn't noisy. + audio.setSource(QUrl("file:///file/path")); + QCOMPARE(audio.error(), QmlAudio::NoError); + QCOMPARE(audio.errorString(), QString()); + QCOMPARE(errorSpy.count(), 1); + QCOMPARE(errorChangedSpy.count(), 2); +} + + +QTEST_MAIN(tst_QmlAudio) + +#include "tst_qmlaudio.moc" diff --git a/tests/auto/qmlgraphicsvideo/qmlgraphicsvideo.pro b/tests/auto/qmlgraphicsvideo/qmlgraphicsvideo.pro new file mode 100644 index 0000000..0a83124 --- /dev/null +++ b/tests/auto/qmlgraphicsvideo/qmlgraphicsvideo.pro @@ -0,0 +1,6 @@ +load(qttest_p4) +SOURCES += tst_qmlgraphicsvideo.cpp + +QT += multimedia declarative +requires(contains(QT_CONFIG, multimedia)) +requires(contains(QT_CONFIG, declarative)) diff --git a/tests/auto/qmlgraphicsvideo/tst_qmlgraphicsvideo.cpp b/tests/auto/qmlgraphicsvideo/tst_qmlgraphicsvideo.cpp new file mode 100644 index 0000000..0da094d --- /dev/null +++ b/tests/auto/qmlgraphicsvideo/tst_qmlgraphicsvideo.cpp @@ -0,0 +1,911 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (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 Technology Preview License Agreement accompanying +** this package. +** +** 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.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <QtTest/QtTest> + +#include <QtMultimedia/private/qmlgraphicsvideo_p.h> + +#include <QtGui/qapplication.h> +#include <QtMultimedia/qabstractvideosurface.h> +#include <QtMultimedia/qgraphicsvideoitem.h> +#include <QtMultimedia/qmediaplayercontrol.h> +#include <QtMultimedia/qmediaservice.h> +#include <QtMultimedia/qvideooutputcontrol.h> +#include <QtMultimedia/qvideorenderercontrol.h> +#include <QtMultimedia/qvideosurfaceformat.h> + + +class tst_QmlGraphicsVideo : public QObject +{ + Q_OBJECT +public slots: + void initTestCase(); + +private slots: + void nullPlayerControl(); + void nullService(); + + void playing(); + void paused(); + void error(); + + void hasAudio(); + void hasVideo(); + void fillMode(); + void geometry(); +}; + +Q_DECLARE_METATYPE(QtMultimedia::MetaData); +Q_DECLARE_METATYPE(QmlGraphicsVideo::Error); + +class QtTestMediaPlayerControl : public QMediaPlayerControl +{ + Q_OBJECT +public: + QtTestMediaPlayerControl(QObject *parent = 0) + : QMediaPlayerControl(parent) + , m_state(QMediaPlayer::StoppedState) + , m_mediaStatus(QMediaPlayer::NoMedia) + , m_duration(0) + , m_position(0) + , m_playbackRate(1.0) + , m_volume(50) + , m_bufferStatus(0) + , m_muted(false) + , m_audioAvailable(false) + , m_videoAvailable(false) + , m_seekable(false) + { + } + + QMediaPlayer::State state() const { return m_state; } + void updateState(QMediaPlayer::State state) { emit stateChanged(m_state = state); } + + QMediaPlayer::MediaStatus mediaStatus() const { return m_mediaStatus; } + void updateMediaStatus(QMediaPlayer::MediaStatus status) { + emit mediaStatusChanged(m_mediaStatus = status); } + void updateMediaStatus(QMediaPlayer::MediaStatus status, QMediaPlayer::State state) + { + m_mediaStatus = status; + m_state = state; + + emit mediaStatusChanged(m_mediaStatus); + emit stateChanged(m_state); + } + + qint64 duration() const { return m_duration; } + void setDuration(qint64 duration) { emit durationChanged(m_duration = duration); } + + qint64 position() const { return m_position; } + void setPosition(qint64 position) { emit positionChanged(m_position = position); } + + int volume() const { return m_volume; } + void setVolume(int volume) { emit volumeChanged(m_volume = volume); } + + bool isMuted() const { return m_muted; } + void setMuted(bool muted) { emit mutedChanged(m_muted = muted); } + + int bufferStatus() const { return m_bufferStatus; } + void setBufferStatus(int status) { emit bufferStatusChanged(m_bufferStatus = status); } + + bool isAudioAvailable() const { return m_audioAvailable; } + void setAudioAvailable(bool available) { + emit audioAvailableChanged(m_audioAvailable = available); } + bool isVideoAvailable() const { return m_videoAvailable; } + void setVideoAvailable(bool available) { + emit videoAvailableChanged(m_videoAvailable = available); } + + bool isSeekable() const { return m_seekable; } + void setSeekable(bool seekable) { emit seekableChanged(m_seekable = seekable); } + + QMediaTimeRange availablePlaybackRanges() const { return QMediaTimeRange(); } + + qreal playbackRate() const { return m_playbackRate; } + void setPlaybackRate(qreal rate) { emit playbackRateChanged(m_playbackRate = rate); } + + QMediaContent media() const { return m_media; } + const QIODevice *mediaStream() const { return 0; } + void setMedia(const QMediaContent &media, QIODevice *) + { + m_media = media; + + m_mediaStatus = m_media.isNull() + ? QMediaPlayer::NoMedia + : QMediaPlayer::LoadingMedia; + + emit mediaChanged(m_media); + emit mediaStatusChanged(m_mediaStatus); + } + + void play() { emit stateChanged(m_state = QMediaPlayer::PlayingState); } + void pause() { emit stateChanged(m_state = QMediaPlayer::PausedState); } + void stop() { emit stateChanged(m_state = QMediaPlayer::StoppedState); } + + void emitError(QMediaPlayer::Error err, const QString &errorString) { + emit error(err, errorString); } + +private: + QMediaPlayer::State m_state; + QMediaPlayer::MediaStatus m_mediaStatus; + qint64 m_duration; + qint64 m_position; + qreal m_playbackRate; + int m_volume; + int m_bufferStatus; + bool m_muted; + bool m_audioAvailable; + bool m_videoAvailable; + bool m_seekable; + QMediaContent m_media; +}; + +class QtTestOutputControl : public QVideoOutputControl +{ +public: + QtTestOutputControl(QObject *parent) : QVideoOutputControl(parent), m_output(NoOutput) {} + + QList<Output> availableOutputs() const { return m_outputs; } + void setAvailableOutputs(const QList<Output> outputs) { m_outputs = outputs; } + + Output output() const { return m_output; } + virtual void setOutput(Output output) { m_output = output; } + +private: + Output m_output; + QList<Output> m_outputs; +}; + +class QtTestRendererControl : public QVideoRendererControl +{ +public: + QtTestRendererControl(QObject *parent ) : QVideoRendererControl(parent), m_surface(0) {} + + QAbstractVideoSurface *surface() const { return m_surface; } + void setSurface(QAbstractVideoSurface *surface) { m_surface = surface; } + +private: + QAbstractVideoSurface *m_surface; +}; + +class QtTestMediaService : public QMediaService +{ + Q_OBJECT +public: + QtTestMediaService( + QtTestMediaPlayerControl *playerControl, + QtTestOutputControl *outputControl, + QtTestRendererControl *rendererControl, + QObject *parent) + : QMediaService(parent) + , playerControl(playerControl) + , outputControl(outputControl) + , rendererControl(rendererControl) + { + } + + QMediaControl *control(const char *name) const + { + if (qstrcmp(name, QMediaPlayerControl_iid) == 0) + return playerControl; + else if (qstrcmp(name, QVideoOutputControl_iid) == 0) + return outputControl; + else if (qstrcmp(name, QVideoRendererControl_iid) == 0) + return rendererControl; + else + return 0; + } + + QtTestMediaPlayerControl *playerControl; + QtTestOutputControl *outputControl; + QtTestRendererControl *rendererControl; +}; + +class QtTestMediaServiceProvider : public QMediaServiceProvider +{ + Q_OBJECT +public: + QtTestMediaServiceProvider() + : service(new QtTestMediaService( + new QtTestMediaPlayerControl(this), + new QtTestOutputControl(this), + new QtTestRendererControl(this), + this)) + { + setDefaultServiceProvider(this); + } + + QtTestMediaServiceProvider(QtTestMediaService *service) + : service(service) + { + setDefaultServiceProvider(this); + } + + QtTestMediaServiceProvider( + QtTestMediaPlayerControl *playerControl, + QtTestOutputControl *outputControl, + QtTestRendererControl *rendererControl) + : service(new QtTestMediaService(playerControl, outputControl, rendererControl, this)) + { + setDefaultServiceProvider(this); + } + + ~QtTestMediaServiceProvider() + { + setDefaultServiceProvider(0); + } + + QMediaService *requestService( + const QByteArray &type, + const QMediaServiceProviderHint & = QMediaServiceProviderHint()) + { + requestedService = type; + + return service; + } + + void releaseService(QMediaService *) {} + + inline QtTestMediaPlayerControl *playerControl() { return service->playerControl; } + inline QtTestRendererControl *rendererControl() { return service->rendererControl; } + + QtTestMediaService *service; + QByteArray requestedService; +}; + + +void tst_QmlGraphicsVideo::initTestCase() +{ + qRegisterMetaType<QmlGraphicsVideo::Error>(); +} + +void tst_QmlGraphicsVideo::nullPlayerControl() +{ + QtTestMediaServiceProvider provider(0, 0, 0); + + QmlGraphicsVideo video; + + QCOMPARE(video.source(), QUrl()); + video.setSource(QUrl("http://example.com")); + QCOMPARE(video.source(), QUrl()); + + QCOMPARE(video.isPlaying(), false); + video.setPlaying(true); + QCOMPARE(video.isPlaying(), false); + video.play(); + QCOMPARE(video.isPlaying(), false); + + QCOMPARE(video.isPaused(), false); + video.pause(); + QCOMPARE(video.isPaused(), false); + video.setPaused(true); + QCOMPARE(video.isPaused(), true); + + QCOMPARE(video.duration(), 0); + + QCOMPARE(video.position(), 0); + video.setPosition(10000); + QCOMPARE(video.position(), 0); + + QCOMPARE(video.volume(), qreal(0)); + video.setVolume(50); + QCOMPARE(video.volume(), qreal(0)); + + QCOMPARE(video.isMuted(), false); + video.setMuted(true); + QCOMPARE(video.isMuted(), false); + + QCOMPARE(video.bufferProgress(), qreal(0)); + + QCOMPARE(video.isSeekable(), false); + + QCOMPARE(video.playbackRate(), qreal(1.0)); + + QCOMPARE(video.hasAudio(), false); + QCOMPARE(video.hasVideo(), false); + + QCOMPARE(video.status(), QmlGraphicsVideo::NoMedia); + + QCOMPARE(video.error(), QmlGraphicsVideo::ServiceMissing); +} + +void tst_QmlGraphicsVideo::nullService() +{ + QtTestMediaServiceProvider provider(0); + + QmlGraphicsVideo video; + + QCOMPARE(video.source(), QUrl()); + video.setSource(QUrl("http://example.com")); + QCOMPARE(video.source(), QUrl()); + + QCOMPARE(video.isPlaying(), false); + video.setPlaying(true); + QCOMPARE(video.isPlaying(), false); + video.play(); + QCOMPARE(video.isPlaying(), false); + + QCOMPARE(video.isPaused(), false); + video.pause(); + QCOMPARE(video.isPaused(), false); + video.setPaused(true); + QCOMPARE(video.isPaused(), true); + + QCOMPARE(video.duration(), 0); + + QCOMPARE(video.position(), 0); + video.setPosition(10000); + QCOMPARE(video.position(), 0); + + QCOMPARE(video.volume(), qreal(0)); + video.setVolume(50); + QCOMPARE(video.volume(), qreal(0)); + + QCOMPARE(video.isMuted(), false); + video.setMuted(true); + QCOMPARE(video.isMuted(), false); + + QCOMPARE(video.bufferProgress(), qreal(0)); + + QCOMPARE(video.isSeekable(), false); + + QCOMPARE(video.playbackRate(), qreal(1.0)); + + QCOMPARE(video.hasAudio(), false); + QCOMPARE(video.hasVideo(), false); + + QCOMPARE(video.status(), QmlGraphicsVideo::NoMedia); + + QCOMPARE(video.error(), QmlGraphicsVideo::ServiceMissing); + + QCOMPARE(video.metaObject()->indexOfProperty("title"), -1); + QCOMPARE(video.metaObject()->indexOfProperty("genre"), -1); + QCOMPARE(video.metaObject()->indexOfProperty("description"), -1); +} + +void tst_QmlGraphicsVideo::playing() +{ + QtTestMediaServiceProvider provider; + QmlGraphicsVideo video; + + QSignalSpy playingChangedSpy(&video, SIGNAL(playingChanged())); + QSignalSpy startedSpy(&video, SIGNAL(started())); + QSignalSpy stoppedSpy(&video, SIGNAL(stopped())); + + int playingChanged = 0; + int started = 0; + int stopped = 0; + + QCOMPARE(video.isPlaying(), false); + + // setPlaying(true) when stopped. + video.setPlaying(true); + QCOMPARE(video.isPlaying(), true); + QCOMPARE(provider.playerControl()->state(), QMediaPlayer::PlayingState); + QCOMPARE(playingChangedSpy.count(), ++playingChanged); + QCOMPARE(startedSpy.count(), ++started); + QCOMPARE(stoppedSpy.count(), stopped); + + // setPlaying(false) when playing. + video.setPlaying(false); + QCOMPARE(video.isPlaying(), false); + QCOMPARE(provider.playerControl()->state(), QMediaPlayer::StoppedState); + QCOMPARE(playingChangedSpy.count(), ++playingChanged); + QCOMPARE(startedSpy.count(), started); + QCOMPARE(stoppedSpy.count(), ++stopped); + + // play() when stopped. + video.play(); + QCOMPARE(video.isPlaying(), true); + QCOMPARE(provider.playerControl()->state(), QMediaPlayer::PlayingState); + QCOMPARE(playingChangedSpy.count(), ++playingChanged); + QCOMPARE(startedSpy.count(), ++started); + QCOMPARE(stoppedSpy.count(), stopped); + + // stop() when playing. + video.stop(); + QCOMPARE(video.isPlaying(), false); + QCOMPARE(provider.playerControl()->state(), QMediaPlayer::StoppedState); + QCOMPARE(playingChangedSpy.count(), ++playingChanged); + QCOMPARE(startedSpy.count(), started); + QCOMPARE(stoppedSpy.count(), ++stopped); + + // stop() when stopped. + video.stop(); + QCOMPARE(video.isPlaying(), false); + QCOMPARE(provider.playerControl()->state(), QMediaPlayer::StoppedState); + QCOMPARE(playingChangedSpy.count(), playingChanged); + QCOMPARE(startedSpy.count(), started); + QCOMPARE(stoppedSpy.count(), stopped); + + // setPlaying(false) when stopped. + video.setPlaying(false); + QCOMPARE(video.isPlaying(), false); + QCOMPARE(provider.playerControl()->state(), QMediaPlayer::StoppedState); + QCOMPARE(playingChangedSpy.count(), playingChanged); + QCOMPARE(startedSpy.count(), started); + QCOMPARE(stoppedSpy.count(), stopped); + + video.setPlaying(true); + QCOMPARE(video.isPlaying(), true); + QCOMPARE(provider.playerControl()->state(), QMediaPlayer::PlayingState); + QCOMPARE(playingChangedSpy.count(), ++playingChanged); + QCOMPARE(startedSpy.count(), ++started); + QCOMPARE(stoppedSpy.count(), stopped); + + // setPlaying(true) when playing. + video.setPlaying(true); + QCOMPARE(video.isPlaying(), true); + QCOMPARE(provider.playerControl()->state(), QMediaPlayer::PlayingState); + QCOMPARE(playingChangedSpy.count(), playingChanged); + QCOMPARE(startedSpy.count(), started); + QCOMPARE(stoppedSpy.count(), stopped); + + // play() when playing. + video.play(); + QCOMPARE(video.isPlaying(), true); + QCOMPARE(provider.playerControl()->state(), QMediaPlayer::PlayingState); + QCOMPARE(playingChangedSpy.count(), playingChanged); + QCOMPARE(startedSpy.count(), started); + QCOMPARE(stoppedSpy.count(), stopped); +} + +void tst_QmlGraphicsVideo::paused() +{ + QtTestMediaServiceProvider provider; + QmlGraphicsVideo video; + + QSignalSpy playingChangedSpy(&video, SIGNAL(playingChanged())); + QSignalSpy pausedChangedSpy(&video, SIGNAL(pausedChanged())); + QSignalSpy startedSpy(&video, SIGNAL(started())); + QSignalSpy pausedSpy(&video, SIGNAL(paused())); + QSignalSpy resumedSpy(&video, SIGNAL(resumed())); + QSignalSpy stoppedSpy(&video, SIGNAL(stopped())); + + int playingChanged = 0; + int pausedChanged = 0; + int started = 0; + int paused = 0; + int resumed = 0; + int stopped = 0; + + QCOMPARE(video.isPlaying(), false); + QCOMPARE(video.isPaused(), false); + + // setPlaying(true) when stopped. + video.setPlaying(true); + QCOMPARE(video.isPlaying(), true); + QCOMPARE(video.isPaused(), false); + QCOMPARE(provider.playerControl()->state(), QMediaPlayer::PlayingState); + QCOMPARE(playingChangedSpy.count(), ++playingChanged); + QCOMPARE(pausedChangedSpy.count(), pausedChanged); + QCOMPARE(startedSpy.count(), ++started); + QCOMPARE(pausedSpy.count(), paused); + QCOMPARE(resumedSpy.count(), resumed); + QCOMPARE(stoppedSpy.count(), stopped); + + // setPaused(true) when playing. + video.setPaused(true); + QCOMPARE(video.isPlaying(), true); + QCOMPARE(video.isPaused(), true); + QCOMPARE(provider.playerControl()->state(), QMediaPlayer::PausedState); + QCOMPARE(playingChangedSpy.count(), playingChanged); + QCOMPARE(pausedChangedSpy.count(), ++pausedChanged); + QCOMPARE(startedSpy.count(), started); + QCOMPARE(pausedSpy.count(), ++paused); + QCOMPARE(resumedSpy.count(), resumed); + QCOMPARE(stoppedSpy.count(), stopped); + + // setPaused(true) when paused. + video.setPaused(true); + QCOMPARE(video.isPlaying(), true); + QCOMPARE(video.isPaused(), true); + QCOMPARE(provider.playerControl()->state(), QMediaPlayer::PausedState); + QCOMPARE(playingChangedSpy.count(), playingChanged); + QCOMPARE(pausedChangedSpy.count(), pausedChanged); + QCOMPARE(startedSpy.count(), started); + QCOMPARE(pausedSpy.count(), paused); + QCOMPARE(resumedSpy.count(), resumed); + QCOMPARE(stoppedSpy.count(), stopped); + + // pause() when paused. + video.pause(); + QCOMPARE(video.isPlaying(), true); + QCOMPARE(video.isPaused(), true); + QCOMPARE(provider.playerControl()->state(), QMediaPlayer::PausedState); + QCOMPARE(playingChangedSpy.count(), playingChanged); + QCOMPARE(pausedChangedSpy.count(), pausedChanged); + QCOMPARE(startedSpy.count(), started); + QCOMPARE(pausedSpy.count(), paused); + QCOMPARE(resumedSpy.count(), resumed); + QCOMPARE(stoppedSpy.count(), stopped); + + // setPaused(false) when paused. + video.setPaused(false); + QCOMPARE(video.isPlaying(), true); + QCOMPARE(video.isPaused(), false); + QCOMPARE(provider.playerControl()->state(), QMediaPlayer::PlayingState); + QCOMPARE(playingChangedSpy.count(), playingChanged); + QCOMPARE(pausedChangedSpy.count(), ++pausedChanged); + QCOMPARE(startedSpy.count(), started); + QCOMPARE(pausedSpy.count(), paused); + QCOMPARE(resumedSpy.count(), ++resumed); + QCOMPARE(stoppedSpy.count(), stopped); + + // setPaused(false) when playing. + video.setPaused(false); + QCOMPARE(video.isPlaying(), true); + QCOMPARE(video.isPaused(), false); + QCOMPARE(provider.playerControl()->state(), QMediaPlayer::PlayingState); + QCOMPARE(playingChangedSpy.count(), playingChanged); + QCOMPARE(pausedChangedSpy.count(), pausedChanged); + QCOMPARE(startedSpy.count(), started); + QCOMPARE(pausedSpy.count(), paused); + QCOMPARE(resumedSpy.count(), resumed); + QCOMPARE(stoppedSpy.count(), stopped); + + // pause() when playing. + video.pause(); + QCOMPARE(video.isPlaying(), true); + QCOMPARE(video.isPaused(), true); + QCOMPARE(provider.playerControl()->state(), QMediaPlayer::PausedState); + QCOMPARE(playingChangedSpy.count(), playingChanged); + QCOMPARE(pausedChangedSpy.count(), ++pausedChanged); + QCOMPARE(startedSpy.count(), started); + QCOMPARE(pausedSpy.count(), ++paused); + QCOMPARE(resumedSpy.count(), resumed); + QCOMPARE(stoppedSpy.count(), stopped); + + // setPlaying(false) when paused. + video.setPlaying(false); + QCOMPARE(video.isPlaying(), false); + QCOMPARE(video.isPaused(), true); + QCOMPARE(provider.playerControl()->state(), QMediaPlayer::StoppedState); + QCOMPARE(playingChangedSpy.count(), ++playingChanged); + QCOMPARE(pausedChangedSpy.count(), pausedChanged); + QCOMPARE(startedSpy.count(), started); + QCOMPARE(pausedSpy.count(), paused); + QCOMPARE(resumedSpy.count(), resumed); + QCOMPARE(stoppedSpy.count(), ++stopped); + + // setPaused(true) when stopped and paused. + video.setPaused(true); + QCOMPARE(video.isPlaying(), false); + QCOMPARE(video.isPaused(), true); + QCOMPARE(provider.playerControl()->state(), QMediaPlayer::StoppedState); + QCOMPARE(playingChangedSpy.count(), playingChanged); + QCOMPARE(pausedChangedSpy.count(), pausedChanged); + QCOMPARE(startedSpy.count(), started); + QCOMPARE(pausedSpy.count(), paused); + QCOMPARE(resumedSpy.count(), resumed); + QCOMPARE(stoppedSpy.count(), stopped); + + // setPaused(false) when stopped and paused. + video.setPaused(false); + QCOMPARE(video.isPlaying(), false); + QCOMPARE(video.isPaused(), false); + QCOMPARE(provider.playerControl()->state(), QMediaPlayer::StoppedState); + QCOMPARE(playingChangedSpy.count(), playingChanged); + QCOMPARE(pausedChangedSpy.count(), ++pausedChanged); + QCOMPARE(startedSpy.count(), started); + QCOMPARE(pausedSpy.count(), paused); + QCOMPARE(resumedSpy.count(), resumed); + QCOMPARE(stoppedSpy.count(), stopped); + + // setPaused(true) when stopped. + video.setPaused(true); + QCOMPARE(video.isPlaying(), false); + QCOMPARE(video.isPaused(), true); + QCOMPARE(provider.playerControl()->state(), QMediaPlayer::StoppedState); + QCOMPARE(playingChangedSpy.count(), playingChanged); + QCOMPARE(pausedChangedSpy.count(), ++pausedChanged); + QCOMPARE(startedSpy.count(), started); + QCOMPARE(pausedSpy.count(), paused); + QCOMPARE(resumedSpy.count(), resumed); + QCOMPARE(stoppedSpy.count(), stopped); + + // setPlaying(true) when stopped and paused. + video.setPlaying(true); + QCOMPARE(video.isPlaying(), true); + QCOMPARE(video.isPaused(), true); + QCOMPARE(provider.playerControl()->state(), QMediaPlayer::PausedState); + QCOMPARE(playingChangedSpy.count(), ++playingChanged); + QCOMPARE(pausedChangedSpy.count(), pausedChanged); + QCOMPARE(startedSpy.count(), ++started); + QCOMPARE(pausedSpy.count(), ++paused); + QCOMPARE(resumedSpy.count(), resumed); + QCOMPARE(stoppedSpy.count(), stopped); + + // play() when paused. + video.play(); + QCOMPARE(video.isPlaying(), true); + QCOMPARE(video.isPaused(), false); + QCOMPARE(provider.playerControl()->state(), QMediaPlayer::PlayingState); + QCOMPARE(playingChangedSpy.count(), playingChanged); + QCOMPARE(pausedChangedSpy.count(), ++pausedChanged); + QCOMPARE(startedSpy.count(), started); + QCOMPARE(pausedSpy.count(), paused); + QCOMPARE(resumedSpy.count(), ++resumed); + QCOMPARE(stoppedSpy.count(), stopped); + + // setPaused(true) when playing. + video.setPaused(true); + QCOMPARE(video.isPlaying(), true); + QCOMPARE(video.isPaused(), true); + QCOMPARE(provider.playerControl()->state(), QMediaPlayer::PausedState); + QCOMPARE(playingChangedSpy.count(), playingChanged); + QCOMPARE(pausedChangedSpy.count(), ++pausedChanged); + QCOMPARE(startedSpy.count(), started); + QCOMPARE(pausedSpy.count(), ++paused); + QCOMPARE(resumedSpy.count(), resumed); + QCOMPARE(stoppedSpy.count(), stopped); + + // stop() when paused. + video.stop(); + QCOMPARE(video.isPlaying(), false); + QCOMPARE(video.isPaused(), false); + QCOMPARE(provider.playerControl()->state(), QMediaPlayer::StoppedState); + QCOMPARE(playingChangedSpy.count(), ++playingChanged); + QCOMPARE(pausedChangedSpy.count(), ++pausedChanged); + QCOMPARE(startedSpy.count(), started); + QCOMPARE(pausedSpy.count(), paused); + QCOMPARE(resumedSpy.count(), resumed); + QCOMPARE(stoppedSpy.count(), ++stopped); + + // setPaused(true) when stopped. + video.setPaused(true); + QCOMPARE(video.isPlaying(), false); + QCOMPARE(video.isPaused(), true); + QCOMPARE(provider.playerControl()->state(), QMediaPlayer::StoppedState); + QCOMPARE(playingChangedSpy.count(), playingChanged); + QCOMPARE(pausedChangedSpy.count(), ++pausedChanged); + QCOMPARE(startedSpy.count(), started); + QCOMPARE(pausedSpy.count(), paused); + QCOMPARE(resumedSpy.count(), resumed); + QCOMPARE(stoppedSpy.count(), stopped); + + // stop() when stopped and paused. + video.stop(); + QCOMPARE(video.isPlaying(), false); + QCOMPARE(video.isPaused(), false); + QCOMPARE(provider.playerControl()->state(), QMediaPlayer::StoppedState); + QCOMPARE(playingChangedSpy.count(), playingChanged); + QCOMPARE(pausedChangedSpy.count(), ++pausedChanged); + QCOMPARE(startedSpy.count(), started); + QCOMPARE(pausedSpy.count(), paused); + QCOMPARE(resumedSpy.count(), resumed); + QCOMPARE(stoppedSpy.count(), stopped); + + // pause() when stopped. + video.pause(); + QCOMPARE(video.isPlaying(), true); + QCOMPARE(video.isPaused(), true); + QCOMPARE(provider.playerControl()->state(), QMediaPlayer::PausedState); + QCOMPARE(playingChangedSpy.count(), ++playingChanged); + QCOMPARE(pausedChangedSpy.count(), ++pausedChanged); + QCOMPARE(startedSpy.count(), ++started); + QCOMPARE(pausedSpy.count(), ++paused); + QCOMPARE(resumedSpy.count(), resumed); + QCOMPARE(stoppedSpy.count(), stopped); + + // setPlaying(false) when paused. + video.setPlaying(false); + QCOMPARE(video.isPlaying(), false); + QCOMPARE(video.isPaused(), true); + QCOMPARE(provider.playerControl()->state(), QMediaPlayer::StoppedState); + QCOMPARE(playingChangedSpy.count(), ++playingChanged); + QCOMPARE(pausedChangedSpy.count(), pausedChanged); + QCOMPARE(startedSpy.count(), started); + QCOMPARE(pausedSpy.count(), paused); + QCOMPARE(resumedSpy.count(), resumed); + QCOMPARE(stoppedSpy.count(), ++stopped); + + // pause() when stopped and paused. + video.pause(); + QCOMPARE(video.isPlaying(), true); + QCOMPARE(video.isPaused(), true); + QCOMPARE(provider.playerControl()->state(), QMediaPlayer::PausedState); + QCOMPARE(playingChangedSpy.count(), ++playingChanged); + QCOMPARE(pausedChangedSpy.count(), pausedChanged); + QCOMPARE(startedSpy.count(), ++started); + QCOMPARE(pausedSpy.count(), ++paused); + QCOMPARE(resumedSpy.count(), resumed); + QCOMPARE(stoppedSpy.count(), stopped); + + // setPlaying(false) when paused. + video.setPlaying(false); + QCOMPARE(video.isPlaying(), false); + QCOMPARE(video.isPaused(), true); + QCOMPARE(provider.playerControl()->state(), QMediaPlayer::StoppedState); + QCOMPARE(playingChangedSpy.count(), ++playingChanged); + QCOMPARE(pausedChangedSpy.count(), pausedChanged); + QCOMPARE(startedSpy.count(), started); + QCOMPARE(pausedSpy.count(), paused); + QCOMPARE(resumedSpy.count(), resumed); + QCOMPARE(stoppedSpy.count(), ++stopped); + + // play() when stopped and paused. + video.play(); + QCOMPARE(video.isPlaying(), true); + QCOMPARE(video.isPaused(), false); + QCOMPARE(provider.playerControl()->state(), QMediaPlayer::PlayingState); + QCOMPARE(playingChangedSpy.count(), ++playingChanged); + QCOMPARE(pausedChangedSpy.count(), ++pausedChanged); + QCOMPARE(startedSpy.count(), ++started); + QCOMPARE(pausedSpy.count(), paused); + QCOMPARE(resumedSpy.count(), resumed); + QCOMPARE(stoppedSpy.count(), stopped); +} + +void tst_QmlGraphicsVideo::error() +{ + const QString errorString = QLatin1String("Failed to open device."); + + QtTestMediaServiceProvider provider; + QmlGraphicsVideo video; + + QSignalSpy errorSpy(&video, SIGNAL(error(QmlGraphicsVideo::Error,QString))); + QSignalSpy errorChangedSpy(&video, SIGNAL(errorChanged())); + + QCOMPARE(video.error(), QmlGraphicsVideo::NoError); + QCOMPARE(video.errorString(), QString()); + + provider.playerControl()->emitError(QMediaPlayer::ResourceError, errorString); + + QCOMPARE(video.error(), QmlGraphicsVideo::ResourceError); + QCOMPARE(video.errorString(), errorString); + QCOMPARE(errorSpy.count(), 1); + QCOMPARE(errorChangedSpy.count(), 1); + + // Changing the source resets the error properties. + video.setSource(QUrl("http://example.com")); + QCOMPARE(video.error(), QmlGraphicsVideo::NoError); + QCOMPARE(video.errorString(), QString()); + QCOMPARE(errorSpy.count(), 1); + QCOMPARE(errorChangedSpy.count(), 2); + + // But isn't noisy. + video.setSource(QUrl("file:///file/path")); + QCOMPARE(video.error(), QmlGraphicsVideo::NoError); + QCOMPARE(video.errorString(), QString()); + QCOMPARE(errorSpy.count(), 1); + QCOMPARE(errorChangedSpy.count(), 2); +} + + +void tst_QmlGraphicsVideo::hasAudio() +{ + QtTestMediaServiceProvider provider; + QmlGraphicsVideo video; + + QSignalSpy spy(&video, SIGNAL(hasAudioChanged())); + + QCOMPARE(video.hasAudio(), false); + + provider.playerControl()->setAudioAvailable(true); + QCOMPARE(video.hasAudio(), true); + QCOMPARE(spy.count(), 1); + + provider.playerControl()->setAudioAvailable(true); + QCOMPARE(video.hasAudio(), true); + QCOMPARE(spy.count(), 2); + + provider.playerControl()->setAudioAvailable(false); + QCOMPARE(video.hasAudio(), false); + QCOMPARE(spy.count(), 3); +} + +void tst_QmlGraphicsVideo::hasVideo() +{ + QtTestMediaServiceProvider provider; + QmlGraphicsVideo video; + + QSignalSpy spy(&video, SIGNAL(hasVideoChanged())); + + QCOMPARE(video.hasVideo(), false); + + provider.playerControl()->setVideoAvailable(true); + QCOMPARE(video.hasVideo(), true); + QCOMPARE(spy.count(), 1); + + provider.playerControl()->setVideoAvailable(true); + QCOMPARE(video.hasVideo(), true); + QCOMPARE(spy.count(), 2); + + provider.playerControl()->setVideoAvailable(false); + QCOMPARE(video.hasVideo(), false); + QCOMPARE(spy.count(), 3); +} + +void tst_QmlGraphicsVideo::fillMode() +{ + QtTestMediaServiceProvider provider; + QmlGraphicsVideo video; + + QList<QGraphicsItem *> children = video.childItems(); + QCOMPARE(children.count(), 1); + QGraphicsVideoItem *videoItem = qgraphicsitem_cast<QGraphicsVideoItem *>(children.first()); + QVERIFY(videoItem != 0); + + QCOMPARE(video.fillMode(), QmlGraphicsVideo::PreserveAspectFit); + + video.setFillMode(QmlGraphicsVideo::PreserveAspectCrop); + QCOMPARE(video.fillMode(), QmlGraphicsVideo::PreserveAspectCrop); + QCOMPARE(videoItem->aspectRatioMode(), Qt::KeepAspectRatioByExpanding); + + video.setFillMode(QmlGraphicsVideo::Stretch); + QCOMPARE(video.fillMode(), QmlGraphicsVideo::Stretch); + QCOMPARE(videoItem->aspectRatioMode(), Qt::IgnoreAspectRatio); + + video.setFillMode(QmlGraphicsVideo::PreserveAspectFit); + QCOMPARE(video.fillMode(), QmlGraphicsVideo::PreserveAspectFit); + QCOMPARE(videoItem->aspectRatioMode(), Qt::KeepAspectRatio); +} + +void tst_QmlGraphicsVideo::geometry() +{ + QtTestMediaServiceProvider provider; + QmlGraphicsVideo video; + + QAbstractVideoSurface *surface = provider.rendererControl()->surface(); + QVERIFY(surface != 0); + + QList<QGraphicsItem *> children = video.childItems(); + QCOMPARE(children.count(), 1); + QGraphicsVideoItem *videoItem = qgraphicsitem_cast<QGraphicsVideoItem *>(children.first()); + QVERIFY(videoItem != 0); + + QVideoSurfaceFormat format(QSize(640, 480), QVideoFrame::Format_RGB32); + + QVERIFY(surface->start(format)); + + QCOMPARE(video.implicitWidth(), qreal(640)); + QCOMPARE(video.implicitHeight(), qreal(480)); + + video.setWidth(560); + video.setHeight(328); + + QCOMPARE(videoItem->size().width(), qreal(560)); + QCOMPARE(videoItem->size().height(), qreal(328)); +} + +QTEST_MAIN(tst_QmlGraphicsVideo) + +#include "tst_qmlgraphicsvideo.moc" diff --git a/tests/auto/qnetworkreply/tst_qnetworkreply.cpp b/tests/auto/qnetworkreply/tst_qnetworkreply.cpp index eec4797..cafeef0 100644 --- a/tests/auto/qnetworkreply/tst_qnetworkreply.cpp +++ b/tests/auto/qnetworkreply/tst_qnetworkreply.cpp @@ -82,6 +82,7 @@ Q_DECLARE_METATYPE(QNetworkProxy) Q_DECLARE_METATYPE(QNetworkProxyQuery) Q_DECLARE_METATYPE(QList<QNetworkProxy>) Q_DECLARE_METATYPE(QNetworkReply::NetworkError) +Q_DECLARE_METATYPE(QBuffer*) class QNetworkReplyPtr: public QSharedPointer<QNetworkReply> { @@ -129,6 +130,9 @@ public: QString runSimpleRequest(QNetworkAccessManager::Operation op, const QNetworkRequest &request, QNetworkReplyPtr &reply, const QByteArray &data = QByteArray()); + QString runCustomRequest(const QNetworkRequest &request, QNetworkReplyPtr &reply, + const QByteArray &verb, QIODevice *data); + public Q_SLOTS: void finished(); void gotError(); @@ -175,6 +179,8 @@ private Q_SLOTS: void deleteFromHttp(); void putGetDeleteGetFromHttp_data(); void putGetDeleteGetFromHttp(); + void sendCustomRequestToHttp_data(); + void sendCustomRequestToHttp(); void ioGetFromData_data(); void ioGetFromData(); @@ -257,6 +263,13 @@ private Q_SLOTS: void httpConnectionCount(); + void httpReUsingConnectionSequential_data(); + void httpReUsingConnectionSequential(); + void httpReUsingConnectionFromFinishedSlot_data(); + void httpReUsingConnectionFromFinishedSlot(); + + void httpRecursiveCreation(); + #ifndef QT_NO_OPENSSL void ioPostToHttpsUploadProgress(); void ignoreSslErrorsList_data(); @@ -312,18 +325,20 @@ QT_END_NAMESPACE QFAIL(qPrintable(errorMsg)); \ } while (0); + +// Does not work for POST/PUT! class MiniHttpServer: public QTcpServer { Q_OBJECT - QTcpSocket *client; - public: + QTcpSocket *client; // always the last one that was received QByteArray dataToTransmit; QByteArray receivedData; bool doClose; + bool multiple; int totalConnections; - MiniHttpServer(const QByteArray &data) : client(0), dataToTransmit(data), doClose(true), totalConnections(0) + MiniHttpServer(const QByteArray &data) : client(0), dataToTransmit(data), doClose(true), multiple(false), totalConnections(0) { listen(); connect(this, SIGNAL(newConnection()), this, SLOT(doAccept())); @@ -333,15 +348,21 @@ public slots: void doAccept() { client = nextPendingConnection(); + client->setParent(this); ++totalConnections; - connect(client, SIGNAL(readyRead()), this, SLOT(sendData())); + connect(client, SIGNAL(readyRead()), this, SLOT(readyReadSlot())); } - void sendData() + void readyReadSlot() { receivedData += client->readAll(); - if (receivedData.contains("\r\n\r\n") || - receivedData.contains("\n\n")) { + int doubleEndlPos = receivedData.indexOf("\r\n\r\n"); + + if (doubleEndlPos != -1) { + // multiple requests incoming. remove the bytes of the current one + if (multiple) + receivedData.remove(0, doubleEndlPos+4); + client->write(dataToTransmit); if (doClose) { client->disconnectFromHost(); @@ -778,6 +799,32 @@ QString tst_QNetworkReply::runSimpleRequest(QNetworkAccessManager::Operation op, return QString(); } +QString tst_QNetworkReply::runCustomRequest(const QNetworkRequest &request, + QNetworkReplyPtr &reply, + const QByteArray &verb, + QIODevice *data) +{ + reply = manager.sendCustomRequest(request, verb, data); + reply->setParent(this); + connect(reply, SIGNAL(finished()), SLOT(finished())); + connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), SLOT(gotError())); + + returnCode = Timeout; + loop = new QEventLoop; + QTimer::singleShot(20000, loop, SLOT(quit())); + int code = returnCode == Timeout ? loop->exec() : returnCode; + delete loop; + loop = 0; + + switch (code) { + case Failure: + return "Request failed: " + reply->errorString(); + case Timeout: + return "Network timeout"; + } + return QString(); +} + void tst_QNetworkReply::finished() { loop->exit(returnCode = Success); @@ -1436,6 +1483,57 @@ void tst_QNetworkReply::putGetDeleteGetFromHttp() } +void tst_QNetworkReply::sendCustomRequestToHttp_data() +{ + QTest::addColumn<QUrl>("url"); + QTest::addColumn<QByteArray>("verb"); + QTest::addColumn<QBuffer *>("device"); + QTest::addColumn<int>("resultCode"); + QTest::addColumn<QNetworkReply::NetworkError>("error"); + QTest::addColumn<QByteArray>("expectedContent"); + + QTest::newRow("options") << QUrl("http://" + QtNetworkSettings::serverName()) << + QByteArray("OPTIONS") << (QBuffer *) 0 << 200 << QNetworkReply::NoError << QByteArray(); + QTest::newRow("trace") << QUrl("http://" + QtNetworkSettings::serverName()) << + QByteArray("TRACE") << (QBuffer *) 0 << 200 << QNetworkReply::NoError << QByteArray(); + QTest::newRow("connect") << QUrl("http://" + QtNetworkSettings::serverName()) << + QByteArray("CONNECT") << (QBuffer *) 0 << 400 << QNetworkReply::UnknownContentError << QByteArray(); // 400 = Bad Request + QTest::newRow("nonsense") << QUrl("http://" + QtNetworkSettings::serverName()) << + QByteArray("NONSENSE") << (QBuffer *) 0 << 501 << QNetworkReply::ProtocolUnknownError << QByteArray(); // 501 = Method Not Implemented + + QByteArray ba("test"); + QBuffer *buffer = new QBuffer; + buffer->setData(ba); + buffer->open(QIODevice::ReadOnly); + QTest::newRow("post") << QUrl("http://" + QtNetworkSettings::serverName() + "/qtest/cgi-bin/md5sum.cgi") << QByteArray("POST") + << buffer << 200 << QNetworkReply::NoError << QByteArray("098f6bcd4621d373cade4e832627b4f6\n"); + + QByteArray ba2("test"); + QBuffer *buffer2 = new QBuffer; + buffer2->setData(ba2); + buffer2->open(QIODevice::ReadOnly); + QTest::newRow("put") << QUrl("http://" + QtNetworkSettings::serverName() + "/qtest/cgi-bin/md5sum.cgi") << QByteArray("PUT") + << buffer2 << 200 << QNetworkReply::NoError << QByteArray("098f6bcd4621d373cade4e832627b4f6\n"); +} + +void tst_QNetworkReply::sendCustomRequestToHttp() +{ + QFETCH(QUrl, url); + QNetworkRequest request(url); + QNetworkReplyPtr reply; + QFETCH(QByteArray, verb); + QFETCH(QBuffer *, device); + runCustomRequest(request, reply, verb, device); + QCOMPARE(reply->url(), url); + QFETCH(QNetworkReply::NetworkError, error); + QCOMPARE(reply->error(), error); + QFETCH(int, resultCode); + QCOMPARE(reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(), resultCode); + QFETCH(QByteArray, expectedContent); + if (! expectedContent.isEmpty()) + QCOMPARE(reply->readAll(), expectedContent); +} + void tst_QNetworkReply::ioGetFromData_data() { QTest::addColumn<QString>("urlStr"); @@ -2034,6 +2132,11 @@ void tst_QNetworkReply::ioGetFromHttpBrokenServer_data() QTest::newRow("invalid-version+disconnect") << QByteArray("HTTP/123 200 ") << true; QTest::newRow("invalid-version2+disconnect") << QByteArray("HTTP/a.\033 200 ") << true; QTest::newRow("invalid-reply-code+disconnect") << QByteArray("HTTP/1.0 fuu ") << true; + + QTest::newRow("immediate disconnect") << QByteArray("") << true; + QTest::newRow("justHalfStatus+disconnect") << QByteArray("HTTP/1.1") << true; + QTest::newRow("justStatus+disconnect") << QByteArray("HTTP/1.1 200 OK\r\n") << true; + QTest::newRow("justStatusAndHalfHeaders+disconnect") << QByteArray("HTTP/1.1 200 OK\r\nContent-L") << true; } void tst_QNetworkReply::ioGetFromHttpBrokenServer() @@ -3783,6 +3886,174 @@ void tst_QNetworkReply::httpConnectionCount() #endif } +void tst_QNetworkReply::httpReUsingConnectionSequential_data() +{ + QTest::addColumn<bool>("doDeleteLater"); + QTest::newRow("deleteLater") << true; + QTest::newRow("noDeleteLater") << false; +} + +void tst_QNetworkReply::httpReUsingConnectionSequential() +{ + QFETCH(bool, doDeleteLater); + + QByteArray response("HTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n"); + MiniHttpServer server(response); + server.multiple = true; + server.doClose = false; + + QUrl url; + url.setScheme("http"); + url.setPort(server.serverPort()); + url.setHost("127.0.0.1"); + // first request + QNetworkReply* reply1 = manager.get(QNetworkRequest(url)); + connect(reply1, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop())); + QTestEventLoop::instance().enterLoop(2); + QVERIFY(!QTestEventLoop::instance().timeout()); + QVERIFY(!reply1->error()); + int reply1port = server.client->peerPort(); + + if (doDeleteLater) + reply1->deleteLater(); + + // finished received, send the next one + QNetworkReply*reply2 = manager.get(QNetworkRequest(url)); + connect(reply2, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop())); + QTestEventLoop::instance().enterLoop(2); + QVERIFY(!QTestEventLoop::instance().timeout()); + QVERIFY(!reply2->error()); + int reply2port = server.client->peerPort(); // should still be the same object + + QVERIFY(reply1port > 0); + QCOMPARE(server.totalConnections, 1); + QCOMPARE(reply2port, reply1port); + + if (!doDeleteLater) + reply1->deleteLater(); // only do it if it was not done earlier + reply2->deleteLater(); +} + +class HttpReUsingConnectionFromFinishedSlot : public QObject { + Q_OBJECT; +public: + QNetworkReply* reply1; + QNetworkReply* reply2; + QUrl url; + QNetworkAccessManager manager; +public slots: + void finishedSlot() { + QVERIFY(!reply1->error()); + + QFETCH(bool, doDeleteLater); + if (doDeleteLater) { + reply1->deleteLater(); + reply1 = 0; + } + + // kick off 2nd request and exit the loop when it is done + reply2 = manager.get(QNetworkRequest(url)); + reply2->setParent(this); + connect(reply2, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop())); + } +}; + +void tst_QNetworkReply::httpReUsingConnectionFromFinishedSlot_data() +{ + httpReUsingConnectionSequential_data(); +} + +void tst_QNetworkReply::httpReUsingConnectionFromFinishedSlot() +{ + QByteArray response("HTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n"); + MiniHttpServer server(response); + server.multiple = true; + server.doClose = false; + + HttpReUsingConnectionFromFinishedSlot helper; + helper.reply1 = 0; + helper.reply2 = 0; + helper.url.setScheme("http"); + helper.url.setPort(server.serverPort()); + helper.url.setHost("127.0.0.1"); + + // first request + helper.reply1 = helper.manager.get(QNetworkRequest(helper.url)); + helper.reply1->setParent(&helper); + connect(helper.reply1, SIGNAL(finished()), &helper, SLOT(finishedSlot())); + QTestEventLoop::instance().enterLoop(4); + QVERIFY(!QTestEventLoop::instance().timeout()); + + QVERIFY(helper.reply2); + QVERIFY(!helper.reply2->error()); + + QCOMPARE(server.totalConnections, 1); +} + +class HttpRecursiveCreationHelper : public QObject { + Q_OBJECT +public: + + HttpRecursiveCreationHelper(): + QObject(0), + requestsStartedCount_finished(0), + requestsStartedCount_readyRead(0), + requestsFinishedCount(0) + { + } + QNetworkAccessManager manager; + int requestsStartedCount_finished; + int requestsStartedCount_readyRead; + int requestsFinishedCount; +public slots: + void finishedSlot() { + requestsFinishedCount++; + + QNetworkReply *reply = qobject_cast<QNetworkReply*>(sender()); + QVERIFY(!reply->error()); + QVERIFY(reply->bytesAvailable() == 27906); + + if (requestsFinishedCount == 60) { + QTestEventLoop::instance().exitLoop(); + return; + } + + if (requestsStartedCount_finished < 30) { + startOne(); + requestsStartedCount_finished++; + } + + reply->deleteLater(); + } + void readyReadSlot() { + QNetworkReply *reply = qobject_cast<QNetworkReply*>(sender()); + QVERIFY(!reply->error()); + + if (requestsStartedCount_readyRead < 30 && reply->bytesAvailable() > 27906/2) { + startOne(); + requestsStartedCount_readyRead++; + } + } + void startOne() { + QUrl url = "http://" + QtNetworkSettings::serverName() + "/gif/fluke.gif"; + QNetworkRequest request(url); + QNetworkReply *reply = manager.get(request); + reply->setParent(this); + connect(reply, SIGNAL(finished()), this, SLOT(finishedSlot())); + connect(reply, SIGNAL(readyRead()), this, SLOT(readyReadSlot())); + } +}; + +void tst_QNetworkReply::httpRecursiveCreation() +{ + // this test checks if creation of new requests to the same host properly works + // from readyRead() and finished() signals + HttpRecursiveCreationHelper helper; + helper.startOne(); + QTestEventLoop::instance().enterLoop(30); + QVERIFY(!QTestEventLoop::instance().timeout()); +} + #ifndef QT_NO_OPENSSL void tst_QNetworkReply::ignoreSslErrorsList_data() { diff --git a/tests/auto/qobject/moc_oldnormalizeobject.cpp b/tests/auto/qobject/moc_oldnormalizeobject.cpp index bde9c39..3b1e658 100644 --- a/tests/auto/qobject/moc_oldnormalizeobject.cpp +++ b/tests/auto/qobject/moc_oldnormalizeobject.cpp @@ -1,4 +1,45 @@ /**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (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 Technology Preview License Agreement accompanying +** this package. +** +** 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.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +/**************************************************************************** ** Meta object code from reading C++ file 'oldnormalizeobject.h' ** ** Created: Wed Nov 18 11:43:05 2009 diff --git a/tests/auto/qpainter/tst_qpainter.cpp b/tests/auto/qpainter/tst_qpainter.cpp index 104728d..beb83a1 100644 --- a/tests/auto/qpainter/tst_qpainter.cpp +++ b/tests/auto/qpainter/tst_qpainter.cpp @@ -1580,10 +1580,8 @@ void tst_QPainter::drawClippedEllipse_data() void tst_QPainter::drawClippedEllipse() { QFETCH(QRect, rect); -#if defined(Q_OS_WINCE) || defined(Q_OS_SYMBIAN) if (sizeof(qreal) != sizeof(double)) QSKIP("Test only works for qreal==double", SkipAll); -#endif QImage image(rect.width() + 1, rect.height() + 1, QImage::Format_ARGB32_Premultiplied); QRect expected = QRect(rect.x(), rect.y(), rect.width()+1, rect.height()+1) diff --git a/tests/auto/qpathclipper/pathcompare.h b/tests/auto/qpathclipper/pathcompare.h new file mode 100644 index 0000000..eb25e4c --- /dev/null +++ b/tests/auto/qpathclipper/pathcompare.h @@ -0,0 +1,126 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (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 Technology Preview License Agreement accompanying +** this package. +** +** 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.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#ifndef PATHCOMPARE_H +#define PATHCOMPARE_H + +#include <qmath.h> + +namespace QPathCompare { + +static const int precision = 8; +static const qreal epsilon = qPow(0.1, precision); + +static inline bool fuzzyIsZero(qreal x, qreal relative) +{ + if (qAbs(relative) < epsilon) + return qAbs(x) < epsilon; + else + return qAbs(x / relative) < epsilon; +} + +static bool fuzzyCompare(const QPointF &a, const QPointF &b) +{ + const QPointF delta = a - b; + + const qreal x = qMax(qAbs(a.x()), qAbs(b.x())); + const qreal y = qMax(qAbs(a.y()), qAbs(b.y())); + + return fuzzyIsZero(delta.x(), x) && fuzzyIsZero(delta.y(), y); +} + +static bool isClosed(const QPainterPath &path) +{ + if (path.elementCount() == 0) + return false; + + QPointF first = path.elementAt(0); + QPointF last = path.elementAt(path.elementCount() - 1); + + return fuzzyCompare(first, last); +} + +// rotation and direction independent path comparison +// allows paths to be shifted or reversed relative to each other +static bool comparePaths(const QPainterPath &actual, const QPainterPath &expected) +{ + const int endActual = isClosed(actual) ? actual.elementCount() - 1 : actual.elementCount(); + const int endExpected = isClosed(expected) ? expected.elementCount() - 1 : expected.elementCount(); + + if (endActual != endExpected) + return false; + + for (int i = 0; i < endActual; ++i) { + int k = 0; + for (k = 0; k < endActual; ++k) { + int i1 = k; + int i2 = (i + k) % endActual; + + QPointF a = actual.elementAt(i1); + QPointF b = expected.elementAt(i2); + + if (!fuzzyCompare(a, b)) + break; + } + + if (k == endActual) + return true; + + for (k = 0; k < endActual; ++k) { + int i1 = k; + int i2 = (i + endActual - k) % endActual; + + QPointF a = actual.elementAt(i1); + QPointF b = expected.elementAt(i2); + + if (!fuzzyCompare(a, b)) + break; + } + + if (k == endActual) + return true; + } + + return false; +} + +} + +#endif diff --git a/tests/auto/qpathclipper/tst_qpathclipper.cpp b/tests/auto/qpathclipper/tst_qpathclipper.cpp index 5b49545..38d253a 100644 --- a/tests/auto/qpathclipper/tst_qpathclipper.cpp +++ b/tests/auto/qpathclipper/tst_qpathclipper.cpp @@ -40,6 +40,7 @@ ****************************************************************************/ #include "private/qpathclipper_p.h" #include "paths.h" +#include "pathcompare.h" #include <QtTest/QtTest> @@ -336,13 +337,17 @@ static QPainterPath samplePath13() static QPainterPath samplePath14() { QPainterPath path; - path.moveTo(QPointF(100, 180)); - path.lineTo(QPointF(100, 80)); - path.lineTo(QPointF(120, 80)); - path.lineTo(QPointF(120, 100)); - path.lineTo(QPointF(160, 100)); - path.lineTo(QPointF(160, 180)); - path.lineTo(QPointF(100, 180)); + + path.moveTo(160, 80); + path.lineTo(160, 180); + path.lineTo(100, 180); + path.lineTo(100, 80); + path.lineTo(160, 80); + path.moveTo(160, 80); + path.lineTo(160, 100); + path.lineTo(120, 100); + path.lineTo(120, 80); + return path; } @@ -426,82 +431,6 @@ void tst_QPathClipper::clip_data() << samplePath14(); } -static const int precision = 8; -static const qreal epsilon = pow(0.1, precision); - -static inline bool fuzzyIsZero(qreal x, qreal relative) -{ - if (qAbs(relative) < epsilon) - return qAbs(x) < epsilon; - else - return qAbs(x / relative) < epsilon; -} - -static bool fuzzyCompare(const QPointF &a, const QPointF &b) -{ - const QPointF delta = a - b; - - const qreal x = qMax(qAbs(a.x()), qAbs(b.x())); - const qreal y = qMax(qAbs(a.y()), qAbs(b.y())); - - return fuzzyIsZero(delta.x(), x) && fuzzyIsZero(delta.y(), y); -} - -static bool isClosed(const QPainterPath &path) -{ - if (path.elementCount() == 0) - return false; - - QPointF first = path.elementAt(0); - QPointF last = path.elementAt(path.elementCount() - 1); - - return fuzzyCompare(first, last); -} - -// rotation and direction independent path comparison -// allows paths to be shifted or reversed relative to each other -static bool comparePaths(const QPainterPath &actual, const QPainterPath &expected) -{ - const int endActual = isClosed(actual) ? actual.elementCount() - 1 : actual.elementCount(); - const int endExpected = isClosed(expected) ? expected.elementCount() - 1 : expected.elementCount(); - - if (endActual != endExpected) - return false; - - for (int i = 0; i < endActual; ++i) { - int k = 0; - for (k = 0; k < endActual; ++k) { - int i1 = k; - int i2 = (i + k) % endActual; - - QPointF a = actual.elementAt(i1); - QPointF b = expected.elementAt(i2); - - if (!fuzzyCompare(a, b)) - break; - } - - if (k == endActual) - return true; - - for (k = 0; k < endActual; ++k) { - int i1 = k; - int i2 = (i + endActual - k) % endActual; - - QPointF a = actual.elementAt(i1); - QPointF b = expected.elementAt(i2); - - if (!fuzzyCompare(a, b)) - break; - } - - if (k == endActual) - return true; - } - - return false; -} - // sanity check to make sure comparePaths declared above works void tst_QPathClipper::testComparePaths() { @@ -511,12 +440,12 @@ void tst_QPathClipper::testComparePaths() a.addRect(0, 0, 10, 10); b.addRect(0, 0, 10.00001, 10.00001); - QVERIFY(!comparePaths(a, b)); + QVERIFY(!QPathCompare::comparePaths(a, b)); b = QPainterPath(); b.addRect(0, 0, 10.00000000001, 10.00000000001); - QVERIFY(comparePaths(a, b)); + QVERIFY(QPathCompare::comparePaths(a, b)); b = QPainterPath(); b.moveTo(10, 0); @@ -524,9 +453,9 @@ void tst_QPathClipper::testComparePaths() b.lineTo(0, 10); b.lineTo(10, 10); - QVERIFY(comparePaths(a, b)); + QVERIFY(QPathCompare::comparePaths(a, b)); b.lineTo(10, 0); - QVERIFY(comparePaths(a, b)); + QVERIFY(QPathCompare::comparePaths(a, b)); b = QPainterPath(); b.moveTo(10, 0); @@ -534,7 +463,7 @@ void tst_QPathClipper::testComparePaths() b.lineTo(0, 0); b.lineTo(10, 10); - QVERIFY(!comparePaths(a, b)); + QVERIFY(!QPathCompare::comparePaths(a, b)); } void tst_QPathClipper::clip() @@ -549,7 +478,7 @@ void tst_QPathClipper::clip() QPathClipper clipper(subject, clip); QPainterPath x = clipper.clip(op); - QVERIFY(comparePaths(x, result)); + QVERIFY(QPathCompare::comparePaths(x, result)); } static inline QPointF randomPointInRect(const QRectF &rect) diff --git a/tests/auto/qpixmapcache/tst_qpixmapcache.cpp b/tests/auto/qpixmapcache/tst_qpixmapcache.cpp index a0f4339..f8951f5 100644 --- a/tests/auto/qpixmapcache/tst_qpixmapcache.cpp +++ b/tests/auto/qpixmapcache/tst_qpixmapcache.cpp @@ -483,7 +483,9 @@ void tst_QPixmapCache::pixmapKey() QVERIFY(!getPrivate(key8)); } +QT_BEGIN_NAMESPACE extern int q_QPixmapCache_keyHashSize(); +QT_END_NAMESPACE void tst_QPixmapCache::noLeak() { diff --git a/tests/auto/qpluginloader/theplugin/plugininterface.h b/tests/auto/qpluginloader/theplugin/plugininterface.h index 0b093db..9b69429 100644 --- a/tests/auto/qpluginloader/theplugin/plugininterface.h +++ b/tests/auto/qpluginloader/theplugin/plugininterface.h @@ -45,7 +45,10 @@ struct PluginInterface { virtual ~PluginInterface() {} virtual QString pluginName() const = 0; }; + +QT_BEGIN_NAMESPACE Q_DECLARE_INTERFACE(PluginInterface, "com.trolltect.autotests.plugininterface/1.0") +QT_END_NAMESPACE #endif // PLUGININTERFACE_H diff --git a/tests/auto/qprinter/tst_qprinter.cpp b/tests/auto/qprinter/tst_qprinter.cpp index b1ff425..7e8ce84 100644 --- a/tests/auto/qprinter/tst_qprinter.cpp +++ b/tests/auto/qprinter/tst_qprinter.cpp @@ -106,7 +106,7 @@ private slots: void testCustomPageSizes(); void printDialogCompleter(); - void testActualNumCopies(); + void testCopyCount(); void taskQTBUG4497_reusePrinterOnDifferentFiles(); @@ -455,7 +455,7 @@ void tst_QPrinter::testNonExistentPrinter() printer.pageSize(); printer.orientation(); printer.fullPage(); - printer.setNumCopies(1); + printer.setCopyCount(1); printer.printerName(); // nor metrics @@ -966,11 +966,11 @@ void tst_QPrinter::printDialogCompleter() #endif } -void tst_QPrinter::testActualNumCopies() +void tst_QPrinter::testCopyCount() { QPrinter p; - p.setNumCopies(15); - QCOMPARE(p.actualNumCopies(), 15); + p.setCopyCount(15); + QCOMPARE(p.copyCount(), 15); } static void printPage(QPainter *painter) diff --git a/tests/auto/qprocess/tst_qprocess.cpp b/tests/auto/qprocess/tst_qprocess.cpp index ee3bb40..8dae9a0 100644 --- a/tests/auto/qprocess/tst_qprocess.cpp +++ b/tests/auto/qprocess/tst_qprocess.cpp @@ -1652,7 +1652,7 @@ void tst_QProcess::failToStart() QSignalSpy finishedSpy(&process, SIGNAL(finished(int))); QSignalSpy finishedSpy2(&process, SIGNAL(finished(int, QProcess::ExitStatus))); -// Mac OS X and HP-UX have a really low defualt process limit (~100), so spawning +// Mac OS X and HP-UX have a really low default process limit (~100), so spawning // to many processes here will cause test failures later on. #if defined Q_OS_HPUX const int attempts = 15; diff --git a/tests/auto/qscriptjstestsuite/tst_qscriptjstestsuite.cpp b/tests/auto/qscriptjstestsuite/tst_qscriptjstestsuite.cpp index 41df98c..10ff488 100644 --- a/tests/auto/qscriptjstestsuite/tst_qscriptjstestsuite.cpp +++ b/tests/auto/qscriptjstestsuite/tst_qscriptjstestsuite.cpp @@ -688,7 +688,7 @@ tst_Suite::tst_Suite() addExpectedFailure("ecma/TypeConversion/9.3.1-3.js", "- -\"0x80000000\"", willFixInNextReleaseMessage); #endif -#ifdef Q_OS_WIN +#ifdef Q_CC_MSVC addExpectedFailure("ecma_3/Expressions/11.7.3-01.js", "11.7.3 - >>> should evaluate operands in order: order", "QTBUG-8056"); addExpectedFailure("ecma_3/Operators/order-01.js", "operator evaluation order: 11.7.3 >>>", "QTBUG-8056"); addExpectedFailure("ecma_3/Operators/order-01.js", "operator evaluation order: 11.13.2 >>>=", "QTBUG-8056"); diff --git a/tests/auto/qscriptstring/tst_qscriptstring.cpp b/tests/auto/qscriptstring/tst_qscriptstring.cpp index f336dbe..808b643 100644 --- a/tests/auto/qscriptstring/tst_qscriptstring.cpp +++ b/tests/auto/qscriptstring/tst_qscriptstring.cpp @@ -87,6 +87,8 @@ void tst_QScriptString::test() QScriptString str2 = str; QVERIFY(!str2.isValid()); + + QCOMPARE(str.toArrayIndex(), quint32(0xffffffff)); } for (int x = 0; x < 2; ++x) { @@ -172,6 +174,7 @@ void tst_QScriptString::toArrayIndex_data() QTest::newRow("0a") << QString::fromLatin1("0a") << false << quint32(0xffffffff); QTest::newRow("0x1") << QString::fromLatin1("0x1") << false << quint32(0xffffffff); QTest::newRow("01") << QString::fromLatin1("01") << false << quint32(0xffffffff); + QTest::newRow("101a") << QString::fromLatin1("101a") << false << quint32(0xffffffff); QTest::newRow("4294967294") << QString::fromLatin1("4294967294") << true << quint32(0xfffffffe); QTest::newRow("4294967295") << QString::fromLatin1("4294967295") << false << quint32(0xffffffff); } diff --git a/tests/auto/qsharedmemory/qsharedmemory.pro b/tests/auto/qsharedmemory/qsharedmemory.pro deleted file mode 100644 index 0aad554..0000000 --- a/tests/auto/qsharedmemory/qsharedmemory.pro +++ /dev/null @@ -1,4 +0,0 @@ -TEMPLATE = subdirs -SUBDIRS = lackey test qsystemlock - - diff --git a/tests/auto/qsharedpointer/tst_qsharedpointer.cpp b/tests/auto/qsharedpointer/tst_qsharedpointer.cpp index 7cfa868..07df707 100644 --- a/tests/auto/qsharedpointer/tst_qsharedpointer.cpp +++ b/tests/auto/qsharedpointer/tst_qsharedpointer.cpp @@ -42,6 +42,8 @@ #define QT_SHAREDPOINTER_TRACK_POINTERS #include "qsharedpointer.h" #include <QtTest/QtTest> +#include <QtCore/QHash> +#include <QtCore/QMap> #include <QtCore/QThread> #include <QtCore/QVector> @@ -68,6 +70,7 @@ class tst_QSharedPointer: public QObject private slots: void basics_data(); void basics(); + void operators(); void swap(); void forwardDeclaration1(); void forwardDeclaration2(); @@ -94,6 +97,8 @@ private slots: void mixTrackingPointerCode(); void threadStressTest_data(); void threadStressTest(); + void map(); + void hash(); void validConstructs(); void invalidConstructs_data(); void invalidConstructs(); @@ -271,6 +276,35 @@ void tst_QSharedPointer::basics() // aData is deleted here } +void tst_QSharedPointer::operators() +{ + QSharedPointer<char> p1; + QSharedPointer<char> p2(new char); + qptrdiff diff = p2.data() - p1.data(); + Q_ASSERT(p1.data() < p2.data()); + Q_ASSERT(diff > 0); + + // operator- + QCOMPARE(p2 - p1.data(), diff); + QCOMPARE(p2.data() - p1, diff); + QCOMPARE(p2 - p1, diff); + QCOMPARE(p1 - p2, -diff); + QCOMPARE(p1 - p1, qptrdiff(0)); + QCOMPARE(p2 - p2, qptrdiff(0)); + + // operator< + QVERIFY(p1 < p2.data()); + QVERIFY(p1.data() < p2); + QVERIFY(p1 < p2); + QVERIFY(!(p2 < p1)); + QVERIFY(!(p2 < p2)); + QVERIFY(!(p1 < p1)); + + // qHash + QCOMPARE(qHash(p1), qHash(p1.data())); + QCOMPARE(qHash(p2), qHash(p2.data())); +} + void tst_QSharedPointer::swap() { QSharedPointer<int> p1, p2(new int(42)), control = p2; @@ -1544,6 +1578,72 @@ void tst_QSharedPointer::threadStressTest() } } +template<typename Container, bool Ordered> +void hashAndMapTest() +{ + typedef typename Container::key_type Key; + typedef typename Container::mapped_type Value; + + Container c; + QVERIFY(c.isEmpty()); + + Key k0; + c.insert(k0, Value(0)); + QVERIFY(!c.isEmpty()); + + typename Container::iterator it; + it = c.find(k0); + QVERIFY(it != c.end()); + it = c.find(Key()); + QVERIFY(it != c.end()); + it = c.find(Key(0)); + QVERIFY(it != c.end()); + + Key k1(new typename Key::value_type(42)); + it = c.find(k1); + QVERIFY(it == c.end()); + + c.insert(k1, Value(42)); + it = c.find(k1); + QVERIFY(it != c.end()); + QVERIFY(it != c.find(Key())); + + if (Ordered) { + Q_ASSERT(k0 < k1); + + it = c.begin(); + QCOMPARE(it.key(), k0); + QCOMPARE(it.value(), Value(0)); + + ++it; + QCOMPARE(it.key(), k1); + QCOMPARE(it.value(), Value(42)); + + ++it; + QVERIFY(it == c.end()); + } + + c.insertMulti(k1, Value(47)); + it = c.find(k1); + QVERIFY(it != c.end()); + QCOMPARE(it.key(), k1); + ++it; + QVERIFY(it != c.end()); + QCOMPARE(it.key(), k1); + ++it; + QVERIFY(it == c.end()); +} + +void tst_QSharedPointer::map() +{ + hashAndMapTest<QMap<QSharedPointer<int>, int>, true>(); +} + +void tst_QSharedPointer::hash() +{ + hashAndMapTest<QHash<QSharedPointer<int>, int>, false>(); +} + void tst_QSharedPointer::validConstructs() { { diff --git a/tests/auto/qstatictext/qstatictext.pro b/tests/auto/qstatictext/qstatictext.pro new file mode 100644 index 0000000..a759a90 --- /dev/null +++ b/tests/auto/qstatictext/qstatictext.pro @@ -0,0 +1,4 @@ +load(qttest_p4) +QT = core gui opengl +SOURCES += tst_qstatictext.cpp + diff --git a/tests/auto/qstatictext/tst_qstatictext.cpp b/tests/auto/qstatictext/tst_qstatictext.cpp new file mode 100644 index 0000000..68f05c1 --- /dev/null +++ b/tests/auto/qstatictext/tst_qstatictext.cpp @@ -0,0 +1,451 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (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 Technology Preview License Agreement accompanying +** this package. +** +** 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.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <QtTest/QtTest> +#include <QtGui/QApplication> +#include <QtGui/QPainter> +#include <QtGui/QImage> + +#include <qstatictext.h> +#include <private/qstatictext_p.h> + +// #define DEBUG_SAVE_IMAGE + +class tst_QStaticText: public QObject +{ + Q_OBJECT +private slots: + void init(); + void cleanup(); + + void constructionAndDestruction(); + void drawToPoint_data(); + void drawToPoint(); + void drawToRect_data(); + void drawToRect(); + void setFont(); + void setMaximumSize(); + void prepareToCorrectData(); + void prepareToWrongData(); + + void translatedPainter(); + void rotatedPainter(); + void scaledPainter(); + void projectedPainter(); + void rotatedScaledAndTranslatedPainter(); + void transformationChanged(); +}; + +void tst_QStaticText::init() +{ +} + +void tst_QStaticText::cleanup() +{ +} + +void tst_QStaticText::constructionAndDestruction() +{ + QStaticText text("My text"); +} + +Q_DECLARE_METATYPE(QStaticText::PerformanceHint) +void tst_QStaticText::drawToPoint_data() +{ + QTest::addColumn<QStaticText::PerformanceHint>("performanceHint"); + + QTest::newRow("Moderate caching") << QStaticText::ModerateCaching; + QTest::newRow("Aggressive caching") << QStaticText::AggressiveCaching; +} + +void tst_QStaticText::drawToPoint() +{ + QFETCH(QStaticText::PerformanceHint, performanceHint); + + QPixmap imageDrawText(1000, 1000); + imageDrawText.fill(Qt::white); + { + QPainter p(&imageDrawText); + p.drawText(11, 12, "Lorem ipsum dolor sit amet, consectetur adipiscing elit."); + } + + QPixmap imageDrawStaticText(1000, 1000); + imageDrawStaticText.fill(Qt::white); + { + QPainter p(&imageDrawStaticText); + QStaticText text("Lorem ipsum dolor sit amet, consectetur adipiscing elit."); + text.setTextFormat(Qt::PlainText); + text.setPerformanceHint(performanceHint); + p.drawStaticText(QPointF(11, 12), text); + } + + QCOMPARE(imageDrawStaticText, imageDrawText); +} + +void tst_QStaticText::drawToRect_data() +{ + QTest::addColumn<QStaticText::PerformanceHint>("performanceHint"); + + QTest::newRow("Moderate caching") << QStaticText::ModerateCaching; + QTest::newRow("Aggressive caching") << QStaticText::AggressiveCaching; +} + +void tst_QStaticText::drawToRect() +{ + QFETCH(QStaticText::PerformanceHint, performanceHint); + + QPixmap imageDrawText(1000, 1000); + imageDrawText.fill(Qt::white); + { + QPainter p(&imageDrawText); + p.drawText(QRectF(11, 12, 10, 500), "Lorem ipsum dolor sit amet, consectetur adipiscing elit."); + } + + QPixmap imageDrawStaticText(1000, 1000); + imageDrawStaticText.fill(Qt::white); + { + QPainter p(&imageDrawStaticText); + QStaticText text("Lorem ipsum dolor sit amet, consectetur adipiscing elit.", QSizeF(10, 500)); + text.setPerformanceHint(performanceHint); + text.setTextFormat(Qt::PlainText); + p.drawStaticText(QPointF(11, 12), text); + } + + QCOMPARE(imageDrawStaticText, imageDrawText); +} + +void tst_QStaticText::prepareToCorrectData() +{ + QTransform transform; + transform.scale(2.0, 2.0); + transform.rotate(90, Qt::ZAxis); + + QPixmap imageDrawText(1000, 1000); + imageDrawText.fill(Qt::white); + { + QPainter p(&imageDrawText); + p.setTransform(transform); + p.drawText(11, 12, "Lorem ipsum dolor sit amet, consectetur adipiscing elit."); + } + + QPixmap imageDrawStaticText(1000, 1000); + imageDrawStaticText.fill(Qt::white); + { + QPainter p(&imageDrawStaticText); + p.setTransform(transform); + QStaticText text("Lorem ipsum dolor sit amet, consectetur adipiscing elit."); + text.prepare(transform, p.font()); + text.setTextFormat(Qt::PlainText); + p.drawStaticText(QPointF(11, 12), text); + } + + QCOMPARE(imageDrawStaticText, imageDrawText); +} + +void tst_QStaticText::prepareToWrongData() +{ + QTransform transform; + transform.scale(2.0, 2.0); + transform.rotate(90, Qt::ZAxis); + + QPixmap imageDrawText(1000, 1000); + imageDrawText.fill(Qt::white); + { + QPainter p(&imageDrawText); + p.drawText(11, 12, "Lorem ipsum dolor sit amet, consectetur adipiscing elit."); + } + + QPixmap imageDrawStaticText(1000, 1000); + imageDrawStaticText.fill(Qt::white); + { + QPainter p(&imageDrawStaticText); + QStaticText text("Lorem ipsum dolor sit amet, consectetur adipiscing elit."); + text.prepare(transform, p.font()); + text.setTextFormat(Qt::PlainText); + p.drawStaticText(QPointF(11, 12), text); + } + + QCOMPARE(imageDrawStaticText, imageDrawText); +} + + +void tst_QStaticText::setFont() +{ + QFont font = QApplication::font(); + font.setBold(true); + font.setPointSize(28); + + QPixmap imageDrawText(1000, 1000); + imageDrawText.fill(Qt::white); + { + QPainter p(&imageDrawText); + p.drawText(0, 0, "Lorem ipsum dolor sit amet, consectetur adipiscing elit."); + + p.setFont(font); + p.drawText(11, 120, "Lorem ipsum dolor sit amet, consectetur adipiscing elit."); + } + + QPixmap imageDrawStaticText(1000, 1000); + imageDrawStaticText.fill(Qt::white); + { + QPainter p(&imageDrawStaticText); + + QStaticText text; + text.setText("Lorem ipsum dolor sit amet, consectetur adipiscing elit."); + text.setTextFormat(Qt::PlainText); + + p.drawStaticText(0, 0, text); + + p.setFont(font); + p.drawStaticText(11, 120, text); + } + + QCOMPARE(imageDrawStaticText, imageDrawText); +} + +void tst_QStaticText::setMaximumSize() +{ + QPixmap imageDrawText(1000, 1000); + imageDrawText.fill(Qt::white); + { + QPainter p(&imageDrawText); + p.drawText(QRectF(11, 12, 10, 500), "Lorem ipsum dolor sit amet, consectetur adipiscing elit."); + } + + QPixmap imageDrawStaticText(1000, 1000); + imageDrawStaticText.fill(Qt::white); + { + QPainter p(&imageDrawStaticText); + QStaticText text("Lorem ipsum dolor sit amet, consectetur adipiscing elit."); + text.setMaximumSize(QSizeF(10, 500)); + p.drawStaticText(QPointF(11, 12), text); + } + + QCOMPARE(imageDrawStaticText, imageDrawText); +} + +void tst_QStaticText::translatedPainter() +{ + QPixmap imageDrawText(1000, 1000); + imageDrawText.fill(Qt::white); + { + QPainter p(&imageDrawText); + p.translate(100, 200); + + p.drawText(11, 12, "Lorem ipsum dolor sit amet, consectetur adipiscing elit."); + } + + QPixmap imageDrawStaticText(1000, 1000); + imageDrawStaticText.fill(Qt::white); + { + QPainter p(&imageDrawStaticText); + p.translate(100, 200); + + QStaticText text("Lorem ipsum dolor sit amet, consectetur adipiscing elit."); + text.setTextFormat(Qt::PlainText); + + p.drawStaticText(QPointF(11, 12), text); + } + + QCOMPARE(imageDrawStaticText, imageDrawText); +} + +void tst_QStaticText::rotatedPainter() +{ + QPixmap imageDrawText(1000, 1000); + imageDrawText.fill(Qt::white); + { + QPainter p(&imageDrawText); + p.rotate(30.0); + p.drawText(0, 0, "Lorem ipsum dolor sit amet, consectetur adipiscing elit."); + } + + QPixmap imageDrawStaticText(1000, 1000); + imageDrawStaticText.fill(Qt::white); + { + QStaticText text("Lorem ipsum dolor sit amet, consectetur adipiscing elit."); + text.setTextFormat(Qt::PlainText); + + QPainter p(&imageDrawStaticText); + p.rotate(30.0); + p.drawStaticText(QPoint(0, 0), text); + } + +#if defined(DEBUG_SAVE_IMAGE) + imageDrawText.save("rotatedPainter_imageDrawText.png"); + imageDrawStaticText.save("rotatedPainter_imageDrawStaticText.png"); +#endif + + QCOMPARE(imageDrawStaticText, imageDrawText); +} + +void tst_QStaticText::scaledPainter() +{ + QPixmap imageDrawText(1000, 1000); + imageDrawText.fill(Qt::white); + { + QPainter p(&imageDrawText); + p.scale(2.0, 0.2); + + p.drawText(11, 12, "Lorem ipsum dolor sit amet, consectetur adipiscing elit."); + } + + QPixmap imageDrawStaticText(1000, 1000); + imageDrawStaticText.fill(Qt::white); + { + QPainter p(&imageDrawStaticText); + p.scale(2.0, 0.2); + + QStaticText text("Lorem ipsum dolor sit amet, consectetur adipiscing elit."); + text.setTextFormat(Qt::PlainText); + + p.drawStaticText(QPointF(11, 12), text); + } + + QCOMPARE(imageDrawStaticText, imageDrawText); +} + +void tst_QStaticText::projectedPainter() +{ + QTransform transform; + transform.rotate(90, Qt::XAxis); + + QPixmap imageDrawText(1000, 1000); + imageDrawText.fill(Qt::white); + { + QPainter p(&imageDrawText); + p.setTransform(transform); + + p.drawText(11, 12, "Lorem ipsum dolor sit amet, consectetur adipiscing elit."); + } + + QPixmap imageDrawStaticText(1000, 1000); + imageDrawStaticText.fill(Qt::white); + { + QPainter p(&imageDrawStaticText); + p.setTransform(transform); + + QStaticText text("Lorem ipsum dolor sit amet, consectetur adipiscing elit."); + text.setTextFormat(Qt::PlainText); + + p.drawStaticText(QPointF(11, 12), text); + } + + QCOMPARE(imageDrawStaticText, imageDrawText); + +} + +void tst_QStaticText::rotatedScaledAndTranslatedPainter() +{ + QPixmap imageDrawText(1000, 1000); + imageDrawText.fill(Qt::white); + { + QPainter p(&imageDrawText); + p.rotate(45.0); + p.scale(2.0, 2.0); + p.translate(100, 200); + + p.drawText(11, 12, "Lorem ipsum dolor sit amet, consectetur adipiscing elit."); + } + + QPixmap imageDrawStaticText(1000, 1000); + imageDrawStaticText.fill(Qt::white); + { + QPainter p(&imageDrawStaticText); + p.rotate(45.0); + p.scale(2.0, 2.0); + p.translate(100, 200); + + QStaticText text("Lorem ipsum dolor sit amet, consectetur adipiscing elit."); + text.setTextFormat(Qt::PlainText); + + p.drawStaticText(QPointF(11, 12), text); + } + +#if defined(DEBUG_SAVE_IMAGE) + imageDrawText.save("rotatedScaledAndPainter_imageDrawText.png"); + imageDrawStaticText.save("rotatedScaledAndPainter_imageDrawStaticText.png"); +#endif + + QCOMPARE(imageDrawStaticText, imageDrawText); +} + +void tst_QStaticText::transformationChanged() +{ + QPixmap imageDrawText(1000, 1000); + imageDrawText.fill(Qt::white); + { + QPainter p(&imageDrawText); + p.rotate(33.0); + p.scale(0.5, 0.7); + + p.drawText(0, 0, "Lorem ipsum dolor sit amet, consectetur adipiscing elit."); + + p.scale(7.0, 5.0); + p.drawText(0, 0, "Lorem ipsum dolor sit amet, consectetur adipiscing elit."); + } + + QPixmap imageDrawStaticText(1000, 1000); + imageDrawStaticText.fill(Qt::white); + { + QPainter p(&imageDrawStaticText); + p.rotate(33.0); + p.scale(0.5, 0.7); + + QStaticText text("Lorem ipsum dolor sit amet, consectetur adipiscing elit."); + text.setTextFormat(Qt::PlainText); + + p.drawStaticText(QPointF(0, 0), text); + + p.scale(7.0, 5.0); + p.drawStaticText(QPointF(0, 0), text); + } + +#if defined(DEBUG_SAVE_IMAGE) + imageDrawText.save("transformationChanged_imageDrawText.png"); + imageDrawStaticText.save("transformationChanged_imageDrawStaticText.png"); +#endif + + QCOMPARE(imageDrawStaticText, imageDrawText); +} + +QTEST_MAIN(tst_QStaticText) +#include "tst_qstatictext.moc" diff --git a/tests/auto/qstring/tst_qstring.cpp b/tests/auto/qstring/tst_qstring.cpp index c9b3436..9c9524a 100644 --- a/tests/auto/qstring/tst_qstring.cpp +++ b/tests/auto/qstring/tst_qstring.cpp @@ -120,6 +120,7 @@ private slots: void operator_eqeq_nullstring(); void operator_smaller(); void insert(); + void simplified_data(); void simplified(); void trimmed(); void toLower(); @@ -1592,16 +1593,51 @@ void tst_QString::trimmed() QCOMPARE(a.trimmed(),(QString)"a"); } +void tst_QString::simplified_data() +{ + QTest::addColumn<QString>("full" ); + QTest::addColumn<QString>("simple" ); + + QTest::newRow("null") << QString() << QString(); + QTest::newRow("empty") << "" << ""; + QTest::newRow("one char") << "a" << "a"; + QTest::newRow("one word") << "foo" << "foo"; + QTest::newRow("chars trivial") << "a b" << "a b"; + QTest::newRow("words trivial") << "foo bar" << "foo bar"; + QTest::newRow("allspace") << " \t\v " << ""; + QTest::newRow("char trailing") << "a " << "a"; + QTest::newRow("char trailing tab") << "a\t" << "a"; + QTest::newRow("char multitrailing") << "a " << "a"; + QTest::newRow("char multitrailing tab") << "a \t" << "a"; + QTest::newRow("char leading") << " a" << "a"; + QTest::newRow("char leading tab") << "\ta" << "a"; + QTest::newRow("char multileading") << " a" << "a"; + QTest::newRow("char multileading tab") << "\t a" << "a"; + QTest::newRow("chars apart") << "a b" << "a b"; + QTest::newRow("words apart") << "foo bar" << "foo bar"; + QTest::newRow("enclosed word") << " foo \t " << "foo"; + QTest::newRow("enclosed chars apart") << " a b " << "a b"; + QTest::newRow("enclosed words apart") << " foo bar " << "foo bar"; + QTest::newRow("chars apart posttab") << "a \tb" << "a b"; + QTest::newRow("chars apart pretab") << "a\t b" << "a b"; + QTest::newRow("many words") << " just some random\ttext here" << "just some random text here"; +} + void tst_QString::simplified() { - QString j; - j.simplified(); + QFETCH(QString, full); + QFETCH(QString, simple); - QString a; - a = "a "; - QCOMPARE(a.simplified(),(QString)"a"); - a=" a b "; - QCOMPARE(a.simplified(),(QString)"a b"); + QString result = full.simplified(); + if (simple.isNull()) { + QVERIFY2(result.isNull(), qPrintable("'" + full + "' did not yield null: " + result)); + } else if (simple.isEmpty()) { + QVERIFY2(result.isEmpty() && !result.isNull(), qPrintable("'" + full + "' did not yield empty: " + result)); + } else { + QCOMPARE(result, simple); + if (full == simple) + QVERIFY(result.isSharedWith(full)); + } } void tst_QString::insert() diff --git a/tests/auto/qsystemsemaphore/files.qrc b/tests/auto/qsystemsemaphore/files.qrc deleted file mode 100644 index 7b344ba..0000000 --- a/tests/auto/qsystemsemaphore/files.qrc +++ /dev/null @@ -1,7 +0,0 @@ -<!DOCTYPE RCC><RCC version="1.0"> -<qresource> - <file alias="systemsemaphore_acquire.js">../qsharedmemory/lackey/scripts/systemsemaphore_acquire.js</file> - <file alias="systemsemaphore_release.js">../qsharedmemory/lackey/scripts/systemsemaphore_release.js</file> - <file alias="systemsemaphore_acquirerelease.js">../qsharedmemory/lackey/scripts/systemsemaphore_acquirerelease.js</file> -</qresource> -</RCC> diff --git a/tests/auto/qsystemsemaphore/qsystemsemaphore.pro b/tests/auto/qsystemsemaphore/qsystemsemaphore.pro deleted file mode 100644 index a3f4a34..0000000 --- a/tests/auto/qsystemsemaphore/qsystemsemaphore.pro +++ /dev/null @@ -1,4 +0,0 @@ -TEMPLATE = subdirs -SUBDIRS = ../qsharedmemory/lackey test - - diff --git a/tests/auto/qtextcodec/tst_qtextcodec.cpp b/tests/auto/qtextcodec/tst_qtextcodec.cpp index 65b0448..aa97e87 100644 --- a/tests/auto/qtextcodec/tst_qtextcodec.cpp +++ b/tests/auto/qtextcodec/tst_qtextcodec.cpp @@ -1795,12 +1795,12 @@ void tst_QTextCodec::utfHeaders() QLatin1String ignoreReverseTestOn = (QSysInfo::ByteOrder == QSysInfo::BigEndian) ? QLatin1String(" le") : QLatin1String(" be"); QString rowName(QTest::currentDataTag()); - for (int i = 0; i < encoded.length(); ++i) - qDebug() << hex << " " << (uint)(uchar)encoded.at(i); + /*for (int i = 0; i < encoded.length(); ++i) + qDebug() << hex << " " << (uint)(uchar)encoded.at(i);*/ if (toUnicode) { QString result = codec->toUnicode(encoded.constData(), encoded.length(), &state); - for (int i = 0; i < result.length(); ++i) - qDebug() << hex << " " << (uint)result.at(i).unicode(); + /*for (int i = 0; i < result.length(); ++i) + qDebug() << hex << " " << (uint)result.at(i).unicode();*/ QCOMPARE(result.length(), unicode.length()); QCOMPARE(result, unicode); @@ -1939,7 +1939,7 @@ static int loadAndConvertMIB(int mib) void tst_QTextCodec::threadSafety() { QThreadPool::globalInstance()->setMaxThreadCount(12); - + QList<QByteArray> codecList = QTextCodec::availableCodecs(); QFuture<QByteArray> res = QtConcurrent::mapped(codecList, loadAndConvert); diff --git a/tests/auto/qtextstream/tst_qtextstream.cpp b/tests/auto/qtextstream/tst_qtextstream.cpp index 8ff6bee..9146be2 100644 --- a/tests/auto/qtextstream/tst_qtextstream.cpp +++ b/tests/auto/qtextstream/tst_qtextstream.cpp @@ -4308,10 +4308,15 @@ void tst_QTextStream::int_write_with_locale() // ------------------------------------------------------------------------------ // like QTEST_APPLESS_MAIN, but initialising the locale on Unix +#if defined (Q_OS_UNIX) && !defined (Q_OS_SYMBIAN) +QT_BEGIN_NAMESPACE +extern bool qt_locale_initialized; +QT_END_NAMESPACE +#endif + int main(int argc, char *argv[]) { #if defined (Q_OS_UNIX) && !defined (Q_OS_SYMBIAN) - extern bool qt_locale_initialized; ::setlocale(LC_ALL, ""); qt_locale_initialized = true; #endif diff --git a/tests/auto/qsharedmemory/lackey/lackey.pro b/tests/auto/qtipc/lackey/lackey.pro index d25a50a..3912312 100644 --- a/tests/auto/qsharedmemory/lackey/lackey.pro +++ b/tests/auto/qtipc/lackey/lackey.pro @@ -1,4 +1,4 @@ -include(../src/src.pri) +include(../qsharedmemory/src/src.pri) QT = core script diff --git a/tests/auto/qsharedmemory/lackey/main.cpp b/tests/auto/qtipc/lackey/main.cpp index 5a5bf5e..fef8d22 100644 --- a/tests/auto/qsharedmemory/lackey/main.cpp +++ b/tests/auto/qtipc/lackey/main.cpp @@ -242,9 +242,11 @@ private: QSharedMemory sm; }; +QT_BEGIN_NAMESPACE Q_SCRIPT_DECLARE_QMETAOBJECT(ScriptSharedMemory, QObject*); Q_SCRIPT_DECLARE_QMETAOBJECT(ScriptSystemLock, QObject*); Q_SCRIPT_DECLARE_QMETAOBJECT(ScriptSystemSemaphore, QObject*); +QT_END_NAMESPACE static void interactive(QScriptEngine &eng) { diff --git a/tests/auto/qsharedmemory/lackey/scripts/consumer.js b/tests/auto/qtipc/lackey/scripts/consumer.js index 4d12dca..4d12dca 100644 --- a/tests/auto/qsharedmemory/lackey/scripts/consumer.js +++ b/tests/auto/qtipc/lackey/scripts/consumer.js diff --git a/tests/auto/qsharedmemory/lackey/scripts/producer.js b/tests/auto/qtipc/lackey/scripts/producer.js index e02cd8b..e02cd8b 100644 --- a/tests/auto/qsharedmemory/lackey/scripts/producer.js +++ b/tests/auto/qtipc/lackey/scripts/producer.js diff --git a/tests/auto/qsharedmemory/lackey/scripts/readonly_segfault.js b/tests/auto/qtipc/lackey/scripts/readonly_segfault.js index 3eaf789..3eaf789 100644 --- a/tests/auto/qsharedmemory/lackey/scripts/readonly_segfault.js +++ b/tests/auto/qtipc/lackey/scripts/readonly_segfault.js diff --git a/tests/auto/qsharedmemory/lackey/scripts/systemlock_read.js b/tests/auto/qtipc/lackey/scripts/systemlock_read.js index 1048bc7..1048bc7 100644 --- a/tests/auto/qsharedmemory/lackey/scripts/systemlock_read.js +++ b/tests/auto/qtipc/lackey/scripts/systemlock_read.js diff --git a/tests/auto/qsharedmemory/lackey/scripts/systemlock_readwrite.js b/tests/auto/qtipc/lackey/scripts/systemlock_readwrite.js index fc6367f..fc6367f 100644 --- a/tests/auto/qsharedmemory/lackey/scripts/systemlock_readwrite.js +++ b/tests/auto/qtipc/lackey/scripts/systemlock_readwrite.js diff --git a/tests/auto/qsharedmemory/lackey/scripts/systemsemaphore_acquire.js b/tests/auto/qtipc/lackey/scripts/systemsemaphore_acquire.js index 5cff429..5cff429 100644 --- a/tests/auto/qsharedmemory/lackey/scripts/systemsemaphore_acquire.js +++ b/tests/auto/qtipc/lackey/scripts/systemsemaphore_acquire.js diff --git a/tests/auto/qsharedmemory/lackey/scripts/systemsemaphore_acquirerelease.js b/tests/auto/qtipc/lackey/scripts/systemsemaphore_acquirerelease.js index cedde3f..cedde3f 100644 --- a/tests/auto/qsharedmemory/lackey/scripts/systemsemaphore_acquirerelease.js +++ b/tests/auto/qtipc/lackey/scripts/systemsemaphore_acquirerelease.js diff --git a/tests/auto/qsharedmemory/lackey/scripts/systemsemaphore_release.js b/tests/auto/qtipc/lackey/scripts/systemsemaphore_release.js index c805e0f..c805e0f 100644 --- a/tests/auto/qsharedmemory/lackey/scripts/systemsemaphore_release.js +++ b/tests/auto/qtipc/lackey/scripts/systemsemaphore_release.js diff --git a/tests/auto/qsharedmemory/.gitignore b/tests/auto/qtipc/qsharedmemory/.gitignore index 03ddcf2..03ddcf2 100644 --- a/tests/auto/qsharedmemory/.gitignore +++ b/tests/auto/qtipc/qsharedmemory/.gitignore diff --git a/tests/auto/qtipc/qsharedmemory/qsharedmemory.pro b/tests/auto/qtipc/qsharedmemory/qsharedmemory.pro new file mode 100644 index 0000000..9fef8e4 --- /dev/null +++ b/tests/auto/qtipc/qsharedmemory/qsharedmemory.pro @@ -0,0 +1,4 @@ +TEMPLATE = subdirs +SUBDIRS = test qsystemlock + + diff --git a/tests/auto/qsharedmemory/qsystemlock/qsystemlock.pro b/tests/auto/qtipc/qsharedmemory/qsystemlock/qsystemlock.pro index e232443..e232443 100644 --- a/tests/auto/qsharedmemory/qsystemlock/qsystemlock.pro +++ b/tests/auto/qtipc/qsharedmemory/qsystemlock/qsystemlock.pro diff --git a/tests/auto/qsharedmemory/qsystemlock/tst_qsystemlock.cpp b/tests/auto/qtipc/qsharedmemory/qsystemlock/tst_qsystemlock.cpp index ea906b7..ea906b7 100644 --- a/tests/auto/qsharedmemory/qsystemlock/tst_qsystemlock.cpp +++ b/tests/auto/qtipc/qsharedmemory/qsystemlock/tst_qsystemlock.cpp diff --git a/tests/auto/qsharedmemory/src/qsystemlock.cpp b/tests/auto/qtipc/qsharedmemory/src/qsystemlock.cpp index 4ead748..4ead748 100644 --- a/tests/auto/qsharedmemory/src/qsystemlock.cpp +++ b/tests/auto/qtipc/qsharedmemory/src/qsystemlock.cpp diff --git a/tests/auto/qsharedmemory/src/qsystemlock.h b/tests/auto/qtipc/qsharedmemory/src/qsystemlock.h index 7cd6b89..7cd6b89 100644 --- a/tests/auto/qsharedmemory/src/qsystemlock.h +++ b/tests/auto/qtipc/qsharedmemory/src/qsystemlock.h diff --git a/tests/auto/qsharedmemory/src/qsystemlock_p.h b/tests/auto/qtipc/qsharedmemory/src/qsystemlock_p.h index 7995a91..7995a91 100644 --- a/tests/auto/qsharedmemory/src/qsystemlock_p.h +++ b/tests/auto/qtipc/qsharedmemory/src/qsystemlock_p.h diff --git a/tests/auto/qsharedmemory/src/qsystemlock_unix.cpp b/tests/auto/qtipc/qsharedmemory/src/qsystemlock_unix.cpp index 525aa78..525aa78 100644 --- a/tests/auto/qsharedmemory/src/qsystemlock_unix.cpp +++ b/tests/auto/qtipc/qsharedmemory/src/qsystemlock_unix.cpp diff --git a/tests/auto/qsharedmemory/src/qsystemlock_win.cpp b/tests/auto/qtipc/qsharedmemory/src/qsystemlock_win.cpp index ac97100..ac97100 100644 --- a/tests/auto/qsharedmemory/src/qsystemlock_win.cpp +++ b/tests/auto/qtipc/qsharedmemory/src/qsystemlock_win.cpp diff --git a/tests/auto/qsharedmemory/src/src.pri b/tests/auto/qtipc/qsharedmemory/src/src.pri index 5bc9de6..5bc9de6 100644 --- a/tests/auto/qsharedmemory/src/src.pri +++ b/tests/auto/qtipc/qsharedmemory/src/src.pri diff --git a/tests/auto/qsharedmemory/test/test.pro b/tests/auto/qtipc/qsharedmemory/test/test.pro index c9f4fec..40ba8b9 100644 --- a/tests/auto/qsharedmemory/test/test.pro +++ b/tests/auto/qtipc/qsharedmemory/test/test.pro @@ -20,14 +20,14 @@ TARGET = ../tst_qsharedmemory wince*:{ requires(contains(QT_CONFIG,script)) QT += gui script -addFiles.sources = ../lackey/lackey.exe ../lackey/scripts +addFiles.sources = ../../lackey/lackey.exe ../../lackey/scripts addFiles.path = lackey DEPLOYMENT += addFiles DEFINES += SRCDIR=\\\"\\\" }else:symbian*{ requires(contains(QT_CONFIG,script)) QT += gui script -addFiles.sources = ../lackey/scripts +addFiles.sources = ../../lackey/scripts addFiles.path = /data/qsharedmemorytemp/lackey addBin.sources = lackey.exe addBin.path = /sys/bin diff --git a/tests/auto/qsharedmemory/tst_qsharedmemory.cpp b/tests/auto/qtipc/qsharedmemory/tst_qsharedmemory.cpp index cea75bf..83f65b0 100644 --- a/tests/auto/qsharedmemory/tst_qsharedmemory.cpp +++ b/tests/auto/qtipc/qsharedmemory/tst_qsharedmemory.cpp @@ -51,7 +51,13 @@ #ifdef Q_OS_SYMBIAN #define SRCDIR "c:/data/qsharedmemorytemp/" +#define LACKEYDIR SRCDIR "lackey" +#elif Q_OS_WINCE +#define LACKEYDIR SRCDIR "lackey" +#else +#define LACKEYDIR SRCDIR "../lackey" #endif + Q_DECLARE_METATYPE(QSharedMemory::SharedMemoryError) Q_DECLARE_METATYPE(QSharedMemory::AccessMode) @@ -411,10 +417,10 @@ void tst_QSharedMemory::readOnly() #if defined (Q_OS_SYMBIAN) QSKIP("Readonly shared memory is not supported in symbian", SkipAll); #endif - QString program = "./lackey/lackey"; + QString program = LACKEYDIR "/lackey"; QStringList arguments; rememberKey("readonly_segfault"); - arguments << SRCDIR "lackey/scripts/readonly_segfault.js"; + arguments << LACKEYDIR "/scripts/readonly_segfault.js"; // ### on windows disable the popup somehow QProcess p; @@ -727,28 +733,20 @@ void tst_QSharedMemory::simpleProcessProducerConsumer() rememberKey("market"); -#ifndef Q_OS_WINCE - QStringList arguments = QStringList() << SRCDIR "lackey/scripts/producer.js"; -#else - QStringList arguments = QStringList() << QFileInfo(SRCDIR "lackey/scripts/producer.js").absoluteFilePath(); -#endif + QStringList arguments = QStringList() << LACKEYDIR "/scripts/producer.js"; QProcess producer; producer.setProcessChannelMode(QProcess::ForwardedChannels); - producer.start( "./lackey/lackey", arguments); + producer.start( LACKEYDIR "/lackey", arguments); producer.waitForStarted(); QVERIFY(producer.error() != QProcess::FailedToStart); QList<QProcess*> consumers; unsigned int failedProcesses = 0; for (int i = 0; i < processes; ++i) { -#ifndef Q_OS_WINCE - QStringList arguments = QStringList() << SRCDIR "lackey/scripts/consumer.js"; -#else - QStringList arguments = QStringList() << QFileInfo(SRCDIR "lackey/scripts/consumer.js").absoluteFilePath(); -#endif + QStringList arguments = QStringList() << LACKEYDIR "/scripts/consumer.js"; QProcess *p = new QProcess; p->setProcessChannelMode(QProcess::ForwardedChannels); - p->start("./lackey/lackey", arguments); + p->start(LACKEYDIR "/lackey", arguments); if (p->waitForStarted(2000)) consumers.append(p); diff --git a/tests/auto/qsystemsemaphore/.gitignore b/tests/auto/qtipc/qsystemsemaphore/.gitignore index 2b60bfb..2b60bfb 100644 --- a/tests/auto/qsystemsemaphore/.gitignore +++ b/tests/auto/qtipc/qsystemsemaphore/.gitignore diff --git a/tests/auto/qtipc/qsystemsemaphore/files.qrc b/tests/auto/qtipc/qsystemsemaphore/files.qrc new file mode 100644 index 0000000..6296690 --- /dev/null +++ b/tests/auto/qtipc/qsystemsemaphore/files.qrc @@ -0,0 +1,7 @@ +<!DOCTYPE RCC><RCC version="1.0"> +<qresource> + <file alias="systemsemaphore_acquire.js">../lackey/scripts/systemsemaphore_acquire.js</file> + <file alias="systemsemaphore_release.js">../lackey/scripts/systemsemaphore_release.js</file> + <file alias="systemsemaphore_acquirerelease.js">../lackey/scripts/systemsemaphore_acquirerelease.js</file> +</qresource> +</RCC> diff --git a/tests/auto/qsystemsemaphore/test/test.pro b/tests/auto/qtipc/qsystemsemaphore/qsystemsemaphore.pro index ed7898c..1f9205e 100644 --- a/tests/auto/qsystemsemaphore/test/test.pro +++ b/tests/auto/qtipc/qsystemsemaphore/qsystemsemaphore.pro @@ -1,29 +1,24 @@ CONFIG += qttest_p4 #QT = core -include(../../qsharedmemory/src/src.pri) +include(../qsharedmemory/src/src.pri) win32: CONFIG += console DEFINES += QSHAREDMEMORY_DEBUG DEFINES += QSYSTEMSEMAPHORE_DEBUG -SOURCES += ../tst_qsystemsemaphore.cpp +SOURCES += tst_qsystemsemaphore.cpp TARGET = tst_qsystemsemaphore -DESTDIR = ../ -win32 { - CONFIG(debug, debug|release): DESTDIR = ../debug - else: DESTDIR = ../release -} -RESOURCES += ../files.qrc +RESOURCES += files.qrc wince*: { requires(contains(QT_CONFIG,script)) # this test calls lackey, which then again depends on QtScript. # let's add it here so that it gets deployed easily QT += script -lackey.sources = ../../qsharedmemory/lackey/lackey.exe -lackey.path = ../qsharedmemory/lackey +lackey.sources = ../lackey/lackey.exe +lackey.path = ../lackey DEPLOYMENT += lackey } @@ -34,7 +29,8 @@ requires(contains(QT_CONFIG,script)) # let's add it here so that it gets deployed easily QT += script -lackey.sources = ../../qsharedmemory/lackey/lackey.exe +lackey.sources = ../lackey/lackey.exe lackey.path = /sys/bin DEPLOYMENT += lackey } + diff --git a/tests/auto/qsystemsemaphore/tst_qsystemsemaphore.cpp b/tests/auto/qtipc/qsystemsemaphore/tst_qsystemsemaphore.cpp index bf4efdc..eb82fd4 100644 --- a/tests/auto/qsystemsemaphore/tst_qsystemsemaphore.cpp +++ b/tests/auto/qtipc/qsystemsemaphore/tst_qsystemsemaphore.cpp @@ -46,7 +46,7 @@ //TESTED_FILES= #define EXISTING_SHARE "existing" -#define LACKYLOC "../qsharedmemory/lackey" +#define LACKYLOC "../lackey" #define LACKYWAITTIME 10000 class tst_QSystemSemaphore : public QObject diff --git a/tests/auto/qtipc/qtipc.pro b/tests/auto/qtipc/qtipc.pro new file mode 100644 index 0000000..60037d2 --- /dev/null +++ b/tests/auto/qtipc/qtipc.pro @@ -0,0 +1,6 @@ +TEMPLATE=subdirs +SUBDIRS=\ + lackey \ + qsharedmemory \ + qsystemsemaphore \ + diff --git a/tests/auto/qtouchevent/tst_qtouchevent.cpp b/tests/auto/qtouchevent/tst_qtouchevent.cpp index 639f8e4..bb80fde 100644 --- a/tests/auto/qtouchevent/tst_qtouchevent.cpp +++ b/tests/auto/qtouchevent/tst_qtouchevent.cpp @@ -193,6 +193,7 @@ private slots: void multiPointRawEventTranslationOnTouchPad(); void deleteInEventHandler(); void deleteInRawEventTranslation(); + void crashInQGraphicsSceneAfterNotHandlingTouchBegin(); }; void tst_QTouchEvent::touchDisabledByDefault() @@ -1303,6 +1304,36 @@ void tst_QTouchEvent::deleteInRawEventTranslation() qt_translateRawTouchEvent(&touchWidget, QTouchEvent::TouchScreen, rawTouchPoints); } +void tst_QTouchEvent::crashInQGraphicsSceneAfterNotHandlingTouchBegin() +{ + QGraphicsRectItem *rect = new QGraphicsRectItem(0, 0, 100, 100); + rect->setAcceptTouchEvents(true); + + QGraphicsRectItem *mainRect = new QGraphicsRectItem(0, 0, 100, 100, rect); + mainRect->setBrush(Qt::lightGray); + + QGraphicsRectItem *button = new QGraphicsRectItem(-20, -20, 40, 40, mainRect); + button->setPos(50, 50); + button->setBrush(Qt::darkGreen); + + QGraphicsView view; + QGraphicsScene scene; + scene.addItem(rect); + scene.setSceneRect(0,0,100,100); + view.setScene(&scene); + + view.show(); + QTest::qWaitForWindowShown(&view); + + QPoint centerPos = view.mapFromScene(rect->boundingRect().center()); + // Touch the button + QTest::touchEvent(view.viewport()).press(0, centerPos); + QTest::touchEvent(view.viewport()).release(0, centerPos); + // Touch outside of the button + QTest::touchEvent(view.viewport()).press(0, view.mapFromScene(QPoint(10, 10))); + QTest::touchEvent(view.viewport()).release(0, view.mapFromScene(QPoint(10, 10))); +} + QTEST_MAIN(tst_QTouchEvent) #include "tst_qtouchevent.moc" diff --git a/tests/auto/qurl/tst_qurl.cpp b/tests/auto/qurl/tst_qurl.cpp index f108f4c..72ce393 100644 --- a/tests/auto/qurl/tst_qurl.cpp +++ b/tests/auto/qurl/tst_qurl.cpp @@ -1832,7 +1832,7 @@ void tst_QUrl::compat_constructor_01_data() QTest::addColumn<QString>("res"); //next we fill it with data - QTest::newRow( "data0" ) << QString("Makefile") << QString("Makefile"); // nolonger add file by defualt + QTest::newRow( "data0" ) << QString("Makefile") << QString("Makefile"); // nolonger add file by default QTest::newRow( "data1" ) << QString("Makefile") << QString("Makefile"); QTest::newRow( "data2" ) << QString("ftp://ftp.qt.nokia.com/qt/INSTALL") << QString("ftp://ftp.qt.nokia.com/qt/INSTALL"); QTest::newRow( "data3" ) << QString("ftp://ftp.qt.nokia.com/qt/INSTALL") << QString("ftp://ftp.qt.nokia.com/qt/INSTALL"); diff --git a/tests/auto/qvariant/tst_qvariant.cpp b/tests/auto/qvariant/tst_qvariant.cpp index 21b2fe3..a316dda 100644 --- a/tests/auto/qvariant/tst_qvariant.cpp +++ b/tests/auto/qvariant/tst_qvariant.cpp @@ -3200,7 +3200,10 @@ struct MyPrimitive return x == o.x && y == o.y; } }; + +QT_BEGIN_NAMESPACE Q_DECLARE_TYPEINFO(MyPrimitive, Q_PRIMITIVE_TYPE); +QT_END_NAMESPACE struct MyData { @@ -3239,7 +3242,9 @@ struct MyMovable int MyMovable::count = 0; +QT_BEGIN_NAMESPACE Q_DECLARE_TYPEINFO(MyMovable, Q_MOVABLE_TYPE); +QT_END_NAMESPACE Q_DECLARE_METATYPE(QList<QSize>) Q_DECLARE_METATYPE(MyPrimitive) diff --git a/tests/auto/qvideowidget/qvideowidget.pro b/tests/auto/qvideowidget/qvideowidget.pro new file mode 100644 index 0000000..ca0fc24 --- /dev/null +++ b/tests/auto/qvideowidget/qvideowidget.pro @@ -0,0 +1,6 @@ +load(qttest_p4) + +SOURCES = tst_qvideowidget.cpp + +QT = core gui multimedia + diff --git a/tests/auto/qvideowidget/tst_qvideowidget.cpp b/tests/auto/qvideowidget/tst_qvideowidget.cpp new file mode 100644 index 0000000..f703055 --- /dev/null +++ b/tests/auto/qvideowidget/tst_qvideowidget.cpp @@ -0,0 +1,1600 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (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 Technology Preview License Agreement accompanying +** this package. +** +** 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.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <QtTest/QtTest> + +#include <QtMultimedia/qvideowidget.h> + +#include <QtMultimedia/qmediaobject.h> +#include <QtMultimedia/qmediaservice.h> +#include <QtMultimedia/private/qpaintervideosurface_p.h> +#include <QtMultimedia/qvideooutputcontrol.h> +#include <QtMultimedia/qvideowindowcontrol.h> +#include <QtMultimedia/qvideowidgetcontrol.h> +#include <QtMultimedia/qvideorenderercontrol.h> +#include <QtMultimedia/qabstractvideosurface.h> +#include <QtMultimedia/qvideosurfaceformat.h> + +#include <QtGui/qapplication.h> + + +class tst_QVideoWidget : public QObject +{ + Q_OBJECT +private slots: + void nullObject(); + void nullService(); + void nullOutputControl(); + void noOutputs(); + void serviceDestroyed(); + void objectDestroyed(); + void setMediaObject(); + + void showWindowControl(); + void aspectRatioWindowControl(); + void sizeHintWindowControl_data() { sizeHint_data(); } + void sizeHintWindowControl(); + void brightnessWindowControl_data() { color_data(); } + void brightnessWindowControl(); + void contrastWindowControl_data() { color_data(); } + void contrastWindowControl(); + void hueWindowControl_data() { color_data(); } + void hueWindowControl(); + void saturationWindowControl_data() { color_data(); } + void saturationWindowControl(); + + void showWidgetControl(); + void aspectRatioWidgetControl(); + void sizeHintWidgetControl_data() { sizeHint_data(); } + void sizeHintWidgetControl(); + void brightnessWidgetControl_data() { color_data(); } + void brightnessWidgetControl(); + void contrastWidgetControl_data() { color_data(); } + void contrastWidgetControl(); + void hueWidgetControl_data() { color_data(); } + void hueWidgetControl(); + void saturationWidgetControl_data() { color_data(); } + void saturationWidgetControl(); + + void showRendererControl(); + void aspectRatioRendererControl(); + void sizeHintRendererControl_data(); + void sizeHintRendererControl(); + void brightnessRendererControl_data() { color_data(); } + void brightnessRendererControl(); + void contrastRendererControl_data() { color_data(); } + void contrastRendererControl(); + void hueRendererControl_data() { color_data(); } + void hueRendererControl(); + void saturationRendererControl_data() { color_data(); } + void saturationRendererControl(); + + void paintRendererControl(); + +#ifndef Q_WS_X11 + void fullScreenWindowControl(); + void fullScreenWidgetControl(); + void fullScreenRendererControl(); +#endif + +private: + void sizeHint_data(); + void color_data(); +}; + +Q_DECLARE_METATYPE(QVideoWidget::AspectRatioMode) +Q_DECLARE_METATYPE(const uchar *) + +class QtTestOutputControl : public QVideoOutputControl +{ +public: + QtTestOutputControl() : m_output(NoOutput) {} + + QList<Output> availableOutputs() const { return m_outputs; } + void setAvailableOutputs(const QList<Output> outputs) { m_outputs = outputs; } + + Output output() const { return m_output; } + virtual void setOutput(Output output) { m_output = output; } + +private: + Output m_output; + QList<Output> m_outputs; +}; + +class QtTestWindowControl : public QVideoWindowControl +{ +public: + QtTestWindowControl() + : m_winId(0) + , m_repaintCount(0) + , m_brightness(0) + , m_contrast(0) + , m_saturation(0) + , m_aspectRatioMode(QVideoWidget::KeepAspectRatio) + , m_fullScreen(0) + { + } + + WId winId() const { return m_winId; } + void setWinId(WId id) { m_winId = id; } + + QRect displayRect() const { return m_displayRect; } + void setDisplayRect(const QRect &rect) { m_displayRect = rect; } + + bool isFullScreen() const { return m_fullScreen; } + void setFullScreen(bool fullScreen) { emit fullScreenChanged(m_fullScreen = fullScreen); } + + int repaintCount() const { return m_repaintCount; } + void setRepaintCount(int count) { m_repaintCount = count; } + void repaint() { ++m_repaintCount; } + + QSize nativeSize() const { return m_nativeSize; } + void setNativeSize(const QSize &size) { m_nativeSize = size; emit nativeSizeChanged(); } + + QVideoWidget::AspectRatioMode aspectRatioMode() const { return m_aspectRatioMode; } + void setAspectRatioMode(QVideoWidget::AspectRatioMode mode) { m_aspectRatioMode = mode; } + + int brightness() const { return m_brightness; } + void setBrightness(int brightness) { emit brightnessChanged(m_brightness = brightness); } + + int contrast() const { return m_contrast; } + void setContrast(int contrast) { emit contrastChanged(m_contrast = contrast); } + + int hue() const { return m_hue; } + void setHue(int hue) { emit hueChanged(m_hue = hue); } + + int saturation() const { return m_saturation; } + void setSaturation(int saturation) { emit saturationChanged(m_saturation = saturation); } + +private: + WId m_winId; + int m_repaintCount; + int m_brightness; + int m_contrast; + int m_hue; + int m_saturation; + QVideoWidget::AspectRatioMode m_aspectRatioMode; + QRect m_displayRect; + QSize m_nativeSize; + bool m_fullScreen; +}; + +class QtTestWidgetControl : public QVideoWidgetControl +{ +public: + QtTestWidgetControl() + : m_brightness(1.0) + , m_contrast(1.0) + , m_hue(1.0) + , m_saturation(1.0) + , m_aspectRatioMode(QVideoWidget::KeepAspectRatio) + , m_fullScreen(false) + { + } + + bool isFullScreen() const { return m_fullScreen; } + void setFullScreen(bool fullScreen) { emit fullScreenChanged(m_fullScreen = fullScreen); } + + QVideoWidget::AspectRatioMode aspectRatioMode() const { return m_aspectRatioMode; } + void setAspectRatioMode(QVideoWidget::AspectRatioMode mode) { m_aspectRatioMode = mode; } + + int brightness() const { return m_brightness; } + void setBrightness(int brightness) { emit brightnessChanged(m_brightness = brightness); } + + int contrast() const { return m_contrast; } + void setContrast(int contrast) { emit contrastChanged(m_contrast = contrast); } + + int hue() const { return m_hue; } + void setHue(int hue) { emit hueChanged(m_hue = hue); } + + int saturation() const { return m_saturation; } + void setSaturation(int saturation) { emit saturationChanged(m_saturation = saturation); } + + void setSizeHint(const QSize &size) { m_widget.setSizeHint(size); } + + QWidget *videoWidget() { return &m_widget; } + +private: + class Widget : public QWidget + { + public: + QSize sizeHint() const { return m_sizeHint; } + void setSizeHint(const QSize &size) { m_sizeHint = size; updateGeometry(); } + private: + QSize m_sizeHint; + } m_widget; + int m_brightness; + int m_contrast; + int m_hue; + int m_saturation; + QVideoWidget::AspectRatioMode m_aspectRatioMode; + QSize m_sizeHint; + bool m_fullScreen; +}; + +class QtTestRendererControl : public QVideoRendererControl +{ +public: + QtTestRendererControl() + : m_surface(0) + { + } + + QAbstractVideoSurface *surface() const { return m_surface; } + void setSurface(QAbstractVideoSurface *surface) { m_surface = surface; } + +private: + QAbstractVideoSurface *m_surface; +}; + +class QtTestVideoService : public QMediaService +{ + Q_OBJECT +public: + QtTestVideoService( + QtTestOutputControl *output, + QtTestWindowControl *window, + QtTestWidgetControl *widget, + QtTestRendererControl *renderer) + : QMediaService(0) + , outputControl(output) + , windowControl(window) + , widgetControl(widget) + , rendererControl(renderer) + { + } + + ~QtTestVideoService() + { + delete outputControl; + delete windowControl; + delete widgetControl; + delete rendererControl; + } + + QMediaControl *control(const char *name) const + { + if (qstrcmp(name, QVideoOutputControl_iid) == 0) + return outputControl; + else if (qstrcmp(name, QVideoWindowControl_iid) == 0) + return windowControl; + else if (qstrcmp(name, QVideoWidgetControl_iid) == 0) + return widgetControl; + else if (qstrcmp(name, QVideoRendererControl_iid) == 0) + return rendererControl; + else + return 0; + } + + QtTestOutputControl *outputControl; + QtTestWindowControl *windowControl; + QtTestWidgetControl *widgetControl; + QtTestRendererControl *rendererControl; +}; + +class QtTestVideoObject : public QMediaObject +{ + Q_OBJECT +public: + QtTestVideoObject( + QtTestWindowControl *window, + QtTestWidgetControl *widget, + QtTestRendererControl *renderer): + QMediaObject(0, new QtTestVideoService(new QtTestOutputControl, window, widget, renderer)) + { + testService = qobject_cast<QtTestVideoService*>(service()); + QList<QVideoOutputControl::Output> outputs; + + if (window) + outputs.append(QVideoOutputControl::WindowOutput); + if (widget) + outputs.append(QVideoOutputControl::WidgetOutput); + if (renderer) + outputs.append(QVideoOutputControl::RendererOutput); + + testService->outputControl->setAvailableOutputs(outputs); + } + + QtTestVideoObject(QtTestVideoService *service): + QMediaObject(0, service), + testService(service) + { + } + + ~QtTestVideoObject() + { + delete testService; + } + + QtTestVideoService *testService; +}; + +void tst_QVideoWidget::nullObject() +{ + QVideoWidget widget; + widget.setWindowFlags(Qt::X11BypassWindowManagerHint); + + QVERIFY(widget.sizeHint().isEmpty()); + + widget.setFullScreen(true); + QTest::qWaitForWindowShown(&widget); + QCOMPARE(widget.isFullScreen(), true); + + widget.setAspectRatioMode(QVideoWidget::IgnoreAspectRatio); + QCOMPARE(widget.aspectRatioMode(), QVideoWidget::IgnoreAspectRatio); + + { + QSignalSpy spy(&widget, SIGNAL(brightnessChanged(int))); + + widget.setBrightness(100); + QCOMPARE(widget.brightness(), 100); + QCOMPARE(spy.count(), 1); + QCOMPARE(spy.value(0).value(0).toInt(), 100); + + widget.setBrightness(100); + QCOMPARE(widget.brightness(), 100); + QCOMPARE(spy.count(), 1); + + widget.setBrightness(-120); + QCOMPARE(widget.brightness(), -100); + QCOMPARE(spy.count(), 2); + QCOMPARE(spy.value(1).value(0).toInt(), -100); + } { + QSignalSpy spy(&widget, SIGNAL(contrastChanged(int))); + + widget.setContrast(100); + QCOMPARE(widget.contrast(), 100); + QCOMPARE(spy.count(), 1); + QCOMPARE(spy.value(0).value(0).toInt(), 100); + + widget.setContrast(100); + QCOMPARE(widget.contrast(), 100); + QCOMPARE(spy.count(), 1); + + widget.setContrast(-120); + QCOMPARE(widget.contrast(), -100); + QCOMPARE(spy.count(), 2); + QCOMPARE(spy.value(1).value(0).toInt(), -100); + } { + QSignalSpy spy(&widget, SIGNAL(hueChanged(int))); + + widget.setHue(100); + QCOMPARE(widget.hue(), 100); + QCOMPARE(spy.count(), 1); + QCOMPARE(spy.value(0).value(0).toInt(), 100); + + widget.setHue(100); + QCOMPARE(widget.hue(), 100); + QCOMPARE(spy.count(), 1); + + widget.setHue(-120); + QCOMPARE(widget.hue(), -100); + QCOMPARE(spy.count(), 2); + QCOMPARE(spy.value(1).value(0).toInt(), -100); + } { + QSignalSpy spy(&widget, SIGNAL(saturationChanged(int))); + + widget.setSaturation(100); + QCOMPARE(widget.saturation(), 100); + QCOMPARE(spy.count(), 1); + QCOMPARE(spy.value(0).value(0).toInt(), 100); + + widget.setSaturation(100); + QCOMPARE(widget.saturation(), 100); + QCOMPARE(spy.count(), 1); + + widget.setSaturation(-120); + QCOMPARE(widget.saturation(), -100); + QCOMPARE(spy.count(), 2); + QCOMPARE(spy.value(1).value(0).toInt(), -100); + } +} + +void tst_QVideoWidget::nullService() +{ + QtTestVideoObject object(0); + + QVideoWidget widget; + widget.setMediaObject(&object); + + widget.setWindowFlags(Qt::X11BypassWindowManagerHint); + + QVERIFY(widget.sizeHint().isEmpty()); + + widget.setFullScreen(true); + QTest::qWaitForWindowShown(&widget); + QCOMPARE(widget.isFullScreen(), true); + + widget.setAspectRatioMode(QVideoWidget::IgnoreAspectRatio); + QCOMPARE(widget.aspectRatioMode(), QVideoWidget::IgnoreAspectRatio); + + widget.setBrightness(100); + QCOMPARE(widget.brightness(), 100); + + widget.setContrast(100); + QCOMPARE(widget.contrast(), 100); + + widget.setHue(100); + QCOMPARE(widget.hue(), 100); + + widget.setSaturation(100); + QCOMPARE(widget.saturation(), 100); +} + +void tst_QVideoWidget::nullOutputControl() +{ + QtTestVideoObject object(new QtTestVideoService(0, 0, 0, 0)); + + QVideoWidget widget; + widget.setMediaObject(&object); + widget.setWindowFlags(Qt::X11BypassWindowManagerHint); + + QVERIFY(widget.sizeHint().isEmpty()); + + widget.setFullScreen(true); + QTest::qWaitForWindowShown(&widget); + QCOMPARE(widget.isFullScreen(), true); + + widget.setBrightness(100); + QCOMPARE(widget.brightness(), 100); + + widget.setContrast(100); + QCOMPARE(widget.contrast(), 100); + + widget.setHue(100); + QCOMPARE(widget.hue(), 100); + + widget.setSaturation(100); + QCOMPARE(widget.saturation(), 100); +} + +void tst_QVideoWidget::noOutputs() +{ + QtTestVideoObject object(0, 0, 0); + + QVideoWidget widget; + widget.setMediaObject(&object); + widget.setWindowFlags(Qt::X11BypassWindowManagerHint); + + QVERIFY(widget.sizeHint().isEmpty()); + + widget.setFullScreen(true); + QCOMPARE(widget.isFullScreen(), true); + + widget.setBrightness(100); + QCOMPARE(widget.brightness(), 100); + + widget.setContrast(100); + QCOMPARE(widget.contrast(), 100); + + widget.setHue(100); + QCOMPARE(widget.hue(), 100); + + widget.setSaturation(100); + QCOMPARE(widget.saturation(), 100); +} + +void tst_QVideoWidget::serviceDestroyed() +{ + QtTestVideoObject object(new QtTestWindowControl, new QtTestWidgetControl, 0); + + QVideoWidget widget; + widget.setMediaObject(&object); + widget.setWindowFlags(Qt::X11BypassWindowManagerHint); + + widget.show(); + QTest::qWaitForWindowShown(&widget); + + widget.setBrightness(100); + widget.setContrast(100); + widget.setHue(100); + widget.setSaturation(100); + + delete object.testService; + object.testService = 0; + + QCOMPARE(widget.mediaObject(), static_cast<QMediaObject *>(&object)); + + QCOMPARE(widget.brightness(), 100); + QCOMPARE(widget.contrast(), 100); + QCOMPARE(widget.hue(), 100); + QCOMPARE(widget.saturation(), 100); + + widget.setFullScreen(true); + QCOMPARE(widget.isFullScreen(), true); +} + +void tst_QVideoWidget::objectDestroyed() +{ + QtTestVideoObject *object = new QtTestVideoObject( + new QtTestWindowControl, + new QtTestWidgetControl, + 0); + + QVideoWidget widget; + widget.setMediaObject(object); + widget.setWindowFlags(Qt::X11BypassWindowManagerHint); + + widget.show(); + QTest::qWaitForWindowShown(&widget); + + widget.setBrightness(100); + widget.setContrast(100); + widget.setHue(100); + widget.setSaturation(100); + + // Delete the media object without deleting the service. + QtTestVideoService *service = object->testService; + object->testService = 0; + + delete object; + object = 0; + + QCOMPARE(widget.mediaObject(), static_cast<QMediaObject *>(object)); + + QCOMPARE(service->outputControl->output(), QVideoOutputControl::NoOutput); + + QCOMPARE(widget.brightness(), 100); + QCOMPARE(widget.contrast(), 100); + QCOMPARE(widget.hue(), 100); + QCOMPARE(widget.saturation(), 100); + + widget.setFullScreen(true); + QCOMPARE(widget.isFullScreen(), true); + + delete service; +} + +void tst_QVideoWidget::setMediaObject() +{ + QMediaObject *nullObject = 0; + QtTestVideoObject windowObject(new QtTestWindowControl, 0, 0); + QtTestVideoObject widgetObject(0, new QtTestWidgetControl, 0); + QtTestVideoObject rendererObject(0, 0, new QtTestRendererControl); + + QVideoWidget widget; + widget.setWindowFlags(Qt::X11BypassWindowManagerHint); + + widget.show(); + QTest::qWaitForWindowShown(&widget); + + QCOMPARE(widget.mediaObject(), nullObject); + QCOMPARE(windowObject.testService->outputControl->output(), QVideoOutputControl::NoOutput); + QCOMPARE(widgetObject.testService->outputControl->output(), QVideoOutputControl::NoOutput); + QCOMPARE(rendererObject.testService->outputControl->output(), QVideoOutputControl::NoOutput); + + widget.setMediaObject(&windowObject); + QCOMPARE(widget.mediaObject(), static_cast<QMediaObject *>(&windowObject)); + QCOMPARE(windowObject.testService->outputControl->output(), QVideoOutputControl::WindowOutput); + QVERIFY(windowObject.testService->windowControl->winId() != 0); + + + widget.setMediaObject(&widgetObject); + QCOMPARE(widget.mediaObject(), static_cast<QMediaObject *>(&widgetObject)); + QCOMPARE(widgetObject.testService->outputControl->output(), QVideoOutputControl::WidgetOutput); + + QCoreApplication::processEvents(QEventLoop::AllEvents); + QCOMPARE(widgetObject.testService->widgetControl->videoWidget()->isVisible(), true); + + QCOMPARE(windowObject.testService->outputControl->output(), QVideoOutputControl::NoOutput); + + widget.setMediaObject(&rendererObject); + QCOMPARE(widget.mediaObject(), static_cast<QMediaObject *>(&rendererObject)); + QCOMPARE(rendererObject.testService->outputControl->output(), QVideoOutputControl::RendererOutput); + QVERIFY(rendererObject.testService->rendererControl->surface() != 0); + + QCOMPARE(widgetObject.testService->outputControl->output(), QVideoOutputControl::NoOutput); + + widget.setMediaObject(0); + QCOMPARE(widget.mediaObject(), nullObject); + + QCOMPARE(rendererObject.testService->outputControl->output(), QVideoOutputControl::NoOutput); +} + +void tst_QVideoWidget::showWindowControl() +{ + QtTestVideoObject object(new QtTestWindowControl, 0, 0); + object.testService->windowControl->setNativeSize(QSize(240, 180)); + + QVideoWidget widget; + widget.setMediaObject(&object); + widget.setWindowFlags(Qt::X11BypassWindowManagerHint); + + QCOMPARE(object.testService->outputControl->output(), QVideoOutputControl::NoOutput); + + widget.show(); + QTest::qWaitForWindowShown(&widget); + + QCOMPARE(object.testService->outputControl->output(), QVideoOutputControl::WindowOutput); + QVERIFY(object.testService->windowControl->winId() != 0); + + QVERIFY(object.testService->windowControl->repaintCount() > 0); + + widget.resize(640, 480); + QCOMPARE(object.testService->windowControl->displayRect(), QRect(0, 0, 640, 480)); + + widget.move(10, 10); + QCOMPARE(object.testService->windowControl->displayRect(), QRect(0, 0, 640, 480)); + + widget.hide(); + + QCOMPARE(object.testService->outputControl->output(), QVideoOutputControl::WindowOutput); +} + +void tst_QVideoWidget::showWidgetControl() +{ + QtTestVideoObject object(0, new QtTestWidgetControl, 0); + QVideoWidget widget; + widget.setMediaObject(&object); + widget.setWindowFlags(Qt::X11BypassWindowManagerHint); + + QCOMPARE(object.testService->outputControl->output(), QVideoOutputControl::NoOutput); + + widget.show(); + QTest::qWaitForWindowShown(&widget); + + QCOMPARE(object.testService->outputControl->output(), QVideoOutputControl::WidgetOutput); + QCOMPARE(object.testService->widgetControl->videoWidget()->isVisible(), true); + + widget.resize(640, 480); + + widget.move(10, 10); + + widget.hide(); + + QCOMPARE(object.testService->outputControl->output(), QVideoOutputControl::WidgetOutput); + QCOMPARE(object.testService->widgetControl->videoWidget()->isVisible(), false); +} + +void tst_QVideoWidget::showRendererControl() +{ + QtTestVideoObject object(0, 0, new QtTestRendererControl); + QVideoWidget widget; + widget.setMediaObject(&object); + widget.setWindowFlags(Qt::X11BypassWindowManagerHint); + + QCOMPARE(object.testService->outputControl->output(), QVideoOutputControl::NoOutput); + + widget.show(); + QTest::qWaitForWindowShown(&widget); + + QCOMPARE(object.testService->outputControl->output(), QVideoOutputControl::RendererOutput); + QVERIFY(object.testService->rendererControl->surface() != 0); + + widget.resize(640, 480); + + widget.move(10, 10); + + widget.hide(); + + QCOMPARE(object.testService->outputControl->output(), QVideoOutputControl::RendererOutput); +} + +void tst_QVideoWidget::aspectRatioWindowControl() +{ + QtTestVideoObject object(new QtTestWindowControl, 0, 0); + object.testService->windowControl->setAspectRatioMode(QVideoWidget::IgnoreAspectRatio); + + QVideoWidget widget; + widget.setMediaObject(&object); + widget.setWindowFlags(Qt::X11BypassWindowManagerHint); + + // Test the aspect ratio defaults to keeping the aspect ratio. + QCOMPARE(widget.aspectRatioMode(), QVideoWidget::KeepAspectRatio); + + // Test the control has been informed of the aspect ratio change, post show. + widget.show(); + QTest::qWaitForWindowShown(&widget); + QCOMPARE(widget.aspectRatioMode(), QVideoWidget::KeepAspectRatio); + QCOMPARE(object.testService->windowControl->aspectRatioMode(), QVideoWidget::KeepAspectRatio); + + // Test an aspect ratio change is enforced immediately while visible. + widget.setAspectRatioMode(QVideoWidget::IgnoreAspectRatio); + QCOMPARE(widget.aspectRatioMode(), QVideoWidget::IgnoreAspectRatio); + QCOMPARE(object.testService->windowControl->aspectRatioMode(), QVideoWidget::IgnoreAspectRatio); + + // Test an aspect ratio set while not visible is respected. + widget.hide(); + widget.setAspectRatioMode(QVideoWidget::KeepAspectRatio); + QCOMPARE(widget.aspectRatioMode(), QVideoWidget::KeepAspectRatio); + widget.show(); + QCOMPARE(widget.aspectRatioMode(), QVideoWidget::KeepAspectRatio); + QCOMPARE(object.testService->windowControl->aspectRatioMode(), QVideoWidget::KeepAspectRatio); +} + +void tst_QVideoWidget::aspectRatioWidgetControl() +{ + QtTestVideoObject object(0, new QtTestWidgetControl, 0); + object.testService->widgetControl->setAspectRatioMode(QVideoWidget::IgnoreAspectRatio); + + QVideoWidget widget; + widget.setMediaObject(&object); + widget.setWindowFlags(Qt::X11BypassWindowManagerHint); + + // Test the aspect ratio defaults to keeping the aspect ratio. + QCOMPARE(widget.aspectRatioMode(), QVideoWidget::KeepAspectRatio); + + // Test the control has been informed of the aspect ratio change, post show. + widget.show(); + QTest::qWaitForWindowShown(&widget); + QCOMPARE(widget.aspectRatioMode(), QVideoWidget::KeepAspectRatio); + QCOMPARE(object.testService->widgetControl->aspectRatioMode(), QVideoWidget::KeepAspectRatio); + + // Test an aspect ratio change is enforced immediately while visible. + widget.setAspectRatioMode(QVideoWidget::IgnoreAspectRatio); + QCOMPARE(widget.aspectRatioMode(), QVideoWidget::IgnoreAspectRatio); + QCOMPARE(object.testService->widgetControl->aspectRatioMode(), QVideoWidget::IgnoreAspectRatio); + + // Test an aspect ratio set while not visible is respected. + widget.hide(); + widget.setAspectRatioMode(QVideoWidget::KeepAspectRatio); + QCOMPARE(widget.aspectRatioMode(), QVideoWidget::KeepAspectRatio); + widget.show(); + QCOMPARE(widget.aspectRatioMode(), QVideoWidget::KeepAspectRatio); + QCOMPARE(object.testService->widgetControl->aspectRatioMode(), QVideoWidget::KeepAspectRatio); +} + +void tst_QVideoWidget::aspectRatioRendererControl() +{ + QtTestVideoObject object(0, 0, new QtTestRendererControl); + + QVideoWidget widget; + widget.setMediaObject(&object); + widget.setWindowFlags(Qt::X11BypassWindowManagerHint); + + // Test the aspect ratio defaults to keeping the aspect ratio. + QCOMPARE(widget.aspectRatioMode(), QVideoWidget::KeepAspectRatio); + + // Test the control has been informed of the aspect ratio change, post show. + widget.show(); + QTest::qWaitForWindowShown(&widget); + QCOMPARE(widget.aspectRatioMode(), QVideoWidget::KeepAspectRatio); + + // Test an aspect ratio change is enforced immediately while visible. + widget.setAspectRatioMode(QVideoWidget::IgnoreAspectRatio); + QCOMPARE(widget.aspectRatioMode(), QVideoWidget::IgnoreAspectRatio); + + // Test an aspect ratio set while not visible is respected. + widget.hide(); + widget.setAspectRatioMode(QVideoWidget::KeepAspectRatio); + QCOMPARE(widget.aspectRatioMode(), QVideoWidget::KeepAspectRatio); + widget.show(); + QCOMPARE(widget.aspectRatioMode(), QVideoWidget::KeepAspectRatio); +} + +void tst_QVideoWidget::sizeHint_data() +{ + QTest::addColumn<QSize>("size"); + + QTest::newRow("720x576") + << QSize(720, 576); +} + +void tst_QVideoWidget::sizeHintWindowControl() +{ + QFETCH(QSize, size); + + QtTestVideoObject object(new QtTestWindowControl, 0, 0); + QVideoWidget widget; + widget.setMediaObject(&object); + widget.setWindowFlags(Qt::X11BypassWindowManagerHint); + widget.show(); + QTest::qWaitForWindowShown(&widget); + + QVERIFY(widget.sizeHint().isEmpty()); + + object.testService->windowControl->setNativeSize(size); + QCOMPARE(widget.sizeHint(), size); +} + +void tst_QVideoWidget::sizeHintWidgetControl() +{ + QFETCH(QSize, size); + + QtTestVideoObject object(0, new QtTestWidgetControl, 0); + QVideoWidget widget; + widget.setMediaObject(&object); + widget.setWindowFlags(Qt::X11BypassWindowManagerHint); + widget.show(); + QTest::qWaitForWindowShown(&widget); + + QVERIFY(widget.sizeHint().isEmpty()); + + object.testService->widgetControl->setSizeHint(size); + QCOMPARE(widget.sizeHint(), size); +} + +void tst_QVideoWidget::sizeHintRendererControl_data() +{ + QTest::addColumn<QSize>("frameSize"); + QTest::addColumn<QRect>("viewport"); + QTest::addColumn<QSize>("pixelAspectRatio"); + QTest::addColumn<QSize>("expectedSize"); + + QTest::newRow("640x480") + << QSize(640, 480) + << QRect(0, 0, 640, 480) + << QSize(1, 1) + << QSize(640, 480); + + QTest::newRow("800x600, (80,60, 640x480) viewport") + << QSize(800, 600) + << QRect(80, 60, 640, 480) + << QSize(1, 1) + << QSize(640, 480); + + QTest::newRow("800x600, (80,60, 640x480) viewport, 4:3") + << QSize(800, 600) + << QRect(80, 60, 640, 480) + << QSize(4, 3) + << QSize(853, 480); + +} + +void tst_QVideoWidget::sizeHintRendererControl() +{ + QFETCH(QSize, frameSize); + QFETCH(QRect, viewport); + QFETCH(QSize, pixelAspectRatio); + QFETCH(QSize, expectedSize); + + QtTestVideoObject object(0, 0, new QtTestRendererControl); + QVideoWidget widget; + widget.setMediaObject(&object); + widget.setWindowFlags(Qt::X11BypassWindowManagerHint); + + widget.show(); + QTest::qWaitForWindowShown(&widget); + + QVideoSurfaceFormat format(frameSize, QVideoFrame::Format_ARGB32); + format.setViewport(viewport); + format.setPixelAspectRatio(pixelAspectRatio); + + QVERIFY(object.testService->rendererControl->surface()->start(format)); + + QCOMPARE(widget.sizeHint(), expectedSize); +} + +#ifndef Q_WS_X11 + +void tst_QVideoWidget::fullScreenWindowControl() +{ + QtTestVideoObject object(new QtTestWindowControl, 0, 0); + QVideoWidget widget; + widget.setMediaObject(&object); + widget.show(); + QTest::qWaitForWindowShown(&widget); + + Qt::WindowFlags windowFlags = widget.windowFlags(); + + QSignalSpy spy(&widget, SIGNAL(fullScreenChanged(bool))); + + // Test showing full screen with setFullScreen(true). + widget.setFullScreen(true); + QTest::qWaitForWindowShown(&widget); + QCOMPARE(object.testService->windowControl->isFullScreen(), true); + QCOMPARE(widget.isFullScreen(), true); + QCOMPARE(spy.count(), 1); + QCOMPARE(spy.value(0).value(0).toBool(), true); + + // Test returning to normal with setFullScreen(false). + widget.setFullScreen(false); + QTest::qWaitForWindowShown(&widget); + QCOMPARE(object.testService->windowControl->isFullScreen(), false); + QCOMPARE(widget.isFullScreen(), false); + QCOMPARE(spy.count(), 2); + QCOMPARE(spy.value(1).value(0).toBool(), false); + QCOMPARE(widget.windowFlags(), windowFlags); + + // Test showing full screen with showFullScreen(). + widget.showFullScreen(); + QTest::qWaitForWindowShown(&widget); + QCOMPARE(object.testService->windowControl->isFullScreen(), true); + QCOMPARE(widget.isFullScreen(), true); + QCOMPARE(spy.count(), 3); + QCOMPARE(spy.value(2).value(0).toBool(), true); + + // Test returning to normal with showNormal(). + widget.showNormal(); + QTest::qWaitForWindowShown(&widget); + QCOMPARE(object.testService->windowControl->isFullScreen(), false); + QCOMPARE(widget.isFullScreen(), false); + QCOMPARE(spy.count(), 4); + QCOMPARE(spy.value(3).value(0).toBool(), false); + QCOMPARE(widget.windowFlags(), windowFlags); + + // Test setFullScreen(false) and showNormal() do nothing when isFullScreen() == false. + widget.setFullScreen(false); + QCOMPARE(object.testService->windowControl->isFullScreen(), false); + QCOMPARE(widget.isFullScreen(), false); + QCOMPARE(spy.count(), 4); + widget.showNormal(); + QTest::qWaitForWindowShown(&widget); + QCOMPARE(object.testService->windowControl->isFullScreen(), false); + QCOMPARE(widget.isFullScreen(), false); + QCOMPARE(spy.count(), 4); + + // Test setFullScreen(true) and showFullScreen() do nothing when isFullScreen() == true. + widget.showFullScreen(); + QTest::qWaitForWindowShown(&widget); + widget.setFullScreen(true); + QCOMPARE(object.testService->windowControl->isFullScreen(), true); + QCOMPARE(widget.isFullScreen(), true); + QCOMPARE(spy.count(), 5); + widget.showFullScreen(); + QCOMPARE(object.testService->windowControl->isFullScreen(), true); + QCOMPARE(widget.isFullScreen(), true); + QCOMPARE(spy.count(), 5); + + // Test if the window control exits full screen mode, the widget follows suit. + object.testService->windowControl->setFullScreen(false); + QCOMPARE(widget.isFullScreen(), false); + QCOMPARE(spy.count(), 6); + QCOMPARE(spy.value(5).value(0).toBool(), false); + + // Test if the window control enters full screen mode, the widget does nothing. + object.testService->windowControl->setFullScreen(false); + QCOMPARE(widget.isFullScreen(), false); + QCOMPARE(spy.count(), 6); +} + +void tst_QVideoWidget::fullScreenWidgetControl() +{ + QtTestVideoObject object(0, new QtTestWidgetControl, 0); + QVideoWidget widget; + widget.setMediaObject(&object); + widget.show(); + QTest::qWaitForWindowShown(&widget); + + Qt::WindowFlags windowFlags = widget.windowFlags(); + + QSignalSpy spy(&widget, SIGNAL(fullScreenChanged(bool))); + + // Test showing full screen with setFullScreen(true). + widget.setFullScreen(true); + QTest::qWaitForWindowShown(&widget); + QCOMPARE(object.testService->widgetControl->isFullScreen(), true); + QCOMPARE(widget.isFullScreen(), true); + QCOMPARE(spy.count(), 1); + QCOMPARE(spy.value(0).value(0).toBool(), true); + + // Test returning to normal with setFullScreen(false). + widget.setFullScreen(false); + QTest::qWaitForWindowShown(&widget); + QCOMPARE(object.testService->widgetControl->isFullScreen(), false); + QCOMPARE(widget.isFullScreen(), false); + QCOMPARE(spy.count(), 2); + QCOMPARE(spy.value(1).value(0).toBool(), false); + QCOMPARE(widget.windowFlags(), windowFlags); + + // Test showing full screen with showFullScreen(). + widget.showFullScreen(); + QTest::qWaitForWindowShown(&widget); + QCOMPARE(object.testService->widgetControl->isFullScreen(), true); + QCOMPARE(widget.isFullScreen(), true); + QCOMPARE(spy.count(), 3); + QCOMPARE(spy.value(2).value(0).toBool(), true); + + // Test returning to normal with showNormal(). + widget.showNormal(); + QTest::qWaitForWindowShown(&widget); + QCOMPARE(object.testService->widgetControl->isFullScreen(), false); + QCOMPARE(widget.isFullScreen(), false); + QCOMPARE(spy.count(), 4); + QCOMPARE(spy.value(3).value(0).toBool(), false); + QCOMPARE(widget.windowFlags(), windowFlags); + + // Test setFullScreen(false) and showNormal() do nothing when isFullScreen() == false. + widget.setFullScreen(false); + QCOMPARE(object.testService->widgetControl->isFullScreen(), false); + QCOMPARE(widget.isFullScreen(), false); + QCOMPARE(spy.count(), 4); + widget.showNormal(); + QCOMPARE(object.testService->widgetControl->isFullScreen(), false); + QCOMPARE(widget.isFullScreen(), false); + QCOMPARE(spy.count(), 4); + + // Test setFullScreen(true) and showFullScreen() do nothing when isFullScreen() == true. + widget.showFullScreen(); + QTest::qWaitForWindowShown(&widget); + widget.setFullScreen(true); + QCOMPARE(object.testService->widgetControl->isFullScreen(), true); + QCOMPARE(widget.isFullScreen(), true); + QCOMPARE(spy.count(), 5); + widget.showFullScreen(); + QCOMPARE(object.testService->widgetControl->isFullScreen(), true); + QCOMPARE(widget.isFullScreen(), true); + QCOMPARE(spy.count(), 5); + + // Test if the window control exits full screen mode, the widget follows suit. + object.testService->widgetControl->setFullScreen(false); + QTest::qWaitForWindowShown(&widget); + QCOMPARE(widget.isFullScreen(), false); + QCOMPARE(spy.count(), 6); + QCOMPARE(spy.value(5).value(0).toBool(), false); + + // Test if the window control enters full screen mode, the widget does nothing. + object.testService->widgetControl->setFullScreen(false); + QCOMPARE(widget.isFullScreen(), false); + QCOMPARE(spy.count(), 6); +} + + +void tst_QVideoWidget::fullScreenRendererControl() +{ + QtTestVideoObject object(0, 0, new QtTestRendererControl); + QVideoWidget widget; + widget.setMediaObject(&object); + widget.show(); + QTest::qWaitForWindowShown(&widget); + + Qt::WindowFlags windowFlags = widget.windowFlags(); + + QSignalSpy spy(&widget, SIGNAL(fullScreenChanged(bool))); + + // Test showing full screen with setFullScreen(true). + widget.setFullScreen(true); + QTest::qWaitForWindowShown(&widget); + QCOMPARE(widget.isFullScreen(), true); + QCOMPARE(spy.count(), 1); + QCOMPARE(spy.value(0).value(0).toBool(), true); + + // Test returning to normal with setFullScreen(false). + widget.setFullScreen(false); + QTest::qWaitForWindowShown(&widget); + QCOMPARE(widget.isFullScreen(), false); + QCOMPARE(spy.count(), 2); + QCOMPARE(spy.value(1).value(0).toBool(), false); + QCOMPARE(widget.windowFlags(), windowFlags); + + // Test showing full screen with showFullScreen(). + widget.showFullScreen(); + QTest::qWaitForWindowShown(&widget); + QCOMPARE(widget.isFullScreen(), true); + QCOMPARE(spy.count(), 3); + QCOMPARE(spy.value(2).value(0).toBool(), true); + + // Test returning to normal with showNormal(). + widget.showNormal(); + QTest::qWaitForWindowShown(&widget); + QCOMPARE(widget.isFullScreen(), false); + QCOMPARE(spy.count(), 4); + QCOMPARE(spy.value(3).value(0).toBool(), false); + QCOMPARE(widget.windowFlags(), windowFlags); + + // Test setFullScreen(false) and showNormal() do nothing when isFullScreen() == false. + widget.setFullScreen(false); + QCOMPARE(widget.isFullScreen(), false); + QCOMPARE(spy.count(), 4); + widget.showNormal(); + QCOMPARE(widget.isFullScreen(), false); + QCOMPARE(spy.count(), 4); + + // Test setFullScreen(true) and showFullScreen() do nothing when isFullScreen() == true. + widget.showFullScreen(); + QTest::qWaitForWindowShown(&widget); + widget.setFullScreen(true); + QCOMPARE(widget.isFullScreen(), true); + QCOMPARE(spy.count(), 5); + widget.showFullScreen(); + QCOMPARE(widget.isFullScreen(), true); + QCOMPARE(spy.count(), 5); +} + +#endif + +void tst_QVideoWidget::color_data() +{ + QTest::addColumn<int>("controlValue"); + QTest::addColumn<int>("value"); + QTest::addColumn<int>("expectedValue"); + + QTest::newRow("12") + << 0 + << 12 + << 12; + QTest::newRow("-56") + << 87 + << -56 + << -56; + QTest::newRow("100") + << 32 + << 100 + << 100; + QTest::newRow("1294") + << 0 + << 1294 + << 100; + QTest::newRow("-102") + << 34 + << -102 + << -100; +} + +void tst_QVideoWidget::brightnessWindowControl() +{ + QFETCH(int, controlValue); + QFETCH(int, value); + QFETCH(int, expectedValue); + + QtTestVideoObject object(new QtTestWindowControl, 0, 0); + object.testService->windowControl->setBrightness(controlValue); + + QVideoWidget widget; + widget.setMediaObject(&object); + widget.setWindowFlags(Qt::X11BypassWindowManagerHint); + widget.show(); + QTest::qWaitForWindowShown(&widget); + + // Test the video widget resets the controls starting brightness to the default. + QCOMPARE(widget.brightness(), 0); + + QSignalSpy spy(&widget, SIGNAL(brightnessChanged(int))); + + // Test the video widget sets the brightness value, bounded if necessary and emits a changed + // signal. + widget.setBrightness(value); + QCOMPARE(widget.brightness(), expectedValue); + QCOMPARE(object.testService->windowControl->brightness(), expectedValue); + QCOMPARE(spy.count(), 1); + QCOMPARE(spy.value(0).value(0).toInt(), expectedValue); + + // Test the changed signal isn't emitted if the value is unchanged. + widget.setBrightness(value); + QCOMPARE(widget.brightness(), expectedValue); + QCOMPARE(object.testService->windowControl->brightness(), expectedValue); + QCOMPARE(spy.count(), 1); + + // Test the changed signal is emitted if the brightness is changed internally. + object.testService->windowControl->setBrightness(controlValue); + QCOMPARE(widget.brightness(), controlValue); + QCOMPARE(spy.count(), 2); + QCOMPARE(spy.value(1).value(0).toInt(), controlValue); +} + +void tst_QVideoWidget::brightnessWidgetControl() +{ + QFETCH(int, controlValue); + QFETCH(int, value); + QFETCH(int, expectedValue); + + QtTestVideoObject object(0, new QtTestWidgetControl, 0); + object.testService->widgetControl->setBrightness(controlValue); + + QVideoWidget widget; + widget.setMediaObject(&object); + widget.setWindowFlags(Qt::X11BypassWindowManagerHint); + + QCOMPARE(widget.brightness(), 0); + + widget.show(); + QTest::qWaitForWindowShown(&widget); + + QSignalSpy spy(&widget, SIGNAL(brightnessChanged(int))); + + widget.setBrightness(value); + QCOMPARE(widget.brightness(), expectedValue); + QCOMPARE(object.testService->widgetControl->brightness(), expectedValue); + QCOMPARE(spy.count(), 1); + QCOMPARE(spy.value(0).value(0).toInt(), expectedValue); + + widget.setBrightness(value); + QCOMPARE(widget.brightness(), expectedValue); + QCOMPARE(object.testService->widgetControl->brightness(), expectedValue); + QCOMPARE(spy.count(), 1); + + object.testService->widgetControl->setBrightness(controlValue); + QCOMPARE(widget.brightness(), controlValue); + QCOMPARE(spy.count(), 2); + QCOMPARE(spy.value(1).value(0).toInt(), controlValue); +} + +void tst_QVideoWidget::brightnessRendererControl() +{ + QFETCH(int, value); + QFETCH(int, expectedValue); + + QtTestVideoObject object(0, 0, new QtTestRendererControl); + + QVideoWidget widget; + widget.setMediaObject(&object); + widget.setWindowFlags(Qt::X11BypassWindowManagerHint); + widget.show(); + QTest::qWaitForWindowShown(&widget); + + QSignalSpy spy(&widget, SIGNAL(brightnessChanged(int))); + + widget.setBrightness(value); + QCOMPARE(widget.brightness(), expectedValue); + QCOMPARE(spy.count(), 1); + QCOMPARE(spy.value(0).value(0).toInt(), expectedValue); + + widget.setBrightness(value); + QCOMPARE(widget.brightness(), expectedValue); + QCOMPARE(spy.count(), 1); +} + +void tst_QVideoWidget::contrastWindowControl() +{ + QFETCH(int, controlValue); + QFETCH(int, value); + QFETCH(int, expectedValue); + + QtTestVideoObject object(new QtTestWindowControl, 0, 0); + object.testService->windowControl->setContrast(controlValue); + + QVideoWidget widget; + widget.setMediaObject(&object); + widget.setWindowFlags(Qt::X11BypassWindowManagerHint); + + QCOMPARE(widget.contrast(), 0); + + widget.show(); + QTest::qWaitForWindowShown(&widget); + QCOMPARE(widget.contrast(), 0); + + QSignalSpy spy(&widget, SIGNAL(contrastChanged(int))); + + widget.setContrast(value); + QCOMPARE(widget.contrast(), expectedValue); + QCOMPARE(object.testService->windowControl->contrast(), expectedValue); + QCOMPARE(spy.count(), 1); + QCOMPARE(spy.value(0).value(0).toInt(), expectedValue); + + widget.setContrast(value); + QCOMPARE(widget.contrast(), expectedValue); + QCOMPARE(object.testService->windowControl->contrast(), expectedValue); + QCOMPARE(spy.count(), 1); + + object.testService->windowControl->setContrast(controlValue); + QCOMPARE(widget.contrast(), controlValue); + QCOMPARE(spy.count(), 2); + QCOMPARE(spy.value(1).value(0).toInt(), controlValue); +} + +void tst_QVideoWidget::contrastWidgetControl() +{ + QFETCH(int, controlValue); + QFETCH(int, value); + QFETCH(int, expectedValue); + + QtTestVideoObject object(0, new QtTestWidgetControl, 0); + object.testService->widgetControl->setContrast(controlValue); + + QVideoWidget widget; + widget.setMediaObject(&object); + widget.setWindowFlags(Qt::X11BypassWindowManagerHint); + QCOMPARE(widget.contrast(), 0); + + widget.show(); + QTest::qWaitForWindowShown(&widget); + QCOMPARE(widget.contrast(), 0); + + QSignalSpy spy(&widget, SIGNAL(contrastChanged(int))); + + widget.setContrast(value); + QCOMPARE(widget.contrast(), expectedValue); + QCOMPARE(object.testService->widgetControl->contrast(), expectedValue); + QCOMPARE(spy.count(), 1); + QCOMPARE(spy.value(0).value(0).toInt(), expectedValue); + + widget.setContrast(value); + QCOMPARE(widget.contrast(), expectedValue); + QCOMPARE(object.testService->widgetControl->contrast(), expectedValue); + QCOMPARE(spy.count(), 1); + + object.testService->widgetControl->setContrast(controlValue); + QCOMPARE(widget.contrast(), controlValue); + QCOMPARE(spy.count(), 2); + QCOMPARE(spy.value(1).value(0).toInt(), controlValue); +} + +void tst_QVideoWidget::contrastRendererControl() +{ + QFETCH(int, value); + QFETCH(int, expectedValue); + + QtTestVideoObject object(0, 0, new QtTestRendererControl); + + QVideoWidget widget; + widget.setMediaObject(&object); + widget.setWindowFlags(Qt::X11BypassWindowManagerHint); + widget.show(); + QTest::qWaitForWindowShown(&widget); + + QSignalSpy spy(&widget, SIGNAL(contrastChanged(int))); + + widget.setContrast(value); + QCOMPARE(widget.contrast(), expectedValue); + QCOMPARE(spy.count(), 1); + QCOMPARE(spy.value(0).value(0).toInt(), expectedValue); + + widget.setContrast(value); + QCOMPARE(widget.contrast(), expectedValue); + QCOMPARE(spy.count(), 1); +} + +void tst_QVideoWidget::hueWindowControl() +{ + QFETCH(int, controlValue); + QFETCH(int, value); + QFETCH(int, expectedValue); + + QtTestVideoObject object(new QtTestWindowControl, 0, 0); + object.testService->windowControl->setHue(controlValue); + + QVideoWidget widget; + widget.setMediaObject(&object); + widget.setWindowFlags(Qt::X11BypassWindowManagerHint); + QCOMPARE(widget.hue(), 0); + + widget.show(); + QTest::qWaitForWindowShown(&widget); + QCOMPARE(widget.hue(), 0); + + QSignalSpy spy(&widget, SIGNAL(hueChanged(int))); + + widget.setHue(value); + QCOMPARE(widget.hue(), expectedValue); + QCOMPARE(object.testService->windowControl->hue(), expectedValue); + QCOMPARE(spy.count(), 1); + QCOMPARE(spy.value(0).value(0).toInt(), expectedValue); + + widget.setHue(value); + QCOMPARE(widget.hue(), expectedValue); + QCOMPARE(object.testService->windowControl->hue(), expectedValue); + QCOMPARE(spy.count(), 1); + + object.testService->windowControl->setHue(controlValue); + QCOMPARE(widget.hue(), controlValue); + QCOMPARE(spy.count(), 2); + QCOMPARE(spy.value(1).value(0).toInt(), controlValue); +} + +void tst_QVideoWidget::hueWidgetControl() +{ + QFETCH(int, controlValue); + QFETCH(int, value); + QFETCH(int, expectedValue); + + QtTestVideoObject object(0, new QtTestWidgetControl, 0); + object.testService->widgetControl->setHue(controlValue); + + QVideoWidget widget; + widget.setMediaObject(&object); + widget.setWindowFlags(Qt::X11BypassWindowManagerHint); + QCOMPARE(widget.hue(), 0); + + widget.show(); + QTest::qWaitForWindowShown(&widget); + QCOMPARE(widget.hue(), 0); + + QSignalSpy spy(&widget, SIGNAL(hueChanged(int))); + + widget.setHue(value); + QCOMPARE(widget.hue(), expectedValue); + QCOMPARE(object.testService->widgetControl->hue(), expectedValue); + QCOMPARE(spy.count(), 1); + QCOMPARE(spy.value(0).value(0).toInt(), expectedValue); + + widget.setHue(value); + QCOMPARE(widget.hue(), expectedValue); + QCOMPARE(object.testService->widgetControl->hue(), expectedValue); + QCOMPARE(spy.count(), 1); + + object.testService->widgetControl->setHue(controlValue); + QCOMPARE(widget.hue(), controlValue); + QCOMPARE(spy.count(), 2); + QCOMPARE(spy.value(1).value(0).toInt(), controlValue); +} + +void tst_QVideoWidget::hueRendererControl() +{ + QFETCH(int, value); + QFETCH(int, expectedValue); + + QtTestVideoObject object(0, 0, new QtTestRendererControl); + + QVideoWidget widget; + widget.setMediaObject(&object); + widget.setWindowFlags(Qt::X11BypassWindowManagerHint); + widget.show(); + QTest::qWaitForWindowShown(&widget); + + QSignalSpy spy(&widget, SIGNAL(hueChanged(int))); + + widget.setHue(value); + QCOMPARE(widget.hue(), expectedValue); + QCOMPARE(spy.count(), 1); + QCOMPARE(spy.value(0).value(0).toInt(), expectedValue); + + widget.setHue(value); + QCOMPARE(widget.hue(), expectedValue); + QCOMPARE(spy.count(), 1); +} + +void tst_QVideoWidget::saturationWindowControl() +{ + QFETCH(int, controlValue); + QFETCH(int, value); + QFETCH(int, expectedValue); + + QtTestVideoObject object(new QtTestWindowControl, 0, 0); + object.testService->windowControl->setSaturation(controlValue); + + QVideoWidget widget; + widget.setMediaObject(&object); + widget.setWindowFlags(Qt::X11BypassWindowManagerHint); + QCOMPARE(widget.saturation(), 0); + widget.show(); + QTest::qWaitForWindowShown(&widget); + QCOMPARE(widget.saturation(), 0); + + QSignalSpy spy(&widget, SIGNAL(saturationChanged(int))); + + widget.setSaturation(value); + QCOMPARE(widget.saturation(), expectedValue); + QCOMPARE(object.testService->windowControl->saturation(), expectedValue); + QCOMPARE(spy.count(), 1); + QCOMPARE(spy.value(0).value(0).toInt(), expectedValue); + + widget.setSaturation(value); + QCOMPARE(widget.saturation(), expectedValue); + QCOMPARE(object.testService->windowControl->saturation(), expectedValue); + QCOMPARE(spy.count(), 1); + + object.testService->windowControl->setSaturation(controlValue); + QCOMPARE(widget.saturation(), controlValue); + QCOMPARE(spy.count(), 2); + QCOMPARE(spy.value(1).value(0).toInt(), controlValue); +} + +void tst_QVideoWidget::saturationWidgetControl() +{ + QFETCH(int, controlValue); + QFETCH(int, value); + QFETCH(int, expectedValue); + + QtTestVideoObject object(0, new QtTestWidgetControl, 0); + object.testService->widgetControl->setSaturation(controlValue); + + QVideoWidget widget; + widget.setMediaObject(&object); + widget.setWindowFlags(Qt::X11BypassWindowManagerHint); + + QCOMPARE(widget.saturation(), 0); + widget.show(); + QTest::qWaitForWindowShown(&widget); + QCOMPARE(widget.saturation(), 0); + + QSignalSpy spy(&widget, SIGNAL(saturationChanged(int))); + + widget.setSaturation(value); + QCOMPARE(widget.saturation(), expectedValue); + QCOMPARE(object.testService->widgetControl->saturation(), expectedValue); + QCOMPARE(spy.count(), 1); + QCOMPARE(spy.value(0).value(0).toInt(), expectedValue); + + widget.setSaturation(value); + QCOMPARE(widget.saturation(), expectedValue); + QCOMPARE(object.testService->widgetControl->saturation(), expectedValue); + QCOMPARE(spy.count(), 1); + + object.testService->widgetControl->setSaturation(controlValue); + QCOMPARE(widget.saturation(), controlValue); + QCOMPARE(spy.count(), 2); + QCOMPARE(spy.value(1).value(0).toInt(), controlValue); + +} + +void tst_QVideoWidget::saturationRendererControl() +{ + QFETCH(int, value); + QFETCH(int, expectedValue); + + QtTestVideoObject object(0, 0, new QtTestRendererControl); + + QVideoWidget widget; + widget.setMediaObject(&object); + widget.setWindowFlags(Qt::X11BypassWindowManagerHint); + widget.show(); + QTest::qWaitForWindowShown(&widget); + QSignalSpy spy(&widget, SIGNAL(saturationChanged(int))); + + widget.setSaturation(value); + QCOMPARE(widget.saturation(), expectedValue); + QCOMPARE(spy.count(), 1); + QCOMPARE(spy.value(0).value(0).toInt(), expectedValue); + + widget.setSaturation(value); + QCOMPARE(widget.saturation(), expectedValue); + QCOMPARE(spy.count(), 1); +} + +static const uchar rgb32ImageData[] = +{ + 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, + 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00 +}; + +void tst_QVideoWidget::paintRendererControl() +{ + QtTestVideoObject object(0, 0, new QtTestRendererControl); + + QVideoWidget widget; + widget.setMediaObject(&object); + widget.setWindowFlags(Qt::X11BypassWindowManagerHint); + widget.show(); + QTest::qWaitForWindowShown(&widget); + + QPainterVideoSurface *surface = qobject_cast<QPainterVideoSurface *>( + object.testService->rendererControl->surface()); + + QVideoSurfaceFormat format(QSize(2, 2), QVideoFrame::Format_RGB32); + + QVERIFY(surface->start(format)); + QCOMPARE(surface->isActive(), true); + QCOMPARE(surface->isReady(), true); + + QCoreApplication::processEvents(QEventLoop::AllEvents); + + QCOMPARE(surface->isActive(), true); + QCOMPARE(surface->isReady(), true); + + QVideoFrame frame(sizeof(rgb32ImageData), QSize(2, 2), 8, QVideoFrame::Format_RGB32); + + frame.map(QAbstractVideoBuffer::WriteOnly); + memcpy(frame.bits(), rgb32ImageData, frame.mappedBytes()); + frame.unmap(); + + QVERIFY(surface->present(frame)); + QCOMPARE(surface->isActive(), true); + QCOMPARE(surface->isReady(), false); + + QCoreApplication::processEvents(QEventLoop::AllEvents); + + QCOMPARE(surface->isActive(), true); + QCOMPARE(surface->isReady(), true); +} + +QTEST_MAIN(tst_QVideoWidget) + +#include "tst_qvideowidget.moc" diff --git a/tests/auto/qxmlstream/XML-Test-Suite/xmlconf/ibm/valid/P60/ibm60v01.xml b/tests/auto/qxmlstream/XML-Test-Suite/xmlconf/ibm/valid/P60/ibm60v01.xml index edf9fee..050a340 100644 --- a/tests/auto/qxmlstream/XML-Test-Suite/xmlconf/ibm/valid/P60/ibm60v01.xml +++ b/tests/auto/qxmlstream/XML-Test-Suite/xmlconf/ibm/valid/P60/ibm60v01.xml @@ -10,10 +10,10 @@ <!ATTLIST one chapter CDATA #IMPLIED>
<!ATTLIST two chapter CDATA #REQUIRED>
<!ATTLIST three chapter CDATA #FIXED "JavaBeans">
- <!ATTLIST four chapter CDATA 'defualt'>
+ <!ATTLIST four chapter CDATA 'default'>
]>
<Java><one chapter="Introduction"/>
<three chapter="JavaBeans"/>
Positive test
DefaultDecl attributes values IMPLIED, REQUIRED, FIXED and default
-</Java>
\ No newline at end of file +</Java>
diff --git a/tests/auto/uic/baseline/config_fromuic3.ui.h b/tests/auto/uic/baseline/config_fromuic3.ui.h index 6e22dc7..c77b303 100644 --- a/tests/auto/uic/baseline/config_fromuic3.ui.h +++ b/tests/auto/uic/baseline/config_fromuic3.ui.h @@ -45,7 +45,7 @@ ** Form generated from reading UI file 'config_fromuic3.ui' ** ** Created: Thu Dec 17 12:48:42 2009 -** by: Qt User Interface Compiler version 4.6.2 +** by: Qt User Interface Compiler version 4.6.3 ** ** WARNING! All changes made in this file will be lost when recompiling UI file! ********************************************************************************/ diff --git a/tests/auto/xmlpatternsdiagnosticsts/test/test.pro b/tests/auto/xmlpatternsdiagnosticsts/test/test.pro deleted file mode 100644 index acd71e4..0000000 --- a/tests/auto/xmlpatternsdiagnosticsts/test/test.pro +++ /dev/null @@ -1,32 +0,0 @@ -load(qttest_p4) -SOURCES += tst_xmlpatternsdiagnosticsts.cpp \ - ../../qxmlquery/TestFundament.cpp - -include (../../xmlpatterns.pri) - -TARGET = tst_xmlpatternsdiagnosticsts -DESTDIR = .. -win32 { - CONFIG(debug, debug|release): DESTDIR = ../debug - else: DESTDIR = ../release -} - -contains(QT_CONFIG, xmlpatterns) { -HEADERS += ../../xmlpatternsxqts/test/tst_suitetest.h -SOURCES += ../../xmlpatternsxqts/test/tst_suitetest.cpp -LIBS += -l$$XMLPATTERNS_SDK -} - -QT += xml - -INCLUDEPATH += $$(QTSRCDIR)/tests/auto/xmlpatternsxqts/lib/ \ - $$(QTDIR)/include/QtXmlPatterns/private \ - $$(QTSRCDIR)/tests/auto/xmlpatternsxqts/test \ - ../../xmlpatternsxqts/test \ - ../../xmlpatternsxqts/lib - -wince*|symbian { - catalog.sources = ../TestSuite ../Baseline.xml - catalog.path = . - DEPLOYMENT += catalog -} diff --git a/tests/auto/xmlpatternsdiagnosticsts/test/tst_xmlpatternsdiagnosticsts.cpp b/tests/auto/xmlpatternsdiagnosticsts/tst_xmlpatternsdiagnosticsts.cpp index 4a11404..4a11404 100644 --- a/tests/auto/xmlpatternsdiagnosticsts/test/tst_xmlpatternsdiagnosticsts.cpp +++ b/tests/auto/xmlpatternsdiagnosticsts/tst_xmlpatternsdiagnosticsts.cpp diff --git a/tests/auto/xmlpatternsdiagnosticsts/xmlpatternsdiagnosticsts.pro b/tests/auto/xmlpatternsdiagnosticsts/xmlpatternsdiagnosticsts.pro index 3d82eaf..981adab 100644 --- a/tests/auto/xmlpatternsdiagnosticsts/xmlpatternsdiagnosticsts.pro +++ b/tests/auto/xmlpatternsdiagnosticsts/xmlpatternsdiagnosticsts.pro @@ -1,5 +1,27 @@ -TEMPLATE = subdirs -CONFIG += ordered +load(qttest_p4) +SOURCES += tst_xmlpatternsdiagnosticsts.cpp \ + ../qxmlquery/TestFundament.cpp -SUBDIRS = ../xmlpatternsxqts test -requires(contains(QT_CONFIG,private_tests)) +include (../xmlpatterns.pri) + +TARGET = tst_xmlpatternsdiagnosticsts + +contains(QT_CONFIG, xmlpatterns) { +HEADERS += ../xmlpatternsxqts/tst_suitetest.h +SOURCES += ../xmlpatternsxqts/tst_suitetest.cpp +LIBS += -l$$XMLPATTERNS_SDK +} + +QT += xml + +INCLUDEPATH += $$(QTSRCDIR)/tests/auto/xmlpatternssdk \ + $$(QTDIR)/include/QtXmlPatterns/private \ + $$(QTSRCDIR)/tests/auto/xmlpatternsxqts \ + ../xmlpatternsxqts \ + ../xmlpatternssdk + +wince*|symbian { + catalog.sources = TestSuite Baseline.xml + catalog.path = . + DEPLOYMENT += catalog +} diff --git a/tests/auto/xmlpatternsschemats/xmlpatternsschemats.pro b/tests/auto/xmlpatternsschemats/xmlpatternsschemats.pro index 0f55078..f36211e 100644 --- a/tests/auto/xmlpatternsschemats/xmlpatternsschemats.pro +++ b/tests/auto/xmlpatternsschemats/xmlpatternsschemats.pro @@ -5,8 +5,8 @@ SOURCES += tst_xmlpatternsschemats.cpp \ include (../xmlpatterns.pri) contains(QT_CONFIG,xmlpatterns) { -HEADERS += ../xmlpatternsxqts/test/tst_suitetest.h -SOURCES += ../xmlpatternsxqts/test/tst_suitetest.cpp +HEADERS += ../xmlpatternsxqts/tst_suitetest.h +SOURCES += ../xmlpatternsxqts/tst_suitetest.cpp } PATTERNIST_SDK = QtXmlPatternsSDK @@ -20,8 +20,8 @@ LIBS += -l$$PATTERNIST_SDK QT += xml -INCLUDEPATH += $$QT_SOURCE_TREE/tests/auto/xmlpatternsxqts/lib/ \ - $$QT_BUILD_TREE/include/QtXmlPatterns/private \ - $$QT_SOURCE_TREE/tests/auto/xmlpatternsxqts/test \ - ../xmlpatternsxqts/test \ - ../xmlpatternsxqts/lib +INCLUDEPATH += $$QT_SOURCE_TREE/tests/auto/xmlpatternssdk/ \ + $$QT_BUILD_TREE/include/QtXmlPatterns/private \ + $$QT_SOURCE_TREE/tests/auto/xmlpatternsxqts \ + ../xmlpatternsxqts \ + ../xmlpatternssdk diff --git a/tests/auto/xmlpatternsxqts/lib/ASTItem.cpp b/tests/auto/xmlpatternssdk/ASTItem.cpp index 3b4fbdc..3b4fbdc 100644 --- a/tests/auto/xmlpatternsxqts/lib/ASTItem.cpp +++ b/tests/auto/xmlpatternssdk/ASTItem.cpp diff --git a/tests/auto/xmlpatternsxqts/lib/ASTItem.h b/tests/auto/xmlpatternssdk/ASTItem.h index ca3ac8f..ca3ac8f 100644 --- a/tests/auto/xmlpatternsxqts/lib/ASTItem.h +++ b/tests/auto/xmlpatternssdk/ASTItem.h diff --git a/tests/auto/xmlpatternsxqts/lib/DebugExpressionFactory.cpp b/tests/auto/xmlpatternssdk/DebugExpressionFactory.cpp index 1b5121e..1b5121e 100644 --- a/tests/auto/xmlpatternsxqts/lib/DebugExpressionFactory.cpp +++ b/tests/auto/xmlpatternssdk/DebugExpressionFactory.cpp diff --git a/tests/auto/xmlpatternsxqts/lib/DebugExpressionFactory.h b/tests/auto/xmlpatternssdk/DebugExpressionFactory.h index d5e676d..d5e676d 100644 --- a/tests/auto/xmlpatternsxqts/lib/DebugExpressionFactory.h +++ b/tests/auto/xmlpatternssdk/DebugExpressionFactory.h diff --git a/tests/auto/xmlpatternsxqts/lib/ErrorHandler.cpp b/tests/auto/xmlpatternssdk/ErrorHandler.cpp index 3f07737..3f07737 100644 --- a/tests/auto/xmlpatternsxqts/lib/ErrorHandler.cpp +++ b/tests/auto/xmlpatternssdk/ErrorHandler.cpp diff --git a/tests/auto/xmlpatternsxqts/lib/ErrorHandler.h b/tests/auto/xmlpatternssdk/ErrorHandler.h index 25447a9..25447a9 100644 --- a/tests/auto/xmlpatternsxqts/lib/ErrorHandler.h +++ b/tests/auto/xmlpatternssdk/ErrorHandler.h diff --git a/tests/auto/xmlpatternsxqts/lib/ErrorItem.cpp b/tests/auto/xmlpatternssdk/ErrorItem.cpp index 57edc1f..57edc1f 100644 --- a/tests/auto/xmlpatternsxqts/lib/ErrorItem.cpp +++ b/tests/auto/xmlpatternssdk/ErrorItem.cpp diff --git a/tests/auto/xmlpatternsxqts/lib/ErrorItem.h b/tests/auto/xmlpatternssdk/ErrorItem.h index 1d05872..1d05872 100644 --- a/tests/auto/xmlpatternsxqts/lib/ErrorItem.h +++ b/tests/auto/xmlpatternssdk/ErrorItem.h diff --git a/tests/auto/xmlpatternsxqts/lib/ExitCode.h b/tests/auto/xmlpatternssdk/ExitCode.h index e1810b1..e1810b1 100644 --- a/tests/auto/xmlpatternsxqts/lib/ExitCode.h +++ b/tests/auto/xmlpatternssdk/ExitCode.h diff --git a/tests/auto/xmlpatternsxqts/lib/ExpressionInfo.cpp b/tests/auto/xmlpatternssdk/ExpressionInfo.cpp index abbc8b3..abbc8b3 100644 --- a/tests/auto/xmlpatternsxqts/lib/ExpressionInfo.cpp +++ b/tests/auto/xmlpatternssdk/ExpressionInfo.cpp diff --git a/tests/auto/xmlpatternsxqts/lib/ExpressionInfo.h b/tests/auto/xmlpatternssdk/ExpressionInfo.h index 2d9d398..2d9d398 100644 --- a/tests/auto/xmlpatternsxqts/lib/ExpressionInfo.h +++ b/tests/auto/xmlpatternssdk/ExpressionInfo.h diff --git a/tests/auto/xmlpatternsxqts/lib/ExpressionNamer.cpp b/tests/auto/xmlpatternssdk/ExpressionNamer.cpp index 605c754..605c754 100644 --- a/tests/auto/xmlpatternsxqts/lib/ExpressionNamer.cpp +++ b/tests/auto/xmlpatternssdk/ExpressionNamer.cpp diff --git a/tests/auto/xmlpatternsxqts/lib/ExpressionNamer.h b/tests/auto/xmlpatternssdk/ExpressionNamer.h index 129d8d7..129d8d7 100644 --- a/tests/auto/xmlpatternsxqts/lib/ExpressionNamer.h +++ b/tests/auto/xmlpatternssdk/ExpressionNamer.h diff --git a/tests/auto/xmlpatternsxqts/lib/ExternalSourceLoader.cpp b/tests/auto/xmlpatternssdk/ExternalSourceLoader.cpp index a83a100..a83a100 100644 --- a/tests/auto/xmlpatternsxqts/lib/ExternalSourceLoader.cpp +++ b/tests/auto/xmlpatternssdk/ExternalSourceLoader.cpp diff --git a/tests/auto/xmlpatternsxqts/lib/ExternalSourceLoader.h b/tests/auto/xmlpatternssdk/ExternalSourceLoader.h index 2d88222..2d88222 100644 --- a/tests/auto/xmlpatternsxqts/lib/ExternalSourceLoader.h +++ b/tests/auto/xmlpatternssdk/ExternalSourceLoader.h diff --git a/tests/auto/xmlpatternsxqts/lib/Global.cpp b/tests/auto/xmlpatternssdk/Global.cpp index f78e421..f78e421 100644 --- a/tests/auto/xmlpatternsxqts/lib/Global.cpp +++ b/tests/auto/xmlpatternssdk/Global.cpp diff --git a/tests/auto/xmlpatternsxqts/lib/Global.h b/tests/auto/xmlpatternssdk/Global.h index 53c32cb..53c32cb 100644 --- a/tests/auto/xmlpatternsxqts/lib/Global.h +++ b/tests/auto/xmlpatternssdk/Global.h diff --git a/tests/auto/xmlpatternsxqts/lib/ResultThreader.cpp b/tests/auto/xmlpatternssdk/ResultThreader.cpp index 3296854..3296854 100644 --- a/tests/auto/xmlpatternsxqts/lib/ResultThreader.cpp +++ b/tests/auto/xmlpatternssdk/ResultThreader.cpp diff --git a/tests/auto/xmlpatternsxqts/lib/ResultThreader.h b/tests/auto/xmlpatternssdk/ResultThreader.h index 19749f0..19749f0 100644 --- a/tests/auto/xmlpatternsxqts/lib/ResultThreader.h +++ b/tests/auto/xmlpatternssdk/ResultThreader.h diff --git a/tests/auto/xmlpatternsxqts/lib/TestBaseLine.cpp b/tests/auto/xmlpatternssdk/TestBaseLine.cpp index 6a46bcc..6a46bcc 100644 --- a/tests/auto/xmlpatternsxqts/lib/TestBaseLine.cpp +++ b/tests/auto/xmlpatternssdk/TestBaseLine.cpp diff --git a/tests/auto/xmlpatternsxqts/lib/TestBaseLine.h b/tests/auto/xmlpatternssdk/TestBaseLine.h index e297128..e297128 100644 --- a/tests/auto/xmlpatternsxqts/lib/TestBaseLine.h +++ b/tests/auto/xmlpatternssdk/TestBaseLine.h diff --git a/tests/auto/xmlpatternsxqts/lib/TestCase.cpp b/tests/auto/xmlpatternssdk/TestCase.cpp index 7b424d2..7b424d2 100644 --- a/tests/auto/xmlpatternsxqts/lib/TestCase.cpp +++ b/tests/auto/xmlpatternssdk/TestCase.cpp diff --git a/tests/auto/xmlpatternsxqts/lib/TestCase.h b/tests/auto/xmlpatternssdk/TestCase.h index 28df5f1..28df5f1 100644 --- a/tests/auto/xmlpatternsxqts/lib/TestCase.h +++ b/tests/auto/xmlpatternssdk/TestCase.h diff --git a/tests/auto/xmlpatternsxqts/lib/TestContainer.cpp b/tests/auto/xmlpatternssdk/TestContainer.cpp index ec6196c..ec6196c 100644 --- a/tests/auto/xmlpatternsxqts/lib/TestContainer.cpp +++ b/tests/auto/xmlpatternssdk/TestContainer.cpp diff --git a/tests/auto/xmlpatternsxqts/lib/TestContainer.h b/tests/auto/xmlpatternssdk/TestContainer.h index 5b93491..5b93491 100644 --- a/tests/auto/xmlpatternsxqts/lib/TestContainer.h +++ b/tests/auto/xmlpatternssdk/TestContainer.h diff --git a/tests/auto/xmlpatternsxqts/lib/TestGroup.cpp b/tests/auto/xmlpatternssdk/TestGroup.cpp index f2cd2bd..f2cd2bd 100644 --- a/tests/auto/xmlpatternsxqts/lib/TestGroup.cpp +++ b/tests/auto/xmlpatternssdk/TestGroup.cpp diff --git a/tests/auto/xmlpatternsxqts/lib/TestGroup.h b/tests/auto/xmlpatternssdk/TestGroup.h index 5f4798f..5f4798f 100644 --- a/tests/auto/xmlpatternsxqts/lib/TestGroup.h +++ b/tests/auto/xmlpatternssdk/TestGroup.h diff --git a/tests/auto/xmlpatternsxqts/lib/TestItem.h b/tests/auto/xmlpatternssdk/TestItem.h index 0b3c606..0b3c606 100644 --- a/tests/auto/xmlpatternsxqts/lib/TestItem.h +++ b/tests/auto/xmlpatternssdk/TestItem.h diff --git a/tests/auto/xmlpatternsxqts/lib/TestResult.cpp b/tests/auto/xmlpatternssdk/TestResult.cpp index 2374bc0..2374bc0 100644 --- a/tests/auto/xmlpatternsxqts/lib/TestResult.cpp +++ b/tests/auto/xmlpatternssdk/TestResult.cpp diff --git a/tests/auto/xmlpatternsxqts/lib/TestResult.h b/tests/auto/xmlpatternssdk/TestResult.h index 6951f90..6951f90 100644 --- a/tests/auto/xmlpatternsxqts/lib/TestResult.h +++ b/tests/auto/xmlpatternssdk/TestResult.h diff --git a/tests/auto/xmlpatternsxqts/lib/TestResultHandler.cpp b/tests/auto/xmlpatternssdk/TestResultHandler.cpp index b87d481..b87d481 100644 --- a/tests/auto/xmlpatternsxqts/lib/TestResultHandler.cpp +++ b/tests/auto/xmlpatternssdk/TestResultHandler.cpp diff --git a/tests/auto/xmlpatternsxqts/lib/TestResultHandler.h b/tests/auto/xmlpatternssdk/TestResultHandler.h index a786ac4..a786ac4 100644 --- a/tests/auto/xmlpatternsxqts/lib/TestResultHandler.h +++ b/tests/auto/xmlpatternssdk/TestResultHandler.h diff --git a/tests/auto/xmlpatternsxqts/lib/TestSuite.cpp b/tests/auto/xmlpatternssdk/TestSuite.cpp index 2c3e49c..2c3e49c 100644 --- a/tests/auto/xmlpatternsxqts/lib/TestSuite.cpp +++ b/tests/auto/xmlpatternssdk/TestSuite.cpp diff --git a/tests/auto/xmlpatternsxqts/lib/TestSuite.h b/tests/auto/xmlpatternssdk/TestSuite.h index d14dc62..d14dc62 100644 --- a/tests/auto/xmlpatternsxqts/lib/TestSuite.h +++ b/tests/auto/xmlpatternssdk/TestSuite.h diff --git a/tests/auto/xmlpatternsxqts/lib/TestSuiteHandler.cpp b/tests/auto/xmlpatternssdk/TestSuiteHandler.cpp index 7c687f3..7c687f3 100644 --- a/tests/auto/xmlpatternsxqts/lib/TestSuiteHandler.cpp +++ b/tests/auto/xmlpatternssdk/TestSuiteHandler.cpp diff --git a/tests/auto/xmlpatternsxqts/lib/TestSuiteHandler.h b/tests/auto/xmlpatternssdk/TestSuiteHandler.h index 76156c0..76156c0 100644 --- a/tests/auto/xmlpatternsxqts/lib/TestSuiteHandler.h +++ b/tests/auto/xmlpatternssdk/TestSuiteHandler.h diff --git a/tests/auto/xmlpatternsxqts/lib/TestSuiteResult.cpp b/tests/auto/xmlpatternssdk/TestSuiteResult.cpp index 4e81859..4e81859 100644 --- a/tests/auto/xmlpatternsxqts/lib/TestSuiteResult.cpp +++ b/tests/auto/xmlpatternssdk/TestSuiteResult.cpp diff --git a/tests/auto/xmlpatternsxqts/lib/TestSuiteResult.h b/tests/auto/xmlpatternssdk/TestSuiteResult.h index 491c2b2..491c2b2 100644 --- a/tests/auto/xmlpatternsxqts/lib/TestSuiteResult.h +++ b/tests/auto/xmlpatternssdk/TestSuiteResult.h diff --git a/tests/auto/xmlpatternsxqts/lib/TreeItem.cpp b/tests/auto/xmlpatternssdk/TreeItem.cpp index b34262d..b34262d 100644 --- a/tests/auto/xmlpatternsxqts/lib/TreeItem.cpp +++ b/tests/auto/xmlpatternssdk/TreeItem.cpp diff --git a/tests/auto/xmlpatternsxqts/lib/TreeItem.h b/tests/auto/xmlpatternssdk/TreeItem.h index f5e051f..f5e051f 100644 --- a/tests/auto/xmlpatternsxqts/lib/TreeItem.h +++ b/tests/auto/xmlpatternssdk/TreeItem.h diff --git a/tests/auto/xmlpatternsxqts/lib/TreeModel.cpp b/tests/auto/xmlpatternssdk/TreeModel.cpp index e27f8e0..e27f8e0 100644 --- a/tests/auto/xmlpatternsxqts/lib/TreeModel.cpp +++ b/tests/auto/xmlpatternssdk/TreeModel.cpp diff --git a/tests/auto/xmlpatternsxqts/lib/TreeModel.h b/tests/auto/xmlpatternssdk/TreeModel.h index 1d8ea72..1d8ea72 100644 --- a/tests/auto/xmlpatternsxqts/lib/TreeModel.h +++ b/tests/auto/xmlpatternssdk/TreeModel.h diff --git a/tests/auto/xmlpatternsxqts/lib/Worker.cpp b/tests/auto/xmlpatternssdk/Worker.cpp index 0121099..0121099 100644 --- a/tests/auto/xmlpatternsxqts/lib/Worker.cpp +++ b/tests/auto/xmlpatternssdk/Worker.cpp diff --git a/tests/auto/xmlpatternsxqts/lib/Worker.h b/tests/auto/xmlpatternssdk/Worker.h index b3d7ae2..b3d7ae2 100644 --- a/tests/auto/xmlpatternsxqts/lib/Worker.h +++ b/tests/auto/xmlpatternssdk/Worker.h diff --git a/tests/auto/xmlpatternsxqts/lib/XMLWriter.cpp b/tests/auto/xmlpatternssdk/XMLWriter.cpp index 60a5344..60a5344 100644 --- a/tests/auto/xmlpatternsxqts/lib/XMLWriter.cpp +++ b/tests/auto/xmlpatternssdk/XMLWriter.cpp diff --git a/tests/auto/xmlpatternsxqts/lib/XMLWriter.h b/tests/auto/xmlpatternssdk/XMLWriter.h index 2b629bb..2b629bb 100644 --- a/tests/auto/xmlpatternsxqts/lib/XMLWriter.h +++ b/tests/auto/xmlpatternssdk/XMLWriter.h diff --git a/tests/auto/xmlpatternsxqts/lib/XQTSTestCase.cpp b/tests/auto/xmlpatternssdk/XQTSTestCase.cpp index 6a8645b..6a8645b 100644 --- a/tests/auto/xmlpatternsxqts/lib/XQTSTestCase.cpp +++ b/tests/auto/xmlpatternssdk/XQTSTestCase.cpp diff --git a/tests/auto/xmlpatternsxqts/lib/XQTSTestCase.h b/tests/auto/xmlpatternssdk/XQTSTestCase.h index 8872b32..8872b32 100644 --- a/tests/auto/xmlpatternsxqts/lib/XQTSTestCase.h +++ b/tests/auto/xmlpatternssdk/XQTSTestCase.h diff --git a/tests/auto/xmlpatternsxqts/lib/XSDTSTestCase.cpp b/tests/auto/xmlpatternssdk/XSDTSTestCase.cpp index 3cbb681..3cbb681 100644 --- a/tests/auto/xmlpatternsxqts/lib/XSDTSTestCase.cpp +++ b/tests/auto/xmlpatternssdk/XSDTSTestCase.cpp diff --git a/tests/auto/xmlpatternsxqts/lib/XSDTSTestCase.h b/tests/auto/xmlpatternssdk/XSDTSTestCase.h index 8cfa143..947687a 100644 --- a/tests/auto/xmlpatternsxqts/lib/XSDTSTestCase.h +++ b/tests/auto/xmlpatternssdk/XSDTSTestCase.h @@ -50,6 +50,7 @@ #include "TestCase.h" QT_BEGIN_HEADER +QT_BEGIN_NAMESPACE namespace QPatternistSDK { @@ -153,6 +154,7 @@ namespace QPatternistSDK }; } +QT_END_NAMESPACE QT_END_HEADER #endif diff --git a/tests/auto/xmlpatternsxqts/lib/XSDTestSuiteHandler.cpp b/tests/auto/xmlpatternssdk/XSDTestSuiteHandler.cpp index a868d19..a868d19 100644 --- a/tests/auto/xmlpatternsxqts/lib/XSDTestSuiteHandler.cpp +++ b/tests/auto/xmlpatternssdk/XSDTestSuiteHandler.cpp diff --git a/tests/auto/xmlpatternsxqts/lib/XSDTestSuiteHandler.h b/tests/auto/xmlpatternssdk/XSDTestSuiteHandler.h index 9179a2d..5493c7d 100644 --- a/tests/auto/xmlpatternsxqts/lib/XSDTestSuiteHandler.h +++ b/tests/auto/xmlpatternssdk/XSDTestSuiteHandler.h @@ -50,6 +50,7 @@ #include "XQTSTestCase.h" QT_BEGIN_HEADER +QT_BEGIN_NAMESPACE namespace QPatternistSDK { @@ -113,6 +114,7 @@ namespace QPatternistSDK }; } +QT_END_NAMESPACE QT_END_HEADER #endif diff --git a/tests/auto/xmlpatternsxqts/lib/XSLTTestSuiteHandler.cpp b/tests/auto/xmlpatternssdk/XSLTTestSuiteHandler.cpp index cfc3b2b..cfc3b2b 100644 --- a/tests/auto/xmlpatternsxqts/lib/XSLTTestSuiteHandler.cpp +++ b/tests/auto/xmlpatternssdk/XSLTTestSuiteHandler.cpp diff --git a/tests/auto/xmlpatternsxqts/lib/XSLTTestSuiteHandler.h b/tests/auto/xmlpatternssdk/XSLTTestSuiteHandler.h index 8614789..8614789 100644 --- a/tests/auto/xmlpatternsxqts/lib/XSLTTestSuiteHandler.h +++ b/tests/auto/xmlpatternssdk/XSLTTestSuiteHandler.h diff --git a/tests/auto/xmlpatternsxqts/lib/docs/XMLIndenterExample.cpp b/tests/auto/xmlpatternssdk/docs/XMLIndenterExample.cpp index 24ee158..24ee158 100644 --- a/tests/auto/xmlpatternsxqts/lib/docs/XMLIndenterExample.cpp +++ b/tests/auto/xmlpatternssdk/docs/XMLIndenterExample.cpp diff --git a/tests/auto/xmlpatternsxqts/lib/docs/XMLIndenterExampleResult.xml b/tests/auto/xmlpatternssdk/docs/XMLIndenterExampleResult.xml index c5e7312..c5e7312 100644 --- a/tests/auto/xmlpatternsxqts/lib/docs/XMLIndenterExampleResult.xml +++ b/tests/auto/xmlpatternssdk/docs/XMLIndenterExampleResult.xml diff --git a/tests/auto/xmlpatternsxqts/lib/docs/XMLWriterExample.cpp b/tests/auto/xmlpatternssdk/docs/XMLWriterExample.cpp index 24ee158..24ee158 100644 --- a/tests/auto/xmlpatternsxqts/lib/docs/XMLWriterExample.cpp +++ b/tests/auto/xmlpatternssdk/docs/XMLWriterExample.cpp diff --git a/tests/auto/xmlpatternsxqts/lib/docs/XMLWriterExampleResult.xml b/tests/auto/xmlpatternssdk/docs/XMLWriterExampleResult.xml index c5e7312..c5e7312 100644 --- a/tests/auto/xmlpatternsxqts/lib/docs/XMLWriterExampleResult.xml +++ b/tests/auto/xmlpatternssdk/docs/XMLWriterExampleResult.xml diff --git a/tests/auto/xmlpatternsxqts/lib/tests/XMLWriterTest.cpp b/tests/auto/xmlpatternssdk/tests/XMLWriterTest.cpp index a10c01a..a10c01a 100644 --- a/tests/auto/xmlpatternsxqts/lib/tests/XMLWriterTest.cpp +++ b/tests/auto/xmlpatternssdk/tests/XMLWriterTest.cpp diff --git a/tests/auto/xmlpatternsxqts/lib/tests/XMLWriterTest.h b/tests/auto/xmlpatternssdk/tests/XMLWriterTest.h index f90aea2..f90aea2 100644 --- a/tests/auto/xmlpatternsxqts/lib/tests/XMLWriterTest.h +++ b/tests/auto/xmlpatternssdk/tests/XMLWriterTest.h diff --git a/tests/auto/xmlpatternsxqts/lib/lib.pro b/tests/auto/xmlpatternssdk/xmlpatternssdk.pro index f5b0a06..6204f01 100644 --- a/tests/auto/xmlpatternsxqts/lib/lib.pro +++ b/tests/auto/xmlpatternssdk/xmlpatternssdk.pro @@ -1,4 +1,4 @@ -include (../../xmlpatterns.pri) +include (../xmlpatterns.pri) TARGET = $$XMLPATTERNS_SDK TEMPLATE = lib diff --git a/tests/auto/xmlpatternsview/test/test.pro b/tests/auto/xmlpatternsview/test/test.pro deleted file mode 100644 index 6adff4d..0000000 --- a/tests/auto/xmlpatternsview/test/test.pro +++ /dev/null @@ -1,17 +0,0 @@ -load(qttest_p4) -SOURCES += tst_xmlpatternsview.cpp - -include (../../xmlpatterns.pri) - -DESTDIR = .. -win32 { - CONFIG(debug, debug|release): DESTDIR = ../debug - else: DESTDIR = ../release -} -TARGET = tst_xmlpatternsview - -wince*: { - viewexe.sources = $$QT_BUILD_TREE/xmlpatternsview.exe - viewexe.path = . - DEPLOYMENT += viewexe -} diff --git a/tests/auto/xmlpatternsview/test/tst_xmlpatternsview.cpp b/tests/auto/xmlpatternsview/tst_xmlpatternsview.cpp index 91dee63..91dee63 100644 --- a/tests/auto/xmlpatternsview/test/tst_xmlpatternsview.cpp +++ b/tests/auto/xmlpatternsview/tst_xmlpatternsview.cpp diff --git a/tests/auto/xmlpatternsview/xmlpatternsview.pro b/tests/auto/xmlpatternsview/xmlpatternsview.pro index 04ee4d0..d93cba3 100644 --- a/tests/auto/xmlpatternsview/xmlpatternsview.pro +++ b/tests/auto/xmlpatternsview/xmlpatternsview.pro @@ -1,9 +1,12 @@ -TEMPLATE = subdirs -CONFIG += ordered +load(qttest_p4) +SOURCES += tst_xmlpatternsview.cpp -SUBDIRS = ../xmlpatternsxqts test +include (../xmlpatterns.pri) -contains(QT_CONFIG,xmlpatterns) { - SUBDIRS += view +TARGET = tst_xmlpatternsview + +wince*: { + viewexe.sources = $$QT_BUILD_TREE/xmlpatternsview.exe + viewexe.path = . + DEPLOYMENT += viewexe } -requires(contains(QT_CONFIG,private_tests)) diff --git a/tests/auto/xmlpatternsxqts/test/test.pro b/tests/auto/xmlpatternsxqts/test/test.pro deleted file mode 100644 index a69838a..0000000 --- a/tests/auto/xmlpatternsxqts/test/test.pro +++ /dev/null @@ -1,26 +0,0 @@ -load(qttest_p4) -SOURCES += tst_xmlpatternsxqts.cpp ../../qxmlquery/TestFundament.cpp tst_suitetest.cpp - -include(../../xmlpatterns.pri) - -contains(QT_CONFIG,xmlpatterns) { - HEADERS += tst_suitetest.h - LIBS += -l$$XMLPATTERNS_SDK -} - -# syncqt doesn't copy headers in tools/ so let's manually ensure -# it works with shadow builds and source builds. -INCLUDEPATH += $$(QTDIR)/include/QtXmlPatterns/private \ - $$(QTSRCDIR)/include/QtXmlPatterns/private \ - $$(QTSRCDIR)/tools/xmlpatterns \ - $$(QTDIR)/tools/xmlpatterns \ - ../lib/ - -CONFIG += testlib -QT += xml -DESTDIR = .. -win32 { - CONFIG(debug, debug|release): DESTDIR = ../debug - else: DESTDIR = ../release -} -TARGET = tst_xmlpatternsxqts diff --git a/tests/auto/xmlpatternsxqts/test/tst_suitetest.cpp b/tests/auto/xmlpatternsxqts/tst_suitetest.cpp index 64120c7..64120c7 100644 --- a/tests/auto/xmlpatternsxqts/test/tst_suitetest.cpp +++ b/tests/auto/xmlpatternsxqts/tst_suitetest.cpp diff --git a/tests/auto/xmlpatternsxqts/test/tst_suitetest.h b/tests/auto/xmlpatternsxqts/tst_suitetest.h index 22e384a..70e56af 100644 --- a/tests/auto/xmlpatternsxqts/test/tst_suitetest.h +++ b/tests/auto/xmlpatternsxqts/tst_suitetest.h @@ -44,7 +44,7 @@ #define Q_tst_SuiteTest #include <QtCore/QObject> -#include "../../qxmlquery/TestFundament.h" +#include "../qxmlquery/TestFundament.h" /*! \class tst_SuiteTest diff --git a/tests/auto/xmlpatternsxqts/test/tst_xmlpatternsxqts.cpp b/tests/auto/xmlpatternsxqts/tst_xmlpatternsxqts.cpp index 890234e..890234e 100644 --- a/tests/auto/xmlpatternsxqts/test/tst_xmlpatternsxqts.cpp +++ b/tests/auto/xmlpatternsxqts/tst_xmlpatternsxqts.cpp diff --git a/tests/auto/xmlpatternsxqts/xmlpatternsxqts.pro b/tests/auto/xmlpatternsxqts/xmlpatternsxqts.pro index 3f49ccc..e81888a 100644 --- a/tests/auto/xmlpatternsxqts/xmlpatternsxqts.pro +++ b/tests/auto/xmlpatternsxqts/xmlpatternsxqts.pro @@ -1,13 +1,21 @@ -TEMPLATE = subdirs +load(qttest_p4) +SOURCES += tst_xmlpatternsxqts.cpp ../qxmlquery/TestFundament.cpp tst_suitetest.cpp + +include(../xmlpatterns.pri) + contains(QT_CONFIG,xmlpatterns) { - SUBDIRS += lib - test.depends = lib + HEADERS += tst_suitetest.h + LIBS += -l$$XMLPATTERNS_SDK } -SUBDIRS += test - -# Needed on the win32-g++ setup and on the test machine arsia. -INCLUDEPATH += $$QT_BUILD_TREE/include/QtXmlPatterns/private \ - ../../../include/QtXmlPatterns/private -requires(contains(QT_CONFIG,private_tests)) +# syncqt doesn't copy headers in tools/ so let's manually ensure +# it works with shadow builds and source builds. +INCLUDEPATH += $$(QTDIR)/include/QtXmlPatterns/private \ + $$(QTSRCDIR)/include/QtXmlPatterns/private \ + $$(QTSRCDIR)/tools/xmlpatterns \ + $$(QTDIR)/tools/xmlpatterns \ + ../xmlpatternssdk/ +CONFIG += testlib +QT += xml +TARGET = tst_xmlpatternsxqts diff --git a/tests/auto/xmlpatternsxslts/xmlpatternsxslts.pro b/tests/auto/xmlpatternsxslts/xmlpatternsxslts.pro index 9b63a52..940cc31 100644 --- a/tests/auto/xmlpatternsxslts/xmlpatternsxslts.pro +++ b/tests/auto/xmlpatternsxslts/xmlpatternsxslts.pro @@ -5,17 +5,17 @@ SOURCES += tst_xmlpatternsxslts.cpp \ include (../xmlpatterns.pri) contains(QT_CONFIG,xmlpatterns) { -HEADERS += ../xmlpatternsxqts/test/tst_suitetest.h -SOURCES += ../xmlpatternsxqts/test/tst_suitetest.cpp +HEADERS += ../xmlpatternsxqts/tst_suitetest.h +SOURCES += ../xmlpatternsxqts/tst_suitetest.cpp LIBS += -l$$XMLPATTERNS_SDK } QT += xml -INCLUDEPATH += $$(QTSRCDIR)/tests/auto/xmlpatternsxqts/lib/ \ - $$(QTDIR)/include/QtXmlPatterns/private \ - $$(QTSRCDIR)/tests/auto/xmlpatternsxqts/test \ - ../xmlpatternsxqts/test \ - ../xmlpatternsxqts/lib +INCLUDEPATH += $$(QTSRCDIR)/tests/auto/xmlpatternssdk \ + $$(QTDIR)/include/QtXmlPatterns/private \ + $$(QTSRCDIR)/tests/auto/xmlpatternsxqts \ + ../xmlpatternsxqts \ + ../xmlpatternssdk wince*: { testdata.sources = XSLTS Baseline.xml diff --git a/tests/benchmarks/benchmarks.pro b/tests/benchmarks/benchmarks.pro index e318d02..01d5cd5 100644 --- a/tests/benchmarks/benchmarks.pro +++ b/tests/benchmarks/benchmarks.pro @@ -5,6 +5,5 @@ SUBDIRS = \ network \ script \ svg - contains(QT_CONFIG, opengl): SUBDIRS += opengl contains(QT_CONFIG, declarative): SUBDIRS += declarative diff --git a/tests/benchmarks/corelib/codecs/codecs.pro b/tests/benchmarks/corelib/codecs/codecs.pro new file mode 100644 index 0000000..dab324b --- /dev/null +++ b/tests/benchmarks/corelib/codecs/codecs.pro @@ -0,0 +1,3 @@ +TEMPLATE = subdirs +SUBDIRS = qtextcodec + diff --git a/tests/benchmarks/corelib/codecs/qtextcodec/main.cpp b/tests/benchmarks/corelib/codecs/qtextcodec/main.cpp new file mode 100644 index 0000000..50d8b9d --- /dev/null +++ b/tests/benchmarks/corelib/codecs/qtextcodec/main.cpp @@ -0,0 +1,185 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (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 Technology Preview License Agreement accompanying +** this package. +** +** 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.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include <QTextCodec> +#include <QFile> +#include <qtest.h> + +#ifdef Q_OS_SYMBIAN +// In Symbian OS test data is located in applications private dir +// Application private dir is default serach path for files, so SRCDIR can be set to empty +#define SRCDIR "" +#endif + +Q_DECLARE_METATYPE(QList<QByteArray>) +Q_DECLARE_METATYPE(QTextCodec *) + +class tst_QTextCodec: public QObject +{ + Q_OBJECT +private slots: + void codecForName() const; + void codecForName_data() const; + void codecForMib() const; + void fromUnicode_data() const; + void fromUnicode() const; + void toUnicode_data() const; + void toUnicode() const; +}; + +void tst_QTextCodec::codecForName() const +{ + QFETCH(QList<QByteArray>, codecs); + + QBENCHMARK { + foreach(const QByteArray& c, codecs) { + QVERIFY(QTextCodec::codecForName(c)); + QVERIFY(QTextCodec::codecForName(c + "-")); + } + foreach(const QByteArray& c, codecs) { + QVERIFY(QTextCodec::codecForName(c + "+")); + QVERIFY(QTextCodec::codecForName(c + "*")); + } + } +} + +void tst_QTextCodec::codecForName_data() const +{ + QTest::addColumn<QList<QByteArray> >("codecs"); + + QTest::newRow("all") << QTextCodec::availableCodecs(); + QTest::newRow("many utf-8") << (QList<QByteArray>() + << "utf-8" << "utf-8" << "utf-8" << "utf-8" << "utf-8" + << "utf-8" << "utf-8" << "utf-8" << "utf-8" << "utf-8" + << "utf-8" << "utf-8" << "utf-8" << "utf-8" << "utf-8" + << "utf-8" << "utf-8" << "utf-8" << "utf-8" << "utf-8" + << "utf-8" << "utf-8" << "utf-8" << "utf-8" << "utf-8" + << "utf-8" << "utf-8" << "utf-8" << "utf-8" << "utf-8" + << "utf-8" << "utf-8" << "utf-8" << "utf-8" << "utf-8" + << "utf-8" << "utf-8" << "utf-8" << "utf-8" << "utf-8" + << "utf-8" << "utf-8" << "utf-8" << "utf-8" << "utf-8" ); +} + +void tst_QTextCodec::codecForMib() const +{ + QBENCHMARK { + QTextCodec::codecForMib(106); + QTextCodec::codecForMib(111); + QTextCodec::codecForMib(106); + QTextCodec::codecForMib(2254); + QTextCodec::codecForMib(2255); + QTextCodec::codecForMib(2256); + QTextCodec::codecForMib(2257); + QTextCodec::codecForMib(2258); + QTextCodec::codecForMib(111); + QTextCodec::codecForMib(2250); + QTextCodec::codecForMib(2251); + QTextCodec::codecForMib(2252); + QTextCodec::codecForMib(106); + QTextCodec::codecForMib(106); + QTextCodec::codecForMib(106); + QTextCodec::codecForMib(106); + } +} + +void tst_QTextCodec::fromUnicode_data() const +{ + QTest::addColumn<QTextCodec*>("codec"); + + QTest::newRow("utf-8") << QTextCodec::codecForName("utf-8"); + QTest::newRow("latin 1") << QTextCodec::codecForName("latin 1"); + QTest::newRow("utf-16") << QTextCodec::codecForName("utf16"); ; + QTest::newRow("utf-32") << QTextCodec::codecForName("utf32"); + QTest::newRow("latin15") << QTextCodec::codecForName("iso-8859-15"); + QTest::newRow("eucKr") << QTextCodec::codecForName("eucKr"); +} + + +void tst_QTextCodec::fromUnicode() const +{ + QFETCH(QTextCodec*, codec); + QFile file(SRCDIR "utf-8.txt"); + if (!file.open(QFile::ReadOnly)) { + qFatal("Cannot open input file"); + return; + } + QByteArray data = file.readAll(); + const char *d = data.constData(); + int size = data.size(); + QString s = QString::fromUtf8(d, size); + s = s + s + s; + s = s + s + s; + QBENCHMARK { + for (int i = 0; i < 10; i ++) + codec->fromUnicode(s); + } +} + + +void tst_QTextCodec::toUnicode_data() const +{ + fromUnicode_data(); +} + + +void tst_QTextCodec::toUnicode() const +{ + QFETCH(QTextCodec*, codec); + QFile file(SRCDIR "utf-8.txt"); + QVERIFY(file.open(QFile::ReadOnly)); + QByteArray data = file.readAll(); + const char *d = data.constData(); + int size = data.size(); + QString s = QString::fromUtf8(d, size); + s = s + s + s; + s = s + s + s; + QByteArray orig = codec->fromUnicode(s); + QBENCHMARK { + for (int i = 0; i < 10; i ++) + codec->toUnicode(orig); + } +} + + + + +QTEST_MAIN(tst_QTextCodec) + +#include "main.moc" diff --git a/tests/benchmarks/corelib/codecs/qtextcodec/qtextcodec.pro b/tests/benchmarks/corelib/codecs/qtextcodec/qtextcodec.pro new file mode 100644 index 0000000..3167f26 --- /dev/null +++ b/tests/benchmarks/corelib/codecs/qtextcodec/qtextcodec.pro @@ -0,0 +1,16 @@ +load(qttest_p4) +TARGET = tst_qtextcodec +QT -= gui +SOURCES += main.cpp + +wince*:{ + DEFINES += SRCDIR=\\\"\\\" +} else:symbian* { + addFiles.sources = utf-8.txt + addFiles.path = . + DEPLOYMENT += addFiles + TARGET.EPOCHEAPSIZE="0x100 0x1000000" +} else { + DEFINES += SRCDIR=\\\"$$PWD/\\\" +} + diff --git a/tests/benchmarks/corelib/codecs/qtextcodec/utf-8.txt b/tests/benchmarks/corelib/codecs/qtextcodec/utf-8.txt new file mode 100644 index 0000000..a8a58de --- /dev/null +++ b/tests/benchmarks/corelib/codecs/qtextcodec/utf-8.txt @@ -0,0 +1,72 @@ +SprÃ¥k: Norsk +Γλώσσα: Ελληνικά +Язык: РуÑÑкий +언어 : í•œêµì–´ +言語: 日本語 +Langage : Français +SprÃ¥k: Norsk +Γλώσσα: Ελληνικά +Язык: РуÑÑкий +언어 : í•œêµì–´ +言語: 日本語 +Langage : Français +SprÃ¥k: Norsk +Γλώσσα: Ελληνικά +Язык: РуÑÑкий +언어 : í•œêµì–´ +言語: 日本語 +Langage : Français +SprÃ¥k: Norsk +Γλώσσα: Ελληνικά +Язык: РуÑÑкий +언어 : í•œêµì–´ +言語: 日本語 +Langage : Français +SprÃ¥k: Norsk +Γλώσσα: Ελληνικά +Язык: РуÑÑкий +언어 : í•œêµì–´ +言語: 日本語 +Langage : Français +SprÃ¥k: Norsk +Γλώσσα: Ελληνικά +Язык: РуÑÑкий +언어 : í•œêµì–´ +言語: 日本語 +Langage : Français +SprÃ¥k: Norsk +Γλώσσα: Ελληνικά +Язык: РуÑÑкий +언어 : í•œêµì–´ +言語: 日本語 +Langage : Français +SprÃ¥k: Norsk +Γλώσσα: Ελληνικά +Язык: РуÑÑкий +언어 : í•œêµì–´ +言語: 日本語 +Langage : Français +SprÃ¥k: Norsk +Γλώσσα: Ελληνικά +Язык: РуÑÑкий +언어 : í•œêµì–´ +言語: 日本語 +Langage : Français +SprÃ¥k: Norsk +Γλώσσα: Ελληνικά +Язык: РуÑÑкий +언어 : í•œêµì–´ +言語: 日本語 +Langage : Français +SprÃ¥k: Norsk +Γλώσσα: Ελληνικά +Язык: РуÑÑкий +언어 : í•œêµì–´ +言語: 日本語 +Langage : Français +SprÃ¥k: Norsk +Γλώσσα: Ελληνικά +Язык: РуÑÑкий +언어 : í•œêµì–´ +言語: 日本語 +Langage : Français diff --git a/tests/benchmarks/corelib/corelib.pro b/tests/benchmarks/corelib/corelib.pro index 72fca33..7669e0a 100644 --- a/tests/benchmarks/corelib/corelib.pro +++ b/tests/benchmarks/corelib/corelib.pro @@ -3,4 +3,5 @@ SUBDIRS = \ io \ kernel \ thread \ - tools + tools \ + codecs diff --git a/tests/benchmarks/corelib/io/qdir/10000/10000.pro b/tests/benchmarks/corelib/io/qdir/10000/10000.pro new file mode 100644 index 0000000..93b0992 --- /dev/null +++ b/tests/benchmarks/corelib/io/qdir/10000/10000.pro @@ -0,0 +1,10 @@ +load(qttest_p4) +TEMPLATE = app +TARGET = bench_qdir_10000 +DEPENDPATH += . +INCLUDEPATH += . + +# Input +SOURCES += bench_qdir_10000.cpp + +QT -= gui diff --git a/tests/benchmarks/corelib/io/qdir/tst_qdir.cpp b/tests/benchmarks/corelib/io/qdir/10000/bench_qdir_10000.cpp index aea9fd0..b325250 100644 --- a/tests/benchmarks/corelib/io/qdir/tst_qdir.cpp +++ b/tests/benchmarks/corelib/io/qdir/10000/bench_qdir_10000.cpp @@ -50,7 +50,7 @@ # include <unistd.h> #endif -class Test : public QObject{ +class bench_QDir_10000 : public QObject{ Q_OBJECT public slots: void initTestCase() { @@ -95,9 +95,9 @@ private slots: QBENCHMARK { QDirIterator dit(testdir.path(), QDir::Files); while (dit.hasNext()) { + dit.next(); dit.fileInfo().isDir(); dit.fileInfo().size(); - dit.next(); } } } @@ -116,9 +116,9 @@ private slots: QBENCHMARK { QDirIterator dit(testdir.path()); while (dit.hasNext()) { + dit.next(); dit.fileInfo().isDir(); dit.fileInfo().size(); - dit.next(); } } } @@ -194,5 +194,5 @@ private slots: } }; -QTEST_MAIN(Test) -#include "tst_qdir.moc" +QTEST_MAIN(bench_QDir_10000) +#include "bench_qdir_10000.moc" diff --git a/tests/benchmarks/corelib/io/qdir/qdir.pro b/tests/benchmarks/corelib/io/qdir/qdir.pro index 2cdebfd..c572566 100644 --- a/tests/benchmarks/corelib/io/qdir/qdir.pro +++ b/tests/benchmarks/corelib/io/qdir/qdir.pro @@ -1,8 +1,2 @@ -load(qttest_p4) -TEMPLATE = app -TARGET = tst_qdir -DEPENDPATH += . -INCLUDEPATH += . - -# Input -SOURCES += tst_qdir.cpp +TEMPLATE = subdirs +SUBDIRS = 10000 diff --git a/tests/benchmarks/qvector/main.cpp b/tests/benchmarks/corelib/tools/qvector/main.cpp index 65e7609..6393eda 100644 --- a/tests/benchmarks/qvector/main.cpp +++ b/tests/benchmarks/corelib/tools/qvector/main.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** diff --git a/tests/benchmarks/qvector/outofline.cpp b/tests/benchmarks/corelib/tools/qvector/outofline.cpp index e8d036e..e8d036e 100644 --- a/tests/benchmarks/qvector/outofline.cpp +++ b/tests/benchmarks/corelib/tools/qvector/outofline.cpp diff --git a/tests/benchmarks/qvector/qrawvector.h b/tests/benchmarks/corelib/tools/qvector/qrawvector.h index 15421eb..1824d20 100644 --- a/tests/benchmarks/qvector/qrawvector.h +++ b/tests/benchmarks/corelib/tools/qvector/qrawvector.h @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** diff --git a/tests/benchmarks/qvector/qvector.pro b/tests/benchmarks/corelib/tools/qvector/qvector.pro index adb30c9..adb30c9 100644 --- a/tests/benchmarks/qvector/qvector.pro +++ b/tests/benchmarks/corelib/tools/qvector/qvector.pro diff --git a/tests/benchmarks/corelib/tools/tools.pro b/tests/benchmarks/corelib/tools/tools.pro index 12c23fc..681a6c6 100644 --- a/tests/benchmarks/corelib/tools/tools.pro +++ b/tests/benchmarks/corelib/tools/tools.pro @@ -7,4 +7,5 @@ SUBDIRS = \ qregexp \ qstring \ qstringbuilder \ - qstringlist + qstringlist \ + qvector diff --git a/tests/benchmarks/declarative/binding/testtypes.cpp b/tests/benchmarks/declarative/binding/testtypes.cpp index 892738c..3a9f59b 100644 --- a/tests/benchmarks/declarative/binding/testtypes.cpp +++ b/tests/benchmarks/declarative/binding/testtypes.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** diff --git a/tests/benchmarks/declarative/binding/testtypes.h b/tests/benchmarks/declarative/binding/testtypes.h index c0586b1..d4e0a1a 100644 --- a/tests/benchmarks/declarative/binding/testtypes.h +++ b/tests/benchmarks/declarative/binding/testtypes.h @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** diff --git a/tests/benchmarks/declarative/binding/tst_binding.cpp b/tests/benchmarks/declarative/binding/tst_binding.cpp index 7b4875f..74a3407 100644 --- a/tests/benchmarks/declarative/binding/tst_binding.cpp +++ b/tests/benchmarks/declarative/binding/tst_binding.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** diff --git a/tests/benchmarks/declarative/creation/tst_creation.cpp b/tests/benchmarks/declarative/creation/tst_creation.cpp index ae50309..23c820c 100644 --- a/tests/benchmarks/declarative/creation/tst_creation.cpp +++ b/tests/benchmarks/declarative/creation/tst_creation.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** diff --git a/tests/benchmarks/declarative/painting/data/63x63.png b/tests/benchmarks/declarative/painting/data/63x63.png Binary files differnew file mode 100644 index 0000000..d9efda8 --- /dev/null +++ b/tests/benchmarks/declarative/painting/data/63x63.png diff --git a/tests/benchmarks/declarative/painting/data/63x63_opaque.png b/tests/benchmarks/declarative/painting/data/63x63_opaque.png Binary files differnew file mode 100644 index 0000000..d142908 --- /dev/null +++ b/tests/benchmarks/declarative/painting/data/63x63_opaque.png diff --git a/tests/benchmarks/declarative/painting/data/64x64.png b/tests/benchmarks/declarative/painting/data/64x64.png Binary files differnew file mode 100644 index 0000000..b149f33 --- /dev/null +++ b/tests/benchmarks/declarative/painting/data/64x64.png diff --git a/tests/benchmarks/declarative/painting/data/64x64_opaque.png b/tests/benchmarks/declarative/painting/data/64x64_opaque.png Binary files differnew file mode 100644 index 0000000..94c07f3 --- /dev/null +++ b/tests/benchmarks/declarative/painting/data/64x64_opaque.png diff --git a/tests/benchmarks/declarative/painting/paintbenchmark.cpp b/tests/benchmarks/declarative/painting/paintbenchmark.cpp index d6a873c..073e14e 100644 --- a/tests/benchmarks/declarative/painting/paintbenchmark.cpp +++ b/tests/benchmarks/declarative/painting/paintbenchmark.cpp @@ -43,15 +43,13 @@ #include <QPixmap> #include <QImage> #include <QPainter> +#include <QPainterPath> #include <QGLWidget> #include <QTextLayout> #include <QVBoxLayout> #include <QTime> #include <QDebug> - -#ifdef HAVE_STATICTEXT -#include <private/qstatictext_p.h> -#endif +#include <QStaticText> int iterations = 20; const int count = 600; @@ -60,6 +58,7 @@ const int spacing = 36; QSizeF size(1000, 800); const qreal lineWidth = 1000; QString strings[lines]; +QGLWidget *testWidget = 0; void paint_QTextLayout(QPainter &p, bool useCache) { @@ -105,7 +104,6 @@ void paint_QTextLayout_cache(QPainter &p) paint_QTextLayout(p, true); } -#ifdef HAVE_STATICTEXT void paint_QStaticText(QPainter &p, bool useOptimizations) { static QStaticText *staticText[lines]; @@ -113,7 +111,10 @@ void paint_QStaticText(QPainter &p, bool useOptimizations) if (first) { for (int i = 0; i < lines; ++i) { staticText[i] = new QStaticText(strings[i]); - staticText[i]->setUseBackendOptimizations(useOptimizations); + if (useOptimizations) + staticText[i]->setPerformanceHint(QStaticText::AggressiveCaching); + else + staticText[i]->setPerformanceHint(QStaticText::ModerateCaching); } first = false; } @@ -133,7 +134,6 @@ void paint_QStaticText_optimizations(QPainter &p) { paint_QStaticText(p, true); } -#endif void paint_QPixmapCachedText(QPainter &p) { @@ -160,6 +160,15 @@ void paint_QPixmapCachedText(QPainter &p) void paint_RoundedRect(QPainter &p) { + static bool first = true; + if (first) { + if (testWidget) { + QGLFormat format = testWidget->format(); + if (!format.sampleBuffers()) + qWarning() << "Cannot paint antialiased rounded rect without sampleBuffers"; + } + first = false; + } p.setRenderHint(QPainter::Antialiasing, true); p.setPen(Qt::black); p.setBrush(Qt::red); @@ -174,27 +183,123 @@ void paint_RoundedRect(QPainter &p) void paint_QPixmapCachedRoundedRect(QPainter &p) { static bool first = true; - static QPixmap cacheRect[lines]; + static QPixmap cacheRect; if (first) { - for (int i = 0; i < lines; ++i) { - QSize size((i+1)*50, spacing-1); - cacheRect[i] = QPixmap(size); - cacheRect[i].fill(Qt::transparent); - QPainter paint(&cacheRect[i]); - paint.setRenderHint(QPainter::Antialiasing); - paint.setPen(Qt::black); - paint.setBrush(Qt::red); - paint.drawRoundedRect(QRect(QPoint(0,0), size), 8, 8); + const int pw = 0; + const int radius = 8; + cacheRect = QPixmap(radius*2 + 3 + pw*2, radius*2 + 3 + pw*2); + cacheRect.fill(Qt::transparent); + QPainter paint(&cacheRect); + paint.setRenderHint(QPainter::Antialiasing); + paint.setPen(Qt::black); + paint.setBrush(Qt::red); + if (pw%2) + paint.drawRoundedRect(QRectF(qreal(pw)/2+1, qreal(pw)/2+1, cacheRect.width()-(pw+1), cacheRect.height()-(pw+1)), radius, radius); + else + paint.drawRoundedRect(QRectF(qreal(pw)/2, qreal(pw)/2, cacheRect.width()-pw, cacheRect.height()-pw), radius, radius); + + first = false; + } + for (int i = 0; i < count; i++) { + for (int j = 0; j < lines; ++j) { + QSize size((j+1)*50, spacing-1); + + p.setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform, true); + + const int pw = 0; + + int xOffset = (cacheRect.width()-1)/2; + int yOffset = (cacheRect.height()-1)/2; + + QMargins margins(xOffset, yOffset, xOffset, yOffset); + QTileRules rules(Qt::StretchTile, Qt::StretchTile); + //NOTE: even though our item may have qreal-based width and height, qDrawBorderPixmap only supports QRects + qDrawBorderPixmap(&p, QRect(-pw/2, j*spacing-pw/2, size.width()+pw, size.height()+pw), margins, cacheRect, cacheRect.rect(), margins, rules); + } + } +} + +void paint_pathCacheRoundedRect(QPainter &p) +{ + static bool first = true; + static QPainterPath path[lines]; + if (first) { + for (int j = 0; j < lines; ++j) { + path[j].addRoundedRect(QRectF(0,0,(j+1)*50, spacing-1), 8, 8); } first = false; } + p.setRenderHint(QPainter::Antialiasing, true); + p.setPen(Qt::black); + p.setBrush(Qt::red); for (int i = 0; i < count; i++) { for (int j = 0; j < lines; ++j) { - p.drawPixmap(0,j*spacing,cacheRect[j]); + p.translate(0,j*spacing); + p.drawPath(path[j]); + p.translate(0,-j*spacing); } } } +void paint_QPixmap63x63_opaque(QPainter &p) +{ + static bool first = true; + static QPixmap pm; + if (first) { + pm.load("data/63x63_opaque.png"); + first = false; + } + for (int i = 0; i < count; i++) { + for (int j = 0; j < lines; ++j) { + p.drawPixmap((i%10) * 64,j*spacing, pm); + } + } +} + +void paint_QPixmap64x64_opaque(QPainter &p) +{ + static bool first = true; + static QPixmap pm; + if (first) { + pm.load("data/64x64_opaque.png"); + first = false; + } + for (int i = 0; i < count; i++) { + for (int j = 0; j < lines; ++j) { + p.drawPixmap((i%10) * 64,j*spacing, pm); + } + } +} + +void paint_QPixmap63x63(QPainter &p) +{ + static bool first = true; + static QPixmap pm; + if (first) { + pm.load("data/63x63.png"); + first = false; + } + for (int i = 0; i < count; i++) { + for (int j = 0; j < lines; ++j) { + p.drawPixmap((i%10) * 64,j*spacing, pm); + } + } +} + +void paint_QPixmap64x64(QPainter &p) +{ + static bool first = true; + static QPixmap pm; + if (first) { + pm.load("data/64x64.png"); + first = false; + } + for (int i = 0; i < count; i++) { + for (int j = 0; j < lines; ++j) { + p.drawPixmap((i%10) * 64,j*spacing, pm); + } + } +} typedef void(*PaintFunc)(QPainter &); struct { @@ -203,13 +308,16 @@ struct { } funcs[] = { { "QTextLayoutNoCache", &paint_QTextLayout_noCache }, { "QTextLayoutWithCache", &paint_QTextLayout_cache }, -#ifdef HAVE_STATICTEXT { "QStaticTextNoBackendOptimizations", &paint_QStaticText_noOptimizations }, { "QStaticTextWithBackendOptimizations", &paint_QStaticText_optimizations }, -#endif { "CachedText", &paint_QPixmapCachedText }, { "RoundedRect", &paint_RoundedRect }, { "CachedRoundedRect", &paint_QPixmapCachedRoundedRect }, + { "PathCacheRoundedRect", &paint_pathCacheRoundedRect }, + { "QPixmap63x63_opaque", &paint_QPixmap63x63_opaque }, + { "QPixmap64x64_opaque", &paint_QPixmap64x64_opaque }, + { "QPixmap63x63", &paint_QPixmap63x63 }, + { "QPixmap64x64", &paint_QPixmap64x64 }, { 0, 0 } }; @@ -231,7 +339,7 @@ public: void paintEvent(QPaintEvent *) { static int last = 0; static bool firstRun = true; - if (firstRun == 0) { + if (firstRun) { timer.start(); firstRun = false; } else { @@ -297,11 +405,11 @@ int main(int argc, char *argv[]) QWidget w; QGLFormat format = QGLFormat::defaultFormat(); format.setSampleBuffers(sampleBuffers); - MyGLWidget *glw = new MyGLWidget(format); - glw->setAutoFillBackground(false); + testWidget = new MyGLWidget(format); + testWidget->setAutoFillBackground(false); QVBoxLayout *layout = new QVBoxLayout(&w); w.setLayout(layout); - layout->addWidget(glw); + layout->addWidget(testWidget); w.showFullScreen(); app.exec(); diff --git a/tests/benchmarks/declarative/pointers/tst_pointers.cpp b/tests/benchmarks/declarative/pointers/tst_pointers.cpp index 55c2e89..4fead9a 100644 --- a/tests/benchmarks/declarative/pointers/tst_pointers.cpp +++ b/tests/benchmarks/declarative/pointers/tst_pointers.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** diff --git a/tests/benchmarks/declarative/qmlcomponent/testtypes.cpp b/tests/benchmarks/declarative/qmlcomponent/testtypes.cpp index 56d20c6..f0bc1f9 100644 --- a/tests/benchmarks/declarative/qmlcomponent/testtypes.cpp +++ b/tests/benchmarks/declarative/qmlcomponent/testtypes.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** diff --git a/tests/benchmarks/declarative/qmlcomponent/testtypes.h b/tests/benchmarks/declarative/qmlcomponent/testtypes.h index c0586b1..d4e0a1a 100644 --- a/tests/benchmarks/declarative/qmlcomponent/testtypes.h +++ b/tests/benchmarks/declarative/qmlcomponent/testtypes.h @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** diff --git a/tests/benchmarks/declarative/qmlcomponent/tst_qmlcomponent.cpp b/tests/benchmarks/declarative/qmlcomponent/tst_qmlcomponent.cpp index f5a4540..647edbf 100644 --- a/tests/benchmarks/declarative/qmlcomponent/tst_qmlcomponent.cpp +++ b/tests/benchmarks/declarative/qmlcomponent/tst_qmlcomponent.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** @@ -23,7 +23,7 @@ ** ** In addition, as a special exception, Nokia gives you certain additional ** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.qml in this package. +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ** ** If you have questions regarding the use of this file, please contact ** Nokia at qt-info@nokia.com. diff --git a/tests/benchmarks/declarative/qmlgraphicsimage/tst_qmlgraphicsimage.cpp b/tests/benchmarks/declarative/qmlgraphicsimage/tst_qmlgraphicsimage.cpp index f6a6432..7d7d24e 100644 --- a/tests/benchmarks/declarative/qmlgraphicsimage/tst_qmlgraphicsimage.cpp +++ b/tests/benchmarks/declarative/qmlgraphicsimage/tst_qmlgraphicsimage.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** diff --git a/tests/benchmarks/declarative/qmlmetaproperty/tst_qmlmetaproperty.cpp b/tests/benchmarks/declarative/qmlmetaproperty/tst_qmlmetaproperty.cpp index 8d0e549..4c002f8 100644 --- a/tests/benchmarks/declarative/qmlmetaproperty/tst_qmlmetaproperty.cpp +++ b/tests/benchmarks/declarative/qmlmetaproperty/tst_qmlmetaproperty.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** diff --git a/tests/benchmarks/declarative/qmltime/tests/item_creation/children.qml b/tests/benchmarks/declarative/qmltime/tests/item_creation/children.qml index 210c515..996602c 100644 --- a/tests/benchmarks/declarative/qmltime/tests/item_creation/children.qml +++ b/tests/benchmarks/declarative/qmltime/tests/item_creation/children.qml @@ -24,7 +24,7 @@ Item { Text { }, Text { }, Text { }, - MouseRegion { } + MouseArea { } ] } diff --git a/tests/benchmarks/declarative/qmltime/tests/item_creation/data.qml b/tests/benchmarks/declarative/qmltime/tests/item_creation/data.qml index 943634f..9f79c34 100644 --- a/tests/benchmarks/declarative/qmltime/tests/item_creation/data.qml +++ b/tests/benchmarks/declarative/qmltime/tests/item_creation/data.qml @@ -24,7 +24,7 @@ Item { Text { }, Text { }, Text { }, - MouseRegion { } + MouseArea { } ] } diff --git a/tests/benchmarks/declarative/qmltime/tests/item_creation/resources.qml b/tests/benchmarks/declarative/qmltime/tests/item_creation/resources.qml index ce986b5..335aeb8 100644 --- a/tests/benchmarks/declarative/qmltime/tests/item_creation/resources.qml +++ b/tests/benchmarks/declarative/qmltime/tests/item_creation/resources.qml @@ -24,7 +24,7 @@ Item { Text { }, Text { }, Text { }, - MouseRegion { } + MouseArea { } ] } diff --git a/tests/benchmarks/declarative/qmltime/tests/positioner_creation/no_positioner.qml b/tests/benchmarks/declarative/qmltime/tests/positioner_creation/no_positioner.qml index 25e9c62..97bad47 100644 --- a/tests/benchmarks/declarative/qmltime/tests/positioner_creation/no_positioner.qml +++ b/tests/benchmarks/declarative/qmltime/tests/positioner_creation/no_positioner.qml @@ -30,7 +30,7 @@ Item { Text { } } } - MouseRegion { } + MouseArea { } } } } diff --git a/tests/benchmarks/declarative/qmltime/tests/positioner_creation/null_positioner.qml b/tests/benchmarks/declarative/qmltime/tests/positioner_creation/null_positioner.qml index ee3f9d1..36dda15 100644 --- a/tests/benchmarks/declarative/qmltime/tests/positioner_creation/null_positioner.qml +++ b/tests/benchmarks/declarative/qmltime/tests/positioner_creation/null_positioner.qml @@ -27,7 +27,7 @@ Item { Text { } Text { } } - MouseRegion { } + MouseArea { } } } } diff --git a/tests/benchmarks/declarative/qmltime/tests/positioner_creation/positioner.qml b/tests/benchmarks/declarative/qmltime/tests/positioner_creation/positioner.qml index 4c46ec1..396e27d 100644 --- a/tests/benchmarks/declarative/qmltime/tests/positioner_creation/positioner.qml +++ b/tests/benchmarks/declarative/qmltime/tests/positioner_creation/positioner.qml @@ -30,7 +30,7 @@ Item { Text { } } } - MouseRegion { } + MouseArea { } } } } diff --git a/tests/benchmarks/declarative/script/tst_script.cpp b/tests/benchmarks/declarative/script/tst_script.cpp index 36a0833..dd21997 100644 --- a/tests/benchmarks/declarative/script/tst_script.cpp +++ b/tests/benchmarks/declarative/script/tst_script.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/GraphicsViewBenchmark.pro b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/GraphicsViewBenchmark.pro new file mode 100644 index 0000000..131ec12 --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/GraphicsViewBenchmark.pro @@ -0,0 +1,71 @@ +load(qttest_p4) +TEMPLATE = app + +QT += svg +contains(QT_CONFIG, opengl):QT += opengl + +HEADERS += widgets/gvbwidget.h \ + widgets/abstractscrollarea.h \ + widgets/mainview.h \ + widgets/iconitem.h \ + widgets/label.h \ + widgets/listitem.h \ + widgets/scrollbar.h \ + widgets/simplelistview.h \ + widgets/scroller.h \ + widgets/scroller_p.h \ + widgets/button.h \ + widgets/menu.h \ + widgets/themeevent.h \ + widgets/theme.h \ + widgets/backgrounditem.h \ + widgets/topbar.h \ + widgets/commandline.h \ + widgets/dummydatagen.h \ + widgets/settings.h \ + widgets/listitemcache.h \ + widgets/listwidget.h \ + widgets/simplelist.h \ + widgets/itemrecyclinglist.h \ + widgets/itemrecyclinglistview.h \ + widgets/abstractitemview.h \ + widgets/abstractviewitem.h \ + widgets/recycledlistitem.h \ + widgets/listitemcontainer.h \ + widgets/abstractitemcontainer.h \ + widgets/listmodel.h + +SOURCES += main.cpp \ + widgets/gvbwidget.cpp \ + widgets/abstractscrollarea.cpp \ + widgets/mainview.cpp \ + widgets/iconitem.cpp \ + widgets/label.cpp \ + widgets/listitem.cpp \ + widgets/scrollbar.cpp \ + widgets/simplelistview.cpp \ + widgets/scroller.cpp \ + widgets/button.cpp \ + widgets/menu.cpp \ + widgets/themeevent.cpp \ + widgets/theme.cpp \ + widgets/backgrounditem.cpp \ + widgets/topbar.cpp \ + widgets/commandline.cpp \ + widgets/dummydatagen.cpp \ + widgets/settings.cpp \ + widgets/listitemcache.cpp \ + widgets/listwidget.cpp \ + widgets/simplelist.cpp \ + widgets/itemrecyclinglist.cpp \ + widgets/itemrecyclinglistview.cpp \ + widgets/abstractitemview.cpp \ + widgets/abstractviewitem.cpp \ + widgets/recycledlistitem.cpp \ + widgets/listitemcontainer.cpp \ + widgets/abstractitemcontainer.cpp \ + widgets/listmodel.cpp + +TARGET = tst_GraphicsViewBenchmark +RESOURCES += GraphicsViewBenchmark.qrc +INCLUDEPATH += widgets diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/GraphicsViewBenchmark.qrc b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/GraphicsViewBenchmark.qrc new file mode 100644 index 0000000..18ae04d --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/GraphicsViewBenchmark.qrc @@ -0,0 +1,85 @@ +<RCC> + <qresource prefix="/themes/blue"> + <file alias="background.svg">resources/blue_SVG/blue_background_360x640px.svg</file> + <file alias="background_horisontal.svg">resources/blue_SVG/blue_background_horisontal_640x360px.svg</file> + <file alias="contact_default_icon.svg">resources/blue_SVG/blue_contact_default_icon_52x52px.svg</file> + <file alias="contact_list_divider.svg">resources/blue_SVG/blue_contact_list_divider_360x76px.svg</file> + <file alias="contact_list_highlighter.svg">resources/blue_SVG/blue_contact_list_highlighter_360x76px.svg</file> + <file alias="contact_status_idle.svg">resources/blue_SVG/blue_contact_status_idle_33x33px.svg</file> + <file alias="contact_status_offline.svg">resources/blue_SVG/blue_contact_status_offline_33x33px.svg</file> + <file alias="contact_status_online.svg">resources/blue_SVG/blue_contact_status_online_33x33px.svg</file> + <file alias="scrollbar.svg">resources/blue_SVG/blue_scrollbar_7x14px.svg</file> + <file alias="scroll.svg">resources/blue_SVG/blue_scroll_16x80px.svg</file> + <file alias="status_field_left.svg">resources/blue_SVG/blue_status_field_left_14x24px.svg</file> + <file alias="status_field_middle.svg">resources/blue_SVG/blue_status_field_middle_14x24px.svg</file> + <file alias="status_field_right.svg">resources/blue_SVG/blue_status_field_right_14x24px.svg</file> + <file alias="topbar.svg">resources/blue_SVG/blue_topbar_356x96px.svg</file> + <file alias="topbar_horisontal.svg">resources/blue_SVG/blue_topbar_horisontal_636x96px.svg</file> + <file alias="user_default_icon.svg">resources/blue_SVG/blue_user_default_icon_68x68px.svg</file> + <file alias="user_status_idle.svg">resources/blue_SVG/blue_user_status_idle_38x38px.svg</file> + <file alias="user_status_offline.svg">resources/blue_SVG/blue_user_status_offline_38x38px.svg</file> + <file alias="user_status_online.svg">resources/blue_SVG/blue_user_status_online_38x38px.svg</file> + </qresource> + + <qresource prefix="/themes/lime"> + <file alias="background.svg">resources/lime_SVG/lime_background_360x640px.svg</file> + <file alias="background_horisontal.svg">resources/lime_SVG/lime_background_horisontal_640x360px.svg</file> + <file alias="contact_default_icon.svg">resources/lime_SVG/lime_contact_default_icon_53x53px.svg</file> + <file alias="contact_default_icon_highlight.svg">resources/lime_SVG/lime_contact_default_icon_highlight_53x53px.svg</file> + <file alias="contact_list_divider.svg">resources/lime_SVG/lime_contact_list_divider_360x76px.svg</file> + <file alias="contact_list_highlighter.svg">resources/lime_SVG/lime_contact_list_highlighter_357x80px.svg</file> + <file alias="contact_status_idle.svg">resources/blue_SVG/blue_contact_status_idle_33x33px.svg</file> + <file alias="contact_status_offline.svg">resources/blue_SVG/blue_contact_status_offline_33x33px.svg</file> + <file alias="contact_status_online.svg">resources/blue_SVG/blue_contact_status_online_33x33px.svg</file> + <file alias="scrollbar.svg">resources/lime_SVG/lime_scrollbar_5x14px.svg</file> + <file alias="scroll.svg">resources/lime_SVG/lime_scroll_5x80px.svg</file> + <file alias="status_field_left.svg">resources/lime_SVG/lime_status_field_left_14x24px.svg</file> + <file alias="status_field_middle.svg">resources/lime_SVG/lime_status_field_middle_10x24px.svg</file> + <file alias="status_field_right.svg">resources/lime_SVG/lime_status_field_right_14x24px.svg</file> + <file alias="topbar.svg">resources/lime_SVG/lime_topbar_356x96px.svg</file> + <file alias="topbar_horisontal.svg">resources/lime_SVG/lime_topbar_horisontal_636x96px.svg</file> + <file alias="user_default_icon.svg">resources/lime_SVG/lime_user_default_icon_84x68px.svg</file> + <file alias="user_status_idle.svg">resources/lime_SVG/lime_user_status_idle_24x24px.svg</file> + <file alias="user_status_offline.svg">resources/lime_SVG/lime_user_status_offline_24x24px.svg</file> + <file alias="user_status_online.svg">resources/lime_SVG/lime_user_status_online_24x24px.svg</file> + </qresource> + + <qresource prefix="/avatars"> + <file alias="avatar_001.png">resources/avatars/avatar_man_001_58x58.png</file> + <file alias="avatar_002.png">resources/avatars/avatar_man_002_58x58.png</file> + <file alias="avatar_003.png">resources/avatars/avatar_man_003_58x58.png</file> + <file alias="avatar_004.png">resources/avatars/avatar_man_004_58x58.png</file> + <file alias="avatar_005.png">resources/avatars/avatar_man_005_58x58.png</file> + <file alias="avatar_006.png">resources/avatars/avatar_man_006_58x58.png</file> + <file alias="avatar_007.png">resources/avatars/avatar_man_007_58x58.png</file> + <file alias="avatar_008.png">resources/avatars/avatar_man_008_58x58.png</file> + <file alias="avatar_009.png">resources/avatars/avatar_man_009_58x58.png</file> + <file alias="avatar_010.png">resources/avatars/avatar_man_010_58x58.png</file> + + <file alias="avatar_011.png">resources/avatars/avatar_picture_001_58x58.png</file> + <file alias="avatar_012.png">resources/avatars/avatar_picture_002_58x58.png</file> + <file alias="avatar_013.png">resources/avatars/avatar_picture_003_58x58.png</file> + <file alias="avatar_014.png">resources/avatars/avatar_picture_004_58x58.png</file> + <file alias="avatar_015.png">resources/avatars/avatar_picture_005_58x58.png</file> + + <file alias="avatar_016.png">resources/avatars/avatar_woman_001_58x58.png</file> + <file alias="avatar_017.png">resources/avatars/avatar_woman_002_58x58.png</file> + <file alias="avatar_018.png">resources/avatars/avatar_woman_003_58x58.png</file> + <file alias="avatar_019.png">resources/avatars/avatar_woman_004_58x58.png</file> + <file alias="avatar_020.png">resources/avatars/avatar_woman_005_58x58.png</file> + <file alias="avatar_021.png">resources/avatars/avatar_woman_006_58x58.png</file> + <file alias="avatar_022.png">resources/avatars/avatar_woman_007_58x58.png</file> + <file alias="avatar_023.png">resources/avatars/avatar_woman_008_58x58.png</file> + <file alias="avatar_024.png">resources/avatars/avatar_woman_009_58x58.png</file> + <file alias="avatar_025.png">resources/avatars/avatar_woman_010_58x58.png</file> + </qresource> + + <qresource prefix="/contact"> + <file alias="areacodes.txt">resources/contacts/areacodes.txt</file> + <file alias="firstnamesF.txt">resources/contacts/firstnamesF.txt</file> + <file alias="firstnamesM.txt">resources/contacts/firstnamesM.txt</file> + <file alias="lastnames.txt">resources/contacts/lastnames.txt</file> + </qresource> + +</RCC> + diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/main.cpp b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/main.cpp new file mode 100644 index 0000000..b904f40 --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/main.cpp @@ -0,0 +1,805 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (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 Technology Preview License Agreement accompanying +** this package. +** +** 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.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + + +#include <QtTest/QtTest> +#include <QtGui/qgraphicsview.h> +#include <QtGui/qpixmapcache.h> +#include <QtGui/qdesktopwidget.h> + +#include "mainview.h" +#include "dummydatagen.h" +#include "simplelist.h" +#include "itemrecyclinglist.h" +#include "simplelist.h" +#include "theme.h" +#include "commandline.h" + +class tst_GraphicsViewBenchmark : public QObject +{ + Q_OBJECT +public: + enum ListType { + Simple, + Recycling, + None + }; + + enum ScrollStep { + Slow = 2, + Normal = 8, + Fast = 64 + }; + + tst_GraphicsViewBenchmark(Settings *settings) + : mSettings(settings), mMainView(0), currentListSize(-1), currentListType(None) {} + ~tst_GraphicsViewBenchmark() {} + +public slots: + void initTestCase(); + void cleanupTestCase(); + void init(); + +private slots: + // Benchmarks: + void createAndFillList_data(); + void createAndFillList(); + void add100ItemsToBeginningOfList_data(); + void add100ItemsToBeginningOfList(); + void remove100ItemsFromBeginningOfList_data(); + void remove100ItemsFromBeginningOfList(); + void deleteList_data(); + void deleteList(); + void themeChange_data(); + void themeChange(); + void update_data(); + void update(); + void scroll_data(); + void scroll(); + +private: + Settings *mSettings; + MainView *mMainView; + DummyDataGenerator mDataGenerator; + int currentListSize; + ListType currentListType; + + void resetView(); + void ensureListSizeAndType(int listSize, ListType listType); + void ensureTheme(Theme::Themes theme); + void ensureRotationAngle(int rotation); + void ensureSubtreeCache(bool enable); + void ensureImageBasedRendering(bool enable); + void insertListData(); + inline void setTestWidget(QGraphicsWidget *widget, int listSize, ListType listType) + { + currentListSize = listSize; + currentListType = listType; + mMainView->setTestWidget(widget); + } +}; + +Q_DECLARE_METATYPE(tst_GraphicsViewBenchmark::ListType) +Q_DECLARE_METATYPE(Theme::Themes) +Q_DECLARE_METATYPE(tst_GraphicsViewBenchmark::ScrollStep) + +const int AddRemoveCount = 100; + +static ListItem *newSimpleListItem(DummyDataGenerator &dataGenerator, const int id) +{ + ListItem *item = new ListItem(); + item->setText(dataGenerator.randomName(), ListItem::FirstPos ); + item->setText(dataGenerator.randomPhoneNumber(QString("%1").arg(id)), ListItem::SecondPos ); + item->setIcon(new IconItem(dataGenerator.randomIconItem(), item), ListItem::LeftIcon ); + item->setIcon(new IconItem(dataGenerator.randomStatusItem(), item), ListItem::RightIcon); + item->setFont(Theme::p()->font(Theme::ContactName), ListItem::FirstPos); + item->setFont(Theme::p()->font(Theme::ContactNumber), ListItem::SecondPos); + item->setBorderPen(Theme::p()->listItemBorderPen()); + item->setRounding(Theme::p()->listItemRounding()); + item->icon(ListItem::LeftIcon)->setRotation(Theme::p()->iconRotation(ListItem::LeftIcon)); + item->icon(ListItem::RightIcon)->setRotation(Theme::p()->iconRotation(ListItem::RightIcon)); + item->icon(ListItem::LeftIcon)->setSmoothTransformationEnabled(Theme::p()->isIconSmoothTransformationEnabled(ListItem::LeftIcon)); + item->icon(ListItem::RightIcon)->setSmoothTransformationEnabled(Theme::p()->isIconSmoothTransformationEnabled(ListItem::RightIcon)); + item->icon(ListItem::LeftIcon)->setOpacityEffectEnabled(Theme::p()->isIconOpacityEffectEnabled(ListItem::LeftIcon)); + item->icon(ListItem::RightIcon)->setOpacityEffectEnabled(Theme::p()->isIconOpacityEffectEnabled(ListItem::RightIcon)); + return item; +} + +static RecycledListItem *newRecyclingListItem(DummyDataGenerator &dataGenerator, const int id) +{ + RecycledListItem *item = new RecycledListItem(); + item->item()->setText(dataGenerator.randomName(), ListItem::FirstPos ); + item->item()->setText(dataGenerator.randomPhoneNumber(QString("%1").arg(id)), ListItem::SecondPos ); + item->item()->setIcon(new IconItem(dataGenerator.randomIconItem()), ListItem::LeftIcon ); + item->item()->setIcon(new IconItem(dataGenerator.randomStatusItem()), ListItem::RightIcon); + item->item()->setFont(Theme::p()->font(Theme::ContactName), ListItem::FirstPos); + item->item()->setFont(Theme::p()->font(Theme::ContactNumber), ListItem::SecondPos); + item->item()->setBorderPen(Theme::p()->listItemBorderPen()); + item->item()->setRounding(Theme::p()->listItemRounding()); + item->item()->icon(ListItem::LeftIcon)->setRotation(Theme::p()->iconRotation(ListItem::LeftIcon)); + item->item()->icon(ListItem::RightIcon)->setRotation(Theme::p()->iconRotation(ListItem::RightIcon)); + item->item()->icon(ListItem::LeftIcon)->setSmoothTransformationEnabled(Theme::p()->isIconSmoothTransformationEnabled(ListItem::LeftIcon)); + item->item()->icon(ListItem::RightIcon)->setSmoothTransformationEnabled(Theme::p()->isIconSmoothTransformationEnabled(ListItem::RightIcon)); + item->item()->icon(ListItem::LeftIcon)->setOpacityEffectEnabled(Theme::p()->isIconOpacityEffectEnabled(ListItem::LeftIcon)); + item->item()->icon(ListItem::RightIcon)->setOpacityEffectEnabled(Theme::p()->isIconOpacityEffectEnabled(ListItem::RightIcon)); + return item; +} + +static void fillList(DummyDataGenerator &dataGenerator, int itemCount, QGraphicsWidget *list) +{ + if (SimpleList *simpleList = qobject_cast<SimpleList *>(list)) { + for (int i = 0; i < itemCount; ++i) + simpleList->addItem(newSimpleListItem(dataGenerator, i)); + } else if (ItemRecyclingList *recyclingList = qobject_cast<ItemRecyclingList *>(list)) { + for (int i = 0; i < itemCount; ++i) + recyclingList->addItem(newRecyclingListItem(dataGenerator, i)); + } else { + qFatal("fillList: internal error"); + } +} + +void tst_GraphicsViewBenchmark::resetView() +{ + if (QGraphicsWidget *widget = mMainView->takeTestWidget()) { + delete widget; + currentListSize = -1; + currentListType = None; + QTest::qWait(50); + } else { + if (currentListSize != -1) + qFatal("tst_GraphicsViewBenchmark::resetView: internal error: wrong list size"); + if (currentListType != None) + qFatal("tst_GraphicsViewBenchmark::resetView: internal error: wrong list type"); + } + ensureTheme(Theme::Blue); + ensureRotationAngle(0); + ensureSubtreeCache(false); + ensureImageBasedRendering(false); +} + +void tst_GraphicsViewBenchmark::ensureListSizeAndType(int listSize, ListType listType) +{ + if (currentListSize != listSize || currentListType != listType) { + resetView(); + if (listType == Simple) { + SimpleList *list = new SimpleList; + fillList(mDataGenerator, listSize, list); + setTestWidget(list, listSize, listType); + } else if (listType == Recycling) { + ItemRecyclingList *list = new ItemRecyclingList; + fillList(mDataGenerator, listSize, list); + setTestWidget(list, listSize, listType); + } + QTest::qWait(50); + return; + } + + // Okay, we're supposed to have the right list type and size. Make sure we actually have it. + QGraphicsWidget *widget = mMainView->testWidget(); + if (!widget) { + if (currentListType != None || currentListSize != -1) + qFatal("tst_GraphicsViewBenchmark::ensureListSizeAndType: internal error: no test widget"); + return; + } + + if (listType == Simple) { + SimpleList *list = qobject_cast<SimpleList *>(widget); + if (!list) + qFatal("tst_GraphicsViewBenchmark::ensureListSizeAndType: internal error: wrong list type"); + if (list->itemCount() != listSize) + qFatal("tst_GraphicsViewBenchmark::ensureListSizeAndType: internal error: wrong list size"); + } else if (listType == Recycling){ + ItemRecyclingList *list = qobject_cast<ItemRecyclingList *>(widget); + if (!list) + qFatal("tst_GraphicsViewBenchmark::ensureListSizeAndType: internal error: wrong list type"); + if (list->rows() != listSize) + qFatal("tst_GraphicsViewBenchmark::ensureListSizeAndType: internal error: wrong list size"); + } +} + +void tst_GraphicsViewBenchmark::ensureTheme(Theme::Themes theme) +{ + if (Theme::p()->theme() != theme) { + Theme::p()->setTheme(theme); + // The theme change itself can take a lot of time, so make + // sure we give it a little bit time to stabilize *after* + // the changes, hence sendPostedEvents(); qWait(); + QApplication::sendPostedEvents(); + QTest::qWait(50); + } +} + +void tst_GraphicsViewBenchmark::ensureRotationAngle(int angle) +{ + const bool useTwoColumns = angle != 0; + bool wait = false; + if (mMainView->rotationAngle() != angle) { + mMainView->rotateContent(-mMainView->rotationAngle() + angle); + wait = true; + } + if (QGraphicsWidget *widget = mMainView->testWidget()) { + if (SimpleList *list = qobject_cast<SimpleList *>(widget)) { + if (list->twoColumns() != useTwoColumns) { + list->setTwoColumns(useTwoColumns); + wait = true; + } + } else if (ItemRecyclingList *list = qobject_cast<ItemRecyclingList *>(widget)) { + if (list->twoColumns() != useTwoColumns) { + list->setTwoColumns(useTwoColumns); + wait = true; + } + } + } + if (wait) + QTest::qWait(50); +} + +void tst_GraphicsViewBenchmark::ensureSubtreeCache(bool enable) +{ + QGraphicsWidget *widget = mMainView->testWidget(); + if (!widget) + return; + + if (SimpleList *list = qobject_cast<SimpleList *>(widget)) { + if (list->listItemCaching() != enable) { + list->setListItemCaching(enable); + QTest::qWait(50); + } + } else if (ItemRecyclingList *list = qobject_cast<ItemRecyclingList *>(widget)) { + if (list->listItemCaching() != enable) { + list->setListItemCaching(enable); + QTest::qWait(50); + } + } + QPixmapCache::clear(); +} + +void tst_GraphicsViewBenchmark::ensureImageBasedRendering(bool enable) +{ + if (mMainView->imageBasedRendering() != enable) { + mMainView->setImageBasedRendering(enable); + QTest::qWait(50); + } +} + +void tst_GraphicsViewBenchmark::insertListData() +{ + QTest::addColumn<int>("listSize"); + QTest::addColumn<ListType>("listType"); + + QTest::newRow("Simple list containing 10 items") << 10 << Simple; + QTest::newRow("Recycling list containing 10 items") << 10 << Recycling; + QTest::newRow("Simple list containing 50 items") << 50 << Simple; + QTest::newRow("Recycling list containing 50 items") << 50 << Recycling; + QTest::newRow("Simple list containing 500 items") << 500 << Simple; + QTest::newRow("Recycling list containing 500 items") << 500 << Recycling; +} + +void tst_GraphicsViewBenchmark::initTestCase() +{ + mMainView = new MainView(mSettings->options() & Settings::UseOpenGL, + mSettings->options() & Settings::OutputFps); + + if (mSettings->size().width() > 0 && mSettings->size().height() > 0) { + mMainView->resize(mSettings->size().width(), mSettings->size().height()); + mMainView->show(); + } else { +#if defined(Q_OS_SYMBIAN) || defined(Q_WS_MAEMO_5) + mMainView->showFullScreen(); +#else + if (QApplication::desktop()->width() < 360 || QApplication::desktop()->height() < 640) { + mMainView->showFullScreen(); + } else { + mMainView->resize(360, 640); + mMainView->show(); + } +#endif + } + + mDataGenerator.Reset(); + SimpleList *list = new SimpleList; + list->setListItemCaching(false); + mMainView->setTestWidget(list); + fillList(mDataGenerator, 5, list); + mMainView->takeTestWidget(); + delete list; + + currentListSize = -1; + currentListType = None; + + QTest::qWaitForWindowShown(mMainView); +} + +void tst_GraphicsViewBenchmark::cleanupTestCase() +{ + delete mMainView; + mMainView = 0; +} + +void tst_GraphicsViewBenchmark::init() +{ + // Make sure we don't have pending events in the queue. + // Yes, each test run takes a little bit longer, but the results are more stable. + QTest::qWait(150); +} + +void tst_GraphicsViewBenchmark::createAndFillList_data() +{ + insertListData(); +} + +void tst_GraphicsViewBenchmark::createAndFillList() +{ + QFETCH(int, listSize); + QFETCH(ListType, listType); + + resetView(); + + if (listType == Simple) { + QBENCHMARK { + SimpleList *list = new SimpleList; + setTestWidget(list, listSize, listType); + fillList(mDataGenerator, listSize, list); + } + } else { + QBENCHMARK { + ItemRecyclingList *list = new ItemRecyclingList; + setTestWidget(list, listSize, listType); + fillList(mDataGenerator, listSize, list); + } + } + + resetView(); +} + +void tst_GraphicsViewBenchmark::add100ItemsToBeginningOfList_data() +{ + insertListData(); +} + +void tst_GraphicsViewBenchmark::add100ItemsToBeginningOfList() +{ + QFETCH(int, listSize); + QFETCH(ListType, listType); + + resetView(); + + if (listType == Simple) { + SimpleList *list = new SimpleList; + fillList(mDataGenerator, listSize, list); + setTestWidget(list, listSize, listType); + QTest::qWait(50); + QBENCHMARK { + for (int i = 0; i < AddRemoveCount; ++i) + list->insertItem(0, newSimpleListItem(mDataGenerator, i)); + } + } else { + ItemRecyclingList *list = new ItemRecyclingList; + fillList(mDataGenerator, listSize, list); + setTestWidget(list, listSize, listType); + QTest::qWait(50); + QBENCHMARK { + for (int i = 0; i < AddRemoveCount; ++i) + list->insertItem(0, newRecyclingListItem(mDataGenerator, i)); + } + } + + resetView(); +} + +void tst_GraphicsViewBenchmark::remove100ItemsFromBeginningOfList_data() +{ + insertListData(); +} + +void tst_GraphicsViewBenchmark::remove100ItemsFromBeginningOfList() +{ + QFETCH(int, listSize); + QFETCH(ListType, listType); + + resetView(); + + if (listType == Simple) { + SimpleList *list = new SimpleList; + fillList(mDataGenerator, listSize, list); + setTestWidget(list, listSize, listType); + QTest::qWait(50); + QBENCHMARK { + for (int i = 0; i < AddRemoveCount; ++i) + delete list->takeItem(0); + } + } else { + ItemRecyclingList *list = new ItemRecyclingList; + fillList(mDataGenerator, listSize, list); + setTestWidget(list, listSize, listType); + QTest::qWait(50); + QBENCHMARK { + for (int i = 0; i < AddRemoveCount; ++i) + delete list->takeItem(0); + } + } + + resetView(); +} + +void tst_GraphicsViewBenchmark::deleteList_data() +{ + insertListData(); + QTest::newRow("Simple list containing 1000 items") << 1000 << Simple; + QTest::newRow("Recycling list containing 1000 items") << 1000 << Recycling; +} + +void tst_GraphicsViewBenchmark::deleteList() +{ + QFETCH(int, listSize); + QFETCH(ListType, listType); + + if (listSize < 500) + return; // Too small to measure. + + QGraphicsWidget *list = 0; + if (listType == Simple) + list = new SimpleList; + else + list = new ItemRecyclingList; + fillList(mDataGenerator, listSize, list); + QTest::qWait(20); + + QBENCHMARK_ONCE { + delete list; + } +} + +void tst_GraphicsViewBenchmark::themeChange_data() +{ + QTest::addColumn<int>("listSize"); + QTest::addColumn<ListType>("listType"); + QTest::addColumn<Theme::Themes>("fromTheme"); + QTest::addColumn<Theme::Themes>("toTheme"); + + QTest::newRow("From Blue to Lime, simple list containing 10 items") << 10 << Simple << Theme::Blue << Theme::Lime; + QTest::newRow("From Lime to Blue, simple list containing 10 items") << 10 << Simple << Theme::Lime << Theme::Blue; + + QTest::newRow("From Blue to Lime, recycling list containing 10 items") << 10 << Recycling << Theme::Blue << Theme::Lime; + QTest::newRow("From Lime to Blue, recycling list containing 10 items") << 10 << Recycling << Theme::Lime << Theme::Blue; + + QTest::newRow("From Blue to Lime, simple list containing 50 items") << 50 << Simple << Theme::Blue << Theme::Lime; + QTest::newRow("From Lime to Blue, simple list containing 50 items") << 50 << Simple << Theme::Lime << Theme::Blue; + + QTest::newRow("From Blue to Lime, recycling list containing 50 items") << 50 << Recycling << Theme::Blue << Theme::Lime; + QTest::newRow("From Lime to Blue, recycling list containing 50 items") << 50 << Recycling << Theme::Lime << Theme::Blue; + + QTest::newRow("From Blue to Lime, simple list containing 500 items") << 500 << Simple << Theme::Blue << Theme::Lime; + QTest::newRow("From Lime to Blue, simple list containing 500 items") << 500 << Simple << Theme::Lime << Theme::Blue; + + QTest::newRow("From Blue to Lime, recycling list containing 500 items") << 500 << Recycling << Theme::Blue << Theme::Lime; + QTest::newRow("From Lime to Blue, recycling list containing 500 items") << 500 << Recycling << Theme::Lime << Theme::Blue; +} + +void tst_GraphicsViewBenchmark::themeChange() +{ + QFETCH(int, listSize); + QFETCH(ListType, listType); + QFETCH(Theme::Themes, fromTheme); + QFETCH(Theme::Themes, toTheme); + + if (fromTheme == toTheme) + qFatal("tst_GraphicsViewBenchmark::themeChange: to and from theme is the same"); + + ensureListSizeAndType(listSize, listType); + ensureTheme(fromTheme); + + QBENCHMARK { + Theme::p()->setTheme(toTheme); + } +} + +static inline QLatin1String stringForTheme(Theme::Themes theme) +{ + if (theme == Theme::Blue) + return QLatin1String("Blue"); + return QLatin1String("Lime"); +} + +static inline QLatin1String stringForListType(tst_GraphicsViewBenchmark::ListType type) +{ + if (type == tst_GraphicsViewBenchmark::Simple) + return QLatin1String("Simple"); + if (type == tst_GraphicsViewBenchmark::Recycling) + return QLatin1String("Recycling"); + return QLatin1String("None"); +} + +static inline QLatin1String stringForScrollStep(tst_GraphicsViewBenchmark::ScrollStep step) +{ + if (step == tst_GraphicsViewBenchmark::Slow) + return QLatin1String("Slow"); + if (step == tst_GraphicsViewBenchmark::Normal) + return QLatin1String("Normal"); + return QLatin1String("Fast"); +} + +static inline QString rowString(int listSize, tst_GraphicsViewBenchmark::ListType listType, + Theme::Themes theme, int toImage, int cache, int angle) +{ + return QString("Items=%1, List=%2, Theme=%3, RenderToImage=%4, Cache=%5, RotAngle=%6") + .arg(QString::number(listSize)).arg(stringForListType(listType)) + .arg(stringForTheme(theme)).arg(QString::number(toImage)) + .arg(QString::number(cache)).arg(QString::number(angle)); +} + +static inline QString rowString(int listSize, tst_GraphicsViewBenchmark::ListType listType, + Theme::Themes theme, int cache, int angle, + tst_GraphicsViewBenchmark::ScrollStep step) +{ + return QString("Items=%1, List=%2, Theme=%3, Cache=%4, RotAngle=%5, Speed=%6") + .arg(QString::number(listSize)).arg(stringForListType(listType)) + .arg(stringForTheme(theme)).arg(QString::number(cache)) + .arg(QString::number(angle)).arg(stringForScrollStep(step)); +} + +void tst_GraphicsViewBenchmark::update_data() +{ + QTest::addColumn<int>("listSize"); + QTest::addColumn<ListType>("listType"); + QTest::addColumn<Theme::Themes>("theme"); + QTest::addColumn<bool>("renderToImage"); + QTest::addColumn<bool>("subtreeCache"); + QTest::addColumn<int>("rotationAngle"); + + QList<ListType> listTypes; + listTypes << Simple << Recycling; + + QList<int> listSizes; + listSizes << 10 << 50 << 500; + + QList<Theme::Themes> themes; + themes << Theme::Blue << Theme::Lime; + + QList<int> rotationAngles; + rotationAngles << 0 << 90; + + // Generate rows: + foreach (ListType listType, listTypes) { + foreach (int listSize, listSizes) { + foreach (int angle, rotationAngles) { + foreach (Theme::Themes theme, themes) { + for (int toImage = 0; toImage < 2; ++toImage) { + for (int cache = 0; cache < 2; ++cache) { + QString string = rowString(listSize, listType, theme, toImage, cache, angle); + QTest::newRow(string.toLatin1()) << listSize << listType << theme << bool(toImage) + << bool(cache) << angle; + } + } + } + } + } + } +} + +void tst_GraphicsViewBenchmark::update() +{ + QFETCH(int, listSize); + QFETCH(ListType, listType); + QFETCH(Theme::Themes, theme); + QFETCH(bool, renderToImage); + QFETCH(bool, subtreeCache); + QFETCH(int, rotationAngle); + + mMainView->viewport()->setUpdatesEnabled(false); + + ensureListSizeAndType(listSize, listType); + ensureTheme(theme); + ensureRotationAngle(rotationAngle); + ensureSubtreeCache(subtreeCache); + ensureImageBasedRendering(renderToImage); + + QEventLoop loop; + QObject::connect(mMainView, SIGNAL(repainted()), &loop, SLOT(quit())); + QTimer::singleShot(4000, &loop, SLOT(quit())); + // Dry run (especially important when cache is enabled). + // NB! setUpdatesEnabled triggers an update(). + mMainView->viewport()->setUpdatesEnabled(true); + loop.exec(QEventLoop::AllEvents | QEventLoop::ExcludeUserInputEvents| QEventLoop::ExcludeSocketNotifiers); + QTest::qWait(50); + + QTimer::singleShot(4000, &loop, SLOT(quit())); + QBENCHMARK { + mMainView->viewport()->update(); + loop.exec(QEventLoop::AllEvents | QEventLoop::ExcludeUserInputEvents| QEventLoop::ExcludeSocketNotifiers); + } +} + +void tst_GraphicsViewBenchmark::scroll_data() +{ + QTest::addColumn<int>("listSize"); + QTest::addColumn<ListType>("listType"); + QTest::addColumn<Theme::Themes>("theme"); + QTest::addColumn<bool>("subtreeCache"); + QTest::addColumn<int>("rotationAngle"); + QTest::addColumn<ScrollStep>("scrollStep"); + + QList<ListType> listTypes; + listTypes << Simple << Recycling; + + QList<int> listSizes; + listSizes << 10 << 50 << 500; + + QList<Theme::Themes> themes; + themes << Theme::Blue << Theme::Lime; + + QList<int> rotationAngles; + rotationAngles << 0 << 90; + + QList<ScrollStep> scrollSteps; + scrollSteps << Slow << Normal << Fast; + + // Generate rows: + foreach (ListType listType, listTypes) { + foreach (int listSize, listSizes) { + foreach (int angle, rotationAngles) { + foreach (ScrollStep step, scrollSteps) { + foreach (Theme::Themes theme, themes) { + for (int cache = 0; cache < 2; ++cache) { + QString string = rowString(listSize, listType, theme, cache, angle, step); + QTest::newRow(string.toLatin1()) << listSize << listType << theme + << bool(cache) << angle << step; + } + } + } + } + } + } +} + +void tst_GraphicsViewBenchmark::scroll() +{ + QFETCH(int, listSize); + QFETCH(ListType, listType); + QFETCH(Theme::Themes, theme); + QFETCH(bool, subtreeCache); + QFETCH(int, rotationAngle); + QFETCH(ScrollStep, scrollStep); + + mMainView->viewport()->setUpdatesEnabled(false); + + ensureListSizeAndType(listSize, listType); + ensureTheme(theme); + ensureRotationAngle(rotationAngle); + ensureSubtreeCache(subtreeCache); + ensureImageBasedRendering(false); + + ScrollBar *sb = 0; + if (listType == Simple) + sb = static_cast<SimpleList *>(mMainView->testWidget())->verticalScrollBar(); + else + sb = static_cast<ItemRecyclingList *>(mMainView->testWidget())->verticalScrollBar(); + const qreal sliderStart = sb->sliderSize() / qreal(2.0); + const qreal sliderTarget = sliderStart + qreal(scrollStep); + sb->setSliderPosition(sliderStart); + + QEventLoop loop; + QObject::connect(mMainView, SIGNAL(repainted()), &loop, SLOT(quit())); + QTimer::singleShot(4000, &loop, SLOT(quit())); + // Dry run (especially important when cache is enabled). + // NB! setUpdatesEnabled triggers an update(). + mMainView->viewport()->setUpdatesEnabled(true); + loop.exec(QEventLoop::AllEvents | QEventLoop::ExcludeUserInputEvents| QEventLoop::ExcludeSocketNotifiers); + QTest::qWait(50); + + QTimer::singleShot(4000, &loop, SLOT(quit())); + QBENCHMARK { + sb->setSliderPosition(sliderTarget); + loop.exec(QEventLoop::AllEvents | QEventLoop::ExcludeUserInputEvents| QEventLoop::ExcludeSocketNotifiers); + } +} + +int main(int argc, char *argv[]) +{ + Settings settings; + if (!readSettingsFromCommandLine(argc, argv, settings)) + return 1; + + // Eat command line arguments. + int aargc = 0; + for (int i = 0; i < argc; ++i) { + if (argv[i]) + ++aargc; + } + char **aargv = new char*[aargc]; + aargc = 0; + for (int i = 0; i < argc; ++i) { + if (argv[i]) + aargv[aargc++] = argv[i]; + } + + QApplication app(argc, argv); + + int returnValue = 0; + if (settings.options() & Settings::ManualTest) { + MainView view(settings.options() & Settings::UseOpenGL, settings.options() & Settings::OutputFps); + + DummyDataGenerator dataGenerator; + dataGenerator.Reset(); + + SimpleList *list = new SimpleList; + if (settings.options() & Settings::UseListItemCache) + list->setListItemCaching(true); + else + list->setListItemCaching(false); + + if (settings.listItemCount()) + fillList(dataGenerator, settings.listItemCount(), list); + else + fillList(dataGenerator, 500, list); + + view.setTestWidget(list); + + if ((settings.angle() % 360) != 0) + view.rotateContent(settings.angle()); + + if (settings.size().width() > 0 && settings.size().height() > 0) { + view.resize(settings.size().width(), settings.size().height()); + view.show(); + } else { +#if defined(Q_OS_SYMBIAN) || defined(Q_WS_MAEMO_5) + view.showFullScreen(); +#else + if (QApplication::desktop()->width() < 360 || QApplication::desktop()->height() < 640) { + view.showFullScreen(); + } else { + view.resize(360, 640); + view.show(); + } +#endif + } + returnValue = app.exec(); + } else { + QTEST_DISABLE_KEYPAD_NAVIGATION + tst_GraphicsViewBenchmark tc(&settings); + returnValue = QTest::qExec(&tc, aargc, aargv); + } + + delete [] aargv; + return returnValue; +} + +#include "main.moc" diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_man_001_58x58.png b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_man_001_58x58.png Binary files differnew file mode 100644 index 0000000..525b555 --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_man_001_58x58.png diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_man_002_58x58.png b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_man_002_58x58.png Binary files differnew file mode 100644 index 0000000..3d93298 --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_man_002_58x58.png diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_man_003_58x58.png b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_man_003_58x58.png Binary files differnew file mode 100644 index 0000000..556cfcb --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_man_003_58x58.png diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_man_004_58x58.png b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_man_004_58x58.png Binary files differnew file mode 100644 index 0000000..94acf9e --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_man_004_58x58.png diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_man_005_58x58.png b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_man_005_58x58.png Binary files differnew file mode 100644 index 0000000..ed0c7c4 --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_man_005_58x58.png diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_man_006_58x58.png b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_man_006_58x58.png Binary files differnew file mode 100644 index 0000000..d4b4dc3 --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_man_006_58x58.png diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_man_007_58x58.png b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_man_007_58x58.png Binary files differnew file mode 100644 index 0000000..0e45d18 --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_man_007_58x58.png diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_man_008_58x58.png b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_man_008_58x58.png Binary files differnew file mode 100644 index 0000000..0c25540 --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_man_008_58x58.png diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_man_009_58x58.png b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_man_009_58x58.png Binary files differnew file mode 100644 index 0000000..ce435ea --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_man_009_58x58.png diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_man_010_58x58.png b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_man_010_58x58.png Binary files differnew file mode 100644 index 0000000..021db25 --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_man_010_58x58.png diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_picture_001_58x58.png b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_picture_001_58x58.png Binary files differnew file mode 100644 index 0000000..0051da3 --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_picture_001_58x58.png diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_picture_002_58x58.png b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_picture_002_58x58.png Binary files differnew file mode 100644 index 0000000..e8a946a --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_picture_002_58x58.png diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_picture_003_58x58.png b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_picture_003_58x58.png Binary files differnew file mode 100644 index 0000000..b2bb851 --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_picture_003_58x58.png diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_picture_004_58x58.png b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_picture_004_58x58.png Binary files differnew file mode 100644 index 0000000..871c075 --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_picture_004_58x58.png diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_picture_005_58x58.png b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_picture_005_58x58.png Binary files differnew file mode 100644 index 0000000..d4c18b8 --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_picture_005_58x58.png diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_woman_001_58x58.png b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_woman_001_58x58.png Binary files differnew file mode 100644 index 0000000..10a5947 --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_woman_001_58x58.png diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_woman_002_58x58.png b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_woman_002_58x58.png Binary files differnew file mode 100644 index 0000000..65b4e03 --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_woman_002_58x58.png diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_woman_003_58x58.png b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_woman_003_58x58.png Binary files differnew file mode 100644 index 0000000..935ec07 --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_woman_003_58x58.png diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_woman_004_58x58.png b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_woman_004_58x58.png Binary files differnew file mode 100644 index 0000000..fbc1a93 --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_woman_004_58x58.png diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_woman_005_58x58.png b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_woman_005_58x58.png Binary files differnew file mode 100644 index 0000000..af96d3e --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_woman_005_58x58.png diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_woman_006_58x58.png b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_woman_006_58x58.png Binary files differnew file mode 100644 index 0000000..fb4192d --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_woman_006_58x58.png diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_woman_007_58x58.png b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_woman_007_58x58.png Binary files differnew file mode 100644 index 0000000..f5d6dea --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_woman_007_58x58.png diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_woman_008_58x58.png b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_woman_008_58x58.png Binary files differnew file mode 100644 index 0000000..d08b8dc --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_woman_008_58x58.png diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_woman_009_58x58.png b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_woman_009_58x58.png Binary files differnew file mode 100644 index 0000000..768b97d --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_woman_009_58x58.png diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_woman_010_58x58.png b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_woman_010_58x58.png Binary files differnew file mode 100644 index 0000000..d1fe28e --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/avatars/avatar_woman_010_58x58.png diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_background_360x640px.svg b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_background_360x640px.svg new file mode 100644 index 0000000..1552baf --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_background_360x640px.svg @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) --> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + width="360px" height="640px" viewBox="0 0 360 640" enable-background="new 0 0 360 640" xml:space="preserve"> +<g> + <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="-3.5137" y1="2.1079" x2="363.6142" y2="637.9921"> + <stop offset="0.1538" style="stop-color:#2BD5FF"/> + <stop offset="0.4396" style="stop-color:#80E6FF"/> + <stop offset="0.7253" style="stop-color:#29CAF2"/> + </linearGradient> + <rect x="0.05" y="0.05" fill="url(#SVGID_1_)" width="360" height="640"/> +</g> +</svg> diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_background_horisontal_640x360px.svg b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_background_horisontal_640x360px.svg new file mode 100644 index 0000000..5589110 --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_background_horisontal_640x360px.svg @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) --> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + width="640px" height="360px" viewBox="0 0 640 360" enable-background="new 0 0 640 360" xml:space="preserve"> +<g> + <rect x="-0.5" y="-0.5" fill="#FFFFFF" width="640" height="360"/> + + <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="1580.5244" y1="-287.7886" x2="1038.1285" y2="-600.9408" gradientTransform="matrix(0 -1 -1 0 -124.8652 1488.8262)"> + <stop offset="0.2527" style="stop-color:#2BD5FF"/> + <stop offset="0.5989" style="stop-color:#80E6FF"/> + <stop offset="0.9396" style="stop-color:#29CAF2"/> + </linearGradient> + <rect x="1.5" y="1.5" fill="url(#SVGID_1_)" width="636" height="356"/> +</g> +</svg> diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_contact_default_icon_52x52px.svg b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_contact_default_icon_52x52px.svg new file mode 100644 index 0000000..665675b --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_contact_default_icon_52x52px.svg @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) --> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + width="52px" height="52px" viewBox="0 0 52 52" enable-background="new 0 0 52 52" xml:space="preserve"> +<g> + <path fill="#29CAF2" d="M52.07,48.77c0,1.79-1.46,3.25-3.25,3.25H3.32c-1.79,0-3.25-1.46-3.25-3.25V3.27 + c0-1.79,1.46-3.25,3.25-3.25h45.5c1.79,0,3.25,1.46,3.25,3.25V48.77z"/> + <g> + <rect x="3.37" y="3.69" fill="#2BD5FF" width="44.69" height="44.69"/> + <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="6.8594" y1="27.8086" x2="48.0244" y2="27.8086"> + <stop offset="0.1538" style="stop-color:#27C0E6"/> + <stop offset="0.4396" style="stop-color:#25B7DB"/> + <stop offset="0.7253" style="stop-color:#22A5C4"/> + </linearGradient> + <path fill="url(#SVGID_1_)" d="M47.95,48.31c0.12-3.35,0.15-8.17-0.43-9.12c-2.87-4.64-11.55-3.61-14.02-3.22 + c0-1.17-0.01-2.19-0.01-2.96c0.5-0.52,0.96-1.11,1.39-1.76l0.06,0.19c3.57,0.51,4.02-11.16,4.02-11.16 + C39.21,3.66,28.83,7.47,27.18,8.18c-3.05-0.78-10.3-1.3-10.09,11.2c0,0-0.53,11.06,3.52,11.38c0.5,0.85,1.07,1.6,1.69,2.25 + c-0.01,0.72-0.04,1.65-0.08,2.71c-5.32-0.36-14.73-0.08-15.35,6.39c-0.06,0.62,0.12,3.69,0.28,6.2L47.95,48.31z"/> + </g> +</g> +</svg> diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_contact_list_divider_360x76px.svg b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_contact_list_divider_360x76px.svg new file mode 100644 index 0000000..db9fc7a --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_contact_list_divider_360x76px.svg @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) --> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + width="360px" height="76px" viewBox="0 0 360 76" enable-background="new 0 0 360 76" xml:space="preserve"> +<rect x="0.01" y="0.35" opacity="0.2" fill="#FFFFFF" width="360" height="76"/> +</svg> diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_contact_list_highlighter_360x76px.svg b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_contact_list_highlighter_360x76px.svg new file mode 100644 index 0000000..dae2bd4 --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_contact_list_highlighter_360x76px.svg @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) --> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + width="360px" height="76px" viewBox="0 0 360 76" enable-background="new 0 0 360 76" xml:space="preserve"> +<rect x="0.02" y="0.05" opacity="0.4" fill="#FFFFFF" fill-opacity="0.8" width="360" height="76"/> +<g> + <path fill="#FFFFFF" d="M360.02,0.05v76h-360v-76H360.02 M359.02,1.05h-358v74h358V1.05L359.02,1.05z"/> +</g> +</svg> diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_contact_status_idle_33x33px.svg b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_contact_status_idle_33x33px.svg new file mode 100644 index 0000000..fe12e78 --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_contact_status_idle_33x33px.svg @@ -0,0 +1,55 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) --> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + width="33px" height="33px" viewBox="0 0 33 33" enable-background="new 0 0 33 33" xml:space="preserve"> +<g> + <path fill="#29CAF2" d="M33.03,16.58c0,9.11-7.39,16.5-16.5,16.5c-9.12,0-16.5-7.39-16.5-16.5c0-9.11,7.38-16.5,16.5-16.5 + C25.63,0.08,33.03,7.47,33.03,16.58z"/> + <g> + <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="16.5249" y1="29.1172" x2="16.5249" y2="4.0435"> + <stop offset="0" style="stop-color:#A6A6A6"/> + <stop offset="0.4341" style="stop-color:#8C8C8C"/> + <stop offset="0.8407" style="stop-color:#999999"/> + <stop offset="1" style="stop-color:#D9D9D9"/> + </linearGradient> + <path fill="url(#SVGID_1_)" d="M16.52,29.12c-6.91,0-12.54-5.62-12.54-12.54c0-6.91,5.62-12.54,12.54-12.54 + s12.54,5.62,12.54,12.54C29.06,23.49,23.44,29.12,16.52,29.12L16.52,29.12z"/> + <linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="6.875" y1="9.8242" x2="26.1715" y2="23.3358"> + <stop offset="0.1099" style="stop-color:#FFFFFF"/> + <stop offset="0.6978" style="stop-color:#E6E6E6"/> + </linearGradient> + <circle fill="url(#SVGID_2_)" cx="16.52" cy="16.58" r="11.78"/> + <g> + <linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="8.6343" y1="11.1309" x2="24.2014" y2="22.0311"> + <stop offset="0" style="stop-color:#A6A6A6"/> + <stop offset="0.4341" style="stop-color:#8C8C8C"/> + <stop offset="0.7308" style="stop-color:#999999"/> + <stop offset="1" style="stop-color:#E6E6E6"/> + </linearGradient> + <path fill="url(#SVGID_3_)" d="M16.42,26.08c-5.24,0-9.51-4.26-9.51-9.5c0-5.24,4.26-9.51,9.51-9.51c5.24,0,9.5,4.26,9.5,9.51 + C25.92,21.82,21.66,26.08,16.42,26.08L16.42,26.08z"/> + <linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="23.0186" y1="22.1201" x2="9.8155" y2="11.0414"> + <stop offset="0" style="stop-color:#A6A6A6"/> + <stop offset="0.4341" style="stop-color:#8C8C8C"/> + <stop offset="0.7308" style="stop-color:#999999"/> + <stop offset="1" style="stop-color:#E6E6E6"/> + </linearGradient> + <circle fill="url(#SVGID_4_)" cx="16.42" cy="16.58" r="8.62"/> + <path fill="#FF901F" d="M16.42,24.06c-4.12,0-7.48-3.35-7.48-7.47c0-4.12,3.36-7.48,7.48-7.48c4.12,0,7.47,3.36,7.47,7.48 + C23.89,20.7,20.54,24.06,16.42,24.06L16.42,24.06z"/> + <g> + <path fill="#FFD06B" d="M14.09,14.25c2.1-2.1,5.31-2.41,7.75-0.94c-0.26-0.43-0.57-0.84-0.94-1.21c-2.47-2.47-6.49-2.47-8.96,0 + c-2.47,2.47-2.47,6.49,0,8.96c0.37,0.37,0.78,0.68,1.21,0.94C11.68,19.56,11.99,16.35,14.09,14.25z"/> + + <linearGradient id="SVGID_5_" gradientUnits="userSpaceOnUse" x1="-122.4058" y1="66.873" x2="-127.2734" y2="58.442" gradientTransform="matrix(1 0 0 1 142.3301 -45.0029)"> + <stop offset="0" style="stop-color:#FF901F"/> + <stop offset="1" style="stop-color:#FFB81F"/> + </linearGradient> + <path fill="url(#SVGID_5_)" d="M20.9,21.06c2.1-2.1,2.41-5.31,0.94-7.75c-2.43-1.47-5.65-1.16-7.75,0.94 + c-2.1,2.1-2.41,5.31-0.94,7.75C15.58,23.47,18.8,23.16,20.9,21.06z"/> + </g> + </g> + </g> +</g> +</svg> diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_contact_status_offline_33x33px.svg b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_contact_status_offline_33x33px.svg new file mode 100644 index 0000000..0c973f1 --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_contact_status_offline_33x33px.svg @@ -0,0 +1,55 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) --> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + width="33px" height="33px" viewBox="0 0 33 33" enable-background="new 0 0 33 33" xml:space="preserve"> +<g> + <circle fill="#29CAF2" cx="16.46" cy="16.52" r="16.5"/> + <g> + <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="16.4624" y1="29.0566" x2="16.4624" y2="3.9829"> + <stop offset="0" style="stop-color:#A6A6A6"/> + <stop offset="0.4341" style="stop-color:#8C8C8C"/> + <stop offset="0.8407" style="stop-color:#999999"/> + <stop offset="1" style="stop-color:#D9D9D9"/> + </linearGradient> + <path fill="url(#SVGID_1_)" d="M16.46,29.06c-6.91,0-12.54-5.62-12.54-12.54c0-6.91,5.62-12.54,12.54-12.54S29,9.61,29,16.52 + C29,23.43,23.37,29.06,16.46,29.06L16.46,29.06z"/> + <linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="6.814" y1="9.7637" x2="26.1096" y2="23.2746"> + <stop offset="0.1099" style="stop-color:#FFFFFF"/> + <stop offset="0.6978" style="stop-color:#E6E6E6"/> + </linearGradient> + <path fill="url(#SVGID_2_)" d="M28.24,16.52c0,6.51-5.27,11.78-11.78,11.78c-6.5,0-11.78-5.27-11.78-11.78 + c0-6.5,5.27-11.78,11.78-11.78C22.97,4.74,28.24,10.02,28.24,16.52z"/> + <g> + <linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="8.5713" y1="11.0693" x2="24.1392" y2="21.9701"> + <stop offset="0" style="stop-color:#A6A6A6"/> + <stop offset="0.4341" style="stop-color:#8C8C8C"/> + <stop offset="0.7308" style="stop-color:#999999"/> + <stop offset="1" style="stop-color:#E6E6E6"/> + </linearGradient> + <path fill="url(#SVGID_3_)" d="M16.36,26.02c-5.24,0-9.51-4.26-9.51-9.5c0-5.24,4.26-9.51,9.51-9.51c5.24,0,9.5,4.27,9.5,9.51 + C25.86,21.76,21.6,26.02,16.36,26.02L16.36,26.02z"/> + <linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="22.9561" y1="22.0576" x2="9.7545" y2="10.9802"> + <stop offset="0" style="stop-color:#A6A6A6"/> + <stop offset="0.4341" style="stop-color:#8C8C8C"/> + <stop offset="0.7308" style="stop-color:#999999"/> + <stop offset="1" style="stop-color:#E6E6E6"/> + </linearGradient> + <circle fill="url(#SVGID_4_)" cx="16.36" cy="16.52" r="8.62"/> + <path fill="#BD0700" d="M16.36,24c-4.12,0-7.48-3.35-7.48-7.48c0-4.12,3.36-7.48,7.48-7.48c4.12,0,7.47,3.36,7.47,7.48 + C23.83,20.64,20.48,24,16.36,24L16.36,24z"/> + <g> + <path fill="#F25757" d="M14.03,14.19c2.1-2.1,5.31-2.41,7.75-0.94c-0.26-0.43-0.57-0.84-0.94-1.21c-2.47-2.47-6.49-2.47-8.96,0 + c-2.47,2.47-2.47,6.49,0,8.96c0.37,0.37,0.78,0.68,1.21,0.94C11.62,19.5,11.93,16.29,14.03,14.19z"/> + + <linearGradient id="SVGID_5_" gradientUnits="userSpaceOnUse" x1="-122.4668" y1="66.8125" x2="-127.3345" y2="58.3814" gradientTransform="matrix(1 0 0 1 142.3301 -45.0029)"> + <stop offset="0" style="stop-color:#BD0700"/> + <stop offset="1" style="stop-color:#E35D58"/> + </linearGradient> + <path fill="url(#SVGID_5_)" d="M20.83,21c2.1-2.1,2.41-5.31,0.94-7.75c-2.43-1.47-5.65-1.16-7.75,0.94 + c-2.1,2.1-2.41,5.31-0.94,7.75C15.52,23.4,18.74,23.1,20.83,21z"/> + </g> + </g> + </g> +</g> +</svg> diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_contact_status_online_33x33px.svg b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_contact_status_online_33x33px.svg new file mode 100644 index 0000000..fcb434a --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_contact_status_online_33x33px.svg @@ -0,0 +1,56 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) --> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + width="33px" height="33px" viewBox="0 0 33 33" enable-background="new 0 0 33 33" xml:space="preserve"> +<g> + <path fill="#29CAF2" d="M32.96,16.59c0,9.11-7.39,16.5-16.5,16.5c-9.12,0-16.5-7.39-16.5-16.5c0-9.11,7.38-16.5,16.5-16.5 + C25.57,0.09,32.96,7.47,32.96,16.59z"/> + <g> + <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="16.4624" y1="29.123" x2="16.4624" y2="4.0493"> + <stop offset="0" style="stop-color:#A6A6A6"/> + <stop offset="0.4341" style="stop-color:#8C8C8C"/> + <stop offset="0.8407" style="stop-color:#999999"/> + <stop offset="1" style="stop-color:#D9D9D9"/> + </linearGradient> + <path fill="url(#SVGID_1_)" d="M16.46,29.12c-6.91,0-12.54-5.62-12.54-12.54c0-6.91,5.62-12.54,12.54-12.54S29,9.67,29,16.58 + C29,23.5,23.37,29.12,16.46,29.12L16.46,29.12z"/> + <linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="6.813" y1="9.8301" x2="26.1095" y2="23.3416"> + <stop offset="0.1099" style="stop-color:#FFFFFF"/> + <stop offset="0.6978" style="stop-color:#E6E6E6"/> + </linearGradient> + <path fill="url(#SVGID_2_)" d="M28.24,16.58c0,6.51-5.27,11.78-11.78,11.78S4.68,23.09,4.68,16.58c0-6.5,5.27-11.78,11.78-11.78 + S28.24,10.08,28.24,16.58z"/> + <g> + <linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="8.5723" y1="11.1362" x2="24.1386" y2="22.0359"> + <stop offset="0" style="stop-color:#A6A6A6"/> + <stop offset="0.4341" style="stop-color:#8C8C8C"/> + <stop offset="0.7308" style="stop-color:#999999"/> + <stop offset="1" style="stop-color:#E6E6E6"/> + </linearGradient> + <path fill="url(#SVGID_3_)" d="M16.36,26.09c-5.24,0-9.51-4.26-9.51-9.5c0-5.24,4.26-9.51,9.51-9.51c5.24,0,9.5,4.27,9.5,9.51 + C25.86,21.83,21.6,26.09,16.36,26.09L16.36,26.09z"/> + <linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="22.9561" y1="22.125" x2="9.753" y2="11.0463"> + <stop offset="0" style="stop-color:#A6A6A6"/> + <stop offset="0.4341" style="stop-color:#8C8C8C"/> + <stop offset="0.7308" style="stop-color:#999999"/> + <stop offset="1" style="stop-color:#E6E6E6"/> + </linearGradient> + <circle fill="url(#SVGID_4_)" cx="16.35" cy="16.58" r="8.62"/> + <path fill="#09B300" d="M16.36,24.06c-4.12,0-7.48-3.35-7.48-7.48c0-4.12,3.36-7.48,7.48-7.48c4.12,0,7.47,3.36,7.47,7.48 + C23.83,20.71,20.48,24.06,16.36,24.06L16.36,24.06z"/> + <g> + <path fill="#57EB51" d="M14.03,14.25c2.1-2.1,5.31-2.41,7.75-0.94c-0.26-0.43-0.57-0.84-0.94-1.21c-2.47-2.47-6.49-2.47-8.96,0 + c-2.47,2.47-2.47,6.49,0,8.96c0.37,0.37,0.78,0.68,1.21,0.94C11.62,19.57,11.93,16.35,14.03,14.25z"/> + + <linearGradient id="SVGID_5_" gradientUnits="userSpaceOnUse" x1="-122.4678" y1="66.8789" x2="-127.3354" y2="58.4478" gradientTransform="matrix(1 0 0 1 142.3301 -45.0029)"> + <stop offset="0" style="stop-color:#09AA00"/> + <stop offset="1" style="stop-color:#4DCC46"/> + </linearGradient> + <path fill="url(#SVGID_5_)" d="M20.83,21.06c2.1-2.1,2.41-5.31,0.94-7.75c-2.43-1.47-5.65-1.16-7.75,0.94 + c-2.1,2.1-2.41,5.31-0.94,7.75C15.52,23.47,18.73,23.16,20.83,21.06z"/> + </g> + </g> + </g> +</g> +</svg> diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_scroll_16x80px.svg b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_scroll_16x80px.svg new file mode 100644 index 0000000..897be81 --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_scroll_16x80px.svg @@ -0,0 +1,39 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) --> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + width="16px" height="80px" viewBox="0 0 16 80" enable-background="new 0 0 16 80" xml:space="preserve"> +<g> + <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="0.1045" y1="40.0293" x2="16.1045" y2="40.0293"> + <stop offset="0.1099" style="stop-color:#FFFFFF"/> + <stop offset="0.6978" style="stop-color:#E6E6E6"/> + </linearGradient> + <path fill="url(#SVGID_1_)" d="M12.22,80.03c2.15,0,3.89-1.74,3.89-3.88V3.91c0-2.14-1.74-3.88-3.89-3.88H3.99 + c-2.15,0-3.88,1.74-3.88,3.88c0,0,1.94,16.34,1.94,36.4c0,20.06-1.94,35.84-1.94,35.84c0,2.14,1.74,3.88,3.88,3.88H12.22z"/> + <path fill="#29CAF2" d="M12.22,78.09H3.99c-1.04,0-1.89-0.82-1.94-1.84c0.19-1.62,1.94-16.98,1.94-35.94 + c0-18.96-1.75-34.84-1.94-36.49c0.05-1.03,0.9-1.85,1.94-1.85h8.23c1.04,0,1.89,0.82,1.94,1.84c-0.19,1.62-0.19,70.78,0,72.42 + C14.11,77.27,13.26,78.09,12.22,78.09L12.22,78.09z"/> + <g> + <g> + <linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="10.7334" y1="51.3867" x2="7.417" y2="45.6425"> + <stop offset="0" style="stop-color:#E6E6E6"/> + <stop offset="0.6978" style="stop-color:#BFBFBF"/> + <stop offset="1" style="stop-color:#F2F2F2"/> + </linearGradient> + <polygon fill="url(#SVGID_2_)" points="7.42,51.39 5.76,48.52 7.42,45.64 10.73,45.64 12.39,48.52 10.73,51.39 "/> + <linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="10.7344" y1="42.9014" x2="7.4175" y2="37.1563"> + <stop offset="0" style="stop-color:#E6E6E6"/> + <stop offset="0.6978" style="stop-color:#BFBFBF"/> + <stop offset="1" style="stop-color:#F2F2F2"/> + </linearGradient> + <polygon fill="url(#SVGID_3_)" points="7.42,42.9 5.76,40.03 7.42,37.16 10.73,37.16 12.39,40.03 10.73,42.9 "/> + <linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="10.7334" y1="34.4131" x2="7.4175" y2="28.6697"> + <stop offset="0" style="stop-color:#E6E6E6"/> + <stop offset="0.6978" style="stop-color:#BFBFBF"/> + <stop offset="1" style="stop-color:#F2F2F2"/> + </linearGradient> + <polygon fill="url(#SVGID_4_)" points="7.42,34.41 5.76,31.54 7.42,28.67 10.73,28.67 12.39,31.54 10.73,34.41 "/> + </g> + </g> +</g> +</svg> diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_scrollbar_7x14px.svg b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_scrollbar_7x14px.svg new file mode 100644 index 0000000..3baec2f --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_scrollbar_7x14px.svg @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) --> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + width="7px" height="14px" viewBox="0 0 7 14" enable-background="new 0 0 7 14" xml:space="preserve"> +<rect x="0.01" y="0.01" fill="#2BD5FF" width="7" height="14"/> +</svg> diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_status_field_left_14x24px.svg b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_status_field_left_14x24px.svg new file mode 100644 index 0000000..dd6fb70 --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_status_field_left_14x24px.svg @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) --> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + width="14px" height="24px" viewBox="0 0 14 24" enable-background="new 0 0 14 24" xml:space="preserve"> +<g> + <path fill="none" d="M4.92,21.95c-0.28-0.33-0.53-0.67-0.77-1.03C4.39,21.28,4.64,21.63,4.92,21.95z"/> + <path fill="none" d="M2.11,15.42c-0.05-0.46-0.09-0.92-0.09-1.39C2.02,14.5,2.06,14.97,2.11,15.42z"/> + <path fill="none" d="M4.08,20.82c-0.23-0.35-0.45-0.71-0.64-1.08C3,18.9,2.65,18.01,2.41,17.07C2.76,18.43,3.33,19.7,4.08,20.82z" + /> + <path fill="none" d="M2.37,16.92c-0.09-0.38-0.16-0.77-0.22-1.17C2.21,16.14,2.28,16.54,2.37,16.92z"/> + <path fill="#29CAF2" d="M4.13,20.82c-0.74-1.13-1.3-2.39-1.64-3.75c-0.01-0.05-0.02-0.1-0.04-0.16c-0.09-0.38-0.16-0.77-0.22-1.17 + c-0.01-0.11-0.03-0.22-0.04-0.33c-0.05-0.46-0.08-0.92-0.08-1.39c0-6.63,5.57-12,11.86-12l0,0v-2h-2.61 + c-6.29,0-11.39,5.37-11.39,12c0,4.13,1.98,7.76,4.99,9.92c-0.27-0.33-0.52-0.67-0.76-1.03C4.17,20.89,4.15,20.86,4.13,20.82z"/> + <path fill="#80E6FF" d="M10.17,22.03c-2.5,0-4.8-0.86-6.68-2.29c0.19,0.37,0.41,0.73,0.63,1.08c0.02,0.03,0.04,0.07,0.07,0.1 + c0.24,0.36,0.49,0.7,0.76,1.03c1.82,1.31,4.03,2.08,6.4,2.08h2.61v-2H10.17z"/> + <path fill="#80E6FF" d="M4.08,20.82c0.02,0.04,0.04,0.07,0.07,0.1C4.12,20.89,4.1,20.86,4.08,20.82z"/> + <path fill="#2BD5FF" d="M13.97,2.03c-6.29,0-11.86,5.37-11.86,12c0,0.47,0.03,0.93,0.08,1.39c0.01,0.11,0.03,0.22,0.04,0.33 + c0.06,0.4,0.12,0.79,0.22,1.17c0.01,0.05,0.02,0.1,0.04,0.16c0.24,0.94,0.58,1.83,1.01,2.67c1.88,1.44,4.18,2.29,6.68,2.29h3.8 + V2.03L13.97,2.03z"/> + <path fill="#2BD5FF" d="M2.41,17.07c-0.01-0.05-0.02-0.1-0.04-0.16C2.39,16.97,2.4,17.02,2.41,17.07z"/> + <path fill="#2BD5FF" d="M2.15,15.75c-0.01-0.11-0.03-0.22-0.04-0.33C2.12,15.53,2.14,15.64,2.15,15.75z"/> +</g> +</svg> diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_status_field_middle_14x24px.svg b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_status_field_middle_14x24px.svg new file mode 100644 index 0000000..cabf928 --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_status_field_middle_14x24px.svg @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) --> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + width="10px" height="24px" viewBox="0 0 10 24" enable-background="new 0 0 10 24" xml:space="preserve"> +<g> + <rect y="1" fill="#2BD5FF" width="10" height="22"/> + <rect fill="#29CAF2" width="10" height="2"/> + <rect y="22" fill="#80E6FF" width="10" height="2"/> +</g> +</svg> diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_status_field_right_14x24px.svg b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_status_field_right_14x24px.svg new file mode 100644 index 0000000..f3a795b --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_status_field_right_14x24px.svg @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) --> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + width="14px" height="24px" viewBox="0 0 14 24" enable-background="new 0 0 14 24" xml:space="preserve"> +<g> + <path fill="#29CAF2" d="M4.59,2C7,2,9.25,2.77,11.1,4.08C8.98,1.58,5.88,0,2.42,0H0v2H4.59z"/> + <path fill="#80E6FF" d="M11.6,4.71c0.76,1.6,1.2,3.39,1.2,5.29c0,6.63-5.19,12-11.59,12H0v2h2.41C8.82,24,14,18.63,14,12 + C14,9.25,13.1,6.73,11.6,4.71z"/> + <path fill="#2BD5FF" d="M0,2v20h1.21c6.4,0,11.59-5.37,11.59-12c0-1.9-0.44-3.69-1.2-5.29c-0.16-0.22-0.32-0.43-0.5-0.64 + C9.25,2.77,7,2,4.59,2H0z"/> +</g> +</svg> diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_topbar_356x96px.svg b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_topbar_356x96px.svg new file mode 100644 index 0000000..a0efd34 --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_topbar_356x96px.svg @@ -0,0 +1,2007 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) --> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + width="356px" height="96px" viewBox="0 0 356 96" enable-background="new 0 0 356 96" xml:space="preserve"> +<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="-182.1821" y1="-52.7012" x2="-115.6673" y2="130.047" gradientTransform="matrix(-1 0 0 1 29.2188 0)"> + <stop offset="0" style="stop-color:#2BD5FF"/> + <stop offset="0.3516" style="stop-color:#80E6FF"/> + <stop offset="0.9176" style="stop-color:#28C4EB"/> +</linearGradient> +<path fill="url(#SVGID_1_)" d="M356.19,76.95V0H0.24v77.4c0,0,82.53,12.07,184.11,12.07C184.34,89.46,277.67,90.39,356.19,76.95z"/> +<linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="-327.1934" y1="86.1738" x2="28.8057" y2="86.1738" gradientTransform="matrix(-1 0 0 1 29.2188 0)"> + <stop offset="0" style="stop-color:#2BD5FF"/> + <stop offset="0.9176" style="stop-color:#28C6ED"/> +</linearGradient> +<path fill="url(#SVGID_2_)" d="M184.54,89.13C82.96,89.13,0.43,77.06,0.43,77.06l-0.02,4.56c0,0,82.53,14.04,184.11,14.04h171.39 + l0.1-18.98C277.57,90.05,184.54,89.13,184.54,89.13z"/> +<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="-365.623" y1="-266.3726" x2="-362.1982" y2="-260.4406" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_3_)" d="M353.52,73.18c-0.71-1-1.42-2.02-2.14-3.03c-1.43,0.19-2.85,0.38-4.27,0.56 + c-0.71,1.21-1.42,2.43-2.13,3.65C347.82,73.98,350.67,73.58,353.52,73.18z"/> +<linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="-365.6025" y1="-276.23" x2="-361.4175" y2="-268.9812" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_4_)" d="M351.38,66.97c0.71-1.2,1.42-2.4,2.14-3.59c-0.71-1.02-1.42-2.04-2.14-3.07 + c-1.42,0.16-2.85,0.32-4.28,0.48c-0.71,1.2-1.42,2.4-2.14,3.61c0.71,1.04,1.43,2.08,2.14,3.11 + C348.53,67.33,349.95,67.15,351.38,66.97z"/> +<linearGradient id="SVGID_5_" gradientUnits="userSpaceOnUse" x1="-365.5835" y1="-286.0889" x2="-361.4316" y2="-278.8976" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_5_)" d="M351.38,57.12c0.71-1.19,1.43-2.37,2.14-3.55c-0.71-1.03-1.43-2.07-2.14-3.11 + c-1.43,0.14-2.85,0.27-4.28,0.4c-0.71,1.18-1.43,2.37-2.14,3.57c0.71,1.05,1.43,2.1,2.14,3.15 + C348.53,57.43,349.95,57.27,351.38,57.12z"/> +<linearGradient id="SVGID_6_" gradientUnits="userSpaceOnUse" x1="-365.5649" y1="-295.9473" x2="-361.4463" y2="-288.8135" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_6_)" d="M351.38,47.27c0.71-1.17,1.42-2.34,2.14-3.51c-0.71-1.04-1.43-2.1-2.14-3.15 + c-1.43,0.11-2.85,0.22-4.28,0.33c-0.71,1.17-1.43,2.35-2.14,3.53c0.71,1.07,1.43,2.13,2.14,3.18 + C348.52,47.52,349.95,47.4,351.38,47.27z"/> +<linearGradient id="SVGID_7_" gradientUnits="userSpaceOnUse" x1="-365.5439" y1="-305.8047" x2="-361.4585" y2="-298.7285" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_7_)" d="M351.37,37.43c0.71-1.16,1.43-2.32,2.14-3.47c-0.71-1.06-1.43-2.12-2.14-3.19 + c-1.43,0.08-2.86,0.17-4.29,0.25c-0.71,1.16-1.43,2.32-2.14,3.49c0.72,1.08,1.43,2.16,2.14,3.23 + C348.52,37.63,349.95,37.52,351.37,37.43z"/> +<linearGradient id="SVGID_8_" gradientUnits="userSpaceOnUse" x1="-365.5264" y1="-315.6636" x2="-361.4736" y2="-308.644" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_8_)" d="M351.37,27.58c0.71-1.15,1.43-2.29,2.14-3.43c-0.71-1.07-1.43-2.15-2.14-3.23 + c-1.43,0.06-2.86,0.11-4.29,0.17c-0.71,1.15-1.43,2.3-2.14,3.45c0.72,1.09,1.43,2.18,2.15,3.26 + C348.51,27.72,349.94,27.65,351.37,27.58z"/> +<linearGradient id="SVGID_9_" gradientUnits="userSpaceOnUse" x1="-365.5044" y1="-325.519" x2="-361.4858" y2="-318.5587" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_9_)" d="M351.37,17.73c0.71-1.14,1.43-2.27,2.14-3.39c-0.72-1.08-1.43-2.18-2.15-3.27 + c-1.43,0.03-2.86,0.06-4.29,0.09c-0.71,1.13-1.43,2.27-2.14,3.41c0.72,1.11,1.43,2.21,2.15,3.3 + C348.51,17.82,349.94,17.78,351.37,17.73z"/> +<linearGradient id="SVGID_10_" gradientUnits="userSpaceOnUse" x1="-365.4863" y1="-335.3774" x2="-361.501" y2="-328.4746" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_10_)" d="M351.37,7.88c0.72-1.12,1.43-2.23,2.15-3.35c-0.72-1.1-1.43-2.2-2.15-3.31 + c-1.43,0-2.86,0.01-4.3,0.01c-0.71,1.12-1.43,2.25-2.15,3.37c0.72,1.12,1.43,2.23,2.15,3.34C348.51,7.92,349.94,7.9,351.37,7.88z"/> +<linearGradient id="SVGID_11_" gradientUnits="userSpaceOnUse" x1="-354.4824" y1="-269.5742" x2="-350.2368" y2="-262.2206" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_11_)" d="M340.23,73.74c0.71-1.22,1.42-2.45,2.13-3.66c-0.72-1.04-1.43-2.09-2.14-3.14 + c-1.42,0.17-2.85,0.33-4.28,0.49c-0.71,1.22-1.42,2.45-2.13,3.68c0.71,1.06,1.43,2.12,2.14,3.17 + C337.38,74.1,338.8,73.92,340.23,73.74z"/> +<linearGradient id="SVGID_12_" gradientUnits="userSpaceOnUse" x1="-354.4536" y1="-279.6323" x2="-350.2397" y2="-272.3337" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_12_)" d="M340.22,63.69c0.71-1.21,1.42-2.42,2.13-3.62c-0.71-1.05-1.43-2.11-2.14-3.17 + c-1.43,0.14-2.85,0.28-4.28,0.42c-0.71,1.21-1.43,2.42-2.14,3.64c0.71,1.07,1.43,2.14,2.14,3.21C337.37,64,338.8,63.85,340.22,63.69 + z"/> +<linearGradient id="SVGID_13_" gradientUnits="userSpaceOnUse" x1="-354.4287" y1="-289.6929" x2="-350.2451" y2="-282.4467" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_13_)" d="M340.21,53.64c0.71-1.2,1.43-2.39,2.14-3.59c-0.71-1.06-1.43-2.14-2.14-3.21 + c-1.43,0.12-2.86,0.23-4.29,0.34c-0.71,1.2-1.42,2.4-2.14,3.6c0.71,1.08,1.43,2.17,2.15,3.24 + C337.36,53.91,338.78,53.78,340.21,53.64z"/> +<linearGradient id="SVGID_14_" gradientUnits="userSpaceOnUse" x1="-354.4023" y1="-299.7485" x2="-350.2505" y2="-292.5573" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_14_)" d="M340.2,43.59c0.71-1.19,1.43-2.37,2.14-3.55c-0.72-1.08-1.43-2.16-2.15-3.25 + c-1.43,0.09-2.86,0.18-4.29,0.27c-0.71,1.19-1.43,2.37-2.14,3.57c0.71,1.1,1.43,2.19,2.15,3.28 + C337.34,43.81,338.77,43.7,340.2,43.59z"/> +<linearGradient id="SVGID_15_" gradientUnits="userSpaceOnUse" x1="-354.376" y1="-309.8076" x2="-350.2554" y2="-302.6705" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_15_)" d="M340.19,33.54c0.71-1.17,1.43-2.34,2.14-3.51c-0.72-1.09-1.43-2.19-2.15-3.29 + c-1.43,0.07-2.86,0.13-4.29,0.2c-0.71,1.17-1.43,2.35-2.14,3.53c0.72,1.11,1.43,2.21,2.15,3.31 + C337.33,33.71,338.76,33.63,340.19,33.54z"/> +<linearGradient id="SVGID_16_" gradientUnits="userSpaceOnUse" x1="-354.3486" y1="-319.8672" x2="-350.2593" y2="-312.7842" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_16_)" d="M340.18,23.5c0.71-1.16,1.43-2.32,2.14-3.47c-0.71-1.1-1.43-2.21-2.15-3.32 + c-1.43,0.04-2.86,0.08-4.29,0.12c-0.71,1.16-1.43,2.33-2.14,3.5c0.72,1.12,1.43,2.24,2.15,3.35 + C337.32,23.61,338.75,23.55,340.18,23.5z"/> +<linearGradient id="SVGID_17_" gradientUnits="userSpaceOnUse" x1="-354.3242" y1="-329.9253" x2="-350.2656" y2="-322.8956" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_17_)" d="M340.17,13.45c0.71-1.15,1.43-2.29,2.15-3.43c-0.72-1.12-1.44-2.24-2.15-3.36 + c-1.43,0.02-2.86,0.03-4.29,0.05c-0.71,1.15-1.43,2.3-2.14,3.46c0.72,1.13,1.43,2.26,2.15,3.39 + C337.31,13.51,338.74,13.48,340.17,13.45z"/> +<linearGradient id="SVGID_18_" gradientUnits="userSpaceOnUse" x1="-353.3623" y1="-338.3662" x2="-350.2695" y2="-333.0094" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_18_)" d="M333.71,0c0.72,1.15,1.43,2.29,2.15,3.42c1.43-0.01,2.86-0.01,4.3-0.02 + c0.71-1.14,1.43-2.27,2.15-3.4C339.44,0,336.58,0,333.71,0z"/> +<linearGradient id="SVGID_19_" gradientUnits="userSpaceOnUse" x1="-343.7051" y1="-263.6235" x2="-340.2715" y2="-257.6764" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_19_)" d="M331.57,76.08c-0.71-1.06-1.43-2.13-2.14-3.2c-1.43,0.17-2.86,0.33-4.28,0.49 + c-0.71,1.24-1.42,2.49-2.13,3.73C325.87,76.78,328.72,76.43,331.57,76.08z"/> +<linearGradient id="SVGID_20_" gradientUnits="userSpaceOnUse" x1="-343.6792" y1="-273.8569" x2="-339.4126" y2="-266.4669" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_20_)" d="M329.42,69.57c0.71-1.23,1.42-2.46,2.13-3.69c-0.71-1.07-1.43-2.15-2.15-3.23 + c-1.43,0.14-2.86,0.28-4.28,0.42c-0.71,1.23-1.43,2.46-2.14,3.7c0.72,1.09,1.43,2.18,2.15,3.27C326.57,69.89,328,69.73,329.42,69.57 + z"/> +<linearGradient id="SVGID_21_" gradientUnits="userSpaceOnUse" x1="-343.6494" y1="-284.0972" x2="-339.4106" y2="-276.7554" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_21_)" d="M329.41,59.34c0.71-1.22,1.42-2.44,2.14-3.65c-0.72-1.09-1.43-2.18-2.15-3.27 + c-1.43,0.12-2.86,0.24-4.29,0.35c-0.71,1.22-1.42,2.44-2.14,3.67c0.72,1.1,1.43,2.21,2.15,3.3 + C326.55,59.61,327.98,59.48,329.41,59.34z"/> +<linearGradient id="SVGID_22_" gradientUnits="userSpaceOnUse" x1="-343.6177" y1="-294.3369" x2="-339.4092" y2="-287.0476" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_22_)" d="M329.39,49.11c0.71-1.21,1.42-2.42,2.14-3.62c-0.72-1.1-1.43-2.2-2.15-3.3 + c-1.43,0.1-2.86,0.19-4.29,0.28c-0.71,1.21-1.42,2.42-2.14,3.63c0.72,1.11,1.43,2.23,2.15,3.33 + C326.53,49.33,327.96,49.22,329.39,49.11z"/> +<linearGradient id="SVGID_23_" gradientUnits="userSpaceOnUse" x1="-343.5854" y1="-304.5762" x2="-339.4058" y2="-297.3367" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_23_)" d="M329.38,38.88c0.71-1.2,1.43-2.39,2.14-3.58c-0.72-1.11-1.43-2.22-2.15-3.34 + c-1.43,0.07-2.86,0.14-4.29,0.21c-0.71,1.2-1.42,2.4-2.14,3.6c0.72,1.13,1.43,2.25,2.15,3.37 + C326.52,39.06,327.95,38.97,329.38,38.88z"/> +<linearGradient id="SVGID_24_" gradientUnits="userSpaceOnUse" x1="-343.5562" y1="-314.8164" x2="-339.4053" y2="-307.6269" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_24_)" d="M329.36,28.65c0.71-1.19,1.43-2.37,2.14-3.55c-0.72-1.12-1.43-2.24-2.15-3.37 + c-1.43,0.05-2.86,0.1-4.29,0.15c-0.71,1.19-1.43,2.38-2.14,3.57c0.72,1.14,1.43,2.27,2.15,3.4 + C326.5,28.78,327.93,28.71,329.36,28.65z"/> +<linearGradient id="SVGID_25_" gradientUnits="userSpaceOnUse" x1="-343.5239" y1="-325.0557" x2="-339.4028" y2="-317.9177" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_25_)" d="M329.34,18.42c0.71-1.17,1.43-2.34,2.14-3.51c-0.72-1.13-1.44-2.27-2.15-3.41 + c-1.43,0.03-2.86,0.05-4.29,0.08c-0.71,1.17-1.43,2.35-2.14,3.53c0.72,1.15,1.44,2.29,2.15,3.44 + C326.48,18.5,327.91,18.46,329.34,18.42z"/> +<linearGradient id="SVGID_26_" gradientUnits="userSpaceOnUse" x1="-343.4932" y1="-335.2979" x2="-339.4009" y2="-328.2098" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_26_)" d="M329.33,8.19c0.71-1.16,1.43-2.32,2.14-3.48c-0.72-1.14-1.44-2.29-2.15-3.45 + c-1.43,0-2.87,0.01-4.3,0.01c-0.71,1.16-1.43,2.33-2.14,3.5c0.72,1.16,1.44,2.32,2.15,3.47C326.46,8.22,327.89,8.21,329.33,8.19z"/> +<linearGradient id="SVGID_27_" gradientUnits="userSpaceOnUse" x1="-332.5376" y1="-267.1743" x2="-328.2202" y2="-259.6964" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_27_)" d="M318.26,76.36c0.71-1.25,1.42-2.5,2.13-3.75c-0.71-1.09-1.43-2.19-2.15-3.29 + c-1.43,0.14-2.86,0.28-4.29,0.42c-0.71,1.25-1.42,2.5-2.14,3.76c0.72,1.11,1.44,2.22,2.15,3.32 + C315.4,76.67,316.83,76.52,318.26,76.36z"/> +<linearGradient id="SVGID_28_" gradientUnits="userSpaceOnUse" x1="-332.502" y1="-277.5903" x2="-328.2109" y2="-270.1581" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_28_)" d="M318.24,65.96c0.71-1.24,1.42-2.48,2.14-3.71c-0.71-1.1-1.43-2.21-2.15-3.32 + c-1.43,0.12-2.86,0.24-4.29,0.36c-0.71,1.24-1.42,2.48-2.14,3.73c0.72,1.12,1.44,2.24,2.15,3.36 + C315.38,66.23,316.81,66.09,318.24,65.96z"/> +<linearGradient id="SVGID_29_" gradientUnits="userSpaceOnUse" x1="-332.4697" y1="-288.0034" x2="-328.2061" y2="-280.6185" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_29_)" d="M318.22,55.55c0.71-1.23,1.42-2.46,2.14-3.68c-0.72-1.12-1.44-2.23-2.15-3.36 + c-1.43,0.1-2.86,0.2-4.29,0.3c-0.71,1.23-1.43,2.46-2.14,3.7c0.72,1.13,1.44,2.26,2.15,3.39C315.36,55.78,316.79,55.66,318.22,55.55 + z"/> +<linearGradient id="SVGID_30_" gradientUnits="userSpaceOnUse" x1="-332.4331" y1="-298.416" x2="-328.1973" y2="-291.0793" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_30_)" d="M318.2,45.14c0.71-1.22,1.42-2.44,2.14-3.65c-0.72-1.13-1.43-2.26-2.15-3.39 + c-1.43,0.08-2.86,0.16-4.29,0.23c-0.71,1.22-1.42,2.44-2.14,3.67c0.72,1.14,1.44,2.28,2.15,3.42 + C315.34,45.33,316.77,45.24,318.2,45.14z"/> +<linearGradient id="SVGID_31_" gradientUnits="userSpaceOnUse" x1="-332.3999" y1="-308.8311" x2="-328.1904" y2="-301.54" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_31_)" d="M318.18,34.74c0.71-1.21,1.43-2.42,2.14-3.62c-0.72-1.14-1.44-2.28-2.15-3.42 + c-1.43,0.06-2.86,0.11-4.29,0.17c-0.71,1.21-1.43,2.42-2.14,3.63c0.72,1.16,1.44,2.3,2.15,3.45 + C315.31,34.88,316.75,34.81,318.18,34.74z"/> +<linearGradient id="SVGID_32_" gradientUnits="userSpaceOnUse" x1="-332.3647" y1="-319.2437" x2="-328.1831" y2="-312.0008" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_32_)" d="M318.15,24.33c0.71-1.2,1.43-2.39,2.14-3.58c-0.72-1.15-1.44-2.3-2.15-3.45 + c-1.43,0.04-2.86,0.07-4.29,0.11c-0.71,1.2-1.43,2.4-2.14,3.6c0.72,1.16,1.44,2.32,2.15,3.48 + C315.29,24.43,316.72,24.38,318.15,24.33z"/> +<linearGradient id="SVGID_33_" gradientUnits="userSpaceOnUse" x1="-332.3286" y1="-329.6587" x2="-328.1729" y2="-322.4607" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_33_)" d="M318.13,13.92c0.72-1.19,1.43-2.37,2.14-3.55c-0.72-1.16-1.44-2.32-2.15-3.49 + c-1.43,0.01-2.86,0.03-4.3,0.04c-0.71,1.19-1.43,2.38-2.14,3.57c0.72,1.18,1.44,2.34,2.15,3.51 + C315.27,13.98,316.7,13.95,318.13,13.92z"/> +<linearGradient id="SVGID_34_" gradientUnits="userSpaceOnUse" x1="-331.3086" y1="-338.3657" x2="-328.166" y2="-332.9226" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_34_)" d="M311.66,0c0.72,1.18,1.44,2.37,2.16,3.54c1.43-0.01,2.87-0.01,4.3-0.02 + c0.71-1.18,1.42-2.35,2.14-3.52C317.39,0,314.53,0,311.66,0z"/> +<linearGradient id="SVGID_35_" gradientUnits="userSpaceOnUse" x1="-321.7275" y1="-261.2515" x2="-318.2925" y2="-255.3018" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_35_)" d="M309.59,78.59c-0.72-1.11-1.43-2.23-2.15-3.35c-1.43,0.14-2.86,0.28-4.29,0.42 + c-0.71,1.26-1.43,2.54-2.14,3.81C303.87,79.19,306.73,78.89,309.59,78.59z"/> +<linearGradient id="SVGID_36_" gradientUnits="userSpaceOnUse" x1="-321.7114" y1="-271.8086" x2="-317.377" y2="-264.3011" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_36_)" d="M307.43,71.83c0.71-1.26,1.42-2.51,2.14-3.77c-0.72-1.12-1.44-2.25-2.15-3.38 + c-1.43,0.12-2.86,0.24-4.29,0.36c-0.71,1.26-1.43,2.51-2.14,3.77c0.72,1.14,1.44,2.28,2.15,3.41C304.57,72.1,306,71.96,307.43,71.83 + z"/> +<linearGradient id="SVGID_37_" gradientUnits="userSpaceOnUse" x1="-321.6733" y1="-282.3789" x2="-317.3638" y2="-274.9145" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_37_)" d="M307.41,61.27c0.71-1.25,1.42-2.49,2.13-3.74c-0.72-1.13-1.44-2.27-2.15-3.41 + c-1.43,0.1-2.86,0.2-4.29,0.3c-0.71,1.25-1.42,2.5-2.14,3.75c0.72,1.15,1.44,2.29,2.15,3.44C304.54,61.49,305.97,61.38,307.41,61.27 + z"/> +<linearGradient id="SVGID_38_" gradientUnits="userSpaceOnUse" x1="-321.6357" y1="-292.9482" x2="-317.3516" y2="-285.5278" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_38_)" d="M307.38,50.7c0.71-1.24,1.42-2.47,2.14-3.71c-0.72-1.14-1.44-2.29-2.15-3.44 + c-1.43,0.08-2.86,0.16-4.29,0.24c-0.71,1.24-1.43,2.48-2.14,3.72c0.72,1.16,1.44,2.31,2.15,3.46 + C304.52,50.89,305.95,50.8,307.38,50.7z"/> +<linearGradient id="SVGID_39_" gradientUnits="userSpaceOnUse" x1="-321.6011" y1="-303.5161" x2="-317.3418" y2="-296.1388" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_39_)" d="M307.35,40.14c0.71-1.23,1.43-2.45,2.14-3.68c-0.72-1.15-1.44-2.31-2.16-3.47 + c-1.43,0.06-2.86,0.12-4.29,0.18c-0.71,1.23-1.43,2.46-2.14,3.69c0.72,1.17,1.44,2.33,2.15,3.49 + C304.49,40.29,305.92,40.22,307.35,40.14z"/> +<linearGradient id="SVGID_40_" gradientUnits="userSpaceOnUse" x1="-321.5649" y1="-314.0874" x2="-317.3306" y2="-306.7532" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_40_)" d="M307.33,29.58c0.71-1.22,1.43-2.44,2.14-3.65c-0.72-1.16-1.44-2.33-2.15-3.5 + c-1.43,0.04-2.86,0.08-4.3,0.12c-0.71,1.22-1.42,2.44-2.14,3.66c0.72,1.18,1.44,2.35,2.15,3.52 + C304.47,29.69,305.9,29.63,307.33,29.58z"/> +<linearGradient id="SVGID_41_" gradientUnits="userSpaceOnUse" x1="-321.5269" y1="-324.6572" x2="-317.3169" y2="-317.3654" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_41_)" d="M307.3,19.02c0.71-1.21,1.43-2.41,2.14-3.62c-0.72-1.17-1.44-2.35-2.16-3.53 + c-1.43,0.02-2.86,0.04-4.3,0.07c-0.71,1.21-1.43,2.42-2.14,3.63c0.72,1.19,1.44,2.37,2.16,3.55 + C304.44,19.09,305.87,19.05,307.3,19.02z"/> +<linearGradient id="SVGID_42_" gradientUnits="userSpaceOnUse" x1="-321.4897" y1="-335.2251" x2="-317.3062" y2="-327.9789" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_42_)" d="M307.28,8.45c0.71-1.2,1.43-2.39,2.14-3.59c-0.72-1.18-1.44-2.37-2.16-3.56 + c-1.43,0-2.86,0.01-4.3,0.01c-0.71,1.2-1.43,2.4-2.14,3.61c0.72,1.2,1.44,2.39,2.16,3.58C304.42,8.48,305.85,8.47,307.28,8.45z"/> +<linearGradient id="SVGID_43_" gradientUnits="userSpaceOnUse" x1="-310.5508" y1="-265.1279" x2="-306.1753" y2="-257.5493" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_43_)" d="M296.25,78.6c0.71-1.27,1.43-2.54,2.14-3.81c-0.72-1.14-1.44-2.29-2.15-3.43 + c-1.43,0.12-2.86,0.24-4.29,0.35c-0.71,1.27-1.43,2.55-2.14,3.82c0.72,1.16,1.44,2.31,2.16,3.46 + C293.39,78.86,294.82,78.73,296.25,78.6z"/> +<linearGradient id="SVGID_44_" gradientUnits="userSpaceOnUse" x1="-310.5122" y1="-275.8442" x2="-306.1597" y2="-268.3054" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_44_)" d="M296.22,67.89c0.71-1.26,1.42-2.53,2.14-3.79c-0.72-1.15-1.44-2.3-2.16-3.46 + c-1.43,0.1-2.86,0.2-4.29,0.3c-0.71,1.26-1.42,2.53-2.14,3.79c0.72,1.17,1.44,2.33,2.15,3.49C293.36,68.12,294.79,68,296.22,67.89z" + /> +<linearGradient id="SVGID_45_" gradientUnits="userSpaceOnUse" x1="-310.4736" y1="-286.5635" x2="-306.144" y2="-279.0644" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_45_)" d="M296.2,57.18c0.71-1.25,1.43-2.51,2.14-3.76c-0.72-1.16-1.44-2.32-2.16-3.49 + c-1.43,0.09-2.86,0.17-4.29,0.25c-0.71,1.25-1.42,2.51-2.14,3.77c0.72,1.17,1.44,2.34,2.16,3.51 + C293.33,57.37,294.76,57.27,296.2,57.18z"/> +<linearGradient id="SVGID_46_" gradientUnits="userSpaceOnUse" x1="-310.4351" y1="-297.2803" x2="-306.1279" y2="-289.8201" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_46_)" d="M296.17,46.46c0.71-1.25,1.42-2.49,2.14-3.73c-0.72-1.17-1.44-2.34-2.16-3.51 + c-1.43,0.07-2.86,0.13-4.3,0.19c-0.71,1.25-1.42,2.49-2.14,3.74c0.72,1.18,1.44,2.36,2.16,3.54 + C293.31,46.62,294.74,46.54,296.17,46.46z"/> +<linearGradient id="SVGID_47_" gradientUnits="userSpaceOnUse" x1="-310.3955" y1="-307.9976" x2="-306.1123" y2="-300.5788" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_47_)" d="M296.14,35.75c0.71-1.24,1.43-2.47,2.14-3.71c-0.72-1.18-1.44-2.36-2.16-3.54 + c-1.43,0.05-2.86,0.09-4.3,0.14c-0.71,1.24-1.42,2.48-2.14,3.72c0.72,1.19,1.44,2.38,2.16,3.56 + C293.28,35.88,294.71,35.81,296.14,35.75z"/> +<linearGradient id="SVGID_48_" gradientUnits="userSpaceOnUse" x1="-310.3628" y1="-318.7153" x2="-306.1011" y2="-311.3338" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_48_)" d="M296.12,25.04c0.71-1.23,1.43-2.46,2.14-3.68c-0.72-1.19-1.44-2.38-2.16-3.57 + c-1.43,0.03-2.86,0.06-4.3,0.09c-0.71,1.23-1.42,2.46-2.14,3.69c0.72,1.2,1.44,2.4,2.16,3.59 + C293.25,25.13,294.68,25.09,296.12,25.04z"/> +<linearGradient id="SVGID_49_" gradientUnits="userSpaceOnUse" x1="-310.3232" y1="-329.4331" x2="-306.085" y2="-322.0922" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_49_)" d="M296.09,14.33c0.71-1.22,1.42-2.44,2.14-3.65c-0.72-1.19-1.44-2.39-2.16-3.6 + c-1.43,0.01-2.86,0.02-4.3,0.04c-0.71,1.22-1.42,2.44-2.14,3.67c0.72,1.21,1.44,2.41,2.16,3.62 + C293.22,14.38,294.66,14.36,296.09,14.33z"/> +<linearGradient id="SVGID_50_" gradientUnits="userSpaceOnUse" x1="-309.2559" y1="-338.3657" x2="-306.0708" y2="-332.849" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_50_)" d="M289.61,0c0.72,1.22,1.44,2.43,2.16,3.64c1.43-0.01,2.87-0.01,4.3-0.02 + c0.71-1.21,1.42-2.42,2.14-3.62C295.34,0,292.47,0,289.61,0z"/> +<linearGradient id="SVGID_51_" gradientUnits="userSpaceOnUse" x1="-299.7114" y1="-259.2568" x2="-296.2817" y2="-253.3164" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_51_)" d="M287.56,80.72c-0.72-1.16-1.44-2.32-2.16-3.48c-1.43,0.12-2.87,0.23-4.3,0.35 + c-0.71,1.28-1.42,2.57-2.14,3.86C281.84,81.21,284.7,80.97,287.56,80.72z"/> +<linearGradient id="SVGID_52_" gradientUnits="userSpaceOnUse" x1="-299.7036" y1="-270.0845" x2="-295.3149" y2="-262.4831" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_52_)" d="M285.4,73.73c0.71-1.28,1.42-2.55,2.14-3.83c-0.72-1.16-1.44-2.33-2.16-3.5 + c-1.43,0.1-2.87,0.2-4.3,0.3c-0.71,1.28-1.42,2.55-2.14,3.83c0.72,1.18,1.44,2.36,2.16,3.53C282.53,73.95,283.96,73.84,285.4,73.73z + "/> +<linearGradient id="SVGID_53_" gradientUnits="userSpaceOnUse" x1="-299.6655" y1="-280.9321" x2="-295.2988" y2="-273.3688" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_53_)" d="M285.37,62.89c0.71-1.27,1.42-2.54,2.14-3.8c-0.72-1.17-1.44-2.35-2.16-3.53 + c-1.43,0.08-2.87,0.17-4.3,0.25c-0.71,1.27-1.42,2.54-2.14,3.81c0.72,1.19,1.44,2.37,2.16,3.55 + C282.51,63.07,283.94,62.98,285.37,62.89z"/> +<linearGradient id="SVGID_54_" gradientUnits="userSpaceOnUse" x1="-299.627" y1="-291.7808" x2="-295.2812" y2="-284.2538" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_54_)" d="M285.34,52.04c0.71-1.26,1.42-2.52,2.14-3.78c-0.72-1.18-1.44-2.37-2.16-3.55 + c-1.43,0.07-2.87,0.13-4.3,0.2c-0.71,1.26-1.42,2.52-2.14,3.79c0.72,1.2,1.44,2.39,2.16,3.58C282.48,52.2,283.91,52.12,285.34,52.04 + z"/> +<linearGradient id="SVGID_55_" gradientUnits="userSpaceOnUse" x1="-299.5894" y1="-302.6265" x2="-295.2642" y2="-295.135" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_55_)" d="M285.31,41.2c0.71-1.25,1.42-2.5,2.14-3.75c-0.72-1.19-1.44-2.38-2.16-3.58 + c-1.43,0.05-2.87,0.1-4.3,0.15c-0.71,1.25-1.42,2.51-2.14,3.76c0.72,1.2,1.44,2.41,2.16,3.6C282.45,41.33,283.88,41.27,285.31,41.2z + "/> +<linearGradient id="SVGID_56_" gradientUnits="userSpaceOnUse" x1="-299.5508" y1="-313.4751" x2="-295.2466" y2="-306.02" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_56_)" d="M285.29,30.36c0.71-1.24,1.42-2.49,2.14-3.73c-0.72-1.2-1.44-2.4-2.16-3.61 + c-1.43,0.03-2.87,0.07-4.3,0.1c-0.71,1.25-1.42,2.49-2.14,3.74c0.72,1.21,1.44,2.42,2.16,3.63 + C282.42,30.45,283.85,30.41,285.29,30.36z"/> +<linearGradient id="SVGID_57_" gradientUnits="userSpaceOnUse" x1="-299.5132" y1="-324.3232" x2="-295.23" y2="-316.9045" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_57_)" d="M285.26,19.52c0.71-1.24,1.43-2.47,2.14-3.7c-0.72-1.21-1.44-2.42-2.16-3.63 + c-1.43,0.02-2.87,0.04-4.3,0.05c-0.71,1.24-1.42,2.48-2.14,3.72c0.72,1.22,1.44,2.44,2.16,3.65 + C282.39,19.58,283.83,19.55,285.26,19.52z"/> +<linearGradient id="SVGID_58_" gradientUnits="userSpaceOnUse" x1="-299.4771" y1="-335.1685" x2="-295.2153" y2="-327.787" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_58_)" d="M285.23,8.68c0.71-1.23,1.43-2.45,2.14-3.68c-0.72-1.21-1.44-2.43-2.16-3.66 + c-1.43,0-2.87,0-4.3,0.01c-0.71,1.23-1.42,2.46-2.14,3.69c0.72,1.23,1.44,2.45,2.16,3.67C282.36,8.7,283.8,8.69,285.23,8.68z"/> +<linearGradient id="SVGID_59_" gradientUnits="userSpaceOnUse" x1="-288.5273" y1="-263.4331" x2="-284.1084" y2="-255.7793" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_59_)" d="M274.2,80.45c0.71-1.29,1.43-2.58,2.14-3.87c-0.72-1.18-1.44-2.37-2.16-3.55 + c-1.43,0.1-2.87,0.19-4.3,0.29c-0.71,1.29-1.43,2.58-2.14,3.87c0.72,1.2,1.44,2.39,2.16,3.58C271.34,80.67,272.77,80.56,274.2,80.45 + z"/> +<linearGradient id="SVGID_60_" gradientUnits="userSpaceOnUse" x1="-288.4883" y1="-274.4014" x2="-284.0889" y2="-266.7814" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_60_)" d="M274.17,69.49c0.71-1.28,1.43-2.56,2.14-3.84c-0.72-1.19-1.44-2.38-2.16-3.57 + c-1.43,0.08-2.87,0.17-4.3,0.25c-0.71,1.28-1.43,2.56-2.14,3.85c0.72,1.2,1.44,2.4,2.16,3.6C271.31,69.67,272.74,69.58,274.17,69.49 + z"/> +<linearGradient id="SVGID_61_" gradientUnits="userSpaceOnUse" x1="-288.4507" y1="-285.3701" x2="-284.0698" y2="-277.7823" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_61_)" d="M274.15,58.52c0.71-1.28,1.43-2.55,2.14-3.82c-0.72-1.2-1.44-2.39-2.16-3.6 + c-1.43,0.07-2.86,0.14-4.3,0.2c-0.71,1.27-1.43,2.55-2.14,3.83c0.72,1.21,1.44,2.42,2.16,3.62 + C271.28,58.68,272.71,58.6,274.15,58.52z"/> +<linearGradient id="SVGID_62_" gradientUnits="userSpaceOnUse" x1="-288.4146" y1="-296.3384" x2="-284.0527" y2="-288.7835" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_62_)" d="M274.12,47.56c0.71-1.27,1.43-2.53,2.14-3.8c-0.72-1.21-1.44-2.41-2.16-3.62 + c-1.43,0.05-2.86,0.11-4.3,0.16c-0.71,1.27-1.43,2.53-2.14,3.8c0.72,1.22,1.44,2.43,2.16,3.64 + C271.25,47.69,272.69,47.63,274.12,47.56z"/> +<linearGradient id="SVGID_63_" gradientUnits="userSpaceOnUse" x1="-288.3774" y1="-307.3091" x2="-284.0327" y2="-299.7838" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_63_)" d="M274.09,36.6c0.71-1.26,1.43-2.52,2.14-3.78c-0.72-1.21-1.44-2.42-2.16-3.64 + c-1.43,0.04-2.87,0.08-4.3,0.12c-0.71,1.26-1.43,2.52-2.14,3.78c0.72,1.22,1.44,2.44,2.16,3.66 + C271.23,36.7,272.66,36.65,274.09,36.6z"/> +<linearGradient id="SVGID_64_" gradientUnits="userSpaceOnUse" x1="-288.3389" y1="-318.2759" x2="-284.0146" y2="-310.7861" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_64_)" d="M274.06,25.63c0.71-1.25,1.43-2.5,2.14-3.75c-0.72-1.22-1.44-2.44-2.16-3.66 + c-1.43,0.02-2.87,0.05-4.3,0.07c-0.71,1.25-1.42,2.51-2.14,3.76c0.72,1.23,1.44,2.46,2.16,3.68 + C271.2,25.7,272.63,25.67,274.06,25.63z"/> +<linearGradient id="SVGID_65_" gradientUnits="userSpaceOnUse" x1="-288.3022" y1="-329.2456" x2="-283.9971" y2="-321.7888" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_65_)" d="M274.04,14.67c0.71-1.25,1.43-2.49,2.14-3.73c-0.72-1.23-1.44-2.46-2.16-3.69 + c-1.43,0.01-2.86,0.02-4.3,0.03c-0.71,1.24-1.42,2.49-2.14,3.74c0.72,1.24,1.44,2.47,2.16,3.7 + C271.17,14.71,272.61,14.69,274.04,14.67z"/> +<linearGradient id="SVGID_66_" gradientUnits="userSpaceOnUse" x1="-287.2036" y1="-338.3652" x2="-283.9824" y2="-332.786" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_66_)" d="M267.55,0c0.72,1.24,1.44,2.48,2.16,3.72c1.43-0.01,2.86-0.01,4.3-0.01 + c0.71-1.24,1.43-2.48,2.14-3.71C273.28,0,270.42,0,267.55,0z"/> +<linearGradient id="SVGID_67_" gradientUnits="userSpaceOnUse" x1="-277.6582" y1="-257.6323" x2="-274.2441" y2="-251.719" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_67_)" d="M265.5,82.45c-0.72-1.2-1.44-2.4-2.16-3.6c-1.43,0.09-2.87,0.18-4.3,0.27 + c-0.71,1.29-1.43,2.59-2.14,3.89C259.77,82.84,262.64,82.65,265.5,82.45z"/> +<linearGradient id="SVGID_68_" gradientUnits="userSpaceOnUse" x1="-277.6636" y1="-268.6836" x2="-273.2383" y2="-261.0188" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_68_)" d="M263.34,75.27c0.71-1.29,1.43-2.58,2.14-3.87c-0.72-1.2-1.44-2.41-2.16-3.62 + c-1.43,0.08-2.87,0.16-4.3,0.23c-0.71,1.29-1.43,2.58-2.14,3.87c0.72,1.22,1.44,2.43,2.16,3.64 + C260.47,75.45,261.91,75.36,263.34,75.27z"/> +<linearGradient id="SVGID_69_" gradientUnits="userSpaceOnUse" x1="-277.6289" y1="-279.7568" x2="-273.2192" y2="-272.1191" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_69_)" d="M263.31,64.2c0.71-1.29,1.43-2.57,2.14-3.85c-0.72-1.21-1.44-2.42-2.16-3.64 + c-1.43,0.07-2.87,0.13-4.3,0.2c-0.71,1.28-1.43,2.57-2.14,3.86c0.72,1.22,1.44,2.44,2.16,3.66 + C260.44,64.35,261.88,64.28,263.31,64.2z"/> +<linearGradient id="SVGID_70_" gradientUnits="userSpaceOnUse" x1="-277.5923" y1="-290.8296" x2="-273.2012" y2="-283.224" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_70_)" d="M263.28,53.13c0.71-1.28,1.43-2.56,2.14-3.83c-0.72-1.22-1.44-2.43-2.16-3.66 + c-1.43,0.05-2.87,0.11-4.3,0.16c-0.71,1.28-1.43,2.56-2.14,3.84c0.72,1.23,1.44,2.45,2.16,3.67 + C260.42,53.26,261.85,53.2,263.28,53.13z"/> +<linearGradient id="SVGID_71_" gradientUnits="userSpaceOnUse" x1="-277.5586" y1="-301.9033" x2="-273.1826" y2="-294.3239" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_71_)" d="M263.26,42.06c0.71-1.27,1.43-2.54,2.14-3.81c-0.72-1.22-1.44-2.45-2.16-3.68 + c-1.43,0.04-2.87,0.08-4.3,0.12c-0.71,1.27-1.43,2.54-2.14,3.82c0.72,1.23,1.44,2.47,2.16,3.69 + C260.39,42.16,261.82,42.11,263.26,42.06z"/> +<linearGradient id="SVGID_72_" gradientUnits="userSpaceOnUse" x1="-277.5239" y1="-312.9766" x2="-273.1646" y2="-305.4259" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_72_)" d="M263.23,31c0.71-1.27,1.43-2.53,2.14-3.79c-0.72-1.23-1.44-2.46-2.16-3.69 + c-1.43,0.03-2.87,0.05-4.3,0.08c-0.71,1.27-1.43,2.53-2.14,3.8c0.72,1.24,1.44,2.48,2.16,3.71C260.36,31.07,261.8,31.03,263.23,31z" + /> +<linearGradient id="SVGID_73_" gradientUnits="userSpaceOnUse" x1="-277.4893" y1="-324.0508" x2="-273.1465" y2="-316.5289" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_73_)" d="M263.2,19.93c0.71-1.26,1.43-2.52,2.14-3.77c-0.72-1.24-1.44-2.47-2.16-3.71 + c-1.43,0.01-2.87,0.03-4.3,0.04c-0.71,1.26-1.43,2.52-2.14,3.78c0.72,1.25,1.44,2.49,2.16,3.73 + C260.34,19.97,261.77,19.95,263.2,19.93z"/> +<linearGradient id="SVGID_74_" gradientUnits="userSpaceOnUse" x1="-277.4536" y1="-335.1245" x2="-273.1274" y2="-327.6313" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_74_)" d="M263.18,8.86c0.71-1.25,1.43-2.5,2.14-3.75c-0.72-1.24-1.44-2.49-2.16-3.74c-1.43,0-2.87,0-4.3,0.01 + c-0.71,1.25-1.43,2.51-2.14,3.76c0.72,1.25,1.44,2.5,2.16,3.75C260.31,8.88,261.74,8.87,263.18,8.86z"/> +<linearGradient id="SVGID_75_" gradientUnits="userSpaceOnUse" x1="-266.4678" y1="-262.0903" x2="-262.0205" y2="-254.3874" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_75_)" d="M252.13,81.92c0.71-1.3,1.43-2.6,2.14-3.9c-0.72-1.22-1.44-2.44-2.16-3.66 + c-1.44,0.08-2.87,0.15-4.3,0.22c-0.71,1.3-1.43,2.6-2.14,3.9c0.72,1.23,1.44,2.45,2.16,3.68C249.26,82.09,250.7,82.01,252.13,81.92z + "/> +<linearGradient id="SVGID_76_" gradientUnits="userSpaceOnUse" x1="-266.4355" y1="-273.2568" x2="-262.0034" y2="-265.5802" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_76_)" d="M252.11,70.76c0.71-1.29,1.43-2.59,2.14-3.88c-0.72-1.22-1.44-2.44-2.16-3.67 + c-1.43,0.06-2.87,0.12-4.3,0.19c-0.71,1.29-1.43,2.58-2.14,3.88c0.72,1.23,1.44,2.46,2.16,3.69 + C249.24,70.9,250.67,70.83,252.11,70.76z"/> +<linearGradient id="SVGID_77_" gradientUnits="userSpaceOnUse" x1="-266.4038" y1="-284.4263" x2="-261.9854" y2="-276.7733" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_77_)" d="M252.08,59.59c0.71-1.29,1.43-2.58,2.14-3.86c-0.72-1.23-1.44-2.46-2.16-3.69 + c-1.43,0.05-2.87,0.1-4.3,0.15c-0.71,1.29-1.43,2.58-2.14,3.87c0.72,1.24,1.44,2.47,2.16,3.71 + C249.21,59.71,250.65,59.66,252.08,59.59z"/> +<linearGradient id="SVGID_78_" gradientUnits="userSpaceOnUse" x1="-266.3706" y1="-295.5933" x2="-261.9673" y2="-287.9665" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_78_)" d="M252.05,48.43c0.71-1.28,1.43-2.56,2.14-3.84c-0.72-1.23-1.44-2.47-2.16-3.71 + c-1.43,0.04-2.87,0.08-4.3,0.12c-0.71,1.28-1.43,2.56-2.14,3.85c0.72,1.24,1.44,2.49,2.16,3.72 + C249.19,48.53,250.62,48.48,252.05,48.43z"/> +<linearGradient id="SVGID_79_" gradientUnits="userSpaceOnUse" x1="-266.3398" y1="-306.7612" x2="-261.9517" y2="-299.1607" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_79_)" d="M252.03,37.27c0.71-1.28,1.43-2.55,2.14-3.83c-0.72-1.24-1.44-2.48-2.16-3.73 + c-1.43,0.03-2.87,0.06-4.3,0.09c-0.71,1.28-1.43,2.56-2.14,3.83c0.72,1.25,1.44,2.5,2.16,3.74 + C249.17,37.34,250.6,37.31,252.03,37.27z"/> +<linearGradient id="SVGID_80_" gradientUnits="userSpaceOnUse" x1="-266.3076" y1="-317.9287" x2="-261.9336" y2="-310.3527" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_80_)" d="M252,26.1c0.71-1.27,1.43-2.54,2.14-3.81c-0.72-1.25-1.44-2.49-2.16-3.74 + c-1.43,0.02-2.87,0.04-4.3,0.06c-0.71,1.27-1.43,2.54-2.14,3.82c0.72,1.25,1.44,2.51,2.16,3.76C249.14,26.16,250.57,26.13,252,26.1z + "/> +<linearGradient id="SVGID_81_" gradientUnits="userSpaceOnUse" x1="-266.2759" y1="-329.0972" x2="-261.9165" y2="-321.5465" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_81_)" d="M251.98,14.94c0.71-1.27,1.43-2.53,2.14-3.79c-0.72-1.25-1.44-2.5-2.16-3.76 + c-1.43,0.01-2.86,0.02-4.3,0.02c-0.71,1.26-1.43,2.53-2.14,3.8c0.72,1.26,1.44,2.52,2.16,3.77 + C249.11,14.97,250.55,14.96,251.98,14.94z"/> +<linearGradient id="SVGID_82_" gradientUnits="userSpaceOnUse" x1="-265.1641" y1="-338.3574" x2="-261.9146" y2="-332.7291" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_82_)" d="M245.5,0c0.72,1.26,1.44,2.53,2.16,3.79c1.43,0,2.87-0.01,4.3-0.01c0.71-1.26,1.43-2.52,2.14-3.78 + C251.23,0,248.37,0,245.5,0z"/> +<linearGradient id="SVGID_83_" gradientUnits="userSpaceOnUse" x1="-255.5791" y1="-256.3857" x2="-252.186" y2="-250.5088" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_83_)" d="M243.42,83.79c-0.72-1.23-1.44-2.46-2.16-3.69c-1.43,0.07-2.87,0.14-4.31,0.2 + c-0.71,1.3-1.43,2.61-2.14,3.91C237.68,84.08,240.55,83.94,243.42,83.79z"/> +<linearGradient id="SVGID_84_" gradientUnits="userSpaceOnUse" x1="-255.5938" y1="-267.6055" x2="-251.1465" y2="-259.9026" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_84_)" d="M241.26,76.46c0.71-1.3,1.43-2.6,2.14-3.9c-0.72-1.23-1.44-2.47-2.16-3.71 + c-1.43,0.06-2.87,0.12-4.3,0.17c-0.71,1.3-1.43,2.6-2.14,3.9c0.72,1.24,1.44,2.49,2.16,3.73C238.39,76.59,239.82,76.53,241.26,76.46 + z"/> +<linearGradient id="SVGID_85_" gradientUnits="userSpaceOnUse" x1="-255.5659" y1="-278.8545" x2="-251.1294" y2="-271.1702" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_85_)" d="M241.23,65.22c0.72-1.3,1.43-2.59,2.14-3.88c-0.72-1.24-1.44-2.48-2.16-3.72 + c-1.43,0.05-2.87,0.1-4.3,0.14c-0.71,1.29-1.43,2.59-2.14,3.89c0.72,1.25,1.44,2.49,2.16,3.74 + C238.36,65.33,239.8,65.27,241.23,65.22z"/> +<linearGradient id="SVGID_86_" gradientUnits="userSpaceOnUse" x1="-255.5381" y1="-290.1001" x2="-251.1147" y2="-282.4387" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_86_)" d="M241.21,53.97c0.71-1.29,1.43-2.58,2.14-3.87c-0.72-1.24-1.44-2.49-2.16-3.74 + c-1.43,0.04-2.87,0.08-4.3,0.12c-0.71,1.29-1.43,2.58-2.15,3.87c0.72,1.25,1.44,2.5,2.16,3.75 + C238.34,54.06,239.78,54.02,241.21,53.97z"/> +<linearGradient id="SVGID_87_" gradientUnits="userSpaceOnUse" x1="-255.5098" y1="-301.3467" x2="-251.0991" y2="-293.7072" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_87_)" d="M241.19,42.73c0.71-1.29,1.43-2.57,2.14-3.85c-0.72-1.25-1.44-2.5-2.16-3.75 + c-1.43,0.03-2.87,0.06-4.3,0.09c-0.71,1.29-1.43,2.57-2.14,3.86c0.72,1.26,1.44,2.51,2.16,3.77 + C238.32,42.8,239.75,42.77,241.19,42.73z"/> +<linearGradient id="SVGID_88_" gradientUnits="userSpaceOnUse" x1="-255.4805" y1="-312.5938" x2="-251.0825" y2="-304.9763" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_88_)" d="M241.17,31.49c0.72-1.28,1.43-2.56,2.14-3.84c-0.72-1.25-1.44-2.51-2.16-3.77 + c-1.43,0.02-2.87,0.04-4.3,0.06c-0.71,1.28-1.43,2.56-2.14,3.85c0.72,1.26,1.44,2.52,2.16,3.78 + C238.3,31.54,239.73,31.51,241.17,31.49z"/> +<linearGradient id="SVGID_89_" gradientUnits="userSpaceOnUse" x1="-255.4521" y1="-323.8418" x2="-251.0654" y2="-316.2438" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_89_)" d="M241.14,20.24c0.71-1.28,1.43-2.55,2.14-3.82c-0.72-1.26-1.43-2.52-2.16-3.78 + c-1.43,0.01-2.87,0.02-4.3,0.03c-0.71,1.28-1.43,2.55-2.14,3.83c0.72,1.27,1.44,2.53,2.16,3.79 + C238.28,20.28,239.71,20.26,241.14,20.24z"/> +<linearGradient id="SVGID_90_" gradientUnits="userSpaceOnUse" x1="-255.4238" y1="-335.0898" x2="-251.0493" y2="-327.513" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_90_)" d="M241.12,9c0.71-1.27,1.43-2.54,2.14-3.81c-0.72-1.26-1.43-2.53-2.15-3.8c-1.43,0-2.87,0-4.3,0 + c-0.71,1.27-1.43,2.55-2.14,3.82c0.72,1.27,1.44,2.54,2.15,3.8C238.25,9.01,239.69,9.01,241.12,9z"/> +<linearGradient id="SVGID_91_" gradientUnits="userSpaceOnUse" x1="-244.3813" y1="-261.1006" x2="-239.9204" y2="-253.374" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_91_)" d="M230.04,83.01c0.72-1.3,1.43-2.61,2.15-3.91c-0.72-1.25-1.44-2.49-2.16-3.74 + c-1.44,0.05-2.87,0.1-4.31,0.15c-0.71,1.3-1.43,2.61-2.15,3.91c0.72,1.26,1.44,2.51,2.16,3.76 + C227.16,83.13,228.6,83.07,230.04,83.01z"/> +<linearGradient id="SVGID_92_" gradientUnits="userSpaceOnUse" x1="-244.356" y1="-272.4121" x2="-239.9077" y2="-264.7075" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_92_)" d="M230.02,71.7c0.71-1.3,1.43-2.6,2.15-3.9c-0.72-1.25-1.44-2.5-2.16-3.75 + c-1.43,0.04-2.87,0.09-4.3,0.13c-0.72,1.3-1.43,2.6-2.15,3.9c0.72,1.26,1.44,2.52,2.16,3.77C227.15,71.8,228.58,71.75,230.02,71.7z" + /> +<linearGradient id="SVGID_93_" gradientUnits="userSpaceOnUse" x1="-244.3325" y1="-283.729" x2="-239.8931" y2="-276.0396" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_93_)" d="M230,60.39c0.71-1.3,1.43-2.59,2.14-3.89c-0.72-1.25-1.44-2.51-2.16-3.77 + c-1.43,0.04-2.87,0.07-4.3,0.11c-0.71,1.29-1.43,2.59-2.14,3.89c0.72,1.26,1.44,2.52,2.16,3.78C227.13,60.47,228.56,60.43,230,60.39 + z"/> +<linearGradient id="SVGID_94_" gradientUnits="userSpaceOnUse" x1="-244.3091" y1="-295.0435" x2="-239.8799" y2="-287.3719" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_94_)" d="M229.98,49.08c0.71-1.29,1.43-2.58,2.14-3.88c-0.72-1.26-1.44-2.52-2.16-3.78 + c-1.44,0.03-2.87,0.06-4.3,0.08c-0.71,1.29-1.43,2.58-2.14,3.88c0.72,1.27,1.44,2.53,2.16,3.79 + C227.11,49.14,228.54,49.11,229.98,49.08z"/> +<linearGradient id="SVGID_95_" gradientUnits="userSpaceOnUse" x1="-244.2842" y1="-306.3579" x2="-239.8657" y2="-298.7049" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_95_)" d="M229.96,37.76c0.71-1.29,1.43-2.58,2.14-3.86c-0.72-1.26-1.44-2.53-2.16-3.79 + c-1.43,0.02-2.87,0.04-4.3,0.06c-0.71,1.29-1.43,2.58-2.14,3.87c0.72,1.27,1.44,2.54,2.16,3.8 + C227.09,37.81,228.52,37.79,229.96,37.76z"/> +<linearGradient id="SVGID_96_" gradientUnits="userSpaceOnUse" x1="-244.2607" y1="-317.6738" x2="-239.8521" y2="-310.0378" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_96_)" d="M229.94,26.45c0.71-1.28,1.43-2.57,2.14-3.85c-0.72-1.27-1.44-2.53-2.16-3.8 + c-1.43,0.01-2.87,0.03-4.3,0.04c-0.71,1.28-1.43,2.57-2.14,3.85c0.72,1.27,1.44,2.54,2.16,3.81 + C227.07,26.49,228.5,26.47,229.94,26.45z"/> +<linearGradient id="SVGID_97_" gradientUnits="userSpaceOnUse" x1="-244.2373" y1="-328.9888" x2="-239.8394" y2="-321.3713" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_97_)" d="M229.92,15.14c0.71-1.28,1.43-2.56,2.14-3.84c-0.72-1.27-1.44-2.54-2.16-3.82 + c-1.43,0-2.86,0.01-4.3,0.01c-0.71,1.28-1.43,2.56-2.14,3.85c0.72,1.28,1.44,2.55,2.16,3.82C227.05,15.16,228.49,15.15,229.92,15.14 + z"/> +<linearGradient id="SVGID_98_" gradientUnits="userSpaceOnUse" x1="-243.1221" y1="-338.3506" x2="-239.853" y2="-332.6884" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_98_)" d="M223.45,0c0.72,1.28,1.43,2.56,2.15,3.83c1.43,0,2.86,0,4.3-0.01c0.71-1.28,1.43-2.55,2.14-3.83 + C229.18,0,226.31,0,223.45,0z"/> +<linearGradient id="SVGID_99_" gradientUnits="userSpaceOnUse" x1="-233.478" y1="-255.5127" x2="-230.1138" y2="-249.6856" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_99_)" d="M221.32,84.74c-0.72-1.26-1.44-2.51-2.16-3.77c-1.44,0.04-2.87,0.09-4.31,0.13 + c-0.72,1.3-1.43,2.61-2.15,3.91C215.58,84.93,218.45,84.84,221.32,84.74z"/> +<linearGradient id="SVGID_100_" gradientUnits="userSpaceOnUse" x1="-233.5024" y1="-266.855" x2="-229.0454" y2="-259.1352" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_100_)" d="M219.16,77.29c0.71-1.3,1.43-2.61,2.14-3.91c-0.72-1.26-1.44-2.52-2.16-3.78 + c-1.44,0.04-2.87,0.08-4.31,0.11c-0.72,1.3-1.43,2.6-2.15,3.9c0.72,1.27,1.44,2.53,2.16,3.8C216.29,77.38,217.72,77.34,219.16,77.29 + z"/> +<linearGradient id="SVGID_101_" gradientUnits="userSpaceOnUse" x1="-233.4824" y1="-278.2231" x2="-229.0342" y2="-270.5186" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_101_)" d="M219.14,65.93c0.72-1.3,1.43-2.6,2.15-3.9c-0.72-1.26-1.44-2.53-2.16-3.79 + c-1.44,0.03-2.87,0.06-4.31,0.09c-0.72,1.3-1.43,2.6-2.15,3.9c0.72,1.27,1.44,2.54,2.16,3.81C216.27,66,217.71,65.97,219.14,65.93z" + /> +<linearGradient id="SVGID_102_" gradientUnits="userSpaceOnUse" x1="-233.4624" y1="-289.5913" x2="-229.0225" y2="-281.9011" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_102_)" d="M219.12,54.56c0.71-1.29,1.43-2.59,2.15-3.89c-0.72-1.27-1.44-2.53-2.16-3.8 + c-1.43,0.03-2.87,0.05-4.3,0.07c-0.71,1.29-1.43,2.59-2.15,3.89c0.72,1.27,1.44,2.54,2.16,3.81 + C216.25,54.62,217.69,54.59,219.12,54.56z"/> +<linearGradient id="SVGID_103_" gradientUnits="userSpaceOnUse" x1="-233.4443" y1="-300.959" x2="-229.0122" y2="-293.2823" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_103_)" d="M219.11,43.2c0.71-1.29,1.43-2.59,2.15-3.88c-0.72-1.27-1.44-2.54-2.16-3.81 + c-1.43,0.02-2.87,0.04-4.3,0.06c-0.72,1.29-1.43,2.59-2.15,3.88c0.72,1.28,1.44,2.55,2.16,3.82 + C216.24,43.24,217.67,43.22,219.11,43.2z"/> +<linearGradient id="SVGID_104_" gradientUnits="userSpaceOnUse" x1="-233.4233" y1="-312.3262" x2="-229.0005" y2="-304.6656" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_104_)" d="M219.09,31.83c0.71-1.29,1.43-2.58,2.14-3.87c-0.72-1.27-1.44-2.54-2.16-3.82 + c-1.43,0.01-2.87,0.02-4.3,0.04c-0.71,1.29-1.43,2.58-2.14,3.87c0.72,1.28,1.44,2.55,2.16,3.83 + C216.23,31.86,217.66,31.85,219.09,31.83z"/> +<linearGradient id="SVGID_105_" gradientUnits="userSpaceOnUse" x1="-233.4058" y1="-323.6953" x2="-228.9893" y2="-316.0457" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_105_)" d="M219.08,20.46c0.71-1.29,1.43-2.57,2.14-3.86c-0.72-1.28-1.43-2.55-2.15-3.83 + c-1.43,0.01-2.87,0.01-4.3,0.02c-0.71,1.29-1.43,2.57-2.14,3.86c0.72,1.28,1.44,2.56,2.15,3.84 + C216.21,20.49,217.64,20.47,219.08,20.46z"/> +<linearGradient id="SVGID_106_" gradientUnits="userSpaceOnUse" x1="-233.3862" y1="-335.063" x2="-228.979" y2="-327.4294" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_106_)" d="M219.06,9.1c0.71-1.29,1.43-2.57,2.14-3.85c-0.72-1.28-1.44-2.56-2.15-3.84c-1.43,0-2.86,0-4.3,0 + c-0.71,1.29-1.43,2.57-2.14,3.86c0.72,1.28,1.44,2.56,2.15,3.85C216.2,9.11,217.63,9.1,219.06,9.1z"/> +<linearGradient id="SVGID_107_" gradientUnits="userSpaceOnUse" x1="-222.2739" y1="-260.4614" x2="-217.8154" y2="-252.7391" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_107_)" d="M207.93,83.72c0.72-1.3,1.43-2.61,2.15-3.91c-0.72-1.27-1.44-2.54-2.16-3.81 + c-1.44,0.03-2.88,0.06-4.31,0.08c-0.71,1.3-1.43,2.6-2.15,3.9c0.72,1.28,1.44,2.55,2.16,3.82 + C205.05,83.78,206.49,83.75,207.93,83.72z"/> +<linearGradient id="SVGID_108_" gradientUnits="userSpaceOnUse" x1="-222.2593" y1="-271.8691" x2="-217.8081" y2="-264.1595" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_108_)" d="M207.92,72.31c0.72-1.3,1.43-2.6,2.15-3.9c-0.72-1.27-1.44-2.54-2.16-3.82 + c-1.44,0.03-2.87,0.05-4.3,0.07c-0.72,1.3-1.43,2.6-2.15,3.9c0.72,1.28,1.44,2.55,2.16,3.83C205.04,72.37,206.48,72.34,207.92,72.31 + z"/> +<linearGradient id="SVGID_109_" gradientUnits="userSpaceOnUse" x1="-222.2451" y1="-283.2788" x2="-217.7993" y2="-275.5785" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_109_)" d="M207.9,60.9c0.72-1.3,1.43-2.6,2.15-3.9c-0.72-1.27-1.44-2.55-2.16-3.82 + c-1.43,0.02-2.87,0.04-4.3,0.06c-0.72,1.3-1.43,2.59-2.15,3.89c0.72,1.28,1.44,2.56,2.16,3.84C205.03,60.95,206.47,60.92,207.9,60.9 + z"/> +<linearGradient id="SVGID_110_" gradientUnits="userSpaceOnUse" x1="-222.231" y1="-294.6875" x2="-217.792" y2="-286.999" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_110_)" d="M207.89,49.49c0.72-1.3,1.43-2.59,2.15-3.89c-0.72-1.27-1.44-2.55-2.16-3.83 + c-1.43,0.02-2.87,0.03-4.3,0.04c-0.71,1.29-1.43,2.59-2.15,3.88c0.72,1.28,1.44,2.56,2.16,3.84 + C205.02,49.53,206.46,49.51,207.89,49.49z"/> +<linearGradient id="SVGID_111_" gradientUnits="userSpaceOnUse" x1="-222.2173" y1="-306.0991" x2="-217.7837" y2="-298.4199" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_111_)" d="M207.88,38.08c0.71-1.29,1.43-2.59,2.15-3.88c-0.72-1.28-1.44-2.56-2.15-3.84 + c-1.43,0.01-2.87,0.02-4.3,0.03c-0.71,1.29-1.43,2.59-2.15,3.88c0.72,1.28,1.44,2.57,2.15,3.85 + C205.01,38.11,206.45,38.1,207.88,38.08z"/> +<linearGradient id="SVGID_112_" gradientUnits="userSpaceOnUse" x1="-222.2036" y1="-317.5083" x2="-217.7754" y2="-309.8384" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_112_)" d="M207.87,26.68c0.72-1.29,1.43-2.58,2.15-3.87c-0.72-1.28-1.44-2.56-2.15-3.84 + c-1.43,0.01-2.87,0.02-4.3,0.02c-0.72,1.29-1.43,2.58-2.15,3.87c0.72,1.29,1.44,2.57,2.15,3.85C205,26.7,206.43,26.69,207.87,26.68z + "/> +<linearGradient id="SVGID_113_" gradientUnits="userSpaceOnUse" x1="-222.1899" y1="-328.9189" x2="-217.7681" y2="-321.26" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_113_)" d="M207.86,15.27c0.71-1.29,1.43-2.58,2.14-3.87c-0.72-1.28-1.44-2.57-2.15-3.85 + c-1.43,0-2.87,0-4.3,0.01c-0.72,1.29-1.43,2.58-2.15,3.87c0.72,1.29,1.43,2.57,2.15,3.86C204.99,15.28,206.42,15.27,207.86,15.27z" + /> +<linearGradient id="SVGID_114_" gradientUnits="userSpaceOnUse" x1="-221.0752" y1="-338.3481" x2="-217.7915" y2="-332.6606" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_114_)" d="M201.39,0c0.72,1.29,1.43,2.58,2.15,3.86c1.43,0,2.86,0,4.3,0c0.71-1.29,1.43-2.58,2.14-3.86 + C207.12,0,204.26,0,201.39,0z"/> +<linearGradient id="SVGID_115_" gradientUnits="userSpaceOnUse" x1="-211.3623" y1="-255.0103" x2="-208.0376" y2="-249.2517" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_115_)" d="M199.21,85.31c-0.72-1.28-1.44-2.55-2.16-3.83c-1.44,0.02-2.87,0.04-4.31,0.05 + c-0.72,1.3-1.43,2.6-2.15,3.89C193.46,85.39,196.33,85.36,199.21,85.31z"/> +<linearGradient id="SVGID_116_" gradientUnits="userSpaceOnUse" x1="-211.3921" y1="-266.4248" x2="-206.9434" y2="-258.7194" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_116_)" d="M197.05,77.77c0.72-1.3,1.43-2.6,2.15-3.9c-0.72-1.28-1.44-2.56-2.16-3.84 + c-1.44,0.02-2.87,0.03-4.31,0.04c-0.72,1.3-1.43,2.59-2.15,3.89c0.72,1.29,1.44,2.57,2.16,3.85 + C194.18,77.81,195.61,77.79,197.05,77.77z"/> +<linearGradient id="SVGID_117_" gradientUnits="userSpaceOnUse" x1="-211.3843" y1="-277.8638" x2="-206.939" y2="-270.1643" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_117_)" d="M197.04,66.34c0.72-1.3,1.43-2.6,2.15-3.89c-0.72-1.28-1.44-2.56-2.15-3.84 + c-1.44,0.02-2.87,0.03-4.31,0.04c-0.72,1.3-1.43,2.59-2.15,3.89c0.72,1.29,1.44,2.57,2.16,3.85 + C194.17,66.37,195.6,66.35,197.04,66.34z"/> +<linearGradient id="SVGID_118_" gradientUnits="userSpaceOnUse" x1="-211.3745" y1="-289.2998" x2="-206.9336" y2="-281.6079" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_118_)" d="M197.03,54.9c0.71-1.29,1.43-2.59,2.15-3.89c-0.72-1.28-1.43-2.56-2.15-3.85 + c-1.44,0.01-2.87,0.02-4.3,0.03c-0.72,1.29-1.43,2.59-2.15,3.88c0.72,1.29,1.44,2.57,2.15,3.86 + C194.16,54.93,195.6,54.91,197.03,54.9z"/> +<linearGradient id="SVGID_119_" gradientUnits="userSpaceOnUse" x1="-211.3662" y1="-300.7378" x2="-206.9287" y2="-293.0518" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_119_)" d="M197.03,43.46c0.72-1.29,1.43-2.59,2.15-3.88c-0.72-1.28-1.44-2.57-2.15-3.85 + c-1.43,0.01-2.87,0.02-4.3,0.03c-0.71,1.29-1.43,2.59-2.15,3.88c0.72,1.29,1.43,2.57,2.15,3.86 + C194.16,43.48,195.59,43.48,197.03,43.46z"/> +<linearGradient id="SVGID_120_" gradientUnits="userSpaceOnUse" x1="-211.3569" y1="-312.1753" x2="-206.9238" y2="-304.4969" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_120_)" d="M197.02,32.03c0.71-1.29,1.43-2.59,2.15-3.88c-0.72-1.28-1.43-2.57-2.15-3.86 + c-1.43,0.01-2.87,0.01-4.3,0.02c-0.71,1.29-1.43,2.59-2.15,3.88c0.72,1.29,1.43,2.58,2.15,3.86 + C194.15,32.04,195.58,32.03,197.02,32.03z"/> +<linearGradient id="SVGID_121_" gradientUnits="userSpaceOnUse" x1="-211.3491" y1="-323.6118" x2="-206.9189" y2="-315.9385" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_121_)" d="M197.01,20.59c0.71-1.29,1.43-2.58,2.14-3.88c-0.72-1.29-1.43-2.57-2.15-3.86 + c-1.43,0-2.87,0.01-4.3,0.01c-0.72,1.29-1.43,2.58-2.15,3.88c0.72,1.29,1.43,2.58,2.15,3.87C194.14,20.6,195.58,20.6,197.01,20.59z" + /> +<linearGradient id="SVGID_122_" gradientUnits="userSpaceOnUse" x1="-211.3398" y1="-335.0503" x2="-206.9136" y2="-327.3838" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_122_)" d="M197,9.15c0.71-1.29,1.43-2.58,2.15-3.87c-0.72-1.29-1.44-2.58-2.15-3.87c-1.43,0-2.87,0-4.3,0 + c-0.71,1.29-1.43,2.58-2.15,3.87c0.72,1.29,1.43,2.58,2.15,3.87C194.13,9.16,195.57,9.16,197,9.15z"/> +<linearGradient id="SVGID_123_" gradientUnits="userSpaceOnUse" x1="-200.1514" y1="-260.1733" x2="-195.7119" y2="-252.484" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_123_)" d="M185.81,84.04c0.72-1.3,1.43-2.59,2.15-3.89c-0.72-1.29-1.44-2.57-2.15-3.86 + c-1.44,0.01-2.87,0.01-4.31,0.02c-0.72,1.29-1.44,2.59-2.15,3.88c0.72,1.29,1.43,2.58,2.15,3.87 + C182.94,84.05,184.37,84.05,185.81,84.04z"/> +<linearGradient id="SVGID_124_" gradientUnits="userSpaceOnUse" x1="-200.1489" y1="-271.625" x2="-195.7109" y2="-263.9382" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_124_)" d="M185.81,72.59c0.72-1.29,1.44-2.59,2.15-3.89c-0.72-1.29-1.44-2.57-2.15-3.86 + c-1.43,0.01-2.87,0.01-4.31,0.02c-0.72,1.29-1.44,2.58-2.15,3.88c0.72,1.29,1.44,2.58,2.15,3.87 + C182.93,72.6,184.37,72.6,185.81,72.59z"/> +<linearGradient id="SVGID_125_" gradientUnits="userSpaceOnUse" x1="-200.146" y1="-283.0791" x2="-195.7095" y2="-275.3948" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_125_)" d="M185.8,61.13c0.72-1.29,1.43-2.59,2.15-3.88c-0.72-1.29-1.44-2.58-2.15-3.86 + c-1.44,0-2.87,0.01-4.31,0.01c-0.72,1.29-1.43,2.59-2.15,3.88c0.72,1.29,1.43,2.58,2.15,3.87C182.93,61.15,184.37,61.14,185.8,61.13 + z"/> +<linearGradient id="SVGID_126_" gradientUnits="userSpaceOnUse" x1="-200.1416" y1="-294.5293" x2="-195.7075" y2="-286.8492" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_126_)" d="M185.8,49.68c0.72-1.29,1.43-2.59,2.15-3.88c-0.72-1.29-1.44-2.58-2.15-3.86 + c-1.43,0-2.87,0.01-4.3,0.01c-0.72,1.29-1.43,2.58-2.15,3.87c0.72,1.29,1.43,2.58,2.15,3.87C182.93,49.69,184.37,49.69,185.8,49.68z + "/> +<linearGradient id="SVGID_127_" gradientUnits="userSpaceOnUse" x1="-200.1396" y1="-305.9839" x2="-195.7061" y2="-298.3047" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_127_)" d="M185.8,38.23c0.72-1.29,1.43-2.59,2.15-3.88c-0.72-1.29-1.44-2.58-2.15-3.87 + c-1.43,0-2.87,0.01-4.3,0.01c-0.72,1.29-1.43,2.58-2.15,3.88c0.72,1.29,1.43,2.58,2.15,3.87C182.93,38.24,184.36,38.24,185.8,38.23z + "/> +<linearGradient id="SVGID_128_" gradientUnits="userSpaceOnUse" x1="-200.1367" y1="-317.4355" x2="-195.7051" y2="-309.7597" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_128_)" d="M185.79,26.78c0.71-1.29,1.43-2.59,2.15-3.88c-0.72-1.29-1.43-2.58-2.15-3.87c-1.43,0-2.87,0-4.3,0 + c-0.72,1.29-1.43,2.58-2.15,3.88c0.72,1.29,1.43,2.58,2.15,3.87C182.93,26.78,184.36,26.78,185.79,26.78z"/> +<linearGradient id="SVGID_129_" gradientUnits="userSpaceOnUse" x1="-200.1338" y1="-328.8887" x2="-195.7036" y2="-321.2154" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_129_)" d="M185.79,15.32c0.72-1.29,1.43-2.58,2.15-3.87c-0.72-1.29-1.43-2.58-2.15-3.87c-1.43,0-2.87,0-4.3,0 + c-0.72,1.29-1.43,2.58-2.15,3.88c0.72,1.29,1.43,2.58,2.15,3.87C182.92,15.33,184.36,15.33,185.79,15.32z"/> +<linearGradient id="SVGID_130_" gradientUnits="userSpaceOnUse" x1="-199.0234" y1="-338.3462" x2="-195.7349" y2="-332.6502" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_130_)" d="M179.34,0c0.71,1.29,1.43,2.58,2.15,3.88c1.43,0,2.86,0,4.3,0c0.72-1.29,1.43-2.58,2.15-3.87 + C185.07,0,182.21,0,179.34,0z"/> +<linearGradient id="SVGID_131_" gradientUnits="userSpaceOnUse" x1="-189.2378" y1="-254.8848" x2="-185.9585" y2="-249.2048" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_131_)" d="M177.09,85.48c-0.72-1.29-1.44-2.59-2.15-3.88c-1.44,0-2.87-0.01-4.31-0.02 + c-0.72,1.29-1.44,2.57-2.16,3.86C171.34,85.47,174.21,85.48,177.09,85.48z"/> +<linearGradient id="SVGID_132_" gradientUnits="userSpaceOnUse" x1="-189.2686" y1="-266.3203" x2="-184.8442" y2="-258.6572" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_132_)" d="M174.93,77.9c0.72-1.29,1.44-2.58,2.16-3.87c-0.72-1.29-1.44-2.58-2.15-3.88 + c-1.44,0-2.87-0.01-4.31-0.02c-0.72,1.29-1.44,2.58-2.15,3.86c0.71,1.3,1.43,2.59,2.15,3.89C172.06,77.89,173.5,77.9,174.93,77.9z" + /> +<linearGradient id="SVGID_133_" gradientUnits="userSpaceOnUse" x1="-189.272" y1="-277.7749" x2="-184.8457" y2="-270.1084" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_133_)" d="M174.93,66.44c0.72-1.29,1.44-2.58,2.15-3.87c-0.72-1.29-1.44-2.58-2.15-3.88 + c-1.43,0-2.87-0.01-4.31-0.01c-0.72,1.29-1.44,2.58-2.15,3.86c0.72,1.29,1.43,2.59,2.15,3.88C172.06,66.44,173.5,66.44,174.93,66.44 + z"/> +<linearGradient id="SVGID_134_" gradientUnits="userSpaceOnUse" x1="-189.2744" y1="-289.2305" x2="-184.8472" y2="-281.5623" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_134_)" d="M174.93,54.99c0.72-1.29,1.43-2.58,2.15-3.87c-0.72-1.29-1.44-2.59-2.15-3.88 + c-1.43,0-2.87-0.01-4.3-0.01c-0.72,1.29-1.43,2.58-2.15,3.87c0.72,1.29,1.44,2.59,2.15,3.88C172.06,54.98,173.5,54.98,174.93,54.99z + "/> +<linearGradient id="SVGID_135_" gradientUnits="userSpaceOnUse" x1="-189.2773" y1="-300.6846" x2="-184.8496" y2="-293.0155" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_135_)" d="M174.94,43.53c0.72-1.29,1.43-2.58,2.15-3.87c-0.72-1.29-1.43-2.58-2.15-3.88 + c-1.43,0-2.87,0-4.3-0.01c-0.72,1.29-1.43,2.58-2.15,3.87c0.71,1.29,1.43,2.59,2.15,3.88C172.07,43.53,173.5,43.53,174.94,43.53z"/> +<linearGradient id="SVGID_136_" gradientUnits="userSpaceOnUse" x1="-189.2793" y1="-312.1377" x2="-184.8516" y2="-304.4686" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_136_)" d="M174.94,32.08c0.72-1.29,1.43-2.58,2.15-3.87c-0.72-1.29-1.43-2.58-2.15-3.88 + c-1.43,0-2.87,0-4.3-0.01c-0.71,1.29-1.43,2.58-2.15,3.87c0.71,1.29,1.43,2.59,2.15,3.88C172.07,32.08,173.5,32.08,174.94,32.08z"/> +<linearGradient id="SVGID_137_" gradientUnits="userSpaceOnUse" x1="-189.2822" y1="-323.5933" x2="-184.853" y2="-315.9217" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_137_)" d="M174.94,20.62c0.72-1.29,1.43-2.58,2.15-3.88c-0.71-1.29-1.43-2.58-2.15-3.88c-1.43,0-2.87,0-4.3,0 + c-0.72,1.29-1.43,2.58-2.15,3.87c0.72,1.29,1.43,2.59,2.15,3.88C172.07,20.62,173.5,20.62,174.94,20.62z"/> +<linearGradient id="SVGID_138_" gradientUnits="userSpaceOnUse" x1="-189.2852" y1="-335.0493" x2="-184.855" y2="-327.376" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_138_)" d="M174.94,9.17c0.72-1.29,1.43-2.58,2.15-3.87c-0.72-1.29-1.43-2.59-2.15-3.88c-1.43,0-2.87,0-4.3,0 + c-0.72,1.29-1.43,2.58-2.15,3.87c0.71,1.29,1.43,2.58,2.15,3.87C172.07,9.17,173.51,9.17,174.94,9.17z"/> +<linearGradient id="SVGID_139_" gradientUnits="userSpaceOnUse" x1="-178.0176" y1="-260.2373" x2="-173.6118" y2="-252.6063" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_139_)" d="M163.69,83.98c0.72-1.28,1.44-2.56,2.16-3.85c-0.72-1.3-1.43-2.6-2.15-3.89 + c-1.44-0.02-2.87-0.03-4.31-0.05c-0.72,1.28-1.44,2.56-2.16,3.84c0.72,1.3,1.44,2.6,2.15,3.9 + C160.82,83.94,162.25,83.96,163.69,83.98z"/> +<linearGradient id="SVGID_140_" gradientUnits="userSpaceOnUse" x1="-178.0269" y1="-271.6807" x2="-173.6177" y2="-264.0437" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_140_)" d="M163.7,72.54c0.72-1.28,1.43-2.57,2.15-3.85c-0.72-1.3-1.43-2.59-2.15-3.89 + c-1.44-0.01-2.87-0.03-4.31-0.04c-0.72,1.28-1.43,2.56-2.15,3.84c0.72,1.3,1.43,2.6,2.15,3.9C160.82,72.5,162.26,72.52,163.7,72.54z + "/> +<linearGradient id="SVGID_141_" gradientUnits="userSpaceOnUse" x1="-178.0342" y1="-283.124" x2="-173.6226" y2="-275.4829" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_141_)" d="M163.7,61.09c0.72-1.28,1.44-2.57,2.15-3.86c-0.72-1.3-1.43-2.59-2.15-3.89 + c-1.43-0.01-2.87-0.02-4.31-0.04c-0.72,1.28-1.43,2.57-2.15,3.85c0.72,1.3,1.43,2.59,2.15,3.89 + C160.83,61.07,162.26,61.08,163.7,61.09z"/> +<linearGradient id="SVGID_142_" gradientUnits="userSpaceOnUse" x1="-178.043" y1="-294.5679" x2="-173.6274" y2="-286.92" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_142_)" d="M163.71,49.65c0.72-1.28,1.44-2.57,2.15-3.86c-0.72-1.29-1.43-2.59-2.15-3.88 + c-1.43-0.01-2.87-0.02-4.31-0.03c-0.72,1.29-1.43,2.57-2.15,3.85c0.72,1.3,1.43,2.59,2.15,3.89 + C160.84,49.63,162.27,49.64,163.71,49.65z"/> +<linearGradient id="SVGID_143_" gradientUnits="userSpaceOnUse" x1="-178.0522" y1="-306.0107" x2="-173.6338" y2="-298.3578" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_143_)" d="M163.71,38.2c0.72-1.29,1.44-2.58,2.15-3.86c-0.72-1.29-1.43-2.59-2.15-3.88 + c-1.44-0.01-2.87-0.01-4.3-0.02c-0.72,1.29-1.43,2.57-2.15,3.86c0.72,1.29,1.43,2.59,2.15,3.88 + C160.84,38.19,162.28,38.2,163.71,38.2z"/> +<linearGradient id="SVGID_144_" gradientUnits="userSpaceOnUse" x1="-178.0601" y1="-317.4526" x2="-173.6396" y2="-309.7963" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_144_)" d="M163.72,26.76c0.72-1.29,1.43-2.58,2.15-3.86c-0.72-1.29-1.43-2.58-2.15-3.88 + c-1.43,0-2.87-0.01-4.3-0.01c-0.72,1.29-1.43,2.57-2.15,3.86c0.72,1.29,1.43,2.58,2.15,3.88C160.85,26.75,162.28,26.75,163.72,26.76 + z"/> +<linearGradient id="SVGID_145_" gradientUnits="userSpaceOnUse" x1="-178.0693" y1="-328.8984" x2="-173.644" y2="-321.2336" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_145_)" d="M163.72,15.31c0.72-1.29,1.43-2.58,2.15-3.87c-0.72-1.29-1.43-2.58-2.15-3.88c-1.43,0-2.87,0-4.3,0 + c-0.72,1.29-1.43,2.58-2.15,3.86c0.71,1.29,1.43,2.58,2.14,3.87C160.86,15.31,162.29,15.31,163.72,15.31z"/> +<linearGradient id="SVGID_146_" gradientUnits="userSpaceOnUse" x1="-176.9688" y1="-338.3462" x2="-173.6821" y2="-332.6536" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_146_)" d="M157.29,0c0.71,1.29,1.43,2.58,2.14,3.87c1.43,0,2.87,0,4.3,0c0.72-1.29,1.43-2.58,2.15-3.87 + C163.02,0,160.15,0,157.29,0z"/> +<linearGradient id="SVGID_147_" gradientUnits="userSpaceOnUse" x1="-167.1094" y1="-255.1313" x2="-163.8838" y2="-249.5445" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_147_)" d="M154.97,85.27c-0.72-1.3-1.43-2.6-2.15-3.9c-1.44-0.03-2.87-0.06-4.31-0.09 + c-0.72,1.27-1.44,2.54-2.16,3.81C149.22,85.15,152.09,85.21,154.97,85.27z"/> +<linearGradient id="SVGID_148_" gradientUnits="userSpaceOnUse" x1="-167.1416" y1="-266.5391" x2="-162.7549" y2="-258.941" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_148_)" d="M152.82,77.67c0.72-1.27,1.44-2.55,2.16-3.83c-0.72-1.3-1.43-2.6-2.15-3.9 + c-1.44-0.02-2.87-0.05-4.31-0.08c-0.72,1.27-1.44,2.54-2.16,3.81c0.72,1.3,1.43,2.6,2.15,3.9 + C149.95,77.61,151.38,77.64,152.82,77.67z"/> +<linearGradient id="SVGID_149_" gradientUnits="userSpaceOnUse" x1="-167.1562" y1="-277.959" x2="-162.7646" y2="-270.3525" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_149_)" d="M152.83,66.25c0.72-1.28,1.44-2.55,2.16-3.83c-0.72-1.3-1.43-2.6-2.15-3.89 + c-1.43-0.02-2.87-0.04-4.3-0.06c-0.72,1.27-1.44,2.55-2.16,3.82c0.72,1.3,1.43,2.6,2.15,3.9C149.96,66.2,151.39,66.23,152.83,66.25z + "/> +<linearGradient id="SVGID_150_" gradientUnits="userSpaceOnUse" x1="-167.168" y1="-289.3774" x2="-162.772" y2="-281.7634" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_150_)" d="M152.84,54.83c0.72-1.28,1.44-2.56,2.15-3.84c-0.71-1.29-1.43-2.59-2.15-3.89 + c-1.43-0.02-2.87-0.04-4.3-0.05c-0.72,1.28-1.44,2.55-2.16,3.83c0.72,1.3,1.43,2.59,2.15,3.89 + C149.97,54.79,151.4,54.81,152.84,54.83z"/> +<linearGradient id="SVGID_151_" gradientUnits="userSpaceOnUse" x1="-167.1821" y1="-300.7969" x2="-162.7808" y2="-293.1735" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_151_)" d="M152.85,43.4c0.72-1.28,1.44-2.56,2.15-3.84c-0.71-1.3-1.43-2.59-2.15-3.88 + c-1.43-0.01-2.87-0.03-4.3-0.04c-0.72,1.28-1.44,2.56-2.16,3.83c0.71,1.3,1.43,2.59,2.15,3.88 + C149.98,43.37,151.41,43.39,152.85,43.4z"/> +<linearGradient id="SVGID_152_" gradientUnits="userSpaceOnUse" x1="-167.1958" y1="-312.2178" x2="-162.7891" y2="-304.5851" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_152_)" d="M152.86,31.98c0.72-1.28,1.44-2.57,2.15-3.85c-0.71-1.29-1.43-2.59-2.15-3.88 + c-1.43-0.01-2.87-0.02-4.3-0.03c-0.72,1.28-1.44,2.56-2.15,3.84c0.72,1.29,1.43,2.58,2.15,3.88 + C149.99,31.96,151.42,31.97,152.86,31.98z"/> +<linearGradient id="SVGID_153_" gradientUnits="userSpaceOnUse" x1="-167.21" y1="-323.6357" x2="-162.7969" y2="-315.9921" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_153_)" d="M152.87,20.56c0.72-1.29,1.43-2.57,2.15-3.86c-0.72-1.29-1.43-2.58-2.15-3.87 + c-1.43,0-2.87-0.01-4.3-0.01c-0.72,1.28-1.44,2.57-2.15,3.85c0.71,1.29,1.43,2.58,2.14,3.87C150,20.55,151.44,20.56,152.87,20.56z" + /> +<linearGradient id="SVGID_154_" gradientUnits="userSpaceOnUse" x1="-167.2231" y1="-335.0566" x2="-162.8057" y2="-327.4053" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_154_)" d="M152.88,9.14c0.72-1.29,1.43-2.57,2.15-3.86c-0.71-1.29-1.43-2.58-2.14-3.87c-1.43,0-2.86,0-4.3,0 + c-0.72,1.29-1.43,2.57-2.15,3.86c0.72,1.29,1.43,2.57,2.15,3.86C150.01,9.13,151.45,9.14,152.88,9.14z"/> +<linearGradient id="SVGID_155_" gradientUnits="userSpaceOnUse" x1="-155.8848" y1="-260.6543" x2="-151.5269" y2="-253.1062" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_155_)" d="M141.58,83.54c0.72-1.26,1.44-2.53,2.16-3.79c-0.72-1.31-1.43-2.61-2.15-3.91 + c-1.44-0.04-2.87-0.08-4.31-0.12c-0.72,1.26-1.44,2.52-2.16,3.78c0.72,1.3,1.43,2.61,2.15,3.91 + C138.7,83.45,140.14,83.5,141.58,83.54z"/> +<linearGradient id="SVGID_156_" gradientUnits="userSpaceOnUse" x1="-155.9028" y1="-272.0366" x2="-151.5381" y2="-264.4767" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_156_)" d="M141.59,72.15c0.72-1.27,1.44-2.53,2.16-3.8c-0.71-1.3-1.43-2.6-2.15-3.9 + c-1.44-0.03-2.87-0.07-4.31-0.1c-0.72,1.26-1.44,2.52-2.16,3.78c0.71,1.3,1.43,2.6,2.15,3.9C138.72,72.08,140.15,72.12,141.59,72.15 + z"/> +<linearGradient id="SVGID_157_" gradientUnits="userSpaceOnUse" x1="-155.9214" y1="-283.4185" x2="-151.5493" y2="-275.8458" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_157_)" d="M141.6,60.77c0.72-1.27,1.44-2.54,2.16-3.81c-0.71-1.3-1.43-2.6-2.15-3.89 + c-1.43-0.03-2.87-0.05-4.3-0.08c-0.72,1.27-1.44,2.53-2.16,3.8c0.71,1.3,1.43,2.6,2.15,3.89C138.73,60.71,140.17,60.74,141.6,60.77z + "/> +<linearGradient id="SVGID_158_" gradientUnits="userSpaceOnUse" x1="-155.9399" y1="-294.7988" x2="-151.5601" y2="-287.2126" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_158_)" d="M141.62,49.39c0.72-1.27,1.44-2.54,2.16-3.82c-0.72-1.29-1.43-2.59-2.15-3.88 + c-1.44-0.02-2.87-0.04-4.3-0.07c-0.72,1.27-1.44,2.54-2.16,3.81c0.71,1.29,1.43,2.59,2.14,3.88 + C138.75,49.33,140.18,49.36,141.62,49.39z"/> +<linearGradient id="SVGID_159_" gradientUnits="userSpaceOnUse" x1="-155.9604" y1="-306.1821" x2="-151.5728" y2="-298.5824" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_159_)" d="M141.63,38c0.72-1.27,1.44-2.55,2.16-3.83c-0.72-1.29-1.43-2.59-2.15-3.88 + c-1.44-0.01-2.87-0.03-4.3-0.05c-0.72,1.27-1.44,2.54-2.16,3.82c0.71,1.29,1.43,2.58,2.15,3.87C138.76,37.96,140.2,37.98,141.63,38z + "/> +<linearGradient id="SVGID_160_" gradientUnits="userSpaceOnUse" x1="-155.9785" y1="-317.5605" x2="-151.5845" y2="-309.9498" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_160_)" d="M141.65,26.62c0.72-1.28,1.44-2.55,2.16-3.83c-0.72-1.29-1.43-2.58-2.15-3.87 + c-1.43-0.01-2.87-0.02-4.3-0.03c-0.72,1.28-1.44,2.55-2.15,3.82c0.71,1.29,1.43,2.57,2.14,3.86 + C138.78,26.59,140.21,26.6,141.65,26.62z"/> +<linearGradient id="SVGID_161_" gradientUnits="userSpaceOnUse" x1="-155.9971" y1="-328.9438" x2="-151.5952" y2="-321.3196" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_161_)" d="M141.66,15.24c0.72-1.28,1.44-2.56,2.16-3.84c-0.71-1.29-1.43-2.57-2.14-3.86 + c-1.43,0-2.87-0.01-4.3-0.01c-0.72,1.28-1.44,2.56-2.15,3.83c0.71,1.28,1.43,2.57,2.14,3.85C138.79,15.22,140.23,15.23,141.66,15.24 + z"/> +<linearGradient id="SVGID_162_" gradientUnits="userSpaceOnUse" x1="-154.9106" y1="-338.3506" x2="-151.6333" y2="-332.6741" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_162_)" d="M135.24,0c0.71,1.28,1.43,2.56,2.14,3.84c1.43,0,2.87,0,4.3,0.01c0.72-1.28,1.44-2.57,2.15-3.85 + C140.96,0,138.1,0,135.24,0z"/> +<linearGradient id="SVGID_163_" gradientUnits="userSpaceOnUse" x1="-144.9844" y1="-255.7524" x2="-141.8208" y2="-250.273" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_163_)" d="M132.85,84.67c-0.72-1.31-1.43-2.61-2.15-3.91c-1.44-0.05-2.87-0.11-4.31-0.16 + c-0.72,1.25-1.44,2.49-2.16,3.74C127.11,84.45,129.98,84.56,132.85,84.67z"/> +<linearGradient id="SVGID_164_" gradientUnits="userSpaceOnUse" x1="-145.0103" y1="-267.0806" x2="-140.6787" y2="-259.5781" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_164_)" d="M130.71,77.08c0.72-1.25,1.44-2.51,2.16-3.76c-0.72-1.3-1.43-2.6-2.15-3.9 + c-1.44-0.05-2.87-0.09-4.31-0.14c-0.72,1.25-1.44,2.5-2.16,3.75c0.71,1.3,1.43,2.6,2.14,3.91 + C127.84,76.98,129.28,77.03,130.71,77.08z"/> +<linearGradient id="SVGID_165_" gradientUnits="userSpaceOnUse" x1="-145.0361" y1="-278.4165" x2="-140.6929" y2="-270.8938" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_165_)" d="M130.73,65.75c0.72-1.26,1.44-2.51,2.16-3.78c-0.72-1.3-1.43-2.59-2.15-3.89 + c-1.44-0.04-2.87-0.07-4.31-0.12c-0.72,1.25-1.44,2.51-2.16,3.76c0.71,1.29,1.43,2.59,2.15,3.89 + C127.86,65.66,129.29,65.71,130.73,65.75z"/> +<linearGradient id="SVGID_166_" gradientUnits="userSpaceOnUse" x1="-145.0601" y1="-289.7476" x2="-140.7085" y2="-282.2104" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_166_)" d="M130.75,54.41c0.72-1.26,1.44-2.52,2.16-3.79c-0.71-1.3-1.43-2.59-2.14-3.88 + c-1.44-0.03-2.87-0.06-4.3-0.09c-0.72,1.26-1.44,2.52-2.16,3.77c0.71,1.29,1.43,2.58,2.14,3.88 + C127.88,54.34,129.31,54.38,130.75,54.41z"/> +<linearGradient id="SVGID_167_" gradientUnits="userSpaceOnUse" x1="-145.0835" y1="-301.0791" x2="-140.7217" y2="-293.5242" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_167_)" d="M130.77,43.08c0.72-1.26,1.44-2.53,2.16-3.8c-0.71-1.29-1.43-2.58-2.14-3.87 + c-1.43-0.02-2.87-0.05-4.3-0.07c-0.72,1.26-1.44,2.52-2.16,3.79c0.71,1.29,1.43,2.58,2.14,3.87 + C127.9,43.02,129.33,43.05,130.77,43.08z"/> +<linearGradient id="SVGID_168_" gradientUnits="userSpaceOnUse" x1="-145.1064" y1="-312.4102" x2="-140.7358" y2="-304.8401" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_168_)" d="M130.79,31.74c0.72-1.27,1.44-2.54,2.16-3.81c-0.72-1.29-1.43-2.58-2.14-3.86 + c-1.43-0.02-2.87-0.03-4.3-0.05c-0.72,1.27-1.44,2.53-2.16,3.8c0.71,1.28,1.43,2.57,2.14,3.86 + C127.92,31.7,129.35,31.72,130.79,31.74z"/> +<linearGradient id="SVGID_169_" gradientUnits="userSpaceOnUse" x1="-145.1304" y1="-323.7427" x2="-140.75" y2="-316.1556" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_169_)" d="M130.8,20.41c0.72-1.27,1.44-2.54,2.15-3.82c-0.71-1.28-1.43-2.57-2.14-3.85 + c-1.43-0.01-2.87-0.02-4.3-0.03c-0.72,1.27-1.44,2.54-2.16,3.81c0.72,1.28,1.43,2.56,2.14,3.84 + C127.94,20.38,129.37,20.39,130.8,20.41z"/> +<linearGradient id="SVGID_170_" gradientUnits="userSpaceOnUse" x1="-145.1538" y1="-335.0757" x2="-140.7642" y2="-327.4726" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_170_)" d="M130.82,9.07c0.72-1.27,1.44-2.55,2.15-3.83c-0.71-1.28-1.43-2.56-2.14-3.84c-1.43,0-2.86,0-4.3,0 + c-0.72,1.28-1.44,2.55-2.16,3.82c0.71,1.27,1.43,2.55,2.14,3.83C127.95,9.06,129.39,9.07,130.82,9.07z"/> +<linearGradient id="SVGID_171_" gradientUnits="userSpaceOnUse" x1="-133.7466" y1="-261.4253" x2="-129.4541" y2="-253.9905" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_171_)" d="M119.47,82.71c0.72-1.24,1.44-2.48,2.16-3.72c-0.71-1.3-1.43-2.6-2.14-3.91 + c-1.43-0.06-2.87-0.12-4.3-0.19c-0.72,1.24-1.44,2.47-2.16,3.7c0.71,1.3,1.43,2.6,2.14,3.91C116.6,82.58,118.03,82.65,119.47,82.71z + "/> +<linearGradient id="SVGID_172_" gradientUnits="userSpaceOnUse" x1="-133.7759" y1="-272.6929" x2="-129.4712" y2="-265.2369" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_172_)" d="M119.49,71.44c0.72-1.24,1.44-2.48,2.16-3.73c-0.72-1.3-1.43-2.59-2.15-3.89 + c-1.43-0.05-2.87-0.1-4.3-0.16c-0.72,1.24-1.44,2.48-2.16,3.71c0.71,1.3,1.43,2.59,2.14,3.89 + C116.62,71.33,118.06,71.38,119.49,71.44z"/> +<linearGradient id="SVGID_173_" gradientUnits="userSpaceOnUse" x1="-133.8062" y1="-283.9609" x2="-129.4893" y2="-276.4839" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_173_)" d="M119.51,60.17c0.72-1.25,1.44-2.5,2.16-3.75c-0.71-1.3-1.43-2.59-2.14-3.88 + c-1.43-0.04-2.87-0.08-4.3-0.13c-0.72,1.25-1.44,2.49-2.16,3.73c0.71,1.29,1.43,2.58,2.14,3.88 + C116.64,60.07,118.08,60.12,119.51,60.17z"/> +<linearGradient id="SVGID_174_" gradientUnits="userSpaceOnUse" x1="-133.8359" y1="-295.2256" x2="-129.5078" y2="-287.7291" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_174_)" d="M119.53,48.9c0.72-1.25,1.44-2.5,2.16-3.76c-0.71-1.29-1.43-2.58-2.14-3.87 + c-1.43-0.03-2.87-0.07-4.3-0.1c-0.72,1.25-1.44,2.5-2.16,3.74c0.71,1.29,1.43,2.57,2.14,3.86C116.66,48.82,118.1,48.86,119.53,48.9z + "/> +<linearGradient id="SVGID_175_" gradientUnits="userSpaceOnUse" x1="-133.8643" y1="-306.4946" x2="-129.5234" y2="-298.9761" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_175_)" d="M119.56,37.63c0.72-1.25,1.44-2.51,2.15-3.77c-0.71-1.29-1.43-2.57-2.14-3.85 + c-1.43-0.02-2.87-0.05-4.3-0.07c-0.72,1.26-1.44,2.51-2.16,3.76c0.71,1.28,1.43,2.56,2.14,3.85 + C116.69,37.56,118.12,37.6,119.56,37.63z"/> +<linearGradient id="SVGID_176_" gradientUnits="userSpaceOnUse" x1="-133.8916" y1="-317.7617" x2="-129.5396" y2="-310.2238" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_176_)" d="M119.58,26.35c0.72-1.26,1.44-2.52,2.16-3.79c-0.71-1.28-1.43-2.56-2.14-3.84 + c-1.43-0.02-2.87-0.03-4.3-0.05c-0.72,1.26-1.44,2.52-2.16,3.78c0.71,1.28,1.43,2.55,2.14,3.83 + C116.71,26.31,118.14,26.33,119.58,26.35z"/> +<linearGradient id="SVGID_177_" gradientUnits="userSpaceOnUse" x1="-133.9194" y1="-329.0303" x2="-129.5552" y2="-321.4712" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_177_)" d="M119.6,15.08c0.72-1.27,1.44-2.53,2.16-3.8c-0.71-1.28-1.43-2.55-2.14-3.83 + c-1.43,0-2.87-0.01-4.3-0.02c-0.72,1.27-1.44,2.53-2.15,3.79c0.71,1.27,1.43,2.54,2.14,3.82C116.73,15.06,118.16,15.07,119.6,15.08z + "/> +<linearGradient id="SVGID_178_" gradientUnits="userSpaceOnUse" x1="-132.8477" y1="-338.3555" x2="-129.5874" y2="-332.7086" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_178_)" d="M113.18,0c0.71,1.27,1.42,2.53,2.14,3.8c1.43,0,2.87,0,4.3,0.01c0.72-1.27,1.44-2.54,2.16-3.81 + C118.91,0,116.05,0,113.18,0z"/> +<linearGradient id="SVGID_179_" gradientUnits="userSpaceOnUse" x1="-122.8516" y1="-256.7583" x2="-119.7583" y2="-251.4006" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_179_)" d="M110.75,83.67c-0.72-1.3-1.43-2.61-2.14-3.9c-1.43-0.08-2.87-0.15-4.3-0.24 + c-0.72,1.22-1.44,2.44-2.16,3.65C105.01,83.35,107.88,83.52,110.75,83.67z"/> +<linearGradient id="SVGID_180_" gradientUnits="userSpaceOnUse" x1="-122.8828" y1="-267.9502" x2="-118.6206" y2="-260.5678" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_180_)" d="M108.62,76.14c0.72-1.23,1.44-2.46,2.16-3.69c-0.71-1.3-1.43-2.59-2.14-3.89 + c-1.44-0.07-2.87-0.13-4.3-0.2c-0.72,1.22-1.44,2.45-2.16,3.67c0.72,1.29,1.43,2.59,2.14,3.89C105.75,76,107.18,76.07,108.62,76.14z + "/> +<linearGradient id="SVGID_181_" gradientUnits="userSpaceOnUse" x1="-122.916" y1="-279.1445" x2="-118.6392" y2="-271.7368" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_181_)" d="M108.64,64.95c0.72-1.23,1.44-2.47,2.16-3.7c-0.71-1.29-1.43-2.59-2.14-3.88 + c-1.43-0.05-2.87-0.11-4.3-0.17c-0.72,1.23-1.44,2.46-2.16,3.68c0.71,1.29,1.43,2.58,2.14,3.87 + C105.77,64.82,107.21,64.89,108.64,64.95z"/> +<linearGradient id="SVGID_182_" gradientUnits="userSpaceOnUse" x1="-122.9473" y1="-290.3364" x2="-118.6567" y2="-282.905" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_182_)" d="M108.67,53.75c0.72-1.24,1.44-2.48,2.16-3.72c-0.71-1.29-1.43-2.57-2.14-3.86 + c-1.43-0.04-2.87-0.09-4.3-0.13c-0.72,1.24-1.44,2.47-2.16,3.7c0.71,1.28,1.43,2.57,2.14,3.85C105.8,53.65,107.23,53.7,108.67,53.75 + z"/> +<linearGradient id="SVGID_183_" gradientUnits="userSpaceOnUse" x1="-122.98" y1="-301.5293" x2="-118.6748" y2="-294.0725" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_183_)" d="M108.69,42.55c0.72-1.24,1.44-2.49,2.16-3.73c-0.71-1.28-1.43-2.56-2.14-3.84 + c-1.43-0.03-2.87-0.07-4.3-0.1c-0.72,1.24-1.44,2.48-2.16,3.72c0.71,1.28,1.43,2.55,2.14,3.84 + C105.82,42.47,107.25,42.51,108.69,42.55z"/> +<linearGradient id="SVGID_184_" gradientUnits="userSpaceOnUse" x1="-123.0132" y1="-312.7188" x2="-118.6953" y2="-305.24" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_184_)" d="M108.71,31.35c0.72-1.25,1.44-2.5,2.16-3.75c-0.71-1.28-1.43-2.55-2.14-3.82 + c-1.43-0.02-2.87-0.05-4.3-0.07c-0.72,1.25-1.44,2.49-2.16,3.73c0.71,1.27,1.43,2.54,2.14,3.82 + C105.85,31.29,107.28,31.33,108.71,31.35z"/> +<linearGradient id="SVGID_185_" gradientUnits="userSpaceOnUse" x1="-123.0459" y1="-323.9121" x2="-118.7134" y2="-316.408" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_185_)" d="M108.74,20.16c0.72-1.25,1.44-2.51,2.16-3.76c-0.71-1.27-1.43-2.54-2.14-3.81 + c-1.43-0.01-2.87-0.02-4.3-0.04c-0.72,1.26-1.44,2.5-2.16,3.75c0.71,1.26,1.43,2.53,2.14,3.8C105.87,20.12,107.3,20.14,108.74,20.16 + z"/> +<linearGradient id="SVGID_186_" gradientUnits="userSpaceOnUse" x1="-123.0781" y1="-335.1045" x2="-118.7324" y2="-327.5775" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_186_)" d="M108.76,8.96c0.72-1.26,1.44-2.52,2.16-3.78c-0.71-1.26-1.43-2.53-2.14-3.79c-1.43,0-2.87,0-4.3,0 + c-0.72,1.26-1.44,2.51-2.16,3.77c0.71,1.26,1.43,2.52,2.14,3.78C105.9,8.94,107.33,8.95,108.76,8.96z"/> +<linearGradient id="SVGID_187_" gradientUnits="userSpaceOnUse" x1="-111.6235" y1="-262.5454" x2="-107.4111" y2="-255.2493" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_187_)" d="M97.38,81.5c0.72-1.21,1.44-2.41,2.16-3.63c-0.71-1.3-1.43-2.59-2.14-3.88 + c-1.44-0.08-2.87-0.17-4.3-0.25c-0.72,1.21-1.44,2.41-2.16,3.61c0.71,1.29,1.42,2.59,2.14,3.88C94.51,81.32,95.95,81.41,97.38,81.5z + "/> +<linearGradient id="SVGID_188_" gradientUnits="userSpaceOnUse" x1="-111.6582" y1="-273.647" x2="-107.4292" y2="-266.3221" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_188_)" d="M97.41,70.4c0.72-1.21,1.44-2.43,2.16-3.65c-0.71-1.29-1.43-2.58-2.14-3.87 + c-1.43-0.07-2.87-0.14-4.3-0.22c-0.72,1.21-1.44,2.42-2.16,3.62c0.71,1.29,1.43,2.57,2.14,3.86C94.54,70.24,95.97,70.32,97.41,70.4z + "/> +<linearGradient id="SVGID_189_" gradientUnits="userSpaceOnUse" x1="-111.6929" y1="-284.749" x2="-107.4473" y2="-277.3954" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_189_)" d="M97.43,59.29c0.72-1.22,1.44-2.44,2.16-3.67c-0.71-1.28-1.43-2.57-2.14-3.85 + c-1.43-0.06-2.87-0.12-4.3-0.18c-0.72,1.22-1.44,2.43-2.16,3.65c0.71,1.28,1.43,2.56,2.14,3.84C94.57,59.16,96,59.22,97.43,59.29z" + /> +<linearGradient id="SVGID_190_" gradientUnits="userSpaceOnUse" x1="-111.7285" y1="-295.8501" x2="-107.4668" y2="-288.4686" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_190_)" d="M97.46,48.18c0.72-1.22,1.44-2.45,2.16-3.68c-0.71-1.28-1.43-2.55-2.14-3.83 + c-1.43-0.05-2.87-0.09-4.3-0.14c-0.72,1.22-1.44,2.45-2.16,3.67c0.71,1.27,1.43,2.55,2.14,3.82C94.59,48.07,96.03,48.13,97.46,48.18 + z"/> +<linearGradient id="SVGID_191_" gradientUnits="userSpaceOnUse" x1="-111.7642" y1="-306.9541" x2="-107.4854" y2="-299.543" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_191_)" d="M97.49,37.08c0.72-1.23,1.44-2.46,2.16-3.7c-0.71-1.27-1.42-2.54-2.14-3.81 + c-1.43-0.03-2.87-0.06-4.3-0.1c-0.72,1.23-1.44,2.46-2.16,3.68c0.71,1.27,1.43,2.53,2.14,3.8C94.62,36.99,96.05,37.04,97.49,37.08z" + /> +<linearGradient id="SVGID_192_" gradientUnits="userSpaceOnUse" x1="-111.7983" y1="-318.0527" x2="-107.5044" y2="-310.6154" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_192_)" d="M97.51,25.97c0.72-1.24,1.44-2.48,2.16-3.72c-0.72-1.27-1.43-2.53-2.14-3.79 + c-1.43-0.02-2.87-0.04-4.3-0.06c-0.72,1.24-1.44,2.47-2.16,3.7c0.71,1.26,1.43,2.52,2.14,3.78C94.65,25.91,96.08,25.94,97.51,25.97z + "/> +<linearGradient id="SVGID_193_" gradientUnits="userSpaceOnUse" x1="-111.8354" y1="-329.1562" x2="-107.5239" y2="-321.6885" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_193_)" d="M97.54,14.86c0.72-1.25,1.44-2.49,2.16-3.74c-0.71-1.26-1.43-2.52-2.14-3.78 + c-1.43-0.01-2.87-0.01-4.3-0.02c-0.72,1.24-1.44,2.49-2.16,3.72c0.71,1.25,1.42,2.51,2.14,3.76C94.67,14.83,96.11,14.85,97.54,14.86 + z"/> +<linearGradient id="SVGID_194_" gradientUnits="userSpaceOnUse" x1="-110.7812" y1="-338.3633" x2="-107.5464" y2="-332.7603" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_194_)" d="M91.13,0c0.71,1.25,1.43,2.5,2.14,3.74c1.43,0,2.87,0.01,4.3,0.01C98.28,2.51,99,1.25,99.72,0 + C96.86,0,93.99,0,91.13,0z"/> +<linearGradient id="SVGID_195_" gradientUnits="userSpaceOnUse" x1="-100.7314" y1="-258.1406" x2="-97.7163" y2="-252.9183" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_195_)" d="M88.67,82.29c-0.71-1.3-1.43-2.59-2.14-3.88c-1.43-0.1-2.87-0.2-4.3-0.31 + c-0.72,1.18-1.44,2.37-2.16,3.54C82.94,81.87,85.8,82.08,88.67,82.29z"/> +<linearGradient id="SVGID_196_" gradientUnits="userSpaceOnUse" x1="-100.7686" y1="-269.1406" x2="-96.5928" y2="-261.908" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_196_)" d="M86.54,74.85c0.72-1.19,1.44-2.39,2.16-3.59c-0.71-1.29-1.43-2.57-2.14-3.86 + c-1.43-0.09-2.87-0.17-4.3-0.26c-0.72,1.19-1.44,2.38-2.16,3.56c0.71,1.28,1.43,2.57,2.14,3.85C83.67,74.66,85.11,74.75,86.54,74.85 + z"/> +<linearGradient id="SVGID_197_" gradientUnits="userSpaceOnUse" x1="-100.8052" y1="-280.1421" x2="-96.6094" y2="-272.8748" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_197_)" d="M86.57,63.84c0.72-1.2,1.44-2.4,2.16-3.61c-0.71-1.28-1.43-2.56-2.14-3.84 + c-1.43-0.07-2.87-0.15-4.3-0.22c-0.72,1.2-1.44,2.39-2.16,3.59c0.71,1.27,1.43,2.55,2.14,3.83C83.7,63.68,85.13,63.76,86.57,63.84z" + /> +<linearGradient id="SVGID_198_" gradientUnits="userSpaceOnUse" x1="-100.8433" y1="-291.1426" x2="-96.6304" y2="-283.8456" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_198_)" d="M86.6,52.84c0.72-1.21,1.44-2.42,2.16-3.63c-0.71-1.27-1.43-2.54-2.14-3.82 + c-1.43-0.06-2.87-0.12-4.3-0.18c-0.72,1.21-1.44,2.41-2.16,3.61c0.71,1.27,1.43,2.54,2.14,3.81C83.73,52.7,85.16,52.77,86.6,52.84z" + /> +<linearGradient id="SVGID_199_" gradientUnits="userSpaceOnUse" x1="-100.8804" y1="-302.145" x2="-96.6479" y2="-294.8142" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_199_)" d="M86.62,41.83c0.72-1.21,1.44-2.43,2.16-3.65c-0.71-1.27-1.43-2.53-2.14-3.8 + c-1.43-0.04-2.87-0.09-4.3-0.13c-0.72,1.21-1.44,2.43-2.16,3.63c0.71,1.26,1.43,2.52,2.14,3.79C83.76,41.72,85.19,41.78,86.62,41.83 + z"/> +<linearGradient id="SVGID_200_" gradientUnits="userSpaceOnUse" x1="-100.9175" y1="-313.145" x2="-96.667" y2="-305.783" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_200_)" d="M86.65,30.82c0.72-1.22,1.44-2.44,2.16-3.67c-0.71-1.26-1.43-2.52-2.14-3.78 + c-1.43-0.03-2.87-0.06-4.3-0.09c-0.72,1.22-1.44,2.44-2.16,3.65c0.71,1.25,1.43,2.51,2.14,3.76C83.79,30.74,85.22,30.78,86.65,30.82 + z"/> +<linearGradient id="SVGID_201_" gradientUnits="userSpaceOnUse" x1="-100.9561" y1="-324.1465" x2="-96.6865" y2="-316.7514" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_201_)" d="M86.68,19.82c0.72-1.23,1.44-2.46,2.16-3.69c-0.71-1.25-1.43-2.5-2.14-3.75 + c-1.43-0.02-2.87-0.03-4.3-0.05c-0.72,1.23-1.44,2.46-2.16,3.67c0.71,1.25,1.43,2.49,2.14,3.74C83.81,19.77,85.25,19.79,86.68,19.82 + z"/> +<linearGradient id="SVGID_202_" gradientUnits="userSpaceOnUse" x1="-100.9922" y1="-335.146" x2="-96.7056" y2="-327.7213" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_202_)" d="M86.71,8.81c0.72-1.24,1.44-2.47,2.16-3.71c-0.71-1.25-1.43-2.49-2.14-3.73 + c-1.43,0-2.86,0-4.3-0.01c-0.72,1.23-1.44,2.47-2.16,3.7c0.71,1.24,1.42,2.48,2.14,3.72C83.84,8.79,85.27,8.8,86.71,8.81z"/> +<linearGradient id="SVGID_203_" gradientUnits="userSpaceOnUse" x1="-89.5137" y1="-264.0156" x2="-85.3979" y2="-256.887" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_203_)" d="M75.32,79.91c0.72-1.17,1.44-2.34,2.16-3.52c-0.71-1.28-1.43-2.57-2.14-3.85 + c-1.43-0.11-2.87-0.21-4.3-0.32c-0.72,1.17-1.44,2.33-2.16,3.49c0.71,1.28,1.42,2.56,2.14,3.84C72.45,79.68,73.88,79.8,75.32,79.91z + "/> +<linearGradient id="SVGID_204_" gradientUnits="userSpaceOnUse" x1="-89.5513" y1="-274.9004" x2="-85.4146" y2="-267.7354" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_204_)" d="M75.34,69.02c0.72-1.18,1.44-2.36,2.16-3.54c-0.71-1.28-1.42-2.55-2.14-3.82 + c-1.43-0.09-2.87-0.18-4.3-0.27c-0.72,1.17-1.44,2.35-2.16,3.52c0.71,1.27,1.42,2.54,2.14,3.82C72.48,68.82,73.91,68.92,75.34,69.02 + z"/> +<linearGradient id="SVGID_205_" gradientUnits="userSpaceOnUse" x1="-89.5903" y1="-285.7837" x2="-85.4336" y2="-278.584" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_205_)" d="M75.37,58.13c0.72-1.19,1.44-2.37,2.16-3.57c-0.71-1.27-1.43-2.54-2.14-3.8 + c-1.43-0.08-2.86-0.15-4.3-0.23c-0.72,1.18-1.44,2.37-2.16,3.54c0.71,1.26,1.43,2.53,2.14,3.79C72.51,57.96,73.94,58.05,75.37,58.13 + z"/> +<linearGradient id="SVGID_206_" gradientUnits="userSpaceOnUse" x1="-89.6284" y1="-296.668" x2="-85.4502" y2="-289.4311" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_206_)" d="M75.4,47.24c0.72-1.19,1.44-2.39,2.16-3.59c-0.71-1.26-1.43-2.52-2.14-3.78 + c-1.43-0.06-2.86-0.12-4.3-0.18c-0.72,1.19-1.44,2.38-2.16,3.57c0.71,1.25,1.43,2.51,2.14,3.77C72.53,47.1,73.97,47.17,75.4,47.24z" + /> +<linearGradient id="SVGID_207_" gradientUnits="userSpaceOnUse" x1="-89.6689" y1="-307.5522" x2="-85.4692" y2="-300.2781" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_207_)" d="M75.43,36.35c0.72-1.2,1.44-2.41,2.16-3.61c-0.71-1.25-1.42-2.51-2.14-3.75 + c-1.43-0.04-2.87-0.08-4.3-0.13c-0.72,1.2-1.44,2.4-2.16,3.59c0.71,1.25,1.42,2.49,2.14,3.74C72.56,36.25,73.99,36.3,75.43,36.35z" + /> +<linearGradient id="SVGID_208_" gradientUnits="userSpaceOnUse" x1="-89.7065" y1="-318.436" x2="-85.4863" y2="-311.1264" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_208_)" d="M75.46,25.46c0.72-1.21,1.44-2.42,2.16-3.64c-0.71-1.24-1.43-2.49-2.14-3.73 + c-1.43-0.02-2.87-0.05-4.3-0.08c-0.72,1.21-1.44,2.41-2.16,3.61c0.71,1.24,1.43,2.48,2.14,3.72C72.59,25.39,74.02,25.43,75.46,25.46 + z"/> +<linearGradient id="SVGID_209_" gradientUnits="userSpaceOnUse" x1="-89.7466" y1="-329.3203" x2="-85.5044" y2="-321.9726" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_209_)" d="M75.48,14.57c0.72-1.22,1.44-2.44,2.16-3.66c-0.71-1.24-1.43-2.47-2.14-3.71 + c-1.43-0.01-2.87-0.02-4.3-0.03c-0.72,1.22-1.44,2.43-2.16,3.64c0.71,1.23,1.43,2.46,2.14,3.69C72.62,14.53,74.05,14.55,75.48,14.57 + z"/> +<linearGradient id="SVGID_210_" gradientUnits="userSpaceOnUse" x1="-88.7231" y1="-338.3652" x2="-85.522" y2="-332.8206" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_210_)" d="M69.07,0c0.71,1.22,1.43,2.44,2.14,3.67c1.43,0.01,2.87,0.01,4.3,0.02 + c0.72-1.23,1.44-2.45,2.16-3.68C74.8,0,71.94,0,69.07,0z"/> +<linearGradient id="SVGID_211_" gradientUnits="userSpaceOnUse" x1="-78.6309" y1="-259.8955" x2="-75.7031" y2="-254.8245" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_211_)" d="M66.62,80.52c-0.71-1.28-1.43-2.56-2.14-3.83c-1.43-0.13-2.86-0.25-4.29-0.38 + c-0.72,1.14-1.44,2.28-2.15,3.42C60.89,80,63.75,80.26,66.62,80.52z"/> +<linearGradient id="SVGID_212_" gradientUnits="userSpaceOnUse" x1="-78.6694" y1="-270.6533" x2="-74.5952" y2="-263.5966" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_212_)" d="M64.49,73.2c0.72-1.15,1.44-2.31,2.16-3.47c-0.71-1.27-1.43-2.54-2.14-3.81 + c-1.43-0.11-2.86-0.21-4.29-0.33c-0.72,1.15-1.44,2.3-2.15,3.45c0.71,1.26,1.42,2.53,2.14,3.8C61.63,72.96,63.06,73.08,64.49,73.2z" + /> +<linearGradient id="SVGID_213_" gradientUnits="userSpaceOnUse" x1="-78.7085" y1="-281.4111" x2="-74.6104" y2="-274.3129" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_213_)" d="M64.52,62.44c0.72-1.16,1.44-2.33,2.16-3.5c-0.71-1.26-1.42-2.52-2.14-3.78 + c-1.43-0.09-2.86-0.18-4.3-0.27c-0.72,1.16-1.44,2.32-2.15,3.47c0.71,1.25,1.42,2.51,2.14,3.77C61.65,62.23,63.08,62.33,64.52,62.44 + z"/> +<linearGradient id="SVGID_214_" gradientUnits="userSpaceOnUse" x1="-78.7466" y1="-292.1685" x2="-74.6265" y2="-285.0322" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_214_)" d="M64.54,51.67c0.72-1.17,1.44-2.35,2.16-3.53c-0.71-1.25-1.42-2.51-2.14-3.75 + c-1.43-0.07-2.86-0.15-4.3-0.22c-0.72,1.17-1.44,2.34-2.16,3.5c0.71,1.24,1.42,2.49,2.14,3.75C61.68,51.5,63.11,51.59,64.54,51.67z" + /> +<linearGradient id="SVGID_215_" gradientUnits="userSpaceOnUse" x1="-78.7861" y1="-302.9268" x2="-74.6421" y2="-295.7491" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_215_)" d="M64.57,40.91c0.72-1.18,1.44-2.36,2.16-3.55c-0.71-1.25-1.43-2.49-2.14-3.73 + c-1.43-0.05-2.86-0.11-4.29-0.17c-0.72,1.18-1.44,2.36-2.16,3.53c0.71,1.24,1.43,2.48,2.14,3.72 + C61.71,40.77,63.14,40.84,64.57,40.91z"/> +<linearGradient id="SVGID_216_" gradientUnits="userSpaceOnUse" x1="-78.8252" y1="-313.6831" x2="-74.6592" y2="-306.4673" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_216_)" d="M64.6,30.14c0.72-1.19,1.44-2.38,2.16-3.58c-0.71-1.24-1.43-2.47-2.14-3.7 + c-1.43-0.04-2.86-0.08-4.3-0.11c-0.72,1.19-1.44,2.37-2.16,3.55c0.71,1.23,1.42,2.46,2.14,3.69C61.74,30.04,63.17,30.09,64.6,30.14z + "/> +<linearGradient id="SVGID_217_" gradientUnits="userSpaceOnUse" x1="-78.8643" y1="-324.4409" x2="-74.6738" y2="-317.1829" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_217_)" d="M64.63,19.38c0.72-1.2,1.44-2.4,2.16-3.6c-0.71-1.23-1.43-2.46-2.14-3.68 + c-1.43-0.02-2.86-0.04-4.3-0.06c-0.72,1.2-1.44,2.39-2.16,3.58c0.71,1.22,1.43,2.44,2.14,3.66C61.76,19.32,63.19,19.35,64.63,19.38z + "/> +<linearGradient id="SVGID_218_" gradientUnits="userSpaceOnUse" x1="-78.9038" y1="-335.1973" x2="-74.6914" y2="-327.9012" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_218_)" d="M64.65,8.62c0.72-1.21,1.44-2.42,2.16-3.63c-0.71-1.22-1.43-2.44-2.14-3.65 + c-1.43,0-2.87,0-4.3-0.01c-0.72,1.21-1.44,2.41-2.16,3.61c0.71,1.21,1.42,2.42,2.14,3.63C61.79,8.59,63.22,8.6,64.65,8.62z"/> +<linearGradient id="SVGID_219_" gradientUnits="userSpaceOnUse" x1="-67.4243" y1="-265.8389" x2="-63.4219" y2="-258.9064" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_219_)" d="M53.28,77.94c0.72-1.13,1.44-2.26,2.15-3.39c-0.71-1.27-1.42-2.53-2.14-3.79 + c-1.43-0.13-2.86-0.26-4.29-0.39c-0.72,1.13-1.43,2.25-2.15,3.36c0.71,1.26,1.42,2.52,2.14,3.78C50.42,77.66,51.85,77.8,53.28,77.94 + z"/> +<linearGradient id="SVGID_220_" gradientUnits="userSpaceOnUse" x1="-67.4619" y1="-276.4507" x2="-63.4351" y2="-269.476" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_220_)" d="M53.3,67.32c0.72-1.14,1.44-2.28,2.15-3.42c-0.71-1.26-1.43-2.51-2.14-3.76 + c-1.43-0.11-2.86-0.22-4.29-0.33c-0.72,1.13-1.44,2.27-2.15,3.39c0.71,1.25,1.42,2.5,2.13,3.75C50.44,67.07,51.88,67.2,53.3,67.32z" + /> +<linearGradient id="SVGID_221_" gradientUnits="userSpaceOnUse" x1="-67.4995" y1="-287.0659" x2="-63.4458" y2="-280.0447" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_221_)" d="M53.33,56.7c0.72-1.15,1.44-2.3,2.15-3.45c-0.71-1.25-1.42-2.49-2.14-3.73 + c-1.43-0.09-2.86-0.18-4.29-0.27c-0.72,1.14-1.44,2.28-2.15,3.42c0.71,1.24,1.43,2.48,2.14,3.72C50.47,56.49,51.9,56.59,53.33,56.7z + "/> +<linearGradient id="SVGID_222_" gradientUnits="userSpaceOnUse" x1="-67.5376" y1="-297.6787" x2="-63.46" y2="-290.616" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_222_)" d="M53.36,46.08c0.72-1.16,1.44-2.32,2.15-3.48c-0.71-1.24-1.43-2.47-2.14-3.71 + c-1.43-0.07-2.86-0.14-4.29-0.21c-0.72,1.16-1.44,2.31-2.16,3.45c0.71,1.23,1.42,2.46,2.14,3.69 + C50.49,45.91,51.93,45.99,53.36,46.08z"/> +<linearGradient id="SVGID_223_" gradientUnits="userSpaceOnUse" x1="-67.5767" y1="-308.2935" x2="-63.4722" y2="-301.1843" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_223_)" d="M53.38,35.46c0.72-1.17,1.44-2.33,2.16-3.51c-0.71-1.23-1.42-2.46-2.14-3.68 + c-1.43-0.05-2.86-0.1-4.29-0.15c-0.72,1.16-1.44,2.32-2.16,3.48c0.71,1.22,1.42,2.44,2.14,3.66C50.52,35.33,51.95,35.39,53.38,35.46 + z"/> +<linearGradient id="SVGID_224_" gradientUnits="userSpaceOnUse" x1="-67.6147" y1="-318.9062" x2="-63.4854" y2="-311.7539" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_224_)" d="M53.41,24.83c0.72-1.17,1.44-2.35,2.16-3.54c-0.71-1.22-1.42-2.43-2.14-3.65 + c-1.43-0.03-2.86-0.06-4.29-0.1c-0.72,1.17-1.44,2.34-2.16,3.51c0.71,1.21,1.43,2.42,2.14,3.63C50.54,24.74,51.98,24.79,53.41,24.83 + z"/> +<linearGradient id="SVGID_225_" gradientUnits="userSpaceOnUse" x1="-67.6523" y1="-329.52" x2="-63.4971" y2="-322.3229" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_225_)" d="M53.43,14.21c0.72-1.19,1.44-2.37,2.16-3.57c-0.71-1.21-1.42-2.42-2.14-3.62 + c-1.43-0.01-2.86-0.03-4.3-0.04c-0.72,1.19-1.44,2.37-2.16,3.54c0.71,1.2,1.43,2.4,2.14,3.6C50.57,14.16,52,14.19,53.43,14.21z"/> +<linearGradient id="SVGID_226_" gradientUnits="userSpaceOnUse" x1="-66.6709" y1="-338.3662" x2="-63.5103" y2="-332.8918" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_226_)" d="M47.02,0c0.71,1.19,1.43,2.38,2.14,3.57c1.43,0,2.87,0.01,4.3,0.02C54.18,2.4,54.89,1.2,55.62,0 + C52.75,0,49.89,0,47.02,0z"/> +<linearGradient id="SVGID_227_" gradientUnits="userSpaceOnUse" x1="-56.5552" y1="-262.0264" x2="-53.7236" y2="-257.122" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_227_)" d="M44.6,78.36c-0.71-1.26-1.42-2.52-2.14-3.77c-1.43-0.15-2.86-0.3-4.29-0.45 + c-0.72,1.1-1.43,2.19-2.15,3.28C38.88,77.73,41.74,78.05,44.6,78.36z"/> +<linearGradient id="SVGID_228_" gradientUnits="userSpaceOnUse" x1="-56.5918" y1="-272.4888" x2="-52.6367" y2="-265.6384" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_228_)" d="M42.47,71.2c0.72-1.11,1.43-2.22,2.15-3.34c-0.71-1.25-1.42-2.5-2.14-3.74 + c-1.43-0.13-2.86-0.26-4.29-0.39c-0.71,1.11-1.43,2.21-2.15,3.31c0.71,1.24,1.42,2.48,2.13,3.73C39.61,70.91,41.04,71.05,42.47,71.2 + z"/> +<linearGradient id="SVGID_229_" gradientUnits="userSpaceOnUse" x1="-56.627" y1="-282.9502" x2="-52.644" y2="-276.0516" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_229_)" d="M42.49,60.73c0.72-1.12,1.43-2.24,2.15-3.37c-0.71-1.24-1.42-2.48-2.14-3.71 + c-1.43-0.11-2.86-0.21-4.29-0.33c-0.71,1.12-1.43,2.23-2.15,3.34c0.71,1.23,1.42,2.46,2.13,3.7C39.63,60.48,41.06,60.6,42.49,60.73z + "/> +<linearGradient id="SVGID_230_" gradientUnits="userSpaceOnUse" x1="-56.6636" y1="-293.4126" x2="-52.6523" y2="-286.4649" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_230_)" d="M42.51,50.26c0.72-1.13,1.44-2.26,2.15-3.4c-0.71-1.23-1.43-2.46-2.14-3.68 + c-1.43-0.09-2.86-0.17-4.29-0.26c-0.72,1.13-1.43,2.25-2.15,3.38c0.71,1.22,1.43,2.44,2.14,3.66 + C39.65,50.05,41.08,50.16,42.51,50.26z"/> +<linearGradient id="SVGID_231_" gradientUnits="userSpaceOnUse" x1="-56.7002" y1="-303.875" x2="-52.6606" y2="-296.8783" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_231_)" d="M42.54,39.79c0.72-1.14,1.44-2.29,2.15-3.43c-0.71-1.22-1.42-2.44-2.14-3.65 + c-1.43-0.06-2.86-0.13-4.29-0.2c-0.72,1.14-1.43,2.28-2.15,3.41c0.71,1.21,1.42,2.42,2.14,3.63C39.68,39.63,41.11,39.71,42.54,39.79 + z"/> +<linearGradient id="SVGID_232_" gradientUnits="userSpaceOnUse" x1="-56.7358" y1="-314.3369" x2="-52.668" y2="-307.2912" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_232_)" d="M42.56,29.32c0.72-1.15,1.44-2.31,2.15-3.46c-0.71-1.21-1.43-2.41-2.14-3.62 + c-1.43-0.04-2.86-0.09-4.3-0.13c-0.72,1.15-1.43,2.3-2.15,3.44c0.71,1.2,1.43,2.4,2.14,3.6C39.7,29.2,41.13,29.26,42.56,29.32z"/> +<linearGradient id="SVGID_233_" gradientUnits="userSpaceOnUse" x1="-56.7715" y1="-324.7979" x2="-52.6758" y2="-317.7039" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_233_)" d="M42.58,18.85c0.72-1.16,1.44-2.33,2.15-3.5c-0.71-1.2-1.42-2.39-2.14-3.59 + c-1.43-0.02-2.87-0.05-4.3-0.07c-0.72,1.16-1.44,2.32-2.15,3.47c0.71,1.19,1.43,2.37,2.14,3.57C39.72,18.77,41.15,18.81,42.58,18.85 + z"/> +<linearGradient id="SVGID_234_" gradientUnits="userSpaceOnUse" x1="-56.8086" y1="-335.2598" x2="-52.686" y2="-328.1193" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_234_)" d="M42.6,8.38c0.72-1.17,1.44-2.35,2.16-3.53c-0.71-1.19-1.43-2.38-2.14-3.56c-1.43,0-2.86,0-4.3-0.01 + c-0.72,1.17-1.44,2.34-2.15,3.5c0.71,1.17,1.43,2.35,2.14,3.53C39.74,8.34,41.17,8.36,42.6,8.38z"/> +<linearGradient id="SVGID_235_" gradientUnits="userSpaceOnUse" x1="-45.3628" y1="-268.0112" x2="-41.4912" y2="-261.3055" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_235_)" d="M31.28,75.58c0.72-1.08,1.43-2.16,2.15-3.25c-0.71-1.24-1.42-2.48-2.14-3.72 + c-1.43-0.15-2.85-0.3-4.28-0.46c-0.72,1.08-1.43,2.15-2.14,3.21c0.71,1.23,1.42,2.47,2.13,3.71C28.43,75.25,29.85,75.42,31.28,75.58 + z"/> +<linearGradient id="SVGID_236_" gradientUnits="userSpaceOnUse" x1="-45.395" y1="-278.3027" x2="-41.4917" y2="-271.542" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_236_)" d="M31.3,65.28c0.72-1.09,1.43-2.18,2.15-3.28c-0.71-1.23-1.42-2.46-2.14-3.69 + c-1.43-0.13-2.86-0.26-4.29-0.39c-0.72,1.09-1.43,2.17-2.15,3.25c0.71,1.22,1.42,2.44,2.13,3.67C28.44,64.99,29.87,65.14,31.3,65.28 + z"/> +<linearGradient id="SVGID_237_" gradientUnits="userSpaceOnUse" x1="-45.4272" y1="-288.5952" x2="-41.4937" y2="-281.782" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_237_)" d="M31.32,54.98c0.72-1.1,1.43-2.21,2.15-3.32c-0.71-1.22-1.42-2.44-2.14-3.65 + c-1.43-0.11-2.86-0.21-4.29-0.32c-0.71,1.1-1.43,2.19-2.15,3.28c0.71,1.21,1.43,2.42,2.14,3.64C28.46,54.74,29.89,54.86,31.32,54.98 + z"/> +<linearGradient id="SVGID_238_" gradientUnits="userSpaceOnUse" x1="-45.459" y1="-298.8857" x2="-41.4961" y2="-292.0218" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_238_)" d="M31.33,44.68c0.72-1.11,1.43-2.23,2.15-3.35c-0.71-1.21-1.42-2.41-2.14-3.62 + c-1.43-0.08-2.86-0.17-4.29-0.25c-0.72,1.11-1.43,2.22-2.15,3.32c0.71,1.2,1.43,2.4,2.14,3.6C28.48,44.49,29.91,44.58,31.33,44.68z" + /> +<linearGradient id="SVGID_239_" gradientUnits="userSpaceOnUse" x1="-45.4922" y1="-309.1777" x2="-41.499" y2="-302.2614" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_239_)" d="M31.35,34.38c0.72-1.12,1.43-2.25,2.15-3.38c-0.71-1.2-1.43-2.39-2.14-3.58 + c-1.43-0.06-2.86-0.12-4.29-0.18c-0.72,1.12-1.43,2.24-2.15,3.36c0.71,1.18,1.43,2.37,2.14,3.56 + C28.49,34.23,29.92,34.31,31.35,34.38z"/> +<linearGradient id="SVGID_240_" gradientUnits="userSpaceOnUse" x1="-45.5244" y1="-319.4678" x2="-41.5015" y2="-312.4998" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_240_)" d="M31.37,24.08c0.71-1.13,1.43-2.27,2.15-3.42c-0.71-1.19-1.43-2.37-2.14-3.55 + c-1.43-0.04-2.86-0.07-4.29-0.11c-0.72,1.13-1.44,2.26-2.15,3.39c0.71,1.17,1.43,2.35,2.14,3.53 + C28.51,23.97,29.94,24.03,31.37,24.08z"/> +<linearGradient id="SVGID_241_" gradientUnits="userSpaceOnUse" x1="-45.5576" y1="-329.7598" x2="-41.5039" y2="-322.7385" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_241_)" d="M31.39,13.78c0.72-1.15,1.44-2.29,2.15-3.45c-0.71-1.17-1.43-2.35-2.14-3.52 + c-1.43-0.01-2.86-0.03-4.3-0.05c-0.72,1.15-1.44,2.29-2.15,3.43c0.71,1.16,1.43,2.33,2.14,3.5C28.53,13.72,29.96,13.75,31.39,13.78z + "/> +<linearGradient id="SVGID_242_" gradientUnits="userSpaceOnUse" x1="-44.6172" y1="-338.3657" x2="-41.5068" y2="-332.9784" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_242_)" d="M24.97,0c0.71,1.15,1.43,2.3,2.14,3.46c1.43,0.01,2.87,0.02,4.3,0.03 + c0.72-1.16,1.44-2.32,2.15-3.48C30.7,0,27.83,0,24.97,0z"/> +<linearGradient id="SVGID_243_" gradientUnits="userSpaceOnUse" x1="-34.5127" y1="-264.5337" x2="-31.7847" y2="-259.8086" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_243_)" d="M22.61,75.8c-0.71-1.23-1.42-2.46-2.13-3.69c-1.42-0.17-2.85-0.35-4.28-0.53 + c-0.71,1.05-1.43,2.08-2.14,3.12C16.91,75.08,19.76,75.45,22.61,75.8z"/> +<linearGradient id="SVGID_244_" gradientUnits="userSpaceOnUse" x1="-34.54" y1="-274.6479" x2="-30.7202" y2="-268.0318" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_244_)" d="M20.48,68.84c0.72-1.06,1.43-2.12,2.15-3.19c-0.71-1.22-1.42-2.44-2.13-3.66 + c-1.43-0.15-2.85-0.3-4.28-0.45c-0.71,1.06-1.43,2.11-2.14,3.15c0.71,1.21,1.42,2.42,2.14,3.64C17.63,68.51,19.06,68.67,20.48,68.84 + z"/> +<linearGradient id="SVGID_245_" gradientUnits="userSpaceOnUse" x1="-34.5679" y1="-284.7627" x2="-30.7153" y2="-278.0899" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_245_)" d="M20.5,58.72c0.72-1.07,1.43-2.15,2.14-3.23c-0.71-1.21-1.42-2.42-2.14-3.62 + c-1.43-0.13-2.86-0.25-4.29-0.38c-0.71,1.07-1.43,2.13-2.14,3.19c0.71,1.2,1.43,2.4,2.14,3.6C17.64,58.43,19.07,58.57,20.5,58.72z" + /> +<linearGradient id="SVGID_246_" gradientUnits="userSpaceOnUse" x1="-34.5952" y1="-294.874" x2="-30.7109" y2="-288.1463" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_246_)" d="M20.51,48.59c0.71-1.08,1.43-2.17,2.15-3.26c-0.71-1.2-1.43-2.39-2.14-3.58 + c-1.43-0.1-2.86-0.2-4.29-0.31c-0.71,1.08-1.43,2.16-2.14,3.23c0.71,1.18,1.42,2.38,2.14,3.57C17.65,48.36,19.08,48.48,20.51,48.59z + "/> +<linearGradient id="SVGID_247_" gradientUnits="userSpaceOnUse" x1="-34.6221" y1="-304.9878" x2="-30.7056" y2="-298.2042" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_247_)" d="M20.52,38.47c0.71-1.1,1.43-2.2,2.15-3.3c-0.71-1.19-1.42-2.37-2.14-3.55 + c-1.43-0.08-2.86-0.15-4.29-0.23c-0.71,1.09-1.43,2.18-2.15,3.27c0.71,1.17,1.42,2.35,2.14,3.53 + C17.66,38.28,19.09,38.38,20.52,38.47z"/> +<linearGradient id="SVGID_248_" gradientUnits="userSpaceOnUse" x1="-34.6523" y1="-315.1035" x2="-30.7021" y2="-308.2616" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_248_)" d="M20.53,28.35c0.72-1.11,1.43-2.22,2.15-3.33c-0.71-1.17-1.43-2.35-2.14-3.51 + c-1.43-0.05-2.86-0.1-4.29-0.16c-0.72,1.11-1.43,2.21-2.15,3.31c0.71,1.16,1.43,2.32,2.14,3.49C17.67,28.21,19.1,28.28,20.53,28.35z + "/> +<linearGradient id="SVGID_249_" gradientUnits="userSpaceOnUse" x1="-34.6782" y1="-325.2178" x2="-30.6943" y2="-318.3175" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_249_)" d="M20.55,18.23c0.71-1.12,1.43-2.24,2.15-3.37c-0.71-1.16-1.43-2.32-2.14-3.48 + c-1.43-0.03-2.87-0.06-4.3-0.08c-0.72,1.12-1.43,2.23-2.15,3.34c0.71,1.15,1.43,2.3,2.14,3.46C17.68,18.14,19.12,18.18,20.55,18.23z + "/> +<linearGradient id="SVGID_250_" gradientUnits="userSpaceOnUse" x1="-34.707" y1="-335.332" x2="-30.6909" y2="-328.3759" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_250_)" d="M20.56,8.1c0.72-1.13,1.43-2.26,2.15-3.4C22,3.54,21.28,2.4,20.57,1.25c-1.43,0-2.87-0.01-4.3-0.01 + c-0.72,1.13-1.43,2.26-2.15,3.38c0.72,1.13,1.43,2.27,2.14,3.42C17.7,8.06,19.13,8.08,20.56,8.1z"/> +<linearGradient id="SVGID_251_" gradientUnits="userSpaceOnUse" x1="-23.334" y1="-270.5356" x2="-19.6069" y2="-264.0802" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_251_)" d="M9.33,72.84c0.71-1.02,1.42-2.05,2.14-3.09c-0.71-1.21-1.42-2.42-2.14-3.63 + c-1.43-0.17-2.85-0.35-4.28-0.53c-0.71,1.02-1.42,2.04-2.14,3.05c0.71,1.2,1.43,2.4,2.14,3.61C6.48,72.46,7.9,72.65,9.33,72.84z"/> +<linearGradient id="SVGID_252_" gradientUnits="userSpaceOnUse" x1="-23.355" y1="-280.4526" x2="-19.5942" y2="-273.9388" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_252_)" d="M9.33,62.92c0.71-1.04,1.43-2.08,2.14-3.13c-0.71-1.2-1.42-2.4-2.14-3.59 + c-1.43-0.15-2.85-0.3-4.28-0.45c-0.71,1.04-1.43,2.06-2.14,3.09c0.71,1.19,1.43,2.38,2.14,3.57C6.48,62.58,7.9,62.75,9.33,62.92z"/> +<linearGradient id="SVGID_253_" gradientUnits="userSpaceOnUse" x1="-23.376" y1="-290.3691" x2="-19.5801" y2="-283.7945" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_253_)" d="M9.33,52.99c0.71-1.05,1.42-2.1,2.14-3.17c-0.71-1.19-1.42-2.37-2.14-3.55 + c-1.43-0.12-2.85-0.25-4.28-0.37C4.34,46.95,3.63,48,2.92,49.04c0.71,1.17,1.43,2.35,2.14,3.53C6.48,52.71,7.91,52.85,9.33,52.99z" + /> +<linearGradient id="SVGID_254_" gradientUnits="userSpaceOnUse" x1="-23.396" y1="-300.2866" x2="-19.5649" y2="-293.651" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_254_)" d="M9.34,43.06c0.71-1.06,1.43-2.13,2.14-3.2c-0.71-1.17-1.42-2.34-2.14-3.51 + c-1.43-0.1-2.85-0.19-4.29-0.29c-0.71,1.06-1.43,2.12-2.14,3.17c0.72,1.16,1.43,2.32,2.14,3.49C6.49,42.84,7.91,42.95,9.34,43.06z" + /> +<linearGradient id="SVGID_255_" gradientUnits="userSpaceOnUse" x1="-23.4194" y1="-310.2041" x2="-19.5522" y2="-303.506" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_255_)" d="M9.34,33.14c0.72-1.08,1.43-2.16,2.15-3.24c-0.71-1.16-1.43-2.32-2.14-3.47 + c-1.43-0.07-2.86-0.14-4.29-0.21c-0.71,1.08-1.43,2.15-2.14,3.21c0.71,1.15,1.43,2.29,2.14,3.45C6.49,32.96,7.91,33.05,9.34,33.14z" + /> +<linearGradient id="SVGID_256_" gradientUnits="userSpaceOnUse" x1="-23.438" y1="-320.1191" x2="-19.5381" y2="-313.3643" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_256_)" d="M9.35,23.21c0.72-1.09,1.43-2.18,2.15-3.28c-0.71-1.15-1.43-2.29-2.14-3.43 + c-1.43-0.04-2.86-0.09-4.29-0.13c-0.71,1.09-1.43,2.17-2.14,3.25c0.72,1.13,1.43,2.27,2.14,3.41C6.49,23.09,7.92,23.15,9.35,23.21z" + /> +<linearGradient id="SVGID_257_" gradientUnits="userSpaceOnUse" x1="-23.4614" y1="-330.0376" x2="-19.5244" y2="-323.2185" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_257_)" d="M9.35,13.28c0.72-1.1,1.43-2.21,2.15-3.32c-0.71-1.14-1.43-2.27-2.14-3.4 + C7.92,6.55,6.5,6.53,5.06,6.52c-0.71,1.1-1.43,2.2-2.15,3.29c0.72,1.12,1.43,2.24,2.14,3.37C6.49,13.21,7.92,13.25,9.35,13.28z"/> +<linearGradient id="SVGID_258_" gradientUnits="userSpaceOnUse" x1="-22.5654" y1="-338.3662" x2="-19.5107" y2="-333.0753" gradientTransform="matrix(-1 0 0 1 -14.2783 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> +</linearGradient> +<path fill="url(#SVGID_258_)" d="M2.92,0c0.71,1.11,1.43,2.22,2.15,3.33c1.44,0.01,2.86,0.02,4.3,0.03 + c0.72-1.11,1.43-2.23,2.15-3.36C8.65,0,5.78,0,2.92,0z"/> +</svg> diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_topbar_horisontal_636x96px.svg b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_topbar_horisontal_636x96px.svg new file mode 100644 index 0000000..0a3efd8 --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_topbar_horisontal_636x96px.svg @@ -0,0 +1,4060 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) --> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + width="636px" height="96px" viewBox="0 0 636 96" enable-background="new 0 0 636 96" xml:space="preserve"> +<g> + <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="367.2852" y1="-98.1338" x2="268.8617" y2="172.2825"> + <stop offset="0" style="stop-color:#2BD5FF"/> + <stop offset="0.3516" style="stop-color:#80E6FF"/> + <stop offset="0.9176" style="stop-color:#28C4EB"/> + </linearGradient> + <path fill="url(#SVGID_1_)" d="M464.28,86.13c0.34,0,0.68,0,1.02,0c0,0,92.78,0.9,170.84-12.08V-0.28H464.28H182.14h-182v74.75 + c0,0,81.49,11.57,182,11.65H464.28z"/> + <linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="329.376" y1="19.6938" x2="309.3868" y2="133.0578"> + <stop offset="0" style="stop-color:#2BD5FF"/> + <stop offset="0.9176" style="stop-color:#28C6ED"/> + </linearGradient> + <path fill="url(#SVGID_2_)" d="M465.68,85.81c-0.41,0-283.53,0.32-283.53,0.32v-0.32C81.73,85.71,0.34,74.16,0.34,74.16l-0.02,4.41 + c0,0,80.84,13.35,180.79,13.55v0.01c380.6,8.1,454.93-0.01,454.93-0.01l0.1-18.33C558.16,86.7,465.68,85.81,465.68,85.81z"/> + + <linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="-363.0977" y1="-269.0723" x2="-359.7446" y2="-263.2646" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_3_)" d="M631.02,70.41c-0.71-0.97-1.42-1.95-2.12-2.93c-1.42,0.18-2.83,0.37-4.25,0.54 + c-0.71,1.17-1.41,2.34-2.12,3.52C625.36,71.17,628.19,70.79,631.02,70.41z"/> + + <linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="-363.0767" y1="-278.5928" x2="-359.0044" y2="-271.5394" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_4_)" d="M628.9,64.4c0.71-1.16,1.41-2.32,2.12-3.47c-0.71-0.98-1.42-1.97-2.12-2.96 + c-1.42,0.16-2.83,0.31-4.25,0.47c-0.71,1.16-1.41,2.32-2.12,3.48c0.71,1.01,1.42,2.01,2.13,3C626.06,64.75,627.48,64.58,628.9,64.4 + z"/> + + <linearGradient id="SVGID_5_" gradientUnits="userSpaceOnUse" x1="-363.0591" y1="-288.1143" x2="-359.0181" y2="-281.115" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_5_)" d="M628.9,54.89c0.71-1.15,1.42-2.29,2.12-3.43c-0.71-1-1.42-2-2.13-3c-1.42,0.13-2.84,0.26-4.25,0.39 + c-0.71,1.14-1.42,2.29-2.13,3.45c0.71,1.02,1.42,2.03,2.13,3.04C626.06,55.19,627.48,55.04,628.9,54.89z"/> + + <linearGradient id="SVGID_6_" gradientUnits="userSpaceOnUse" x1="-363.041" y1="-297.6362" x2="-359.0332" y2="-290.6945" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_6_)" d="M628.89,45.38c0.71-1.13,1.42-2.26,2.13-3.39c-0.71-1.01-1.42-2.02-2.13-3.04 + c-1.42,0.11-2.84,0.21-4.26,0.32c-0.71,1.13-1.42,2.27-2.13,3.41c0.71,1.03,1.42,2.05,2.13,3.07 + C626.06,45.62,627.48,45.5,628.89,45.38z"/> + + <linearGradient id="SVGID_7_" gradientUnits="userSpaceOnUse" x1="-363.02" y1="-307.1558" x2="-359.0444" y2="-300.2698" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_7_)" d="M628.89,35.87c0.71-1.12,1.42-2.24,2.13-3.35c-0.71-1.02-1.42-2.05-2.13-3.08 + c-1.42,0.08-2.84,0.16-4.26,0.24c-0.71,1.12-1.42,2.24-2.13,3.37c0.71,1.04,1.42,2.08,2.13,3.12 + C626.05,36.06,627.47,35.97,628.89,35.87z"/> + + <linearGradient id="SVGID_8_" gradientUnits="userSpaceOnUse" x1="-363.0029" y1="-316.6782" x2="-359.0586" y2="-309.8464" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_8_)" d="M628.89,26.36c0.71-1.11,1.42-2.21,2.13-3.31c-0.71-1.04-1.42-2.08-2.13-3.12 + c-1.42,0.06-2.84,0.11-4.27,0.16c-0.71,1.11-1.42,2.22-2.13,3.34c0.71,1.05,1.42,2.1,2.13,3.15 + C626.05,26.5,627.47,26.43,628.89,26.36z"/> + + <linearGradient id="SVGID_9_" gradientUnits="userSpaceOnUse" x1="-362.9824" y1="-326.1982" x2="-359.0698" y2="-319.4214" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_9_)" d="M628.89,16.85c0.71-1.1,1.42-2.19,2.13-3.28c-0.71-1.05-1.42-2.1-2.13-3.16 + c-1.42,0.03-2.85,0.06-4.27,0.08c-0.71,1.1-1.42,2.2-2.13,3.3c0.71,1.07,1.42,2.13,2.13,3.19 + C626.04,16.94,627.47,16.89,628.89,16.85z"/> + + <linearGradient id="SVGID_10_" gradientUnits="userSpaceOnUse" x1="-362.9653" y1="-335.7188" x2="-359.0854" y2="-328.9986" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_10_)" d="M628.89,7.33c0.71-1.08,1.42-2.16,2.13-3.23c-0.71-1.06-1.42-2.13-2.13-3.2 + c-1.43,0-2.85,0.01-4.27,0.01c-0.71,1.08-1.42,2.17-2.13,3.26c0.71,1.08,1.42,2.15,2.13,3.22C626.04,7.38,627.46,7.35,628.89,7.33z + "/> + + <linearGradient id="SVGID_11_" gradientUnits="userSpaceOnUse" x1="-352.021" y1="-272.1646" x2="-347.8901" y2="-265.0097" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_11_)" d="M617.82,70.94c0.71-1.18,1.41-2.36,2.12-3.54c-0.71-1.01-1.42-2.02-2.13-3.03 + c-1.42,0.16-2.83,0.32-4.25,0.47c-0.71,1.18-1.41,2.36-2.12,3.55c0.71,1.02,1.42,2.04,2.13,3.06 + C614.98,71.29,616.4,71.12,617.82,70.94z"/> + + <linearGradient id="SVGID_12_" gradientUnits="userSpaceOnUse" x1="-351.9932" y1="-281.8779" x2="-347.8936" y2="-274.7772" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_12_)" d="M617.8,61.24c0.71-1.17,1.42-2.34,2.12-3.5c-0.71-1.02-1.42-2.04-2.13-3.07 + c-1.42,0.14-2.84,0.27-4.26,0.4c-0.71,1.17-1.42,2.34-2.12,3.52c0.71,1.04,1.42,2.07,2.13,3.1 + C614.97,61.54,616.39,61.39,617.8,61.24z"/> + + <linearGradient id="SVGID_13_" gradientUnits="userSpaceOnUse" x1="-351.9683" y1="-291.5947" x2="-347.8979" y2="-284.5447" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_13_)" d="M617.79,51.53c0.71-1.16,1.42-2.31,2.12-3.46c-0.71-1.03-1.42-2.07-2.13-3.1 + c-1.42,0.11-2.84,0.22-4.26,0.33c-0.71,1.16-1.41,2.32-2.12,3.48c0.71,1.05,1.42,2.09,2.13,3.13 + C614.96,51.79,616.38,51.66,617.79,51.53z"/> + + <linearGradient id="SVGID_14_" gradientUnits="userSpaceOnUse" x1="-351.9429" y1="-301.3062" x2="-347.9033" y2="-294.3094" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_14_)" d="M617.78,41.83c0.71-1.15,1.42-2.29,2.13-3.43c-0.71-1.04-1.42-2.09-2.13-3.14 + c-1.42,0.09-2.84,0.17-4.26,0.26c-0.71,1.14-1.42,2.29-2.12,3.45c0.71,1.06,1.42,2.12,2.13,3.17 + C614.94,42.04,616.37,41.93,617.78,41.83z"/> + + <linearGradient id="SVGID_15_" gradientUnits="userSpaceOnUse" x1="-351.9175" y1="-311.022" x2="-347.9077" y2="-304.0768" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_15_)" d="M617.78,32.12c0.71-1.13,1.42-2.26,2.13-3.39c-0.71-1.05-1.42-2.11-2.14-3.17 + c-1.42,0.06-2.84,0.13-4.26,0.19c-0.71,1.13-1.42,2.27-2.13,3.41c0.71,1.07,1.42,2.14,2.13,3.2 + C614.93,32.28,616.36,32.2,617.78,32.12z"/> + + <linearGradient id="SVGID_16_" gradientUnits="userSpaceOnUse" x1="-351.8921" y1="-320.7388" x2="-347.9116" y2="-313.8444" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_16_)" d="M617.77,22.42c0.71-1.12,1.42-2.24,2.13-3.36c-0.71-1.06-1.42-2.14-2.13-3.21 + c-1.42,0.04-2.85,0.08-4.27,0.12c-0.71,1.12-1.42,2.25-2.13,3.38c0.71,1.08,1.42,2.16,2.14,3.24 + C614.92,22.53,616.34,22.47,617.77,22.42z"/> + + <linearGradient id="SVGID_17_" gradientUnits="userSpaceOnUse" x1="-351.8672" y1="-330.4517" x2="-347.917" y2="-323.6097" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_17_)" d="M617.75,12.71c0.71-1.11,1.42-2.21,2.13-3.32c-0.71-1.08-1.43-2.16-2.14-3.25 + c-1.42,0.02-2.85,0.03-4.27,0.05c-0.71,1.11-1.42,2.23-2.13,3.34c0.71,1.09,1.42,2.19,2.14,3.27 + C614.91,12.77,616.33,12.74,617.75,12.71z"/> + + <linearGradient id="SVGID_18_" gradientUnits="userSpaceOnUse" x1="-350.9536" y1="-338.6313" x2="-347.9209" y2="-333.3785" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_18_)" d="M611.34-0.28c0.71,1.11,1.43,2.21,2.14,3.31c1.42-0.01,2.85-0.01,4.27-0.02 + c0.71-1.1,1.42-2.19,2.13-3.28C617.03-0.28,614.18-0.28,611.34-0.28z"/> + + <linearGradient id="SVGID_19_" gradientUnits="userSpaceOnUse" x1="-341.3149" y1="-266.4116" x2="-337.9531" y2="-260.5888" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_19_)" d="M609.21,73.21c-0.71-1.03-1.42-2.06-2.13-3.09c-1.42,0.16-2.84,0.32-4.26,0.47 + c-0.71,1.2-1.42,2.4-2.12,3.61C603.54,73.88,606.37,73.55,609.21,73.21z"/> + + <linearGradient id="SVGID_20_" gradientUnits="userSpaceOnUse" x1="-341.2812" y1="-276.2993" x2="-337.1309" y2="-269.1106" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_20_)" d="M607.07,66.92c0.71-1.19,1.42-2.38,2.12-3.56c-0.71-1.04-1.42-2.08-2.13-3.12 + c-1.42,0.14-2.84,0.27-4.26,0.41c-0.71,1.19-1.42,2.38-2.12,3.57c0.71,1.06,1.43,2.11,2.14,3.16 + C604.23,67.22,605.65,67.07,607.07,66.92z"/> + + <linearGradient id="SVGID_21_" gradientUnits="userSpaceOnUse" x1="-341.2524" y1="-286.1904" x2="-337.1284" y2="-279.0474" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_21_)" d="M607.05,57.04c0.71-1.18,1.42-2.36,2.12-3.53c-0.71-1.05-1.43-2.1-2.13-3.16 + c-1.42,0.12-2.84,0.23-4.26,0.34c-0.71,1.18-1.42,2.36-2.12,3.54c0.71,1.07,1.43,2.13,2.14,3.19 + C604.22,57.3,605.63,57.17,607.05,57.04z"/> + + <linearGradient id="SVGID_22_" gradientUnits="userSpaceOnUse" x1="-341.2212" y1="-296.0801" x2="-337.1265" y2="-288.9878" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_22_)" d="M607.04,47.16c0.71-1.17,1.42-2.33,2.12-3.49c-0.71-1.06-1.42-2.12-2.14-3.19 + c-1.42,0.09-2.84,0.18-4.26,0.27c-0.71,1.17-1.42,2.34-2.12,3.51c0.71,1.08,1.42,2.15,2.14,3.22 + C604.2,47.37,605.62,47.27,607.04,47.16z"/> + + <linearGradient id="SVGID_23_" gradientUnits="userSpaceOnUse" x1="-341.1899" y1="-305.9692" x2="-337.1226" y2="-298.9243" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_23_)" d="M607.02,37.28c0.71-1.15,1.42-2.31,2.13-3.46c-0.71-1.07-1.42-2.15-2.14-3.22 + c-1.42,0.07-2.84,0.14-4.27,0.21c-0.71,1.16-1.42,2.31-2.12,3.48c0.71,1.09,1.43,2.17,2.14,3.26 + C604.18,37.45,605.6,37.36,607.02,37.28z"/> + + <linearGradient id="SVGID_24_" gradientUnits="userSpaceOnUse" x1="-341.1616" y1="-315.8604" x2="-337.1216" y2="-308.8628" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_24_)" d="M607.01,27.4c0.71-1.15,1.42-2.29,2.13-3.43c-0.71-1.08-1.43-2.17-2.14-3.26 + c-1.42,0.05-2.84,0.1-4.27,0.14c-0.71,1.15-1.42,2.29-2.12,3.45c0.71,1.1,1.42,2.19,2.14,3.29 + C604.16,27.52,605.58,27.46,607.01,27.4z"/> + + <linearGradient id="SVGID_25_" gradientUnits="userSpaceOnUse" x1="-341.1304" y1="-325.75" x2="-337.1187" y2="-318.8015" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_25_)" d="M606.99,17.51c0.71-1.13,1.42-2.26,2.13-3.39c-0.71-1.1-1.43-2.19-2.14-3.29 + c-1.42,0.03-2.85,0.05-4.27,0.08c-0.71,1.13-1.42,2.27-2.12,3.41c0.71,1.11,1.43,2.22,2.14,3.32 + C604.14,17.59,605.57,17.56,606.99,17.51z"/> + + <linearGradient id="SVGID_26_" gradientUnits="userSpaceOnUse" x1="-341.0991" y1="-335.6426" x2="-337.1152" y2="-328.7423" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_26_)" d="M606.97,7.63c0.71-1.12,1.42-2.24,2.13-3.36c-0.71-1.1-1.43-2.21-2.14-3.33 + c-1.43,0-2.85,0.01-4.27,0.01c-0.71,1.12-1.42,2.25-2.13,3.38c0.71,1.12,1.43,2.24,2.14,3.35C604.13,7.67,605.55,7.65,606.97,7.63z + "/> + + <linearGradient id="SVGID_27_" gradientUnits="userSpaceOnUse" x1="-330.2061" y1="-269.8462" x2="-326.0059" y2="-262.5712" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_27_)" d="M595.97,73.47c0.71-1.21,1.41-2.42,2.12-3.62c-0.71-1.06-1.42-2.12-2.13-3.18 + c-1.42,0.14-2.84,0.27-4.26,0.41c-0.71,1.21-1.42,2.42-2.12,3.63c0.71,1.07,1.43,2.14,2.14,3.21 + C593.13,73.78,594.55,73.63,595.97,73.47z"/> + + <linearGradient id="SVGID_28_" gradientUnits="userSpaceOnUse" x1="-330.1714" y1="-279.9058" x2="-325.9966" y2="-272.6748" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_28_)" d="M595.95,63.42c0.71-1.2,1.42-2.39,2.12-3.59c-0.71-1.07-1.42-2.14-2.13-3.21 + c-1.42,0.12-2.84,0.23-4.27,0.35c-0.71,1.2-1.42,2.39-2.12,3.6c0.71,1.08,1.43,2.16,2.14,3.24 + C593.11,63.69,594.53,63.56,595.95,63.42z"/> + + <linearGradient id="SVGID_29_" gradientUnits="userSpaceOnUse" x1="-330.1382" y1="-289.9644" x2="-325.9897" y2="-282.7791" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_29_)" d="M595.93,53.38c0.71-1.19,1.42-2.38,2.12-3.56c-0.71-1.08-1.43-2.16-2.14-3.24 + c-1.42,0.1-2.84,0.19-4.27,0.29c-0.71,1.19-1.42,2.38-2.13,3.57c0.71,1.09,1.43,2.19,2.14,3.27 + C593.09,53.59,594.51,53.48,595.93,53.38z"/> + + <linearGradient id="SVGID_30_" gradientUnits="userSpaceOnUse" x1="-330.1021" y1="-300.02" x2="-325.9805" y2="-292.8812" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_30_)" d="M595.91,43.32c0.71-1.18,1.41-2.35,2.12-3.52c-0.71-1.09-1.43-2.18-2.14-3.27 + c-1.42,0.08-2.84,0.15-4.27,0.22c-0.71,1.18-1.42,2.36-2.13,3.54c0.71,1.1,1.43,2.2,2.14,3.3 + C593.07,43.5,594.49,43.41,595.91,43.32z"/> + + <linearGradient id="SVGID_31_" gradientUnits="userSpaceOnUse" x1="-330.0688" y1="-310.0796" x2="-325.9727" y2="-302.9848" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_31_)" d="M595.89,33.27c0.71-1.17,1.42-2.33,2.13-3.49c-0.71-1.1-1.43-2.2-2.14-3.31 + c-1.42,0.06-2.84,0.11-4.27,0.17c-0.71,1.17-1.42,2.33-2.13,3.51c0.71,1.12,1.43,2.22,2.14,3.33 + C593.04,33.41,594.47,33.34,595.89,33.27z"/> + + <linearGradient id="SVGID_32_" gradientUnits="userSpaceOnUse" x1="-330.0347" y1="-320.1353" x2="-325.9658" y2="-313.0878" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_32_)" d="M595.87,23.22c0.71-1.16,1.42-2.31,2.13-3.46c-0.71-1.11-1.43-2.22-2.14-3.34 + c-1.42,0.03-2.85,0.07-4.27,0.1c-0.71,1.16-1.42,2.32-2.12,3.48c0.71,1.12,1.43,2.24,2.14,3.36 + C593.02,23.32,594.45,23.27,595.87,23.22z"/> + + <linearGradient id="SVGID_33_" gradientUnits="userSpaceOnUse" x1="-329.9995" y1="-330.1958" x2="-325.9551" y2="-323.1906" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_33_)" d="M595.85,13.17c0.71-1.15,1.42-2.29,2.13-3.43c-0.71-1.12-1.43-2.24-2.14-3.37 + c-1.42,0.01-2.85,0.03-4.27,0.04c-0.71,1.15-1.42,2.29-2.13,3.45c0.71,1.14,1.43,2.26,2.14,3.39 + C593,13.23,594.42,13.2,595.85,13.17z"/> + + <linearGradient id="SVGID_34_" gradientUnits="userSpaceOnUse" x1="-329.0283" y1="-338.6309" x2="-325.9473" y2="-333.2943" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_34_)" d="M589.41-0.28c0.71,1.14,1.43,2.29,2.14,3.42c1.43-0.01,2.85-0.01,4.27-0.02 + c0.71-1.14,1.41-2.27,2.12-3.4C595.11-0.28,592.26-0.28,589.41-0.28z"/> + + <linearGradient id="SVGID_35_" gradientUnits="userSpaceOnUse" x1="-319.4795" y1="-264.1133" x2="-316.1167" y2="-258.2888" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_35_)" d="M587.35,75.63c-0.71-1.08-1.43-2.15-2.14-3.23c-1.42,0.14-2.85,0.27-4.27,0.4 + c-0.71,1.22-1.42,2.45-2.12,3.67C581.67,76.2,584.51,75.92,587.35,75.63z"/> + + <linearGradient id="SVGID_36_" gradientUnits="userSpaceOnUse" x1="-319.4438" y1="-274.3223" x2="-315.2266" y2="-267.0177" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_36_)" d="M585.21,69.1c0.71-1.22,1.42-2.43,2.12-3.64c-0.71-1.08-1.43-2.17-2.14-3.26 + c-1.42,0.12-2.85,0.23-4.26,0.35c-0.71,1.21-1.42,2.43-2.12,3.65c0.71,1.1,1.43,2.2,2.14,3.29 + C582.36,69.36,583.78,69.23,585.21,69.1z"/> + + <linearGradient id="SVGID_37_" gradientUnits="userSpaceOnUse" x1="-319.4058" y1="-284.5303" x2="-315.2134" y2="-277.2689" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_37_)" d="M585.18,58.9c0.71-1.21,1.41-2.41,2.12-3.61c-0.71-1.09-1.43-2.19-2.14-3.29 + c-1.42,0.1-2.85,0.19-4.27,0.29c-0.71,1.21-1.42,2.41-2.12,3.62c0.71,1.11,1.43,2.21,2.14,3.32 + C582.33,59.12,583.76,59.01,585.18,58.9z"/> + + <linearGradient id="SVGID_38_" gradientUnits="userSpaceOnUse" x1="-319.3706" y1="-294.7388" x2="-315.2026" y2="-287.5196" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_38_)" d="M585.16,48.69c0.71-1.19,1.41-2.39,2.12-3.58c-0.71-1.1-1.43-2.21-2.14-3.32 + c-1.42,0.08-2.85,0.16-4.27,0.23c-0.71,1.19-1.42,2.39-2.13,3.59c0.71,1.12,1.43,2.24,2.14,3.35 + C582.31,48.88,583.73,48.79,585.16,48.69z"/> + + <linearGradient id="SVGID_39_" gradientUnits="userSpaceOnUse" x1="-319.3335" y1="-304.9473" x2="-315.189" y2="-297.7687" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_39_)" d="M585.13,38.49c0.71-1.18,1.42-2.37,2.12-3.55c-0.71-1.11-1.43-2.23-2.14-3.35 + c-1.42,0.06-2.85,0.12-4.27,0.18c-0.71,1.19-1.42,2.37-2.13,3.57c0.71,1.13,1.43,2.25,2.14,3.37 + C582.29,38.64,583.71,38.57,585.13,38.49z"/> + + <linearGradient id="SVGID_40_" gradientUnits="userSpaceOnUse" x1="-319.2974" y1="-315.1562" x2="-315.1777" y2="-308.0208" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_40_)" d="M585.11,28.29c0.71-1.17,1.42-2.35,2.12-3.52c-0.71-1.12-1.43-2.25-2.14-3.38 + c-1.43,0.04-2.85,0.08-4.27,0.12c-0.71,1.18-1.42,2.36-2.12,3.54c0.71,1.14,1.43,2.27,2.14,3.4 + C582.26,28.4,583.68,28.34,585.11,28.29z"/> + + <linearGradient id="SVGID_41_" gradientUnits="userSpaceOnUse" x1="-319.2612" y1="-325.3652" x2="-315.1646" y2="-318.2696" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_41_)" d="M585.08,18.09c0.71-1.17,1.42-2.33,2.13-3.49c-0.71-1.13-1.43-2.27-2.14-3.41 + c-1.42,0.02-2.85,0.04-4.27,0.07c-0.71,1.17-1.42,2.34-2.13,3.51c0.71,1.15,1.43,2.29,2.14,3.43 + C582.24,18.16,583.66,18.12,585.08,18.09z"/> + + <linearGradient id="SVGID_42_" gradientUnits="userSpaceOnUse" x1="-319.2231" y1="-335.5723" x2="-315.1519" y2="-328.5206" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_42_)" d="M585.06,7.89c0.71-1.16,1.42-2.31,2.12-3.46c-0.71-1.14-1.43-2.29-2.14-3.44 + c-1.42,0-2.85,0.01-4.27,0.01c-0.71,1.16-1.42,2.32-2.13,3.48c0.71,1.15,1.43,2.31,2.14,3.46C582.21,7.92,583.63,7.9,585.06,7.89z" + /> + + <linearGradient id="SVGID_43_" gradientUnits="userSpaceOnUse" x1="-308.3457" y1="-267.8691" x2="-304.0898" y2="-260.4978" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_43_)" d="M574.09,75.64c0.71-1.23,1.42-2.46,2.12-3.68c-0.71-1.1-1.43-2.21-2.14-3.31 + c-1.42,0.12-2.85,0.23-4.27,0.34c-0.71,1.23-1.42,2.46-2.12,3.69c0.71,1.12,1.43,2.23,2.14,3.34 + C571.25,75.89,572.67,75.76,574.09,75.64z"/> + + <linearGradient id="SVGID_44_" gradientUnits="userSpaceOnUse" x1="-308.3096" y1="-278.2183" x2="-304.0767" y2="-270.8867" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_44_)" d="M574.06,65.29c0.71-1.22,1.42-2.44,2.12-3.66c-0.71-1.11-1.43-2.22-2.14-3.34 + c-1.42,0.1-2.85,0.2-4.27,0.29c-0.71,1.22-1.42,2.44-2.12,3.67c0.71,1.13,1.43,2.25,2.14,3.37 + C571.22,65.51,572.64,65.4,574.06,65.29z"/> + + <linearGradient id="SVGID_45_" gradientUnits="userSpaceOnUse" x1="-308.272" y1="-288.5713" x2="-304.0605" y2="-281.2769" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_45_)" d="M574.04,54.95c0.71-1.21,1.42-2.43,2.12-3.63c-0.71-1.12-1.43-2.24-2.14-3.37 + c-1.42,0.08-2.85,0.16-4.27,0.24c-0.71,1.21-1.42,2.43-2.12,3.64c0.71,1.13,1.43,2.26,2.14,3.39 + C571.19,55.13,572.62,55.04,574.04,54.95z"/> + + <linearGradient id="SVGID_46_" gradientUnits="userSpaceOnUse" x1="-308.2344" y1="-298.9209" x2="-304.0454" y2="-291.6654" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_46_)" d="M574.01,44.6c0.71-1.2,1.42-2.4,2.12-3.6c-0.71-1.13-1.43-2.26-2.14-3.39 + c-1.42,0.06-2.85,0.13-4.27,0.19c-0.71,1.2-1.42,2.41-2.12,3.62c0.71,1.14,1.43,2.28,2.14,3.42 + C571.16,44.75,572.59,44.67,574.01,44.6z"/> + + <linearGradient id="SVGID_47_" gradientUnits="userSpaceOnUse" x1="-308.1963" y1="-309.272" x2="-304.0293" y2="-302.0545" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_47_)" d="M573.98,34.26c0.71-1.19,1.42-2.39,2.13-3.58c-0.71-1.14-1.43-2.28-2.14-3.42 + c-1.42,0.04-2.85,0.09-4.27,0.14c-0.71,1.2-1.42,2.39-2.12,3.59c0.71,1.15,1.43,2.3,2.14,3.44 + C571.14,34.37,572.56,34.31,573.98,34.26z"/> + + <linearGradient id="SVGID_48_" gradientUnits="userSpaceOnUse" x1="-308.1611" y1="-319.626" x2="-304.0151" y2="-312.4449" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_48_)" d="M573.96,23.91c0.71-1.19,1.42-2.37,2.13-3.55c-0.71-1.14-1.43-2.29-2.14-3.45 + c-1.42,0.03-2.85,0.06-4.27,0.09c-0.71,1.19-1.42,2.37-2.12,3.56c0.71,1.16,1.43,2.31,2.14,3.47 + C571.11,23.99,572.54,23.95,573.96,23.91z"/> + + <linearGradient id="SVGID_49_" gradientUnits="userSpaceOnUse" x1="-308.1221" y1="-329.9766" x2="-303.9985" y2="-322.8344" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_49_)" d="M573.93,13.57c0.71-1.18,1.42-2.35,2.12-3.53c-0.71-1.15-1.43-2.31-2.14-3.47 + c-1.42,0.01-2.85,0.02-4.27,0.04c-0.71,1.18-1.42,2.36-2.12,3.54c0.71,1.17,1.43,2.33,2.14,3.49 + C571.08,13.61,572.51,13.59,573.93,13.57z"/> + + <linearGradient id="SVGID_50_" gradientUnits="userSpaceOnUse" x1="-307.106" y1="-338.6313" x2="-303.9834" y2="-333.2229" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_50_)" d="M567.49-0.28c0.71,1.17,1.43,2.35,2.14,3.52c1.42-0.01,2.85-0.01,4.27-0.02 + c0.71-1.17,1.42-2.33,2.13-3.5C573.18-0.28,570.34-0.28,567.49-0.28z"/> + + <linearGradient id="SVGID_51_" gradientUnits="userSpaceOnUse" x1="-297.5938" y1="-262.1865" x2="-294.2358" y2="-256.3705" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_51_)" d="M565.46,77.68c-0.71-1.12-1.43-2.24-2.14-3.36c-1.42,0.12-2.85,0.22-4.27,0.33 + c-0.71,1.24-1.42,2.48-2.12,3.73C559.76,78.16,562.61,77.92,565.46,77.68z"/> + + <linearGradient id="SVGID_52_" gradientUnits="userSpaceOnUse" x1="-297.5625" y1="-272.6567" x2="-293.2939" y2="-265.2634" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_52_)" d="M563.3,70.93c0.71-1.23,1.42-2.47,2.12-3.7c-0.71-1.12-1.43-2.25-2.14-3.39 + c-1.42,0.1-2.85,0.19-4.27,0.29c-0.71,1.23-1.41,2.47-2.12,3.71c0.72,1.14,1.43,2.27,2.14,3.41 + C560.46,71.15,561.88,71.04,563.3,70.93z"/> + + <linearGradient id="SVGID_53_" gradientUnits="userSpaceOnUse" x1="-297.5269" y1="-283.1328" x2="-293.2788" y2="-275.775" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_53_)" d="M563.28,60.46c0.71-1.23,1.42-2.45,2.13-3.67c-0.71-1.13-1.43-2.27-2.14-3.41 + c-1.42,0.08-2.85,0.16-4.27,0.24c-0.71,1.23-1.42,2.45-2.12,3.68c0.71,1.15,1.43,2.29,2.14,3.43 + C560.43,60.64,561.85,60.55,563.28,60.46z"/> + + <linearGradient id="SVGID_54_" gradientUnits="userSpaceOnUse" x1="-297.4897" y1="-293.6089" x2="-293.2627" y2="-286.2874" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_54_)" d="M563.25,49.99c0.71-1.22,1.42-2.43,2.13-3.65c-0.72-1.14-1.43-2.29-2.14-3.43 + c-1.42,0.07-2.85,0.13-4.27,0.19c-0.71,1.22-1.42,2.44-2.12,3.66c0.71,1.15,1.43,2.31,2.14,3.46 + C560.4,50.14,561.82,50.07,563.25,49.99z"/> + + <linearGradient id="SVGID_55_" gradientUnits="userSpaceOnUse" x1="-297.4526" y1="-304.0854" x2="-293.2446" y2="-296.797" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_55_)" d="M563.22,39.52c0.71-1.21,1.42-2.42,2.13-3.63c-0.72-1.15-1.43-2.3-2.15-3.46 + c-1.42,0.05-2.85,0.1-4.27,0.14c-0.71,1.21-1.42,2.42-2.12,3.64c0.71,1.16,1.43,2.32,2.14,3.48 + C560.37,39.64,561.8,39.58,563.22,39.52z"/> + + <linearGradient id="SVGID_56_" gradientUnits="userSpaceOnUse" x1="-297.4146" y1="-314.562" x2="-293.228" y2="-307.3107" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_56_)" d="M563.19,29.04c0.71-1.2,1.42-2.4,2.12-3.6c-0.71-1.16-1.43-2.32-2.14-3.48 + c-1.42,0.03-2.85,0.07-4.27,0.1c-0.71,1.2-1.42,2.41-2.12,3.61c0.71,1.17,1.43,2.34,2.14,3.5 + C560.35,29.13,561.77,29.09,563.19,29.04z"/> + + <linearGradient id="SVGID_57_" gradientUnits="userSpaceOnUse" x1="-297.3784" y1="-325.0405" x2="-293.2109" y2="-317.8222" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_57_)" d="M563.16,18.58c0.71-1.2,1.42-2.39,2.13-3.58c-0.71-1.17-1.43-2.33-2.14-3.51 + c-1.42,0.02-2.85,0.04-4.27,0.05c-0.71,1.2-1.42,2.39-2.13,3.59c0.71,1.18,1.43,2.35,2.14,3.52 + C560.32,18.63,561.74,18.6,563.16,18.58z"/> + + <linearGradient id="SVGID_58_" gradientUnits="userSpaceOnUse" x1="-297.3384" y1="-335.5166" x2="-293.1929" y2="-328.3364" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_58_)" d="M563.14,8.1c0.71-1.19,1.42-2.37,2.12-3.55c-0.71-1.17-1.43-2.35-2.14-3.53 + c-1.42,0-2.85,0-4.27,0.01c-0.71,1.19-1.42,2.38-2.13,3.57c0.72,1.18,1.43,2.37,2.15,3.54C560.29,8.13,561.71,8.12,563.14,8.1z"/> + + <linearGradient id="SVGID_59_" gradientUnits="userSpaceOnUse" x1="-286.4502" y1="-266.2334" x2="-282.1519" y2="-258.7885" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_59_)" d="M552.18,77.43c0.71-1.25,1.42-2.49,2.13-3.73c-0.71-1.14-1.43-2.29-2.14-3.43 + c-1.43,0.09-2.85,0.19-4.28,0.28c-0.71,1.24-1.42,2.49-2.13,3.74c0.71,1.16,1.43,2.31,2.14,3.45 + C549.33,77.63,550.75,77.53,552.18,77.43z"/> + + <linearGradient id="SVGID_60_" gradientUnits="userSpaceOnUse" x1="-286.4141" y1="-276.8271" x2="-282.1338" y2="-269.4135" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_60_)" d="M552.15,66.84c0.71-1.24,1.42-2.47,2.13-3.71c-0.71-1.15-1.43-2.3-2.14-3.45 + c-1.42,0.08-2.85,0.16-4.27,0.24c-0.71,1.24-1.42,2.48-2.13,3.72c0.72,1.16,1.43,2.32,2.14,3.47 + C549.3,67.01,550.72,66.93,552.15,66.84z"/> + + <linearGradient id="SVGID_61_" gradientUnits="userSpaceOnUse" x1="-286.376" y1="-287.4204" x2="-282.1143" y2="-280.0389" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_61_)" d="M552.12,56.25c0.71-1.23,1.42-2.46,2.13-3.69c-0.71-1.16-1.43-2.31-2.15-3.47 + c-1.42,0.07-2.85,0.13-4.27,0.19c-0.71,1.23-1.42,2.46-2.13,3.7c0.71,1.17,1.43,2.33,2.15,3.5 + C549.27,56.4,550.7,56.32,552.12,56.25z"/> + + <linearGradient id="SVGID_62_" gradientUnits="userSpaceOnUse" x1="-286.3418" y1="-298.0117" x2="-282.0991" y2="-290.6632" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_62_)" d="M552.09,45.66c0.71-1.23,1.42-2.45,2.13-3.67c-0.71-1.16-1.43-2.33-2.15-3.5 + c-1.42,0.05-2.85,0.1-4.27,0.15c-0.71,1.22-1.42,2.45-2.12,3.68c0.71,1.17,1.43,2.35,2.14,3.51 + C549.24,45.78,550.67,45.72,552.09,45.66z"/> + + <linearGradient id="SVGID_63_" gradientUnits="userSpaceOnUse" x1="-286.3062" y1="-308.6084" x2="-282.0796" y2="-301.2878" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_63_)" d="M552.06,35.07c0.71-1.22,1.42-2.43,2.13-3.65c-0.71-1.17-1.43-2.34-2.14-3.52 + c-1.42,0.04-2.85,0.08-4.27,0.11c-0.71,1.22-1.42,2.43-2.12,3.65c0.71,1.18,1.43,2.36,2.14,3.54 + C549.22,35.17,550.64,35.12,552.06,35.07z"/> + + <linearGradient id="SVGID_64_" gradientUnits="userSpaceOnUse" x1="-286.269" y1="-319.1992" x2="-282.062" y2="-311.9124" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_64_)" d="M552.04,24.48c0.71-1.21,1.42-2.42,2.12-3.62c-0.71-1.18-1.43-2.35-2.14-3.54 + c-1.42,0.02-2.85,0.05-4.28,0.07c-0.71,1.21-1.42,2.42-2.12,3.63c0.71,1.19,1.43,2.37,2.14,3.56 + C549.19,24.55,550.61,24.52,552.04,24.48z"/> + + <linearGradient id="SVGID_65_" gradientUnits="userSpaceOnUse" x1="-286.2334" y1="-329.7939" x2="-282.0449" y2="-322.5393" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_65_)" d="M552.01,13.89c0.71-1.2,1.42-2.4,2.12-3.6c-0.71-1.18-1.43-2.37-2.14-3.56 + c-1.42,0.01-2.85,0.02-4.27,0.03c-0.71,1.2-1.41,2.41-2.12,3.61c0.71,1.2,1.43,2.39,2.14,3.57 + C549.16,13.93,550.59,13.91,552.01,13.89z"/> + + <linearGradient id="SVGID_66_" gradientUnits="userSpaceOnUse" x1="-285.1821" y1="-338.6313" x2="-282.0254" y2="-333.1637" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_66_)" d="M545.56-0.28c0.71,1.2,1.43,2.4,2.14,3.59c1.43-0.01,2.85-0.01,4.27-0.01 + c0.71-1.2,1.42-2.39,2.13-3.58C551.26-0.28,548.41-0.28,545.56-0.28z"/> + + <linearGradient id="SVGID_67_" gradientUnits="userSpaceOnUse" x1="-275.6704" y1="-260.6182" x2="-272.3271" y2="-254.8275" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_67_)" d="M543.53,79.35c-0.71-1.16-1.43-2.31-2.14-3.47c-1.43,0.09-2.85,0.18-4.28,0.26 + c-0.71,1.25-1.42,2.5-2.13,3.76C537.83,79.73,540.68,79.54,543.53,79.35z"/> + + <linearGradient id="SVGID_68_" gradientUnits="userSpaceOnUse" x1="-275.6523" y1="-271.3037" x2="-271.3477" y2="-263.8478" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_68_)" d="M541.38,72.42c0.71-1.25,1.42-2.49,2.13-3.74c-0.71-1.16-1.43-2.32-2.15-3.49 + c-1.42,0.08-2.85,0.15-4.28,0.23c-0.71,1.25-1.42,2.49-2.13,3.74c0.71,1.18,1.43,2.35,2.14,3.51 + C538.52,72.59,539.95,72.51,541.38,72.42z"/> + + <linearGradient id="SVGID_69_" gradientUnits="userSpaceOnUse" x1="-275.6177" y1="-281.9995" x2="-271.3281" y2="-274.5698" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_69_)" d="M541.35,61.73c0.71-1.24,1.42-2.48,2.13-3.72c-0.71-1.17-1.43-2.34-2.14-3.51 + c-1.43,0.06-2.85,0.12-4.28,0.19c-0.71,1.24-1.42,2.48-2.13,3.73c0.71,1.18,1.43,2.36,2.14,3.53 + C538.5,61.88,539.92,61.81,541.35,61.73z"/> + + <linearGradient id="SVGID_70_" gradientUnits="userSpaceOnUse" x1="-275.5815" y1="-292.6943" x2="-271.3096" y2="-285.2951" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_70_)" d="M541.32,51.04c0.71-1.24,1.42-2.47,2.13-3.7c-0.71-1.18-1.43-2.35-2.14-3.53 + c-1.43,0.05-2.85,0.1-4.28,0.15c-0.71,1.24-1.42,2.47-2.12,3.71c0.72,1.19,1.43,2.37,2.14,3.55 + C538.47,51.16,539.89,51.1,541.32,51.04z"/> + + <linearGradient id="SVGID_71_" gradientUnits="userSpaceOnUse" x1="-275.5479" y1="-303.3892" x2="-271.2905" y2="-296.0153" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_71_)" d="M541.29,40.35c0.71-1.23,1.42-2.46,2.13-3.68c-0.71-1.18-1.43-2.36-2.14-3.55 + c-1.43,0.04-2.85,0.08-4.28,0.12c-0.71,1.23-1.42,2.46-2.13,3.69c0.71,1.19,1.43,2.38,2.14,3.57 + C538.44,40.45,539.87,40.4,541.29,40.35z"/> + + <linearGradient id="SVGID_72_" gradientUnits="userSpaceOnUse" x1="-275.5142" y1="-314.0815" x2="-271.2734" y2="-306.7364" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_72_)" d="M541.27,29.66c0.71-1.22,1.42-2.44,2.12-3.66c-0.71-1.19-1.43-2.38-2.14-3.57 + c-1.43,0.03-2.85,0.05-4.27,0.08c-0.71,1.22-1.42,2.45-2.13,3.67c0.71,1.2,1.43,2.39,2.14,3.59 + C538.42,29.73,539.84,29.7,541.27,29.66z"/> + + <linearGradient id="SVGID_73_" gradientUnits="userSpaceOnUse" x1="-275.4805" y1="-324.7773" x2="-271.2563" y2="-317.4609" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_73_)" d="M541.24,18.97c0.71-1.22,1.42-2.43,2.12-3.64c-0.71-1.19-1.43-2.39-2.14-3.59 + c-1.43,0.01-2.85,0.03-4.27,0.04c-0.71,1.22-1.42,2.43-2.13,3.65c0.72,1.2,1.43,2.41,2.15,3.6 + C538.39,19.01,539.81,18.99,541.24,18.97z"/> + + <linearGradient id="SVGID_74_" gradientUnits="userSpaceOnUse" x1="-275.4487" y1="-335.4722" x2="-271.2402" y2="-328.1828" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_74_)" d="M541.21,8.28c0.71-1.21,1.42-2.42,2.13-3.62c-0.71-1.2-1.43-2.4-2.14-3.61 + c-1.42,0-2.85,0-4.27,0.01c-0.71,1.21-1.42,2.42-2.12,3.64c0.71,1.21,1.43,2.42,2.14,3.62C538.36,8.3,539.79,8.29,541.21,8.28z"/> + + <linearGradient id="SVGID_75_" gradientUnits="userSpaceOnUse" x1="-264.5215" y1="-264.936" x2="-260.1963" y2="-257.4446" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_75_)" d="M530.23,78.85c0.71-1.26,1.42-2.51,2.13-3.76c-0.71-1.18-1.43-2.35-2.14-3.53 + c-1.43,0.07-2.85,0.14-4.28,0.21c-0.71,1.25-1.42,2.51-2.13,3.77c0.72,1.18,1.43,2.37,2.15,3.55 + C527.38,79.01,528.8,78.93,530.23,78.85z"/> + + <linearGradient id="SVGID_76_" gradientUnits="userSpaceOnUse" x1="-264.4883" y1="-275.7197" x2="-260.1782" y2="-268.2545" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_76_)" d="M530.21,68.07c0.71-1.25,1.42-2.5,2.13-3.75c-0.71-1.18-1.43-2.36-2.15-3.54 + c-1.43,0.06-2.85,0.12-4.28,0.18c-0.71,1.25-1.42,2.5-2.13,3.75c0.71,1.19,1.43,2.38,2.15,3.57 + C527.36,68.2,528.78,68.14,530.21,68.07z"/> + + <linearGradient id="SVGID_77_" gradientUnits="userSpaceOnUse" x1="-264.4595" y1="-286.5088" x2="-260.1611" y2="-279.0638" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_77_)" d="M530.18,57.28c0.71-1.24,1.42-2.49,2.13-3.73c-0.72-1.18-1.43-2.37-2.15-3.56 + c-1.43,0.05-2.85,0.1-4.28,0.15c-0.71,1.24-1.42,2.49-2.13,3.73c0.72,1.2,1.43,2.39,2.15,3.58 + C527.33,57.4,528.76,57.34,530.18,57.28z"/> + + <linearGradient id="SVGID_78_" gradientUnits="userSpaceOnUse" x1="-264.4253" y1="-297.2939" x2="-260.1421" y2="-289.8752" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_78_)" d="M530.16,46.5c0.71-1.24,1.42-2.48,2.13-3.71c-0.72-1.19-1.43-2.38-2.15-3.58 + c-1.43,0.04-2.85,0.08-4.28,0.12c-0.71,1.24-1.42,2.48-2.13,3.72c0.71,1.2,1.43,2.4,2.14,3.6 + C527.31,46.59,528.73,46.55,530.16,46.5z"/> + + <linearGradient id="SVGID_79_" gradientUnits="userSpaceOnUse" x1="-264.395" y1="-308.0801" x2="-260.1265" y2="-300.6867" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_79_)" d="M530.13,35.72c0.71-1.23,1.42-2.47,2.13-3.7c-0.71-1.2-1.43-2.4-2.14-3.6 + c-1.43,0.03-2.85,0.06-4.27,0.08c-0.71,1.23-1.42,2.47-2.13,3.7c0.72,1.21,1.43,2.41,2.15,3.61 + C527.29,35.79,528.71,35.75,530.13,35.72z"/> + + <linearGradient id="SVGID_80_" gradientUnits="userSpaceOnUse" x1="-264.3638" y1="-318.8662" x2="-260.1089" y2="-311.4966" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_80_)" d="M530.11,24.94c0.71-1.23,1.42-2.46,2.13-3.68c-0.71-1.2-1.43-2.41-2.14-3.61 + c-1.43,0.02-2.85,0.04-4.27,0.05c-0.71,1.23-1.42,2.46-2.13,3.69c0.71,1.21,1.43,2.42,2.14,3.63 + C527.26,24.99,528.68,24.96,530.11,24.94z"/> + + <linearGradient id="SVGID_81_" gradientUnits="userSpaceOnUse" x1="-264.333" y1="-329.6528" x2="-260.0918" y2="-322.3069" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_81_)" d="M530.08,14.15c0.71-1.22,1.42-2.44,2.13-3.66c-0.71-1.21-1.43-2.42-2.14-3.63 + c-1.42,0.01-2.85,0.02-4.27,0.02c-0.71,1.22-1.42,2.45-2.13,3.67c0.71,1.22,1.43,2.43,2.14,3.64 + C527.23,14.18,528.66,14.17,530.08,14.15z"/> + + <linearGradient id="SVGID_82_" gradientUnits="userSpaceOnUse" x1="-263.2588" y1="-338.6313" x2="-260.0757" y2="-333.118" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_82_)" d="M523.64-0.28c0.71,1.22,1.43,2.44,2.14,3.66c1.42,0,2.85-0.01,4.27-0.01 + c0.71-1.22,1.42-2.43,2.13-3.65C529.34-0.28,526.49-0.28,523.64-0.28z"/> + + <linearGradient id="SVGID_83_" gradientUnits="userSpaceOnUse" x1="-253.7207" y1="-259.4141" x2="-250.3975" y2="-253.658" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_83_)" d="M521.58,80.65c-0.72-1.19-1.43-2.38-2.15-3.57c-1.43,0.07-2.86,0.13-4.28,0.19 + c-0.71,1.26-1.42,2.52-2.13,3.78C515.87,80.93,518.72,80.8,521.58,80.65z"/> + + <linearGradient id="SVGID_84_" gradientUnits="userSpaceOnUse" x1="-253.7124" y1="-270.2632" x2="-249.3857" y2="-262.7692" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_84_)" d="M519.42,73.57c0.71-1.26,1.42-2.51,2.13-3.76c-0.72-1.19-1.43-2.39-2.15-3.58 + c-1.43,0.06-2.85,0.11-4.28,0.17c-0.71,1.25-1.42,2.51-2.13,3.76c0.71,1.2,1.43,2.4,2.15,3.6C516.57,73.7,518,73.63,519.42,73.57z" + /> + + <linearGradient id="SVGID_85_" gradientUnits="userSpaceOnUse" x1="-253.6851" y1="-281.127" x2="-249.3691" y2="-273.6516" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_85_)" d="M519.4,62.71c0.71-1.25,1.42-2.5,2.13-3.75c-0.71-1.2-1.43-2.4-2.14-3.6 + c-1.43,0.05-2.85,0.1-4.28,0.14c-0.71,1.25-1.42,2.5-2.13,3.75c0.72,1.21,1.43,2.41,2.15,3.61 + C516.54,62.82,517.97,62.77,519.4,62.71z"/> + + <linearGradient id="SVGID_86_" gradientUnits="userSpaceOnUse" x1="-253.6572" y1="-291.9888" x2="-249.3545" y2="-284.5362" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_86_)" d="M519.38,51.85c0.71-1.25,1.42-2.49,2.13-3.74c-0.71-1.2-1.43-2.4-2.14-3.61 + c-1.43,0.04-2.85,0.08-4.28,0.11c-0.71,1.25-1.42,2.49-2.13,3.74c0.72,1.21,1.43,2.42,2.15,3.62 + C516.52,51.94,517.95,51.9,519.38,51.85z"/> + + <linearGradient id="SVGID_87_" gradientUnits="userSpaceOnUse" x1="-253.6299" y1="-302.8511" x2="-249.3389" y2="-295.4188" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_87_)" d="M519.36,40.99c0.71-1.24,1.42-2.48,2.13-3.72c-0.71-1.21-1.43-2.41-2.14-3.62 + c-1.43,0.03-2.85,0.06-4.28,0.08c-0.71,1.24-1.42,2.48-2.13,3.73c0.71,1.21,1.43,2.43,2.15,3.64 + C516.5,41.06,517.93,41.03,519.36,40.99z"/> + + <linearGradient id="SVGID_88_" gradientUnits="userSpaceOnUse" x1="-253.5986" y1="-313.7134" x2="-249.3208" y2="-306.304" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_88_)" d="M519.33,30.13c0.71-1.24,1.42-2.47,2.13-3.71c-0.71-1.21-1.43-2.42-2.14-3.64 + c-1.43,0.02-2.85,0.04-4.28,0.06c-0.71,1.24-1.42,2.47-2.13,3.71c0.71,1.22,1.43,2.43,2.14,3.65 + C516.48,30.18,517.91,30.16,519.33,30.13z"/> + + <linearGradient id="SVGID_89_" gradientUnits="userSpaceOnUse" x1="-253.5713" y1="-324.5762" x2="-249.3047" y2="-317.1862" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_89_)" d="M519.31,19.27c0.71-1.23,1.42-2.46,2.13-3.69c-0.71-1.22-1.43-2.43-2.14-3.65 + c-1.42,0.01-2.85,0.02-4.27,0.03c-0.71,1.23-1.42,2.46-2.13,3.7c0.71,1.22,1.43,2.44,2.14,3.66 + C516.46,19.31,517.88,19.29,519.31,19.27z"/> + + <linearGradient id="SVGID_90_" gradientUnits="userSpaceOnUse" x1="-253.5449" y1="-335.4404" x2="-249.2891" y2="-328.0691" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_90_)" d="M519.29,8.41c0.71-1.23,1.42-2.45,2.12-3.68c-0.71-1.22-1.43-2.44-2.14-3.67c-1.43,0-2.85,0-4.28,0 + c-0.71,1.23-1.42,2.46-2.13,3.69c0.71,1.23,1.43,2.45,2.14,3.67C516.44,8.43,517.86,8.42,519.29,8.41z"/> + + <linearGradient id="SVGID_91_" gradientUnits="userSpaceOnUse" x1="-242.5649" y1="-263.9795" x2="-238.2266" y2="-256.4652" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_91_)" d="M508.27,79.9c0.71-1.26,1.42-2.52,2.13-3.78c-0.72-1.2-1.43-2.41-2.15-3.62 + c-1.43,0.05-2.86,0.1-4.28,0.15c-0.71,1.26-1.42,2.52-2.13,3.78c0.71,1.21,1.43,2.42,2.14,3.63 + C505.41,80.01,506.84,79.96,508.27,79.9z"/> + + <linearGradient id="SVGID_92_" gradientUnits="userSpaceOnUse" x1="-242.5405" y1="-274.9058" x2="-238.2139" y2="-267.4118" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_92_)" d="M508.25,68.97c0.71-1.26,1.42-2.51,2.13-3.77c-0.72-1.21-1.43-2.42-2.15-3.62 + c-1.42,0.04-2.85,0.09-4.28,0.12c-0.71,1.25-1.42,2.51-2.13,3.76c0.71,1.21,1.43,2.43,2.15,3.64 + C505.39,69.07,506.82,69.02,508.25,68.97z"/> + + <linearGradient id="SVGID_93_" gradientUnits="userSpaceOnUse" x1="-242.5171" y1="-285.835" x2="-238.1987" y2="-278.3553" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_93_)" d="M508.23,58.05c0.71-1.25,1.42-2.5,2.13-3.75c-0.71-1.21-1.43-2.42-2.15-3.64 + c-1.42,0.04-2.85,0.07-4.28,0.1c-0.71,1.25-1.42,2.5-2.13,3.75c0.71,1.22,1.43,2.44,2.15,3.65 + C505.38,58.13,506.8,58.09,508.23,58.05z"/> + + <linearGradient id="SVGID_94_" gradientUnits="userSpaceOnUse" x1="-242.4937" y1="-296.7627" x2="-238.186" y2="-289.3017" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_94_)" d="M508.21,47.12c0.71-1.25,1.42-2.49,2.13-3.74c-0.71-1.21-1.43-2.43-2.14-3.65 + c-1.43,0.03-2.85,0.06-4.28,0.08c-0.71,1.25-1.42,2.5-2.13,3.74c0.71,1.22,1.43,2.44,2.14,3.66 + C505.36,47.19,506.78,47.15,508.21,47.12z"/> + + <linearGradient id="SVGID_95_" gradientUnits="userSpaceOnUse" x1="-242.4692" y1="-307.6914" x2="-238.1714" y2="-300.2473" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_95_)" d="M508.19,36.2c0.71-1.25,1.42-2.49,2.13-3.73c-0.71-1.22-1.43-2.44-2.14-3.66 + c-1.42,0.02-2.85,0.04-4.27,0.06c-0.71,1.25-1.42,2.49-2.13,3.74c0.71,1.22,1.43,2.45,2.14,3.67 + C505.34,36.25,506.77,36.22,508.19,36.2z"/> + + <linearGradient id="SVGID_96_" gradientUnits="userSpaceOnUse" x1="-242.4463" y1="-318.6201" x2="-238.1582" y2="-311.1929" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_96_)" d="M508.17,25.27c0.71-1.24,1.42-2.48,2.13-3.72c-0.71-1.22-1.43-2.45-2.14-3.67 + c-1.43,0.01-2.85,0.03-4.28,0.04c-0.71,1.24-1.42,2.48-2.13,3.72c0.71,1.23,1.43,2.46,2.14,3.68 + C505.32,25.31,506.75,25.29,508.17,25.27z"/> + + <linearGradient id="SVGID_97_" gradientUnits="userSpaceOnUse" x1="-242.4224" y1="-329.5483" x2="-238.1445" y2="-322.1389" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_97_)" d="M508.15,14.34c0.71-1.24,1.42-2.47,2.13-3.71c-0.71-1.23-1.43-2.46-2.14-3.69 + c-1.42,0-2.85,0.01-4.27,0.01c-0.71,1.24-1.42,2.47-2.13,3.71c0.71,1.23,1.43,2.46,2.14,3.69 + C505.3,14.37,506.73,14.35,508.15,14.34z"/> + + <linearGradient id="SVGID_98_" gradientUnits="userSpaceOnUse" x1="-241.3369" y1="-338.6299" x2="-238.1338" y2="-333.0819" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_98_)" d="M501.72-0.28c0.71,1.24,1.43,2.47,2.14,3.7c1.43,0,2.85,0,4.27-0.01c0.71-1.23,1.42-2.47,2.13-3.7 + C507.41-0.28,504.57-0.28,501.72-0.28z"/> + + <linearGradient id="SVGID_99_" gradientUnits="userSpaceOnUse" x1="-231.75" y1="-258.5693" x2="-228.4551" y2="-252.8624" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_99_)" d="M499.6,81.57c-0.71-1.21-1.43-2.43-2.14-3.64c-1.43,0.04-2.86,0.08-4.28,0.12 + c-0.71,1.26-1.43,2.52-2.14,3.78C493.89,81.75,496.75,81.67,499.6,81.57z"/> + + <linearGradient id="SVGID_100_" gradientUnits="userSpaceOnUse" x1="-231.75" y1="-269.5381" x2="-227.415" y2="-262.0297" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_100_)" d="M497.46,74.38c0.71-1.26,1.42-2.52,2.13-3.77c-0.71-1.22-1.43-2.43-2.14-3.65 + c-1.43,0.04-2.86,0.07-4.28,0.11c-0.71,1.26-1.42,2.51-2.13,3.77c0.71,1.22,1.43,2.45,2.14,3.67 + C494.6,74.46,496.03,74.42,497.46,74.38z"/> + + <linearGradient id="SVGID_101_" gradientUnits="userSpaceOnUse" x1="-231.7305" y1="-280.5166" x2="-227.4038" y2="-273.0226" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_101_)" d="M497.44,63.4c0.71-1.26,1.42-2.51,2.13-3.76c-0.71-1.22-1.43-2.44-2.14-3.66 + c-1.43,0.03-2.85,0.06-4.28,0.09c-0.71,1.25-1.42,2.51-2.13,3.76c0.71,1.23,1.43,2.45,2.14,3.68 + C494.58,63.47,496.01,63.44,497.44,63.4z"/> + + <linearGradient id="SVGID_102_" gradientUnits="userSpaceOnUse" x1="-231.7104" y1="-291.4966" x2="-227.3921" y2="-284.017" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_102_)" d="M497.42,52.42c0.71-1.25,1.42-2.5,2.13-3.75c-0.71-1.22-1.43-2.45-2.14-3.67 + c-1.42,0.03-2.85,0.05-4.28,0.07c-0.71,1.25-1.42,2.5-2.13,3.75c0.71,1.23,1.43,2.46,2.14,3.68 + C494.57,52.48,496,52.45,497.42,52.42z"/> + + <linearGradient id="SVGID_103_" gradientUnits="userSpaceOnUse" x1="-231.6929" y1="-302.4766" x2="-227.3818" y2="-295.0096" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_103_)" d="M497.4,41.44c0.71-1.25,1.42-2.5,2.13-3.75c-0.72-1.22-1.43-2.45-2.14-3.68 + c-1.42,0.02-2.85,0.04-4.28,0.05c-0.71,1.25-1.43,2.5-2.13,3.75c0.71,1.23,1.43,2.46,2.14,3.69 + C494.55,41.49,495.98,41.47,497.4,41.44z"/> + + <linearGradient id="SVGID_104_" gradientUnits="userSpaceOnUse" x1="-231.6724" y1="-313.4556" x2="-227.3706" y2="-306.0047" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_104_)" d="M497.39,30.46c0.71-1.25,1.42-2.49,2.13-3.74c-0.71-1.23-1.43-2.46-2.14-3.69 + c-1.43,0.01-2.85,0.02-4.28,0.03c-0.71,1.25-1.42,2.49-2.13,3.74c0.71,1.23,1.43,2.46,2.14,3.7 + C494.54,30.5,495.96,30.48,497.39,30.46z"/> + + <linearGradient id="SVGID_105_" gradientUnits="userSpaceOnUse" x1="-231.6548" y1="-324.4355" x2="-227.3584" y2="-316.994" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_105_)" d="M497.38,19.49c0.71-1.24,1.42-2.48,2.13-3.73c-0.71-1.23-1.43-2.46-2.14-3.7 + c-1.42,0.01-2.85,0.01-4.28,0.02c-0.71,1.24-1.42,2.49-2.13,3.73c0.71,1.24,1.43,2.47,2.14,3.71 + C494.52,19.51,495.95,19.5,497.38,19.49z"/> + + <linearGradient id="SVGID_106_" gradientUnits="userSpaceOnUse" x1="-231.6353" y1="-335.4165" x2="-227.3472" y2="-327.9893" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_106_)" d="M497.36,8.51c0.71-1.24,1.42-2.48,2.13-3.71c-0.71-1.24-1.43-2.47-2.14-3.71 + c-1.42,0-2.85,0-4.27,0c-0.71,1.24-1.42,2.48-2.13,3.73c0.71,1.24,1.43,2.48,2.14,3.71C494.51,8.52,495.93,8.51,497.36,8.51z"/> + + <linearGradient id="SVGID_107_" gradientUnits="userSpaceOnUse" x1="-220.5879" y1="-263.3618" x2="-216.251" y2="-255.8501" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_107_)" d="M486.29,80.58c0.71-1.26,1.43-2.52,2.14-3.78c-0.71-1.23-1.43-2.45-2.14-3.68 + c-1.43,0.03-2.86,0.06-4.28,0.08c-0.71,1.26-1.42,2.51-2.14,3.77c0.72,1.23,1.43,2.46,2.14,3.69 + C483.43,80.64,484.86,80.61,486.29,80.58z"/> + + <linearGradient id="SVGID_108_" gradientUnits="userSpaceOnUse" x1="-220.5737" y1="-274.3813" x2="-216.2437" y2="-266.8814" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_108_)" d="M486.28,69.56c0.71-1.25,1.42-2.51,2.14-3.77c-0.72-1.23-1.43-2.46-2.15-3.69 + c-1.43,0.03-2.85,0.05-4.28,0.07c-0.71,1.26-1.42,2.51-2.14,3.77c0.72,1.23,1.43,2.47,2.14,3.7 + C483.42,69.62,484.85,69.59,486.28,69.56z"/> + + <linearGradient id="SVGID_109_" gradientUnits="userSpaceOnUse" x1="-220.5591" y1="-285.3999" x2="-216.2354" y2="-277.911" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_109_)" d="M486.27,58.54c0.71-1.25,1.42-2.51,2.13-3.76c-0.71-1.23-1.43-2.46-2.14-3.69 + c-1.43,0.02-2.85,0.04-4.28,0.05c-0.71,1.25-1.42,2.51-2.13,3.76c0.71,1.24,1.43,2.47,2.14,3.71 + C483.41,58.59,484.84,58.57,486.27,58.54z"/> + + <linearGradient id="SVGID_110_" gradientUnits="userSpaceOnUse" x1="-220.5444" y1="-296.4189" x2="-216.2271" y2="-288.941" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_110_)" d="M486.25,47.52c0.71-1.25,1.42-2.5,2.13-3.75c-0.71-1.23-1.43-2.46-2.14-3.7 + c-1.43,0.01-2.85,0.03-4.28,0.04c-0.71,1.25-1.42,2.5-2.13,3.75c0.71,1.24,1.43,2.47,2.14,3.71 + C483.4,47.56,484.83,47.54,486.25,47.52z"/> + + <linearGradient id="SVGID_111_" gradientUnits="userSpaceOnUse" x1="-220.5317" y1="-307.4409" x2="-216.2197" y2="-299.9723" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_111_)" d="M486.24,36.5c0.71-1.25,1.42-2.5,2.13-3.75c-0.71-1.24-1.43-2.47-2.14-3.71 + c-1.43,0.01-2.85,0.02-4.28,0.03c-0.71,1.25-1.42,2.5-2.13,3.75c0.71,1.24,1.43,2.48,2.14,3.71 + C483.39,36.53,484.82,36.52,486.24,36.5z"/> + + <linearGradient id="SVGID_112_" gradientUnits="userSpaceOnUse" x1="-220.5171" y1="-318.4595" x2="-216.2109" y2="-311.001" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_112_)" d="M486.23,25.49c0.71-1.25,1.42-2.49,2.13-3.74c-0.71-1.24-1.43-2.47-2.14-3.71 + c-1.42,0.01-2.85,0.01-4.27,0.02c-0.71,1.25-1.42,2.49-2.13,3.74c0.71,1.24,1.43,2.48,2.14,3.72 + C483.38,25.51,484.8,25.5,486.23,25.49z"/> + + <linearGradient id="SVGID_113_" gradientUnits="userSpaceOnUse" x1="-220.5044" y1="-329.481" x2="-216.2031" y2="-322.0309" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_113_)" d="M486.22,14.47c0.71-1.25,1.42-2.49,2.13-3.74c-0.71-1.24-1.43-2.48-2.14-3.72 + c-1.42,0-2.85,0-4.28,0.01c-0.71,1.24-1.42,2.49-2.13,3.73c0.71,1.24,1.42,2.49,2.14,3.73C483.37,14.48,484.79,14.47,486.22,14.47z + "/> + + <linearGradient id="SVGID_114_" gradientUnits="userSpaceOnUse" x1="-219.4209" y1="-338.6265" x2="-216.2041" y2="-333.0548" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_114_)" d="M479.79-0.28c0.71,1.24,1.43,2.49,2.14,3.73c1.42,0,2.85,0,4.27,0c0.71-1.24,1.42-2.49,2.13-3.73 + C485.49-0.28,482.64-0.28,479.79-0.28z"/> + + <linearGradient id="SVGID_115_" gradientUnits="userSpaceOnUse" x1="-209.7646" y1="-258.085" x2="-206.5078" y2="-252.444" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_115_)" d="M477.62,82.12c-0.72-1.23-1.43-2.47-2.15-3.7c-1.43,0.02-2.86,0.04-4.28,0.05 + c-0.71,1.25-1.43,2.51-2.14,3.76C471.91,82.2,474.76,82.16,477.62,82.12z"/> + + <linearGradient id="SVGID_116_" gradientUnits="userSpaceOnUse" x1="-209.7695" y1="-269.1221" x2="-205.4429" y2="-261.6281" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_116_)" d="M475.47,74.84c0.71-1.25,1.42-2.51,2.14-3.77c-0.71-1.23-1.43-2.47-2.14-3.71 + c-1.43,0.02-2.86,0.03-4.28,0.04c-0.71,1.25-1.43,2.51-2.14,3.76c0.71,1.24,1.43,2.48,2.14,3.72 + C472.62,74.88,474.04,74.86,475.47,74.84z"/> + + <linearGradient id="SVGID_117_" gradientUnits="userSpaceOnUse" x1="-209.7617" y1="-280.1714" x2="-205.4375" y2="-272.6816" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_117_)" d="M475.46,63.8c0.71-1.25,1.43-2.51,2.14-3.76c-0.71-1.24-1.43-2.47-2.14-3.71 + c-1.43,0.02-2.85,0.03-4.28,0.04c-0.71,1.25-1.42,2.5-2.14,3.75c0.72,1.24,1.43,2.48,2.14,3.72 + C472.61,63.83,474.04,63.81,475.46,63.8z"/> + + <linearGradient id="SVGID_118_" gradientUnits="userSpaceOnUse" x1="-209.7529" y1="-291.2163" x2="-205.4326" y2="-283.7333" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_118_)" d="M475.46,52.75c0.71-1.25,1.42-2.5,2.13-3.75c-0.71-1.24-1.43-2.48-2.14-3.72 + c-1.43,0.01-2.85,0.02-4.28,0.03c-0.71,1.25-1.42,2.5-2.14,3.75c0.71,1.24,1.43,2.48,2.14,3.73 + C472.61,52.77,474.03,52.76,475.46,52.75z"/> + + <linearGradient id="SVGID_119_" gradientUnits="userSpaceOnUse" x1="-209.7437" y1="-302.2632" x2="-205.4272" y2="-294.787" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_119_)" d="M475.45,41.7c0.71-1.25,1.42-2.5,2.13-3.75c-0.71-1.24-1.43-2.48-2.14-3.72 + c-1.43,0.01-2.85,0.02-4.28,0.02c-0.71,1.25-1.42,2.5-2.13,3.75c0.71,1.24,1.43,2.49,2.14,3.73 + C472.6,41.72,474.02,41.71,475.45,41.7z"/> + + <linearGradient id="SVGID_120_" gradientUnits="userSpaceOnUse" x1="-209.7354" y1="-313.3101" x2="-205.4229" y2="-305.8406" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_120_)" d="M475.44,30.66c0.71-1.25,1.42-2.5,2.13-3.75c-0.71-1.24-1.43-2.48-2.14-3.73 + c-1.43,0.01-2.85,0.01-4.28,0.02c-0.71,1.25-1.42,2.5-2.13,3.75c0.71,1.24,1.43,2.49,2.14,3.73 + C472.59,30.67,474.02,30.66,475.44,30.66z"/> + + <linearGradient id="SVGID_121_" gradientUnits="userSpaceOnUse" x1="-209.7261" y1="-324.355" x2="-205.417" y2="-316.8914" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_121_)" d="M475.44,19.61c0.71-1.25,1.42-2.49,2.13-3.74c-0.71-1.24-1.43-2.49-2.14-3.73 + c-1.43,0-2.85,0.01-4.27,0.01c-0.71,1.25-1.42,2.5-2.14,3.74c0.71,1.25,1.43,2.49,2.14,3.73 + C472.59,19.62,474.01,19.62,475.44,19.61z"/> + + <linearGradient id="SVGID_122_" gradientUnits="userSpaceOnUse" x1="-209.7183" y1="-335.4033" x2="-205.4121" y2="-327.9449" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_122_)" d="M475.43,8.56c0.71-1.25,1.42-2.49,2.13-3.74c-0.71-1.24-1.43-2.49-2.14-3.73 + c-1.42,0-2.85,0-4.27,0c-0.71,1.25-1.42,2.49-2.13,3.74c0.71,1.25,1.43,2.49,2.14,3.74C472.58,8.57,474,8.57,475.43,8.56z"/> + + <linearGradient id="SVGID_123_" gradientUnits="userSpaceOnUse" x1="90.915" y1="-257.9634" x2="94.127" y2="-252.4002" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_123_)" d="M176.95,82.29c-0.71-1.25-1.43-2.5-2.14-3.75c-1.43,0-2.86-0.01-4.28-0.02 + c-0.71,1.24-1.43,2.49-2.14,3.72C171.23,82.27,174.09,82.28,176.95,82.29z"/> + + <linearGradient id="SVGID_124_" gradientUnits="userSpaceOnUse" x1="90.9062" y1="-269.0225" x2="95.2104" y2="-261.5674" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_124_)" d="M174.8,74.96c0.71-1.25,1.43-2.49,2.14-3.74c-0.71-1.25-1.43-2.5-2.14-3.75 + c-1.43,0-2.86-0.01-4.28-0.01c-0.71,1.25-1.43,2.49-2.14,3.73c0.71,1.25,1.43,2.5,2.14,3.75C171.95,74.95,173.38,74.96,174.8,74.96 + z"/> + + <linearGradient id="SVGID_125_" gradientUnits="userSpaceOnUse" x1="90.9033" y1="-280.0854" x2="95.209" y2="-272.6278" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_125_)" d="M174.8,63.9c0.71-1.25,1.43-2.49,2.14-3.74c-0.71-1.25-1.43-2.5-2.14-3.75 + c-1.43,0-2.85,0-4.28-0.01c-0.71,1.24-1.43,2.49-2.14,3.73c0.71,1.25,1.43,2.5,2.14,3.75C171.95,63.89,173.38,63.89,174.8,63.9z"/> + + <linearGradient id="SVGID_126_" gradientUnits="userSpaceOnUse" x1="90.9009" y1="-291.1475" x2="95.2061" y2="-283.6907" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_126_)" d="M174.81,52.83c0.71-1.25,1.43-2.49,2.14-3.74c-0.71-1.25-1.43-2.5-2.14-3.75 + c-1.43,0-2.85-0.01-4.28-0.01c-0.71,1.24-1.43,2.49-2.14,3.73c0.71,1.25,1.43,2.5,2.14,3.75 + C171.95,52.83,173.38,52.83,174.81,52.83z"/> + + <linearGradient id="SVGID_127_" gradientUnits="userSpaceOnUse" x1="90.8984" y1="-302.2114" x2="95.2056" y2="-294.7513" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_127_)" d="M174.81,41.77c0.71-1.25,1.43-2.49,2.14-3.74c-0.71-1.25-1.43-2.49-2.14-3.74 + c-1.42,0-2.85,0-4.28-0.01c-0.71,1.25-1.43,2.49-2.14,3.74c0.71,1.25,1.42,2.5,2.14,3.75C171.96,41.77,173.38,41.77,174.81,41.77z" + /> + + <linearGradient id="SVGID_128_" gradientUnits="userSpaceOnUse" x1="90.897" y1="-313.2734" x2="95.2036" y2="-305.8141" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_128_)" d="M174.81,30.71c0.71-1.25,1.43-2.5,2.14-3.74c-0.71-1.25-1.42-2.5-2.14-3.74c-1.42,0-2.85,0-4.28,0 + c-0.71,1.25-1.42,2.49-2.14,3.74c0.71,1.25,1.42,2.5,2.14,3.75C171.96,30.7,173.38,30.71,174.81,30.71z"/> + + <linearGradient id="SVGID_129_" gradientUnits="userSpaceOnUse" x1="90.8945" y1="-324.3364" x2="95.2026" y2="-316.8746" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_129_)" d="M174.81,19.64c0.71-1.25,1.42-2.5,2.14-3.74c-0.71-1.25-1.42-2.5-2.14-3.74c-1.42,0-2.85,0-4.27,0 + c-0.71,1.25-1.42,2.49-2.14,3.74c0.71,1.25,1.42,2.5,2.13,3.75C171.96,19.64,173.38,19.64,174.81,19.64z"/> + + <linearGradient id="SVGID_130_" gradientUnits="userSpaceOnUse" x1="90.8911" y1="-335.4014" x2="95.1997" y2="-327.9387" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_130_)" d="M174.81,8.58c0.71-1.25,1.43-2.49,2.14-3.74c-0.71-1.25-1.42-2.5-2.14-3.75c-1.42,0-2.85,0-4.27,0 + c-0.71,1.25-1.43,2.5-2.14,3.74c0.71,1.25,1.42,2.49,2.13,3.74C171.96,8.58,173.39,8.58,174.81,8.58z"/> + + <linearGradient id="SVGID_131_" gradientUnits="userSpaceOnUse" x1="102.0923" y1="-263.147" x2="106.3779" y2="-255.724" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_131_)" d="M163.63,80.83c0.71-1.24,1.43-2.48,2.14-3.72c-0.71-1.25-1.43-2.51-2.14-3.76 + c-1.43-0.02-2.86-0.03-4.28-0.05c-0.71,1.24-1.43,2.47-2.14,3.71c0.71,1.26,1.43,2.51,2.14,3.77 + C160.77,80.8,162.2,80.82,163.63,80.83z"/> + + <linearGradient id="SVGID_132_" gradientUnits="userSpaceOnUse" x1="102.0825" y1="-274.1987" x2="106.3711" y2="-266.7707" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_132_)" d="M163.63,69.78c0.71-1.24,1.43-2.48,2.14-3.72c-0.71-1.25-1.43-2.5-2.14-3.76 + c-1.43-0.01-2.85-0.03-4.28-0.04c-0.71,1.24-1.43,2.47-2.14,3.71c0.71,1.25,1.43,2.51,2.14,3.76 + C160.78,69.75,162.21,69.77,163.63,69.78z"/> + + <linearGradient id="SVGID_133_" gradientUnits="userSpaceOnUse" x1="102.0747" y1="-285.251" x2="106.3657" y2="-277.8187" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_133_)" d="M163.64,58.73c0.71-1.24,1.43-2.48,2.14-3.72c-0.71-1.25-1.43-2.5-2.14-3.75 + c-1.43-0.01-2.85-0.02-4.28-0.04c-0.71,1.24-1.43,2.48-2.14,3.72c0.71,1.25,1.43,2.51,2.14,3.76 + C160.79,58.7,162.21,58.72,163.64,58.73z"/> + + <linearGradient id="SVGID_134_" gradientUnits="userSpaceOnUse" x1="102.0659" y1="-296.3032" x2="106.3608" y2="-288.8642" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_134_)" d="M163.64,47.67c0.71-1.24,1.43-2.48,2.14-3.73c-0.71-1.25-1.43-2.5-2.14-3.75 + c-1.43-0.01-2.85-0.02-4.28-0.03c-0.71,1.24-1.43,2.48-2.14,3.72c0.71,1.25,1.42,2.5,2.14,3.76 + C160.79,47.66,162.22,47.67,163.64,47.67z"/> + + <linearGradient id="SVGID_135_" gradientUnits="userSpaceOnUse" x1="102.0581" y1="-307.3564" x2="106.356" y2="-299.9124" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_135_)" d="M163.65,36.62c0.71-1.24,1.43-2.49,2.14-3.73c-0.71-1.25-1.42-2.5-2.13-3.75 + c-1.43-0.01-2.85-0.01-4.28-0.02c-0.71,1.24-1.43,2.48-2.14,3.72c0.71,1.25,1.42,2.5,2.13,3.75 + C160.8,36.61,162.22,36.61,163.65,36.62z"/> + + <linearGradient id="SVGID_136_" gradientUnits="userSpaceOnUse" x1="102.0498" y1="-318.4067" x2="106.3501" y2="-310.9584" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_136_)" d="M163.66,25.57c0.71-1.24,1.42-2.49,2.14-3.73c-0.71-1.25-1.43-2.5-2.14-3.75 + c-1.42,0-2.85-0.01-4.28-0.01c-0.71,1.24-1.42,2.49-2.14,3.73c0.71,1.25,1.42,2.5,2.13,3.74 + C160.81,25.56,162.23,25.56,163.66,25.57z"/> + + <linearGradient id="SVGID_137_" gradientUnits="userSpaceOnUse" x1="102.041" y1="-329.4595" x2="106.3452" y2="-322.0044" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_137_)" d="M163.66,14.51c0.71-1.24,1.43-2.49,2.14-3.74c-0.71-1.25-1.42-2.5-2.13-3.74 + c-1.42,0-2.85,0-4.27,0c-0.71,1.24-1.43,2.49-2.14,3.73c0.71,1.25,1.42,2.49,2.13,3.74C160.81,14.51,162.24,14.51,163.66,14.51z"/> + + <linearGradient id="SVGID_138_" gradientUnits="userSpaceOnUse" x1="103.1108" y1="-338.6255" x2="106.3306" y2="-333.0488" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_138_)" d="M157.26-0.28c0.71,1.24,1.42,2.49,2.13,3.74c1.42,0,2.85,0,4.27,0c0.71-1.25,1.42-2.49,2.14-3.74 + C162.96-0.28,160.11-0.28,157.26-0.28z"/> + + <linearGradient id="SVGID_139_" gradientUnits="userSpaceOnUse" x1="69.4688" y1="-257.9639" x2="72.6816" y2="-252.399" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_139_)" d="M198.39,82.29c-0.71-1.25-1.43-2.5-2.14-3.75c-1.43,0-2.86-0.01-4.29-0.02 + c-0.71,1.24-1.43,2.49-2.14,3.72C192.68,82.27,195.54,82.28,198.39,82.29z"/> + + <linearGradient id="SVGID_140_" gradientUnits="userSpaceOnUse" x1="69.4604" y1="-269.0225" x2="73.7646" y2="-261.5674" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_140_)" d="M196.25,74.96c0.71-1.25,1.43-2.49,2.14-3.74c-0.71-1.25-1.43-2.5-2.14-3.75 + c-1.43,0-2.85-0.01-4.28-0.01c-0.71,1.25-1.43,2.49-2.14,3.73c0.71,1.25,1.43,2.5,2.14,3.75 + C193.39,74.95,194.82,74.96,196.25,74.96z"/> + + <linearGradient id="SVGID_141_" gradientUnits="userSpaceOnUse" x1="69.4565" y1="-280.0859" x2="73.7627" y2="-272.6275" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_141_)" d="M196.25,63.9c0.71-1.25,1.43-2.49,2.14-3.74c-0.71-1.25-1.43-2.5-2.14-3.75 + c-1.43,0-2.85,0-4.28-0.01c-0.71,1.24-1.43,2.49-2.14,3.73c0.71,1.25,1.43,2.5,2.14,3.75C193.4,63.89,194.82,63.89,196.25,63.9z"/> + + <linearGradient id="SVGID_142_" gradientUnits="userSpaceOnUse" x1="69.4551" y1="-291.1479" x2="73.7607" y2="-283.6903" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_142_)" d="M196.25,52.83c0.71-1.25,1.43-2.49,2.14-3.74c-0.71-1.25-1.43-2.5-2.14-3.75 + c-1.43,0-2.85-0.01-4.28-0.01c-0.71,1.24-1.43,2.49-2.14,3.73c0.71,1.25,1.43,2.5,2.14,3.75C193.4,52.83,194.83,52.83,196.25,52.83 + z"/> + + <linearGradient id="SVGID_143_" gradientUnits="userSpaceOnUse" x1="69.4531" y1="-302.2114" x2="73.7603" y2="-294.7513" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_143_)" d="M196.25,41.77c0.71-1.25,1.43-2.49,2.14-3.74c-0.71-1.25-1.43-2.49-2.14-3.74 + c-1.42,0-2.85,0-4.28-0.01c-0.71,1.25-1.43,2.49-2.14,3.74c0.71,1.25,1.42,2.5,2.14,3.75C193.4,41.77,194.83,41.77,196.25,41.77z" + /> + + <linearGradient id="SVGID_144_" gradientUnits="userSpaceOnUse" x1="69.4507" y1="-313.2739" x2="73.7578" y2="-305.8138" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_144_)" d="M196.26,30.71c0.71-1.25,1.42-2.5,2.14-3.74c-0.71-1.25-1.42-2.5-2.14-3.74c-1.43,0-2.85,0-4.28,0 + c-0.71,1.25-1.42,2.49-2.14,3.74c0.71,1.25,1.42,2.5,2.14,3.75C193.4,30.7,194.83,30.71,196.26,30.71z"/> + + <linearGradient id="SVGID_145_" gradientUnits="userSpaceOnUse" x1="69.4487" y1="-324.3374" x2="73.7573" y2="-316.8747" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_145_)" d="M196.26,19.64c0.71-1.25,1.42-2.5,2.14-3.74c-0.71-1.25-1.42-2.5-2.13-3.74c-1.43,0-2.85,0-4.28,0 + c-0.71,1.25-1.42,2.49-2.14,3.74c0.71,1.25,1.42,2.5,2.13,3.75C193.41,19.64,194.83,19.64,196.26,19.64z"/> + + <linearGradient id="SVGID_146_" gradientUnits="userSpaceOnUse" x1="69.4448" y1="-335.4019" x2="73.7539" y2="-327.9383" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_146_)" d="M196.26,8.58c0.71-1.25,1.42-2.49,2.14-3.74c-0.71-1.25-1.42-2.5-2.13-3.75c-1.43,0-2.85,0-4.27,0 + c-0.71,1.25-1.42,2.5-2.14,3.74c0.71,1.25,1.42,2.49,2.13,3.74C193.41,8.58,194.83,8.58,196.26,8.58z"/> + + <linearGradient id="SVGID_147_" gradientUnits="userSpaceOnUse" x1="80.647" y1="-263.147" x2="84.9326" y2="-255.724" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_147_)" d="M185.07,80.83c0.71-1.24,1.43-2.48,2.14-3.72c-0.71-1.25-1.43-2.51-2.14-3.76 + c-1.43-0.02-2.86-0.03-4.28-0.05c-0.71,1.24-1.43,2.47-2.14,3.71c0.71,1.26,1.43,2.51,2.14,3.77 + C182.22,80.8,183.64,80.82,185.07,80.83z"/> + + <linearGradient id="SVGID_148_" gradientUnits="userSpaceOnUse" x1="80.6372" y1="-274.1987" x2="84.9258" y2="-266.7707" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_148_)" d="M185.08,69.78c0.71-1.24,1.43-2.48,2.14-3.72c-0.71-1.25-1.42-2.5-2.14-3.76 + c-1.43-0.01-2.85-0.03-4.28-0.04c-0.71,1.24-1.43,2.47-2.14,3.71c0.71,1.25,1.43,2.51,2.14,3.76 + C182.22,69.75,183.65,69.77,185.08,69.78z"/> + + <linearGradient id="SVGID_149_" gradientUnits="userSpaceOnUse" x1="80.6304" y1="-285.251" x2="84.9219" y2="-277.8179" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_149_)" d="M185.08,58.73c0.71-1.24,1.43-2.48,2.14-3.72c-0.71-1.25-1.43-2.5-2.14-3.75 + c-1.43-0.01-2.85-0.02-4.28-0.04c-0.71,1.24-1.43,2.48-2.14,3.72c0.71,1.25,1.43,2.51,2.14,3.76 + C182.23,58.7,183.66,58.72,185.08,58.73z"/> + + <linearGradient id="SVGID_150_" gradientUnits="userSpaceOnUse" x1="80.6216" y1="-296.3037" x2="84.917" y2="-288.8638" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_150_)" d="M185.09,47.67c0.71-1.24,1.43-2.48,2.14-3.73c-0.71-1.25-1.43-2.5-2.14-3.75 + c-1.43-0.01-2.85-0.02-4.28-0.03c-0.71,1.24-1.43,2.48-2.14,3.72c0.71,1.25,1.43,2.5,2.14,3.76 + C182.24,47.66,183.67,47.67,185.09,47.67z"/> + + <linearGradient id="SVGID_151_" gradientUnits="userSpaceOnUse" x1="80.6123" y1="-307.356" x2="84.9102" y2="-299.9119" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_151_)" d="M185.1,36.62c0.71-1.24,1.43-2.49,2.14-3.73c-0.71-1.25-1.42-2.5-2.13-3.75 + c-1.43-0.01-2.85-0.01-4.28-0.02c-0.71,1.24-1.43,2.48-2.14,3.72c0.71,1.25,1.42,2.5,2.13,3.75 + C182.24,36.61,183.67,36.61,185.1,36.62z"/> + + <linearGradient id="SVGID_152_" gradientUnits="userSpaceOnUse" x1="80.604" y1="-318.4067" x2="84.9043" y2="-310.9584" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_152_)" d="M185.1,25.57c0.71-1.24,1.42-2.49,2.14-3.73c-0.71-1.25-1.42-2.5-2.14-3.75 + c-1.42,0-2.85-0.01-4.28-0.01c-0.71,1.24-1.43,2.49-2.14,3.73c0.71,1.25,1.42,2.5,2.13,3.74C182.25,25.56,183.68,25.56,185.1,25.57 + z"/> + + <linearGradient id="SVGID_153_" gradientUnits="userSpaceOnUse" x1="80.5957" y1="-329.4595" x2="84.8999" y2="-322.0044" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_153_)" d="M185.11,14.51c0.71-1.24,1.43-2.49,2.14-3.74c-0.71-1.25-1.42-2.5-2.13-3.74 + c-1.42,0-2.85,0-4.27,0c-0.71,1.24-1.43,2.49-2.14,3.73c0.71,1.25,1.42,2.49,2.13,3.74C182.26,14.51,183.68,14.51,185.11,14.51z"/> + + <linearGradient id="SVGID_154_" gradientUnits="userSpaceOnUse" x1="81.665" y1="-338.6255" x2="84.8848" y2="-333.0488" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_154_)" d="M178.71-0.28c0.71,1.24,1.42,2.49,2.13,3.74c1.42,0,2.85,0,4.27,0c0.71-1.25,1.42-2.49,2.14-3.74 + C184.4-0.28,181.56-0.28,178.71-0.28z"/> + + <linearGradient id="SVGID_155_" gradientUnits="userSpaceOnUse" x1="48.0234" y1="-257.9639" x2="51.2363" y2="-252.399" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_155_)" d="M219.84,82.29c-0.71-1.25-1.43-2.5-2.14-3.75c-1.43,0-2.86-0.01-4.29-0.02 + c-0.71,1.24-1.43,2.49-2.14,3.72C214.12,82.27,216.98,82.28,219.84,82.29z"/> + + <linearGradient id="SVGID_156_" gradientUnits="userSpaceOnUse" x1="48.0156" y1="-269.0225" x2="52.3203" y2="-261.5665" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_156_)" d="M217.7,74.96c0.71-1.25,1.43-2.49,2.14-3.74c-0.72-1.25-1.43-2.5-2.14-3.75 + c-1.43,0-2.85-0.01-4.28-0.01c-0.71,1.25-1.43,2.49-2.14,3.73c0.71,1.25,1.43,2.5,2.14,3.75C214.84,74.95,216.27,74.96,217.7,74.96 + z"/> + + <linearGradient id="SVGID_157_" gradientUnits="userSpaceOnUse" x1="48.0117" y1="-280.0859" x2="52.3179" y2="-272.6275" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_157_)" d="M217.7,63.9c0.71-1.25,1.43-2.49,2.14-3.74c-0.71-1.25-1.43-2.5-2.14-3.75 + c-1.43,0-2.85,0-4.28-0.01c-0.71,1.24-1.43,2.49-2.14,3.73c0.71,1.25,1.43,2.5,2.14,3.75C214.84,63.89,216.27,63.89,217.7,63.9z"/> + + <linearGradient id="SVGID_158_" gradientUnits="userSpaceOnUse" x1="48.0107" y1="-291.1484" x2="52.3169" y2="-283.69" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_158_)" d="M217.7,52.83c0.71-1.25,1.43-2.49,2.14-3.74c-0.71-1.25-1.43-2.5-2.14-3.75 + c-1.43,0-2.85-0.01-4.28-0.01c-0.71,1.24-1.42,2.49-2.14,3.73c0.71,1.25,1.43,2.5,2.14,3.75C214.84,52.83,216.27,52.83,217.7,52.83 + z"/> + + <linearGradient id="SVGID_159_" gradientUnits="userSpaceOnUse" x1="48.0078" y1="-302.2109" x2="52.3149" y2="-294.7508" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_159_)" d="M217.7,41.77c0.71-1.25,1.43-2.49,2.14-3.74c-0.71-1.25-1.43-2.49-2.14-3.74 + c-1.42,0-2.85,0-4.28-0.01c-0.71,1.25-1.43,2.49-2.14,3.74c0.71,1.25,1.42,2.5,2.14,3.75C214.85,41.77,216.27,41.77,217.7,41.77z" + /> + + <linearGradient id="SVGID_160_" gradientUnits="userSpaceOnUse" x1="48.0054" y1="-313.2739" x2="52.3125" y2="-305.8138" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_160_)" d="M217.7,30.71c0.71-1.25,1.42-2.5,2.14-3.74c-0.71-1.25-1.42-2.5-2.14-3.74c-1.43,0-2.85,0-4.28,0 + c-0.71,1.25-1.42,2.49-2.14,3.74c0.71,1.25,1.42,2.5,2.14,3.75C214.85,30.7,216.28,30.71,217.7,30.71z"/> + + <linearGradient id="SVGID_161_" gradientUnits="userSpaceOnUse" x1="48.0029" y1="-324.3374" x2="52.3115" y2="-316.8747" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_161_)" d="M217.7,19.64c0.71-1.25,1.42-2.5,2.14-3.74c-0.71-1.25-1.42-2.5-2.13-3.74c-1.43,0-2.85,0-4.28,0 + c-0.71,1.25-1.42,2.49-2.14,3.74c0.71,1.25,1.42,2.5,2.13,3.75C214.85,19.64,216.28,19.64,217.7,19.64z"/> + + <linearGradient id="SVGID_162_" gradientUnits="userSpaceOnUse" x1="47.9995" y1="-335.4019" x2="52.3086" y2="-327.9383" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_162_)" d="M217.7,8.58c0.71-1.25,1.42-2.49,2.14-3.74c-0.71-1.25-1.42-2.5-2.13-3.75c-1.43,0-2.85,0-4.27,0 + c-0.71,1.25-1.42,2.5-2.14,3.74c0.71,1.25,1.42,2.49,2.13,3.74C214.85,8.58,216.28,8.58,217.7,8.58z"/> + + <linearGradient id="SVGID_163_" gradientUnits="userSpaceOnUse" x1="59.2012" y1="-263.1475" x2="63.4878" y2="-255.7228" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_163_)" d="M206.52,80.83c0.71-1.24,1.43-2.48,2.14-3.72c-0.71-1.25-1.43-2.51-2.14-3.76 + c-1.43-0.02-2.86-0.03-4.29-0.05c-0.71,1.24-1.43,2.47-2.14,3.71c0.71,1.26,1.43,2.51,2.14,3.77 + C203.66,80.8,205.09,80.82,206.52,80.83z"/> + + <linearGradient id="SVGID_164_" gradientUnits="userSpaceOnUse" x1="59.1914" y1="-274.1997" x2="63.481" y2="-266.77" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_164_)" d="M206.53,69.78c0.71-1.24,1.43-2.48,2.14-3.72c-0.71-1.25-1.42-2.5-2.14-3.76 + c-1.43-0.01-2.86-0.03-4.29-0.04c-0.71,1.24-1.43,2.47-2.14,3.71c0.71,1.25,1.43,2.51,2.14,3.76 + C203.67,69.75,205.1,69.77,206.53,69.78z"/> + + <linearGradient id="SVGID_165_" gradientUnits="userSpaceOnUse" x1="59.1846" y1="-285.251" x2="63.4761" y2="-277.8179" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_165_)" d="M206.53,58.73c0.71-1.24,1.43-2.48,2.14-3.72c-0.71-1.25-1.43-2.5-2.14-3.75 + c-1.43-0.01-2.85-0.02-4.28-0.04c-0.71,1.24-1.43,2.48-2.14,3.72c0.71,1.25,1.43,2.51,2.14,3.76 + C203.68,58.7,205.1,58.72,206.53,58.73z"/> + + <linearGradient id="SVGID_166_" gradientUnits="userSpaceOnUse" x1="59.1753" y1="-296.3032" x2="63.4707" y2="-288.8633" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_166_)" d="M206.54,47.67c0.71-1.24,1.43-2.48,2.14-3.73c-0.71-1.25-1.43-2.5-2.14-3.75 + c-1.43-0.01-2.85-0.02-4.28-0.03c-0.71,1.24-1.43,2.48-2.14,3.72c0.71,1.25,1.43,2.5,2.14,3.76 + C203.68,47.66,205.11,47.67,206.54,47.67z"/> + + <linearGradient id="SVGID_167_" gradientUnits="userSpaceOnUse" x1="59.1665" y1="-307.3555" x2="63.4644" y2="-299.9114" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_167_)" d="M206.54,36.62c0.71-1.24,1.43-2.49,2.14-3.73c-0.71-1.25-1.42-2.5-2.13-3.75 + c-1.43-0.01-2.85-0.01-4.28-0.02c-0.71,1.24-1.43,2.48-2.14,3.72c0.71,1.25,1.42,2.5,2.13,3.75 + C203.69,36.61,205.12,36.61,206.54,36.62z"/> + + <linearGradient id="SVGID_168_" gradientUnits="userSpaceOnUse" x1="59.1582" y1="-318.4077" x2="63.459" y2="-310.9586" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_168_)" d="M206.55,25.57c0.71-1.24,1.42-2.49,2.14-3.73c-0.71-1.25-1.42-2.5-2.13-3.75 + c-1.43,0-2.85-0.01-4.28-0.01c-0.71,1.24-1.43,2.49-2.14,3.73c0.71,1.25,1.42,2.5,2.13,3.74C203.7,25.56,205.12,25.56,206.55,25.57 + z"/> + + <linearGradient id="SVGID_169_" gradientUnits="userSpaceOnUse" x1="59.1489" y1="-329.46" x2="63.4536" y2="-322.004" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_169_)" d="M206.55,14.51c0.71-1.24,1.42-2.49,2.14-3.74c-0.71-1.25-1.42-2.5-2.13-3.74 + c-1.42,0-2.85,0-4.27,0c-0.71,1.24-1.43,2.49-2.14,3.73c0.71,1.25,1.42,2.49,2.13,3.74C203.7,14.51,205.13,14.51,206.55,14.51z"/> + + <linearGradient id="SVGID_170_" gradientUnits="userSpaceOnUse" x1="60.2197" y1="-338.6255" x2="63.4395" y2="-333.0488" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_170_)" d="M200.15-0.28c0.71,1.24,1.42,2.49,2.13,3.74c1.42,0,2.85,0,4.27,0c0.71-1.25,1.42-2.49,2.14-3.74 + C205.85-0.28,203-0.28,200.15-0.28z"/> + + <linearGradient id="SVGID_171_" gradientUnits="userSpaceOnUse" x1="26.5781" y1="-257.9639" x2="29.791" y2="-252.399" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_171_)" d="M241.28,82.29c-0.71-1.25-1.43-2.5-2.14-3.75c-1.43,0-2.86-0.01-4.29-0.02 + c-0.71,1.24-1.43,2.49-2.14,3.72C235.57,82.27,238.43,82.28,241.28,82.29z"/> + + <linearGradient id="SVGID_172_" gradientUnits="userSpaceOnUse" x1="26.5708" y1="-269.0229" x2="30.8755" y2="-261.567" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_172_)" d="M239.14,74.96c0.71-1.25,1.43-2.49,2.14-3.74c-0.72-1.25-1.43-2.5-2.14-3.75 + c-1.43,0-2.85-0.01-4.28-0.01c-0.71,1.25-1.43,2.49-2.14,3.73c0.71,1.25,1.43,2.5,2.14,3.75 + C236.29,74.95,237.71,74.96,239.14,74.96z"/> + + <linearGradient id="SVGID_173_" gradientUnits="userSpaceOnUse" x1="26.5664" y1="-280.0859" x2="30.8726" y2="-272.6275" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_173_)" d="M239.14,63.9c0.71-1.25,1.43-2.49,2.14-3.74c-0.71-1.25-1.43-2.5-2.14-3.75 + c-1.43,0-2.85,0-4.28-0.01c-0.71,1.24-1.43,2.49-2.14,3.73c0.71,1.25,1.43,2.5,2.14,3.75C236.29,63.89,237.71,63.89,239.14,63.9z" + /> + + <linearGradient id="SVGID_174_" gradientUnits="userSpaceOnUse" x1="26.5654" y1="-291.1484" x2="30.8716" y2="-283.69" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_174_)" d="M239.14,52.83c0.71-1.25,1.43-2.49,2.14-3.74c-0.71-1.25-1.43-2.5-2.14-3.75 + c-1.43,0-2.85-0.01-4.28-0.01c-0.71,1.24-1.43,2.49-2.14,3.73c0.71,1.25,1.43,2.5,2.14,3.75 + C236.29,52.83,237.72,52.83,239.14,52.83z"/> + + <linearGradient id="SVGID_175_" gradientUnits="userSpaceOnUse" x1="26.5625" y1="-302.2109" x2="30.8696" y2="-294.7508" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_175_)" d="M239.14,41.77c0.71-1.25,1.43-2.49,2.14-3.74c-0.71-1.25-1.43-2.49-2.14-3.74 + c-1.42,0-2.85,0-4.28-0.01c-0.71,1.25-1.43,2.49-2.14,3.74c0.71,1.25,1.42,2.5,2.14,3.75C236.29,41.77,237.72,41.77,239.14,41.77z" + /> + + <linearGradient id="SVGID_176_" gradientUnits="userSpaceOnUse" x1="26.5601" y1="-313.2739" x2="30.8672" y2="-305.8138" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_176_)" d="M239.15,30.71c0.71-1.25,1.42-2.5,2.14-3.74c-0.71-1.25-1.42-2.5-2.14-3.74c-1.43,0-2.85,0-4.28,0 + c-0.71,1.25-1.42,2.49-2.14,3.74c0.71,1.25,1.42,2.5,2.14,3.75C236.29,30.7,237.72,30.71,239.15,30.71z"/> + + <linearGradient id="SVGID_177_" gradientUnits="userSpaceOnUse" x1="26.5576" y1="-324.3374" x2="30.8662" y2="-316.8747" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_177_)" d="M239.15,19.64c0.71-1.25,1.42-2.5,2.14-3.74c-0.71-1.25-1.42-2.5-2.13-3.74c-1.43,0-2.85,0-4.28,0 + c-0.71,1.25-1.42,2.49-2.14,3.74c0.71,1.25,1.42,2.5,2.13,3.75C236.3,19.64,237.72,19.64,239.15,19.64z"/> + + <linearGradient id="SVGID_178_" gradientUnits="userSpaceOnUse" x1="26.5547" y1="-335.4023" x2="30.8638" y2="-327.9388" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_178_)" d="M239.15,8.58c0.71-1.25,1.42-2.49,2.14-3.74c-0.71-1.25-1.42-2.5-2.13-3.75c-1.43,0-2.85,0-4.27,0 + c-0.71,1.25-1.42,2.5-2.14,3.74c0.71,1.25,1.42,2.49,2.13,3.74C236.3,8.58,237.72,8.58,239.15,8.58z"/> + + <linearGradient id="SVGID_179_" gradientUnits="userSpaceOnUse" x1="37.7559" y1="-263.1475" x2="42.0425" y2="-255.7228" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_179_)" d="M227.96,80.83c0.71-1.24,1.43-2.48,2.14-3.72c-0.71-1.25-1.43-2.51-2.14-3.76 + c-1.43-0.02-2.86-0.03-4.29-0.05c-0.71,1.24-1.43,2.47-2.14,3.71c0.71,1.26,1.43,2.51,2.14,3.77 + C225.11,80.8,226.54,80.82,227.96,80.83z"/> + + <linearGradient id="SVGID_180_" gradientUnits="userSpaceOnUse" x1="37.7461" y1="-274.1997" x2="42.0356" y2="-266.77" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_180_)" d="M227.97,69.78c0.71-1.24,1.43-2.48,2.14-3.72c-0.71-1.25-1.43-2.5-2.14-3.76 + c-1.43-0.01-2.86-0.03-4.29-0.04c-0.71,1.24-1.43,2.47-2.14,3.71c0.71,1.25,1.43,2.51,2.14,3.76 + C225.11,69.75,226.54,69.77,227.97,69.78z"/> + + <linearGradient id="SVGID_181_" gradientUnits="userSpaceOnUse" x1="37.7393" y1="-285.251" x2="42.0308" y2="-277.8179" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_181_)" d="M227.98,58.73c0.71-1.24,1.43-2.48,2.14-3.72c-0.71-1.25-1.43-2.5-2.14-3.75 + c-1.43-0.01-2.85-0.02-4.28-0.04c-0.71,1.24-1.43,2.48-2.14,3.72c0.71,1.25,1.43,2.51,2.14,3.76 + C225.12,58.7,226.55,58.72,227.98,58.73z"/> + + <linearGradient id="SVGID_182_" gradientUnits="userSpaceOnUse" x1="37.73" y1="-296.3032" x2="42.0254" y2="-288.8633" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_182_)" d="M227.98,47.67c0.71-1.24,1.43-2.48,2.14-3.73c-0.71-1.25-1.43-2.5-2.14-3.75 + c-1.43-0.01-2.85-0.02-4.28-0.03c-0.71,1.24-1.43,2.48-2.14,3.72c0.71,1.25,1.43,2.5,2.14,3.76 + C225.13,47.66,226.56,47.67,227.98,47.67z"/> + + <linearGradient id="SVGID_183_" gradientUnits="userSpaceOnUse" x1="37.7207" y1="-307.3555" x2="42.0186" y2="-299.9114" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_183_)" d="M227.99,36.62c0.71-1.24,1.43-2.49,2.14-3.73c-0.71-1.25-1.42-2.5-2.13-3.75 + c-1.43-0.01-2.85-0.01-4.28-0.02c-0.71,1.24-1.43,2.48-2.14,3.72c0.71,1.25,1.42,2.5,2.13,3.75 + C225.13,36.61,226.56,36.61,227.99,36.62z"/> + + <linearGradient id="SVGID_184_" gradientUnits="userSpaceOnUse" x1="37.7129" y1="-318.4077" x2="42.0137" y2="-310.9586" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_184_)" d="M227.99,25.57c0.71-1.24,1.42-2.49,2.14-3.73c-0.71-1.25-1.42-2.5-2.13-3.75 + c-1.43,0-2.85-0.01-4.28-0.01c-0.71,1.24-1.42,2.49-2.14,3.73c0.71,1.25,1.42,2.5,2.13,3.74 + C225.14,25.56,226.57,25.56,227.99,25.57z"/> + + <linearGradient id="SVGID_185_" gradientUnits="userSpaceOnUse" x1="37.7046" y1="-329.459" x2="42.0088" y2="-322.0039" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_185_)" d="M228,14.51c0.71-1.24,1.42-2.49,2.14-3.74c-0.71-1.25-1.42-2.5-2.14-3.74c-1.42,0-2.85,0-4.27,0 + c-0.71,1.24-1.43,2.49-2.14,3.73c0.71,1.25,1.42,2.49,2.13,3.74C225.15,14.51,226.57,14.51,228,14.51z"/> + + <linearGradient id="SVGID_186_" gradientUnits="userSpaceOnUse" x1="38.7744" y1="-338.6255" x2="41.9941" y2="-333.0488" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_186_)" d="M221.6-0.28c0.71,1.24,1.42,2.49,2.13,3.74c1.42,0,2.85,0,4.27,0c0.71-1.25,1.42-2.49,2.14-3.74 + C227.29-0.28,224.45-0.28,221.6-0.28z"/> + + <linearGradient id="SVGID_187_" gradientUnits="userSpaceOnUse" x1="5.1328" y1="-257.9639" x2="8.3452" y2="-252.3998" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_187_)" d="M262.73,82.29c-0.71-1.25-1.43-2.5-2.14-3.75c-1.43,0-2.86-0.01-4.29-0.02 + c-0.71,1.24-1.43,2.49-2.14,3.72C257.02,82.27,259.87,82.28,262.73,82.29z"/> + + <linearGradient id="SVGID_188_" gradientUnits="userSpaceOnUse" x1="5.1255" y1="-269.0229" x2="9.4302" y2="-261.567" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_188_)" d="M260.59,74.96c0.71-1.25,1.43-2.49,2.14-3.74c-0.72-1.25-1.43-2.5-2.14-3.75 + c-1.43,0-2.85-0.01-4.28-0.01c-0.71,1.25-1.43,2.49-2.14,3.73c0.71,1.25,1.42,2.5,2.14,3.75 + C257.73,74.95,259.16,74.96,260.59,74.96z"/> + + <linearGradient id="SVGID_189_" gradientUnits="userSpaceOnUse" x1="5.1216" y1="-280.0859" x2="9.4277" y2="-272.6275" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_189_)" d="M260.59,63.9c0.71-1.25,1.43-2.49,2.14-3.74c-0.71-1.25-1.43-2.5-2.14-3.75 + c-1.43,0-2.85,0-4.28-0.01c-0.71,1.24-1.43,2.49-2.14,3.73c0.71,1.25,1.43,2.5,2.14,3.75C257.73,63.89,259.16,63.89,260.59,63.9z" + /> + + <linearGradient id="SVGID_190_" gradientUnits="userSpaceOnUse" x1="5.1201" y1="-291.1484" x2="9.4263" y2="-283.69" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_190_)" d="M260.59,52.83c0.71-1.25,1.43-2.49,2.14-3.74c-0.71-1.25-1.43-2.5-2.14-3.75 + c-1.43,0-2.85-0.01-4.28-0.01c-0.71,1.24-1.43,2.49-2.14,3.73c0.71,1.25,1.43,2.5,2.14,3.75 + C257.73,52.83,259.16,52.83,260.59,52.83z"/> + + <linearGradient id="SVGID_191_" gradientUnits="userSpaceOnUse" x1="5.1172" y1="-302.2114" x2="9.4243" y2="-294.7513" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_191_)" d="M260.59,41.77c0.71-1.25,1.43-2.49,2.14-3.74c-0.71-1.25-1.43-2.49-2.14-3.74 + c-1.42,0-2.85,0-4.28-0.01c-0.71,1.25-1.43,2.49-2.14,3.74c0.71,1.25,1.42,2.5,2.13,3.75C257.74,41.77,259.16,41.77,260.59,41.77z" + /> + + <linearGradient id="SVGID_192_" gradientUnits="userSpaceOnUse" x1="5.1143" y1="-313.2739" x2="9.4214" y2="-305.8138" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_192_)" d="M260.59,30.71c0.71-1.25,1.42-2.5,2.14-3.74c-0.71-1.25-1.42-2.5-2.14-3.74c-1.42,0-2.85,0-4.28,0 + c-0.71,1.25-1.42,2.49-2.13,3.74c0.71,1.25,1.42,2.5,2.13,3.75C257.74,30.7,259.17,30.71,260.59,30.71z"/> + + <linearGradient id="SVGID_193_" gradientUnits="userSpaceOnUse" x1="5.1123" y1="-324.3374" x2="9.4209" y2="-316.8747" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_193_)" d="M260.59,19.64c0.71-1.25,1.42-2.5,2.14-3.74c-0.71-1.25-1.42-2.5-2.13-3.74c-1.42,0-2.85,0-4.28,0 + c-0.71,1.25-1.42,2.49-2.13,3.74c0.71,1.25,1.42,2.5,2.13,3.75C257.74,19.64,259.17,19.64,260.59,19.64z"/> + + <linearGradient id="SVGID_194_" gradientUnits="userSpaceOnUse" x1="5.1094" y1="-335.4019" x2="9.4185" y2="-327.9383" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_194_)" d="M260.59,8.58c0.71-1.25,1.42-2.49,2.14-3.74c-0.71-1.25-1.42-2.5-2.13-3.75c-1.42,0-2.85,0-4.27,0 + c-0.71,1.25-1.42,2.5-2.13,3.74c0.71,1.25,1.42,2.49,2.13,3.74C257.74,8.58,259.17,8.58,260.59,8.58z"/> + + <linearGradient id="SVGID_195_" gradientUnits="userSpaceOnUse" x1="16.311" y1="-263.1479" x2="20.5977" y2="-255.7233" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_195_)" d="M249.41,80.83c0.71-1.24,1.43-2.48,2.14-3.72c-0.71-1.25-1.43-2.51-2.14-3.76 + c-1.43-0.02-2.86-0.03-4.29-0.05c-0.71,1.24-1.43,2.47-2.14,3.71c0.71,1.26,1.43,2.51,2.14,3.77 + C246.55,80.8,247.98,80.82,249.41,80.83z"/> + + <linearGradient id="SVGID_196_" gradientUnits="userSpaceOnUse" x1="16.3008" y1="-274.1997" x2="20.5903" y2="-266.77" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_196_)" d="M249.42,69.78c0.71-1.24,1.43-2.48,2.14-3.72c-0.71-1.25-1.43-2.5-2.14-3.76 + c-1.43-0.01-2.86-0.03-4.29-0.04c-0.71,1.24-1.43,2.47-2.14,3.71c0.71,1.25,1.43,2.51,2.14,3.76 + C246.56,69.75,247.99,69.77,249.42,69.78z"/> + + <linearGradient id="SVGID_197_" gradientUnits="userSpaceOnUse" x1="16.2935" y1="-285.251" x2="20.585" y2="-277.8179" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_197_)" d="M249.42,58.73c0.71-1.24,1.43-2.48,2.14-3.72c-0.71-1.25-1.43-2.5-2.14-3.75 + c-1.43-0.01-2.85-0.02-4.28-0.04c-0.71,1.24-1.43,2.48-2.14,3.72c0.71,1.25,1.43,2.51,2.14,3.76 + C246.57,58.7,247.99,58.72,249.42,58.73z"/> + + <linearGradient id="SVGID_198_" gradientUnits="userSpaceOnUse" x1="16.2842" y1="-296.3032" x2="20.5796" y2="-288.8633" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_198_)" d="M249.43,47.67c0.71-1.24,1.43-2.48,2.14-3.73c-0.71-1.25-1.43-2.5-2.14-3.75 + c-1.43-0.01-2.85-0.02-4.28-0.03c-0.71,1.24-1.43,2.48-2.14,3.72c0.71,1.25,1.43,2.5,2.14,3.76 + C246.57,47.66,248,47.67,249.43,47.67z"/> + + <linearGradient id="SVGID_199_" gradientUnits="userSpaceOnUse" x1="16.2764" y1="-307.356" x2="20.5742" y2="-299.9119" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_199_)" d="M249.43,36.62c0.71-1.24,1.43-2.49,2.14-3.73c-0.71-1.25-1.42-2.5-2.13-3.75 + c-1.43-0.01-2.85-0.01-4.28-0.02c-0.71,1.24-1.43,2.48-2.14,3.72c0.71,1.25,1.42,2.5,2.13,3.75 + C246.58,36.61,248.01,36.61,249.43,36.62z"/> + + <linearGradient id="SVGID_200_" gradientUnits="userSpaceOnUse" x1="16.2686" y1="-318.4067" x2="20.5688" y2="-310.9584" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_200_)" d="M249.44,25.57c0.71-1.24,1.42-2.49,2.14-3.73c-0.71-1.25-1.42-2.5-2.14-3.75 + c-1.42,0-2.85-0.01-4.28-0.01c-0.71,1.24-1.42,2.49-2.14,3.73c0.71,1.25,1.42,2.5,2.13,3.74 + C246.59,25.56,248.01,25.56,249.44,25.57z"/> + + <linearGradient id="SVGID_201_" gradientUnits="userSpaceOnUse" x1="16.2598" y1="-329.4595" x2="20.564" y2="-322.0044" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_201_)" d="M249.44,14.51c0.71-1.24,1.43-2.49,2.14-3.74c-0.71-1.25-1.42-2.5-2.14-3.74 + c-1.42,0-2.85,0-4.27,0c-0.71,1.24-1.43,2.49-2.14,3.73c0.71,1.25,1.42,2.49,2.13,3.74C246.6,14.51,248.02,14.51,249.44,14.51z"/> + + <linearGradient id="SVGID_202_" gradientUnits="userSpaceOnUse" x1="17.3291" y1="-338.6255" x2="20.5488" y2="-333.0488" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_202_)" d="M243.04-0.28c0.71,1.24,1.42,2.49,2.13,3.74c1.42,0,2.85,0,4.27,0c0.71-1.25,1.42-2.49,2.14-3.74 + C248.74-0.28,245.89-0.28,243.04-0.28z"/> + + <linearGradient id="SVGID_203_" gradientUnits="userSpaceOnUse" x1="-16.3125" y1="-257.9639" x2="-13.1001" y2="-252.3998" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_203_)" d="M284.17,82.29c-0.71-1.25-1.43-2.5-2.14-3.75c-1.43,0-2.86-0.01-4.29-0.02 + c-0.71,1.24-1.43,2.49-2.14,3.72C278.46,82.27,281.32,82.28,284.17,82.29z"/> + + <linearGradient id="SVGID_204_" gradientUnits="userSpaceOnUse" x1="-16.3208" y1="-269.0225" x2="-12.0166" y2="-261.5674" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_204_)" d="M282.03,74.96c0.71-1.25,1.43-2.49,2.14-3.74c-0.72-1.25-1.43-2.5-2.14-3.75 + c-1.43,0-2.85-0.01-4.28-0.01c-0.71,1.25-1.43,2.49-2.14,3.73c0.71,1.25,1.42,2.5,2.14,3.75 + C279.18,74.95,280.61,74.96,282.03,74.96z"/> + + <linearGradient id="SVGID_205_" gradientUnits="userSpaceOnUse" x1="-16.3237" y1="-280.0859" x2="-12.0176" y2="-272.6275" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_205_)" d="M282.03,63.9c0.71-1.25,1.43-2.49,2.14-3.74c-0.71-1.25-1.43-2.5-2.14-3.75 + c-1.43,0-2.85,0-4.28-0.01c-0.71,1.24-1.43,2.49-2.14,3.73c0.71,1.25,1.43,2.5,2.14,3.75C279.18,63.89,280.61,63.89,282.03,63.9z" + /> + + <linearGradient id="SVGID_206_" gradientUnits="userSpaceOnUse" x1="-16.3257" y1="-291.1484" x2="-12.02" y2="-283.6908" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_206_)" d="M282.03,52.83c0.71-1.25,1.43-2.49,2.14-3.74c-0.71-1.25-1.43-2.5-2.14-3.75 + c-1.43,0-2.85-0.01-4.28-0.01c-0.71,1.24-1.43,2.49-2.14,3.73c0.71,1.25,1.43,2.5,2.14,3.75 + C279.18,52.83,280.61,52.83,282.03,52.83z"/> + + <linearGradient id="SVGID_207_" gradientUnits="userSpaceOnUse" x1="-16.3281" y1="-302.2114" x2="-12.021" y2="-294.7513" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_207_)" d="M282.04,41.77c0.71-1.25,1.43-2.49,2.14-3.74c-0.71-1.25-1.42-2.49-2.14-3.74 + c-1.42,0-2.85,0-4.28-0.01c-0.71,1.25-1.43,2.49-2.14,3.74c0.71,1.25,1.42,2.5,2.13,3.75C279.18,41.77,280.61,41.77,282.04,41.77z" + /> + + <linearGradient id="SVGID_208_" gradientUnits="userSpaceOnUse" x1="-16.3296" y1="-313.2734" x2="-12.0229" y2="-305.8141" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_208_)" d="M282.04,30.71c0.71-1.25,1.43-2.5,2.14-3.74c-0.71-1.25-1.42-2.5-2.14-3.74c-1.42,0-2.85,0-4.28,0 + c-0.71,1.25-1.42,2.49-2.13,3.74c0.71,1.25,1.42,2.5,2.13,3.75C279.19,30.7,280.61,30.71,282.04,30.71z"/> + + <linearGradient id="SVGID_209_" gradientUnits="userSpaceOnUse" x1="-16.3325" y1="-324.3364" x2="-12.0244" y2="-316.8746" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_209_)" d="M282.04,19.64c0.71-1.25,1.42-2.5,2.14-3.74c-0.71-1.25-1.42-2.5-2.14-3.74c-1.42,0-2.85,0-4.27,0 + c-0.71,1.25-1.42,2.49-2.13,3.74c0.71,1.25,1.42,2.5,2.13,3.75C279.19,19.64,280.61,19.64,282.04,19.64z"/> + + <linearGradient id="SVGID_210_" gradientUnits="userSpaceOnUse" x1="-16.3354" y1="-335.4014" x2="-12.0269" y2="-327.9387" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_210_)" d="M282.04,8.58c0.71-1.25,1.43-2.49,2.14-3.74c-0.71-1.25-1.42-2.5-2.14-3.75c-1.42,0-2.85,0-4.27,0 + c-0.71,1.25-1.43,2.5-2.14,3.74c0.71,1.25,1.42,2.49,2.13,3.74C279.19,8.58,280.62,8.58,282.04,8.58z"/> + + <linearGradient id="SVGID_211_" gradientUnits="userSpaceOnUse" x1="-5.1348" y1="-263.1465" x2="-0.8486" y2="-255.7227" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_211_)" d="M270.86,80.83c0.71-1.24,1.43-2.48,2.14-3.72c-0.71-1.25-1.43-2.51-2.14-3.76 + c-1.43-0.02-2.86-0.03-4.28-0.05c-0.71,1.24-1.43,2.47-2.14,3.71c0.71,1.26,1.43,2.51,2.14,3.77 + C268,80.8,269.43,80.82,270.86,80.83z"/> + + <linearGradient id="SVGID_212_" gradientUnits="userSpaceOnUse" x1="-5.144" y1="-274.1987" x2="-0.855" y2="-266.7699" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_212_)" d="M270.86,69.78c0.71-1.24,1.43-2.48,2.14-3.72c-0.71-1.25-1.43-2.5-2.14-3.76 + c-1.43-0.01-2.85-0.03-4.28-0.04c-0.71,1.24-1.43,2.47-2.14,3.71c0.71,1.25,1.42,2.51,2.13,3.76 + C268,69.75,269.43,69.77,270.86,69.78z"/> + + <linearGradient id="SVGID_213_" gradientUnits="userSpaceOnUse" x1="-5.1514" y1="-285.251" x2="-0.8599" y2="-277.8179" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_213_)" d="M270.87,58.73c0.71-1.24,1.43-2.48,2.14-3.72c-0.71-1.25-1.43-2.5-2.14-3.75 + c-1.43-0.01-2.85-0.02-4.28-0.04c-0.71,1.24-1.43,2.48-2.14,3.72c0.71,1.25,1.42,2.51,2.13,3.76 + C268.01,58.7,269.44,58.72,270.87,58.73z"/> + + <linearGradient id="SVGID_214_" gradientUnits="userSpaceOnUse" x1="-5.1597" y1="-296.3037" x2="-0.8643" y2="-288.8638" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_214_)" d="M270.87,47.67c0.71-1.24,1.43-2.48,2.14-3.73c-0.71-1.25-1.43-2.5-2.14-3.75 + c-1.43-0.01-2.85-0.02-4.28-0.03c-0.71,1.24-1.43,2.48-2.14,3.72c0.71,1.25,1.42,2.5,2.13,3.76 + C268.02,47.66,269.45,47.67,270.87,47.67z"/> + + <linearGradient id="SVGID_215_" gradientUnits="userSpaceOnUse" x1="-5.1685" y1="-307.3564" x2="-0.8706" y2="-299.9124" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_215_)" d="M270.88,36.62c0.71-1.24,1.43-2.49,2.14-3.73c-0.71-1.25-1.42-2.5-2.13-3.75 + c-1.43-0.01-2.85-0.01-4.28-0.02c-0.71,1.24-1.43,2.48-2.14,3.72c0.71,1.25,1.42,2.5,2.13,3.75 + C268.03,36.61,269.45,36.61,270.88,36.62z"/> + + <linearGradient id="SVGID_216_" gradientUnits="userSpaceOnUse" x1="-5.1768" y1="-318.4067" x2="-0.8765" y2="-310.9584" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_216_)" d="M270.88,25.57c0.71-1.24,1.42-2.49,2.14-3.73c-0.71-1.25-1.42-2.5-2.14-3.75 + c-1.42,0-2.85-0.01-4.28-0.01c-0.71,1.24-1.42,2.49-2.14,3.73c0.71,1.25,1.42,2.5,2.13,3.74 + C268.03,25.56,269.46,25.56,270.88,25.57z"/> + + <linearGradient id="SVGID_217_" gradientUnits="userSpaceOnUse" x1="-5.186" y1="-329.4595" x2="-0.8818" y2="-322.0044" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_217_)" d="M270.89,14.51c0.71-1.24,1.43-2.49,2.14-3.74c-0.71-1.25-1.42-2.5-2.14-3.74 + c-1.42,0-2.85,0-4.27,0c-0.71,1.24-1.43,2.49-2.14,3.73c0.71,1.25,1.42,2.49,2.13,3.74C268.04,14.51,269.46,14.51,270.89,14.51z"/> + + <linearGradient id="SVGID_218_" gradientUnits="userSpaceOnUse" x1="-4.1157" y1="-338.6255" x2="-0.896" y2="-333.0488" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_218_)" d="M264.49-0.28c0.71,1.24,1.42,2.49,2.13,3.74c1.42,0,2.85,0,4.27,0c0.71-1.25,1.42-2.49,2.14-3.74 + C270.19-0.28,267.34-0.28,264.49-0.28z"/> + + <linearGradient id="SVGID_219_" gradientUnits="userSpaceOnUse" x1="-37.7573" y1="-257.9629" x2="-34.5454" y2="-252.3997" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_219_)" d="M305.62,82.29c-0.71-1.25-1.43-2.5-2.14-3.75c-1.43,0-2.86-0.01-4.28-0.02 + c-0.71,1.24-1.43,2.49-2.14,3.72C299.9,82.27,302.76,82.28,305.62,82.29z"/> + + <linearGradient id="SVGID_220_" gradientUnits="userSpaceOnUse" x1="-37.7656" y1="-269.0225" x2="-33.4614" y2="-261.5674" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_220_)" d="M303.47,74.96c0.72-1.25,1.43-2.49,2.14-3.74c-0.72-1.25-1.43-2.5-2.14-3.75 + c-1.43,0-2.85-0.01-4.28-0.01c-0.71,1.25-1.43,2.49-2.14,3.73c0.71,1.25,1.42,2.5,2.14,3.75 + C300.62,74.95,302.05,74.96,303.47,74.96z"/> + + <linearGradient id="SVGID_221_" gradientUnits="userSpaceOnUse" x1="-37.7686" y1="-280.0854" x2="-33.4629" y2="-272.6278" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_221_)" d="M303.48,63.9c0.71-1.25,1.43-2.49,2.14-3.74c-0.71-1.25-1.43-2.5-2.14-3.75 + c-1.42,0-2.85,0-4.28-0.01c-0.71,1.24-1.43,2.49-2.14,3.73c0.71,1.25,1.43,2.5,2.14,3.75C300.62,63.89,302.05,63.89,303.48,63.9z" + /> + + <linearGradient id="SVGID_222_" gradientUnits="userSpaceOnUse" x1="-37.7705" y1="-291.1475" x2="-33.4653" y2="-283.6907" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_222_)" d="M303.48,52.83c0.71-1.25,1.43-2.49,2.14-3.74c-0.71-1.25-1.43-2.5-2.14-3.75 + c-1.42,0-2.85-0.01-4.28-0.01c-0.71,1.24-1.43,2.49-2.14,3.73c0.71,1.25,1.43,2.5,2.14,3.75 + C300.62,52.83,302.05,52.83,303.48,52.83z"/> + + <linearGradient id="SVGID_223_" gradientUnits="userSpaceOnUse" x1="-37.7734" y1="-302.2114" x2="-33.4663" y2="-294.7513" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_223_)" d="M303.48,41.77c0.71-1.25,1.43-2.49,2.14-3.74c-0.71-1.25-1.42-2.49-2.14-3.74 + c-1.42,0-2.85,0-4.28-0.01c-0.71,1.25-1.43,2.49-2.14,3.74c0.71,1.25,1.42,2.5,2.13,3.75C300.63,41.77,302.05,41.77,303.48,41.77z" + /> + + <linearGradient id="SVGID_224_" gradientUnits="userSpaceOnUse" x1="-37.7749" y1="-313.2734" x2="-33.4683" y2="-305.8141" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_224_)" d="M303.48,30.71c0.71-1.25,1.43-2.5,2.14-3.74c-0.71-1.25-1.42-2.5-2.14-3.74c-1.42,0-2.85,0-4.28,0 + c-0.71,1.25-1.42,2.49-2.13,3.74c0.71,1.25,1.42,2.5,2.13,3.75C300.63,30.7,302.06,30.71,303.48,30.71z"/> + + <linearGradient id="SVGID_225_" gradientUnits="userSpaceOnUse" x1="-37.7778" y1="-324.3364" x2="-33.4697" y2="-316.8746" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_225_)" d="M303.48,19.64c0.71-1.25,1.42-2.5,2.14-3.74c-0.71-1.25-1.42-2.5-2.14-3.74c-1.42,0-2.85,0-4.27,0 + c-0.71,1.25-1.42,2.49-2.13,3.74c0.71,1.25,1.42,2.5,2.13,3.75C300.63,19.64,302.06,19.64,303.48,19.64z"/> + + <linearGradient id="SVGID_226_" gradientUnits="userSpaceOnUse" x1="-37.7808" y1="-335.4014" x2="-33.4722" y2="-327.9387" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_226_)" d="M303.48,8.58c0.71-1.25,1.43-2.49,2.14-3.74c-0.71-1.25-1.42-2.5-2.14-3.75c-1.42,0-2.85,0-4.27,0 + c-0.71,1.25-1.43,2.5-2.14,3.74c0.71,1.25,1.42,2.49,2.13,3.74C300.63,8.58,302.06,8.58,303.48,8.58z"/> + + <linearGradient id="SVGID_227_" gradientUnits="userSpaceOnUse" x1="-26.5801" y1="-263.1465" x2="-22.2944" y2="-255.7235" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_227_)" d="M292.3,80.83c0.71-1.24,1.43-2.48,2.14-3.72c-0.71-1.25-1.43-2.51-2.14-3.76 + c-1.43-0.02-2.86-0.03-4.28-0.05c-0.71,1.24-1.43,2.47-2.14,3.71c0.71,1.26,1.43,2.51,2.14,3.77 + C289.44,80.8,290.87,80.82,292.3,80.83z"/> + + <linearGradient id="SVGID_228_" gradientUnits="userSpaceOnUse" x1="-26.5898" y1="-274.1987" x2="-22.3013" y2="-266.7707" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_228_)" d="M292.31,69.78c0.71-1.24,1.43-2.48,2.14-3.72c-0.71-1.25-1.43-2.5-2.14-3.76 + c-1.43-0.01-2.85-0.03-4.28-0.04c-0.71,1.24-1.43,2.47-2.14,3.71c0.71,1.25,1.42,2.51,2.14,3.76 + C289.45,69.75,290.88,69.77,292.31,69.78z"/> + + <linearGradient id="SVGID_229_" gradientUnits="userSpaceOnUse" x1="-26.5967" y1="-285.251" x2="-22.3057" y2="-277.8187" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_229_)" d="M292.31,58.73c0.71-1.24,1.43-2.48,2.14-3.72c-0.71-1.25-1.43-2.5-2.14-3.75 + c-1.43-0.01-2.85-0.02-4.28-0.04c-0.71,1.24-1.43,2.48-2.14,3.72c0.71,1.25,1.42,2.51,2.14,3.76 + C289.46,58.7,290.88,58.72,292.31,58.73z"/> + + <linearGradient id="SVGID_230_" gradientUnits="userSpaceOnUse" x1="-26.606" y1="-296.3032" x2="-22.311" y2="-288.8642" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_230_)" d="M292.32,47.67c0.71-1.24,1.43-2.48,2.14-3.73c-0.71-1.25-1.43-2.5-2.14-3.75 + c-1.43-0.01-2.85-0.02-4.28-0.03c-0.71,1.24-1.43,2.48-2.14,3.72c0.71,1.25,1.42,2.5,2.14,3.76 + C289.46,47.66,290.89,47.67,292.32,47.67z"/> + + <linearGradient id="SVGID_231_" gradientUnits="userSpaceOnUse" x1="-26.6147" y1="-307.356" x2="-22.3169" y2="-299.9119" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_231_)" d="M292.32,36.62c0.71-1.24,1.43-2.49,2.14-3.73c-0.71-1.25-1.42-2.5-2.13-3.75 + c-1.43-0.01-2.85-0.01-4.28-0.02c-0.71,1.24-1.43,2.48-2.14,3.72c0.71,1.25,1.42,2.5,2.13,3.75 + C289.47,36.61,290.9,36.61,292.32,36.62z"/> + + <linearGradient id="SVGID_232_" gradientUnits="userSpaceOnUse" x1="-26.623" y1="-318.4062" x2="-22.3232" y2="-310.9588" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_232_)" d="M292.33,25.57c0.71-1.24,1.42-2.49,2.14-3.73c-0.71-1.25-1.42-2.5-2.14-3.75 + c-1.42,0-2.85-0.01-4.27-0.01c-0.71,1.24-1.43,2.49-2.14,3.73c0.71,1.25,1.42,2.5,2.14,3.74C289.48,25.56,290.9,25.56,292.33,25.57 + z"/> + + <linearGradient id="SVGID_233_" gradientUnits="userSpaceOnUse" x1="-26.6309" y1="-329.4595" x2="-22.3271" y2="-322.0052" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_233_)" d="M292.33,14.51c0.71-1.24,1.43-2.49,2.14-3.74c-0.71-1.25-1.42-2.5-2.13-3.74 + c-1.42,0-2.85,0-4.27,0c-0.71,1.24-1.43,2.49-2.14,3.73c0.71,1.25,1.42,2.49,2.13,3.74C289.49,14.51,290.91,14.51,292.33,14.51z"/> + + <linearGradient id="SVGID_234_" gradientUnits="userSpaceOnUse" x1="-25.561" y1="-338.6255" x2="-22.3413" y2="-333.0488" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_234_)" d="M285.94-0.28c0.71,1.24,1.42,2.49,2.13,3.74c1.42,0,2.85,0,4.27,0c0.71-1.25,1.42-2.49,2.14-3.74 + C291.63-0.28,288.78-0.28,285.94-0.28z"/> + + <linearGradient id="SVGID_235_" gradientUnits="userSpaceOnUse" x1="-59.2031" y1="-257.9639" x2="-55.9907" y2="-252.3998" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_235_)" d="M327.06,82.29c-0.71-1.25-1.43-2.5-2.14-3.75c-1.43,0-2.86-0.01-4.29-0.02 + c-0.71,1.24-1.43,2.49-2.14,3.72C321.35,82.27,324.21,82.28,327.06,82.29z"/> + + <linearGradient id="SVGID_236_" gradientUnits="userSpaceOnUse" x1="-59.2119" y1="-269.022" x2="-54.9077" y2="-261.5669" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_236_)" d="M324.92,74.96c0.71-1.25,1.43-2.49,2.14-3.74c-0.72-1.25-1.43-2.5-2.14-3.75 + c-1.43,0-2.85-0.01-4.28-0.01c-0.71,1.25-1.43,2.49-2.14,3.73c0.71,1.25,1.42,2.5,2.14,3.75 + C322.07,74.95,323.49,74.96,324.92,74.96z"/> + + <linearGradient id="SVGID_237_" gradientUnits="userSpaceOnUse" x1="-59.2148" y1="-280.0859" x2="-54.9087" y2="-272.6275" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_237_)" d="M324.92,63.9c0.71-1.25,1.43-2.49,2.14-3.74c-0.71-1.25-1.43-2.5-2.14-3.75 + c-1.43,0-2.85,0-4.28-0.01c-0.71,1.24-1.43,2.49-2.14,3.73c0.71,1.25,1.43,2.5,2.14,3.75C322.07,63.89,323.5,63.89,324.92,63.9z"/> + + <linearGradient id="SVGID_238_" gradientUnits="userSpaceOnUse" x1="-59.2163" y1="-291.1484" x2="-54.9106" y2="-283.6908" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_238_)" d="M324.92,52.83c0.71-1.25,1.43-2.49,2.14-3.74c-0.71-1.25-1.43-2.5-2.14-3.75 + c-1.43,0-2.85-0.01-4.28-0.01c-0.71,1.24-1.43,2.49-2.14,3.73c0.71,1.25,1.43,2.5,2.14,3.75C322.07,52.83,323.5,52.83,324.92,52.83 + z"/> + + <linearGradient id="SVGID_239_" gradientUnits="userSpaceOnUse" x1="-59.2188" y1="-302.2114" x2="-54.9116" y2="-294.7513" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_239_)" d="M324.93,41.77c0.71-1.25,1.43-2.49,2.14-3.74c-0.71-1.25-1.42-2.49-2.14-3.74 + c-1.42,0-2.85,0-4.28-0.01c-0.71,1.25-1.43,2.49-2.14,3.74c0.71,1.25,1.42,2.5,2.13,3.75C322.07,41.77,323.5,41.77,324.93,41.77z" + /> + + <linearGradient id="SVGID_240_" gradientUnits="userSpaceOnUse" x1="-59.2217" y1="-313.2739" x2="-54.9146" y2="-305.8138" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_240_)" d="M324.93,30.71c0.71-1.25,1.42-2.5,2.14-3.74c-0.71-1.25-1.42-2.5-2.14-3.74c-1.43,0-2.85,0-4.28,0 + c-0.71,1.25-1.42,2.49-2.13,3.74c0.71,1.25,1.42,2.5,2.13,3.75C322.08,30.7,323.5,30.71,324.93,30.71z"/> + + <linearGradient id="SVGID_241_" gradientUnits="userSpaceOnUse" x1="-59.2236" y1="-324.3369" x2="-54.915" y2="-316.8742" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_241_)" d="M324.93,19.64c0.71-1.25,1.42-2.5,2.14-3.74c-0.71-1.25-1.42-2.5-2.13-3.74c-1.43,0-2.85,0-4.28,0 + c-0.71,1.25-1.42,2.49-2.13,3.74c0.71,1.25,1.42,2.5,2.13,3.75C322.08,19.64,323.5,19.64,324.93,19.64z"/> + + <linearGradient id="SVGID_242_" gradientUnits="userSpaceOnUse" x1="-59.2275" y1="-335.4014" x2="-54.9185" y2="-327.9378" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_242_)" d="M324.93,8.58c0.71-1.25,1.42-2.49,2.14-3.74c-0.71-1.25-1.42-2.5-2.13-3.75c-1.43,0-2.85,0-4.27,0 + c-0.71,1.25-1.43,2.5-2.14,3.74c0.71,1.25,1.42,2.49,2.13,3.74C322.08,8.58,323.5,8.58,324.93,8.58z"/> + + <linearGradient id="SVGID_243_" gradientUnits="userSpaceOnUse" x1="-48.0254" y1="-263.1465" x2="-43.7397" y2="-255.7235" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_243_)" d="M313.75,80.83c0.71-1.24,1.43-2.48,2.14-3.72c-0.71-1.25-1.43-2.51-2.14-3.76 + c-1.43-0.02-2.86-0.03-4.28-0.05c-0.71,1.24-1.43,2.47-2.14,3.71c0.71,1.26,1.43,2.51,2.14,3.77 + C310.89,80.8,312.32,80.82,313.75,80.83z"/> + + <linearGradient id="SVGID_244_" gradientUnits="userSpaceOnUse" x1="-48.0352" y1="-274.1987" x2="-43.7466" y2="-266.7707" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_244_)" d="M313.75,69.78c0.71-1.24,1.43-2.48,2.14-3.72c-0.71-1.25-1.42-2.5-2.14-3.76 + c-1.43-0.01-2.85-0.03-4.28-0.04c-0.71,1.24-1.43,2.47-2.14,3.71c0.71,1.25,1.42,2.51,2.14,3.76 + C310.89,69.75,312.32,69.77,313.75,69.78z"/> + + <linearGradient id="SVGID_245_" gradientUnits="userSpaceOnUse" x1="-48.042" y1="-285.251" x2="-43.751" y2="-277.8187" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_245_)" d="M313.76,58.73c0.71-1.24,1.43-2.48,2.14-3.72c-0.71-1.25-1.42-2.5-2.14-3.75 + c-1.43-0.01-2.85-0.02-4.28-0.04c-0.71,1.24-1.43,2.48-2.14,3.72c0.71,1.25,1.42,2.51,2.14,3.76 + C310.9,58.7,312.33,58.72,313.76,58.73z"/> + + <linearGradient id="SVGID_246_" gradientUnits="userSpaceOnUse" x1="-48.0513" y1="-296.3032" x2="-43.7563" y2="-288.8642" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_246_)" d="M313.76,47.67c0.71-1.24,1.43-2.48,2.14-3.73c-0.71-1.25-1.42-2.5-2.14-3.75 + c-1.43-0.01-2.85-0.02-4.28-0.03c-0.71,1.24-1.43,2.48-2.14,3.72c0.71,1.25,1.42,2.5,2.14,3.76 + C310.91,47.66,312.34,47.67,313.76,47.67z"/> + + <linearGradient id="SVGID_247_" gradientUnits="userSpaceOnUse" x1="-48.0596" y1="-307.356" x2="-43.7617" y2="-299.9119" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_247_)" d="M313.77,36.62c0.71-1.24,1.43-2.49,2.14-3.73c-0.71-1.25-1.42-2.5-2.13-3.75 + c-1.43-0.01-2.85-0.01-4.28-0.02c-0.71,1.24-1.43,2.48-2.14,3.72c0.71,1.25,1.42,2.5,2.13,3.75 + C310.92,36.61,312.34,36.61,313.77,36.62z"/> + + <linearGradient id="SVGID_248_" gradientUnits="userSpaceOnUse" x1="-48.0684" y1="-318.4062" x2="-43.7686" y2="-310.9588" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_248_)" d="M313.78,25.57c0.71-1.24,1.42-2.49,2.14-3.73c-0.71-1.25-1.42-2.5-2.14-3.75 + c-1.42,0-2.85-0.01-4.27-0.01c-0.71,1.24-1.43,2.49-2.14,3.73c0.71,1.25,1.42,2.5,2.14,3.74 + C310.92,25.56,312.35,25.56,313.78,25.57z"/> + + <linearGradient id="SVGID_249_" gradientUnits="userSpaceOnUse" x1="-48.0762" y1="-329.4595" x2="-43.7725" y2="-322.0052" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_249_)" d="M313.78,14.51c0.71-1.24,1.43-2.49,2.14-3.74c-0.71-1.25-1.42-2.5-2.13-3.74 + c-1.42,0-2.85,0-4.27,0c-0.71,1.24-1.43,2.49-2.14,3.73c0.71,1.25,1.42,2.49,2.13,3.74C310.93,14.51,312.36,14.51,313.78,14.51z"/> + + <linearGradient id="SVGID_250_" gradientUnits="userSpaceOnUse" x1="-47.0068" y1="-338.6255" x2="-43.7871" y2="-333.0488" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_250_)" d="M307.38-0.28c0.71,1.24,1.42,2.49,2.13,3.74c1.42,0,2.85,0,4.27,0c0.71-1.25,1.42-2.49,2.14-3.74 + C313.08-0.28,310.23-0.28,307.38-0.28z"/> + + <linearGradient id="SVGID_251_" gradientUnits="userSpaceOnUse" x1="-80.6489" y1="-257.9639" x2="-77.4365" y2="-252.3998" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_251_)" d="M348.51,82.29c-0.71-1.25-1.43-2.5-2.14-3.75c-1.43,0-2.86-0.01-4.29-0.02 + c-0.71,1.24-1.43,2.49-2.14,3.72C342.79,82.27,345.65,82.28,348.51,82.29z"/> + + <linearGradient id="SVGID_252_" gradientUnits="userSpaceOnUse" x1="-80.6572" y1="-269.022" x2="-76.353" y2="-261.5669" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_252_)" d="M346.37,74.96c0.71-1.25,1.43-2.49,2.14-3.74c-0.72-1.25-1.43-2.5-2.14-3.75 + c-1.43,0-2.85-0.01-4.28-0.01c-0.71,1.25-1.43,2.49-2.14,3.73c0.71,1.25,1.42,2.5,2.14,3.75 + C343.51,74.95,344.94,74.96,346.37,74.96z"/> + + <linearGradient id="SVGID_253_" gradientUnits="userSpaceOnUse" x1="-80.6602" y1="-280.0859" x2="-76.354" y2="-272.6275" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_253_)" d="M346.37,63.9c0.71-1.25,1.43-2.49,2.14-3.74c-0.71-1.25-1.43-2.5-2.14-3.75 + c-1.43,0-2.85,0-4.28-0.01c-0.71,1.24-1.43,2.49-2.14,3.73c0.71,1.25,1.43,2.5,2.14,3.75C343.51,63.89,344.94,63.89,346.37,63.9z" + /> + + <linearGradient id="SVGID_254_" gradientUnits="userSpaceOnUse" x1="-80.6616" y1="-291.1484" x2="-76.356" y2="-283.6908" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_254_)" d="M346.37,52.83c0.71-1.25,1.43-2.49,2.14-3.74c-0.71-1.25-1.43-2.5-2.14-3.75 + c-1.43,0-2.85-0.01-4.28-0.01c-0.71,1.24-1.43,2.49-2.14,3.73c0.71,1.25,1.43,2.5,2.14,3.75 + C343.52,52.83,344.94,52.83,346.37,52.83z"/> + + <linearGradient id="SVGID_255_" gradientUnits="userSpaceOnUse" x1="-80.6636" y1="-302.2114" x2="-76.3564" y2="-294.7513" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_255_)" d="M346.37,41.77c0.71-1.25,1.43-2.49,2.14-3.74c-0.71-1.25-1.42-2.49-2.14-3.74 + c-1.42,0-2.85,0-4.28-0.01c-0.71,1.25-1.43,2.49-2.14,3.74c0.71,1.25,1.42,2.5,2.14,3.75C343.52,41.77,344.94,41.77,346.37,41.77z" + /> + + <linearGradient id="SVGID_256_" gradientUnits="userSpaceOnUse" x1="-80.667" y1="-313.2739" x2="-76.3599" y2="-305.8138" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_256_)" d="M346.37,30.71c0.71-1.25,1.42-2.5,2.14-3.74c-0.71-1.25-1.42-2.5-2.14-3.74c-1.43,0-2.85,0-4.28,0 + c-0.71,1.25-1.42,2.49-2.14,3.74c0.71,1.25,1.42,2.5,2.14,3.75C343.52,30.7,344.95,30.71,346.37,30.71z"/> + + <linearGradient id="SVGID_257_" gradientUnits="userSpaceOnUse" x1="-80.6689" y1="-324.3369" x2="-76.3604" y2="-316.8742" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_257_)" d="M346.37,19.64c0.71-1.25,1.42-2.5,2.14-3.74c-0.71-1.25-1.42-2.5-2.13-3.74c-1.43,0-2.85,0-4.28,0 + c-0.71,1.25-1.42,2.49-2.14,3.74c0.71,1.25,1.42,2.5,2.13,3.75C343.52,19.64,344.95,19.64,346.37,19.64z"/> + + <linearGradient id="SVGID_258_" gradientUnits="userSpaceOnUse" x1="-80.6729" y1="-335.4014" x2="-76.3638" y2="-327.9378" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_258_)" d="M346.38,8.58c0.71-1.25,1.42-2.49,2.14-3.74c-0.71-1.25-1.42-2.5-2.13-3.75c-1.43,0-2.85,0-4.27,0 + c-0.71,1.25-1.43,2.5-2.14,3.74c0.71,1.25,1.42,2.49,2.13,3.74C343.53,8.58,344.95,8.58,346.38,8.58z"/> + + <linearGradient id="SVGID_259_" gradientUnits="userSpaceOnUse" x1="-69.4707" y1="-263.1465" x2="-65.1851" y2="-255.7235" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_259_)" d="M335.19,80.83c0.71-1.24,1.43-2.48,2.14-3.72c-0.71-1.25-1.43-2.51-2.14-3.76 + c-1.43-0.02-2.86-0.03-4.28-0.05c-0.71,1.24-1.43,2.47-2.14,3.71c0.71,1.26,1.43,2.51,2.14,3.77 + C332.33,80.8,333.76,80.82,335.19,80.83z"/> + + <linearGradient id="SVGID_260_" gradientUnits="userSpaceOnUse" x1="-69.48" y1="-274.1987" x2="-65.1914" y2="-266.7707" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_260_)" d="M335.2,69.78c0.71-1.24,1.43-2.48,2.14-3.72c-0.71-1.25-1.42-2.5-2.14-3.76 + c-1.43-0.01-2.85-0.03-4.28-0.04c-0.71,1.24-1.43,2.47-2.14,3.71c0.71,1.25,1.43,2.51,2.14,3.76 + C332.34,69.75,333.77,69.77,335.2,69.78z"/> + + <linearGradient id="SVGID_261_" gradientUnits="userSpaceOnUse" x1="-69.4873" y1="-285.251" x2="-65.1963" y2="-277.8187" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_261_)" d="M335.2,58.73c0.71-1.24,1.43-2.48,2.14-3.72c-0.71-1.25-1.43-2.5-2.14-3.75 + c-1.43-0.01-2.85-0.02-4.28-0.04c-0.71,1.24-1.43,2.48-2.14,3.72c0.71,1.25,1.43,2.51,2.14,3.76 + C332.35,58.7,333.77,58.72,335.2,58.73z"/> + + <linearGradient id="SVGID_262_" gradientUnits="userSpaceOnUse" x1="-69.4966" y1="-296.3032" x2="-65.2017" y2="-288.8642" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_262_)" d="M335.21,47.67c0.71-1.24,1.43-2.48,2.14-3.73c-0.71-1.25-1.43-2.5-2.14-3.75 + c-1.43-0.01-2.85-0.02-4.28-0.03c-0.71,1.24-1.43,2.48-2.14,3.72c0.71,1.25,1.43,2.5,2.14,3.76 + C332.35,47.66,333.78,47.67,335.21,47.67z"/> + + <linearGradient id="SVGID_263_" gradientUnits="userSpaceOnUse" x1="-69.5054" y1="-307.356" x2="-65.2075" y2="-299.9119" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_263_)" d="M335.21,36.62c0.71-1.24,1.43-2.49,2.14-3.73c-0.71-1.25-1.42-2.5-2.13-3.75 + c-1.43-0.01-2.85-0.01-4.28-0.02c-0.71,1.24-1.43,2.48-2.14,3.72c0.71,1.25,1.42,2.5,2.13,3.75 + C332.36,36.61,333.79,36.61,335.21,36.62z"/> + + <linearGradient id="SVGID_264_" gradientUnits="userSpaceOnUse" x1="-69.5132" y1="-318.4067" x2="-65.2134" y2="-310.9593" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_264_)" d="M335.22,25.57c0.71-1.24,1.42-2.49,2.14-3.73c-0.71-1.25-1.42-2.5-2.14-3.75 + c-1.42,0-2.85-0.01-4.28-0.01c-0.71,1.24-1.42,2.49-2.14,3.73c0.71,1.25,1.42,2.5,2.14,3.74 + C332.37,25.56,333.79,25.56,335.22,25.57z"/> + + <linearGradient id="SVGID_265_" gradientUnits="userSpaceOnUse" x1="-69.5215" y1="-329.4595" x2="-65.2173" y2="-322.0044" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_265_)" d="M335.22,14.51c0.71-1.24,1.43-2.49,2.14-3.74c-0.71-1.25-1.42-2.5-2.13-3.74 + c-1.42,0-2.85,0-4.27,0c-0.71,1.24-1.43,2.49-2.14,3.73c0.71,1.25,1.42,2.49,2.13,3.74C332.38,14.51,333.8,14.51,335.22,14.51z"/> + + <linearGradient id="SVGID_266_" gradientUnits="userSpaceOnUse" x1="-68.4521" y1="-338.6255" x2="-65.2324" y2="-333.0488" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_266_)" d="M328.83-0.28c0.71,1.24,1.42,2.49,2.13,3.74c1.42,0,2.85,0,4.27,0c0.71-1.25,1.42-2.49,2.14-3.74 + C334.52-0.28,331.67-0.28,328.83-0.28z"/> + + <linearGradient id="SVGID_267_" gradientUnits="userSpaceOnUse" x1="-102.0942" y1="-257.9639" x2="-98.8813" y2="-252.399" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_267_)" d="M369.95,82.29c-0.71-1.25-1.43-2.5-2.14-3.75c-1.43,0-2.86-0.01-4.29-0.02 + c-0.71,1.24-1.43,2.49-2.14,3.72C364.24,82.27,367.1,82.28,369.95,82.29z"/> + + <linearGradient id="SVGID_268_" gradientUnits="userSpaceOnUse" x1="-102.1025" y1="-269.022" x2="-97.7983" y2="-261.5669" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_268_)" d="M367.81,74.96c0.71-1.25,1.43-2.49,2.14-3.74c-0.72-1.25-1.43-2.5-2.14-3.75 + c-1.43,0-2.85-0.01-4.28-0.01c-0.71,1.25-1.43,2.49-2.14,3.73c0.71,1.25,1.43,2.5,2.14,3.75 + C364.96,74.95,366.38,74.96,367.81,74.96z"/> + + <linearGradient id="SVGID_269_" gradientUnits="userSpaceOnUse" x1="-102.1055" y1="-280.0859" x2="-97.7993" y2="-272.6275" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_269_)" d="M367.81,63.9c0.71-1.25,1.43-2.49,2.14-3.74c-0.71-1.25-1.43-2.5-2.14-3.75 + c-1.43,0-2.85,0-4.28-0.01c-0.71,1.24-1.43,2.49-2.14,3.73c0.71,1.25,1.43,2.5,2.14,3.75C364.96,63.89,366.39,63.89,367.81,63.9z" + /> + + <linearGradient id="SVGID_270_" gradientUnits="userSpaceOnUse" x1="-102.1069" y1="-291.1484" x2="-97.8013" y2="-283.6908" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_270_)" d="M367.81,52.83c0.71-1.25,1.43-2.49,2.14-3.74c-0.71-1.25-1.43-2.5-2.14-3.75 + c-1.43,0-2.85-0.01-4.28-0.01c-0.71,1.24-1.43,2.49-2.14,3.73c0.71,1.25,1.43,2.5,2.14,3.75 + C364.96,52.83,366.39,52.83,367.81,52.83z"/> + + <linearGradient id="SVGID_271_" gradientUnits="userSpaceOnUse" x1="-102.1089" y1="-302.2114" x2="-97.8018" y2="-294.7513" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_271_)" d="M367.82,41.77c0.71-1.25,1.43-2.49,2.14-3.74c-0.71-1.25-1.43-2.49-2.14-3.74 + c-1.42,0-2.85,0-4.28-0.01c-0.71,1.25-1.43,2.49-2.14,3.74c0.71,1.25,1.42,2.5,2.14,3.75C364.96,41.77,366.39,41.77,367.82,41.77z" + /> + + <linearGradient id="SVGID_272_" gradientUnits="userSpaceOnUse" x1="-102.1123" y1="-313.2739" x2="-97.8052" y2="-305.8138" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_272_)" d="M367.82,30.71c0.71-1.25,1.42-2.5,2.14-3.74c-0.71-1.25-1.42-2.5-2.14-3.74c-1.43,0-2.85,0-4.28,0 + c-0.71,1.25-1.42,2.49-2.14,3.74c0.71,1.25,1.42,2.5,2.14,3.75C364.97,30.7,366.39,30.71,367.82,30.71z"/> + + <linearGradient id="SVGID_273_" gradientUnits="userSpaceOnUse" x1="-102.1147" y1="-324.3369" x2="-97.8062" y2="-316.8742" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_273_)" d="M367.82,19.64c0.71-1.25,1.42-2.5,2.14-3.74c-0.71-1.25-1.42-2.5-2.13-3.74c-1.43,0-2.85,0-4.28,0 + c-0.71,1.25-1.42,2.49-2.14,3.74c0.71,1.25,1.42,2.5,2.13,3.75C364.97,19.64,366.39,19.64,367.82,19.64z"/> + + <linearGradient id="SVGID_274_" gradientUnits="userSpaceOnUse" x1="-102.1182" y1="-335.4019" x2="-97.8091" y2="-327.9383" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_274_)" d="M367.82,8.58c0.71-1.25,1.42-2.49,2.14-3.74c-0.71-1.25-1.42-2.5-2.13-3.75c-1.43,0-2.85,0-4.27,0 + c-0.71,1.25-1.43,2.5-2.14,3.74c0.71,1.25,1.42,2.49,2.13,3.74C364.97,8.58,366.39,8.58,367.82,8.58z"/> + + <linearGradient id="SVGID_275_" gradientUnits="userSpaceOnUse" x1="-90.916" y1="-263.1475" x2="-86.6299" y2="-255.7237" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_275_)" d="M356.64,80.83c0.71-1.24,1.43-2.48,2.14-3.72c-0.71-1.25-1.43-2.51-2.14-3.76 + c-1.43-0.02-2.86-0.03-4.29-0.05c-0.71,1.24-1.43,2.47-2.14,3.71c0.71,1.26,1.43,2.51,2.14,3.77 + C353.78,80.8,355.21,80.82,356.64,80.83z"/> + + <linearGradient id="SVGID_276_" gradientUnits="userSpaceOnUse" x1="-90.9258" y1="-274.1997" x2="-86.6367" y2="-266.7708" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_276_)" d="M356.64,69.78c0.71-1.24,1.43-2.48,2.14-3.72c-0.71-1.25-1.42-2.5-2.14-3.76 + c-1.43-0.01-2.86-0.03-4.28-0.04c-0.71,1.24-1.43,2.47-2.14,3.71c0.71,1.25,1.43,2.51,2.14,3.76 + C353.79,69.75,355.21,69.77,356.64,69.78z"/> + + <linearGradient id="SVGID_277_" gradientUnits="userSpaceOnUse" x1="-90.9336" y1="-285.2505" x2="-86.6426" y2="-277.8182" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_277_)" d="M356.65,58.73c0.71-1.24,1.43-2.48,2.14-3.72c-0.71-1.25-1.43-2.5-2.14-3.75 + c-1.43-0.01-2.85-0.02-4.28-0.04c-0.71,1.24-1.43,2.48-2.14,3.72c0.71,1.25,1.43,2.51,2.14,3.76 + C353.79,58.7,355.22,58.72,356.65,58.73z"/> + + <linearGradient id="SVGID_278_" gradientUnits="userSpaceOnUse" x1="-90.9419" y1="-296.3032" x2="-86.647" y2="-288.8642" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_278_)" d="M356.65,47.67c0.71-1.24,1.43-2.48,2.14-3.73c-0.71-1.25-1.43-2.5-2.14-3.75 + c-1.43-0.01-2.85-0.02-4.28-0.03c-0.71,1.24-1.42,2.48-2.14,3.72c0.71,1.25,1.43,2.5,2.14,3.76 + C353.8,47.66,355.23,47.67,356.65,47.67z"/> + + <linearGradient id="SVGID_279_" gradientUnits="userSpaceOnUse" x1="-90.9507" y1="-307.356" x2="-86.6528" y2="-299.9119" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_279_)" d="M356.66,36.62c0.71-1.24,1.43-2.49,2.14-3.73c-0.71-1.25-1.42-2.5-2.13-3.75 + c-1.43-0.01-2.85-0.01-4.28-0.02c-0.71,1.24-1.42,2.48-2.14,3.72c0.71,1.25,1.42,2.5,2.13,3.75 + C353.81,36.61,355.23,36.61,356.66,36.62z"/> + + <linearGradient id="SVGID_280_" gradientUnits="userSpaceOnUse" x1="-90.959" y1="-318.4077" x2="-86.6582" y2="-310.9586" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_280_)" d="M356.67,25.57c0.71-1.24,1.42-2.49,2.14-3.73c-0.71-1.25-1.42-2.5-2.13-3.75 + c-1.43,0-2.85-0.01-4.28-0.01c-0.71,1.24-1.42,2.49-2.14,3.73c0.71,1.25,1.42,2.5,2.13,3.74 + C353.81,25.56,355.24,25.56,356.67,25.57z"/> + + <linearGradient id="SVGID_281_" gradientUnits="userSpaceOnUse" x1="-90.9683" y1="-329.46" x2="-86.6636" y2="-322.004" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_281_)" d="M356.67,14.51c0.71-1.24,1.42-2.49,2.14-3.74c-0.71-1.25-1.42-2.5-2.13-3.74 + c-1.42,0-2.85,0-4.27,0c-0.71,1.24-1.43,2.49-2.14,3.73c0.71,1.25,1.42,2.49,2.13,3.74C353.82,14.51,355.25,14.51,356.67,14.51z"/> + + <linearGradient id="SVGID_282_" gradientUnits="userSpaceOnUse" x1="-89.8975" y1="-338.6255" x2="-86.6777" y2="-333.0488" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_282_)" d="M350.27-0.28c0.71,1.24,1.42,2.49,2.13,3.74c1.42,0,2.85,0,4.27,0c0.71-1.25,1.42-2.49,2.14-3.74 + C355.97-0.28,353.12-0.28,350.27-0.28z"/> + + <linearGradient id="SVGID_283_" gradientUnits="userSpaceOnUse" x1="-123.5396" y1="-257.9639" x2="-120.3271" y2="-252.3998" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_283_)" d="M391.4,82.29c-0.71-1.25-1.43-2.5-2.14-3.75c-1.43,0-2.86-0.01-4.29-0.02 + c-0.71,1.24-1.43,2.49-2.14,3.72C385.69,82.27,388.54,82.28,391.4,82.29z"/> + + <linearGradient id="SVGID_284_" gradientUnits="userSpaceOnUse" x1="-123.5479" y1="-269.022" x2="-119.2437" y2="-261.5669" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_284_)" d="M389.26,74.96c0.71-1.25,1.43-2.49,2.14-3.74c-0.71-1.25-1.43-2.5-2.14-3.75 + c-1.43,0-2.85-0.01-4.28-0.01c-0.71,1.25-1.43,2.49-2.14,3.73c0.71,1.25,1.42,2.5,2.14,3.75C386.4,74.95,387.83,74.96,389.26,74.96 + z"/> + + <linearGradient id="SVGID_285_" gradientUnits="userSpaceOnUse" x1="-123.5508" y1="-280.0859" x2="-119.2446" y2="-272.6275" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_285_)" d="M389.26,63.9c0.71-1.25,1.43-2.49,2.14-3.74c-0.71-1.25-1.43-2.5-2.14-3.75 + c-1.43,0-2.85,0-4.28-0.01c-0.71,1.24-1.43,2.49-2.14,3.73c0.71,1.25,1.43,2.5,2.14,3.75C386.4,63.89,387.83,63.89,389.26,63.9z"/> + + <linearGradient id="SVGID_286_" gradientUnits="userSpaceOnUse" x1="-123.5522" y1="-291.1479" x2="-119.2466" y2="-283.6903" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_286_)" d="M389.26,52.83c0.71-1.25,1.43-2.49,2.14-3.74c-0.71-1.25-1.43-2.5-2.14-3.75 + c-1.43,0-2.85-0.01-4.28-0.01c-0.71,1.24-1.43,2.49-2.14,3.73c0.71,1.25,1.43,2.5,2.14,3.75 + C386.41,52.83,387.83,52.83,389.26,52.83z"/> + + <linearGradient id="SVGID_287_" gradientUnits="userSpaceOnUse" x1="-123.5547" y1="-302.2114" x2="-119.2476" y2="-294.7513" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_287_)" d="M389.26,41.77c0.71-1.25,1.43-2.49,2.14-3.74c-0.71-1.25-1.43-2.49-2.14-3.74 + c-1.42,0-2.85,0-4.28-0.01c-0.71,1.25-1.43,2.49-2.14,3.74c0.71,1.25,1.42,2.5,2.13,3.75C386.41,41.77,387.84,41.77,389.26,41.77z" + /> + + <linearGradient id="SVGID_288_" gradientUnits="userSpaceOnUse" x1="-123.5576" y1="-313.2739" x2="-119.2505" y2="-305.8138" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_288_)" d="M389.26,30.71c0.71-1.25,1.43-2.5,2.14-3.74c-0.71-1.25-1.42-2.5-2.14-3.74c-1.42,0-2.85,0-4.28,0 + c-0.71,1.25-1.42,2.49-2.13,3.74c0.71,1.25,1.42,2.5,2.13,3.75C386.41,30.7,387.84,30.71,389.26,30.71z"/> + + <linearGradient id="SVGID_289_" gradientUnits="userSpaceOnUse" x1="-123.5596" y1="-324.3374" x2="-119.251" y2="-316.8747" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_289_)" d="M389.26,19.64c0.71-1.25,1.43-2.5,2.14-3.74c-0.71-1.25-1.42-2.5-2.13-3.74c-1.42,0-2.85,0-4.28,0 + c-0.71,1.25-1.42,2.49-2.13,3.74c0.71,1.25,1.42,2.5,2.13,3.75C386.41,19.64,387.84,19.64,389.26,19.64z"/> + + <linearGradient id="SVGID_290_" gradientUnits="userSpaceOnUse" x1="-123.5625" y1="-335.4019" x2="-119.2534" y2="-327.9383" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_290_)" d="M389.27,8.58c0.71-1.25,1.43-2.49,2.14-3.74c-0.71-1.25-1.42-2.5-2.13-3.75c-1.42,0-2.85,0-4.27,0 + c-0.71,1.25-1.42,2.5-2.13,3.74c0.71,1.25,1.42,2.49,2.13,3.74C386.42,8.58,387.84,8.58,389.27,8.58z"/> + + <linearGradient id="SVGID_291_" gradientUnits="userSpaceOnUse" x1="-112.3608" y1="-263.1479" x2="-108.0747" y2="-255.7242" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_291_)" d="M378.08,80.83c0.71-1.24,1.43-2.48,2.14-3.72c-0.71-1.25-1.43-2.51-2.14-3.76 + c-1.43-0.02-2.86-0.03-4.29-0.05c-0.71,1.24-1.43,2.47-2.14,3.71c0.71,1.26,1.43,2.51,2.14,3.77 + C375.22,80.8,376.65,80.82,378.08,80.83z"/> + + <linearGradient id="SVGID_292_" gradientUnits="userSpaceOnUse" x1="-112.3706" y1="-274.1997" x2="-108.0811" y2="-266.77" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_292_)" d="M378.09,69.78c0.71-1.24,1.43-2.48,2.14-3.72c-0.71-1.25-1.43-2.5-2.14-3.76 + c-1.43-0.01-2.86-0.03-4.29-0.04c-0.71,1.24-1.42,2.47-2.14,3.71c0.71,1.25,1.43,2.51,2.14,3.76 + C375.23,69.75,376.66,69.77,378.09,69.78z"/> + + <linearGradient id="SVGID_293_" gradientUnits="userSpaceOnUse" x1="-112.3784" y1="-285.251" x2="-108.0869" y2="-277.8179" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_293_)" d="M378.09,58.73c0.71-1.24,1.43-2.48,2.14-3.72c-0.71-1.25-1.43-2.5-2.14-3.75 + c-1.43-0.01-2.85-0.02-4.28-0.04c-0.71,1.24-1.42,2.48-2.14,3.72c0.71,1.25,1.43,2.51,2.14,3.76 + C375.24,58.7,376.66,58.72,378.09,58.73z"/> + + <linearGradient id="SVGID_294_" gradientUnits="userSpaceOnUse" x1="-112.3872" y1="-296.3032" x2="-108.0918" y2="-288.8633" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_294_)" d="M378.1,47.67c0.71-1.24,1.43-2.48,2.14-3.73c-0.71-1.25-1.43-2.5-2.14-3.75 + c-1.43-0.01-2.85-0.02-4.28-0.03c-0.71,1.24-1.42,2.48-2.14,3.72c0.71,1.25,1.43,2.5,2.14,3.76 + C375.24,47.66,376.67,47.67,378.1,47.67z"/> + + <linearGradient id="SVGID_295_" gradientUnits="userSpaceOnUse" x1="-112.396" y1="-307.356" x2="-108.0981" y2="-299.9119" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_295_)" d="M378.11,36.62c0.71-1.24,1.43-2.49,2.14-3.73c-0.71-1.25-1.42-2.5-2.13-3.75 + c-1.43-0.01-2.85-0.01-4.28-0.02c-0.71,1.24-1.43,2.48-2.14,3.72c0.71,1.25,1.42,2.5,2.13,3.75 + C375.25,36.61,376.68,36.61,378.11,36.62z"/> + + <linearGradient id="SVGID_296_" gradientUnits="userSpaceOnUse" x1="-112.4043" y1="-318.4072" x2="-108.1035" y2="-310.9581" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_296_)" d="M378.11,25.57c0.71-1.24,1.42-2.49,2.14-3.73c-0.71-1.25-1.42-2.5-2.13-3.75 + c-1.43,0-2.85-0.01-4.28-0.01c-0.71,1.24-1.42,2.49-2.14,3.73c0.71,1.25,1.42,2.5,2.13,3.74 + C375.26,25.56,376.68,25.56,378.11,25.57z"/> + + <linearGradient id="SVGID_297_" gradientUnits="userSpaceOnUse" x1="-112.4136" y1="-329.4595" x2="-108.1089" y2="-322.0035" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_297_)" d="M378.12,14.51c0.71-1.24,1.42-2.49,2.14-3.74c-0.71-1.25-1.42-2.5-2.13-3.74 + c-1.42,0-2.85,0-4.27,0c-0.71,1.24-1.43,2.49-2.14,3.73c0.71,1.25,1.42,2.49,2.13,3.74C375.27,14.51,376.69,14.51,378.12,14.51z"/> + + <linearGradient id="SVGID_298_" gradientUnits="userSpaceOnUse" x1="-111.3423" y1="-338.6255" x2="-108.1226" y2="-333.0488" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_298_)" d="M371.72-0.28c0.71,1.24,1.42,2.49,2.13,3.74c1.42,0,2.85,0,4.27,0c0.71-1.25,1.42-2.49,2.14-3.74 + C377.41-0.28,374.57-0.28,371.72-0.28z"/> + + <linearGradient id="SVGID_299_" gradientUnits="userSpaceOnUse" x1="-144.9844" y1="-257.9639" x2="-141.772" y2="-252.3998" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_299_)" d="M412.84,82.29c-0.71-1.25-1.43-2.5-2.14-3.75c-1.43,0-2.86-0.01-4.29-0.02 + c-0.71,1.24-1.43,2.49-2.14,3.72C407.13,82.27,409.99,82.28,412.84,82.29z"/> + + <linearGradient id="SVGID_300_" gradientUnits="userSpaceOnUse" x1="-144.9932" y1="-269.022" x2="-140.689" y2="-261.5669" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_300_)" d="M410.7,74.96c0.71-1.25,1.43-2.49,2.14-3.74c-0.71-1.25-1.43-2.5-2.14-3.75 + c-1.43,0-2.85-0.01-4.28-0.01c-0.71,1.25-1.43,2.49-2.14,3.73c0.71,1.25,1.42,2.5,2.14,3.75C407.85,74.95,409.28,74.96,410.7,74.96 + z"/> + + <linearGradient id="SVGID_301_" gradientUnits="userSpaceOnUse" x1="-144.9961" y1="-280.0859" x2="-140.6899" y2="-272.6275" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_301_)" d="M410.71,63.9c0.71-1.25,1.43-2.49,2.14-3.74c-0.71-1.25-1.43-2.5-2.14-3.75 + c-1.43,0-2.85,0-4.28-0.01c-0.71,1.24-1.43,2.49-2.14,3.73c0.71,1.25,1.43,2.5,2.14,3.75C407.85,63.89,409.28,63.89,410.71,63.9z" + /> + + <linearGradient id="SVGID_302_" gradientUnits="userSpaceOnUse" x1="-144.9976" y1="-291.1479" x2="-140.6919" y2="-283.6903" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_302_)" d="M410.71,52.83c0.71-1.25,1.43-2.49,2.14-3.74c-0.71-1.25-1.43-2.5-2.14-3.75 + c-1.43,0-2.85-0.01-4.28-0.01c-0.71,1.24-1.43,2.49-2.14,3.73c0.71,1.25,1.43,2.5,2.14,3.75 + C407.85,52.83,409.28,52.83,410.71,52.83z"/> + + <linearGradient id="SVGID_303_" gradientUnits="userSpaceOnUse" x1="-145" y1="-302.2114" x2="-140.6929" y2="-294.7513" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_303_)" d="M410.71,41.77c0.71-1.25,1.43-2.49,2.14-3.74c-0.71-1.25-1.42-2.49-2.14-3.74 + c-1.42,0-2.85,0-4.28-0.01c-0.71,1.25-1.43,2.49-2.14,3.74c0.71,1.25,1.42,2.5,2.13,3.75C407.86,41.77,409.28,41.77,410.71,41.77z" + /> + + <linearGradient id="SVGID_304_" gradientUnits="userSpaceOnUse" x1="-145.0029" y1="-313.2739" x2="-140.6958" y2="-305.8138" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_304_)" d="M410.71,30.71c0.71-1.25,1.43-2.5,2.14-3.74c-0.71-1.25-1.42-2.5-2.14-3.74c-1.42,0-2.85,0-4.28,0 + c-0.71,1.25-1.42,2.49-2.13,3.74c0.71,1.25,1.42,2.5,2.13,3.75C407.86,30.7,409.28,30.71,410.71,30.71z"/> + + <linearGradient id="SVGID_305_" gradientUnits="userSpaceOnUse" x1="-145.0049" y1="-324.3374" x2="-140.6963" y2="-316.8747" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_305_)" d="M410.71,19.64c0.71-1.25,1.43-2.5,2.14-3.74c-0.71-1.25-1.42-2.5-2.13-3.74c-1.42,0-2.85,0-4.28,0 + c-0.71,1.25-1.42,2.49-2.13,3.74c0.71,1.25,1.42,2.5,2.13,3.75C407.86,19.64,409.29,19.64,410.71,19.64z"/> + + <linearGradient id="SVGID_306_" gradientUnits="userSpaceOnUse" x1="-145.0088" y1="-335.4014" x2="-140.6997" y2="-327.9378" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_306_)" d="M410.71,8.58c0.71-1.25,1.43-2.49,2.14-3.74c-0.71-1.25-1.42-2.5-2.13-3.75c-1.42,0-2.85,0-4.27,0 + c-0.71,1.25-1.43,2.5-2.14,3.74c0.71,1.25,1.42,2.49,2.13,3.74C407.86,8.58,409.29,8.58,410.71,8.58z"/> + + <linearGradient id="SVGID_307_" gradientUnits="userSpaceOnUse" x1="-133.8071" y1="-263.1475" x2="-129.5205" y2="-255.7228" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_307_)" d="M399.53,80.83c0.71-1.24,1.43-2.48,2.14-3.72c-0.71-1.25-1.43-2.51-2.14-3.76 + c-1.43-0.02-2.86-0.03-4.29-0.05c-0.71,1.24-1.43,2.47-2.14,3.71c0.71,1.26,1.43,2.51,2.14,3.77 + C396.67,80.8,398.1,80.82,399.53,80.83z"/> + + <linearGradient id="SVGID_308_" gradientUnits="userSpaceOnUse" x1="-133.8159" y1="-274.1997" x2="-129.5264" y2="-266.77" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_308_)" d="M399.53,69.78c0.71-1.24,1.43-2.48,2.14-3.72c-0.71-1.25-1.43-2.5-2.14-3.76 + c-1.43-0.01-2.86-0.03-4.29-0.04c-0.71,1.24-1.42,2.47-2.14,3.71c0.71,1.25,1.42,2.51,2.13,3.76 + C396.68,69.75,398.1,69.77,399.53,69.78z"/> + + <linearGradient id="SVGID_309_" gradientUnits="userSpaceOnUse" x1="-133.8237" y1="-285.251" x2="-129.5322" y2="-277.8179" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_309_)" d="M399.54,58.73c0.71-1.24,1.43-2.48,2.14-3.72c-0.71-1.25-1.43-2.5-2.14-3.75 + c-1.43-0.01-2.85-0.02-4.28-0.04c-0.71,1.24-1.43,2.48-2.14,3.72c0.71,1.25,1.42,2.51,2.13,3.76 + C396.68,58.7,398.11,58.72,399.54,58.73z"/> + + <linearGradient id="SVGID_310_" gradientUnits="userSpaceOnUse" x1="-133.8325" y1="-296.3032" x2="-129.5371" y2="-288.8633" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_310_)" d="M399.54,47.67c0.71-1.24,1.43-2.48,2.14-3.73c-0.71-1.25-1.43-2.5-2.14-3.75 + c-1.43-0.01-2.85-0.02-4.28-0.03c-0.71,1.24-1.43,2.48-2.14,3.72c0.71,1.25,1.42,2.5,2.13,3.76 + C396.69,47.66,398.12,47.67,399.54,47.67z"/> + + <linearGradient id="SVGID_311_" gradientUnits="userSpaceOnUse" x1="-133.8413" y1="-307.356" x2="-129.5435" y2="-299.9119" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_311_)" d="M399.55,36.62c0.71-1.24,1.43-2.49,2.14-3.73c-0.71-1.25-1.42-2.5-2.13-3.75 + c-1.43-0.01-2.85-0.01-4.28-0.02c-0.71,1.24-1.43,2.48-2.14,3.72c0.71,1.25,1.42,2.5,2.13,3.75 + C396.7,36.61,398.12,36.61,399.55,36.62z"/> + + <linearGradient id="SVGID_312_" gradientUnits="userSpaceOnUse" x1="-133.8496" y1="-318.4072" x2="-129.5488" y2="-310.9581" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_312_)" d="M399.56,25.57c0.71-1.24,1.42-2.49,2.14-3.73c-0.71-1.25-1.42-2.5-2.13-3.75 + c-1.43,0-2.85-0.01-4.28-0.01c-0.71,1.24-1.42,2.49-2.14,3.73c0.71,1.25,1.42,2.5,2.13,3.74 + C396.71,25.56,398.13,25.56,399.56,25.57z"/> + + <linearGradient id="SVGID_313_" gradientUnits="userSpaceOnUse" x1="-133.8589" y1="-329.4595" x2="-129.5542" y2="-322.0035" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_313_)" d="M399.56,14.51c0.71-1.24,1.42-2.49,2.14-3.74c-0.71-1.25-1.42-2.5-2.13-3.74 + c-1.42,0-2.85,0-4.27,0c-0.71,1.24-1.43,2.49-2.14,3.73c0.71,1.25,1.42,2.49,2.13,3.74C396.71,14.51,398.14,14.51,399.56,14.51z"/> + + <linearGradient id="SVGID_314_" gradientUnits="userSpaceOnUse" x1="-132.7886" y1="-338.625" x2="-129.5688" y2="-333.0483" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_314_)" d="M393.16-0.28c0.71,1.24,1.42,2.49,2.13,3.74c1.42,0,2.85,0,4.27,0c0.71-1.25,1.42-2.49,2.14-3.74 + C398.86-0.28,396.01-0.28,393.16-0.28z"/> + + <linearGradient id="SVGID_315_" gradientUnits="userSpaceOnUse" x1="-166.4292" y1="-257.9639" x2="-163.2168" y2="-252.3998" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_315_)" d="M434.29,82.29c-0.71-1.25-1.43-2.5-2.14-3.75c-1.43,0-2.86-0.01-4.29-0.02 + c-0.71,1.24-1.43,2.49-2.14,3.72C428.58,82.27,431.43,82.28,434.29,82.29z"/> + + <linearGradient id="SVGID_316_" gradientUnits="userSpaceOnUse" x1="-166.438" y1="-269.0225" x2="-162.1338" y2="-261.5674" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_316_)" d="M432.15,74.96c0.71-1.25,1.43-2.49,2.14-3.74c-0.71-1.25-1.43-2.5-2.14-3.75 + c-1.43,0-2.85-0.01-4.28-0.01c-0.71,1.25-1.43,2.49-2.14,3.73c0.71,1.25,1.42,2.5,2.14,3.75 + C429.29,74.95,430.72,74.96,432.15,74.96z"/> + + <linearGradient id="SVGID_317_" gradientUnits="userSpaceOnUse" x1="-166.4414" y1="-280.0859" x2="-162.1353" y2="-272.6275" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_317_)" d="M432.15,63.9c0.71-1.25,1.43-2.49,2.14-3.74c-0.71-1.25-1.43-2.5-2.14-3.75 + c-1.43,0-2.85,0-4.28-0.01c-0.71,1.24-1.43,2.49-2.14,3.73c0.71,1.25,1.43,2.5,2.14,3.75C429.29,63.89,430.72,63.89,432.15,63.9z" + /> + + <linearGradient id="SVGID_318_" gradientUnits="userSpaceOnUse" x1="-166.4434" y1="-291.1479" x2="-162.1377" y2="-283.6903" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_318_)" d="M432.15,52.83c0.71-1.25,1.43-2.49,2.14-3.74c-0.71-1.25-1.43-2.5-2.14-3.75 + c-1.43,0-2.85-0.01-4.28-0.01c-0.71,1.24-1.43,2.49-2.14,3.73c0.71,1.25,1.43,2.5,2.14,3.75C429.3,52.83,430.72,52.83,432.15,52.83 + z"/> + + <linearGradient id="SVGID_319_" gradientUnits="userSpaceOnUse" x1="-166.4453" y1="-302.2114" x2="-162.1382" y2="-294.7513" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_319_)" d="M432.15,41.77c0.71-1.25,1.43-2.49,2.14-3.74c-0.71-1.25-1.42-2.49-2.14-3.74 + c-1.42,0-2.85,0-4.28-0.01c-0.71,1.25-1.43,2.49-2.14,3.74c0.71,1.25,1.42,2.5,2.13,3.75C429.3,41.77,430.73,41.77,432.15,41.77z" + /> + + <linearGradient id="SVGID_320_" gradientUnits="userSpaceOnUse" x1="-166.4482" y1="-313.2739" x2="-162.1411" y2="-305.8138" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_320_)" d="M432.15,30.71c0.71-1.25,1.42-2.5,2.14-3.74c-0.71-1.25-1.42-2.5-2.14-3.74c-1.42,0-2.85,0-4.28,0 + c-0.71,1.25-1.42,2.49-2.13,3.74c0.71,1.25,1.42,2.5,2.13,3.75C429.3,30.7,430.73,30.71,432.15,30.71z"/> + + <linearGradient id="SVGID_321_" gradientUnits="userSpaceOnUse" x1="-166.4502" y1="-324.3369" x2="-162.1416" y2="-316.8742" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_321_)" d="M432.15,19.64c0.71-1.25,1.42-2.5,2.14-3.74c-0.71-1.25-1.42-2.5-2.13-3.74c-1.42,0-2.85,0-4.28,0 + c-0.71,1.25-1.42,2.49-2.13,3.74c0.71,1.25,1.42,2.5,2.13,3.75C429.3,19.64,430.73,19.64,432.15,19.64z"/> + + <linearGradient id="SVGID_322_" gradientUnits="userSpaceOnUse" x1="-166.4536" y1="-335.4019" x2="-162.1445" y2="-327.9383" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_322_)" d="M432.16,8.58c0.71-1.25,1.42-2.49,2.14-3.74c-0.71-1.25-1.42-2.5-2.13-3.75c-1.42,0-2.85,0-4.27,0 + c-0.71,1.25-1.43,2.5-2.14,3.74c0.71,1.25,1.42,2.49,2.13,3.74C429.31,8.58,430.73,8.58,432.16,8.58z"/> + + <linearGradient id="SVGID_323_" gradientUnits="userSpaceOnUse" x1="-155.2524" y1="-263.1475" x2="-150.9663" y2="-255.7237" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_323_)" d="M420.97,80.83c0.71-1.24,1.43-2.48,2.14-3.72c-0.71-1.25-1.43-2.51-2.14-3.76 + c-1.43-0.02-2.86-0.03-4.29-0.05c-0.71,1.24-1.43,2.47-2.14,3.71c0.71,1.26,1.43,2.51,2.14,3.77 + C418.12,80.8,419.54,80.82,420.97,80.83z"/> + + <linearGradient id="SVGID_324_" gradientUnits="userSpaceOnUse" x1="-155.2622" y1="-274.1992" x2="-150.9731" y2="-266.7704" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_324_)" d="M420.98,69.78c0.71-1.24,1.43-2.48,2.14-3.72c-0.71-1.25-1.43-2.5-2.14-3.76 + c-1.43-0.01-2.86-0.03-4.28-0.04c-0.71,1.24-1.43,2.47-2.14,3.71c0.71,1.25,1.42,2.51,2.14,3.76 + C418.12,69.75,419.55,69.77,420.98,69.78z"/> + + <linearGradient id="SVGID_325_" gradientUnits="userSpaceOnUse" x1="-155.27" y1="-285.2505" x2="-150.979" y2="-277.8182" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_325_)" d="M420.98,58.73c0.71-1.24,1.43-2.48,2.14-3.72c-0.71-1.25-1.43-2.5-2.14-3.75 + c-1.43-0.01-2.85-0.02-4.28-0.04c-0.71,1.24-1.43,2.48-2.14,3.72c0.71,1.25,1.42,2.51,2.14,3.76 + C418.13,58.7,419.56,58.72,420.98,58.73z"/> + + <linearGradient id="SVGID_326_" gradientUnits="userSpaceOnUse" x1="-155.2788" y1="-296.3027" x2="-150.9839" y2="-288.8637" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_326_)" d="M420.99,47.67c0.71-1.24,1.43-2.48,2.14-3.73c-0.71-1.25-1.43-2.5-2.14-3.75 + c-1.43-0.01-2.85-0.02-4.28-0.03c-0.71,1.24-1.43,2.48-2.14,3.72c0.71,1.25,1.42,2.5,2.14,3.76 + C418.13,47.66,419.56,47.67,420.99,47.67z"/> + + <linearGradient id="SVGID_327_" gradientUnits="userSpaceOnUse" x1="-155.2876" y1="-307.3555" x2="-150.9897" y2="-299.9114" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_327_)" d="M421,36.62c0.71-1.24,1.43-2.49,2.14-3.73c-0.71-1.25-1.42-2.5-2.13-3.75 + c-1.43-0.01-2.85-0.01-4.28-0.02c-0.71,1.24-1.43,2.48-2.14,3.72c0.71,1.25,1.42,2.5,2.13,3.75 + C418.14,36.61,419.57,36.61,421,36.62z"/> + + <linearGradient id="SVGID_328_" gradientUnits="userSpaceOnUse" x1="-155.2959" y1="-318.4067" x2="-150.9956" y2="-310.9584" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_328_)" d="M421,25.57c0.71-1.24,1.42-2.49,2.14-3.73c-0.71-1.25-1.42-2.5-2.13-3.75 + c-1.43,0-2.85-0.01-4.28-0.01c-0.71,1.24-1.43,2.49-2.14,3.73c0.71,1.25,1.42,2.5,2.13,3.74C418.15,25.56,419.58,25.56,421,25.57z" + /> + + <linearGradient id="SVGID_329_" gradientUnits="userSpaceOnUse" x1="-155.3027" y1="-329.4595" x2="-150.999" y2="-322.0052" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_329_)" d="M421.01,14.51c0.71-1.24,1.43-2.49,2.14-3.74c-0.71-1.25-1.42-2.5-2.14-3.74 + c-1.42,0-2.85,0-4.27,0c-0.71,1.24-1.43,2.49-2.14,3.73c0.71,1.25,1.42,2.49,2.13,3.74C418.16,14.51,419.58,14.51,421.01,14.51z"/> + + <linearGradient id="SVGID_330_" gradientUnits="userSpaceOnUse" x1="-154.2339" y1="-338.625" x2="-151.0142" y2="-333.0483" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_330_)" d="M414.61-0.28c0.71,1.24,1.42,2.49,2.13,3.74c1.42,0,2.85,0,4.27,0c0.71-1.25,1.42-2.49,2.14-3.74 + C420.3-0.28,417.46-0.28,414.61-0.28z"/> + + <linearGradient id="SVGID_331_" gradientUnits="userSpaceOnUse" x1="-187.875" y1="-257.9639" x2="-184.6626" y2="-252.3998" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_331_)" d="M455.73,82.29c-0.71-1.25-1.43-2.5-2.14-3.75c-1.43,0-2.86-0.01-4.29-0.02 + c-0.71,1.24-1.43,2.49-2.14,3.72C450.02,82.27,452.88,82.28,455.73,82.29z"/> + + <linearGradient id="SVGID_332_" gradientUnits="userSpaceOnUse" x1="-187.8833" y1="-269.0225" x2="-183.5791" y2="-261.5674" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_332_)" d="M453.59,74.96c0.71-1.25,1.43-2.49,2.14-3.74c-0.72-1.25-1.43-2.5-2.14-3.75 + c-1.43,0-2.85-0.01-4.28-0.01c-0.71,1.25-1.43,2.49-2.14,3.73c0.71,1.25,1.42,2.5,2.14,3.75 + C450.74,74.95,452.17,74.96,453.59,74.96z"/> + + <linearGradient id="SVGID_333_" gradientUnits="userSpaceOnUse" x1="-187.8872" y1="-280.0859" x2="-183.5811" y2="-272.6275" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_333_)" d="M453.6,63.9c0.71-1.25,1.43-2.49,2.14-3.74c-0.71-1.25-1.43-2.5-2.14-3.75 + c-1.43,0-2.85,0-4.28-0.01c-0.71,1.24-1.43,2.49-2.14,3.73c0.71,1.25,1.43,2.5,2.14,3.75C450.74,63.89,452.17,63.89,453.6,63.9z"/> + + <linearGradient id="SVGID_334_" gradientUnits="userSpaceOnUse" x1="-187.8887" y1="-291.1479" x2="-183.583" y2="-283.6903" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_334_)" d="M453.6,52.83c0.71-1.25,1.43-2.49,2.14-3.74c-0.71-1.25-1.43-2.5-2.14-3.75 + c-1.43,0-2.85-0.01-4.28-0.01c-0.71,1.24-1.43,2.49-2.14,3.73c0.71,1.25,1.43,2.5,2.14,3.75C450.74,52.83,452.17,52.83,453.6,52.83 + z"/> + + <linearGradient id="SVGID_335_" gradientUnits="userSpaceOnUse" x1="-187.8906" y1="-302.2114" x2="-183.5835" y2="-294.7513" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_335_)" d="M453.6,41.77c0.71-1.25,1.43-2.49,2.14-3.74c-0.71-1.25-1.42-2.49-2.14-3.74 + c-1.42,0-2.85,0-4.28-0.01c-0.71,1.25-1.43,2.49-2.14,3.74c0.71,1.25,1.42,2.5,2.13,3.75C450.75,41.77,452.17,41.77,453.6,41.77z" + /> + + <linearGradient id="SVGID_336_" gradientUnits="userSpaceOnUse" x1="-187.8931" y1="-313.2739" x2="-183.5859" y2="-305.8138" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_336_)" d="M453.6,30.71c0.71-1.25,1.42-2.5,2.14-3.74c-0.71-1.25-1.42-2.5-2.14-3.74c-1.42,0-2.85,0-4.28,0 + c-0.71,1.25-1.42,2.49-2.13,3.74c0.71,1.25,1.42,2.5,2.13,3.75C450.75,30.7,452.17,30.71,453.6,30.71z"/> + + <linearGradient id="SVGID_337_" gradientUnits="userSpaceOnUse" x1="-187.895" y1="-324.3374" x2="-183.5864" y2="-316.8747" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_337_)" d="M453.6,19.64c0.71-1.25,1.42-2.5,2.14-3.74c-0.71-1.25-1.42-2.5-2.13-3.74c-1.42,0-2.85,0-4.28,0 + c-0.71,1.25-1.42,2.49-2.13,3.74c0.71,1.25,1.42,2.5,2.13,3.75C450.75,19.64,452.18,19.64,453.6,19.64z"/> + + <linearGradient id="SVGID_338_" gradientUnits="userSpaceOnUse" x1="-187.8989" y1="-335.4019" x2="-183.5898" y2="-327.9383" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_338_)" d="M453.6,8.58c0.71-1.25,1.42-2.49,2.14-3.74c-0.71-1.25-1.42-2.5-2.13-3.75c-1.42,0-2.85,0-4.27,0 + c-0.71,1.25-1.43,2.5-2.14,3.74c0.71,1.25,1.42,2.49,2.13,3.74C450.75,8.58,452.18,8.58,453.6,8.58z"/> + + <linearGradient id="SVGID_339_" gradientUnits="userSpaceOnUse" x1="-176.6978" y1="-263.147" x2="-172.4116" y2="-255.7232" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_339_)" d="M442.42,80.83c0.71-1.24,1.43-2.48,2.14-3.72c-0.71-1.25-1.43-2.51-2.14-3.76 + c-1.43-0.02-2.86-0.03-4.29-0.05c-0.71,1.24-1.43,2.47-2.14,3.71c0.71,1.26,1.43,2.51,2.14,3.77 + C439.56,80.8,440.99,80.82,442.42,80.83z"/> + + <linearGradient id="SVGID_340_" gradientUnits="userSpaceOnUse" x1="-176.7075" y1="-274.1992" x2="-172.4185" y2="-266.7704" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_340_)" d="M442.42,69.78c0.71-1.24,1.43-2.48,2.14-3.72c-0.71-1.25-1.43-2.5-2.14-3.76 + c-1.43-0.01-2.86-0.03-4.28-0.04c-0.71,1.24-1.43,2.47-2.14,3.71c0.71,1.25,1.42,2.51,2.14,3.76 + C439.57,69.75,441,69.77,442.42,69.78z"/> + + <linearGradient id="SVGID_341_" gradientUnits="userSpaceOnUse" x1="-176.7144" y1="-285.251" x2="-172.4233" y2="-277.8187" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_341_)" d="M442.43,58.73c0.71-1.24,1.43-2.48,2.14-3.72c-0.71-1.25-1.42-2.5-2.14-3.75 + c-1.43-0.01-2.85-0.02-4.28-0.04c-0.71,1.24-1.43,2.48-2.14,3.72c0.71,1.25,1.42,2.51,2.14,3.76 + C439.57,58.7,441,58.72,442.43,58.73z"/> + + <linearGradient id="SVGID_342_" gradientUnits="userSpaceOnUse" x1="-176.7231" y1="-296.3032" x2="-172.4282" y2="-288.8642" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_342_)" d="M442.43,47.67c0.71-1.24,1.43-2.48,2.14-3.73c-0.71-1.25-1.42-2.5-2.14-3.75 + c-1.43-0.01-2.85-0.02-4.28-0.03c-0.71,1.24-1.43,2.48-2.14,3.72c0.71,1.25,1.42,2.5,2.14,3.76 + C439.58,47.66,441.01,47.67,442.43,47.67z"/> + + <linearGradient id="SVGID_343_" gradientUnits="userSpaceOnUse" x1="-176.7319" y1="-307.3555" x2="-172.4341" y2="-299.9114" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_343_)" d="M442.44,36.62c0.71-1.24,1.43-2.49,2.14-3.73c-0.71-1.25-1.42-2.5-2.13-3.75 + c-1.43-0.01-2.85-0.01-4.28-0.02c-0.71,1.24-1.43,2.48-2.14,3.72c0.71,1.25,1.42,2.5,2.13,3.75 + C439.59,36.61,441.02,36.61,442.44,36.62z"/> + + <linearGradient id="SVGID_344_" gradientUnits="userSpaceOnUse" x1="-176.7397" y1="-318.4067" x2="-172.4399" y2="-310.9593" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_344_)" d="M442.45,25.57c0.71-1.24,1.42-2.49,2.14-3.73c-0.71-1.25-1.42-2.5-2.14-3.75 + c-1.42,0-2.85-0.01-4.27-0.01c-0.71,1.24-1.43,2.49-2.14,3.73c0.71,1.25,1.42,2.5,2.13,3.74C439.6,25.56,441.02,25.56,442.45,25.57 + z"/> + + <linearGradient id="SVGID_345_" gradientUnits="userSpaceOnUse" x1="-176.748" y1="-329.4595" x2="-172.4443" y2="-322.0052" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_345_)" d="M442.45,14.51c0.71-1.24,1.43-2.49,2.14-3.74c-0.71-1.25-1.42-2.5-2.14-3.74 + c-1.42,0-2.85,0-4.27,0c-0.71,1.24-1.43,2.49-2.14,3.73c0.71,1.25,1.42,2.49,2.13,3.74C439.6,14.51,441.03,14.51,442.45,14.51z"/> + + <linearGradient id="SVGID_346_" gradientUnits="userSpaceOnUse" x1="-175.6792" y1="-338.625" x2="-172.4595" y2="-333.0483" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_346_)" d="M436.05-0.28c0.71,1.24,1.42,2.49,2.13,3.74c1.42,0,2.85,0,4.27,0c0.71-1.25,1.42-2.49,2.14-3.74 + C441.75-0.28,438.9-0.28,436.05-0.28z"/> + + <linearGradient id="SVGID_347_" gradientUnits="userSpaceOnUse" x1="-198.1436" y1="-263.147" x2="-193.8574" y2="-255.7232" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_347_)" d="M463.86,80.83c0.71-1.24,1.43-2.48,2.14-3.72c-0.71-1.25-1.43-2.51-2.14-3.76 + c-1.43-0.02-2.86-0.03-4.29-0.05c-0.71,1.24-1.43,2.47-2.14,3.71c0.71,1.26,1.43,2.51,2.14,3.77 + C461.01,80.8,462.44,80.82,463.86,80.83z"/> + + <linearGradient id="SVGID_348_" gradientUnits="userSpaceOnUse" x1="-198.1533" y1="-274.1992" x2="-193.8643" y2="-266.7704" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_348_)" d="M463.87,69.78c0.71-1.24,1.43-2.48,2.14-3.72c-0.71-1.25-1.43-2.5-2.14-3.76 + c-1.43-0.01-2.86-0.03-4.28-0.04c-0.71,1.24-1.43,2.47-2.14,3.71c0.71,1.25,1.42,2.51,2.14,3.76 + C461.01,69.75,462.44,69.77,463.87,69.78z"/> + + <linearGradient id="SVGID_349_" gradientUnits="userSpaceOnUse" x1="-198.1606" y1="-285.25" x2="-193.8696" y2="-277.8177" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_349_)" d="M463.88,58.73c0.71-1.24,1.43-2.48,2.14-3.72c-0.71-1.25-1.42-2.5-2.14-3.75 + c-1.43-0.01-2.85-0.02-4.28-0.04c-0.71,1.24-1.43,2.48-2.14,3.72c0.71,1.25,1.42,2.51,2.14,3.76 + C461.02,58.7,462.45,58.72,463.88,58.73z"/> + + <linearGradient id="SVGID_350_" gradientUnits="userSpaceOnUse" x1="-198.1689" y1="-296.3027" x2="-193.874" y2="-288.8637" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_350_)" d="M463.88,47.67c0.71-1.24,1.43-2.48,2.14-3.73c-0.71-1.25-1.42-2.5-2.14-3.75 + c-1.43-0.01-2.85-0.02-4.28-0.03c-0.71,1.24-1.43,2.48-2.14,3.72c0.71,1.25,1.42,2.5,2.14,3.76 + C461.03,47.66,462.46,47.67,463.88,47.67z"/> + + <linearGradient id="SVGID_351_" gradientUnits="userSpaceOnUse" x1="-198.1777" y1="-307.3555" x2="-193.8799" y2="-299.9114" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_351_)" d="M463.89,36.62c0.71-1.24,1.43-2.49,2.14-3.73c-0.71-1.25-1.42-2.5-2.13-3.75 + c-1.43-0.01-2.85-0.01-4.28-0.02c-0.71,1.24-1.43,2.48-2.14,3.72c0.71,1.25,1.42,2.5,2.13,3.75 + C461.03,36.61,462.46,36.61,463.89,36.62z"/> + + <linearGradient id="SVGID_352_" gradientUnits="userSpaceOnUse" x1="-198.186" y1="-318.4072" x2="-193.8857" y2="-310.9589" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_352_)" d="M463.89,25.57c0.71-1.24,1.42-2.49,2.14-3.73c-0.71-1.25-1.42-2.5-2.13-3.75 + c-1.43,0-2.85-0.01-4.28-0.01c-0.71,1.24-1.43,2.49-2.14,3.73c0.71,1.25,1.42,2.5,2.13,3.74 + C461.04,25.56,462.46,25.56,463.89,25.57z"/> + + <linearGradient id="SVGID_353_" gradientUnits="userSpaceOnUse" x1="-198.1948" y1="-329.46" x2="-193.8906" y2="-322.0049" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_353_)" d="M463.9,14.51c0.71-1.24,1.42-2.49,2.14-3.74c-0.71-1.25-1.42-2.5-2.13-3.74c-1.42,0-2.85,0-4.27,0 + c-0.71,1.24-1.43,2.49-2.14,3.73c0.71,1.25,1.42,2.49,2.13,3.74C461.05,14.51,462.47,14.51,463.9,14.51z"/> + + <linearGradient id="SVGID_354_" gradientUnits="userSpaceOnUse" x1="-197.124" y1="-338.6255" x2="-193.9043" y2="-333.0488" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_354_)" d="M457.5-0.28c0.71,1.24,1.42,2.49,2.13,3.74c1.42,0,2.85,0,4.27,0c0.71-1.25,1.42-2.49,2.14-3.74 + C463.19-0.28,460.35-0.28,457.5-0.28z"/> + + <linearGradient id="SVGID_355_" gradientUnits="userSpaceOnUse" x1="112.9204" y1="-258.2065" x2="116.082" y2="-252.7305" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_355_)" d="M154.96,82.08c-0.71-1.26-1.43-2.51-2.14-3.77c-1.43-0.03-2.86-0.06-4.29-0.09 + c-0.71,1.23-1.43,2.45-2.14,3.68C149.24,81.97,152.1,82.03,154.96,82.08z"/> + + <linearGradient id="SVGID_356_" gradientUnits="userSpaceOnUse" x1="112.9058" y1="-269.2368" x2="117.1743" y2="-261.8435" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_356_)" d="M152.82,74.74c0.71-1.23,1.43-2.46,2.14-3.7c-0.71-1.25-1.43-2.51-2.14-3.77 + c-1.43-0.02-2.85-0.05-4.28-0.07c-0.72,1.23-1.43,2.46-2.15,3.68c0.71,1.25,1.42,2.51,2.14,3.77 + C149.97,74.68,151.39,74.71,152.82,74.74z"/> + + <linearGradient id="SVGID_357_" gradientUnits="userSpaceOnUse" x1="112.8926" y1="-280.2642" x2="117.1646" y2="-272.8649" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_357_)" d="M152.83,63.71c0.71-1.23,1.43-2.47,2.14-3.7c-0.71-1.26-1.43-2.51-2.14-3.76 + c-1.42-0.02-2.85-0.04-4.28-0.06c-0.72,1.23-1.43,2.46-2.14,3.69c0.71,1.25,1.42,2.51,2.14,3.76 + C149.98,63.66,151.4,63.69,152.83,63.71z"/> + + <linearGradient id="SVGID_358_" gradientUnits="userSpaceOnUse" x1="112.8804" y1="-291.293" x2="117.1567" y2="-283.8861" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_358_)" d="M152.84,52.68c0.71-1.24,1.43-2.47,2.14-3.71c-0.71-1.25-1.42-2.5-2.13-3.75 + c-1.42-0.01-2.85-0.03-4.28-0.05c-0.71,1.23-1.43,2.46-2.14,3.69c0.71,1.25,1.42,2.5,2.14,3.76 + C149.99,52.64,151.42,52.66,152.84,52.68z"/> + + <linearGradient id="SVGID_359_" gradientUnits="userSpaceOnUse" x1="112.8647" y1="-302.3213" x2="117.1465" y2="-294.9051" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_359_)" d="M152.85,41.64c0.71-1.23,1.43-2.47,2.14-3.71c-0.71-1.25-1.42-2.5-2.14-3.75 + c-1.42-0.01-2.85-0.02-4.27-0.04c-0.71,1.24-1.43,2.47-2.14,3.7c0.71,1.25,1.42,2.5,2.13,3.75C150,41.62,151.43,41.63,152.85,41.64 + z"/> + + <linearGradient id="SVGID_360_" gradientUnits="userSpaceOnUse" x1="112.8496" y1="-313.3501" x2="117.1362" y2="-305.9254" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_360_)" d="M152.86,30.61c0.72-1.24,1.43-2.48,2.14-3.72c-0.71-1.25-1.42-2.5-2.13-3.75 + c-1.42-0.01-2.85-0.02-4.27-0.03c-0.71,1.24-1.43,2.48-2.14,3.71c0.71,1.25,1.42,2.49,2.13,3.74 + C150.01,30.59,151.44,30.6,152.86,30.61z"/> + + <linearGradient id="SVGID_361_" gradientUnits="userSpaceOnUse" x1="112.8354" y1="-324.3779" x2="117.1284" y2="-316.9423" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_361_)" d="M152.87,19.58c0.71-1.24,1.43-2.48,2.14-3.72c-0.71-1.25-1.42-2.49-2.14-3.74 + c-1.42,0-2.85-0.01-4.27-0.01c-0.71,1.24-1.43,2.48-2.14,3.72c0.71,1.25,1.42,2.49,2.13,3.74 + C150.02,19.57,151.45,19.58,152.87,19.58z"/> + + <linearGradient id="SVGID_362_" gradientUnits="userSpaceOnUse" x1="112.8232" y1="-335.4092" x2="117.1201" y2="-327.9668" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_362_)" d="M152.88,8.55c0.71-1.24,1.43-2.48,2.14-3.73c-0.71-1.25-1.42-2.49-2.13-3.74 + c-1.42,0-2.85,0-4.27,0c-0.71,1.24-1.43,2.49-2.14,3.73c0.71,1.24,1.42,2.49,2.13,3.73C150.03,8.54,151.46,8.55,152.88,8.55z"/> + + <linearGradient id="SVGID_363_" gradientUnits="userSpaceOnUse" x1="124.0977" y1="-263.5513" x2="128.3364" y2="-256.2095" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_363_)" d="M141.64,80.41c0.71-1.22,1.43-2.44,2.14-3.66c-0.71-1.26-1.42-2.52-2.13-3.78 + c-1.43-0.04-2.86-0.08-4.28-0.12c-0.71,1.22-1.43,2.43-2.15,3.65c0.71,1.26,1.43,2.52,2.13,3.78 + C138.79,80.32,140.21,80.37,141.64,80.41z"/> + + <linearGradient id="SVGID_364_" gradientUnits="userSpaceOnUse" x1="124.0786" y1="-274.5439" x2="128.3242" y2="-267.1903" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_364_)" d="M141.66,69.41c0.71-1.22,1.43-2.45,2.14-3.67c-0.71-1.26-1.42-2.51-2.13-3.77 + c-1.43-0.03-2.86-0.06-4.28-0.1c-0.71,1.22-1.43,2.44-2.14,3.66c0.71,1.25,1.42,2.51,2.13,3.77 + C138.8,69.34,140.23,69.38,141.66,69.41z"/> + + <linearGradient id="SVGID_365_" gradientUnits="userSpaceOnUse" x1="124.0596" y1="-285.5361" x2="128.313" y2="-278.169" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_365_)" d="M141.67,58.42c0.71-1.23,1.43-2.45,2.14-3.68c-0.71-1.25-1.42-2.51-2.13-3.76 + c-1.43-0.02-2.85-0.05-4.28-0.08c-0.71,1.22-1.43,2.44-2.14,3.67c0.71,1.25,1.42,2.51,2.13,3.76 + C138.82,58.36,140.24,58.39,141.67,58.42z"/> + + <linearGradient id="SVGID_366_" gradientUnits="userSpaceOnUse" x1="124.0405" y1="-296.5273" x2="128.3013" y2="-289.1475" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_366_)" d="M141.68,47.42c0.72-1.23,1.43-2.46,2.15-3.69c-0.71-1.25-1.42-2.5-2.13-3.75 + c-1.43-0.02-2.85-0.04-4.28-0.06c-0.71,1.23-1.43,2.45-2.14,3.67c0.71,1.25,1.42,2.5,2.13,3.75 + C138.83,47.37,140.26,47.4,141.68,47.42z"/> + + <linearGradient id="SVGID_367_" gradientUnits="userSpaceOnUse" x1="124.02" y1="-307.5225" x2="128.2886" y2="-300.1291" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_367_)" d="M141.7,36.43c0.71-1.23,1.43-2.46,2.14-3.69c-0.71-1.25-1.42-2.5-2.13-3.75 + c-1.43-0.01-2.85-0.03-4.28-0.04c-0.71,1.23-1.43,2.46-2.14,3.69c0.71,1.25,1.42,2.49,2.13,3.74 + C138.85,36.39,140.27,36.41,141.7,36.43z"/> + + <linearGradient id="SVGID_368_" gradientUnits="userSpaceOnUse" x1="124.0034" y1="-318.5122" x2="128.2773" y2="-311.1096" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_368_)" d="M141.71,25.43c0.71-1.23,1.43-2.47,2.14-3.7c-0.71-1.25-1.42-2.49-2.13-3.73 + c-1.42-0.01-2.85-0.02-4.27-0.03c-0.71,1.23-1.43,2.46-2.14,3.69c0.71,1.25,1.42,2.49,2.13,3.73 + C138.87,25.41,140.29,25.42,141.71,25.43z"/> + + <linearGradient id="SVGID_369_" gradientUnits="userSpaceOnUse" x1="123.9839" y1="-329.5044" x2="128.2651" y2="-322.0891" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_369_)" d="M141.73,14.44c0.71-1.24,1.43-2.48,2.14-3.71c-0.71-1.24-1.42-2.48-2.13-3.72 + c-1.43,0-2.85-0.01-4.27-0.01c-0.71,1.24-1.43,2.47-2.14,3.7c0.71,1.24,1.42,2.48,2.13,3.72C138.88,14.42,140.3,14.43,141.73,14.44 + z"/> + + <linearGradient id="SVGID_370_" gradientUnits="userSpaceOnUse" x1="125.0405" y1="-338.6304" x2="128.252" y2="-333.068" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_370_)" d="M135.34-0.28c0.71,1.24,1.42,2.48,2.13,3.71c1.42,0,2.85,0,4.27,0.01 + c0.71-1.24,1.43-2.48,2.14-3.72C141.04-0.28,138.19-0.28,135.34-0.28z"/> + + <linearGradient id="SVGID_371_" gradientUnits="userSpaceOnUse" x1="134.9282" y1="-258.8154" x2="138.0298" y2="-253.4434" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_371_)" d="M132.97,81.5c-0.71-1.26-1.42-2.52-2.13-3.78c-1.43-0.05-2.85-0.1-4.28-0.16 + c-0.71,1.21-1.43,2.41-2.15,3.61C127.26,81.29,130.12,81.39,132.97,81.5z"/> + + <linearGradient id="SVGID_372_" gradientUnits="userSpaceOnUse" x1="134.9053" y1="-269.7573" x2="139.1196" y2="-262.4579" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_372_)" d="M130.84,74.17c0.72-1.21,1.43-2.42,2.15-3.64c-0.71-1.26-1.42-2.51-2.13-3.77 + c-1.43-0.04-2.85-0.09-4.28-0.14c-0.71,1.21-1.43,2.41-2.14,3.62c0.71,1.25,1.42,2.51,2.13,3.77 + C127.99,74.07,129.42,74.12,130.84,74.17z"/> + + <linearGradient id="SVGID_373_" gradientUnits="userSpaceOnUse" x1="134.8804" y1="-280.707" x2="139.1064" y2="-273.3873" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_373_)" d="M130.86,63.22c0.71-1.21,1.43-2.43,2.15-3.65c-0.71-1.25-1.42-2.5-2.13-3.76 + c-1.43-0.03-2.85-0.07-4.28-0.11c-0.71,1.21-1.43,2.42-2.14,3.63c0.71,1.25,1.42,2.5,2.13,3.76 + C128.01,63.14,129.44,63.19,130.86,63.22z"/> + + <linearGradient id="SVGID_374_" gradientUnits="userSpaceOnUse" x1="134.8579" y1="-291.6499" x2="139.0913" y2="-284.3174" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_374_)" d="M130.88,52.28c0.71-1.22,1.43-2.44,2.14-3.66c-0.71-1.25-1.42-2.5-2.13-3.75 + c-1.43-0.03-2.85-0.06-4.28-0.09c-0.71,1.22-1.43,2.43-2.14,3.64c0.71,1.25,1.42,2.5,2.13,3.75 + C128.03,52.21,129.45,52.24,130.88,52.28z"/> + + <linearGradient id="SVGID_375_" gradientUnits="userSpaceOnUse" x1="134.8335" y1="-302.5942" x2="139.0767" y2="-295.2449" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_375_)" d="M130.9,41.33c0.71-1.22,1.43-2.44,2.14-3.67c-0.71-1.25-1.42-2.49-2.13-3.74 + c-1.43-0.02-2.85-0.04-4.28-0.07c-0.72,1.22-1.43,2.44-2.15,3.66c0.71,1.24,1.42,2.49,2.13,3.74 + C128.05,41.27,129.47,41.3,130.9,41.33z"/> + + <linearGradient id="SVGID_376_" gradientUnits="userSpaceOnUse" x1="134.8101" y1="-313.5381" x2="139.062" y2="-306.1735" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_376_)" d="M130.92,30.38c0.71-1.22,1.43-2.45,2.14-3.68c-0.71-1.24-1.42-2.49-2.13-3.73 + c-1.42-0.01-2.85-0.03-4.28-0.05c-0.71,1.22-1.43,2.44-2.14,3.67c0.71,1.24,1.42,2.48,2.13,3.72 + C128.07,30.34,129.49,30.36,130.92,30.38z"/> + + <linearGradient id="SVGID_377_" gradientUnits="userSpaceOnUse" x1="134.7881" y1="-324.4824" x2="139.0493" y2="-317.1017" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_377_)" d="M130.94,19.44c0.71-1.23,1.43-2.46,2.14-3.69c-0.71-1.24-1.42-2.48-2.13-3.72 + c-1.43-0.01-2.85-0.02-4.28-0.03c-0.71,1.23-1.43,2.45-2.14,3.68c0.71,1.24,1.42,2.47,2.13,3.71 + C128.09,19.41,129.51,19.42,130.94,19.44z"/> + + <linearGradient id="SVGID_378_" gradientUnits="userSpaceOnUse" x1="134.7637" y1="-335.4282" x2="139.0337" y2="-328.0323" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_378_)" d="M130.95,8.48c0.71-1.23,1.43-2.46,2.14-3.7c-0.71-1.24-1.42-2.47-2.13-3.71c-1.42,0-2.85,0-4.27,0 + c-0.71,1.23-1.43,2.46-2.14,3.69c0.71,1.23,1.42,2.46,2.13,3.7C128.1,8.47,129.53,8.48,130.95,8.48z"/> + + <linearGradient id="SVGID_379_" gradientUnits="userSpaceOnUse" x1="146.1016" y1="-264.2944" x2="150.2773" y2="-257.0618" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_379_)" d="M119.67,79.61c0.72-1.2,1.43-2.39,2.14-3.59c-0.71-1.26-1.42-2.52-2.13-3.77 + c-1.43-0.06-2.85-0.12-4.28-0.18c-0.72,1.19-1.43,2.39-2.15,3.58c0.71,1.26,1.42,2.51,2.13,3.77 + C116.81,79.48,118.24,79.54,119.67,79.61z"/> + + <linearGradient id="SVGID_380_" gradientUnits="userSpaceOnUse" x1="146.0728" y1="-275.1763" x2="150.2603" y2="-267.9233" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_380_)" d="M119.69,68.72c0.72-1.2,1.43-2.4,2.15-3.6c-0.71-1.25-1.42-2.51-2.13-3.76 + c-1.43-0.05-2.85-0.1-4.28-0.15c-0.71,1.2-1.43,2.39-2.15,3.59c0.71,1.25,1.42,2.5,2.13,3.76 + C116.84,68.61,118.26,68.67,119.69,68.72z"/> + + <linearGradient id="SVGID_381_" gradientUnits="userSpaceOnUse" x1="146.0444" y1="-286.0601" x2="150.2437" y2="-278.7868" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_381_)" d="M119.71,57.84c0.72-1.2,1.43-2.41,2.15-3.62c-0.71-1.25-1.42-2.5-2.13-3.75 + c-1.43-0.04-2.85-0.08-4.28-0.13c-0.71,1.2-1.43,2.4-2.14,3.6c0.71,1.25,1.42,2.49,2.13,3.74 + C116.86,57.74,118.28,57.79,119.71,57.84z"/> + + <linearGradient id="SVGID_382_" gradientUnits="userSpaceOnUse" x1="146.0161" y1="-296.9409" x2="150.2271" y2="-289.6474" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_382_)" d="M119.73,46.95c0.72-1.21,1.43-2.42,2.14-3.63c-0.71-1.25-1.42-2.49-2.13-3.73 + c-1.43-0.03-2.85-0.07-4.28-0.1c-0.71,1.21-1.43,2.41-2.14,3.62c0.71,1.24,1.42,2.49,2.13,3.73 + C116.88,46.87,118.3,46.91,119.73,46.95z"/> + + <linearGradient id="SVGID_383_" gradientUnits="userSpaceOnUse" x1="145.9873" y1="-307.8242" x2="150.21" y2="-300.5104" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_383_)" d="M119.75,36.06c0.71-1.21,1.43-2.43,2.14-3.64c-0.71-1.24-1.42-2.48-2.13-3.72 + c-1.42-0.02-2.85-0.05-4.28-0.07c-0.71,1.21-1.43,2.42-2.14,3.63c0.71,1.24,1.42,2.47,2.13,3.71 + C116.9,36,118.33,36.04,119.75,36.06z"/> + + <linearGradient id="SVGID_384_" gradientUnits="userSpaceOnUse" x1="145.9595" y1="-318.7065" x2="150.1938" y2="-311.3724" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_384_)" d="M119.77,25.18c0.71-1.22,1.43-2.44,2.14-3.66c-0.71-1.24-1.42-2.47-2.13-3.71 + c-1.42-0.01-2.85-0.03-4.28-0.04c-0.71,1.22-1.43,2.43-2.14,3.64c0.71,1.23,1.42,2.47,2.13,3.7 + C116.92,25.14,118.35,25.16,119.77,25.18z"/> + + <linearGradient id="SVGID_385_" gradientUnits="userSpaceOnUse" x1="145.9312" y1="-329.5879" x2="150.1763" y2="-322.2351" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_385_)" d="M119.79,14.29c0.71-1.22,1.43-2.45,2.14-3.67c-0.71-1.23-1.42-2.47-2.13-3.69 + c-1.43,0-2.85-0.01-4.28-0.02c-0.71,1.22-1.43,2.44-2.14,3.66c0.71,1.23,1.42,2.46,2.13,3.69 + C116.95,14.27,118.37,14.28,119.79,14.29z"/> + + <linearGradient id="SVGID_386_" gradientUnits="userSpaceOnUse" x1="146.9658" y1="-338.6309" x2="150.1602" y2="-333.0981" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_386_)" d="M113.42-0.28c0.71,1.22,1.42,2.45,2.13,3.67c1.42,0,2.85,0,4.27,0.01 + c0.71-1.23,1.43-2.45,2.14-3.68C119.11-0.28,116.27-0.28,113.42-0.28z"/> + + <linearGradient id="SVGID_387_" gradientUnits="userSpaceOnUse" x1="156.9312" y1="-259.7856" x2="159.9639" y2="-254.5328" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_387_)" d="M111,80.54c-0.71-1.26-1.42-2.52-2.13-3.77c-1.43-0.08-2.85-0.15-4.28-0.23 + c-0.71,1.18-1.43,2.35-2.14,3.52C105.3,80.23,108.15,80.39,111,80.54z"/> + + <linearGradient id="SVGID_388_" gradientUnits="userSpaceOnUse" x1="156.9004" y1="-270.5967" x2="161.0474" y2="-263.4139" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_388_)" d="M108.88,73.27c0.71-1.19,1.43-2.37,2.15-3.56c-0.71-1.25-1.42-2.5-2.13-3.75 + c-1.43-0.06-2.85-0.13-4.28-0.2c-0.72,1.18-1.43,2.36-2.15,3.54c0.71,1.25,1.42,2.5,2.13,3.75 + C106.03,73.12,107.45,73.2,108.88,73.27z"/> + + <linearGradient id="SVGID_389_" gradientUnits="userSpaceOnUse" x1="156.8677" y1="-281.4067" x2="161.0288" y2="-274.1994" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_389_)" d="M108.9,62.45c0.71-1.19,1.43-2.38,2.14-3.57c-0.71-1.25-1.42-2.5-2.13-3.74 + c-1.42-0.05-2.85-0.11-4.28-0.16c-0.71,1.18-1.43,2.37-2.14,3.55c0.71,1.25,1.42,2.49,2.13,3.74 + C106.05,62.33,107.48,62.39,108.9,62.45z"/> + + <linearGradient id="SVGID_390_" gradientUnits="userSpaceOnUse" x1="156.8359" y1="-292.2158" x2="161.0098" y2="-284.9865" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_390_)" d="M108.93,51.64c0.72-1.2,1.43-2.39,2.15-3.59c-0.71-1.24-1.42-2.49-2.13-3.73 + c-1.42-0.04-2.85-0.09-4.27-0.13c-0.71,1.19-1.43,2.38-2.14,3.57c0.71,1.24,1.42,2.48,2.13,3.72 + C106.08,51.54,107.5,51.59,108.93,51.64z"/> + + <linearGradient id="SVGID_391_" gradientUnits="userSpaceOnUse" x1="156.8042" y1="-303.0273" x2="160.9932" y2="-295.7719" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_391_)" d="M108.95,40.82c0.72-1.2,1.43-2.4,2.15-3.61c-0.71-1.24-1.42-2.48-2.13-3.71 + c-1.42-0.03-2.85-0.06-4.27-0.1c-0.71,1.2-1.43,2.4-2.15,3.59c0.71,1.23,1.42,2.47,2.13,3.71 + C106.1,40.74,107.53,40.78,108.95,40.82z"/> + + <linearGradient id="SVGID_392_" gradientUnits="userSpaceOnUse" x1="156.7739" y1="-313.8354" x2="160.9746" y2="-306.5597" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_392_)" d="M108.97,30.01c0.71-1.2,1.43-2.41,2.15-3.62c-0.71-1.23-1.42-2.46-2.13-3.69 + c-1.42-0.02-2.85-0.05-4.27-0.07c-0.71,1.2-1.43,2.41-2.15,3.61c0.71,1.23,1.42,2.46,2.13,3.69 + C106.12,29.95,107.55,29.98,108.97,30.01z"/> + + <linearGradient id="SVGID_393_" gradientUnits="userSpaceOnUse" x1="156.7407" y1="-324.646" x2="160.9561" y2="-317.3448" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_393_)" d="M109,19.19c0.71-1.21,1.43-2.42,2.14-3.63c-0.71-1.23-1.42-2.46-2.13-3.68 + c-1.42-0.01-2.85-0.02-4.27-0.04c-0.71,1.21-1.43,2.42-2.14,3.62c0.71,1.22,1.42,2.45,2.13,3.67 + C106.15,19.16,107.57,19.17,109,19.19z"/> + + <linearGradient id="SVGID_394_" gradientUnits="userSpaceOnUse" x1="156.708" y1="-335.4565" x2="160.936" y2="-328.1334" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_394_)" d="M109.02,8.38c0.71-1.21,1.43-2.43,2.14-3.65c-0.71-1.22-1.42-2.44-2.13-3.67 + c-1.42,0-2.85,0-4.27,0c-0.71,1.21-1.43,2.43-2.14,3.64c0.71,1.21,1.42,2.43,2.13,3.65C106.18,8.36,107.6,8.37,109.02,8.38z"/> + + <linearGradient id="SVGID_395_" gradientUnits="userSpaceOnUse" x1="168.0923" y1="-265.375" x2="172.1914" y2="-258.2751" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_395_)" d="M97.71,78.44c0.71-1.17,1.43-2.33,2.14-3.5c-0.71-1.25-1.42-2.5-2.13-3.75 + c-1.43-0.08-2.85-0.16-4.28-0.25c-0.71,1.16-1.43,2.33-2.14,3.48c0.71,1.25,1.42,2.5,2.12,3.75 + C94.86,78.26,96.28,78.35,97.71,78.44z"/> + + <linearGradient id="SVGID_396_" gradientUnits="userSpaceOnUse" x1="168.0586" y1="-276.0962" x2="172.1719" y2="-268.9718" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_396_)" d="M97.73,67.71c0.71-1.17,1.43-2.34,2.15-3.52c-0.71-1.25-1.42-2.49-2.13-3.73 + c-1.42-0.07-2.85-0.14-4.27-0.21c-0.72,1.17-1.43,2.34-2.15,3.5c0.71,1.24,1.42,2.49,2.13,3.73 + C94.88,67.56,96.31,67.64,97.73,67.71z"/> + + <linearGradient id="SVGID_397_" gradientUnits="userSpaceOnUse" x1="168.0234" y1="-286.8203" x2="172.1543" y2="-279.6655" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_397_)" d="M97.76,56.99c0.72-1.18,1.43-2.36,2.15-3.54c-0.71-1.24-1.42-2.48-2.13-3.72 + c-1.43-0.06-2.85-0.12-4.28-0.17c-0.72,1.18-1.43,2.35-2.14,3.52c0.71,1.23,1.42,2.47,2.13,3.71 + C94.91,56.86,96.34,56.92,97.76,56.99z"/> + + <linearGradient id="SVGID_398_" gradientUnits="userSpaceOnUse" x1="167.9888" y1="-297.542" x2="172.1348" y2="-290.3609" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_398_)" d="M97.79,46.26c0.71-1.18,1.43-2.37,2.14-3.56c-0.71-1.23-1.42-2.47-2.13-3.7 + c-1.42-0.04-2.85-0.09-4.27-0.13c-0.72,1.18-1.43,2.36-2.15,3.54c0.71,1.23,1.42,2.46,2.13,3.69 + C94.94,46.15,96.36,46.21,97.79,46.26z"/> + + <linearGradient id="SVGID_399_" gradientUnits="userSpaceOnUse" x1="167.9531" y1="-308.2676" x2="172.1167" y2="-301.0561" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_399_)" d="M97.81,35.53c0.72-1.19,1.43-2.38,2.14-3.57c-0.71-1.23-1.42-2.46-2.12-3.69 + c-1.43-0.03-2.85-0.06-4.28-0.1c-0.71,1.19-1.43,2.37-2.14,3.56c0.71,1.22,1.42,2.45,2.12,3.67 + C94.96,35.45,96.39,35.49,97.81,35.53z"/> + + <linearGradient id="SVGID_400_" gradientUnits="userSpaceOnUse" x1="167.9194" y1="-318.9868" x2="172.0981" y2="-311.7491" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_400_)" d="M97.84,24.81c0.71-1.2,1.43-2.39,2.14-3.59c-0.71-1.22-1.42-2.44-2.13-3.66 + c-1.42-0.02-2.85-0.04-4.27-0.06c-0.72,1.19-1.43,2.39-2.14,3.58c0.71,1.22,1.42,2.43,2.12,3.66 + C94.99,24.75,96.42,24.78,97.84,24.81z"/> + + <linearGradient id="SVGID_401_" gradientUnits="userSpaceOnUse" x1="167.8838" y1="-329.7104" x2="172.0776" y2="-322.4465" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_401_)" d="M97.87,14.08c0.71-1.2,1.43-2.4,2.14-3.61c-0.71-1.22-1.42-2.43-2.13-3.65 + c-1.42-0.01-2.85-0.01-4.27-0.02c-0.72,1.2-1.43,2.4-2.14,3.6c0.71,1.21,1.42,2.42,2.13,3.63C95.02,14.05,96.44,14.06,97.87,14.08z + "/> + + <linearGradient id="SVGID_402_" gradientUnits="userSpaceOnUse" x1="168.8901" y1="-338.6313" x2="172.0601" y2="-333.1409" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_402_)" d="M91.49-0.28c0.71,1.2,1.42,2.41,2.13,3.62c1.42,0,2.85,0.01,4.27,0.01 + c0.71-1.21,1.43-2.42,2.14-3.63C97.19-0.28,94.34-0.28,91.49-0.28z"/> + + <linearGradient id="SVGID_403_" gradientUnits="userSpaceOnUse" x1="178.9194" y1="-261.1211" x2="181.877" y2="-255.9985" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_403_)" d="M89.05,79.2c-0.71-1.25-1.42-2.5-2.13-3.75c-1.42-0.1-2.85-0.19-4.27-0.3 + c-0.71,1.14-1.43,2.29-2.14,3.42C83.35,78.79,86.2,79,89.05,79.2z"/> + + <linearGradient id="SVGID_404_" gradientUnits="userSpaceOnUse" x1="178.8828" y1="-271.7446" x2="182.9463" y2="-264.7065" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_404_)" d="M86.93,72.01c0.71-1.15,1.43-2.31,2.15-3.46c-0.71-1.24-1.42-2.48-2.13-3.73 + c-1.42-0.08-2.85-0.17-4.27-0.25c-0.71,1.15-1.43,2.3-2.14,3.44c0.71,1.24,1.42,2.48,2.12,3.72 + C84.08,71.83,85.51,71.92,86.93,72.01z"/> + + <linearGradient id="SVGID_405_" gradientUnits="userSpaceOnUse" x1="178.8457" y1="-282.3716" x2="182.9292" y2="-275.2988" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_405_)" d="M86.96,61.38c0.71-1.16,1.43-2.32,2.15-3.48c-0.71-1.24-1.42-2.47-2.13-3.71 + c-1.43-0.07-2.85-0.14-4.28-0.21c-0.71,1.16-1.43,2.31-2.14,3.46c0.71,1.23,1.42,2.46,2.12,3.7 + C84.11,61.23,85.54,61.31,86.96,61.38z"/> + + <linearGradient id="SVGID_406_" gradientUnits="userSpaceOnUse" x1="178.8086" y1="-292.9961" x2="182.9087" y2="-285.8945" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_406_)" d="M86.99,50.75c0.71-1.17,1.43-2.33,2.15-3.51c-0.71-1.23-1.42-2.46-2.13-3.68 + c-1.43-0.06-2.85-0.12-4.28-0.17c-0.71,1.17-1.43,2.33-2.14,3.49c0.71,1.22,1.42,2.45,2.13,3.68 + C84.14,50.62,85.56,50.69,86.99,50.75z"/> + + <linearGradient id="SVGID_407_" gradientUnits="userSpaceOnUse" x1="178.7725" y1="-303.6211" x2="182.8911" y2="-296.4874" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_407_)" d="M87.01,40.12c0.72-1.17,1.43-2.35,2.15-3.53c-0.71-1.22-1.42-2.45-2.13-3.67 + c-1.42-0.04-2.85-0.09-4.27-0.13c-0.72,1.17-1.43,2.34-2.14,3.51c0.71,1.22,1.42,2.44,2.12,3.66 + C84.17,40.02,85.59,40.07,87.01,40.12z"/> + + <linearGradient id="SVGID_408_" gradientUnits="userSpaceOnUse" x1="178.7358" y1="-314.2451" x2="182.8716" y2="-307.0818" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_408_)" d="M87.04,29.49c0.72-1.18,1.43-2.36,2.15-3.54c-0.71-1.22-1.42-2.43-2.13-3.64 + c-1.42-0.03-2.85-0.06-4.27-0.09c-0.71,1.18-1.43,2.36-2.14,3.53c0.71,1.21,1.42,2.42,2.13,3.64 + C84.19,29.41,85.62,29.45,87.04,29.49z"/> + + <linearGradient id="SVGID_409_" gradientUnits="userSpaceOnUse" x1="178.6992" y1="-324.8711" x2="182.853" y2="-317.6765" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_409_)" d="M87.07,18.86c0.71-1.19,1.43-2.38,2.14-3.57c-0.71-1.21-1.42-2.42-2.12-3.62 + c-1.42-0.02-2.85-0.03-4.27-0.05c-0.71,1.19-1.43,2.37-2.14,3.55c0.71,1.2,1.42,2.41,2.12,3.61 + C84.22,18.81,85.65,18.84,87.07,18.86z"/> + + <linearGradient id="SVGID_410_" gradientUnits="userSpaceOnUse" x1="178.6616" y1="-335.4951" x2="182.8325" y2="-328.2709" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_410_)" d="M87.1,8.23c0.71-1.19,1.43-2.39,2.14-3.58c-0.71-1.21-1.42-2.41-2.13-3.61c-1.42,0-2.85,0-4.27,0 + c-0.71,1.19-1.43,2.38-2.14,3.57C81.41,5.8,82.12,7,82.83,8.2C84.25,8.21,85.67,8.22,87.1,8.23z"/> + + <linearGradient id="SVGID_411_" gradientUnits="userSpaceOnUse" x1="190.0698" y1="-266.7964" x2="194.0757" y2="-259.858" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_411_)" d="M75.77,76.91c0.71-1.13,1.43-2.26,2.14-3.4c-0.71-1.24-1.42-2.48-2.12-3.72 + c-1.42-0.1-2.85-0.21-4.27-0.31c-0.71,1.13-1.43,2.25-2.14,3.38c0.71,1.23,1.42,2.47,2.12,3.71 + C72.93,76.68,74.35,76.79,75.77,76.91z"/> + + <linearGradient id="SVGID_412_" gradientUnits="userSpaceOnUse" x1="190.0327" y1="-277.3081" x2="194.0586" y2="-270.3351" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_412_)" d="M75.8,66.39c0.71-1.14,1.43-2.28,2.14-3.42c-0.71-1.23-1.42-2.46-2.12-3.69 + c-1.42-0.09-2.85-0.17-4.27-0.26c-0.71,1.14-1.43,2.27-2.14,3.4c0.71,1.23,1.42,2.45,2.12,3.69C72.95,66.19,74.38,66.29,75.8,66.39 + z"/> + + <linearGradient id="SVGID_413_" gradientUnits="userSpaceOnUse" x1="189.9941" y1="-287.8203" x2="194.04" y2="-280.8126" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_413_)" d="M75.83,55.87c0.71-1.15,1.43-2.29,2.14-3.44c-0.71-1.23-1.42-2.45-2.13-3.67 + c-1.42-0.07-2.85-0.15-4.27-0.22c-0.71,1.14-1.43,2.28-2.14,3.42c0.71,1.22,1.42,2.44,2.12,3.66 + C72.98,55.71,74.4,55.79,75.83,55.87z"/> + + <linearGradient id="SVGID_414_" gradientUnits="userSpaceOnUse" x1="189.957" y1="-298.3311" x2="194.0229" y2="-291.2887" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_414_)" d="M75.86,45.35c0.71-1.15,1.43-2.31,2.14-3.47c-0.71-1.22-1.42-2.43-2.13-3.65 + c-1.42-0.06-2.85-0.11-4.27-0.17c-0.71,1.15-1.43,2.3-2.14,3.44c0.71,1.21,1.42,2.42,2.12,3.64 + C73.01,45.22,74.43,45.29,75.86,45.35z"/> + + <linearGradient id="SVGID_415_" gradientUnits="userSpaceOnUse" x1="189.918" y1="-308.8442" x2="194.0044" y2="-301.7663" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_415_)" d="M75.88,34.84c0.71-1.16,1.43-2.33,2.14-3.49c-0.71-1.21-1.42-2.42-2.12-3.63 + c-1.43-0.04-2.85-0.08-4.27-0.12c-0.71,1.16-1.43,2.32-2.14,3.47c0.71,1.2,1.42,2.41,2.13,3.61 + C73.04,34.73,74.46,34.78,75.88,34.84z"/> + + <linearGradient id="SVGID_416_" gradientUnits="userSpaceOnUse" x1="189.8809" y1="-319.356" x2="193.9873" y2="-312.2434" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_416_)" d="M75.91,24.32c0.71-1.17,1.43-2.34,2.14-3.51c-0.71-1.2-1.42-2.4-2.12-3.6 + c-1.43-0.02-2.85-0.05-4.28-0.08c-0.71,1.16-1.43,2.33-2.14,3.49c0.71,1.2,1.42,2.39,2.13,3.59 + C73.06,24.24,74.49,24.28,75.91,24.32z"/> + + <linearGradient id="SVGID_417_" gradientUnits="userSpaceOnUse" x1="189.8408" y1="-329.8691" x2="193.9688" y2="-322.7194" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_417_)" d="M75.94,13.8c0.71-1.18,1.43-2.35,2.15-3.54c-0.71-1.2-1.42-2.39-2.12-3.58 + c-1.43-0.01-2.85-0.02-4.28-0.03c-0.71,1.17-1.43,2.35-2.14,3.52c0.71,1.19,1.42,2.37,2.13,3.57 + C73.09,13.76,74.52,13.78,75.94,13.8z"/> + + <linearGradient id="SVGID_418_" gradientUnits="userSpaceOnUse" x1="190.8145" y1="-338.6304" x2="193.9517" y2="-333.1966" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_418_)" d="M69.57-0.28c0.71,1.18,1.42,2.36,2.13,3.54c1.42,0.01,2.85,0.01,4.27,0.02 + c0.71-1.18,1.43-2.37,2.14-3.56C75.26-0.28,72.42-0.28,69.57-0.28z"/> + + <linearGradient id="SVGID_419_" gradientUnits="userSpaceOnUse" x1="200.8877" y1="-262.8164" x2="203.7612" y2="-257.8393" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_419_)" d="M67.13,77.49c-0.71-1.24-1.42-2.47-2.12-3.7c-1.42-0.12-2.85-0.24-4.27-0.37 + c-0.71,1.1-1.43,2.2-2.14,3.3C61.44,76.99,64.28,77.24,67.13,77.49z"/> + + <linearGradient id="SVGID_420_" gradientUnits="userSpaceOnUse" x1="200.8506" y1="-273.207" x2="204.8164" y2="-266.338" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_420_)" d="M65.01,70.42c0.71-1.12,1.43-2.23,2.14-3.36c-0.71-1.23-1.42-2.45-2.12-3.68 + c-1.43-0.1-2.85-0.21-4.27-0.32c-0.71,1.11-1.43,2.22-2.14,3.33c0.71,1.22,1.42,2.44,2.12,3.67 + C62.17,70.19,63.59,70.31,65.01,70.42z"/> + + <linearGradient id="SVGID_421_" gradientUnits="userSpaceOnUse" x1="200.8115" y1="-283.5967" x2="204.8003" y2="-276.6879" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_421_)" d="M65.04,60.03c0.71-1.12,1.43-2.25,2.14-3.38c-0.71-1.22-1.42-2.44-2.12-3.65 + c-1.43-0.09-2.85-0.17-4.27-0.26c-0.71,1.12-1.43,2.24-2.14,3.35c0.71,1.21,1.41,2.42,2.12,3.64 + C62.19,59.83,63.62,59.93,65.04,60.03z"/> + + <linearGradient id="SVGID_422_" gradientUnits="userSpaceOnUse" x1="200.7739" y1="-293.9863" x2="204.7837" y2="-287.0412" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_422_)" d="M65.07,49.63c0.71-1.13,1.43-2.27,2.14-3.4c-0.71-1.21-1.42-2.42-2.12-3.63 + c-1.43-0.07-2.85-0.14-4.27-0.21c-0.71,1.13-1.43,2.26-2.14,3.38c0.71,1.2,1.42,2.41,2.12,3.62 + C62.22,49.47,63.64,49.55,65.07,49.63z"/> + + <linearGradient id="SVGID_423_" gradientUnits="userSpaceOnUse" x1="200.7354" y1="-304.377" x2="204.7686" y2="-297.3912" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_423_)" d="M65.09,39.23c0.71-1.14,1.43-2.28,2.14-3.43c-0.71-1.2-1.42-2.4-2.12-3.6 + c-1.42-0.05-2.85-0.11-4.27-0.16c-0.71,1.14-1.43,2.27-2.14,3.41c0.71,1.19,1.42,2.39,2.12,3.59 + C62.25,39.1,63.67,39.17,65.09,39.23z"/> + + <linearGradient id="SVGID_424_" gradientUnits="userSpaceOnUse" x1="200.6973" y1="-314.7651" x2="204.751" y2="-307.7439" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_424_)" d="M65.12,28.84c0.71-1.15,1.43-2.3,2.14-3.45c-0.71-1.19-1.42-2.39-2.13-3.58 + c-1.42-0.04-2.85-0.07-4.27-0.11c-0.71,1.15-1.43,2.29-2.14,3.43c0.71,1.19,1.42,2.37,2.13,3.56 + C62.27,28.74,63.7,28.79,65.12,28.84z"/> + + <linearGradient id="SVGID_425_" gradientUnits="userSpaceOnUse" x1="200.6582" y1="-325.1562" x2="204.7363" y2="-318.0927" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_425_)" d="M65.15,18.44c0.72-1.16,1.43-2.32,2.15-3.48c-0.71-1.19-1.42-2.37-2.13-3.55 + c-1.42-0.02-2.85-0.04-4.27-0.06c-0.71,1.16-1.43,2.31-2.14,3.46c0.71,1.18,1.42,2.36,2.13,3.54 + C62.3,18.38,63.72,18.41,65.15,18.44z"/> + + <linearGradient id="SVGID_426_" gradientUnits="userSpaceOnUse" x1="200.6187" y1="-335.5449" x2="204.7178" y2="-328.445" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_426_)" d="M65.17,8.04c0.71-1.17,1.43-2.33,2.15-3.5c-0.71-1.18-1.42-2.36-2.13-3.53c-1.42,0-2.85,0-4.27,0 + c-0.72,1.17-1.43,2.33-2.14,3.49C59.49,5.66,60.19,6.83,60.9,8C62.33,8.02,63.75,8.03,65.17,8.04z"/> + + <linearGradient id="SVGID_427_" gradientUnits="userSpaceOnUse" x1="212.0288" y1="-268.5566" x2="215.9248" y2="-261.8086" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_427_)" d="M53.87,75c0.71-1.09,1.43-2.18,2.14-3.28c-0.71-1.22-1.42-2.44-2.12-3.66 + c-1.42-0.12-2.85-0.25-4.27-0.38c-0.71,1.09-1.42,2.17-2.14,3.25c0.71,1.21,1.42,2.43,2.12,3.65C51.02,74.72,52.45,74.86,53.87,75z + "/> + + <linearGradient id="SVGID_428_" gradientUnits="userSpaceOnUse" x1="211.9917" y1="-278.8057" x2="215.9116" y2="-272.0162" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_428_)" d="M53.89,64.74c0.71-1.1,1.43-2.2,2.14-3.3c-0.71-1.22-1.42-2.43-2.12-3.63 + c-1.42-0.1-2.84-0.21-4.27-0.32c-0.71,1.1-1.43,2.19-2.14,3.28c0.71,1.21,1.42,2.41,2.12,3.62C51.05,64.5,52.47,64.62,53.89,64.74z + "/> + + <linearGradient id="SVGID_429_" gradientUnits="userSpaceOnUse" x1="211.9541" y1="-289.0591" x2="215.8999" y2="-282.2248" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_429_)" d="M53.92,54.48c0.71-1.11,1.43-2.22,2.14-3.33c-0.71-1.2-1.41-2.41-2.12-3.61 + c-1.42-0.09-2.85-0.17-4.27-0.26c-0.71,1.1-1.43,2.21-2.14,3.3c0.71,1.2,1.42,2.39,2.12,3.6C51.07,54.28,52.5,54.38,53.92,54.48z" + /> + + <linearGradient id="SVGID_430_" gradientUnits="userSpaceOnUse" x1="211.9165" y1="-299.3091" x2="215.8857" y2="-292.4342" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_430_)" d="M53.94,44.22c0.72-1.12,1.43-2.24,2.14-3.36c-0.71-1.2-1.42-2.39-2.12-3.58 + c-1.42-0.07-2.85-0.14-4.27-0.21c-0.72,1.12-1.43,2.23-2.14,3.33c0.71,1.19,1.42,2.37,2.12,3.57 + C51.1,44.06,52.52,44.14,53.94,44.22z"/> + + <linearGradient id="SVGID_431_" gradientUnits="userSpaceOnUse" x1="211.8784" y1="-309.5605" x2="215.873" y2="-302.6416" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_431_)" d="M53.97,33.97c0.71-1.13,1.43-2.25,2.14-3.39c-0.71-1.18-1.42-2.37-2.12-3.55 + c-1.42-0.05-2.85-0.1-4.27-0.15C49,28,48.29,29.12,47.57,30.24c0.71,1.18,1.42,2.36,2.13,3.54C51.12,33.84,52.54,33.91,53.97,33.97 + z"/> + + <linearGradient id="SVGID_432_" gradientUnits="userSpaceOnUse" x1="211.8413" y1="-319.811" x2="215.8604" y2="-312.8499" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_432_)" d="M53.99,23.71c0.71-1.13,1.43-2.27,2.14-3.42c-0.71-1.18-1.42-2.35-2.12-3.52 + c-1.42-0.03-2.85-0.06-4.27-0.09c-0.71,1.13-1.43,2.26-2.14,3.39c0.71,1.17,1.42,2.34,2.13,3.51 + C51.15,23.62,52.57,23.67,53.99,23.71z"/> + + <linearGradient id="SVGID_433_" gradientUnits="userSpaceOnUse" x1="211.8042" y1="-330.0625" x2="215.8481" y2="-323.0582" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_433_)" d="M54.02,13.45c0.71-1.14,1.43-2.29,2.14-3.44c-0.71-1.17-1.42-2.33-2.12-3.5 + c-1.42-0.01-2.85-0.02-4.27-0.04c-0.71,1.14-1.43,2.28-2.14,3.42c0.71,1.16,1.42,2.32,2.13,3.48C51.17,13.4,52.6,13.43,54.02,13.45 + z"/> + + <linearGradient id="SVGID_434_" gradientUnits="userSpaceOnUse" x1="212.7363" y1="-338.6313" x2="215.8345" y2="-333.2652" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_434_)" d="M47.65-0.28c0.71,1.15,1.42,2.3,2.13,3.45c1.42,0,2.85,0.01,4.27,0.02 + c0.71-1.15,1.43-2.31,2.14-3.47C53.34-0.28,50.49-0.28,47.65-0.28z"/> + + <linearGradient id="SVGID_435_" gradientUnits="userSpaceOnUse" x1="222.8325" y1="-264.8745" x2="225.6128" y2="-260.0589" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_435_)" d="M45.24,75.4c-0.71-1.22-1.41-2.43-2.12-3.64c-1.42-0.15-2.84-0.29-4.26-0.44 + c-0.71,1.06-1.42,2.12-2.14,3.17C39.55,74.8,42.39,75.11,45.24,75.4z"/> + + <linearGradient id="SVGID_436_" gradientUnits="userSpaceOnUse" x1="222.7974" y1="-274.979" x2="226.6479" y2="-268.3096" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_436_)" d="M43.12,68.49c0.71-1.07,1.43-2.15,2.14-3.23c-0.71-1.21-1.41-2.41-2.12-3.61 + c-1.42-0.12-2.84-0.25-4.26-0.38c-0.71,1.07-1.42,2.14-2.13,3.2c0.71,1.2,1.41,2.4,2.12,3.6C40.28,68.21,41.7,68.35,43.12,68.49z" + /> + + <linearGradient id="SVGID_437_" gradientUnits="userSpaceOnUse" x1="222.7627" y1="-285.083" x2="226.6396" y2="-278.3679" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_437_)" d="M43.14,58.37c0.71-1.08,1.43-2.17,2.14-3.26c-0.71-1.2-1.42-2.39-2.12-3.58 + c-1.42-0.1-2.84-0.21-4.26-0.32c-0.71,1.08-1.42,2.16-2.14,3.23c0.71,1.19,1.42,2.38,2.12,3.57C40.3,58.14,41.72,58.26,43.14,58.37 + z"/> + + <linearGradient id="SVGID_438_" gradientUnits="userSpaceOnUse" x1="222.7266" y1="-295.188" x2="226.6313" y2="-288.4247" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_438_)" d="M43.16,48.26c0.71-1.09,1.43-2.19,2.14-3.29c-0.71-1.19-1.42-2.37-2.12-3.55 + c-1.42-0.08-2.84-0.17-4.27-0.25c-0.71,1.09-1.43,2.18-2.14,3.26c0.71,1.18,1.42,2.35,2.12,3.54 + C40.32,48.07,41.74,48.17,43.16,48.26z"/> + + <linearGradient id="SVGID_439_" gradientUnits="userSpaceOnUse" x1="222.6895" y1="-305.293" x2="226.6216" y2="-298.4823" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_439_)" d="M43.19,38.15c0.71-1.1,1.43-2.21,2.14-3.32c-0.71-1.18-1.42-2.35-2.12-3.53 + c-1.42-0.06-2.85-0.13-4.27-0.19c-0.71,1.1-1.43,2.2-2.14,3.29c0.71,1.17,1.42,2.33,2.12,3.51C40.34,38,41.77,38.07,43.19,38.15z" + /> + + <linearGradient id="SVGID_440_" gradientUnits="userSpaceOnUse" x1="222.6543" y1="-315.397" x2="226.6138" y2="-308.539" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_440_)" d="M43.21,28.04c0.71-1.11,1.43-2.23,2.14-3.35c-0.71-1.17-1.42-2.33-2.12-3.49 + c-1.42-0.04-2.85-0.09-4.27-0.13c-0.71,1.11-1.43,2.22-2.14,3.32c0.71,1.16,1.42,2.31,2.12,3.48 + C40.36,27.93,41.79,27.98,43.21,28.04z"/> + + <linearGradient id="SVGID_441_" gradientUnits="userSpaceOnUse" x1="222.6196" y1="-325.5005" x2="226.6055" y2="-318.5968" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_441_)" d="M43.23,17.93c0.71-1.12,1.43-2.25,2.14-3.38c-0.71-1.16-1.42-2.31-2.13-3.46 + c-1.42-0.02-2.85-0.05-4.27-0.07c-0.71,1.12-1.43,2.24-2.14,3.36c0.71,1.15,1.42,2.29,2.13,3.45 + C40.38,17.86,41.81,17.89,43.23,17.93z"/> + + <linearGradient id="SVGID_442_" gradientUnits="userSpaceOnUse" x1="222.5825" y1="-335.6055" x2="226.5947" y2="-328.6561" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_442_)" d="M43.25,7.82c0.72-1.13,1.43-2.27,2.14-3.41c-0.71-1.15-1.42-2.29-2.13-3.44 + c-1.42,0-2.85,0-4.27-0.01c-0.71,1.13-1.43,2.26-2.14,3.39c0.71,1.13,1.42,2.27,2.13,3.41C40.41,7.78,41.83,7.8,43.25,7.82z"/> + + <linearGradient id="SVGID_443_" gradientUnits="userSpaceOnUse" x1="233.9585" y1="-270.6538" x2="237.728" y2="-264.1248" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_443_)" d="M32,72.72c0.71-1.04,1.42-2.09,2.13-3.14c-0.71-1.2-1.42-2.4-2.12-3.59 + c-1.42-0.15-2.84-0.29-4.26-0.44c-0.71,1.04-1.42,2.07-2.13,3.1c0.7,1.19,1.41,2.39,2.12,3.58C29.16,72.4,30.58,72.56,32,72.72z"/> + + <linearGradient id="SVGID_444_" gradientUnits="userSpaceOnUse" x1="233.9268" y1="-280.5952" x2="237.7271" y2="-274.0129" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_444_)" d="M32.02,62.77c0.71-1.05,1.42-2.11,2.13-3.17c-0.71-1.19-1.42-2.38-2.12-3.56 + c-1.42-0.12-2.84-0.25-4.26-0.38c-0.71,1.05-1.42,2.1-2.13,3.14c0.71,1.18,1.41,2.36,2.12,3.55C29.18,62.5,30.6,62.64,32.02,62.77z + "/> + + <linearGradient id="SVGID_445_" gradientUnits="userSpaceOnUse" x1="233.8955" y1="-290.5352" x2="237.7251" y2="-283.9021" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_445_)" d="M32.03,52.83c0.71-1.06,1.42-2.13,2.14-3.2c-0.71-1.18-1.42-2.35-2.12-3.53 + c-1.42-0.1-2.84-0.2-4.26-0.31c-0.71,1.06-1.42,2.12-2.13,3.17c0.71,1.17,1.42,2.34,2.12,3.51C29.19,52.59,30.61,52.71,32.03,52.83 + z"/> + + <linearGradient id="SVGID_446_" gradientUnits="userSpaceOnUse" x1="233.8633" y1="-300.4727" x2="237.7207" y2="-293.7914" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_446_)" d="M32.05,42.88c0.71-1.08,1.42-2.15,2.14-3.24c-0.71-1.17-1.42-2.33-2.13-3.49 + c-1.42-0.08-2.84-0.16-4.26-0.24c-0.71,1.07-1.42,2.14-2.13,3.21c0.71,1.16,1.42,2.32,2.12,3.48 + C29.21,42.69,30.63,42.78,32.05,42.88z"/> + + <linearGradient id="SVGID_447_" gradientUnits="userSpaceOnUse" x1="233.8306" y1="-310.4131" x2="237.7173" y2="-303.6811" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_447_)" d="M32.07,32.93c0.71-1.09,1.43-2.17,2.14-3.27c-0.71-1.16-1.42-2.31-2.13-3.46 + c-1.42-0.06-2.84-0.12-4.27-0.18c-0.71,1.08-1.43,2.16-2.14,3.24c0.71,1.14,1.42,2.29,2.13,3.44 + C29.23,32.78,30.65,32.86,32.07,32.93z"/> + + <linearGradient id="SVGID_448_" gradientUnits="userSpaceOnUse" x1="233.8008" y1="-320.3525" x2="237.7163" y2="-313.5706" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_448_)" d="M32.09,22.98c0.71-1.1,1.43-2.2,2.14-3.3c-0.71-1.15-1.42-2.29-2.13-3.43 + c-1.42-0.04-2.85-0.07-4.27-0.11c-0.71,1.1-1.43,2.19-2.14,3.27c0.71,1.13,1.42,2.27,2.13,3.41 + C29.24,22.88,30.67,22.93,32.09,22.98z"/> + + <linearGradient id="SVGID_449_" gradientUnits="userSpaceOnUse" x1="233.7666" y1="-330.2925" x2="237.7119" y2="-323.459" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_449_)" d="M32.11,13.03c0.71-1.11,1.43-2.22,2.14-3.33c-0.71-1.13-1.42-2.27-2.13-3.4 + c-1.42-0.01-2.85-0.03-4.27-0.04c-0.71,1.11-1.43,2.21-2.14,3.31c0.71,1.12,1.42,2.25,2.13,3.38 + C29.26,12.98,30.68,13.01,32.11,13.03z"/> + + <linearGradient id="SVGID_450_" gradientUnits="userSpaceOnUse" x1="234.6597" y1="-338.6313" x2="237.7095" y2="-333.3489" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_450_)" d="M25.72-0.28c0.71,1.11,1.42,2.22,2.13,3.34c1.42,0.01,2.85,0.02,4.27,0.02 + c0.71-1.12,1.43-2.24,2.14-3.37C31.42-0.28,28.57-0.28,25.72-0.28z"/> + + <linearGradient id="SVGID_451_" gradientUnits="userSpaceOnUse" x1="244.7446" y1="-267.2954" x2="247.4238" y2="-262.6549" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_451_)" d="M23.38,72.94c-0.71-1.19-1.41-2.38-2.12-3.57c-1.41-0.17-2.83-0.34-4.25-0.51 + c-0.71,1.01-1.42,2.01-2.13,3.01C17.71,72.24,20.55,72.59,23.38,72.94z"/> + + <linearGradient id="SVGID_452_" gradientUnits="userSpaceOnUse" x1="244.7158" y1="-277.0654" x2="248.4365" y2="-270.621" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_452_)" d="M21.26,66.21c0.71-1.02,1.42-2.05,2.13-3.08c-0.71-1.18-1.42-2.36-2.12-3.53 + c-1.42-0.14-2.84-0.29-4.26-0.43c-0.71,1.02-1.42,2.04-2.13,3.05c0.71,1.17,1.41,2.34,2.12,3.52 + C18.43,65.89,19.85,66.05,21.26,66.21z"/> + + <linearGradient id="SVGID_453_" gradientUnits="userSpaceOnUse" x1="244.6895" y1="-286.8335" x2="248.4409" y2="-280.3358" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_453_)" d="M21.28,56.43c0.71-1.04,1.42-2.08,2.13-3.12c-0.71-1.17-1.42-2.33-2.12-3.5 + c-1.42-0.12-2.84-0.24-4.26-0.36c-0.71,1.03-1.42,2.06-2.13,3.08c0.71,1.16,1.42,2.32,2.12,3.48 + C18.44,56.16,19.86,56.29,21.28,56.43z"/> + + <linearGradient id="SVGID_454_" gradientUnits="userSpaceOnUse" x1="244.6626" y1="-296.5991" x2="248.4438" y2="-290.0498" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_454_)" d="M21.29,46.65c0.71-1.04,1.42-2.09,2.13-3.15c-0.71-1.16-1.42-2.31-2.13-3.46 + c-1.42-0.1-2.84-0.2-4.26-0.3c-0.71,1.04-1.42,2.09-2.13,3.12c0.71,1.14,1.42,2.29,2.12,3.44C18.45,46.43,19.87,46.54,21.29,46.65z + "/> + + <linearGradient id="SVGID_455_" gradientUnits="userSpaceOnUse" x1="244.6372" y1="-306.3667" x2="248.4497" y2="-299.7632" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_455_)" d="M21.3,36.88c0.71-1.06,1.43-2.12,2.13-3.19c-0.71-1.15-1.42-2.29-2.12-3.42 + c-1.42-0.08-2.84-0.15-4.26-0.22c-0.71,1.06-1.42,2.11-2.13,3.16c0.71,1.13,1.42,2.27,2.13,3.41C18.46,36.7,19.88,36.79,21.3,36.88 + z"/> + + <linearGradient id="SVGID_456_" gradientUnits="userSpaceOnUse" x1="244.6079" y1="-316.1377" x2="248.4536" y2="-309.4767" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_456_)" d="M21.31,27.1c0.71-1.07,1.42-2.14,2.14-3.22c-0.71-1.13-1.42-2.27-2.13-3.39 + c-1.42-0.05-2.84-0.1-4.27-0.15c-0.71,1.07-1.42,2.13-2.13,3.19c0.71,1.12,1.42,2.24,2.13,3.37C18.47,26.97,19.89,27.04,21.31,27.1 + z"/> + + <linearGradient id="SVGID_457_" gradientUnits="userSpaceOnUse" x1="244.5815" y1="-325.9062" x2="248.46" y2="-319.1886" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_457_)" d="M21.33,17.33c0.71-1.08,1.42-2.17,2.13-3.26c-0.71-1.12-1.42-2.24-2.13-3.36 + c-1.42-0.03-2.85-0.05-4.27-0.08c-0.71,1.08-1.42,2.16-2.14,3.23c0.71,1.11,1.42,2.22,2.13,3.34 + C18.48,17.24,19.91,17.28,21.33,17.33z"/> + + <linearGradient id="SVGID_458_" gradientUnits="userSpaceOnUse" x1="244.5532" y1="-335.6743" x2="248.4624" y2="-328.9034" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_458_)" d="M21.34,7.55c0.71-1.09,1.43-2.19,2.14-3.29c-0.71-1.11-1.42-2.22-2.13-3.33 + c-1.42,0-2.85-0.01-4.27-0.01c-0.71,1.09-1.42,2.18-2.14,3.27c0.71,1.09,1.42,2.19,2.13,3.3C18.49,7.51,19.92,7.53,21.34,7.55z"/> + + <linearGradient id="SVGID_459_" gradientUnits="userSpaceOnUse" x1="255.856" y1="-273.0938" x2="259.4858" y2="-266.8066" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_459_)" d="M10.17,70.07c0.71-0.99,1.42-1.98,2.12-2.98c-0.71-1.17-1.42-2.34-2.12-3.51 + c-1.42-0.17-2.83-0.33-4.25-0.51c-0.71,0.99-1.42,1.97-2.13,2.95c0.71,1.16,1.42,2.32,2.12,3.49C7.34,69.71,8.75,69.89,10.17,70.07 + z"/> + + <linearGradient id="SVGID_460_" gradientUnits="userSpaceOnUse" x1="255.8354" y1="-282.6714" x2="259.4985" y2="-276.3267" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_460_)" d="M10.18,60.49c0.71-1,1.42-2.01,2.13-3.02c-0.71-1.16-1.41-2.31-2.12-3.47 + c-1.42-0.14-2.83-0.29-4.25-0.43c-0.71,1-1.42,1.99-2.13,2.98C4.51,57.7,5.22,58.85,5.92,60C7.34,60.17,8.76,60.33,10.18,60.49z"/> + + <linearGradient id="SVGID_461_" gradientUnits="userSpaceOnUse" x1="255.8149" y1="-292.249" x2="259.5117" y2="-285.846" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_461_)" d="M10.18,50.9c0.71-1.01,1.42-2.03,2.13-3.06c-0.71-1.15-1.42-2.29-2.13-3.43 + c-1.42-0.12-2.83-0.24-4.26-0.36c-0.71,1.01-1.42,2.02-2.13,3.02c0.71,1.13,1.42,2.27,2.13,3.41C7.35,50.63,8.76,50.77,10.18,50.9z + "/> + + <linearGradient id="SVGID_462_" gradientUnits="userSpaceOnUse" x1="255.7964" y1="-301.8252" x2="259.5254" y2="-295.3664" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_462_)" d="M10.19,41.31c0.71-1.03,1.42-2.06,2.13-3.09c-0.71-1.13-1.42-2.26-2.13-3.39 + c-1.42-0.09-2.84-0.19-4.26-0.28c-0.71,1.02-1.42,2.05-2.13,3.06c0.71,1.12,1.42,2.24,2.13,3.37C7.35,41.1,8.76,41.21,10.19,41.31z + "/> + + <linearGradient id="SVGID_463_" gradientUnits="userSpaceOnUse" x1="255.7729" y1="-311.4058" x2="259.5381" y2="-304.8843" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_463_)" d="M10.19,31.73c0.71-1.04,1.42-2.08,2.13-3.13c-0.71-1.12-1.42-2.24-2.13-3.36 + c-1.42-0.06-2.84-0.13-4.26-0.2c-0.71,1.04-1.42,2.07-2.13,3.1c0.71,1.11,1.42,2.22,2.13,3.33C7.35,31.56,8.77,31.64,10.19,31.73z" + /> + + <linearGradient id="SVGID_464_" gradientUnits="userSpaceOnUse" x1="255.7559" y1="-320.9819" x2="259.5527" y2="-314.4055" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_464_)" d="M10.2,22.14c0.71-1.05,1.42-2.11,2.13-3.17c-0.71-1.11-1.42-2.21-2.13-3.31 + c-1.42-0.04-2.84-0.08-4.27-0.13c-0.71,1.05-1.42,2.1-2.13,3.14c0.71,1.09,1.42,2.19,2.13,3.29C7.36,22.02,8.77,22.08,10.2,22.14z" + /> + + <linearGradient id="SVGID_465_" gradientUnits="userSpaceOnUse" x1="255.7334" y1="-330.5615" x2="259.5659" y2="-323.9234" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_465_)" d="M10.2,12.55c0.71-1.06,1.43-2.13,2.13-3.2c-0.71-1.1-1.42-2.19-2.13-3.28 + C8.78,6.05,7.36,6.03,5.93,6.02C5.22,7.08,4.51,8.14,3.8,9.2c0.71,1.08,1.42,2.16,2.13,3.25C7.36,12.48,8.78,12.52,10.2,12.55z"/> + + <linearGradient id="SVGID_466_" gradientUnits="userSpaceOnUse" x1="256.5825" y1="-338.6318" x2="259.5781" y2="-333.4433" gradientTransform="matrix(-1 0 0 1 265.7217 336.5049)"> + <stop offset="0.1264" style="stop-color:#80E6FF"/> + <stop offset="0.6429" style="stop-color:#2BD5FF"/> + <stop offset="1" style="stop-color:#2BD5FF"/> + </linearGradient> + <path fill="url(#SVGID_466_)" d="M3.8-0.28c0.71,1.07,1.42,2.14,2.13,3.22c1.43,0.01,2.85,0.02,4.27,0.03 + c0.71-1.08,1.43-2.16,2.14-3.24C9.5-0.28,6.65-0.28,3.8-0.28z"/> +</g> +</svg> diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_user_default_icon_68x68px.svg b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_user_default_icon_68x68px.svg new file mode 100644 index 0000000..1ffeedd --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_user_default_icon_68x68px.svg @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) --> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + width="68px" height="68px" viewBox="0 0 68 68" enable-background="new 0 0 68 68" xml:space="preserve"> +<g> + <path fill="#29CAF2" d="M68.03,63.85c0,2.35-1.9,4.25-4.25,4.25H4.28c-2.35,0-4.25-1.9-4.25-4.25V4.35C0.03,2,1.94,0.1,4.28,0.1 + h59.5c2.35,0,4.25,1.9,4.25,4.25V63.85z"/> + <g> + <rect x="4.35" y="4.89" fill="#2BD5FF" width="58.44" height="58.44"/> + <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="8.9175" y1="36.4287" x2="62.7471" y2="36.4287"> + <stop offset="0.1538" style="stop-color:#27C0E6"/> + <stop offset="0.4396" style="stop-color:#25B7DB"/> + <stop offset="0.7253" style="stop-color:#22A5C4"/> + </linearGradient> + <path fill="url(#SVGID_1_)" d="M62.65,63.24c0.15-4.38,0.2-10.69-0.56-11.92c-3.75-6.06-15.11-4.72-18.33-4.21 + c0-1.52-0.01-2.86-0.02-3.88c0.66-0.68,1.26-1.46,1.81-2.31l0.08,0.25c4.67,0.67,5.26-14.6,5.26-14.6 + C51.22,4.85,37.65,9.83,35.49,10.76c-3.99-1.01-13.46-1.7-13.19,14.65c0,0-0.69,14.47,4.61,14.88c0.65,1.11,1.4,2.09,2.21,2.94 + c-0.01,0.94-0.05,2.15-0.1,3.54c-6.95-0.48-19.27-0.11-20.08,8.36c-0.08,0.82,0.15,4.82,0.36,8.11L62.65,63.24z"/> + </g> +</g> +</svg> diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_user_status_idle_38x38px.svg b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_user_status_idle_38x38px.svg new file mode 100644 index 0000000..71f49aa --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_user_status_idle_38x38px.svg @@ -0,0 +1,55 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) --> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + width="38px" height="38px" viewBox="0 0 38 38" enable-background="new 0 0 38 38" xml:space="preserve"> +<g> + <circle fill="#29CAF2" cx="19.08" cy="19.08" r="19"/> + <g> + <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="19.0747" y1="31.4219" x2="19.0747" y2="6.7417"> + <stop offset="0" style="stop-color:#A6A6A6"/> + <stop offset="0.4341" style="stop-color:#8C8C8C"/> + <stop offset="0.8407" style="stop-color:#999999"/> + <stop offset="1" style="stop-color:#D9D9D9"/> + </linearGradient> + <path fill="url(#SVGID_1_)" d="M19.08,31.42c-6.8,0-12.34-5.54-12.34-12.34c0-6.8,5.54-12.34,12.34-12.34 + c6.8,0,12.34,5.54,12.34,12.34C31.41,25.88,25.88,31.42,19.08,31.42L19.08,31.42z"/> + <linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="9.5791" y1="12.4316" x2="28.57" y2="25.7292"> + <stop offset="0.1099" style="stop-color:#FFFFFF"/> + <stop offset="0.6978" style="stop-color:#E6E6E6"/> + </linearGradient> + <circle fill="url(#SVGID_2_)" cx="19.07" cy="19.08" r="11.59"/> + <g> + <linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="11.3086" y1="13.7173" x2="26.6309" y2="24.4461"> + <stop offset="0" style="stop-color:#A6A6A6"/> + <stop offset="0.4341" style="stop-color:#8C8C8C"/> + <stop offset="0.7308" style="stop-color:#999999"/> + <stop offset="1" style="stop-color:#E6E6E6"/> + </linearGradient> + <path fill="url(#SVGID_3_)" d="M18.97,28.44c-5.16,0-9.36-4.19-9.36-9.35c0-5.16,4.2-9.36,9.36-9.36c5.16,0,9.35,4.2,9.35,9.36 + C28.32,24.24,24.13,28.44,18.97,28.44L18.97,28.44z"/> + <linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="25.4668" y1="24.5332" x2="12.4717" y2="13.629"> + <stop offset="0" style="stop-color:#A6A6A6"/> + <stop offset="0.4341" style="stop-color:#8C8C8C"/> + <stop offset="0.7308" style="stop-color:#999999"/> + <stop offset="1" style="stop-color:#E6E6E6"/> + </linearGradient> + <circle fill="url(#SVGID_4_)" cx="18.97" cy="19.08" r="8.48"/> + <path fill="#FF901F" d="M18.97,26.44c-4.06,0-7.36-3.3-7.36-7.36c0-4.06,3.3-7.36,7.36-7.36c4.06,0,7.36,3.3,7.36,7.36 + C26.33,23.14,23.03,26.44,18.97,26.44L18.97,26.44z"/> + <g> + <path fill="#FFD06B" d="M16.68,16.79c2.07-2.07,5.23-2.37,7.63-0.92c-0.25-0.42-0.56-0.83-0.93-1.19 + c-2.43-2.43-6.39-2.43-8.82,0c-2.43,2.43-2.43,6.39,0,8.82c0.37,0.37,0.77,0.67,1.19,0.92C14.3,22.02,14.61,18.85,16.68,16.79z" + /> + + <linearGradient id="SVGID_5_" gradientUnits="userSpaceOnUse" x1="-119.9077" y1="69.291" x2="-124.6987" y2="60.9927" gradientTransform="matrix(1 0 0 1 142.3301 -45.0029)"> + <stop offset="0" style="stop-color:#FF901F"/> + <stop offset="1" style="stop-color:#FFB81F"/> + </linearGradient> + <path fill="url(#SVGID_5_)" d="M23.38,23.49c2.07-2.07,2.37-5.23,0.93-7.63c-2.4-1.45-5.56-1.14-7.63,0.92 + c-2.07,2.07-2.37,5.23-0.92,7.63C18.15,25.86,21.31,25.55,23.38,23.49z"/> + </g> + </g> + </g> +</g> +</svg> diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_user_status_offline_38x38px.svg b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_user_status_offline_38x38px.svg new file mode 100644 index 0000000..84c2514 --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_user_status_offline_38x38px.svg @@ -0,0 +1,55 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) --> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + width="38px" height="38px" viewBox="0 0 38 38" enable-background="new 0 0 38 38" xml:space="preserve"> +<g> + <circle fill="#29CAF2" cx="19.08" cy="19.09" r="19"/> + <g> + <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="19.0757" y1="31.4287" x2="19.0757" y2="6.7485"> + <stop offset="0" style="stop-color:#A6A6A6"/> + <stop offset="0.4341" style="stop-color:#8C8C8C"/> + <stop offset="0.8407" style="stop-color:#999999"/> + <stop offset="1" style="stop-color:#D9D9D9"/> + </linearGradient> + <path fill="url(#SVGID_1_)" d="M19.08,31.43c-6.8,0-12.34-5.54-12.34-12.34c0-6.8,5.54-12.34,12.34-12.34s12.34,5.54,12.34,12.34 + C31.42,25.89,25.88,31.43,19.08,31.43L19.08,31.43z"/> + <linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="9.5801" y1="12.439" x2="28.5702" y2="25.736"> + <stop offset="0.1099" style="stop-color:#FFFFFF"/> + <stop offset="0.6978" style="stop-color:#E6E6E6"/> + </linearGradient> + <circle fill="url(#SVGID_2_)" cx="19.07" cy="19.09" r="11.59"/> + <g> + <linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="11.3101" y1="13.7241" x2="26.6308" y2="24.4518"> + <stop offset="0" style="stop-color:#A6A6A6"/> + <stop offset="0.4341" style="stop-color:#8C8C8C"/> + <stop offset="0.7308" style="stop-color:#999999"/> + <stop offset="1" style="stop-color:#E6E6E6"/> + </linearGradient> + <path fill="url(#SVGID_3_)" d="M18.97,28.44c-5.16,0-9.36-4.2-9.36-9.35c0-5.16,4.2-9.36,9.36-9.36c5.16,0,9.35,4.2,9.35,9.36 + C28.32,24.25,24.13,28.44,18.97,28.44L18.97,28.44z"/> + <linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="25.4678" y1="24.54" x2="12.4734" y2="13.6365"> + <stop offset="0" style="stop-color:#A6A6A6"/> + <stop offset="0.4341" style="stop-color:#8C8C8C"/> + <stop offset="0.7308" style="stop-color:#999999"/> + <stop offset="1" style="stop-color:#E6E6E6"/> + </linearGradient> + <circle fill="url(#SVGID_4_)" cx="18.97" cy="19.09" r="8.48"/> + <path fill="#BD0700" d="M18.97,26.45c-4.06,0-7.36-3.3-7.36-7.36s3.3-7.36,7.36-7.36c4.06,0,7.36,3.3,7.36,7.36 + S23.03,26.45,18.97,26.45L18.97,26.45z"/> + <g> + <path fill="#F25757" d="M16.68,16.79c2.07-2.07,5.23-2.37,7.63-0.92c-0.25-0.42-0.56-0.83-0.92-1.19 + c-2.43-2.43-6.39-2.43-8.82,0c-2.43,2.43-2.43,6.39,0,8.82c0.37,0.37,0.77,0.67,1.19,0.92C14.3,22.02,14.61,18.86,16.68,16.79z" + /> + + <linearGradient id="SVGID_5_" gradientUnits="userSpaceOnUse" x1="-119.9072" y1="69.2979" x2="-124.6982" y2="60.9996" gradientTransform="matrix(1 0 0 1 142.3301 -45.0029)"> + <stop offset="0" style="stop-color:#BD0700"/> + <stop offset="1" style="stop-color:#E35D58"/> + </linearGradient> + <path fill="url(#SVGID_5_)" d="M23.38,23.5c2.07-2.07,2.37-5.23,0.92-7.63c-2.4-1.45-5.56-1.14-7.63,0.92 + c-2.07,2.07-2.37,5.23-0.92,7.63C18.15,25.86,21.31,25.56,23.38,23.5z"/> + </g> + </g> + </g> +</g> +</svg> diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_user_status_online_38x38px.svg b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_user_status_online_38x38px.svg new file mode 100644 index 0000000..76daf31 --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/blue_SVG/blue_user_status_online_38x38px.svg @@ -0,0 +1,55 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) --> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + width="38px" height="38px" viewBox="0 0 38 38" enable-background="new 0 0 38 38" xml:space="preserve"> +<g> + <circle fill="#29CAF2" cx="19.07" cy="19.08" r="19"/> + <g> + <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="19.0737" y1="31.4219" x2="19.0737" y2="6.7417"> + <stop offset="0" style="stop-color:#A6A6A6"/> + <stop offset="0.4341" style="stop-color:#8C8C8C"/> + <stop offset="0.8407" style="stop-color:#999999"/> + <stop offset="1" style="stop-color:#D9D9D9"/> + </linearGradient> + <path fill="url(#SVGID_1_)" d="M19.07,31.42c-6.8,0-12.34-5.54-12.34-12.34c0-6.8,5.54-12.34,12.34-12.34s12.34,5.54,12.34,12.34 + C31.41,25.88,25.88,31.42,19.07,31.42L19.07,31.42z"/> + <linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="9.5786" y1="12.4321" x2="28.5695" y2="25.7297"> + <stop offset="0.1099" style="stop-color:#FFFFFF"/> + <stop offset="0.6978" style="stop-color:#E6E6E6"/> + </linearGradient> + <circle fill="url(#SVGID_2_)" cx="19.07" cy="19.08" r="11.59"/> + <g> + <linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="11.3086" y1="13.7178" x2="26.6293" y2="24.4454"> + <stop offset="0" style="stop-color:#A6A6A6"/> + <stop offset="0.4341" style="stop-color:#8C8C8C"/> + <stop offset="0.7308" style="stop-color:#999999"/> + <stop offset="1" style="stop-color:#E6E6E6"/> + </linearGradient> + <path fill="url(#SVGID_3_)" d="M18.97,28.44c-5.16,0-9.36-4.19-9.36-9.35c0-5.16,4.2-9.36,9.36-9.36s9.35,4.2,9.35,9.36 + C28.32,24.24,24.13,28.44,18.97,28.44L18.97,28.44z"/> + <linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="25.4648" y1="24.5322" x2="12.4713" y2="13.6293"> + <stop offset="0" style="stop-color:#A6A6A6"/> + <stop offset="0.4341" style="stop-color:#8C8C8C"/> + <stop offset="0.7308" style="stop-color:#999999"/> + <stop offset="1" style="stop-color:#E6E6E6"/> + </linearGradient> + <circle fill="url(#SVGID_4_)" cx="18.97" cy="19.08" r="8.48"/> + <path fill="#09B300" d="M18.97,26.44c-4.06,0-7.36-3.3-7.36-7.36c0-4.06,3.3-7.36,7.36-7.36c4.06,0,7.36,3.3,7.36,7.36 + C26.33,23.14,23.03,26.44,18.97,26.44L18.97,26.44z"/> + <g> + <path fill="#57EB51" d="M16.68,16.79c2.07-2.07,5.23-2.37,7.62-0.92c-0.25-0.42-0.56-0.83-0.92-1.19 + c-2.43-2.43-6.39-2.43-8.82,0c-2.43,2.43-2.43,6.39,0,8.82c0.37,0.37,0.77,0.67,1.19,0.93C14.3,22.02,14.61,18.85,16.68,16.79z" + /> + + <linearGradient id="SVGID_5_" gradientUnits="userSpaceOnUse" x1="-119.9087" y1="69.292" x2="-124.6997" y2="60.9937" gradientTransform="matrix(1 0 0 1 142.3301 -45.0029)"> + <stop offset="0" style="stop-color:#09AA00"/> + <stop offset="1" style="stop-color:#4DCC46"/> + </linearGradient> + <path fill="url(#SVGID_5_)" d="M23.38,23.49c2.07-2.07,2.37-5.23,0.92-7.63c-2.39-1.45-5.56-1.14-7.62,0.92 + c-2.07,2.07-2.37,5.23-0.93,7.63C18.15,25.86,21.31,25.55,23.38,23.49z"/> + </g> + </g> + </g> +</g> +</svg> diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/contacts/areacodes.txt b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/contacts/areacodes.txt new file mode 100644 index 0000000..dc7e7d8 --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/contacts/areacodes.txt @@ -0,0 +1,62 @@ ++30 ++31 ++32 ++33 ++34 ++350 ++351 ++352 ++353 ++354 ++355 ++356 ++357 ++358 ++359 ++36 ++3 ++370 ++371 ++372 ++373 ++374 ++375 ++376 ++377 ++377 44 ++378 ++379 ++38 ++380 ++381 ++382 ++383 ++384 ++385 ++386 ++386 49 ++387 ++388 ++388 3 ++389 ++39 ++40 ++41 ++42 ++420 ++421 ++422 ++423 ++424 ++425 ++426 ++427 ++428 ++429 ++43 ++44 ++45 ++46 ++47 ++48 ++49
\ No newline at end of file diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/contacts/firstnamesF.txt b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/contacts/firstnamesF.txt new file mode 100644 index 0000000..4bf1492 --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/contacts/firstnamesF.txt @@ -0,0 +1,100 @@ +Aida +Aija +Aila +Aili +Ailikki +Aimi +Aina +Alexia +Alice +Amanda +Amber +Amy +Angela +Angelica +Ann +Beth +Brenda +Brooke +Caitlin +Camilla +Camille +Carmen +Cassandra +Catherine +Edna +Eeva +Eeve +Eevi +Eija +Eila +Eimi +Eleanor +Eleonora +Elizabeth +Ellen +Enna +Enni +Erica +Erika +Erja +Essi +Essie +Heini +Heleena +Helen +Helena +Helene +Helga +Hilja +Hilkka +Hille +Hillervo +Hillevi +Hilma +Irene +Irina +Irja +Irma +Irmeli +Iro +Jacqueline +Jane +Jennifer +Jenny +Jessica +Jill +Kaire +Kaisa +Kaisla +Kaisu +Katarine +Kate +Kate +Kateriina +Katharina +Katharine +Katherine +Kathleen +Marge +Mary +May +Megan +Melinda +Morgan +Nellie +Nelly +Pauline +Peggy +Pepi +Scarlett +Sheila +Shirley +Sissy +Stephanie +Sylvia +Taylor +Terrie +Terry +Victoria +Violet
\ No newline at end of file diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/contacts/firstnamesM.txt b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/contacts/firstnamesM.txt new file mode 100644 index 0000000..189d8d0 --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/contacts/firstnamesM.txt @@ -0,0 +1,100 @@ +Aabraham +Aadam +Aadolf +Aake +Aaku +Aatu +Ahti +Ahvo +Aimo +Aki +Akseli +Aku +Bartholomew +Ben +Benjamin +Bill +Billie +Billy +Bob +Brendan +Brian +Bryan +Calvin +Carl +Charles +Chester +Chris +Christian +Christopher +Chuck +Dale +Dave +David +Dennis +Dick +Dominick +Donald +Dustin +Dusty +Harri +Heikki +Heimo +Heino +Helmer +Helmeri +Hemmi +Hemmo +Henri +Jeff +Jeffrey +Jermu +Jero +Jerri +Jerry +Jesper +Jesperi +Jesse +Jetro +Jim +Jimi +Jimmy +Joakim +Joe +John +Johnny +Jonah +Jonathan +Joseph +Leevi +Leimo +Leimu +Leino +Leivo +Lenne +Lennu +Mark +Martin +Matt +Matthew +Michael +Mike +Niko +Nooa +Nuutti +Nyyrikki +Okke +Okko +Olavi +Oliver +Olli +Onni +Pertti +Perttu +Walter +Warren +Wesley +William +Willie +Winston +Woodrow
\ No newline at end of file diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/contacts/lastnames.txt b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/contacts/lastnames.txt new file mode 100644 index 0000000..35b3f9f --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/contacts/lastnames.txt @@ -0,0 +1,150 @@ +Adams +Allen +Anderson +Bailey +Baker +Barnes +Bell +Bennett +Brooks +Brown +Butler +Campbell +Carter +Clark +Collins +Cook +Cooper +Cox +Cruz +Davis +Díaz +Edwards +Evans +Fisher +Flores +Foster +García +Gómez +González +Gray +Green +Gutiérrez +Hall +Harris +Heikkinen +Helenius +Helve +Hernández +Hill +Hiltunen +Hirvonen +Holm +Honkanen +Howard +Hughes +Huhtala +Huttunen +Hyppönen +Jackson +James +Jenkins +Johnson +Jones +Kauppinen +Kelly +Kemppainen +King +Klemetti +Kokkonen +Kolehmainen +Korhonen +Kurikka +Kuura +Kyrö +Kärkkäinen +Lee +Lewis +Long +López +Martikainen +Martin +Martínez +Mattila +Mikkola +Mikkonen +Miller +Mitchell +Moore +Morales +Morgan +Morris +Muje +Murphy +Mustonen +Myers +Myllärinen +Mäenpää +Mäkelä +Mäkinen +Nelson +Nguyen +Ortiz +Parker +Pérez +Perry +Peterson +Phillips +Powell +Price +Ramírez +Reed +Reyes +Richardson +Rivera +Roberts +Robinson +Rodríguez +Rogers +Ross +Russell +Saarinen +Saaristo +Salminen +Salo +Salonen +Sánchez +Sanders +Scott +Seppänen +Silvennoinen +Silvo +Smith +Sokura +Stewart +Sullivan +Suomalainen +Taylor +Thomas +Thompson +Torres +Turner +Valkeapää +Walker +Valo +Valtonen +Vanhanen +Ward +Watson +Venäläinen +Vesa +White +Vihavainen +Williams +Wilson +Virtanen +Wood +Voutilainen +Wright +Vuorela +Young
\ No newline at end of file diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_background_360x640px.svg b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_background_360x640px.svg new file mode 100644 index 0000000..8daf275 --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_background_360x640px.svg @@ -0,0 +1,40 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) --> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + width="360px" height="640px" viewBox="0 0 360 640" enable-background="new 0 0 360 640" xml:space="preserve"> +<g> + <g> + <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="180.5498" y1="640.4805" x2="180.5498" y2="0.4805"> + <stop offset="0" style="stop-color:#9EFF78"/> + <stop offset="0.3626" style="stop-color:#46F200"/> + <stop offset="1" style="stop-color:#3AC900"/> + </linearGradient> + <rect x="0.55" y="0.48" fill="url(#SVGID_1_)" width="360" height="640"/> + </g> +</g> +<g> + <path opacity="0.5" fill="#3FD900" enable-background="new " d="M81.87,177.64c-26.04,112.67-2.73,201.9,36.7,294.07 + c29.47,68.89,20.63,130.26,7.36,168.61H0.55V0.53h174.27C157.12,65.8,96.34,115.02,81.87,177.64z"/> + + <linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="458.8857" y1="1985.248" x2="-180.46" y2="1985.248" gradientTransform="matrix(0 -1 0.7343 0 -1400.0699 459.4961)"> + <stop offset="0" style="stop-color:#9EFF78"/> + <stop offset="0.3626" style="stop-color:#46F200"/> + <stop offset="1" style="stop-color:#3AC900"/> + </linearGradient> + <path opacity="0.5" fill="url(#SVGID_2_)" enable-background="new " d="M102.88,480.39c25.66,64.29,6.13,119.47-25.71,159.56 + H0.69V536.03c32.62-1.35,73.55,32.06,82.03-30.04c6.33-46.35-59-157.3-41.01-287.49c6.61-47.82,9.32-133.33-6.81-217.89h72.92 + C92.79,58.16,62.46,114.8,49.63,219.24C41.9,282.07,51.58,351.9,102.88,480.39z"/> + <path opacity="0.5" fill="#3FD900" enable-background="new " d="M279.23,463.41c26.04-112.67,2.74-201.9-36.7-294.07 + c-29.47-68.89-20.63-130.26-7.36-168.61h125.38v639.81H186.27C215.23,586.79,264.76,526.04,279.23,463.41z"/> + + <linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="655.6582" y1="83.9292" x2="16.3125" y2="83.9291" gradientTransform="matrix(0 1 -0.7343 0 366.7535 -15.209)"> + <stop offset="0" style="stop-color:#9EFF78"/> + <stop offset="0.3626" style="stop-color:#46F200"/> + <stop offset="1" style="stop-color:#3AC900"/> + </linearGradient> + <path fill="url(#SVGID_3_)" d="M258.22,160.67C232.57,96.37,268.5-25.81,330.4,63.01l30-61.91V158.9 + c0-79.74-73.55-85.93-82.03-23.82c-6.33,46.35,59,157.3,41.01,287.49c-6.61,47.82-9.32,133.33,6.81,217.89h-72.92 + c15.02-57.56,45.35-114.2,58.18-218.63C319.2,358.99,309.51,289.15,258.22,160.67z"/> +</g> +</svg> diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_background_horisontal_640x360px.svg b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_background_horisontal_640x360px.svg new file mode 100644 index 0000000..c2b070a --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_background_horisontal_640x360px.svg @@ -0,0 +1,39 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) --> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + width="640px" height="360px" viewBox="0 0 640 360" enable-background="new 0 0 640 360" xml:space="preserve"> +<g> + <g> + <rect x="0.02" y="0.02" fill="#FFFFFF" width="640" height="360"/> + <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="320.0181" y1="358.0205" x2="320.018" y2="2.0205"> + <stop offset="0" style="stop-color:#9EFF78"/> + <stop offset="0.3626" style="stop-color:#46F200"/> + <stop offset="1" style="stop-color:#3AC900"/> + </linearGradient> + <polygon fill="url(#SVGID_1_)" points="638.02,358.02 2.02,358.02 2.02,2.02 638.02,2.02 638.02,358.02 "/> + </g> + <path opacity="0.5" fill="#3FD900" d="M144.17,100.86c-45.53,62.62-4.77,112.21,64.16,163.44c51.53,38.29,36.07,72.4,12.87,93.71 + H2.03V2.42h304.66C275.74,38.7,169.48,66.06,144.17,100.86z"/> + + <linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="507.0713" y1="-1386.6294" x2="151.7412" y2="-1386.6294" gradientTransform="matrix(0 -1 -0.7343 0 -916.2726 509.4961)"> + <stop offset="0" style="stop-color:#9EFF78"/> + <stop offset="0.3626" style="stop-color:#46F200"/> + <stop offset="1" style="stop-color:#3AC900"/> + </linearGradient> + <path opacity="0.5" fill="url(#SVGID_2_)" d="M180.9,269.08c44.86,35.73,10.73,66.4-44.95,88.68H2.28V300 + c57.02-0.75,128.57,17.82,143.4-16.7c11.07-25.76-103.15-87.42-71.7-159.78C85.52,96.94,90.26,49.41,62.07,2.42h127.46 + c-26.25,31.99-79.27,63.47-101.71,121.51C74.31,158.85,91.24,197.67,180.9,269.08z"/> + <path opacity="0.5" fill="#3FD900" d="M495.59,259.17c45.54-62.62,4.77-112.21-64.15-163.44c-51.53-38.29-36.07-72.4-12.87-93.71 + h219.17l0,355.59H333.07C383.69,327.74,470.28,293.98,495.59,259.17z"/> + + <linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="499.5596" y1="193.2451" x2="144.2295" y2="193.2451" gradientTransform="matrix(0 1 0.7343 0 398.9562 -142.209)"> + <stop offset="0" style="stop-color:#9EFF78"/> + <stop offset="0.3626" style="stop-color:#46F200"/> + <stop offset="1" style="stop-color:#3AC900"/> + </linearGradient> + <path fill="url(#SVGID_3_)" d="M458.86,90.7C414,54.97,476.82-12.94,585.04,36.43l52.45-34.41v87.7 + c0-44.32-128.57-47.76-143.4-13.24c-11.07,25.76,103.15,87.42,71.7,159.78c-11.55,26.57-16.29,74.11,11.91,121.09H450.24 + c26.25-31.99,79.27-63.47,101.71-121.51C565.45,200.92,548.52,162.11,458.86,90.7z"/> +</g> +</svg> diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_contact_default_icon_53x53px.svg b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_contact_default_icon_53x53px.svg new file mode 100644 index 0000000..6e34f25 --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_contact_default_icon_53x53px.svg @@ -0,0 +1,30 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) --> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + width="53px" height="53px" viewBox="0 0 53 53" enable-background="new 0 0 53 53" xml:space="preserve"> +<g> + <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="26.4878" y1="53.0156" x2="26.4878" y2="0.0156"> + <stop offset="0" style="stop-color:#8BF261"/> + <stop offset="0.1255" style="stop-color:#7AE74D"/> + <stop offset="0.3699" style="stop-color:#5DD62C"/> + <stop offset="0.6034" style="stop-color:#49C914"/> + <stop offset="0.8191" style="stop-color:#3CC205"/> + <stop offset="1" style="stop-color:#38BF00"/> + </linearGradient> + <path fill="url(#SVGID_1_)" d="M-0.01,49.7c0,1.83,1.48,3.31,3.31,3.31h46.38c1.83,0,3.31-1.48,3.31-3.31V3.33 + c0-1.83-1.48-3.31-3.31-3.31H3.3c-1.83,0-3.31,1.48-3.31,3.31V49.7z"/> + <linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="26.4878" y1="50.6777" x2="26.4878" y2="2.354"> + <stop offset="0" style="stop-color:#3ED900"/> + <stop offset="0.3899" style="stop-color:#3DD500"/> + <stop offset="0.7931" style="stop-color:#3AC800"/> + <stop offset="1" style="stop-color:#38BF00"/> + </linearGradient> + <path fill="url(#SVGID_2_)" d="M2.33,49.7c0,0.54,0.44,0.98,0.97,0.98h46.38l0,0c0.54,0,0.97-0.44,0.97-0.98V3.33 + c0-0.54-0.44-0.97-0.97-0.97H3.3c-0.54,0-0.97,0.44-0.97,0.97V49.7z"/> + <path fill="#43EB00" d="M45.55,50.68c0.11-8.96,0.14-13.45-0.4-14.33c-2.67-4.31-10.75-3.36-13.04-2.99c0-1.08-0.01-2.04-0.01-2.76 + c0.47-0.49,0.9-1.04,1.29-1.64l0.06,0.18c3.33,0.47,3.74-10.39,3.74-10.39C37.41,3.29,27.75,6.83,26.22,7.49 + c-2.84-0.72-9.58-1.21-9.39,10.43c0,0-0.49,10.29,3.28,10.59c0.46,0.79,0.99,1.49,1.58,2.09c-0.01,0.67-0.04,1.53-0.07,2.52 + c-4.95-0.34-13.71-0.08-14.29,5.95c-0.05,0.58,0.11,3.43,0.26,11.62H45.55z"/> +</g> +</svg> diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_contact_default_icon_highlight_53x53px.svg b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_contact_default_icon_highlight_53x53px.svg new file mode 100644 index 0000000..29c284d --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_contact_default_icon_highlight_53x53px.svg @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) --> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + width="53px" height="53px" viewBox="0 0 53 53" enable-background="new 0 0 53 53" xml:space="preserve"> +<g> + <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="26.5083" y1="53.0332" x2="26.5083" y2="0.0342"> + <stop offset="0" style="stop-color:#8BF261"/> + <stop offset="0.1471" style="stop-color:#A7F587"/> + <stop offset="0.3385" style="stop-color:#C6F9B2"/> + <stop offset="0.5243" style="stop-color:#DFFBD3"/> + <stop offset="0.7006" style="stop-color:#F1FDEB"/> + <stop offset="0.8635" style="stop-color:#FBFFFA"/> + <stop offset="1" style="stop-color:#FFFFFF"/> + </linearGradient> + <path fill="url(#SVGID_1_)" d="M0.01,49.72c0,1.83,1.48,3.31,3.31,3.31H49.7c1.83,0,3.31-1.48,3.31-3.31V3.35 + c0-1.83-1.48-3.31-3.31-3.31H3.32c-1.83,0-3.31,1.48-3.31,3.31V49.72z"/> + <linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="26.5083" y1="50.6963" x2="26.5083" y2="2.3726"> + <stop offset="0" style="stop-color:#3ED900"/> + <stop offset="0.3899" style="stop-color:#3DD500"/> + <stop offset="0.7931" style="stop-color:#3AC800"/> + <stop offset="1" style="stop-color:#38BF00"/> + </linearGradient> + <path fill="url(#SVGID_2_)" d="M2.35,49.72c0,0.54,0.44,0.98,0.97,0.98H49.7l0,0c0.54,0,0.97-0.44,0.97-0.98V3.35 + c0-0.54-0.44-0.97-0.97-0.97H3.32c-0.54,0-0.97,0.44-0.97,0.97V49.72z"/> + <path fill="#43EB00" d="M45.57,50.7c0.11-8.96,0.14-13.45-0.4-14.33c-2.67-4.31-10.75-3.36-13.04-2.99c0-1.09-0.01-2.04-0.01-2.76 + c0.47-0.49,0.9-1.04,1.29-1.64l0.06,0.17c3.33,0.47,3.74-10.39,3.74-10.39C37.43,3.3,27.77,6.85,26.24,7.51 + c-2.84-0.72-9.58-1.21-9.39,10.43c0,0-0.49,10.29,3.28,10.59c0.46,0.79,0.99,1.49,1.58,2.09c-0.01,0.67-0.04,1.53-0.07,2.52 + c-4.95-0.34-13.71-0.08-14.29,5.95C7.29,39.66,7.45,42.51,7.6,50.7L45.57,50.7z"/> +</g> +</svg> diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_contact_list_divider_360x76px.svg b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_contact_list_divider_360x76px.svg new file mode 100644 index 0000000..db9fc7a --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_contact_list_divider_360x76px.svg @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) --> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + width="360px" height="76px" viewBox="0 0 360 76" enable-background="new 0 0 360 76" xml:space="preserve"> +<rect x="0.01" y="0.35" opacity="0.2" fill="#FFFFFF" width="360" height="76"/> +</svg> diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_contact_list_highlighter_357x80px.svg b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_contact_list_highlighter_357x80px.svg new file mode 100644 index 0000000..0ee3ea2 --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_contact_list_highlighter_357x80px.svg @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) --> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + width="357px" height="80px" viewBox="0 0 357 80" enable-background="new 0 0 357 80" xml:space="preserve"> +<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="8.300781e-03" y1="40.0156" x2="357.0078" y2="40.0156"> + <stop offset="0" style="stop-color:#46F200"/> + <stop offset="1" style="stop-color:#94FF69"/> +</linearGradient> +<rect x="0.01" y="0.02" fill="url(#SVGID_1_)" width="357" height="80"/> +</svg> diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_contact_status_idle_27x47.svg b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_contact_status_idle_27x47.svg new file mode 100644 index 0000000..925d3eb --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_contact_status_idle_27x47.svg @@ -0,0 +1,63 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) --> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + width="27px" height="47px" viewBox="0 0 27 47" enable-background="new 0 0 27 47" xml:space="preserve"> +<g> + <path opacity="0.2" fill="#FFFFFF" d="M0.04,0.04c15.51,0,27,10.52,27,23.5c0,12.98-11.49,23.5-27,23.5V0.04z"/> + <g> + <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="-18.8911" y1="23.5415" x2="18.8759" y2="23.5415"> + <stop offset="0" style="stop-color:#3ED900"/> + <stop offset="1" style="stop-color:#38BF00"/> + </linearGradient> + <path fill="url(#SVGID_1_)" d="M18.88,23.54C18.88,13,10.45,4.45,0.04,4.43v6.7c6.74,0.03,12.22,5.58,12.22,12.41 + S6.78,35.93,0.04,35.96v6.7C10.45,42.63,18.88,34.08,18.88,23.54z"/> + <linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="6.1475" y1="35.9551" x2="6.1475" y2="11.1284"> + <stop offset="0" style="stop-color:#A6A6A6"/> + <stop offset="0.4341" style="stop-color:#8C8C8C"/> + <stop offset="0.8407" style="stop-color:#999999"/> + <stop offset="1" style="stop-color:#D9D9D9"/> + </linearGradient> + <path fill="url(#SVGID_2_)" d="M11.51,23.54c0,6.43-5.13,11.64-11.48,11.66v0.75c6.74-0.02,12.22-5.58,12.22-12.41 + S6.78,11.15,0.04,11.13v0.75C6.38,11.91,11.51,17.12,11.51,23.54z"/> + <linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="-8.9409" y1="16.0107" x2="10.0672" y2="29.3204"> + <stop offset="0.1099" style="stop-color:#FFFFFF"/> + <stop offset="0.6978" style="stop-color:#E6E6E6"/> + </linearGradient> + <path fill="url(#SVGID_3_)" d="M11.51,23.54c0-6.43-5.13-11.64-11.48-11.66v2.25c5.06,0.08,9.15,4.27,9.15,9.41 + c0,5.14-4.09,9.32-9.15,9.4v2.25C6.38,35.18,11.51,29.97,11.51,23.54z"/> + <linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="-7.3013" y1="17.4404" x2="8.0348" y2="28.1788"> + <stop offset="0" style="stop-color:#A6A6A6"/> + <stop offset="0.4341" style="stop-color:#8C8C8C"/> + <stop offset="0.7308" style="stop-color:#999999"/> + <stop offset="1" style="stop-color:#E6E6E6"/> + </linearGradient> + <path fill="url(#SVGID_4_)" d="M8.32,23.54c0,4.66-3.7,8.44-8.28,8.53v0.88c5.06-0.08,9.15-4.26,9.15-9.4 + c0-5.14-4.09-9.32-9.15-9.41v0.88C4.62,15.1,8.32,18.88,8.32,23.54z"/> + <linearGradient id="SVGID_5_" gradientUnits="userSpaceOnUse" x1="7.0356" y1="28.2002" x2="-5.98" y2="17.2788"> + <stop offset="0" style="stop-color:#A6A6A6"/> + <stop offset="0.4341" style="stop-color:#8C8C8C"/> + <stop offset="0.7308" style="stop-color:#999999"/> + <stop offset="1" style="stop-color:#E6E6E6"/> + </linearGradient> + <path fill="url(#SVGID_5_)" d="M8.32,23.54c0-4.66-3.7-8.44-8.28-8.52v1.13C4,16.23,7.2,19.51,7.2,23.54 + c0,4.03-3.2,7.31-7.16,7.39v1.13C4.62,31.99,8.32,28.2,8.32,23.54z"/> + <linearGradient id="SVGID_6_" gradientUnits="userSpaceOnUse" x1="0.0371" y1="23.542" x2="7.2012" y2="23.542"> + <stop offset="0" style="stop-color:#FF901F"/> + <stop offset="1" style="stop-color:#FFB81F"/> + </linearGradient> + <path fill="url(#SVGID_6_)" d="M4.27,19.1c0.36,0.37,0.67,0.77,0.92,1.2c1.44,2.41,1.13,5.6-0.92,7.67 + c-1.17,1.18-2.7,1.77-4.23,1.81v1.15C4,30.86,7.2,27.57,7.2,23.54c0-4.03-3.2-7.32-7.16-7.4v1.13C1.57,17.31,3.1,17.92,4.27,19.1z + "/> + <path fill="#FFD06B" d="M5.19,20.3c-0.25-0.43-0.56-0.83-0.92-1.2c-1.17-1.18-2.7-1.79-4.23-1.83v2.46 + C1.74,19.17,3.62,19.35,5.19,20.3z"/> + + <linearGradient id="SVGID_7_" gradientUnits="userSpaceOnUse" x1="-137.9243" y1="73.1523" x2="-142.7352" y2="64.8197" gradientTransform="matrix(1 0 0 1 142.3301 -45.0029)"> + <stop offset="0" style="stop-color:#FF901F"/> + <stop offset="1" style="stop-color:#FFB81F"/> + </linearGradient> + <path fill="url(#SVGID_7_)" d="M5.19,20.3c-1.56-0.96-3.45-1.14-5.15-0.57v10.05c1.54-0.04,3.06-0.62,4.23-1.81 + C6.32,25.9,6.62,22.71,5.19,20.3z"/> + </g> +</g> +</svg> diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_contact_status_offline_27x47.svg b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_contact_status_offline_27x47.svg new file mode 100644 index 0000000..6f74723 --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_contact_status_offline_27x47.svg @@ -0,0 +1,58 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) --> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + width="27px" height="47px" viewBox="0 0 27 47" enable-background="new 0 0 27 47" xml:space="preserve"> +<g> + <path opacity="0.2" fill="#FFFFFF" d="M0.04,0.04c15.51,0,27,10.52,27,23.5c0,12.98-11.49,23.5-27,23.5V0.04z"/> + <g> + <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="-18.8911" y1="23.542" x2="18.8759" y2="23.542"> + <stop offset="0" style="stop-color:#3ED900"/> + <stop offset="1" style="stop-color:#38BF00"/> + </linearGradient> + <path fill="url(#SVGID_1_)" d="M18.88,23.54C18.88,13,10.45,4.45,0.04,4.43v6.7c6.74,0.03,12.22,5.58,12.22,12.41 + c0,6.83-5.48,12.39-12.22,12.41v6.7C10.45,42.63,18.88,34.08,18.88,23.54z"/> + <linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="6.1475" y1="35.9551" x2="6.1475" y2="11.1289"> + <stop offset="0" style="stop-color:#A6A6A6"/> + <stop offset="0.4341" style="stop-color:#8C8C8C"/> + <stop offset="0.8407" style="stop-color:#999999"/> + <stop offset="1" style="stop-color:#D9D9D9"/> + </linearGradient> + <path fill="url(#SVGID_2_)" d="M11.51,23.54c0,6.43-5.13,11.64-11.48,11.66v0.75c6.74-0.03,12.22-5.58,12.22-12.41 + c0-6.83-5.48-12.39-12.22-12.41v0.75C6.38,11.91,11.51,17.12,11.51,23.54z"/> + <linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="-8.9409" y1="16.0107" x2="10.0672" y2="29.3204"> + <stop offset="0.1099" style="stop-color:#FFFFFF"/> + <stop offset="0.6978" style="stop-color:#E6E6E6"/> + </linearGradient> + <path fill="url(#SVGID_3_)" d="M11.51,23.54c0-6.43-5.13-11.64-11.48-11.66v2.25c5.06,0.08,9.15,4.27,9.15,9.41 + c0,5.14-4.09,9.32-9.15,9.4v2.25C6.38,35.18,11.51,29.97,11.51,23.54z"/> + <linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="-7.3013" y1="17.4409" x2="8.0348" y2="28.1793"> + <stop offset="0" style="stop-color:#A6A6A6"/> + <stop offset="0.4341" style="stop-color:#8C8C8C"/> + <stop offset="0.7308" style="stop-color:#999999"/> + <stop offset="1" style="stop-color:#E6E6E6"/> + </linearGradient> + <path fill="url(#SVGID_4_)" d="M8.32,23.54c0,4.66-3.7,8.44-8.28,8.53v0.88c5.06-0.08,9.15-4.27,9.15-9.4 + c0-5.14-4.09-9.32-9.15-9.41v0.88C4.62,15.1,8.32,18.88,8.32,23.54z"/> + <linearGradient id="SVGID_5_" gradientUnits="userSpaceOnUse" x1="7.0361" y1="28.2012" x2="-5.9795" y2="17.2798"> + <stop offset="0" style="stop-color:#A6A6A6"/> + <stop offset="0.4341" style="stop-color:#8C8C8C"/> + <stop offset="0.7308" style="stop-color:#999999"/> + <stop offset="1" style="stop-color:#E6E6E6"/> + </linearGradient> + <path fill="url(#SVGID_5_)" d="M8.32,23.54c0-4.66-3.7-8.44-8.28-8.52v1.13C4,16.23,7.2,19.51,7.2,23.54 + c0,4.03-3.2,7.31-7.16,7.39v1.13C4.62,31.99,8.32,28.2,8.32,23.54z"/> + <path fill="#BD0700" d="M4.27,19.1c0.36,0.37,0.67,0.77,0.92,1.2c1.44,2.41,1.13,5.6-0.92,7.67c-1.17,1.19-2.7,1.77-4.23,1.81 + v1.15C4,30.86,7.2,27.57,7.2,23.54c0-4.03-3.2-7.32-7.16-7.4v1.13C1.57,17.31,3.1,17.92,4.27,19.1z"/> + <path fill="#F25757" d="M5.19,20.3c-0.25-0.43-0.56-0.83-0.92-1.2c-1.17-1.18-2.7-1.79-4.23-1.83v2.46 + C1.74,19.17,3.62,19.35,5.19,20.3z"/> + + <linearGradient id="SVGID_6_" gradientUnits="userSpaceOnUse" x1="-137.9243" y1="73.1533" x2="-142.7357" y2="64.8198" gradientTransform="matrix(1 0 0 1 142.3301 -45.0029)"> + <stop offset="0" style="stop-color:#BD0700"/> + <stop offset="1" style="stop-color:#E35D58"/> + </linearGradient> + <path fill="url(#SVGID_6_)" d="M5.19,20.3c-1.56-0.96-3.45-1.14-5.15-0.57v10.05c1.54-0.04,3.06-0.62,4.23-1.81 + C6.32,25.9,6.62,22.72,5.19,20.3z"/> + </g> +</g> +</svg> diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_contact_status_online_27x47.svg b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_contact_status_online_27x47.svg new file mode 100644 index 0000000..5695160 --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_contact_status_online_27x47.svg @@ -0,0 +1,63 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) --> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + width="27px" height="47px" viewBox="0 0 27 47" enable-background="new 0 0 27 47" xml:space="preserve"> +<g> + <path opacity="0.2" fill="#FFFFFF" d="M0.04,0.03c15.51,0,27,10.52,27,23.5c0,12.98-11.49,23.5-27,23.5V0.03z"/> + <g> + <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="-18.8911" y1="23.5264" x2="18.8759" y2="23.5264"> + <stop offset="0" style="stop-color:#3ED900"/> + <stop offset="1" style="stop-color:#38BF00"/> + </linearGradient> + <path fill="url(#SVGID_1_)" d="M18.88,23.53c0-10.54-8.43-19.09-18.84-19.11v6.7c6.74,0.02,12.22,5.58,12.22,12.41 + c0,6.83-5.48,12.39-12.22,12.41v6.7C10.45,42.62,18.88,34.07,18.88,23.53z"/> + <linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="6.1475" y1="35.9414" x2="6.1475" y2="11.1152"> + <stop offset="0" style="stop-color:#A6A6A6"/> + <stop offset="0.4341" style="stop-color:#8C8C8C"/> + <stop offset="0.8407" style="stop-color:#999999"/> + <stop offset="1" style="stop-color:#D9D9D9"/> + </linearGradient> + <path fill="url(#SVGID_2_)" d="M11.51,23.53c0,6.43-5.13,11.64-11.48,11.66v0.75c6.74-0.03,12.22-5.58,12.22-12.41 + c0-6.83-5.48-12.39-12.22-12.41v0.75C6.38,11.89,11.51,17.1,11.51,23.53z"/> + <linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="-8.9414" y1="15.9961" x2="10.0667" y2="29.3057"> + <stop offset="0.1099" style="stop-color:#FFFFFF"/> + <stop offset="0.6978" style="stop-color:#E6E6E6"/> + </linearGradient> + <path fill="url(#SVGID_3_)" d="M11.51,23.53c0-6.43-5.13-11.64-11.48-11.66v2.25c5.06,0.08,9.15,4.27,9.15,9.41 + c0,5.14-4.09,9.32-9.15,9.4v2.25C6.38,35.16,11.51,29.95,11.51,23.53z"/> + <linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="-7.3013" y1="17.4268" x2="8.0348" y2="28.1652"> + <stop offset="0" style="stop-color:#A6A6A6"/> + <stop offset="0.4341" style="stop-color:#8C8C8C"/> + <stop offset="0.7308" style="stop-color:#999999"/> + <stop offset="1" style="stop-color:#E6E6E6"/> + </linearGradient> + <path fill="url(#SVGID_4_)" d="M8.32,23.53c0,4.66-3.7,8.44-8.28,8.53v0.88c5.06-0.08,9.15-4.27,9.15-9.4 + c0-5.14-4.09-9.33-9.15-9.41V15C4.62,15.08,8.32,18.87,8.32,23.53z"/> + <linearGradient id="SVGID_5_" gradientUnits="userSpaceOnUse" x1="7.0356" y1="28.1865" x2="-5.98" y2="17.2651"> + <stop offset="0" style="stop-color:#A6A6A6"/> + <stop offset="0.4341" style="stop-color:#8C8C8C"/> + <stop offset="0.7308" style="stop-color:#999999"/> + <stop offset="1" style="stop-color:#E6E6E6"/> + </linearGradient> + <path fill="url(#SVGID_5_)" d="M8.32,23.53c0-4.66-3.7-8.44-8.28-8.52v1.13C4,16.21,7.2,19.5,7.2,23.53c0,4.03-3.2,7.31-7.16,7.39 + v1.13C4.62,31.97,8.32,28.19,8.32,23.53z"/> + <linearGradient id="SVGID_6_" gradientUnits="userSpaceOnUse" x1="0.0371" y1="23.5283" x2="7.2012" y2="23.5283"> + <stop offset="0" style="stop-color:#09AA00"/> + <stop offset="1" style="stop-color:#4DCC46"/> + </linearGradient> + <path fill="url(#SVGID_6_)" d="M4.27,19.09c0.36,0.37,0.67,0.77,0.92,1.2c1.44,2.41,1.13,5.6-0.92,7.67 + c-1.17,1.19-2.7,1.77-4.23,1.81v1.15C4,30.84,7.2,27.56,7.2,23.53c0-4.03-3.2-7.32-7.16-7.4v1.13C1.57,17.3,3.1,17.91,4.27,19.09z + "/> + <path fill="#57EB51" d="M5.19,20.29c-0.25-0.43-0.56-0.83-0.92-1.2c-1.17-1.19-2.7-1.79-4.23-1.83v2.46 + C1.74,19.15,3.62,19.33,5.19,20.29z"/> + + <linearGradient id="SVGID_7_" gradientUnits="userSpaceOnUse" x1="-137.9243" y1="73.1387" x2="-142.7352" y2="64.806" gradientTransform="matrix(1 0 0 1 142.3301 -45.0029)"> + <stop offset="0" style="stop-color:#09AA00"/> + <stop offset="1" style="stop-color:#4DCC46"/> + </linearGradient> + <path fill="url(#SVGID_7_)" d="M5.19,20.29c-1.56-0.96-3.45-1.14-5.15-0.57v10.05c1.54-0.04,3.06-0.62,4.23-1.81 + C6.32,25.88,6.62,22.7,5.19,20.29z"/> + </g> +</g> +</svg> diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_scroll_5x80px.svg b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_scroll_5x80px.svg new file mode 100644 index 0000000..4f6482a --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_scroll_5x80px.svg @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) --> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + width="5px" height="80px" viewBox="0 0 5 80" enable-background="new 0 0 5 80" xml:space="preserve"> +<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="2.4917" y1="0.0908" x2="2.4917" y2="80.0913"> + <stop offset="0" style="stop-color:#46F200"/> + <stop offset="0.3516" style="stop-color:#94FF69"/> + <stop offset="0.9176" style="stop-color:#3FD900"/> +</linearGradient> +<rect x="-0.01" y="0.09" fill="url(#SVGID_1_)" width="5" height="80"/> +</svg> diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_scrollbar_5x14px.svg b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_scrollbar_5x14px.svg new file mode 100644 index 0000000..54a40c3 --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_scrollbar_5x14px.svg @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) --> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + width="5px" height="14px" viewBox="0 0 5 14" enable-background="new 0 0 5 14" xml:space="preserve"> +<rect fill="#41E600" width="5" height="14"/> +</svg> diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_status_field_left_14x24px.svg b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_status_field_left_14x24px.svg new file mode 100644 index 0000000..a21c91d --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_status_field_left_14x24px.svg @@ -0,0 +1,30 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) --> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + width="14px" height="24px" viewBox="0 0 14 24" enable-background="new 0 0 14 24" xml:space="preserve"> +<g> + <path fill="none" d="M4.96,21.94c-0.28-0.33-0.53-0.67-0.77-1.03C4.43,21.27,4.68,21.62,4.96,21.94z"/> + <path fill="none" d="M2.15,15.41c-0.05-0.46-0.09-0.92-0.09-1.39C2.06,14.49,2.09,14.96,2.15,15.41z"/> + <path fill="none" d="M4.12,20.81c-0.23-0.35-0.45-0.71-0.64-1.09C3.03,18.89,2.69,18,2.45,17.06C2.79,18.42,3.36,19.69,4.12,20.81z + "/> + <path fill="none" d="M2.41,16.91c-0.09-0.38-0.16-0.77-0.22-1.17C2.25,16.13,2.32,16.52,2.41,16.91z"/> + <path fill="#38BF00" d="M4.17,20.81c-0.74-1.13-1.3-2.39-1.64-3.75c-0.01-0.05-0.02-0.1-0.04-0.16c-0.09-0.38-0.16-0.77-0.22-1.17 + c-0.01-0.11-0.03-0.21-0.04-0.32c-0.05-0.46-0.08-0.92-0.08-1.39c0-6.63,5.57-12,11.86-12l0,0v-2H11.4c-6.29,0-11.39,5.37-11.39,12 + c0,4.13,1.98,7.76,4.99,9.92c-0.27-0.33-0.52-0.67-0.76-1.03C4.21,20.88,4.19,20.85,4.17,20.81z"/> + <path fill="#8BF261" d="M10.21,22.02c-2.5,0-4.8-0.86-6.68-2.29c0.19,0.38,0.41,0.73,0.63,1.09c0.02,0.03,0.04,0.07,0.07,0.1 + c0.24,0.36,0.49,0.7,0.76,1.03c1.82,1.31,4.03,2.08,6.4,2.08h2.61v-2H10.21z"/> + <path fill="#80E6FF" d="M4.12,20.81c0.02,0.04,0.04,0.07,0.07,0.1C4.16,20.88,4.14,20.85,4.12,20.81z"/> + <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="8.0742" y1="22.0195" x2="8.0742" y2="2.0205"> + <stop offset="0" style="stop-color:#3ED900"/> + <stop offset="0.3899" style="stop-color:#3DD500"/> + <stop offset="0.7931" style="stop-color:#3AC800"/> + <stop offset="1" style="stop-color:#38BF00"/> + </linearGradient> + <path fill="url(#SVGID_1_)" d="M14.01,2.02c-6.29,0-11.86,5.37-11.86,12c0,0.47,0.03,0.94,0.08,1.39c0.01,0.11,0.03,0.22,0.04,0.32 + c0.06,0.4,0.12,0.79,0.22,1.17c0.01,0.05,0.02,0.1,0.04,0.16C2.76,18,3.1,18.89,3.53,19.73c1.88,1.44,4.18,2.29,6.68,2.29h3.8V2.02 + L14.01,2.02z"/> + <path fill="#2BD5FF" d="M2.45,17.06c-0.01-0.05-0.02-0.1-0.04-0.16C2.42,16.96,2.43,17.01,2.45,17.06z"/> + <path fill="#2BD5FF" d="M2.19,15.74c-0.01-0.11-0.03-0.21-0.04-0.32C2.16,15.52,2.17,15.63,2.19,15.74z"/> +</g> +</svg> diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_status_field_middle_10x24px.svg b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_status_field_middle_10x24px.svg new file mode 100644 index 0000000..b84200d --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_status_field_middle_10x24px.svg @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) --> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + width="10px" height="24px" viewBox="0 0 10 24" enable-background="new 0 0 10 24" xml:space="preserve"> +<g> + + <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="62.5" y1="-100.9995" x2="62.5" y2="-79" gradientTransform="matrix(1 0 0 -1 -57.5 -78)"> + <stop offset="0" style="stop-color:#3ED900"/> + <stop offset="0.3899" style="stop-color:#3DD500"/> + <stop offset="0.7931" style="stop-color:#3AC800"/> + <stop offset="1" style="stop-color:#38BF00"/> + </linearGradient> + <rect y="1" fill="url(#SVGID_1_)" width="10" height="22"/> + <rect fill="#38BF00" width="10" height="2"/> + <rect y="22" fill="#8BF261" width="10" height="2"/> +</g> +</svg> diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_status_field_right_14x24px.svg b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_status_field_right_14x24px.svg new file mode 100644 index 0000000..231560d --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_status_field_right_14x24px.svg @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) --> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + width="14px" height="24px" viewBox="0 0 14 24" enable-background="new 0 0 14 24" xml:space="preserve"> +<g> + <path fill="#38BF00" d="M4.59,2.02c2.42,0,4.66,0.77,6.52,2.08C8.98,1.6,5.88,0.02,2.42,0.02H0.01v2H4.59z"/> + <path fill="#8BF261" d="M11.6,4.73c0.76,1.6,1.2,3.39,1.2,5.29c0,6.63-5.19,12-11.59,12H0.01v2h2.41c6.4,0,11.59-5.37,11.59-12 + C14.01,9.27,13.1,6.75,11.6,4.73z"/> + <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="6.4028" y1="22.0205" x2="6.4028" y2="2.021"> + <stop offset="0" style="stop-color:#3ED900"/> + <stop offset="0.3899" style="stop-color:#3DD500"/> + <stop offset="0.7931" style="stop-color:#3AC800"/> + <stop offset="1" style="stop-color:#38BF00"/> + </linearGradient> + <path fill="url(#SVGID_1_)" d="M0.01,2.02v20h1.21c6.4,0,11.59-5.37,11.59-12c0-1.9-0.44-3.69-1.2-5.29 + c-0.16-0.22-0.32-0.43-0.5-0.64c-1.86-1.31-4.1-2.08-6.52-2.08H0.01z"/> +</g> +</svg> diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_topbar_356x96px.svg b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_topbar_356x96px.svg new file mode 100644 index 0000000..679d9a5 --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_topbar_356x96px.svg @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) --> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + width="356px" height="96px" viewBox="0 0 356 96" enable-background="new 0 0 356 96" xml:space="preserve"> +<g> + <g> + + <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="-184.8071" y1="-51.2339" x2="-112.3086" y2="147.9543" gradientTransform="matrix(-1 0 0 1 29.2188 0)"> + <stop offset="0" style="stop-color:#46F200"/> + <stop offset="0.3516" style="stop-color:#94FF69"/> + <stop offset="0.9176" style="stop-color:#3FD900"/> + </linearGradient> + <polygon fill="url(#SVGID_1_)" points="355.87,95.84 355.87,0.39 -0.14,0.39 -0.14,96.39 "/> + + <linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="-148.647" y1="96.3936" x2="-148.647" y2="58.96" gradientTransform="matrix(-1 0 0 1 29.2188 0)"> + <stop offset="0" style="stop-color:#46F200"/> + <stop offset="0.9176" style="stop-color:#3FD900"/> + </linearGradient> + <polygon fill="url(#SVGID_2_)" points="355.87,96.18 355.87,58.96 -0.14,58.96 -0.14,96.39 "/> + <polygon fill="#38BF00" points="355.87,96.37 355.87,92.21 -0.14,92.21 -0.14,96.39 "/> + </g> + <polygon opacity="0.2" fill="#FFFFFF" points="266.5,92.09 167.84,92.09 272.84,0.77 326.5,0.77 "/> + <polygon opacity="0.2" fill="#FFFFFF" points="314.5,92.09 285.84,92.09 330.84,0.77 339.5,0.77 "/> +</g> +</svg> diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_topbar_horisontal_636x96px.svg b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_topbar_horisontal_636x96px.svg new file mode 100644 index 0000000..1ef4fb9 --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_topbar_horisontal_636x96px.svg @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) --> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + width="636px" height="96px" viewBox="0 0 636 96" enable-background="new 0 0 636 96" xml:space="preserve"> +<g> + <g> + + <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="-61.3369" y1="-96.5996" x2="43.9144" y2="192.5761" gradientTransform="matrix(-1 0 0 1 309.2188 0)"> + <stop offset="0" style="stop-color:#46F200"/> + <stop offset="0.3516" style="stop-color:#94FF69"/> + <stop offset="0.9176" style="stop-color:#3FD900"/> + </linearGradient> + <polygon fill="url(#SVGID_1_)" points="636.02,95.46 636.02,0.02 0.02,0.02 0.02,96.02 "/> + + <linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="-8.8003" y1="96.0205" x2="-8.8003" y2="58.5869" gradientTransform="matrix(-1 0 0 1 309.2188 0)"> + <stop offset="0" style="stop-color:#46F200"/> + <stop offset="0.9176" style="stop-color:#3FD900"/> + </linearGradient> + <polygon fill="url(#SVGID_2_)" points="636.02,95.8 636.02,58.59 0.02,58.59 0.02,96.02 "/> + <polygon fill="#38BF00" points="636.02,95.99 636.02,91.84 0.02,91.84 0.02,96.02 "/> + </g> + <polygon opacity="0.2" fill="#FFFFFF" points="546.65,91.72 447.99,91.72 552.99,0.4 606.65,0.4 "/> + <polygon opacity="0.2" fill="#FFFFFF" points="594.65,91.72 565.99,91.72 610.99,0.4 619.65,0.4 "/> +</g> +</svg> diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_user_default_icon_84x68px.svg b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_user_default_icon_84x68px.svg new file mode 100644 index 0000000..4df0214 --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_user_default_icon_84x68px.svg @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) --> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + width="84px" height="68px" viewBox="0 0 84 68" enable-background="new 0 0 84 68" xml:space="preserve"> +<g> + <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="42.1343" y1="68.0352" x2="42.1343" y2="0.0361"> + <stop offset="0" style="stop-color:#8BF261"/> + <stop offset="0.1255" style="stop-color:#7AE74D"/> + <stop offset="0.3699" style="stop-color:#5DD62C"/> + <stop offset="0.6034" style="stop-color:#49C914"/> + <stop offset="0.8191" style="stop-color:#3CC205"/> + <stop offset="1" style="stop-color:#38BF00"/> + </linearGradient> + <path fill="url(#SVGID_1_)" d="M80.01,0.04h-59.5c-2.35,0-4.25,1.9-4.25,4.25v25.78c-9,0.13-16.26,7.46-16.26,16.49 + c0,9.03,7.26,16.36,16.26,16.49v0.75c0,2.35,1.9,4.25,4.25,4.25h59.5c2.35,0,4.25-1.9,4.25-4.25V4.29 + C84.26,1.94,82.36,0.04,80.01,0.04z"/> + <linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="42.1333" y1="65.0371" x2="42.1333" y2="3.0366"> + <stop offset="0" style="stop-color:#3ED900"/> + <stop offset="0.3899" style="stop-color:#3DD500"/> + <stop offset="0.7931" style="stop-color:#3AC800"/> + <stop offset="1" style="stop-color:#38BF00"/> + </linearGradient> + <path fill="url(#SVGID_2_)" d="M80.01,65.04h-59.5c-0.69,0-1.25-0.56-1.25-1.25v-0.75v-2.96l-2.96-0.04 + c-7.33-0.11-13.3-6.16-13.3-13.49s5.97-13.38,13.3-13.49l2.96-0.04v-2.96V4.29c0-0.69,0.56-1.25,1.25-1.25h59.5 + c0.69,0,1.25,0.56,1.25,1.25v59.5C81.26,64.47,80.7,65.04,80.01,65.04L80.01,65.04z"/> + <path fill="#43EB00" d="M74.71,65.04c0.14-11.5,0.19-17.26-0.51-18.38c-3.42-5.53-13.79-4.31-16.74-3.84 + c0-1.39-0.01-2.61-0.02-3.54c0.6-0.62,1.15-1.33,1.65-2.11l0.08,0.22c4.27,0.61,4.8-13.33,4.8-13.33 + C64.28,4.23,51.88,8.78,49.91,9.62C46.27,8.7,37.62,8.07,37.87,23c0,0-0.63,13.21,4.21,13.58c0.59,1.01,1.28,1.91,2.02,2.69 + c-0.01,0.86-0.05,1.96-0.09,3.23c-6.35-0.43-17.59-0.1-18.33,7.63c-0.07,0.74,0.14,4.4,0.33,14.91L74.71,65.04z"/> +</g> +</svg> diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_user_status_idle_24x24px.svg b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_user_status_idle_24x24px.svg new file mode 100644 index 0000000..2d6da38 --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_user_status_idle_24x24px.svg @@ -0,0 +1,53 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) --> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + width="24px" height="24px" viewBox="0 0 24 24" enable-background="new 0 0 24 24" xml:space="preserve"> +<g> + <g> + <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="12.0337" y1="23.9922" x2="12.0337" y2="-7.812500e-03"> + <stop offset="0" style="stop-color:#A6A6A6"/> + <stop offset="0.4341" style="stop-color:#8C8C8C"/> + <stop offset="0.8407" style="stop-color:#999999"/> + <stop offset="1" style="stop-color:#D9D9D9"/> + </linearGradient> + <path fill="url(#SVGID_1_)" d="M12.03,23.99c-6.62,0-12-5.38-12-12c0-6.62,5.39-12,12-12s12,5.38,12,12 + C24.03,18.61,18.65,23.99,12.03,23.99L12.03,23.99z"/> + <linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="2.7993" y1="5.5259" x2="21.267" y2="18.4571"> + <stop offset="0.1099" style="stop-color:#FFFFFF"/> + <stop offset="0.6978" style="stop-color:#E6E6E6"/> + </linearGradient> + <circle fill="url(#SVGID_2_)" cx="12.03" cy="11.99" r="11.27"/> + <g> + <linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="4.4814" y1="6.7754" x2="19.3806" y2="17.2079"> + <stop offset="0" style="stop-color:#A6A6A6"/> + <stop offset="0.4341" style="stop-color:#8C8C8C"/> + <stop offset="0.7308" style="stop-color:#999999"/> + <stop offset="1" style="stop-color:#E6E6E6"/> + </linearGradient> + <path fill="url(#SVGID_3_)" d="M11.93,21.09c-5.02,0-9.1-4.08-9.1-9.09c0-5.02,4.08-9.1,9.1-9.1s9.1,4.08,9.1,9.1 + C21.03,17.01,16.95,21.09,11.93,21.09L11.93,21.09z"/> + <linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="18.249" y1="17.293" x2="5.613" y2="6.6901"> + <stop offset="0" style="stop-color:#A6A6A6"/> + <stop offset="0.4341" style="stop-color:#8C8C8C"/> + <stop offset="0.7308" style="stop-color:#999999"/> + <stop offset="1" style="stop-color:#E6E6E6"/> + </linearGradient> + <circle fill="url(#SVGID_4_)" cx="11.93" cy="11.99" r="8.25"/> + <path fill="#FF901F" d="M11.93,19.15c-3.95,0-7.16-3.21-7.16-7.15c0-3.95,3.21-7.16,7.16-7.16c3.94,0,7.16,3.21,7.16,7.16 + C19.09,15.94,15.88,19.15,11.93,19.15L11.93,19.15z"/> + <g> + <path fill="#FFD06B" d="M9.7,9.76c2.01-2.01,5.09-2.3,7.42-0.9c-0.25-0.41-0.54-0.8-0.9-1.16c-2.36-2.37-6.21-2.37-8.58,0 + c-2.36,2.37-2.36,6.21,0,8.58c0.36,0.36,0.75,0.65,1.16,0.9C7.39,14.85,7.69,11.77,9.7,9.76z"/> + + <linearGradient id="SVGID_5_" gradientUnits="userSpaceOnUse" x1="-127.042" y1="62.0576" x2="-131.7007" y2="53.9885" gradientTransform="matrix(1 0 0 1 142.3301 -45.0029)"> + <stop offset="0" style="stop-color:#FF901F"/> + <stop offset="1" style="stop-color:#FFB81F"/> + </linearGradient> + <path fill="url(#SVGID_5_)" d="M16.22,16.28c2.01-2.01,2.3-5.09,0.9-7.42c-2.33-1.41-5.41-1.11-7.42,0.9 + c-2.01,2.01-2.31,5.09-0.9,7.42C11.13,18.58,14.21,18.29,16.22,16.28z"/> + </g> + </g> + </g> +</g> +</svg> diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_user_status_offline_24x24px.svg b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_user_status_offline_24x24px.svg new file mode 100644 index 0000000..d592026 --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_user_status_offline_24x24px.svg @@ -0,0 +1,53 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) --> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + width="24px" height="24px" viewBox="0 0 24 24" enable-background="new 0 0 24 24" xml:space="preserve"> +<g> + <g> + <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="12.0005" y1="24.0449" x2="12.0005" y2="0.0454"> + <stop offset="0" style="stop-color:#A6A6A6"/> + <stop offset="0.4341" style="stop-color:#8C8C8C"/> + <stop offset="0.8407" style="stop-color:#999999"/> + <stop offset="1" style="stop-color:#D9D9D9"/> + </linearGradient> + <path fill="url(#SVGID_1_)" d="M12,24.04c-6.62,0-12-5.38-12-12c0-6.62,5.39-12,12-12s12,5.38,12,12 + C24,18.66,18.62,24.04,12,24.04L12,24.04z"/> + <linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="2.7661" y1="5.5786" x2="21.2346" y2="18.5104"> + <stop offset="0.1099" style="stop-color:#FFFFFF"/> + <stop offset="0.6978" style="stop-color:#E6E6E6"/> + </linearGradient> + <circle fill="url(#SVGID_2_)" cx="12" cy="12.04" r="11.27"/> + <g> + <linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="4.4487" y1="6.8286" x2="19.3479" y2="17.2611"> + <stop offset="0" style="stop-color:#A6A6A6"/> + <stop offset="0.4341" style="stop-color:#8C8C8C"/> + <stop offset="0.7308" style="stop-color:#999999"/> + <stop offset="1" style="stop-color:#E6E6E6"/> + </linearGradient> + <path fill="url(#SVGID_3_)" d="M11.9,21.14c-5.02,0-9.1-4.08-9.1-9.09c0-5.02,4.08-9.1,9.1-9.1c5.02,0,9.1,4.08,9.1,9.1 + C20.99,17.06,16.92,21.14,11.9,21.14L11.9,21.14z"/> + <linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="18.2168" y1="17.3467" x2="5.5801" y2="6.7432"> + <stop offset="0" style="stop-color:#A6A6A6"/> + <stop offset="0.4341" style="stop-color:#8C8C8C"/> + <stop offset="0.7308" style="stop-color:#999999"/> + <stop offset="1" style="stop-color:#E6E6E6"/> + </linearGradient> + <circle fill="url(#SVGID_4_)" cx="11.9" cy="12.04" r="8.25"/> + <path fill="#BD0700" d="M11.9,19.2c-3.95,0-7.16-3.21-7.16-7.15c0-3.95,3.21-7.16,7.16-7.16c3.95,0,7.16,3.21,7.16,7.16 + C19.05,15.99,15.84,19.2,11.9,19.2L11.9,19.2z"/> + <g> + <path fill="#F25757" d="M9.67,9.81c2.01-2.01,5.09-2.3,7.42-0.9c-0.25-0.41-0.54-0.8-0.9-1.16c-2.36-2.37-6.21-2.37-8.58,0 + c-2.36,2.37-2.36,6.21,0,8.58c0.36,0.36,0.75,0.65,1.16,0.9C7.36,14.9,7.66,11.82,9.67,9.81z"/> + + <linearGradient id="SVGID_5_" gradientUnits="userSpaceOnUse" x1="-127.0752" y1="62.1104" x2="-131.7339" y2="54.0413" gradientTransform="matrix(1 0 0 1 142.3301 -45.0029)"> + <stop offset="0" style="stop-color:#BD0700"/> + <stop offset="1" style="stop-color:#E35D58"/> + </linearGradient> + <path fill="url(#SVGID_5_)" d="M16.19,16.33c2.01-2.01,2.3-5.08,0.9-7.41c-2.33-1.41-5.41-1.11-7.42,0.9 + c-2.01,2.01-2.31,5.09-0.9,7.42C11.1,18.63,14.18,18.34,16.19,16.33z"/> + </g> + </g> + </g> +</g> +</svg> diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_user_status_online_24x24px.svg b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_user_status_online_24x24px.svg new file mode 100644 index 0000000..46ad07d --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/resources/lime_SVG/lime_user_status_online_24x24px.svg @@ -0,0 +1,53 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) --> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + width="24px" height="24px" viewBox="0 0 24 24" enable-background="new 0 0 24 24" xml:space="preserve"> +<g> + <g> + <linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="12.0337" y1="23.9502" x2="12.0337" y2="-0.0498"> + <stop offset="0" style="stop-color:#A6A6A6"/> + <stop offset="0.4341" style="stop-color:#8C8C8C"/> + <stop offset="0.8407" style="stop-color:#999999"/> + <stop offset="1" style="stop-color:#D9D9D9"/> + </linearGradient> + <path fill="url(#SVGID_1_)" d="M12.03,23.95c-6.62,0-12-5.38-12-12c0-6.62,5.38-12,12-12c6.62,0,12,5.38,12,12 + C24.03,18.57,18.65,23.95,12.03,23.95L12.03,23.95z"/> + <linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="2.7988" y1="5.4839" x2="21.2673" y2="18.4157"> + <stop offset="0.1099" style="stop-color:#FFFFFF"/> + <stop offset="0.6978" style="stop-color:#E6E6E6"/> + </linearGradient> + <circle fill="url(#SVGID_2_)" cx="12.03" cy="11.95" r="11.27"/> + <g> + <linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="4.4819" y1="6.7339" x2="19.3803" y2="17.1658"> + <stop offset="0" style="stop-color:#A6A6A6"/> + <stop offset="0.4341" style="stop-color:#8C8C8C"/> + <stop offset="0.7308" style="stop-color:#999999"/> + <stop offset="1" style="stop-color:#E6E6E6"/> + </linearGradient> + <path fill="url(#SVGID_3_)" d="M11.93,21.05c-5.01,0-9.1-4.08-9.1-9.09c0-5.02,4.08-9.1,9.1-9.1c5.02,0,9.1,4.08,9.1,9.1 + C21.03,16.97,16.95,21.05,11.93,21.05L11.93,21.05z"/> + <linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="18.248" y1="17.251" x2="5.6128" y2="6.6487"> + <stop offset="0" style="stop-color:#A6A6A6"/> + <stop offset="0.4341" style="stop-color:#8C8C8C"/> + <stop offset="0.7308" style="stop-color:#999999"/> + <stop offset="1" style="stop-color:#E6E6E6"/> + </linearGradient> + <circle fill="url(#SVGID_4_)" cx="11.93" cy="11.95" r="8.25"/> + <path fill="#09B300" d="M11.93,19.11c-3.95,0-7.16-3.21-7.16-7.15c0-3.95,3.21-7.16,7.16-7.16c3.94,0,7.16,3.21,7.16,7.16 + C19.09,15.9,15.88,19.11,11.93,19.11L11.93,19.11z"/> + <g> + <path fill="#57EB51" d="M9.7,9.72c2.01-2.01,5.09-2.3,7.42-0.9c-0.25-0.41-0.54-0.8-0.9-1.16c-2.36-2.37-6.21-2.37-8.57,0 + c-2.36,2.37-2.36,6.21,0,8.58c0.36,0.36,0.75,0.65,1.16,0.9C7.39,14.8,7.69,11.73,9.7,9.72z"/> + + <linearGradient id="SVGID_5_" gradientUnits="userSpaceOnUse" x1="-127.042" y1="62.0156" x2="-131.7007" y2="53.9465" gradientTransform="matrix(1 0 0 1 142.3301 -45.0029)"> + <stop offset="0" style="stop-color:#09AA00"/> + <stop offset="1" style="stop-color:#4DCC46"/> + </linearGradient> + <path fill="url(#SVGID_5_)" d="M16.22,16.24c2.01-2.01,2.3-5.09,0.9-7.42c-2.33-1.41-5.41-1.11-7.42,0.9 + c-2.01,2.01-2.31,5.09-0.9,7.42C11.13,18.54,14.21,18.25,16.22,16.24z"/> + </g> + </g> + </g> +</g> +</svg> diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/abstractitemcontainer.cpp b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/abstractitemcontainer.cpp new file mode 100644 index 0000000..f866fd7 --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/abstractitemcontainer.cpp @@ -0,0 +1,401 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the examples 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 Technology Preview License Agreement accompanying +** this package. +** +** 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.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include <QDebug> +#include <QGraphicsLayout> + +#include "abstractitemcontainer.h" +#include "abstractitemview.h" +#include "abstractviewitem.h" +#include "scrollbar.h" + +AbstractItemContainer::AbstractItemContainer(int bufferSize, QGraphicsWidget *parent) + : GvbWidget(parent), + m_items(), + m_itemView(0), + m_prototype(0), + m_bufferSize(bufferSize), + m_twoColumns(false) +{ +} + +AbstractItemContainer::~AbstractItemContainer() +{ + delete m_prototype; + m_prototype = 0; +} + +AbstractViewItem *AbstractItemContainer::prototype() +{ + return m_prototype; +} + +int AbstractItemContainer::bufferSize() const +{ + return m_bufferSize; +} + +bool AbstractItemContainer::event(QEvent *e) +{ + if (e->type() == QEvent::LayoutRequest) + updateItemBuffer(); + + return QGraphicsWidget::event(e); +} + + +bool AbstractItemContainer::eventFilter(QObject *obj, QEvent *event) +{ + if (event->type()==QEvent::GraphicsSceneResize && m_itemView) { +#if (QT_VERSION >= 0x040600) + const bool caching = m_itemView->listItemCaching(); + m_itemView->setListItemCaching(false); +#endif + + QSizeF s = m_itemView->size(); + s.setWidth(s.width()-m_itemView->verticalScrollBar()->size().width()); + adjustVisibleContainerSize(s); + + m_itemView->updateViewContent(); + updateItemBuffer(); + +#if (QT_VERSION >= 0x040600) + m_itemView->setListItemCaching(caching); +#endif + } + + return QGraphicsWidget::eventFilter(obj, event); +} + +QVariant AbstractItemContainer::itemChange(GraphicsItemChange change, const QVariant &value) +{ + QVariant ichange = QGraphicsWidget::itemChange(change,value); + + if (change == ItemPositionChange) { + if (m_itemView && layout() && !layout()->isActivated()) + m_itemView->refreshContainerGeometry(); + } + return ichange; + } + +/*virtual*/ +void AbstractItemContainer::setItemView(AbstractItemView *view) +{ + m_itemView = view; + + if (m_itemView) { + setParentItem(m_itemView); + m_itemView->installEventFilter(this); + } +} +/*virtual*/ +void AbstractItemContainer::setItemPrototype(AbstractViewItem *ptype) +{ + m_prototype = ptype; + m_prototype->setParentItem(0); + m_prototype->hide(); +} + +/*virtual*/ +void AbstractItemContainer::reset() +{ + qDeleteAll(m_items); + m_items.clear(); + updateItemBuffer(); +} + + +/*virtual*/ +void AbstractItemContainer::addItem(const QModelIndex &index) +{ + if (m_items.count() < maxItemCountInItemBuffer() || + (m_items.count() > 0 && + m_items.first()->modelIndex().row()-1 <= index.row() && + m_items.last()->modelIndex().row() >= index.row())) { + int itemPos = 0; + if (m_items.count() != 0) + itemPos = qMax(0, index.row() - m_items.first()->modelIndex().row()); + + if (itemPos >= m_items.count() || m_items.at(itemPos)->modelIndex() != index) { + AbstractViewItem *item = 0; + if (m_prototype) + item = m_prototype->newItemInstance(); + + if (item) { + item->setModel(m_itemView->model()); + item->setTwoColumns(m_twoColumns); + m_items.insert(itemPos, item); + addItemToVisibleLayout(itemPos, item); + + if (item->modelIndex() != index) { + item->setModelIndex(index); + } + } + } + updateItemBuffer(); + } +} +void AbstractItemContainer::removeItem(const QModelIndex &index) +{ + AbstractViewItem *item = findItemByIndex(index); + + if (item) { + if (maxItemCountInItemBuffer() < m_items.count()) { + m_items.removeOne(item); + removeItemFromVisibleLayout(item); + + delete item; + } + else { + m_items.removeOne(item); + removeItemFromVisibleLayout(item); + + QModelIndex newIndex = m_itemView->nextIndex(m_items.last()->modelIndex()); + if (newIndex.isValid()) { + // Item readded as last item in buffer. + m_items.append(item); + addItemToVisibleLayout(m_items.count() - 1, item); + item->setModelIndex(newIndex); + } else { + // Item readded as first item in buffer. + newIndex = m_itemView->previousIndex(m_items.first()->modelIndex()); + + m_items.prepend(item); + addItemToVisibleLayout(0, item); + item->setModelIndex(newIndex); + } + } + } +} + +/*virtual*/ +int AbstractItemContainer::itemCount() const +{ + return m_items.count(); +} + +AbstractViewItem *AbstractItemContainer::firstItem() +{ + return m_items.first(); +} + +/*virtual*/ +AbstractViewItem* AbstractItemContainer::itemAt(const int row) const +{ + if (row<0 || row >= m_items.count()) + return 0; + return m_items.at(row); +} + +AbstractViewItem* AbstractItemContainer::findItemByIndex(const QModelIndex &index) const +{ + AbstractViewItem *item = 0; + for (int i = 0; i < m_items.count(); ++i) { + if (m_items.at(i)->modelIndex() == index) { + item = m_items.at(i); + break; + } + } + return item; +} + +bool AbstractItemContainer::itemVisibleInView(AbstractViewItem* item, const QRectF &viewRect, bool fullyVisible) const +{ + if (!item || !m_itemView) + return false; + + QRectF itemRectBoundingRect = item->mapToItem(m_itemView, item->boundingRect()).boundingRect(); + + if (fullyVisible && viewRect.contains(itemRectBoundingRect)) + return true; + else if (viewRect.intersects(itemRectBoundingRect)) + return true; + + return false; +} + +void AbstractItemContainer::updateItemBuffer() +{ + if (!m_itemView || (m_itemView && !m_itemView->boundingRect().isValid())) + return; + + int maxCount = maxItemCountInItemBuffer(); + + if (m_items.count() < maxCount) { + // New items needs to be added. + QModelIndex index; + if (m_items.count() > 0) + index = m_items.last()->modelIndex(); + while (m_items.count() < maxCount) { + index = m_itemView->nextIndex(index); + + if (!index.isValid()) + break; + + insertItem(m_items.count(), index); + } + + index = m_items.first()->modelIndex(); + while (m_items.count() < maxCount) { + index = m_itemView->previousIndex(index); + + if (!index.isValid()) + break; + + insertItem(0, index); + } + } + + QRectF viewRect = boundingRect(); + + while (m_items.count() > maxCount) { + int firstVisible = 0; + int lastVisible = 0; + findFirstAndLastVisibleBufferIndex(firstVisible, lastVisible, viewRect, false); + + AbstractViewItem* item = 0; + if (lastVisible != m_items.count() - 1) { + item = m_items.takeLast(); + } + else if (firstVisible != 0 && m_items.first()->modelIndex().row() != firstVisible-1) { + item = m_items.takeFirst(); + } + else { + // All the items are visible. Take the item at the end of the buffer. + item = m_items.takeLast(); + } + + m_items.removeOne(item); + removeItemFromVisibleLayout(item); + delete item; + } +} + +void AbstractItemContainer::insertItem(int pos, const QModelIndex &index) +{ + AbstractViewItem *item = 0; + if (m_prototype) + item = m_prototype->newItemInstance(); + + if (item) { + item->setModel(m_itemView->model()); + item->setModelIndex(index); + item->setTwoColumns(m_twoColumns); + m_items.insert(pos, item); + addItemToVisibleLayout(pos, item); + item->updateItemContents(); + if (pos == 0) + m_itemView->scrollContentsBy(qreal(0.0), + item->effectiveSizeHint(Qt::PreferredSize).height()); + } +} + +void AbstractItemContainer::findFirstAndLastVisibleBufferIndex(int &firstVisibleBufferIndex, + int &lastVisibleBufferIndex, + const QRectF &viewRect, + bool fullyVisible) const +{ + if (layout() && !layout()->isActivated()) + layout()->activate(); + + firstVisibleBufferIndex = -1; + lastVisibleBufferIndex = -1; + + int count = m_items.count(); + for (int i = 0; i < count; ++i) { + if (itemVisibleInView(m_items.at(i), viewRect, fullyVisible)) { + if (firstVisibleBufferIndex == -1) + firstVisibleBufferIndex = i; + lastVisibleBufferIndex = i; + } + else if ( lastVisibleBufferIndex != -1 ) + break; // lastVisibleBufferIndex is already set + } +} + +/*virtual*/ +int AbstractItemContainer::maxItemCountInItemBuffer() const +{ + if (m_itemView && !m_itemView->boundingRect().isEmpty()) + { + return m_itemView->indexCount(); + } + return 0; +} + + +void AbstractItemContainer::themeChange() +{ + for (int i = 0; i <m_items.count(); ++i) + m_items.at(i)->themeChange(); +} + +void AbstractItemContainer::updateContent() +{ + for (int i = 0; i <m_items.count(); ++i) + m_items.at(i)->updateItemContents(); +} + +#if (QT_VERSION >= 0x040600) +void AbstractItemContainer::setSubtreeCacheEnabled(bool enabled) +{ + for (int i = 0; i <m_items.count(); ++i) + m_items.at(i)->setSubtreeCacheEnabled(enabled); + if (m_prototype) + m_prototype->setSubtreeCacheEnabled(enabled); +} +#endif + +void AbstractItemContainer::setTwoColumns(const bool enabled) +{ + if (m_twoColumns == enabled) + return; + + m_twoColumns = enabled; + + for (int i = 0; i < m_items.count(); ++i) + m_items.at(i)->setTwoColumns(enabled); +} + +bool AbstractItemContainer::twoColumns() +{ + return m_twoColumns; +} + diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/abstractitemcontainer.h b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/abstractitemcontainer.h new file mode 100644 index 0000000..026bd11 --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/abstractitemcontainer.h @@ -0,0 +1,111 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the examples 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 Technology Preview License Agreement accompanying +** this package. +** +** 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.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef ABSTRACTITEMCONTAINER_H +#define ABSTRACTITEMCONTAINER_H + +#include <QModelIndex> + +#include "gvbwidget.h" + +class QGraphicsWidget; +class AbstractItemView; +class AbstractViewItem; + +class AbstractItemContainer : public GvbWidget +{ + Q_OBJECT +public: + AbstractItemContainer(int bufferSize, QGraphicsWidget *parent=0); + virtual ~AbstractItemContainer(); + + virtual void addItem(const QModelIndex &index); + virtual void removeItem(const QModelIndex &index); + + virtual void setItemView(AbstractItemView *view); + virtual void setItemPrototype(AbstractViewItem *ptype); + virtual void reset(); + virtual int itemCount() const; + virtual AbstractViewItem* itemAt(const int row) const; + AbstractViewItem* findItemByIndex(const QModelIndex &index) const; + AbstractViewItem *prototype(); + AbstractViewItem *firstItem(); + void updateContent(); + void themeChange(); + int bufferSize() const; + virtual void setTwoColumns(const bool enabled); + bool twoColumns(); + +#if (QT_VERSION >= 0x040600) + void setSubtreeCacheEnabled(const bool enabled); + virtual void setListItemCaching(const bool enabled, const int index) = 0; +#endif + +protected: + virtual void adjustVisibleContainerSize(const QSizeF &size) = 0; + virtual void addItemToVisibleLayout(int index, AbstractViewItem *item) = 0; + virtual void removeItemFromVisibleLayout(AbstractViewItem *item) = 0; + + virtual bool event(QEvent *e); + virtual bool eventFilter(QObject *obj, QEvent *event); + virtual QVariant itemChange(GraphicsItemChange change, const QVariant &value); + virtual int maxItemCountInItemBuffer() const; + bool itemVisibleInView(AbstractViewItem* item, const QRectF &viewRect, bool fullyVisible = true) const; + +protected: + void updateItemBuffer(); + void findFirstAndLastVisibleBufferIndex(int &firstVisibleBufferIndex, + int &lastVisibleBufferIndex, + const QRectF &viewRect, + bool fullyVisible) const; + QList<AbstractViewItem*> m_items; + AbstractItemView *m_itemView; + AbstractViewItem *m_prototype; + int m_bufferSize; + +private: + void insertItem(int pos, const QModelIndex &index); + bool m_twoColumns; + + Q_DISABLE_COPY(AbstractItemContainer) +}; + +#endif // ABSTRACTITEMCONTAINER_H diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/abstractitemview.cpp b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/abstractitemview.cpp new file mode 100644 index 0000000..fe03a21 --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/abstractitemview.cpp @@ -0,0 +1,443 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the examples 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 Technology Preview License Agreement accompanying +** this package. +** +** 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.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include <QGraphicsLayout> + +#include "abstractitemview.h" +#include "abstractviewitem.h" +#include "scrollbar.h" + +AbstractItemView::AbstractItemView(QGraphicsWidget *parent) + : AbstractScrollArea(parent), + m_model(0), + m_rootIndex(), + m_container(0), + m_selectionModel(0), + m_currentIndex(), + m_scroller() +{ + setRootIndex(QModelIndex()); +} + +/*virtual*/ +AbstractItemView::~AbstractItemView() +{ +} + +/*virtual*/ +void AbstractItemView::setModel(QAbstractItemModel *model, AbstractViewItem *prototype) +{ + if( m_model == model || !model) + return; + + if (m_model) { + disconnect(m_model, SIGNAL(destroyed()), + this, SLOT(_q_modelDestroyed())); + disconnect(m_model, SIGNAL(dataChanged(QModelIndex,QModelIndex)), + this, SLOT( dataChanged(QModelIndex,QModelIndex))); + disconnect(m_model, SIGNAL(rowsInserted(QModelIndex,int,int)), + this, SLOT(rowsInserted(QModelIndex,int,int))); + disconnect(m_model, SIGNAL(rowsRemoved(QModelIndex,int,int)), + this, SLOT(rowsRemoved(QModelIndex,int,int))); + disconnect(m_model, SIGNAL(rowsAboutToBeRemoved(QModelIndex,int,int)), + this, SLOT(rowsAboutToBeRemoved(QModelIndex,int,int))); + disconnect(m_model, SIGNAL(rowsAboutToBeInserted(QModelIndex,int,int)), + this, SLOT(rowsAboutToBeInserted(QModelIndex,int,int))); + disconnect(m_model, SIGNAL(columnsInserted(QModelIndex,int,int)), + this, SLOT(columnsInserted(QModelIndex,int,int))); + disconnect(m_model, SIGNAL(columnsAboutToBeInserted(QModelIndex,int,int)), + this, SLOT(columnsAboutToBeInserted(QModelIndex,int,int))); + disconnect(m_model, SIGNAL(columnsRemoved(QModelIndex,int,int)), + this, SLOT(columnsRemoved(QModelIndex,int,int))); + disconnect(m_model, SIGNAL(columnsAboutToBeRemoved(QModelIndex,int,int)), + this, SLOT(columnsAboutToBeRemoved(QModelIndex,int,int))); + disconnect(m_model, SIGNAL(modelReset()), this, SLOT(reset())); + disconnect(m_model, SIGNAL(layoutChanged()), this, SLOT(_q_layoutChanged())); + + m_model = 0; + } + + setSelectionModel(0); + + m_currentIndex = QModelIndex(); + m_rootIndex = QModelIndex(); + + m_model = model; + + Q_ASSERT_X(m_model->index(0,0) == m_model->index(0,0), + "AbstractItemView::setModel", + "A model should return the exact same index " + "(including its internal id/pointer) when asked for it twice in a row."); + Q_ASSERT_X(m_model->index(0,0).parent() == QModelIndex(), + "AbstractItemView::setModel", + "The parent of a top level index should be invalid"); + + + connect(m_model, SIGNAL(destroyed()), this, SLOT(modelDestroyed())); + connect(m_model, SIGNAL(dataChanged(QModelIndex,QModelIndex)), + this, SLOT( dataChanged(QModelIndex,QModelIndex))); + connect(m_model, SIGNAL(rowsAboutToBeInserted(QModelIndex,int,int)), + this, SLOT(rowsAboutToBeInserted(QModelIndex,int,int))); + connect(m_model, SIGNAL(rowsInserted(QModelIndex,int,int)), + this, SLOT(rowsInserted(QModelIndex,int,int))); + connect(m_model, SIGNAL(rowsAboutToBeRemoved(QModelIndex,int,int)), + this, SLOT(rowsAboutToBeRemoved(QModelIndex,int,int))); + connect(m_model, SIGNAL(rowsRemoved(QModelIndex,int,int)), + this, SLOT(rowsRemoved(QModelIndex,int,int))); + connect(m_model, SIGNAL(modelReset()), this, SLOT(reset())); + connect(m_model, SIGNAL(layoutChanged()), this, SLOT(layoutChanged())); + + setSelectionModel(new QItemSelectionModel(m_model)); + + if (prototype && m_container) { + m_container->setItemPrototype(prototype); + m_container->reset(); + } +} + +/*virtual*/ +void AbstractItemView::setContainer(AbstractItemContainer *container) +{ + m_container = container; + m_container->setItemView(this); + m_container->setParentItem(viewport()); + + viewport()->setFlag( + QGraphicsItem::ItemClipsChildrenToShape, true); + m_scroller.setScrollable(this); + installEventFilter(&m_scroller); +} + +/*virtual*/ +void AbstractItemView::setRootIndex(const QModelIndex &index) +{ + m_rootIndex = index; + // TODO fix this if we change index, container should be updated? Or do we need root index? +} + +/*virtual*/ +int AbstractItemView::indexCount() const +{ + if (m_model) + return m_model->rowCount(m_rootIndex); + return 0; +} + +/*virtual*/ +QAbstractItemModel* AbstractItemView::model() const +{ + return m_model; +} + +/*virtual*/ +QModelIndex AbstractItemView::nextIndex(const QModelIndex &index) const +{ + if (!m_model) + return QModelIndex(); + + if (index.isValid()) + return m_model->index(index.row() + 1, 0, m_rootIndex); + else + return m_model->index(0, 0, m_rootIndex); +} + +/*virtual*/ +QModelIndex AbstractItemView::previousIndex(const QModelIndex &index) const +{ + if (!m_model) + return QModelIndex(); + + if (index.isValid()) + return m_model->index(index.row() - 1, 0, m_rootIndex); + else + return m_model->index(m_model->rowCount(m_rootIndex) - 1, 0, m_rootIndex); +} + +/*virtual*/ +void AbstractItemView::setItemPrototype(AbstractViewItem* prototype) +{ + if (prototype && m_container) { + m_container->setItemPrototype(prototype); + m_container->reset(); + } +} + +void AbstractItemView::setSelectionModel(QItemSelectionModel *smodel) +{ + if (smodel && smodel->model() != m_model) { + return; + } + if (m_selectionModel) { + disconnect(m_selectionModel, SIGNAL(selectionChanged(QItemSelection, QItemSelection)), + this, SLOT(currentSelectionChanged(QItemSelection, QItemSelection))); + + disconnect(m_selectionModel, SIGNAL(currentChanged(QModelIndex, QModelIndex)), + this, SLOT(currentIndexChanged(QModelIndex, QModelIndex))); + + delete m_selectionModel; + m_selectionModel = 0; + } + + m_selectionModel = smodel; + + if (m_selectionModel) { + connect(m_selectionModel, SIGNAL(selectionChanged(QItemSelection, QItemSelection)), + this, SLOT(currentSelectionChanged(QItemSelection, QItemSelection))); + connect(m_selectionModel, SIGNAL(currentChanged(QModelIndex, QModelIndex)), + this, SLOT(currentIndexChanged(QModelIndex, QModelIndex))); + } +} + +/*virtual*/ +void AbstractItemView::currentIndexChanged(const QModelIndex ¤t, const QModelIndex &previous) +{ + Q_UNUSED(previous) + + if (current != m_currentIndex) + m_currentIndex = current; +} + +/*virtual*/ +void AbstractItemView::currentSelectionChanged(const QItemSelection &selected, + const QItemSelection &deselected) +{ + Q_UNUSED(selected) + Q_UNUSED(deselected) +} + +/*virtual*/ +void AbstractItemView::dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight) +{ + Q_UNUSED(topLeft) + Q_UNUSED(bottomRight) + // TODO implement if we like to edit view items. +} + +/*virtual*/ +void AbstractItemView::rowsAboutToBeInserted(const QModelIndex &index, int start, int end) +{ + Q_UNUSED(index) + Q_UNUSED(start) + Q_UNUSED(end) + + // TODO implement +} + + +/*virtual*/ +void AbstractItemView::rowsAboutToBeRemoved(const QModelIndex &index,int start, int end) +{ + Q_UNUSED(index) + Q_UNUSED(start) + Q_UNUSED(end) +} + +/*virtual*/ +void AbstractItemView::rowsRemoved(const QModelIndex &parent,int start, int end) +{ + Q_UNUSED(parent) + Q_UNUSED(start) + Q_UNUSED(end) + + if (start <= m_currentIndex.row() && m_currentIndex.row() <= end) { + QModelIndex newCurrentIndex = m_model->index(start, 0, m_rootIndex); + if (!newCurrentIndex.isValid()) { + newCurrentIndex = m_model->index(qMax(0,start - 1), 0, m_rootIndex); + } + + if (m_selectionModel) { + m_selectionModel->setCurrentIndex(newCurrentIndex, QItemSelectionModel::NoUpdate); + } + } + for (int i = end; i >= start; --i) //The items are already removed from the model. + m_container->removeItem(QModelIndex()); // Indexes are already invalid. +} + +/*virtual*/ +void AbstractItemView::reset() +{ + m_rootIndex = QModelIndex(); + + if (m_container) + m_container->reset(); + + setCurrentIndex(QModelIndex()); + + ScrollBar *sb = verticalScrollBar(); + + if (sb) + sb->setSliderSize(0); +} + +/*virtual*/ +void AbstractItemView::rowsInserted(const QModelIndex &parent, int start, int end) +{ + if (!m_container) + return; + + for (int i = start; i <= end; ++i) + m_container->addItem(m_model->index(i, 0, parent)); + + refreshContainerGeometry(); +} + +/*virtual*/ +void AbstractItemView::modelDestroyed() +{ + m_model = 0; + setSelectionModel(0); + reset(); +} + +/*virtual*/ +void AbstractItemView::layoutChanged() +{ + m_container->reset(); +} + +bool AbstractItemView::event(QEvent *e) +{ + bool result = AbstractScrollArea::event(e); + if (e && e->type()==QEvent::LayoutRequest) { + refreshContainerGeometry(); + result = true; + } + if (e && e->type()==QEvent::GraphicsSceneResize) { + m_scroller.stopScrolling(); + refreshContainerGeometry(); + + m_container->resize(this->size().width()-verticalScrollBar()->size().width(), + m_container->preferredHeight()); + + if(verticalScrollBar()->sliderPosition() > verticalScrollBar()->sliderSize()) + verticalScrollBar()->setSliderPosition(verticalScrollBar()->sliderSize()); + + result = true; + } + return result; +} + +void AbstractItemView::setCurrentIndex(const QModelIndex &index, QItemSelectionModel::SelectionFlags selectionFlag) +{ + if (m_selectionModel) + m_selectionModel->setCurrentIndex(index, selectionFlag); +} + +void AbstractItemView::refreshContainerGeometry() +{ + if (!m_container || !m_model) + return; + + if (m_container->layout() && !m_container->layout()->isActivated()) + m_container->layout()->activate(); + + ScrollBar *sb = verticalScrollBar(); + + if (sb) { + AbstractViewItem *item = m_container->itemAt(0); + if (item) { + qreal oneItemH = item->size().height(); + sb->setSliderSize(oneItemH*m_model->rowCount(m_rootIndex)-size().height()); + } + if (!sb->isVisible() && verticalScrollBarPolicy() != Qt::ScrollBarAlwaysOff && + contentsRect().height() < m_container->boundingRect().height()) + sb->show(); + } +} + +void AbstractItemView::scrollContentsBy(qreal dx, qreal dy) +{ + AbstractScrollArea::scrollContentsBy(dx, dy); + + if (!viewport() || !m_container || (m_container && m_container->itemCount() <= 0) || + !m_model || (m_model && m_model->rowCount() <= 0) || + (viewport() && viewport()->boundingRect().height() < contentsRect().height())) + return; + + qreal itemH = 1; + + AbstractViewItem *item = m_container->itemAt(0); + if(item && item->size().height() > 1) { + itemH = item->size().height(); + } + else if(item && item->preferredHeight() > 1) { + itemH = item->preferredHeight(); + } + + qreal vpx = m_container->pos().x(); + qreal vpy = m_container->pos().y(); + + if ((vpy+m_container->size().height()-dy > pos().y()+size().height()) && + (qAbs(dy) < itemH) && (vpy-dy <= 0)) { + m_container->setPos(vpx, vpy-dy); + } + else { + qreal vPos = verticalScrollBar()->sliderPosition(); + int startRow = m_model->index(vPos/itemH, 0).row(); + int itemsInContainer = m_container->itemCount(); + + for (int i = 0; i<itemsInContainer; ++i) { + AbstractViewItem *changedItem = m_container->itemAt(i); + changedItem->setModelIndex(m_model->index(startRow+i,0)); +#if (QT_VERSION >= 0x040600) + m_container->setListItemCaching(listItemCaching(), i); +#endif + } + + qreal diff = vPos-startRow*itemH; + + if (diff < 0) + m_container->setPos(vpx, diff); + else + m_container->setPos(vpx, -diff); + } +} + +void AbstractItemView::changeTheme() +{ + if (m_container) + m_container->themeChange(); +} + +void AbstractItemView::updateViewContent() +{ + if (m_container) + m_container->updateContent(); +} diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/abstractitemview.h b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/abstractitemview.h new file mode 100644 index 0000000..2e191a1 --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/abstractitemview.h @@ -0,0 +1,118 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the examples 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 Technology Preview License Agreement accompanying +** this package. +** +** 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.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef ABSTRACTITEMVIEW_H +#define ABSTRACTITEMVIEW_H + +#include <QAbstractItemModel> +#include <QGraphicsSceneResizeEvent> +#include <QPersistentModelIndex> +#include <QItemSelection> + +#include "listitemcontainer.h" +#include "abstractscrollarea.h" +#include "scroller.h" + +class QItemSelectionModel; + +class AbstractItemView : public AbstractScrollArea +{ + Q_OBJECT +public: + AbstractItemView(QGraphicsWidget *parent = 0); + virtual ~AbstractItemView(); + virtual void setContainer(AbstractItemContainer *container); + virtual void setModel(QAbstractItemModel *model, AbstractViewItem *prototype); + virtual QAbstractItemModel* model() const; + virtual void setItemPrototype(AbstractViewItem* prototype); + + void setSelectionModel(QItemSelectionModel *smodel); + + virtual QModelIndex nextIndex(const QModelIndex &index) const; + virtual QModelIndex previousIndex(const QModelIndex &index) const; + + virtual int indexCount() const; + + void refreshContainerGeometry(); // TODO Can this be moved to scroll area? + + void updateViewContent(); + virtual void scrollContentsBy(qreal dx, qreal dy); + +#if (QT_VERSION >= 0x040600) + virtual bool listItemCaching() const = 0; + virtual void setListItemCaching(bool enabled) = 0; +#endif + +protected: + virtual bool event(QEvent *e); + void changeTheme(); + +public slots: + virtual void setRootIndex(const QModelIndex &index); + void setCurrentIndex(const QModelIndex &index, + QItemSelectionModel::SelectionFlags selectionFlag = QItemSelectionModel::NoUpdate); +protected slots: + virtual void currentIndexChanged(const QModelIndex ¤t, const QModelIndex &previous); + virtual void currentSelectionChanged(const QItemSelection &selected, const QItemSelection &deselected); + virtual void dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight); + virtual void rowsAboutToBeInserted(const QModelIndex &index, int start, int end); + virtual void rowsInserted(const QModelIndex &parent, int start, int end); + virtual void rowsAboutToBeRemoved(const QModelIndex &index,int start, int end); + virtual void rowsRemoved(const QModelIndex &parent,int start, int end); + virtual void modelDestroyed(); + virtual void layoutChanged(); + virtual void reset(); + +protected: + + QAbstractItemModel *m_model; + QPersistentModelIndex m_rootIndex; + AbstractItemContainer *m_container; + QItemSelectionModel *m_selectionModel; + QPersistentModelIndex m_currentIndex; + +private: + Q_DISABLE_COPY(AbstractItemView) + Scroller m_scroller; +}; + + +#endif // ABSTRACTITEMVIEW_H diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/abstractscrollarea.cpp b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/abstractscrollarea.cpp new file mode 100644 index 0000000..f6d7a6c --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/abstractscrollarea.cpp @@ -0,0 +1,249 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the examples 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 Technology Preview License Agreement accompanying +** this package. +** +** 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.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <QGraphicsSceneResizeEvent> +#include <QGraphicsWidget> +#include <QDebug> +#include "abstractscrollarea.h" +#include "scrollbar.h" + +AbstractScrollArea::AbstractScrollArea(QGraphicsWidget *parent) + : GvbWidget(parent) + , m_viewport(0) + , m_horizontalScrollBar(0) + , m_verticalScrollBar(0) + , m_prevHorizontalValue(0.0) + , m_prevVerticalValue(0.0) +{ + setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); + setContentsMargins(0, 0, 0, 0); + + m_horizontalScrollBar = new ScrollBar(Qt::Horizontal, this); + m_horizontalScrollBar->hide(); + m_horizontalScrollBar->setContentsMargins(0, 0, 0, 0); + m_horizontalScrollBarPolicy = Qt::ScrollBarAsNeeded; + m_horizontalScrollBar->setZValue(zValue()+1); // Raise scroll bar to top + m_horizontalScrollBar->setVisible(false); + + connect(m_horizontalScrollBar, SIGNAL(sliderPositionChange(qreal)), + this, SLOT(horizontalScroll(qreal))); + connect(m_horizontalScrollBar, SIGNAL(sliderPressed()), + this, SLOT(horizontalScrollStart())); + + m_verticalScrollBar = new ScrollBar(Qt::Vertical, this); + m_verticalScrollBar->hide(); + m_verticalScrollBar->setContentsMargins(0, 0, 0, 0); + m_verticalScrollBarPolicy = Qt::ScrollBarAsNeeded; + m_verticalScrollBar->setZValue(zValue()+1); // Raise scroll bar to top + m_verticalScrollBar->setVisible(false); + + connect(m_verticalScrollBar, SIGNAL(sliderPositionChange(qreal)), + this, SLOT(verticalScroll(qreal))); + connect(m_verticalScrollBar, SIGNAL(sliderPressed()), + this, SLOT(verticalScrollStart())); + + QGraphicsWidget *viewport = new QGraphicsWidget; + setViewport(viewport); +} + +AbstractScrollArea::~AbstractScrollArea() +{ +} + +ScrollBar *AbstractScrollArea::verticalScrollBar() const +{ + return m_verticalScrollBar; +} + +ScrollBar *AbstractScrollArea::horizontalScrollBar() const +{ + return m_horizontalScrollBar; +} + +void AbstractScrollArea::setHorizontalScrollBarPolicy(Qt::ScrollBarPolicy policy) +{ + m_horizontalScrollBarPolicy = policy; +} + +void AbstractScrollArea::setVerticalScrollBarPolicy(Qt::ScrollBarPolicy policy) +{ + m_verticalScrollBarPolicy = policy; +} + +Qt::ScrollBarPolicy AbstractScrollArea::verticalScrollBarPolicy() const +{ + return m_verticalScrollBarPolicy; +} + +Qt::ScrollBarPolicy AbstractScrollArea::horizontalScrollBarPolicy() const +{ + return m_horizontalScrollBarPolicy; +} + +QGraphicsWidget *AbstractScrollArea::viewport() const +{ + return m_viewport; +} + +void AbstractScrollArea::setViewport(QGraphicsWidget *viewport) +{ + if (m_viewport) { + m_viewport->setParentItem(0); + + QList<QGraphicsItem*> children = m_viewport->childItems(); + + foreach (QGraphicsItem *child, children) + child->setParentItem(0); + + delete m_viewport; + } + + m_viewport = viewport; + + if (viewport) { + + m_viewport->setParentItem(this); + m_viewport->setContentsMargins(0, 0, 0, 0); + + adjustScrollBars(); + } + + emit viewportChanged(viewport); +} + +bool AbstractScrollArea::event(QEvent *e) +{ + if (e->type() == QEvent::ApplicationLayoutDirectionChange + || e->type() == QEvent::LayoutDirectionChange) { + } else if (e->type() == QEvent::GraphicsSceneResize) { + QGraphicsSceneResizeEvent *event = + static_cast<QGraphicsSceneResizeEvent*>(e); + + QSizeF newSize = event->newSize(); + QRectF hrect = m_horizontalScrollBar->boundingRect(); + QRectF vrect = m_verticalScrollBar->boundingRect(); + + QSizeF vpSize = newSize; + + if (m_horizontalScrollBarPolicy != Qt::ScrollBarAlwaysOff) + vpSize.setHeight(newSize.height() - hrect.height()); + if (m_verticalScrollBarPolicy != Qt::ScrollBarAlwaysOff) + vpSize.setWidth(newSize.width() - vrect.width()); + + m_viewport->resize(vpSize); + + adjustScrollBars(); + } + + return QGraphicsWidget::event(e); +} + + +void AbstractScrollArea::scrollContentsBy(qreal dx, qreal dy) +{ + Q_UNUSED(dx) + Q_UNUSED(dy) + prepareGeometryChange(); +} + +void AbstractScrollArea::verticalScrollStart() +{ + m_prevVerticalValue = m_verticalScrollBar->sliderPosition(); +} + +void AbstractScrollArea::verticalScroll(qreal value) +{ + qreal dy = value - m_prevVerticalValue; + if (!qFuzzyCompare(dy,qreal(0.0))) { + scrollContentsBy(0.0, dy); + m_prevVerticalValue = value; + } +} + +void AbstractScrollArea::horizontalScrollStart() +{ + m_prevHorizontalValue = m_horizontalScrollBar->sliderPosition(); +} + +void AbstractScrollArea::horizontalScroll(qreal value) +{ + qreal dx = value - m_prevHorizontalValue; + if (!qFuzzyCompare(dx,qreal(0.0))) { + scrollContentsBy(dx, 0.0); + m_prevHorizontalValue = value; + } +} + +void AbstractScrollArea::adjustScrollBars() +{ + if (m_horizontalScrollBarPolicy == Qt::ScrollBarAlwaysOff) { + m_horizontalScrollBar->hide(); + } else { + m_horizontalScrollBar->show(); + + QRectF sbgeom = boundingRect(); + + sbgeom.setTop(sbgeom.bottom() - m_horizontalScrollBar->boundingRect().height()); + sbgeom.setRight(sbgeom.right() - m_verticalScrollBar->boundingRect().width()); + m_horizontalScrollBar->setGeometry(sbgeom); + } + + if (m_verticalScrollBarPolicy == Qt::ScrollBarAlwaysOff) { + m_verticalScrollBar->hide(); + QRectF sbgeom = boundingRect(); + sbgeom.setLeft(sbgeom.right()); + sbgeom.setBottom(sbgeom.bottom()); + m_verticalScrollBar->setGeometry(sbgeom); + } else { + m_verticalScrollBar->show(); + + QRectF sbgeom = boundingRect(); + + sbgeom.setLeft(sbgeom.right() - m_verticalScrollBar->boundingRect().width()); + if (m_horizontalScrollBarPolicy != Qt::ScrollBarAlwaysOff) + sbgeom.setBottom(sbgeom.bottom() - m_horizontalScrollBar->boundingRect().height()); + m_verticalScrollBar->setGeometry(sbgeom); + } +} + + + + diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/abstractscrollarea.h b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/abstractscrollarea.h new file mode 100644 index 0000000..5e15d52 --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/abstractscrollarea.h @@ -0,0 +1,101 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the examples 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 Technology Preview License Agreement accompanying +** this package. +** +** 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.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef ABSTRACTSCROLLAREA_H +#define ABSTRACTSCROLLAREA_H + +#include "gvbwidget.h" + +class ScrollBar; +class QGraphicsGridLayout; + +class AbstractScrollArea : public GvbWidget +{ + Q_OBJECT + +public: + + AbstractScrollArea(QGraphicsWidget *parent = 0); + ~AbstractScrollArea(); + +public: + + void setHorizontalScrollBarPolicy(Qt::ScrollBarPolicy policy); + void setVerticalScrollBarPolicy(Qt::ScrollBarPolicy policy); + Qt::ScrollBarPolicy verticalScrollBarPolicy() const; + Qt::ScrollBarPolicy horizontalScrollBarPolicy() const; + + QGraphicsWidget *viewport() const; + void setViewport(QGraphicsWidget *viewport); + + ScrollBar *verticalScrollBar() const; + ScrollBar *horizontalScrollBar() const; + +signals: + + void viewportChanged(QGraphicsWidget *viewport); + +protected: + + virtual bool event(QEvent *e); + virtual void scrollContentsBy(qreal dx, qreal dy); + +private slots: + + void verticalScrollStart(); + void verticalScroll(qreal); + void horizontalScrollStart(); + void horizontalScroll(qreal); + +private: + + void adjustScrollBars(); + + QGraphicsWidget *m_viewport; + ScrollBar *m_horizontalScrollBar; + ScrollBar *m_verticalScrollBar; + Qt::ScrollBarPolicy m_verticalScrollBarPolicy; + Qt::ScrollBarPolicy m_horizontalScrollBarPolicy; + qreal m_prevHorizontalValue; + qreal m_prevVerticalValue; +}; + +#endif // ABSTRACTSCROLLAREA_H diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/abstractviewitem.cpp b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/abstractviewitem.cpp new file mode 100644 index 0000000..528bd87 --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/abstractviewitem.cpp @@ -0,0 +1,117 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the examples 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 Technology Preview License Agreement accompanying +** this package. +** +** 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.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "abstractviewitem.h" + +AbstractViewItem::AbstractViewItem(QGraphicsWidget *parent) + : GvbWidget(parent), + m_index(), + m_itemView(0), + m_prototype(0) +{ +} + +/*virtual*/ +AbstractViewItem::~AbstractViewItem() +{ +} + +QModelIndex AbstractViewItem::modelIndex() const +{ + return m_index; +} + +AbstractViewItem *AbstractViewItem::prototype() const +{ + return m_prototype; +} + +AbstractItemView *AbstractViewItem::itemView() const +{ + return m_itemView; +} + +void AbstractViewItem::setItemView(AbstractItemView *itemView) +{ + m_itemView = itemView; +} + +void AbstractViewItem::setModelIndex(const QModelIndex &index) +{ + if (m_index != index) { + m_index = index; + updateItemContents(); + } +} + +/*virtual*/ +QSizeF AbstractViewItem::effectiveSizeHint(Qt::SizeHint which, const QSizeF &constraint) const +{ + return GvbWidget::effectiveSizeHint(which, constraint); +} + +/*virtual*/ +bool AbstractViewItem::event(QEvent *e) +{ + return QGraphicsWidget::event(e); +} + +/*virtual*/ +void AbstractViewItem::updateItemContents() +{ + ; // No impl yet +} + +/*virtual*/ +void AbstractViewItem::themeChange() +{ + ; // No impl yet +} + +#if (QT_VERSION >= 0x040600) +/*virtual*/ +void AbstractViewItem::setSubtreeCacheEnabled(bool enabled) +{ + Q_UNUSED(enabled) + ; // No impl +} +#endif + diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/abstractviewitem.h b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/abstractviewitem.h new file mode 100644 index 0000000..3649cb0 --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/abstractviewitem.h @@ -0,0 +1,96 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the examples 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 Technology Preview License Agreement accompanying +** this package. +** +** 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.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef ABSTRACTVIEWITEM_H +#define ABSTRACTVIEWITEM_H + +#include <QModelIndex> + +#include "gvbwidget.h" +#include "abstractitemview.h" +#include "listitem.h" + +class QGraphicsWidget; + +class AbstractViewItem : public GvbWidget +{ + Q_OBJECT +public: + AbstractViewItem(QGraphicsWidget *parent = 0); + virtual ~AbstractViewItem(); + + virtual AbstractViewItem *newItemInstance() = 0; + + QModelIndex modelIndex() const; + + void setModelIndex(const QModelIndex &index); + + AbstractViewItem *prototype() const; + AbstractItemView *itemView() const; + void setItemView(AbstractItemView *itemView) ; + virtual void updateItemContents(); + virtual void themeChange(); + +#if (QT_VERSION >= 0x040600) + virtual void setSubtreeCacheEnabled(bool enabled); +#endif + + virtual QSizeF effectiveSizeHint(Qt::SizeHint which, const QSizeF &constraint = QSizeF()) const; + + virtual void setModel(QAbstractItemModel *model) = 0; + virtual QVariant data(int role) const = 0; + virtual void setData(const QVariant &value, int role = Qt::DisplayRole) = 0; + virtual void setTwoColumns(const bool enabled) = 0; + +protected: + virtual bool event(QEvent *e); + + QPersistentModelIndex m_index; + +private: + Q_DISABLE_COPY(AbstractViewItem) + + AbstractItemView *m_itemView; + AbstractViewItem *m_prototype; + +}; + +#endif // ABSTRACTVIEWITEM_H diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/backgrounditem.cpp b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/backgrounditem.cpp new file mode 100644 index 0000000..e4cef5d --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/backgrounditem.cpp @@ -0,0 +1,85 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the examples 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 Technology Preview License Agreement accompanying +** this package. +** +** 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.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <QStyleOptionGraphicsItem> +#include <QGraphicsSceneResizeEvent> +#include <QPainter> +#include <QRectF> + +#include "backgrounditem.h" +#include "theme.h" + +BackgroundItem::BackgroundItem(const QString &filename, QGraphicsWidget *parent) + : GvbWidget(parent), + m_background(), + m_fileName(filename) +{ + setContentsMargins(0,0,0,0); + + connect(Theme::p(), SIGNAL(themeChanged()), this, SLOT(themeChange())); +} + +BackgroundItem::~BackgroundItem() +{ + +} + +void BackgroundItem::resizeEvent(QGraphicsSceneResizeEvent *event) +{ + GvbWidget::resizeEvent(event); + m_background = Theme::p()->pixmap(m_fileName, size().toSize()); +} + +void BackgroundItem::paint(QPainter *painter, + const QStyleOptionGraphicsItem *option, + QWidget *widget) +{ + Q_UNUSED(widget) + painter->setCompositionMode(QPainter::CompositionMode_Source); + painter->drawPixmap(option->exposedRect, m_background, option->exposedRect); +} + +void BackgroundItem::themeChange() +{ + m_background = Theme::p()->pixmap(m_fileName, size().toSize()); + update(); +} + diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/backgrounditem.h b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/backgrounditem.h new file mode 100644 index 0000000..e69dbfe --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/backgrounditem.h @@ -0,0 +1,72 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the examples 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 Technology Preview License Agreement accompanying +** this package. +** +** 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.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef __BACKGROUNDITEM_H__ +#define __BACKGROUNDITEM_H__ + +#include <QPixmap> + +#include "gvbwidget.h" + +class QGraphicsWidget; + +class BackgroundItem : public GvbWidget +{ + Q_OBJECT + +public: + BackgroundItem(const QString &filename, QGraphicsWidget *parent=0); + ~BackgroundItem(); + + void paint(QPainter *painter, + const QStyleOptionGraphicsItem *option, + QWidget *widget = 0); + void resizeEvent(QGraphicsSceneResizeEvent *event); + +public slots: + void themeChange(); + +private: + QPixmap m_background; + QString m_fileName; +}; + +#endif /* __BACKGROUNDITEM_H__ */ diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/button.cpp b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/button.cpp new file mode 100644 index 0000000..3380ea4 --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/button.cpp @@ -0,0 +1,209 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the examples 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 Technology Preview License Agreement accompanying +** this package. +** +** 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.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <QtGui> +#include "button.h" +#include "theme.h" + +static const int MinTextWidthAsChars = 8; + +class ButtonPrivate { + Q_DECLARE_PUBLIC(Button) + +public: + + ButtonPrivate(Button *button) + : down(false) + , q_ptr(button) + { + textItem = new QGraphicsSimpleTextItem(q_ptr); + } + + QGraphicsSimpleTextItem *textItem; + bool down; + Button *q_ptr; +}; + +Button::Button(const QString &text, QGraphicsItem *parent, QSizeF minimumSize) + : QGraphicsWidget(parent) + , d_ptr(new ButtonPrivate(this)), m_background(), m_selected(false) +{ + Q_D(Button); + setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Fixed); + //setCacheMode(QGraphicsItem::ItemCoordinateCache); + if(minimumSize.isValid()) + setMinimumSize(minimumSize); + setContentsMargins(0, 0, 0, 0); + d->textItem->setText(text); + prepareGeometryChange(); + + m_font = Theme::p()->font(Theme::MenuItem); + d->textItem->setFont(m_font); + connect(Theme::p(), SIGNAL(themeChanged()), this, SLOT(themeChange())); +} + +Button::~Button() +{ + delete d_ptr; +} + +bool Button::isDown() +{ + Q_D(Button); + + return d->down; +} + +void Button::setText(const QString &text) +{ + Q_D(Button); + d->textItem->setText(text); + update(); +} + +QString Button::text() +{ + Q_D(Button); + return d->textItem->text(); +} + +void Button::paint(QPainter *painter, + const QStyleOptionGraphicsItem *option, + QWidget *widget) +{ + Q_UNUSED(widget); + Q_UNUSED(option); + + if(!m_background.isNull()) + painter->drawPixmap(QPoint(), m_background); + if(m_selected) { + painter->setBrush(Qt::black); + painter->setOpacity(0.2); + painter->drawRect(boundingRect().toRect()); + } +} + +QSizeF Button::sizeHint(Qt::SizeHint which, + const QSizeF &constraint) const +{ + Q_D(const Button); + + switch (which) + { + case Qt::MinimumSize: + { + QFontMetricsF fm(d->textItem->font()); + return QSizeF(MinTextWidthAsChars * fm.maxWidth(), fm.height()); + } + case Qt::PreferredSize: + { + QFontMetricsF fm(d->textItem->font()); + return QSizeF(fm.width(d->textItem->text()), fm.height()); + } + default: + return QGraphicsWidget::sizeHint(which, constraint); + } +} + +void Button::mousePressEvent(QGraphicsSceneMouseEvent *event) +{ + Q_D(Button); + + if (event->button() != Qt::LeftButton || + !sceneBoundingRect().contains(event->scenePos())) + return; + + d->down = true; + + prepareGeometryChange(); + emit pressed(); + +} + +void Button::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) +{ + Q_D(Button); + + if (!d->down || event->button() != Qt::LeftButton) + return; + + d->down = false; + + prepareGeometryChange(); + + emit released(); + + if (sceneBoundingRect().contains(event->scenePos())) + emit clicked(); +} + +void Button::mouseMoveEvent(QGraphicsSceneMouseEvent *event) +{ + Q_UNUSED(event); +} + +void Button::resizeEvent(QGraphicsSceneResizeEvent *event) +{ + Q_D(Button); + QGraphicsWidget::resizeEvent(event); + + QRectF rect = d->textItem->boundingRect(); + QRectF buttonrect = this->boundingRect(); + d->textItem->setPos((buttonrect.width() - rect.width())/2, (buttonrect.height() - rect.height())/2 ); + + QSize currentSize = buttonrect.size().toSize(); + if( m_background.size() != currentSize && (currentSize.width() > 0 && currentSize.height() > 0) ) { + m_background = Theme::p()->pixmap("status_field_middle.svg", buttonrect.size().toSize()); + } +} + +void Button::setBackground(QPixmap& background) +{ + m_background = background; +} + +void Button::themeChange() +{ + Q_D(Button); + + m_font = Theme::p()->font(Theme::MenuItem); + d->textItem->setFont(m_font); +} diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/button.h b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/button.h new file mode 100644 index 0000000..adea9da --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/button.h @@ -0,0 +1,102 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the examples 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 Technology Preview License Agreement accompanying +** this package. +** +** 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.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef BUTTON_H +#define BUTTON_H + +#include <QGraphicsWidget> + +class ButtonPrivate; +class QTextDocument; + +class QPixmap; +class QFont; + +class Button : public QGraphicsWidget +{ + Q_OBJECT + Q_DECLARE_PRIVATE(Button) + +public: + + Button(const QString &text, QGraphicsItem *parent=0, QSizeF minimumSize = QSizeF()); + virtual ~Button(); + +signals: + + void clicked(bool checked = false); + void pressed(); + void released(); + +public slots: + + void themeChange(); + void setText(const QString &text); + QString text(); + +public: + + void setBackground(QPixmap& background); + bool isDown(); + void select(bool select){m_selected = select;} + void click() {emit clicked();} + +private: + + void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, + QWidget *widget = 0); + QSizeF sizeHint(Qt::SizeHint which, + const QSizeF &constraint = QSizeF()) const; + + void mousePressEvent(QGraphicsSceneMouseEvent *event); + void mouseReleaseEvent(QGraphicsSceneMouseEvent *event); + void mouseMoveEvent(QGraphicsSceneMouseEvent *event); + void resizeEvent(QGraphicsSceneResizeEvent *event); + +private: + Q_DISABLE_COPY(Button) + ButtonPrivate *d_ptr; + QPixmap m_background; + QFont m_font; + bool m_selected; +}; + +#endif // BUTTON_H diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/commandline.cpp b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/commandline.cpp new file mode 100644 index 0000000..4fadac6 --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/commandline.cpp @@ -0,0 +1,196 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the examples 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 Technology Preview License Agreement accompanying +** this package. +** +** 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.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <QStringList> +#include <QDebug> + +#include "commandline.h" + +static void usage(const char *appname) +{ + Q_UNUSED(appname); + printf(" GraphicsViewBenchmark related options:\n"); + printf(" -h,-help,--help: This help\n"); + printf(" -resolution : UI resolution in format WxH where width and height are positive values\n"); + printf(" -opengl : Enables OpenGL usage. Building PRECONDITIONS: QT_NO_OPENGL is off.\n"); + printf(" -manual : Run test manually \n"); + printf("\n The following options are available in manual mode:\n"); + printf(" -rotation : UI rotation in degrees\n"); + printf(" -subtree-cache : Enables usage of subtree caching method\n"); + printf(" -fps : Output FPS count to stdout during application execution\n"); + printf(" -items : Count of items created to the list\n"); + printf("\n"); +} + +static inline bool argumentOnlyAvailableInManualMode(const char *arg) +{ + return (strcmp(arg, "-rotation") == 0) + || (strcmp(arg, "-subtree-cache") == 0) + || (strcmp(arg, "-fps") == 0) + || (strcmp(arg, "-items") == 0); +} + +bool readSettingsFromCommandLine(int argc, char *argv[], + Settings& config) +{ + bool builtWithOpenGL = false; + Settings::Options options; + +#ifndef QT_NO_OPENGL + builtWithOpenGL = true; +#endif + for (int i = 1; i < argc; ++i) { + if (strcmp(argv[i], "-manual") == 0) { + options |= Settings::ManualTest; + argv[i] = 0; + break; + } + } + + for (int i = 1; i < argc; ++i) { + if (!argv[i]) + continue; + if (strcmp(argv[i], "-h") == 0 || strcmp(argv[i], "-help") == 0 || strcmp(argv[i], "--help") == 0) { + usage(argv[0]); + return true; + } + if (strcmp(argv[i], "-opengl") == 0) { + if (builtWithOpenGL) { + options |= Settings::UseOpenGL; + argv[i] = 0; + } else { + printf("-opengl parameter can be used only with building PRECONDITIONS: QT_NO_OPENGL is off.\n"); + usage(argv[0]); + return false; + } + } else if (strcmp(argv[i], "-resolution") == 0) { + if (i + 1 >= argc) { + printf("-resolution needs an extra parameter specifying the application UI resolution\n"); + usage(argv[0]); + return false; + } + else { + QStringList res = QString(argv[i+1]).split("x"); + if (res.count() != 2) { + printf("-resolution parameter UI resolution should be set in format WxH where width and height are positive values\n"); + usage(argv[0]); + return false; + } + int width = res.at(0).toInt(); + int height = res.at(1).toInt(); + + config.setSize(QSize(width, height)); + + if (width <=0 || height <=0) { + printf("-resolution parameter UI resolution should be set in format WxH where width and height are positive values\n"); + usage(argv[0]); + return false; + } + argv[i] = 0; + i++; + argv[i] = 0; + } + } + + if (!argv[i]) + continue; + + if (!(options & Settings::ManualTest)) { + if (argumentOnlyAvailableInManualMode(argv[i])) { + printf("\nWrong option: '%s' is only available in manual mode\n\n", argv[i]); + usage(argv[0]); + return false; + } + continue; + } + + if (strcmp(argv[i], "-rotation") == 0) { + if (i + 1 >= argc) { + printf("-rotation needs an extra parameter specifying the application UI rotation in degrees\n"); + usage(argv[0]); + return false; + } + else { + bool ok; + int angle = QString(argv[i+1]).toInt(&ok); + if (!ok) { + printf("-rotation parameter should specify rotation angle in degrees\n"); + usage(argv[0]); + return false; + } + config.setAngle(angle); + argv[i] = 0; + i++; + argv[i] = 0; + } + } else if (strcmp(argv[i], "-subtree-cache") == 0) { + options |= Settings::UseListItemCache; + argv[i] = 0; + } else if (strcmp(argv[i], "-fps") == 0) { + options |= Settings::OutputFps; + argv[i] = 0; + } else if (strcmp(argv[i], "-items") == 0) { + if (i + 1 >= argc) { + printf("-items needs an extra parameter specifying amount of list items\n"); + usage(argv[0]); + return false; + } + else { + bool ok; + int amount = QString(argv[i+1]).toInt(&ok); + if (!ok) { + printf("-items needs an extra parameter specifying amount (integer) of list items\n"); + usage(argv[0]); + return false; + } + config.setListItemCount(amount); + argv[i] = 0; + i++; + argv[i] = 0; + } + } + } + + config.setOptions(options); + + return true; +} + diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/commandline.h b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/commandline.h new file mode 100644 index 0000000..8676d92 --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/commandline.h @@ -0,0 +1,52 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the examples 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 Technology Preview License Agreement accompanying +** this package. +** +** 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.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef COMMANDLINE_H +#define COMMANDLINE_H + +#include "settings.h" + +bool readSettingsFromCommandLine(int argc, + char *argv[], + Settings& settings); + + +#endif // COMMANDLINE_H diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/dummydatagen.cpp b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/dummydatagen.cpp new file mode 100644 index 0000000..0c3eba4 --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/dummydatagen.cpp @@ -0,0 +1,141 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the examples 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 Technology Preview License Agreement accompanying +** this package. +** +** 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.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <QFile> +#include "theme.h" + +#include "dummydatagen.h" + +DummyDataGenerator::DummyDataGenerator() : m_isMale(false) +{ + QFile countryCodeFile(":/contact/areacodes.txt"); + countryCodeFile.open(QIODevice::ReadOnly); + while (!countryCodeFile.atEnd()) { + m_countryCodes << QString(countryCodeFile.readLine()).remove("\n"); + } + + QFile firstNameFFile(":/contact/firstnamesF.txt"); + firstNameFFile.open(QIODevice::ReadOnly); + while (!firstNameFFile.atEnd()) { + m_firstNamesF << QString(firstNameFFile.readLine()).remove("\n"); + } + + QFile firstNameMFile(":/contact/firstnamesM.txt"); + firstNameMFile.open(QIODevice::ReadOnly); + while (!firstNameMFile.atEnd()) { + m_firstNamesM << QString(firstNameMFile.readLine()).remove("\n"); + } + + QFile lastNameFile(":/contact/lastnames.txt"); + lastNameFile.open(QIODevice::ReadOnly); + while (!lastNameFile.atEnd()) { + m_lastNames << QString(lastNameFile.readLine()).remove("\n"); + } + Reset(); +} + +DummyDataGenerator::~DummyDataGenerator() +{ + +} + +void DummyDataGenerator::Reset() +{ + qsrand(100); +} + +QString DummyDataGenerator::randomPhoneNumber(QString indexNumber) +{ + int index = qrand()%m_countryCodes.count(); + QString countryCode = m_countryCodes.at(index); + QString areaCode = QString::number(index) + QString("0").repeated(2-QString::number(index).length()); + QString beginNumber = QString::number(555-index*2); + QString endNumber = QString("0").repeated(4-indexNumber.length()) + indexNumber; + + return countryCode +" " + areaCode +" " + beginNumber +" " + endNumber; +} + +QString DummyDataGenerator::randomFirstName() +{ + m_isMale = !m_isMale; + if (m_isMale) + return m_firstNamesM.at(qrand()%m_firstNamesM.count()); + return m_firstNamesF.at(qrand()%m_firstNamesF.count()); +} + +QString DummyDataGenerator::randomLastName() +{ + return m_lastNames.at(qrand()%m_lastNames.count()); +} + +QString DummyDataGenerator::randomName() +{ + return QString(randomFirstName()+QString(", ")+randomLastName()); +} + +QString DummyDataGenerator::randomIconItem() +{ + QString avatar = Theme::p()->pixmapPath() + "contact_default_icon.svg"; + if (qrand()%4) { + int randVal = 1+qrand()%25; + + if(m_isMale && randVal > 15) { + randVal -= 15; + } + if(!m_isMale && randVal <= 10) { + randVal += 10; + } + + avatar = QString(":/avatars/avatar_%1.png").arg(randVal, 3, 10, QChar('0')); + } + return avatar; +} + +QString DummyDataGenerator::randomStatusItem() +{ + switch ( qrand()%3 ) + { + case 0: return Theme::p()->pixmapPath() + "contact_status_online.svg"; + case 1: return Theme::p()->pixmapPath() + "contact_status_offline.svg"; + case 2: return Theme::p()->pixmapPath() + "contact_status_idle.svg"; + } + return 0; +} diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/dummydatagen.h b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/dummydatagen.h new file mode 100644 index 0000000..a6c0ff1 --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/dummydatagen.h @@ -0,0 +1,72 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the examples 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 Technology Preview License Agreement accompanying +** this package. +** +** 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.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef __DUMMYDATAGEN_H__ +#define __DUMMYDATAGEN_H__ + +#include <QObject> +#include <QStringList> + +class DummyDataGenerator : public QObject +{ + Q_OBJECT +public: + DummyDataGenerator(); + ~DummyDataGenerator(); + +public: + void Reset(); + QString randomPhoneNumber(QString indexNumber); + QString randomFirstName(); + QString randomLastName(); + QString randomName(); + QString randomIconItem(); + QString randomStatusItem(); + +private: + QStringList m_countryCodes; + QStringList m_firstNamesF; + QStringList m_firstNamesM; + QStringList m_lastNames; + bool m_isMale; +}; + +#endif // __DUMMYDATAGEN_H__ diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/gvbwidget.cpp b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/gvbwidget.cpp new file mode 100644 index 0000000..e2b6f78 --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/gvbwidget.cpp @@ -0,0 +1,59 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the examples 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 Technology Preview License Agreement accompanying +** this package. +** +** 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.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <QtGui> +#include "gvbwidget.h" + +GvbWidget::GvbWidget(QGraphicsItem * parent, Qt::WindowFlags wFlags) + : QGraphicsWidget(parent, wFlags) +{ + +} + +GvbWidget::~GvbWidget() +{ +} + +void GvbWidget::keyPressEvent(QKeyEvent *event) +{ + Q_UNUSED(event) +} + diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/gvbwidget.h b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/gvbwidget.h new file mode 100644 index 0000000..fbe7426 --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/gvbwidget.h @@ -0,0 +1,58 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the examples 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 Technology Preview License Agreement accompanying +** this package. +** +** 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.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef GVBWIDGET_H +#define GVBWIDGET_H + +#include <QGraphicsWidget> + +class GvbWidget : public QGraphicsWidget +{ + Q_OBJECT + +public: + + GvbWidget(QGraphicsItem * parent = 0, Qt::WindowFlags wFlags = 0); + ~GvbWidget(); + virtual void keyPressEvent(QKeyEvent *event); +}; + +#endif diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/iconitem.cpp b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/iconitem.cpp new file mode 100644 index 0000000..44bbc7f --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/iconitem.cpp @@ -0,0 +1,169 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the examples 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 Technology Preview License Agreement accompanying +** this package. +** +** 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.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <QtGui> +#include <QSvgRenderer> + +#if (QT_VERSION >= 0x040600) +#include <QGraphicsEffect> +#endif + +#include "iconitem.h" + +IconItem::IconItem(const QString &filename, QGraphicsItem *parent) + : GvbWidget(parent) + , m_filename(filename) + , m_rotation(0.0) +#if (QT_VERSION >= 0x040600) + , m_opacityEffect(0) +#endif + , m_smoothTransformation(false) +{ + setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred); + setContentsMargins(0,0,0,0); + setPreferredSize(58,58); +} + +IconItem::~IconItem() +{ +} + +void IconItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) +{ + Q_UNUSED(option); + Q_UNUSED(widget); + + reload(); + + const QPointF c = boundingRect().center(); + painter->translate(c.x(), c.y()); + painter->rotate(m_rotation); + painter->translate(-c.x(), -c.y()); + + if (m_smoothTransformation) + painter->setRenderHints(QPainter::SmoothPixmapTransform); + + painter->drawPixmap(0,0, m_pixmap); +} + +QSizeF IconItem::sizeHint(Qt::SizeHint which, + const QSizeF &constraint) const +{ + switch (which) + { + case Qt::MinimumSize: + case Qt::PreferredSize: + case Qt::MaximumSize: + return m_pixmap.size(); + + default: + return GvbWidget::sizeHint(which, constraint); + } +} + +void IconItem::reload() +{ + const QSize iconSize = size().toSize(); + if (iconSize.width() == 0 || iconSize.height() == 0) + return; + + const QString key = m_filename+QString::number(iconSize.width())+QString::number(iconSize.height()); + if (QPixmapCache::find(key, m_pixmap)) + return; + + if (m_filename.endsWith(".svg", Qt::CaseInsensitive)) + { + m_pixmap = QPixmap(iconSize); + m_pixmap.fill(Qt::transparent); + QSvgRenderer doc(m_filename); + QPainter painter(&m_pixmap); + painter.setViewport(0, 0, iconSize.width(), iconSize.height()); + doc.render(&painter); + } + else + { + m_pixmap = QPixmap(m_filename).scaled(iconSize); + } + + QPixmapCache::insert(key, m_pixmap); + updateGeometry(); +} + +QString IconItem::fileName() const +{ + return m_filename; +} + +void IconItem::setFileName(const QString &filename) +{ + if( m_filename != filename) { + m_filename = filename; + reload(); + } +} + +#if (QT_VERSION >= 0x040600) +void IconItem::setOpacityEffectEnabled(const bool enable) +{ + if (!m_opacityEffect) + { + QRadialGradient gradient(0.5, 0.5, 1.0); + gradient.setCoordinateMode(QGradient::ObjectBoundingMode); + gradient.setColorAt(0.0, QColor(0,0,0, 255)); + gradient.setColorAt(0.46, QColor(0,0,0, 255)); + gradient.setColorAt(0.62, QColor(0,0,0, 0)); + + m_opacityEffect = new QGraphicsOpacityEffect; + m_opacityEffect->setOpacityMask(gradient); + m_opacityEffect->setOpacity(1.0); + this->setGraphicsEffect(m_opacityEffect); + } + m_opacityEffect->setEnabled(enable); +} + +bool IconItem::isOpacityEffectEnabled() const +{ + if (m_opacityEffect) + return m_opacityEffect->isEnabled(); + + return false; +} +#endif diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/iconitem.h b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/iconitem.h new file mode 100644 index 0000000..3828a58 --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/iconitem.h @@ -0,0 +1,96 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the examples 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 Technology Preview License Agreement accompanying +** this package. +** +** 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.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef ICONITEM_H +#define ICONITEM_H + +#include <QPainter> + +#include "gvbwidget.h" + +#if (QT_VERSION >= 0x040600) +class QGraphicsOpacityEffect; +#endif +class QPainter; + +class IconItem : public GvbWidget +{ + Q_OBJECT + +public: + + IconItem(const QString &filename = "", QGraphicsItem *parent = 0); + + virtual ~IconItem(); + + QString fileName() const; + void setFileName(const QString &filename); + +#if (QT_VERSION >= 0x040600) + void setOpacityEffectEnabled(const bool enable); + bool isOpacityEffectEnabled() const; +#endif + void setRotation(const qreal rotation) { m_rotation = rotation; } + qreal rotation() const { return m_rotation; } + + void setSmoothTransformationEnabled(const bool enable) { m_smoothTransformation = enable; } + bool isSmoothTransformationEnabled() const { return m_smoothTransformation; } + +private: + + virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget */*widget = 0*/); + QSizeF sizeHint(Qt::SizeHint which, + const QSizeF &constraint = QSizeF()) const; + +private: + Q_DISABLE_COPY(IconItem) + void reload(); + + QString m_filename; + QPixmap m_pixmap; + qreal m_rotation; +#if (QT_VERSION >= 0x040600) + QGraphicsOpacityEffect *m_opacityEffect; +#endif + bool m_smoothTransformation; +}; + +#endif diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/itemrecyclinglist.cpp b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/itemrecyclinglist.cpp new file mode 100644 index 0000000..f05904e --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/itemrecyclinglist.cpp @@ -0,0 +1,275 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the examples 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 Technology Preview License Agreement accompanying +** this package. +** +** 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.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <QDebug> +#include <QTime> + +#include "itemrecyclinglist.h" +#include "listitemcontainer.h" +#include "abstractviewitem.h" +#include "recycledlistitem.h" +#include "theme.h" +#include "scrollbar.h" + +ItemRecyclingList::ItemRecyclingList(const int itemBuffer, QGraphicsWidget * parent) + : ItemRecyclingListView(parent), + m_listModel(new ListModel(this)) +{ + ListItemContainer *container = new ListItemContainer(itemBuffer, this, this); + container->setParentItem(this); + ItemRecyclingListView::setContainer(container); + ItemRecyclingListView::setModel(m_listModel, new RecycledListItem(this)); + setObjectName("ItemRecyclingList"); + connect(Theme::p(), SIGNAL(themeChanged()), this, SLOT(themeChange())); + + setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); +} + +/* virtual */ +ItemRecyclingList::~ItemRecyclingList() +{ +} + +/* virtual */ +void ItemRecyclingList::insertItem(int index, RecycledListItem *item) +{ + if (index<0) + index = 0; + if (index > m_listModel->rowCount()) + index = m_listModel->rowCount(); + if (m_listModel && item) + m_listModel->insert(index,item); + + updateListItemBackgrounds(index); +} + +/* virtual */ +void ItemRecyclingList::addItem(RecycledListItem *item) +{ + if (item) + m_listModel->appendRow(item); + + const int index = m_listModel->rowCount()-1; + updateListItemBackgrounds(index); +} + +/* virtual */ +void ItemRecyclingList::clear() +{ + m_listModel->clear(); +} + +/* virtual */ +AbstractViewItem *ItemRecyclingList::takeItem(const int row) +{ + if (row < 0 || row >= m_listModel->rowCount() || !m_listModel) + return 0; + return m_listModel->takeItem(row); +} + +/*virtual*/ +void ItemRecyclingList::setItemPrototype(AbstractViewItem* prototype) +{ + ItemRecyclingListView::setItemPrototype(prototype); +} + +void ItemRecyclingList::themeChange() +{ + const bool caching = listItemCaching(); + setListItemCaching(false); + + const QString iconName = Theme::p()->pixmapPath()+"contact_default_icon.svg"; + const int count = m_listModel->rowCount(); + + for (int i=0; i<count; ++i) + { + RecycledListItem *ritem = m_listModel->item(i); + if (ritem) { + ListItem *item = ritem->item(); + + // Update default icons + const QString filename = item->icon(ListItem::LeftIcon)->fileName(); + if (filename.contains("contact_default_icon")) { + item->icon(ListItem::LeftIcon)->setFileName(iconName); + } + + // Update status icons + QString statusIcon = item->icon(ListItem::RightIcon)->fileName(); + const int index = statusIcon.indexOf("contact_status"); + if (index != -1) { + statusIcon.remove(0, index); + item->icon(ListItem::RightIcon)->setFileName(Theme::p()->pixmapPath()+statusIcon); + } + + // Update fonts + item->setFont(Theme::p()->font(Theme::ContactName), ListItem::FirstPos); + item->setFont(Theme::p()->font(Theme::ContactNumber), ListItem::SecondPos); + item->setFont(Theme::p()->font(Theme::ContactEmail), ListItem::ThirdPos); + + // Update list dividers + if (i%2) { + item->setBackgroundBrush(Theme::p()->listItemBackgroundBrushOdd()); + item->setBackgroundOpacity(Theme::p()->listItemBackgroundOpacityOdd()); + } + else { + item->setBackgroundBrush(Theme::p()->listItemBackgroundBrushEven()); + item->setBackgroundOpacity(Theme::p()->listItemBackgroundOpacityEven()); + } + + // Update borders + item->setBorderPen(Theme::p()->listItemBorderPen()); + item->setRounding(Theme::p()->listItemRounding()); + + // Update icons + item->icon(ListItem::LeftIcon)->setRotation(Theme::p()->iconRotation(ListItem::LeftIcon)); + item->icon(ListItem::RightIcon)->setRotation(Theme::p()->iconRotation(ListItem::RightIcon)); +#if (QT_VERSION >= 0x040600) + item->icon(ListItem::LeftIcon)->setOpacityEffectEnabled(Theme::p()->isIconOpacityEffectEnabled(ListItem::LeftIcon)); + item->icon(ListItem::RightIcon)->setOpacityEffectEnabled(Theme::p()->isIconOpacityEffectEnabled(ListItem::RightIcon)); +#endif + item->icon(ListItem::LeftIcon)->setSmoothTransformationEnabled(Theme::p()->isIconSmoothTransformationEnabled(ListItem::LeftIcon)); + item->icon(ListItem::RightIcon)->setSmoothTransformationEnabled(Theme::p()->isIconSmoothTransformationEnabled(ListItem::RightIcon)); + } + } + updateViewContent(); + setListItemCaching(caching); +} + +void ItemRecyclingList::keyPressEvent(QKeyEvent *event) +{ + static QTime keyPressInterval = QTime::currentTime(); + static qreal step = 0.0; + static bool repeat = false; + int interval = keyPressInterval.elapsed(); + + ScrollBar* sb = verticalScrollBar(); + qreal currentValue = sb->sliderPosition(); + + if(interval < 250 ) { + if(!repeat) step = 0.0; + step = step + 2.0; + if(step > 100) step = 100; + repeat = true; + } + else { + step = 1.0; + if(m_listModel->item(0)) m_listModel->item(0)->size().height(); + step = m_listModel->item(0)->size().height(); + repeat = false; + } + + if(event->key() == Qt::Key_Up ) { //Up Arrow + sb->setSliderPosition(currentValue - step); + } + + if(event->key() == Qt::Key_Down ) { //Down Arrow + sb->setSliderPosition(currentValue + step); + } + keyPressInterval.start(); +} + +bool ItemRecyclingList::listItemCaching() const +{ +#if (QT_VERSION >= 0x040600) + ListItemContainer *container = + static_cast<ListItemContainer *>(m_container); + + return container->listItemCaching(); +#else + return false; +#endif +} + +void ItemRecyclingList::setListItemCaching(bool enabled) +{ +#if (QT_VERSION >= 0x040600) + ListItemContainer *container = + static_cast<ListItemContainer *>(m_container); + container->setListItemCaching(enabled); +#else + Q_UNUSED(enabled) +#endif +} + +void ItemRecyclingList::updateListItemBackgrounds(int index) +{ + const int itemCount = m_listModel->rowCount(); + + for (int i=index; i<itemCount; ++i) + { + RecycledListItem *ritem = m_listModel->item(i); + if (ritem) { + ListItem *item = ritem->item(); + if (i%2) { + item->setBackgroundBrush(Theme::p()->listItemBackgroundBrushOdd()); + item->setBackgroundOpacity(Theme::p()->listItemBackgroundOpacityOdd()); + } + else { + item->setBackgroundBrush(Theme::p()->listItemBackgroundBrushEven()); + item->setBackgroundOpacity(Theme::p()->listItemBackgroundOpacityEven()); + } + } + } +} + +void ItemRecyclingList::setTwoColumns(const bool enabled) +{ + if (twoColumns() == enabled) + return; + +#if (QT_VERSION >= 0x040600) + const bool caching = listItemCaching(); + setListItemCaching(false); +#endif + + m_container->setTwoColumns(enabled); + refreshContainerGeometry(); + +#if (QT_VERSION >= 0x040600) + setListItemCaching(caching); +#endif +} + +bool ItemRecyclingList::twoColumns() +{ + return m_container->twoColumns(); +} + diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/itemrecyclinglist.h b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/itemrecyclinglist.h new file mode 100644 index 0000000..d40e34c --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/itemrecyclinglist.h @@ -0,0 +1,85 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the examples 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 Technology Preview License Agreement accompanying +** this package. +** +** 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.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef ITEMRECYCLINGLIST_H +#define ITEMRECYCLINGLIST_H + +#include "listitem.h" +#include "abstractitemview.h" +#include "listmodel.h" +#include "itemrecyclinglistview.h" +#include "recycledlistitem.h" + +class QGraphicsWidget; + +class ItemRecyclingList : public ItemRecyclingListView +{ + Q_OBJECT + +public: + ItemRecyclingList(const int itemBuffer = 4, QGraphicsWidget * parent = 0); + virtual ~ItemRecyclingList(); + + virtual void insertItem(int index, RecycledListItem *item); + virtual void addItem(RecycledListItem *item); + virtual void clear(); + virtual AbstractViewItem *takeItem(const int row); + virtual void setItemPrototype(AbstractViewItem* prototype); + virtual void keyPressEvent(QKeyEvent *event); + virtual bool listItemCaching() const; + virtual void setListItemCaching(bool enabled); + + void setTwoColumns(const bool enabled); + bool twoColumns(); + +public slots: + void themeChange(); + +private: + void updateListItemBackgrounds(int index); + +private: + Q_DISABLE_COPY(ItemRecyclingList) + + ListModel *m_listModel; +}; + +#endif // ITEMRECYCLINGLIST_H diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/itemrecyclinglist.pri b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/itemrecyclinglist.pri new file mode 100644 index 0000000..55b551e --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/itemrecyclinglist.pri @@ -0,0 +1,19 @@ +HEADERS += $$ROOTDIR/tests/itemrecyclinglist/itemrecyclinglist.h \ + $$ROOTDIR/tests/itemrecyclinglist/itemrecyclinglistview.h \ + $$ROOTDIR/tests/itemrecyclinglist/abstractitemview.h \ + $$ROOTDIR/tests/itemrecyclinglist/abstractviewitem.h \ + $$ROOTDIR/tests/itemrecyclinglist/recycledlistitem.h \ + $$ROOTDIR/tests/itemrecyclinglist/listitemcontainer.h \ + $$ROOTDIR/tests/itemrecyclinglist/abstractitemcontainer.h \ + $$ROOTDIR/tests/itemrecyclinglist/listmodel.h + +SOURCES += $$ROOTDIR/tests/itemrecyclinglist/itemrecyclinglist.cpp \ + $$ROOTDIR/tests/itemrecyclinglist/itemrecyclinglistview.cpp \ + $$ROOTDIR/tests/itemrecyclinglist/abstractitemview.cpp \ + $$ROOTDIR/tests/itemrecyclinglist/abstractviewitem.cpp \ + $$ROOTDIR/tests/itemrecyclinglist/recycledlistitem.cpp \ + $$ROOTDIR/tests/itemrecyclinglist/listitemcontainer.cpp \ + $$ROOTDIR/tests/itemrecyclinglist/abstractitemcontainer.cpp \ + $$ROOTDIR/tests/itemrecyclinglist/listmodel.cpp + +INCLUDEPATH += $$ROOTDIR/tests/itemrecyclinglist diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/itemrecyclinglistview.cpp b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/itemrecyclinglistview.cpp new file mode 100644 index 0000000..38076e9 --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/itemrecyclinglistview.cpp @@ -0,0 +1,79 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the examples 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 Technology Preview License Agreement accompanying +** this package. +** +** 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.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "itemrecyclinglistview.h" + +ItemRecyclingListView::ItemRecyclingListView(QGraphicsWidget * parent) + : AbstractItemView(parent), m_rootIndex() +{ +} + +/*virtual*/ +ItemRecyclingListView::~ItemRecyclingListView() +{ +} +void ItemRecyclingListView::setCurrentRow(const int row) +{ + setCurrentIndex(model()->index(row,0)); +} + +int ItemRecyclingListView::rows() const +{ + if (m_model) + return m_model->rowCount(); + return 0; +} + +/*virtual*/ +void ItemRecyclingListView::rowsInserted(const QModelIndex &parent, int start, int end) +{ + if (parent == m_rootIndex) { + AbstractItemView::rowsInserted(parent, start, end); + } +} + +/*virtual*/ +void ItemRecyclingListView::rowsRemoved(const QModelIndex &parent, int start, int end) +{ + if (parent == m_rootIndex) { + AbstractItemView::rowsRemoved(parent, start, end); + } +} diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/itemrecyclinglistview.h b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/itemrecyclinglistview.h new file mode 100644 index 0000000..8f90395 --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/itemrecyclinglistview.h @@ -0,0 +1,67 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the examples 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 Technology Preview License Agreement accompanying +** this package. +** +** 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.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef ITEMRECYCLINGLISTVIEW_H +#define ITEMRECYCLINGLISTVIEW_H + +#include "abstractitemview.h" + +class ItemRecyclingListView : public AbstractItemView +{ +public: + ItemRecyclingListView(QGraphicsWidget * parent = 0); + virtual ~ItemRecyclingListView(); + void setCurrentRow(const int row); + int rows() const; +#if (QT_VERSION >= 0x040600) + virtual bool listItemCaching() const = 0; + virtual void setListItemCaching(bool enabled) = 0; +#endif + +protected: + void rowsInserted(const QModelIndex &parent, int start, int end); + void rowsRemoved(const QModelIndex &parent,int start,int end); + +private: + QModelIndex m_rootIndex; +}; + +#endif // ITEMRECYCLINGLISTVIEW_H diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/label.cpp b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/label.cpp new file mode 100644 index 0000000..344d7e8 --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/label.cpp @@ -0,0 +1,98 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the examples 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 Technology Preview License Agreement accompanying +** this package. +** +** 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.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <QtGui> + +#include "label.h" + +Label::Label(const QString& text, QGraphicsItem *parent) + : GvbWidget(parent) +{ + m_textItem = new QGraphicsSimpleTextItem(this); + setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Fixed); + setContentsMargins(0, 0, 0, 0); + setText(text); +#if QT_VERSION >= 0x040600 + // This flag was introduced in Qt 4.6. + setFlag(QGraphicsItem::ItemHasNoContents, true); +#endif +} + +Label::~Label() +{ +} + +void Label::setText(const QString& text) +{ + m_textItem->setText(text); + prepareGeometryChange(); +} + +QString Label::text() const +{ + return m_textItem->text(); +} + +void Label::setFont(const QFont font) +{ + m_textItem->setFont(font); +} + +void Label::resizeEvent(QGraphicsSceneResizeEvent *event) +{ + GvbWidget::resizeEvent(event); +} + +QSizeF Label::sizeHint(Qt::SizeHint which, const QSizeF &constraint) const +{ + switch (which) + { + case Qt::MinimumSize: + // fall thru + case Qt::PreferredSize: + { + QFontMetricsF fm(m_textItem->font()); + return QSizeF(fm.width(m_textItem->text()), fm.height()); + } + default: + return GvbWidget::sizeHint(which, constraint); + } +} diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/label.h b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/label.h new file mode 100644 index 0000000..29ea302 --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/label.h @@ -0,0 +1,76 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the examples 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 Technology Preview License Agreement accompanying +** this package. +** +** 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.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef TEXTITEM_H +#define TEXTITEM_H + +#include "gvbwidget.h" + +class QPainter; +class QStyleOptionGraphicsItem; +class QGraphicsTextItem; + +class Label : public GvbWidget +{ + Q_OBJECT + +public: + + Label(const QString& text, QGraphicsItem *parent = 0); + ~Label(); + +public: + + void setText(const QString& text); + QString text() const; + void setFont(const QFont font); + +private: + void resizeEvent(QGraphicsSceneResizeEvent *event); + QSizeF sizeHint(Qt::SizeHint which, + const QSizeF &constraint = QSizeF()) const; + +private: + Q_DISABLE_COPY(Label) + QGraphicsSimpleTextItem *m_textItem; +}; + +#endif diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/listitem.cpp b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/listitem.cpp new file mode 100644 index 0000000..b91a84c --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/listitem.cpp @@ -0,0 +1,314 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the examples 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 Technology Preview License Agreement accompanying +** this package. +** +** 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.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <QDebug> +#include <QGraphicsGridLayout> +#include <QGraphicsLinearLayout> +#include <QGraphicsSceneMouseEvent> +#include <QPainter> +#include <QStyleOptionGraphicsItem> +#include "listitem.h" +#include "theme.h" + +struct ItemData +{ + QHash<ListItem::TextPos, QString> texts; + QHash<ListItem::TextPos, QFont> fonts; + QHash<ListItem::IconItemPos, QString> icons; + QHash<ListItem::IconItemPos, qreal> iconRotations; + QHash<ListItem::IconItemPos, bool> iconSmoothTransformations; + QHash<ListItem::IconItemPos, bool> iconOpacityEffets; + QPen borderPen; + QBrush backgroundBrush; + qreal backgroundOpacity; + QSize rounding; +}; +Q_DECLARE_METATYPE(ItemData); + +ListItem::ListItem(QGraphicsWidget *parent) + : GvbWidget(parent), + m_txtlayout(new QGraphicsGridLayout()), + m_layout(new QGraphicsLinearLayout(Qt::Horizontal)), + m_liconlayout(new QGraphicsLinearLayout(Qt::Horizontal)), + m_riconlayout(new QGraphicsLinearLayout(Qt::Horizontal)) + ,m_fonts() + ,m_borderPen(Qt::NoPen) + ,m_backgroundBrush(QBrush()) + ,m_backgroundOpacity(1.0) + ,m_rounding(0.0, 0.0) +{ + setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); + setContentsMargins(0,4,4,0); + m_layout->setContentsMargins(0,0,0,0); + + m_txtlayout->setContentsMargins(0,8,0,8); + m_liconlayout->setContentsMargins(8,8,8,8); + m_riconlayout->setContentsMargins(0,8,4,8); + + m_layout->insertItem(0, m_liconlayout); + m_layout->insertItem(1, m_txtlayout); + m_layout->insertItem(2, m_riconlayout); + + m_layout->setStretchFactor(m_liconlayout, 1); + m_layout->setStretchFactor(m_txtlayout, 5); + m_layout->setStretchFactor(m_riconlayout, 1); + + setFlag(QGraphicsItem::ItemClipsToShape); + setLayout(m_layout); +} + +ListItem::~ListItem() +{ + if ( !m_liconlayout->parentLayoutItem() ) + delete m_liconlayout; + + if ( !m_riconlayout->parentLayoutItem() ) + delete m_riconlayout; +} + +void ListItem::setIcon( IconItem *iconItem, const IconItemPos iconPos ) +{ + if (iconPos == LeftIcon) { + if (m_liconlayout->count() > 0 && m_liconlayout->itemAt(0)) { + delete m_liconlayout->itemAt(0); + m_liconlayout->addItem( iconItem ); + } + else { + m_liconlayout->addItem( iconItem ); + } + m_liconlayout->itemAt(0)->setMaximumSize(58,58); + } + else if (iconPos == RightIcon) { + if (m_riconlayout->count() > 0 && m_riconlayout->itemAt(0)) { + delete m_riconlayout->itemAt(0); + m_riconlayout->addItem( iconItem ); + } + else { + m_riconlayout->addItem( iconItem ); + } + m_riconlayout->itemAt(0)->setMaximumSize(22,22); + } + m_layout->invalidate(); +} + +IconItem* ListItem::icon( const IconItemPos iconPos ) const +{ + QGraphicsLayoutItem* item = 0; + + if (iconPos == LeftIcon && m_liconlayout->count() > 0) { + item = m_liconlayout->itemAt(0); + } + else if (iconPos == RightIcon && m_riconlayout->count() > 0) { + item = m_riconlayout->itemAt(0); + } + + if (item) { + IconItem* titem = static_cast<IconItem *>(item); + return titem; + } + return 0; +} + +QVariant ListItem::data(int role) const +{ + if (role != Qt::DisplayRole) + return QVariant(); + + ItemData data; + + if (text(ListItem::FirstPos).size() > 0) { + data.texts[ListItem::FirstPos] = text(ListItem::FirstPos); + data.fonts[ListItem::FirstPos] = m_fonts[ListItem::FirstPos]; + } + if (text(ListItem::SecondPos).size() > 0) { + data.texts[ListItem::SecondPos] = text(ListItem::SecondPos); + data.fonts[ListItem::SecondPos] = m_fonts[ListItem::SecondPos]; + } + if (text(ListItem::ThirdPos).size() > 0) { + data.texts[ListItem::ThirdPos] = text(ListItem::ThirdPos); + data.fonts[ListItem::ThirdPos] = m_fonts[ListItem::ThirdPos]; + } + if (text(ListItem::LastPos).size() > 0) { + data.texts[ListItem::LastPos] = text(ListItem::LastPos); + data.fonts[ListItem::LastPos] = m_fonts[ListItem::LastPos]; + } + + if (icon(ListItem::LeftIcon)) { + data.icons[ListItem::LeftIcon] = icon(ListItem::LeftIcon)->fileName(); + data.iconRotations[ListItem::LeftIcon] = icon(ListItem::LeftIcon)->rotation(); + data.iconSmoothTransformations[ListItem::LeftIcon] = icon(ListItem::LeftIcon)->isSmoothTransformationEnabled(); +#if (QT_VERSION >= 0x040600) + data.iconOpacityEffets[ListItem::LeftIcon] = icon(ListItem::LeftIcon)->isOpacityEffectEnabled(); +#endif + } + + if (icon(ListItem::RightIcon)) { + data.icons[ListItem::RightIcon] = icon(ListItem::RightIcon)->fileName(); + data.iconRotations[ListItem::RightIcon] = icon(ListItem::RightIcon)->rotation(); + data.iconSmoothTransformations[ListItem::RightIcon] = icon(ListItem::RightIcon)->isSmoothTransformationEnabled(); +#if (QT_VERSION >= 0x040600) + data.iconOpacityEffets[ListItem::RightIcon] = icon(ListItem::RightIcon)->isOpacityEffectEnabled(); +#endif + } + + data.borderPen = m_borderPen; + data.backgroundBrush = m_backgroundBrush; + data.backgroundOpacity = m_backgroundOpacity; + data.rounding = m_rounding; + + QVariant var; + var.setValue(data); + return var; +} + +void ListItem::setData(const QVariant &value, int role) +{ + if (role != Qt::DisplayRole) + return; + + ItemData data = value.value<ItemData>(); + QList<ListItem::TextPos> textkeys = data.texts.keys(); + + for( int i = 0; i<textkeys.count(); ++i) { + setText(data.texts[textkeys.at(i)],textkeys.at(i)); + setFont(data.fonts[textkeys.at(i)], textkeys.at(i)); + } + + QList<ListItem::IconItemPos> iconkeys = data.icons.keys(); + for( int i = 0; i<iconkeys.count(); ++i) { + IconItem *iconItem = icon(iconkeys.at(i)); + if (iconItem) + iconItem->setFileName(data.icons[iconkeys.at(i)]); + else { + IconItem *iconItem = new IconItem(data.icons[iconkeys.at(i)], this); + setIcon(iconItem, iconkeys.at(i)); + } + } + + if (icon(ListItem::LeftIcon)) { + icon(ListItem::LeftIcon)->setRotation(data.iconRotations[ListItem::LeftIcon]); + icon(ListItem::LeftIcon)->setSmoothTransformationEnabled(data.iconSmoothTransformations[ListItem::LeftIcon]); +#if (QT_VERSION >= 0x040600) + icon(ListItem::LeftIcon)->setOpacityEffectEnabled(data.iconOpacityEffets[ListItem::LeftIcon]); +#endif + } + + if (icon(ListItem::RightIcon)) { + icon(ListItem::RightIcon)->setRotation(data.iconRotations[ListItem::RightIcon]); + icon(ListItem::RightIcon)->setSmoothTransformationEnabled(data.iconSmoothTransformations[ListItem::RightIcon]); +#if (QT_VERSION >= 0x040600) + icon(ListItem::RightIcon)->setOpacityEffectEnabled(data.iconOpacityEffets[ListItem::RightIcon]); +#endif + } + + m_borderPen = data.borderPen; + m_backgroundBrush = data.backgroundBrush; + m_backgroundOpacity = data.backgroundOpacity; + m_rounding = data.rounding; +} + +void ListItem::setText(const QString str, const TextPos position) +{ + QGraphicsLayoutItem * item = 0; + + if (m_txtlayout->rowCount() > position && position >= 0) + item = m_txtlayout->itemAt(position, 0); + + if (!item) { + Label *label = new Label(str,this); + m_txtlayout->addItem(label, position, 0); + if (m_fonts.contains(position)) + label->setFont(m_fonts[position]); + } + else { + Label *titem = static_cast<Label *>(item); + titem->setText(str); + } +} + +void ListItem::setFont(const QFont font, const TextPos position) +{ + m_fonts.insert(position, font); + QGraphicsLayoutItem * item = 0; + + if (m_txtlayout->rowCount() > position && position >= 0) + item = m_txtlayout->itemAt(position, 0); + + if (item) { + Label *titem = static_cast<Label *>(item); + titem->setFont(font); + } +} + +QString ListItem::text(const TextPos position) const +{ + QGraphicsLayoutItem * item = 0; + + if (m_txtlayout->rowCount() > position && position >= 0) + item = m_txtlayout->itemAt(position, 0); + + if (item) { + Label *titem = static_cast<Label *>(item); + return titem->text(); + } + return ""; +} + +void ListItem::paint(QPainter *painter, const QStyleOptionGraphicsItem */*option*/, QWidget */*widget*/) +{ + const int penWidth = m_borderPen.width(); + QRectF r = rect(); + r.adjust(penWidth, penWidth, -penWidth, -penWidth); + + if (m_borderPen != Qt::NoPen) + { + painter->setPen(m_borderPen); + painter->drawRoundedRect(r, m_rounding.width(), m_rounding.height()); + } + + if (m_backgroundBrush != Qt::NoBrush) + { + painter->setPen(Qt::NoPen); + painter->setBrush(m_backgroundBrush); + painter->setOpacity(m_backgroundOpacity); + painter->drawRoundedRect(r, m_rounding.width(), m_rounding.height()); + } +} diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/listitem.h b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/listitem.h new file mode 100644 index 0000000..76d8354 --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/listitem.h @@ -0,0 +1,109 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the examples 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 Technology Preview License Agreement accompanying +** this package. +** +** 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.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef LISTITEM_H +#define LISTITEM_H + +#include <QPen> +#include "iconitem.h" +#include "label.h" +#include "gvbwidget.h" + +class QGraphicsGridLayout; +class QGraphicsLinearLayout; +class QGraphicsSceneMouseEvent; +class QGraphicsItem; + +class ListItem : public GvbWidget +{ + Q_OBJECT + +public: + + enum TextPos { + FirstPos = 0, + SecondPos = 1, + ThirdPos = 2, + LastPos = 3 + }; + + enum IconItemPos { + LeftIcon = 0, + RightIcon = 1 + }; + + ListItem(QGraphicsWidget *parent = 0); + virtual ~ListItem(); + + void setIcon(IconItem *iconItem, const IconItemPos iconPos); + IconItem* icon(const IconItemPos position) const; + void setText(const QString str, const TextPos position); + QString text(const TextPos position) const; + void setFont(const QFont font, const TextPos position); + + QVariant data(int role = Qt::DisplayRole) const; + void setData(const QVariant &value, int role = Qt::DisplayRole); + + void setBorderPen(const QPen pen) { m_borderPen = pen; } + void setBackgroundBrush(const QBrush brush) { m_backgroundBrush = brush; } + void setBackgroundOpacity(const qreal opacity) { m_backgroundOpacity = opacity; } + void setRounding(const QSize rounding) { m_rounding = rounding; } + +protected: + + void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); + +private: + Q_DISABLE_COPY(ListItem) + QGraphicsGridLayout *m_txtlayout; + QGraphicsLinearLayout *m_layout; + QGraphicsLinearLayout *m_liconlayout; + QGraphicsLinearLayout *m_riconlayout; + QHash<TextPos, QFont> m_fonts; + + QPen m_borderPen; + QBrush m_backgroundBrush; + qreal m_backgroundOpacity; + QSize m_rounding; +}; + +#endif // LISTITEM_H + diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/listitemcache.cpp b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/listitemcache.cpp new file mode 100644 index 0000000..e794622 --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/listitemcache.cpp @@ -0,0 +1,92 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the examples 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 Technology Preview License Agreement accompanying +** this package. +** +** 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.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <QGraphicsItem> +#include <QPainter> +#include <QDebug> +#include "listitemcache.h" + +ListItemCache::ListItemCache() +{ +} + +ListItemCache::~ListItemCache() +{ + QPixmapCache::remove(m_cacheKey); +} + +void ListItemCache::draw(QPainter * painter) +{ + QRectF irect = sourceBoundingRect(Qt::LogicalCoordinates); + QRectF vrect = painter->clipPath().boundingRect(); + + if (vrect.intersects(irect)) { + QRectF newVisibleRect = irect.intersected(vrect); + QPixmap pixmap; + + if (!QPixmapCache::find(m_cacheKey, &pixmap) || + m_visibleRect.toRect() != newVisibleRect.toRect()) { + //qDebug() << "ListItemCache: caching" << m_visibleRect + // << "->" << newVisibleRect; + + pixmap = QPixmap(sourceBoundingRect().toRect().size()); + pixmap.fill(Qt::transparent); + + QPainter pixmapPainter(&pixmap); + drawSource(&pixmapPainter); + pixmapPainter.end(); + m_cacheKey = QPixmapCache::insert(pixmap); + + m_visibleRect = newVisibleRect; + } + + //qDebug() << "ListItemCache: blitting" << m_visibleRect; + painter->drawPixmap(0, 0, pixmap); + } +} + +void ListItemCache::sourceChanged(ChangeFlags) +{ + QPixmapCache::remove(m_cacheKey); +} + + + diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/listitemcache.h b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/listitemcache.h new file mode 100644 index 0000000..7db47a0 --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/listitemcache.h @@ -0,0 +1,69 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the examples 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 Technology Preview License Agreement accompanying +** this package. +** +** 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.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef LISTITEMCACHE_H +#define LISTITEMCACHE_H + +#include <QGraphicsEffect> +#include <QPixmapCache> + +class ListItemCache : public QGraphicsEffect +{ + Q_OBJECT + +public: + + ListItemCache(); + ~ListItemCache(); + +public: // QGraphicsEffect + + void draw(QPainter *painter); + void sourceChanged(ChangeFlags flags); + +private: + + QPixmapCache::Key m_cacheKey; + QRectF m_visibleRect; +}; + +#endif // LISTITEMCACHE_H + diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/listitemcontainer.cpp b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/listitemcontainer.cpp new file mode 100644 index 0000000..89e8215 --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/listitemcontainer.cpp @@ -0,0 +1,211 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the examples 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 Technology Preview License Agreement accompanying +** this package. +** +** 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.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <qmath.h> +#include <QGraphicsLinearLayout> +#include <QGraphicsScene> + +#include "listitemcontainer.h" +#include "abstractviewitem.h" + +#include "recycledlistitem.h" + +#if (QT_VERSION >= 0x040600) +#include "listitemcache.h" +#include "itemrecyclinglist.h" +#endif + +ListItemContainer::ListItemContainer(int bufferSize, ItemRecyclingList *view, QGraphicsWidget *parent) + : AbstractItemContainer(bufferSize, parent) + , m_view(view) + , m_layout(new QGraphicsLinearLayout(Qt::Vertical)) +#if (QT_VERSION >= 0x040600) + , m_listItemCaching(false) +#endif +{ + setContentsMargins(0,0,0,0); + m_layout->setContentsMargins(0,0,0,0); + m_layout->setSpacing(0); + setLayout(m_layout); +} + +/*virtual*/ +ListItemContainer::~ListItemContainer() +{ +#if (QT_VERSION >= 0x040600) + setListItemCaching(false); +#endif + for (int i = 0; i < m_items.count(); ++i) { + m_layout->removeItem(m_items.at(i)); + m_items.at(i)->setParentItem(0); + } + qDeleteAll(m_items); + m_items.clear(); +} + +#if (QT_VERSION >= 0x040600) +bool ListItemContainer::listItemCaching() const +{ + return m_listItemCaching; +} + +void ListItemContainer::setListItemCaching(const bool enabled) +{ + if (m_listItemCaching == enabled) + return; + + m_listItemCaching = enabled; + + const int itemCount = m_layout->count(); + + for (int i = 0; i < itemCount; ++i) + setListItemCaching(enabled, i); +} +#endif + +/*virtual*/ +void ListItemContainer::adjustVisibleContainerSize(const QSizeF &size) +{ + m_layout->setPreferredWidth(size.width()); +} + +/*virtual*/ +void ListItemContainer::addItemToVisibleLayout(int index, AbstractViewItem *item) +{ + m_layout->insertItem(index,item); + +#if (QT_VERSION >= 0x040600) + setListItemCaching(m_listItemCaching, index); +#endif +} + +/*virtual*/ +void ListItemContainer::removeItemFromVisibleLayout(AbstractViewItem *item) +{ + m_layout->removeItem(item); + +#if (QT_VERSION >= 0x040600) + RecycledListItem *recycledItem = static_cast<RecycledListItem*>(item); + + if (!recycledItem) + return; + + ListItem *listItem = recycledItem->item(); + + setListItemCaching(false, listItem); +#endif +} + +/*virtual*/ +int ListItemContainer::maxItemCountInItemBuffer() const +{ + int count = AbstractItemContainer::maxItemCountInItemBuffer(); + + if (count > 0) { + int currentItemCount = m_items.count(); + qreal heightOfOneItem = 0; + if (currentItemCount > 0) + { + heightOfOneItem = m_layout->effectiveSizeHint(Qt::PreferredSize).height() / currentItemCount; + } + int guess = 0; + if( heightOfOneItem <= 0 ) { + if (m_prototype) { + heightOfOneItem = m_prototype->effectiveSizeHint(Qt::PreferredSize).height(); + } + else + heightOfOneItem = 50; // TODO magic number, do we have better guess if prototype is not set? + } + if (heightOfOneItem > 0) { + guess = qCeil(m_itemView->boundingRect().height() / heightOfOneItem) + m_bufferSize; + + if (guess < currentItemCount) { + if( guess > currentItemCount-2) { // TODO magic number here, Can we use buffer size? + guess = currentItemCount; + } + } + } + count = qMin(guess, count); + } + return count; +} + +#if (QT_VERSION >= 0x040600) +void ListItemContainer::setListItemCaching(const bool enabled, const int index) +{ + RecycledListItem *recycledItem = static_cast<RecycledListItem*>(m_layout->itemAt(index)); + + if (!recycledItem) + return; + + ListItem *listItem = recycledItem->item(); + + if (!listItem) + return; + + setListItemCaching(enabled, listItem); +} + +void ListItemContainer::setListItemCaching(const bool enabled, ListItem *listItem) +{ + if (!listItem) + return; + + // Deletes the effect. + listItem->setGraphicsEffect(0); + + if (enabled) { + ListItemCache* cache = new ListItemCache; + Q_ASSERT(!listItem->graphicsEffect()); + listItem->setGraphicsEffect(cache); + } +} +#endif + + +void ListItemContainer::setTwoColumns(const bool twoColumns) +{ + AbstractItemContainer::setTwoColumns(twoColumns); + + if (!m_layout->isActivated()) + m_layout->activate(); +} + diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/listitemcontainer.h b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/listitemcontainer.h new file mode 100644 index 0000000..31b69a5 --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/listitemcontainer.h @@ -0,0 +1,92 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the examples 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 Technology Preview License Agreement accompanying +** this package. +** +** 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.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef LISTITEMCONTAINER_H +#define LISTITEMCONTAINER_H + +#include <QGraphicsWidget> +#include <QColor> + +#include "abstractitemcontainer.h" + +class QGraphicsLinearLayout; +class AbstractViewItem; +class ListItemCache; +class ListItem; +class ItemRecyclingList; + +class ListItemContainer : public AbstractItemContainer +{ + Q_OBJECT + +public: + ListItemContainer(int bufferSize, ItemRecyclingList *view, QGraphicsWidget *parent=0); + virtual ~ListItemContainer(); + + virtual void setTwoColumns(const bool twoColumns); + +#if (QT_VERSION >= 0x040600) + bool listItemCaching() const; + void setListItemCaching(const bool enabled); + virtual void setListItemCaching(const bool enabled, const int index); +#endif + +protected: + + virtual void addItemToVisibleLayout(int index, AbstractViewItem *item); + virtual void removeItemFromVisibleLayout(AbstractViewItem *item); + + virtual void adjustVisibleContainerSize(const QSizeF &size); + virtual int maxItemCountInItemBuffer() const; + +private: + Q_DISABLE_COPY(ListItemContainer) + + ItemRecyclingList *m_view; + QGraphicsLinearLayout *m_layout; +#if (QT_VERSION >= 0x040600) + void setListItemCaching(const bool enabled, ListItem *listItem); + bool m_listItemCaching; +#endif +}; + + +#endif // LISTITEMCONTAINER_H diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/listmodel.cpp b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/listmodel.cpp new file mode 100644 index 0000000..fe10b28 --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/listmodel.cpp @@ -0,0 +1,146 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the examples 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 Technology Preview License Agreement accompanying +** this package. +** +** 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.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "listmodel.h" +#include "recycledlistitem.h" + +ListModel::ListModel(QObject *parent) + : QAbstractListModel(parent) + , m_items() +{ + +} + +ListModel::~ListModel() +{ + qDeleteAll(m_items); + m_items.clear(); +} + +int ListModel::rowCount(const QModelIndex &parent) const +{ + if (parent.isValid()) + return 0; + return m_items.count(); +} + +QVariant ListModel::data(const QModelIndex &index, int role) const +{ + if (!index.isValid()) + return QVariant(); + + if (index.row() >= m_items.size() || index.row() < 0) + return QVariant(); + + switch (role) + { + case Qt::DisplayRole: + return QVariant::fromValue(m_items.at(index.row())->data(role)); + default: + return QVariant(); + } +} + +bool ListModel::setData(const QModelIndex &index, const QVariant &value, int role) +{ + // TODO implement if we like to edit list items + Q_UNUSED(index) + Q_UNUSED(value) + Q_UNUSED(role) + return false; +} + +void ListModel::clear() +{ + m_items.clear(); + reset(); +} + +QModelIndex ListModel::index(int row, int column, const QModelIndex &parent) const +{ + if (hasIndex(row, column, parent)) + return createIndex(row, column, m_items.at(row)); + + return QModelIndex(); +} + +void ListModel::insert(int row, RecycledListItem *item) +{ + if (item) + item->setModel(this); + if (!item || m_items.contains(item) ) { + return; + } + if (row < 0) + row = 0; + else if (row > m_items.count()) + row = m_items.count(); + beginInsertRows(QModelIndex(), row, row); + m_items.insert(row, item); + endInsertRows(); +} + +void ListModel::appendRow(RecycledListItem *item) +{ + if (!item) return; + item->setModel(this); + insert(rowCount(),item); +} + +RecycledListItem *ListModel::item(const int row) const +{ + if (row < 0 || row > m_items.count()) + return 0; + return m_items.at(row); +} + +RecycledListItem *ListModel::takeItem(const int row) +{ + if (row < 0 || row >= m_items.count()) + return 0; + + beginRemoveRows(QModelIndex(), row, row); + RecycledListItem *item = m_items.takeAt(row); + endRemoveRows(); + + return item; +} + diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/listmodel.h b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/listmodel.h new file mode 100644 index 0000000..dfa12d6 --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/listmodel.h @@ -0,0 +1,82 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the examples 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 Technology Preview License Agreement accompanying +** this package. +** +** 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.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef LISTMODEL_H +#define LISTMODEL_H + +#include <QAbstractListModel> + +class RecycledListItem; +class ListItemCache; + +class ListModel : public QAbstractListModel +{ + Q_OBJECT + +public: + + ListModel(QObject *parent = 0); + ~ListModel(); + +public: + + int rowCount(const QModelIndex &parent = QModelIndex()) const; + + QVariant data(const QModelIndex &index, int role = Qt::DisplayRole ) const; + bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole); + + QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const; + + void insert(const int row, RecycledListItem *item); + void appendRow(RecycledListItem *item); + + void clear(); + + RecycledListItem *item(const int row) const; + + RecycledListItem *takeItem(const int row); + +private: + Q_DISABLE_COPY(ListModel) + QList<RecycledListItem *> m_items; +}; + +#endif // LISTMODEL_H diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/listwidget.cpp b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/listwidget.cpp new file mode 100644 index 0000000..736b9fe --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/listwidget.cpp @@ -0,0 +1,132 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the examples 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 Technology Preview License Agreement accompanying +** this package. +** +** 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.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <QGraphicsSceneResizeEvent> +#include <QGraphicsGridLayout> +#include <QGraphicsLinearLayout> +#include <QTimer> +#include "listwidget.h" + +ListWidget::ListWidget(QGraphicsWidget * parent) + : GvbWidget(parent), + m_layout(new QGraphicsLinearLayout(Qt::Vertical)), + m_listView(new SimpleListView(this)) +{ + //listView->setViewport(listView->content()); + //listView->content()->setParentItem(listView); + setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); + setContentsMargins(0,0,0,0); + m_layout->setContentsMargins(0,0,0,0); + m_listView->setContentsMargins(0,0,0,0); + m_layout->addItem(m_listView); + setLayout(m_layout); + + m_scroller.setScrollable(m_listView); + m_listView->installEventFilter(&m_scroller); + m_listView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); +} + +ListWidget::~ListWidget() +{ + +} + +void ListWidget::addItem(QGraphicsWidget *item) +{ + m_listView->addItem(item); +} + +void ListWidget::insertItem(int index, QGraphicsWidget *item) +{ + m_listView->insertItem(index, item); +} + +QGraphicsWidget* ListWidget::takeItem(int row) +{ + return m_listView->takeItem(row); +} + +QGraphicsWidget* ListWidget::itemAt(int row) +{ + return m_listView->itemAt(row); +} + +/* virtual */ +void ListWidget::resizeEvent( QGraphicsSceneResizeEvent * event ) +{ + QGraphicsWidget::resizeEvent(event); +} + +int ListWidget::itemCount() const +{ + if (m_listView) + return m_listView->itemCount(); + return 0; +} + +ScrollBar* ListWidget::verticalScrollBar() const +{ + if (m_listView) + return m_listView->verticalScrollBar(); + return 0; +} + +#if (QT_VERSION >= 0x040600) +bool ListWidget::listItemCaching() const +{ + return m_listView->listItemCaching(); +} + +void ListWidget::setListItemCaching(bool enable) +{ + m_listView->setListItemCaching(enable); +} +#endif + +void ListWidget::setTwoColumns(const bool twoColumns) +{ + m_listView->setTwoColumns(twoColumns); +} + +bool ListWidget::twoColumns() +{ + return m_listView->twoColumns(); +} diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/listwidget.h b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/listwidget.h new file mode 100644 index 0000000..342083f --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/listwidget.h @@ -0,0 +1,87 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the examples 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 Technology Preview License Agreement accompanying +** this package. +** +** 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.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef LISTWIDGET_H +#define LISTWIDGET_H + +#include <QGraphicsWidget> +#include "simplelistview.h" +#include "scroller.h" +#include "gvbwidget.h" + +class AbstractViewItem; +class QGraphicsSceneResizeEvent; +class QGraphicsGridLayout; +class QGraphicsLinearLayout; + +class ListWidget : public GvbWidget +{ + Q_OBJECT + +public: + ListWidget(QGraphicsWidget * parent = 0); + virtual ~ListWidget(); + void addItem(QGraphicsWidget *item); + void insertItem(int index, QGraphicsWidget *item); + QGraphicsWidget* takeItem(int row); + QGraphicsWidget* itemAt(int row); + int itemCount() const; +#if (QT_VERSION >= 0x040600) + bool listItemCaching() const; + void setListItemCaching(bool enable); +#endif + ScrollBar* verticalScrollBar() const; + + void setTwoColumns(const bool twoColumns); + bool twoColumns(); + +protected: + virtual void resizeEvent( QGraphicsSceneResizeEvent * event ); + +private: + Q_DISABLE_COPY(ListWidget) + + QGraphicsLinearLayout *m_layout; + SimpleListView *m_listView; + Scroller m_scroller; +}; + +#endif diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/mainview.cpp b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/mainview.cpp new file mode 100644 index 0000000..ad62a9d --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/mainview.cpp @@ -0,0 +1,344 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the examples 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 Technology Preview License Agreement accompanying +** this package. +** +** 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.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <QDebug> +#include <QApplication> +#include <QGraphicsLinearLayout> +#ifndef QT_NO_OPENGL +#include <QGLWidget> +#endif +#include <QObject> + +#include "button.h" +#include "label.h" +#include "menu.h" +#include "topbar.h" +#include "backgrounditem.h" +#include "theme.h" +#include "mainview.h" +#include "gvbwidget.h" + +MainView::MainView(const bool enableOpenGL, const bool outputFps, const bool imageRendering, QWidget *parent) + : QGraphicsView(parent) + , m_scene(0) + , m_mainLayout(0) + , m_mainWidget(0) + , m_testWidget(0) + , m_imageBasedRendering(imageRendering) + , m_pixmapToRender(0) + , m_OutputFps(outputFps) + , m_fpsUpdated() + , m_Fpss() + , m_angle(0) + , m_enableOpenGL(enableOpenGL) +{ + construct(); +} + +MainView::~MainView() +{ + if (!m_scene->parent()) + delete m_scene; + + delete m_pixmapToRender; +} + +void MainView::setTestWidget(QGraphicsWidget *testWidget) +{ + if (!testWidget) + return; + + if (m_testWidget) { + m_mainLayout->removeItem(m_testWidget); + if (!m_testWidget->parent() && !m_testWidget->parentLayoutItem()) + delete m_testWidget; + } + m_testWidget = testWidget; + m_mainLayout->addItem(m_testWidget); + resizeContent(size()); +} + +QGraphicsWidget *MainView::takeTestWidget() +{ + if (m_testWidget) { + m_mainLayout->removeItem(m_testWidget); + QGraphicsWidget *tmp = m_testWidget; + m_testWidget = 0; + return tmp; + } + return 0; +} + +QGraphicsWidget *MainView::testWidget() +{ + return m_testWidget; +} + +void MainView::setImageBasedRendering(const bool imageBasedRendering) +{ + m_imageBasedRendering = imageBasedRendering; + delete m_pixmapToRender; + m_pixmapToRender = 0; + viewport()->update(); +} + +bool MainView::imageBasedRendering() const +{ + return m_imageBasedRendering; +} + +qreal MainView::fps() +{ + if (m_Fpss.count() <= 0) + updateFps(); + + if (m_Fpss.count() <= 0) + return 0.0; + + qreal sum = 0; + int count = m_Fpss.count(); + for (int i = 0; i<count; ++i) + sum += m_Fpss.at(i); + m_Fpss.clear(); + fpsReset(); + return sum/qreal(count); +} + +void MainView::fpsReset() +{ + m_frameCount = 0; + m_fpsFirstTs.start(); + m_fpsLatestTs = m_fpsFirstTs; + m_fpsUpdated.start(); +} + +void MainView::rotateContent(int angle) +{ + bool portrait = ((m_angle+angle)%90 == 0) && ((m_angle+angle)%180 != 0); + bool landscape = ((m_angle+angle)%180 == 0); + if (!portrait && !landscape) + return; + + m_angle = (m_angle + angle)%360; + + rotate(angle); + + resizeContent(size()); +} + +int MainView::rotationAngle() const +{ + return m_angle; +} + +void MainView::resizeContent(const QSize &s) +{ + QSizeF l_size(s); + QSizeF p_size(l_size.height(), l_size.width()); + bool portrait = (m_angle%90 == 0) && (m_angle%180 != 0); + if (portrait) { + m_mainWidget->resize(p_size); + m_backGround->resize(p_size); + } + else { + m_mainWidget->resize(l_size); + m_backGround->resize(l_size); + } + m_menu->setPos(m_topBar->getStatusBarLocation()); + setSceneRect(QRectF(m_mainWidget->pos(), m_mainWidget->size())); +} + +void MainView::resizeEvent(QResizeEvent * event) +{ + QGraphicsView::resizeEvent(event); + resizeContent(event->size()); +} + +void MainView::paintEvent (QPaintEvent *event) +{ + if (m_imageBasedRendering) { + if (!m_pixmapToRender) + m_pixmapToRender = new QPixmap(size()); + + if (m_pixmapToRender->size() != size()) { + delete m_pixmapToRender; + m_pixmapToRender = new QPixmap(size()); + } + QPainter p(m_pixmapToRender); + render(&p); + p.end(); + } + else { + QGraphicsView::paintEvent(event); + } + + if (!m_OutputFps) + emit repainted(); + + m_frameCount++; + m_fpsLatestTs.start(); + if(m_fpsUpdated.elapsed() > 2000) { + updateFps(); + m_fpsUpdated.start(); + } +} + +void MainView::keyPressEvent(QKeyEvent *event) +{ + if (event->key() == Qt::Key_F) { + if (isFullScreen()) + showNormal(); + else + showFullScreen(); + } + + //S60 3.x specific + if(m_menu->menuVisible()) { + m_menu->keyPressEvent(event); + return; + } + + if(event->key() == 16777235 ) { //Up Arrow + GvbWidget* widget = qobject_cast<GvbWidget*>(m_testWidget); + if(widget) + widget->keyPressEvent(event); + } + + if(event->key() == 16777237 ) { //Down Arrow + GvbWidget* widget = qobject_cast<GvbWidget*>(m_testWidget); + if(widget) + widget->keyPressEvent(event); + } + + if(event->key() == 17825792 ) { //LSK + if(!m_menu->menuVisible()) + m_menu->menuShowHide(); + } + + if(event->key() == 17825793 ) { //RSK + QApplication::quit(); + } +} + +void MainView::construct() +{ + m_scene = new QGraphicsScene; + +#ifndef QT_NO_OPENGL + if (m_enableOpenGL) { + qDebug() << "OpenGL enabled"; + m_scene->setSortCacheEnabled(false); + setViewport(new QGLWidget); + + // Qt doc says: This is the preferred update mode for + // viewports that do not support partial updates, such as QGLWidget... + setViewportUpdateMode(QGraphicsView::FullViewportUpdate); + } else +#endif + setViewportUpdateMode(QGraphicsView::BoundingRectViewportUpdate); + + setScene(m_scene); + m_scene->setItemIndexMethod(QGraphicsScene::NoIndex); + + //setCacheMode(QGraphicsView::CacheBackground); + setAlignment(Qt::AlignLeft | Qt::AlignTop); + + // Turn off automatic background + setAttribute(Qt::WA_OpaquePaintEvent); + setAttribute(Qt::WA_NoBackground); + setAttribute(Qt::WA_NoSystemBackground); + setAutoFillBackground(false); + + //Background + m_backGround = new BackgroundItem("background.svg"); + m_scene->addItem(m_backGround); + m_backGround->setZValue(0); + + //Menu + m_menu = new Menu(this); + m_scene->addItem(m_menu); //Add menu to the scene directly + m_menu->setZValue(10); //Bring to front + + m_mainLayout = new QGraphicsLinearLayout(Qt::Vertical); + m_mainLayout->setContentsMargins(0,0,0,0); + m_mainLayout->setSpacing(0); + + m_mainWidget = new QGraphicsWidget; + m_mainWidget->setLayout(m_mainLayout); + m_mainWidget->setZValue(1); + m_scene->addItem(m_mainWidget); + + //Topbar + m_topBar = new TopBar(this, 0); + m_mainLayout->addItem(m_topBar); + m_topBar->setZValue(1); + connect(m_topBar, SIGNAL(clicked(bool)), m_menu, SLOT(menuShowHide())); + + setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + setContentsMargins(0,0,0,0); + setViewportMargins(0,0,0,0); + setFrameShape(QFrame::NoFrame); + + fpsReset(); + m_fpsUpdated.start(); +} + +void MainView::updateFps() +{ + int msecs = m_fpsFirstTs.msecsTo(m_fpsLatestTs); + qreal fps = 0; + if (msecs > 0) { + fps = m_frameCount * 1000.0 / msecs; + + if (m_OutputFps) + qDebug() << "FPS: " << fps; + + m_Fpss.append(fps); + } + m_fpsFirstTs = m_fpsLatestTs; + m_frameCount = 0; +} + +Menu *MainView::menu() +{ + return m_menu; +} diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/mainview.h b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/mainview.h new file mode 100644 index 0000000..7591be6 --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/mainview.h @@ -0,0 +1,123 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the examples 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 Technology Preview License Agreement accompanying +** this package. +** +** 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.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef __MAINWINDOW_H__ +#define __MAINWINDOW_H__ + +#include <QGraphicsView> +#include <QTime> +#include <QTimer> + +#include "settings.h" + +class QGraphicsScene; +class QGraphicsLinearLayout; +class QResizeEvent; +class Label; +class Menu; +class BackgroundItem; +class TopBar; + +class MainView : public QGraphicsView { + +Q_OBJECT + +public: + MainView(const bool enableOpenGL, const bool outputFps, const bool imageBasedRendering = false, QWidget *parent = 0); + ~MainView(); + + void setTestWidget(QGraphicsWidget *testWidget); + QGraphicsWidget *takeTestWidget(); + QGraphicsWidget *testWidget(); + + qreal fps(); + void fpsReset(); + void setImageBasedRendering(const bool imageBasedRendering); + bool imageBasedRendering() const; + Menu *menu(); + int rotationAngle() const; + +signals: + void repainted(); + +public slots: + void rotateContent(int angle); + +protected: + + virtual void resizeEvent(QResizeEvent * event); + virtual void paintEvent(QPaintEvent *event); + virtual void keyPressEvent(QKeyEvent *event); + virtual void wheelEvent(QWheelEvent *event) { Q_UNUSED (event); }; + +private slots: + void updateFps(); + +private: + void construct(); + void resizeContent(const QSize &s); + +private: + Q_DISABLE_COPY(MainView) + + QGraphicsScene *m_scene; + QGraphicsLinearLayout *m_mainLayout; + QGraphicsWidget *m_mainWidget; + QGraphicsWidget *m_testWidget; + Menu* m_menu; + BackgroundItem* m_backGround; + TopBar* m_topBar; + + bool m_imageBasedRendering; + QPixmap *m_pixmapToRender; + // Used for FPS + int m_frameCount; + QTime m_fpsFirstTs; + QTime m_fpsLatestTs; + bool m_OutputFps; + QTime m_fpsUpdated; + QList<qreal> m_Fpss; + + int m_angle; + bool m_enableOpenGL; +}; + +#endif //__MAINWINDOW_H__ diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/menu.cpp b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/menu.cpp new file mode 100644 index 0000000..3de39b8 --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/menu.cpp @@ -0,0 +1,202 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the examples 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 Technology Preview License Agreement accompanying +** this package. +** +** 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.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <QGraphicsView> +#include <QGraphicsWidget> +#include <QGraphicsLinearLayout> +#include <QList> + +#include "button.h" +#include "menu.h" +#include "themeevent.h" +#include "theme.h" + +static const int MinMenuItemWidth = 150; +static const int MinMenuItemHeight = 40; + +Menu::Menu(QGraphicsView* parent) : QGraphicsWidget(), + m_Parent(parent), m_Layout(new QGraphicsLinearLayout(Qt::Vertical, this)), + m_ButtonContainer(0), m_isMenuVisible(false), m_currentSelectedIndex(-1) +{ + init(); +} + +Menu::~Menu() +{ + for(int i = 0; i < m_ButtonContainer->count(); i++ ) { + delete m_ButtonContainer->at(i); + } + m_ButtonContainer->clear(); + + delete m_ButtonContainer; + m_ButtonContainer = 0; +} + +void Menu::init() +{ + m_ButtonContainer = new QList<Button*>; + + m_Layout->setContentsMargins(0,0,0,0); + m_Layout->setSpacing(0); + + setMinimumWidth(150); + + setLayout(m_Layout); + + connect(Theme::p(), SIGNAL(themeChanged()), this, SLOT(themeChange())); +} + +Button* Menu::addMenuItem(const QString itemName, QObject* receiver, const char* member) +{ + Button* button = new Button(itemName ,this); + button->setVisible(m_isMenuVisible); + connect(button, SIGNAL(clicked(bool)), receiver, member); + connect(button, SIGNAL(clicked(bool)), this, SLOT(menuShowHide())); + m_ButtonContainer->append(button); + button->setMinimumWidth(MinMenuItemWidth); + button->setMinimumHeight(MinMenuItemHeight); + return button; +} + +void Menu::menuShowHide() +{ + m_isMenuVisible ? menuHide() : menuShow(); + m_isMenuVisible = !m_isMenuVisible; +} + +void Menu::menuShow() +{ + for(int i = 0; i < m_ButtonContainer->count(); i++) { + Button* button = m_ButtonContainer->at(i); + m_Layout->addItem(button); + button->show(); + } +} + +void Menu::menuHide() +{ + for(int i = 0; i < m_ButtonContainer->count(); i++) { + Button* button = m_ButtonContainer->at(i); + button->select(false); + button->hide(); + m_Layout->removeItem(button); + } + m_currentSelectedIndex = -1; +} + +void Menu::themeChange() +{ + QPixmap pixmap = Theme::p()->pixmap("status_field_middle.svg", + QSize(MinMenuItemWidth, MinMenuItemHeight)); + + for(int i = 0; i < m_ButtonContainer->count(); i++) { + Button* button = m_ButtonContainer->at(i); + button->setBackground(pixmap); + } + update(); +} + +void Menu::keyPressEvent(QKeyEvent *event) +{ + //S60 3.x specific + if(event->key() == 16777235 ) { //Up Arrow + if(m_currentSelectedIndex > 0) { //One step up + Button* button = m_ButtonContainer->at(m_currentSelectedIndex); + button->select(false); + button->update(); + + m_currentSelectedIndex--; + button = m_ButtonContainer->at(m_currentSelectedIndex); + button->select(true); + button->update(); + } + else { //Jump to bottom + if(m_currentSelectedIndex >= 0) { + Button* button = m_ButtonContainer->at(m_currentSelectedIndex); + button->select(false); + button->update(); + } + m_currentSelectedIndex = m_ButtonContainer->count() -1; + if(m_currentSelectedIndex >= 0) { + Button* button = m_ButtonContainer->at(m_currentSelectedIndex); + button->select(true); + button->update(); + } + } + } + + if(event->key() == 16777237 ) { //Down Arrow + if (m_currentSelectedIndex < m_ButtonContainer->count()-1) { //One step down + if(m_currentSelectedIndex >= 0) { + Button* button = m_ButtonContainer->at(m_currentSelectedIndex); + button->select(false); + button->update(); + } + m_currentSelectedIndex++; + Button* button = m_ButtonContainer->at(m_currentSelectedIndex); + button->select(true); + button->update(); + } + else { //Jump to top + if(m_currentSelectedIndex >= 0) { + Button* button = m_ButtonContainer->at(m_currentSelectedIndex); + button->select(false); + button->update(); + m_currentSelectedIndex = 0; + button = m_ButtonContainer->at(m_currentSelectedIndex); + button->select(true); + button->update(); + } + } + } + + if(event->key() == 17825792 || event->key() == 16842752 || //LSK, center key or enter + event->key() == 16777221 ) { + if(m_currentSelectedIndex >= 0) { + Button* button = m_ButtonContainer->at(m_currentSelectedIndex); + button->click(); + } + } + + if(event->key() == 17825793 ) { //RSK + menuShowHide(); + } +} diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/menu.h b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/menu.h new file mode 100644 index 0000000..1f762ec --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/menu.h @@ -0,0 +1,84 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the examples 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 Technology Preview License Agreement accompanying +** this package. +** +** 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.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef __MENU_H__ +#define __MENU_H__ + +#include <QGraphicsWidget> +#include <QList> + +class QGraphicsView; +class QGraphicsLinearLayout; +class Button; + +class Menu : public QGraphicsWidget +{ + Q_OBJECT +public: + Menu(QGraphicsView* parent); + ~Menu(); + +public: + Button* addMenuItem(const QString itemName, QObject* receiver, const char* member); + inline bool menuVisible() { return m_isMenuVisible; } + virtual void keyPressEvent(QKeyEvent *event); + +public slots: + void themeChange(); + +public slots: + void menuShowHide(); + +private: + void init(); + void menuShow(); + void menuHide(); + +private: + Q_DISABLE_COPY(Menu) + QGraphicsView* m_Parent; + QGraphicsLinearLayout* m_Layout; + QList<Button*>* m_ButtonContainer; + bool m_isMenuVisible; + int m_currentSelectedIndex; +}; + +#endif // __MENU_H__ diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/recycledlistitem.cpp b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/recycledlistitem.cpp new file mode 100644 index 0000000..f84b90a --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/recycledlistitem.cpp @@ -0,0 +1,147 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the examples 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 Technology Preview License Agreement accompanying +** this package. +** +** 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.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <QGraphicsGridLayout> +#include <QDebug> + +#include "recycledlistitem.h" +#include "listmodel.h" + +static const int MinItemHeight = 70; +static const int MinItemWidth = 276; + +RecycledListItem::RecycledListItem(QGraphicsWidget *parent) + : AbstractViewItem(parent), + m_item(new ListItem(this)), + m_item2(0), + m_model(0), + m_layout(new QGraphicsGridLayout()) +{ + m_item->setMinimumWidth(MinItemWidth); + setContentsMargins(0,0,0,0); + setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); + m_layout->addItem(m_item, 0, 0); + setLayout(m_layout); + m_layout->setContentsMargins(0,0,0,0); + m_layout->setSpacing(0); + m_layout->setHorizontalSpacing(0.0); + m_layout->setVerticalSpacing(0.0); +} + +RecycledListItem::~RecycledListItem() +{ +} + +void RecycledListItem::setModel(QAbstractItemModel *model) +{ + m_model = model; +} + +/*virtual*/ +AbstractViewItem *RecycledListItem::newItemInstance() +{ + RecycledListItem* item = new RecycledListItem(); + return item; +} + +QSizeF RecycledListItem::effectiveSizeHint(Qt::SizeHint which, const QSizeF &constraint) const +{ + QSizeF s = m_item->effectiveSizeHint(which,constraint); + if (m_item2) + s.setWidth(s.width()*2); + if (s.height()<MinItemHeight) + s.setHeight(MinItemHeight); + return s; +} + +QVariant RecycledListItem::data(int role) const +{ + if (m_item && role == Qt::DisplayRole) + return m_item->data(); + + return QVariant(); +} + +void RecycledListItem::setData(const QVariant &value, int role) +{ + if (m_item && role == Qt::DisplayRole) { + m_item->setData(value); + if (m_item2) { + m_item2->setData(value); + } + } +} + +/*virtual*/ +void RecycledListItem::resizeEvent(QGraphicsSceneResizeEvent *event) +{ + AbstractViewItem::resizeEvent(event); +} + +void RecycledListItem::updateItemContents() +{ + AbstractViewItem::updateItemContents(); + if (m_model && m_index.isValid()) + setData(m_model->data(m_index,Qt::DisplayRole), Qt::DisplayRole); +} + +void RecycledListItem::setTwoColumns(const bool enabled) +{ + if (m_item2 && enabled) + return; + + if (enabled) { + m_item2 = new ListItem(); + m_item2->setMinimumWidth(MinItemWidth); + m_layout->addItem(m_item2, 0, 1); + updateItemContents(); + } + else { + if (m_layout->count() > 1) { + m_layout->removeAt(1); + } + delete m_item2; + m_item2 = 0; + } + + if (!m_layout->isActivated()) + m_layout->activate(); +} diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/recycledlistitem.h b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/recycledlistitem.h new file mode 100644 index 0000000..a155eef --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/recycledlistitem.h @@ -0,0 +1,83 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the examples 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 Technology Preview License Agreement accompanying +** this package. +** +** 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.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef RECYCLEDLISTITEM_H +#define RECYCLEDLISTITEM_H + +#include "abstractviewitem.h" + +class ListItem; +class QGraphicsWidget; +class QGraphicsGridLayout; + +class RecycledListItem : public AbstractViewItem +{ + Q_OBJECT +public: + RecycledListItem(QGraphicsWidget *parent=0); + virtual ~RecycledListItem(); + + virtual void setModel(QAbstractItemModel *model); + + virtual AbstractViewItem *newItemInstance(); + virtual void updateItemContents(); + + virtual QVariant data(int role) const; + virtual void setData(const QVariant &value, int role = Qt::DisplayRole); + + ListItem *item() { return m_item; } + + void setTwoColumns(const bool enabled); + +protected: + virtual QSizeF effectiveSizeHint(Qt::SizeHint which, const QSizeF &constraint = QSizeF()) const; + virtual void resizeEvent(QGraphicsSceneResizeEvent *event); + +private: + Q_DISABLE_COPY(RecycledListItem) + + ListItem *m_item; + ListItem *m_item2; + QAbstractItemModel *m_model; + QGraphicsGridLayout *m_layout; +}; + +#endif // RECYCLEDLISTITEM_H diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/resourcemoninterface.h b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/resourcemoninterface.h new file mode 100644 index 0000000..990843a --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/resourcemoninterface.h @@ -0,0 +1,97 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the examples 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 Technology Preview License Agreement accompanying +** this package. +** +** 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.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef __RESOURCEMONINTERFACE_H__ +#define __RESOURCEMONINTERFACE_H__ + +class ResourceMonitorInterface +{ +public: + struct MemoryAllocation + { + int allocatedInAppThread; + int numberOfAllocatedCellsInAppThread; + int availableMemoryInAppThreadHeap; + qint64 availableMemoryInSystem; + qint64 totalMemoryInSystem; + MemoryAllocation() : + allocatedInAppThread(0), + numberOfAllocatedCellsInAppThread(0), + availableMemoryInAppThreadHeap(0), + availableMemoryInSystem(0), + totalMemoryInSystem(0) + {} + }; + + struct CpuUsage + { + qreal systemUsage; + qreal appTreadUsage; + CpuUsage() : + systemUsage(0.0), + appTreadUsage(0.0) + {} + }; + +public: + virtual ~ResourceMonitorInterface() {} + +public: + //for symbian, prepares the resource monitor for data capture, opens handle to ekern null + //thread and sets initial values + virtual bool Prepare(QString applicationThreadName) = 0; + + //functions for CPU load and memory - Call Prepare before calling these + virtual CpuUsage CPULoad()=0; + virtual MemoryAllocation MemoryLoad()=0; + + virtual void BeginMeasureMemoryLoad()=0; + virtual MemoryAllocation EndMeasureMemoryLoad()=0; + + virtual void BeginMeasureCPULoad()=0; + virtual CpuUsage EndMeasureCPULoad()=0; + +}; + +Q_DECLARE_INTERFACE(ResourceMonitorInterface, + "com.trolltech.Plugin.ResourceMonitorInterface/1.0"); + +#endif //__RESOURCEMONINTERFACE_H__ diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/scrollbar.cpp b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/scrollbar.cpp new file mode 100644 index 0000000..4cf05e5 --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/scrollbar.cpp @@ -0,0 +1,299 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the examples 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 Technology Preview License Agreement accompanying +** this package. +** +** 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.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <QGraphicsWidget> +#include <QPainter> +#include <QGraphicsSceneMouseEvent> +#include <QDebug> + +#include "scrollbar.h" +#include "theme.h" + +class ScrollBarPrivate { + Q_DECLARE_PUBLIC(ScrollBar) + +public: + + ScrollBarPrivate(Qt::Orientation orientation, ScrollBar *scrollBar) + : orientation(orientation) + , sliderPosition(0.0) + , sliderSize(0.0) + , sliderDown(false) + , q_ptr(scrollBar) + { + construct(); + } + + void themeChange() + { + construct(); + updateSlider(); + } + + void construct() + { + scrollerPixmap = Theme::p()->pixmap("scroll.svg"); + scrollBarPixmap = Theme::p()->pixmap("scrollbar.svg"); + + if (orientation == Qt::Horizontal) { + scrollerPixmap = scrollerPixmap.transformed(QTransform().rotate(90)); + scrollBarPixmap = scrollBarPixmap.transformed(QTransform().rotate(90)); + } + } + + void setSliderPosition(qreal pos) + { + if (pos < 0.0) + pos = 0.0; + + if (pos > sliderSize) + pos = sliderSize; + + sliderPosition = pos; + + if (!qFuzzyCompare(pos, sliderPosition)) + updateSlider(); + } + + void updateSlider() + { + QRectF oldSlider = slider; + slider = q_func()->boundingRect(); + + qreal x = 0; + qreal y = 0; + qreal w = scrollerPixmap.width(); + qreal h = scrollerPixmap.height(); + + //Adjust the scrollBar in relation to the scroller + + if (orientation == Qt::Horizontal) { + qreal scrollBarHeight = scrollBarPixmap.height(); + + if (h > scrollBarHeight) { + slider.setTop((h - scrollBarHeight)/2.0); + slider.setHeight(scrollBarHeight); + } + } else { + qreal scrollBarWidth = scrollBarPixmap.width(); + + if (w > scrollBarWidth) { + slider.setLeft((w - scrollBarWidth)/2.0); + } + slider.setWidth(scrollBarWidth); + } + + if(oldSlider != slider && (slider.size().width() > 0 &&slider.size().height() > 0 )) { + scrollBarPixmap = Theme::p()->pixmap("scrollbar.svg", slider.size().toSize()); + } + cursor = QRectF(x, y, w, h); + + if (orientation == Qt::Horizontal) { + qreal dx = qreal(int(sliderPosition)) * (slider.width() - cursor.width()) / sliderSize; + cursor.translate(dx, 0.0); + } else { + qreal dy = qreal(int(sliderPosition)) * (slider.height() - cursor.height()) / sliderSize; + cursor.translate(0.0, dy); + } + } + + Qt::Orientation orientation; + qreal sliderPosition; + qreal sliderSize; + + QPointF pressPos; + bool sliderDown; + + QRectF slider; + QRectF cursor; + QPixmap scrollerPixmap; + QPixmap scrollBarPixmap; + + ScrollBar *q_ptr; +}; + +ScrollBar::ScrollBar(Qt::Orientation orientation, QGraphicsWidget *parent) + : QGraphicsWidget(parent) + , d_ptr(new ScrollBarPrivate(orientation, this)) +{ + setSizePolicy(QSizePolicy::Fixed, QSizePolicy::MinimumExpanding); + setContentsMargins(0, 0, 0, 0); + + connect(Theme::p(), SIGNAL(themeChanged()), this, SLOT(themeChange())); +} + +ScrollBar::~ScrollBar() +{ + delete d_ptr; +} + +qreal ScrollBar::sliderSize() const +{ + Q_D(const ScrollBar); + return d->sliderSize; +} + +void ScrollBar::setSliderSize(const qreal s) +{ + Q_D(ScrollBar); + d->sliderSize = s; +} + +void ScrollBar::setSliderPosition(qreal pos) +{ + Q_D(ScrollBar); + + d->setSliderPosition(pos); + prepareGeometryChange(); + emit sliderPositionChange(d->sliderPosition); +} + +qreal ScrollBar::sliderPosition() const +{ + Q_D(const ScrollBar); + return d->sliderPosition; +} + +bool ScrollBar::sliderDown() const +{ + Q_D(const ScrollBar); + return d->sliderDown; +} + +void ScrollBar::paint(QPainter *painter, + const QStyleOptionGraphicsItem *option, + QWidget *widget) +{ + Q_D(ScrollBar); + Q_UNUSED(widget); + Q_UNUSED(option); + + d->updateSlider(); + + QRect sliderRect = d->slider.toRect(); + painter->drawPixmap(sliderRect.topLeft(), d->scrollBarPixmap); + + QRect cursorRect = d->cursor.toRect(); + painter->drawPixmap(cursorRect.topLeft(), d->scrollerPixmap); +} + +QSizeF ScrollBar::sizeHint(Qt::SizeHint which, + const QSizeF &constraint) const +{ + Q_D(const ScrollBar); + + QSizeF s; + + if (d->orientation == Qt::Horizontal) + s = QSizeF(-1, qMax(d->scrollBarPixmap.height(), d->scrollerPixmap.height())); + else + s = QSizeF(qMax(d->scrollBarPixmap.width(), d->scrollerPixmap.width()), -1); + + switch (which) + { + case Qt::MinimumSize: + return s; + + case Qt::MaximumSize: + return s; + + default: + return QGraphicsWidget::sizeHint(which, constraint); + } +} + +void ScrollBar::mousePressEvent(QGraphicsSceneMouseEvent *event) +{ + Q_D(ScrollBar); + + d->updateSlider(); + + if (d->cursor.contains(event->pos())) { + d->sliderDown = true; + d->pressPos = event->pos(); + emit sliderPressed(); + } +} + +void ScrollBar::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) +{ + Q_D(ScrollBar); + Q_UNUSED(event); + + d->sliderDown = false; +} + +void ScrollBar::mouseMoveEvent(QGraphicsSceneMouseEvent *event) +{ + Q_D(ScrollBar); + + if (!d->sliderDown) + return; + + if (d->orientation == Qt::Horizontal) { + qreal f = (event->pos().x() - d->pressPos.x())/(d->slider.width() - d->cursor.width()); + qreal dx = f * d->sliderSize; + + d->setSliderPosition(d->sliderPosition + dx); + } else { + qreal f = (event->pos().y() - d->pressPos.y())/(d->slider.height() - d->cursor.height()); + qreal dy = f * d->sliderSize; + + d->setSliderPosition(d->sliderPosition + dy); + } + + d->pressPos = event->pos(); + + prepareGeometryChange(); + emit sliderPositionChange(d->sliderPosition); +} + +void ScrollBar::resizeEvent(QGraphicsSceneResizeEvent *event) +{ + QGraphicsWidget::resizeEvent(event); +} + +void ScrollBar::themeChange() +{ + Q_D(ScrollBar); + d->themeChange(); +} + diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/scrollbar.h b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/scrollbar.h new file mode 100644 index 0000000..3b0ae04 --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/scrollbar.h @@ -0,0 +1,97 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the examples 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 Technology Preview License Agreement accompanying +** this package. +** +** 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.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef SCROLLBAR_H +#define SCROLLBAR_H + +#include <QGraphicsWidget> +#include <QPixmap> + +class ScrollBarPrivate; + +class ScrollBar : public QGraphicsWidget +{ + Q_OBJECT + Q_DECLARE_PRIVATE(ScrollBar) + +public: + + ScrollBar(Qt::Orientation orientation, QGraphicsWidget *parent=0); + virtual ~ScrollBar(); + +public: + + bool sliderDown() const; + qreal sliderPosition() const; + qreal sliderSize() const; + void setSliderSize(const qreal s); + +signals: + + void sliderPressed(); + + void sliderPositionChange(qreal position); + +public slots: + + void setSliderPosition(qreal pos); + void themeChange(); + +private: + + void paint(QPainter *painter, + const QStyleOptionGraphicsItem *option, + QWidget *widget); + + QSizeF sizeHint(Qt::SizeHint which, + const QSizeF &constraint = QSizeF()) const; + + void mousePressEvent(QGraphicsSceneMouseEvent *event); + void mouseReleaseEvent(QGraphicsSceneMouseEvent *event); + void mouseMoveEvent(QGraphicsSceneMouseEvent *event); + void resizeEvent(QGraphicsSceneResizeEvent *event); + +private: + Q_DISABLE_COPY(ScrollBar) + ScrollBarPrivate *d_ptr; +}; + +#endif // SCROLLBAR_H diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/scroller.cpp b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/scroller.cpp new file mode 100644 index 0000000..1cdcaf9 --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/scroller.cpp @@ -0,0 +1,305 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the examples 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 Technology Preview License Agreement accompanying +** this package. +** +** 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.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <QScrollBar> +#include <QEvent> +#include <QGraphicsSceneMouseEvent> +#include <QGraphicsView> +#include <QDebug> + +#include "scroller.h" +#include "scroller_p.h" +#include "abstractscrollarea.h" +#include "scrollbar.h" + +const int ScrollStep = 1; +const int UpdateScrollingInterval = 55; +const int UpdateScrollingSmoothInterval = 0; +static const qreal MaxScrollingSpeed = 48.0; + +ScrollerPrivate::ScrollerPrivate(Scroller *scroller) + : m_scrollArea(0) + , m_scrollFactor(1.0) + , m_state(Stopped) + , q_ptr(scroller) + , m_eventViewport(0) +{ +} + +ScrollerPrivate::~ScrollerPrivate() +{ +} + +void ScrollerPrivate::stopScrolling() +{ + m_state = ScrollerPrivate::Started; + m_cursorPos = QCursor::pos(); + m_speed = QPoint(0, 0); + + if (m_scrollTimer.isActive()) + m_scrollTimer.stop(); +} + +//Maps screen coordinates to scrollArea coordinates though current m_eventViewport widget +QPointF ScrollerPrivate::mapToScrollArea(const QPoint &point) +{ + if (!m_scrollArea || !m_eventViewport) + return point; + + QObject *vparent = m_eventViewport->parent(); + if (!vparent) + return point; + + QGraphicsView *view = qobject_cast<QGraphicsView*>(vparent); + if (!view) + return point; + + QPoint pt = view->mapFromGlobal(point); + return m_scrollArea->mapFromScene(view->mapToScene(pt)); +} + +bool ScrollerPrivate::eventFilter(QObject *obj, QEvent *event) +{ + if (obj != m_scrollArea + || (event->type() != QEvent::GraphicsSceneMouseMove + && event->type() != QEvent::GraphicsSceneMousePress + && event->type() != QEvent::GraphicsSceneMouseRelease + /*&& event->type() != QEvent::GraphicsSceneKeyPressed + && event->type() != QEvent::GraphicsSceneKeyReleased*/)) + return false; + + QGraphicsSceneMouseEvent* mouseEvent = + static_cast<QGraphicsSceneMouseEvent*>(event); + + m_eventViewport = mouseEvent->widget(); + + bool eventConsumed = false; + + switch (m_state) { + case ScrollerPrivate::Stopped: + if (mouseEvent->type() == QEvent::GraphicsSceneMousePress && + mouseEvent->buttons() == Qt::LeftButton) { + m_cursorPos = QCursor::pos(); + m_speed = QPointF(0.0, 0.0); + m_state = Started; + } + + eventConsumed = true; + break; + + case ScrollerPrivate::Started: + if (mouseEvent->type() == QEvent::GraphicsSceneMouseMove) { + m_cursorPos = QCursor::pos(); + m_state = ManualScrolling; + + if (!m_scrollTimer.isActive()) + m_scrollTimer.start(UpdateScrollingInterval); + else { + m_scrollTimer.stop(); + m_scrollTimer.start(UpdateScrollingInterval); + } + + } else if (mouseEvent->type() == QEvent::MouseButtonRelease) { + m_speed = QPoint(0, 0); + m_state = Stopped; + + if (m_scrollTimer.isActive()) + m_scrollTimer.stop(); + } + eventConsumed = true; + break; + + case ScrollerPrivate::ManualScrolling: + if (mouseEvent->type() == QEvent::GraphicsSceneMouseMove && + m_scrollArea->viewport()->boundingRect().contains(mouseEvent->pos()) ) { + + ScrollBar *hscroll = m_scrollArea->horizontalScrollBar(); + ScrollBar *vscroll = m_scrollArea->verticalScrollBar(); + + QPointF d = m_scrollFactor * (mapToScrollArea(QCursor::pos()) - mapToScrollArea(m_cursorPos)); + + hscroll->setSliderPosition(hscroll->sliderPosition() - d.x()); + vscroll->setSliderPosition(vscroll->sliderPosition() - d.y()); + + if (m_lastCursorTime.elapsed() > UpdateScrollingInterval) { + m_speed = mapToScrollArea(QCursor::pos()) - mapToScrollArea(m_cursorPos); + m_lastCursorTime.restart(); + } + + m_lastFrameTime.restart(); + + m_cursorPos = QCursor::pos(); + } else if (mouseEvent->type() == QEvent::GraphicsSceneMouseRelease) { + m_state = AutoScrolling; + m_scrollSlowAccum = 0; + if (m_scrollTimer.isActive()) { + m_scrollTimer.stop(); + m_scrollTimer.start(UpdateScrollingSmoothInterval); + } + } + eventConsumed = true; + break; + + case ScrollerPrivate::AutoScrolling: + if (mouseEvent->type() == QEvent::GraphicsSceneMousePress) { + stopScrolling(); + } else if (mouseEvent->type() == QEvent::MouseButtonRelease) { + m_state = Stopped; + } + eventConsumed = true; + break; + + default: + break; + } + + return eventConsumed; +} + +void ScrollerPrivate::updateScrolling() +{ + bool scrollOngoing = false; + + if (!m_scrollArea) { + m_scrollTimer.stop(); + return; + } + + if (m_state == ManualScrolling) { + scrollOngoing = true; + m_speed = mapToScrollArea(QCursor::pos()) - mapToScrollArea(m_cursorPos); + m_cursorPos = QCursor::pos(); + } else if (m_state == AutoScrolling) { + scrollOngoing = true; + + + qreal x = qMax(-MaxScrollingSpeed, qMin(m_speed.x(), MaxScrollingSpeed)); + qreal y = qMax(-MaxScrollingSpeed, qMin(m_speed.y(), MaxScrollingSpeed)); + + int sinceLast = m_lastFrameTime.elapsed(); + int slowdown = (ScrollStep * sinceLast) + m_scrollSlowAccum; + m_scrollSlowAccum = slowdown & 0x3F; + slowdown >>= 6; + + if (x > 0) + x= qMax(qreal(0.0), x - slowdown); + else + x = qMin(qreal(0.0), x + slowdown); + + if (y > 0) + y = qMax(qreal(0.0), y - slowdown); + else + y = qMin(qreal(0.0), y + slowdown); + + m_speed = QPoint(x,y); + + if (m_speed != QPoint(0,0)) { + QPointF d; + + int xstep = (int(m_speed.x()) * sinceLast)>>6; // >>6 ~= *60 /1000 (==*64 /1024) + int ystep = (int(m_speed.y()) * sinceLast)>>6; + //qDebug() << sinceLast << "speedy" << speed.y()<<"ystep" << ystep; + QPoint step = QPoint(xstep,ystep); + + if (ystep > 0) + d = (m_scrollArea->pos() + step); + else + d = -(m_scrollArea->pos() - step); + + ScrollBar *hscroll = m_scrollArea->horizontalScrollBar(); + ScrollBar *vscroll = m_scrollArea->verticalScrollBar(); + + hscroll->setSliderPosition(hscroll->sliderPosition() - m_scrollFactor * d.x()); + vscroll->setSliderPosition(vscroll->sliderPosition() - m_scrollFactor * d.y()); + } else { + m_state = Stopped; + scrollOngoing = false; + } + } + + m_lastFrameTime.restart(); + + if (!scrollOngoing) + m_scrollTimer.stop(); +} + + +Scroller::Scroller(QObject *parent) + : QObject(parent), d_ptr(new ScrollerPrivate(this)) +{ + Q_D(Scroller); + connect(&d->m_scrollTimer, SIGNAL(timeout()), this, SLOT(updateScrolling())); +} + +Scroller::~Scroller() +{ + delete d_ptr; +} + +void Scroller::setScrollable(AbstractScrollArea *area) +{ + Q_D(Scroller); + + if (!area) + return; + + d->m_scrollArea = area; +} + +void Scroller::setScrollFactor(qreal scrollFactor) +{ + Q_D(Scroller); + + d->m_scrollFactor = scrollFactor; +} + +bool Scroller::eventFilter(QObject *obj, QEvent *event) +{ + Q_D(Scroller); + return d->eventFilter(obj, event); +} + +void Scroller::stopScrolling() +{ + Q_D(Scroller); + d->stopScrolling(); +} +#include "moc_scroller.cpp" diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/scroller.h b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/scroller.h new file mode 100644 index 0000000..d3c9f35 --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/scroller.h @@ -0,0 +1,79 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the examples 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 Technology Preview License Agreement accompanying +** this package. +** +** 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.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef SCROLLER_H +#define SCROLLER_H + +#include <QObject> + +class ScrollerPrivate; +class AbstractScrollArea; + +class Scroller : public QObject +{ + Q_OBJECT + +public: + + Scroller(QObject *parent = 0); + virtual ~Scroller(); + +public: + + void setScrollable(AbstractScrollArea *area); + void setScrollFactor(qreal scrollFactor); + void stopScrolling(); + +private: + + bool eventFilter(QObject *obj, QEvent *ev); + +private: + + Q_DECLARE_PRIVATE(Scroller) + Q_DISABLE_COPY(Scroller) + + Q_PRIVATE_SLOT(d_ptr, void updateScrolling()) + + ScrollerPrivate * const d_ptr; +}; + +#endif // SCROLLER_H diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/scroller_p.h b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/scroller_p.h new file mode 100644 index 0000000..69c04a0 --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/scroller_p.h @@ -0,0 +1,103 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the examples 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 Technology Preview License Agreement accompanying +** this package. +** +** 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.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef SCROLLER_P_H +#define SCROLLER_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include <QPoint> +#include <QTimer> +#include <QTime> + +#include "scroller.h" + +class AbstractScrollArea; + +class ScrollerPrivate +{ + Q_DECLARE_PUBLIC(Scroller) + +public: + enum State { + Stopped, + Started, + ManualScrolling, + AutoScrolling + }; + + ScrollerPrivate(Scroller *scroller); + ~ScrollerPrivate(); + void stopScrolling(); + bool eventFilter(QObject *obj, QEvent *ev); + + AbstractScrollArea *m_scrollArea; + qreal m_scrollFactor; + QPoint m_cursorPos; + QPointF m_speed; + State m_state; + QTime m_lastCursorTime; + QTime m_lastFrameTime; + QTimer m_scrollTimer; + int m_scrollSlowAccum; + +private Q_SLOTS: + + void updateScrolling(); + +private: + + Q_DISABLE_COPY(ScrollerPrivate) + Scroller * const q_ptr; + QPointF mapToScrollArea(const QPoint &point); + QWidget *m_eventViewport; +}; + +#endif // SCROLLER_P_H diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/settings.cpp b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/settings.cpp new file mode 100644 index 0000000..bffedf7 --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/settings.cpp @@ -0,0 +1,59 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the examples 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 Technology Preview License Agreement accompanying +** this package. +** +** 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.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "settings.h" + + +Settings::Settings() + : QObject(), + m_scriptName(), + m_outputFileName(), + m_resultFormat(0), + m_size(0,0), + m_angle(0), + m_listItemCount(200), + m_options() +{ +} + +Settings::~Settings() +{ +} diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/settings.h b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/settings.h new file mode 100644 index 0000000..d2c0122 --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/settings.h @@ -0,0 +1,116 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the examples 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 Technology Preview License Agreement accompanying +** this package. +** +** 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.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef SETTINGS_H +#define SETTINGS_H + +#include <QObject> +#include <QSize> +#include <QString> +#include <QFlags> + +class Settings : public QObject { + Q_OBJECT + +public: + enum Option { + NoOptions = 0x1, + UseListItemCache = 0x2, + UseOpenGL = 0x4, + OutputFps = 0x8, + NoResourceUsage = 0x10, + ManualTest = 0x20 + }; + Q_DECLARE_FLAGS(Options, Option) + + Settings(); + ~Settings(); + + const QString &scriptName() const + { return m_scriptName; } + void setScriptName(const QString& scriptName) + { m_scriptName = scriptName; } + + const QString &outputFileName() const + { return m_outputFileName; } + void setOutputFileName(const QString& outputFileName) + { m_outputFileName = outputFileName; } + + int resultFormat() const + { return m_resultFormat; } + void setResultFormat(int resultFormat) + { m_resultFormat = resultFormat; } + + const QSize& size() const + { return m_size; } + void setSize(const QSize& size) + { m_size = size; } + + int angle() const + { return m_angle; } + void setAngle(int angle) + { m_angle = angle; } + + const Options& options() const + { return m_options; } + void setOptions(Options options) + { m_options = options; } + + int listItemCount() + { return m_listItemCount; } + + void setListItemCount(int items) + { m_listItemCount = items; } + +private: + + QString m_scriptName; + QString m_outputFileName; + int m_resultFormat; + QSize m_size; + int m_angle; + int m_listItemCount; + Options m_options; +}; + +Q_DECLARE_OPERATORS_FOR_FLAGS(Settings::Options) + +#endif diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/simplelist.cpp b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/simplelist.cpp new file mode 100644 index 0000000..af25628 --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/simplelist.cpp @@ -0,0 +1,164 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the examples 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 Technology Preview License Agreement accompanying +** this package. +** +** 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.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <QDebug> +#include <QGraphicsLinearLayout> +#include <QFont> +#include <QTime> + +#include "simplelist.h" +static const int MinItemWidth = 276; + +SimpleList::SimpleList(QGraphicsWidget *parent) + : GvbWidget(parent), + m_list(new ListWidget(this)) +{ + QGraphicsLinearLayout *layout = new QGraphicsLinearLayout(); + layout->setContentsMargins(0,0,0,0); + setContentsMargins(0,0,0,0); + setLayout(layout); + layout->addItem(m_list); + setObjectName("SimpleList"); +} + +/*virtual*/ +SimpleList::~SimpleList() +{ +} + +void SimpleList::addItem(ListItem *item) +{ + item->setMinimumWidth(MinItemWidth); + m_list->addItem(item); +} + +void SimpleList::insertItem(int index, ListItem *item) +{ + item->setMinimumWidth(MinItemWidth); + m_list->insertItem(index, item); +} + +ListItem* SimpleList::takeItem(int row) +{ + return static_cast<ListItem*>(m_list->takeItem(row)); +} + +ListItem* SimpleList::itemAt(int row) +{ + return static_cast<ListItem*>(m_list->itemAt(row)); +} + +int SimpleList::itemCount() const +{ + if (m_list) + return m_list->itemCount(); + return 0; +} + +ScrollBar* SimpleList::verticalScrollBar() const +{ + if (m_list) + return m_list->verticalScrollBar(); + return 0; +} + +bool SimpleList::listItemCaching() const +{ +#if (QT_VERSION >= 0x040600) + return m_list->listItemCaching(); +#else + return false; +#endif +} + +void SimpleList::setListItemCaching(bool enable) +{ +#if (QT_VERSION >= 0x040600) + m_list->setListItemCaching(enable); +#else + Q_UNUSED(enable) +#endif +} + +void SimpleList::keyPressEvent(QKeyEvent *event) +{ + static QTime keyPressInterval = QTime::currentTime(); + static qreal step = 0.0; + static bool repeat = false; + int interval = keyPressInterval.elapsed(); + + ScrollBar* sb = verticalScrollBar(); + qreal currentValue = sb->sliderPosition(); + + if(interval < 250 ) { + if(!repeat) step = 0.0; + step = step + 2.0; + if(step > 100) step = 100; + repeat = true; + } + else { + step = 1.0; + if(itemAt(0)) + step = itemAt(0)->size().height(); + repeat = false; + } + + if(event->key() == Qt::Key_Up ) { //Up Arrow + sb->setSliderPosition(currentValue - step); + } + + if(event->key() == Qt::Key_Down ) { //Down Arrow + sb->setSliderPosition(currentValue + step); + } + keyPressInterval.start(); +} + + +void SimpleList::setTwoColumns(const bool twoColumns) +{ + m_list->setTwoColumns(twoColumns); +} + +bool SimpleList::twoColumns() +{ + return m_list->twoColumns(); +} + diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/simplelist.h b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/simplelist.h new file mode 100644 index 0000000..152cce7 --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/simplelist.h @@ -0,0 +1,80 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the examples 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 Technology Preview License Agreement accompanying +** this package. +** +** 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.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef SIMPLELIST_H_ +#define SIMPLELIST_H_ + + +#include "gvbwidget.h" +#include "listitem.h" +#include "listwidget.h" + +class QGraphicsWidget; + +class SimpleList : public GvbWidget +{ + Q_OBJECT + +public: + SimpleList(QGraphicsWidget *parent=0); + virtual ~SimpleList(); + void addItem(ListItem *item); + void insertItem(int index, ListItem *item); + ListItem* takeItem(int row); + ListItem* itemAt(int row); + int itemCount() const; + virtual void keyPressEvent(QKeyEvent *event); + bool listItemCaching() const; + void setListItemCaching(bool enable); + + void setTwoColumns(const bool twoColumns); + bool twoColumns(); + +public slots: + ScrollBar* verticalScrollBar() const; + +private: + Q_DISABLE_COPY(SimpleList) + + ListWidget *m_list; +}; + +#endif /* LISTTEST_H_ */ diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/simplelistview.cpp b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/simplelistview.cpp new file mode 100644 index 0000000..106f435 --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/simplelistview.cpp @@ -0,0 +1,500 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the examples 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 Technology Preview License Agreement accompanying +** this package. +** +** 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.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <QtGui> + +#include "simplelistview.h" +#include "scrollbar.h" +#include "simplelistview.h" +#include "scrollbar.h" +#include "listitem.h" +#if (QT_VERSION >= 0x040600) +#include "listitemcache.h" +#endif +#include "theme.h" + +class SimpleListViewPrivate +{ + Q_DECLARE_PUBLIC(SimpleListView) + +public: + + SimpleListViewPrivate(SimpleListView *button) + : m_content(0) + , m_layout(0) + , m_twoColumns(false) + , q_ptr(button) +#if (QT_VERSION >= 0x040600) + , m_listItemCaching(false) +#endif + { + Q_Q(SimpleListView); + + m_layout = new QGraphicsGridLayout(); + m_layout->setContentsMargins(0, 0, 0, 0); + m_layout->setSpacing(0); + m_layout->setColumnSpacing(0,0); + m_layout->setColumnSpacing(1,0); + m_layout->setRowSpacing(0,0); + m_layout->setRowSpacing(1,0); + m_content = new QGraphicsWidget; + m_content->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); + m_content->setParentItem(q->viewport()); + m_content->setLayout(m_layout); + + q->horizontalScrollBar()->setSliderSize(0.0); + + QObject::connect(Theme::p(), SIGNAL(themeChanged()), q, SLOT(themeChange())); + } + + ~SimpleListViewPrivate() + { + if (!m_content->parentItem() && !m_content->parent()) + delete m_content; + } + + void resizeContents(QSizeF s) + { + Q_UNUSED(s); + Q_Q(SimpleListView); + + if (!m_content) + return; + +#if (QT_VERSION >= 0x040600) + const bool caching = q->listItemCaching(); + q->setListItemCaching(false); +#endif + m_content->resize(q->viewport()->size().width(), + m_layout->preferredHeight()); + const bool clip = + m_content->size().width() > q->viewport()->size().width() + || m_content->size().height() > q->viewport()->size().height(); + + q->viewport()->setFlag( + QGraphicsItem::ItemClipsChildrenToShape, clip); + +#if (QT_VERSION >= 0x040600) + q->setListItemCaching(caching); +#endif + } + + void resizeScrollBars() + { + Q_Q(SimpleListView); + + if (!m_content) + return; + + m_content->resize(m_content->size().width(), + m_layout->preferredHeight()); + + QRectF contentRect = m_content->boundingRect(); + QRectF listRect = q->boundingRect(); + + // List do not have horizontal scroll bar visible. + q->horizontalScrollBar()->setSliderSize(0.0); + + if (contentRect.height()-q->boundingRect().height() > 0) { + q->verticalScrollBar()->setSliderSize(contentRect.height()-q->boundingRect().height()); + if (q->verticalScrollBarPolicy() != Qt::ScrollBarAlwaysOff && + !q->verticalScrollBar()->isVisible()) { + q->verticalScrollBar()->show(); + } + } + else if (q->verticalScrollBarPolicy() == Qt::ScrollBarAsNeeded || + q->verticalScrollBarPolicy() == Qt::ScrollBarAlwaysOff) { + q->verticalScrollBar()->setSliderSize(0.0); + q->verticalScrollBar()->hide(); + } + else { + q->verticalScrollBar()->setSliderSize(0.0); + } + + qreal pos = 0.0; + if ((m_content->boundingRect().height() - q->boundingRect().height()) != 0) { + qreal min = qMin(-contentRect.top(), m_content->pos().y()); + qreal diff = contentRect.height() - listRect.height(); + pos = qAbs(contentRect.top() + min) / diff; + } + + q->verticalScrollBar()->setSliderPosition(pos); + } + + void updateListContents() + { +#if (QT_VERSION >= 0x040600) + Q_Q(SimpleListView); + + const bool caching = q->listItemCaching(); + q->setListItemCaching(false); +#endif + const QString defaultIcon = Theme::p()->pixmapPath()+"contact_default_icon.svg"; + const int itemCount = m_layout->count(); + + for (int i=0; i<itemCount; ++i) { + ListItem* item = static_cast<ListItem*>(m_layout->itemAt(i)); + + // Update default icons + const QString filename = item->icon(ListItem::LeftIcon)->fileName(); + if (filename.contains("contact_default_icon")) { + item->icon(ListItem::LeftIcon)->setFileName(defaultIcon); + } + + // Update status icons + QString statusIcon = item->icon(ListItem::RightIcon)->fileName(); + const int index = statusIcon.indexOf("contact_status"); + if (index != -1) { + statusIcon.remove(0, index); + item->icon(ListItem::RightIcon)->setFileName(Theme::p()->pixmapPath()+statusIcon); + } + + // Update fonts + item->setFont(Theme::p()->font(Theme::ContactName), ListItem::FirstPos); + item->setFont(Theme::p()->font(Theme::ContactNumber), ListItem::SecondPos); + item->setFont(Theme::p()->font(Theme::ContactEmail), ListItem::ThirdPos); + + // Update list dividers + if (i%2) { + item->setBackgroundBrush(Theme::p()->listItemBackgroundBrushOdd()); + item->setBackgroundOpacity(Theme::p()->listItemBackgroundOpacityOdd()); + } + else { + item->setBackgroundBrush(Theme::p()->listItemBackgroundBrushEven()); + item->setBackgroundOpacity(Theme::p()->listItemBackgroundOpacityEven()); + } + + // Update borders + item->setBorderPen(Theme::p()->listItemBorderPen()); + item->setRounding(Theme::p()->listItemRounding()); + + // Update icons + item->icon(ListItem::LeftIcon)->setRotation(Theme::p()->iconRotation(ListItem::LeftIcon)); + item->icon(ListItem::RightIcon)->setRotation(Theme::p()->iconRotation(ListItem::RightIcon)); +#if (QT_VERSION >= 0x040600) + item->icon(ListItem::LeftIcon)->setOpacityEffectEnabled(Theme::p()->isIconOpacityEffectEnabled(ListItem::LeftIcon)); + item->icon(ListItem::RightIcon)->setOpacityEffectEnabled(Theme::p()->isIconOpacityEffectEnabled(ListItem::RightIcon)); +#endif + item->icon(ListItem::LeftIcon)->setSmoothTransformationEnabled(Theme::p()->isIconSmoothTransformationEnabled(ListItem::LeftIcon)); + item->icon(ListItem::RightIcon)->setSmoothTransformationEnabled(Theme::p()->isIconSmoothTransformationEnabled(ListItem::RightIcon)); + } +#if (QT_VERSION >= 0x040600) + q->setListItemCaching(caching); +#endif + } + + void updateListItemBackgrounds(int index) + { +#if (QT_VERSION >= 0x040600) + Q_Q(SimpleListView); + + const bool caching = q->listItemCaching(); + q->setListItemCaching(false); +#endif + const int itemCount = m_layout->count(); + + for (int i=index; i<itemCount; ++i) { + ListItem* item = static_cast<ListItem*>(m_layout->itemAt(i)); + if (i%2) { + item->setBackgroundBrush(Theme::p()->listItemBackgroundBrushOdd()); + item->setBackgroundOpacity(Theme::p()->listItemBackgroundOpacityOdd()); + } + else { + item->setBackgroundBrush(Theme::p()->listItemBackgroundBrushEven()); + item->setBackgroundOpacity(Theme::p()->listItemBackgroundOpacityEven()); + } + } + +#if (QT_VERSION >= 0x040600) + q->setListItemCaching(caching); +#endif + } + + void setTwoColumns(const bool twoColumns) + { + if(twoColumns == m_twoColumns) + return; + + Q_Q(SimpleListView); + m_twoColumns = twoColumns; + +#if (QT_VERSION >= 0x040600) + bool cache = q->listItemCaching(); + q->setListItemCaching(false); +#endif + QList<QGraphicsLayoutItem *> moveditems; + if(twoColumns) { + int half = m_layout->count()/2; + for (int i = m_layout->count()-1; i>=half; --i) { + QGraphicsLayoutItem *item = m_layout->itemAt(i); + m_layout->removeAt(i); + moveditems.append(item); + } + for ( int i = 0; i < moveditems.count(); ++i) + m_layout->addItem(moveditems.at(i), i, 1); + + m_layout->setColumnSpacing(0,0); + m_layout->setColumnSpacing(1,0); + m_layout->setRowSpacing(0,0); + m_layout->setRowSpacing(1,0); + } + else { + int count = m_layout->count()/2; + for (int i = m_layout->count()-1; i>=0; --i) { + if (i >= count) + moveditems.append(m_layout->itemAt(i)); + else + moveditems.insert(moveditems.begin(), m_layout->itemAt(i)); + m_layout->removeAt(i); + } + for (int i = 0; i<moveditems.count(); ++i) { + m_layout->addItem(moveditems.at(i), m_layout->count(), 0); + } + } + + resizeContents(q->size()); + resizeScrollBars(); + +#if (QT_VERSION >= 0x040600) + q->setListItemCaching(cache); +#endif + } + + bool twoColumns() + { + return m_twoColumns; + } + + QGraphicsWidget *m_content; + QGraphicsGridLayout *m_layout; + bool m_twoColumns; + SimpleListView *q_ptr; +#if (QT_VERSION >= 0x040600) + bool m_listItemCaching; +#endif +}; + +SimpleListView::SimpleListView(QGraphicsWidget *parent) + : AbstractScrollArea(parent) + , d_ptr(new SimpleListViewPrivate(this)) +{ + setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); + setContentsMargins(0, 0, 0, 0); + verticalScrollBar()->hide(); + horizontalScrollBar()->hide(); +} + +SimpleListView::~SimpleListView() +{ + Q_D(SimpleListView); + + if (d->m_content) { + d->m_content->setParentItem(0); + } + + delete d_ptr; +} + +void SimpleListView::addItem(QGraphicsWidget *item) +{ + Q_D(SimpleListView); + + Q_ASSERT(item); + + insertItem(d->m_layout->count(), item); +} + +void SimpleListView::insertItem(int index, QGraphicsWidget *item) +{ + Q_D(SimpleListView); + + // Grid layout doe not have insert item method. + // We need to first remove all items, add new item and + // append old items to layout. + QList<QGraphicsLayoutItem *> moveditems; + + for (int i = d->m_layout->count()-1; i >= index; --i) { + moveditems.append(d->m_layout->itemAt(i)); + d->m_layout->removeAt(i); + } + moveditems.append(item); + + for (int i = moveditems.count()-1; i>=0; --i) { + d->m_layout->addItem(moveditems.at(i), d->m_layout->count(), 0); + } + +#if (QT_VERSION >= 0x040600) + ListItemCache *cache = new ListItemCache; + item->setGraphicsEffect(cache); + cache->setEnabled(listItemCaching()); +#endif + + d->resizeScrollBars(); + d->updateListItemBackgrounds(index); +} + +QGraphicsWidget *SimpleListView::takeItem(int index) +{ + Q_D(SimpleListView); + + QGraphicsWidget *item = 0; + + if (index >= 0 && d->m_layout->count() > index) { + QList<QGraphicsLayoutItem *> moveditems; + for (int i = d->m_layout->count()-1; i >=0; --i) { + if (index != i) + moveditems.insert(moveditems.begin(), d->m_layout->itemAt(i)); + else { + item = static_cast<QGraphicsWidget*>(d->m_layout->itemAt(index)); + item->setGraphicsEffect(0); + } + + d->m_layout->removeAt(i); + } + + for (int i = 0; i < moveditems.count(); ++i) + d->m_layout->addItem(moveditems.at(i), d->m_layout->count(), 0); + } + d->resizeScrollBars(); + return item; +} + +QGraphicsWidget *SimpleListView::itemAt(int row) +{ + Q_D(SimpleListView); + + QGraphicsWidget *item = 0; + + if (row >= 0 && d->m_layout->count() > row) { + item = static_cast<QGraphicsWidget*>(d->m_layout->itemAt(row)); + } + + return item; +} + +int SimpleListView::itemCount() +{ + Q_D(SimpleListView); + return d->m_layout->count(); +} + +#if (QT_VERSION >= 0x040600) +bool SimpleListView::listItemCaching() const +{ + Q_D(const SimpleListView); + return d->m_listItemCaching; +} + +void SimpleListView::setListItemCaching(bool enabled) +{ + Q_D(SimpleListView); + + if (d->m_listItemCaching == enabled) + return; + + d->m_listItemCaching = enabled; + + for (int i = 0; i < d->m_layout->count(); ++i) { + ListItem *item = static_cast<ListItem*>(d->m_layout->itemAt(i)); + ListItemCache *cache = static_cast<ListItemCache *>( + item->graphicsEffect()); + cache->setEnabled(enabled); + } +} +#endif + +void SimpleListView::scrollContentsBy(qreal dx, qreal dy) +{ + Q_D(SimpleListView); + Q_UNUSED(dx) + QRectF contentRect = d->m_content->boundingRect(); + QRectF viewportRect = viewport()->boundingRect(); + QPointF contentPos = d->m_content->pos(); + + qreal newy = contentPos.y() - dy; + qreal miny = qMin(qreal(0.0), -(contentRect.height() - viewportRect.height())); + + if (newy < miny) + newy = miny; + else if (newy > 0) + newy = 0.0; + + d->m_content->setPos(contentPos.x(), newy); +} + +void SimpleListView::resizeEvent(QGraphicsSceneResizeEvent *event) +{ + Q_D(SimpleListView); + + AbstractScrollArea::resizeEvent(event); + d->resizeContents(event->newSize()); + d->resizeScrollBars(); +} + +QSizeF SimpleListView::sizeHint(Qt::SizeHint which, const QSizeF & constraint) const +{ + Q_D(const SimpleListView); + + if (which == Qt::PreferredSize) + return d->m_content->size(); + + return AbstractScrollArea::sizeHint(which, constraint); +} + +void SimpleListView::themeChange() +{ + Q_D(SimpleListView); + + d->updateListContents(); + d->resizeScrollBars(); +} + +void SimpleListView::setTwoColumns(const bool twoColumns) +{ + Q_D(SimpleListView); + d->setTwoColumns(twoColumns); +} + +bool SimpleListView::twoColumns() +{ + Q_D(SimpleListView); + return d->twoColumns(); +} diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/simplelistview.h b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/simplelistview.h new file mode 100644 index 0000000..25a0546 --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/simplelistview.h @@ -0,0 +1,92 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the examples 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 Technology Preview License Agreement accompanying +** this package. +** +** 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.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef SIMPLELISTVIEW_H +#define SIMPLELISTVIEW_H + +#include "scrollbar.h" +#include "abstractscrollarea.h" + +class SimpleListViewPrivate; + +class SimpleListView : public AbstractScrollArea +{ + Q_OBJECT + Q_DECLARE_PRIVATE(SimpleListView) + +public: + + SimpleListView(QGraphicsWidget *parent = 0); + virtual ~SimpleListView(); + +public: + + void addItem(QGraphicsWidget *item); + void insertItem(int index, QGraphicsWidget *item); + QGraphicsWidget* takeItem(int row); + QGraphicsWidget* itemAt(int row); + int itemCount(); + void updateListContents(); + + void setTwoColumns(const bool twoColumns); + bool twoColumns(); + +public slots: + + void themeChange(); +#if (QT_VERSION >= 0x040600) + bool listItemCaching() const; + void setListItemCaching(bool enabled); +#endif + +protected: + + virtual void scrollContentsBy(qreal dx, qreal dy); + void resizeEvent(QGraphicsSceneResizeEvent *event); + QSizeF sizeHint(Qt::SizeHint which, + const QSizeF & constraint) const; + +private: + + SimpleListViewPrivate *d_ptr; +}; + +#endif diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/theme.cpp b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/theme.cpp new file mode 100644 index 0000000..4ed8608 --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/theme.cpp @@ -0,0 +1,240 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the examples 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 Technology Preview License Agreement accompanying +** this package. +** +** 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.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <QDebug> +#include <QPainter> +#include <QPixmapCache> +#include <QSvgRenderer> + +#include "theme.h" + +Q_DECLARE_METATYPE(Theme::Themes*) + +Theme::Theme(QObject *parent) + : QObject(parent) + , m_currentTheme() + , m_availableThemes() + , m_fonts() + , m_pixmapPath() + , m_listItemBackgroundBrushEven() + , m_listItemBackgroundOpacityEven() + , m_listItemBackgroundBrushOdd() + , m_listItemBackgroundOpacityOdd() + , m_listItemBorderPen(QPen()) + , m_listItemRounding() +#if (QT_VERSION >= 0x040600) + , m_iconOpacityEffectEnabled() +#endif + , m_iconRotation() + , m_iconSmoothTransformation() +{ + m_availableThemes << "Blue" << "Lime"; + + // Set blue theme as a default theme without emiting themeChanged() signal + setBlueTheme(); +} + +Theme::~Theme() +{ +} + +Theme* Theme::p() +{ + static Theme t; + return &t; +} + +void Theme::setTheme(const QString theme) +{ + if (theme.compare("blue", Qt::CaseInsensitive) == 0) + { + setTheme(Theme::Blue); + } + else if (theme.compare("lime", Qt::CaseInsensitive) == 0) + { + setTheme(Theme::Lime); + } + else + { + qDebug() << "Unknown theme"; + } +} + +void Theme::setTheme(const Themes theme) +{ + if (m_currentTheme == theme) + return; + + switch (theme) + { + case Theme::Blue: + setBlueTheme(); + emit themeChanged(); + break; + + case Theme::Lime: + setLimeTheme(); + emit themeChanged(); + break; + } +} + +void Theme::setBlueTheme() +{ + m_currentTheme = Theme::Blue; + + m_fonts[ContactName].setFamily("Arial"); + m_fonts[ContactName].setPixelSize(16); + m_fonts[ContactName].setStyle(QFont::StyleNormal); + m_fonts[ContactName].setWeight(QFont::Normal); + + m_fonts[ContactNumber].setFamily("Arial"); + m_fonts[ContactNumber].setPixelSize(14); + m_fonts[ContactNumber].setStyle(QFont::StyleNormal); + + m_fonts[ContactEmail].setFamily("Arial"); + m_fonts[ContactEmail].setPixelSize(14); + m_fonts[ContactEmail].setStyle(QFont::StyleNormal); + + m_fonts[TitleBar].setFamily("Arial"); + m_fonts[TitleBar].setPixelSize(36); + m_fonts[TitleBar].setStyle(QFont::StyleNormal); + + m_fonts[StatusBar].setFamily("Arial"); + m_fonts[StatusBar].setPixelSize(16); + m_fonts[StatusBar].setStyle(QFont::StyleNormal); + + m_fonts[MenuItem].setFamily("Arial"); + m_fonts[MenuItem].setPixelSize(14); + m_fonts[MenuItem].setStyle(QFont::StyleNormal); + + m_pixmapPath = ":/themes/blue/"; + + m_listItemBackgroundBrushEven = QBrush(Qt::NoBrush); + m_listItemBackgroundOpacityEven = 1.0; + m_listItemBackgroundBrushOdd = QBrush(QColor(44,214,250), Qt::SolidPattern); + m_listItemBackgroundOpacityOdd = 1.0; + + m_listItemBorderPen = QPen(Qt::NoPen); + m_listItemRounding = QSize(0.0, 0.0); + +#if (QT_VERSION >= 0x040600) + m_iconOpacityEffectEnabled[ListItem::LeftIcon] = false; + m_iconOpacityEffectEnabled[ListItem::RightIcon] = false; +#endif + m_iconRotation[ListItem::LeftIcon] = 0.0; + m_iconRotation[ListItem::RightIcon] = 0.0; + + m_iconSmoothTransformation[ListItem::LeftIcon] = false; + m_iconSmoothTransformation[ListItem::RightIcon] = false; +} + +void Theme::setLimeTheme() +{ + m_currentTheme = Theme::Lime; + + m_fonts[ContactName].setFamily("Arial"); + m_fonts[ContactName].setPixelSize(16); + m_fonts[ContactName].setStyle(QFont::StyleItalic); + m_fonts[ContactName].setWeight(QFont::Bold); + + m_fonts[ContactNumber].setFamily("Arial"); + m_fonts[ContactNumber].setPixelSize(14); + m_fonts[ContactNumber].setStyle(QFont::StyleItalic); + + m_fonts[ContactEmail].setFamily("Arial"); + m_fonts[ContactEmail].setPixelSize(14); + m_fonts[ContactEmail].setStyle(QFont::StyleItalic); + + m_fonts[TitleBar].setFamily("Arial"); + m_fonts[TitleBar].setPixelSize(36); + m_fonts[TitleBar].setStyle(QFont::StyleItalic); + + m_fonts[StatusBar].setFamily("Arial"); + m_fonts[StatusBar].setPixelSize(16); + m_fonts[StatusBar].setStyle(QFont::StyleItalic); + + m_fonts[MenuItem].setFamily("Arial"); + m_fonts[MenuItem].setPixelSize(14); + m_fonts[MenuItem].setStyle(QFont::StyleItalic); + + m_pixmapPath = ":/themes/lime/"; + + m_listItemBackgroundBrushEven = QBrush(QPixmap(":/avatars/avatar_014.png")); + m_listItemBackgroundOpacityEven = 0.05; + + m_listItemBackgroundBrushOdd = QBrush(QPixmap(":/avatars/avatar_012.png")); + m_listItemBackgroundOpacityOdd = 0.15; + + m_listItemBorderPen = QPen(QColor(0,0,0,55), 3, Qt::SolidLine); + m_listItemRounding = QSize(12.0, 12.0); + +#if (QT_VERSION >= 0x040600) + m_iconOpacityEffectEnabled[ListItem::LeftIcon] = true; + m_iconOpacityEffectEnabled[ListItem::RightIcon] = false; +#endif + m_iconRotation[ListItem::LeftIcon] = -4.0; + m_iconRotation[ListItem::RightIcon] = 0.0; + + m_iconSmoothTransformation[ListItem::LeftIcon] = true; + m_iconSmoothTransformation[ListItem::RightIcon] = false; +} + +QPixmap Theme::pixmap(const QString filename, QSize size) +{ + if (filename.endsWith(".svg", Qt::CaseInsensitive)) + { + QSvgRenderer doc(m_pixmapPath+filename); + if (size == QSize(0,0)) + size = doc.defaultSize(); + QPixmap pix(size.width(),size.height()); + pix.fill(Qt::transparent); + QPainter painter(&pix); + painter.setViewport(0, 0, size.width(), size.height()); + doc.render(&painter); + return pix; + } + else + { + QPixmap pix(m_pixmapPath+filename); + return pix.scaled(size); + } +} diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/theme.h b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/theme.h new file mode 100644 index 0000000..51db185 --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/theme.h @@ -0,0 +1,134 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the examples 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 Technology Preview License Agreement accompanying +** this package. +** +** 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.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef THEME_H +#define THEME_H + +#include <QPen> +#include <QPainter> + +#include "gvbwidget.h" +#include "listitem.h" + +class Theme : public QObject +{ + Q_OBJECT + +public: + enum Themes + { + Blue = 0, + Lime = 1, + }; + + enum Fonts + { + ContactName, + ContactNumber, + ContactEmail, + TitleBar, + StatusBar, + MenuItem, + }; + + virtual ~Theme(); + + static Theme* p(); + + void setTheme(const QString theme); + void setTheme(const Themes theme); + + Themes theme() const { return m_currentTheme; } + QString currentThemeName() { return m_availableThemes.at(m_currentTheme); } + QStringList themes() const { return m_availableThemes; } + int themesCount() const { return m_availableThemes.count(); } + + QPixmap pixmap(const QString filename = "", QSize size = QSize(0,0)); + QFont font(Fonts type) const { return m_fonts[type]; } + QString pixmapPath() const { return m_pixmapPath; } + + QBrush listItemBackgroundBrushEven() const { return m_listItemBackgroundBrushEven; } + QBrush listItemBackgroundBrushOdd() const { return m_listItemBackgroundBrushOdd; } + qreal listItemBackgroundOpacityEven() const { return m_listItemBackgroundOpacityEven; } + qreal listItemBackgroundOpacityOdd() const { return m_listItemBackgroundOpacityOdd; } + + QPen listItemBorderPen() const { return m_listItemBorderPen; } + QSize listItemRounding() const { return m_listItemRounding; } + +#if (QT_VERSION >= 0x040600) + bool isIconOpacityEffectEnabled(const ListItem::IconItemPos iconPos) const { return m_iconOpacityEffectEnabled[iconPos]; } +#endif + qreal iconRotation(const ListItem::IconItemPos iconPos) const { return m_iconRotation[iconPos]; } + bool isIconSmoothTransformationEnabled(const ListItem::IconItemPos iconPos) const { return m_iconSmoothTransformation[iconPos]; } + +signals: + void themeChanged(); + +private: + Theme(QObject *parent = 0); + + void setBlueTheme(); + void setLimeTheme(); + +private: + Q_DISABLE_COPY(Theme) + + Themes m_currentTheme; + QStringList m_availableThemes; + QHash<Fonts, QFont> m_fonts; + QString m_pixmapPath; + + QBrush m_listItemBackgroundBrushEven; + qreal m_listItemBackgroundOpacityEven; + QBrush m_listItemBackgroundBrushOdd; + qreal m_listItemBackgroundOpacityOdd; + + QPen m_listItemBorderPen; + QSize m_listItemRounding; + +#if (QT_VERSION >= 0x040600) + QHash<ListItem::IconItemPos, bool> m_iconOpacityEffectEnabled; +#endif + QHash<ListItem::IconItemPos, qreal> m_iconRotation; + QHash<ListItem::IconItemPos, bool> m_iconSmoothTransformation; +}; + +#endif // THEME_H diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/themeevent.cpp b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/themeevent.cpp new file mode 100644 index 0000000..75bc320 --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/themeevent.cpp @@ -0,0 +1,53 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the examples 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 Technology Preview License Agreement accompanying +** this package. +** +** 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.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "themeevent.h" + +ThemeEvent::ThemeEvent( QString newTheme, Type type) : QEvent(type), + m_theme(newTheme) +{ + +} + +ThemeEvent::~ThemeEvent() +{ + +} diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/themeevent.h b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/themeevent.h new file mode 100644 index 0000000..365b1fd --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/themeevent.h @@ -0,0 +1,64 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the examples 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 Technology Preview License Agreement accompanying +** this package. +** +** 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.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef __THEMEEVENT_H__ +#define __THEMEEVENT_H__ + +#include <QEvent> +#include <QString> + +static QEvent::Type ThemeEventType = (QEvent::Type) 1010; + +class ThemeEvent : public QEvent +{ +public: + ThemeEvent(QString newTheme, QEvent::Type type = ThemeEventType ); + ~ThemeEvent(); + +public: + inline QString getTheme() { return m_theme; } + +private: + QString m_theme; +}; + + +#endif /* __THEMEEVENT_H__ */ diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/topbar.cpp b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/topbar.cpp new file mode 100644 index 0000000..68ffcd5 --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/topbar.cpp @@ -0,0 +1,359 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the examples 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 Technology Preview License Agreement accompanying +** this package. +** +** 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.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <QGraphicsView> +#include <QStyleOptionGraphicsItem> +#include <QGraphicsSceneResizeEvent> +#include <QPixmap> +#include <QFont> + +#include "themeevent.h" +#include "theme.h" +#include "topbar.h" +#include "mainview.h" + +TopBar::TopBar(QGraphicsView* mainView, QGraphicsWidget* parent) : + GvbWidget(parent), m_mainView(mainView), m_isLimeTheme(false), + m_orientation(TopBar::None), m_topBarPixmap(), m_sizesBlue(), m_sizesLime() +{ + setDefaultSizes(); + + m_titleFont = Theme::p()->font(Theme::TitleBar); + m_statusFont = Theme::p()->font(Theme::StatusBar); + + connect(Theme::p(), SIGNAL(themeChanged()), this, SLOT(themeChange())); +} + +TopBar::~TopBar() +{ +} + +void TopBar::resizeEvent(QGraphicsSceneResizeEvent* /*event*/) +{ + //Check orientation + QString topbarName; + QSize mainViewSize = m_mainView->size(); + int rotationAngle = static_cast<MainView*>(m_mainView)->rotationAngle(); + if(rotationAngle == 90 || rotationAngle == 270 ) { + int wd = mainViewSize.width(); + int ht = mainViewSize.height(); + mainViewSize.setWidth(ht); + mainViewSize.setHeight(wd); + } + bool m_orientationChanged = false; + if(mainViewSize.height() >= mainViewSize.width()) { + if(m_orientation == TopBar::Landscape) + m_orientationChanged = true; + m_orientation = TopBar::Portrait; + topbarName = "topbar.svg"; + } + else { + if(m_orientation == TopBar::Portrait) + m_orientationChanged = true; + m_orientation = TopBar::Landscape; + topbarName = "topbar_horisontal.svg"; + } + + //Calculate new size, resize by height, don't make it wider than the screen + QHash<QString, QSize>sizes = (Theme::p()->theme() == Theme::Blue) ? + m_sizesBlue : m_sizesLime; + + //Get current size for topbarpixmap + QSize currentSize = !m_topBarPixmap.isNull() && !m_orientationChanged ? + m_topBarPixmap.size() : sizes[topbarName]; + QSize newSize = !m_orientationChanged ? QSize(currentSize) : sizes[topbarName]; + + //Scale according to aspect ratio + newSize.scale(size().toSize(), Qt::KeepAspectRatio); + + //fix width to window widht if previous scaling produced too narrow image + if(newSize.width() < size().width()) { + newSize.scale(size().toSize(), Qt::KeepAspectRatioByExpanding); + } + + //Calculate scaling factor for rest of the graphics scaling + qreal scaleFactor = (newSize.width() *1.0) / (currentSize.width() * 1.0); + + //Scale graphics, if the scalefactor applies + //This is really heavy since the SVG graphics are read again from the resource + if(scaleFactor != 1 || m_topBarPixmap.isNull() ) { + m_topBarPixmap = Theme::p()->pixmap(topbarName, newSize ); + m_topBarUserIcon = Theme::p()->pixmap("user_default_icon.svg", + !m_topBarUserIcon.isNull() && !m_orientationChanged ? m_topBarUserIcon.size()* scaleFactor : sizes["user_default_icon.svg"] * scaleFactor); + + m_topBarUserStatus = Theme::p()->pixmap("user_status_online.svg", + !m_topBarUserStatus.isNull() && !m_orientationChanged ? m_topBarUserStatus.size() * scaleFactor : sizes["user_status_online.svg"] * scaleFactor); + + m_topBarStatusBarLeft = Theme::p()->pixmap("status_field_left.svg", + !m_topBarStatusBarLeft.isNull() && !m_orientationChanged ? m_topBarStatusBarLeft.size()* scaleFactor : sizes["status_field_left.svg"] * scaleFactor); + + m_topBarStatusBarRight = Theme::p()->pixmap("status_field_right.svg", + !m_topBarStatusBarRight.isNull() && !m_orientationChanged ? m_topBarStatusBarRight.size()* scaleFactor : sizes["status_field_right.svg"] * scaleFactor); + + m_topBarStatusBarMiddle = Theme::p()->pixmap("status_field_middle.svg", + !m_topBarStatusBarMiddle.isNull() && !m_orientationChanged ? m_topBarStatusBarMiddle.size() * scaleFactor : QSize(185, sizes["status_field_middle.svg"].height()) * scaleFactor); + + //Update the sizeHint to match the size of the scaled m_topBarPixmap + updateGeometry(); + + //Point Update - Positions relative to the Top Bar "Backgroud" size. + //TODO: consider some layout instead of calculating relative locations + QSize topBarPixmapSize = m_topBarPixmap.size(); + QSize topBarUserIconSize = m_topBarUserIcon.size(); + QSize topBarUserStatusSize = m_topBarUserStatus.size(); + QSize topBarStatusBarLeftSize = m_topBarStatusBarLeft.size(); + QSize topBarStatusBarMiddleSize = m_topBarStatusBarMiddle.size(); + + //Location for Title text 5% width, 35% heigth of the background pixmap + m_topBarTitlePoint = QPoint(topBarPixmapSize.width()* 0.05, + topBarPixmapSize.height() * 0.35); + + //User Icon location + //Placing 70% of the width and 10% of the height of the top bar background + m_topBarUserIconPoint = QPoint((topBarPixmapSize.width() * 0.7), (topBarPixmapSize.height() * 0.1)); + + //If Blue theme is in use - position user status icon on the right side of the user icon + if(!m_isLimeTheme) { + //Place the status icon on top of the right edge of the user icon, lower it by 35% of the height of the user icon + m_topBarUserStatusPoint = QPoint( ( (m_topBarUserIconPoint.x()+topBarUserIconSize.width() ) - + ( topBarUserStatusSize.width()/2 )), + (m_topBarUserIconPoint.y() + (topBarUserIconSize.height() * 0.35 ))); + } + //If Lime theme is in use - position user status icon on the left side of the user icon + else { + //Place the status icon on top of the left side of the user icon, lower it by 50% of the height of the user icon + //and move left by 5% of the icon + m_topBarUserStatusPoint = QPoint( m_topBarUserIconPoint.x() + ( topBarUserIconSize.width() * 0.05), + (m_topBarUserIconPoint.y() + (topBarUserIconSize.height() * 0.5 ))); + } + + //Status bar + //Placing the left side of the status bar 5% of the width, 50% of the height of the top bar background + //Set the text baseline 80% of the height of the status bar + m_topBarStatusBarLeftPoint = QPoint( (topBarPixmapSize.width()* 0.05), + (topBarPixmapSize.height() * 0.5)); + m_topBarStatusBarMiddlePoint = QPoint( (m_topBarStatusBarLeftPoint.x() + topBarStatusBarLeftSize.width()), + (m_topBarStatusBarLeftPoint.y())); + m_topBarStatusBarRightPoint = QPoint( (m_topBarStatusBarMiddlePoint.x() + topBarStatusBarMiddleSize.width()), + (m_topBarStatusBarMiddlePoint.y() ) ); + m_topBarStatusBarTextPoint = QPoint(m_topBarStatusBarMiddlePoint.x(), + m_topBarStatusBarMiddlePoint.y() + (topBarStatusBarMiddleSize.height()*0.8) ); + } //if scalefactor +} + +void TopBar::paint( QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget */*widget*/ ) +{ + //Topbar background + painter->drawPixmap(option->exposedRect, m_topBarPixmap, option->exposedRect); + + //User Icon + painter->drawPixmap(m_topBarUserIconPoint, m_topBarUserIcon); + + //User Status + painter->drawPixmap(m_topBarUserStatusPoint, m_topBarUserStatus); + + //Status bar + painter->drawPixmap(m_topBarStatusBarLeftPoint, m_topBarStatusBarLeft); + painter->drawPixmap(m_topBarStatusBarMiddlePoint, m_topBarStatusBarMiddle); + painter->drawPixmap(m_topBarStatusBarRightPoint, m_topBarStatusBarRight); + + //Title text + painter->save(); + painter->setFont(m_titleFont); + painter->setOpacity(0.7); + painter->setPen(Qt::white); + painter->drawText(m_topBarTitlePoint, QString("Contacts") ); + //Status text + painter->setFont(m_statusFont); + painter->setOpacity(1.0); + painter->drawText(m_topBarStatusBarTextPoint, QString("My Status (fixed)") ); + painter->restore(); +} + +QRectF TopBar::boundingRect() const +{ + //It's possible that m_topBarPixmap is not allocated yet, + //in this case default size is used for setting boundingRect + QHash<QString, QSize>sizes = (Theme::p()->theme() == Theme::Blue) ? + m_sizesBlue : m_sizesLime; + + if(!m_topBarPixmap.isNull()) + return QRectF(0, 0, m_topBarPixmap.size().width(), m_topBarPixmap.size().height()); + else + return QRectF(0, 0, sizes["topbar.svg"].width(), sizes["topbar.svg"].height()); +} + +void TopBar::themeChange() +{ + m_titleFont = Theme::p()->font(Theme::TitleBar); + m_statusFont = Theme::p()->font(Theme::StatusBar); + + //Calculate the scaling factor + QHash<QString, QSize>sizes = (Theme::p()->theme() == Theme::Blue) ? + m_sizesBlue : m_sizesLime; + + QString topbarString= m_orientation == TopBar::Portrait ? + "topbar.svg" : "topbar_horisontal.svg"; + + QSize topBarSize = sizes[topbarString]; + QSize newSize = QSize(topBarSize); + + //Scale according to aspect ratio + newSize.scale(size().toSize(), Qt::KeepAspectRatio); + + //fix width to window widht if previous scaling produced too narrow image + if(newSize.width() < size().width()) { + newSize.scale(size().toSize(), Qt::KeepAspectRatioByExpanding); + } + + //Calculate scaling factor for rest of the graphics scaling + qreal scaleFactor = (newSize.width() *1.0) / (topBarSize.width() * 1.0); + + //Background + m_topBarPixmap = Theme::p()->pixmap(topbarString, sizes[topbarString] * scaleFactor); + + //User Icon + m_topBarUserIcon = Theme::p()->pixmap("user_default_icon.svg", sizes["user_default_icon.svg"] * scaleFactor); + + //User Status + m_topBarUserStatus = Theme::p()->pixmap("user_status_online.svg", sizes["user_status_online.svg"] * scaleFactor); + + //Status Bar + m_topBarStatusBarLeft = Theme::p()->pixmap("status_field_left.svg", sizes["status_field_left.svg"] * scaleFactor); + m_topBarStatusBarRight = Theme::p()->pixmap("status_field_right.svg", sizes["status_field_right.svg"] * scaleFactor); + m_topBarStatusBarMiddle = Theme::p()->pixmap("status_field_middle.svg", + QSize(185, sizes["status_field_middle.svg"].height())* scaleFactor); + + //Update Drawing points for Top Bar elements, points are relative to the top bar background size + QSize topBarPixmapSize = m_topBarPixmap.size(); + QSize topBarUserIconSize = m_topBarUserIcon.size(); + QSize topBarUserStatusSize = m_topBarUserStatus.size(); + QSize topBarStatusBarLeftSize = m_topBarStatusBarLeft.size(); + QSize topBarStatusBarMiddleSize = m_topBarStatusBarMiddle.size(); + + //Theme Check + (Theme::p()->theme() == Theme::Lime) ? m_isLimeTheme = true : m_isLimeTheme = false; + + //User Icon location + //Placing 70% of the width and 10% of the height of the top bar background + m_topBarUserIconPoint = QPoint((0.7*topBarPixmapSize.width()), (0.1*topBarPixmapSize.height())); + + //If Blue theme is in use - position user status icon on the right side of the user icon + if(!m_isLimeTheme) { + //Place the status icon on top of the right edge of the user icon, lower it by 35% of the height of the user icon + m_topBarUserStatusPoint = QPoint( ( (m_topBarUserIconPoint.x()+topBarUserIconSize.width() ) - ( topBarUserStatusSize.width()/2 )), + (m_topBarUserIconPoint.y() + (topBarUserIconSize.height() * 0.35 ))); + } + //If Lime theme is in use - position user status icon on the left side of the user icon + else { + //Place the status icon on top of the left side of the user icon, lower it by 50% of the height of the user icon + //and move left by 5% of the icon + m_topBarUserStatusPoint = QPoint( m_topBarUserIconPoint.x() + ( topBarUserIconSize.width() * 0.05), + (m_topBarUserIconPoint.y() + (topBarUserIconSize.height() * 0.5 ))); + } + + //Status bar + //Placing the left side of the status bar 5% of the width, 50% of the height of the top bar background + //Set the text baseline 80% of the height of the status bar + m_topBarStatusBarLeftPoint = QPoint( (topBarPixmapSize.width()* 0.05), + (topBarPixmapSize.height() * 0.5)); + m_topBarStatusBarMiddlePoint = QPoint( (m_topBarStatusBarLeftPoint.x() + topBarStatusBarLeftSize.width()), + (m_topBarStatusBarLeftPoint.y())); + m_topBarStatusBarRightPoint = QPoint( (m_topBarStatusBarMiddlePoint.x() + topBarStatusBarMiddleSize.width()), + (m_topBarStatusBarMiddlePoint.y() ) ); + m_topBarStatusBarTextPoint = QPoint(m_topBarStatusBarMiddlePoint.x(), + m_topBarStatusBarMiddlePoint.y() + (topBarStatusBarMiddleSize.height()*0.8) ); + + update(); +} + +QSizeF TopBar::sizeHint(Qt::SizeHint which, + const QSizeF &constraint) const +{ + //It's possible that m_topBarPixmap is not allocated yet, + //in this case default size is used for setting size hint + QHash<QString, QSize>sizes = (Theme::p()->theme() == Theme::Blue) ? + m_sizesBlue : m_sizesLime; + + int height = !m_topBarPixmap.isNull() ? + m_topBarPixmap.height() : sizes["topbar.svg"].height(); + + switch (which) + { + case Qt::MinimumSize: + return QSizeF(-1, height); + + case Qt::MaximumSize: + return QSizeF(-1, height); + + default: + return QGraphicsWidget::sizeHint(which, constraint); + } +} + +void TopBar::setDefaultSizes() +{ + m_sizesBlue["topbar.svg"] = QSize(356,96); + m_sizesBlue["topbar_horisontal.svg"] = QSize(636,96); + m_sizesBlue["user_default_icon.svg"] = QSize(68,68); + m_sizesBlue["user_status_online.svg"] = QSize(38,38); + m_sizesBlue["status_field_left.svg"] = QSize(14,24); + m_sizesBlue["status_field_right.svg"] = QSize(10,24); + m_sizesBlue["status_field_middle.svg"] = QSize(14,24); + + m_sizesLime["topbar.svg"] = QSize(356,96); + m_sizesLime["topbar_horisontal.svg"] = QSize(636,96); + m_sizesLime["user_default_icon.svg"] = QSize(84,68); + m_sizesLime["user_status_online.svg"] = QSize(24,24); + m_sizesLime["status_field_left.svg"] = QSize(14,24); + m_sizesLime["status_field_right.svg"] = QSize(10,24); + m_sizesLime["status_field_middle.svg"] = QSize(14,24); +} + +void TopBar::mousePressEvent(QGraphicsSceneMouseEvent *event) +{ + QRect rect = m_topBarStatusBarMiddle.rect(); + rect.moveTopLeft(m_topBarStatusBarMiddlePoint); + QPointF scenePoint = event->scenePos(); + if(rect.contains(scenePoint.toPoint())) { + emit clicked(); + } +} diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/topbar.h b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/topbar.h new file mode 100644 index 0000000..e2722ed --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/topbar.h @@ -0,0 +1,126 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the examples 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 Technology Preview License Agreement accompanying +** this package. +** +** 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.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef __TOPBAR_H__ +#define __TOPBAR_H__ + +#include <QObject> +#include <QHash> + +#include "gvbwidget.h" + +class QPixmap; +class QPoint; +class QGraphicsView; +class QFont; + +class TopBar : public GvbWidget +{ + Q_OBJECT + +public: + enum Orientation + { + Portrait, + Landscape, + None + }; + +public: + TopBar(QGraphicsView* mainView, QGraphicsWidget* parent); + ~TopBar(); + +public: + void paint( QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0 ); + QRectF boundingRect() const; + void resizeEvent(QGraphicsSceneResizeEvent *event); + inline QPoint getStatusBarLocation() { return m_topBarStatusBarMiddlePoint + + m_topBarStatusBarMiddle.rect().bottomLeft(); } + +public slots: + void themeChange(); + +protected: + void mousePressEvent(QGraphicsSceneMouseEvent *event); + +signals: + void clicked(bool checked = false); + +private: + QSizeF sizeHint(Qt::SizeHint which, + const QSizeF &constraint = QSizeF()) const; + void setDefaultSizes(); + + +private: + Q_DISABLE_COPY(TopBar) + + QGraphicsView* m_mainView; + bool m_isLimeTheme; + Orientation m_orientation; + + //Fonts + QFont m_titleFont; + QFont m_statusFont; + + //Pixmaps + QPixmap m_topBarPixmap; + QPixmap m_topBarUserIcon; + QPixmap m_topBarUserStatus; + QPixmap m_topBarStatusBarLeft; + QPixmap m_topBarStatusBarRight; + QPixmap m_topBarStatusBarMiddle; + + //Drawing points + QPoint m_topBarUserIconPoint; + QPoint m_topBarUserStatusPoint; + QPoint m_topBarStatusBarLeftPoint; + QPoint m_topBarStatusBarRightPoint; + QPoint m_topBarStatusBarMiddlePoint; + QPoint m_topBarStatusBarTextPoint; + QPoint m_topBarTitlePoint; + + //Sizes + QHash<QString, QSize> m_sizesBlue; + QHash<QString, QSize> m_sizesLime; +}; + +#endif // __TOPBAR_H__ diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/webview.cpp b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/webview.cpp new file mode 100644 index 0000000..2f113ee --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/webview.cpp @@ -0,0 +1,304 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (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 Technology Preview License Agreement accompanying +** this package. +** +** 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.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "webview.h" +#include "webview_p.h" +#include <QtGui> + +static const int MotionEndWaitTime = 2000; +static const int TileSideLength = 128; + +WebViewPrivate::WebViewPrivate(WebView *w) + : q(w) + , cache(0) +{ + web = new QGraphicsWebView; + + web->setParentItem(q->viewport()); + + web->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); + web->page()->mainFrame()->setScrollBarPolicy( + Qt::Horizontal, Qt::ScrollBarAlwaysOff); + web->page()->mainFrame()->setScrollBarPolicy( + Qt::Vertical, Qt::ScrollBarAlwaysOff); + web->setZValue(3); + +// cache = new WebViewCache(web); +// web->setGraphicsEffect(cache); + + adjustSize(); +} + +void WebViewPrivate::adjustSize() +{ + QSizeF contentSize = web->page()->mainFrame()->contentsSize(); + QPointF pos = web->pos(); + + qreal w = qMax(contentSize.width(), q->viewport()->boundingRect().width()); + qreal h = qMax(contentSize.height(), q->viewport()->boundingRect().height()); + + if (web->boundingRect().size() != QSizeF(w, h)) { + //qDebug() << "WebView: adjustSize:" << QSizeF(w, h); + + web->resize(w, h); + web->setPos(pos); + + if (w > q->viewport()->boundingRect().width()) + q->horizontalScrollBar()->setSliderSize(w); + else + q->horizontalScrollBar()->setSliderSize(0.0); + + + if (h > q->viewport()->boundingRect().height()) + q->verticalScrollBar()->setSliderSize(h); + else + q->verticalScrollBar()->setSliderSize(0.0); + } +} + +void WebViewPrivate::_q_loadStarted() +{ + qDebug() << "WebView: load started"; + adjustSize(); +} + +void WebViewPrivate::_q_loadProgress(int progress) +{ + Q_UNUSED(progress) +// qDebug() << "WebView: load progress" << progress; + adjustSize(); +} + +void WebViewPrivate::_q_loadFinished(bool ok) +{ + qDebug() << "WebView: load finished" << (ok ? "ok" : "not ok"); + adjustSize(); +} + +void WebViewPrivate::_q_viewportChanged(QGraphicsWidget* viewport) +{ + web->setParentItem(viewport); + viewport->setFlag(QGraphicsItem::ItemClipsChildrenToShape, + true); + adjustSize(); +} + +void WebViewPrivate::_q_motionEnded() +{ + motionTimer.stop(); + qDebug() << "Motion ended"; + q->prepareGeometryChange(); +} + +WebViewCache::WebViewCache(QGraphicsWebView *webView) + : m_webView(webView) +{ + +} + +WebViewCache::~WebViewCache() +{ +} + +void WebViewCache::draw(QPainter * painter, QGraphicsEffectSource * source) +{ + const QGraphicsItem *item = source->graphicsItem(); + + QSizeF itemSize = item->boundingRect().size(); + + if (!qFuzzyCompare(itemSize.width(), m_itemSize.width()) || + !qFuzzyCompare(itemSize.height(), m_itemSize.height())) { + qDebug() << "Refresh tile cache, for new size" << itemSize; + + for (int i = 0; i < m_tilePixmaps.size(); i++) { + QPixmapCache::remove(m_tilePixmaps[i]); + } + + m_tilePixmaps.clear(); + m_tileRects.clear(); + + int itemWidth = itemSize.width() + 0.5; + int itemHeight = itemSize.height() + 0.5; + + int tilesX = itemWidth / TileSideLength; + int tilesY = itemHeight / TileSideLength; + + if ((itemWidth % TileSideLength) != 0) { + ++tilesX; + } + + if ((itemHeight % TileSideLength) != 0) { + ++tilesY; + } + + int tilesCount = tilesX * tilesY; + + m_tilePixmaps.resize(tilesCount); + m_tileRects.resize(tilesCount); + + for (int i = 0; i < tilesX; i++) { + for (int j = 0; j < tilesY; j++) { + int x = i * TileSideLength; + int y = j * TileSideLength; + + m_tileRects[i + j * tilesX] + = QRectF(x, y, TileSideLength, TileSideLength); + } + } + + m_itemSize = itemSize; + } + + const QGraphicsItem *parentItem = item->parentItem(); + QPointF itemPos = item->pos(); + QRectF parentRect = parentItem->boundingRect(); + + for (int i = 0; i < m_tileRects.size(); i++) { + QRectF tileRect = m_tileRects[i].translated(itemPos); + + if (!tileRect.intersects(parentRect) && !tileRect.contains(parentRect)) { + continue; + } + + QPixmap tilePixmap; + + if (!QPixmapCache::find(m_tilePixmaps[i], &tilePixmap)) { + tilePixmap = QPixmap(TileSideLength, TileSideLength); + + QWebFrame *webFrame = m_webView->page()->mainFrame(); + + QPainter tilePainter(&tilePixmap); + tilePainter.translate(-m_tileRects[i].left(), -m_tileRects[i].top()); + webFrame->render(&tilePainter, m_tileRects[i].toRect()); + tilePainter.end(); + + m_tilePixmaps[i] = QPixmapCache::insert(tilePixmap); + } + + tileRect = tileRect.translated(-itemPos); + + painter->drawPixmap(tileRect.topLeft(), tilePixmap); + } +} + +WebView::WebView(QGraphicsWidget *parent) + : AbstractScrollArea(parent) + , d(new WebViewPrivate(this)) +{ + setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); + setContentsMargins(0, 0, 0, 0); + connect(d->web->page(), SIGNAL(loadStarted()), + this, SLOT(_q_loadStarted())); + connect(d->web->page(), SIGNAL(loadProgress(int)), + this, SLOT(_q_loadProgress(int))); + connect(d->web->page(), SIGNAL(loadFinished(bool)), + this, SLOT(_q_loadFinished(bool))); + connect(this, SIGNAL(viewportChanged(QGraphicsWidget*)), + this, SLOT(_q_viewportChanged(QGraphicsWidget*))); + connect(&d->motionTimer, SIGNAL(timeout()), + this, SLOT(_q_motionEnded())); +} + +WebView::~WebView() +{ + d->web->setGraphicsEffect(0); + delete d->cache; +} + +void WebView::setUrl(const QUrl& url) +{ + d->adjustSize(); + d->web->setUrl(url); +} + +void WebView::scrollContentsBy(qreal dx, qreal dy) +{ + if (qFuzzyCompare((float)dy, 0.0f) && qFuzzyCompare((float)dx, 0.0f)) + return; + + if (!d->motionTimer.isActive()) { + d->motionTimer.start(MotionEndWaitTime); + } + + QSizeF contentSize = d->web->page()->mainFrame()->contentsSize(); + QRectF viewportRect = viewport()->boundingRect(); + QPointF pos = d->web->pos(); + + qreal w = qMax(contentSize.width(), viewportRect.width()); + qreal h = qMax(contentSize.height(), viewportRect.height()); + + qreal minx = qMin(0.0f, (float) -(w - viewportRect.width())); + qreal miny = qMin(0.0f, (float) -(h - viewportRect.height())); + + qreal x = d->web->pos().x() - dx; + + if (x < minx) + x = minx; + else if (x > 0) + x = 0.0; + + qreal y = d->web->pos().y() - dy; + + if (y < miny) + y = miny; + else if (y > 0) + y = 0.0; + + d->web->setPos(x, y); +} + +QSizeF WebView::sizeHint(Qt::SizeHint which, const QSizeF & constraint) const +{ + if (which == Qt::PreferredSize) { + QSizeF contentSize = d->web->page()->mainFrame()->contentsSize(); + return contentSize; + } + + return AbstractScrollArea::sizeHint(which, constraint); +} + +void WebView::resizeEvent(QGraphicsSceneResizeEvent *event) +{ + AbstractScrollArea::resizeEvent(event); + d->adjustSize(); +} + +#include "moc_webview.cpp" diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/webview.h b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/webview.h new file mode 100644 index 0000000..1e73424 --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/webview.h @@ -0,0 +1,81 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (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 Technology Preview License Agreement accompanying +** this package. +** +** 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.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef WEBVIEW_H +#define WEBVIEW_H + +#include "scrollbar.h" +#include "abstractscrollarea.h" + +class WebViewPrivate; + +class WebView : public AbstractScrollArea +{ + Q_OBJECT + +public: + + WebView(QGraphicsWidget *parent = 0); + ~WebView(); + +public: + + void setUrl(const QUrl& url); + +private: + + void scrollContentsBy(qreal dx, qreal dy); + void resizeEvent(QGraphicsSceneResizeEvent *event); + QSizeF sizeHint(Qt::SizeHint which, const QSizeF & constraint) const; + +private: + + Q_PRIVATE_SLOT(d, void _q_loadStarted()) + Q_PRIVATE_SLOT(d, void _q_loadProgress(int)) + Q_PRIVATE_SLOT(d, void _q_loadFinished(bool)) + Q_PRIVATE_SLOT(d, void _q_viewportChanged(QGraphicsWidget*)) + Q_PRIVATE_SLOT(d, void _q_motionEnded()) + + WebViewPrivate *d; + friend class WebViewPrivate; +}; + +#endif // WEBVIEW_H diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/webview_p.h b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/webview_p.h new file mode 100644 index 0000000..4a81e89 --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/webview_p.h @@ -0,0 +1,99 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (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 Technology Preview License Agreement accompanying +** this package. +** +** 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.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef WEBVIEW_P_H +#define WEBVIEW_P_H + +#include "webview.h" +#include <QtWebKit/qgraphicswebview.h> +#include <QtWebKit/qwebpage.h> +#include <QtWebKit/qwebframe.h> +#include <QGraphicsEffect> +#include <QPainter> +#include <QPixmapCache> +#include <QTimer> +#include <QDebug> + +class WebViewCache; + +class WebViewPrivate { +public: + + WebViewPrivate(WebView *w); + void adjustSize(); + void _q_loadStarted(); + void _q_loadProgress(int); + void _q_loadFinished(bool); + void _q_viewportChanged(QGraphicsWidget*); + void _q_motionEnded(); + + WebView *q; + QGraphicsWebView *web; + WebViewCache *cache; + QTimer motionTimer; +}; + +class WebViewCache : public QGraphicsEffect +{ + Q_OBJECT + +public: + + WebViewCache(QGraphicsWebView *webView); + virtual ~WebViewCache(); + +public: + + void refresh(); + + void draw(QPainter * painter, QGraphicsEffectSource * source); + +private: + + QVector<QRectF> m_tileRects; + QVector<QPixmapCache::Key> m_tilePixmaps; + QSizeF m_itemSize; + QGraphicsWebView *m_webView; + + friend class WebViewPrivate; +}; + +#endif // WEBVIEW_P_H diff --git a/tests/benchmarks/gui/graphicsview/functional/functional.pro b/tests/benchmarks/gui/graphicsview/functional/functional.pro new file mode 100644 index 0000000..f8e122b --- /dev/null +++ b/tests/benchmarks/gui/graphicsview/functional/functional.pro @@ -0,0 +1,3 @@ +TEMPLATE = subdirs +SUBDIRS = \ + GraphicsViewBenchmark diff --git a/tests/benchmarks/gui/graphicsview/graphicsview.pro b/tests/benchmarks/gui/graphicsview/graphicsview.pro index 93c00d2..e4fed19 100644 --- a/tests/benchmarks/gui/graphicsview/graphicsview.pro +++ b/tests/benchmarks/gui/graphicsview/graphicsview.pro @@ -1,5 +1,6 @@ TEMPLATE = subdirs SUBDIRS = \ + functional \ qgraphicsanchorlayout \ qgraphicsitem \ qgraphicsscene \ diff --git a/tests/benchmarks/gui/graphicsview/qgraphicsitem/tst_qgraphicsitem.cpp b/tests/benchmarks/gui/graphicsview/qgraphicsitem/tst_qgraphicsitem.cpp index ac51072..e17cf1c 100644 --- a/tests/benchmarks/gui/graphicsview/qgraphicsitem/tst_qgraphicsitem.cpp +++ b/tests/benchmarks/gui/graphicsview/qgraphicsitem/tst_qgraphicsitem.cpp @@ -55,6 +55,7 @@ public: virtual ~tst_QGraphicsItem(); public slots: + void initTestCase(); void init(); void cleanup(); @@ -71,7 +72,6 @@ private slots: void scale(); void shear(); void translate(); - void setRotation(); }; tst_QGraphicsItem::tst_QGraphicsItem() @@ -82,8 +82,23 @@ tst_QGraphicsItem::~tst_QGraphicsItem() { } +static inline void processEvents() +{ + QApplication::flush(); + QApplication::processEvents(); + QApplication::processEvents(); +} + +void tst_QGraphicsItem::initTestCase() +{ + QApplication::flush(); + QTest::qWait(1500); + processEvents(); +} + void tst_QGraphicsItem::init() { + processEvents(); } void tst_QGraphicsItem::cleanup() @@ -152,10 +167,10 @@ void tst_QGraphicsItem::setPos() QGraphicsScene scene; QGraphicsRectItem *rect = scene.addRect(QRectF(0, 0, 100, 100)); + processEvents(); QBENCHMARK { rect->setPos(10, 10); - rect->transform(); // prevent lazy optimizing } } @@ -163,7 +178,6 @@ void tst_QGraphicsItem::setTransform_data() { QTest::addColumn<QTransform>("transform"); - QTest::newRow("id") << QTransform(); QTest::newRow("rotate 45z") << QTransform().rotate(45); QTest::newRow("scale 2x2") << QTransform().scale(2, 2); QTest::newRow("translate 100, 100") << QTransform().translate(100, 100); @@ -177,10 +191,10 @@ void tst_QGraphicsItem::setTransform() QGraphicsScene scene; QGraphicsRectItem *item = scene.addRect(QRectF(0, 0, 100, 100)); + processEvents(); QBENCHMARK { item->setTransform(transform); - item->transform(); // prevent lazy optimizing } } @@ -188,10 +202,10 @@ void tst_QGraphicsItem::rotate() { QGraphicsScene scene; QGraphicsItem *item = scene.addRect(QRectF(0, 0, 100, 100)); + processEvents(); QBENCHMARK { item->rotate(45); - item->transform(); // prevent lazy optimizing } } @@ -199,10 +213,10 @@ void tst_QGraphicsItem::scale() { QGraphicsScene scene; QGraphicsItem *item = scene.addRect(QRectF(0, 0, 100, 100)); + processEvents(); QBENCHMARK { item->scale(2, 2); - item->transform(); // prevent lazy optimizing } } @@ -210,10 +224,10 @@ void tst_QGraphicsItem::shear() { QGraphicsScene scene; QGraphicsItem *item = scene.addRect(QRectF(0, 0, 100, 100)); + processEvents(); QBENCHMARK { item->shear(1.5, 1.5); - item->transform(); // prevent lazy optimizing } } @@ -221,21 +235,10 @@ void tst_QGraphicsItem::translate() { QGraphicsScene scene; QGraphicsItem *item = scene.addRect(QRectF(0, 0, 100, 100)); + processEvents(); QBENCHMARK { item->translate(100, 100); - item->transform(); // prevent lazy optimizing - } -} - -void tst_QGraphicsItem::setRotation() -{ - QGraphicsScene scene; - QGraphicsItem *item = scene.addRect(QRectF(0, 0, 100, 100)); - - QBENCHMARK { - item->setRotation(45); - item->transform(); // prevent lazy optimizing } } diff --git a/tests/benchmarks/gui/graphicsview/qgraphicsscene/tst_qgraphicsscene.cpp b/tests/benchmarks/gui/graphicsview/qgraphicsscene/tst_qgraphicsscene.cpp index 5bd07f9..10d73d5 100644 --- a/tests/benchmarks/gui/graphicsview/qgraphicsscene/tst_qgraphicsscene.cpp +++ b/tests/benchmarks/gui/graphicsview/qgraphicsscene/tst_qgraphicsscene.cpp @@ -75,8 +75,16 @@ tst_QGraphicsScene::~tst_QGraphicsScene() { } +static inline void processEvents() +{ + QApplication::flush(); + QApplication::processEvents(); + QApplication::processEvents(); +} + void tst_QGraphicsScene::init() { + processEvents(); } void tst_QGraphicsScene::cleanup() @@ -148,6 +156,8 @@ void tst_QGraphicsScene::addItem() if (!sceneRect.isNull()) scene.setSceneRect(sceneRect); + processEvents(); + QBENCHMARK { QGraphicsItem *item = 0; for (int y = 0; y < numItems_Y; ++y) { @@ -209,7 +219,6 @@ void tst_QGraphicsScene::itemAt() if (!sceneRect.isNull()) scene.setSceneRect(sceneRect); - QGraphicsItem *item = 0; for (int y = 0; y < numItems_Y; ++y) { for (int x = 0; x < numItems_X; ++x) { QGraphicsRectItem *item = new QGraphicsRectItem(itemRect); @@ -219,9 +228,11 @@ void tst_QGraphicsScene::itemAt() } scene.itemAt(0, 0); // triggers indexing + processEvents(); + QGraphicsItem *item = 0; QBENCHMARK { - scene.itemAt(0, 0); + item = scene.itemAt(0, 0); } //let QGraphicsScene::_q_polishItems be called so ~QGraphicsItem doesn't spend all his time cleaning the unpolished list diff --git a/tests/benchmarks/gui/graphicsview/qgraphicsview/tst_qgraphicsview.cpp b/tests/benchmarks/gui/graphicsview/qgraphicsview/tst_qgraphicsview.cpp index 10e00a6..3c0ae71 100644 --- a/tests/benchmarks/gui/graphicsview/qgraphicsview/tst_qgraphicsview.cpp +++ b/tests/benchmarks/gui/graphicsview/qgraphicsview/tst_qgraphicsview.cpp @@ -45,11 +45,7 @@ #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 @@ -58,34 +54,65 @@ QT_END_NAMESPACE //TESTED_FILES= -class QEventWaiter : public QEventLoop +static inline void processEvents() +{ + QPixmapCache::clear(); + QApplication::flush(); + QApplication::processEvents(); + QApplication::processEvents(); +} + +class TestView : public QGraphicsView { + Q_OBJECT public: - QEventWaiter(QObject *receiver, QEvent::Type type) - : waiting(false), t(type) - { - receiver->installEventFilter(this); - } + TestView() : QGraphicsView(), waiting(false), timerId(-1) + {} - void wait() + void waitForPaintEvent(int timeout = 4000) { + if (waiting) + return; waiting = true; - exec(); + timerId = startTimer(timeout); + eventLoop.exec(); + killTimer(timerId); + timerId = -1; + waiting = false; } - bool eventFilter(QObject *receiver, QEvent *event) + void tryResize(int width, int height) { - Q_UNUSED(receiver); - if (waiting && event->type() == t) { - waiting = false; - exit(); + QDesktopWidget *desktop = QApplication::desktop(); + if (desktop->width() < width) + width = desktop->width(); + if (desktop->height() < height) + height = desktop->height(); + if (size() != QSize(width, height)) { + resize(width, height); + QTest::qWait(250); + processEvents(); } - return false; + } + +protected: + void paintEvent(QPaintEvent *event) + { + QGraphicsView::paintEvent(event); + if (waiting) + eventLoop.exit(); + } + + void timerEvent(QTimerEvent *event) + { + if (event->timerId() == timerId) + eventLoop.exit(); } private: + QEventLoop eventLoop; bool waiting; - QEvent::Type t; + int timerId; }; class tst_QGraphicsView : public QObject @@ -97,6 +124,7 @@ public: virtual ~tst_QGraphicsView(); public slots: + void initTestCase(); void init(); void cleanup(); @@ -126,6 +154,9 @@ private slots: void moveItemCache(); void paintItemCache_data(); void paintItemCache(); + +private: + TestView mView; }; tst_QGraphicsView::tst_QGraphicsView() @@ -136,8 +167,25 @@ tst_QGraphicsView::~tst_QGraphicsView() { } +void tst_QGraphicsView::initTestCase() +{ + mView.setFrameStyle(0); + mView.setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + mView.setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + mView.tryResize(100, 100); + mView.show(); + QTest::qWaitForWindowShown(&mView); + QTest::qWait(300); + processEvents(); +} + void tst_QGraphicsView::init() { + mView.setRenderHints(QPainter::RenderHints(0)); + mView.viewport()->setMouseTracking(false); + mView.setViewportUpdateMode(QGraphicsView::BoundingRectViewportUpdate); + for (int i = 0; i < 3; ++i) + processEvents(); } void tst_QGraphicsView::cleanup() @@ -156,25 +204,18 @@ 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 + mView.setScene(&scene); + mView.tryResize(100, 100); + processEvents(); QImage image(100, 100, QImage::Format_ARGB32_Premultiplied); QPainter painter(&image); QBENCHMARK { - view.viewport()->render(&painter); + mView.viewport()->render(&painter); } } -#ifdef Q_OS_SYMBIAN -# define DEEP_STACKING_COUNT 85 -#else -# define DEEP_STACKING_COUNT 1000 -#endif +#define DEEP_STACKING_COUNT 85 void tst_QGraphicsView::paintDeepStackingItems() { @@ -188,17 +229,14 @@ void tst_QGraphicsView::paintDeepStackingItems() lastRect = rect; } - QGraphicsView view(&scene); - view.show(); - view.resize(100, 100); -#ifdef Q_WS_X11 - qt_x11_wait_for_window_manager(&view); -#endif + mView.setScene(&scene); + mView.tryResize(100, 100); + processEvents(); QImage image(100, 100, QImage::Format_ARGB32_Premultiplied); QPainter painter(&image); QBENCHMARK { - view.viewport()->render(&painter); + mView.viewport()->render(&painter); } } @@ -215,17 +253,14 @@ void tst_QGraphicsView::paintDeepStackingItems_clipped() lastRect = rect; } - QGraphicsView view(&scene); - view.show(); - view.resize(100, 100); -#ifdef Q_WS_X11 - qt_x11_wait_for_window_manager(&view); -#endif + mView.setScene(&scene); + mView.tryResize(100, 100); + processEvents(); QImage image(100, 100, QImage::Format_ARGB32_Premultiplied); QPainter painter(&image); QBENCHMARK { - view.viewport()->render(&painter); + mView.viewport()->render(&painter); } } @@ -234,18 +269,14 @@ 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 + mView.setScene(&scene); + mView.tryResize(100, 100); + processEvents(); - QEventWaiter waiter(view.viewport(), QEvent::Paint); int n = 1; QBENCHMARK { item->setPos(25 * n, 25 * n); - waiter.wait(); + mView.waitForPaintEvent(); n = n ? 0 : 1; } } @@ -271,6 +302,8 @@ void tst_QGraphicsView::mapPointToScene() QGraphicsView view; view.setTransform(transform); + processEvents(); + QBENCHMARK { view.mapToScene(point); } @@ -297,6 +330,8 @@ void tst_QGraphicsView::mapPointFromScene() QGraphicsView view; view.setTransform(transform); + processEvents(); + QBENCHMARK { view.mapFromScene(point); } @@ -323,6 +358,8 @@ void tst_QGraphicsView::mapRectToScene() QGraphicsView view; view.setTransform(transform); + processEvents(); + QBENCHMARK { view.mapToScene(rect); } @@ -349,6 +386,8 @@ void tst_QGraphicsView::mapRectFromScene() QGraphicsView view; view.setTransform(transform); + processEvents(); + QBENCHMARK { view.mapFromScene(rect); } @@ -380,13 +419,14 @@ void tst_QGraphicsView::chipTester() 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)); + tester.show(); + QTest::qWaitForWindowShown(&tester); + QTest::qWait(250); + processEvents(); + QBENCHMARK { tester.runBenchmark(); } @@ -436,20 +476,20 @@ void tst_QGraphicsView::deepNesting() } scene.setItemIndexMethod(bsp ? QGraphicsScene::BspTreeIndex : QGraphicsScene::NoIndex); scene.setSortCacheEnabled(sortCache); + scene.setSceneRect(scene.sceneRect()); - QGraphicsView view(&scene); - view.setRenderHint(QPainter::Antialiasing); - view.show(); -#ifdef Q_WS_X11 - qt_x11_wait_for_window_manager(&view); -#endif - QTest::qWait(250); + mView.setRenderHint(QPainter::Antialiasing); + mView.setScene(&scene); + mView.tryResize(600, 600); + (void)scene.itemAt(0, 0); + processEvents(); QBENCHMARK { #ifdef CALLGRIND_DEBUG CALLGRIND_START_INSTRUMENTATION #endif - view.viewport()->repaint(); + mView.viewport()->update(); + mView.waitForPaintEvent(); #ifdef CALLGRIND_DEBUG CALLGRIND_STOP_INSTRUMENTATION #endif @@ -503,23 +543,6 @@ private: 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"); @@ -541,13 +564,6 @@ void tst_QGraphicsView::imageRiver() 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()); @@ -555,37 +571,31 @@ void tst_QGraphicsView::imageRiver() QFile file(":/random.data"); QVERIFY(file.open(QIODevice::ReadOnly)); QDataStream str(&file); -#if defined(Q_OS_SYMBIAN) for (int i = 0; i < 50; ++i) { -#else - for (int i = 0; i < 100; ++i) { -#endif - AnimatedPixmapItem *item; + AnimatedPixmapItem *item = 0; 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())); + item->setPos(-pix.width() + rnd1 % (300 + pix.width()), + -pix.height() + rnd2 % (300 + pix.height())); scene.addItem(item); } + scene.setSceneRect(0, 0, 300, 300); - view.count = 0; + mView.setScene(&scene); + mView.tryResize(300, 300); + processEvents(); QBENCHMARK { #ifdef CALLGRIND_DEBUG CALLGRIND_START_INSTRUMENTATION #endif -#if defined(Q_OS_SYMBIAN) for (int i = 0; i < 50; ++i) { -#else - for (int i = 0; i < 100; ++i) { -#endif scene.advance(); - while (view.count < (i+1)) - qApp->processEvents(); + mView.waitForPaintEvent(); } #ifdef CALLGRIND_DEBUG CALLGRIND_STOP_INSTRUMENTATION @@ -663,13 +673,6 @@ void tst_QGraphicsView::textRiver() 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()); @@ -677,36 +680,32 @@ void tst_QGraphicsView::textRiver() QFile file(":/random.data"); QVERIFY(file.open(QIODevice::ReadOnly)); QDataStream str(&file); -#if defined(Q_OS_SYMBIAN) for (int i = 0; i < 50; ++i) { -#else - for (int i = 0; i < 100; ++i) { -#endif - AnimatedTextItem *item; + AnimatedTextItem *item = 0; 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())); + item->setPos(-pix.width() + rnd1 % (300 + pix.width()), + -pix.height() + rnd2 % (300 + pix.height())); + item->setAcceptDrops(false); + item->setAcceptHoverEvents(false); scene.addItem(item); } + scene.setSceneRect(0, 0, 300, 300); - view.count = 0; + mView.setScene(&scene); + mView.tryResize(300, 300); + processEvents(); QBENCHMARK { #ifdef CALLGRIND_DEBUG CALLGRIND_START_INSTRUMENTATION #endif -#if defined(Q_OS_SYMBIAN) for (int i = 0; i < 50; ++i) { -#else - for (int i = 0; i < 100; ++i) { -#endif scene.advance(); - while (view.count < (i+1)) - qApp->processEvents(); + mView.waitForPaintEvent(); } #ifdef CALLGRIND_DEBUG CALLGRIND_STOP_INSTRUMENTATION @@ -773,13 +772,6 @@ void tst_QGraphicsView::moveItemCache() QGraphicsScene scene(0, 0, 300, 300); - CountPaintEventView view(&scene); - view.resize(600, 600); - view.setFrameStyle(0); - view.setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - view.setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - view.show(); - QPixmap pix(":/images/wine.jpeg"); QVERIFY(!pix.isNull()); @@ -787,12 +779,8 @@ void tst_QGraphicsView::moveItemCache() QFile file(":/random.data"); QVERIFY(file.open(QIODevice::ReadOnly)); QDataStream str(&file); -#if defined(Q_OS_SYMBIAN) for (int i = 0; i < 5; ++i) { -#else - for (int i = 0; i < 50; ++i) { -#endif - AnimatedPixmapCacheItem *item; + AnimatedPixmapCacheItem *item = 0; if (direction == 0) item = new AnimatedPixmapCacheItem((i % 4) + 1, 0); if (direction == 1) item = new AnimatedPixmapCacheItem(0, (i % 4) + 1); if (direction == 2) item = new AnimatedPixmapCacheItem((i % 4) + 1, (i % 4) + 1); @@ -802,25 +790,23 @@ void tst_QGraphicsView::moveItemCache() item->setTransform(QTransform().rotate(45)); int rnd1, rnd2; str >> rnd1 >> rnd2; - item->setPos(-pix.width() + rnd1 % (view.width() + pix.width()), - -pix.height() + rnd2 % (view.height() + pix.height())); + item->setPos(-pix.width() + rnd1 % (400 + pix.width()), + -pix.height() + rnd2 % (400 + pix.height())); scene.addItem(item); } + scene.setSceneRect(0, 0, 400, 400); - view.count = 0; + mView.setScene(&scene); + mView.tryResize(400, 400); + processEvents(); QBENCHMARK { #ifdef CALLGRIND_DEBUG CALLGRIND_START_INSTRUMENTATION #endif -#if defined(Q_OS_SYMBIAN) - for (int i = 0; i < 50; ++i) { -#else - for (int i = 0; i < 100; ++i) { -#endif + for (int i = 0; i < 5; ++i) { scene.advance(); - while (view.count < (i+1)) - qApp->processEvents(); + mView.waitForPaintEvent(); } #ifdef CALLGRIND_DEBUG CALLGRIND_STOP_INSTRUMENTATION @@ -843,6 +829,7 @@ public: protected: void advance(int i) { + Q_UNUSED(i); if (partial) update(QRectF(boundingRect().center().x(), boundingRect().center().x(), 30, 30)); else @@ -880,13 +867,6 @@ void tst_QGraphicsView::paintItemCache() QGraphicsScene scene(0, 0, 300, 300); - CountPaintEventView view(&scene); - view.resize(600, 600); - view.setFrameStyle(0); - view.setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - view.setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - view.show(); - QPixmap pix(":/images/wine.jpeg"); QVERIFY(!pix.isNull()); @@ -910,21 +890,19 @@ void tst_QGraphicsView::paintItemCache() item->setTransform(QTransform().rotate(45)); item->setPos(0, 0); scene.addItem(item); + scene.setSceneRect(-100, -100, 600, 600); - view.count = 0; + mView.tryResize(600, 600); + mView.setScene(&scene); + processEvents(); QBENCHMARK { #ifdef CALLGRIND_DEBUG CALLGRIND_START_INSTRUMENTATION #endif -#if defined(Q_OS_SYMBIAN) for (int i = 0; i < 5; ++i) { -#else - for (int i = 0; i < 50; ++i) { -#endif scene.advance(); - while (view.count < (i+1)) - qApp->processEvents(); + mView.waitForPaintEvent(); } #ifdef CALLGRIND_DEBUG CALLGRIND_STOP_INSTRUMENTATION diff --git a/tests/benchmarks/gui/painting/painting.pro b/tests/benchmarks/gui/painting/painting.pro index 878567d..2c042b5 100644 --- a/tests/benchmarks/gui/painting/painting.pro +++ b/tests/benchmarks/gui/painting/painting.pro @@ -2,4 +2,5 @@ TEMPLATE = subdirs SUBDIRS = \ qpainter \ qregion \ - qtransform + qtransform \ + qtracebench diff --git a/tests/benchmarks/gui/painting/qtracebench/qtracebench.pro b/tests/benchmarks/gui/painting/qtracebench/qtracebench.pro new file mode 100644 index 0000000..56ec8bb --- /dev/null +++ b/tests/benchmarks/gui/painting/qtracebench/qtracebench.pro @@ -0,0 +1,10 @@ +load(qttest_p4) +TEMPLATE = app +TARGET = tst_qtracebench + +INCLUDEPATH += . $$QT_SOURCE_TREE/src/3rdparty/harfbuzz/src + +RESOURCES += qtracebench.qrc + +SOURCES += tst_qtracebench.cpp + diff --git a/tests/benchmarks/gui/painting/qtracebench/qtracebench.qrc b/tests/benchmarks/gui/painting/qtracebench/qtracebench.qrc new file mode 100644 index 0000000..5569550 --- /dev/null +++ b/tests/benchmarks/gui/painting/qtracebench/qtracebench.qrc @@ -0,0 +1,10 @@ +<RCC> + <qresource> + <file>traces/basicdrawing.trace</file> + <file>traces/webkit.trace</file> + <file>traces/textedit.trace</file> + <file>traces/creator.trace</file> + <file>traces/qmlphoneconcept.trace</file> + <file>traces/qmlsamegame.trace</file> + </qresource> +</RCC> diff --git a/tests/benchmarks/gui/painting/qtracebench/traces/basicdrawing.trace b/tests/benchmarks/gui/painting/qtracebench/traces/basicdrawing.trace Binary files differnew file mode 100644 index 0000000..0241d08 --- /dev/null +++ b/tests/benchmarks/gui/painting/qtracebench/traces/basicdrawing.trace diff --git a/tests/benchmarks/gui/painting/qtracebench/traces/creator.trace b/tests/benchmarks/gui/painting/qtracebench/traces/creator.trace Binary files differnew file mode 100644 index 0000000..55ee9e1 --- /dev/null +++ b/tests/benchmarks/gui/painting/qtracebench/traces/creator.trace diff --git a/tests/benchmarks/gui/painting/qtracebench/traces/qmlphoneconcept.trace b/tests/benchmarks/gui/painting/qtracebench/traces/qmlphoneconcept.trace Binary files differnew file mode 100644 index 0000000..835ebfa --- /dev/null +++ b/tests/benchmarks/gui/painting/qtracebench/traces/qmlphoneconcept.trace diff --git a/tests/benchmarks/gui/painting/qtracebench/traces/qmlsamegame.trace b/tests/benchmarks/gui/painting/qtracebench/traces/qmlsamegame.trace Binary files differnew file mode 100644 index 0000000..1d76195 --- /dev/null +++ b/tests/benchmarks/gui/painting/qtracebench/traces/qmlsamegame.trace diff --git a/tests/benchmarks/gui/painting/qtracebench/traces/textedit.trace b/tests/benchmarks/gui/painting/qtracebench/traces/textedit.trace Binary files differnew file mode 100644 index 0000000..998716d --- /dev/null +++ b/tests/benchmarks/gui/painting/qtracebench/traces/textedit.trace diff --git a/tests/benchmarks/gui/painting/qtracebench/traces/webkit.trace b/tests/benchmarks/gui/painting/qtracebench/traces/webkit.trace Binary files differnew file mode 100644 index 0000000..43e752d --- /dev/null +++ b/tests/benchmarks/gui/painting/qtracebench/traces/webkit.trace diff --git a/tests/benchmarks/gui/painting/qtracebench/tst_qtracebench.cpp b/tests/benchmarks/gui/painting/qtracebench/tst_qtracebench.cpp new file mode 100644 index 0000000..ff2633d --- /dev/null +++ b/tests/benchmarks/gui/painting/qtracebench/tst_qtracebench.cpp @@ -0,0 +1,262 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (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 Technology Preview License Agreement accompanying +** this package. +** +** 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.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <qtest.h> + +#include <QtGui> + +#include <private/qpaintengineex_p.h> +#include <private/qpaintbuffer_p.h> + +//TESTED_FILES= + +class ReplayWidget : public QWidget +{ + Q_OBJECT +public: + ReplayWidget(const QString &filename); + + void paintEvent(QPaintEvent *event); + void resizeEvent(QResizeEvent *event); + + bool done() const { return m_done; } + qreal result() const { return m_result; } + +public slots: + void updateRect(); + +public: + QList<QRegion> updates; + QPaintBuffer buffer; + + int currentFrame; + int currentIteration; + QTime timer; + + QList<uint> visibleUpdates; + QList<uint> iterationTimes; + QString filename; + + bool m_done; + qreal m_result; + + uint m_total; +}; + +void ReplayWidget::updateRect() +{ + if (!visibleUpdates.isEmpty()) + update(updates.at(visibleUpdates.at(currentFrame))); +} + +void ReplayWidget::paintEvent(QPaintEvent *) +{ + if (m_done) + return; + + QPainter p(this); + + // if partial updates don't work + // p.setClipRegion(frames.at(currentFrame).updateRegion); + + buffer.draw(&p, visibleUpdates.at(currentFrame)); + + ++currentFrame; + if (currentFrame >= visibleUpdates.size()) { + currentFrame = 0; + ++currentIteration; + + uint currentElapsed = timer.isNull() ? 0 : timer.elapsed(); + timer.restart(); + + m_total += currentElapsed; + + // warm up for at most 5 iterations or half a second + if (currentIteration >= 5 || m_total >= 500) { + iterationTimes << currentElapsed; + + if (iterationTimes.size() >= 5) { + qreal mean = 0; + qreal stddev = 0; + uint min = INT_MAX; + + for (int i = 0; i < iterationTimes.size(); ++i) { + mean += iterationTimes.at(i); + min = qMin(min, iterationTimes.at(i)); + } + + mean /= qreal(iterationTimes.size()); + + for (int i = 0; i < iterationTimes.size(); ++i) { + qreal delta = iterationTimes.at(i) - mean; + stddev += delta * delta; + } + + stddev = qSqrt(stddev / iterationTimes.size()); + + qSort(iterationTimes.begin(), iterationTimes.end()); + uint median = iterationTimes.at(iterationTimes.size() / 2); + + stddev = 100 * stddev / mean; + // do 100 iterations, break earlier if we spend more than 5 seconds or have a low std deviation after 2 seconds + if (iterationTimes.size() >= 100 || m_total >= 5000 || (m_total >= 2000 && stddev < 4)) { + printf("%s, iterations: %d, frames: %d, min(ms): %d, median(ms): %d, stddev: %f %%, max(fps): %f\n", qPrintable(filename), + iterationTimes.size(), visibleUpdates.size(), min, median, stddev, 1000. * visibleUpdates.size() / min); + m_result = min; + m_done = true; + return; + } + } + } + } +} + +void ReplayWidget::resizeEvent(QResizeEvent *event) +{ + visibleUpdates.clear(); + + QRect bounds = rect(); + for (int i = 0; i < updates.size(); ++i) { + if (updates.at(i).intersects(bounds)) + visibleUpdates << i; + } + + if (visibleUpdates.size() != updates.size()) + printf("Warning: skipped %d frames due to limited resolution\n", updates.size() - visibleUpdates.size()); + +} + +ReplayWidget::ReplayWidget(const QString &filename_) + : currentFrame(0) + , currentIteration(0) + , filename(filename_) + , m_done(false) + , m_result(0) + , m_total(0) +{ + setWindowTitle(filename); + QFile file(filename); + + if (!file.open(QIODevice::ReadOnly)) { + printf("Failed to load input file '%s'\n", qPrintable(filename_)); + return; + } + + QDataStream in(&file); + + char *data; + uint size; + in.readBytes(data, size); + bool isTraceFile = size >= 7 && qstrncmp(data, "qttrace", 7) == 0; + uint version = 0; + if (size == 9 && qstrncmp(data, "qttraceV2", 9) == 0) { + in.setFloatingPointPrecision(QDataStream::SinglePrecision); + in >> version; + } + + delete [] data; + if (!isTraceFile) { + printf("File '%s' is not a trace file\n", qPrintable(filename_)); + return; + } + + in >> buffer >> updates; + + resize(buffer.boundingRect().size().toSize()); + + setAutoFillBackground(false); + setAttribute(Qt::WA_NoSystemBackground); +} + + +class tst_QTraceBench : public QObject +{ + Q_OBJECT + +private slots: + void trace(); + void trace_data(); +}; + +static const QLatin1String prefix(":/traces/"); + +void tst_QTraceBench::trace_data() +{ + QTest::addColumn<QString>("filename"); + + QTest::newRow("basicdrawing") << (prefix + "basicdrawing.trace"); + QTest::newRow("webkit") << (prefix + "webkit.trace"); + QTest::newRow("creator") << (prefix + "creator.trace"); + QTest::newRow("textedit") << (prefix + "textedit.trace"); + QTest::newRow("qmlphoneconcept") << (prefix + "qmlphoneconcept.trace"); + QTest::newRow("qmlsamegame") << (prefix + "qmlsamegame.trace"); +} + +void tst_QTraceBench::trace() +{ + QFETCH(QString, filename); + + QFile file(filename); + if (!file.exists()) { + qWarning() << "Missing file" << filename; + return; + } + + ReplayWidget widget(filename); + + if (widget.updates.isEmpty()) { + qWarning() << "No trace updates" << filename; + return; + } + + widget.show(); + QTest::qWaitForWindowShown(&widget); + + while (!widget.done()) { + widget.updateRect(); + QApplication::processEvents(); + } + + QTest::setBenchmarkResult(widget.result(), QTest::WalltimeMilliseconds); +} + +QTEST_MAIN(tst_QTraceBench) +#include "tst_qtracebench.moc" |